sideby 0.12.0 → 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 +75 -4
- package/dist/src/panel/i18n.js +162 -20
- 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 +609 -180
- package/dist/src/panel/page-styles.js +72 -17
- 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',
|
|
@@ -23,7 +23,17 @@ const en = {
|
|
|
23
23
|
'upd.cannot': 'sideby cannot update itself here: {why}. Run this yourself:',
|
|
24
24
|
'upd.skill': 'If you use the sideby skill, update it too:',
|
|
25
25
|
'upd.checksOff': 'Update checks are off ({why}).',
|
|
26
|
-
'upd.latest': 'This is the newest version
|
|
26
|
+
'upd.latest': 'This is the newest version',
|
|
27
|
+
'upd.latestNow': 'You have the newest version (checked just now).',
|
|
28
|
+
'upd.check': 'Check for updates',
|
|
29
|
+
'upd.checking': 'Checking…',
|
|
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',
|
|
27
37
|
'upd.checked': 'checked {ago}',
|
|
28
38
|
'upd.notYet': 'sideby has not checked for a new version yet. It checks once a day.',
|
|
29
39
|
'upd.auto': 'Update by itself',
|
|
@@ -40,9 +50,6 @@ const en = {
|
|
|
40
50
|
'upd.reloading': 'Waiting for the new version; this page reloads by itself.',
|
|
41
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.',
|
|
42
52
|
'acct.title': 'Accounts',
|
|
43
|
-
'theme.system': 'Theme: follow system',
|
|
44
|
-
'theme.light': 'Theme: light',
|
|
45
|
-
'theme.dark': 'Theme: dark',
|
|
46
53
|
'err.noAnswer': 'sideby did not answer. Retry once it is back.',
|
|
47
54
|
'err.session': 'Could not renew the session. Reload the page.',
|
|
48
55
|
'err.expired': 'The session expired. Reload the page.',
|
|
@@ -122,6 +129,7 @@ const en = {
|
|
|
122
129
|
'why.health-fail': 'Health check found issues',
|
|
123
130
|
'why.signed-out': 'signed out',
|
|
124
131
|
'why.not-installed': 'tool not installed',
|
|
132
|
+
'why.broken': 'tool install broken',
|
|
125
133
|
'why.quota-high': '{label} at {pct}% (warns from {warn}%)',
|
|
126
134
|
'why.health-warn': 'Health check has warnings',
|
|
127
135
|
'tb.search': 'Search accounts',
|
|
@@ -136,6 +144,7 @@ const en = {
|
|
|
136
144
|
'tb.used': 'Used',
|
|
137
145
|
'tb.left': 'Left',
|
|
138
146
|
'tb.view': 'View',
|
|
147
|
+
'tb.display': 'Display',
|
|
139
148
|
'tb.list': 'List',
|
|
140
149
|
'tb.cards': 'Cards',
|
|
141
150
|
'tb.hideEmails': 'Hide emails',
|
|
@@ -151,8 +160,9 @@ const en = {
|
|
|
151
160
|
'filter.clear': 'Clear filters',
|
|
152
161
|
'group.expand': 'Show accounts',
|
|
153
162
|
'group.collapse': 'Hide accounts',
|
|
154
|
-
'row.collapse': '
|
|
155
|
-
'row.expand': '
|
|
163
|
+
'row.collapse': 'Hide details of {name}',
|
|
164
|
+
'row.expand': 'Show details of {name}',
|
|
165
|
+
'row.runs': 'Runs as',
|
|
156
166
|
'group.toggle': '{title} ({count}): {action}',
|
|
157
167
|
'group.attention.one': '{n} needs attention',
|
|
158
168
|
'group.attention.other': '{n} need attention',
|
|
@@ -174,6 +184,10 @@ const en = {
|
|
|
174
184
|
'acct.installHost': '{host} is not installed on this machine. {link}',
|
|
175
185
|
'acct.nearLimit': '{label} quota is {pct}% used; warnings start at {warn}%.',
|
|
176
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',
|
|
177
191
|
'quota.pctUsed': '{n}% used',
|
|
178
192
|
'quota.pctLeft': '{n}% left',
|
|
179
193
|
'quota.meterUsed': '{label} quota used',
|
|
@@ -184,6 +198,13 @@ const en = {
|
|
|
184
198
|
'quota.dataFrom': 'Data from {ago}',
|
|
185
199
|
'quota.asOf': 'As of {ago}',
|
|
186
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}',
|
|
187
208
|
'quota.noWindows': 'No quota windows reported.',
|
|
188
209
|
'quota.off': 'Quota not on',
|
|
189
210
|
'quota.turnOnFamily': 'Turn on quota',
|
|
@@ -278,6 +299,32 @@ const en = {
|
|
|
278
299
|
'desk.started': 'Opened {app} as {ref}.',
|
|
279
300
|
'desk.focused': '{app} for {ref} is in front.',
|
|
280
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}',
|
|
281
328
|
'app.apart': 'Signs in on its own',
|
|
282
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.',
|
|
283
330
|
'app.mainName': 'main',
|
|
@@ -433,6 +480,7 @@ const en = {
|
|
|
433
480
|
'nf.accounts.other': '{n} accounts',
|
|
434
481
|
'nf.runOnce': 'Run {bin} once first',
|
|
435
482
|
'nf.notInstalled': 'Not installed',
|
|
483
|
+
'nf.broken': 'Install broken',
|
|
436
484
|
'nf.name': 'Name',
|
|
437
485
|
'nf.namePh': 'name',
|
|
438
486
|
'nf.api': 'API key account',
|
|
@@ -526,13 +574,36 @@ const en = {
|
|
|
526
574
|
'rc.hidden': 'Hidden in this browser. sideby remote-control off turns it off later.',
|
|
527
575
|
'rc.readOnly': 'Run sideby remote-control off to turn it off.',
|
|
528
576
|
'rc.confirmTitle': 'Turn off Remote Control at startup?',
|
|
529
|
-
'rc.change': 'remoteControlAtStartup {from} →
|
|
577
|
+
'rc.change': 'remoteControlAtStartup {from} → {to}',
|
|
530
578
|
'rc.notSet': 'not set',
|
|
531
579
|
'rc.usedBy': 'used by {refs}',
|
|
532
580
|
'rc.confirmNote': 'Running sessions stay connected until you restart them. You can still start it in a session with /remote-control.',
|
|
533
581
|
'rc.confirm': 'Turn off',
|
|
534
582
|
'rc.done': 'Remote Control is off for new sessions. Restart sessions that are running.',
|
|
535
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.',
|
|
536
607
|
'rc.undone': 'Undone. New sessions go back to the previous setting.',
|
|
537
608
|
'banner.readOnly': 'Read-only view. Use the sideby CLI to fix or create accounts.',
|
|
538
609
|
'banner.plugins.one': '{n} plugin problem.',
|
|
@@ -544,9 +615,9 @@ const zh = {
|
|
|
544
615
|
'top.refresh': '刷新',
|
|
545
616
|
'top.loading': '加载中…',
|
|
546
617
|
'top.refreshing': '刷新中…',
|
|
547
|
-
'top.updated': '{ago}
|
|
548
|
-
'top.updatedTitle': '
|
|
549
|
-
'top.
|
|
618
|
+
'top.updated': '{ago}读取 · 每 {s} 秒自动刷新',
|
|
619
|
+
'top.updatedTitle': '各账号的额度、用量和健康状态,上次读取于 {at}。页面打开时每 {s} 秒重新读取一次。',
|
|
620
|
+
'top.stale': '没有刷新:连不上面板,或上次读取失败。',
|
|
550
621
|
'foot.text': '只在本机运行,数据不会离开这台电脑。',
|
|
551
622
|
'foot.textChecks': '只在本机运行;每天向 npm 查一次 sideby 最新版本号,除此之外没有数据离开这台电脑。',
|
|
552
623
|
'upd.label': 'v{v} 可更新',
|
|
@@ -561,7 +632,17 @@ const zh = {
|
|
|
561
632
|
'upd.cannot': '这种安装方式下 sideby 不能自己更新:{why}。请自己运行:',
|
|
562
633
|
'upd.skill': '如果你装了 sideby skill,也更新一下:',
|
|
563
634
|
'upd.checksOff': '检查更新已关闭({why})。',
|
|
564
|
-
'upd.latest': '
|
|
635
|
+
'upd.latest': '已是最新版本',
|
|
636
|
+
'upd.latestNow': '已是最新版本(刚刚检查)。',
|
|
637
|
+
'upd.check': '检查更新',
|
|
638
|
+
'upd.checking': '正在检查…',
|
|
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': '设置',
|
|
565
646
|
'upd.checked': '{ago}检查',
|
|
566
647
|
'upd.notYet': 'sideby 还没检查过新版本,每天检查一次。',
|
|
567
648
|
'upd.auto': '自动更新',
|
|
@@ -578,9 +659,6 @@ const zh = {
|
|
|
578
659
|
'upd.reloading': '等待新版本启动,本页会自动刷新。',
|
|
579
660
|
'upd.restartHint': '本页仍在运行旧版本。重启 sideby ui(在 Portal 里就刷新页面)后使用新版本。',
|
|
580
661
|
'acct.title': '账号',
|
|
581
|
-
'theme.system': '主题:跟随系统',
|
|
582
|
-
'theme.light': '主题:浅色',
|
|
583
|
-
'theme.dark': '主题:深色',
|
|
584
662
|
'err.noAnswer': 'sideby 没有响应,恢复后再重试。',
|
|
585
663
|
'err.session': '无法续期会话,请刷新页面。',
|
|
586
664
|
'err.expired': '会话已过期,请刷新页面。',
|
|
@@ -660,6 +738,7 @@ const zh = {
|
|
|
660
738
|
'why.health-fail': '体检发现问题',
|
|
661
739
|
'why.signed-out': '未登录',
|
|
662
740
|
'why.not-installed': '缺少工具',
|
|
741
|
+
'why.broken': '工具安装已损坏',
|
|
663
742
|
'why.quota-high': '{label} 已用 {pct}%({warn}% 起提醒)',
|
|
664
743
|
'why.health-warn': '体检有警告',
|
|
665
744
|
'tb.search': '搜索账号',
|
|
@@ -674,6 +753,7 @@ const zh = {
|
|
|
674
753
|
'tb.used': '已用',
|
|
675
754
|
'tb.left': '剩余',
|
|
676
755
|
'tb.view': '视图',
|
|
756
|
+
'tb.display': '显示',
|
|
677
757
|
'tb.list': '列表',
|
|
678
758
|
'tb.cards': '卡片',
|
|
679
759
|
'tb.hideEmails': '隐藏邮箱',
|
|
@@ -689,8 +769,9 @@ const zh = {
|
|
|
689
769
|
'filter.clear': '清除筛选',
|
|
690
770
|
'group.expand': '展开账号',
|
|
691
771
|
'group.collapse': '收起账号',
|
|
692
|
-
'row.collapse': '收起 {name}',
|
|
693
|
-
'row.expand': '展开 {name}',
|
|
772
|
+
'row.collapse': '收起 {name} 的详情',
|
|
773
|
+
'row.expand': '展开 {name} 的详情',
|
|
774
|
+
'row.runs': '运行方式',
|
|
694
775
|
'group.toggle': '{title}({count}):{action}',
|
|
695
776
|
'group.attention.one': '{n} 个需要处理',
|
|
696
777
|
'group.attention.other': '{n} 个需要处理',
|
|
@@ -712,6 +793,10 @@ const zh = {
|
|
|
712
793
|
'acct.installHost': '本机没有安装 {host}。{link}',
|
|
713
794
|
'acct.nearLimit': '{label} 额度已用 {pct}%,达到 {warn}% 就会提醒。',
|
|
714
795
|
'acct.installIt': '去安装',
|
|
796
|
+
'acct.installHostCmd': '本机没有安装 {host}。在终端运行这条命令安装:',
|
|
797
|
+
'acct.brokenHost': '{host} 的安装已损坏:{path} 无法运行,多半是升级中途断了。重新安装即可:',
|
|
798
|
+
'acct.installDocs': '安装说明',
|
|
799
|
+
'acct.broken': '工具已损坏',
|
|
715
800
|
'quota.pctUsed': '已用 {n}%',
|
|
716
801
|
'quota.pctLeft': '剩余 {n}%',
|
|
717
802
|
'quota.meterUsed': '{label} 额度已用',
|
|
@@ -722,6 +807,13 @@ const zh = {
|
|
|
722
807
|
'quota.dataFrom': '数据来自 {ago}',
|
|
723
808
|
'quota.asOf': '截至 {ago}',
|
|
724
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}',
|
|
725
817
|
'quota.noWindows': '没有额度窗口数据。',
|
|
726
818
|
'quota.off': '额度未开启',
|
|
727
819
|
'quota.turnOnFamily': '开启额度显示',
|
|
@@ -816,6 +908,32 @@ const zh = {
|
|
|
816
908
|
'desk.started': '已以 {ref} 打开 {app}。',
|
|
817
909
|
'desk.focused': '{ref} 的 {app} 已切到前台。',
|
|
818
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}更新',
|
|
819
937
|
'app.apart': '单独登录',
|
|
820
938
|
'app.apartTip': '{app} 用 Cursor 账号登录,和上面的账号都无关。这里每个窗口各自保存登录,可以同时开几个。',
|
|
821
939
|
'app.mainName': 'main',
|
|
@@ -971,6 +1089,7 @@ const zh = {
|
|
|
971
1089
|
'nf.accounts.other': '{n} 个账号',
|
|
972
1090
|
'nf.runOnce': '先运行一次 {bin}',
|
|
973
1091
|
'nf.notInstalled': '未安装',
|
|
1092
|
+
'nf.broken': '安装已损坏',
|
|
974
1093
|
'nf.name': '名称',
|
|
975
1094
|
'nf.namePh': '名称',
|
|
976
1095
|
'nf.api': 'API key 账号',
|
|
@@ -1064,13 +1183,36 @@ const zh = {
|
|
|
1064
1183
|
'rc.hidden': '本浏览器不再提示。以后可以运行 sideby remote-control off 关闭。',
|
|
1065
1184
|
'rc.readOnly': '运行 sideby remote-control off 关闭。',
|
|
1066
1185
|
'rc.confirmTitle': '关闭 Remote Control 自动打开?',
|
|
1067
|
-
'rc.change': 'remoteControlAtStartup {from} →
|
|
1186
|
+
'rc.change': 'remoteControlAtStartup {from} → {to}',
|
|
1068
1187
|
'rc.notSet': '未设置',
|
|
1069
1188
|
'rc.usedBy': '用于 {refs}',
|
|
1070
1189
|
'rc.confirmNote': '已经开着的会话要重开才断开。需要时仍可在会话里运行 /remote-control 手动打开。',
|
|
1071
1190
|
'rc.confirm': '确认关闭',
|
|
1072
1191
|
'rc.done': '新会话不会再自动打开 Remote Control。开着的会话要重开。',
|
|
1073
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 来修改。',
|
|
1074
1216
|
'rc.undone': '已撤销,新会话恢复原来的设置。',
|
|
1075
1217
|
'banner.readOnly': '只读视图。修复或创建账号请用 sideby 命令行。',
|
|
1076
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
|
+
}
|