sideby 0.12.1 → 0.13.0
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/README.md +1 -1
- package/dist/build.json +1 -1
- package/dist/src/cli/commands.d.ts +4 -2
- package/dist/src/cli/commands.js +117 -17
- package/dist/src/cli/json-schemas.js +52 -1
- package/dist/src/cli/main.js +34 -3
- package/dist/src/core/brand-mark.d.ts +5 -7
- package/dist/src/core/brand-mark.js +18 -5
- package/dist/src/core/browser-profiles.d.ts +71 -0
- package/dist/src/core/browser-profiles.js +361 -0
- package/dist/src/core/config.d.ts +15 -0
- package/dist/src/core/config.js +13 -1
- package/dist/src/core/create.js +2 -1
- package/dist/src/core/desktop-app.d.ts +3 -1
- package/dist/src/core/desktop-app.js +29 -8
- package/dist/src/core/launch.d.ts +7 -0
- package/dist/src/core/launch.js +22 -2
- package/dist/src/core/leveldb-keys.d.ts +14 -0
- package/dist/src/core/leveldb-keys.js +291 -0
- package/dist/src/core/remote-control.d.ts +17 -6
- package/dist/src/core/remote-control.js +40 -17
- package/dist/src/core/update.d.ts +10 -3
- package/dist/src/core/update.js +38 -3
- package/dist/src/core/version.d.ts +11 -0
- package/dist/src/core/version.js +26 -0
- package/dist/src/desktop/app.d.ts +2 -0
- package/dist/src/desktop/app.js +39 -3
- package/dist/src/families/browser.d.ts +20 -0
- package/dist/src/families/browser.js +23 -0
- package/dist/src/families/claude/browser.d.ts +3 -0
- package/dist/src/families/claude/browser.js +14 -0
- package/dist/src/families/claude/desktop.js +1 -0
- package/dist/src/families/codex/browser.d.ts +7 -0
- package/dist/src/families/codex/browser.js +26 -0
- package/dist/src/families/desktop.d.ts +5 -1
- package/dist/src/families/pi/index.js +2 -0
- package/dist/src/panel/handler.d.ts +6 -0
- package/dist/src/panel/handler.js +49 -6
- package/dist/src/panel/i18n.d.ts +71 -4
- package/dist/src/panel/i18n.js +152 -18
- package/dist/src/panel/page-logic.d.ts +23 -0
- package/dist/src/panel/page-logic.js +44 -0
- package/dist/src/panel/page-script.js +576 -181
- package/dist/src/panel/page-styles.js +61 -18
- package/dist/src/panel/page.d.ts +5 -0
- package/dist/src/panel/page.js +10 -9
- package/dist/src/runtime.d.ts +6 -1
- package/dist/src/runtime.js +22 -11
- package/dist/src/types.d.ts +2 -0
- package/package.json +5 -3
- package/schemas/browser-open.json +47 -0
- package/schemas/browser-switch.json +42 -0
- package/schemas/browser.json +99 -0
- package/schemas/config.json +11 -0
- package/schemas/families.json +6 -0
- package/schemas/list.json +6 -0
- package/schemas/remote-control.json +4 -0
- package/schemas/update.json +4 -0
- package/skills/sideby/SKILL.md +5 -3
- package/skills/sideby/references/setup.md +1 -1
package/dist/src/panel/i18n.js
CHANGED
|
@@ -6,9 +6,9 @@ const en = {
|
|
|
6
6
|
'top.refresh': 'Refresh',
|
|
7
7
|
'top.loading': 'Loading…',
|
|
8
8
|
'top.refreshing': 'Refreshing…',
|
|
9
|
-
'top.updated': '
|
|
10
|
-
'top.updatedTitle': '
|
|
11
|
-
'top.
|
|
9
|
+
'top.updated': 'Read {ago} · refreshes every {s} s',
|
|
10
|
+
'top.updatedTitle': 'Quota, usage and health of every account, last read at {at}. They are read again every {s} s while this page is open.',
|
|
11
|
+
'top.stale': 'Not refreshed: the panel cannot be reached or the last read failed.',
|
|
12
12
|
'foot.text': 'runs on this machine; nothing leaves it.',
|
|
13
13
|
'foot.textChecks': 'runs on this machine; once a day it asks npm for the newest sideby version, nothing else leaves it.',
|
|
14
14
|
'upd.label': 'v{v} available',
|
|
@@ -28,6 +28,12 @@ const en = {
|
|
|
28
28
|
'upd.check': 'Check for updates',
|
|
29
29
|
'upd.checking': 'Checking…',
|
|
30
30
|
'upd.verTitle': 'sideby {v} · check for updates',
|
|
31
|
+
'upd.local': 'Local build from this checkout, built {at}.',
|
|
32
|
+
'upd.localDirty': 'Local build from this checkout, with changes not committed yet, built {at}.',
|
|
33
|
+
'upd.open': 'Update…',
|
|
34
|
+
'upd.autoIsOn': 'Auto Update: on',
|
|
35
|
+
'upd.autoIsOff': 'Auto Update: off',
|
|
36
|
+
'upd.settings': 'Settings',
|
|
31
37
|
'upd.checked': 'checked {ago}',
|
|
32
38
|
'upd.notYet': 'sideby has not checked for a new version yet. It checks once a day.',
|
|
33
39
|
'upd.auto': 'Update by itself',
|
|
@@ -44,9 +50,6 @@ const en = {
|
|
|
44
50
|
'upd.reloading': 'Waiting for the new version; this page reloads by itself.',
|
|
45
51
|
'upd.restartHint': 'This page still runs the old version. Restart sideby ui (or reload the page in your portal) to use the new one.',
|
|
46
52
|
'acct.title': 'Accounts',
|
|
47
|
-
'theme.system': 'Theme: follow system',
|
|
48
|
-
'theme.light': 'Theme: light',
|
|
49
|
-
'theme.dark': 'Theme: dark',
|
|
50
53
|
'err.noAnswer': 'sideby did not answer. Retry once it is back.',
|
|
51
54
|
'err.session': 'Could not renew the session. Reload the page.',
|
|
52
55
|
'err.expired': 'The session expired. Reload the page.',
|
|
@@ -126,6 +129,7 @@ const en = {
|
|
|
126
129
|
'why.health-fail': 'Health check found issues',
|
|
127
130
|
'why.signed-out': 'signed out',
|
|
128
131
|
'why.not-installed': 'tool not installed',
|
|
132
|
+
'why.broken': 'tool install broken',
|
|
129
133
|
'why.quota-high': '{label} at {pct}% (warns from {warn}%)',
|
|
130
134
|
'why.health-warn': 'Health check has warnings',
|
|
131
135
|
'tb.search': 'Search accounts',
|
|
@@ -140,6 +144,7 @@ const en = {
|
|
|
140
144
|
'tb.used': 'Used',
|
|
141
145
|
'tb.left': 'Left',
|
|
142
146
|
'tb.view': 'View',
|
|
147
|
+
'tb.display': 'Display',
|
|
143
148
|
'tb.list': 'List',
|
|
144
149
|
'tb.cards': 'Cards',
|
|
145
150
|
'tb.hideEmails': 'Hide emails',
|
|
@@ -155,8 +160,9 @@ const en = {
|
|
|
155
160
|
'filter.clear': 'Clear filters',
|
|
156
161
|
'group.expand': 'Show accounts',
|
|
157
162
|
'group.collapse': 'Hide accounts',
|
|
158
|
-
'row.collapse': '
|
|
159
|
-
'row.expand': '
|
|
163
|
+
'row.collapse': 'Hide details of {name}',
|
|
164
|
+
'row.expand': 'Show details of {name}',
|
|
165
|
+
'row.runs': 'Runs as',
|
|
160
166
|
'group.toggle': '{title} ({count}): {action}',
|
|
161
167
|
'group.attention.one': '{n} needs attention',
|
|
162
168
|
'group.attention.other': '{n} need attention',
|
|
@@ -178,6 +184,10 @@ const en = {
|
|
|
178
184
|
'acct.installHost': '{host} is not installed on this machine. {link}',
|
|
179
185
|
'acct.nearLimit': '{label} quota is {pct}% used; warnings start at {warn}%.',
|
|
180
186
|
'acct.installIt': 'Install it',
|
|
187
|
+
'acct.installHostCmd': '{host} is not installed on this machine. To install it, run this in a terminal:',
|
|
188
|
+
'acct.brokenHost': "{host}'s install is broken: {path} cannot run, often after an upgrade was cut off. Reinstalling fixes it:",
|
|
189
|
+
'acct.installDocs': 'Install guide',
|
|
190
|
+
'acct.broken': 'Tool broken',
|
|
181
191
|
'quota.pctUsed': '{n}% used',
|
|
182
192
|
'quota.pctLeft': '{n}% left',
|
|
183
193
|
'quota.meterUsed': '{label} quota used',
|
|
@@ -188,6 +198,13 @@ const en = {
|
|
|
188
198
|
'quota.dataFrom': 'Data from {ago}',
|
|
189
199
|
'quota.asOf': 'As of {ago}',
|
|
190
200
|
'quota.sharedFrom': 'Same login as {name}; quota read from {name}, {ago}',
|
|
201
|
+
'quota.readFrom': 'Quota read from {name}, {ago}',
|
|
202
|
+
'login.count': '{n} directories share one quota',
|
|
203
|
+
'login.label': 'Same login: {names}',
|
|
204
|
+
'login.hint': '{names} are signed in as the same login. The vendor counts one quota for all of them, so it shows once here, and a handoff never moves between them.',
|
|
205
|
+
'login.sharedAbove': 'Uses the quota above',
|
|
206
|
+
'login.collapse': 'Hide {names}',
|
|
207
|
+
'login.expand': 'Show {names}',
|
|
191
208
|
'quota.noWindows': 'No quota windows reported.',
|
|
192
209
|
'quota.off': 'Quota not on',
|
|
193
210
|
'quota.turnOnFamily': 'Turn on quota',
|
|
@@ -282,6 +299,32 @@ const en = {
|
|
|
282
299
|
'desk.started': 'Opened {app} as {ref}.',
|
|
283
300
|
'desk.focused': '{app} for {ref} is in front.',
|
|
284
301
|
'desk.failed': 'Could not open the desktop app for {ref}: {msg}',
|
|
302
|
+
'br.open': 'Open in browser',
|
|
303
|
+
'br.signedIn': '{name}',
|
|
304
|
+
'br.signedInMore': '{name} +{n}',
|
|
305
|
+
'br.hint': 'Open {url} in the Chrome browser user that signed in to {ref}',
|
|
306
|
+
'br.title': 'Open in browser',
|
|
307
|
+
'br.offIntro': 'sideby can find which Chrome browser user you signed in to {ref} with, and open {url} right there.',
|
|
308
|
+
'br.reads': 'To find it, sideby reads on this computer:',
|
|
309
|
+
'br.read1': 'the name of each Chrome browser user and the Google account it uses in Chrome',
|
|
310
|
+
'br.read2': 'the key names claude.ai and chatgpt.com keep in Chrome, never their values',
|
|
311
|
+
'br.read3': 'the account id in each Claude and Codex login file, only to compare',
|
|
312
|
+
'br.never': 'It never opens cookies, saved passwords or the Keychain, never changes Chrome, and sends nothing anywhere.',
|
|
313
|
+
'br.enable': 'Turn on',
|
|
314
|
+
'br.enabled': 'Finding browser sign-ins is on.',
|
|
315
|
+
'br.disable': 'Turn off finding',
|
|
316
|
+
'br.disabled': 'Finding browser sign-ins is off.',
|
|
317
|
+
'br.local': 'Read from Chrome on this computer only. A browser user that signed out may still show here.',
|
|
318
|
+
'br.found': 'Signed in to {ref} from',
|
|
319
|
+
'br.none': 'No Chrome browser user signed in to {ref} yet. Pick one to open {url}; once you sign in there, it shows here next time.',
|
|
320
|
+
'br.noMatch': '{url} keeps nothing sideby can compare, so pick the browser user yourself.',
|
|
321
|
+
'br.others': 'Other browser users',
|
|
322
|
+
'br.all': 'Browser users',
|
|
323
|
+
'br.noChrome': 'Google Chrome has no data on this Mac yet. Open it once, or get it from google.com/chrome.',
|
|
324
|
+
'br.openIt': 'Open',
|
|
325
|
+
'br.opened': 'Opened {url} in Chrome as {name}.',
|
|
326
|
+
'br.failed': 'Could not open the browser for {ref}: {msg}',
|
|
327
|
+
'br.changed': 'changed {when}',
|
|
285
328
|
'app.apart': 'Signs in on its own',
|
|
286
329
|
'app.apartTip': '{app} signs in with a Cursor account, not with any account above. Each window here keeps its own sign-in, so several can be open at once.',
|
|
287
330
|
'app.mainName': 'main',
|
|
@@ -437,6 +480,7 @@ const en = {
|
|
|
437
480
|
'nf.accounts.other': '{n} accounts',
|
|
438
481
|
'nf.runOnce': 'Run {bin} once first',
|
|
439
482
|
'nf.notInstalled': 'Not installed',
|
|
483
|
+
'nf.broken': 'Install broken',
|
|
440
484
|
'nf.name': 'Name',
|
|
441
485
|
'nf.namePh': 'name',
|
|
442
486
|
'nf.api': 'API key account',
|
|
@@ -530,13 +574,36 @@ const en = {
|
|
|
530
574
|
'rc.hidden': 'Hidden in this browser. sideby remote-control off turns it off later.',
|
|
531
575
|
'rc.readOnly': 'Run sideby remote-control off to turn it off.',
|
|
532
576
|
'rc.confirmTitle': 'Turn off Remote Control at startup?',
|
|
533
|
-
'rc.change': 'remoteControlAtStartup {from} →
|
|
577
|
+
'rc.change': 'remoteControlAtStartup {from} → {to}',
|
|
534
578
|
'rc.notSet': 'not set',
|
|
535
579
|
'rc.usedBy': 'used by {refs}',
|
|
536
580
|
'rc.confirmNote': 'Running sessions stay connected until you restart them. You can still start it in a session with /remote-control.',
|
|
537
581
|
'rc.confirm': 'Turn off',
|
|
538
582
|
'rc.done': 'Remote Control is off for new sessions. Restart sessions that are running.',
|
|
539
583
|
'rc.failed': 'Could not turn it off: {msg}',
|
|
584
|
+
'set.button': 'Settings',
|
|
585
|
+
'set.lang': 'Language',
|
|
586
|
+
'set.theme': 'Theme',
|
|
587
|
+
'set.theme.system': 'System',
|
|
588
|
+
'set.theme.light': 'Light',
|
|
589
|
+
'set.theme.dark': 'Dark',
|
|
590
|
+
'set.rcOn': 'Remote Control starts by itself',
|
|
591
|
+
'rc.button': 'Remote Control',
|
|
592
|
+
'rc.state.on': 'On',
|
|
593
|
+
'rc.state.default': 'Default',
|
|
594
|
+
'rc.state.off': 'Off',
|
|
595
|
+
'rc.state.missing': 'No settings file',
|
|
596
|
+
'rc.state.blocked': 'Cannot read',
|
|
597
|
+
'rc.dialogTitle': 'Remote Control at startup',
|
|
598
|
+
'rc.explain': 'When it is on, each new Claude session connects to claude.ai and the Claude app, where every device signed in to that account can read it. Default leaves it to Claude Code or your organization.',
|
|
599
|
+
'rc.allOff': 'Off everywhere. You can still start it in a session with /remote-control, or switch it on above.',
|
|
600
|
+
'rc.undo': 'Undo last change',
|
|
601
|
+
'rc.switch': 'New sessions start it by themselves',
|
|
602
|
+
'rc.confirmOn': 'Turn on',
|
|
603
|
+
'rc.onWarn': 'Every new Claude session of these accounts will connect to claude.ai and the Claude app. Anyone signed in to the account on another device can read and continue it.',
|
|
604
|
+
'rc.doneOn': 'Remote Control starts by itself in new sessions. Restart sessions that are running.',
|
|
605
|
+
'rc.failedOn': 'Could not turn it on: {msg}',
|
|
606
|
+
'rc.readOnlyBoth': 'Run sideby remote-control on or off to change it.',
|
|
540
607
|
'rc.undone': 'Undone. New sessions go back to the previous setting.',
|
|
541
608
|
'banner.readOnly': 'Read-only view. Use the sideby CLI to fix or create accounts.',
|
|
542
609
|
'banner.plugins.one': '{n} plugin problem.',
|
|
@@ -548,9 +615,9 @@ const zh = {
|
|
|
548
615
|
'top.refresh': '刷新',
|
|
549
616
|
'top.loading': '加载中…',
|
|
550
617
|
'top.refreshing': '刷新中…',
|
|
551
|
-
'top.updated': '{ago}
|
|
552
|
-
'top.updatedTitle': '
|
|
553
|
-
'top.
|
|
618
|
+
'top.updated': '{ago}读取 · 每 {s} 秒自动刷新',
|
|
619
|
+
'top.updatedTitle': '各账号的额度、用量和健康状态,上次读取于 {at}。页面打开时每 {s} 秒重新读取一次。',
|
|
620
|
+
'top.stale': '没有刷新:连不上面板,或上次读取失败。',
|
|
554
621
|
'foot.text': '只在本机运行,数据不会离开这台电脑。',
|
|
555
622
|
'foot.textChecks': '只在本机运行;每天向 npm 查一次 sideby 最新版本号,除此之外没有数据离开这台电脑。',
|
|
556
623
|
'upd.label': 'v{v} 可更新',
|
|
@@ -570,6 +637,12 @@ const zh = {
|
|
|
570
637
|
'upd.check': '检查更新',
|
|
571
638
|
'upd.checking': '正在检查…',
|
|
572
639
|
'upd.verTitle': '当前 sideby {v} · 检查更新',
|
|
640
|
+
'upd.local': '本地构建,来自仓库代码,构建于 {at}。',
|
|
641
|
+
'upd.localDirty': '本地构建,含还没提交的改动,构建于 {at}。',
|
|
642
|
+
'upd.open': '更新…',
|
|
643
|
+
'upd.autoIsOn': '自动更新:开',
|
|
644
|
+
'upd.autoIsOff': '自动更新:关',
|
|
645
|
+
'upd.settings': '设置',
|
|
573
646
|
'upd.checked': '{ago}检查',
|
|
574
647
|
'upd.notYet': 'sideby 还没检查过新版本,每天检查一次。',
|
|
575
648
|
'upd.auto': '自动更新',
|
|
@@ -586,9 +659,6 @@ const zh = {
|
|
|
586
659
|
'upd.reloading': '等待新版本启动,本页会自动刷新。',
|
|
587
660
|
'upd.restartHint': '本页仍在运行旧版本。重启 sideby ui(在 Portal 里就刷新页面)后使用新版本。',
|
|
588
661
|
'acct.title': '账号',
|
|
589
|
-
'theme.system': '主题:跟随系统',
|
|
590
|
-
'theme.light': '主题:浅色',
|
|
591
|
-
'theme.dark': '主题:深色',
|
|
592
662
|
'err.noAnswer': 'sideby 没有响应,恢复后再重试。',
|
|
593
663
|
'err.session': '无法续期会话,请刷新页面。',
|
|
594
664
|
'err.expired': '会话已过期,请刷新页面。',
|
|
@@ -668,6 +738,7 @@ const zh = {
|
|
|
668
738
|
'why.health-fail': '体检发现问题',
|
|
669
739
|
'why.signed-out': '未登录',
|
|
670
740
|
'why.not-installed': '缺少工具',
|
|
741
|
+
'why.broken': '工具安装已损坏',
|
|
671
742
|
'why.quota-high': '{label} 已用 {pct}%({warn}% 起提醒)',
|
|
672
743
|
'why.health-warn': '体检有警告',
|
|
673
744
|
'tb.search': '搜索账号',
|
|
@@ -682,6 +753,7 @@ const zh = {
|
|
|
682
753
|
'tb.used': '已用',
|
|
683
754
|
'tb.left': '剩余',
|
|
684
755
|
'tb.view': '视图',
|
|
756
|
+
'tb.display': '显示',
|
|
685
757
|
'tb.list': '列表',
|
|
686
758
|
'tb.cards': '卡片',
|
|
687
759
|
'tb.hideEmails': '隐藏邮箱',
|
|
@@ -697,8 +769,9 @@ const zh = {
|
|
|
697
769
|
'filter.clear': '清除筛选',
|
|
698
770
|
'group.expand': '展开账号',
|
|
699
771
|
'group.collapse': '收起账号',
|
|
700
|
-
'row.collapse': '收起 {name}',
|
|
701
|
-
'row.expand': '展开 {name}',
|
|
772
|
+
'row.collapse': '收起 {name} 的详情',
|
|
773
|
+
'row.expand': '展开 {name} 的详情',
|
|
774
|
+
'row.runs': '运行方式',
|
|
702
775
|
'group.toggle': '{title}({count}):{action}',
|
|
703
776
|
'group.attention.one': '{n} 个需要处理',
|
|
704
777
|
'group.attention.other': '{n} 个需要处理',
|
|
@@ -720,6 +793,10 @@ const zh = {
|
|
|
720
793
|
'acct.installHost': '本机没有安装 {host}。{link}',
|
|
721
794
|
'acct.nearLimit': '{label} 额度已用 {pct}%,达到 {warn}% 就会提醒。',
|
|
722
795
|
'acct.installIt': '去安装',
|
|
796
|
+
'acct.installHostCmd': '本机没有安装 {host}。在终端运行这条命令安装:',
|
|
797
|
+
'acct.brokenHost': '{host} 的安装已损坏:{path} 无法运行,多半是升级中途断了。重新安装即可:',
|
|
798
|
+
'acct.installDocs': '安装说明',
|
|
799
|
+
'acct.broken': '工具已损坏',
|
|
723
800
|
'quota.pctUsed': '已用 {n}%',
|
|
724
801
|
'quota.pctLeft': '剩余 {n}%',
|
|
725
802
|
'quota.meterUsed': '{label} 额度已用',
|
|
@@ -730,6 +807,13 @@ const zh = {
|
|
|
730
807
|
'quota.dataFrom': '数据来自 {ago}',
|
|
731
808
|
'quota.asOf': '截至 {ago}',
|
|
732
809
|
'quota.sharedFrom': '与 {name} 同一登录;额度读自 {name},{ago}',
|
|
810
|
+
'quota.readFrom': '额度读自 {name},{ago}',
|
|
811
|
+
'login.count': '{n} 个目录共用一份额度',
|
|
812
|
+
'login.label': '同一登录:{names}',
|
|
813
|
+
'login.hint': '{names} 用同一个身份登录。供应商只算一份额度,所以这里只显示一次,交接也不会在它们之间进行。',
|
|
814
|
+
'login.sharedAbove': '共用上方的额度',
|
|
815
|
+
'login.collapse': '收起 {names}',
|
|
816
|
+
'login.expand': '展开 {names}',
|
|
733
817
|
'quota.noWindows': '没有额度窗口数据。',
|
|
734
818
|
'quota.off': '额度未开启',
|
|
735
819
|
'quota.turnOnFamily': '开启额度显示',
|
|
@@ -824,6 +908,32 @@ const zh = {
|
|
|
824
908
|
'desk.started': '已以 {ref} 打开 {app}。',
|
|
825
909
|
'desk.focused': '{ref} 的 {app} 已切到前台。',
|
|
826
910
|
'desk.failed': '没能打开 {ref} 的桌面应用:{msg}',
|
|
911
|
+
'br.open': '在浏览器打开',
|
|
912
|
+
'br.signedIn': '{name}',
|
|
913
|
+
'br.signedInMore': '{name} 等 {n} 个',
|
|
914
|
+
'br.hint': '用登录过 {ref} 的 Chrome 浏览器用户打开 {url}',
|
|
915
|
+
'br.title': '在浏览器打开',
|
|
916
|
+
'br.offIntro': 'sideby 可以找出你在哪个 Chrome 浏览器用户里登录过 {ref},并直接在那里打开 {url}。',
|
|
917
|
+
'br.reads': '为此,sideby 会在本机读取:',
|
|
918
|
+
'br.read1': '每个 Chrome 浏览器用户的名字,和它在 Chrome 里登录的 Google 账号',
|
|
919
|
+
'br.read2': 'claude.ai 和 chatgpt.com 在 Chrome 里存的键名,不读内容',
|
|
920
|
+
'br.read3': '每个 Claude、Codex 登录文件里的账号 ID,只用来比对',
|
|
921
|
+
'br.never': '不打开 Cookie、已存密码和钥匙串,不改 Chrome,不向任何地方发送数据。',
|
|
922
|
+
'br.enable': '开启',
|
|
923
|
+
'br.enabled': '已开启浏览器登录查找。',
|
|
924
|
+
'br.disable': '关闭查找',
|
|
925
|
+
'br.disabled': '已关闭浏览器登录查找。',
|
|
926
|
+
'br.local': '只读取本机 Chrome 的数据。退出登录后,这里可能仍会显示。',
|
|
927
|
+
'br.found': '登录过 {ref} 的浏览器用户',
|
|
928
|
+
'br.none': '还没有找到登录过 {ref} 的 Chrome 浏览器用户。选一个打开 {url},在那里登录后,下次就会显示。',
|
|
929
|
+
'br.noMatch': '{url} 没有保存 sideby 能比对的信息,请自己选浏览器用户。',
|
|
930
|
+
'br.others': '其他浏览器用户',
|
|
931
|
+
'br.all': '浏览器用户',
|
|
932
|
+
'br.noChrome': '这台 Mac 上还没有 Google Chrome 的数据。先打开一次 Chrome,或到 google.com/chrome 下载。',
|
|
933
|
+
'br.openIt': '打开',
|
|
934
|
+
'br.opened': '已用 {name} 在 Chrome 里打开 {url}。',
|
|
935
|
+
'br.failed': '没能为 {ref} 打开浏览器:{msg}',
|
|
936
|
+
'br.changed': '{when}更新',
|
|
827
937
|
'app.apart': '单独登录',
|
|
828
938
|
'app.apartTip': '{app} 用 Cursor 账号登录,和上面的账号都无关。这里每个窗口各自保存登录,可以同时开几个。',
|
|
829
939
|
'app.mainName': 'main',
|
|
@@ -979,6 +1089,7 @@ const zh = {
|
|
|
979
1089
|
'nf.accounts.other': '{n} 个账号',
|
|
980
1090
|
'nf.runOnce': '先运行一次 {bin}',
|
|
981
1091
|
'nf.notInstalled': '未安装',
|
|
1092
|
+
'nf.broken': '安装已损坏',
|
|
982
1093
|
'nf.name': '名称',
|
|
983
1094
|
'nf.namePh': '名称',
|
|
984
1095
|
'nf.api': 'API key 账号',
|
|
@@ -1072,13 +1183,36 @@ const zh = {
|
|
|
1072
1183
|
'rc.hidden': '本浏览器不再提示。以后可以运行 sideby remote-control off 关闭。',
|
|
1073
1184
|
'rc.readOnly': '运行 sideby remote-control off 关闭。',
|
|
1074
1185
|
'rc.confirmTitle': '关闭 Remote Control 自动打开?',
|
|
1075
|
-
'rc.change': 'remoteControlAtStartup {from} →
|
|
1186
|
+
'rc.change': 'remoteControlAtStartup {from} → {to}',
|
|
1076
1187
|
'rc.notSet': '未设置',
|
|
1077
1188
|
'rc.usedBy': '用于 {refs}',
|
|
1078
1189
|
'rc.confirmNote': '已经开着的会话要重开才断开。需要时仍可在会话里运行 /remote-control 手动打开。',
|
|
1079
1190
|
'rc.confirm': '确认关闭',
|
|
1080
1191
|
'rc.done': '新会话不会再自动打开 Remote Control。开着的会话要重开。',
|
|
1081
1192
|
'rc.failed': '没能关闭:{msg}',
|
|
1193
|
+
'set.button': '设置',
|
|
1194
|
+
'set.lang': '语言',
|
|
1195
|
+
'set.theme': '主题',
|
|
1196
|
+
'set.theme.system': '跟随系统',
|
|
1197
|
+
'set.theme.light': '浅色',
|
|
1198
|
+
'set.theme.dark': '深色',
|
|
1199
|
+
'set.rcOn': 'Remote Control 会自动打开',
|
|
1200
|
+
'rc.button': 'Remote Control',
|
|
1201
|
+
'rc.state.on': '开',
|
|
1202
|
+
'rc.state.default': '默认',
|
|
1203
|
+
'rc.state.off': '关',
|
|
1204
|
+
'rc.state.missing': '没有设置文件',
|
|
1205
|
+
'rc.state.blocked': '读不了',
|
|
1206
|
+
'rc.dialogTitle': 'Remote Control 自动打开',
|
|
1207
|
+
'rc.explain': '打开时,每个新的 Claude 会话都会连到 claude.ai 和 Claude 手机 App,登录这个账号的设备都能看到对话。「默认」表示交给 Claude Code 或你的组织决定。',
|
|
1208
|
+
'rc.allOff': '已全部关闭。需要时仍可在会话里运行 /remote-control 手动打开,或在上面切到「开」。',
|
|
1209
|
+
'rc.undo': '撤销上次更改',
|
|
1210
|
+
'rc.switch': '新会话自动打开',
|
|
1211
|
+
'rc.confirmOn': '确认打开',
|
|
1212
|
+
'rc.onWarn': '这些账号的每个新 Claude 会话都会连到 claude.ai 和 Claude 手机 App,其他设备上登录这个账号的人都能看到并继续对话。',
|
|
1213
|
+
'rc.doneOn': '新会话会自动打开 Remote Control。开着的会话要重开。',
|
|
1214
|
+
'rc.failedOn': '没能打开:{msg}',
|
|
1215
|
+
'rc.readOnlyBoth': '运行 sideby remote-control on 或 off 来修改。',
|
|
1082
1216
|
'rc.undone': '已撤销,新会话恢复原来的设置。',
|
|
1083
1217
|
'banner.readOnly': '只读视图。修复或创建账号请用 sideby 命令行。',
|
|
1084
1218
|
'banner.plugins.one': '{n} 个插件问题。',
|
|
@@ -90,6 +90,11 @@ export declare function attentionWhy(a: LogicAccount, health: {
|
|
|
90
90
|
} | null;
|
|
91
91
|
/** Sorted copy: `pressure` (fullest Quota first), `name`, or `recent` (last activity first). The Main Account leads ties. */
|
|
92
92
|
export declare function sortAccounts<T extends LogicAccount>(list: T[], mode: string, now: number): T[];
|
|
93
|
+
/**
|
|
94
|
+
* The sorted list with each Same Login together (spec §3.21): an Account, or the shown members of one login, in
|
|
95
|
+
* order, at the place of its first member. A login with one shown member stays a plain Account.
|
|
96
|
+
*/
|
|
97
|
+
export declare function loginClusters<T extends LogicAccount>(list: T[]): (T | T[])[];
|
|
93
98
|
/**
|
|
94
99
|
* Whether every word of the query appears in the Account's name, ref, aliases (with their arguments), Family title,
|
|
95
100
|
* model, plan, email or organization.
|
|
@@ -206,3 +211,21 @@ export interface HandoffForm {
|
|
|
206
211
|
}
|
|
207
212
|
/** What the Panel's Auto Handoff form changed, as the `change` /api/handoff/configure takes; {} when nothing. */
|
|
208
213
|
export declare function handoffChangeOf(s: HandoffSettingsView, f: HandoffForm): Record<string, unknown>;
|
|
214
|
+
/**
|
|
215
|
+
* What the Panel's Remote Control button says (spec §3.22): `on` when a group used by a subscription Account turns it
|
|
216
|
+
* on, else `default` when one leaves it to Claude Code, else `off`; null without groups. Groups used only by API
|
|
217
|
+
* Accounts do not count: those never sign in to claude.ai.
|
|
218
|
+
*/
|
|
219
|
+
export declare function remoteControlSummary(groups: readonly {
|
|
220
|
+
accounts: readonly string[];
|
|
221
|
+
state: string;
|
|
222
|
+
}[], apiRefs: readonly string[]): 'on' | 'default' | 'off' | null;
|
|
223
|
+
/**
|
|
224
|
+
* The groups that turning Remote Control `to` on or off changes (spec §3.22): those that do not hold it yet, a
|
|
225
|
+
* default counting as either. A file that is missing or cannot be read is never changed.
|
|
226
|
+
*/
|
|
227
|
+
export declare function remoteControlTodo<G extends {
|
|
228
|
+
state: string;
|
|
229
|
+
}>(groups: readonly G[], to: 'on' | 'off'): G[];
|
|
230
|
+
/** The key a Same Login group keeps its folded state under: its members, in a fixed order. */
|
|
231
|
+
export declare function loginKey(refs: readonly string[]): string;
|
|
@@ -134,6 +134,24 @@ export function sortAccounts(list, mode, now) {
|
|
|
134
134
|
out.sort((x, y) => pressure(y) - pressure(x) || byName(x, y));
|
|
135
135
|
return out;
|
|
136
136
|
}
|
|
137
|
+
/**
|
|
138
|
+
* The sorted list with each Same Login together (spec §3.21): an Account, or the shown members of one login, in
|
|
139
|
+
* order, at the place of its first member. A login with one shown member stays a plain Account.
|
|
140
|
+
*/
|
|
141
|
+
export function loginClusters(list) {
|
|
142
|
+
const out = [];
|
|
143
|
+
const placed = new Set();
|
|
144
|
+
for (const a of list) {
|
|
145
|
+
if (placed.has(a.ref))
|
|
146
|
+
continue;
|
|
147
|
+
const peers = a.sameLogin || [];
|
|
148
|
+
const members = list.filter((b) => b.ref === a.ref || peers.includes(b.ref));
|
|
149
|
+
for (const m of members)
|
|
150
|
+
placed.add(m.ref);
|
|
151
|
+
out.push(members.length > 1 ? members : a);
|
|
152
|
+
}
|
|
153
|
+
return out;
|
|
154
|
+
}
|
|
137
155
|
/**
|
|
138
156
|
* Whether every word of the query appears in the Account's name, ref, aliases (with their arguments), Family title,
|
|
139
157
|
* model, plan, email or organization.
|
|
@@ -392,3 +410,29 @@ export function handoffChangeOf(s, f) {
|
|
|
392
410
|
c.orders = orders;
|
|
393
411
|
return c;
|
|
394
412
|
}
|
|
413
|
+
/**
|
|
414
|
+
* What the Panel's Remote Control button says (spec §3.22): `on` when a group used by a subscription Account turns it
|
|
415
|
+
* on, else `default` when one leaves it to Claude Code, else `off`; null without groups. Groups used only by API
|
|
416
|
+
* Accounts do not count: those never sign in to claude.ai.
|
|
417
|
+
*/
|
|
418
|
+
export function remoteControlSummary(groups, apiRefs) {
|
|
419
|
+
if (!groups.length)
|
|
420
|
+
return null;
|
|
421
|
+
const reach = groups.filter((g) => g.accounts.some((r) => !apiRefs.includes(r)));
|
|
422
|
+
if (reach.some((g) => g.state === 'on'))
|
|
423
|
+
return 'on';
|
|
424
|
+
if (reach.some((g) => g.state === 'default'))
|
|
425
|
+
return 'default';
|
|
426
|
+
return 'off';
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* The groups that turning Remote Control `to` on or off changes (spec §3.22): those that do not hold it yet, a
|
|
430
|
+
* default counting as either. A file that is missing or cannot be read is never changed.
|
|
431
|
+
*/
|
|
432
|
+
export function remoteControlTodo(groups, to) {
|
|
433
|
+
return groups.filter((g) => g.state === 'default' || g.state === (to === 'on' ? 'off' : 'on'));
|
|
434
|
+
}
|
|
435
|
+
/** The key a Same Login group keeps its folded state under: its members, in a fixed order. */
|
|
436
|
+
export function loginKey(refs) {
|
|
437
|
+
return `login:${[...refs].sort().join(',')}`;
|
|
438
|
+
}
|