clawmoney 0.18.0 → 0.18.2
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/companion/main.js
CHANGED
|
@@ -12,7 +12,7 @@ const fs = require('node:fs');
|
|
|
12
12
|
const path = require('node:path');
|
|
13
13
|
const os = require('node:os');
|
|
14
14
|
const http = require('node:http');
|
|
15
|
-
const { spawn } = require('node:child_process');
|
|
15
|
+
const { spawn, spawnSync } = require('node:child_process');
|
|
16
16
|
|
|
17
17
|
// Rebrand from "Electron" — sets the macOS menu-bar app name (and userData path).
|
|
18
18
|
app.setName('ClawMoney');
|
|
@@ -186,13 +186,17 @@ function ensureMarketRunning() {
|
|
|
186
186
|
if (!cfg || !cfg.api_key) return; // not logged in → don't take orders
|
|
187
187
|
if (readPidStatus('market', 'provider.pid').running) return; // already up
|
|
188
188
|
try {
|
|
189
|
-
|
|
190
|
-
|
|
189
|
+
// Use system `node` (not process.execPath). process.execPath is the ClawMoney
|
|
190
|
+
// electron binary; even with ELECTRON_RUN_AS_NODE, the CLI's daemon inherits
|
|
191
|
+
// that execPath and re-launches as a GUI electron window → single-instance
|
|
192
|
+
// clash → the companion flickers/relaunches. `node` keeps the daemon headless.
|
|
193
|
+
const child = spawn('node', [entry, 'market', 'start'], {
|
|
194
|
+
env: { ...process.env, PATH: CLI_PATH },
|
|
191
195
|
detached: true,
|
|
192
196
|
stdio: 'ignore',
|
|
193
197
|
});
|
|
194
198
|
child.unref();
|
|
195
|
-
log('ensureMarketRunning: started `clawmoney market start`');
|
|
199
|
+
log('ensureMarketRunning: started `node clawmoney market start`');
|
|
196
200
|
} catch (e) {
|
|
197
201
|
log(`ensureMarketRunning failed: ${e.message}`);
|
|
198
202
|
}
|
|
@@ -263,6 +267,71 @@ async function loadDashboard() {
|
|
|
263
267
|
return dash;
|
|
264
268
|
}
|
|
265
269
|
|
|
270
|
+
// LLM subscriptions that can be resold via the relay (mirrors desktop LLM_SPECS).
|
|
271
|
+
const LLM_SPECS = [
|
|
272
|
+
{ cli: 'codex', package: '@openai/codex', token: '.codex/auth.json', model: 'gpt-5.5' },
|
|
273
|
+
{ cli: 'chatgpt-web', package: '@jackwener/opencli', token: '', model: 'gpt-5.2' },
|
|
274
|
+
{ cli: 'gemini', package: '@google/gemini-cli', token: '.gemini/oauth_creds.json', model: 'gemini-2.5-flash' },
|
|
275
|
+
];
|
|
276
|
+
const RELAY_RESALE_PATH = path.join(os.homedir(), '.clawmoney', 'relay-resale.json');
|
|
277
|
+
|
|
278
|
+
function commandExists(bin) {
|
|
279
|
+
try {
|
|
280
|
+
return spawnSync('which', [bin], { env: { ...process.env, PATH: CLI_PATH }, encoding: 'utf8' }).status === 0;
|
|
281
|
+
} catch { return false; }
|
|
282
|
+
}
|
|
283
|
+
function llmProbeBinary(cli) { return cli === 'chatgpt-web' ? 'opencli' : cli; }
|
|
284
|
+
function llmReady(cli, token) {
|
|
285
|
+
// chatgpt-web has no token file; treat opencli's presence as the ready signal.
|
|
286
|
+
if (cli === 'chatgpt-web') return commandExists('opencli');
|
|
287
|
+
return token ? fs.existsSync(path.join(os.homedir(), ...token.split('/'))) : false;
|
|
288
|
+
}
|
|
289
|
+
function readRelaySettings() {
|
|
290
|
+
try {
|
|
291
|
+
if (fs.existsSync(RELAY_RESALE_PATH)) return JSON.parse(fs.readFileSync(RELAY_RESALE_PATH, 'utf8'));
|
|
292
|
+
} catch { /* ignore */ }
|
|
293
|
+
return {};
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// Run a process async (Promise) so the Electron main thread never blocks —
|
|
297
|
+
// mirrors desktop's run_cli on a spawn_blocking thread. The UI stays responsive
|
|
298
|
+
// while market/relay daemons start/stop or npm installs run.
|
|
299
|
+
function runProc(cmd, procArgs, timeoutMs = 25000) {
|
|
300
|
+
return new Promise((resolve) => {
|
|
301
|
+
let child;
|
|
302
|
+
try {
|
|
303
|
+
child = spawn(cmd, procArgs, { env: { ...process.env, PATH: CLI_PATH } });
|
|
304
|
+
} catch (e) {
|
|
305
|
+
resolve({ ok: false, error: String(e) });
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
let out = '';
|
|
309
|
+
let err = '';
|
|
310
|
+
const timer = setTimeout(() => {
|
|
311
|
+
try { child.kill('SIGKILL'); } catch { /* ignore */ }
|
|
312
|
+
resolve({ ok: false, error: 'timeout' });
|
|
313
|
+
}, timeoutMs);
|
|
314
|
+
child.stdout?.on('data', (d) => { out += d; });
|
|
315
|
+
child.stderr?.on('data', (d) => { err += d; });
|
|
316
|
+
child.on('close', (code) => {
|
|
317
|
+
clearTimeout(timer);
|
|
318
|
+
resolve({ ok: code === 0, stdout: out.trim(), stderr: err.trim() });
|
|
319
|
+
});
|
|
320
|
+
child.on('error', (e) => {
|
|
321
|
+
clearTimeout(timer);
|
|
322
|
+
resolve({ ok: false, error: String(e) });
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// Run a clawmoney CLI subcommand via system `node` (not process.execPath, which
|
|
328
|
+
// is the electron binary — see ensureMarketRunning). Returns a Promise.
|
|
329
|
+
function runCli(cliArgs, timeoutMs = 25000) {
|
|
330
|
+
const entry = process.env.CLAWMONEY_CLI_ENTRY;
|
|
331
|
+
if (!entry || !fs.existsSync(entry)) return Promise.resolve({ ok: false, error: 'CLI entry not found' });
|
|
332
|
+
return runProc('node', [entry, ...cliArgs], timeoutMs);
|
|
333
|
+
}
|
|
334
|
+
|
|
266
335
|
async function handleTauriCommand(cmd, args) {
|
|
267
336
|
log(`invoke: ${cmd}`);
|
|
268
337
|
try {
|
|
@@ -271,8 +340,105 @@ async function handleTauriCommand(cmd, args) {
|
|
|
271
340
|
return await loadDashboard();
|
|
272
341
|
case 'load_provider_log':
|
|
273
342
|
return { ok: true, providerLog: [] };
|
|
343
|
+
// Local-service controls → drive the clawmoney CLI daemons.
|
|
344
|
+
case 'start_market': return await runCli(['market', 'start']);
|
|
345
|
+
case 'stop_market': return await runCli(['market', 'stop']);
|
|
346
|
+
case 'start_surf': return await runCli(['relay', 'start']);
|
|
347
|
+
case 'stop_surf': return await runCli(['relay', 'stop']);
|
|
348
|
+
case 'launch_chrome':
|
|
349
|
+
try { spawn('open', ['-a', 'Google Chrome'], { detached: true, stdio: 'ignore' }).unref(); } catch { /* ignore */ }
|
|
350
|
+
return { ok: true };
|
|
351
|
+
case 'open_external':
|
|
352
|
+
if (args && args.url) shell.openExternal(String(args.url));
|
|
353
|
+
return { ok: true };
|
|
354
|
+
case 'install_extension':
|
|
355
|
+
shell.openExternal(EXTENSION_URL);
|
|
356
|
+
return { ok: true };
|
|
357
|
+
case 'logout': {
|
|
358
|
+
// Clear api_key so the UI returns to the signed-out state.
|
|
359
|
+
try {
|
|
360
|
+
const txt = fs.readFileSync(CONFIG_PATH, 'utf8');
|
|
361
|
+
fs.writeFileSync(CONFIG_PATH, txt.replace(/^api_key:.*$/m, '').replace(/\n{3,}/g, '\n\n'));
|
|
362
|
+
} catch { /* ignore */ }
|
|
363
|
+
return { ok: true };
|
|
364
|
+
}
|
|
365
|
+
// ── Agent 上架 (relay resale of LLM subscriptions) ──
|
|
366
|
+
case 'llm_detect': {
|
|
367
|
+
const providers = LLM_SPECS.map((s) => ({
|
|
368
|
+
cli: s.cli,
|
|
369
|
+
package: s.package,
|
|
370
|
+
installed: commandExists(llmProbeBinary(s.cli)),
|
|
371
|
+
loggedIn: llmReady(s.cli, s.token),
|
|
372
|
+
defaultModel: s.model,
|
|
373
|
+
}));
|
|
374
|
+
return { ok: true, providers };
|
|
375
|
+
}
|
|
376
|
+
case 'llm_install': {
|
|
377
|
+
const spec = LLM_SPECS.find((s) => s.cli === (args && args.cli));
|
|
378
|
+
if (!spec) return { ok: false, error: `unknown cli ${args && args.cli}` };
|
|
379
|
+
return await runProc('npm', ['install', '-g', spec.package], 180000);
|
|
380
|
+
}
|
|
381
|
+
case 'llm_login': {
|
|
382
|
+
const cli = args && args.cli;
|
|
383
|
+
if (cli === 'gemini') {
|
|
384
|
+
try {
|
|
385
|
+
spawn('osascript', ['-e', 'tell application "Terminal"\nactivate\ndo script "gemini"\nend tell'],
|
|
386
|
+
{ detached: true, stdio: 'ignore' }).unref();
|
|
387
|
+
} catch { /* ignore */ }
|
|
388
|
+
return { ok: true, message: '已打开终端 — 在终端里选 "Login with Google" 登录,完成后回来' };
|
|
389
|
+
}
|
|
390
|
+
const bin = llmProbeBinary(cli);
|
|
391
|
+
if (!commandExists(bin)) return { ok: false, error: `${cli} 未安装` };
|
|
392
|
+
try {
|
|
393
|
+
spawn(bin, ['login'], { env: { ...process.env, PATH: CLI_PATH }, detached: true, stdio: 'ignore' }).unref();
|
|
394
|
+
} catch (e) { return { ok: false, error: String(e) }; }
|
|
395
|
+
return { ok: true };
|
|
396
|
+
}
|
|
397
|
+
case 'llm_set_enabled': {
|
|
398
|
+
const cli = args && args.cli;
|
|
399
|
+
const enabled = !!(args && args.enabled);
|
|
400
|
+
try {
|
|
401
|
+
const s = readRelaySettings();
|
|
402
|
+
const disabled = new Set(Array.isArray(s.disabledClis) ? s.disabledClis : []);
|
|
403
|
+
if (enabled) disabled.delete(cli); else disabled.add(cli);
|
|
404
|
+
s.disabledClis = [...disabled];
|
|
405
|
+
fs.mkdirSync(path.dirname(RELAY_RESALE_PATH), { recursive: true });
|
|
406
|
+
fs.writeFileSync(RELAY_RESALE_PATH, JSON.stringify(s, null, 2));
|
|
407
|
+
if (enabled && s.online) {
|
|
408
|
+
const spec = LLM_SPECS.find((x) => x.cli === cli);
|
|
409
|
+
if (spec && llmReady(spec.cli, spec.token)) {
|
|
410
|
+
await runCli(['relay', 'register', '--cli', spec.cli, '--model', spec.model, '--concurrency', String(s.concurrency || 2)], 30000);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
} catch (e) { return { ok: false, error: String(e) }; }
|
|
414
|
+
return { ok: true };
|
|
415
|
+
}
|
|
416
|
+
case 'relay_settings_get':
|
|
417
|
+
return readRelaySettings();
|
|
418
|
+
case 'relay_settings_set': {
|
|
419
|
+
const settings = (args && args.settings) ? args.settings : (args || {});
|
|
420
|
+
try {
|
|
421
|
+
fs.mkdirSync(path.dirname(RELAY_RESALE_PATH), { recursive: true });
|
|
422
|
+
fs.writeFileSync(RELAY_RESALE_PATH, JSON.stringify(settings, null, 2));
|
|
423
|
+
} catch (e) { log(`relay_settings_set write: ${e.message}`); }
|
|
424
|
+
if (settings.online === true) {
|
|
425
|
+
const conc = String(settings.concurrency || 2);
|
|
426
|
+
const disabled = Array.isArray(settings.disabledClis) ? settings.disabledClis : [];
|
|
427
|
+
let registered = 0;
|
|
428
|
+
for (const spec of LLM_SPECS) {
|
|
429
|
+
if (disabled.includes(spec.cli)) continue;
|
|
430
|
+
if (llmReady(spec.cli, spec.token)) {
|
|
431
|
+
await runCli(['relay', 'register', '--cli', spec.cli, '--model', spec.model, '--concurrency', conc], 30000);
|
|
432
|
+
registered++;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
return { ok: true, registered, applied: await runCli(['relay', 'start']) };
|
|
436
|
+
}
|
|
437
|
+
return { ok: true, applied: await runCli(['relay', 'stop']) };
|
|
438
|
+
}
|
|
274
439
|
default:
|
|
275
|
-
// window/event plugin calls (
|
|
440
|
+
// window/event plugin calls (plugin:window|*) + not-yet-wired commands
|
|
441
|
+
// (llm_upload etc) — no-op so the UI doesn't error.
|
|
276
442
|
if (typeof cmd === 'string' && cmd.startsWith('plugin:')) return {};
|
|
277
443
|
return { ok: true };
|
|
278
444
|
}
|
|
@@ -345,7 +511,12 @@ function createWindow() {
|
|
|
345
511
|
'html,body{background:transparent !important;}' +
|
|
346
512
|
'#desktop{display:none !important;}' +
|
|
347
513
|
'.stage{padding:0 !important;}' +
|
|
348
|
-
'#app{transform:none !important;border-radius:22px !important;}'
|
|
514
|
+
'#app{transform:none !important;border-radius:22px !important;}' +
|
|
515
|
+
// Frameless-window dragging: desktop UI uses Tauri JS dragging (no-op in
|
|
516
|
+
// Electron), so make the top bars draggable via CSS app-region; keep all
|
|
517
|
+
// interactive elements clickable.
|
|
518
|
+
'.page-header,.sidebar-header{-webkit-app-region:drag;}' +
|
|
519
|
+
'.page-actions,.page-actions *,button,a,input,select,[role=button]{-webkit-app-region:no-drag;}'
|
|
349
520
|
).catch((e) => log(`insertCSS failed: ${e.message}`));
|
|
350
521
|
win.show();
|
|
351
522
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))s(a);new MutationObserver(a=>{for(const l of a)if(l.type==="childList")for(const r of l.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&s(r)}).observe(document,{childList:!0,subtree:!0});function n(a){const l={};return a.integrity&&(l.integrity=a.integrity),a.referrerPolicy&&(l.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?l.credentials="include":a.crossOrigin==="anonymous"?l.credentials="omit":l.credentials="same-origin",l}function s(a){if(a.ep)return;a.ep=!0;const l=n(a);fetch(a.href,l)}})();function Zt(e,t,n,s){if(typeof t=="function"?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return n==="m"?s:n==="a"?s.call(e):s?s.value:t.get(e)}function ei(e,t,n,s,a){if(typeof t=="function"?e!==t||!0:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return t.set(e,n),n}var ae;const k="__TAURI_TO_IPC_KEY__";function ti(e,t=!1){return window.__TAURI_INTERNALS__.transformCallback(e,t)}async function c(e,t={},n){return window.__TAURI_INTERNALS__.invoke(e,t,n)}class ii{get rid(){return Zt(this,ae,"f")}constructor(t){ae.set(this,void 0),ei(this,ae,t)}async close(){return c("plugin:resources|close",{rid:this.rid})}}ae=new WeakMap;class pt{constructor(...t){this.type="Logical",t.length===1?"Logical"in t[0]?(this.width=t[0].Logical.width,this.height=t[0].Logical.height):(this.width=t[0].width,this.height=t[0].height):(this.width=t[0],this.height=t[1])}toPhysical(t){return new V(this.width*t,this.height*t)}[k](){return{width:this.width,height:this.height}}toJSON(){return this[k]()}}class V{constructor(...t){this.type="Physical",t.length===1?"Physical"in t[0]?(this.width=t[0].Physical.width,this.height=t[0].Physical.height):(this.width=t[0].width,this.height=t[0].height):(this.width=t[0],this.height=t[1])}toLogical(t){return new pt(this.width/t,this.height/t)}[k](){return{width:this.width,height:this.height}}toJSON(){return this[k]()}}class O{constructor(t){this.size=t}toLogical(t){return this.size instanceof pt?this.size:this.size.toLogical(t)}toPhysical(t){return this.size instanceof V?this.size:this.size.toPhysical(t)}[k](){return{[`${this.size.type}`]:{width:this.size.width,height:this.size.height}}}toJSON(){return this[k]()}}class mt{constructor(...t){this.type="Logical",t.length===1?"Logical"in t[0]?(this.x=t[0].Logical.x,this.y=t[0].Logical.y):(this.x=t[0].x,this.y=t[0].y):(this.x=t[0],this.y=t[1])}toPhysical(t){return new M(this.x*t,this.y*t)}[k](){return{x:this.x,y:this.y}}toJSON(){return this[k]()}}class M{constructor(...t){this.type="Physical",t.length===1?"Physical"in t[0]?(this.x=t[0].Physical.x,this.y=t[0].Physical.y):(this.x=t[0].x,this.y=t[0].y):(this.x=t[0],this.y=t[1])}toLogical(t){return new mt(this.x/t,this.y/t)}[k](){return{x:this.x,y:this.y}}toJSON(){return this[k]()}}class te{constructor(t){this.position=t}toLogical(t){return this.position instanceof mt?this.position:this.position.toLogical(t)}toPhysical(t){return this.position instanceof M?this.position:this.position.toPhysical(t)}[k](){return{[`${this.position.type}`]:{x:this.position.x,y:this.position.y}}}toJSON(){return this[k]()}}var v;(function(e){e.WINDOW_RESIZED="tauri://resize",e.WINDOW_MOVED="tauri://move",e.WINDOW_CLOSE_REQUESTED="tauri://close-requested",e.WINDOW_DESTROYED="tauri://destroyed",e.WINDOW_FOCUS="tauri://focus",e.WINDOW_BLUR="tauri://blur",e.WINDOW_SCALE_FACTOR_CHANGED="tauri://scale-change",e.WINDOW_THEME_CHANGED="tauri://theme-changed",e.WINDOW_CREATED="tauri://window-created",e.WEBVIEW_CREATED="tauri://webview-created",e.DRAG_ENTER="tauri://drag-enter",e.DRAG_OVER="tauri://drag-over",e.DRAG_DROP="tauri://drag-drop",e.DRAG_LEAVE="tauri://drag-leave"})(v||(v={}));async function ft(e,t){window.__TAURI_EVENT_PLUGIN_INTERNALS__.unregisterListener(e,t),await c("plugin:event|unlisten",{event:e,eventId:t})}async function ht(e,t,n){var s;const a=typeof n?.target=="string"?{kind:"AnyLabel",label:n.target}:(s=n?.target)!==null&&s!==void 0?s:{kind:"Any"};return c("plugin:event|listen",{event:e,target:a,handler:ti(t)}).then(l=>async()=>ft(e,l))}async function ni(e,t,n){return ht(e,s=>{ft(e,s.id),t(s)},n)}async function si(e,t){await c("plugin:event|emit",{event:e,payload:t})}async function ai(e,t,n){await c("plugin:event|emit_to",{target:typeof e=="string"?{kind:"AnyLabel",label:e}:e,event:t,payload:n})}class j extends ii{constructor(t){super(t)}static async new(t,n,s){return c("plugin:image|new",{rgba:re(t),width:n,height:s}).then(a=>new j(a))}static async fromBytes(t){return c("plugin:image|from_bytes",{bytes:re(t)}).then(n=>new j(n))}static async fromPath(t){return c("plugin:image|from_path",{path:t}).then(n=>new j(n))}async rgba(){return c("plugin:image|rgba",{rid:this.rid}).then(t=>new Uint8Array(t))}async size(){return c("plugin:image|size",{rid:this.rid})}}function re(e){return e==null?null:typeof e=="string"?e:e instanceof j?e.rid:e}var Te;(function(e){e[e.Critical=1]="Critical",e[e.Informational=2]="Informational"})(Te||(Te={}));class oi{constructor(t){this._preventDefault=!1,this.event=t.event,this.id=t.id}preventDefault(){this._preventDefault=!0}isPreventDefault(){return this._preventDefault}}var Je;(function(e){e.None="none",e.Normal="normal",e.Indeterminate="indeterminate",e.Paused="paused",e.Error="error"})(Je||(Je={}));function Ne(){return new bt(window.__TAURI_INTERNALS__.metadata.currentWindow.label,{skip:!0})}async function _e(){return c("plugin:window|get_all_windows").then(e=>e.map(t=>new bt(t,{skip:!0})))}const Se=["tauri://created","tauri://error"];class bt{constructor(t,n={}){var s;this.label=t,this.listeners=Object.create(null),n?.skip||c("plugin:window|create",{options:{...n,parent:typeof n.parent=="string"?n.parent:(s=n.parent)===null||s===void 0?void 0:s.label,label:t}}).then(async()=>this.emit("tauri://created")).catch(async a=>this.emit("tauri://error",a))}static async getByLabel(t){var n;return(n=(await _e()).find(s=>s.label===t))!==null&&n!==void 0?n:null}static getCurrent(){return Ne()}static async getAll(){return _e()}static async getFocusedWindow(){for(const t of await _e())if(await t.isFocused())return t;return null}async listen(t,n){return this._handleTauriEvent(t,n)?()=>{const s=this.listeners[t];s.splice(s.indexOf(n),1)}:ht(t,n,{target:{kind:"Window",label:this.label}})}async once(t,n){return this._handleTauriEvent(t,n)?()=>{const s=this.listeners[t];s.splice(s.indexOf(n),1)}:ni(t,n,{target:{kind:"Window",label:this.label}})}async emit(t,n){if(Se.includes(t)){for(const s of this.listeners[t]||[])s({event:t,id:-1,payload:n});return}return si(t,n)}async emitTo(t,n,s){if(Se.includes(n)){for(const a of this.listeners[n]||[])a({event:n,id:-1,payload:s});return}return ai(t,n,s)}_handleTauriEvent(t,n){return Se.includes(t)?(t in this.listeners?this.listeners[t].push(n):this.listeners[t]=[n],!0):!1}async scaleFactor(){return c("plugin:window|scale_factor",{label:this.label})}async innerPosition(){return c("plugin:window|inner_position",{label:this.label}).then(t=>new M(t))}async outerPosition(){return c("plugin:window|outer_position",{label:this.label}).then(t=>new M(t))}async innerSize(){return c("plugin:window|inner_size",{label:this.label}).then(t=>new V(t))}async outerSize(){return c("plugin:window|outer_size",{label:this.label}).then(t=>new V(t))}async isFullscreen(){return c("plugin:window|is_fullscreen",{label:this.label})}async isMinimized(){return c("plugin:window|is_minimized",{label:this.label})}async isMaximized(){return c("plugin:window|is_maximized",{label:this.label})}async isFocused(){return c("plugin:window|is_focused",{label:this.label})}async isDecorated(){return c("plugin:window|is_decorated",{label:this.label})}async isResizable(){return c("plugin:window|is_resizable",{label:this.label})}async isMaximizable(){return c("plugin:window|is_maximizable",{label:this.label})}async isMinimizable(){return c("plugin:window|is_minimizable",{label:this.label})}async isClosable(){return c("plugin:window|is_closable",{label:this.label})}async isVisible(){return c("plugin:window|is_visible",{label:this.label})}async title(){return c("plugin:window|title",{label:this.label})}async theme(){return c("plugin:window|theme",{label:this.label})}async isAlwaysOnTop(){return c("plugin:window|is_always_on_top",{label:this.label})}async center(){return c("plugin:window|center",{label:this.label})}async requestUserAttention(t){let n=null;return t&&(t===Te.Critical?n={type:"Critical"}:n={type:"Informational"}),c("plugin:window|request_user_attention",{label:this.label,value:n})}async setResizable(t){return c("plugin:window|set_resizable",{label:this.label,value:t})}async setEnabled(t){return c("plugin:window|set_enabled",{label:this.label,value:t})}async isEnabled(){return c("plugin:window|is_enabled",{label:this.label})}async setMaximizable(t){return c("plugin:window|set_maximizable",{label:this.label,value:t})}async setMinimizable(t){return c("plugin:window|set_minimizable",{label:this.label,value:t})}async setClosable(t){return c("plugin:window|set_closable",{label:this.label,value:t})}async setTitle(t){return c("plugin:window|set_title",{label:this.label,value:t})}async maximize(){return c("plugin:window|maximize",{label:this.label})}async unmaximize(){return c("plugin:window|unmaximize",{label:this.label})}async toggleMaximize(){return c("plugin:window|toggle_maximize",{label:this.label})}async minimize(){return c("plugin:window|minimize",{label:this.label})}async unminimize(){return c("plugin:window|unminimize",{label:this.label})}async show(){return c("plugin:window|show",{label:this.label})}async hide(){return c("plugin:window|hide",{label:this.label})}async close(){return c("plugin:window|close",{label:this.label})}async destroy(){return c("plugin:window|destroy",{label:this.label})}async setDecorations(t){return c("plugin:window|set_decorations",{label:this.label,value:t})}async setShadow(t){return c("plugin:window|set_shadow",{label:this.label,value:t})}async setEffects(t){return c("plugin:window|set_effects",{label:this.label,value:t})}async clearEffects(){return c("plugin:window|set_effects",{label:this.label,value:null})}async setAlwaysOnTop(t){return c("plugin:window|set_always_on_top",{label:this.label,value:t})}async setAlwaysOnBottom(t){return c("plugin:window|set_always_on_bottom",{label:this.label,value:t})}async setContentProtected(t){return c("plugin:window|set_content_protected",{label:this.label,value:t})}async setSize(t){return c("plugin:window|set_size",{label:this.label,value:t instanceof O?t:new O(t)})}async setMinSize(t){return c("plugin:window|set_min_size",{label:this.label,value:t instanceof O?t:t?new O(t):null})}async setMaxSize(t){return c("plugin:window|set_max_size",{label:this.label,value:t instanceof O?t:t?new O(t):null})}async setSizeConstraints(t){function n(s){return s?{Logical:s}:null}return c("plugin:window|set_size_constraints",{label:this.label,value:{minWidth:n(t?.minWidth),minHeight:n(t?.minHeight),maxWidth:n(t?.maxWidth),maxHeight:n(t?.maxHeight)}})}async setPosition(t){return c("plugin:window|set_position",{label:this.label,value:t instanceof te?t:new te(t)})}async setFullscreen(t){return c("plugin:window|set_fullscreen",{label:this.label,value:t})}async setSimpleFullscreen(t){return c("plugin:window|set_simple_fullscreen",{label:this.label,value:t})}async setFocus(){return c("plugin:window|set_focus",{label:this.label})}async setFocusable(t){return c("plugin:window|set_focusable",{label:this.label,value:t})}async setIcon(t){return c("plugin:window|set_icon",{label:this.label,value:re(t)})}async setSkipTaskbar(t){return c("plugin:window|set_skip_taskbar",{label:this.label,value:t})}async setCursorGrab(t){return c("plugin:window|set_cursor_grab",{label:this.label,value:t})}async setCursorVisible(t){return c("plugin:window|set_cursor_visible",{label:this.label,value:t})}async setCursorIcon(t){return c("plugin:window|set_cursor_icon",{label:this.label,value:t})}async setBackgroundColor(t){return c("plugin:window|set_background_color",{color:t})}async setCursorPosition(t){return c("plugin:window|set_cursor_position",{label:this.label,value:t instanceof te?t:new te(t)})}async setIgnoreCursorEvents(t){return c("plugin:window|set_ignore_cursor_events",{label:this.label,value:t})}async startDragging(){return c("plugin:window|start_dragging",{label:this.label})}async startResizeDragging(t){return c("plugin:window|start_resize_dragging",{label:this.label,value:t})}async setBadgeCount(t){return c("plugin:window|set_badge_count",{label:this.label,value:t})}async setBadgeLabel(t){return c("plugin:window|set_badge_label",{label:this.label,value:t})}async setOverlayIcon(t){return c("plugin:window|set_overlay_icon",{label:this.label,value:t?re(t):void 0})}async setProgressBar(t){return c("plugin:window|set_progress_bar",{label:this.label,value:t})}async setVisibleOnAllWorkspaces(t){return c("plugin:window|set_visible_on_all_workspaces",{label:this.label,value:t})}async setTitleBarStyle(t){return c("plugin:window|set_title_bar_style",{label:this.label,value:t})}async setTheme(t){return c("plugin:window|set_theme",{label:this.label,value:t})}async onResized(t){return this.listen(v.WINDOW_RESIZED,n=>{n.payload=new V(n.payload),t(n)})}async onMoved(t){return this.listen(v.WINDOW_MOVED,n=>{n.payload=new M(n.payload),t(n)})}async onCloseRequested(t){return this.listen(v.WINDOW_CLOSE_REQUESTED,async n=>{const s=new oi(n);await t(s),s.isPreventDefault()||await this.destroy()})}async onDragDropEvent(t){const n=await this.listen(v.DRAG_ENTER,r=>{t({...r,payload:{type:"enter",paths:r.payload.paths,position:new M(r.payload.position)}})}),s=await this.listen(v.DRAG_OVER,r=>{t({...r,payload:{type:"over",position:new M(r.payload.position)}})}),a=await this.listen(v.DRAG_DROP,r=>{t({...r,payload:{type:"drop",paths:r.payload.paths,position:new M(r.payload.position)}})}),l=await this.listen(v.DRAG_LEAVE,r=>{t({...r,payload:{type:"leave"}})});return()=>{n(),a(),s(),l()}}async onFocusChanged(t){const n=await this.listen(v.WINDOW_FOCUS,a=>{t({...a,payload:!0})}),s=await this.listen(v.WINDOW_BLUR,a=>{t({...a,payload:!1})});return()=>{n(),s()}}async onScaleChanged(t){return this.listen(v.WINDOW_SCALE_FACTOR_CHANGED,t)}async onThemeChanged(t){return this.listen(v.WINDOW_THEME_CHANGED,t)}}var Xe;(function(e){e.Disabled="disabled",e.Throttle="throttle",e.Suspend="suspend"})(Xe||(Xe={}));var Qe;(function(e){e.Default="default",e.FluentOverlay="fluentOverlay"})(Qe||(Qe={}));var Ze;(function(e){e.AppearanceBased="appearanceBased",e.Light="light",e.Dark="dark",e.MediumLight="mediumLight",e.UltraDark="ultraDark",e.Titlebar="titlebar",e.Selection="selection",e.Menu="menu",e.Popover="popover",e.Sidebar="sidebar",e.HeaderView="headerView",e.Sheet="sheet",e.WindowBackground="windowBackground",e.HudWindow="hudWindow",e.FullScreenUI="fullScreenUI",e.Tooltip="tooltip",e.ContentBackground="contentBackground",e.UnderWindowBackground="underWindowBackground",e.UnderPageBackground="underPageBackground",e.Mica="mica",e.Blur="blur",e.Acrylic="acrylic",e.Tabbed="tabbed",e.TabbedDark="tabbedDark",e.TabbedLight="tabbedLight"})(Ze||(Ze={}));var et;(function(e){e.FollowsWindowActiveState="followsWindowActiveState",e.Active="active",e.Inactive="inactive"})(et||(et={}));const li=`# 更新日志
|
|
1
|
+
(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))s(a);new MutationObserver(a=>{for(const l of a)if(l.type==="childList")for(const r of l.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&s(r)}).observe(document,{childList:!0,subtree:!0});function n(a){const l={};return a.integrity&&(l.integrity=a.integrity),a.referrerPolicy&&(l.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?l.credentials="include":a.crossOrigin==="anonymous"?l.credentials="omit":l.credentials="same-origin",l}function s(a){if(a.ep)return;a.ep=!0;const l=n(a);fetch(a.href,l)}})();function Zt(e,t,n,s){if(typeof t=="function"?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return n==="m"?s:n==="a"?s.call(e):s?s.value:t.get(e)}function ei(e,t,n,s,a){if(typeof t=="function"?e!==t||!0:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return t.set(e,n),n}var ae;const k="__TAURI_TO_IPC_KEY__";function ti(e,t=!1){return window.__TAURI_INTERNALS__.transformCallback(e,t)}async function c(e,t={},n){return window.__TAURI_INTERNALS__.invoke(e,t,n)}class ii{get rid(){return Zt(this,ae,"f")}constructor(t){ae.set(this,void 0),ei(this,ae,t)}async close(){return c("plugin:resources|close",{rid:this.rid})}}ae=new WeakMap;class gt{constructor(...t){this.type="Logical",t.length===1?"Logical"in t[0]?(this.width=t[0].Logical.width,this.height=t[0].Logical.height):(this.width=t[0].width,this.height=t[0].height):(this.width=t[0],this.height=t[1])}toPhysical(t){return new V(this.width*t,this.height*t)}[k](){return{width:this.width,height:this.height}}toJSON(){return this[k]()}}class V{constructor(...t){this.type="Physical",t.length===1?"Physical"in t[0]?(this.width=t[0].Physical.width,this.height=t[0].Physical.height):(this.width=t[0].width,this.height=t[0].height):(this.width=t[0],this.height=t[1])}toLogical(t){return new gt(this.width/t,this.height/t)}[k](){return{width:this.width,height:this.height}}toJSON(){return this[k]()}}class N{constructor(t){this.size=t}toLogical(t){return this.size instanceof gt?this.size:this.size.toLogical(t)}toPhysical(t){return this.size instanceof V?this.size:this.size.toPhysical(t)}[k](){return{[`${this.size.type}`]:{width:this.size.width,height:this.size.height}}}toJSON(){return this[k]()}}class pt{constructor(...t){this.type="Logical",t.length===1?"Logical"in t[0]?(this.x=t[0].Logical.x,this.y=t[0].Logical.y):(this.x=t[0].x,this.y=t[0].y):(this.x=t[0],this.y=t[1])}toPhysical(t){return new M(this.x*t,this.y*t)}[k](){return{x:this.x,y:this.y}}toJSON(){return this[k]()}}class M{constructor(...t){this.type="Physical",t.length===1?"Physical"in t[0]?(this.x=t[0].Physical.x,this.y=t[0].Physical.y):(this.x=t[0].x,this.y=t[0].y):(this.x=t[0],this.y=t[1])}toLogical(t){return new pt(this.x/t,this.y/t)}[k](){return{x:this.x,y:this.y}}toJSON(){return this[k]()}}class te{constructor(t){this.position=t}toLogical(t){return this.position instanceof pt?this.position:this.position.toLogical(t)}toPhysical(t){return this.position instanceof M?this.position:this.position.toPhysical(t)}[k](){return{[`${this.position.type}`]:{x:this.position.x,y:this.position.y}}}toJSON(){return this[k]()}}var v;(function(e){e.WINDOW_RESIZED="tauri://resize",e.WINDOW_MOVED="tauri://move",e.WINDOW_CLOSE_REQUESTED="tauri://close-requested",e.WINDOW_DESTROYED="tauri://destroyed",e.WINDOW_FOCUS="tauri://focus",e.WINDOW_BLUR="tauri://blur",e.WINDOW_SCALE_FACTOR_CHANGED="tauri://scale-change",e.WINDOW_THEME_CHANGED="tauri://theme-changed",e.WINDOW_CREATED="tauri://window-created",e.WEBVIEW_CREATED="tauri://webview-created",e.DRAG_ENTER="tauri://drag-enter",e.DRAG_OVER="tauri://drag-over",e.DRAG_DROP="tauri://drag-drop",e.DRAG_LEAVE="tauri://drag-leave"})(v||(v={}));async function mt(e,t){window.__TAURI_EVENT_PLUGIN_INTERNALS__.unregisterListener(e,t),await c("plugin:event|unlisten",{event:e,eventId:t})}async function ft(e,t,n){var s;const a=typeof n?.target=="string"?{kind:"AnyLabel",label:n.target}:(s=n?.target)!==null&&s!==void 0?s:{kind:"Any"};return c("plugin:event|listen",{event:e,target:a,handler:ti(t)}).then(l=>async()=>mt(e,l))}async function ni(e,t,n){return ft(e,s=>{mt(e,s.id),t(s)},n)}async function si(e,t){await c("plugin:event|emit",{event:e,payload:t})}async function ai(e,t,n){await c("plugin:event|emit_to",{target:typeof e=="string"?{kind:"AnyLabel",label:e}:e,event:t,payload:n})}class j extends ii{constructor(t){super(t)}static async new(t,n,s){return c("plugin:image|new",{rgba:re(t),width:n,height:s}).then(a=>new j(a))}static async fromBytes(t){return c("plugin:image|from_bytes",{bytes:re(t)}).then(n=>new j(n))}static async fromPath(t){return c("plugin:image|from_path",{path:t}).then(n=>new j(n))}async rgba(){return c("plugin:image|rgba",{rid:this.rid}).then(t=>new Uint8Array(t))}async size(){return c("plugin:image|size",{rid:this.rid})}}function re(e){return e==null?null:typeof e=="string"?e:e instanceof j?e.rid:e}var Te;(function(e){e[e.Critical=1]="Critical",e[e.Informational=2]="Informational"})(Te||(Te={}));class oi{constructor(t){this._preventDefault=!1,this.event=t.event,this.id=t.id}preventDefault(){this._preventDefault=!0}isPreventDefault(){return this._preventDefault}}var Ke;(function(e){e.None="none",e.Normal="normal",e.Indeterminate="indeterminate",e.Paused="paused",e.Error="error"})(Ke||(Ke={}));function Oe(){return new ht(window.__TAURI_INTERNALS__.metadata.currentWindow.label,{skip:!0})}async function _e(){return c("plugin:window|get_all_windows").then(e=>e.map(t=>new ht(t,{skip:!0})))}const Se=["tauri://created","tauri://error"];class ht{constructor(t,n={}){var s;this.label=t,this.listeners=Object.create(null),n?.skip||c("plugin:window|create",{options:{...n,parent:typeof n.parent=="string"?n.parent:(s=n.parent)===null||s===void 0?void 0:s.label,label:t}}).then(async()=>this.emit("tauri://created")).catch(async a=>this.emit("tauri://error",a))}static async getByLabel(t){var n;return(n=(await _e()).find(s=>s.label===t))!==null&&n!==void 0?n:null}static getCurrent(){return Oe()}static async getAll(){return _e()}static async getFocusedWindow(){for(const t of await _e())if(await t.isFocused())return t;return null}async listen(t,n){return this._handleTauriEvent(t,n)?()=>{const s=this.listeners[t];s.splice(s.indexOf(n),1)}:ft(t,n,{target:{kind:"Window",label:this.label}})}async once(t,n){return this._handleTauriEvent(t,n)?()=>{const s=this.listeners[t];s.splice(s.indexOf(n),1)}:ni(t,n,{target:{kind:"Window",label:this.label}})}async emit(t,n){if(Se.includes(t)){for(const s of this.listeners[t]||[])s({event:t,id:-1,payload:n});return}return si(t,n)}async emitTo(t,n,s){if(Se.includes(n)){for(const a of this.listeners[n]||[])a({event:n,id:-1,payload:s});return}return ai(t,n,s)}_handleTauriEvent(t,n){return Se.includes(t)?(t in this.listeners?this.listeners[t].push(n):this.listeners[t]=[n],!0):!1}async scaleFactor(){return c("plugin:window|scale_factor",{label:this.label})}async innerPosition(){return c("plugin:window|inner_position",{label:this.label}).then(t=>new M(t))}async outerPosition(){return c("plugin:window|outer_position",{label:this.label}).then(t=>new M(t))}async innerSize(){return c("plugin:window|inner_size",{label:this.label}).then(t=>new V(t))}async outerSize(){return c("plugin:window|outer_size",{label:this.label}).then(t=>new V(t))}async isFullscreen(){return c("plugin:window|is_fullscreen",{label:this.label})}async isMinimized(){return c("plugin:window|is_minimized",{label:this.label})}async isMaximized(){return c("plugin:window|is_maximized",{label:this.label})}async isFocused(){return c("plugin:window|is_focused",{label:this.label})}async isDecorated(){return c("plugin:window|is_decorated",{label:this.label})}async isResizable(){return c("plugin:window|is_resizable",{label:this.label})}async isMaximizable(){return c("plugin:window|is_maximizable",{label:this.label})}async isMinimizable(){return c("plugin:window|is_minimizable",{label:this.label})}async isClosable(){return c("plugin:window|is_closable",{label:this.label})}async isVisible(){return c("plugin:window|is_visible",{label:this.label})}async title(){return c("plugin:window|title",{label:this.label})}async theme(){return c("plugin:window|theme",{label:this.label})}async isAlwaysOnTop(){return c("plugin:window|is_always_on_top",{label:this.label})}async center(){return c("plugin:window|center",{label:this.label})}async requestUserAttention(t){let n=null;return t&&(t===Te.Critical?n={type:"Critical"}:n={type:"Informational"}),c("plugin:window|request_user_attention",{label:this.label,value:n})}async setResizable(t){return c("plugin:window|set_resizable",{label:this.label,value:t})}async setEnabled(t){return c("plugin:window|set_enabled",{label:this.label,value:t})}async isEnabled(){return c("plugin:window|is_enabled",{label:this.label})}async setMaximizable(t){return c("plugin:window|set_maximizable",{label:this.label,value:t})}async setMinimizable(t){return c("plugin:window|set_minimizable",{label:this.label,value:t})}async setClosable(t){return c("plugin:window|set_closable",{label:this.label,value:t})}async setTitle(t){return c("plugin:window|set_title",{label:this.label,value:t})}async maximize(){return c("plugin:window|maximize",{label:this.label})}async unmaximize(){return c("plugin:window|unmaximize",{label:this.label})}async toggleMaximize(){return c("plugin:window|toggle_maximize",{label:this.label})}async minimize(){return c("plugin:window|minimize",{label:this.label})}async unminimize(){return c("plugin:window|unminimize",{label:this.label})}async show(){return c("plugin:window|show",{label:this.label})}async hide(){return c("plugin:window|hide",{label:this.label})}async close(){return c("plugin:window|close",{label:this.label})}async destroy(){return c("plugin:window|destroy",{label:this.label})}async setDecorations(t){return c("plugin:window|set_decorations",{label:this.label,value:t})}async setShadow(t){return c("plugin:window|set_shadow",{label:this.label,value:t})}async setEffects(t){return c("plugin:window|set_effects",{label:this.label,value:t})}async clearEffects(){return c("plugin:window|set_effects",{label:this.label,value:null})}async setAlwaysOnTop(t){return c("plugin:window|set_always_on_top",{label:this.label,value:t})}async setAlwaysOnBottom(t){return c("plugin:window|set_always_on_bottom",{label:this.label,value:t})}async setContentProtected(t){return c("plugin:window|set_content_protected",{label:this.label,value:t})}async setSize(t){return c("plugin:window|set_size",{label:this.label,value:t instanceof N?t:new N(t)})}async setMinSize(t){return c("plugin:window|set_min_size",{label:this.label,value:t instanceof N?t:t?new N(t):null})}async setMaxSize(t){return c("plugin:window|set_max_size",{label:this.label,value:t instanceof N?t:t?new N(t):null})}async setSizeConstraints(t){function n(s){return s?{Logical:s}:null}return c("plugin:window|set_size_constraints",{label:this.label,value:{minWidth:n(t?.minWidth),minHeight:n(t?.minHeight),maxWidth:n(t?.maxWidth),maxHeight:n(t?.maxHeight)}})}async setPosition(t){return c("plugin:window|set_position",{label:this.label,value:t instanceof te?t:new te(t)})}async setFullscreen(t){return c("plugin:window|set_fullscreen",{label:this.label,value:t})}async setSimpleFullscreen(t){return c("plugin:window|set_simple_fullscreen",{label:this.label,value:t})}async setFocus(){return c("plugin:window|set_focus",{label:this.label})}async setFocusable(t){return c("plugin:window|set_focusable",{label:this.label,value:t})}async setIcon(t){return c("plugin:window|set_icon",{label:this.label,value:re(t)})}async setSkipTaskbar(t){return c("plugin:window|set_skip_taskbar",{label:this.label,value:t})}async setCursorGrab(t){return c("plugin:window|set_cursor_grab",{label:this.label,value:t})}async setCursorVisible(t){return c("plugin:window|set_cursor_visible",{label:this.label,value:t})}async setCursorIcon(t){return c("plugin:window|set_cursor_icon",{label:this.label,value:t})}async setBackgroundColor(t){return c("plugin:window|set_background_color",{color:t})}async setCursorPosition(t){return c("plugin:window|set_cursor_position",{label:this.label,value:t instanceof te?t:new te(t)})}async setIgnoreCursorEvents(t){return c("plugin:window|set_ignore_cursor_events",{label:this.label,value:t})}async startDragging(){return c("plugin:window|start_dragging",{label:this.label})}async startResizeDragging(t){return c("plugin:window|start_resize_dragging",{label:this.label,value:t})}async setBadgeCount(t){return c("plugin:window|set_badge_count",{label:this.label,value:t})}async setBadgeLabel(t){return c("plugin:window|set_badge_label",{label:this.label,value:t})}async setOverlayIcon(t){return c("plugin:window|set_overlay_icon",{label:this.label,value:t?re(t):void 0})}async setProgressBar(t){return c("plugin:window|set_progress_bar",{label:this.label,value:t})}async setVisibleOnAllWorkspaces(t){return c("plugin:window|set_visible_on_all_workspaces",{label:this.label,value:t})}async setTitleBarStyle(t){return c("plugin:window|set_title_bar_style",{label:this.label,value:t})}async setTheme(t){return c("plugin:window|set_theme",{label:this.label,value:t})}async onResized(t){return this.listen(v.WINDOW_RESIZED,n=>{n.payload=new V(n.payload),t(n)})}async onMoved(t){return this.listen(v.WINDOW_MOVED,n=>{n.payload=new M(n.payload),t(n)})}async onCloseRequested(t){return this.listen(v.WINDOW_CLOSE_REQUESTED,async n=>{const s=new oi(n);await t(s),s.isPreventDefault()||await this.destroy()})}async onDragDropEvent(t){const n=await this.listen(v.DRAG_ENTER,r=>{t({...r,payload:{type:"enter",paths:r.payload.paths,position:new M(r.payload.position)}})}),s=await this.listen(v.DRAG_OVER,r=>{t({...r,payload:{type:"over",position:new M(r.payload.position)}})}),a=await this.listen(v.DRAG_DROP,r=>{t({...r,payload:{type:"drop",paths:r.payload.paths,position:new M(r.payload.position)}})}),l=await this.listen(v.DRAG_LEAVE,r=>{t({...r,payload:{type:"leave"}})});return()=>{n(),a(),s(),l()}}async onFocusChanged(t){const n=await this.listen(v.WINDOW_FOCUS,a=>{t({...a,payload:!0})}),s=await this.listen(v.WINDOW_BLUR,a=>{t({...a,payload:!1})});return()=>{n(),s()}}async onScaleChanged(t){return this.listen(v.WINDOW_SCALE_FACTOR_CHANGED,t)}async onThemeChanged(t){return this.listen(v.WINDOW_THEME_CHANGED,t)}}var Je;(function(e){e.Disabled="disabled",e.Throttle="throttle",e.Suspend="suspend"})(Je||(Je={}));var Xe;(function(e){e.Default="default",e.FluentOverlay="fluentOverlay"})(Xe||(Xe={}));var Qe;(function(e){e.AppearanceBased="appearanceBased",e.Light="light",e.Dark="dark",e.MediumLight="mediumLight",e.UltraDark="ultraDark",e.Titlebar="titlebar",e.Selection="selection",e.Menu="menu",e.Popover="popover",e.Sidebar="sidebar",e.HeaderView="headerView",e.Sheet="sheet",e.WindowBackground="windowBackground",e.HudWindow="hudWindow",e.FullScreenUI="fullScreenUI",e.Tooltip="tooltip",e.ContentBackground="contentBackground",e.UnderWindowBackground="underWindowBackground",e.UnderPageBackground="underPageBackground",e.Mica="mica",e.Blur="blur",e.Acrylic="acrylic",e.Tabbed="tabbed",e.TabbedDark="tabbedDark",e.TabbedLight="tabbedLight"})(Qe||(Qe={}));var Ze;(function(e){e.FollowsWindowActiveState="followsWindowActiveState",e.Active="active",e.Inactive="inactive"})(Ze||(Ze={}));const li=`# 更新日志
|
|
2
2
|
|
|
3
3
|
本文件记录 ClawMoney Desktop 每个版本的新增功能与修复。
|
|
4
4
|
格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/),版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
|
|
@@ -58,13 +58,13 @@
|
|
|
58
58
|
### 新增
|
|
59
59
|
- 首版:账户登录(邮箱 / Google)、钱包余额(Base / BSC)、平台连接、Agent 上架、订单与收益、日志
|
|
60
60
|
- 本地服务管理(Market Provider / Surf Relay)与浏览器插件状态
|
|
61
|
-
`,ri="https://api.github.com/repos/jackleeio/clawmoney-releases/releases/latest",ci="https://github.com/jackleeio/clawmoney-releases/releases/latest";let D=null,$="idle";function di(e,t){const n=e.split(".").map(Number),s=t.split(".").map(Number);for(let a=0;a<3;a++){if((n[a]??0)>(s[a]??0))return!0;if((n[a]??0)<(s[a]??0))return!1}return!1}async function wt(e=!1){if($!=="checking"){$="checking",e&&u();try{const t=new AbortController,n=setTimeout(()=>t.abort(),8e3),s=await fetch(ri,{signal:t.signal,headers:{Accept:"application/vnd.github+json"}});if(clearTimeout(n),!s.ok)throw new Error(String(s.status));const a=await s.json(),l=String(a.tag_name??"").replace(/^v/,"");l&&di(l,"0.3.1")?(D={version:l,url:a.html_url||ci},$="found"):$="latest"}catch{$="idle"}u()}}const o={dashboard:null,tweaks:Mi(),ui:{route:"home",loginStep:"choose",googleState:"idle",loginEmail:"",loginCode:"",loginCodeError:!1,loginCodeVerifying:!1,loginCodeResendIn:45,loginLang:lt(),loginError:null,connectionsFilter:"全部",connectionsQuery:"",ordersTab:"recent",copiedChain:null,balance:48.27,modal:null},locale:lt()};let oe=["signedout","login"].includes(new URLSearchParams(location.search).get("state")||""),ce=!0,de=!0,f={query:"",filter:"all",paused:!1,logs:[],timer:null},B=null,A=[],F=!1,Oe=0;const ui=["全部","Image","Social","Developer","Crowdfunding","News","Finance","Podcast","Search"],vt=[{id:"gemini-image",name:"Gemini Image",cat:"Image",mode:"public",skills:2,status:"ready",hot:!0,brand:"#8e75d6",mark:"✦",slug:"googlegemini",caps:["生图","参考图编辑"]},{id:"codex-image",name:"Codex",cat:"Image",mode:"public",skills:1,status:"ready",brand:"#000",mark:"C",slug:"openai",caps:["生图"]},{id:"chatgpt-image",name:"ChatGPT",cat:"Image",mode:"public",skills:1,status:"ready",brand:"#10a37f",mark:"G",slug:"openai",caps:["生图"]},{id:"chatgpt-web-image",name:"ChatGPT Web",cat:"Image",mode:"public",skills:1,status:"ready",brand:"#10a37f",mark:"G",slug:"openai",caps:["生图"]},{id:"flow-image",name:"Flow",cat:"Image",mode:"public",skills:2,status:"ready",brand:"#4285f4",mark:"F",slug:"google",caps:["生图","生视频"]},{id:"x",name:"X / Twitter",cat:"Social",mode:"browser",skills:7,status:"ready",hot:!0,brand:"#000",mark:"𝕏",slug:"x",caps:["搜推文","用户推文","用户资料","线程","首页时间线","通知","账号数据"]},{id:"xiaohongshu",name:"小红书",cat:"Social",mode:"browser",skills:1,status:"ready",brand:"#ff2442",mark:"红",caps:["搜笔记"]},{id:"instagram",name:"Instagram",cat:"Social",mode:"browser",skills:2,status:"login",brand:"#e1306c",mark:"IG",slug:"instagram",caps:["搜用户","Explore feed"]},{id:"tiktok",name:"TikTok",cat:"Social",mode:"browser",skills:2,status:"ready",hot:!0,brand:"#000",mark:"♪",slug:"tiktok",caps:["搜视频","趋势 feed"]},{id:"youtube",name:"YouTube",cat:"Social",mode:"browser",skills:3,status:"ready",brand:"#ff0033",mark:"▶",slug:"youtube",caps:["搜视频","视频信息","字幕转录"]},{id:"reddit",name:"Reddit",cat:"Social",mode:"browser",skills:10,status:"ready",hot:!0,brand:"#ff4500",mark:"r",slug:"reddit",caps:["搜帖","热门 / 首页","帖子评论","subreddit 帖子","subreddit 信息","用户资料","用户帖子","用户评论"]},{id:"linkedin",name:"LinkedIn",cat:"Social",mode:"browser",skills:1,status:"ready",brand:"#0a66c2",mark:"in",slug:"linkedin",caps:["搜职位"]},{id:"facebook",name:"Facebook",cat:"Social",mode:"browser",skills:3,status:"login",brand:"#1877f2",mark:"f",slug:"facebook",caps:["搜帖子","Profile","Events"]},{id:"bilibili",name:"Bilibili",cat:"Social",mode:"browser",skills:12,status:"ready",brand:"#00aeec",mark:"B",slug:"bilibili",caps:["搜视频","热门 / 排行榜","视频详情","评论","动态","用户投稿 / 关注","字幕","AI 总结","下载"]},{id:"zhihu",name:"知乎",cat:"Social",mode:"browser",skills:7,status:"ready",brand:"#0066ff",mark:"知",slug:"zhihu",caps:["搜问题","热榜","问题详情","回答详情","回答评论","推荐流","文章导出"]},{id:"weibo",name:"微博",cat:"Social",mode:"browser",skills:7,status:"ready",brand:"#df2029",mark:"W",slug:"sinaweibo",caps:["搜帖子","热搜","时间线","用户资料","用户帖子","帖子详情","评论"]},{id:"douban",name:"豆瓣",cat:"Social",mode:"browser",skills:6,status:"ready",brand:"#33b048",mark:"豆",slug:"douban",caps:["搜索","热门电影 / 图书","Top 250","条目详情","图片"]},{id:"jike",name:"即刻",cat:"Social",mode:"browser",skills:5,status:"login",brand:"#ffe411",mark:"J",caps:["搜帖子","首页 feed","帖子详情","话题 feed","用户 feed"]},{id:"medium",name:"Medium",cat:"Social",mode:"browser",skills:4,status:"ready",brand:"#000",mark:"M",slug:"medium",caps:["搜文章","热门 feed","Tag feed","用户文章"]},{id:"weixin",name:"微信公众号",cat:"Social",mode:"browser",skills:3,status:"ready",brand:"#07c160",mark:"微",slug:"wechat",caps:["文章抓取","搜文章","文章导出"]},{id:"hackernews",name:"Hacker News",cat:"Developer",mode:"public",skills:9,status:"ready",hot:!0,brand:"#ff6600",mark:"Y",slug:"ycombinator",caps:["搜索","Top / New / Best","Show / Ask / Jobs","评论树","用户资料"]},{id:"stackoverflow",name:"Stack Overflow",cat:"Developer",mode:"public",skills:2,status:"ready",brand:"#f48024",mark:"S",slug:"stackoverflow",caps:["搜问题","热门问题"]},{id:"v2ex",name:"V2EX",cat:"Developer",mode:"public",skills:2,status:"ready",brand:"#1f1f1f",mark:"V",caps:["热门","最新"]},{id:"linux-do",name:"Linux.do",cat:"Developer",mode:"browser",skills:1,status:"ready",brand:"#222",mark:"L",caps:["搜话题"]},{id:"wikipedia",name:"Wikipedia",cat:"Developer",mode:"public",skills:5,status:"ready",brand:"#000",mark:"W",slug:"wikipedia",caps:["搜索","摘要","全文","随机文章","趋势文章"]},{id:"producthunt",name:"Product Hunt",cat:"Developer",mode:"public",skills:1,status:"ready",brand:"#da552f",mark:"P",slug:"producthunt",caps:["Top launches"]},{id:"ycombinator",name:"Y Combinator",cat:"Developer",mode:"public",skills:1,status:"ready",brand:"#fb651e",mark:"YC",slug:"ycombinator",caps:["Batch 公司(website/industry/stage)"]},{id:"indiehackers",name:"Indie Hackers",cat:"Developer",mode:"public",skills:1,status:"ready",brand:"#0e2439",mark:"IH",caps:["产品(revenue/uniques/followers)"]},{id:"kickstarter",name:"Kickstarter",cat:"Crowdfunding",mode:"browser",skills:1,status:"ready",hot:!0,brand:"#05ce78",mark:"KS",slug:"kickstarter",caps:["最新项目(creator = 线索)"]},{id:"indiegogo",name:"Indiegogo",cat:"Crowdfunding",mode:"browser",skills:1,status:"ready",brand:"#eb1478",mark:"IG",slug:"indiegogo",caps:["Explore 项目"]},{id:"substack",name:"Substack",cat:"Developer",mode:"public",skills:3,status:"ready",brand:"#ff6719",mark:"S",slug:"substack",caps:["搜文章","热门 feed","Publication posts"]},{id:"bbc",name:"BBC",cat:"News",mode:"public",skills:2,status:"ready",brand:"#bb1919",mark:"B",slug:"bbc",caps:["头条","Topic 头条"]},{id:"bloomberg",name:"Bloomberg",cat:"News",mode:"public",skills:11,status:"ready",hot:!0,brand:"#000",mark:"B",slug:"bloomberg",caps:["头条","文章","feed 别名","Markets","Tech","Politics","Economics","Businessweek","Industries","Opinion"]},{id:"sinafinance",name:"Sina Finance",cat:"News",mode:"public",skills:4,status:"ready",brand:"#e6162d",mark:"新",caps:["7×24","滚动新闻","股票行情","股票热榜"]},{id:"sinablog",name:"Sina Blog",cat:"News",mode:"public",skills:1,status:"ready",brand:"#e6162d",mark:"博",caps:["搜博客"]},{id:"36kr",name:"36Kr",cat:"News",mode:"public",skills:4,status:"ready",brand:"#0070ff",mark:"Kr",caps:["搜文章","热榜","最新新闻","文章正文"]},{id:"yahoo-finance",name:"Yahoo Finance",cat:"Finance",mode:"public",skills:1,status:"ready",brand:"#6001d2",mark:"Y!",slug:"yahoo",caps:["股票报价"]},{id:"xueqiu",name:"雪球",cat:"Finance",mode:"browser",skills:7,status:"ready",brand:"#cf3a3a",mark:"X",caps:["搜股票","热门","热股榜","行情","评论","K 线","财报日期"]},{id:"apple-podcasts",name:"Apple Podcasts",cat:"Podcast",mode:"public",skills:1,status:"ready",brand:"#9933cc",mark:"🎙",slug:"applepodcasts",caps:["搜节目"]},{id:"xiaoyuzhou",name:"小宇宙",cat:"Podcast",mode:"public",skills:4,status:"ready",brand:"#ec6056",mark:"宇",caps:["播客信息","节目列表","Episode 列表","Episode 详情"]},{id:"weread",name:"微信读书",cat:"Search",mode:"browser",skills:3,status:"login",brand:"#1d77fb",mark:"读",caps:["搜书","排行榜","书籍详情"]},{id:"ctrip",name:"携程",cat:"Search",mode:"browser",skills:4,status:"ready",brand:"#287dfa",mark:"C",slug:"trip",caps:["目的地搜索","酒店联想","酒店搜索","航班搜索"]},{id:"google",name:"Google",cat:"Search",mode:"browser",skills:4,status:"ready",brand:"#4285f4",mark:"G",slug:"google",caps:["网页搜索","Google News","搜索建议","Daily Trends"]}],z={"gemini-image":"gemini","codex-image":"codex","chatgpt-image":"chatgpt","chatgpt-web-image":"chatgpt_web","flow-image":"flow",x:"x",xiaohongshu:"xhs",tiktok:"tk",youtube:"yt",reddit:"rd",linkedin:"li",facebook:"fb",bilibili:"bili",zhihu:"zh",weibo:"wb",douban:"db",jike:"jk",medium:"med",weixin:"wxmp",hackernews:"hn",wikipedia:"wiki",bloomberg:"bbg",sinafinance:"sf","36kr":"36kr","yahoo-finance":"yf",xueqiu:"xq",xiaoyuzhou:"xyz",weread:"wr",ctrip:"ct",google:"gg",substack:"sub",bbc:"bbc",ycombinator:"yc",indiehackers:"ih",kickstarter:"ks",indiegogo:"igg"},tt=(()=>{const e=new Map(vt.map(n=>[n.id,n])),t=new Map;for(const[n,s]of Object.entries(z)){const a=e.get(n);a&&t.set(s,a)}return t})();function gi(e){switch((e||"").split("/")[0].trim().toLowerCase()){case"generation":case"image":case"video":case"audio":return"Image";case"social":return"Social";case"coding":case"analysis":case"transformation":case"developer":return"Developer";case"news":return"News";case"finance":return"Finance";case"podcast":return"Podcast";case"search":case"reference":case"knowledge":return"Search";default:return"全部"}}let Ce=null,it=null;const yt="clawmoney.platformSkills.v1",pi=15e3,T=new Map;let I=mi();function mi(){try{const e=localStorage.getItem(yt);if(!e)return new Map;const t=JSON.parse(e);return new Map(t.map(([n,s])=>[n,s.filter(a=>typeof a.skill_name=="string").sort((a,l)=>a.skill_name.localeCompare(l.skill_name))]))}catch{return new Map}}function kt(){try{localStorage.setItem(yt,JSON.stringify([...I.entries()]))}catch{}}function _t(e,t,n=!0){t.length&&(I.set(e,[...t].sort((s,a)=>s.skill_name.localeCompare(a.skill_name))),n&&kt())}function fi(e,t){const n=z[e];n&&_t(n,t)}function St(){const e=o.dashboard?.skills;if(Ce&&it===e)return Ce;const t=new Map;for(const n of e||[]){if(typeof n.skill_name!="string")continue;const s=n.skill_name.split(".")[0],a=t.get(s);a?a.push(n):t.set(s,[n])}for(const[n,s]of t)s.sort((a,l)=>a.skill_name.localeCompare(l.skill_name)),_t(n,s,!1);return t.size&&kt(),Ce=t,it=e,t}function N(e){const t=z[e];return t?St().get(t)||I.get(t)||[]:[]}const ie=(()=>{const e=new Map;return vt.forEach((t,n)=>e.set(t.id,(t.cat==="Image"?0:1)*1e3+n)),e})();let xe=null,nt=null,st=-1;function C(){const e=St();if(xe&&nt===o.dashboard?.skills&&st===I.size)return xe;const t=new Set([...tt.keys(),...e.keys(),...I.keys()]),n=[];for(const s of t){const a=e.get(s)||I.get(s)||[],l=tt.get(s);if(l){n.push(l);continue}s in z||(z[s]=s),n.push({id:s,name:s.charAt(0).toUpperCase()+s.slice(1),cat:gi(a[0]?.category),mode:"public",skills:a.length,status:"ready",brand:"#8a8f98",mark:s.slice(0,2).toUpperCase(),caps:[]})}return n.sort((s,a)=>{const l=ie.has(s.id)?ie.get(s.id):Number.MAX_SAFE_INTEGER,r=ie.has(a.id)?ie.get(a.id):Number.MAX_SAFE_INTEGER;if(l!==r)return l-r;const d=s.cat==="Image"?0:1,p=a.cat==="Image"?0:1;return d!==p?d-p:s.id.localeCompare(a.id)}),xe=n,nt=o.dashboard?.skills,st=I.size,n}function hi(e,t){const n=z[t];return!!(n&&e.skill_name?.split(".")[0]===n)}function bi(e,t){const n=T.get(e);n?.syncTimer!=null&&window.clearTimeout(n.syncTimer),T.set(e,{active:t,expiresAt:Date.now()+pi,syncTimer:null}),Ue(e)}function L(e){const t=T.get(e);t?.syncTimer!=null&&window.clearTimeout(t.syncTimer),T.delete(e),Ue(e)}function Ct(e){const t=T.get(e);return t?t.expiresAt>Date.now()?!0:(L(e),!1):!1}function xt(e){const t=e?.skills;if(!Array.isArray(t)||T.size===0)return;const n=Date.now();for(const[s,a]of T){if(a.expiresAt<=n){L(s);continue}const l=t.filter(d=>hi(d,s));if(!l.length){a.active||L(s);continue}if(l.every(d=>d.is_active!==!1===a.active)){L(s);continue}l.forEach(d=>{d.is_active=a.active})}}const Et={ready:"就绪",login:"需登录",needs:"需处理",off:"未启用",error:"错误"},At={public:"Public",browser:"Browser"},wi=[{id:"ord_9hk2",t:"14:21",platform:"reddit",skill:"热门帖子 · r/macapps",status:"completed",amount:.18,dur:"2.4s"},{id:"ord_9hg4",t:"14:18",platform:"x",skill:"用户推文 · @sama",status:"completed",amount:.12,dur:"1.9s"},{id:"ord_9h95",t:"14:11",platform:"tiktok",skill:"趋势 feed",status:"completed",amount:.22,dur:"3.1s"},{id:"ord_9h82",t:"14:05",platform:"gemini-image",skill:"参考图编辑",status:"failed",amount:0,dur:"—"},{id:"ord_9h60",t:"13:58",platform:"bilibili",skill:"字幕转录",status:"completed",amount:.31,dur:"4.2s"},{id:"ord_9h41",t:"13:42",platform:"reddit",skill:"subreddit 帖子 · r/LocalLLaMA",status:"completed",amount:.09,dur:"1.1s"},{id:"ord_9h2a",t:"13:30",platform:"wikipedia",skill:'摘要 · "Bitcoin"',status:"completed",amount:.05,dur:"0.6s"},{id:"ord_9gz1",t:"13:21",platform:"youtube",skill:"视频信息",status:"completed",amount:.27,dur:"2.8s"},{id:"ord_9gr9",t:"12:54",platform:"xueqiu",skill:"热股榜",status:"completed",amount:.14,dur:"1.6s"},{id:"ord_9gn3",t:"12:40",platform:"medium",skill:"Tag feed · ai",status:"completed",amount:.11,dur:"2.0s"}],Me=wi.map(e=>({...e,createdAtMs:null})),Le=[{id:"esc_4112",deadline:"今日 18:00",platform:"x",skill:"品牌话题监测 · 30 分钟",reward:1.2,status:"in-progress"},{id:"esc_4108",deadline:"明日 09:00",platform:"reddit",skill:"r/macapps 周报",reward:.85,status:"queued"}],at=[1.82,2.4,3.1,2.85,3.95,4.62,5.31];function Be(){if(!fe())return{series:at,total:+at.reduce((l,r)=>l+r,0).toFixed(2)};const n=new Date;n.setHours(0,0,0,0);const s=n.getTime()-6*864e5,a=new Array(7).fill(0);for(const l of ue()){if(l.status!=="completed"||!l.createdAtMs)continue;const r=Math.floor((l.createdAtMs-s)/864e5);r>=0&&r<7&&(a[r]+=l.amount)}return{series:a.map(l=>+l.toFixed(2)),total:+a.reduce((l,r)=>l+r,0).toFixed(2)}}function vi(){if(!fe())return["周一","周二","周三","周四","周五","周六","今日"];const e=["周日","周一","周二","周三","周四","周五","周六"],t=new Date;return Array.from({length:7},(n,s)=>s===6?"今日":e[new Date(t.getTime()-(6-s)*864e5).getDay()])}const Fe=[{t:"14:21:08.317",lvl:"INFO",msg:"Order ord_9hk2 completed · reddit/hot · r/macapps · 2.4s"},{t:"14:20:46.992",lvl:"INFO",msg:"Uploaded artifact gemini_070f7429c6a9...png → cdn.clawmoney.ai"},{t:"14:20:12.118",lvl:"INFO",msg:"Surf relay handshake ok · peers=3"},{t:"14:19:55.461",lvl:"WARN",msg:"Rate limit headers from tiktok.com near threshold (82%)"},{t:"14:18:32.770",lvl:"INFO",msg:"Order ord_9hg4 completed · x/user-tweets @sama · 1.9s"},{t:"14:17:09.044",lvl:"INFO",msg:"Provider heartbeat → marketplace.clawmoney.ai 200 OK"},{t:"14:14:01.829",lvl:"ERROR",msg:"gemini-image/edit failed (401): INVALID_API_KEY · retrying with refreshed key"},{t:"14:13:55.612",lvl:"INFO",msg:"Refreshed provider API key (rotates every 30m)"},{t:"14:11:48.220",lvl:"INFO",msg:"Order ord_9h95 completed · tiktok/trends · 3.1s"},{t:"14:10:02.005",lvl:"DEBUG",msg:"BNBot bridge: chrome window 0x7f2 attached for bilibili"}],Ee={x:"x",yt:"youtube",tk:"tiktok",rd:"reddit",xhs:"xiaohongshu",bili:"bilibili",gg:"google",wxmp:"weixin",hn:"hackernews",wiki:"wikipedia",zh:"zhihu",med:"medium",sub:"substack",wb:"weibo",db:"douban",fb:"facebook",ct:"ctrip",li:"linkedin",yf:"yahoo-finance",bbc:"bbc",bbg:"bloomberg",sf:"sinafinance",jk:"jike",xq:"xueqiu",xyz:"xiaoyuzhou",wr:"weread",gemini:"gemini-image",codex:"codex-image",chatgpt:"chatgpt-image",chatgpt_web:"chatgpt-web-image",flow:"flow-image","36kr":"36kr",yc:"ycombinator",ih:"indiehackers",ks:"kickstarter",igg:"indiegogo"};function yi(){const e=o.dashboard?.history?.orders;return Array.isArray(e)?e:[]}function ki(){const e=o.dashboard?.history?.escrow;return Array.isArray(e)?e:[]}function fe(){return!!(o.dashboard&&"history"in o.dashboard)}function ue(){const e=yi().map(Si);return e.length>0||fe()?e:Me}function _i(){const e=ki().map(Ci);return e.length>0||fe()?e:Le}function Si(e){const t=String(e.status??"").toLowerCase(),n=t==="completed"||t==="success"?"completed":t==="pending"||t==="queued"||t==="processing"?"pending":"failed",s=Mt(e.completed_at??e.created_at),a=xi(e);return{id:String(e.id??e.order_id??"-"),t:We(s),platform:Tt(a,e),skill:a,status:n,amount:J(e.price??e.amount??e.cost_usd,0),dur:Ei(e.duration??e.duration_ms),createdAtMs:s}}function Ci(e){const t=String(e.status??"").toLowerCase(),n=String(e.skill??e.title??e.category??"托管任务");return{id:String(e.id??"-"),deadline:e.deadline?We(Mt(e.deadline)):"未设置",platform:Tt(n,e),skill:n,reward:J(e.budget??e.reward??e.price,0),status:t==="accepted"||t==="in_progress"||t==="assigned"?"in-progress":"queued"}}function xi(e){const t=e.skill_name??e.skill??e.skill_slug??e.category;if(typeof t=="string"&&t.trim())return t.trim();if(e.output_data&&typeof e.output_data=="object"&&"echoed"in e.output_data)return"echo";const n=String(e.skill_id??"");return n?`skill ${n.slice(0,8)}`:"service call"}function Tt(e,t={}){const n=String(t.platform??t.platform_id??t.provider??"").toLowerCase();if(n&&Ee[n])return Ee[n];const s=e.toLowerCase().split(/[._:/\s-]+/)[0];return Ee[s]??(s||"clawmoney")}function Mt(e){if(typeof e!="string"||!e.trim())return null;const t=e.trim(),n=/(?:z|[+-]\d{2}:?\d{2})$/i.test(t)?t:`${t}Z`,s=Date.parse(n);return Number.isFinite(s)?s:null}function We(e){return e?new Date(e).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",hour12:!1}):"—"}function Ei(e){if(typeof e!="number"||!Number.isFinite(e))return"—";const t=e>1e3?e/1e3:e;return`${t.toFixed(t<10?1:0)}s`}function J(e,t){const n=typeof e=="number"?e:Number(e);return Number.isFinite(n)?n:t}function Ai(e){if(!Number.isFinite(e)||e===0)return"$0.00";if(e>=1)return`$${e.toFixed(2)}`;let t=e.toFixed(4);return t=t.replace(/(\.\d{2}[1-9]*)0+$/,"$1"),`$${t}`}const Ti={zh:{tagline:"让你的 Agent 替你赚睡后收入",welcome:"欢迎回来",subtitle:"登录后即可启动 Agent 并接入市场。",google:"使用 Google 账号登录",or:"或",email:"使用邮箱继续",terms:"登录即表示同意服务条款。",backLink:"返回",emailTitle:"使用邮箱登录",emailSub:"我们会发一个 6 位验证码到你的邮箱。",emailLabel:"邮箱",emailCta:"发送验证码",codeTitle:"输入验证码",codeSubPre:"验证码已发送到 ",codeSubPost:"有效期 10 分钟。",codeError:"验证码不正确,请重试。",codeVerifying:"正在验证…",codeResend:"重新发送",codeResendIn:e=>`${e}s 后可重发`,codeChange:"换个邮箱",gRedirect:"正在跳转到 Google…",gGrant:"正在获取授权…",gSuccess:"登录成功!",gRedirectSub:"请在弹出的窗口中选择 Google 账号。",gGrantSub:"授权 ClawMoney 读取你的邮箱和基本信息。",gSuccessSub:"正在初始化 Agent 工作空间…",continueCta:"进入主页",fTerms:"服务条款",fPrivacy:"隐私政策",fSource:"查看源代码"},en:{tagline:"Let your Agent earn while you sleep",welcome:"Welcome back",subtitle:"Sign in to launch your Agent and join the market.",google:"Continue with Google",or:"or",email:"Continue with Email",terms:"By continuing you agree to the Terms of Service.",backLink:"Back",emailTitle:"Sign in with email",emailSub:"We'll send a 6-digit code to your inbox.",emailLabel:"Email",emailCta:"Send code",codeTitle:"Enter the code",codeSubPre:"Sent to ",codeSubPost:"Valid for 10 minutes.",codeError:"Incorrect code. Try again.",codeVerifying:"Verifying…",codeResend:"Resend code",codeResendIn:e=>`Resend in ${e}s`,codeChange:"Change email",gRedirect:"Redirecting to Google…",gGrant:"Granting access…",gSuccess:"Signed in!",gRedirectSub:"Pick a Google account in the popup window.",gGrantSub:"Allow ClawMoney to read your email and basic profile.",gSuccessSub:"Setting up your Agent workspace…",continueCta:"Enter dashboard",fTerms:"Terms",fPrivacy:"Privacy",fSource:"Source"}};function i(e,t={},...n){const s=document.createElement(e);for(const[a,l]of Object.entries(t))l===!1||l==null||(a==="class"?s.className=String(l):a==="style"&&typeof l=="object"?Object.assign(s.style,l):a.startsWith("on")&&typeof l=="function"?s.addEventListener(a.slice(2).toLowerCase(),l):a==="html"?s.innerHTML=String(l):a in s&&typeof s[a]!="object"?s[a]=l:s.setAttribute(a,String(l)));for(const a of n.flat())a==null||a===!1||s.append(a instanceof Node?a:document.createTextNode(String(a)));return s}function h(e,t={}){const s=document.createElementNS("http://www.w3.org/2000/svg","svg");return s.setAttribute("width",String(t.s||16)),s.setAttribute("height",String(t.s||16)),s.setAttribute("viewBox",t.viewBox||"0 0 24 24"),s.setAttribute("fill","none"),s.innerHTML=e.replace(/\{c\}/g,t.c||"currentColor"),s}const g={home:(e=16,t="currentColor")=>h(`<path d="M4 11l8-7 8 7v8a2 2 0 0 1-2 2h-3v-6h-6v6H6a2 2 0 0 1-2-2v-8z" stroke="${t}" stroke-width="1.7" stroke-linejoin="round"/>`,{s:e,c:t}),plug:(e=16,t="currentColor")=>h(`<path d="M9 3v5M15 3v5M6 8h12v3a6 6 0 0 1-6 6 6 6 0 0 1-6-6V8zm6 9v4" stroke="${t}" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/>`,{s:e,c:t}),receipt:(e=16,t="currentColor")=>h(`<path d="M6 3h12v18l-3-2-3 2-3-2-3 2V3zm3 5h6M9 12h6M9 16h4" stroke="${t}" stroke-width="1.7" stroke-linejoin="round" stroke-linecap="round"/>`,{s:e,c:t}),cog:(e=16,t="currentColor")=>h(`<circle cx="12" cy="12" r="3" stroke="${t}" stroke-width="1.7"/><path d="M19.4 15a1.7 1.7 0 0 0 .3 1.9l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.9-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1-1.5 1.7 1.7 0 0 0-1.9.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.9 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1 1.7 1.7 0 0 0-.3-1.9l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.9.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.9-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.9V9a1.7 1.7 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1z" stroke="${t}" stroke-width="1.5"/>`,{s:e,c:t}),refresh:(e=16,t="currentColor")=>h(`<path d="M3 12a9 9 0 0 1 15.5-6.3M21 12a9 9 0 0 1-15.5 6.3M19 3v5h-5M5 21v-5h5" stroke="${t}" stroke-width="1.7" stroke-linejoin="round" stroke-linecap="round"/>`,{s:e,c:t}),search:(e=14,t="currentColor")=>h(`<circle cx="11" cy="11" r="7" stroke="${t}" stroke-width="1.8"/><path d="M21 21l-4-4" stroke="${t}" stroke-width="1.8" stroke-linecap="round"/>`,{s:e,c:t}),arrowUp:(e=12,t="currentColor")=>h(`<path d="M6 9V3M3 6l3-3 3 3" stroke="${t}" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>`,{s:e,c:t,viewBox:"0 0 12 12"}),arrowOut:(e=14,t="currentColor")=>h(`<path d="M14 4h6v6M20 4l-9 9M11 4H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-5" stroke="${t}" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/>`,{s:e,c:t}),power:(e=14,t="currentColor")=>h(`<path d="M12 4v8M7 7a7 7 0 1 0 10 0" stroke="${t}" stroke-width="1.8" stroke-linecap="round"/>`,{s:e,c:t}),close:(e=14,t="currentColor")=>h(`<path d="M6 6l12 12M18 6L6 18" stroke="${t}" stroke-width="1.8" stroke-linecap="round"/>`,{s:e,c:t}),check:(e=14,t="currentColor")=>h(`<path d="M4 12l5 5L20 6" stroke="${t}" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"/>`,{s:e,c:t}),copy:(e=14,t="currentColor")=>h(`<rect x="9" y="3" width="12" height="14" rx="2" stroke="${t}" stroke-width="1.6"/><path d="M5 7v12a2 2 0 0 0 2 2h10" stroke="${t}" stroke-width="1.6" stroke-linecap="round"/>`,{s:e,c:t}),bolt:(e=14,t="currentColor")=>h(`<path d="M13 2L4 14h7l-1 8 9-12h-7l1-8z" stroke="${t}" stroke-width="1.6" stroke-linejoin="round"/>`,{s:e,c:t}),expand:(e=14,t="currentColor")=>h(`<path d="M4 10V4h6M20 14v6h-6M4 4l7 7M20 20l-7-7" stroke="${t}" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/>`,{s:e,c:t}),pause:(e=14,t="currentColor")=>h(`<rect x="6" y="5" width="4" height="14" rx="1" fill="${t}"/><rect x="14" y="5" width="4" height="14" rx="1" fill="${t}"/>`,{s:e,c:t}),play:(e=14,t="currentColor")=>h(`<path d="M7 5l12 7-12 7V5z" fill="${t}"/>`,{s:e,c:t}),download:(e=14,t="currentColor")=>h(`<path d="M12 4v12m0 0l-4-4m4 4l4-4M5 20h14" stroke="${t}" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/>`,{s:e,c:t}),trash:(e=14,t="currentColor")=>h(`<path d="M4 7h16M9 7V4h6v3M6 7l1 13h10l1-13M10 11v5M14 11v5" stroke="${t}" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>`,{s:e,c:t}),spark:(e=14,t="currentColor")=>h(`<path d="M12 3v6M12 15v6M3 12h6M15 12h6M6 6l4 4M14 14l4 4M18 6l-4 4M6 18l4-4" stroke="${t}" stroke-width="1.5" stroke-linecap="round"/>`,{s:e,c:t}),mail:(e=16,t="currentColor")=>h(`<path d="M4 6h16v12H4z M4 6l8 7 8-7" stroke="${t}" stroke-width="1.7" stroke-linejoin="round"/>`,{s:e,c:t}),user:(e=16,t="currentColor")=>h(`<circle cx="12" cy="9" r="3.6" stroke="${t}" stroke-width="1.7"/><path d="M4.5 20.5a7.5 7.5 0 0 1 15 0" stroke="${t}" stroke-width="1.7" stroke-linecap="round"/>`,{s:e,c:t}),terminal:(e=16,t="currentColor")=>h(`<rect x="3" y="4" width="18" height="16" rx="2" stroke="${t}" stroke-width="1.7"/><path d="M7 9l3 3-3 3M13 16h4" stroke="${t}" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/>`,{s:e,c:t})};function X(e=22,t="currentColor"){const n=document.createElement("img");return n.src="/brand/logo-icon.png",n.alt="ClawMoney",n.width=e,n.height=e,n.draggable=!1,n.style.objectFit="contain",n.style.flexShrink="0",n}function Lt(e=20){const n=document.createElementNS("http://www.w3.org/2000/svg","svg");return n.setAttribute("width",String(e)),n.setAttribute("height",String(e)),n.setAttribute("viewBox","0 0 48 48"),n.innerHTML=`
|
|
61
|
+
`,ri="https://api.github.com/repos/jackleeio/clawmoney-releases/releases/latest",ci="https://github.com/jackleeio/clawmoney-releases/releases/latest";let D=null,P="idle";function di(e,t){const n=e.split(".").map(Number),s=t.split(".").map(Number);for(let a=0;a<3;a++){if((n[a]??0)>(s[a]??0))return!0;if((n[a]??0)<(s[a]??0))return!1}return!1}async function bt(e=!1){if(P!=="checking"){P="checking",e&&u();try{const t=new AbortController,n=setTimeout(()=>t.abort(),8e3),s=await fetch(ri,{signal:t.signal,headers:{Accept:"application/vnd.github+json"}});if(clearTimeout(n),!s.ok)throw new Error(String(s.status));const a=await s.json(),l=String(a.tag_name??"").replace(/^v/,"");l&&di(l,"0.3.1")?(D={version:l,url:a.html_url||ci},P="found"):P="latest"}catch{P="idle"}u()}}const o={dashboard:null,tweaks:Li(),ui:{route:"home",loginStep:"choose",googleState:"idle",loginEmail:"",loginCode:"",loginCodeError:!1,loginCodeVerifying:!1,loginCodeResendIn:45,loginLang:ot(),loginError:null,connectionsFilter:"全部",connectionsQuery:"",ordersTab:"recent",copiedChain:null,balance:48.27,modal:null},locale:ot()};let oe=["signedout","login"].includes(new URLSearchParams(location.search).get("state")||""),ce=!0,de=!0,f={query:"",filter:"all",paused:!1,logs:[],timer:null},B=null,A=[],F=!1,Ne=0;const ui=["全部","Image","Social","Developer","Crowdfunding","News","Finance","Podcast","Search"],wt=[{id:"gemini-image",name:"Gemini Image",cat:"Image",mode:"public",skills:2,status:"ready",hot:!0,brand:"#8e75d6",mark:"✦",slug:"googlegemini",caps:["生图","参考图编辑"]},{id:"codex-image",name:"Codex",cat:"Image",mode:"public",skills:1,status:"ready",brand:"#000",mark:"C",slug:"openai",caps:["生图"]},{id:"chatgpt-image",name:"ChatGPT",cat:"Image",mode:"public",skills:1,status:"ready",brand:"#10a37f",mark:"G",slug:"openai",caps:["生图"]},{id:"chatgpt-web-image",name:"ChatGPT Web",cat:"Image",mode:"public",skills:1,status:"ready",brand:"#10a37f",mark:"G",slug:"openai",caps:["生图"]},{id:"flow-image",name:"Flow",cat:"Image",mode:"public",skills:2,status:"ready",brand:"#4285f4",mark:"F",slug:"google",caps:["生图","生视频"]},{id:"x",name:"X / Twitter",cat:"Social",mode:"browser",skills:7,status:"ready",hot:!0,brand:"#000",mark:"𝕏",slug:"x",caps:["搜推文","用户推文","用户资料","线程","首页时间线","通知","账号数据"]},{id:"xiaohongshu",name:"小红书",cat:"Social",mode:"browser",skills:1,status:"ready",brand:"#ff2442",mark:"红",caps:["搜笔记"]},{id:"instagram",name:"Instagram",cat:"Social",mode:"browser",skills:2,status:"login",brand:"#e1306c",mark:"IG",slug:"instagram",caps:["搜用户","Explore feed"]},{id:"tiktok",name:"TikTok",cat:"Social",mode:"browser",skills:2,status:"ready",hot:!0,brand:"#000",mark:"♪",slug:"tiktok",caps:["搜视频","趋势 feed"]},{id:"youtube",name:"YouTube",cat:"Social",mode:"browser",skills:3,status:"ready",brand:"#ff0033",mark:"▶",slug:"youtube",caps:["搜视频","视频信息","字幕转录"]},{id:"reddit",name:"Reddit",cat:"Social",mode:"browser",skills:10,status:"ready",hot:!0,brand:"#ff4500",mark:"r",slug:"reddit",caps:["搜帖","热门 / 首页","帖子评论","subreddit 帖子","subreddit 信息","用户资料","用户帖子","用户评论"]},{id:"linkedin",name:"LinkedIn",cat:"Social",mode:"browser",skills:1,status:"ready",brand:"#0a66c2",mark:"in",slug:"linkedin",caps:["搜职位"]},{id:"facebook",name:"Facebook",cat:"Social",mode:"browser",skills:3,status:"login",brand:"#1877f2",mark:"f",slug:"facebook",caps:["搜帖子","Profile","Events"]},{id:"bilibili",name:"Bilibili",cat:"Social",mode:"browser",skills:12,status:"ready",brand:"#00aeec",mark:"B",slug:"bilibili",caps:["搜视频","热门 / 排行榜","视频详情","评论","动态","用户投稿 / 关注","字幕","AI 总结","下载"]},{id:"zhihu",name:"知乎",cat:"Social",mode:"browser",skills:7,status:"ready",brand:"#0066ff",mark:"知",slug:"zhihu",caps:["搜问题","热榜","问题详情","回答详情","回答评论","推荐流","文章导出"]},{id:"weibo",name:"微博",cat:"Social",mode:"browser",skills:7,status:"ready",brand:"#df2029",mark:"W",slug:"sinaweibo",caps:["搜帖子","热搜","时间线","用户资料","用户帖子","帖子详情","评论"]},{id:"douban",name:"豆瓣",cat:"Social",mode:"browser",skills:6,status:"ready",brand:"#33b048",mark:"豆",slug:"douban",caps:["搜索","热门电影 / 图书","Top 250","条目详情","图片"]},{id:"jike",name:"即刻",cat:"Social",mode:"browser",skills:5,status:"login",brand:"#ffe411",mark:"J",caps:["搜帖子","首页 feed","帖子详情","话题 feed","用户 feed"]},{id:"medium",name:"Medium",cat:"Social",mode:"browser",skills:4,status:"ready",brand:"#000",mark:"M",slug:"medium",caps:["搜文章","热门 feed","Tag feed","用户文章"]},{id:"weixin",name:"微信公众号",cat:"Social",mode:"browser",skills:3,status:"ready",brand:"#07c160",mark:"微",slug:"wechat",caps:["文章抓取","搜文章","文章导出"]},{id:"hackernews",name:"Hacker News",cat:"Developer",mode:"public",skills:9,status:"ready",hot:!0,brand:"#ff6600",mark:"Y",slug:"ycombinator",caps:["搜索","Top / New / Best","Show / Ask / Jobs","评论树","用户资料"]},{id:"stackoverflow",name:"Stack Overflow",cat:"Developer",mode:"public",skills:2,status:"ready",brand:"#f48024",mark:"S",slug:"stackoverflow",caps:["搜问题","热门问题"]},{id:"v2ex",name:"V2EX",cat:"Developer",mode:"public",skills:2,status:"ready",brand:"#1f1f1f",mark:"V",caps:["热门","最新"]},{id:"linux-do",name:"Linux.do",cat:"Developer",mode:"browser",skills:1,status:"ready",brand:"#222",mark:"L",caps:["搜话题"]},{id:"wikipedia",name:"Wikipedia",cat:"Developer",mode:"public",skills:5,status:"ready",brand:"#000",mark:"W",slug:"wikipedia",caps:["搜索","摘要","全文","随机文章","趋势文章"]},{id:"producthunt",name:"Product Hunt",cat:"Developer",mode:"public",skills:1,status:"ready",brand:"#da552f",mark:"P",slug:"producthunt",caps:["Top launches"]},{id:"ycombinator",name:"Y Combinator",cat:"Developer",mode:"public",skills:1,status:"ready",brand:"#fb651e",mark:"YC",slug:"ycombinator",caps:["Batch 公司(website/industry/stage)"]},{id:"indiehackers",name:"Indie Hackers",cat:"Developer",mode:"public",skills:1,status:"ready",brand:"#0e2439",mark:"IH",caps:["产品(revenue/uniques/followers)"]},{id:"kickstarter",name:"Kickstarter",cat:"Crowdfunding",mode:"browser",skills:1,status:"ready",hot:!0,brand:"#05ce78",mark:"KS",slug:"kickstarter",caps:["最新项目(creator = 线索)"]},{id:"indiegogo",name:"Indiegogo",cat:"Crowdfunding",mode:"browser",skills:1,status:"ready",brand:"#eb1478",mark:"IG",slug:"indiegogo",caps:["Explore 项目"]},{id:"substack",name:"Substack",cat:"Developer",mode:"public",skills:3,status:"ready",brand:"#ff6719",mark:"S",slug:"substack",caps:["搜文章","热门 feed","Publication posts"]},{id:"bbc",name:"BBC",cat:"News",mode:"public",skills:2,status:"ready",brand:"#bb1919",mark:"B",slug:"bbc",caps:["头条","Topic 头条"]},{id:"bloomberg",name:"Bloomberg",cat:"News",mode:"public",skills:11,status:"ready",hot:!0,brand:"#000",mark:"B",slug:"bloomberg",caps:["头条","文章","feed 别名","Markets","Tech","Politics","Economics","Businessweek","Industries","Opinion"]},{id:"sinafinance",name:"Sina Finance",cat:"News",mode:"public",skills:4,status:"ready",brand:"#e6162d",mark:"新",caps:["7×24","滚动新闻","股票行情","股票热榜"]},{id:"sinablog",name:"Sina Blog",cat:"News",mode:"public",skills:1,status:"ready",brand:"#e6162d",mark:"博",caps:["搜博客"]},{id:"36kr",name:"36Kr",cat:"News",mode:"public",skills:4,status:"ready",brand:"#0070ff",mark:"Kr",caps:["搜文章","热榜","最新新闻","文章正文"]},{id:"yahoo-finance",name:"Yahoo Finance",cat:"Finance",mode:"public",skills:1,status:"ready",brand:"#6001d2",mark:"Y!",slug:"yahoo",caps:["股票报价"]},{id:"xueqiu",name:"雪球",cat:"Finance",mode:"browser",skills:7,status:"ready",brand:"#cf3a3a",mark:"X",caps:["搜股票","热门","热股榜","行情","评论","K 线","财报日期"]},{id:"apple-podcasts",name:"Apple Podcasts",cat:"Podcast",mode:"public",skills:1,status:"ready",brand:"#9933cc",mark:"🎙",slug:"applepodcasts",caps:["搜节目"]},{id:"xiaoyuzhou",name:"小宇宙",cat:"Podcast",mode:"public",skills:4,status:"ready",brand:"#ec6056",mark:"宇",caps:["播客信息","节目列表","Episode 列表","Episode 详情"]},{id:"weread",name:"微信读书",cat:"Search",mode:"browser",skills:3,status:"login",brand:"#1d77fb",mark:"读",caps:["搜书","排行榜","书籍详情"]},{id:"ctrip",name:"携程",cat:"Search",mode:"browser",skills:4,status:"ready",brand:"#287dfa",mark:"C",slug:"trip",caps:["目的地搜索","酒店联想","酒店搜索","航班搜索"]},{id:"google",name:"Google",cat:"Search",mode:"browser",skills:4,status:"ready",brand:"#4285f4",mark:"G",slug:"google",caps:["网页搜索","Google News","搜索建议","Daily Trends"]}],z={"gemini-image":"gemini","codex-image":"codex","chatgpt-image":"chatgpt","chatgpt-web-image":"chatgpt_web","flow-image":"flow",x:"x",xiaohongshu:"xhs",tiktok:"tk",youtube:"yt",reddit:"rd",linkedin:"li",facebook:"fb",bilibili:"bili",zhihu:"zh",weibo:"wb",douban:"db",jike:"jk",medium:"med",weixin:"wxmp",hackernews:"hn",wikipedia:"wiki",bloomberg:"bbg",sinafinance:"sf","36kr":"36kr","yahoo-finance":"yf",xueqiu:"xq",xiaoyuzhou:"xyz",weread:"wr",ctrip:"ct",google:"gg",substack:"sub",bbc:"bbc",ycombinator:"yc",indiehackers:"ih",kickstarter:"ks",indiegogo:"igg"},et=(()=>{const e=new Map(wt.map(n=>[n.id,n])),t=new Map;for(const[n,s]of Object.entries(z)){const a=e.get(n);a&&t.set(s,a)}return t})();function gi(e){switch((e||"").split("/")[0].trim().toLowerCase()){case"generation":case"image":case"video":case"audio":return"Image";case"social":return"Social";case"coding":case"analysis":case"transformation":case"developer":return"Developer";case"news":return"News";case"finance":return"Finance";case"podcast":return"Podcast";case"search":case"reference":case"knowledge":return"Search";default:return"全部"}}let Ce=null,tt=null;const vt="clawmoney.platformSkills.v1",pi=15e3,T=new Map;let I=mi();function mi(){try{const e=localStorage.getItem(vt);if(!e)return new Map;const t=JSON.parse(e);return new Map(t.map(([n,s])=>[n,s.filter(a=>typeof a.skill_name=="string").sort((a,l)=>a.skill_name.localeCompare(l.skill_name))]))}catch{return new Map}}function yt(){try{localStorage.setItem(vt,JSON.stringify([...I.entries()]))}catch{}}function kt(e,t,n=!0){t.length&&(I.set(e,[...t].sort((s,a)=>s.skill_name.localeCompare(a.skill_name))),n&&yt())}function fi(e,t){const n=z[e];n&&kt(n,t)}function _t(){const e=o.dashboard?.skills;if(Ce&&tt===e)return Ce;const t=new Map;for(const n of e||[]){if(typeof n.skill_name!="string")continue;const s=n.skill_name.split(".")[0],a=t.get(s);a?a.push(n):t.set(s,[n])}for(const[n,s]of t)s.sort((a,l)=>a.skill_name.localeCompare(l.skill_name)),kt(n,s,!1);return t.size&&yt(),Ce=t,tt=e,t}function O(e){const t=z[e];return t?_t().get(t)||I.get(t)||[]:[]}const ie=(()=>{const e=new Map;return wt.forEach((t,n)=>e.set(t.id,(t.cat==="Image"?0:1)*1e3+n)),e})();let xe=null,it=null,nt=-1;function C(){const e=_t();if(xe&&it===o.dashboard?.skills&&nt===I.size)return xe;const t=new Set([...et.keys(),...e.keys(),...I.keys()]),n=[];for(const s of t){const a=e.get(s)||I.get(s)||[],l=et.get(s);if(l){n.push(l);continue}s in z||(z[s]=s),n.push({id:s,name:s.charAt(0).toUpperCase()+s.slice(1),cat:gi(a[0]?.category),mode:"public",skills:a.length,status:"ready",brand:"#8a8f98",mark:s.slice(0,2).toUpperCase(),caps:[]})}return n.sort((s,a)=>{const l=ie.has(s.id)?ie.get(s.id):Number.MAX_SAFE_INTEGER,r=ie.has(a.id)?ie.get(a.id):Number.MAX_SAFE_INTEGER;if(l!==r)return l-r;const d=s.cat==="Image"?0:1,p=a.cat==="Image"?0:1;return d!==p?d-p:s.id.localeCompare(a.id)}),xe=n,it=o.dashboard?.skills,nt=I.size,n}function hi(e,t){const n=z[t];return!!(n&&e.skill_name?.split(".")[0]===n)}function bi(e,t){const n=T.get(e);n?.syncTimer!=null&&window.clearTimeout(n.syncTimer),T.set(e,{active:t,expiresAt:Date.now()+pi,syncTimer:null}),qe(e)}function L(e){const t=T.get(e);t?.syncTimer!=null&&window.clearTimeout(t.syncTimer),T.delete(e),qe(e)}function St(e){const t=T.get(e);return t?t.expiresAt>Date.now()?!0:(L(e),!1):!1}function Ct(e){const t=e?.skills;if(!Array.isArray(t)||T.size===0)return;const n=Date.now();for(const[s,a]of T){if(a.expiresAt<=n){L(s);continue}const l=t.filter(d=>hi(d,s));if(!l.length){a.active||L(s);continue}if(l.every(d=>d.is_active!==!1===a.active)){L(s);continue}l.forEach(d=>{d.is_active=a.active})}}const xt={ready:"就绪",login:"需登录",needs:"需处理",off:"未启用",error:"错误"},Et={public:"Public",browser:"Browser"},wi=[{id:"ord_9hk2",t:"14:21",platform:"reddit",skill:"热门帖子 · r/macapps",status:"completed",amount:.18,dur:"2.4s"},{id:"ord_9hg4",t:"14:18",platform:"x",skill:"用户推文 · @sama",status:"completed",amount:.12,dur:"1.9s"},{id:"ord_9h95",t:"14:11",platform:"tiktok",skill:"趋势 feed",status:"completed",amount:.22,dur:"3.1s"},{id:"ord_9h82",t:"14:05",platform:"gemini-image",skill:"参考图编辑",status:"failed",amount:0,dur:"—"},{id:"ord_9h60",t:"13:58",platform:"bilibili",skill:"字幕转录",status:"completed",amount:.31,dur:"4.2s"},{id:"ord_9h41",t:"13:42",platform:"reddit",skill:"subreddit 帖子 · r/LocalLLaMA",status:"completed",amount:.09,dur:"1.1s"},{id:"ord_9h2a",t:"13:30",platform:"wikipedia",skill:'摘要 · "Bitcoin"',status:"completed",amount:.05,dur:"0.6s"},{id:"ord_9gz1",t:"13:21",platform:"youtube",skill:"视频信息",status:"completed",amount:.27,dur:"2.8s"},{id:"ord_9gr9",t:"12:54",platform:"xueqiu",skill:"热股榜",status:"completed",amount:.14,dur:"1.6s"},{id:"ord_9gn3",t:"12:40",platform:"medium",skill:"Tag feed · ai",status:"completed",amount:.11,dur:"2.0s"}],Me=wi.map(e=>({...e,createdAtMs:null})),Le=[{id:"esc_4112",deadline:"今日 18:00",platform:"x",skill:"品牌话题监测 · 30 分钟",reward:1.2,status:"in-progress"},{id:"esc_4108",deadline:"明日 09:00",platform:"reddit",skill:"r/macapps 周报",reward:.85,status:"queued"}],st=[1.82,2.4,3.1,2.85,3.95,4.62,5.31];function Be(){if(!fe())return{series:st,total:+st.reduce((l,r)=>l+r,0).toFixed(2)};const n=new Date;n.setHours(0,0,0,0);const s=n.getTime()-6*864e5,a=new Array(7).fill(0);for(const l of ue()){if(l.status!=="completed"||!l.createdAtMs)continue;const r=Math.floor((l.createdAtMs-s)/864e5);r>=0&&r<7&&(a[r]+=l.amount)}return{series:a.map(l=>+l.toFixed(2)),total:+a.reduce((l,r)=>l+r,0).toFixed(2)}}function vi(){if(!fe())return["周一","周二","周三","周四","周五","周六","今日"];const e=["周日","周一","周二","周三","周四","周五","周六"],t=new Date;return Array.from({length:7},(n,s)=>s===6?"今日":e[new Date(t.getTime()-(6-s)*864e5).getDay()])}const Fe=[{t:"14:21:08.317",lvl:"INFO",msg:"Order ord_9hk2 completed · reddit/hot · r/macapps · 2.4s"},{t:"14:20:46.992",lvl:"INFO",msg:"Uploaded artifact gemini_070f7429c6a9...png → cdn.clawmoney.ai"},{t:"14:20:12.118",lvl:"INFO",msg:"Surf relay handshake ok · peers=3"},{t:"14:19:55.461",lvl:"WARN",msg:"Rate limit headers from tiktok.com near threshold (82%)"},{t:"14:18:32.770",lvl:"INFO",msg:"Order ord_9hg4 completed · x/user-tweets @sama · 1.9s"},{t:"14:17:09.044",lvl:"INFO",msg:"Provider heartbeat → marketplace.clawmoney.ai 200 OK"},{t:"14:14:01.829",lvl:"ERROR",msg:"gemini-image/edit failed (401): INVALID_API_KEY · retrying with refreshed key"},{t:"14:13:55.612",lvl:"INFO",msg:"Refreshed provider API key (rotates every 30m)"},{t:"14:11:48.220",lvl:"INFO",msg:"Order ord_9h95 completed · tiktok/trends · 3.1s"},{t:"14:10:02.005",lvl:"DEBUG",msg:"BNBot bridge: chrome window 0x7f2 attached for bilibili"}],Ee={x:"x",yt:"youtube",tk:"tiktok",rd:"reddit",xhs:"xiaohongshu",bili:"bilibili",gg:"google",wxmp:"weixin",hn:"hackernews",wiki:"wikipedia",zh:"zhihu",med:"medium",sub:"substack",wb:"weibo",db:"douban",fb:"facebook",ct:"ctrip",li:"linkedin",yf:"yahoo-finance",bbc:"bbc",bbg:"bloomberg",sf:"sinafinance",jk:"jike",xq:"xueqiu",xyz:"xiaoyuzhou",wr:"weread",gemini:"gemini-image",codex:"codex-image",chatgpt:"chatgpt-image",chatgpt_web:"chatgpt-web-image",flow:"flow-image","36kr":"36kr",yc:"ycombinator",ih:"indiehackers",ks:"kickstarter",igg:"indiegogo"};function yi(){const e=o.dashboard?.history?.orders;return Array.isArray(e)?e:[]}function ki(){const e=o.dashboard?.history?.escrow;return Array.isArray(e)?e:[]}function fe(){return!!(o.dashboard&&"history"in o.dashboard)}function ue(){const e=yi().map(Si);return e.length>0||fe()?e:Me}function _i(){const e=ki().map(Ci);return e.length>0||fe()?e:Le}function Si(e){const t=String(e.status??"").toLowerCase(),n=t==="completed"||t==="success"?"completed":t==="pending"||t==="queued"||t==="processing"?"pending":"failed",s=Tt(e.completed_at??e.created_at),a=xi(e);return{id:String(e.id??e.order_id??"-"),t:Ei(s),platform:At(a,e),skill:a,status:n,amount:J(e.price??e.amount??e.cost_usd,0),dur:Ai(e.duration??e.duration_ms),createdAtMs:s}}function Ci(e){const t=String(e.status??"").toLowerCase(),n=String(e.skill??e.title??e.category??"托管任务");return{id:String(e.id??"-"),deadline:e.deadline?Mt(Tt(e.deadline)):"未设置",platform:At(n,e),skill:n,reward:J(e.budget??e.reward??e.price,0),status:t==="accepted"||t==="in_progress"||t==="assigned"?"in-progress":"queued"}}function xi(e){const t=e.skill_name??e.skill??e.skill_slug??e.category;if(typeof t=="string"&&t.trim())return t.trim();if(e.output_data&&typeof e.output_data=="object"&&"echoed"in e.output_data)return"echo";const n=String(e.skill_id??"");return n?`skill ${n.slice(0,8)}`:"service call"}function At(e,t={}){const n=String(t.platform??t.platform_id??t.provider??"").toLowerCase();if(n&&Ee[n])return Ee[n];const s=e.toLowerCase().split(/[._:/\s-]+/)[0];return Ee[s]??(s||"clawmoney")}function Tt(e){if(typeof e!="string"||!e.trim())return null;const t=e.trim(),n=/(?:z|[+-]\d{2}:?\d{2})$/i.test(t)?t:`${t}Z`,s=Date.parse(n);return Number.isFinite(s)?s:null}function Mt(e){return e?new Date(e).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",hour12:!1}):"—"}function Ei(e){if(!e)return"—";const t=new Date(e),n=String(t.getMonth()+1).padStart(2,"0"),s=String(t.getDate()).padStart(2,"0"),a=String(t.getHours()).padStart(2,"0"),l=String(t.getMinutes()).padStart(2,"0");return`${n}-${s} ${a}:${l}`}function Ai(e){if(typeof e!="number"||!Number.isFinite(e))return"—";const t=e>1e3?e/1e3:e;return`${t.toFixed(t<10?1:0)}s`}function J(e,t){const n=typeof e=="number"?e:Number(e);return Number.isFinite(n)?n:t}function Ti(e){if(!Number.isFinite(e)||e===0)return"$0.00";if(e>=1)return`$${e.toFixed(2)}`;let t=e.toFixed(4);return t=t.replace(/(\.\d{2}[1-9]*)0+$/,"$1"),`$${t}`}const Mi={zh:{tagline:"让你的 Agent 替你赚睡后收入",welcome:"欢迎回来",subtitle:"登录后即可启动 Agent 并接入市场。",google:"使用 Google 账号登录",or:"或",email:"使用邮箱继续",terms:"登录即表示同意服务条款。",backLink:"返回",emailTitle:"使用邮箱登录",emailSub:"我们会发一个 6 位验证码到你的邮箱。",emailLabel:"邮箱",emailCta:"发送验证码",codeTitle:"输入验证码",codeSubPre:"验证码已发送到 ",codeSubPost:"有效期 10 分钟。",codeError:"验证码不正确,请重试。",codeVerifying:"正在验证…",codeResend:"重新发送",codeResendIn:e=>`${e}s 后可重发`,codeChange:"换个邮箱",gRedirect:"正在跳转到 Google…",gGrant:"正在获取授权…",gSuccess:"登录成功!",gRedirectSub:"请在弹出的窗口中选择 Google 账号。",gGrantSub:"授权 ClawMoney 读取你的邮箱和基本信息。",gSuccessSub:"正在初始化 Agent 工作空间…",continueCta:"进入主页",fTerms:"服务条款",fPrivacy:"隐私政策",fSource:"查看源代码"},en:{tagline:"Let your Agent earn while you sleep",welcome:"Welcome back",subtitle:"Sign in to launch your Agent and join the market.",google:"Continue with Google",or:"or",email:"Continue with Email",terms:"By continuing you agree to the Terms of Service.",backLink:"Back",emailTitle:"Sign in with email",emailSub:"We'll send a 6-digit code to your inbox.",emailLabel:"Email",emailCta:"Send code",codeTitle:"Enter the code",codeSubPre:"Sent to ",codeSubPost:"Valid for 10 minutes.",codeError:"Incorrect code. Try again.",codeVerifying:"Verifying…",codeResend:"Resend code",codeResendIn:e=>`Resend in ${e}s`,codeChange:"Change email",gRedirect:"Redirecting to Google…",gGrant:"Granting access…",gSuccess:"Signed in!",gRedirectSub:"Pick a Google account in the popup window.",gGrantSub:"Allow ClawMoney to read your email and basic profile.",gSuccessSub:"Setting up your Agent workspace…",continueCta:"Enter dashboard",fTerms:"Terms",fPrivacy:"Privacy",fSource:"Source"}};function i(e,t={},...n){const s=document.createElement(e);for(const[a,l]of Object.entries(t))l===!1||l==null||(a==="class"?s.className=String(l):a==="style"&&typeof l=="object"?Object.assign(s.style,l):a.startsWith("on")&&typeof l=="function"?s.addEventListener(a.slice(2).toLowerCase(),l):a==="html"?s.innerHTML=String(l):a in s&&typeof s[a]!="object"?s[a]=l:s.setAttribute(a,String(l)));for(const a of n.flat())a==null||a===!1||s.append(a instanceof Node?a:document.createTextNode(String(a)));return s}function h(e,t={}){const s=document.createElementNS("http://www.w3.org/2000/svg","svg");return s.setAttribute("width",String(t.s||16)),s.setAttribute("height",String(t.s||16)),s.setAttribute("viewBox",t.viewBox||"0 0 24 24"),s.setAttribute("fill","none"),s.innerHTML=e.replace(/\{c\}/g,t.c||"currentColor"),s}const g={home:(e=16,t="currentColor")=>h(`<path d="M4 11l8-7 8 7v8a2 2 0 0 1-2 2h-3v-6h-6v6H6a2 2 0 0 1-2-2v-8z" stroke="${t}" stroke-width="1.7" stroke-linejoin="round"/>`,{s:e,c:t}),plug:(e=16,t="currentColor")=>h(`<path d="M9 3v5M15 3v5M6 8h12v3a6 6 0 0 1-6 6 6 6 0 0 1-6-6V8zm6 9v4" stroke="${t}" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/>`,{s:e,c:t}),receipt:(e=16,t="currentColor")=>h(`<path d="M6 3h12v18l-3-2-3 2-3-2-3 2V3zm3 5h6M9 12h6M9 16h4" stroke="${t}" stroke-width="1.7" stroke-linejoin="round" stroke-linecap="round"/>`,{s:e,c:t}),cog:(e=16,t="currentColor")=>h(`<circle cx="12" cy="12" r="3" stroke="${t}" stroke-width="1.7"/><path d="M19.4 15a1.7 1.7 0 0 0 .3 1.9l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.9-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1-1.5 1.7 1.7 0 0 0-1.9.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.9 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1 1.7 1.7 0 0 0-.3-1.9l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.9.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.9-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.9V9a1.7 1.7 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1z" stroke="${t}" stroke-width="1.5"/>`,{s:e,c:t}),refresh:(e=16,t="currentColor")=>h(`<path d="M3 12a9 9 0 0 1 15.5-6.3M21 12a9 9 0 0 1-15.5 6.3M19 3v5h-5M5 21v-5h5" stroke="${t}" stroke-width="1.7" stroke-linejoin="round" stroke-linecap="round"/>`,{s:e,c:t}),search:(e=14,t="currentColor")=>h(`<circle cx="11" cy="11" r="7" stroke="${t}" stroke-width="1.8"/><path d="M21 21l-4-4" stroke="${t}" stroke-width="1.8" stroke-linecap="round"/>`,{s:e,c:t}),arrowUp:(e=12,t="currentColor")=>h(`<path d="M6 9V3M3 6l3-3 3 3" stroke="${t}" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>`,{s:e,c:t,viewBox:"0 0 12 12"}),arrowOut:(e=14,t="currentColor")=>h(`<path d="M14 4h6v6M20 4l-9 9M11 4H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-5" stroke="${t}" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/>`,{s:e,c:t}),power:(e=14,t="currentColor")=>h(`<path d="M12 4v8M7 7a7 7 0 1 0 10 0" stroke="${t}" stroke-width="1.8" stroke-linecap="round"/>`,{s:e,c:t}),close:(e=14,t="currentColor")=>h(`<path d="M6 6l12 12M18 6L6 18" stroke="${t}" stroke-width="1.8" stroke-linecap="round"/>`,{s:e,c:t}),check:(e=14,t="currentColor")=>h(`<path d="M4 12l5 5L20 6" stroke="${t}" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"/>`,{s:e,c:t}),copy:(e=14,t="currentColor")=>h(`<rect x="9" y="3" width="12" height="14" rx="2" stroke="${t}" stroke-width="1.6"/><path d="M5 7v12a2 2 0 0 0 2 2h10" stroke="${t}" stroke-width="1.6" stroke-linecap="round"/>`,{s:e,c:t}),bolt:(e=14,t="currentColor")=>h(`<path d="M13 2L4 14h7l-1 8 9-12h-7l1-8z" stroke="${t}" stroke-width="1.6" stroke-linejoin="round"/>`,{s:e,c:t}),expand:(e=14,t="currentColor")=>h(`<path d="M4 10V4h6M20 14v6h-6M4 4l7 7M20 20l-7-7" stroke="${t}" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/>`,{s:e,c:t}),pause:(e=14,t="currentColor")=>h(`<rect x="6" y="5" width="4" height="14" rx="1" fill="${t}"/><rect x="14" y="5" width="4" height="14" rx="1" fill="${t}"/>`,{s:e,c:t}),play:(e=14,t="currentColor")=>h(`<path d="M7 5l12 7-12 7V5z" fill="${t}"/>`,{s:e,c:t}),download:(e=14,t="currentColor")=>h(`<path d="M12 4v12m0 0l-4-4m4 4l4-4M5 20h14" stroke="${t}" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/>`,{s:e,c:t}),trash:(e=14,t="currentColor")=>h(`<path d="M4 7h16M9 7V4h6v3M6 7l1 13h10l1-13M10 11v5M14 11v5" stroke="${t}" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>`,{s:e,c:t}),spark:(e=14,t="currentColor")=>h(`<path d="M12 3v6M12 15v6M3 12h6M15 12h6M6 6l4 4M14 14l4 4M18 6l-4 4M6 18l4-4" stroke="${t}" stroke-width="1.5" stroke-linecap="round"/>`,{s:e,c:t}),mail:(e=16,t="currentColor")=>h(`<path d="M4 6h16v12H4z M4 6l8 7 8-7" stroke="${t}" stroke-width="1.7" stroke-linejoin="round"/>`,{s:e,c:t}),user:(e=16,t="currentColor")=>h(`<circle cx="12" cy="9" r="3.6" stroke="${t}" stroke-width="1.7"/><path d="M4.5 20.5a7.5 7.5 0 0 1 15 0" stroke="${t}" stroke-width="1.7" stroke-linecap="round"/>`,{s:e,c:t}),terminal:(e=16,t="currentColor")=>h(`<rect x="3" y="4" width="18" height="16" rx="2" stroke="${t}" stroke-width="1.7"/><path d="M7 9l3 3-3 3M13 16h4" stroke="${t}" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/>`,{s:e,c:t})};function X(e=22,t="currentColor"){const n=document.createElement("img");return n.src="/brand/logo-icon.png",n.alt="ClawMoney",n.width=e,n.height=e,n.draggable=!1,n.style.objectFit="contain",n.style.flexShrink="0",n}function Lt(e=20){const n=document.createElementNS("http://www.w3.org/2000/svg","svg");return n.setAttribute("width",String(e)),n.setAttribute("height",String(e)),n.setAttribute("viewBox","0 0 48 48"),n.innerHTML=`
|
|
62
62
|
<path fill="#4285F4" d="M45.12 24.5c0-1.56-.14-3.06-.4-4.5H24v8.51h11.84c-.51 2.75-2.06 5.08-4.39 6.64v5.52h7.11c4.16-3.83 6.56-9.47 6.56-16.17z"/>
|
|
63
63
|
<path fill="#34A853" d="M24 46c5.94 0 10.92-1.97 14.56-5.33l-7.11-5.52c-1.97 1.32-4.49 2.1-7.45 2.1-5.73 0-10.58-3.87-12.31-9.07H4.34v5.7C7.96 41.07 15.4 46 24 46z"/>
|
|
64
64
|
<path fill="#FBBC05" d="M11.69 28.18c-.44-1.32-.69-2.73-.69-4.18s.25-2.86.69-4.18v-5.7H4.34A21.99 21.99 0 0 0 2 24c0 3.55.85 6.91 2.34 9.88l7.35-5.7z"/>
|
|
65
65
|
<path fill="#EA4335" d="M24 10.75c3.23 0 6.13 1.11 8.41 3.29l6.31-6.31C34.91 4.18 29.93 2 24 2 15.4 2 7.96 6.93 4.34 14.12l7.35 5.7C13.42 14.62 18.27 10.75 24 10.75z"/>
|
|
66
|
-
`,n}function Mi(){try{const e=localStorage.getItem("clawmoney.tweaks.v2");if(e)return{...ot(),...JSON.parse(e)}}catch{}return ot()}function ot(){return{dark:!1,accent:"#F0B90B",density:"comfy",showBg:!0}}function Li(){try{localStorage.setItem("clawmoney.tweaks.v2",JSON.stringify(o.tweaks))}catch{}}function lt(){const e=new URLSearchParams(location.search).get("lang");if(e==="en"||e==="zh")return localStorage.setItem("clawmoney.locale",e),e;const t=localStorage.getItem("clawmoney.locale");return t==="en"||t==="zh"?t:navigator.language.toLowerCase().startsWith("zh")?"zh":"en"}function Ri(){const e=x();document.documentElement.classList.toggle("cm-dark",o.tweaks.dark),document.documentElement.classList.toggle("is-tauri-root",e),document.documentElement.style.setProperty("--accent",o.tweaks.accent),document.body.classList.toggle("density-compact",o.tweaks.density==="compact"),document.body.classList.toggle("is-tauri",e);const t=document.getElementById("desktop");t&&(t.style.opacity=e?"0":o.tweaks.showBg?"1":"0")}function u(){Ri();const e=document.getElementById("app");e.innerHTML="";const t=o.dashboard;if(!t){e.append(Pi()),Re();return}!!t?.configured?e.append($i(),Di()):e.append(i("div",{class:"login-corner-traffic"},Rt()),_n()),o.ui.modal?.kind==="platform"?e.append(fn(o.ui.modal.id)):o.ui.modal?.kind==="settings"?e.append(On(o.ui.modal.section)):o.ui.modal?.kind==="log"&&e.append(Hn()),Re(),document.getElementById("__perf")?.remove()}function Pi(){return i("div",{class:"boot-screen","data-tauri-drag-region":!0},i("div",{class:"boot-mark"},X(42,o.tweaks.accent)),i("div",{class:"boot-title"},"Claw Money"),i("div",{class:"boot-subtitle"},o.locale==="zh"?"你的 Agent,值得一份薪水":"Your agent deserves a paycheque."),i("div",{class:"boot-spinner"}))}function Re(){const e=document.getElementById("app");if(!e)return;if(x()){e.style.transform="";return}const t=1280,n=820,s=40,a=(window.innerWidth-s)/t,l=(window.innerHeight-s)/n,r=Math.min(1,a,l);e.style.transform=`scale(${r})`}function Rt(){const e=t=>n=>{if(n.stopPropagation(),!x())return;const s=Ne();t==="close"&&s.close(),t==="minimize"&&s.minimize(),t==="zoom"&&s.toggleMaximize()};return i("div",{class:"traffic"},i("button",{class:"traffic-dot close",title:"Close",onclick:e("close")},i("span",{},"×")),i("button",{class:"traffic-dot min",title:"Minimize",onclick:e("minimize")},i("span",{},"−")),i("button",{class:"traffic-dot max",title:"Maximize",onclick:e("zoom")},i("span",{},"+")))}function $i(){const e=o.ui.route,t=o.dashboard?.account?.data||{},n=o.dashboard?.config||{},s=t.name||t.slug||n.agent_slug||"agent";return i("aside",{class:"sidebar"},i("div",{class:"sidebar-header","data-tauri-drag-region":!0},Rt()),i("div",{class:"brand","data-tauri-drag-region":!0},X(22,o.tweaks.accent),i("span",{class:"brand-tag"},"v0.3.1")),i("nav",{class:"nav"},q("home","首页",g.home(15),e==="home"),q("connections","平台连接",g.plug(15),e==="connections"),q("relay","Agent 上架",g.bolt(15),e==="relay"),q("orders","订单",g.receipt(15),e==="orders"),q("logs","日志",g.terminal(15),e==="logs")),i("div",{class:"sidebar-spacer"}),Ii(s))}function q(e,t,n,s,a){return i("button",{class:`nav-item ${s?"active":""}`,onclick:()=>{o.ui.route!==e&&(o.ui.route=e,u())}},i("span",{class:"nav-icon"},n),i("span",{class:"nav-label"},t),null)}function Ii(e){return i("div",{class:"agent-card"},i("div",{class:"agent-row"},i("div",{class:"agent-avatar"},e.slice(0,2)),i("div",{class:"agent-info"},i("div",{class:"agent-name"},e),i("div",{class:"agent-status"},i("span",{class:"agent-status-dot"}),"active")),i("button",{class:"icon-button",title:"设置",onclick:()=>zn()},g.cog(13))))}function Di(){const e=i("div",{class:"main-scroll cm-scroll"});switch(o.ui.route){case"home":e.append(Wi());break;case"connections":e.append(nn());break;case"relay":e.append(Ui());break;case"orders":e.append(hn());break;case"logs":e.append(Zi());break}return i("main",{class:"main"},i("div",{class:"titlebar","data-tauri-drag-region":!0}),e)}function Pt(){const e=o.dashboard?.preflight;return!e||typeof e!="object"?null:e}function zi(e){const t=Pt();if(!t?.platforms)return null;const n=z[e.id]||e.id;return t.platforms[n]||null}function Ni(){if(!o.dashboard?.configured)return null;const e=o.dashboard?.extension||{};if(e.connected)return null;const t=!!e.installed;return i("div",{class:"card ext-offline-notice"},i("div",{class:"ext-offline-head"},i("span",{class:"ext-offline-icon"},g.power(15)),i("div",{class:"ext-offline-text"},i("div",{class:"ext-offline-title"},t?"Chrome / BNBot 插件未连接":"BNBot 插件未安装"),i("div",{class:"ext-offline-sub"},t?"当前接不到社交平台订单(reddit / 哔哩哔哩 / 知乎 / 微博 / 豆瓣 等)。打开 Chrome 并确保插件已启用即可恢复。":"社交平台订单需要 BNBot 浏览器插件。安装并登录对应站点后即可接单。"))),i("div",{class:"ext-offline-actions"},t?b("打开 Chrome",{size:"sm",leading:g.arrowOut(11),onClick:()=>{c("launch_chrome").catch(()=>{})}}):b("安装插件",{size:"sm",leading:g.arrowOut(11),onClick:()=>Y(e.installUrl||"https://chromewebstore.google.com/detail/bnbot/haammgigdkckogcgnbkigfleejpaiiln")})))}function Oi(){const e=o.dashboard?.taskService;if(e?.running&&e.phase==="probing")return i("div",{class:"card preflight-notice probing"},i("div",{class:"preflight-notice-head"},i("span",{class:"preflight-notice-icon"},i("span",{class:"pill-spinner"})),i("div",{class:"preflight-notice-text"},i("div",{class:"preflight-notice-title"},"接单服务已启动,正在检测平台登录态…"),i("div",{class:"preflight-notice-sub"},"首次检测约 1-2 分钟,完成后自动开始接单"))));const t=Pt();if(!t?.platforms)return null;const n=Object.entries(t.platforms).filter(([,a])=>a.status==="failed"&&a.actionable!==!1);if(!n.length)return null;const s=n.length;return i("div",{class:"card preflight-notice"},i("div",{class:"preflight-notice-head"},i("span",{class:"preflight-notice-icon"},g.bolt(15)),i("div",{class:"preflight-notice-text"},i("div",{class:"preflight-notice-title"},s>0?`${s} 个平台暂不接单`:"部分平台待确认"),i("div",{class:"preflight-notice-sub"},"装好依赖或登录对应站点后,接单守护重启会自动恢复"))),i("div",{class:"preflight-issue-list"},...n.map(([a,l])=>Bi(a,l))))}function Bi(e,t){const n=t.status==="failed"?"err":"warn";return i("div",{class:"preflight-issue"},i("span",{class:`preflight-issue-dot tone-${n}`}),i("div",{class:"preflight-issue-body"},i("div",{class:"preflight-issue-name"},i("span",{},t.label||e),t.skills?i("span",{class:"preflight-issue-count"},`${t.skills} 技能已暂停`):null),t.reason?i("div",{class:"preflight-issue-reason"},t.reason):null,t.hint?i("div",{class:"preflight-issue-hint"},t.hint):null),t.loginUrl?b("去登录",{size:"sm",kind:"soft",leading:g.arrowOut(11),onClick:()=>{m("open_external",{url:t.loginUrl})}}):null)}function Fi(){return D?i("div",{class:"card update-notice"},i("div",{class:"update-notice-text"},i("div",{class:"update-notice-title"},`发现新版本 v${D.version}`),i("div",{class:"update-notice-sub"},"当前 v0.3.1,下载安装包后替换即可")),b("去下载",{size:"sm",kind:"solid",leading:g.arrowOut(11),onClick:()=>{m("open_external",{url:D.url})}})):null}function Wi(){const e=o.dashboard?.wallet||{},t=e.address||o.dashboard?.config?.wallet_address||"0x95a9C8C40d4f1A8e9E76b9d0c7B342D8aB9D4B",n=typeof e.balance=="number"?e.balance:o.ui.balance;o.ui.balance=n;const a=+(n*.62).toFixed(2),l=+(n-a).toFixed(2),r=t.slice(0,6)+"…"+t.slice(-4),d=o.dashboard?.extension||{},p=o.dashboard?.services||{};return!_&&!G&&(G=!0,be()),i("div",{class:"row-stack connections-stack"},Q("首页","账户、钱包、和本地服务的实时状态",i("div",{class:"page-actions"},b("刷新",{size:"sm",leading:g.refresh(13),onClick:E}),b("退出",{size:"sm",kind:"ghost",danger:!0,leading:g.power(13),onClick:Qt}))),Fi(),Ni(),i("div",{class:"row-hero"},Vi(n,a,l,t,r),Ki(d)),i("div",{class:"row-services"},Ji(p),en()))}let ge=null,pe=!1,Pe="";async function he(){try{ge=await m("llm_detect")}catch{ge=null}u()}function Gi(e){return e==="codex"?"Codex":e==="chatgpt-web"?"ChatGPT 网页":e==="gemini"?"Gemini":e}async function rt(e,t,n){Pe=e,u();try{if(t==="install")await m("llm_install",{cli:e});else if(t==="login"){const s=await m("llm_login",{cli:e});s?.message&&window.alert(s.message)}else await m("llm_upload",{cli:e,model:n})}catch(s){window.alert(`操作失败: ${s instanceof Error?s.message:String(s)}`)}finally{Pe="",await he()}}async function Hi(e,t){const n=y?.disabledClis??[],s=t?n.filter(a=>a!==e):[...new Set([...n,e])];y={...y??{},disabledClis:s},u();try{await m("llm_set_enabled",{cli:e,enabled:t})}catch(a){y={...y??{},disabledClis:n},u(),window.alert(`设置失败:${a instanceof Error?a.message:String(a)}`);return}be()}function qi(e,t){const n=e.cli,s=Pe===n,a=e.defaultModel||"",l=(y?.disabledClis??[]).includes(n),r=!!(e.installed&&e.loggedIn);let d,p,w=null;return e.installed?e.loggedIn?l?(p="off",d=S("已暂停","off")):t?(p="ok",d=S("接单中","ok")):(p="ok",d=S("已就绪","ok")):(p="warn",d=S("待登录","warn"),w=n==="chatgpt-web"?b("去登录",{size:"sm",kind:"soft",leading:g.arrowOut(11),onClick:()=>{m("open_external",{url:"https://chatgpt.com/"})}}):b(s?"登录中…":"登录",{size:"sm",kind:"soft",onClick:s?void 0:()=>{rt(n,"login")}})):(p="off",d=S("未安装","off"),w=b(s?"安装中…":"安装",{size:"sm",kind:"soft",onClick:s?void 0:()=>{rt(n,"install")}})),i("div",{class:`llm-provider-row${l?" is-disabled":""}`},i("span",{class:`llm-provider-dot tone-${l?"off":p}${p==="ok"&&t&&!l?" is-live":""}`}),i("div",{class:"llm-provider-info"},i("div",{class:"llm-provider-name"},Gi(n)),a?i("div",{class:"llm-provider-model"},a):null),i("div",{class:"llm-provider-side"},d,w,r?$e(!l,R=>{Hi(n,R)}):null))}let y=null,me=!1,_=null,G=!1;async function be(){try{_=await m("relay_earnings")}catch{_=null}u()}function Ae(e,t){return i("div",{class:"relay-earning-stat"},i("div",{class:"relay-earning-value"},e),i("div",{class:"relay-earning-label"},t))}async function Ge(){try{y=await m("relay_settings_get")}catch{y=null}u()}async function U(e){const t={...y??{},...e};y=t,u();try{await m("relay_settings_set",{settings:t})}catch(n){window.alert(`保存失败: ${n instanceof Error?n.message:String(n)}`)}await Ge(),await he()}function $e(e,t){return i("button",{class:`relay-switch ${e?"on":"off"}`,onclick:()=>t(!e)},i("span",{class:"relay-switch-knob"}))}function Ui(){!y&&!me&&(me=!0,Ge()),!ge&&!pe&&(pe=!0,he()),!_&&!G&&(G=!0,be());const e=y??{concurrency:2,online:!1,scheduleEnabled:!1,scheduleStart:"22:00",scheduleEnd:"08:00"},t=ge?.providers??[],n=e.online===!0,s=e.scheduleEnabled===!0;return i("div",{class:"row-stack connections-stack"},Q("Agent 上架","让你的 Codex / Gemini,从今天开始赚钱",i("div",{class:"page-actions"})),Oi(),i("div",{class:"card relay-toggle-card"},i("div",{class:"relay-toggle-info"},i("div",{class:"relay-toggle-title"},n?"接单中 · 已上线":"未上线"),i("div",{class:"relay-toggle-sub"},n?"买家正在调用你上架的订阅算力":"打开开关,下方就绪的订阅一起上架接单")),$e(n,a=>{U({online:a})})),t.length?i("div",{class:"card"},i("div",{class:"card-title"},"我的 Agent"),i("div",{class:"llm-provider-list"},...t.map(a=>qi(a,n)))):null,_?.ok?i("div",{class:"card"},i("div",{class:"card-title"},"接单收益"),i("div",{class:"relay-earnings-grid"},Ae(`$${(_.totalEarned??0).toFixed(4)}`,"累计收益"),Ae(String(_.totalRequests??0),"累计调用"),Ae(`$${(_.dailySpent??0).toFixed(4)}`,"今日流水"))):null,i("div",{class:"card"},i("div",{class:"card-title"},"接单设置"),i("div",{class:"relay-setting-row"},i("div",{class:"relay-setting-label"},i("div",{},"最大并发请求数"),i("div",{class:"relay-setting-hint"},"同时处理几个请求 · 越高越容易触发风控,建议 2–5")),i("input",{type:"number",min:"1",max:"20",value:String(e.concurrency??2),class:"relay-number-input",onchange:a=>{U({concurrency:Number(a.target.value)||5})}})),i("div",{class:"relay-setting-row"},i("div",{class:"relay-setting-label"},i("div",{},"每天定时接单"),i("div",{class:"relay-setting-hint"},"只在时段内接单(如晚上 IP 空闲时),时段外自动暂停")),$e(s,a=>{U({scheduleEnabled:a})})),s?i("div",{class:"relay-schedule-row"},i("input",{type:"time",value:String(e.scheduleStart??"22:00"),class:"relay-time-input",onchange:a=>{U({scheduleStart:a.target.value})}}),i("span",{class:"relay-schedule-dash"},"—"),i("input",{type:"time",value:String(e.scheduleEnd??"08:00"),class:"relay-time-input",onchange:a=>{U({scheduleEnd:a.target.value})}})):null))}function Vi(e,t,n,s,a){const l=Be(),r=o.dashboard?.orderEarnings,d=r?.ok?J(r.pending,0):0,p=_?.ok?_.pending??0:0,w=+(d+p).toFixed(6),R=e+w;return i("div",{class:"card"},i("div",{class:"balance-head"},i("div",{class:"eyebrow"},"钱包总余额"),l.total>0?i("span",{class:"balance-delta"},g.arrowUp(12),` +$${l.total.toFixed(2)} / 7d`):null),i("div",{class:"balance-row"},i("div",{class:"balance-value"},`$${R.toFixed(2)}`),Jt(l.series,140,48,o.tweaks.accent)),i("div",{class:"chain-list"},ct("base","Base",t,a,s),ct("bsc","BNB Smart Chain",n,a,s),w>1e-4?ji(w):null))}function ji(e){return i("div",{class:"chain-row pending-row"},i("div",{class:"chain-glyph pending-glyph",html:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2"/></svg>'}),i("div",{class:"chain-info"},i("div",{class:"chain-name"},"待发送"),i("div",{class:"pending-note"},"已赚待结算 · 自动打款到钱包")),i("div",{class:"chain-balance"},`$${e.toFixed(2)}`))}function ct(e,t,n,s,a){const l=o.ui.copiedChain===e;return i("div",{class:"chain-row"},i("div",{class:"chain-glyph",html:e==="base"?'<svg width="14" height="14" viewBox="0 0 111 111"><path d="M54.921 110.034c30.412 0 55.07-24.66 55.07-55.067C109.991 24.56 85.333-.107 54.921-.107c-28.851 0-52.534 22.353-54.7 50.86h72.81v8.491H.22c2.166 28.51 25.85 50.787 54.7 50.787Z" fill="#0052FF"/></svg>':'<svg width="14" height="14" viewBox="0 0 126.61 126.61"><path fill="#F3BA2F" d="m38.73 53.2 24.59-24.58 24.6 24.6 14.3-14.31L63.32 0 24.42 38.9zM0 63.31l14.3-14.31 14.31 14.31-14.31 14.3zm38.73 10.11 24.59 24.59 24.6-24.6 14.31 14.29-38.9 38.91-38.91-38.88zM97.99 63.31l14.3-14.31 14.31 14.3-14.31 14.32zM77.83 63.3 63.32 48.78 52.59 59.51l-1.23 1.24-2.54 2.54 14.5 14.5z"/></svg>'}),i("div",{class:"chain-info"},i("div",{class:"chain-name"},t),i("button",{class:`chain-addr ${l?"copied":""}`,title:"点击复制地址",onclick:()=>Yi(e,a)},s,l?g.check(10):g.copy(10),l?i("span",{style:{fontSize:"9.5px",fontWeight:"600"}},"已复制"):null)),i("div",{class:"chain-balance"},`$${n.toFixed(2)}`))}function Yi(e,t){try{navigator.clipboard?.writeText(t)}catch{}o.ui.copiedChain=e,u(),setTimeout(()=>{o.ui.copiedChain=null,u()},1400)}function Ki(e){const t=!!e.connected,n=!!e.installed,s=t?"已连接":n?"未连接":"未安装",a=t?"ok":"warn";return i("div",{class:"card"},i("div",{class:"balance-head"},i("div",{class:"eyebrow"},"浏览器插件"),S(s,a)),t?(()=>{const l=String(e.detail||""),r=l.match(/\(v([\d.]+)\)/)?.[1]||null,d=l.match(/wss?:\/\/[^\s]+/)?.[0]||null;return i("div",{style:{marginTop:"2px"}},r?dt("插件版本",`v${r}`):null,d?dt("本地服务",d):null)})():null,t?null:i("div",{class:"plugin-line"},n?"插件已安装,等待与浏览器握手 …":"尚未安装 BNBot 浏览器插件。"),n?null:i("div",{class:"plugin-actions"},b("安装插件",{kind:"soft",size:"sm",leading:g.arrowOut(11),onClick:()=>Y(e.installUrl||"https://chromewebstore.google.com/")})))}function dt(e,t){return i("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",gap:"12px",padding:"9px 2px"}},i("span",{style:{fontSize:"13px",color:"var(--muted, #8b8b8b)"}},e),i("span",{style:{fontSize:"13px",fontFamily:"var(--mono, ui-monospace, monospace)",color:"var(--text, inherit)",textAlign:"right"}},t))}function Ji(e){const t=e.market||{},n=e.surf||{};return i("div",{class:"card"},i("div",{class:"balance-head",style:{alignItems:"baseline"}},i("div",{},i("div",{class:"card-title"},"本地服务"),i("div",{class:"card-subtitle"},"工作进程与 Surf 中继状态")),b("全部启动",{kind:"ghost",size:"sm",onClick:jn})),i("div",{class:"service-list"},ut("Market Provider",Xi(t),t.running,()=>gt("market")),ut("Surf / Relay Service",Qi(n),n.running,()=>gt("surf"))))}function Xi(e){return e.running?`PID ${e.pid||"-"} · 正在接收服务调用`:"无进程 · 需要手动启动"}function Qi(e){return e.running?`PID ${e.pid||"-"} · 中继运行中`:"未启动 · Relay 离线"}function ut(e,t,n,s){return i("div",{class:"service-row"},i("div",{},i("div",{class:"service-head"},i("span",{class:`service-dot ${n?"running":""}`}),i("div",{class:"service-name"},e)),i("div",{class:"service-sub"},t)),i("div",{class:"service-actions"},S(n?"运行中":"已停止",n?"ok":"off"),b(n?"停止":"启动",{kind:n?"ghost":"soft",size:"sm",onClick:s})))}function Zi(){const e=o.dashboard?.providerLog||[],t=$t(e),n=i("div",{class:"log-body cm-scroll","data-provider-log-body":"true",style:{flex:"1",maxHeight:"none"}},...It(t));return requestAnimationFrame(()=>{n.scrollTop=n.scrollHeight}),i("div",{class:"row-stack",style:{height:"100%"}},Q("Provider 日志","本地 Market Provider 实时输出",i("div",{class:"page-actions"},i("span",{class:"log-live-tag"},i("span",{class:"log-live-dot"}),"LIVE"),b("刷新",{size:"sm",leading:g.refresh(13),onClick:E}))),i("div",{class:"card flush",style:{flex:"1",display:"flex",flexDirection:"column",minHeight:"0"}},n))}function en(){const e=we(),t=o.dashboard?.orderEarnings,n=t?.ok?J(t.count,ue().length):ue().length,s=C().filter(a=>a.status==="ready"&&!qe(a)).reduce((a,l)=>a+(l.skills||0),0);return i("div",{class:"card"},i("div",{class:"log-card-head"},i("div",{},i("div",{class:"card-title"},"接单概况"),i("div",{class:"card-subtitle"},"在线接单平台与累计调用")),i("button",{class:"log-expand",title:"查看 Provider 日志",onclick:()=>{o.ui.route="logs",u()}},g.terminal(13))),i("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr 1fr",gap:"14px",padding:"12px 2px 4px"}},W("接单平台",String(e.ready)),W("服务数量",String(s)),W("调用次数",String(n))))}function $t(e){return Array.isArray(e)&&e.length>0?e.map(t=>tn(String(t))):x()?[]:[...Fe]}function tn(e){const t=d=>/^(INFO|WARN|ERROR|DEBUG|TRACE)$/i.test(d),n=e.match(/(\d{2}:\d{2}:\d{2}(?:\.\d{3})?)/),s=n?n[1]:"",a=e.match(/\b(INFO|WARN|ERROR|DEBUG|TRACE)\b/i),l=a?a[1].toUpperCase():"INFO";let r=e.replace(/^\[[^\]]+\]\s*/,"").replace(/^\d{4}-\d{2}-\d{2}[T\s]\d{2}:\d{2}:\d{2}(\.\d+)?Z?\s*/,"").trim();return r=r.replace(/^\[(INFO|WARN|ERROR|DEBUG|TRACE)\]\s*/i,""),t(r.split(/\s/)[0]||"")&&(r=r.replace(/^\S+\s+/,"")),{t:s,lvl:l,msg:r||e}}function He(e){return i("div",{class:"log-line"},i("span",{class:"log-time"},e.t),i("span",{class:`log-level ${e.lvl}`},e.lvl),i("span",{class:`log-msg ${e.lvl}`},e.msg))}function It(e){return e.length===0?[i("div",{style:{padding:"22px 24px",color:"var(--text-muted)"}},"暂无 Provider 日志")]:e.map(He)}function nn(){const e=o.ui.connectionsFilter,t=o.ui.connectionsQuery.toLowerCase(),n=C().filter(a=>(e==="全部"||a.cat===e)&&(!t||a.name.toLowerCase().includes(t))),s=we();return i("div",{class:"row-stack"},Q("平台连接",sn(s),i("div",{class:"page-actions"},qn(o.ui.connectionsQuery,a=>{o.ui.connectionsQuery=a,u()}))),i("div",{class:"category-chips cm-noscrollbar"},...ui.map(a=>{const l=a===e,r=C(),d=a==="全部"?r.length:r.filter(p=>p.cat===a).length;return i("button",{class:`chip ${l?"active":""}`,onclick:()=>{o.ui.connectionsFilter=a,u()}},a,i("span",{class:"chip-count"},String(d)))})),i("div",{class:`platform-grid ${o.tweaks.density==="compact"?"compact":""}`},...n.length===0?[i("div",{class:"empty-state"},"没有匹配的平台")]:n.map(on)))}function Dt(e=we()){return[i("b",{style:{color:"var(--text)",fontWeight:"600"}},String(e.ready))," 就绪 · ",i("b",{style:{color:"var(--warn)",fontWeight:"600"}},String(e.needs))," 需登录"]}function sn(e=we()){return i("span",{"data-connections-stats":!0},...Dt(e))}function an(){document.querySelectorAll("[data-connections-stats]").forEach(e=>{e.replaceChildren(...Dt())})}function we(){let e=0,t=0,n=0;const s=C();for(const a of s)Ct(a.id)?n++:qe(a)||(a.status==="ready"?e++:(a.status==="login"||a.status==="needs")&&t++);return{ready:e,needs:t,updating:n,total:s.length}}function on(e){return i("button",{class:"platform-card","data-platform-card":e.id,onclick:()=>{o.ui.modal={kind:"platform",id:e.id},u()}},ve(e,36),i("div",{class:"platform-info"},i("div",{class:"platform-row1"},i("div",{class:"platform-name"},e.name)),i("div",{class:"platform-row2"},i("span",{class:`mode-tag ${e.mode}`},At[e.mode]),i("span",{title:"技能数",style:{flexShrink:"0",fontSize:"11px",fontWeight:"700",color:"var(--text-muted)",background:"var(--line)",borderRadius:"6px",padding:"1px 7px"}},String(N(e.id).length||e.skills)))),zt(e))}function qe(e){const t=N(e.id);return t.length>0&&t.every(n=>n.is_active===!1)}function ln(e){if(Ct(e.id))return{label:"更新中",tone:"sync",syncing:!0};if(qe(e))return{label:"已停用",tone:"off",syncing:!1};const t=zi(e);return t?.status==="failed"?{label:t.reason||"依赖未就绪",tone:"err",syncing:!1}:t?.status==="unknown"?{label:t.reason||"待确认",tone:"warn",syncing:!1}:{label:Et[e.status],tone:Nt(e.status),syncing:!1}}function zt(e){const t=ln(e);return t.syncing?i("span",{class:`pill platform-status-pill tone-${t.tone} icon-only`,title:"后台同步中","data-platform-status":e.id},i("span",{class:"pill-spinner"})):i("span",{class:`platform-status-light tone-${t.tone}`,title:t.label,"aria-label":t.label,"data-platform-status":e.id},i("span",{class:"status-light-core"}))}function Nt(e){return e==="ready"?"ok":e==="login"||e==="needs"?"warn":e==="error"?"err":"off"}const rn={openai:"M22.282 9.821a6 6 0 0 0-.516-4.91a6.05 6.05 0 0 0-6.51-2.9A6.065 6.065 0 0 0 4.981 4.18a6 6 0 0 0-3.998 2.9a6.05 6.05 0 0 0 .743 7.097a5.98 5.98 0 0 0 .51 4.911a6.05 6.05 0 0 0 6.515 2.9A6 6 0 0 0 13.26 24a6.06 6.06 0 0 0 5.772-4.206a6 6 0 0 0 3.997-2.9a6.06 6.06 0 0 0-.747-7.073M13.26 22.43a4.48 4.48 0 0 1-2.876-1.04l.141-.081l4.779-2.758a.8.8 0 0 0 .392-.681v-6.737l2.02 1.168a.07.07 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.494 4.494M3.6 18.304a4.47 4.47 0 0 1-.535-3.014l.142.085l4.783 2.759a.77.77 0 0 0 .78 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-1.646M2.34 7.896a4.5 4.5 0 0 1 2.366-1.973V11.6a.77.77 0 0 0 .388.677l5.815 3.354l-2.02 1.168a.08.08 0 0 1-.071 0l-4.83-2.786A4.504 4.504 0 0 1 2.34 7.872zm16.597 3.855l-5.833-3.387L15.119 7.2a.08.08 0 0 1 .071 0l4.83 2.791a4.494 4.494 0 0 1-.676 8.105v-5.678a.79.79 0 0 0-.407-.667m2.01-3.023l-.141-.085l-4.774-2.782a.78.78 0 0 0-.785 0L9.409 9.23V6.897a.07.07 0 0 1 .028-.061l4.83-2.787a4.5 4.5 0 0 1 6.68 4.66zm-12.64 4.135l-2.02-1.164a.08.08 0 0 1-.038-.057V6.075a4.5 4.5 0 0 1 7.375-3.453l-.142.08L8.704 5.46a.8.8 0 0 0-.393.681zm1.097-2.365l2.602-1.5l2.607 1.5v2.999l-2.597 1.5l-2.607-1.5Z",googlegemini:"M11.04 19.32Q12 21.51 12 24q0-2.49.93-4.68.96-2.19 2.58-3.81t3.81-2.55Q21.51 12 24 12q-2.49 0-4.68-.93a12.3 12.3 0 0 1-3.81-2.58 12.3 12.3 0 0 1-2.58-3.81Q12 2.49 12 0q0 2.49-.96 4.68-.93 2.19-2.55 3.81a12.3 12.3 0 0 1-3.81 2.58Q2.49 12 0 12q2.49 0 4.68.96 2.19.93 3.81 2.55t2.55 3.81",google:"M12.48 10.92v3.28h7.84c-.24 1.84-.853 3.187-1.787 4.133c-1.147 1.147-2.933 2.4-6.053 2.4c-4.827 0-8.6-3.893-8.6-8.72s3.773-8.72 8.6-8.72c2.6 0 4.507 1.027 5.907 2.347l2.307-2.307C18.747 1.44 16.133 0 12.48 0C5.867 0 .307 5.387.307 12s5.56 12 12.173 12c3.573 0 6.267-1.173 8.373-3.36c2.16-2.16 2.84-5.213 2.84-7.667c0-.76-.053-1.467-.173-2.053z"};function ve(e,t=36){const n=i("div",{class:`platform-glyph${t===22?" size-sm":t>=52?" size-lg":""}`,style:{background:e.brand,fontSize:`${Math.round(t*.42)}px`}}),s=e.slug?rn[e.slug]:void 0;if(s)n.innerHTML=`<svg viewBox="0 0 24 24" role="img" aria-label="${e.name}"><path d="${s}"/></svg>`;else if(e.slug){const a=document.createElement("img");a.src=`https://api.iconify.design/simple-icons:${e.slug}.svg?color=white`,a.alt=e.name,a.referrerPolicy="no-referrer",a.addEventListener("error",()=>{a.replaceWith(document.createTextNode(e.mark))}),n.append(a)}else n.append(document.createTextNode(e.mark));return n}function Ot(e){return e?"● 已启用":"○ 已停用"}function cn(e){const t=e.is_active!==!1;return i("div",{class:"platform-skill-row"},i("div",{class:"platform-skill-copy"},i("span",{class:"platform-skill-name"},e.skill_name),e.description?i("span",{class:"platform-skill-desc"},e.description):null),i("span",{class:`platform-skill-status ${t?"on":""}`,"data-skill-status":!0},Ot(t)))}function Bt(e){return e?"点击停用整个平台":"点击启用整个平台"}function dn(e){const t=N(e.id),n=t.length>0&&t.every(s=>s.is_active!==!1);return i("button",{class:`platform-toggle ${n?"on":""}`,type:"button",title:Bt(n),"aria-pressed":String(n),"data-platform-toggle":e.id,onclick:s=>{s.stopPropagation();const a=N(e.id);a.length&&mn(e,!a.every(l=>l.is_active!==!1))}},i("span",{class:"platform-toggle-thumb"}))}function Ue(e){const t=C().find(n=>n.id===e);t&&(document.querySelectorAll("[data-platform-card]").forEach(n=>{if(n.dataset.platformCard!==e)return;const s=n.querySelector("[data-platform-status]");s&&s.replaceWith(zt(t))}),an())}function un(e){const t=document.querySelector(".platform-modal .platform-caps");if(!t)return!1;const n=t.dataset.platformId||"",s=t.querySelector("[data-platform-toggle]");return s&&(s.classList.toggle("on",e),s.setAttribute("aria-pressed",String(e)),s.title=Bt(e)),t.querySelectorAll("[data-skill-status]").forEach(a=>{a.classList.toggle("on",e),a.textContent=Ot(e)}),n&&Ue(n),!!s}function gn(e){if(document.hidden){window.setTimeout(e,0);return}window.requestAnimationFrame(()=>window.setTimeout(e,0))}function pn(e,t,n){const s=T.get(e);!s||s.active!==n||(s.syncTimer!=null&&window.clearTimeout(s.syncTimer),s.syncTimer=window.setTimeout(()=>{const a=T.get(e);if(!a||a.active!==n)return;const l=t.map(r=>({id:r.id,skill_name:r.skill_name,category:r.category,description:r.description??null,price:r.price??0}));c("set_skills_active",{skills:l,active:n}).then(r=>{if(r?.ok===!1){L(e),le();return}L(e),ze(),window.setTimeout(()=>{ze()},1500),window.setTimeout(()=>{le()},r?.queued?5e3:900)}).catch(()=>{L(e),le()})},120))}function mn(e,t){const n=N(e.id);if(n.length){if(bi(e.id,t),n.forEach(s=>{s.is_active=t}),fi(e.id,n),un(t)||Ft(),!x()){window.setTimeout(()=>L(e.id),700);return}gn(()=>pn(e.id,n,t))}}function Ft(){const e=o.ui.modal;if(e?.kind!=="platform")return;const t=C().find(s=>s.id===e.id),n=document.querySelector(".platform-modal .platform-caps");t&&n&&n.replaceWith(Wt(t))}function Wt(e){const t=N(e.id);return t.length===0?i("div",{class:"platform-caps","data-platform-id":e.id},i("div",{class:"caps-label"},`能力 (${e.caps.length})`),i("div",{class:"caps-list"},...e.caps.map(n=>i("span",{class:"cap-tag"},i("span",{class:"cap-icon"},g.bolt(11,o.tweaks.accent)),n)))):i("div",{class:"platform-caps","data-platform-id":e.id},i("div",{class:"caps-label",style:{display:"flex",alignItems:"center",justifyContent:"space-between"}},i("span",{},`能力 (${t.length})`),dn(e)),i("div",{class:"cm-scroll",style:{maxHeight:"min(340px, 40vh)",overflowY:"auto",marginRight:"-6px",paddingRight:"6px"}},...t.map(cn)))}function fn(e){const t=C().find(l=>l.id===e);if(!t)return i("div",{});const n=t.mode==="browser",s=Nt(t.status),a=n?t.status==="login"?"需要在浏览器中完成登录。登录后可执行所有技能。":"该平台通过本地 BNBot 桥接到你已登录的浏览器会话调用。":"该平台走公开 API 调用,无需登录即可使用所有技能。";return i("div",{class:"modal-backdrop",onclick:K},i("div",{class:"platform-modal",onclick:l=>l.stopPropagation(),style:{background:"var(--surface)"}},i("div",{class:"platform-modal-head"},ve(t,52),i("div",{class:"platform-modal-info"},i("div",{class:"platform-modal-cat"},t.cat),i("div",{class:"platform-modal-title"},t.name),i("div",{class:"platform-modal-meta"},S(Et[t.status],s),i("span",{class:`mode-tag ${t.mode}`},At[t.mode]),i("span",{class:"platform-modal-skills"},`${N(t.id).length||t.skills} 个技能`))),i("button",{class:"modal-close-btn",onclick:K},g.close(14))),i("div",{class:"platform-modal-desc"},a),Wt(t)))}function hn(){const e=ue(),t=_i(),n=e.filter(ye=>ye.status==="completed"),s=J(o.dashboard?.history?.orderCount,e.length),a=Be(),l=a.series[a.series.length-1],r=a.total,d=a.series[a.series.length-2]??0,p=d>0?Math.round((l-d)/d*100):null,w=s||e.length,R=w===0?0:Math.round(n.length/w*100),Z=o.ui.ordersTab;return i("div",{class:"row-stack"},Q("订单与收益","服务调用记录、付费托管任务、收益结算",i("div",{class:"page-actions"},b("刷新",{size:"sm",leading:g.refresh(12),onClick:E}))),i("div",{class:"stats-strip"},W("今日收益",`$${l.toFixed(2)}`,p===null?void 0:`${p>=0?"+":""}${p}%`,p!==null&&p>=0?"ok":void 0),bn("近 7 日",`$${r.toFixed(2)}`,a.series),W("调用次数",String(w)),W("成功率",`${R}%`,"目标 ≥ 98%")),i("div",{class:"row-orders-mid"},wn(),vn(t)),yn(Z,e,s||e.length))}function W(e,t,n,s){return i("div",{class:"stat-card"},i("div",{class:"eyebrow"},e),i("div",{class:"stat-row"},i("div",{class:"stat-value"},t)),n?i("div",{class:`stat-delta ${s==="ok"?"tone-ok":""}`},n):null)}function bn(e,t,n){return i("div",{class:"stat-card"},i("div",{class:"eyebrow"},e),i("div",{class:"stat-row"},i("div",{class:"stat-value"},t),Jt(n,70,28,o.tweaks.accent)))}function wn(){const e=Be().series,t=vi(),n=Math.max(...e)*1.15||1,s=160,a=i("div",{class:"bar-chart"});return[.25,.5,.75,1].forEach(l=>{a.append(i("div",{class:"bar-grid",style:{bottom:`${l*s}px`}}))}),e.forEach((l,r)=>{const d=r===e.length-1,p=l/n,w=i("div",{class:"bar-col"},i("div",{class:`bar ${d?"is-last":""}`,style:{height:`${p*100}%`},title:`$${l.toFixed(2)}`},d?i("div",{class:"bar-tip"},`$${l.toFixed(2)}`):null));a.append(w)}),i("div",{class:"card"},i("div",{class:"balance-head",style:{alignItems:"baseline"}},i("div",{},i("div",{class:"card-title"},"近 7 日收益"),i("div",{class:"card-subtitle"},`截止 ${We(Date.now())} · USDT`)),b("月视图",{kind:"ghost",size:"sm"})),i("div",{class:"chart-container"},a,i("div",{class:"bar-labels"},...t.map((l,r)=>i("div",{class:`bar-label ${r===t.length-1?"is-last":""}`},l)))))}function vn(e){return i("div",{class:"card"},i("div",{class:"balance-head",style:{alignItems:"baseline"}},i("div",{},i("div",{class:"card-title"},"托管任务"),i("div",{class:"card-subtitle"},"已分配的付费长任务")),S(`${e.length} 进行中`,"warn")),i("div",{class:"escrow-list"},...e.length===0?[i("div",{style:{padding:"20px 2px",color:"var(--text-muted)"}},"暂无托管任务")]:e.map(t=>{const n=C().find(s=>s.id===t.platform);return i("div",{class:"escrow-row"},n?ve(n,36):null,i("div",{class:"escrow-info"},i("div",{class:"escrow-skill"},t.skill),i("div",{class:"escrow-meta"},`${n?.name||""} · 截止 ${t.deadline}`)),i("div",{class:"escrow-amount"},i("div",{class:"escrow-reward"},`$${t.reward.toFixed(2)}`),i("div",{class:"escrow-status"},t.status==="in-progress"?"执行中":"排队中")))})))}function yn(e,t,n=t.length){const s=t.filter(d=>d.status==="failed").length,a=t.filter(d=>d.status==="pending").length,l=[{id:"recent",label:"全部订单",n},{id:"failed",label:"失败",n:s},{id:"pending",label:"排队",n:a}],r=e==="failed"?t.filter(d=>d.status==="failed"):e==="pending"?t.filter(d=>d.status==="pending"):t;return i("div",{class:"card flush"},i("div",{class:"orders-toolbar"},i("div",{class:"tab-group"},...l.map(d=>i("button",{class:`tab ${d.id===e?"active":""}`,onclick:()=>{o.ui.ordersTab=d.id,u()}},d.label,i("span",{class:"tab-count"},String(d.n))))),i("div",{class:"tz-stamp"},"UTC+08:00 · today")),i("div",{class:"orders-grid-head"},i("div",{},"时间"),i("div",{},"平台"),i("div",{},"技能"),i("div",{},"状态"),i("div",{class:"right"},"时长"),i("div",{class:"right"},"金额")),i("div",{class:"orders-grid-body cm-scroll"},...r.length===0?[i("div",{style:{padding:"32px 20px",color:"var(--text-muted)"}},"暂无订单")]:r.map(kn)))}function kn(e){const t=C().find(n=>n.id===e.platform);return i("div",{class:"orders-row"},i("div",{class:"time"},e.t),i("div",{class:"platform-cell"},t?ve(t,22):null,i("span",{},t?.name||e.platform)),i("div",{},e.skill),i("div",{},S(e.status==="completed"?"已完成":e.status==="pending"?"排队中":"失败",e.status==="completed"?"ok":e.status==="pending"?"warn":"err")),i("div",{class:"dur right"},e.dur),i("div",{class:`amount right ${e.amount===0?"zero":""}`},Ai(e.amount)))}function _n(){const e=Ti[o.ui.loginLang];return i("div",{class:"login-screen"},i("div",{class:"login-grid"}),i("div",{class:"login-container"},i("div",{class:"login-brand"},X(36,o.tweaks.accent),i("div",{},i("div",{class:"login-brand-name"},"ClawMoney"),i("div",{class:"login-brand-tag"},e.tagline))),i("div",{class:"login-card"},Cn(e)),i("div",{class:"login-footer"},i("div",{class:"login-footer-links"},i("a",{onclick:()=>Y("https://clawmoney.ai/terms")},e.fTerms),i("a",{onclick:()=>Y("https://clawmoney.ai/privacy")},e.fPrivacy),i("a",{onclick:()=>Y("https://github.com/clawmoney")},e.fSource)),Sn())))}function Sn(){return i("div",{class:"lang-toggle-segment"},...["zh","en"].map(e=>i("button",{class:`lang-toggle-option ${o.ui.loginLang===e?"active":""}`,onclick:()=>{o.ui.loginLang=e,u()}},e==="zh"?"中文":"EN")))}function Cn(e){switch(o.ui.loginStep){case"choose":return xn(e);case"google":return En(e);case"email":return An(e);case"emailCode":return Tn(e)}}function xn(e){return i("div",{class:"login-pad"},i("div",{class:"login-title"},e.welcome),i("div",{class:"login-sub"},e.subtitle),i("button",{class:"login-btn-google",onclick:$n},Lt(18),i("span",{},e.google)),i("div",{class:"login-divider"},i("div",{class:"line"}),i("span",{class:"label"},e.or),i("div",{class:"line"})),i("button",{class:"login-btn-email",onclick:()=>{o.ui.loginStep="email",o.ui.loginError=null,u()}},i("span",{style:{display:"inline-flex",color:"var(--text-muted)"}},g.mail(16)),e.email),o.ui.loginError?i("div",{class:"login-error"},o.ui.loginError):null,i("div",{class:"login-terms"},e.terms))}function En(e){const t=o.ui.googleState,n={idle:"",redirecting:e.gRedirect,granting:e.gGrant,success:e.gSuccess},s={idle:"",redirecting:e.gRedirectSub,granting:e.gGrantSub,success:e.gSuccessSub},a=t==="success",l=i("div",{class:"google-avatar"},i("div",{class:`google-avatar-bg ${a?"success":""}`}),a?null:i("div",{class:"google-avatar-ring"}),i("div",{class:"google-avatar-icon"},a?X(38,"#fff"):Lt(32)));return i("div",{class:"login-google-state"},l,i("div",{class:"google-state-title"},n[t]),i("div",{class:"google-state-sub"},s[t]),t==="redirecting"?i("div",{class:"google-state-domain"},"accounts.google.com"):null,a?i("button",{class:"google-continue-btn",onclick:Ht},e.continueCta):null,a?null:i("button",{class:"login-back",style:{marginTop:"22px"},onclick:()=>{A.forEach(r=>window.clearTimeout(r)),A=[],o.ui.loginStep="choose",o.ui.googleState="idle",u()}},"← ",e.backLink))}function An(e){return i("form",{class:"login-pad",onsubmit:t=>{t.preventDefault(),In()}},i("button",{type:"button",class:"login-back",onclick:()=>{o.ui.loginStep="choose",u()}},"← ",e.backLink),i("div",{class:"login-title"},e.emailTitle),i("div",{class:"login-sub"},e.emailSub),i("label",{class:"login-label"},e.emailLabel),i("input",{type:"email",class:"login-input",placeholder:"you@example.com",value:o.ui.loginEmail,autofocus:!0,required:!0,oninput:t=>{o.ui.loginEmail=t.target.value}}),o.ui.loginError?i("div",{class:"login-error"},o.ui.loginError):null,i("button",{type:"submit",class:"login-submit"},e.emailCta))}function Tn(e){const t=o.ui.loginCodeError,n=o.ui.loginCodeVerifying,s=Array.from({length:6}).map((a,l)=>{const r=document.createElement("input");return r.className=`login-code-input ${t?"error":""}`,r.inputMode="numeric",r.maxLength=1,r.value=o.ui.loginCode[l]||"",r.disabled=n,l===0&&(r.autofocus=!0),r.addEventListener("input",d=>Ln(l,d.target.value)),r.addEventListener("keydown",d=>Rn(l,d)),l===0&&r.addEventListener("paste",Pn),r});return setTimeout(()=>{const a=o.ui.loginCode.length;s[Math.min(a,5)]?.focus()},30),i("div",{class:"login-pad"},i("button",{type:"button",class:"login-back",onclick:()=>{o.ui.loginStep="email",o.ui.loginCodeError=!1,o.ui.loginCode="",u()}},"← ",e.backLink),i("div",{class:"login-title"},e.codeTitle),i("div",{class:"login-sub"},e.codeSubPre,i("b",{style:{color:"var(--text)",fontWeight:"600"}},o.ui.loginEmail),"。",e.codeSubPost),i("div",{class:"login-code-row"},...s),Mn(e),i("div",{class:"login-code-footer"},o.ui.loginCodeResendIn>0?i("span",{},e.codeResendIn(o.ui.loginCodeResendIn)):i("button",{class:"login-code-resend",onclick:()=>{o.ui.loginCodeResendIn=45,Gt(),Dn(),u()}},e.codeResend),i("button",{style:{all:"unset",cursor:"pointer",color:"var(--text-muted)"},onclick:()=>{o.ui.loginStep="email",o.ui.loginCodeError=!1,o.ui.loginCode="",u()}},e.codeChange)))}function Mn(e){return o.ui.loginCodeVerifying?i("div",{class:"login-code-status muted"},i("span",{class:"login-spinner"}),e.codeVerifying):o.ui.loginCodeError?i("div",{class:"login-code-status error"},e.codeError):i("div",{class:"login-code-status"})}function Ln(e,t){o.ui.loginCodeError&&(o.ui.loginCodeError=!1);const n=t.replace(/\D/g,"").slice(0,1),s=o.ui.loginCode.split("");s[e]=n,o.ui.loginCode=s.slice(0,6).join(""),u(),n&&e<5&&setTimeout(()=>{document.querySelectorAll(".login-code-input")[e+1]?.focus()},20),o.ui.loginCode.length===6&&!o.ui.loginCodeVerifying&&qt(o.ui.loginCode)}function Rn(e,t){const n=document.querySelectorAll(".login-code-input");t.key==="Backspace"&&!o.ui.loginCode[e]&&e>0&&n[e-1]?.focus(),t.key==="ArrowLeft"&&e>0&&n[e-1]?.focus(),t.key==="ArrowRight"&&e<5&&n[e+1]?.focus()}function Pn(e){const n=(e.clipboardData?.getData("text")||"").replace(/\D/g,"").slice(0,6);n&&(e.preventDefault(),o.ui.loginCode=n,u(),n.length===6&&qt(n))}function Gt(){B!=null&&window.clearInterval(B),B=window.setInterval(()=>{o.ui.loginCodeResendIn=Math.max(0,o.ui.loginCodeResendIn-1),o.ui.loginCodeResendIn===0&&B!=null&&(window.clearInterval(B),B=null),u()},1e3)}async function $n(){if(A.forEach(e=>window.clearTimeout(e)),A=[],o.ui.loginStep="google",o.ui.googleState="redirecting",o.ui.loginError=null,u(),x()){const e=await m("start_google_login");if(!e.ok){o.ui.googleState="idle",o.ui.loginStep="choose",o.ui.loginError=Ve(e)||"Could not open Google login.",u();return}o.ui.googleState="success",u(),await E(),o.ui.loginStep="choose",o.ui.googleState="idle",u();return}m("start_google_login"),A.push(window.setTimeout(()=>{o.ui.googleState="granting",u()},700)),A.push(window.setTimeout(()=>{o.ui.googleState="success",u()},1600)),A.push(window.setTimeout(Ht,2200))}async function Ht(){A.forEach(e=>window.clearTimeout(e)),A=[],await E(),o.ui.loginStep="choose",o.ui.googleState="idle",o.ui.loginError=null,u()}async function In(){if(!o.ui.loginEmail)return;o.ui.loginError=null;const e=await m("start_email_login",{email:o.ui.loginEmail});if(!e.ok){o.ui.loginError=Ve(e)||"Could not send verification code.",u();return}o.ui.loginStep="emailCode",o.ui.loginCode="",o.ui.loginCodeError=!1,o.ui.loginCodeResendIn=45,Gt(),u()}async function qt(e){o.ui.loginCodeVerifying=!0,o.ui.loginError=null,u();const t=await m("verify_email_login",{email:o.ui.loginEmail,code:e});t.ok?(await E(),o.ui.loginStep="choose",o.ui.loginCode="",o.ui.loginCodeError=!1):(o.ui.loginCodeError=!0,o.ui.loginCode="",o.ui.loginError=Ve(t)),o.ui.loginCodeVerifying=!1,u()}async function Dn(){o.ui.loginEmail&&await m("start_email_login",{email:o.ui.loginEmail})}function Ve(e){if(!e)return"";const t=e.error??e.detail;if(!t)return"";if(typeof t=="string")return t;if(typeof t=="object"){const n=t.message??t.detail??t.error;if(typeof n=="string")return n;try{return JSON.stringify(t)}catch{return String(t)}}return String(t)}function x(){return!!window.__TAURI_INTERNALS__}function zn(){o.ui.modal={kind:"settings",section:"app"},u()}const Ie=[{id:"app",label:"应用",icon:()=>g.home(14)},{id:"about",label:"关于",icon:()=>g.spark(14)}];function Ut(e){switch(e){case"app":return Bn();case"about":return Wn()}}function Nn(e){if(o.ui.modal?.kind!=="settings")return;o.ui.modal.section=e,document.querySelectorAll(".settings-nav").forEach(a=>{a.classList.toggle("active",a.dataset.section===e)});const t=document.querySelector(".settings-content-title");t&&(t.textContent=Ie.find(a=>a.id===e)?.label||"");const n=document.querySelector(".settings-content");if(!n)return;const s=n.querySelector(".settings-content-head");for(;n.lastChild&&n.lastChild!==s;)n.removeChild(n.lastChild);n.append(Ut(e))}function On(e){return i("div",{class:"modal-backdrop",onclick:K},i("div",{class:"settings-modal",onclick:t=>t.stopPropagation()},i("div",{class:"settings-sidebar"},i("div",{class:"settings-sidebar-title"},"设置"),...Ie.map(t=>i("button",{class:`settings-nav ${t.id===e?"active":""}`,"data-section":t.id,onclick:()=>Nn(t.id)},i("span",{class:"settings-nav-icon"},t.icon()),t.label)),i("div",{style:{flex:"1"}}),i("button",{class:"settings-logout",onclick:Qt},g.power(13,"var(--err)")," 退出登录")),i("div",{class:"settings-content cm-scroll"},i("div",{class:"settings-content-head"},i("div",{class:"settings-content-title"},Ie.find(t=>t.id===e)?.label||""),i("button",{class:"modal-close-btn",onclick:K},g.close(14))),Ut(e))))}function Bn(){return i("div",{},P("语言","登录页支持中英文 · 主界面目前仅中文",i("select",{class:"set-select",onchange:e=>{const t=e.target.value;o.locale=t,o.ui.loginLang=t,localStorage.setItem("clawmoney.locale",t),u()}},i("option",{value:"zh",selected:o.locale==="zh"},"简体中文"),i("option",{value:"en",selected:o.locale==="en"},"English"))),P("外观","明亮 / 深色",i("select",{class:"set-select",onchange:e=>{o.tweaks.dark=e.target.value==="dark",Li(),u()}},i("option",{value:"light",selected:!o.tweaks.dark},"明亮"),i("option",{value:"dark",selected:o.tweaks.dark},"深色"))),P("开机自启","系统启动时自动打开 ClawMoney",se(!0,()=>{})),P("保持不休眠","防止系统休眠中断接单(不影响显示器)",se(!!o.dashboard?.config?.keep_awake,e=>{c("set_keep_awake",{enabled:e}).then(()=>{o.dashboard?.config&&(o.dashboard.config.keep_awake=e),ze(),u()}).catch(()=>{})})),P("自动更新","在后台静默下载新版本",se(!0,()=>{})),P("数据目录","日志、缓存、配置存放位置",i("code",{class:"set-code",style:{fontSize:"11.5px"}},o.dashboard?.configPath||"~/.clawmoney")),P("发送匿名诊断","帮助我们改进稳定性",se(!1,()=>{})))}let ne=!1;function Fn(){const e=[];for(const t of li.split(`
|
|
67
|
-
`))t.startsWith("## ")?e.push(i("div",{class:"cl-version"},t.slice(3))):t.startsWith("### ")?e.push(i("div",{class:"cl-section"},t.slice(4))):t.startsWith("- ")&&t.length>2&&e.push(i("div",{class:"cl-item"},t.slice(2)));return e}function
|
|
66
|
+
`,n}function Li(){try{const e=localStorage.getItem("clawmoney.tweaks.v2");if(e)return{...at(),...JSON.parse(e)}}catch{}return at()}function at(){return{dark:!1,accent:"#F0B90B",density:"comfy",showBg:!0}}function Ri(){try{localStorage.setItem("clawmoney.tweaks.v2",JSON.stringify(o.tweaks))}catch{}}function ot(){const e=new URLSearchParams(location.search).get("lang");if(e==="en"||e==="zh")return localStorage.setItem("clawmoney.locale",e),e;const t=localStorage.getItem("clawmoney.locale");return t==="en"||t==="zh"?t:navigator.language.toLowerCase().startsWith("zh")?"zh":"en"}function $i(){const e=x();document.documentElement.classList.toggle("cm-dark",o.tweaks.dark),document.documentElement.classList.toggle("is-tauri-root",e),document.documentElement.style.setProperty("--accent",o.tweaks.accent),document.body.classList.toggle("density-compact",o.tweaks.density==="compact"),document.body.classList.toggle("is-tauri",e);const t=document.getElementById("desktop");t&&(t.style.opacity=e?"0":o.tweaks.showBg?"1":"0")}function u(){$i();const e=document.getElementById("app");e.innerHTML="";const t=o.dashboard;if(!t){e.append(Pi()),Re();return}!!t?.configured?e.append(Ii(),zi()):e.append(i("div",{class:"login-corner-traffic"},Rt()),Sn()),o.ui.modal?.kind==="platform"?e.append(hn(o.ui.modal.id)):o.ui.modal?.kind==="settings"?e.append(Bn(o.ui.modal.section)):o.ui.modal?.kind==="log"&&e.append(qn()),Re(),document.getElementById("__perf")?.remove()}function Pi(){return i("div",{class:"boot-screen","data-tauri-drag-region":!0},i("div",{class:"boot-mark"},X(42,o.tweaks.accent)),i("div",{class:"boot-title"},"Claw Money"),i("div",{class:"boot-subtitle"},o.locale==="zh"?"你的 Agent,值得一份薪水":"Your agent deserves a paycheque."),i("div",{class:"boot-spinner"}))}function Re(){const e=document.getElementById("app");if(!e)return;if(x()){e.style.transform="";return}const t=1280,n=820,s=40,a=(window.innerWidth-s)/t,l=(window.innerHeight-s)/n,r=Math.min(1,a,l);e.style.transform=`scale(${r})`}function Rt(){const e=t=>n=>{if(n.stopPropagation(),!x())return;const s=Oe();t==="close"&&s.close(),t==="minimize"&&s.minimize(),t==="zoom"&&s.toggleMaximize()};return i("div",{class:"traffic"},i("button",{class:"traffic-dot close",title:"Close",onclick:e("close")},i("span",{},"×")),i("button",{class:"traffic-dot min",title:"Minimize",onclick:e("minimize")},i("span",{},"−")),i("button",{class:"traffic-dot max",title:"Maximize",onclick:e("zoom")},i("span",{},"+")))}function Ii(){const e=o.ui.route,t=o.dashboard?.account?.data||{},n=o.dashboard?.config||{},s=t.name||t.slug||n.agent_slug||"agent";return i("aside",{class:"sidebar"},i("div",{class:"sidebar-header","data-tauri-drag-region":!0},Rt()),i("div",{class:"brand","data-tauri-drag-region":!0},X(22,o.tweaks.accent),i("span",{class:"brand-tag"},"v0.3.1")),i("nav",{class:"nav"},q("home","首页",g.home(15),e==="home"),q("connections","平台连接",g.plug(15),e==="connections"),q("relay","Agent 上架",g.bolt(15),e==="relay"),q("orders","订单",g.receipt(15),e==="orders"),q("logs","日志",g.terminal(15),e==="logs")),i("div",{class:"sidebar-spacer"}),Di(s))}function q(e,t,n,s,a){return i("button",{class:`nav-item ${s?"active":""}`,onclick:()=>{o.ui.route!==e&&(o.ui.route=e,u())}},i("span",{class:"nav-icon"},n),i("span",{class:"nav-label"},t),null)}function Di(e){return i("div",{class:"agent-card"},i("div",{class:"agent-row"},i("div",{class:"agent-avatar"},e.slice(0,2)),i("div",{class:"agent-info"},i("div",{class:"agent-name"},e),i("div",{class:"agent-status"},i("span",{class:"agent-status-dot"}),"active")),i("button",{class:"icon-button",title:"设置",onclick:()=>On()},g.cog(13))))}function zi(){const e=i("div",{class:"main-scroll cm-scroll"});switch(o.ui.route){case"home":e.append(Gi());break;case"connections":e.append(sn());break;case"relay":e.append(Vi());break;case"orders":e.append(bn());break;case"logs":e.append(en());break}return i("main",{class:"main"},i("div",{class:"titlebar","data-tauri-drag-region":!0}),e)}function $t(){const e=o.dashboard?.preflight;return!e||typeof e!="object"?null:e}function Oi(e){const t=$t();if(!t?.platforms)return null;const n=z[e.id]||e.id;return t.platforms[n]||null}function Ni(){if(!o.dashboard?.configured)return null;const e=o.dashboard?.extension||{};if(e.connected)return null;const t=!!e.installed;return i("div",{class:"card ext-offline-notice"},i("div",{class:"ext-offline-head"},i("span",{class:"ext-offline-icon"},g.power(15)),i("div",{class:"ext-offline-text"},i("div",{class:"ext-offline-title"},t?"Chrome / BNBot 插件未连接":"BNBot 插件未安装"),i("div",{class:"ext-offline-sub"},t?"当前接不到社交平台订单(reddit / 哔哩哔哩 / 知乎 / 微博 / 豆瓣 等)。打开 Chrome 并确保插件已启用即可恢复。":"社交平台订单需要 BNBot 浏览器插件。安装并登录对应站点后即可接单。"))),i("div",{class:"ext-offline-actions"},t?b("打开 Chrome",{size:"sm",leading:g.arrowOut(11),onClick:()=>{c("launch_chrome").catch(()=>{})}}):b("安装插件",{size:"sm",leading:g.arrowOut(11),onClick:()=>Y(e.installUrl||"https://chromewebstore.google.com/detail/bnbot/haammgigdkckogcgnbkigfleejpaiiln")})))}function Bi(){const e=o.dashboard?.taskService;if(e?.running&&e.phase==="probing")return i("div",{class:"card preflight-notice probing"},i("div",{class:"preflight-notice-head"},i("span",{class:"preflight-notice-icon"},i("span",{class:"pill-spinner"})),i("div",{class:"preflight-notice-text"},i("div",{class:"preflight-notice-title"},"接单服务已启动,正在检测平台登录态…"),i("div",{class:"preflight-notice-sub"},"首次检测约 1-2 分钟,完成后自动开始接单"))));const t=$t();if(!t?.platforms)return null;const n=Object.entries(t.platforms).filter(([,a])=>a.status==="failed"&&a.actionable!==!1);if(!n.length)return null;const s=n.length;return i("div",{class:"card preflight-notice"},i("div",{class:"preflight-notice-head"},i("span",{class:"preflight-notice-icon"},g.bolt(15)),i("div",{class:"preflight-notice-text"},i("div",{class:"preflight-notice-title"},s>0?`${s} 个平台暂不接单`:"部分平台待确认"),i("div",{class:"preflight-notice-sub"},"装好依赖或登录对应站点后,接单守护重启会自动恢复"))),i("div",{class:"preflight-issue-list"},...n.map(([a,l])=>Fi(a,l))))}function Fi(e,t){const n=t.status==="failed"?"err":"warn";return i("div",{class:"preflight-issue"},i("span",{class:`preflight-issue-dot tone-${n}`}),i("div",{class:"preflight-issue-body"},i("div",{class:"preflight-issue-name"},i("span",{},t.label||e),t.skills?i("span",{class:"preflight-issue-count"},`${t.skills} 技能已暂停`):null),t.reason?i("div",{class:"preflight-issue-reason"},t.reason):null,t.hint?i("div",{class:"preflight-issue-hint"},t.hint):null),t.loginUrl?b("去登录",{size:"sm",kind:"soft",leading:g.arrowOut(11),onClick:()=>{m("open_external",{url:t.loginUrl})}}):null)}function Wi(){return D?i("div",{class:"card update-notice"},i("div",{class:"update-notice-text"},i("div",{class:"update-notice-title"},`发现新版本 v${D.version}`),i("div",{class:"update-notice-sub"},"当前 v0.3.1,下载安装包后替换即可")),b("去下载",{size:"sm",kind:"solid",leading:g.arrowOut(11),onClick:()=>{m("open_external",{url:D.url})}})):null}function Gi(){const e=o.dashboard?.wallet||{},t=e.address||o.dashboard?.config?.wallet_address||"0x95a9C8C40d4f1A8e9E76b9d0c7B342D8aB9D4B",n=typeof e.balance=="number"?e.balance:o.ui.balance;o.ui.balance=n;const a=+(n*.62).toFixed(2),l=+(n-a).toFixed(2),r=t.slice(0,6)+"…"+t.slice(-4),d=o.dashboard?.extension||{},p=o.dashboard?.services||{};return!_&&!G&&(G=!0,be()),i("div",{class:"row-stack connections-stack"},Q("首页","账户、钱包、和本地服务的实时状态",i("div",{class:"page-actions"},b("刷新",{size:"sm",leading:g.refresh(13),onClick:E}),b("退出",{size:"sm",kind:"ghost",danger:!0,leading:g.power(13),onClick:Qt}))),Wi(),Ni(),i("div",{class:"row-hero"},ji(n,a,l,t,r),Ji(d)),i("div",{class:"row-services"},Xi(p),tn()))}let ge=null,pe=!1,$e="";async function he(){try{ge=await m("llm_detect")}catch{ge=null}u()}function Hi(e){return e==="codex"?"Codex":e==="chatgpt-web"?"ChatGPT 网页":e==="gemini"?"Gemini":e}async function lt(e,t,n){$e=e,u();try{if(t==="install")await m("llm_install",{cli:e});else if(t==="login"){const s=await m("llm_login",{cli:e});s?.message&&window.alert(s.message)}else await m("llm_upload",{cli:e,model:n})}catch(s){window.alert(`操作失败: ${s instanceof Error?s.message:String(s)}`)}finally{$e="",await he()}}async function qi(e,t){const n=y?.disabledClis??[],s=t?n.filter(a=>a!==e):[...new Set([...n,e])];y={...y??{},disabledClis:s},u();try{await m("llm_set_enabled",{cli:e,enabled:t})}catch(a){y={...y??{},disabledClis:n},u(),window.alert(`设置失败:${a instanceof Error?a.message:String(a)}`);return}be()}function Ui(e,t){const n=e.cli,s=$e===n,a=e.defaultModel||"",l=(y?.disabledClis??[]).includes(n),r=!!(e.installed&&e.loggedIn);let d,p,w=null;return e.installed?e.loggedIn?l?(p="off",d=S("已暂停","off")):t?(p="ok",d=S("接单中","ok")):(p="ok",d=S("已就绪","ok")):(p="warn",d=S("待登录","warn"),w=n==="chatgpt-web"?b("去登录",{size:"sm",kind:"soft",leading:g.arrowOut(11),onClick:()=>{m("open_external",{url:"https://chatgpt.com/"})}}):b(s?"登录中…":"登录",{size:"sm",kind:"soft",onClick:s?void 0:()=>{lt(n,"login")}})):(p="off",d=S("未安装","off"),w=b(s?"安装中…":"安装",{size:"sm",kind:"soft",onClick:s?void 0:()=>{lt(n,"install")}})),i("div",{class:`llm-provider-row${l?" is-disabled":""}`},i("span",{class:`llm-provider-dot tone-${l?"off":p}${p==="ok"&&t&&!l?" is-live":""}`}),i("div",{class:"llm-provider-info"},i("div",{class:"llm-provider-name"},Hi(n)),a?i("div",{class:"llm-provider-model"},a):null),i("div",{class:"llm-provider-side"},d,w,r?Pe(!l,R=>{qi(n,R)}):null))}let y=null,me=!1,_=null,G=!1;async function be(){try{_=await m("relay_earnings")}catch{_=null}u()}function Ae(e,t){return i("div",{class:"relay-earning-stat"},i("div",{class:"relay-earning-value"},e),i("div",{class:"relay-earning-label"},t))}async function We(){try{y=await m("relay_settings_get")}catch{y=null}u()}async function U(e){const t={...y??{},...e};y=t,u();try{await m("relay_settings_set",{settings:t})}catch(n){window.alert(`保存失败: ${n instanceof Error?n.message:String(n)}`)}await We(),await he()}function Pe(e,t){return i("button",{class:`relay-switch ${e?"on":"off"}`,onclick:()=>t(!e)},i("span",{class:"relay-switch-knob"}))}function Vi(){!y&&!me&&(me=!0,We()),!ge&&!pe&&(pe=!0,he()),!_&&!G&&(G=!0,be());const e=y??{concurrency:2,online:!1,scheduleEnabled:!1,scheduleStart:"22:00",scheduleEnd:"08:00"},t=ge?.providers??[],n=e.online===!0,s=e.scheduleEnabled===!0;return i("div",{class:"row-stack connections-stack"},Q("Agent 上架","让你的 Codex / Gemini,从今天开始赚钱",i("div",{class:"page-actions"})),Bi(),i("div",{class:"card relay-toggle-card"},i("div",{class:"relay-toggle-info"},i("div",{class:"relay-toggle-title"},n?"接单中 · 已上线":"未上线"),i("div",{class:"relay-toggle-sub"},n?"买家正在调用你上架的订阅算力":"打开开关,下方就绪的订阅一起上架接单")),Pe(n,a=>{U({online:a})})),t.length?i("div",{class:"card"},i("div",{class:"card-title"},"我的 Agent"),i("div",{class:"llm-provider-list"},...t.map(a=>Ui(a,n)))):null,_?.ok?i("div",{class:"card"},i("div",{class:"card-title"},"接单收益"),i("div",{class:"relay-earnings-grid"},Ae(`$${(_.totalEarned??0).toFixed(4)}`,"累计收益"),Ae(String(_.totalRequests??0),"累计调用"),Ae(`$${(_.dailySpent??0).toFixed(4)}`,"今日流水"))):null,i("div",{class:"card"},i("div",{class:"card-title"},"接单设置"),i("div",{class:"relay-setting-row"},i("div",{class:"relay-setting-label"},i("div",{},"最大并发请求数"),i("div",{class:"relay-setting-hint"},"同时处理几个请求 · 越高越容易触发风控,建议 2–5")),i("input",{type:"number",min:"1",max:"20",value:String(e.concurrency??2),class:"relay-number-input",onchange:a=>{U({concurrency:Number(a.target.value)||5})}})),i("div",{class:"relay-setting-row"},i("div",{class:"relay-setting-label"},i("div",{},"每天定时接单"),i("div",{class:"relay-setting-hint"},"只在时段内接单(如晚上 IP 空闲时),时段外自动暂停")),Pe(s,a=>{U({scheduleEnabled:a})})),s?i("div",{class:"relay-schedule-row"},i("input",{type:"time",value:String(e.scheduleStart??"22:00"),class:"relay-time-input",onchange:a=>{U({scheduleStart:a.target.value})}}),i("span",{class:"relay-schedule-dash"},"—"),i("input",{type:"time",value:String(e.scheduleEnd??"08:00"),class:"relay-time-input",onchange:a=>{U({scheduleEnd:a.target.value})}})):null))}function ji(e,t,n,s,a){const l=Be(),r=o.dashboard?.orderEarnings,d=r?.ok?J(r.pending,0):0,p=_?.ok?_.pending??0:0,w=+(d+p).toFixed(6),R=e+w;return i("div",{class:"card"},i("div",{class:"balance-head"},i("div",{class:"eyebrow"},"钱包总余额"),l.total>0?i("span",{class:"balance-delta"},g.arrowUp(12),` +$${l.total.toFixed(2)} / 7d`):null),i("div",{class:"balance-row"},i("div",{class:"balance-value"},`$${R.toFixed(2)}`),Jt(l.series,140,48,o.tweaks.accent)),i("div",{class:"chain-list"},rt("base","Base",t,a,s),rt("bsc","BNB Smart Chain",n,a,s),w>1e-4?Yi(w):null))}function Yi(e){return i("div",{class:"chain-row pending-row"},i("div",{class:"chain-glyph pending-glyph",html:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2"/></svg>'}),i("div",{class:"chain-info"},i("div",{class:"chain-name"},"待发送"),i("div",{class:"pending-note"},"已赚待结算 · 自动打款到钱包")),i("div",{class:"chain-balance"},`$${e.toFixed(2)}`))}function rt(e,t,n,s,a){const l=o.ui.copiedChain===e;return i("div",{class:"chain-row"},i("div",{class:"chain-glyph",html:e==="base"?'<svg width="14" height="14" viewBox="0 0 111 111"><path d="M54.921 110.034c30.412 0 55.07-24.66 55.07-55.067C109.991 24.56 85.333-.107 54.921-.107c-28.851 0-52.534 22.353-54.7 50.86h72.81v8.491H.22c2.166 28.51 25.85 50.787 54.7 50.787Z" fill="#0052FF"/></svg>':'<svg width="14" height="14" viewBox="0 0 126.61 126.61"><path fill="#F3BA2F" d="m38.73 53.2 24.59-24.58 24.6 24.6 14.3-14.31L63.32 0 24.42 38.9zM0 63.31l14.3-14.31 14.31 14.31-14.31 14.3zm38.73 10.11 24.59 24.59 24.6-24.6 14.31 14.29-38.9 38.91-38.91-38.88zM97.99 63.31l14.3-14.31 14.31 14.3-14.31 14.32zM77.83 63.3 63.32 48.78 52.59 59.51l-1.23 1.24-2.54 2.54 14.5 14.5z"/></svg>'}),i("div",{class:"chain-info"},i("div",{class:"chain-name"},t),i("button",{class:`chain-addr ${l?"copied":""}`,title:"点击复制地址",onclick:()=>Ki(e,a)},s,l?g.check(10):g.copy(10),l?i("span",{style:{fontSize:"9.5px",fontWeight:"600"}},"已复制"):null)),i("div",{class:"chain-balance"},`$${n.toFixed(2)}`))}function Ki(e,t){try{navigator.clipboard?.writeText(t)}catch{}o.ui.copiedChain=e,u(),setTimeout(()=>{o.ui.copiedChain=null,u()},1400)}function Ji(e){const t=!!e.connected,n=!!e.installed,s=t?"已连接":n?"未连接":"未安装",a=t?"ok":"warn";return i("div",{class:"card"},i("div",{class:"balance-head"},i("div",{class:"eyebrow"},"浏览器插件"),S(s,a)),t?(()=>{const l=String(e.detail||""),r=l.match(/\(v([\d.]+)\)/)?.[1]||null,d=l.match(/wss?:\/\/[^\s]+/)?.[0]||null;return i("div",{style:{marginTop:"2px"}},r?ct("插件版本",`v${r}`):null,d?ct("本地服务",d):null)})():null,t?null:i("div",{class:"plugin-line"},n?"插件已安装,等待与浏览器握手 …":"尚未安装 BNBot 浏览器插件。"),n?null:i("div",{class:"plugin-actions"},b("安装插件",{kind:"soft",size:"sm",leading:g.arrowOut(11),onClick:()=>Y(e.installUrl||"https://chromewebstore.google.com/")})))}function ct(e,t){return i("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",gap:"12px",padding:"9px 2px"}},i("span",{style:{fontSize:"13px",color:"var(--muted, #8b8b8b)"}},e),i("span",{style:{fontSize:"13px",fontFamily:"var(--mono, ui-monospace, monospace)",color:"var(--text, inherit)",textAlign:"right"}},t))}function Xi(e){const t=e.market||{},n=e.surf||{};return i("div",{class:"card"},i("div",{class:"balance-head",style:{alignItems:"baseline"}},i("div",{},i("div",{class:"card-title"},"本地服务"),i("div",{class:"card-subtitle"},"工作进程与 Surf 中继状态")),b("全部启动",{kind:"ghost",size:"sm",onClick:Yn})),i("div",{class:"service-list"},dt("Market Provider",Qi(t),t.running,()=>ut("market")),dt("Surf / Relay Service",Zi(n),n.running,()=>ut("surf"))))}function Qi(e){return e.running?`PID ${e.pid||"-"} · 正在接收服务调用`:"无进程 · 需要手动启动"}function Zi(e){return e.running?`PID ${e.pid||"-"} · 中继运行中`:"未启动 · Relay 离线"}function dt(e,t,n,s){return i("div",{class:"service-row"},i("div",{},i("div",{class:"service-head"},i("span",{class:`service-dot ${n?"running":""}`}),i("div",{class:"service-name"},e)),i("div",{class:"service-sub"},t)),i("div",{class:"service-actions"},S(n?"运行中":"已停止",n?"ok":"off"),b(n?"停止":"启动",{kind:n?"ghost":"soft",size:"sm",onClick:s})))}function en(){const e=o.dashboard?.providerLog||[],t=Pt(e),n=i("div",{class:"log-body cm-scroll","data-provider-log-body":"true",style:{flex:"1",maxHeight:"none"}},...It(t));return requestAnimationFrame(()=>{n.scrollTop=n.scrollHeight}),i("div",{class:"row-stack",style:{height:"100%"}},Q("Provider 日志","本地 Market Provider 实时输出",i("div",{class:"page-actions"},i("span",{class:"log-live-tag"},i("span",{class:"log-live-dot"}),"LIVE"),b("刷新",{size:"sm",leading:g.refresh(13),onClick:E}))),i("div",{class:"card flush",style:{flex:"1",display:"flex",flexDirection:"column",minHeight:"0"}},n))}function tn(){const e=we(),t=o.dashboard?.orderEarnings,n=t?.ok?J(t.count,ue().length):ue().length,s=C().filter(a=>a.status==="ready"&&!He(a)).reduce((a,l)=>a+(l.skills||0),0);return i("div",{class:"card"},i("div",{class:"log-card-head"},i("div",{},i("div",{class:"card-title"},"接单概况"),i("div",{class:"card-subtitle"},"在线接单平台与累计调用")),i("button",{class:"log-expand",title:"查看 Provider 日志",onclick:()=>{o.ui.route="logs",u()}},g.terminal(13))),i("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr 1fr",gap:"14px",padding:"12px 2px 4px"}},W("接单平台",String(e.ready)),W("服务数量",String(s)),W("调用次数",String(n))))}function Pt(e){return Array.isArray(e)&&e.length>0?e.map(t=>nn(String(t))):x()?[]:[...Fe]}function nn(e){const t=d=>/^(INFO|WARN|ERROR|DEBUG|TRACE)$/i.test(d),n=e.match(/(\d{2}:\d{2}:\d{2}(?:\.\d{3})?)/),s=n?n[1]:"",a=e.match(/\b(INFO|WARN|ERROR|DEBUG|TRACE)\b/i),l=a?a[1].toUpperCase():"INFO";let r=e.replace(/^\[[^\]]+\]\s*/,"").replace(/^\d{4}-\d{2}-\d{2}[T\s]\d{2}:\d{2}:\d{2}(\.\d+)?Z?\s*/,"").trim();return r=r.replace(/^\[(INFO|WARN|ERROR|DEBUG|TRACE)\]\s*/i,""),t(r.split(/\s/)[0]||"")&&(r=r.replace(/^\S+\s+/,"")),{t:s,lvl:l,msg:r||e}}function Ge(e){return i("div",{class:"log-line"},i("span",{class:"log-time"},e.t),i("span",{class:`log-level ${e.lvl}`},e.lvl),i("span",{class:`log-msg ${e.lvl}`},e.msg))}function It(e){return e.length===0?[i("div",{style:{padding:"22px 24px",color:"var(--text-muted)"}},"暂无 Provider 日志")]:e.map(Ge)}function sn(){const e=o.ui.connectionsFilter,t=o.ui.connectionsQuery.toLowerCase(),n=C().filter(a=>(e==="全部"||a.cat===e)&&(!t||a.name.toLowerCase().includes(t))),s=we();return i("div",{class:"row-stack"},Q("平台连接",an(s),i("div",{class:"page-actions"},Un(o.ui.connectionsQuery,a=>{o.ui.connectionsQuery=a,u()}))),i("div",{class:"category-chips cm-noscrollbar"},...ui.map(a=>{const l=a===e,r=C(),d=a==="全部"?r.length:r.filter(p=>p.cat===a).length;return i("button",{class:`chip ${l?"active":""}`,onclick:()=>{o.ui.connectionsFilter=a,u()}},a,i("span",{class:"chip-count"},String(d)))})),i("div",{class:`platform-grid ${o.tweaks.density==="compact"?"compact":""}`},...n.length===0?[i("div",{class:"empty-state"},"没有匹配的平台")]:n.map(ln)))}function Dt(e=we()){return[i("b",{style:{color:"var(--text)",fontWeight:"600"}},String(e.ready))," 就绪 · ",i("b",{style:{color:"var(--warn)",fontWeight:"600"}},String(e.needs))," 需登录"]}function an(e=we()){return i("span",{"data-connections-stats":!0},...Dt(e))}function on(){document.querySelectorAll("[data-connections-stats]").forEach(e=>{e.replaceChildren(...Dt())})}function we(){let e=0,t=0,n=0;const s=C();for(const a of s)St(a.id)?n++:He(a)||(a.status==="ready"?e++:(a.status==="login"||a.status==="needs")&&t++);return{ready:e,needs:t,updating:n,total:s.length}}function ln(e){return i("button",{class:"platform-card","data-platform-card":e.id,onclick:()=>{o.ui.modal={kind:"platform",id:e.id},u()}},ve(e,36),i("div",{class:"platform-info"},i("div",{class:"platform-row1"},i("div",{class:"platform-name"},e.name)),i("div",{class:"platform-row2"},i("span",{class:`mode-tag ${e.mode}`},Et[e.mode]),i("span",{title:"技能数",style:{flexShrink:"0",fontSize:"11px",fontWeight:"700",color:"var(--text-muted)",background:"var(--line)",borderRadius:"6px",padding:"1px 7px"}},String(O(e.id).length||e.skills)))),zt(e))}function He(e){const t=O(e.id);return t.length>0&&t.every(n=>n.is_active===!1)}function rn(e){if(St(e.id))return{label:"更新中",tone:"sync",syncing:!0};if(He(e))return{label:"已停用",tone:"off",syncing:!1};const t=Oi(e);return t?.status==="failed"?{label:t.reason||"依赖未就绪",tone:"err",syncing:!1}:t?.status==="unknown"?{label:t.reason||"待确认",tone:"warn",syncing:!1}:{label:xt[e.status],tone:Ot(e.status),syncing:!1}}function zt(e){const t=rn(e);return t.syncing?i("span",{class:`pill platform-status-pill tone-${t.tone} icon-only`,title:"后台同步中","data-platform-status":e.id},i("span",{class:"pill-spinner"})):i("span",{class:`platform-status-light tone-${t.tone}`,title:t.label,"aria-label":t.label,"data-platform-status":e.id},i("span",{class:"status-light-core"}))}function Ot(e){return e==="ready"?"ok":e==="login"||e==="needs"?"warn":e==="error"?"err":"off"}const cn={openai:"M22.282 9.821a6 6 0 0 0-.516-4.91a6.05 6.05 0 0 0-6.51-2.9A6.065 6.065 0 0 0 4.981 4.18a6 6 0 0 0-3.998 2.9a6.05 6.05 0 0 0 .743 7.097a5.98 5.98 0 0 0 .51 4.911a6.05 6.05 0 0 0 6.515 2.9A6 6 0 0 0 13.26 24a6.06 6.06 0 0 0 5.772-4.206a6 6 0 0 0 3.997-2.9a6.06 6.06 0 0 0-.747-7.073M13.26 22.43a4.48 4.48 0 0 1-2.876-1.04l.141-.081l4.779-2.758a.8.8 0 0 0 .392-.681v-6.737l2.02 1.168a.07.07 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.494 4.494M3.6 18.304a4.47 4.47 0 0 1-.535-3.014l.142.085l4.783 2.759a.77.77 0 0 0 .78 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-1.646M2.34 7.896a4.5 4.5 0 0 1 2.366-1.973V11.6a.77.77 0 0 0 .388.677l5.815 3.354l-2.02 1.168a.08.08 0 0 1-.071 0l-4.83-2.786A4.504 4.504 0 0 1 2.34 7.872zm16.597 3.855l-5.833-3.387L15.119 7.2a.08.08 0 0 1 .071 0l4.83 2.791a4.494 4.494 0 0 1-.676 8.105v-5.678a.79.79 0 0 0-.407-.667m2.01-3.023l-.141-.085l-4.774-2.782a.78.78 0 0 0-.785 0L9.409 9.23V6.897a.07.07 0 0 1 .028-.061l4.83-2.787a4.5 4.5 0 0 1 6.68 4.66zm-12.64 4.135l-2.02-1.164a.08.08 0 0 1-.038-.057V6.075a4.5 4.5 0 0 1 7.375-3.453l-.142.08L8.704 5.46a.8.8 0 0 0-.393.681zm1.097-2.365l2.602-1.5l2.607 1.5v2.999l-2.597 1.5l-2.607-1.5Z",googlegemini:"M11.04 19.32Q12 21.51 12 24q0-2.49.93-4.68.96-2.19 2.58-3.81t3.81-2.55Q21.51 12 24 12q-2.49 0-4.68-.93a12.3 12.3 0 0 1-3.81-2.58 12.3 12.3 0 0 1-2.58-3.81Q12 2.49 12 0q0 2.49-.96 4.68-.93 2.19-2.55 3.81a12.3 12.3 0 0 1-3.81 2.58Q2.49 12 0 12q2.49 0 4.68.96 2.19.93 3.81 2.55t2.55 3.81",google:"M12.48 10.92v3.28h7.84c-.24 1.84-.853 3.187-1.787 4.133c-1.147 1.147-2.933 2.4-6.053 2.4c-4.827 0-8.6-3.893-8.6-8.72s3.773-8.72 8.6-8.72c2.6 0 4.507 1.027 5.907 2.347l2.307-2.307C18.747 1.44 16.133 0 12.48 0C5.867 0 .307 5.387.307 12s5.56 12 12.173 12c3.573 0 6.267-1.173 8.373-3.36c2.16-2.16 2.84-5.213 2.84-7.667c0-.76-.053-1.467-.173-2.053z"};function ve(e,t=36){const n=i("div",{class:`platform-glyph${t===22?" size-sm":t>=52?" size-lg":""}`,style:{background:e.brand,fontSize:`${Math.round(t*.42)}px`}}),s=e.slug?cn[e.slug]:void 0;if(s)n.innerHTML=`<svg viewBox="0 0 24 24" role="img" aria-label="${e.name}"><path d="${s}"/></svg>`;else if(e.slug){const a=document.createElement("img");a.src=`https://api.iconify.design/simple-icons:${e.slug}.svg?color=white`,a.alt=e.name,a.referrerPolicy="no-referrer",a.addEventListener("error",()=>{a.replaceWith(document.createTextNode(e.mark))}),n.append(a)}else n.append(document.createTextNode(e.mark));return n}function Nt(e){return e?"● 已启用":"○ 已停用"}function dn(e){const t=e.is_active!==!1;return i("div",{class:"platform-skill-row"},i("div",{class:"platform-skill-copy"},i("span",{class:"platform-skill-name"},e.skill_name),e.description?i("span",{class:"platform-skill-desc"},e.description):null),i("span",{class:`platform-skill-status ${t?"on":""}`,"data-skill-status":!0},Nt(t)))}function Bt(e){return e?"点击停用整个平台":"点击启用整个平台"}function un(e){const t=O(e.id),n=t.length>0&&t.every(s=>s.is_active!==!1);return i("button",{class:`platform-toggle ${n?"on":""}`,type:"button",title:Bt(n),"aria-pressed":String(n),"data-platform-toggle":e.id,onclick:s=>{s.stopPropagation();const a=O(e.id);a.length&&fn(e,!a.every(l=>l.is_active!==!1))}},i("span",{class:"platform-toggle-thumb"}))}function qe(e){const t=C().find(n=>n.id===e);t&&(document.querySelectorAll("[data-platform-card]").forEach(n=>{if(n.dataset.platformCard!==e)return;const s=n.querySelector("[data-platform-status]");s&&s.replaceWith(zt(t))}),on())}function gn(e){const t=document.querySelector(".platform-modal .platform-caps");if(!t)return!1;const n=t.dataset.platformId||"",s=t.querySelector("[data-platform-toggle]");return s&&(s.classList.toggle("on",e),s.setAttribute("aria-pressed",String(e)),s.title=Bt(e)),t.querySelectorAll("[data-skill-status]").forEach(a=>{a.classList.toggle("on",e),a.textContent=Nt(e)}),n&&qe(n),!!s}function pn(e){if(document.hidden){window.setTimeout(e,0);return}window.requestAnimationFrame(()=>window.setTimeout(e,0))}function mn(e,t,n){const s=T.get(e);!s||s.active!==n||(s.syncTimer!=null&&window.clearTimeout(s.syncTimer),s.syncTimer=window.setTimeout(()=>{const a=T.get(e);if(!a||a.active!==n)return;const l=t.map(r=>({id:r.id,skill_name:r.skill_name,category:r.category,description:r.description??null,price:r.price??0}));c("set_skills_active",{skills:l,active:n}).then(r=>{if(r?.ok===!1){L(e),le();return}L(e),ze(),window.setTimeout(()=>{ze()},1500),window.setTimeout(()=>{le()},r?.queued?5e3:900)}).catch(()=>{L(e),le()})},120))}function fn(e,t){const n=O(e.id);if(n.length){if(bi(e.id,t),n.forEach(s=>{s.is_active=t}),fi(e.id,n),gn(t)||Ft(),!x()){window.setTimeout(()=>L(e.id),700);return}pn(()=>mn(e.id,n,t))}}function Ft(){const e=o.ui.modal;if(e?.kind!=="platform")return;const t=C().find(s=>s.id===e.id),n=document.querySelector(".platform-modal .platform-caps");t&&n&&n.replaceWith(Wt(t))}function Wt(e){const t=O(e.id);return t.length===0?i("div",{class:"platform-caps","data-platform-id":e.id},i("div",{class:"caps-label"},`能力 (${e.caps.length})`),i("div",{class:"caps-list"},...e.caps.map(n=>i("span",{class:"cap-tag"},i("span",{class:"cap-icon"},g.bolt(11,o.tweaks.accent)),n)))):i("div",{class:"platform-caps","data-platform-id":e.id},i("div",{class:"caps-label",style:{display:"flex",alignItems:"center",justifyContent:"space-between"}},i("span",{},`能力 (${t.length})`),un(e)),i("div",{class:"cm-scroll",style:{maxHeight:"min(340px, 40vh)",overflowY:"auto",marginRight:"-6px",paddingRight:"6px"}},...t.map(dn)))}function hn(e){const t=C().find(l=>l.id===e);if(!t)return i("div",{});const n=t.mode==="browser",s=Ot(t.status),a=n?t.status==="login"?"需要在浏览器中完成登录。登录后可执行所有技能。":"该平台通过本地 BNBot 桥接到你已登录的浏览器会话调用。":"该平台走公开 API 调用,无需登录即可使用所有技能。";return i("div",{class:"modal-backdrop",onclick:K},i("div",{class:"platform-modal",onclick:l=>l.stopPropagation(),style:{background:"var(--surface)"}},i("div",{class:"platform-modal-head"},ve(t,52),i("div",{class:"platform-modal-info"},i("div",{class:"platform-modal-cat"},t.cat),i("div",{class:"platform-modal-title"},t.name),i("div",{class:"platform-modal-meta"},S(xt[t.status],s),i("span",{class:`mode-tag ${t.mode}`},Et[t.mode]),i("span",{class:"platform-modal-skills"},`${O(t.id).length||t.skills} 个技能`))),i("button",{class:"modal-close-btn",onclick:K},g.close(14))),i("div",{class:"platform-modal-desc"},a),Wt(t)))}function bn(){const e=ue(),t=_i(),n=e.filter(ye=>ye.status==="completed"),s=J(o.dashboard?.history?.orderCount,e.length),a=Be(),l=a.series[a.series.length-1],r=a.total,d=a.series[a.series.length-2]??0,p=d>0?Math.round((l-d)/d*100):null,w=s||e.length,R=w===0?0:Math.round(n.length/w*100),Z=o.ui.ordersTab;return i("div",{class:"row-stack"},Q("订单与收益","服务调用记录、付费托管任务、收益结算",i("div",{class:"page-actions"},b("刷新",{size:"sm",leading:g.refresh(12),onClick:E}))),i("div",{class:"stats-strip"},W("今日收益",`$${l.toFixed(2)}`,p===null?void 0:`${p>=0?"+":""}${p}%`,p!==null&&p>=0?"ok":void 0),wn("近 7 日",`$${r.toFixed(2)}`,a.series),W("调用次数",String(w)),W("成功率",`${R}%`,"目标 ≥ 98%")),i("div",{class:"row-orders-mid"},vn(),yn(t)),kn(Z,e,s||e.length))}function W(e,t,n,s){return i("div",{class:"stat-card"},i("div",{class:"eyebrow"},e),i("div",{class:"stat-row"},i("div",{class:"stat-value"},t)),n?i("div",{class:`stat-delta ${s==="ok"?"tone-ok":""}`},n):null)}function wn(e,t,n){return i("div",{class:"stat-card"},i("div",{class:"eyebrow"},e),i("div",{class:"stat-row"},i("div",{class:"stat-value"},t),Jt(n,70,28,o.tweaks.accent)))}function vn(){const e=Be().series,t=vi(),n=Math.max(...e)*1.15||1,s=160,a=i("div",{class:"bar-chart"});return[.25,.5,.75,1].forEach(l=>{a.append(i("div",{class:"bar-grid",style:{bottom:`${l*s}px`}}))}),e.forEach((l,r)=>{const d=r===e.length-1,p=l/n,w=i("div",{class:"bar-col"},i("div",{class:`bar ${d?"is-last":""}`,style:{height:`${p*100}%`},title:`$${l.toFixed(2)}`},d?i("div",{class:"bar-tip"},`$${l.toFixed(2)}`):null));a.append(w)}),i("div",{class:"card"},i("div",{class:"balance-head",style:{alignItems:"baseline"}},i("div",{},i("div",{class:"card-title"},"近 7 日收益"),i("div",{class:"card-subtitle"},`截止 ${Mt(Date.now())} · USDT`)),b("月视图",{kind:"ghost",size:"sm"})),i("div",{class:"chart-container"},a,i("div",{class:"bar-labels"},...t.map((l,r)=>i("div",{class:`bar-label ${r===t.length-1?"is-last":""}`},l)))))}function yn(e){return i("div",{class:"card"},i("div",{class:"balance-head",style:{alignItems:"baseline"}},i("div",{},i("div",{class:"card-title"},"托管任务"),i("div",{class:"card-subtitle"},"已分配的付费长任务")),S(`${e.length} 进行中`,"warn")),i("div",{class:"escrow-list"},...e.length===0?[i("div",{style:{padding:"20px 2px",color:"var(--text-muted)"}},"暂无托管任务")]:e.map(t=>{const n=C().find(s=>s.id===t.platform);return i("div",{class:"escrow-row"},n?ve(n,36):null,i("div",{class:"escrow-info"},i("div",{class:"escrow-skill"},t.skill),i("div",{class:"escrow-meta"},`${n?.name||""} · 截止 ${t.deadline}`)),i("div",{class:"escrow-amount"},i("div",{class:"escrow-reward"},`$${t.reward.toFixed(2)}`),i("div",{class:"escrow-status"},t.status==="in-progress"?"执行中":"排队中")))})))}function kn(e,t,n=t.length){const s=t.filter(d=>d.status==="failed").length,a=t.filter(d=>d.status==="pending").length,l=[{id:"recent",label:"全部订单",n},{id:"failed",label:"失败",n:s},{id:"pending",label:"排队",n:a}],r=e==="failed"?t.filter(d=>d.status==="failed"):e==="pending"?t.filter(d=>d.status==="pending"):t;return i("div",{class:"card flush"},i("div",{class:"orders-toolbar"},i("div",{class:"tab-group"},...l.map(d=>i("button",{class:`tab ${d.id===e?"active":""}`,onclick:()=>{o.ui.ordersTab=d.id,u()}},d.label,i("span",{class:"tab-count"},String(d.n))))),i("div",{class:"tz-stamp"},"UTC+08:00 · today")),i("div",{class:"orders-grid-head"},i("div",{},"时间"),i("div",{},"平台"),i("div",{},"技能"),i("div",{},"状态"),i("div",{class:"right"},"时长"),i("div",{class:"right"},"金额")),i("div",{class:"orders-grid-body cm-scroll"},...r.length===0?[i("div",{style:{padding:"32px 20px",color:"var(--text-muted)"}},"暂无订单")]:r.map(_n)))}function _n(e){const t=C().find(n=>n.id===e.platform);return i("div",{class:"orders-row"},i("div",{class:"time"},e.t),i("div",{class:"platform-cell"},t?ve(t,22):null,i("span",{},t?.name||e.platform)),i("div",{},e.skill),i("div",{},S(e.status==="completed"?"已完成":e.status==="pending"?"排队中":"失败",e.status==="completed"?"ok":e.status==="pending"?"warn":"err")),i("div",{class:"dur right"},e.dur),i("div",{class:`amount right ${e.amount===0?"zero":""}`},Ti(e.amount)))}function Sn(){const e=Mi[o.ui.loginLang];return i("div",{class:"login-screen"},i("div",{class:"login-grid"}),i("div",{class:"login-container"},i("div",{class:"login-brand"},X(36,o.tweaks.accent),i("div",{},i("div",{class:"login-brand-name"},"ClawMoney"),i("div",{class:"login-brand-tag"},e.tagline))),i("div",{class:"login-card"},xn(e)),i("div",{class:"login-footer"},i("div",{class:"login-footer-links"},i("a",{onclick:()=>Y("https://clawmoney.ai/terms")},e.fTerms),i("a",{onclick:()=>Y("https://clawmoney.ai/privacy")},e.fPrivacy),i("a",{onclick:()=>Y("https://github.com/clawmoney")},e.fSource)),Cn())))}function Cn(){return i("div",{class:"lang-toggle-segment"},...["zh","en"].map(e=>i("button",{class:`lang-toggle-option ${o.ui.loginLang===e?"active":""}`,onclick:()=>{o.ui.loginLang=e,u()}},e==="zh"?"中文":"EN")))}function xn(e){switch(o.ui.loginStep){case"choose":return En(e);case"google":return An(e);case"email":return Tn(e);case"emailCode":return Mn(e)}}function En(e){return i("div",{class:"login-pad"},i("div",{class:"login-title"},e.welcome),i("div",{class:"login-sub"},e.subtitle),i("button",{class:"login-btn-google",onclick:In},Lt(18),i("span",{},e.google)),i("div",{class:"login-divider"},i("div",{class:"line"}),i("span",{class:"label"},e.or),i("div",{class:"line"})),i("button",{class:"login-btn-email",onclick:()=>{o.ui.loginStep="email",o.ui.loginError=null,u()}},i("span",{style:{display:"inline-flex",color:"var(--text-muted)"}},g.mail(16)),e.email),o.ui.loginError?i("div",{class:"login-error"},o.ui.loginError):null,i("div",{class:"login-terms"},e.terms))}function An(e){const t=o.ui.googleState,n={idle:"",redirecting:e.gRedirect,granting:e.gGrant,success:e.gSuccess},s={idle:"",redirecting:e.gRedirectSub,granting:e.gGrantSub,success:e.gSuccessSub},a=t==="success",l=i("div",{class:"google-avatar"},i("div",{class:`google-avatar-bg ${a?"success":""}`}),a?null:i("div",{class:"google-avatar-ring"}),i("div",{class:"google-avatar-icon"},a?X(38,"#fff"):Lt(32)));return i("div",{class:"login-google-state"},l,i("div",{class:"google-state-title"},n[t]),i("div",{class:"google-state-sub"},s[t]),t==="redirecting"?i("div",{class:"google-state-domain"},"accounts.google.com"):null,a?i("button",{class:"google-continue-btn",onclick:Ht},e.continueCta):null,a?null:i("button",{class:"login-back",style:{marginTop:"22px"},onclick:()=>{A.forEach(r=>window.clearTimeout(r)),A=[],o.ui.loginStep="choose",o.ui.googleState="idle",u()}},"← ",e.backLink))}function Tn(e){return i("form",{class:"login-pad",onsubmit:t=>{t.preventDefault(),Dn()}},i("button",{type:"button",class:"login-back",onclick:()=>{o.ui.loginStep="choose",u()}},"← ",e.backLink),i("div",{class:"login-title"},e.emailTitle),i("div",{class:"login-sub"},e.emailSub),i("label",{class:"login-label"},e.emailLabel),i("input",{type:"email",class:"login-input",placeholder:"you@example.com",value:o.ui.loginEmail,autofocus:!0,required:!0,oninput:t=>{o.ui.loginEmail=t.target.value}}),o.ui.loginError?i("div",{class:"login-error"},o.ui.loginError):null,i("button",{type:"submit",class:"login-submit"},e.emailCta))}function Mn(e){const t=o.ui.loginCodeError,n=o.ui.loginCodeVerifying,s=Array.from({length:6}).map((a,l)=>{const r=document.createElement("input");return r.className=`login-code-input ${t?"error":""}`,r.inputMode="numeric",r.maxLength=1,r.value=o.ui.loginCode[l]||"",r.disabled=n,l===0&&(r.autofocus=!0),r.addEventListener("input",d=>Rn(l,d.target.value)),r.addEventListener("keydown",d=>$n(l,d)),l===0&&r.addEventListener("paste",Pn),r});return setTimeout(()=>{const a=o.ui.loginCode.length;s[Math.min(a,5)]?.focus()},30),i("div",{class:"login-pad"},i("button",{type:"button",class:"login-back",onclick:()=>{o.ui.loginStep="email",o.ui.loginCodeError=!1,o.ui.loginCode="",u()}},"← ",e.backLink),i("div",{class:"login-title"},e.codeTitle),i("div",{class:"login-sub"},e.codeSubPre,i("b",{style:{color:"var(--text)",fontWeight:"600"}},o.ui.loginEmail),"。",e.codeSubPost),i("div",{class:"login-code-row"},...s),Ln(e),i("div",{class:"login-code-footer"},o.ui.loginCodeResendIn>0?i("span",{},e.codeResendIn(o.ui.loginCodeResendIn)):i("button",{class:"login-code-resend",onclick:()=>{o.ui.loginCodeResendIn=45,Gt(),zn(),u()}},e.codeResend),i("button",{style:{all:"unset",cursor:"pointer",color:"var(--text-muted)"},onclick:()=>{o.ui.loginStep="email",o.ui.loginCodeError=!1,o.ui.loginCode="",u()}},e.codeChange)))}function Ln(e){return o.ui.loginCodeVerifying?i("div",{class:"login-code-status muted"},i("span",{class:"login-spinner"}),e.codeVerifying):o.ui.loginCodeError?i("div",{class:"login-code-status error"},e.codeError):i("div",{class:"login-code-status"})}function Rn(e,t){o.ui.loginCodeError&&(o.ui.loginCodeError=!1);const n=t.replace(/\D/g,"").slice(0,1),s=o.ui.loginCode.split("");s[e]=n,o.ui.loginCode=s.slice(0,6).join(""),u(),n&&e<5&&setTimeout(()=>{document.querySelectorAll(".login-code-input")[e+1]?.focus()},20),o.ui.loginCode.length===6&&!o.ui.loginCodeVerifying&&qt(o.ui.loginCode)}function $n(e,t){const n=document.querySelectorAll(".login-code-input");t.key==="Backspace"&&!o.ui.loginCode[e]&&e>0&&n[e-1]?.focus(),t.key==="ArrowLeft"&&e>0&&n[e-1]?.focus(),t.key==="ArrowRight"&&e<5&&n[e+1]?.focus()}function Pn(e){const n=(e.clipboardData?.getData("text")||"").replace(/\D/g,"").slice(0,6);n&&(e.preventDefault(),o.ui.loginCode=n,u(),n.length===6&&qt(n))}function Gt(){B!=null&&window.clearInterval(B),B=window.setInterval(()=>{o.ui.loginCodeResendIn=Math.max(0,o.ui.loginCodeResendIn-1),o.ui.loginCodeResendIn===0&&B!=null&&(window.clearInterval(B),B=null),u()},1e3)}async function In(){if(A.forEach(e=>window.clearTimeout(e)),A=[],o.ui.loginStep="google",o.ui.googleState="redirecting",o.ui.loginError=null,u(),x()){const e=await m("start_google_login");if(!e.ok){o.ui.googleState="idle",o.ui.loginStep="choose",o.ui.loginError=Ue(e)||"Could not open Google login.",u();return}o.ui.googleState="success",u(),await E(),o.ui.loginStep="choose",o.ui.googleState="idle",u();return}m("start_google_login"),A.push(window.setTimeout(()=>{o.ui.googleState="granting",u()},700)),A.push(window.setTimeout(()=>{o.ui.googleState="success",u()},1600)),A.push(window.setTimeout(Ht,2200))}async function Ht(){A.forEach(e=>window.clearTimeout(e)),A=[],await E(),o.ui.loginStep="choose",o.ui.googleState="idle",o.ui.loginError=null,u()}async function Dn(){if(!o.ui.loginEmail)return;o.ui.loginError=null;const e=await m("start_email_login",{email:o.ui.loginEmail});if(!e.ok){o.ui.loginError=Ue(e)||"Could not send verification code.",u();return}o.ui.loginStep="emailCode",o.ui.loginCode="",o.ui.loginCodeError=!1,o.ui.loginCodeResendIn=45,Gt(),u()}async function qt(e){o.ui.loginCodeVerifying=!0,o.ui.loginError=null,u();const t=await m("verify_email_login",{email:o.ui.loginEmail,code:e});t.ok?(await E(),o.ui.loginStep="choose",o.ui.loginCode="",o.ui.loginCodeError=!1):(o.ui.loginCodeError=!0,o.ui.loginCode="",o.ui.loginError=Ue(t)),o.ui.loginCodeVerifying=!1,u()}async function zn(){o.ui.loginEmail&&await m("start_email_login",{email:o.ui.loginEmail})}function Ue(e){if(!e)return"";const t=e.error??e.detail;if(!t)return"";if(typeof t=="string")return t;if(typeof t=="object"){const n=t.message??t.detail??t.error;if(typeof n=="string")return n;try{return JSON.stringify(t)}catch{return String(t)}}return String(t)}function x(){return!!window.__TAURI_INTERNALS__}function On(){o.ui.modal={kind:"settings",section:"app"},u()}const Ie=[{id:"app",label:"应用",icon:()=>g.home(14)},{id:"about",label:"关于",icon:()=>g.spark(14)}];function Ut(e){switch(e){case"app":return Fn();case"about":return Gn()}}function Nn(e){if(o.ui.modal?.kind!=="settings")return;o.ui.modal.section=e,document.querySelectorAll(".settings-nav").forEach(a=>{a.classList.toggle("active",a.dataset.section===e)});const t=document.querySelector(".settings-content-title");t&&(t.textContent=Ie.find(a=>a.id===e)?.label||"");const n=document.querySelector(".settings-content");if(!n)return;const s=n.querySelector(".settings-content-head");for(;n.lastChild&&n.lastChild!==s;)n.removeChild(n.lastChild);n.append(Ut(e))}function Bn(e){return i("div",{class:"modal-backdrop",onclick:K},i("div",{class:"settings-modal",onclick:t=>t.stopPropagation()},i("div",{class:"settings-sidebar"},i("div",{class:"settings-sidebar-title"},"设置"),...Ie.map(t=>i("button",{class:`settings-nav ${t.id===e?"active":""}`,"data-section":t.id,onclick:()=>Nn(t.id)},i("span",{class:"settings-nav-icon"},t.icon()),t.label)),i("div",{style:{flex:"1"}}),i("button",{class:"settings-logout",onclick:Qt},g.power(13,"var(--err)")," 退出登录")),i("div",{class:"settings-content cm-scroll"},i("div",{class:"settings-content-head"},i("div",{class:"settings-content-title"},Ie.find(t=>t.id===e)?.label||""),i("button",{class:"modal-close-btn",onclick:K},g.close(14))),Ut(e))))}function Fn(){return i("div",{},$("语言","登录页支持中英文 · 主界面目前仅中文",i("select",{class:"set-select",onchange:e=>{const t=e.target.value;o.locale=t,o.ui.loginLang=t,localStorage.setItem("clawmoney.locale",t),u()}},i("option",{value:"zh",selected:o.locale==="zh"},"简体中文"),i("option",{value:"en",selected:o.locale==="en"},"English"))),$("外观","明亮 / 深色",i("select",{class:"set-select",onchange:e=>{o.tweaks.dark=e.target.value==="dark",Ri(),u()}},i("option",{value:"light",selected:!o.tweaks.dark},"明亮"),i("option",{value:"dark",selected:o.tweaks.dark},"深色"))),$("开机自启","系统启动时自动打开 ClawMoney",se(!0,()=>{})),$("保持不休眠","防止系统休眠中断接单(不影响显示器)",se(!!o.dashboard?.config?.keep_awake,e=>{c("set_keep_awake",{enabled:e}).then(()=>{o.dashboard?.config&&(o.dashboard.config.keep_awake=e),ze(),u()}).catch(()=>{})})),$("自动更新","在后台静默下载新版本",se(!0,()=>{})),$("数据目录","日志、缓存、配置存放位置",i("code",{class:"set-code",style:{fontSize:"11.5px"}},o.dashboard?.configPath||"~/.clawmoney")),$("发送匿名诊断","帮助我们改进稳定性",se(!1,()=>{})))}let ne=!1;function Wn(){const e=[];for(const t of li.split(`
|
|
67
|
+
`))t.startsWith("## ")?e.push(i("div",{class:"cl-version"},t.slice(3))):t.startsWith("### ")?e.push(i("div",{class:"cl-section"},t.slice(4))):t.startsWith("- ")&&t.length>2&&e.push(i("div",{class:"cl-item"},t.slice(2)));return e}function Gn(){const e=P==="checking"?b("检查中…",{size:"sm",kind:"ghost"}):D?b(`下载 v${D.version}`,{size:"sm",kind:"solid",leading:g.arrowOut(11),onClick:()=>{m("open_external",{url:D.url})}}):b(P==="latest"?"已是最新版本":"检查更新",{size:"sm",kind:"ghost",onClick:()=>{bt(!0)}});return i("div",{class:"about-block"},i("div",{style:{display:"inline-flex"}},X(56,o.tweaks.accent)),i("div",{class:"about-name"},"ClawMoney"),i("div",{class:"about-version"},"v0.3.1 · macOS Universal"),i("div",{class:"about-copy"},"© 2026 ClawMoney.AI",i("br",{}),"Open source soon."),i("div",{class:"about-actions"},e,b(ne?"收起更新日志":"查看更新日志",{size:"sm",kind:"ghost",onClick:()=>{ne=!ne,u()}})),ne?i("div",{class:"about-changelog cm-scroll"},...Wn()):null)}function $(e,t,n){return i("div",{class:"set-row"},i("div",{class:"label-wrap"},i("div",{class:"label"},e),i("div",{class:"sub"},t)),i("div",{style:{flexShrink:"0"}},n))}function se(e,t){return i("button",{class:`set-toggle ${e?"on":""}`,onclick:()=>t(!e)})}function Vt(){return Pt(o.dashboard?.providerLog)}function Ve(){const e=Vt();document.querySelectorAll("[data-provider-log-body]").forEach(t=>{const n=t.scrollHeight-t.scrollTop-t.clientHeight<48;t.replaceChildren(...It(e)),n&&(t.scrollTop=t.scrollHeight)})}function Hn(){f.timer!=null&&window.clearInterval(f.timer),f.timer=null}function qn(){const e=jt(),t=Yt(),n=f.paused;return i("div",{class:"modal-backdrop",style:{background:o.tweaks.dark?"rgba(8,8,9,0.6)":"rgba(20,18,14,0.4)",backdropFilter:"blur(10px)"},onclick:De},i("div",{class:"log-modal",onclick:s=>s.stopPropagation()},i("div",{class:"log-modal-head"},i("div",{class:"log-modal-title-tag"},i("span",{class:`log-modal-live ${n?"paused":""}`}),i("div",{class:"log-modal-title"},"Provider 日志"),i("span",{class:"log-modal-counts"},Kt(e.length,f.logs.length,n))),i("div",{class:"log-modal-spacer"}),i("div",{class:"log-modal-search"},i("span",{style:{display:"inline-flex"}},g.search(12,"rgba(255,255,255,0.5)")),i("input",{placeholder:"搜索日志…",value:f.query,oninput:s=>{f.query=s.target.value,u()}}),f.query?i("button",{style:{all:"unset",cursor:"pointer",color:"rgba(255,255,255,0.5)",display:"inline-flex"},onclick:()=>{f.query="",u()}},g.close(11)):null),i("div",{class:"log-modal-filters"},...["all","INFO","WARN","ERROR","DEBUG"].map(s=>i("button",{class:`log-modal-filter ${s} ${s===f.filter?"active":""}`,onclick:()=>{f.filter=s,u()}},s==="all"?"全部":s,s!=="all"?i("span",{class:"log-modal-filter-count","data-log-count":s},String(t[s]||0)):null))),i("div",{class:"log-modal-actions"},i("button",{class:"log-modal-iconbtn",title:n?"继续":"暂停",onclick:()=>{f.paused=!f.paused,u()}},n?g.play(12):g.pause(12)),i("button",{class:"log-modal-iconbtn",title:"下载"},g.download(12)),i("button",{class:"log-modal-iconbtn",title:"清空",onclick:()=>{f.logs=[],u()}},g.trash(12)),i("button",{class:"log-modal-iconbtn",title:"关闭",onclick:De,style:{marginLeft:"4px"}},g.close(13)))),i("div",{class:"log-modal-body cm-scroll"},...e.length===0?[i("div",{class:"log-modal-empty"},"没有匹配的日志行")]:e.map(Ge)),i("div",{class:"log-modal-foot"},i("div",{},"tail · 自动滚动到底部"),i("div",{},"~/.clawmoney/provider.log"))))}function jt(){const e=f.query.toLowerCase();return f.logs.filter(t=>(f.filter==="all"||t.lvl===f.filter)&&(!e||t.msg.toLowerCase().includes(e)))}function Yt(){return f.logs.reduce((e,t)=>(e[t.lvl]=(e[t.lvl]||0)+1,e),{})}function Kt(e,t,n){return`· ${e}/${t} 行 ${n?"· 已暂停":""}`}function je(){const e=document.querySelector(".log-modal-body");if(!e)return;const t=jt(),n=e.scrollHeight-e.scrollTop-e.clientHeight<48;e.replaceChildren(...t.length===0?[i("div",{class:"log-modal-empty"},"没有匹配的日志行")]:t.map(Ge)),n&&(e.scrollTop=e.scrollHeight);const s=document.querySelector(".log-modal-counts");s&&(s.textContent=Kt(t.length,f.logs.length,f.paused));const a=document.querySelector(".log-modal-live");a&&a.classList.toggle("paused",f.paused);const l=Yt();document.querySelectorAll("[data-log-count]").forEach(r=>{const d=r.getAttribute("data-log-count")||"";r.textContent=String(l[d]||0)})}function De(){Hn(),o.ui.modal?.kind==="log"&&(o.ui.modal=null,u())}function Q(e,t,n){return i("div",{class:"page-header"},i("div",{},i("h1",{class:"page-title"},e),i("div",{class:"page-subtitle"},(t instanceof Node,t))),n)}function S(e,t="off"){return i("span",{class:`pill tone-${t}`},i("span",{class:"pill-dot"}),e)}function b(e,t={}){const n=["btn"];return t.size&&t.size!=="md"&&n.push(`size-${t.size}`),n.push(`kind-${t.kind||"ghost"}`),t.danger&&n.push("danger"),i("button",{class:n.join(" "),onclick:t.onClick},t.leading,e)}function Un(e,t){return i("div",{class:"search-box"},i("span",{class:"icon-search"},g.search(13)),i("input",{placeholder:"搜索平台...",value:e,oninput:n=>t(n.target.value)}),e?i("button",{class:"icon-clear",onclick:()=>t("")},g.close(12)):null)}function Jt(e,t,n,s,a=.18,l=1.6){const r=Math.min(...e),d=Math.max(...e),p=2,w=e.map((ee,ke)=>p+ke*(t-2*p)/(e.length-1)),R=e.map(ee=>p+(1-(ee-r)/(d-r||1))*(n-2*p)),Z=w.map((ee,ke)=>`${ee.toFixed(1)},${R[ke].toFixed(1)}`).join(" "),ye=`M${w[0]},${n} L ${Z} L ${w[w.length-1]},${n} Z`,H=document.createElementNS("http://www.w3.org/2000/svg","svg");return H.setAttribute("width",String(t)),H.setAttribute("height",String(n)),H.setAttribute("viewBox",`0 0 ${t} ${n}`),H.innerHTML=`
|
|
68
68
|
<path d="${ye}" fill="${s}" opacity="${a}"/>
|
|
69
69
|
<polyline points="${Z}" fill="none" stroke="${s}" stroke-width="${l}" stroke-linejoin="round" stroke-linecap="round"/>
|
|
70
|
-
`,H}async function m(e,t){return x()?c(e,t):
|
|
70
|
+
`,H}async function m(e,t){return x()?c(e,t):Vn(e,t)}async function Vn(e,t){return await new Promise(s=>window.setTimeout(s,80)),e==="logout"&&(oe=!0),e==="verify_email_login"&&(oe=!1),e==="start_google_login"&&(oe=!1),e==="start_market"&&(ce=!0),e==="stop_market"&&(ce=!1),e==="start_surf"&&(de=!0),e==="stop_surf"&&(de=!1),{load_dashboard:jn(),load_provider_log:{ok:!0,providerLog:Fe.map(s=>`[${s.t.slice(0,8)}] ${s.lvl} ${s.msg}`)},start_email_login:{ok:!0,email:t?.email||"demo@clawmoney.ai"},verify_email_login:{ok:!0},start_google_login:{ok:!0},install_extension:{ok:!0},open_external:{ok:!0},logout:{ok:!0},start_market:{ok:!0},stop_market:{ok:!0},start_surf:{ok:!0},stop_surf:{ok:!0}}[e]||{ok:!0}}function jn(){return oe?{ok:!0,apiBase:"https://api.bnbot.ai",configPath:"/Users/demo/.clawmoney/config.yaml",configured:!1,services:{market:{running:!1,pid:null},surf:{running:!1,pid:null}},extension:{installed:!1,connected:!1},connections:{platforms:[]},providerLog:[]}:{ok:!0,apiBase:"https://api.bnbot.ai",configPath:"/Users/demo/.clawmoney/config.yaml",configured:!0,config:{agent_slug:"claw-scout",email:"operator@clawmoney.ai",wallet_address:"0x95a9C8C40d4f1A8e9E76b9d0c7B342D8aB9D4B"},account:{ok:!0,data:{name:"claw-scout",slug:"claw-scout",status:"ACTIVE",email:"operator@clawmoney.ai"}},wallet:{ok:!0,address:"0x95a9C8C40d4f1A8e9E76b9d0c7B342D8aB9D4B",balance:48.27},extension:{installed:!0,connected:!0},services:{market:{running:ce,pid:ce?48371:null},surf:{running:de,pid:de?92682:null}},history:{ok:!0,orders:Me,escrow:Le,orderCount:Me.length,escrowCount:Le.length},providerLog:Fe.map(e=>`[${e.t.slice(0,8)}] ${e.lvl} ${e.msg}`),connections:{platforms:C().map(e=>({slug:e.id,label:e.name,category:e.cat,skillCount:e.skills,ready:e.status==="ready",loginRequired:e.mode==="browser",login:{status:e.status==="ready"?"logged_in":"logged_out"}})),desktop:[]},preflight:{ts:"2026-06-03T12:00:00.000Z",ok:!1,summary:{checked:8,failed:1,droppedSkills:1},platforms:{codex:{label:"Codex 绘图",category:"local-app",status:"failed",skills:1,reason:"Codex Desktop 未运行",hint:"安装并打开 Codex.app(运行 `codex app` 可自动下载)"},x:{label:"X / Twitter",category:"social-login",status:"unknown",skills:11,reason:"X 登录态未确认(探测超时)",hint:"若 X 接单失败,请检查 Chrome 是否登录 x.com"}},dropped:["codex.image_generate"]}}}function Xt(e){const t=e?.history,n=o.dashboard?.history;t&&t.ok===!1&&n&&n.ok===!0&&(e.history=n)}async function E(){if(!F){F=!0,Ne=Date.now(),document.body.classList.add("busy");try{const e=await m("load_dashboard");Ct(e),Xt(e),o.dashboard=e,Ye(),o.ui.modal?.kind==="log"?je():o.ui.route==="logs"?Ve():u()}catch(e){console.error(e)}finally{F=!1,document.body.classList.remove("busy")}}}async function le(){if(F)return;F=!0,Ne=Date.now();const e=o.ui.route,t=o.ui.modal?.kind||null;try{const n=await m("load_dashboard");Ct(n),Xt(n),o.dashboard=n,Ye();const s=o.ui.route!==e||(o.ui.modal?.kind||null)!==t;o.ui.modal?.kind==="log"?je():o.ui.route==="logs"?Ve():o.ui.modal?.kind==="platform"?Ft():!s&&!o.ui.modal&&u()}catch(n){console.error(n)}finally{F=!1}}async function ze(){try{const e=await m("load_provider_log");o.dashboard&&Array.isArray(e.providerLog)&&(o.dashboard.providerLog=e.providerLog),Ye(),o.ui.modal?.kind==="log"?je():Ve()}catch(e){console.error(e)}}function Ye(){o.ui.modal?.kind!=="log"||f.paused||(f.logs=Vt())}async function ut(e){const t=o.dashboard?.services?.[e]?.running;await m(t?`stop_${e}`:`start_${e}`),await E()}async function Yn(){await Promise.all([o.dashboard?.services?.market?.running?null:m("start_market"),o.dashboard?.services?.surf?.running?null:m("start_surf")].filter(Boolean)),await E()}async function Qt(){await m("logout"),o.ui.modal=null,o.ui.route="home",o.ui.loginStep="choose",o.ui.loginCode="",o.ui.loginEmail="",await E()}async function Y(e){try{await m("open_external",{url:e})}catch{}}function K(){if(o.ui.modal?.kind==="log"){De();return}o.ui.modal=null,u()}window.addEventListener("resize",Re);document.addEventListener("keydown",e=>{e.key==="Escape"&&o.ui.modal&&K()});window.setInterval(()=>{o.dashboard?.configured&&(x()||(o.ui.balance=+(o.ui.balance+Math.random()*.04).toFixed(2),o.dashboard?.wallet&&(o.dashboard.wallet.balance=o.ui.balance),o.ui.route==="home"&&u()))},5200);window.setInterval(()=>{x()&&o.dashboard?.configured&&(document.hidden||Date.now()-Ne<12e3||le())},15e3);u();E();window.setTimeout(()=>{o.dashboard?.configured&&(me||(me=!0,We()),pe||(pe=!0,he()),G||(G=!0,be()))},3e3);window.setTimeout(()=>{bt()},6e3);(()=>{if(!x())return;const e=56,t=Oe(),n=a=>!!a?.closest("button,input,textarea,select,a,[role=button],[contenteditable=true]"),s=a=>{const l=a.target;return!l||n(l)?!1:a.clientY<=e||!!l.closest("[data-tauri-drag-region]")};window.addEventListener("mousedown",a=>{a.button===0&&s(a)&&t.startDragging().catch(()=>{})},!0),window.addEventListener("dblclick",a=>{s(a)&&t.toggleMaximize().catch(()=>{})},!0)})();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--accent: #E85A2C;--bg: #fafaf6;--sidebar: linear-gradient(180deg, rgba(255, 255, 255, .58) 0%, rgba(244, 247, 244, .38) 100%);--surface: #ffffff;--surface-alt: #f7f5ef;--raised: #ffffff;--line: rgba(20, 18, 14, .07);--line-strong: rgba(20, 18, 14, .14);--text: #14130f;--text-muted: #6b6862;--text-subtle: #9b988f;--ok: #1f8a5b;--ok-bg: rgba(31, 138, 91, .1);--warn: #b46a16;--warn-bg: rgba(180, 106, 22, .12);--err: #c8392e;--err-bg: rgba(200, 57, 46, .1);--shadow: 0 28px 60px -12px rgba(0, 0, 0, .32), 0 12px 30px -16px rgba(0, 0, 0, .18);--card-shadow: 0 0 0 .5px rgba(20, 18, 14, .05), 0 1px 0 rgba(255, 255, 255, .6) inset;--window-outline: 0 0 0 .5px rgba(0, 0, 0, .25);--soft-fill: rgba(20, 18, 14, .05);--soft-fill-strong: rgba(20, 18, 14, .07);--dash-fill: rgba(20, 18, 14, .025);--nav-active-fill: rgba(20, 18, 14, .06);--terminal-bg: #13130f;--color-scheme: light}.cm-dark{--bg: #0e0e10;--sidebar: linear-gradient(180deg, rgba(32, 34, 38, .58) 0%, rgba(20, 21, 24, .42) 100%);--surface: #1a1b1f;--surface-alt: #202126;--raised: #23252b;--line: rgba(255, 255, 255, .07);--line-strong: rgba(255, 255, 255, .14);--text: #f3f2ee;--text-muted: #a8a59c;--text-subtle: #6e6c64;--ok: #3cc88a;--ok-bg: rgba(60, 200, 138, .14);--warn: #f0a955;--warn-bg: rgba(240, 169, 85, .16);--err: #f06464;--err-bg: rgba(240, 100, 100, .16);--shadow: 0 30px 60px -20px rgba(0, 0, 0, .6), 0 8px 24px -12px rgba(0, 0, 0, .6);--card-shadow: 0 1px 0 rgba(255, 255, 255, .04) inset, 0 0 0 .5px rgba(255, 255, 255, .04);--window-outline: 0 0 0 .5px rgba(0, 0, 0, .6), 0 0 0 1px rgba(255, 255, 255, .04);--soft-fill: rgba(255, 255, 255, .06);--soft-fill-strong: rgba(255, 255, 255, .08);--dash-fill: rgba(255, 255, 255, .03);--nav-active-fill: rgba(255, 255, 255, .06);--terminal-bg: #0b0c0e;--color-scheme: dark}*{box-sizing:border-box;font-variant-numeric:tabular-nums}html,body{-webkit-user-select:none;user-select:none;cursor:default}input,textarea,code,pre,.log-body,.log-modal-body,.chain-addr,.set-code,.platform-meta-grid .v.mono,.settings-profile .addr,.about-version{-webkit-user-select:text;user-select:text;cursor:text}button,.btn,.chip,.tab,.platform-card,.nav-item,.settings-nav,.icon-button,.modal-close-btn,.log-modal-iconbtn,.log-expand,.lang-toggle-option,.traffic-dot,.set-toggle,.login-btn-google,.login-btn-email,.login-submit,.login-back,.login-code-resend,.google-continue-btn,.settings-logout{cursor:pointer}html,body{margin:0;padding:0;height:100%;overflow:hidden;font-family:-apple-system,BlinkMacSystemFont,SF Pro Text,PingFang SC,Microsoft YaHei,system-ui,sans-serif;-webkit-font-smoothing:antialiased;background:#0d0f12;color:var(--text);font-size:13.5px}html.is-tauri-root,html.is-tauri-root body{background:transparent;overflow:hidden}button,input,select{font:inherit;color:inherit}button{cursor:pointer}a{color:inherit;text-decoration:none;cursor:pointer}.desktop{position:fixed;inset:0;background:radial-gradient(ellipse 80% 60% at 20% 10%,#2b3a3f 0%,transparent 60%),radial-gradient(ellipse 70% 50% at 90% 20%,#4d2e1f 0%,transparent 60%),radial-gradient(ellipse 100% 80% at 50% 110%,#1c2d2a 0%,transparent 60%),linear-gradient(180deg,#11141a,#0d0f12,#0a0c0e);transition:opacity .25s ease;z-index:0}.desktop:before{content:"";position:absolute;inset:0;background-image:radial-gradient(circle at 18% 28%,rgba(255,255,255,.025) 0%,transparent 30%),radial-gradient(circle at 82% 72%,rgba(255,255,255,.02) 0%,transparent 30%);mix-blend-mode:screen}.desktop:after{content:"";position:absolute;inset:0;background:radial-gradient(ellipse at top,#0a0a0c00,#0a0a0c8c)}.stage{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;padding:24px;z-index:1}#app{width:1280px;height:820px;max-width:100%;max-height:100%;display:flex;gap:0;padding:0;position:relative;border-radius:28px;overflow:hidden;background:var(--bg);box-shadow:none;color:var(--text);transform-origin:center center}.cm-scroll::-webkit-scrollbar{width:10px;height:10px}.cm-scroll::-webkit-scrollbar-thumb{background:#0000002e;border:2px solid transparent;background-clip:content-box;border-radius:8px}.cm-scroll::-webkit-scrollbar-thumb:hover{background:#00000052;border:2px solid transparent;background-clip:content-box}.cm-dark .cm-scroll::-webkit-scrollbar-thumb{background:#ffffff29;border:2px solid transparent;background-clip:content-box}.cm-noscrollbar{scrollbar-width:none;-ms-overflow-style:none}.cm-noscrollbar::-webkit-scrollbar{width:0;height:0;display:none}.main-scroll,.orders-grid-body,.settings-content,.log-body,.log-modal-body{scrollbar-width:none;-ms-overflow-style:none}.main-scroll::-webkit-scrollbar,.orders-grid-body::-webkit-scrollbar,.settings-content::-webkit-scrollbar,.log-body::-webkit-scrollbar,.log-modal-body::-webkit-scrollbar{width:0;height:0;display:none}@keyframes cm-pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.45;transform:scale(.85)}}@keyframes cm-status-breathe{0%,to{box-shadow:0 0 color-mix(in srgb,currentColor 24%,transparent)}50%{box-shadow:0 0 0 5px color-mix(in srgb,currentColor 0%,transparent)}}@keyframes cm-modal-in{0%{opacity:0;transform:scale(.96) translateY(8px)}to{opacity:1;transform:none}}@keyframes cm-overlay-in{0%{opacity:0}to{opacity:1}}@keyframes cm-spin{to{transform:rotate(360deg)}}.sidebar{width:232px;flex-shrink:0;position:absolute;top:8px;left:8px;bottom:8px;background:var(--sidebar);border:0;border-radius:14px;display:flex;flex-direction:column;overflow:hidden;backdrop-filter:saturate(180%) blur(34px);-webkit-backdrop-filter:saturate(180%) blur(34px);box-shadow:0 40px 100px #10161614,0 16px 40px #1016160d,0 4px 12px #10161608;z-index:5}.cm-dark .sidebar{border-right-color:#ffffff14;box-shadow:0 40px 100px #0000002e,0 16px 40px #0000001f,0 4px 12px #00000012}.sidebar:before{content:"";position:absolute;inset:0;pointer-events:none;background:linear-gradient(90deg,#ffffff9e,#ffffff1f 58%,#fff0),radial-gradient(circle at 30% 6%,rgba(255,255,255,.64),transparent 38%);opacity:.72}.cm-dark .sidebar:before{background:linear-gradient(90deg,rgba(255,255,255,.05),transparent 58%),radial-gradient(circle at 28% 10%,rgba(255,255,255,.08),transparent 34%);opacity:1}.sidebar>*{position:relative;z-index:1}.sidebar-header{padding:14px 16px 8px;-webkit-app-region:drag}.brand{-webkit-app-region:drag}.traffic{display:flex;gap:8px;align-items:center;-webkit-app-region:no-drag}.traffic-dot{width:12px;height:12px;border-radius:50%;border:none;padding:0;display:flex;align-items:center;justify-content:center;box-shadow:inset 0 0 0 .5px #00000026;cursor:pointer}.traffic-dot.close{background:#ff5f57}.traffic-dot.min{background:#febc2e}.traffic-dot.max{background:#28c840}.traffic-dot span{font-size:8px;line-height:1;color:#0000008c;font-weight:700;opacity:0}.traffic:hover .traffic-dot span{opacity:1}.brand{padding:10px 16px 18px;display:flex;align-items:center;gap:10px}.brand-text{font-size:14.5px;font-weight:700;color:var(--text);letter-spacing:-.005em}.brand-tag{margin-left:auto;font-size:10px;font-weight:700;color:var(--text-subtle);padding:2px 6px;border-radius:5px;background:var(--soft-fill);box-shadow:none}.cm-dark .brand-tag{background:#ffffff12;box-shadow:inset 0 1px #ffffff0d}.nav-section-label{padding:4px 18px 6px;font-size:10.5px;font-weight:700;letter-spacing:.1em;color:var(--text-subtle);text-transform:uppercase}.nav{padding:0 10px;display:flex;flex-direction:column;gap:1px}.nav-item{all:unset;display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:8px;font-size:13px;font-weight:500;color:var(--text-muted);background:transparent;transition:background .12s,color .12s,box-shadow .12s;position:relative;cursor:pointer}.nav-item:hover{background:#14120e09}.cm-dark .nav-item:hover{background:#ffffff0b}.nav-item.active{background:#14120e11;color:var(--text);box-shadow:inset 0 1px #ffffff6b,inset 0 0 0 .5px #14120e06}.cm-dark .nav-item.active{background:#ffffff13;box-shadow:inset 0 0 0 .5px #ffffff09}.nav-item.active:before{content:"";position:absolute;left:-10px;top:50%;transform:translateY(-50%);width:3px;height:18px;border-radius:2px;background:var(--accent)}.nav-icon{color:var(--text-muted);display:inline-flex}.nav-item.active .nav-icon{color:var(--accent)}.nav-label{flex:1}.nav-badge{font-size:10.5px;font-weight:700;background:var(--warn-bg);color:var(--warn);padding:1px 6px;border-radius:999px;line-height:1.4}.sidebar-spacer{flex:1}.network-rail{margin:0 16px 12px;padding:10px 12px;border-radius:10px;background:var(--dash-fill);border:.5px dashed var(--line);font-size:11.5px;color:var(--text-muted);display:flex;align-items:center;justify-content:space-between}.network-left{display:flex;align-items:center;gap:7px}.network-dot{width:7px;height:7px;border-radius:50%;background:var(--ok);box-shadow:0 0 0 3px var(--ok-bg)}.network-ping{font-family:ui-monospace,SF Mono,Menlo,monospace;color:var(--text-subtle)}.agent-card{margin:0;padding:10px 16px 14px;border-radius:0;background:transparent;border:0;box-shadow:none;font-size:12px}.cm-dark .agent-card{background:transparent;box-shadow:none}.agent-row{display:flex;align-items:center;gap:8px}.agent-avatar{width:32px;height:32px;border-radius:8px;background:var(--accent);color:#fff;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;letter-spacing:-.02em;flex-shrink:0;text-transform:uppercase}.agent-info{flex:1;min-width:0}.agent-name{font-size:13px;font-weight:600;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.agent-status{font-size:11px;color:var(--text-subtle);display:flex;align-items:center;gap:5px;margin-top:2px}.agent-status-dot{width:6px;height:6px;border-radius:50%;background:var(--ok);box-shadow:0 0 0 2.5px var(--ok-bg)}.icon-button{all:unset;cursor:pointer;color:var(--text-subtle);width:24px;height:24px;border-radius:6px;display:inline-flex;align-items:center;justify-content:center;background:var(--soft-fill)}.icon-button:hover{background:var(--soft-fill-strong)}.main{flex:1;width:100%;height:100%;display:flex;flex-direction:column;min-width:0;position:relative;background:var(--bg);border-radius:0;overflow:visible;z-index:1;padding-left:256px;box-sizing:border-box}.titlebar{height:0;flex-shrink:0;-webkit-app-region:drag}.main-scroll{flex:1;overflow:auto;padding:22px 28px 28px}.page-header{display:flex;align-items:flex-end;justify-content:space-between;margin-bottom:0;gap:16px}.page-title{margin:0;font-size:26px;font-weight:700;letter-spacing:-.02em;color:var(--text)}.page-subtitle{margin-top:6px;font-size:13px;color:var(--text-muted)}.page-actions{display:flex;gap:8px;align-items:center}.card{background:var(--surface);border-radius:14px;padding:20px;box-shadow:var(--card-shadow);border:.5px solid var(--line);transition:transform .14s ease,box-shadow .14s ease,border-color .14s}.card.flush{padding:0;overflow:hidden}.card.interactive{cursor:pointer}.card.interactive:hover{transform:translateY(-1px);border-color:var(--line-strong)}.eyebrow{font-size:11.5px;font-weight:600;letter-spacing:.08em;color:var(--text-subtle);text-transform:uppercase}.card-title{font-size:15.5px;font-weight:700;color:var(--text)}.card-subtitle{font-size:12px;color:var(--text-muted);margin-top:2px}.pill{display:inline-flex;align-items:center;gap:6px;padding:3px 9px 3px 8px;border-radius:999px;background:var(--soft-fill);color:var(--text-muted);font-size:11.5px;font-weight:600;letter-spacing:.01em;line-height:1;white-space:nowrap}.pill-dot{width:6px;height:6px;border-radius:50%;background:currentColor;flex-shrink:0}.pill.tone-ok{background:var(--ok-bg);color:var(--ok)}.pill.tone-warn{background:var(--warn-bg);color:var(--warn)}.pill.tone-err{background:var(--err-bg);color:var(--err)}.pill.tone-sync{background:color-mix(in srgb,var(--accent) 16%,transparent);color:var(--accent)}.pill-spinner{width:8px;height:8px;border-radius:50%;border:1.5px solid currentColor;border-right-color:transparent;flex-shrink:0;animation:cm-spin .45s linear infinite}.platform-status-light{width:14px;height:14px;border-radius:50%;flex-shrink:0;justify-self:end;display:inline-flex;align-items:center;justify-content:center;position:relative;background:color-mix(in srgb,currentColor 10%,transparent);color:var(--text-muted);box-shadow:inset 0 0 0 .5px color-mix(in srgb,currentColor 28%,transparent)}.status-light-core{width:6px;height:6px;border-radius:50%;background:currentColor;box-shadow:0 0 0 .5px color-mix(in srgb,#fff 74%,transparent),0 1px 2px color-mix(in srgb,currentColor 34%,transparent)}.platform-status-light.tone-ok{color:#5cc98a;animation:cm-status-breathe 1.8s ease-in-out infinite}.platform-status-light.tone-warn{color:var(--warn);animation:cm-status-breathe 2s ease-in-out infinite}.platform-status-light.tone-err{color:var(--err);animation:cm-status-breathe 1.7s ease-in-out infinite}.platform-status-light.tone-off{color:color-mix(in srgb,var(--text-muted) 72%,transparent);background:color-mix(in srgb,currentColor 8%,transparent)}.platform-status-light.tone-off .status-light-core{width:5px;height:5px;opacity:.72;box-shadow:none}.btn{all:unset;cursor:pointer;display:inline-flex;align-items:center;gap:6px;padding:8px 14px;border-radius:9px;font-size:13px;font-weight:600;border:.5px solid var(--line);background:transparent;color:var(--text);white-space:nowrap;transition:opacity .12s,transform .08s,background .12s}.btn:hover{opacity:.95}.btn:active{transform:translateY(.5px);opacity:.85}.btn.size-sm{padding:6px 10px;border-radius:7px;font-size:12px}.btn.size-lg{padding:12px 18px;font-size:14px}.btn.kind-solid{background:var(--accent);color:#fff;border-color:transparent;box-shadow:0 1px #ffffff2e inset,0 1px 2px #0000001f}.btn.kind-soft{background:var(--soft-fill);color:var(--text);border-color:transparent}.btn.kind-soft:hover{background:var(--soft-fill-strong)}.btn.danger{color:var(--err)}.btn.kind-solid.danger{background:var(--err);color:#fff}.btn.kind-soft.danger{background:var(--err-bg);color:var(--err)}.btn:disabled{opacity:.55;cursor:default}.row-stack{display:flex;flex-direction:column;gap:16px}.connections-stack .page-header{margin-bottom:8px}.row-hero{display:grid;grid-template-columns:1.55fr 1fr;gap:14px}.row-services{display:grid;grid-template-columns:1fr 1.1fr;gap:14px}.balance-head{display:flex;justify-content:space-between;align-items:flex-start}.balance-delta{display:inline-flex;align-items:center;gap:4px;color:var(--ok);font-size:12px;font-weight:600}.balance-row{display:flex;align-items:flex-end;justify-content:space-between;margin-top:10px;gap:14px}.balance-value{font-size:38px;font-weight:700;letter-spacing:-.025em;color:var(--text);line-height:1;font-variant-numeric:tabular-nums}.chain-list{margin-top:16px;display:flex;flex-direction:column;border:.5px solid var(--line);border-radius:10px;overflow:hidden;background:var(--surface-alt)}.chain-row{display:flex;align-items:center;gap:10px;padding:10px 12px;border-bottom:.5px solid var(--line)}.chain-row:last-child{border-bottom:none}.pending-row{border-top:1px dashed var(--line-strong)}.pending-glyph{background:color-mix(in srgb,var(--accent) 14%,var(--surface));color:var(--accent)}.pending-note{font-size:10.5px;color:var(--text-subtle);margin-top:1px}.pending-row .chain-balance{color:var(--accent)}.chain-glyph{width:24px;height:24px;border-radius:6px;background:var(--surface);display:flex;align-items:center;justify-content:center;flex-shrink:0;box-shadow:inset 0 0 0 .5px var(--line)}.chain-info{flex:1;min-width:0}.chain-name{font-size:12.5px;font-weight:600;color:var(--text)}.chain-addr{all:unset;cursor:pointer;margin-top:1px;font-size:10.5px;color:var(--text-subtle);font-family:ui-monospace,SF Mono,Menlo,monospace;display:inline-flex;align-items:center;gap:4px}.chain-addr.copied{color:var(--ok)}.chain-balance{font-size:14px;font-weight:700;color:var(--text);font-family:ui-monospace,SF Mono,Menlo,monospace}.plugin-line{margin-top:14px;font-size:13.5px;color:var(--text);line-height:1.55}.plugin-line .muted{color:var(--text-muted)}.plugin-meta{margin-top:8px;font-size:11.5px;color:var(--text-subtle);display:flex;align-items:center;gap:6px}.plugin-actions{margin-top:14px;display:flex;gap:8px}.service-list{margin-top:14px;display:flex;flex-direction:column}.service-row{display:flex;align-items:center;justify-content:space-between;padding:12px 0;border-bottom:.5px dashed var(--line)}.service-row:last-child{border-bottom:none}.service-head{display:flex;align-items:center;gap:8px}.service-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0;background:var(--text-subtle)}.service-dot.running{background:var(--ok);box-shadow:0 0 0 3px var(--ok-bg)}.service-name{font-size:13.5px;font-weight:600;color:var(--text)}.service-sub{font-size:12px;color:var(--text-muted);margin-top:3px;margin-left:15px}.service-actions{display:flex;align-items:center;gap:8px}.log-card-head{padding:20px 20px 12px;display:flex;justify-content:space-between;align-items:flex-start}.card:not(.flush)>.log-card-head{padding:0 0 12px}.log-live{display:flex;align-items:center;gap:10px;font-size:11px;color:var(--text-subtle)}.log-live-tag{display:inline-flex;align-items:center;gap:6px}.log-live-dot{width:7px;height:7px;border-radius:50%;background:var(--ok);animation:cm-pulse 2s ease-in-out infinite}.log-expand{all:unset;cursor:pointer;width:24px;height:24px;border-radius:6px;display:inline-flex;align-items:center;justify-content:center;color:var(--text-muted);background:var(--soft-fill)}.log-body{margin:0 20px 20px;background:var(--terminal-bg);border-radius:10px;padding:12px;max-height:224px;overflow-y:auto;overflow-x:hidden;font-family:ui-monospace,SF Mono,JetBrains Mono,Menlo,monospace;font-size:11.5px;line-height:1.7;color:#e7e5df}.log-line{display:flex;gap:10px;padding:1px 0}.log-line .log-msg{min-width:0;flex:1;word-break:break-all;white-space:pre-wrap}.log-time{color:#ffffff61;flex-shrink:0}.log-level{width:42px;flex-shrink:0;font-weight:600}.log-level.INFO{color:#a8a59c}.log-level.WARN{color:#f0a955}.log-level.ERROR{color:#f06464}.log-level.DEBUG{color:#6e6c64}.log-msg{color:#e7e5df}.log-msg.ERROR{color:#fca5a5}.search-box{display:flex;align-items:center;gap:6px;padding:7px 10px;border:.5px solid var(--line);border-radius:9px;background:var(--surface);width:220px}.search-box input{all:unset;flex:1;font-size:13px;color:var(--text);min-width:0}.search-box input::placeholder{color:var(--text-subtle)}.icon-search{color:var(--text-subtle);display:inline-flex}.icon-clear{all:unset;cursor:pointer;color:var(--text-subtle);display:inline-flex}.category-chips{display:flex;gap:6px;overflow-x:auto;padding:2px 0}.chip{all:unset;cursor:pointer;white-space:nowrap;padding:6px 12px;border-radius:999px;font-size:12.5px;font-weight:600;color:var(--text);background:#14120e0b;border:.5px solid var(--line);display:inline-flex;align-items:center;gap:6px;transition:background .12s}.cm-dark .chip{background:#ffffff0d}.chip.active{background:var(--accent);color:#fff;-webkit-text-fill-color:#fff;border-color:var(--accent)}.chip-count{font-size:10.5px;font-weight:700;opacity:.5}.chip.active .chip-count{opacity:.55}.platform-grid{display:grid;gap:10px;grid-template-columns:repeat(3,minmax(0,1fr))}.platform-grid.compact{grid-template-columns:repeat(4,minmax(0,1fr))}.platform-card{all:unset;cursor:pointer;background:var(--surface);border-radius:12px;padding:13px 14px;box-shadow:var(--card-shadow);border:.5px solid color-mix(in srgb,var(--line) 62%,transparent);display:flex;align-items:center;gap:12px;position:relative;transition:transform .18s ease,border-color .2s ease,box-shadow .24s ease}.platform-card:hover{transform:translateY(-1px);border-color:color-mix(in srgb,var(--line-strong) 46%,transparent);box-shadow:var(--card-shadow),0 18px 40px -24px #f0b90b8c,0 8px 18px -16px #f0b90b47}.cm-dark .platform-card:hover{box-shadow:var(--card-shadow),0 18px 40px -24px #f0b90b6b,0 8px 22px -16px #f0b90b3d}.platform-glyph{width:36px;height:36px;flex-shrink:0;border-radius:10px;display:flex;align-items:center;justify-content:center;color:#fff;font-weight:700;font-size:15px;letter-spacing:-.5px;box-shadow:inset 0 0 0 .5px #ffffff1f,inset 0 1px #ffffff2e;overflow:hidden;font-family:-apple-system,SF Pro Display,PingFang SC,sans-serif}.platform-glyph img,.platform-glyph svg{width:56%;height:56%;object-fit:contain;display:block}.platform-glyph svg{fill:#fff}.platform-info{flex:1;min-width:0}.platform-row1{display:flex;align-items:center;gap:6px}.platform-name{font-size:14px;font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.platform-hot{font-size:10px;font-weight:700;color:var(--accent);padding:1px 5px;border-radius:4px;background:color-mix(in srgb,var(--accent) 14%,transparent)}.cm-dark .platform-hot{background:#ffffff0f}.platform-row2{font-size:11.5px;color:var(--text-muted);margin-top:2px;display:flex;align-items:center;gap:6px}.mode-tag{font-size:9.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;padding:1px 5px;border-radius:4px}.mode-tag.public{color:var(--ok);background:var(--ok-bg)}.mode-tag.browser{color:var(--warn);background:var(--warn-bg)}.empty-state{grid-column:1 / -1;text-align:center;padding:60px 0;color:var(--text-muted);font-size:13px}.stats-strip{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}.stat-card{padding:16px;background:var(--surface);border:.5px solid var(--line);border-radius:14px;box-shadow:var(--card-shadow)}.stat-row{display:flex;align-items:flex-end;justify-content:space-between;margin-top:8px;gap:8px}.stat-value{font-size:22px;font-weight:700;color:var(--text);letter-spacing:-.02em;line-height:1}.stat-delta{margin-top:8px;font-size:11.5px;font-weight:500;color:var(--text-muted)}.stat-delta.tone-ok{color:var(--ok)}.row-orders-mid{display:grid;grid-template-columns:1.05fr 1.4fr;gap:14px}.chart-container{margin-top:18px}.bar-chart{position:relative;height:160px;display:flex;align-items:flex-end;gap:10px}.bar-grid{position:absolute;left:0;right:0;border-top:.5px dashed var(--line);pointer-events:none}.bar-col{flex:1;position:relative;display:flex;flex-direction:column;justify-content:flex-end;height:100%}.bar{border-radius:6px;background:color-mix(in srgb,var(--accent) 28%,transparent);transition:height .35s cubic-bezier(.2,.7,.2,1);position:relative}.cm-dark .bar{background:color-mix(in srgb,var(--accent) 22%,transparent)}.bar.is-last{background:var(--accent)}.bar-tip{position:absolute;top:-22px;left:50%;transform:translate(-50%);font-size:11px;font-weight:700;color:var(--text);white-space:nowrap}.bar-labels{display:flex;gap:10px;margin-top:8px}.bar-label{flex:1;text-align:center;font-size:11px;color:var(--text-subtle);font-weight:500}.bar-label.is-last{color:var(--text);font-weight:600}.escrow-list{margin-top:14px;display:flex;flex-direction:column}.escrow-row{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:.5px dashed var(--line)}.escrow-row:last-child{border-bottom:none}.escrow-info{flex:1;min-width:0}.escrow-skill{font-size:13.5px;font-weight:600;color:var(--text)}.escrow-meta{font-size:11.5px;color:var(--text-muted);margin-top:2px}.escrow-amount{text-align:right}.escrow-reward{font-size:14px;font-weight:700;color:var(--text)}.escrow-status{font-size:10.5px;color:var(--ok);font-weight:600;margin-top:2px}.orders-toolbar{padding:14px 20px;border-bottom:.5px solid var(--line);display:flex;align-items:center;gap:18px;justify-content:space-between}.tab-group{display:flex;gap:4px;background:#14120e0b;padding:3px;border-radius:9px}.cm-dark .tab-group{background:#ffffff0d}.tab{all:unset;cursor:pointer;padding:5px 12px;border-radius:6px;font-size:12.5px;font-weight:600;color:var(--text-muted);display:inline-flex;align-items:center;gap:6px}.tab.active{color:var(--text);background:var(--surface);box-shadow:0 1px 2px #0000000f}.tab-count{font-size:10.5px;font-weight:700;opacity:.5}.tz-stamp{font-size:11.5px;color:var(--text-subtle);font-family:ui-monospace,SF Mono,Menlo,monospace}.orders-grid-head{display:grid;grid-template-columns:112px 1.5fr 2fr 1fr 90px 70px;padding:10px 20px;gap:12px;font-size:11px;font-weight:700;letter-spacing:.06em;color:var(--text-subtle);text-transform:uppercase;border-bottom:.5px dashed var(--line)}.orders-grid-head .right{text-align:right}.orders-grid-body{max-height:260px;overflow:auto}.orders-row{display:grid;grid-template-columns:112px 1.5fr 2fr 1fr 90px 70px;padding:12px 20px;gap:12px;font-size:13px;color:var(--text);align-items:center;border-bottom:.5px solid var(--line)}.orders-row:last-child{border-bottom:none}.orders-row .time,.orders-row .dur{font-family:ui-monospace,SF Mono,Menlo,monospace;color:var(--text-muted);font-size:12px}.orders-row .platform-cell{display:flex;align-items:center;gap:8px}.orders-row .amount{text-align:right;font-weight:600}.orders-row .amount.zero{color:var(--text-subtle)}.orders-row .right{text-align:right}.platform-glyph.size-sm{width:22px;height:22px;border-radius:6px;font-size:9.5px}.platform-glyph.size-lg{width:52px;height:52px;border-radius:14px;font-size:22px}.modal-backdrop{position:absolute;inset:0;z-index:50;background:#14120e6b;display:flex;align-items:center;justify-content:center;border-radius:16px;animation:cm-overlay-in .2s ease both}.cm-dark .modal-backdrop{background:#080809ad}.platform-modal{width:520px;background:var(--surface);border-radius:16px;box-shadow:var(--shadow);border:.5px solid var(--line-strong);animation:cm-modal-in .26s cubic-bezier(.2,.7,.2,1) both;overflow:hidden}.platform-modal-head{padding:22px 24px 18px;display:flex;gap:14px;align-items:flex-start}.platform-modal-info{flex:1;min-width:0}.platform-modal-cat{font-size:11px;font-weight:700;letter-spacing:.1em;color:var(--text-subtle);text-transform:uppercase}.platform-modal-title{font-size:22px;font-weight:700;color:var(--text);letter-spacing:-.02em;margin-top:4px}.platform-modal-meta{margin-top:6px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}.platform-modal-skills{font-size:12px;color:var(--text-muted)}.modal-close-btn{all:unset;cursor:pointer;width:28px;height:28px;border-radius:8px;display:flex;align-items:center;justify-content:center;color:var(--text-muted);background:var(--soft-fill)}.platform-modal-desc{padding:4px 24px 18px;font-size:13.5px;color:var(--text-muted);line-height:1.55}.platform-meta-grid{margin:0 24px 16px;padding:14px 16px;border-radius:12px;background:var(--surface-alt);border:.5px solid var(--line);display:grid;grid-template-columns:auto 1fr auto 1fr;row-gap:10px;column-gap:14px;font-size:12.5px}.platform-meta-grid .k{color:var(--text-muted)}.platform-meta-grid .v{color:var(--text);font-weight:500;text-align:right}.platform-meta-grid .v.strong{font-weight:600}.platform-meta-grid .v.mono{font-family:ui-monospace,SF Mono,Menlo,monospace;font-size:12px}.platform-caps{padding:0 24px 6px}.platform-toggle{all:unset;display:block;flex-shrink:0;width:44px;height:25px;box-sizing:border-box;border-radius:999px;cursor:pointer;position:relative;background:#d2d5da;transition:background .1s ease}.cm-dark .platform-toggle{background:#4a4d53}.platform-toggle.on{background:var(--accent)}.platform-toggle-thumb{position:absolute;top:2px;left:2px;width:21px;height:21px;border-radius:50%;background:#fff;box-shadow:0 1px 3px #00000047;transform:translate(0);transition:transform .11s cubic-bezier(.2,.8,.2,1);will-change:transform}.platform-toggle.on .platform-toggle-thumb{transform:translate(19px)}.platform-skill-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:10px 2px;border-bottom:1px solid var(--line)}.platform-skill-row:last-child{border-bottom:none}.platform-skill-copy{display:flex;flex-direction:column;gap:2px;min-width:0}.platform-skill-name{font-family:ui-monospace,SF Mono,Menlo,monospace;font-size:13px;font-weight:600;color:var(--text)}.platform-skill-desc{font-size:11.5px;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.platform-skill-status{flex-shrink:0;font-size:11.5px;font-weight:600;color:var(--text-muted)}.platform-skill-status.on{color:var(--accent)}.caps-label{font-size:11.5px;font-weight:700;letter-spacing:.08em;color:var(--text-subtle);text-transform:uppercase;margin-bottom:10px}.caps-list{display:flex;flex-wrap:wrap;gap:6px}.cap-tag{display:inline-flex;align-items:center;gap:5px;padding:5px 10px;border-radius:7px;background:var(--surface-alt);border:.5px solid var(--line);font-size:12px;color:var(--text)}.cap-icon{color:var(--accent);display:inline-flex}.platform-modal-footer{padding:14px 24px 20px;display:flex;justify-content:flex-end;gap:8px;border-top:.5px solid var(--line);margin-top:12px}.log-modal{width:min(1100px,100%);height:min(700px,100%);background:#0b0c0e;color:#e7e5df;border-radius:14px;box-shadow:var(--shadow);border:.5px solid var(--line-strong);display:flex;flex-direction:column;animation:cm-modal-in .26s cubic-bezier(.2,.7,.2,1) both;overflow:hidden;font-family:ui-monospace,SF Mono,JetBrains Mono,Menlo,monospace}.cm-dark .log-modal{background:#0b0c0e}.log-modal-head{padding:12px 16px;border-bottom:.5px solid rgba(255,255,255,.07);display:flex;align-items:center;gap:12px;flex-shrink:0;font-family:-apple-system,SF Pro Text,PingFang SC,system-ui,sans-serif}.log-modal-title-tag{display:flex;align-items:center;gap:8px}.log-modal-live{width:8px;height:8px;border-radius:50%;background:#3cc88a;animation:cm-pulse 2s ease-in-out infinite}.log-modal-live.paused{background:#a8a59c;animation:none}.log-modal-title{font-size:13.5px;font-weight:700;color:#f3f2ee}.log-modal-counts{font-size:11px;color:#ffffff80}.log-modal-spacer{flex:1}.log-modal-search{display:flex;align-items:center;gap:6px;padding:5px 9px;border:.5px solid rgba(255,255,255,.08);border-radius:7px;background:#ffffff0a;width:220px}.log-modal-search input{all:unset;flex:1;font-size:12px;color:#f3f2ee;min-width:0}.log-modal-search input::placeholder{color:#fff6}.log-modal-filters{display:flex;gap:4px}.log-modal-filter{all:unset;cursor:pointer;padding:4px 10px;border-radius:6px;font-size:11px;font-weight:600;letter-spacing:.04em;background:#ffffff0a;color:#f3f2ee;display:inline-flex;align-items:center;gap:5px}.log-modal-filter.INFO{color:#a8a59c}.log-modal-filter.WARN{color:#f0a955}.log-modal-filter.ERROR{color:#f06464}.log-modal-filter.DEBUG{color:#6e6c64}.log-modal-filter.active{color:#0b0c0e;background:#f3f2ee}.log-modal-filter.active.INFO{background:#a8a59c}.log-modal-filter.active.WARN{background:#f0a955}.log-modal-filter.active.ERROR{background:#f06464}.log-modal-filter.active.DEBUG{background:#6e6c64}.log-modal-filter-count{font-size:9.5px;opacity:.7}.log-modal-actions{display:flex;gap:4px}.log-modal-iconbtn{all:unset;cursor:pointer;width:28px;height:28px;border-radius:7px;background:#ffffff0a;color:#e7e5df;display:inline-flex;align-items:center;justify-content:center}.log-modal-iconbtn:hover{background:#ffffff14}.log-modal-body{flex:1;overflow:auto;padding:12px 16px;font-size:12.5px;line-height:1.75}.log-modal-body .log-line{gap:12px;padding:2px 0}.log-modal-body .log-time{width:104px;color:#ffffff59}.log-modal-body .log-level{width:52px;font-weight:700}.log-modal-body .log-msg.WARN{color:#fcd5a5}.log-modal-empty{padding:40px 0;text-align:center;color:#fff6;font-family:-apple-system,system-ui,sans-serif}.log-modal-foot{padding:8px 16px;border-top:.5px solid rgba(255,255,255,.07);display:flex;justify-content:space-between;align-items:center;font-size:10.5px;color:#ffffff73;flex-shrink:0}.login-screen{flex:1;display:flex;align-items:center;justify-content:center;background:var(--bg);position:relative;overflow:hidden;background-image:radial-gradient(ellipse 80% 60% at 30% 0%,color-mix(in srgb,var(--accent) 18%,transparent) 0%,transparent 60%),radial-gradient(ellipse 60% 60% at 100% 100%,color-mix(in srgb,var(--accent) 14%,transparent) 0%,transparent 60%)}.login-grid{position:absolute;inset:0;opacity:.04;background-image:linear-gradient(var(--text) .5px,transparent .5px),linear-gradient(90deg,var(--text) .5px,transparent .5px);background-size:36px 36px;-webkit-mask-image:radial-gradient(ellipse at center,black 40%,transparent 80%);mask-image:radial-gradient(ellipse at center,black 40%,transparent 80%)}.cm-dark .login-grid{opacity:.05}.login-container{width:420px;position:relative;z-index:1}.login-brand{display:flex;align-items:center;gap:12px;margin-bottom:32px;justify-content:center}.login-brand-name{font-size:22px;font-weight:700;color:var(--text);letter-spacing:-.02em}.login-brand-tag{font-size:12px;color:var(--text-muted);margin-top:2px}.login-card{background:var(--surface);border-radius:18px;border:.5px solid var(--line);box-shadow:var(--shadow);overflow:hidden}.login-pad{padding:30px 28px 26px}.login-title{font-size:17px;font-weight:700;color:var(--text);letter-spacing:-.01em}.login-sub{font-size:13px;color:var(--text-muted);margin-top:4px;line-height:1.55}.login-btn-google{all:unset;cursor:pointer;margin-top:22px;display:flex;align-items:center;justify-content:center;gap:10px;width:100%;box-sizing:border-box;padding:12px 14px;background:var(--surface);color:var(--text);border:.5px solid var(--line-strong);border-radius:10px;font-size:13.5px;font-weight:600;box-shadow:0 1px 2px #0000000a}.login-divider{margin:18px 0;display:flex;align-items:center;gap:10px}.login-divider .line{flex:1;height:1px;background:var(--line)}.login-divider .label{font-size:10.5px;font-weight:600;color:var(--text-subtle);letter-spacing:.1em;text-transform:uppercase}.login-btn-email{all:unset;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:8px;width:100%;box-sizing:border-box;padding:12px 14px;background:transparent;color:var(--text);border:.5px solid var(--line);border-radius:10px;font-size:13.5px;font-weight:600}.login-terms{margin-top:20px;font-size:11px;color:var(--text-subtle);line-height:1.55}.login-error{margin-top:16px;padding:10px 12px;border-radius:9px;background:var(--err-bg);color:var(--err);font-size:12.5px;line-height:1.5}.login-back{all:unset;cursor:pointer;font-size:12px;color:var(--text-muted);margin-bottom:14px;display:inline-flex;align-items:center;gap:4px}.login-label{display:block;margin-top:18px;margin-bottom:6px;font-size:12px;font-weight:600;color:var(--text)}.login-input{width:100%;box-sizing:border-box;padding:10px 12px;border-radius:9px;border:.5px solid var(--line);background:var(--surface-alt);color:var(--text);font-size:13.5px;font-family:inherit;outline:none}.login-input:focus{border-color:var(--accent)}.login-submit{all:unset;cursor:pointer;margin-top:24px;width:100%;box-sizing:border-box;padding:12px 14px;background:var(--accent);color:#fff;border-radius:10px;text-align:center;font-size:13.5px;font-weight:600;box-shadow:0 1px #ffffff2e inset}.login-code-row{display:flex;gap:8px;margin-top:20px;justify-content:space-between}.login-code-input{width:48px;height:56px;text-align:center;font-size:22px;font-weight:700;color:var(--text);font-family:ui-monospace,SF Mono,Menlo,monospace;background:var(--surface-alt);border:1px solid var(--line);border-radius:10px;outline:none;transition:border-color .12s,background .12s;caret-color:var(--accent)}.login-code-input:focus{border-color:var(--accent)}.login-code-input.error{border-color:var(--err);background:var(--err-bg);color:var(--err)}.login-code-status{margin-top:14px;min-height:18px;font-size:12px;display:flex;align-items:center;gap:6px}.login-spinner{width:12px;height:12px;display:inline-block;border-radius:50%;border:2px solid var(--line);border-top-color:var(--accent);animation:cm-spin .8s linear infinite}.login-code-status.error{color:var(--err);font-weight:500}.login-code-status.muted{color:var(--text-muted)}.login-code-footer{margin-top:16px;padding-top:14px;border-top:.5px dashed var(--line);display:flex;justify-content:space-between;align-items:center;font-size:12px;color:var(--text-muted)}.login-code-resend{all:unset;cursor:pointer;color:var(--accent);font-weight:600}.login-code-resend.disabled{color:var(--text-muted);cursor:default}.login-google-state{padding:44px 28px 32px;text-align:center}.google-avatar{position:relative;width:72px;height:72px;margin:0 auto 18px}.google-avatar-bg{position:absolute;inset:0;border-radius:50%;background:var(--soft-fill);transition:background .3s}.google-avatar-bg.success{background:var(--accent)}.google-avatar-ring{position:absolute;inset:-4px;border-radius:50%;border:2px solid transparent;border-top-color:var(--accent);animation:cm-spin 1s linear infinite}.google-avatar-icon{position:absolute;inset:0;display:flex;align-items:center;justify-content:center}.google-state-title{font-size:17px;font-weight:700;color:var(--text)}.google-state-sub{font-size:13px;color:var(--text-muted);margin-top:8px;line-height:1.55}.google-state-domain{margin-top:18px;font-size:11px;color:var(--text-subtle);font-family:ui-monospace,SF Mono,Menlo,monospace}.google-continue-btn{all:unset;cursor:pointer;margin-top:22px;padding:10px 22px;border-radius:9px;background:var(--text);color:var(--bg);font-size:13px;font-weight:600}.login-footer{margin-top:18px;display:flex;justify-content:space-between;align-items:center;font-size:11px;color:var(--text-subtle)}.login-footer-links{display:flex;gap:14px}.lang-toggle-segment{display:inline-flex;padding:2px;border-radius:7px;background:#14120e0a;border:.5px solid var(--line)}.cm-dark .lang-toggle-segment{background:#ffffff0d}.lang-toggle-option{all:unset;cursor:pointer;padding:2px 9px;border-radius:5px;font-size:10.5px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--text-subtle)}.lang-toggle-option.active{color:var(--text);background:var(--surface);box-shadow:0 1px 2px #0000000f}.login-corner-traffic{position:absolute;top:14px;left:16px;z-index:10;-webkit-app-region:no-drag}.settings-modal{width:760px;height:540px;background:var(--surface);border-radius:16px;box-shadow:var(--shadow);border:.5px solid var(--line-strong);display:flex;overflow:hidden;animation:cm-modal-in .26s cubic-bezier(.2,.7,.2,1) both}.settings-sidebar{width:200px;background:var(--surface-alt);padding:14px 10px;border-right:.5px solid var(--line);display:flex;flex-direction:column}.settings-sidebar-title{padding:4px 10px 10px;font-size:13px;font-weight:700;color:var(--text)}.settings-nav{all:unset;cursor:pointer;padding:7px 10px;border-radius:7px;display:flex;align-items:center;gap:9px;font-size:12.5px;font-weight:500;color:var(--text-muted)}.settings-nav.active{font-weight:600;color:var(--text);background:var(--nav-active-fill)}.settings-nav-icon{color:var(--text-subtle);display:inline-flex}.settings-nav.active .settings-nav-icon{color:var(--accent)}.settings-logout{all:unset;cursor:pointer;padding:7px 10px;border-radius:7px;display:flex;align-items:center;gap:9px;font-size:12.5px;font-weight:600;color:var(--err)}.settings-content{flex:1;padding:18px 24px 24px;overflow:auto}.settings-content-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:18px}.settings-content-title{font-size:17px;font-weight:700;color:var(--text);letter-spacing:-.01em}.settings-profile{display:flex;align-items:center;gap:14px;padding:14px 16px;border-radius:12px;background:var(--surface-alt);border:.5px solid var(--line)}.settings-profile .avatar{width:44px;height:44px;border-radius:10px;background:var(--accent);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;letter-spacing:-.02em;font-size:16px;text-transform:uppercase}.settings-profile .info{flex:1;min-width:0}.settings-profile .name{font-size:15px;font-weight:700;color:var(--text)}.settings-profile .addr{font-size:12px;color:var(--text-muted);font-family:ui-monospace,SF Mono,Menlo,monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.set-row{display:flex;align-items:center;justify-content:space-between;padding:14px 0;border-bottom:.5px dashed var(--line);gap:18px}.set-row .label-wrap{min-width:0}.set-row .label{font-size:13.5px;font-weight:600;color:var(--text)}.set-row .sub{font-size:11.5px;color:var(--text-muted);margin-top:2px}.set-toggle{all:unset;cursor:pointer;position:relative;width:36px;height:22px;border-radius:999px;background:#14120e26;transition:background .15s}.cm-dark .set-toggle{background:#ffffff1f}.set-toggle.on{background:var(--ok)}.set-toggle:after{content:"";position:absolute;top:2px;left:2px;width:18px;height:18px;border-radius:50%;background:#fff;box-shadow:0 1px 3px #0003;transition:left .15s}.set-toggle.on:after{left:16px}.set-code{font-family:ui-monospace,SF Mono,Menlo,monospace;font-size:12px;background:var(--surface-alt);padding:4px 8px;border-radius:6px;color:var(--text)}.set-input,.set-select{padding:6px 10px;border-radius:7px;border:.5px solid var(--line);background:var(--surface);color:var(--text);font-size:13;font-family:inherit;outline:none}.set-input.mono{font-family:ui-monospace,SF Mono,Menlo,monospace;font-size:12px}.about-block{text-align:center;padding:40px 0}.about-name{margin-top:14px;font-size:20px;font-weight:700;color:var(--text);letter-spacing:-.02em}.about-version{margin-top:4px;font-size:12px;color:var(--text-muted);font-family:ui-monospace,SF Mono,Menlo,monospace}.about-copy{margin-top:18px;font-size:12px;color:var(--text-subtle);line-height:1.6}.about-actions{margin-top:22px;display:flex;justify-content:center;gap:8px}.hidden{display:none!important}.muted{color:var(--text-muted)}.busy{cursor:wait}.density-compact .card{padding:16px}.density-compact .log-card-head{padding:16px 16px 12px}.density-compact .log-body{margin:0 16px 16px}body.is-tauri{background:transparent}.is-tauri .desktop{display:none}.is-tauri .stage{padding:0}.is-tauri #app{width:100vw;height:100vh;max-width:none;max-height:none;border-radius:0;box-shadow:none;transform:none!important}.is-tauri .traffic{visibility:hidden;pointer-events:none}.is-tauri .brand>*{pointer-events:none}.is-tauri .login-corner-traffic{display:none}.boot-screen{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;background:var(--bg);color:var(--text)}.boot-mark{width:64px;height:64px;display:grid;place-items:center;border-radius:18px;background:var(--surface);box-shadow:var(--card-shadow)}.boot-title{margin-top:8px;font-size:20px;font-weight:800}.boot-subtitle{color:var(--text-muted);font-size:13px}.boot-spinner{width:22px;height:22px;margin-top:8px;border-radius:50%;border:2px solid var(--line-strong);border-top-color:var(--accent);animation:cm-spin .8s linear infinite}.is-tauri .login-screen{padding-top:32px}.preflight-notice{border:.5px solid var(--warn);background:var(--warn-bg);display:flex;flex-direction:column;gap:14px}.preflight-notice.probing{border-color:var(--line-strong);background:var(--soft-fill)}.preflight-notice.probing .preflight-notice-icon{background:transparent}.preflight-notice-head{display:flex;align-items:flex-start;gap:11px}.preflight-notice-icon{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:8px;background:var(--warn-bg);color:var(--warn);flex-shrink:0}.preflight-notice-text{display:flex;flex-direction:column;gap:2px;min-width:0}.preflight-notice-title{font-size:14px;font-weight:700;color:var(--text)}.preflight-notice-sub{font-size:12px;color:var(--text-muted)}.ext-offline-notice{border:.5px solid var(--warn);background:var(--warn-bg);display:flex;align-items:center;justify-content:space-between;gap:14px}.ext-offline-head{display:flex;align-items:flex-start;gap:11px;min-width:0}.ext-offline-icon{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:8px;background:var(--warn-bg);color:var(--warn);flex-shrink:0}.ext-offline-text{display:flex;flex-direction:column;gap:2px;min-width:0}.ext-offline-title{font-size:14px;font-weight:700;color:var(--text)}.ext-offline-sub{font-size:12px;color:var(--text-muted);line-height:1.5}.ext-offline-actions{flex-shrink:0}.preflight-issue-list{display:flex;flex-direction:column;gap:10px;padding-top:12px;border-top:.5px solid var(--line)}.preflight-issue{display:flex;align-items:flex-start;gap:10px}.preflight-issue-body{flex:1;min-width:0}.preflight-issue>.btn{flex-shrink:0;align-self:center}.preflight-issue-dot{width:8px;height:8px;border-radius:50%;margin-top:5px;flex-shrink:0}.preflight-issue-dot.tone-err{background:var(--err)}.preflight-issue-dot.tone-warn{background:var(--warn)}.preflight-issue-body{display:flex;flex-direction:column;gap:2px;min-width:0}.preflight-issue-name{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:650;color:var(--text)}.preflight-issue-count{font-size:11px;font-weight:600;color:var(--text-muted);background:var(--soft-fill);border-radius:5px;padding:1px 6px;white-space:nowrap}.preflight-issue-reason{font-size:12px;color:var(--text-muted)}.preflight-issue-hint{font-size:12px;color:var(--text-subtle)}.llm-upload-card{display:flex;flex-direction:column;gap:12px}.llm-provider-list{display:flex;flex-direction:column;margin-top:14px;padding-top:4px;border-top:.5px solid var(--line)}.llm-provider-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:11px 0}.llm-provider-row+.llm-provider-row{border-top:.5px solid var(--line)}.llm-provider-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0;background:currentColor;box-shadow:0 0 0 3px color-mix(in srgb,currentColor 15%,transparent)}.llm-provider-dot.tone-ok{color:#5cc98a}.llm-provider-dot.tone-warn{color:var(--warn)}.llm-provider-dot.tone-off{color:var(--text-subtle)}.llm-provider-dot.is-live{animation:cm-status-breathe 1.8s ease-in-out infinite}.llm-provider-info{flex:1;display:flex;flex-direction:column;gap:2px;min-width:0}.llm-provider-name{font-size:13.5px;font-weight:650;color:var(--text)}.llm-provider-model{font-size:11px;color:var(--text-subtle);font-family:ui-monospace,SF Mono,Menlo,monospace}.llm-provider-status{font-size:12px;color:var(--text-muted);white-space:nowrap;text-align:right}.llm-provider-side{display:flex;align-items:center;gap:10px;flex-shrink:0}.llm-provider-row.is-disabled .llm-provider-name{color:var(--text-muted)}.llm-provider-row.is-disabled .llm-provider-model{opacity:.6}.llm-provider-side .relay-switch{width:38px;height:22px;border-radius:11px}.llm-provider-side .relay-switch-knob{width:16px;height:16px}.llm-provider-side .relay-switch.on .relay-switch-knob{transform:translate(16px)}.update-notice{display:flex;align-items:center;justify-content:space-between;gap:16px;border:1px solid color-mix(in srgb,var(--accent) 55%,transparent);background:color-mix(in srgb,var(--accent) 8%,var(--surface))}.update-notice-title{font-size:13.5px;font-weight:700;color:var(--text)}.update-notice-sub{font-size:12px;color:var(--text-muted);margin-top:2px}.about-changelog{margin-top:14px;max-height:260px;overflow-y:auto;text-align:left;border-top:.5px solid var(--line);padding-top:12px}.cl-version{font-size:13px;font-weight:700;color:var(--text);margin:10px 0 4px}.cl-version:first-child{margin-top:0}.cl-section{font-size:11.5px;font-weight:650;color:var(--text-muted);margin:8px 0 3px}.cl-item{font-size:12px;color:var(--text-muted);line-height:1.55;padding-left:10px;position:relative}.cl-item:before{content:"·";position:absolute;left:2px}.relay-toggle-card{display:flex;align-items:center;justify-content:space-between;gap:16px}.relay-toggle-info{display:flex;flex-direction:column;gap:3px;min-width:0}.relay-toggle-title{font-size:15px;font-weight:700;color:var(--text)}.relay-toggle-sub{font-size:12.5px;color:var(--text-muted)}.relay-switch{width:46px;height:27px;border-radius:14px;border:none;cursor:pointer;padding:0;position:relative;flex-shrink:0;transition:background .16s ease}.relay-switch.off{background:var(--line-strong)}.relay-switch.on{background:var(--accent)}.relay-switch-knob{position:absolute;top:3px;left:3px;width:21px;height:21px;border-radius:50%;background:#fff;box-shadow:0 1px 3px #0000004d;transition:transform .16s ease}.relay-switch.on .relay-switch-knob{transform:translate(19px)}.relay-setting-row{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:10px 0;border-top:.5px solid var(--line)}.relay-setting-row:first-of-type{border-top:none}.relay-setting-label{display:flex;flex-direction:column;gap:2px;min-width:0}.relay-setting-label>div:first-child{font-size:13.5px;font-weight:600;color:var(--text)}.relay-setting-hint{font-size:12px;color:var(--text-muted)}.relay-number-input,.relay-time-input{padding:6px 10px;border-radius:8px;border:.5px solid var(--line-strong);background:var(--surface);color:var(--text);font-size:13px;font-variant-numeric:tabular-nums}.relay-number-input{width:64px;text-align:center}.relay-earnings-grid{display:flex;gap:12px;padding-top:10px;border-top:.5px solid var(--line)}.relay-earning-stat{flex:1;text-align:center}.relay-earning-value{font-size:20px;font-weight:700;color:var(--text);font-variant-numeric:tabular-nums}.relay-earning-label{font-size:11px;color:var(--text-muted);margin-top:3px}.relay-schedule-row{display:flex;align-items:center;gap:10px;padding:4px 0 10px}.relay-schedule-dash{color:var(--text-muted)}
|
package/companion/ui/index.html
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>Claw Money</title>
|
|
7
|
-
<script type="module" crossorigin src="./assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
7
|
+
<script type="module" crossorigin src="./assets/index-Cp4HSF5X.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="./assets/index-DgNmGRcF.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div class="desktop" id="desktop"></div>
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
:root{--accent: #E85A2C;--bg: #fafaf6;--sidebar: linear-gradient(180deg, rgba(255, 255, 255, .58) 0%, rgba(244, 247, 244, .38) 100%);--surface: #ffffff;--surface-alt: #f7f5ef;--raised: #ffffff;--line: rgba(20, 18, 14, .07);--line-strong: rgba(20, 18, 14, .14);--text: #14130f;--text-muted: #6b6862;--text-subtle: #9b988f;--ok: #1f8a5b;--ok-bg: rgba(31, 138, 91, .1);--warn: #b46a16;--warn-bg: rgba(180, 106, 22, .12);--err: #c8392e;--err-bg: rgba(200, 57, 46, .1);--shadow: 0 28px 60px -12px rgba(0, 0, 0, .32), 0 12px 30px -16px rgba(0, 0, 0, .18);--card-shadow: 0 0 0 .5px rgba(20, 18, 14, .05), 0 1px 0 rgba(255, 255, 255, .6) inset;--window-outline: 0 0 0 .5px rgba(0, 0, 0, .25);--soft-fill: rgba(20, 18, 14, .05);--soft-fill-strong: rgba(20, 18, 14, .07);--dash-fill: rgba(20, 18, 14, .025);--nav-active-fill: rgba(20, 18, 14, .06);--terminal-bg: #13130f;--color-scheme: light}.cm-dark{--bg: #0e0e10;--sidebar: linear-gradient(180deg, rgba(32, 34, 38, .58) 0%, rgba(20, 21, 24, .42) 100%);--surface: #1a1b1f;--surface-alt: #202126;--raised: #23252b;--line: rgba(255, 255, 255, .07);--line-strong: rgba(255, 255, 255, .14);--text: #f3f2ee;--text-muted: #a8a59c;--text-subtle: #6e6c64;--ok: #3cc88a;--ok-bg: rgba(60, 200, 138, .14);--warn: #f0a955;--warn-bg: rgba(240, 169, 85, .16);--err: #f06464;--err-bg: rgba(240, 100, 100, .16);--shadow: 0 30px 60px -20px rgba(0, 0, 0, .6), 0 8px 24px -12px rgba(0, 0, 0, .6);--card-shadow: 0 1px 0 rgba(255, 255, 255, .04) inset, 0 0 0 .5px rgba(255, 255, 255, .04);--window-outline: 0 0 0 .5px rgba(0, 0, 0, .6), 0 0 0 1px rgba(255, 255, 255, .04);--soft-fill: rgba(255, 255, 255, .06);--soft-fill-strong: rgba(255, 255, 255, .08);--dash-fill: rgba(255, 255, 255, .03);--nav-active-fill: rgba(255, 255, 255, .06);--terminal-bg: #0b0c0e;--color-scheme: dark}*{box-sizing:border-box;font-variant-numeric:tabular-nums}html,body{-webkit-user-select:none;user-select:none;cursor:default}input,textarea,code,pre,.log-body,.log-modal-body,.chain-addr,.set-code,.platform-meta-grid .v.mono,.settings-profile .addr,.about-version{-webkit-user-select:text;user-select:text;cursor:text}button,.btn,.chip,.tab,.platform-card,.nav-item,.settings-nav,.icon-button,.modal-close-btn,.log-modal-iconbtn,.log-expand,.lang-toggle-option,.traffic-dot,.set-toggle,.login-btn-google,.login-btn-email,.login-submit,.login-back,.login-code-resend,.google-continue-btn,.settings-logout{cursor:pointer}html,body{margin:0;padding:0;height:100%;overflow:hidden;font-family:-apple-system,BlinkMacSystemFont,SF Pro Text,PingFang SC,Microsoft YaHei,system-ui,sans-serif;-webkit-font-smoothing:antialiased;background:#0d0f12;color:var(--text);font-size:13.5px}html.is-tauri-root,html.is-tauri-root body{background:transparent;overflow:hidden}button,input,select{font:inherit;color:inherit}button{cursor:pointer}a{color:inherit;text-decoration:none;cursor:pointer}.desktop{position:fixed;inset:0;background:radial-gradient(ellipse 80% 60% at 20% 10%,#2b3a3f 0%,transparent 60%),radial-gradient(ellipse 70% 50% at 90% 20%,#4d2e1f 0%,transparent 60%),radial-gradient(ellipse 100% 80% at 50% 110%,#1c2d2a 0%,transparent 60%),linear-gradient(180deg,#11141a,#0d0f12,#0a0c0e);transition:opacity .25s ease;z-index:0}.desktop:before{content:"";position:absolute;inset:0;background-image:radial-gradient(circle at 18% 28%,rgba(255,255,255,.025) 0%,transparent 30%),radial-gradient(circle at 82% 72%,rgba(255,255,255,.02) 0%,transparent 30%);mix-blend-mode:screen}.desktop:after{content:"";position:absolute;inset:0;background:radial-gradient(ellipse at top,#0a0a0c00,#0a0a0c8c)}.stage{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;padding:24px;z-index:1}#app{width:1280px;height:820px;max-width:100%;max-height:100%;display:flex;gap:0;padding:0;position:relative;border-radius:28px;overflow:hidden;background:var(--bg);box-shadow:none;color:var(--text);transform-origin:center center}.cm-scroll::-webkit-scrollbar{width:10px;height:10px}.cm-scroll::-webkit-scrollbar-thumb{background:#0000002e;border:2px solid transparent;background-clip:content-box;border-radius:8px}.cm-scroll::-webkit-scrollbar-thumb:hover{background:#00000052;border:2px solid transparent;background-clip:content-box}.cm-dark .cm-scroll::-webkit-scrollbar-thumb{background:#ffffff29;border:2px solid transparent;background-clip:content-box}.cm-noscrollbar{scrollbar-width:none;-ms-overflow-style:none}.cm-noscrollbar::-webkit-scrollbar{width:0;height:0;display:none}.main-scroll,.orders-grid-body,.settings-content,.log-body,.log-modal-body{scrollbar-width:none;-ms-overflow-style:none}.main-scroll::-webkit-scrollbar,.orders-grid-body::-webkit-scrollbar,.settings-content::-webkit-scrollbar,.log-body::-webkit-scrollbar,.log-modal-body::-webkit-scrollbar{width:0;height:0;display:none}@keyframes cm-pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.45;transform:scale(.85)}}@keyframes cm-status-breathe{0%,to{box-shadow:0 0 color-mix(in srgb,currentColor 24%,transparent)}50%{box-shadow:0 0 0 5px color-mix(in srgb,currentColor 0%,transparent)}}@keyframes cm-modal-in{0%{opacity:0;transform:scale(.96) translateY(8px)}to{opacity:1;transform:none}}@keyframes cm-overlay-in{0%{opacity:0}to{opacity:1}}@keyframes cm-spin{to{transform:rotate(360deg)}}.sidebar{width:232px;flex-shrink:0;position:absolute;top:8px;left:8px;bottom:8px;background:var(--sidebar);border:0;border-radius:14px;display:flex;flex-direction:column;overflow:hidden;backdrop-filter:saturate(180%) blur(34px);-webkit-backdrop-filter:saturate(180%) blur(34px);box-shadow:0 40px 100px #10161614,0 16px 40px #1016160d,0 4px 12px #10161608;z-index:5}.cm-dark .sidebar{border-right-color:#ffffff14;box-shadow:0 40px 100px #0000002e,0 16px 40px #0000001f,0 4px 12px #00000012}.sidebar:before{content:"";position:absolute;inset:0;pointer-events:none;background:linear-gradient(90deg,#ffffff9e,#ffffff1f 58%,#fff0),radial-gradient(circle at 30% 6%,rgba(255,255,255,.64),transparent 38%);opacity:.72}.cm-dark .sidebar:before{background:linear-gradient(90deg,rgba(255,255,255,.05),transparent 58%),radial-gradient(circle at 28% 10%,rgba(255,255,255,.08),transparent 34%);opacity:1}.sidebar>*{position:relative;z-index:1}.sidebar-header{padding:14px 16px 8px;-webkit-app-region:drag}.brand{-webkit-app-region:drag}.traffic{display:flex;gap:8px;align-items:center;-webkit-app-region:no-drag}.traffic-dot{width:12px;height:12px;border-radius:50%;border:none;padding:0;display:flex;align-items:center;justify-content:center;box-shadow:inset 0 0 0 .5px #00000026;cursor:pointer}.traffic-dot.close{background:#ff5f57}.traffic-dot.min{background:#febc2e}.traffic-dot.max{background:#28c840}.traffic-dot span{font-size:8px;line-height:1;color:#0000008c;font-weight:700;opacity:0}.traffic:hover .traffic-dot span{opacity:1}.brand{padding:10px 16px 18px;display:flex;align-items:center;gap:10px}.brand-text{font-size:14.5px;font-weight:700;color:var(--text);letter-spacing:-.005em}.brand-tag{margin-left:auto;font-size:10px;font-weight:700;color:var(--text-subtle);padding:2px 6px;border-radius:5px;background:var(--soft-fill);box-shadow:none}.cm-dark .brand-tag{background:#ffffff12;box-shadow:inset 0 1px #ffffff0d}.nav-section-label{padding:4px 18px 6px;font-size:10.5px;font-weight:700;letter-spacing:.1em;color:var(--text-subtle);text-transform:uppercase}.nav{padding:0 10px;display:flex;flex-direction:column;gap:1px}.nav-item{all:unset;display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:8px;font-size:13px;font-weight:500;color:var(--text-muted);background:transparent;transition:background .12s,color .12s,box-shadow .12s;position:relative;cursor:pointer}.nav-item:hover{background:#14120e09}.cm-dark .nav-item:hover{background:#ffffff0b}.nav-item.active{background:#14120e11;color:var(--text);box-shadow:inset 0 1px #ffffff6b,inset 0 0 0 .5px #14120e06}.cm-dark .nav-item.active{background:#ffffff13;box-shadow:inset 0 0 0 .5px #ffffff09}.nav-item.active:before{content:"";position:absolute;left:-10px;top:50%;transform:translateY(-50%);width:3px;height:18px;border-radius:2px;background:var(--accent)}.nav-icon{color:var(--text-muted);display:inline-flex}.nav-item.active .nav-icon{color:var(--accent)}.nav-label{flex:1}.nav-badge{font-size:10.5px;font-weight:700;background:var(--warn-bg);color:var(--warn);padding:1px 6px;border-radius:999px;line-height:1.4}.sidebar-spacer{flex:1}.network-rail{margin:0 16px 12px;padding:10px 12px;border-radius:10px;background:var(--dash-fill);border:.5px dashed var(--line);font-size:11.5px;color:var(--text-muted);display:flex;align-items:center;justify-content:space-between}.network-left{display:flex;align-items:center;gap:7px}.network-dot{width:7px;height:7px;border-radius:50%;background:var(--ok);box-shadow:0 0 0 3px var(--ok-bg)}.network-ping{font-family:ui-monospace,SF Mono,Menlo,monospace;color:var(--text-subtle)}.agent-card{margin:0;padding:10px 16px 14px;border-radius:0;background:transparent;border:0;box-shadow:none;font-size:12px}.cm-dark .agent-card{background:transparent;box-shadow:none}.agent-row{display:flex;align-items:center;gap:8px}.agent-avatar{width:32px;height:32px;border-radius:8px;background:var(--accent);color:#fff;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;letter-spacing:-.02em;flex-shrink:0;text-transform:uppercase}.agent-info{flex:1;min-width:0}.agent-name{font-size:13px;font-weight:600;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.agent-status{font-size:11px;color:var(--text-subtle);display:flex;align-items:center;gap:5px;margin-top:2px}.agent-status-dot{width:6px;height:6px;border-radius:50%;background:var(--ok);box-shadow:0 0 0 2.5px var(--ok-bg)}.icon-button{all:unset;cursor:pointer;color:var(--text-subtle);width:24px;height:24px;border-radius:6px;display:inline-flex;align-items:center;justify-content:center;background:var(--soft-fill)}.icon-button:hover{background:var(--soft-fill-strong)}.main{flex:1;width:100%;height:100%;display:flex;flex-direction:column;min-width:0;position:relative;background:var(--bg);border-radius:0;overflow:visible;z-index:1;padding-left:256px;box-sizing:border-box}.titlebar{height:0;flex-shrink:0;-webkit-app-region:drag}.main-scroll{flex:1;overflow:auto;padding:22px 28px 28px}.page-header{display:flex;align-items:flex-end;justify-content:space-between;margin-bottom:0;gap:16px}.page-title{margin:0;font-size:26px;font-weight:700;letter-spacing:-.02em;color:var(--text)}.page-subtitle{margin-top:6px;font-size:13px;color:var(--text-muted)}.page-actions{display:flex;gap:8px;align-items:center}.card{background:var(--surface);border-radius:14px;padding:20px;box-shadow:var(--card-shadow);border:.5px solid var(--line);transition:transform .14s ease,box-shadow .14s ease,border-color .14s}.card.flush{padding:0;overflow:hidden}.card.interactive{cursor:pointer}.card.interactive:hover{transform:translateY(-1px);border-color:var(--line-strong)}.eyebrow{font-size:11.5px;font-weight:600;letter-spacing:.08em;color:var(--text-subtle);text-transform:uppercase}.card-title{font-size:15.5px;font-weight:700;color:var(--text)}.card-subtitle{font-size:12px;color:var(--text-muted);margin-top:2px}.pill{display:inline-flex;align-items:center;gap:6px;padding:3px 9px 3px 8px;border-radius:999px;background:var(--soft-fill);color:var(--text-muted);font-size:11.5px;font-weight:600;letter-spacing:.01em;line-height:1;white-space:nowrap}.pill-dot{width:6px;height:6px;border-radius:50%;background:currentColor;flex-shrink:0}.pill.tone-ok{background:var(--ok-bg);color:var(--ok)}.pill.tone-warn{background:var(--warn-bg);color:var(--warn)}.pill.tone-err{background:var(--err-bg);color:var(--err)}.pill.tone-sync{background:color-mix(in srgb,var(--accent) 16%,transparent);color:var(--accent)}.pill-spinner{width:8px;height:8px;border-radius:50%;border:1.5px solid currentColor;border-right-color:transparent;flex-shrink:0;animation:cm-spin .45s linear infinite}.platform-status-light{width:14px;height:14px;border-radius:50%;flex-shrink:0;justify-self:end;display:inline-flex;align-items:center;justify-content:center;position:relative;background:color-mix(in srgb,currentColor 10%,transparent);color:var(--text-muted);box-shadow:inset 0 0 0 .5px color-mix(in srgb,currentColor 28%,transparent)}.status-light-core{width:6px;height:6px;border-radius:50%;background:currentColor;box-shadow:0 0 0 .5px color-mix(in srgb,#fff 74%,transparent),0 1px 2px color-mix(in srgb,currentColor 34%,transparent)}.platform-status-light.tone-ok{color:#5cc98a;animation:cm-status-breathe 1.8s ease-in-out infinite}.platform-status-light.tone-warn{color:var(--warn);animation:cm-status-breathe 2s ease-in-out infinite}.platform-status-light.tone-err{color:var(--err);animation:cm-status-breathe 1.7s ease-in-out infinite}.platform-status-light.tone-off{color:color-mix(in srgb,var(--text-muted) 72%,transparent);background:color-mix(in srgb,currentColor 8%,transparent)}.platform-status-light.tone-off .status-light-core{width:5px;height:5px;opacity:.72;box-shadow:none}.btn{all:unset;cursor:pointer;display:inline-flex;align-items:center;gap:6px;padding:8px 14px;border-radius:9px;font-size:13px;font-weight:600;border:.5px solid var(--line);background:transparent;color:var(--text);white-space:nowrap;transition:opacity .12s,transform .08s,background .12s}.btn:hover{opacity:.95}.btn:active{transform:translateY(.5px);opacity:.85}.btn.size-sm{padding:6px 10px;border-radius:7px;font-size:12px}.btn.size-lg{padding:12px 18px;font-size:14px}.btn.kind-solid{background:var(--accent);color:#fff;border-color:transparent;box-shadow:0 1px #ffffff2e inset,0 1px 2px #0000001f}.btn.kind-soft{background:var(--soft-fill);color:var(--text);border-color:transparent}.btn.kind-soft:hover{background:var(--soft-fill-strong)}.btn.danger{color:var(--err)}.btn.kind-solid.danger{background:var(--err);color:#fff}.btn.kind-soft.danger{background:var(--err-bg);color:var(--err)}.btn:disabled{opacity:.55;cursor:default}.row-stack{display:flex;flex-direction:column;gap:16px}.connections-stack .page-header{margin-bottom:8px}.row-hero{display:grid;grid-template-columns:1.55fr 1fr;gap:14px}.row-services{display:grid;grid-template-columns:1fr 1.1fr;gap:14px}.balance-head{display:flex;justify-content:space-between;align-items:flex-start}.balance-delta{display:inline-flex;align-items:center;gap:4px;color:var(--ok);font-size:12px;font-weight:600}.balance-row{display:flex;align-items:flex-end;justify-content:space-between;margin-top:10px;gap:14px}.balance-value{font-size:38px;font-weight:700;letter-spacing:-.025em;color:var(--text);line-height:1;font-variant-numeric:tabular-nums}.chain-list{margin-top:16px;display:flex;flex-direction:column;border:.5px solid var(--line);border-radius:10px;overflow:hidden;background:var(--surface-alt)}.chain-row{display:flex;align-items:center;gap:10px;padding:10px 12px;border-bottom:.5px solid var(--line)}.chain-row:last-child{border-bottom:none}.pending-row{border-top:1px dashed var(--line-strong)}.pending-glyph{background:color-mix(in srgb,var(--accent) 14%,var(--surface));color:var(--accent)}.pending-note{font-size:10.5px;color:var(--text-subtle);margin-top:1px}.pending-row .chain-balance{color:var(--accent)}.chain-glyph{width:24px;height:24px;border-radius:6px;background:var(--surface);display:flex;align-items:center;justify-content:center;flex-shrink:0;box-shadow:inset 0 0 0 .5px var(--line)}.chain-info{flex:1;min-width:0}.chain-name{font-size:12.5px;font-weight:600;color:var(--text)}.chain-addr{all:unset;cursor:pointer;margin-top:1px;font-size:10.5px;color:var(--text-subtle);font-family:ui-monospace,SF Mono,Menlo,monospace;display:inline-flex;align-items:center;gap:4px}.chain-addr.copied{color:var(--ok)}.chain-balance{font-size:14px;font-weight:700;color:var(--text);font-family:ui-monospace,SF Mono,Menlo,monospace}.plugin-line{margin-top:14px;font-size:13.5px;color:var(--text);line-height:1.55}.plugin-line .muted{color:var(--text-muted)}.plugin-meta{margin-top:8px;font-size:11.5px;color:var(--text-subtle);display:flex;align-items:center;gap:6px}.plugin-actions{margin-top:14px;display:flex;gap:8px}.service-list{margin-top:14px;display:flex;flex-direction:column}.service-row{display:flex;align-items:center;justify-content:space-between;padding:12px 0;border-bottom:.5px dashed var(--line)}.service-row:last-child{border-bottom:none}.service-head{display:flex;align-items:center;gap:8px}.service-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0;background:var(--text-subtle)}.service-dot.running{background:var(--ok);box-shadow:0 0 0 3px var(--ok-bg)}.service-name{font-size:13.5px;font-weight:600;color:var(--text)}.service-sub{font-size:12px;color:var(--text-muted);margin-top:3px;margin-left:15px}.service-actions{display:flex;align-items:center;gap:8px}.log-card-head{padding:20px 20px 12px;display:flex;justify-content:space-between;align-items:flex-start}.card:not(.flush)>.log-card-head{padding:0 0 12px}.log-live{display:flex;align-items:center;gap:10px;font-size:11px;color:var(--text-subtle)}.log-live-tag{display:inline-flex;align-items:center;gap:6px}.log-live-dot{width:7px;height:7px;border-radius:50%;background:var(--ok);animation:cm-pulse 2s ease-in-out infinite}.log-expand{all:unset;cursor:pointer;width:24px;height:24px;border-radius:6px;display:inline-flex;align-items:center;justify-content:center;color:var(--text-muted);background:var(--soft-fill)}.log-body{margin:0 20px 20px;background:var(--terminal-bg);border-radius:10px;padding:12px;max-height:224px;overflow-y:auto;overflow-x:hidden;font-family:ui-monospace,SF Mono,JetBrains Mono,Menlo,monospace;font-size:11.5px;line-height:1.7;color:#e7e5df}.log-line{display:flex;gap:10px;padding:1px 0}.log-line .log-msg{min-width:0;flex:1;word-break:break-all;white-space:pre-wrap}.log-time{color:#ffffff61;flex-shrink:0}.log-level{width:42px;flex-shrink:0;font-weight:600}.log-level.INFO{color:#a8a59c}.log-level.WARN{color:#f0a955}.log-level.ERROR{color:#f06464}.log-level.DEBUG{color:#6e6c64}.log-msg{color:#e7e5df}.log-msg.ERROR{color:#fca5a5}.search-box{display:flex;align-items:center;gap:6px;padding:7px 10px;border:.5px solid var(--line);border-radius:9px;background:var(--surface);width:220px}.search-box input{all:unset;flex:1;font-size:13px;color:var(--text);min-width:0}.search-box input::placeholder{color:var(--text-subtle)}.icon-search{color:var(--text-subtle);display:inline-flex}.icon-clear{all:unset;cursor:pointer;color:var(--text-subtle);display:inline-flex}.category-chips{display:flex;gap:6px;overflow-x:auto;padding:2px 0}.chip{all:unset;cursor:pointer;white-space:nowrap;padding:6px 12px;border-radius:999px;font-size:12.5px;font-weight:600;color:var(--text);background:#14120e0b;border:.5px solid var(--line);display:inline-flex;align-items:center;gap:6px;transition:background .12s}.cm-dark .chip{background:#ffffff0d}.chip.active{background:var(--accent);color:#fff;-webkit-text-fill-color:#fff;border-color:var(--accent)}.chip-count{font-size:10.5px;font-weight:700;opacity:.5}.chip.active .chip-count{opacity:.55}.platform-grid{display:grid;gap:10px;grid-template-columns:repeat(3,minmax(0,1fr))}.platform-grid.compact{grid-template-columns:repeat(4,minmax(0,1fr))}.platform-card{all:unset;cursor:pointer;background:var(--surface);border-radius:12px;padding:13px 14px;box-shadow:var(--card-shadow);border:.5px solid color-mix(in srgb,var(--line) 62%,transparent);display:flex;align-items:center;gap:12px;position:relative;transition:transform .18s ease,border-color .2s ease,box-shadow .24s ease}.platform-card:hover{transform:translateY(-1px);border-color:color-mix(in srgb,var(--line-strong) 46%,transparent);box-shadow:var(--card-shadow),0 18px 40px -24px #f0b90b8c,0 8px 18px -16px #f0b90b47}.cm-dark .platform-card:hover{box-shadow:var(--card-shadow),0 18px 40px -24px #f0b90b6b,0 8px 22px -16px #f0b90b3d}.platform-glyph{width:36px;height:36px;flex-shrink:0;border-radius:10px;display:flex;align-items:center;justify-content:center;color:#fff;font-weight:700;font-size:15px;letter-spacing:-.5px;box-shadow:inset 0 0 0 .5px #ffffff1f,inset 0 1px #ffffff2e;overflow:hidden;font-family:-apple-system,SF Pro Display,PingFang SC,sans-serif}.platform-glyph img,.platform-glyph svg{width:56%;height:56%;object-fit:contain;display:block}.platform-glyph svg{fill:#fff}.platform-info{flex:1;min-width:0}.platform-row1{display:flex;align-items:center;gap:6px}.platform-name{font-size:14px;font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.platform-hot{font-size:10px;font-weight:700;color:var(--accent);padding:1px 5px;border-radius:4px;background:color-mix(in srgb,var(--accent) 14%,transparent)}.cm-dark .platform-hot{background:#ffffff0f}.platform-row2{font-size:11.5px;color:var(--text-muted);margin-top:2px;display:flex;align-items:center;gap:6px}.mode-tag{font-size:9.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;padding:1px 5px;border-radius:4px}.mode-tag.public{color:var(--ok);background:var(--ok-bg)}.mode-tag.browser{color:var(--warn);background:var(--warn-bg)}.empty-state{grid-column:1 / -1;text-align:center;padding:60px 0;color:var(--text-muted);font-size:13px}.stats-strip{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}.stat-card{padding:16px;background:var(--surface);border:.5px solid var(--line);border-radius:14px;box-shadow:var(--card-shadow)}.stat-row{display:flex;align-items:flex-end;justify-content:space-between;margin-top:8px;gap:8px}.stat-value{font-size:22px;font-weight:700;color:var(--text);letter-spacing:-.02em;line-height:1}.stat-delta{margin-top:8px;font-size:11.5px;font-weight:500;color:var(--text-muted)}.stat-delta.tone-ok{color:var(--ok)}.row-orders-mid{display:grid;grid-template-columns:1.05fr 1.4fr;gap:14px}.chart-container{margin-top:18px}.bar-chart{position:relative;height:160px;display:flex;align-items:flex-end;gap:10px}.bar-grid{position:absolute;left:0;right:0;border-top:.5px dashed var(--line);pointer-events:none}.bar-col{flex:1;position:relative;display:flex;flex-direction:column;justify-content:flex-end;height:100%}.bar{border-radius:6px;background:color-mix(in srgb,var(--accent) 28%,transparent);transition:height .35s cubic-bezier(.2,.7,.2,1);position:relative}.cm-dark .bar{background:color-mix(in srgb,var(--accent) 22%,transparent)}.bar.is-last{background:var(--accent)}.bar-tip{position:absolute;top:-22px;left:50%;transform:translate(-50%);font-size:11px;font-weight:700;color:var(--text);white-space:nowrap}.bar-labels{display:flex;gap:10px;margin-top:8px}.bar-label{flex:1;text-align:center;font-size:11px;color:var(--text-subtle);font-weight:500}.bar-label.is-last{color:var(--text);font-weight:600}.escrow-list{margin-top:14px;display:flex;flex-direction:column}.escrow-row{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:.5px dashed var(--line)}.escrow-row:last-child{border-bottom:none}.escrow-info{flex:1;min-width:0}.escrow-skill{font-size:13.5px;font-weight:600;color:var(--text)}.escrow-meta{font-size:11.5px;color:var(--text-muted);margin-top:2px}.escrow-amount{text-align:right}.escrow-reward{font-size:14px;font-weight:700;color:var(--text)}.escrow-status{font-size:10.5px;color:var(--ok);font-weight:600;margin-top:2px}.orders-toolbar{padding:14px 20px;border-bottom:.5px solid var(--line);display:flex;align-items:center;gap:18px;justify-content:space-between}.tab-group{display:flex;gap:4px;background:#14120e0b;padding:3px;border-radius:9px}.cm-dark .tab-group{background:#ffffff0d}.tab{all:unset;cursor:pointer;padding:5px 12px;border-radius:6px;font-size:12.5px;font-weight:600;color:var(--text-muted);display:inline-flex;align-items:center;gap:6px}.tab.active{color:var(--text);background:var(--surface);box-shadow:0 1px 2px #0000000f}.tab-count{font-size:10.5px;font-weight:700;opacity:.5}.tz-stamp{font-size:11.5px;color:var(--text-subtle);font-family:ui-monospace,SF Mono,Menlo,monospace}.orders-grid-head{display:grid;grid-template-columns:80px 1.5fr 2fr 1fr 90px 70px;padding:10px 20px;gap:12px;font-size:11px;font-weight:700;letter-spacing:.06em;color:var(--text-subtle);text-transform:uppercase;border-bottom:.5px dashed var(--line)}.orders-grid-head .right{text-align:right}.orders-grid-body{max-height:260px;overflow:auto}.orders-row{display:grid;grid-template-columns:80px 1.5fr 2fr 1fr 90px 70px;padding:12px 20px;gap:12px;font-size:13px;color:var(--text);align-items:center;border-bottom:.5px solid var(--line)}.orders-row:last-child{border-bottom:none}.orders-row .time,.orders-row .dur{font-family:ui-monospace,SF Mono,Menlo,monospace;color:var(--text-muted);font-size:12px}.orders-row .platform-cell{display:flex;align-items:center;gap:8px}.orders-row .amount{text-align:right;font-weight:600}.orders-row .amount.zero{color:var(--text-subtle)}.orders-row .right{text-align:right}.platform-glyph.size-sm{width:22px;height:22px;border-radius:6px;font-size:9.5px}.platform-glyph.size-lg{width:52px;height:52px;border-radius:14px;font-size:22px}.modal-backdrop{position:absolute;inset:0;z-index:50;background:#14120e6b;display:flex;align-items:center;justify-content:center;border-radius:16px;animation:cm-overlay-in .2s ease both}.cm-dark .modal-backdrop{background:#080809ad}.platform-modal{width:520px;background:var(--surface);border-radius:16px;box-shadow:var(--shadow);border:.5px solid var(--line-strong);animation:cm-modal-in .26s cubic-bezier(.2,.7,.2,1) both;overflow:hidden}.platform-modal-head{padding:22px 24px 18px;display:flex;gap:14px;align-items:flex-start}.platform-modal-info{flex:1;min-width:0}.platform-modal-cat{font-size:11px;font-weight:700;letter-spacing:.1em;color:var(--text-subtle);text-transform:uppercase}.platform-modal-title{font-size:22px;font-weight:700;color:var(--text);letter-spacing:-.02em;margin-top:4px}.platform-modal-meta{margin-top:6px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}.platform-modal-skills{font-size:12px;color:var(--text-muted)}.modal-close-btn{all:unset;cursor:pointer;width:28px;height:28px;border-radius:8px;display:flex;align-items:center;justify-content:center;color:var(--text-muted);background:var(--soft-fill)}.platform-modal-desc{padding:4px 24px 18px;font-size:13.5px;color:var(--text-muted);line-height:1.55}.platform-meta-grid{margin:0 24px 16px;padding:14px 16px;border-radius:12px;background:var(--surface-alt);border:.5px solid var(--line);display:grid;grid-template-columns:auto 1fr auto 1fr;row-gap:10px;column-gap:14px;font-size:12.5px}.platform-meta-grid .k{color:var(--text-muted)}.platform-meta-grid .v{color:var(--text);font-weight:500;text-align:right}.platform-meta-grid .v.strong{font-weight:600}.platform-meta-grid .v.mono{font-family:ui-monospace,SF Mono,Menlo,monospace;font-size:12px}.platform-caps{padding:0 24px 6px}.platform-toggle{all:unset;display:block;flex-shrink:0;width:44px;height:25px;box-sizing:border-box;border-radius:999px;cursor:pointer;position:relative;background:#d2d5da;transition:background .1s ease}.cm-dark .platform-toggle{background:#4a4d53}.platform-toggle.on{background:var(--accent)}.platform-toggle-thumb{position:absolute;top:2px;left:2px;width:21px;height:21px;border-radius:50%;background:#fff;box-shadow:0 1px 3px #00000047;transform:translate(0);transition:transform .11s cubic-bezier(.2,.8,.2,1);will-change:transform}.platform-toggle.on .platform-toggle-thumb{transform:translate(19px)}.platform-skill-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:10px 2px;border-bottom:1px solid var(--line)}.platform-skill-row:last-child{border-bottom:none}.platform-skill-copy{display:flex;flex-direction:column;gap:2px;min-width:0}.platform-skill-name{font-family:ui-monospace,SF Mono,Menlo,monospace;font-size:13px;font-weight:600;color:var(--text)}.platform-skill-desc{font-size:11.5px;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.platform-skill-status{flex-shrink:0;font-size:11.5px;font-weight:600;color:var(--text-muted)}.platform-skill-status.on{color:var(--accent)}.caps-label{font-size:11.5px;font-weight:700;letter-spacing:.08em;color:var(--text-subtle);text-transform:uppercase;margin-bottom:10px}.caps-list{display:flex;flex-wrap:wrap;gap:6px}.cap-tag{display:inline-flex;align-items:center;gap:5px;padding:5px 10px;border-radius:7px;background:var(--surface-alt);border:.5px solid var(--line);font-size:12px;color:var(--text)}.cap-icon{color:var(--accent);display:inline-flex}.platform-modal-footer{padding:14px 24px 20px;display:flex;justify-content:flex-end;gap:8px;border-top:.5px solid var(--line);margin-top:12px}.log-modal{width:min(1100px,100%);height:min(700px,100%);background:#0b0c0e;color:#e7e5df;border-radius:14px;box-shadow:var(--shadow);border:.5px solid var(--line-strong);display:flex;flex-direction:column;animation:cm-modal-in .26s cubic-bezier(.2,.7,.2,1) both;overflow:hidden;font-family:ui-monospace,SF Mono,JetBrains Mono,Menlo,monospace}.cm-dark .log-modal{background:#0b0c0e}.log-modal-head{padding:12px 16px;border-bottom:.5px solid rgba(255,255,255,.07);display:flex;align-items:center;gap:12px;flex-shrink:0;font-family:-apple-system,SF Pro Text,PingFang SC,system-ui,sans-serif}.log-modal-title-tag{display:flex;align-items:center;gap:8px}.log-modal-live{width:8px;height:8px;border-radius:50%;background:#3cc88a;animation:cm-pulse 2s ease-in-out infinite}.log-modal-live.paused{background:#a8a59c;animation:none}.log-modal-title{font-size:13.5px;font-weight:700;color:#f3f2ee}.log-modal-counts{font-size:11px;color:#ffffff80}.log-modal-spacer{flex:1}.log-modal-search{display:flex;align-items:center;gap:6px;padding:5px 9px;border:.5px solid rgba(255,255,255,.08);border-radius:7px;background:#ffffff0a;width:220px}.log-modal-search input{all:unset;flex:1;font-size:12px;color:#f3f2ee;min-width:0}.log-modal-search input::placeholder{color:#fff6}.log-modal-filters{display:flex;gap:4px}.log-modal-filter{all:unset;cursor:pointer;padding:4px 10px;border-radius:6px;font-size:11px;font-weight:600;letter-spacing:.04em;background:#ffffff0a;color:#f3f2ee;display:inline-flex;align-items:center;gap:5px}.log-modal-filter.INFO{color:#a8a59c}.log-modal-filter.WARN{color:#f0a955}.log-modal-filter.ERROR{color:#f06464}.log-modal-filter.DEBUG{color:#6e6c64}.log-modal-filter.active{color:#0b0c0e;background:#f3f2ee}.log-modal-filter.active.INFO{background:#a8a59c}.log-modal-filter.active.WARN{background:#f0a955}.log-modal-filter.active.ERROR{background:#f06464}.log-modal-filter.active.DEBUG{background:#6e6c64}.log-modal-filter-count{font-size:9.5px;opacity:.7}.log-modal-actions{display:flex;gap:4px}.log-modal-iconbtn{all:unset;cursor:pointer;width:28px;height:28px;border-radius:7px;background:#ffffff0a;color:#e7e5df;display:inline-flex;align-items:center;justify-content:center}.log-modal-iconbtn:hover{background:#ffffff14}.log-modal-body{flex:1;overflow:auto;padding:12px 16px;font-size:12.5px;line-height:1.75}.log-modal-body .log-line{gap:12px;padding:2px 0}.log-modal-body .log-time{width:104px;color:#ffffff59}.log-modal-body .log-level{width:52px;font-weight:700}.log-modal-body .log-msg.WARN{color:#fcd5a5}.log-modal-empty{padding:40px 0;text-align:center;color:#fff6;font-family:-apple-system,system-ui,sans-serif}.log-modal-foot{padding:8px 16px;border-top:.5px solid rgba(255,255,255,.07);display:flex;justify-content:space-between;align-items:center;font-size:10.5px;color:#ffffff73;flex-shrink:0}.login-screen{flex:1;display:flex;align-items:center;justify-content:center;background:var(--bg);position:relative;overflow:hidden;background-image:radial-gradient(ellipse 80% 60% at 30% 0%,color-mix(in srgb,var(--accent) 18%,transparent) 0%,transparent 60%),radial-gradient(ellipse 60% 60% at 100% 100%,color-mix(in srgb,var(--accent) 14%,transparent) 0%,transparent 60%)}.login-grid{position:absolute;inset:0;opacity:.04;background-image:linear-gradient(var(--text) .5px,transparent .5px),linear-gradient(90deg,var(--text) .5px,transparent .5px);background-size:36px 36px;-webkit-mask-image:radial-gradient(ellipse at center,black 40%,transparent 80%);mask-image:radial-gradient(ellipse at center,black 40%,transparent 80%)}.cm-dark .login-grid{opacity:.05}.login-container{width:420px;position:relative;z-index:1}.login-brand{display:flex;align-items:center;gap:12px;margin-bottom:32px;justify-content:center}.login-brand-name{font-size:22px;font-weight:700;color:var(--text);letter-spacing:-.02em}.login-brand-tag{font-size:12px;color:var(--text-muted);margin-top:2px}.login-card{background:var(--surface);border-radius:18px;border:.5px solid var(--line);box-shadow:var(--shadow);overflow:hidden}.login-pad{padding:30px 28px 26px}.login-title{font-size:17px;font-weight:700;color:var(--text);letter-spacing:-.01em}.login-sub{font-size:13px;color:var(--text-muted);margin-top:4px;line-height:1.55}.login-btn-google{all:unset;cursor:pointer;margin-top:22px;display:flex;align-items:center;justify-content:center;gap:10px;width:100%;box-sizing:border-box;padding:12px 14px;background:var(--surface);color:var(--text);border:.5px solid var(--line-strong);border-radius:10px;font-size:13.5px;font-weight:600;box-shadow:0 1px 2px #0000000a}.login-divider{margin:18px 0;display:flex;align-items:center;gap:10px}.login-divider .line{flex:1;height:1px;background:var(--line)}.login-divider .label{font-size:10.5px;font-weight:600;color:var(--text-subtle);letter-spacing:.1em;text-transform:uppercase}.login-btn-email{all:unset;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:8px;width:100%;box-sizing:border-box;padding:12px 14px;background:transparent;color:var(--text);border:.5px solid var(--line);border-radius:10px;font-size:13.5px;font-weight:600}.login-terms{margin-top:20px;font-size:11px;color:var(--text-subtle);line-height:1.55}.login-error{margin-top:16px;padding:10px 12px;border-radius:9px;background:var(--err-bg);color:var(--err);font-size:12.5px;line-height:1.5}.login-back{all:unset;cursor:pointer;font-size:12px;color:var(--text-muted);margin-bottom:14px;display:inline-flex;align-items:center;gap:4px}.login-label{display:block;margin-top:18px;margin-bottom:6px;font-size:12px;font-weight:600;color:var(--text)}.login-input{width:100%;box-sizing:border-box;padding:10px 12px;border-radius:9px;border:.5px solid var(--line);background:var(--surface-alt);color:var(--text);font-size:13.5px;font-family:inherit;outline:none}.login-input:focus{border-color:var(--accent)}.login-submit{all:unset;cursor:pointer;margin-top:24px;width:100%;box-sizing:border-box;padding:12px 14px;background:var(--accent);color:#fff;border-radius:10px;text-align:center;font-size:13.5px;font-weight:600;box-shadow:0 1px #ffffff2e inset}.login-code-row{display:flex;gap:8px;margin-top:20px;justify-content:space-between}.login-code-input{width:48px;height:56px;text-align:center;font-size:22px;font-weight:700;color:var(--text);font-family:ui-monospace,SF Mono,Menlo,monospace;background:var(--surface-alt);border:1px solid var(--line);border-radius:10px;outline:none;transition:border-color .12s,background .12s;caret-color:var(--accent)}.login-code-input:focus{border-color:var(--accent)}.login-code-input.error{border-color:var(--err);background:var(--err-bg);color:var(--err)}.login-code-status{margin-top:14px;min-height:18px;font-size:12px;display:flex;align-items:center;gap:6px}.login-spinner{width:12px;height:12px;display:inline-block;border-radius:50%;border:2px solid var(--line);border-top-color:var(--accent);animation:cm-spin .8s linear infinite}.login-code-status.error{color:var(--err);font-weight:500}.login-code-status.muted{color:var(--text-muted)}.login-code-footer{margin-top:16px;padding-top:14px;border-top:.5px dashed var(--line);display:flex;justify-content:space-between;align-items:center;font-size:12px;color:var(--text-muted)}.login-code-resend{all:unset;cursor:pointer;color:var(--accent);font-weight:600}.login-code-resend.disabled{color:var(--text-muted);cursor:default}.login-google-state{padding:44px 28px 32px;text-align:center}.google-avatar{position:relative;width:72px;height:72px;margin:0 auto 18px}.google-avatar-bg{position:absolute;inset:0;border-radius:50%;background:var(--soft-fill);transition:background .3s}.google-avatar-bg.success{background:var(--accent)}.google-avatar-ring{position:absolute;inset:-4px;border-radius:50%;border:2px solid transparent;border-top-color:var(--accent);animation:cm-spin 1s linear infinite}.google-avatar-icon{position:absolute;inset:0;display:flex;align-items:center;justify-content:center}.google-state-title{font-size:17px;font-weight:700;color:var(--text)}.google-state-sub{font-size:13px;color:var(--text-muted);margin-top:8px;line-height:1.55}.google-state-domain{margin-top:18px;font-size:11px;color:var(--text-subtle);font-family:ui-monospace,SF Mono,Menlo,monospace}.google-continue-btn{all:unset;cursor:pointer;margin-top:22px;padding:10px 22px;border-radius:9px;background:var(--text);color:var(--bg);font-size:13px;font-weight:600}.login-footer{margin-top:18px;display:flex;justify-content:space-between;align-items:center;font-size:11px;color:var(--text-subtle)}.login-footer-links{display:flex;gap:14px}.lang-toggle-segment{display:inline-flex;padding:2px;border-radius:7px;background:#14120e0a;border:.5px solid var(--line)}.cm-dark .lang-toggle-segment{background:#ffffff0d}.lang-toggle-option{all:unset;cursor:pointer;padding:2px 9px;border-radius:5px;font-size:10.5px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--text-subtle)}.lang-toggle-option.active{color:var(--text);background:var(--surface);box-shadow:0 1px 2px #0000000f}.login-corner-traffic{position:absolute;top:14px;left:16px;z-index:10;-webkit-app-region:no-drag}.settings-modal{width:760px;height:540px;background:var(--surface);border-radius:16px;box-shadow:var(--shadow);border:.5px solid var(--line-strong);display:flex;overflow:hidden;animation:cm-modal-in .26s cubic-bezier(.2,.7,.2,1) both}.settings-sidebar{width:200px;background:var(--surface-alt);padding:14px 10px;border-right:.5px solid var(--line);display:flex;flex-direction:column}.settings-sidebar-title{padding:4px 10px 10px;font-size:13px;font-weight:700;color:var(--text)}.settings-nav{all:unset;cursor:pointer;padding:7px 10px;border-radius:7px;display:flex;align-items:center;gap:9px;font-size:12.5px;font-weight:500;color:var(--text-muted)}.settings-nav.active{font-weight:600;color:var(--text);background:var(--nav-active-fill)}.settings-nav-icon{color:var(--text-subtle);display:inline-flex}.settings-nav.active .settings-nav-icon{color:var(--accent)}.settings-logout{all:unset;cursor:pointer;padding:7px 10px;border-radius:7px;display:flex;align-items:center;gap:9px;font-size:12.5px;font-weight:600;color:var(--err)}.settings-content{flex:1;padding:18px 24px 24px;overflow:auto}.settings-content-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:18px}.settings-content-title{font-size:17px;font-weight:700;color:var(--text);letter-spacing:-.01em}.settings-profile{display:flex;align-items:center;gap:14px;padding:14px 16px;border-radius:12px;background:var(--surface-alt);border:.5px solid var(--line)}.settings-profile .avatar{width:44px;height:44px;border-radius:10px;background:var(--accent);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;letter-spacing:-.02em;font-size:16px;text-transform:uppercase}.settings-profile .info{flex:1;min-width:0}.settings-profile .name{font-size:15px;font-weight:700;color:var(--text)}.settings-profile .addr{font-size:12px;color:var(--text-muted);font-family:ui-monospace,SF Mono,Menlo,monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.set-row{display:flex;align-items:center;justify-content:space-between;padding:14px 0;border-bottom:.5px dashed var(--line);gap:18px}.set-row .label-wrap{min-width:0}.set-row .label{font-size:13.5px;font-weight:600;color:var(--text)}.set-row .sub{font-size:11.5px;color:var(--text-muted);margin-top:2px}.set-toggle{all:unset;cursor:pointer;position:relative;width:36px;height:22px;border-radius:999px;background:#14120e26;transition:background .15s}.cm-dark .set-toggle{background:#ffffff1f}.set-toggle.on{background:var(--ok)}.set-toggle:after{content:"";position:absolute;top:2px;left:2px;width:18px;height:18px;border-radius:50%;background:#fff;box-shadow:0 1px 3px #0003;transition:left .15s}.set-toggle.on:after{left:16px}.set-code{font-family:ui-monospace,SF Mono,Menlo,monospace;font-size:12px;background:var(--surface-alt);padding:4px 8px;border-radius:6px;color:var(--text)}.set-input,.set-select{padding:6px 10px;border-radius:7px;border:.5px solid var(--line);background:var(--surface);color:var(--text);font-size:13;font-family:inherit;outline:none}.set-input.mono{font-family:ui-monospace,SF Mono,Menlo,monospace;font-size:12px}.about-block{text-align:center;padding:40px 0}.about-name{margin-top:14px;font-size:20px;font-weight:700;color:var(--text);letter-spacing:-.02em}.about-version{margin-top:4px;font-size:12px;color:var(--text-muted);font-family:ui-monospace,SF Mono,Menlo,monospace}.about-copy{margin-top:18px;font-size:12px;color:var(--text-subtle);line-height:1.6}.about-actions{margin-top:22px;display:flex;justify-content:center;gap:8px}.hidden{display:none!important}.muted{color:var(--text-muted)}.busy{cursor:wait}.density-compact .card{padding:16px}.density-compact .log-card-head{padding:16px 16px 12px}.density-compact .log-body{margin:0 16px 16px}body.is-tauri{background:transparent}.is-tauri .desktop{display:none}.is-tauri .stage{padding:0}.is-tauri #app{width:100vw;height:100vh;max-width:none;max-height:none;border-radius:0;box-shadow:none;transform:none!important}.is-tauri .traffic{visibility:hidden;pointer-events:none}.is-tauri .brand>*{pointer-events:none}.is-tauri .login-corner-traffic{display:none}.boot-screen{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;background:var(--bg);color:var(--text)}.boot-mark{width:64px;height:64px;display:grid;place-items:center;border-radius:18px;background:var(--surface);box-shadow:var(--card-shadow)}.boot-title{margin-top:8px;font-size:20px;font-weight:800}.boot-subtitle{color:var(--text-muted);font-size:13px}.boot-spinner{width:22px;height:22px;margin-top:8px;border-radius:50%;border:2px solid var(--line-strong);border-top-color:var(--accent);animation:cm-spin .8s linear infinite}.is-tauri .login-screen{padding-top:32px}.preflight-notice{border:.5px solid var(--warn);background:var(--warn-bg);display:flex;flex-direction:column;gap:14px}.preflight-notice.probing{border-color:var(--line-strong);background:var(--soft-fill)}.preflight-notice.probing .preflight-notice-icon{background:transparent}.preflight-notice-head{display:flex;align-items:flex-start;gap:11px}.preflight-notice-icon{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:8px;background:var(--warn-bg);color:var(--warn);flex-shrink:0}.preflight-notice-text{display:flex;flex-direction:column;gap:2px;min-width:0}.preflight-notice-title{font-size:14px;font-weight:700;color:var(--text)}.preflight-notice-sub{font-size:12px;color:var(--text-muted)}.ext-offline-notice{border:.5px solid var(--warn);background:var(--warn-bg);display:flex;align-items:center;justify-content:space-between;gap:14px}.ext-offline-head{display:flex;align-items:flex-start;gap:11px;min-width:0}.ext-offline-icon{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:8px;background:var(--warn-bg);color:var(--warn);flex-shrink:0}.ext-offline-text{display:flex;flex-direction:column;gap:2px;min-width:0}.ext-offline-title{font-size:14px;font-weight:700;color:var(--text)}.ext-offline-sub{font-size:12px;color:var(--text-muted);line-height:1.5}.ext-offline-actions{flex-shrink:0}.preflight-issue-list{display:flex;flex-direction:column;gap:10px;padding-top:12px;border-top:.5px solid var(--line)}.preflight-issue{display:flex;align-items:flex-start;gap:10px}.preflight-issue-body{flex:1;min-width:0}.preflight-issue>.btn{flex-shrink:0;align-self:center}.preflight-issue-dot{width:8px;height:8px;border-radius:50%;margin-top:5px;flex-shrink:0}.preflight-issue-dot.tone-err{background:var(--err)}.preflight-issue-dot.tone-warn{background:var(--warn)}.preflight-issue-body{display:flex;flex-direction:column;gap:2px;min-width:0}.preflight-issue-name{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:650;color:var(--text)}.preflight-issue-count{font-size:11px;font-weight:600;color:var(--text-muted);background:var(--soft-fill);border-radius:5px;padding:1px 6px;white-space:nowrap}.preflight-issue-reason{font-size:12px;color:var(--text-muted)}.preflight-issue-hint{font-size:12px;color:var(--text-subtle)}.llm-upload-card{display:flex;flex-direction:column;gap:12px}.llm-provider-list{display:flex;flex-direction:column;margin-top:14px;padding-top:4px;border-top:.5px solid var(--line)}.llm-provider-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:11px 0}.llm-provider-row+.llm-provider-row{border-top:.5px solid var(--line)}.llm-provider-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0;background:currentColor;box-shadow:0 0 0 3px color-mix(in srgb,currentColor 15%,transparent)}.llm-provider-dot.tone-ok{color:#5cc98a}.llm-provider-dot.tone-warn{color:var(--warn)}.llm-provider-dot.tone-off{color:var(--text-subtle)}.llm-provider-dot.is-live{animation:cm-status-breathe 1.8s ease-in-out infinite}.llm-provider-info{flex:1;display:flex;flex-direction:column;gap:2px;min-width:0}.llm-provider-name{font-size:13.5px;font-weight:650;color:var(--text)}.llm-provider-model{font-size:11px;color:var(--text-subtle);font-family:ui-monospace,SF Mono,Menlo,monospace}.llm-provider-status{font-size:12px;color:var(--text-muted);white-space:nowrap;text-align:right}.llm-provider-side{display:flex;align-items:center;gap:10px;flex-shrink:0}.llm-provider-row.is-disabled .llm-provider-name{color:var(--text-muted)}.llm-provider-row.is-disabled .llm-provider-model{opacity:.6}.llm-provider-side .relay-switch{width:38px;height:22px;border-radius:11px}.llm-provider-side .relay-switch-knob{width:16px;height:16px}.llm-provider-side .relay-switch.on .relay-switch-knob{transform:translate(16px)}.update-notice{display:flex;align-items:center;justify-content:space-between;gap:16px;border:1px solid color-mix(in srgb,var(--accent) 55%,transparent);background:color-mix(in srgb,var(--accent) 8%,var(--surface))}.update-notice-title{font-size:13.5px;font-weight:700;color:var(--text)}.update-notice-sub{font-size:12px;color:var(--text-muted);margin-top:2px}.about-changelog{margin-top:14px;max-height:260px;overflow-y:auto;text-align:left;border-top:.5px solid var(--line);padding-top:12px}.cl-version{font-size:13px;font-weight:700;color:var(--text);margin:10px 0 4px}.cl-version:first-child{margin-top:0}.cl-section{font-size:11.5px;font-weight:650;color:var(--text-muted);margin:8px 0 3px}.cl-item{font-size:12px;color:var(--text-muted);line-height:1.55;padding-left:10px;position:relative}.cl-item:before{content:"·";position:absolute;left:2px}.relay-toggle-card{display:flex;align-items:center;justify-content:space-between;gap:16px}.relay-toggle-info{display:flex;flex-direction:column;gap:3px;min-width:0}.relay-toggle-title{font-size:15px;font-weight:700;color:var(--text)}.relay-toggle-sub{font-size:12.5px;color:var(--text-muted)}.relay-switch{width:46px;height:27px;border-radius:14px;border:none;cursor:pointer;padding:0;position:relative;flex-shrink:0;transition:background .16s ease}.relay-switch.off{background:var(--line-strong)}.relay-switch.on{background:var(--accent)}.relay-switch-knob{position:absolute;top:3px;left:3px;width:21px;height:21px;border-radius:50%;background:#fff;box-shadow:0 1px 3px #0000004d;transition:transform .16s ease}.relay-switch.on .relay-switch-knob{transform:translate(19px)}.relay-setting-row{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:10px 0;border-top:.5px solid var(--line)}.relay-setting-row:first-of-type{border-top:none}.relay-setting-label{display:flex;flex-direction:column;gap:2px;min-width:0}.relay-setting-label>div:first-child{font-size:13.5px;font-weight:600;color:var(--text)}.relay-setting-hint{font-size:12px;color:var(--text-muted)}.relay-number-input,.relay-time-input{padding:6px 10px;border-radius:8px;border:.5px solid var(--line-strong);background:var(--surface);color:var(--text);font-size:13px;font-variant-numeric:tabular-nums}.relay-number-input{width:64px;text-align:center}.relay-earnings-grid{display:flex;gap:12px;padding-top:10px;border-top:.5px solid var(--line)}.relay-earning-stat{flex:1;text-align:center}.relay-earning-value{font-size:20px;font-weight:700;color:var(--text);font-variant-numeric:tabular-nums}.relay-earning-label{font-size:11px;color:var(--text-muted);margin-top:3px}.relay-schedule-row{display:flex;align-items:center;gap:10px;padding:4px 0 10px}.relay-schedule-dash{color:var(--text-muted)}
|