ugly-app 0.1.639 → 0.1.641

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 +1 @@
1
- {"version":3,"file":"UglyBotTextStream.d.ts","sourceRoot":"","sources":["../../../src/agent/server/UglyBotTextStream.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iDAAiD,CAAC;AACpF,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAO5E,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,kFAAkF;IAClF,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,8CAA8C;IAC9C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,eAAe,CAAC;IAC5B,SAAS,EAAE,YAAY,CAAC;IACxB,iFAAiF;IACjF,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AA6JD;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,kBAAkB,EACzB,MAAM,EAAE,mBAAmB,EAC3B,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GAC9B,OAAO,CAAC,mBAAmB,CAAC,CAsC9B"}
1
+ {"version":3,"file":"UglyBotTextStream.d.ts","sourceRoot":"","sources":["../../../src/agent/server/UglyBotTextStream.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iDAAiD,CAAC;AACpF,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAO5E,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,kFAAkF;IAClF,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,8CAA8C;IAC9C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,eAAe,CAAC;IAC5B,SAAS,EAAE,YAAY,CAAC;IACxB,iFAAiF;IACjF,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAiKD;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,kBAAkB,EACzB,MAAM,EAAE,mBAAmB,EAC3B,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GAC9B,OAAO,CAAC,mBAAmB,CAAC,CAsC9B"}
@@ -15,21 +15,27 @@ import { getUserToken } from '../../server/auth/userContext.js';
15
15
  const DEFAULT_AI_PROXY_URL = 'https://api.ugly.bot/v1/ai';
16
16
  const DEFAULT_TIMEOUT_MS = 120_000;
17
17
  const MAX_ATTEMPTS = 3;
18
- /** Mirror of AiText.resolveConfig — pick endpoint + bearer for the billing mode. */
18
+ /** Mirror of AiText.resolveConfig — pick endpoint + bearer for the billing mode.
19
+ * The agent loop is always user-facing, so bill the END USER whenever a session
20
+ * token is in context; fall back to the owner token only for self-hosted apps
21
+ * (or a missing user). We key off the actual token rather than
22
+ * UGLY_APP_AUTH_MODE, which is often unset in the Workers runtime — keying off
23
+ * the mode flag silently owner-bills the assistant (→ spurious 402 when the app
24
+ * owner's balance is empty even though the signed-in user has funds). */
19
25
  function resolveConfig() {
20
- const mode = process.env['UGLY_APP_AUTH_MODE'] === 'uglybot' ? 'user' : 'owner';
21
26
  const baseUrl = process.env['AI_PROXY_URL'] ?? DEFAULT_AI_PROXY_URL;
22
27
  const ownerToken = process.env['AI_PROXY_TOKEN'] ?? '';
23
- const userToken = mode === 'user' ? getUserToken() : null;
24
- if (mode === 'user' && !userToken) {
25
- throw new Error('[agent] Mode A requires an authenticated end user. Run the turn inside an auth-required handler.');
28
+ const selfHost = process.env['UGLY_APP_AUTH_MODE'] === 'self';
29
+ const userToken = selfHost ? null : getUserToken();
30
+ if (userToken) {
31
+ return { endpoint: `${baseUrl}/user-billed/text`, bearer: userToken };
26
32
  }
27
- if (mode === 'owner' && !ownerToken) {
28
- throw new Error('[agent] AI_PROXY_TOKEN is not set.');
33
+ if (!ownerToken) {
34
+ throw new Error(selfHost
35
+ ? '[agent] AI_PROXY_TOKEN is not set.'
36
+ : '[agent] No end-user session token in context and no AI_PROXY_TOKEN. Run the turn inside an auth-required handler.');
29
37
  }
30
- const endpoint = mode === 'user' ? `${baseUrl}/user-billed/text` : `${baseUrl}/text`;
31
- const bearer = mode === 'user' ? userToken : ownerToken;
32
- return { endpoint, bearer };
38
+ return { endpoint: `${baseUrl}/text`, bearer: ownerToken };
33
39
  }
34
40
  const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
35
41
  function isTransient(status) {
@@ -1 +1 @@
1
- {"version":3,"file":"UglyBotTextStream.js","sourceRoot":"","sources":["../../../src/agent/server/UglyBotTextStream.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"UglyBotTextStream.js","sourceRoot":"","sources":["../../../src/agent/server/UglyBotTextStream.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export declare const CLI_VERSION = "0.1.639";
1
+ export declare const CLI_VERSION = "0.1.641";
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.639";
2
+ export const CLI_VERSION = "0.1.641";
3
3
  //# sourceMappingURL=version.js.map
@@ -0,0 +1,44 @@
1
+ /**
2
+ * UglyNative cross-platform conformance harness.
3
+ *
4
+ * One page, run on every client (desktop Electron, iOS WKWebView, Android
5
+ * WebView). It drives the RAW `window.UglyNative` transport — `invoke` /
6
+ * `subscribe` — directly, because the bridge is the thing that actually
7
+ * differs per platform; the typed `ugly-app/native` facade is identical
8
+ * shared JS on all three and is unit-tested separately. Driving raw invoke
9
+ * therefore IS the conformance test of platform parity, and keeps this file
10
+ * dependency-free so it bundles + loads anywhere with zero module resolution.
11
+ *
12
+ * Each probe runs the same way everywhere and records a raw outcome
13
+ * (`ok` | `threw` | `timeout` | `skipped`). It does NOT decide pass/fail —
14
+ * the per-platform expectation table in the runner (ugly-studio) interprets
15
+ * each outcome against what that client is supposed to do. Adding a channel
16
+ * with no probe shows up as missing coverage; a handler regressing flips its
17
+ * outcome and the runner fails the diff.
18
+ *
19
+ * Device-gated capabilities (push, billing, auth, live activities) are marked
20
+ * `manual` and skipped here so an automated sim/emulator run never triggers a
21
+ * store sheet, OS permission prompt, or APNs/FCM round-trip — those live in
22
+ * the manual DEVICE-CHECKLIST.
23
+ */
24
+ export type ProbeOutcome = 'ok' | 'threw' | 'timeout' | 'skipped';
25
+ export type ProbeCategory = 'round-trip' | 'stream' | 'event' | 'smoke' | 'manual';
26
+ export interface ProbeResult {
27
+ id: string;
28
+ namespace: string;
29
+ category: ProbeCategory;
30
+ outcome: ProbeOutcome;
31
+ detail?: string;
32
+ ms: number;
33
+ }
34
+ export interface ConformanceReport {
35
+ platform: string;
36
+ ts: number;
37
+ userAgent: string;
38
+ results: ProbeResult[];
39
+ }
40
+ /** The probe ids this harness knows about (for the runner's coverage check). */
41
+ export declare const PROBE_IDS: string[];
42
+ /** Run every probe sequentially and return the report (also set on window). */
43
+ export declare function runConformance(): Promise<ConformanceReport>;
44
+ //# sourceMappingURL=harness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../../../src/native/conformance/harness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEnF,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAoUD,gFAAgF;AAChF,eAAO,MAAM,SAAS,EAAE,MAAM,EAA4B,CAAC;AAgB3D,+EAA+E;AAC/E,wBAAsB,cAAc,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAoCjE"}
@@ -0,0 +1,364 @@
1
+ /**
2
+ * UglyNative cross-platform conformance harness.
3
+ *
4
+ * One page, run on every client (desktop Electron, iOS WKWebView, Android
5
+ * WebView). It drives the RAW `window.UglyNative` transport — `invoke` /
6
+ * `subscribe` — directly, because the bridge is the thing that actually
7
+ * differs per platform; the typed `ugly-app/native` facade is identical
8
+ * shared JS on all three and is unit-tested separately. Driving raw invoke
9
+ * therefore IS the conformance test of platform parity, and keeps this file
10
+ * dependency-free so it bundles + loads anywhere with zero module resolution.
11
+ *
12
+ * Each probe runs the same way everywhere and records a raw outcome
13
+ * (`ok` | `threw` | `timeout` | `skipped`). It does NOT decide pass/fail —
14
+ * the per-platform expectation table in the runner (ugly-studio) interprets
15
+ * each outcome against what that client is supposed to do. Adding a channel
16
+ * with no probe shows up as missing coverage; a handler regressing flips its
17
+ * outcome and the runner fails the diff.
18
+ *
19
+ * Device-gated capabilities (push, billing, auth, live activities) are marked
20
+ * `manual` and skipped here so an automated sim/emulator run never triggers a
21
+ * store sheet, OS permission prompt, or APNs/FCM round-trip — those live in
22
+ * the manual DEVICE-CHECKLIST.
23
+ */
24
+ // ── Small async helpers ──────────────────────────────────────────────────────
25
+ const DEFAULT_TIMEOUT = 10_000;
26
+ class TimeoutError extends Error {
27
+ }
28
+ function withTimeout(p, ms, label) {
29
+ return new Promise((resolve, reject) => {
30
+ const t = setTimeout(() => reject(new TimeoutError(`timeout after ${ms}ms: ${label}`)), ms);
31
+ p.then((v) => {
32
+ clearTimeout(t);
33
+ resolve(v);
34
+ }, (e) => {
35
+ clearTimeout(t);
36
+ reject(e);
37
+ });
38
+ });
39
+ }
40
+ /** Resolve with the first event of `name`, or reject on timeout. */
41
+ function waitEvent(n, name, ms) {
42
+ return new Promise((resolve, reject) => {
43
+ let unsub = () => { };
44
+ const t = setTimeout(() => {
45
+ unsub();
46
+ reject(new TimeoutError(`no '${name}' event within ${ms}ms`));
47
+ }, ms);
48
+ unsub = n.subscribe(name, (data) => {
49
+ clearTimeout(t);
50
+ unsub();
51
+ resolve(data);
52
+ });
53
+ });
54
+ }
55
+ let seq = 0;
56
+ const uid = () => `c${Date.now().toString(36)}${(seq++).toString(36)}`;
57
+ function assert(cond, msg) {
58
+ if (!cond)
59
+ throw new Error(msg);
60
+ }
61
+ // ── Permission bootstrap ─────────────────────────────────────────────────────
62
+ // Gated namespaces (fs/secrets/serve/workers/net/process/browse) are checked
63
+ // per-origin by the host. Request a broad grant once up front; tolerate hosts
64
+ // that don't implement the permissions channel (e.g. iOS) — the individual
65
+ // gated probes will then simply record `threw`, which the expectation table
66
+ // already encodes for those platforms.
67
+ async function bootstrapPermissions(n) {
68
+ try {
69
+ await withTimeout(n.invoke('permissions.request', {
70
+ grants: {
71
+ fs: 'scoped',
72
+ secrets: 'full',
73
+ serve: true,
74
+ workers: true,
75
+ net: true,
76
+ process: ['node'],
77
+ browse: true,
78
+ },
79
+ }), DEFAULT_TIMEOUT, 'permissions.request');
80
+ }
81
+ catch {
82
+ /* host lacks permissions channel — gated probes will report their own outcome */
83
+ }
84
+ }
85
+ // ── Probe registry ───────────────────────────────────────────────────────────
86
+ const PROBES = [
87
+ // ----- round-trip -----
88
+ {
89
+ id: 'clipboard.roundtrip',
90
+ category: 'round-trip',
91
+ async run(n) {
92
+ const text = `ugly-conf-${uid()}`;
93
+ await n.invoke('clipboard.write', { text });
94
+ const r = (await n.invoke('clipboard.read', undefined));
95
+ assert(r && r.text === text, `clipboard read back '${r?.text}' !== '${text}'`);
96
+ },
97
+ },
98
+ {
99
+ id: 'ui.getSafeArea',
100
+ category: 'round-trip',
101
+ async run(n) {
102
+ const r = (await n.invoke('ui.getSafeArea', undefined));
103
+ assert(r && typeof r.top === 'number', 'safe-area insets missing numeric top');
104
+ },
105
+ },
106
+ {
107
+ id: 'badge.set',
108
+ category: 'round-trip',
109
+ async run(n) {
110
+ await n.invoke('badge.set', { count: 0 });
111
+ },
112
+ },
113
+ {
114
+ id: 'capture.screenshot',
115
+ category: 'round-trip',
116
+ async run(n) {
117
+ const r = (await n.invoke('capture.screenshot', undefined));
118
+ assert(typeof r === 'string' && r.length > 100, 'screenshot returned no base64');
119
+ },
120
+ },
121
+ {
122
+ id: 'fs.roundtrip',
123
+ category: 'round-trip',
124
+ async run(n) {
125
+ const dir = `conf-${uid()}`;
126
+ const file = `${dir}/a.txt`;
127
+ await n.invoke('fs.mkdir', { path: dir, recursive: true });
128
+ try {
129
+ await n.invoke('fs.writeFile', { path: file, content: 'native-conf' });
130
+ const read = (await n.invoke('fs.readFile', { path: file }));
131
+ assert(read.content === 'native-conf', `fs read back '${read.content}'`);
132
+ const ex = (await n.invoke('fs.exists', { path: file }));
133
+ assert(ex.exists === true, 'fs.exists false for written file');
134
+ const st = (await n.invoke('fs.stat', { path: file }));
135
+ assert(st.isFile === true, 'fs.stat not a file');
136
+ }
137
+ finally {
138
+ await n.invoke('fs.rm', { path: dir, recursive: true, force: true }).catch(() => { });
139
+ }
140
+ },
141
+ },
142
+ {
143
+ id: 'secrets.roundtrip',
144
+ category: 'round-trip',
145
+ async run(n) {
146
+ const key = `conf-${uid()}`;
147
+ await n.invoke('secrets.set', { key, value: 'sekret' });
148
+ try {
149
+ const got = (await n.invoke('secrets.get', { key }));
150
+ assert(got.value === 'sekret', `secrets read back '${got.value}'`);
151
+ }
152
+ finally {
153
+ await n.invoke('secrets.delete', { key }).catch(() => { });
154
+ }
155
+ },
156
+ },
157
+ {
158
+ id: 'studio.app',
159
+ category: 'round-trip',
160
+ async run(n) {
161
+ const v = (await n.invoke('studio.app.version', undefined));
162
+ assert(typeof v === 'string' && v.length > 0, 'studio.app.version empty');
163
+ const p = (await n.invoke('studio.app.platform', undefined));
164
+ assert(['ios', 'android', 'desktop'].includes(p), `studio.app.platform unexpected '${p}'`);
165
+ },
166
+ },
167
+ {
168
+ id: 'studio.zoom',
169
+ category: 'round-trip',
170
+ async run(n) {
171
+ const cur = (await n.invoke('studio.zoom.get', undefined));
172
+ assert(typeof cur === 'number', 'studio.zoom.get not a number');
173
+ await n.invoke('studio.zoom.set', { level: cur });
174
+ },
175
+ },
176
+ // ----- stream / lifecycle -----
177
+ {
178
+ id: 'process.spawn',
179
+ category: 'stream',
180
+ async run(n) {
181
+ const { id } = (await n.invoke('process.spawn', {
182
+ cmd: 'node',
183
+ args: ['-e', 'process.stdout.write("NATIVE_OK")'],
184
+ opts: { env: { ELECTRON_RUN_AS_NODE: '1' } },
185
+ }));
186
+ assert(id, 'process.spawn returned no id');
187
+ const out = await withTimeout(new Promise((resolve) => {
188
+ let buf = '';
189
+ n.subscribe(`process.stdout:${id}`, (d) => (buf += d.chunk));
190
+ n.subscribe(`process.exit:${id}`, () => resolve(buf));
191
+ }), DEFAULT_TIMEOUT, 'process stdout/exit');
192
+ assert(out.includes('NATIVE_OK'), `process stdout was '${out}'`);
193
+ },
194
+ },
195
+ {
196
+ id: 'serve.roundtrip',
197
+ category: 'stream',
198
+ async run(n) {
199
+ const { port, url } = (await n.invoke('serve.start', {}));
200
+ assert(typeof port === 'number' && port > 0, 'serve.start gave no port');
201
+ try {
202
+ await fetch(url).catch(() => { }); // reachability is best-effort
203
+ }
204
+ finally {
205
+ await n.invoke('serve.stop', { port }).catch(() => { });
206
+ }
207
+ },
208
+ },
209
+ {
210
+ id: 'workers.roundtrip',
211
+ category: 'stream',
212
+ async run(n) {
213
+ const list0 = (await n.invoke('workers.list', undefined));
214
+ assert(Array.isArray(list0.ids), 'workers.list gave no ids array');
215
+ },
216
+ },
217
+ {
218
+ id: 'net.loopback',
219
+ category: 'stream',
220
+ async run(n) {
221
+ const srv = (await n.invoke('net.listen', {}));
222
+ assert(srv.port > 0, 'net.listen gave no port');
223
+ try {
224
+ // Echo: when a peer connects server-side, write a token back to it.
225
+ n.subscribe(`net.connection:${srv.id}`, (d) => {
226
+ const sock = d.socketId;
227
+ void n.invoke('net.write', { id: sock, data: 'PONG' });
228
+ });
229
+ const cli = (await n.invoke('net.connect', { host: '127.0.0.1', port: srv.port }));
230
+ const data = await withTimeout(waitEvent(n, `net.data:${cli.id}`, DEFAULT_TIMEOUT), DEFAULT_TIMEOUT, 'net.data');
231
+ assert(data.data.includes('PONG'), 'net loopback did not echo');
232
+ await n.invoke('net.close', { id: cli.id }).catch(() => { });
233
+ }
234
+ finally {
235
+ await n.invoke('net.close', { id: srv.id }).catch(() => { });
236
+ }
237
+ },
238
+ },
239
+ {
240
+ id: 'browse.extract',
241
+ category: 'stream',
242
+ async run(n) {
243
+ // The browse SSRF guard rejects data:/file: and private/loopback hosts, so
244
+ // this probe needs a real public URL (network-dependent, like the existing
245
+ // window-ugly-browse e2e). example.com is the canonical stable target.
246
+ const page = (await n.invoke('browse.extract', { url: 'https://example.com/' }));
247
+ assert(typeof page.content === 'string', 'browse.extract gave no content');
248
+ },
249
+ },
250
+ // ----- event-emitting -----
251
+ {
252
+ id: 'alarm.fired',
253
+ category: 'event',
254
+ async run(n) {
255
+ const id = `conf-${uid()}`;
256
+ const fired = waitEvent(n, 'alarm.fired', 8_000);
257
+ await n.invoke('alarm.schedule', { id, delaySeconds: 1, title: 'conf', body: 'conf' });
258
+ try {
259
+ await fired;
260
+ }
261
+ finally {
262
+ await n.invoke('alarm.cancel', { id }).catch(() => { });
263
+ }
264
+ },
265
+ },
266
+ {
267
+ id: 'tts.state',
268
+ category: 'event',
269
+ async run(n) {
270
+ const state = waitEvent(n, 'tts.state', 8_000);
271
+ await n.invoke('tts.start', { text: 'conformance check' });
272
+ try {
273
+ await state;
274
+ }
275
+ finally {
276
+ await n.invoke('tts.stop', undefined).catch(() => { });
277
+ }
278
+ },
279
+ },
280
+ {
281
+ id: 'gps.position',
282
+ category: 'event',
283
+ async run(n) {
284
+ const pos = waitEvent(n, 'gps.position', 8_000);
285
+ await n.invoke('gps.start', { activityType: 'run' });
286
+ try {
287
+ const p = (await pos);
288
+ assert(typeof p.lat === 'number' && typeof p.lng === 'number', 'gps.position malformed');
289
+ }
290
+ finally {
291
+ await n.invoke('gps.stop', undefined).catch(() => { });
292
+ }
293
+ },
294
+ },
295
+ // ----- smoke (origin-exempt page-ready handshake) -----
296
+ {
297
+ id: 'nav.ready',
298
+ category: 'smoke',
299
+ async run(n) {
300
+ await n.invoke('nav.ready', {});
301
+ },
302
+ },
303
+ // ----- manual / device-only (skipped in the automated lane) -----
304
+ { id: 'push.register', category: 'manual', manual: true, run: async () => { } },
305
+ { id: 'billing.purchase', category: 'manual', manual: true, run: async () => { } },
306
+ { id: 'billing.restore', category: 'manual', manual: true, run: async () => { } },
307
+ { id: 'auth.googleSignIn', category: 'manual', manual: true, run: async () => { } },
308
+ { id: 'liveActivity.startWorkout', category: 'manual', manual: true, run: async () => { } },
309
+ { id: 'liveActivity.startCardio', category: 'manual', manual: true, run: async () => { } },
310
+ ];
311
+ /** The probe ids this harness knows about (for the runner's coverage check). */
312
+ export const PROBE_IDS = PROBES.map((p) => p.id);
313
+ async function runProbe(n, probe) {
314
+ const base = { id: probe.id, namespace: probe.id.split('.')[0], category: probe.category };
315
+ if (probe.manual)
316
+ return { ...base, outcome: 'skipped', detail: 'device-only (manual)', ms: 0 };
317
+ const started = Date.now();
318
+ try {
319
+ await withTimeout(probe.run(n), DEFAULT_TIMEOUT + 2_000, probe.id);
320
+ return { ...base, outcome: 'ok', ms: Date.now() - started };
321
+ }
322
+ catch (e) {
323
+ const outcome = e instanceof TimeoutError ? 'timeout' : 'threw';
324
+ const detail = e?.message ?? String(e);
325
+ return { ...base, outcome, detail, ms: Date.now() - started };
326
+ }
327
+ }
328
+ /** Run every probe sequentially and return the report (also set on window). */
329
+ export async function runConformance() {
330
+ const n = globalThis.UglyNative;
331
+ const ua = typeof navigator !== 'undefined' ? navigator.userAgent : '';
332
+ if (!n || typeof n.invoke !== 'function') {
333
+ const report = {
334
+ platform: 'unknown',
335
+ ts: Date.now(),
336
+ userAgent: ua,
337
+ results: [{ id: 'window.UglyNative', namespace: 'bridge', category: 'smoke', outcome: 'threw', detail: 'window.UglyNative is not present', ms: 0 }],
338
+ };
339
+ globalThis.__uglyConformance = report;
340
+ return report;
341
+ }
342
+ await bootstrapPermissions(n);
343
+ const results = [];
344
+ for (const probe of PROBES)
345
+ results.push(await runProbe(n, probe));
346
+ const report = { platform: n.platform, ts: Date.now(), userAgent: ua, results };
347
+ globalThis.__uglyConformance = report;
348
+ // If a sink is configured (mobile lanes can't be read in-process), POST it.
349
+ try {
350
+ const sink = new URLSearchParams(location.search).get('sink');
351
+ if (sink) {
352
+ const body = JSON.stringify(report);
353
+ // Prefer fetch (works cross-origin to the no-cors sink); fall back to beacon.
354
+ void fetch(sink, { method: 'POST', mode: 'no-cors', body }).catch(() => {
355
+ navigator.sendBeacon?.(sink, body);
356
+ });
357
+ }
358
+ }
359
+ catch {
360
+ /* no location/sink — desktop reads window.__uglyConformance directly */
361
+ }
362
+ return report;
363
+ }
364
+ //# sourceMappingURL=harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness.js","sourceRoot":"","sources":["../../../src/native/conformance/harness.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AiImage.d.ts","sourceRoot":"","sources":["../../src/server/AiImage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAMrD;;;GAGG;AACH,cAAM,0BAA2B,SAAQ,KAAK;;CAO7C;AACD,OAAO,EAAE,0BAA0B,EAAE,CAAC;AAqBtC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACtE;AASD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,eAAe,GACzB,cAAc,CAyDhB;AAGD,OAAO,EAAE,cAAc,IAAI,oBAAoB,EAAE,CAAC"}
1
+ {"version":3,"file":"AiImage.d.ts","sourceRoot":"","sources":["../../src/server/AiImage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAMrD;;;GAGG;AACH,cAAM,0BAA2B,SAAQ,KAAK;;CAO7C;AACD,OAAO,EAAE,0BAA0B,EAAE,CAAC;AAsBtC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACtE;AASD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,eAAe,GACzB,cAAc,CAyDhB;AAGD,OAAO,EAAE,cAAc,IAAI,oBAAoB,EAAE,CAAC"}
@@ -28,20 +28,22 @@ class UnauthenticatedAiCallError extends Error {
28
28
  }
29
29
  export { UnauthenticatedAiCallError };
30
30
  function resolveConfig() {
31
- const mode = process.env['UGLY_APP_AUTH_MODE'] === 'uglybot' ? 'user' : 'owner';
32
31
  const baseUrl = process.env['AI_PROXY_URL'] ?? DEFAULT_AI_PROXY_URL;
33
32
  const ownerToken = process.env['AI_PROXY_TOKEN'] ?? '';
34
- const userToken = mode === 'user' ? getUserToken() : null;
35
- if (mode === 'user' && !userToken) {
36
- throw new UnauthenticatedAiCallError();
33
+ // Bill the END USER when a session token is present; fall back to the owner
34
+ // token for self-hosted apps + background/no-user contexts. See AiText.
35
+ const selfHost = process.env['UGLY_APP_AUTH_MODE'] === 'self';
36
+ const userToken = selfHost ? null : getUserToken();
37
+ if (userToken) {
38
+ return { endpoint: `${baseUrl}/user-billed/image`, bearer: userToken, timeoutMs: DEFAULT_TIMEOUT_MS };
37
39
  }
38
- if (mode === 'owner' && !ownerToken) {
40
+ if (!ownerToken) {
41
+ if (!selfHost)
42
+ throw new UnauthenticatedAiCallError();
39
43
  throw new Error('[AiImage] AI_PROXY_TOKEN is not set. Run `npx ugly-app login` ' +
40
44
  'or configure AI_PROXY_URL/AI_PROXY_TOKEN explicitly.');
41
45
  }
42
- const endpoint = mode === 'user' ? `${baseUrl}/user-billed/image` : `${baseUrl}/image`;
43
- const bearer = mode === 'user' ? userToken : ownerToken;
44
- return { endpoint, bearer, timeoutMs: DEFAULT_TIMEOUT_MS };
46
+ return { endpoint: `${baseUrl}/image`, bearer: ownerToken, timeoutMs: DEFAULT_TIMEOUT_MS };
45
47
  }
46
48
  /**
47
49
  * Create an image generation client scoped to `userId`. Returned client
@@ -1 +1 @@
1
- {"version":3,"file":"AiImage.js","sourceRoot":"","sources":["../../src/server/AiImage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AiImage.js","sourceRoot":"","sources":["../../src/server/AiImage.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AiText.d.ts","sourceRoot":"","sources":["../../src/server/AiText.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,cAAc,EACd,OAAO,EACR,MAAM,eAAe,CAAC;AAMvB;;;;;GAKG;AACH,cAAM,0BAA2B,SAAQ,KAAK;;CAO7C;AACD,OAAO,EAAE,0BAA0B,EAAE,CAAC;AAsEtC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACzE,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,EACjC,MAAM,EAAE,CAAC,EACT,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,iBAAiB,CACf,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC,CAAC;CAC5B;AA0BD;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,cAAc,GACxB,aAAa,CA+Bf;AAGD,OAAO,EAAE,aAAa,IAAI,mBAAmB,EAAE,CAAC"}
1
+ {"version":3,"file":"AiText.d.ts","sourceRoot":"","sources":["../../src/server/AiText.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,cAAc,EACd,OAAO,EACR,MAAM,eAAe,CAAC;AAMvB;;;;;GAKG;AACH,cAAM,0BAA2B,SAAQ,KAAK;;CAO7C;AACD,OAAO,EAAE,0BAA0B,EAAE,CAAC;AA4EtC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACzE,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,EACjC,MAAM,EAAE,CAAC,EACT,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,iBAAiB,CACf,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC,CAAC;CAC5B;AA0BD;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,cAAc,GACxB,aAAa,CA+Bf;AAGD,OAAO,EAAE,aAAa,IAAI,mBAAmB,EAAE,CAAC"}
@@ -32,20 +32,27 @@ class UnauthenticatedAiCallError extends Error {
32
32
  }
33
33
  export { UnauthenticatedAiCallError };
34
34
  function resolveConfig() {
35
- const mode = process.env['UGLY_APP_AUTH_MODE'] === 'uglybot' ? 'user' : 'owner';
36
35
  const baseUrl = process.env['AI_PROXY_URL'] ?? DEFAULT_AI_PROXY_URL;
37
36
  const ownerToken = process.env['AI_PROXY_TOKEN'] ?? '';
38
- const userToken = mode === 'user' ? getUserToken() : null;
39
- if (mode === 'user' && !userToken) {
40
- throw new UnauthenticatedAiCallError();
37
+ // Bill the END USER whenever a session token is in context (user-facing
38
+ // requests carry it via ALS); fall back to the owner token for self-hosted
39
+ // apps and background/no-user contexts (cron, queue). We key off the actual
40
+ // user token rather than UGLY_APP_AUTH_MODE because that env var is often
41
+ // unset in the Workers runtime — owner-billing a user-facing call would draw
42
+ // down the app owner's balance instead of the signed-in user's (→ 402s).
43
+ const selfHost = process.env['UGLY_APP_AUTH_MODE'] === 'self';
44
+ const userToken = selfHost ? null : getUserToken();
45
+ if (userToken) {
46
+ return { endpoint: `${baseUrl}/user-billed/text`, bearer: userToken, timeoutMs: DEFAULT_TIMEOUT_MS };
41
47
  }
42
- if (mode === 'owner' && !ownerToken) {
48
+ if (!ownerToken) {
49
+ // No end user to bill and no owner token configured.
50
+ if (!selfHost)
51
+ throw new UnauthenticatedAiCallError();
43
52
  throw new Error('[AiText] AI_PROXY_TOKEN is not set. Run `npx ugly-app login` ' +
44
53
  'or configure AI_PROXY_URL/AI_PROXY_TOKEN explicitly.');
45
54
  }
46
- const endpoint = mode === 'user' ? `${baseUrl}/user-billed/text` : `${baseUrl}/text`;
47
- const bearer = mode === 'user' ? userToken : ownerToken;
48
- return { endpoint, bearer, timeoutMs: DEFAULT_TIMEOUT_MS };
55
+ return { endpoint: `${baseUrl}/text`, bearer: ownerToken, timeoutMs: DEFAULT_TIMEOUT_MS };
49
56
  }
50
57
  async function postText(body) {
51
58
  const { endpoint, bearer, timeoutMs } = resolveConfig();