sideby 0.12.1 → 0.13.1
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 +5 -2
- package/dist/src/cli/commands.js +165 -20
- package/dist/src/cli/json-schemas.js +100 -2
- package/dist/src/cli/main.js +72 -4
- 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/skill-check.d.ts +13 -0
- package/dist/src/core/skill-check.js +29 -1
- package/dist/src/core/update.d.ts +55 -3
- package/dist/src/core/update.js +124 -4
- 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 +9 -1
- package/dist/src/panel/handler.js +54 -6
- package/dist/src/panel/i18n.d.ts +74 -4
- package/dist/src/panel/i18n.js +160 -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 +587 -183
- 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/alias.json +62 -0
- package/schemas/app-install.json +62 -0
- package/schemas/app-uninstall.json +62 -0
- package/schemas/browser-open.json +109 -0
- package/schemas/browser-switch.json +104 -0
- package/schemas/browser.json +161 -0
- package/schemas/config.json +11 -0
- package/schemas/desktop-remove.json +62 -0
- package/schemas/desktop.json +62 -0
- package/schemas/doctor.json +62 -0
- package/schemas/error.json +62 -0
- package/schemas/families.json +68 -0
- package/schemas/handoff-disable.json +62 -0
- package/schemas/handoff-enable.json +62 -0
- package/schemas/handoff-ready.json +62 -0
- package/schemas/handoff-setup.json +62 -0
- package/schemas/handoff-status.json +62 -0
- package/schemas/handoff-teardown.json +62 -0
- package/schemas/list.json +68 -0
- package/schemas/model.json +62 -0
- package/schemas/new.json +62 -0
- package/schemas/next.json +62 -0
- package/schemas/plugins.json +62 -0
- package/schemas/quota-setup.json +62 -0
- package/schemas/quota-teardown.json +62 -0
- package/schemas/quota.json +62 -0
- package/schemas/remote-control.json +66 -0
- package/schemas/tune-change.json +62 -0
- package/schemas/tune.json +62 -0
- package/schemas/update.json +111 -1
- package/skills/sideby/SKILL.md +8 -4
- package/skills/sideby/references/diagnose.md +1 -1
- package/skills/sideby/references/setup.md +1 -1
- package/skills/sideby/references/update.md +16 -0
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',
|
|
@@ -21,13 +21,22 @@ const en = {
|
|
|
21
21
|
'upd.runs': 'Updating runs:',
|
|
22
22
|
'upd.after': 'A background panel restarts by itself and this page reloads. A sideby ui running in a terminal and sessions already running keep the old version until you restart them.',
|
|
23
23
|
'upd.cannot': 'sideby cannot update itself here: {why}. Run this yourself:',
|
|
24
|
-
'upd.skill': 'If you use the sideby skill,
|
|
24
|
+
'upd.skill': 'If you use the sideby skill, install it with:',
|
|
25
|
+
'upd.skillToo': 'The sideby skill agents read is updated with it.',
|
|
26
|
+
'upd.skillDone': 'The sideby skill was updated too; agents load it in their next session.',
|
|
27
|
+
'upd.skillManaged': 'sideby leaves the skill alone ({why}). Update it with:',
|
|
25
28
|
'upd.checksOff': 'Update checks are off ({why}).',
|
|
26
29
|
'upd.latest': 'This is the newest version',
|
|
27
30
|
'upd.latestNow': 'You have the newest version (checked just now).',
|
|
28
31
|
'upd.check': 'Check for updates',
|
|
29
32
|
'upd.checking': 'Checking…',
|
|
30
33
|
'upd.verTitle': 'sideby {v} · check for updates',
|
|
34
|
+
'upd.local': 'Local build from this checkout, built {at}.',
|
|
35
|
+
'upd.localDirty': 'Local build from this checkout, with changes not committed yet, built {at}.',
|
|
36
|
+
'upd.open': 'Update…',
|
|
37
|
+
'upd.autoIsOn': 'Auto Update: on',
|
|
38
|
+
'upd.autoIsOff': 'Auto Update: off',
|
|
39
|
+
'upd.settings': 'Settings',
|
|
31
40
|
'upd.checked': 'checked {ago}',
|
|
32
41
|
'upd.notYet': 'sideby has not checked for a new version yet. It checks once a day.',
|
|
33
42
|
'upd.auto': 'Update by itself',
|
|
@@ -44,9 +53,6 @@ const en = {
|
|
|
44
53
|
'upd.reloading': 'Waiting for the new version; this page reloads by itself.',
|
|
45
54
|
'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
55
|
'acct.title': 'Accounts',
|
|
47
|
-
'theme.system': 'Theme: follow system',
|
|
48
|
-
'theme.light': 'Theme: light',
|
|
49
|
-
'theme.dark': 'Theme: dark',
|
|
50
56
|
'err.noAnswer': 'sideby did not answer. Retry once it is back.',
|
|
51
57
|
'err.session': 'Could not renew the session. Reload the page.',
|
|
52
58
|
'err.expired': 'The session expired. Reload the page.',
|
|
@@ -126,6 +132,7 @@ const en = {
|
|
|
126
132
|
'why.health-fail': 'Health check found issues',
|
|
127
133
|
'why.signed-out': 'signed out',
|
|
128
134
|
'why.not-installed': 'tool not installed',
|
|
135
|
+
'why.broken': 'tool install broken',
|
|
129
136
|
'why.quota-high': '{label} at {pct}% (warns from {warn}%)',
|
|
130
137
|
'why.health-warn': 'Health check has warnings',
|
|
131
138
|
'tb.search': 'Search accounts',
|
|
@@ -140,6 +147,7 @@ const en = {
|
|
|
140
147
|
'tb.used': 'Used',
|
|
141
148
|
'tb.left': 'Left',
|
|
142
149
|
'tb.view': 'View',
|
|
150
|
+
'tb.display': 'Display',
|
|
143
151
|
'tb.list': 'List',
|
|
144
152
|
'tb.cards': 'Cards',
|
|
145
153
|
'tb.hideEmails': 'Hide emails',
|
|
@@ -155,8 +163,9 @@ const en = {
|
|
|
155
163
|
'filter.clear': 'Clear filters',
|
|
156
164
|
'group.expand': 'Show accounts',
|
|
157
165
|
'group.collapse': 'Hide accounts',
|
|
158
|
-
'row.collapse': '
|
|
159
|
-
'row.expand': '
|
|
166
|
+
'row.collapse': 'Hide details of {name}',
|
|
167
|
+
'row.expand': 'Show details of {name}',
|
|
168
|
+
'row.runs': 'Runs as',
|
|
160
169
|
'group.toggle': '{title} ({count}): {action}',
|
|
161
170
|
'group.attention.one': '{n} needs attention',
|
|
162
171
|
'group.attention.other': '{n} need attention',
|
|
@@ -178,6 +187,10 @@ const en = {
|
|
|
178
187
|
'acct.installHost': '{host} is not installed on this machine. {link}',
|
|
179
188
|
'acct.nearLimit': '{label} quota is {pct}% used; warnings start at {warn}%.',
|
|
180
189
|
'acct.installIt': 'Install it',
|
|
190
|
+
'acct.installHostCmd': '{host} is not installed on this machine. To install it, run this in a terminal:',
|
|
191
|
+
'acct.brokenHost': "{host}'s install is broken: {path} cannot run, often after an upgrade was cut off. Reinstalling fixes it:",
|
|
192
|
+
'acct.installDocs': 'Install guide',
|
|
193
|
+
'acct.broken': 'Tool broken',
|
|
181
194
|
'quota.pctUsed': '{n}% used',
|
|
182
195
|
'quota.pctLeft': '{n}% left',
|
|
183
196
|
'quota.meterUsed': '{label} quota used',
|
|
@@ -188,6 +201,13 @@ const en = {
|
|
|
188
201
|
'quota.dataFrom': 'Data from {ago}',
|
|
189
202
|
'quota.asOf': 'As of {ago}',
|
|
190
203
|
'quota.sharedFrom': 'Same login as {name}; quota read from {name}, {ago}',
|
|
204
|
+
'quota.readFrom': 'Quota read from {name}, {ago}',
|
|
205
|
+
'login.count': '{n} directories share one quota',
|
|
206
|
+
'login.label': 'Same login: {names}',
|
|
207
|
+
'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.',
|
|
208
|
+
'login.sharedAbove': 'Uses the quota above',
|
|
209
|
+
'login.collapse': 'Hide {names}',
|
|
210
|
+
'login.expand': 'Show {names}',
|
|
191
211
|
'quota.noWindows': 'No quota windows reported.',
|
|
192
212
|
'quota.off': 'Quota not on',
|
|
193
213
|
'quota.turnOnFamily': 'Turn on quota',
|
|
@@ -282,6 +302,32 @@ const en = {
|
|
|
282
302
|
'desk.started': 'Opened {app} as {ref}.',
|
|
283
303
|
'desk.focused': '{app} for {ref} is in front.',
|
|
284
304
|
'desk.failed': 'Could not open the desktop app for {ref}: {msg}',
|
|
305
|
+
'br.open': 'Open in browser',
|
|
306
|
+
'br.signedIn': '{name}',
|
|
307
|
+
'br.signedInMore': '{name} +{n}',
|
|
308
|
+
'br.hint': 'Open {url} in the Chrome browser user that signed in to {ref}',
|
|
309
|
+
'br.title': 'Open in browser',
|
|
310
|
+
'br.offIntro': 'sideby can find which Chrome browser user you signed in to {ref} with, and open {url} right there.',
|
|
311
|
+
'br.reads': 'To find it, sideby reads on this computer:',
|
|
312
|
+
'br.read1': 'the name of each Chrome browser user and the Google account it uses in Chrome',
|
|
313
|
+
'br.read2': 'the key names claude.ai and chatgpt.com keep in Chrome, never their values',
|
|
314
|
+
'br.read3': 'the account id in each Claude and Codex login file, only to compare',
|
|
315
|
+
'br.never': 'It never opens cookies, saved passwords or the Keychain, never changes Chrome, and sends nothing anywhere.',
|
|
316
|
+
'br.enable': 'Turn on',
|
|
317
|
+
'br.enabled': 'Finding browser sign-ins is on.',
|
|
318
|
+
'br.disable': 'Turn off finding',
|
|
319
|
+
'br.disabled': 'Finding browser sign-ins is off.',
|
|
320
|
+
'br.local': 'Read from Chrome on this computer only. A browser user that signed out may still show here.',
|
|
321
|
+
'br.found': 'Signed in to {ref} from',
|
|
322
|
+
'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.',
|
|
323
|
+
'br.noMatch': '{url} keeps nothing sideby can compare, so pick the browser user yourself.',
|
|
324
|
+
'br.others': 'Other browser users',
|
|
325
|
+
'br.all': 'Browser users',
|
|
326
|
+
'br.noChrome': 'Google Chrome has no data on this Mac yet. Open it once, or get it from google.com/chrome.',
|
|
327
|
+
'br.openIt': 'Open',
|
|
328
|
+
'br.opened': 'Opened {url} in Chrome as {name}.',
|
|
329
|
+
'br.failed': 'Could not open the browser for {ref}: {msg}',
|
|
330
|
+
'br.changed': 'changed {when}',
|
|
285
331
|
'app.apart': 'Signs in on its own',
|
|
286
332
|
'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
333
|
'app.mainName': 'main',
|
|
@@ -437,6 +483,7 @@ const en = {
|
|
|
437
483
|
'nf.accounts.other': '{n} accounts',
|
|
438
484
|
'nf.runOnce': 'Run {bin} once first',
|
|
439
485
|
'nf.notInstalled': 'Not installed',
|
|
486
|
+
'nf.broken': 'Install broken',
|
|
440
487
|
'nf.name': 'Name',
|
|
441
488
|
'nf.namePh': 'name',
|
|
442
489
|
'nf.api': 'API key account',
|
|
@@ -530,13 +577,36 @@ const en = {
|
|
|
530
577
|
'rc.hidden': 'Hidden in this browser. sideby remote-control off turns it off later.',
|
|
531
578
|
'rc.readOnly': 'Run sideby remote-control off to turn it off.',
|
|
532
579
|
'rc.confirmTitle': 'Turn off Remote Control at startup?',
|
|
533
|
-
'rc.change': 'remoteControlAtStartup {from} →
|
|
580
|
+
'rc.change': 'remoteControlAtStartup {from} → {to}',
|
|
534
581
|
'rc.notSet': 'not set',
|
|
535
582
|
'rc.usedBy': 'used by {refs}',
|
|
536
583
|
'rc.confirmNote': 'Running sessions stay connected until you restart them. You can still start it in a session with /remote-control.',
|
|
537
584
|
'rc.confirm': 'Turn off',
|
|
538
585
|
'rc.done': 'Remote Control is off for new sessions. Restart sessions that are running.',
|
|
539
586
|
'rc.failed': 'Could not turn it off: {msg}',
|
|
587
|
+
'set.button': 'Settings',
|
|
588
|
+
'set.lang': 'Language',
|
|
589
|
+
'set.theme': 'Theme',
|
|
590
|
+
'set.theme.system': 'System',
|
|
591
|
+
'set.theme.light': 'Light',
|
|
592
|
+
'set.theme.dark': 'Dark',
|
|
593
|
+
'set.rcOn': 'Remote Control starts by itself',
|
|
594
|
+
'rc.button': 'Remote Control',
|
|
595
|
+
'rc.state.on': 'On',
|
|
596
|
+
'rc.state.default': 'Default',
|
|
597
|
+
'rc.state.off': 'Off',
|
|
598
|
+
'rc.state.missing': 'No settings file',
|
|
599
|
+
'rc.state.blocked': 'Cannot read',
|
|
600
|
+
'rc.dialogTitle': 'Remote Control at startup',
|
|
601
|
+
'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.',
|
|
602
|
+
'rc.allOff': 'Off everywhere. You can still start it in a session with /remote-control, or switch it on above.',
|
|
603
|
+
'rc.undo': 'Undo last change',
|
|
604
|
+
'rc.switch': 'New sessions start it by themselves',
|
|
605
|
+
'rc.confirmOn': 'Turn on',
|
|
606
|
+
'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.',
|
|
607
|
+
'rc.doneOn': 'Remote Control starts by itself in new sessions. Restart sessions that are running.',
|
|
608
|
+
'rc.failedOn': 'Could not turn it on: {msg}',
|
|
609
|
+
'rc.readOnlyBoth': 'Run sideby remote-control on or off to change it.',
|
|
540
610
|
'rc.undone': 'Undone. New sessions go back to the previous setting.',
|
|
541
611
|
'banner.readOnly': 'Read-only view. Use the sideby CLI to fix or create accounts.',
|
|
542
612
|
'banner.plugins.one': '{n} plugin problem.',
|
|
@@ -548,9 +618,9 @@ const zh = {
|
|
|
548
618
|
'top.refresh': '刷新',
|
|
549
619
|
'top.loading': '加载中…',
|
|
550
620
|
'top.refreshing': '刷新中…',
|
|
551
|
-
'top.updated': '{ago}
|
|
552
|
-
'top.updatedTitle': '
|
|
553
|
-
'top.
|
|
621
|
+
'top.updated': '{ago}读取 · 每 {s} 秒自动刷新',
|
|
622
|
+
'top.updatedTitle': '各账号的额度、用量和健康状态,上次读取于 {at}。页面打开时每 {s} 秒重新读取一次。',
|
|
623
|
+
'top.stale': '没有刷新:连不上面板,或上次读取失败。',
|
|
554
624
|
'foot.text': '只在本机运行,数据不会离开这台电脑。',
|
|
555
625
|
'foot.textChecks': '只在本机运行;每天向 npm 查一次 sideby 最新版本号,除此之外没有数据离开这台电脑。',
|
|
556
626
|
'upd.label': 'v{v} 可更新',
|
|
@@ -563,13 +633,22 @@ const zh = {
|
|
|
563
633
|
'upd.runs': '更新会运行:',
|
|
564
634
|
'upd.after': '后台面板会自己重启,本页随后自动刷新。终端里运行的 sideby ui 和已经在跑的会话要重启后才用新版本。',
|
|
565
635
|
'upd.cannot': '这种安装方式下 sideby 不能自己更新:{why}。请自己运行:',
|
|
566
|
-
'upd.skill': '
|
|
636
|
+
'upd.skill': '如果要用 sideby skill,用这条命令安装:',
|
|
637
|
+
'upd.skillToo': 'agent 读的 sideby skill 会一起更新。',
|
|
638
|
+
'upd.skillDone': 'sideby skill 也已更新,agent 下次开会话时生效。',
|
|
639
|
+
'upd.skillManaged': 'sideby 不会自动更新这个 skill({why})。请用这条命令更新:',
|
|
567
640
|
'upd.checksOff': '检查更新已关闭({why})。',
|
|
568
641
|
'upd.latest': '已是最新版本',
|
|
569
642
|
'upd.latestNow': '已是最新版本(刚刚检查)。',
|
|
570
643
|
'upd.check': '检查更新',
|
|
571
644
|
'upd.checking': '正在检查…',
|
|
572
645
|
'upd.verTitle': '当前 sideby {v} · 检查更新',
|
|
646
|
+
'upd.local': '本地构建,来自仓库代码,构建于 {at}。',
|
|
647
|
+
'upd.localDirty': '本地构建,含还没提交的改动,构建于 {at}。',
|
|
648
|
+
'upd.open': '更新…',
|
|
649
|
+
'upd.autoIsOn': '自动更新:开',
|
|
650
|
+
'upd.autoIsOff': '自动更新:关',
|
|
651
|
+
'upd.settings': '设置',
|
|
573
652
|
'upd.checked': '{ago}检查',
|
|
574
653
|
'upd.notYet': 'sideby 还没检查过新版本,每天检查一次。',
|
|
575
654
|
'upd.auto': '自动更新',
|
|
@@ -586,9 +665,6 @@ const zh = {
|
|
|
586
665
|
'upd.reloading': '等待新版本启动,本页会自动刷新。',
|
|
587
666
|
'upd.restartHint': '本页仍在运行旧版本。重启 sideby ui(在 Portal 里就刷新页面)后使用新版本。',
|
|
588
667
|
'acct.title': '账号',
|
|
589
|
-
'theme.system': '主题:跟随系统',
|
|
590
|
-
'theme.light': '主题:浅色',
|
|
591
|
-
'theme.dark': '主题:深色',
|
|
592
668
|
'err.noAnswer': 'sideby 没有响应,恢复后再重试。',
|
|
593
669
|
'err.session': '无法续期会话,请刷新页面。',
|
|
594
670
|
'err.expired': '会话已过期,请刷新页面。',
|
|
@@ -668,6 +744,7 @@ const zh = {
|
|
|
668
744
|
'why.health-fail': '体检发现问题',
|
|
669
745
|
'why.signed-out': '未登录',
|
|
670
746
|
'why.not-installed': '缺少工具',
|
|
747
|
+
'why.broken': '工具安装已损坏',
|
|
671
748
|
'why.quota-high': '{label} 已用 {pct}%({warn}% 起提醒)',
|
|
672
749
|
'why.health-warn': '体检有警告',
|
|
673
750
|
'tb.search': '搜索账号',
|
|
@@ -682,6 +759,7 @@ const zh = {
|
|
|
682
759
|
'tb.used': '已用',
|
|
683
760
|
'tb.left': '剩余',
|
|
684
761
|
'tb.view': '视图',
|
|
762
|
+
'tb.display': '显示',
|
|
685
763
|
'tb.list': '列表',
|
|
686
764
|
'tb.cards': '卡片',
|
|
687
765
|
'tb.hideEmails': '隐藏邮箱',
|
|
@@ -697,8 +775,9 @@ const zh = {
|
|
|
697
775
|
'filter.clear': '清除筛选',
|
|
698
776
|
'group.expand': '展开账号',
|
|
699
777
|
'group.collapse': '收起账号',
|
|
700
|
-
'row.collapse': '收起 {name}',
|
|
701
|
-
'row.expand': '展开 {name}',
|
|
778
|
+
'row.collapse': '收起 {name} 的详情',
|
|
779
|
+
'row.expand': '展开 {name} 的详情',
|
|
780
|
+
'row.runs': '运行方式',
|
|
702
781
|
'group.toggle': '{title}({count}):{action}',
|
|
703
782
|
'group.attention.one': '{n} 个需要处理',
|
|
704
783
|
'group.attention.other': '{n} 个需要处理',
|
|
@@ -720,6 +799,10 @@ const zh = {
|
|
|
720
799
|
'acct.installHost': '本机没有安装 {host}。{link}',
|
|
721
800
|
'acct.nearLimit': '{label} 额度已用 {pct}%,达到 {warn}% 就会提醒。',
|
|
722
801
|
'acct.installIt': '去安装',
|
|
802
|
+
'acct.installHostCmd': '本机没有安装 {host}。在终端运行这条命令安装:',
|
|
803
|
+
'acct.brokenHost': '{host} 的安装已损坏:{path} 无法运行,多半是升级中途断了。重新安装即可:',
|
|
804
|
+
'acct.installDocs': '安装说明',
|
|
805
|
+
'acct.broken': '工具已损坏',
|
|
723
806
|
'quota.pctUsed': '已用 {n}%',
|
|
724
807
|
'quota.pctLeft': '剩余 {n}%',
|
|
725
808
|
'quota.meterUsed': '{label} 额度已用',
|
|
@@ -730,6 +813,13 @@ const zh = {
|
|
|
730
813
|
'quota.dataFrom': '数据来自 {ago}',
|
|
731
814
|
'quota.asOf': '截至 {ago}',
|
|
732
815
|
'quota.sharedFrom': '与 {name} 同一登录;额度读自 {name},{ago}',
|
|
816
|
+
'quota.readFrom': '额度读自 {name},{ago}',
|
|
817
|
+
'login.count': '{n} 个目录共用一份额度',
|
|
818
|
+
'login.label': '同一登录:{names}',
|
|
819
|
+
'login.hint': '{names} 用同一个身份登录。供应商只算一份额度,所以这里只显示一次,交接也不会在它们之间进行。',
|
|
820
|
+
'login.sharedAbove': '共用上方的额度',
|
|
821
|
+
'login.collapse': '收起 {names}',
|
|
822
|
+
'login.expand': '展开 {names}',
|
|
733
823
|
'quota.noWindows': '没有额度窗口数据。',
|
|
734
824
|
'quota.off': '额度未开启',
|
|
735
825
|
'quota.turnOnFamily': '开启额度显示',
|
|
@@ -824,6 +914,32 @@ const zh = {
|
|
|
824
914
|
'desk.started': '已以 {ref} 打开 {app}。',
|
|
825
915
|
'desk.focused': '{ref} 的 {app} 已切到前台。',
|
|
826
916
|
'desk.failed': '没能打开 {ref} 的桌面应用:{msg}',
|
|
917
|
+
'br.open': '在浏览器打开',
|
|
918
|
+
'br.signedIn': '{name}',
|
|
919
|
+
'br.signedInMore': '{name} 等 {n} 个',
|
|
920
|
+
'br.hint': '用登录过 {ref} 的 Chrome 浏览器用户打开 {url}',
|
|
921
|
+
'br.title': '在浏览器打开',
|
|
922
|
+
'br.offIntro': 'sideby 可以找出你在哪个 Chrome 浏览器用户里登录过 {ref},并直接在那里打开 {url}。',
|
|
923
|
+
'br.reads': '为此,sideby 会在本机读取:',
|
|
924
|
+
'br.read1': '每个 Chrome 浏览器用户的名字,和它在 Chrome 里登录的 Google 账号',
|
|
925
|
+
'br.read2': 'claude.ai 和 chatgpt.com 在 Chrome 里存的键名,不读内容',
|
|
926
|
+
'br.read3': '每个 Claude、Codex 登录文件里的账号 ID,只用来比对',
|
|
927
|
+
'br.never': '不打开 Cookie、已存密码和钥匙串,不改 Chrome,不向任何地方发送数据。',
|
|
928
|
+
'br.enable': '开启',
|
|
929
|
+
'br.enabled': '已开启浏览器登录查找。',
|
|
930
|
+
'br.disable': '关闭查找',
|
|
931
|
+
'br.disabled': '已关闭浏览器登录查找。',
|
|
932
|
+
'br.local': '只读取本机 Chrome 的数据。退出登录后,这里可能仍会显示。',
|
|
933
|
+
'br.found': '登录过 {ref} 的浏览器用户',
|
|
934
|
+
'br.none': '还没有找到登录过 {ref} 的 Chrome 浏览器用户。选一个打开 {url},在那里登录后,下次就会显示。',
|
|
935
|
+
'br.noMatch': '{url} 没有保存 sideby 能比对的信息,请自己选浏览器用户。',
|
|
936
|
+
'br.others': '其他浏览器用户',
|
|
937
|
+
'br.all': '浏览器用户',
|
|
938
|
+
'br.noChrome': '这台 Mac 上还没有 Google Chrome 的数据。先打开一次 Chrome,或到 google.com/chrome 下载。',
|
|
939
|
+
'br.openIt': '打开',
|
|
940
|
+
'br.opened': '已用 {name} 在 Chrome 里打开 {url}。',
|
|
941
|
+
'br.failed': '没能为 {ref} 打开浏览器:{msg}',
|
|
942
|
+
'br.changed': '{when}更新',
|
|
827
943
|
'app.apart': '单独登录',
|
|
828
944
|
'app.apartTip': '{app} 用 Cursor 账号登录,和上面的账号都无关。这里每个窗口各自保存登录,可以同时开几个。',
|
|
829
945
|
'app.mainName': 'main',
|
|
@@ -979,6 +1095,7 @@ const zh = {
|
|
|
979
1095
|
'nf.accounts.other': '{n} 个账号',
|
|
980
1096
|
'nf.runOnce': '先运行一次 {bin}',
|
|
981
1097
|
'nf.notInstalled': '未安装',
|
|
1098
|
+
'nf.broken': '安装已损坏',
|
|
982
1099
|
'nf.name': '名称',
|
|
983
1100
|
'nf.namePh': '名称',
|
|
984
1101
|
'nf.api': 'API key 账号',
|
|
@@ -1072,13 +1189,36 @@ const zh = {
|
|
|
1072
1189
|
'rc.hidden': '本浏览器不再提示。以后可以运行 sideby remote-control off 关闭。',
|
|
1073
1190
|
'rc.readOnly': '运行 sideby remote-control off 关闭。',
|
|
1074
1191
|
'rc.confirmTitle': '关闭 Remote Control 自动打开?',
|
|
1075
|
-
'rc.change': 'remoteControlAtStartup {from} →
|
|
1192
|
+
'rc.change': 'remoteControlAtStartup {from} → {to}',
|
|
1076
1193
|
'rc.notSet': '未设置',
|
|
1077
1194
|
'rc.usedBy': '用于 {refs}',
|
|
1078
1195
|
'rc.confirmNote': '已经开着的会话要重开才断开。需要时仍可在会话里运行 /remote-control 手动打开。',
|
|
1079
1196
|
'rc.confirm': '确认关闭',
|
|
1080
1197
|
'rc.done': '新会话不会再自动打开 Remote Control。开着的会话要重开。',
|
|
1081
1198
|
'rc.failed': '没能关闭:{msg}',
|
|
1199
|
+
'set.button': '设置',
|
|
1200
|
+
'set.lang': '语言',
|
|
1201
|
+
'set.theme': '主题',
|
|
1202
|
+
'set.theme.system': '跟随系统',
|
|
1203
|
+
'set.theme.light': '浅色',
|
|
1204
|
+
'set.theme.dark': '深色',
|
|
1205
|
+
'set.rcOn': 'Remote Control 会自动打开',
|
|
1206
|
+
'rc.button': 'Remote Control',
|
|
1207
|
+
'rc.state.on': '开',
|
|
1208
|
+
'rc.state.default': '默认',
|
|
1209
|
+
'rc.state.off': '关',
|
|
1210
|
+
'rc.state.missing': '没有设置文件',
|
|
1211
|
+
'rc.state.blocked': '读不了',
|
|
1212
|
+
'rc.dialogTitle': 'Remote Control 自动打开',
|
|
1213
|
+
'rc.explain': '打开时,每个新的 Claude 会话都会连到 claude.ai 和 Claude 手机 App,登录这个账号的设备都能看到对话。「默认」表示交给 Claude Code 或你的组织决定。',
|
|
1214
|
+
'rc.allOff': '已全部关闭。需要时仍可在会话里运行 /remote-control 手动打开,或在上面切到「开」。',
|
|
1215
|
+
'rc.undo': '撤销上次更改',
|
|
1216
|
+
'rc.switch': '新会话自动打开',
|
|
1217
|
+
'rc.confirmOn': '确认打开',
|
|
1218
|
+
'rc.onWarn': '这些账号的每个新 Claude 会话都会连到 claude.ai 和 Claude 手机 App,其他设备上登录这个账号的人都能看到并继续对话。',
|
|
1219
|
+
'rc.doneOn': '新会话会自动打开 Remote Control。开着的会话要重开。',
|
|
1220
|
+
'rc.failedOn': '没能打开:{msg}',
|
|
1221
|
+
'rc.readOnlyBoth': '运行 sideby remote-control on 或 off 来修改。',
|
|
1082
1222
|
'rc.undone': '已撤销,新会话恢复原来的设置。',
|
|
1083
1223
|
'banner.readOnly': '只读视图。修复或创建账号请用 sideby 命令行。',
|
|
1084
1224
|
'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
|
+
}
|