workoffdesk 1.0.0 → 1.0.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/CHANGELOG.md +27 -0
- package/README.md +5 -3
- package/dist/build.json +1 -1
- package/dist/server/agents/claude/screen/background.js +7 -0
- package/dist/server/agents/claude/screen/prompt.js +34 -0
- package/dist/server/agents/claude/screen/screen.js +42 -3
- package/dist/server/agents/claude/terminals.js +67 -12
- package/dist/server/agents/claude/transcript/chat.js +98 -135
- package/dist/server/agents/claude/transcript/events.js +158 -0
- package/dist/server/agents/claude/transcript/transcriptFile.js +50 -10
- package/dist/server/agents/claude/transcript/transcripts.js +118 -30
- package/dist/server/agents/claude/transcript/turn.js +40 -61
- package/dist/server/agents/codex/agent.js +9 -2
- package/dist/server/agents/codex/events.js +107 -0
- package/dist/server/agents/codex/items.js +54 -74
- package/dist/server/agents/codex/notifications.js +14 -13
- package/dist/server/agents/codex/threads.js +54 -40
- package/dist/server/agents/events.js +4 -0
- package/dist/server/agents/turnSays.js +58 -0
- package/dist/server/cli.js +2 -0
- package/dist/server/commands/activity.js +28 -0
- package/dist/server/http/app.js +8 -4
- package/dist/server/http/auth/guard.js +8 -4
- package/dist/server/http/auth/passkey.js +6 -3
- package/dist/server/http/routes/appUpdate.js +1 -1
- package/dist/server/http/routes/chat.js +10 -0
- package/dist/server/http/routes/claude.js +70 -16
- package/dist/server/http/routes/codex.js +38 -3
- package/dist/server/http/routes/journal.js +3 -1
- package/dist/server/http/routes/push.js +36 -5
- package/dist/server/http/routes/pushRelay.js +62 -0
- package/dist/server/http/routes/sessions.js +32 -1
- package/dist/server/http/serve.js +8 -2
- package/dist/server/http/sessionSocket.js +12 -11
- package/dist/server/journal/db.js +4 -0
- package/dist/server/journal/index.js +4 -0
- package/dist/server/journal/ingest.js +26 -13
- package/dist/server/notify/apns.js +12 -7
- package/dist/server/notify/push.js +30 -4
- package/dist/server/notify/seal.js +12 -0
- package/dist/server/ops/doctor.js +7 -6
- package/dist/server/ops/problems.js +12 -7
- package/dist/server/sessions/control.js +65 -0
- package/dist/server/sessions/events.js +7 -5
- package/dist/server/sessions/machine/input.js +21 -2
- package/dist/server/sessions/machine/lifecycle.js +151 -81
- package/dist/server/sessions/machine/moves.js +65 -13
- package/dist/server/sessions/machine/naming.js +85 -0
- package/dist/server/sessions/machine/state.js +2 -0
- package/dist/server/sessions/machine/status.js +1 -2
- package/dist/server/sessions/machine/takeOvers.js +92 -0
- package/dist/server/sessions/machine.js +87 -23
- package/dist/server/sessions/outbox.js +7 -1
- package/dist/server/system/config.js +16 -1
- package/dist/server/system/errors.js +2 -2
- package/dist/server/system/messages.js +14 -176
- package/dist/server/system/messages.zh.js +186 -0
- package/dist/server/system/project.js +65 -0
- package/dist/server/system/store.js +1 -1
- package/dist/server/system/tmux.js +1 -1
- package/dist/web/assets/{Setup-DinzDcF1.js → Setup-OaIjxfwl.js} +1 -1
- package/dist/web/assets/main-DFndf3Z8.js +132 -0
- package/dist/web/assets/main-mChS_ic8.css +1 -0
- package/dist/web/icon-180.png +0 -0
- package/dist/web/icon-192.png +0 -0
- package/dist/web/icon-512.png +0 -0
- package/dist/web/icon-maskable-512.png +0 -0
- package/dist/web/icon.svg +14 -6
- package/dist/web/index.html +2 -2
- package/dist/web/manifest.webmanifest +1 -1
- package/dist/web/sw.js +4 -4
- package/package.json +3 -3
- package/dist/web/assets/main-C8GiLoJy.css +0 -1
- package/dist/web/assets/main-w7i8PvU7.js +0 -132
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--text-scale: 1;color-scheme:dark;--bg: #0d1117;--surface: #161b22;--surface-2: #1f2630;--border: #2d333b;--text: #e6edf3;--muted: #8b949e;--accent: #2f81f7;--codex: #8957e5;--accent-text: #ffffff;--danger: #f85149;--working: #2f81f7;--waiting: #d29922;--idle: #3fb950;--ended: #6e7681;--neutral: #6e7681;--added: #3fb950;--added-bg: rgba(63, 185, 80, .16);--removed-bg: rgba(248, 81, 73, .16);--term-bg: #0d1117;--row: var(--surface);--row-held: var(--surface-2);--row-pinned: #1a2028;--claude: #2f81f7;--mine: var(--accent);--mine-text: var(--accent-text);--glow-1: #d6e8ff;--glow-2: #5ea4ff;--glow-3: #2f86ff;--voice-bottom: #1670f5;--voice-shine: rgb(64 200 255 / .75);--radius: 14px;--safe-top: env(safe-area-inset-top, 0px);--safe-bottom: env(safe-area-inset-bottom, 0px);--safe-left: env(safe-area-inset-left, 0px);--safe-right: env(safe-area-inset-right, 0px);font-family:-apple-system,BlinkMacSystemFont,PingFang SC,Helvetica Neue,system-ui,sans-serif;-webkit-text-size-adjust:100%}:root[data-theme=light],:root[data-theme=eye]{color-scheme:light;--bg: #f6f7f9;--surface: #ffffff;--surface-2: #eef1f4;--border: #d8dee4;--text: #1f2328;--muted: #636c76;--accent: #0969da;--codex: #8250df;--danger: #cf222e;--working: #0969da;--waiting: #bf8700;--idle: #1a7f37;--ended: #8c959f;--neutral: #636c76;--added: #1a7f37;--added-bg: rgba(26, 127, 55, .12);--removed-bg: rgba(207, 34, 46, .1);--term-bg: #ffffff;--row-pinned: #f3f5f8}:root[data-theme=eye]{--bg: #dff1df;--surface: #edf9ed;--surface-2: #b5e0bc;--border: #aac7aa;--row: #b5e0bc;--row-held: #a3d3ab;--row-pinned: #acdab4;--text: #000000;--muted: #505f50;--accent: #ad644e;--claude: #87ae88;--codex: #7288a4;--working: #ad644e;--mine: #eae0cb;--mine-text: #000000;--glow-1: #eae0cb;--glow-2: #d88c74;--glow-3: #bf745e;--voice-bottom: #ad644e;--voice-shine: rgb(216 140 116 / .6);--danger: #e7000b;--waiting: #9c6900;--ended: #899989;--neutral: #505f50;--term-bg: #edf9ed}*{box-sizing:border-box}html,body,#root{margin:0;height:100%}body{background:var(--bg);color:var(--text);font-size:calc(16px * var(--text-scale));line-height:1.45;overscroll-behavior:none}button{font:inherit;color:inherit;cursor:pointer;-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none;-webkit-tap-highlight-color:transparent}input,textarea{font:inherit;color:inherit}.page{min-height:100dvh;padding:calc(var(--safe-top) + 12px) calc(var(--safe-right) + 16px) calc(var(--safe-bottom) + 24px) calc(var(--safe-left) + 16px);max-width:720px;margin:0 auto}.pagebar{position:sticky;top:0;z-index:20;display:flex;align-items:center;padding:var(--safe-top) var(--safe-right) 10px var(--safe-left);background:var(--surface);border-bottom:.5px solid var(--border)}.pagebar-back,.pagebar-right{flex:none;min-width:72px;height:44px;display:flex;align-items:center}.pagebar-back{justify-content:flex-start;padding:0 0 0 24px;border:0;background:transparent;color:var(--text);-webkit-tap-highlight-color:transparent}.pagebar-back svg{width:24px;height:24px}.pagebar-back:active{opacity:.5}.pagebar-right{justify-content:flex-end;padding-right:26px}.pagebar h1{flex:1;min-width:0;margin:0;text-align:center;font-size:calc(17px * var(--text-scale));font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pagebar+.page{min-height:0;padding-top:16px}.pagebar+.page>:first-child{margin-top:0}.icon-btn{min-width:44px;height:44px;display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:12px;border:0;background:transparent;padding:0 10px;color:var(--text)}.icon-btn:active{background:var(--surface-2)}.icon-btn svg{width:22px;height:22px}.btn{min-height:48px;border-radius:12px;border:1px solid var(--border);background:var(--surface);padding:0 18px;font-weight:600;display:inline-flex;align-items:center;justify-content:center;gap:8px}.btn{white-space:nowrap;flex:none}.btn svg{width:20px;height:20px;flex:none}.btn:active{filter:brightness(.92)}.btn:disabled{opacity:.55;cursor:default}.btn.primary{background:var(--accent);border-color:var(--accent);color:var(--accent-text)}.btn.danger{color:var(--danger)}.btn.block{width:100%}.btn.small{min-height:36px;padding:0 12px;font-size:calc(14px * var(--text-scale));border-radius:10px}.muted{color:var(--muted)}.center{text-align:center}.login{min-height:100dvh;display:flex;align-items:center;justify-content:center;padding:24px calc(var(--safe-right) + 20px) calc(var(--safe-bottom) + 24px) calc(var(--safe-left) + 20px)}.login-card{width:100%;max-width:360px;display:flex;flex-direction:column;gap:14px}.brand{display:flex;flex-direction:column;align-items:center;gap:10px;margin-bottom:18px}.brand img{width:64px;height:64px;border-radius:16px}.brand h1{margin:0;font-size:calc(26px * var(--text-scale));letter-spacing:-.02em}.brand p{margin:0;color:var(--muted);font-size:calc(15px * var(--text-scale))}.divider{display:flex;align-items:center;gap:12px;color:var(--muted);font-size:calc(13px * var(--text-scale));margin:6px 0}.divider:before,.divider:after{content:"";flex:1;height:1px;background:var(--border)}.field{display:flex;flex-direction:column;gap:6px;font-size:calc(14px * var(--text-scale));color:var(--muted)}.field input{height:48px;border-radius:12px;border:1px solid var(--border);background:var(--surface);padding:0 14px;font-size:max(16px,calc(16px * var(--text-scale)));color:var(--text);outline:none}.field input:focus{border-color:var(--accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 25%,transparent)}.alert{border-radius:12px;padding:10px 14px;font-size:calc(14px * var(--text-scale));background:color-mix(in srgb,var(--danger) 14%,transparent);color:var(--danger)}.note{border-radius:12px;padding:10px 14px;font-size:calc(14px * var(--text-scale));background:var(--surface-2);color:var(--muted)}.chip{display:inline-flex;align-items:center;gap:6px;font-size:calc(12px * var(--text-scale));font-weight:600;padding:2px 8px;border-radius:999px;background:var(--surface-2);color:var(--muted);white-space:nowrap}.chip.idle{color:var(--idle);background:color-mix(in srgb,var(--idle) 14%,transparent)}.empty{display:flex;flex-direction:column;align-items:center;text-align:center;gap:10px;padding:56px 16px;color:var(--muted)}.empty svg{width:44px;height:44px;opacity:.6}.empty strong{color:var(--text);font-size:calc(17px * var(--text-scale))}.list-page{min-height:100dvh;max-width:720px;margin:0 auto;display:flex;flex-direction:column;padding:0 var(--safe-right) calc(var(--safe-bottom) + 16px) var(--safe-left)}.list-top{position:sticky;top:0;z-index:20;display:grid;grid-template-columns:100px 1fr 100px;align-items:center;padding:var(--safe-top) 0 10px;background:var(--surface);border-bottom:.5px solid var(--border)}.list-top h1{margin:0;text-align:center;font-size:calc(17px * var(--text-scale));font-weight:600}.list-top .icon-btn{justify-self:center}.list-top-right{justify-self:center;display:flex}.list-problem{margin:8px 16px}.list-top .icon-btn svg{width:26px;height:26px}.list-search{position:sticky;bottom:calc(var(--safe-bottom) + 12px);z-index:20;margin:auto 24px 0;display:flex;align-items:center;gap:8px;height:48px;padding:0 16px;border-radius:24px;color:var(--muted);background:color-mix(in srgb,var(--surface) 82%,transparent);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);box-shadow:0 4px 18px #0000001f,inset 0 0 0 .5px var(--border)}.list-search svg{flex:none;width:22px;height:22px}.list-search input{flex:1;min-width:0;height:100%;border:0;padding:0;background:transparent;color:var(--text);font-size:max(16px,calc(16px * var(--text-scale)));outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.list-search input::placeholder{color:var(--muted)}.list-search input::-webkit-search-decoration{-webkit-appearance:none}.sess-list{background:var(--row)}.sess-row{position:relative;overflow:hidden}.sess-actions{position:absolute;top:0;right:0;bottom:0;display:flex}.sess-action{flex:1;border:0;background:var(--accent);color:var(--accent-text);font-size:calc(15px * var(--text-scale));font-weight:600}.sess-action.danger{background:var(--danger);color:#fff}.sess-action.neutral{background:var(--neutral);color:#fff}.sess-row>.sess-item{background:var(--row);touch-action:pan-y;transition:transform .2s}.sess-row.dragging>.sess-item{transition:none}.sess-row.pinned{--row: var(--row-pinned)}.sess-row+.sess-row>.sess-item:before,.sess-item.mac+.sess-item.mac:before{content:"";position:absolute;top:0;left:76px;right:0;border-top:.5px solid var(--border)}.sess-dir{flex:none;font-size:calc(13px * var(--text-scale));color:var(--muted);white-space:nowrap}.rename-form{display:flex;gap:8px}.sess-item{position:relative;display:flex;align-items:center;gap:12px;height:72px;padding:0 16px}.sess-item:active{background:var(--row-held)}.avatar{position:relative;flex:none;width:48px;height:48px;border-radius:6px;display:grid;place-items:center;color:#fff}.avatar svg{width:26px;height:26px}.avatar.claude{background:var(--claude)}.avatar.codex{background:var(--codex)}.avatar.shell{background:#3d4450}.needs-you{position:absolute;top:-4px;right:-4px;width:12px;height:12px;border-radius:50%;background:#fa5151;border:1.5px solid var(--row)}.busy{position:absolute;right:-4px;bottom:-4px;width:14px;height:14px;border-radius:50%;background:var(--accent);border:2px solid var(--row)}.sess-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}.sess-top{display:flex;align-items:baseline;gap:8px}.sess-names{flex:1 1 0;min-width:0;display:flex;flex-wrap:wrap;align-items:baseline;column-gap:8px;font-size:calc(17px * var(--text-scale));height:1lh;overflow:hidden}.sess-name{flex:1 1 auto;min-width:0;font-size:calc(17px * var(--text-scale));overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sess-time{flex:none;font-size:calc(12px * var(--text-scale));color:var(--muted)}.sess-preview{font-size:calc(14px * var(--text-scale));color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sess-hint{margin:8px 16px 20px;font-size:calc(12px * var(--text-scale))}.scrim{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000073;z-index:40;animation:fade .15s ease-out}.sheet{position:fixed;left:0;right:0;top:calc(var(--safe-top) + 10px);bottom:0;z-index:41;display:flex;flex-direction:column;gap:12px;overflow:hidden;background:var(--surface);border-radius:38px 38px 0 0;box-shadow:0 -2px 16px #00000014;padding:16px calc(var(--safe-right) + 16px) calc(var(--safe-bottom) + 16px) calc(var(--safe-left) + 16px);animation:rise .25s ease-out;max-width:720px;margin:0 auto}@media(min-width:760px){.sheet{bottom:auto;top:12dvh;border-radius:18px;width:560px;max-height:76dvh;padding-bottom:16px}.sheet.screen-sheet{height:76dvh}}.sheet.bar{gap:0;padding:0;background:var(--bg)}.sheet.bar .sheet-head{display:grid;grid-template-columns:40px 1fr 40px;padding:12px calc(var(--safe-right) + 16px) 12px calc(var(--safe-left) + 16px);background:var(--surface);border-bottom:1px solid var(--border)}.sheet.bar .sheet-head h2{text-align:center;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sheet.bar .sheet-body{gap:10px;padding:16px calc(var(--safe-right) + 16px) calc(var(--safe-bottom) + 16px) calc(var(--safe-left) + 16px)}.sheet.bar .search{background:var(--surface)}.sheet.bar .note{background:none;padding:12px 0;text-align:center}.sheet-side{display:flex}.move-when{display:flex;flex-direction:column;gap:8px}.sheet-lead{margin:0;font-size:calc(15px * var(--text-scale));overflow-wrap:anywhere}.sheet-note{margin:0;font-size:calc(13px * var(--text-scale));color:var(--muted)}.scrim.soft{background:#0000004d}.action-sheet{position:fixed;top:0;right:0;bottom:0;left:0;z-index:41;display:grid;place-items:center;pointer-events:none;padding:calc(var(--safe-top) + 16px) calc(var(--safe-right) + 24px) calc(var(--safe-bottom) + 16px) calc(var(--safe-left) + 24px)}.action-card{pointer-events:auto;width:min(320px,100%);max-height:100%;overflow-y:auto;display:flex;flex-direction:column;gap:8px;padding:14px;border-radius:32px;background:var(--surface);box-shadow:0 8px 24px #0000002e;animation:pop .18s ease-out}.action-head{display:flex;flex-direction:column;gap:4px;padding:10px 8px 8px;text-align:center;overflow-wrap:anywhere}.action-title{font-size:calc(17px * var(--text-scale));color:var(--text)}.action-message{font-size:calc(13px * var(--text-scale));color:var(--muted);white-space:pre-line}.action{min-height:44px;padding:6px 16px;border:0;border-radius:22px;background:var(--surface-2);color:var(--text);font-size:calc(17px * var(--text-scale));font-weight:600}.action:active{filter:brightness(.94)}.action.danger{color:var(--danger)}.action-row{display:flex;gap:8px}.action-row .action{flex:1;min-width:0;font-weight:500}.action-card.alert .action-head{padding:10px 16px 12px;text-align:left}.action-card.alert .action-title{font-weight:600}.action-card.alert .action-message{font-size:calc(15px * var(--text-scale))}.sheet-head{display:flex;align-items:center;gap:8px;min-height:40px;flex:none}.sheet-head>.icon-btn:first-child{margin-left:-11px}.sheet-close{flex:none;display:grid;place-items:center;width:40px;height:40px;padding:0;border:0;border-radius:50%;background:var(--surface);color:var(--text);box-shadow:0 3px 10px #0000001f}.sheet-close:active{background:var(--surface-2)}.sheet-close svg{width:18px;height:18px;stroke-width:2.4}.sheet-head h2{flex:1;margin:0;font-size:calc(17px * var(--text-scale));font-weight:700}.sheet-body{flex:1;min-height:0;overflow-y:auto;-webkit-overflow-scrolling:touch;display:flex;flex-direction:column;gap:12px}.sheet-body>*{flex:none}.fold{display:flex;align-items:center;gap:6px;border:0;background:transparent;padding:10px 15px;text-align:left;color:var(--muted);font-size:calc(14px * var(--text-scale));font-weight:600}.fold svg{width:16px;height:16px;margin-left:-4px;transform:rotate(180deg);transition:transform .15s}.fold[aria-expanded=true] svg{transform:rotate(-90deg)}@keyframes rise{0%{transform:translateY(24px);opacity:0}}@keyframes fade{0%{opacity:0}}@keyframes pop{0%{transform:scale(.94);opacity:0}}.option{display:flex;align-items:center;gap:14px;width:100%;text-align:left;padding:14px;background:var(--surface);border:1px solid var(--border);border-radius:14px}.option:active{background:var(--surface-2)}.option:disabled{cursor:default;opacity:.5}.opt-rule{border:0;border-top:1px solid var(--border);margin:4px 0;width:100%}.option .opt-icon{display:flex;flex:none;color:var(--accent)}.option .opt-icon svg{width:24px;height:24px;stroke-width:1.6}.option .opt-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}.option .opt-title{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.option .opt-sub{font-size:calc(13px * var(--text-scale));color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.option-row{display:flex;gap:8px}.option-row .option{flex:1;min-width:0}.option-in{flex:none;width:52px;display:grid;place-items:center;background:var(--surface);border:1px solid var(--border);border-radius:14px;color:var(--muted)}.option-in:active{background:var(--surface-2)}.option-in svg{width:20px;height:20px}.search{height:44px;border-radius:10px;border:1px solid var(--border);background:var(--bg);padding:0 12px;font-size:max(16px,calc(16px * var(--text-scale)));outline:none;width:100%}.search:focus{border-color:var(--accent)}.term-page{position:fixed;left:0;right:0;top:0;height:var(--vvh, 100dvh);display:flex;flex-direction:column;background:var(--term-bg)}.term-title{min-width:0;max-width:260px;margin:0 auto;display:flex;flex-direction:column;align-items:center;line-height:1.25;padding:0 4px;border:0;background:transparent;text-align:center;color:var(--text)}.term-title>strong{max-width:100%;font-size:calc(16px * var(--text-scale));font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.term-title>span{max-width:100%;font-size:calc(11px * var(--text-scale));font-weight:400;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-word{font-weight:600;margin-right:.6em}.status-word.working{color:var(--working)}.status-word.waiting{color:var(--waiting)}.status-word.idle{color:var(--idle)}.pagebar-right .icon-btn{margin-right:-10px}.pagebar-right .icon-btn svg{width:24px;height:24px}.term-wrap{flex:1;min-height:0;position:relative;padding:4px calc(var(--safe-right) + 4px) 0 calc(var(--safe-left) + 6px)}.overlay{position:absolute;top:0;right:0;bottom:0;left:0;z-index:5;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;background:color-mix(in srgb,var(--term-bg) 72%,transparent);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);text-align:center;padding:24px}.overlay strong{font-size:calc(18px * var(--text-scale))}.overlay .actions{display:flex;gap:10px}.spinner{display:inline-block;flex:none;width:28px;height:28px;border-radius:50%;border:3px solid var(--border);border-top-color:var(--accent);animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.term-bottom{background:var(--bg);border-top:.5px solid var(--border);padding:8px calc(var(--safe-right) + 10px) max(6px,calc(var(--safe-bottom) - 6px)) calc(var(--safe-left) + 10px);display:flex;flex-direction:column;gap:8px}:root[data-no-home-indicator] .term-bottom{padding-bottom:6px}.ended-bar{align-items:center;gap:8px;padding-top:16px;text-align:center}.ended-bar strong{font-size:calc(17px * var(--text-scale))}.ended-bar .actions{display:flex;gap:10px;margin-top:4px}.ended-bar>.queue{align-self:stretch;text-align:start}.keybar{display:flex;flex-wrap:wrap;gap:6px}.key{flex:none;min-width:44px;height:38px;padding:0 10px;border-radius:9px;border:1px solid var(--border);background:var(--surface-2);font-size:calc(14px * var(--text-scale));font-weight:600;font-family:ui-monospace,SF Mono,Menlo,monospace;touch-action:manipulation;user-select:none;-webkit-user-select:none}.key:active{background:var(--border)}.key.armed{background:var(--accent);border-color:var(--accent);color:var(--accent-text)}.composer{border-radius:26px;background:var(--surface);border:1px solid var(--border);box-shadow:0 2px 12px #00000014}.composer-row{position:relative;display:flex;align-items:flex-end;gap:2px;min-height:52px;padding:6px}.composer .tool.attach{color:var(--muted)}.sources-catcher{position:fixed;top:0;right:0;bottom:0;left:0;z-index:30}.sources{position:absolute;left:4px;bottom:calc(100% + 6px);z-index:31;min-width:180px;padding:6px;border-radius:16px;background:var(--surface);border:.5px solid var(--border);box-shadow:0 6px 16px #00000029;animation:rise .15s ease-out}.sources button{display:flex;align-items:center;gap:12px;width:100%;min-height:48px;padding:0 12px;border:0;border-radius:10px;background:transparent;color:var(--text);font-size:calc(16px * var(--text-scale));text-align:left;white-space:nowrap}.sources button:active{background:var(--surface-2)}.sources svg{flex:none;width:20px;height:20px}.composer.with-pictures{border-radius:16px}.attachments{display:flex;gap:8px;padding:10px 10px 0;overflow-x:auto;scrollbar-width:none}.attachments::-webkit-scrollbar{display:none}.attachment{position:relative;flex:none;width:64px;height:64px;border-radius:12px;background:var(--surface-2)}.attachment img{width:100%;height:100%;object-fit:cover;display:block;border-radius:12px}.attachment.video{background:#1c1c1e}.attachment-cover{position:absolute;top:0;right:0;bottom:0;left:0;display:grid;place-items:center;border-radius:12px;background:#00000059;color:#fff;font-size:calc(13px * var(--text-scale));font-weight:600;font-variant-numeric:tabular-nums}.attachment-cover svg{width:18px;height:18px}.attachment-cover .spinner{width:22px;height:22px;border-width:2.5px;border-color:#ffffff59;border-top-color:#fff}.attachment.file{width:160px;display:flex;align-items:center;gap:8px;padding:0 10px}.attachment.file>svg{flex:none;width:22px;height:22px;color:var(--muted)}.attachment-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.attachment-name{font-size:calc(12px * var(--text-scale));line-height:1.3;color:var(--text)}.attachment-sent{font-size:calc(11px * var(--text-scale));color:var(--muted)}.attachment .remove{position:absolute;top:-6px;right:-6px;width:22px;height:22px;border-radius:50%;border:2px solid var(--surface);padding:0;display:grid;place-items:center;background:var(--muted);color:var(--surface)}.attachment .remove svg{width:10px;height:10px;stroke-width:3.2}.slash-menu{max-height:220px;overflow-y:auto;-webkit-overflow-scrolling:touch;border-bottom:1px solid var(--border);padding:4px 0}.slash-menu button{display:flex;flex-direction:column;align-items:flex-start;gap:2px;width:100%;border:0;background:transparent;padding:8px 16px;text-align:left;touch-action:manipulation}.slash-menu button:active{background:var(--surface-2)}.slash-menu b{font-size:calc(15px * var(--text-scale));font-weight:600;font-family:ui-monospace,SF Mono,Menlo,monospace}.slash-menu span{max-width:100%;font-size:calc(13px * var(--text-scale));color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.composer-field{position:relative;flex:1;min-width:0;display:flex}.composer textarea{flex:1;min-width:0;min-height:40px;max-height:120px;resize:none;border:0;background:transparent;padding:9px 4px;font-size:max(16px,calc(16px * var(--text-scale)));line-height:1.35;outline:none}.hold-bar{position:absolute;top:0;right:0;bottom:0;left:0;border:0;background:transparent;padding:0 4px;text-align:left;font-size:calc(16px * var(--text-scale));color:var(--muted);touch-action:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}.composer .tool{flex:none;width:40px;height:40px;display:grid;place-items:center;border-radius:50%;padding:0;border:0;background:transparent;color:var(--text)}.composer .tool svg{width:24px;height:24px}.composer .tool:disabled{opacity:.55}.composer .send{flex:none;width:44px;height:44px;margin:-2px 2px -2px 0;display:grid;place-items:center;padding:0;border:0;background:transparent;color:var(--accent-text)}.send-dot{width:36px;height:36px;border-radius:50%;display:grid;place-items:center;background:var(--accent)}.composer .send svg{width:20px;height:20px}.send-dot .spinner{width:18px;height:18px;border-width:2.5px;border-color:color-mix(in srgb,var(--accent-text) 35%,transparent);border-top-color:var(--accent-text)}.voice-panel{--veil: max(38vh, 340px);position:fixed;left:0;right:0;bottom:0;z-index:30;height:calc(var(--veil) + var(--safe-bottom));pointer-events:none;background:linear-gradient(to bottom,transparent calc(100% - 48px),var(--voice-bottom)),radial-gradient(120% 70% at 100% 100%,var(--voice-shine),transparent 65%),linear-gradient(to bottom,transparent,var(--surface) 13%,var(--glow-1) 28%,var(--glow-2) 50%,var(--glow-3) 68%,var(--voice-bottom))}:root.voice-held body{background:var(--voice-bottom)}.voice-heard{position:absolute;left:calc(var(--safe-left) + 16px);right:calc(var(--safe-right) + 16px);bottom:calc(100% + 8px);max-height:calc(6em + 28px);overflow-y:auto;padding:14px 16px;border-radius:16px;background:var(--surface);color:var(--text);box-shadow:0 4px 16px #0000001f,0 0 40px 28px var(--surface);font-size:calc(20px * var(--text-scale));line-height:1.5;overflow-wrap:anywhere}.voice-targets{position:absolute;left:0;right:0;bottom:calc(var(--safe-bottom) + 168px);display:flex}.voice-target{flex:1;display:flex;flex-direction:column;align-items:center;gap:6px;font-size:calc(13px * var(--text-scale));font-weight:600;color:#ffffffe6;transition:transform .12s ease-out}.voice-target-dot{width:60px;height:60px;border-radius:50%;display:grid;place-items:center;background:#ffffff3d;box-shadow:inset 0 0 0 1px #ffffff73;color:#fff;transition:background .12s,color .12s}.voice-target-dot svg{width:26px;height:26px;stroke-width:2.4}.voice-target.active{transform:scale(1.22);color:#fff}.voice-target.active .voice-target-dot{background:#fff;color:var(--voice-bottom)}.voice-target.cancel.active .voice-target-dot{color:var(--danger)}.voice-hint{position:absolute;left:0;right:0;bottom:calc(var(--safe-bottom) + 120px);text-align:center;font-size:calc(15px * var(--text-scale));line-height:20px;color:#ffffffe0}.voice-panel:not(.zone-send) .voice-hint{color:#fff;font-weight:600}.voice-panel .wave,.voice-panel>.spinner{position:absolute;left:50%;bottom:calc(var(--safe-bottom) + 62px);transform:translate(-50%)}.voice-panel>.spinner{width:24px;height:24px;border-width:2.5px;border-color:#ffffff59;border-top-color:#fff;animation:spin-centered .8s linear infinite}@keyframes spin-centered{0%{transform:translate(-50%) rotate(0)}to{transform:translate(-50%) rotate(360deg)}}.wave{display:flex;align-items:center;gap:2.5px;height:24px;-webkit-mask-image:linear-gradient(to right,transparent,#000 18%,#000 82%,transparent);mask-image:linear-gradient(to right,transparent,#000 18%,#000 82%,transparent)}.wave i{width:2.5px;height:100%;border-radius:2px;background:#fff;animation:wave .9s ease-in-out infinite;transform-origin:center}@keyframes wave{0%,to{transform:scaleY(.3)}50%{transform:scaleY(1)}}.section{margin-top:22px}.section h2{font-size:calc(13px * var(--text-scale));text-transform:uppercase;color:var(--muted);font-weight:600;margin:0 0 8px;padding:0 4px}.group{background:var(--surface);border-radius:12px;overflow:hidden}.row{display:flex;align-items:center;gap:12px;padding:10px 14px;min-height:52px}.row+.row,.snippets-input+.row{background-image:linear-gradient(var(--border),var(--border));background-size:calc(100% - 14px) .5px;background-position:14px 0;background-repeat:no-repeat}.row-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.row-main strong{font-weight:400;font-size:calc(16px * var(--text-scale));display:flex;gap:8px;align-items:center}.row-main span{font-size:calc(13px * var(--text-scale));color:var(--muted)}.row.empty-row{color:var(--muted);font-size:calc(13px * var(--text-scale))}.stepper{display:flex;align-items:center;gap:10px;flex:none}.stepper .btn{min-width:44px;height:44px;font-weight:600}.stepper output{min-width:48px;text-align:center;font-size:calc(15px * var(--text-scale));font-variant-numeric:tabular-nums}.row.text-preview{font-size:calc(15px * var(--text-scale));line-height:1.45}.section-actions{margin-top:10px;display:flex;flex-direction:column;gap:8px}.toast{position:fixed;left:50%;transform:translate(-50%);bottom:calc(var(--safe-bottom) + 120px);z-index:60;background:var(--text);color:var(--bg);padding:10px 16px;border-radius:12px;font-size:calc(14px * var(--text-scale));max-width:calc(100vw - 32px)}.update-offer{position:fixed;left:50%;transform:translate(-50%);top:calc(var(--safe-top) + 58px);z-index:70;border:0;border-radius:18px;padding:7px 14px;background:var(--text);color:var(--bg);white-space:nowrap;font-size:calc(14px * var(--text-scale));font-weight:600;box-shadow:0 2px 10px #00000026;max-width:calc(100vw - 32px)}.switch{position:relative;width:51px;height:31px;flex:none}.switch input{position:absolute;opacity:0;top:0;right:0;bottom:0;left:0;margin:0;cursor:pointer}.switch span{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:16px;background:var(--border);transition:background .15s;pointer-events:none}.switch span:after{content:"";position:absolute;top:2px;left:2px;width:27px;height:27px;border-radius:50%;background:#fff;transition:transform .15s;box-shadow:0 1px 3px #0000004d}.switch input:checked+span{background:var(--idle)}.switch input:checked+span:after{transform:translate(20px)}.switch input:disabled+span{opacity:.5}.chat-layer{position:absolute;top:0;right:0;bottom:0;left:0;z-index:4;background:var(--bg)}.chat{position:absolute;top:0;right:0;bottom:0;left:0;overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;display:flex;flex-direction:column;gap:10px;padding:12px calc(var(--safe-right) + 12px) 16px calc(var(--safe-left) + 12px);overflow-anchor:none}.chat-older{align-self:center;flex:none;padding:2px 0}.chat-older .spinner{width:22px;height:22px;border-width:2.5px}.bubble{max-width:88%;padding:8px 12px;border-radius:16px;font-size:calc(15px * var(--text-scale));line-height:1.45;white-space:pre-wrap;overflow-wrap:anywhere}.bubble.mine{align-self:flex-end;background:var(--mine);color:var(--mine-text);border-bottom-right-radius:6px}.bubble.mine.folded{flex-shrink:0;max-height:calc(15px * var(--text-scale) * 1.45 * 8 + 16px);overflow:hidden;-webkit-mask-image:linear-gradient(#000 70%,transparent);mask-image:linear-gradient(#000 70%,transparent)}.chat .mine-more{align-self:flex-end;margin-top:-6px;padding:4px 2px;border:0;background:none;font:inherit;font-size:calc(13px * var(--text-scale));color:var(--accent)}.reply{align-self:stretch;min-width:0;padding:14px 17px;border-radius:14px;background:var(--surface-2);font-size:calc(16px * var(--text-scale));line-height:1.55;overflow-wrap:anywhere}.reply>:first-child{margin-top:0}.reply>:last-child{margin-bottom:0}.reply p,.reply ul,.reply ol,.reply pre,.reply table,.reply blockquote{margin:0 0 14px}.reply h1,.reply h2,.reply h3,.reply h4{font-size:calc(17px * var(--text-scale));line-height:1.4;margin:18px 0 10px}.reply h1{font-size:calc(19px * var(--text-scale))}.reply ul,.reply ol{padding-left:20px}.reply ul{list-style-type:disc}.reply li{margin:4px 0}.reply li>ul,.reply li>ol{margin:4px 0 0}.reply code{font-family:ui-monospace,SF Mono,Menlo,monospace;font-size:.86em;padding:1px 4px;border-radius:4px;background:color-mix(in srgb,var(--text) 8%,transparent)}.reply pre code{padding:0;background:none;font-size:inherit}.reply pre{background:var(--surface);border:1px solid var(--border)}.reply .code-block{position:relative}.reply .code-block pre{margin:0 0 14px;padding-top:34px}.code-copy{position:absolute;top:6px;right:6px;padding:3px 9px;border:1px solid var(--border);border-radius:7px;background:var(--surface-2);color:var(--muted);font:inherit;font-size:calc(12px * var(--text-scale))}.hljs-comment,.hljs-quote{color:#8b949e;font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-type,.hljs-meta .hljs-keyword{color:#ff7b72}.hljs-string,.hljs-regexp,.hljs-meta .hljs-string{color:#a5d6ff}.hljs-number,.hljs-literal,.hljs-variable.constant_,.hljs-attr,.hljs-attribute{color:#79c0ff}.hljs-title,.hljs-title.function_,.hljs-section{color:#d2a8ff}.hljs-built_in,.hljs-symbol,.hljs-name,.hljs-selector-class{color:#ffa657}.hljs-deletion{color:#ffdcd7;background:#67060c}.hljs-addition{color:#aff5b4;background:#033a16}:is([data-theme=light],[data-theme=eye]) :is(.hljs-comment,.hljs-quote){color:#6e7781}:is([data-theme=light],[data-theme=eye]) :is(.hljs-keyword,.hljs-selector-tag,.hljs-type,.hljs-meta .hljs-keyword){color:#cf222e}:is([data-theme=light],[data-theme=eye]) :is(.hljs-string,.hljs-regexp,.hljs-meta .hljs-string){color:#0a3069}:is([data-theme=light],[data-theme=eye]) :is(.hljs-number,.hljs-literal,.hljs-variable.constant_,.hljs-attr,.hljs-attribute){color:#0550ae}:is([data-theme=light],[data-theme=eye]) :is(.hljs-title,.hljs-title.function_,.hljs-section){color:#8250df}:is([data-theme=light],[data-theme=eye]) :is(.hljs-built_in,.hljs-symbol,.hljs-name,.hljs-selector-class){color:#953800}:is([data-theme=light],[data-theme=eye]) .hljs-deletion{color:#82071e;background:#ffebe9}:is([data-theme=light],[data-theme=eye]) .hljs-addition{color:#116329;background:#dafbe1}.reply a{color:var(--accent)}.reply blockquote{padding-left:10px;border-left:3px solid var(--border);color:var(--muted)}.reply table{display:block;max-width:100%;overflow-x:auto;border-collapse:collapse;font-size:calc(14px * var(--text-scale))}.reply th,.reply td{border:1px solid var(--border);padding:4px 8px;text-align:left}.reply hr{border:0;border-top:1px solid var(--border);margin:14px 0}.to-bottom{position:absolute;left:50%;bottom:14px;transform:translate(-50%);z-index:1;width:36px;height:36px;border-radius:50%;display:grid;place-items:center;padding:0;color:var(--text);background:var(--surface);border:1px solid var(--border);box-shadow:0 2px 10px #00000029}.to-bottom svg{width:18px;height:18px}.chat pre{margin:0;padding:8px 10px;border-radius:8px;background:var(--surface-2);overflow-x:auto;white-space:pre;font-family:ui-monospace,SF Mono,Menlo,monospace;font-size:calc(12px * var(--text-scale));line-height:1.45}.chat-tool{align-self:flex-start;max-width:100%;font-size:calc(13px * var(--text-scale));color:var(--muted)}.chat-tool summary{display:flex;align-items:baseline;gap:6px;cursor:pointer;padding:3px 2px;list-style:none;min-width:0}.chat-tool summary::-webkit-details-marker{display:none}.chat-tool summary:before{content:"▸";flex:none;font-size:calc(11px * var(--text-scale))}.chat-tool[open] summary:before{content:"▾"}.chat-tool .tool-name{flex:none;font-weight:600;color:var(--text)}.chat-tool .tool-summary{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chat-tool .tool-running{flex:none;color:var(--working)}.chat-tool .tool-file{color:var(--text)}.chat-tool.error .tool-name{color:var(--danger)}.chat-tools{align-self:flex-start;max-width:100%;font-size:calc(13px * var(--text-scale));color:var(--muted)}.chat-tools>summary{display:flex;align-items:baseline;gap:6px;cursor:pointer;padding:3px 2px;list-style:none;min-width:0}.chat-tools>summary::-webkit-details-marker{display:none}.chat-tools>summary:after{content:"›";flex:none}.chat-tools[open]>summary:after{content:"⌄"}.chat-tools .tools-state{flex:none;font-weight:600;color:var(--text)}.chat-tools.live .tools-state{color:var(--working)}.chat-tools .tools-meta{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chat-tools .tool-name{flex:none;font-weight:600;color:var(--text)}.chat-tools .tool-summary{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chat-tools-list{display:flex;flex-direction:column;gap:2px;margin:2px 0 4px 6px;padding-left:8px;border-left:2px solid var(--border)}.chat-tool pre{margin-top:4px;max-height:40vh;overflow:auto}.chat-tool .tool-input{white-space:pre-wrap;overflow-wrap:anywhere;color:var(--text)}.chat-tool .tool-go{display:block;margin:6px 0}.diff-count{flex:none;display:inline-flex;gap:6px;font-variant-numeric:tabular-nums}.diff-count ins{color:var(--added);text-decoration:none}.diff-count del{color:var(--danger);text-decoration:none}.diff{margin-top:4px;max-height:50vh;overflow:auto;border-radius:8px;background:var(--bg);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:calc(12px * var(--text-scale))}.diff-head{padding:4px 8px;color:var(--muted);font-family:system-ui,sans-serif}.diff-hunk+.diff-hunk{border-top:1px solid var(--surface-2)}.diff-line{padding:0 8px;white-space:pre-wrap;overflow-wrap:anywhere;color:var(--text)}.diff-line.add{background:var(--added-bg)}.diff-line.del{background:var(--removed-bg)}.chat-live{white-space:pre-wrap;color:var(--muted)}.chat-live-head{margin-bottom:6px;font-size:calc(13px * var(--text-scale));font-weight:600}.chat-working{display:flex;align-items:center;justify-content:space-between;gap:10px;color:var(--muted);font-size:calc(13px * var(--text-scale))}.chat-working-now{display:inline-flex;align-items:center;gap:8px;font-variant-numeric:tabular-nums}.chat-working-now .spinner{width:13px;height:13px;border-width:2px}.term-bottom>.chat-tasks{padding:6px 10px}.chat-tasks[open] ul{max-height:40vh;overflow-y:auto}.chat-tasks{align-self:stretch;padding:8px 10px;border-radius:12px;background:var(--surface-2);font-size:calc(13px * var(--text-scale));color:var(--muted)}.chat-tasks summary{display:flex;gap:8px;align-items:baseline;list-style:none;cursor:pointer;min-width:0}.chat-tasks summary::-webkit-details-marker{display:none}.chat-tasks .tasks-count{flex:none;font-weight:600;color:var(--text)}.chat-tasks .tasks-now{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chat-tasks ul{margin:6px 0 0;padding:0;list-style:none;display:flex;flex-direction:column;gap:4px}.chat-tasks li{display:flex;gap:8px}.chat-tasks li.completed{text-decoration:line-through}.chat-tasks li.in_progress{color:var(--text)}.chat-tasks .tasks-mark{flex:none;width:1em;text-align:center}.chat-tasks li.completed .tasks-mark{color:var(--added)}.chat-tasks li.in_progress .tasks-mark{color:var(--working)}.chat-changes{align-self:stretch;display:flex;flex-direction:column;gap:2px;padding:8px 10px;border-radius:12px;background:var(--surface-2);font-size:calc(13px * var(--text-scale));color:var(--muted)}.changes-title{font-weight:600;color:var(--text);padding-bottom:2px}.changes-file{display:flex;align-items:baseline;gap:8px;width:100%;padding:8px 0;text-align:left;color:var(--muted);background:none;border:0;border-top:1px solid var(--border)}.changes-file .tool-file{color:var(--text)}.changes-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.changes-new{margin-left:6px;padding:0 5px;border-radius:6px;background:var(--bg);color:var(--text);font-size:calc(11px * var(--text-scale))}.chat-note{align-self:center;max-width:90%;text-align:center;font-size:calc(12px * var(--text-scale));color:var(--muted);white-space:pre-wrap;overflow-wrap:anywhere}.chat-stopped{align-self:stretch;display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:6px 10px;padding:8px 10px;border-top:1px dashed var(--border);border-bottom:1px dashed var(--border);font-size:calc(12px * var(--text-scale));color:var(--muted);text-align:center;overflow-wrap:anywhere}.chat-stopped.failed{color:var(--danger);border-color:var(--danger);background:var(--removed-bg);border-radius:8px;border-style:dashed;border-width:1px}.chat-stopped small{color:var(--muted);font-size:inherit}.chat-stopped .chat-limit-how{flex-basis:100%}.chat-note summary{cursor:pointer;list-style:none}.chat-note summary::-webkit-details-marker{display:none}.chat-note summary:after{content:" ›"}.chat-note[open] summary:after{content:" ⌄"}.chat-note-detail{margin-top:6px;padding:8px 12px;border-radius:10px;background:var(--surface-2);text-align:left;max-height:40vh;overflow:auto}.chat-note-go{display:flex;flex-direction:column;align-items:center;gap:4px;margin-top:6px}.chat-note-go small{color:var(--danger)}.chat-shown-above{align-self:flex-start;margin:-2px 0 0 18px;padding:4px 0;border:0;background:none;font-size:calc(12px * var(--text-scale));color:var(--accent)}.chat-empty{margin:auto;display:flex;flex-direction:column;align-items:center;gap:6px;text-align:center}.chat-waiting{position:sticky;bottom:0;align-self:stretch;display:flex;align-items:center;justify-content:space-between;gap:10px;padding:8px 10px 8px 12px;border-radius:12px;font-size:calc(14px * var(--text-scale));font-weight:600;color:var(--waiting);background:color-mix(in srgb,var(--waiting) 16%,var(--bg));border:1px solid color-mix(in srgb,var(--waiting) 40%,transparent)}.chat-choice{position:sticky;bottom:0;align-self:stretch;display:flex;flex-direction:column;gap:6px;padding:10px;border-radius:14px;background:var(--surface);border:1px solid color-mix(in srgb,var(--waiting) 55%,var(--border));box-shadow:0 -6px 16px color-mix(in srgb,var(--bg) 80%,transparent);max-height:calc(100% - 16px);overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;flex-shrink:0}.chat-choice>*{flex-shrink:0}.chat-choice>.choice-actions{position:sticky;bottom:-10px;margin:0 -10px -10px;padding:8px 10px 10px;background:var(--surface)}.choice-context{max-height:30vh;overflow-y:auto;white-space:pre-wrap;overflow-wrap:anywhere;font-size:calc(14px * var(--text-scale));line-height:1.45;padding:0 2px 4px}.choice-opt{display:flex;flex-direction:column;align-items:flex-start;gap:2px;width:100%;min-height:46px;padding:10px 12px;text-align:left;font:inherit;font-size:calc(15px * var(--text-scale));color:var(--text);background:var(--surface-2);border:1px solid var(--border);border-radius:10px}.choice-opt strong{font-weight:600}.choice-opt span{font-size:calc(13px * var(--text-scale));color:var(--muted)}.choice-opt[aria-current=true],.choice-opt[aria-checked=true]{border-color:var(--accent)}.choice-opt[role=radio]{position:relative;padding-right:36px}.choice-opt[role=radio][aria-checked=true]{background:var(--surface)}.choice-opt[role=radio][aria-checked=true]:after{content:"✓";position:absolute;right:14px;top:50%;transform:translateY(-50%);color:var(--accent);font-weight:700}.choice-opt:active{background:color-mix(in srgb,var(--accent) 18%,var(--surface-2))}.choice-opt:disabled{opacity:.6}.choice-opt.tick{flex-direction:row;align-items:flex-start;gap:10px}.choice-opt.tick>div{display:flex;flex-direction:column;gap:2px;min-width:0;overflow-wrap:anywhere}.choice-opt.tick>i{flex:none;display:grid;place-items:center;width:1.47em;height:1.47em;margin-top:1px;border-radius:6px;border:1.5px solid var(--muted);font-style:normal;font-size:calc(15px * var(--text-scale));font-weight:700;color:var(--accent-text)}.choice-opt.tick[aria-checked=true]{border-color:var(--accent)}.choice-opt.tick[aria-checked=true]>i{background:var(--accent);border-color:var(--accent)}.choice-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px;padding-top:2px}.chat-panel{border-color:var(--border)}.effort-levels{display:grid;grid-template-columns:repeat(auto-fit,minmax(56px,1fr));gap:6px}.effort-levels .choice-opt{align-items:center;padding:10px 2px;font-size:calc(14px * var(--text-scale))}.send-held{display:flex;align-items:center;gap:10px;padding:8px 8px 8px 12px;border-radius:10px;font-size:calc(14px * var(--text-scale));font-weight:600;color:var(--text);background:color-mix(in srgb,var(--waiting) 22%,var(--surface));border:1px solid var(--waiting)}.send-held span{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.send-held small{font-size:calc(13px * var(--text-scale));font-weight:400;color:var(--muted)}.send-held .btn{flex:none}.send-held code{font-family:ui-monospace,SF Mono,Menlo,monospace;font-size:calc(13px * var(--text-scale));font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.on-mac-note{display:flex;flex-direction:column;gap:4px;padding:10px 10px 10px 12px;border-radius:10px;font-size:calc(14px * var(--text-scale));color:var(--text);background:var(--surface);border:1px solid var(--border)}.on-mac-note b{display:flex;align-items:center;gap:6px}.on-mac-note b svg{flex:none;width:18px;height:18px;color:var(--waiting)}.on-mac-note>span{display:flex;align-items:center;gap:10px}.on-mac-note small{flex:1;min-width:0;font-size:calc(13px * var(--text-scale));color:var(--muted)}.send-held.nudged{animation:send-held-nudge .4s}@keyframes send-held-nudge{25%{transform:translate(-6px)}75%{transform:translate(6px)}}.panel-title{font-size:calc(14px * var(--text-scale));font-weight:600;padding:0 2px}.btw-question{font-size:calc(14px * var(--text-scale));font-weight:600;color:var(--muted);padding:0 2px}.btw-answer{max-height:50vh;overflow:auto;padding:0 2px;font-size:calc(15px * var(--text-scale));line-height:1.5;white-space:pre-wrap;overflow-wrap:anywhere}.panel-usages{display:flex;flex-wrap:wrap;gap:6px}.panel-usage{font-size:calc(13px * var(--text-scale));font-weight:600;padding:4px 10px;border-radius:999px;background:color-mix(in srgb,var(--accent) 14%,var(--surface));color:var(--text)}.screen-text{margin:0 0 12px;padding:10px;border-radius:8px;background:var(--surface-2);font:calc(12px * var(--text-scale))/1.35 ui-monospace,Menlo,monospace;white-space:pre;overflow:auto;max-height:60vh}.screen-sheet .screen-text{flex:1;min-height:0;max-height:none;margin:0}.panel-body{margin:0;max-height:40vh;overflow:auto;padding:8px 10px;border-radius:10px;background:var(--surface-2);font:calc(12px * var(--text-scale))/1.45 ui-monospace,SFMono-Regular,Menlo,monospace;white-space:pre;color:var(--text)}.chat-pictures{display:grid;gap:6px;grid-template-columns:repeat(var(--across),1fr);width:min(72vw,300px)}.chat-pictures.single{width:min(72vw,200px)}.chat-pictures.mine{align-self:flex-end}.chat-pictures.theirs{align-self:flex-start}.chat-picture{border:0;padding:0;width:100%;aspect-ratio:1;border-radius:12px;overflow:hidden;background:var(--surface-2)}.chat-picture img{width:100%;height:100%;object-fit:cover;display:block}.chat-picture.gone{display:grid;place-items:center;font-size:calc(13px * var(--text-scale));color:var(--muted);border:1px dashed var(--border)}.chat-image-note{align-self:flex-end;max-width:80%;font-size:calc(13px * var(--text-scale));color:var(--muted)}.sent-files{align-self:flex-end;display:flex;flex-direction:column;align-items:flex-end;gap:6px;max-width:88%}.sent-file{display:flex;align-items:center;gap:8px;max-width:100%;padding:8px 12px;border-radius:14px;background:var(--surface-2);font-size:calc(14px * var(--text-scale));color:var(--text)}.sent-file>svg{flex:none;width:18px;height:18px;color:var(--muted)}.middle-name{display:block;min-width:0;overflow:hidden}.middle-room{display:block;height:0;overflow:hidden;visibility:hidden;white-space:nowrap}.middle-shown{display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;word-break:break-all}.chat-web-images{display:flex;flex-wrap:wrap;gap:6px;align-self:flex-start;max-width:100%}.chat-web-images a{font-size:calc(13px * var(--text-scale));color:var(--accent);text-decoration:none;padding:4px 10px;border-radius:999px;border:1px solid var(--border);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.image-viewer{position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;display:grid;place-items:center;padding:env(safe-area-inset-top) 0 env(safe-area-inset-bottom);background:#000}.image-viewer img{width:100%;height:100%;object-fit:contain}.viewer-close{position:absolute;top:calc(env(safe-area-inset-top) + 12px);right:12px;width:36px;height:36px;border-radius:50%;border:0;display:grid;place-items:center;background:#ffffff2e;color:#fff}.viewer-close svg{width:18px;height:18px}.outbox{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px;align-self:stretch}.outbox-item{display:flex;flex-direction:column;align-items:flex-end;gap:3px}.outbox-item.held .bubble{opacity:.55}.outbox-item small{display:flex;align-items:center;gap:10px;font-size:calc(12px * var(--text-scale));color:var(--muted)}.outbox-item button{padding:2px 0;border:0;background:none;font:inherit;color:var(--accent)}.send-held.compacting,.send-held.foreground{background:color-mix(in srgb,var(--working) 14%,var(--surface));border-color:var(--working)}.queue{display:flex;flex-direction:column;gap:4px;max-height:40vh;overflow-y:auto}.queue-head{display:flex;align-items:baseline;gap:8px;padding:0 4px}.queue-head b{font-size:calc(13px * var(--text-scale))}.queue-head small{font-size:calc(12px * var(--text-scale));color:var(--muted)}.queue ol{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px}.queue-item{background:var(--surface-2);border:1px solid var(--border);border-radius:12px}.queue-row{display:flex;align-items:center;gap:8px;padding:4px 6px 4px 10px;min-height:40px}.queue-n{flex:none;font-size:calc(12px * var(--text-scale));color:var(--muted);font-variant-numeric:tabular-nums}.queue-text{flex:1;min-width:0;padding:6px 0;border:0;background:none;color:var(--text);font:inherit;font-size:calc(14px * var(--text-scale));text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.queue-item.open .queue-text{white-space:pre-wrap;overflow-wrap:anywhere}.queue-row .btn{flex:none}.queue-actions{display:flex;gap:6px;padding:0 6px 6px 28px;flex-wrap:wrap}.composer-foot{display:flex;align-items:center;gap:8px;padding:0 10px 8px}.composer-foot-main{flex:1;min-width:0;display:flex}.keys-toggle{flex:none;display:grid;place-items:center;min-width:48px;height:32px;margin-right:4px;padding:0 10px;border:0;border-radius:16px;background:var(--surface-2);color:var(--text);touch-action:manipulation}.keys-toggle.shown{background:color-mix(in srgb,var(--accent) 14%,transparent)}.keys-toggle svg{width:22px;height:22px}.pill{display:inline-flex;align-items:center;max-width:100%;min-height:32px;padding:0 6px;border-radius:16px;background:var(--surface-2);font-size:calc(13px * var(--text-scale));color:var(--muted)}.pill-part{position:relative;flex:none;min-height:32px;padding:0 6px;border:0;background:none;color:var(--text);font:inherit;white-space:nowrap;touch-action:manipulation}.pill-part.bypass{color:var(--danger)}.pill-sep{flex:none}.pill.pill-skeleton{width:200px;animation:pulse .8s ease-in-out infinite alternate}@keyframes pulse{0%{opacity:.5}}span.pill-part{display:inline-flex;align-items:center}.pill-part.pill-ctx{margin-left:2px;color:var(--muted);font-variant-numeric:tabular-nums}.pill-part.pill-ctx.high{color:var(--danger)}.usage-menu{display:flex;flex-direction:column;min-width:240px}.usage-menu-row{display:flex;justify-content:space-between;gap:16px;padding:8px 12px;font-size:calc(14px * var(--text-scale))}.usage-menu-value{display:flex;flex-direction:column;align-items:flex-end;min-width:0;overflow-wrap:anywhere;font-weight:600;font-variant-numeric:tabular-nums}.usage-menu-value small{font-weight:400;font-size:calc(11px * var(--text-scale));color:var(--muted)}.usage-menu-value.high{color:var(--danger)}.usage-menu .key-menu-item{border-top:1px solid var(--border);border-radius:0 0 8px 8px;margin-top:4px;color:var(--accent)}.menu-scrim{position:fixed;top:0;right:0;bottom:0;left:0;z-index:40}.key-menu{position:fixed;z-index:41;min-width:168px;max-width:calc(100vw - 12px);padding:4px;border-radius:12px;border:1px solid var(--border);background:var(--surface);box-shadow:0 8px 28px #00000040;display:flex;flex-direction:column;overflow-y:auto}.key-menu-item{display:flex;flex-shrink:0;align-items:center;gap:10px;min-height:40px;padding:6px 12px;border:0;border-radius:8px;background:none;color:var(--text);font:inherit;font-size:calc(15px * var(--text-scale));text-align:left}.key-menu-body{flex:1;display:flex;flex-direction:column;gap:1px}.key-menu-item:active{background:var(--surface-2)}.key-menu-item.current{color:var(--accent);font-weight:600}.key-menu-check{color:var(--accent)}.key-menu-sub{font-size:calc(12px * var(--text-scale));font-weight:400;color:var(--muted)}.composer .send.stop .send-dot{background:var(--danger)}.stop-square{width:12px;height:12px;border-radius:2px;background:#fff}.suggest{display:flex;align-items:center;gap:4px;background:var(--surface-2);border:1px solid var(--border);border-radius:12px;padding-right:4px}.suggest-take{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px;padding:8px 10px;border:0;background:none;color:var(--text);font:inherit;text-align:left}.suggest-take small{display:none}.suggest-take span{font-size:calc(14px * var(--text-scale));overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.reply-actions{display:flex;gap:16px;margin-top:-4px}.chat-answered{align-self:center;display:flex;flex-direction:column;max-width:90%;color:var(--muted);font-size:calc(13px * var(--text-scale));text-align:center}.chat-answered>*{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chat-answered code,.choice-opt code{font-family:ui-monospace,SF Mono,Menlo,monospace;font-size:calc(12px * var(--text-scale));color:var(--muted)}.choice-opt code{white-space:pre-wrap;overflow-wrap:anywhere}.chat-plan{border:1px solid var(--accent);border-radius:14px;padding:10px 14px 0}.chat-plan-head{font-weight:600;color:var(--accent);font-size:calc(13px * var(--text-scale))}.chat-plan .reply{background:none;padding:0}.choice-plan{max-height:40vh;overflow-y:auto;margin-bottom:10px;padding-bottom:4px;border-bottom:1px solid var(--border)}.choice-plan .reply{background:none;padding:0}.reply-actions.mine{justify-content:flex-end;align-items:baseline;margin-top:-6px}.reply-actions .mine-time{font-size:calc(12px * var(--text-scale));color:var(--muted);font-variant-numeric:tabular-nums}.reply-actions button{padding:4px 0;border:0;background:none;font:inherit;font-size:calc(13px * var(--text-scale));color:var(--muted)}.sess-group{display:flex;align-items:baseline;gap:6px;margin:0;padding:18px 16px 6px;background:var(--bg);font-size:calc(15px * var(--text-scale));font-weight:600;color:var(--text)}.sess-group small{font-weight:400;color:var(--muted)}.sess-badge{flex:none;padding:1px 6px;border-radius:6px;font-size:calc(11px * var(--text-scale));font-weight:600;line-height:1.5}.sess-badge.working{color:var(--working);background:color-mix(in srgb,var(--working) 16%,transparent)}.sess-badge.waiting{color:var(--waiting);background:color-mix(in srgb,var(--waiting) 16%,transparent)}.sess-badge.unread{color:var(--accent-text);background:var(--accent)}.chat-bg{flex:none;align-self:stretch;border:1px solid var(--border);border-radius:12px;background:var(--surface-2);padding:8px 12px;font-size:calc(14px * var(--text-scale))}.chat-bg summary{color:var(--muted)}.chat-bg summary b{color:var(--text)}.chat-bg ul{list-style:none;margin:8px 0;padding:0;display:flex;flex-direction:column;gap:6px}.chat-bg li{display:flex;flex-direction:column}.chat-bg li span{overflow-wrap:anywhere}.chat-bg li small{color:var(--muted);font-size:calc(12px * var(--text-scale))}.snippets-input{display:block;width:100%;box-sizing:border-box;padding:12px 14px;border:0;background:transparent;color:var(--text);font:inherit;font-size:max(16px,calc(16px * var(--text-scale)));resize:none}.snippets-input:focus{outline:none}.slash-menu .snippet b{font-family:inherit}.slash-menu .snippet span{color:var(--accent)}.sess-item.mac{background:var(--row)}.avatar.mac{opacity:.55}.claude-view-foot{display:flex;flex-direction:column;gap:8px;padding:10px calc(var(--safe-right) + 14px) max(10px,var(--safe-bottom)) calc(var(--safe-left) + 14px);border-top:.5px solid var(--border);background:var(--bg);font-size:calc(14px * var(--text-scale))}.claude-view-foot strong{font-weight:600}.claude-view-note{align-self:center;text-align:center;font-size:calc(12px * var(--text-scale));color:var(--muted)}.claude-view-foot .btn{width:100%}.split{display:grid;grid-template-columns:320px minmax(0,1fr);height:100dvh}.split-list{overflow-y:auto;border-right:1px solid var(--border)}.split-list .list-page{min-height:100%}.split-pane{position:relative;min-width:0;contain:layout}.split .term-page{bottom:0;height:auto}.split-empty{height:100%;display:grid;place-items:center;margin:0}.sess-row>.sess-item.current,.sess-item.mac.current{background:var(--row-held)}.chat{padding-left:max(calc(var(--safe-left) + 12px),calc((100% - 760px)/2));padding-right:max(calc(var(--safe-right) + 12px),calc((100% - 760px)/2))}.term-bottom>*{width:100%;max-width:760px;align-self:center}.row-link{width:100%;border:0;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer}.row-link:active{background-color:var(--surface-2)}.row-link svg{width:18px;height:18px;color:var(--muted);flex:none}.row-link.barred{opacity:.45}.row-link .row-check svg{width:22px;height:22px;color:var(--accent)}.row-link:disabled{cursor:default}.row-add{color:var(--accent);font-size:calc(16px * var(--text-scale))}.row-add:disabled{opacity:.55}.row-check{flex:none;display:grid;color:var(--accent)}.row-check svg{width:22px;height:22px}.row-value{color:var(--muted);font-size:calc(16px * var(--text-scale))}.mac-loading{display:grid;place-items:center;padding:48px 0}.mac-summary{margin-top:18px;padding:14px 16px;border-radius:var(--radius);font-weight:600;font-size:calc(17px * var(--text-scale))}.mac-summary.ok{color:var(--idle);background:color-mix(in srgb,var(--idle) 12%,transparent)}.mac-summary.bad{color:var(--danger);background:color-mix(in srgb,var(--danger) 12%,transparent)}.mac-check{align-items:flex-start}.mac-dot{flex:none;width:10px;height:10px;border-radius:50%;margin-top:7px}.mac-dot.ok{background:var(--idle)}.mac-dot.bad{background:var(--danger)}.mac-check .row-main span{overflow-wrap:anywhere}.mac-fix{margin-top:8px;display:flex;flex-direction:column;gap:4px;align-items:flex-start;text-align:left;width:100%;border:1px solid var(--border);border-radius:10px;background:var(--surface-2);color:var(--text);padding:8px 10px;font:inherit;cursor:pointer}.mac-fix code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:calc(13px * var(--text-scale));white-space:pre-wrap;overflow-wrap:anywhere}.mac-fix em{font-style:normal;font-size:calc(12px * var(--text-scale));color:var(--muted)}.mac-sub{margin-top:18px!important}.mac-op{min-height:48px;gap:10px;font-weight:600}.mac-op.waiting,.mac-op.asking{color:var(--working)}.mac-op.done{color:var(--idle)}.mac-op.failed{color:var(--danger);font-weight:500}.spinner.small{width:18px;height:18px;border-width:2px}.mac-problem+.mac-problem{border-top:1px solid var(--border)}.mac-problem summary{display:flex;align-items:center;gap:10px;padding:12px 16px;cursor:pointer;list-style:none}.mac-problem summary::-webkit-details-marker{display:none}.mac-problem-msg{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mac-problem-count{flex:none;font-size:calc(12px * var(--text-scale));font-weight:600;color:var(--muted);font-variant-numeric:tabular-nums}.mac-problem time{flex:none;font-size:calc(12px * var(--text-scale));color:var(--muted)}.mac-level{flex:none;font-size:calc(11px * var(--text-scale));font-weight:700;text-transform:uppercase;padding:1px 6px;border-radius:6px}.mac-level.warn{color:var(--waiting);background:color-mix(in srgb,var(--waiting) 16%,transparent)}.mac-level.error,.mac-level.fatal{color:var(--danger);background:color-mix(in srgb,var(--danger) 14%,transparent)}.mac-problem pre{margin:0;padding:0 16px 12px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:calc(12px * var(--text-scale));white-space:pre-wrap;overflow-wrap:anywhere;color:var(--muted)}.mac-note{font-size:calc(13px * var(--text-scale));margin:8px 4px 0}.mac-move{display:flex;align-items:center;gap:12px;margin-top:10px;padding:14px 16px;border-radius:var(--radius);background:color-mix(in srgb,var(--accent) 12%,transparent)}.mac-move-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px;overflow-wrap:anywhere}.mac-move-text strong{color:var(--accent);font-weight:600}.mac-move-text span{font-size:calc(13px * var(--text-scale));color:var(--muted)}.mac-move .btn{flex:none;min-width:72px}.mac-move .btn .spinner{border-color:color-mix(in srgb,var(--accent-text) 35%,transparent);border-top-color:var(--accent-text)}.mac-move.moving{background:color-mix(in srgb,var(--working) 12%,transparent)}.mac-move.moving strong{color:var(--working)}.mac-check+.mac-passed,.mac-passed .mac-check{border-top:1px solid var(--border)}.mac-passed summary{display:flex;align-items:center;gap:12px;padding:14px 16px;min-height:52px;cursor:pointer;list-style:none;color:var(--muted);font-size:calc(14px * var(--text-scale))}.mac-passed summary::-webkit-details-marker{display:none}.mac-passed summary .mac-dot{margin-top:0}.mac-passed summary span:nth-child(2){flex:1;min-width:0}.mac-passed summary svg{width:16px;height:16px;flex:none;transition:transform .15s}.mac-passed[open] summary svg{transform:rotate(90deg)}.setup{max-width:600px;margin:0 auto;padding:40px calc(var(--safe-right) + 16px) calc(var(--safe-bottom) + 48px) calc(var(--safe-left) + 16px)}.setup-brand{margin-bottom:8px;text-align:center}.setup-gap{margin-top:18px}.setup-steps{list-style:none;margin:24px 0 0;padding:0;display:flex;flex-direction:column;gap:10px}.setup-step{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius)}.setup-step.later{background:transparent}.setup-step.later .setup-step-head{color:var(--muted)}.setup-step-head{display:flex;align-items:center;gap:12px;padding:14px 16px;min-height:56px}.setup-step-head strong{font-size:calc(16px * var(--text-scale));font-weight:600;flex:none}.setup-num{flex:none;width:28px;height:28px;border-radius:50%;display:grid;place-items:center;font-size:calc(14px * var(--text-scale));font-weight:700;background:var(--surface-2);color:var(--muted)}.setup-step.now .setup-num{background:var(--accent);color:var(--accent-text)}.setup-step.done .setup-num{background:color-mix(in srgb,var(--idle) 16%,transparent);color:var(--idle)}.setup-num svg{width:16px;height:16px;stroke-width:2.5}.setup-summary{flex:1;min-width:0;color:var(--muted);font-size:calc(14px * var(--text-scale));overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.setup-change{margin-left:auto;flex:none;border:0;background:transparent;color:var(--accent);font:inherit;font-size:calc(14px * var(--text-scale));cursor:pointer;padding:6px 0 6px 8px}.setup-body{padding:0 16px 16px;display:flex;flex-direction:column;gap:12px}.setup-body>.group{background:var(--bg);border:1px solid var(--border)}.setup-form{display:flex;flex-direction:column;gap:12px}.setup-note{margin:0;color:var(--muted);font-size:calc(15px * var(--text-scale))}.setup-note.centered{text-align:center}.setup-warn{margin:0;color:var(--waiting);font-size:calc(14px * var(--text-scale))}.field small{font-size:calc(12px * var(--text-scale));color:var(--muted)}.field select{height:48px;border-radius:12px;border:1px solid var(--border);background:var(--bg);color:var(--text);padding:0 12px;font-size:max(16px,calc(16px * var(--text-scale)))}.setup-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:4px}.setup-actions .btn{min-width:120px}.setup-now{display:flex;align-items:center;gap:12px;padding:10px 14px;border-radius:12px;background:var(--surface-2);font-size:calc(14px * var(--text-scale));overflow-wrap:anywhere}.setup-now span{flex:1;min-width:0}.setup-choices{display:flex;flex-direction:column;gap:8px}.setup-choice{display:flex;gap:12px;align-items:flex-start;padding:14px;border-radius:12px;border:1px solid var(--border);background:var(--bg);cursor:pointer}.setup-choice.chosen{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}.setup-choice.off{cursor:default}.setup-choice.off strong{color:var(--muted)}.setup-choice input[type=radio]{margin:3px 0 0;flex:none;width:18px;height:18px;accent-color:var(--accent)}.setup-choice-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.setup-choice-text>span{color:var(--muted);font-size:calc(14px * var(--text-scale));overflow-wrap:anywhere}.setup-choice-fields{display:flex;flex-direction:column;gap:10px;margin-top:10px}.setup-busy{display:flex;align-items:center;gap:10px;color:var(--working);font-weight:600}.setup-pre{white-space:pre-wrap;overflow-wrap:anywhere}.setup-qr{align-self:center;width:min(240px,70vw);aspect-ratio:1;padding:0;border-radius:12px;overflow:hidden;background:#fff}.setup-qr svg{display:block;width:100%;height:100%}.setup-origin{margin:0;text-align:center;font-weight:600;font-size:calc(17px * var(--text-scale));overflow-wrap:anywhere}.setup-done{margin-top:18px;display:flex;flex-direction:column;gap:16px}
|
package/dist/web/icon-180.png
CHANGED
|
Binary file
|
package/dist/web/icon-192.png
CHANGED
|
Binary file
|
package/dist/web/icon-512.png
CHANGED
|
Binary file
|
|
Binary file
|
package/dist/web/icon.svg
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"
|
|
2
|
-
|
|
3
|
-
<
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><rect width="512" height="512" rx="112" fill="#2f81f7"/>
|
|
2
|
+
<defs>
|
|
3
|
+
<mask id="gap"><rect width="512" height="512" fill="#fff"/><rect x="48" y="206" width="148" height="240" rx="44"/>
|
|
4
|
+
</mask>
|
|
5
|
+
</defs>
|
|
6
|
+
<g transform="translate(0 -16)">
|
|
7
|
+
<g mask="url(#gap)">
|
|
8
|
+
<path d="M208 112h184a40 40 0 0 1 40 40v92a40 40 0 0 1-40 40H236l-48 38v-40a40 40 0 0 1-20-36v-94a40 40 0 0 1 40-40z" fill="#fff"/>
|
|
9
|
+
<path d="M160 352h288v6a22 22 0 0 1-22 22H182a22 22 0 0 1-22-22z" fill="#fff"/>
|
|
10
|
+
</g>
|
|
11
|
+
<rect x="212" y="180" width="172" height="34" rx="17" fill="#d6e4fb"/><rect x="212" y="180" width="106" height="34" rx="17" fill="#f0b429"/>
|
|
12
|
+
<rect x="68" y="226" width="108" height="200" rx="24" fill="none" stroke="#fff" stroke-width="18"/>
|
|
13
|
+
<rect x="104" y="240" width="36" height="14" rx="7" fill="#fff"/>
|
|
14
|
+
</g></svg>
|
package/dist/web/index.html
CHANGED
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
<link rel="icon" href="/icon.svg" type="image/svg+xml" />
|
|
17
17
|
<link rel="apple-touch-icon" href="/icon-180.png" />
|
|
18
18
|
<title>WorkOffDesk</title>
|
|
19
|
-
<script type="module" crossorigin src="/assets/main-
|
|
20
|
-
<link rel="stylesheet" crossorigin href="/assets/main-
|
|
19
|
+
<script type="module" crossorigin src="/assets/main-DFndf3Z8.js"></script>
|
|
20
|
+
<link rel="stylesheet" crossorigin href="/assets/main-mChS_ic8.css">
|
|
21
21
|
</head>
|
|
22
22
|
<body>
|
|
23
23
|
<div id="root"></div>
|
|
@@ -10,6 +10,6 @@
|
|
|
10
10
|
"icons": [
|
|
11
11
|
{ "src": "/icon-192.png", "sizes": "192x192", "type": "image/png" },
|
|
12
12
|
{ "src": "/icon-512.png", "sizes": "512x512", "type": "image/png" },
|
|
13
|
-
{ "src": "/icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" }
|
|
13
|
+
{ "src": "/icon-maskable-512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" }
|
|
14
14
|
]
|
|
15
15
|
}
|
package/dist/web/sw.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
(function(){"use strict";var l;const u={...{justNow:"just now",minutesAgo:e=>`${e} min ago`,hoursAgo:e=>`${e} h ago`,daysAgo:e=>`${e} d ago`,yesterday:"Yesterday",seconds:e=>`${e}s`,minutesSeconds:(e,o)=>`${e}m ${o}s`,status:{starting:"Starting",working:"Working",waiting:"Needs you",idle:"Idle",ended:"Ended",compacting:"Compacting"},previewStarting:"Starting…",previewWorking:"Working…",compactingContext:"Compacting context…",close:"Close",back:"Back",save:"Save",delete:"Delete",edit:"Edit",copy:"Copy",copied:"Copied",appError:"Something went wrong",reopen:"Reopen",loading:"Loading…",reading:"Loading…",refresh:"Refresh",open:"Open",showScreen:"Screen",session:"Session",settings:"Settings",sent:"Sent",sentMessage:"Sent message",sending:"Sending…",sendingMessage:"Message being sent",tryAgain:"Try again",device:"Device",serverErrors:{"dialog-open":"A menu is open above. Pick an option or press Esc first.","background-session":"This conversation is in a Claude background session and cannot be resumed here.","open-on-mac":"This conversation is still open in a terminal on the Mac.","mac-would-not-quit":"It did not quit on the Mac, so nothing was resumed.","open-elsewhere":"This conversation is open in another Codex app (an editor or the Codex app). Close it there first.","not-an-image":"Only images can be uploaded (PNG, JPEG, GIF, WebP, HEIC).","upload-incomplete":"The file did not all reach the Mac. Send it again.","upload-offset":"The Mac has a different part of this file. It is being sent again from where the Mac is.","not-managed":"This server was started by hand, not as the service, so it cannot be restarted from here.","op-busy":"A restart or rollback is already running.","rollback-moved":"The releases changed in the meantime. Look again before rolling back.","account-unusable":"That account cannot be used now.","account-none-picked":"Pick an account first.","folder-gone":"Its folder is not on the Mac any more.","terminal-busy":"Something is running in this session’s terminal on the Mac. Quit it there first, or start another conversation."},noteCompacted:"Earlier conversation compacted",noteInterrupted:"Interrupted",toolStopped:e=>`Not run: ${e} was stopped (Esc) before it ran this.`,noteFailed:"Something went wrong",noteLimit:"Usage limit reached",noteTask:(e,o)=>`${e==="completed"?"Background task done":e==="failed"?"Background task failed":"Background task"}: ${o}`,notePeer:e=>`Message from ${e||"another session"}`,builtinCommands:{},push:{waiting:"Needs your confirmation",idle:"Done with this turn"}},...{panelTitles:{Model:"Model",Effort:"Effort",Settings:"Settings",Usage:"Usage",Btw:"Side question"},panelNamed:e=>`the “${e}” panel`,aPanel:"a panel",agentOpened:(e,o)=>`${e} opened ${o}`,agentHasOpen:(e,o)=>`${e} has ${o} open`,heldWhilePanel:"Messages stay in the box until it is closed",fiveHourUnseen:"5-hour limit: not on screen",fiveHourUsed:e=>`5-hour limit ${e}% used`,weekUnseen:"Weekly limit: not on screen",weekUsed:e=>`Weekly limit ${e}% used`,effortHint:"Left is faster, right is smarter; this session only",effortLevels:{},dialogAbout:{Model:"Your pick becomes the default for new sessions"},closeEsc:"Close (Esc)",otherModels:"Other models…",btwAsked:"Side question (/btw)",showKeys:"Show keys",hideKeys:"Hide keys",scrollUp:"Up",scrollDown:"Down",agentAsks:e=>`${e} is asking`,plan:"Plan",writeOwnAnswer:"Write your own answer",writeBelow:"Write the answer in the box below and send it",noneTicked:"None",typedHint:"To write your own answer, tap “Screen” and answer with the key bar",nextQuestion:"Next",submit:"Submit",ticked:e=>`(${e})`,listSeparator:", ",optionsChanged:"The options changed; these are the current ones",allowTool:e=>`Allow ${e}?`,allowYes:"Yes",allowAlways:e=>`Yes, and from now on ${e}`,alwaysMode:e=>e==="acceptEdits"?"accept all edits":`switch to ${e} mode`,alwaysRules:"allow these",alwaysDirs:e=>`allow access to ${e}`,alwaysJoin:" and ",allowNo:"No",allowNoDetail:"It stops and waits for you to say what to do",askOver:"Already answered on the Mac",notPressed:"Did not go through, tap again",escCancel:"Esc to cancel",youChose:"You chose: ",continueWord:"Continue",moveAccount:"Go on with another account",moveAccountTitle:"Go on with another account?",moveAccountNote:"The open conversations go on there from where they stopped, and new ones start on that account too.",moveAccountHow:"Another Claude account would go on from here. In a terminal on the Mac, run CLAUDE_CONFIG_DIR=~/.claude-<name> claude and sign in with /login; it then shows here.",moveAccountThen:e=>`“${e}” waits, and goes once on the other account.`,movingAccount:e=>`Moving to ${e}; it goes on once there…`},...{sendPaused:"Sending paused",loadingEarlier:"Loading earlier conversation",noConversation:"No conversation yet",typeBelow:"Type below; the replies show up here",agentWriting:e=>`${e} is writing…`,chatUnreadable:"Cannot read the conversation, retrying…",endedNoChat:"This conversation was not kept on this device.",goneOnMac:"It is no longer there on the Mac.",claudeWorking:"Working",agentWaiting:e=>`${e} is waiting for you`,toBottom:"Back to bottom",changes:"Changes",newFile:"New file",atLine:e=>`Line ${e}`,diffCut:"Too long, only the start is shown",changedFiles:"Files changed this time",filesChanged:e=>`${e} file${e===1?"":"s"} changed`,newMark:"new",viewImage:"View image",image:"Image",imageCount:e=>`${e} image${e===1?"":"s"}`,fileCount:e=>`${e} file${e===1?"":"s"}`,unseenImages:e=>`${e} image${e===1?"":"s"} attached (pasted on the Mac, not shown here)`,collapse:"Collapse",expandAll:"Show all",allLines:e=>`Show all ${e} lines`,rewind:"Rewind",stopReading:"Stop reading",readAloud:"Read aloud",webImage:"Web image",seeImageAbove:"↑ See the image above",running:"Running",noOutput:"(no output)",noResultYet:"No result yet",toolsCalled:e=>`${e} tool call${e===1?"":"s"}`,toolsDone:e=>`✓ ${e} tool call${e===1?"":"s"}`,took:e=>`took ${e}`,toolErrors:e=>`${e} failed`,imageExpired:"Image expired",imageGone:"Image no longer there",imageNotLoaded:"The image did not load · Tap to try again",playVideo:e=>`Play ${e}`,videoNotLoaded:"The video did not open · Tap to try again",videoGone:"This video is no longer on the Mac",tasks:(e,o)=>`Tasks ${e}/${o}`,taskNow:e=>`Now: ${e}`,taskNotStarted:"Next one not started",backgroundCommands:"Background commands",backgroundRunning:e=>`${e} running`,backgroundOpen:"View / stop (opens /tasks)",queuedMessages:"Queued messages",queued:e=>`${e} queued`,sendNow:"Send now",moveUp:"Up",moveDown:"Down",compactingQueued:e=>`Your ${e} message${e===1?" is":"s are"} queued and will go out in order after compacting`,compactingWillQueue:"Messages sent now are queued and go out after compacting",alsoOnMac:e=>e===1?"Also open in a terminal on the Mac":`Also open in ${e} terminals on the Mac`,alsoOnMacSub:e=>`Two Claudes are writing this conversation, each seeing only its own turns. Quit Claude there; to go on at the Mac, run workoffdesk attach ${e}`,keys:"Keys",paste:"Paste",enter:"Enter",modes:{default:"Ask every step","accept edits":"Auto-edit files","plan mode":"Plan only","auto mode":"Auto","bypass permissions":"Allow everything"},permissions:"Permissions",permissionsIs:e=>`Permissions: ${e}`,unknown:"unknown",modelIs:e=>`Model: ${e}, tap to switch`,model:"Model",effortIs:e=>`Effort: ${e}, tap to change`,resetsInMinutes:e=>`resets in ${e} min`,resetsInHours:(e,o)=>`resets in ${e} h ${o} min`,resetsInDays:(e,o)=>`resets in ${e} d ${o} h`,context:"Context",fiveHourLimit:"5-hour limit",sevenDayLimit:"7-day limit",sessionCost:"This session cost",linesChanged:"Changed",lines:(e,o)=>`+${e} −${o} lines`,contextLabel:e=>`Context ${e}`,contextIs:e=>`${e} of context used, tap for usage`,fiveHourLabel:e=>`5-hour ${e}`,sevenDayLabel:e=>`7-day ${e}`,limitIs:(e,o)=>`${o} of the ${e} used, tap for usage`,copyUsage:"Copy usage",rename:"Rename",name:"Name",renameFailed:"Not renamed",renameNote:"Leave it empty to use the name Claude or Codex gives the conversation, or else the folder's. Every device shows this name.",newSession:"New session",pickProject:"Pick a project",resumeRecent:"Resume a recent conversation",openFailed:"Not opened",newInProject:"New Claude in a project",newInProjectSub:"Pick a folder and start a new Claude Code",newCodexInProject:"New Codex in a project",newCodexInProjectSub:"Pick a folder and start a new Codex",resumeRecentSub:"Pick up a conversation from this Mac",loadFailed:"Could not load",nameOptional:"Name (optional)",nameOptionalHint:"Name (optional, the folder name by default)",findProject:"Search, or type a path (~/…)",noFolders:"No folders here",lookInside:e=>`Show the folders in ${e}`,noProjects:"No projects have used Claude yet. Type a path above, such as ~/",alreadyOpen:"Already open · ",folderGoneShort:"Folder gone, cannot resume here · ",inBackground:"In a Claude background session, cannot resume here · ",openElsewhere:"Open in another Codex app, cannot resume here · ",searchTitlePath:"Search titles or paths",noMatch:"No matching conversations",noConversations:"No Claude conversations on this Mac yet",automated:e=>`Sessions of automated tasks (${e})`,screenTitle:"Screen on the Mac",screenUnread:"Could not read the screen, try refreshing",screenContent:"Screen content",screenEmpty:"(the screen is empty)"},...{uploadFailed:"The image did not upload",speechBlocked:"Speech recognition is not available here (a home-screen web app may not get it). Tap the box and use the keyboard’s microphone.",speechDenied:"Speech recognition is not allowed. Allow this site the microphone and speech recognition in Settings, then try again.",speechStopped:"Speech recognition stopped. Hold to try again.",speechErrors:{network:"Speech recognition needs the network. Check the connection and hold to try again.","audio-capture":"The microphone could not be used. Another app may have it.",interrupted:"Listening was interrupted, by a call or another app taking the microphone.",busy:"Speech recognition is busy. Hold to try again in a moment.","speech-timeout":"Nothing was heard for a while, so listening stopped."},notHeard:"Did not catch that",micJustOn:"The microphone just turned on, hold and speak again",speechUnavailable:"Speech recognition is unavailable",noLiveSpeech:"This browser has no live speech recognition",commands:"Commands",snippet:e=>`Snippet ${e}`,snippets:"Snippets",files:"Files",removeImage:"Remove image",uploading:"Uploading",input:"Message",placeholderSpeech:"Message, or hold to talk…",placeholder:"Message",stop:"Stop",send:"Send",holdSend:"Release to send · slide to ✕ to cancel",holdSendSlide:"Release to send · slide up to ✕ to cancel, or to edit as text",holdCancel:"Release to cancel",holdText:"Release to edit as text",cancel:"Cancel",toText:"To text",heardLabel:"Speech to text",recognizing:"Recognizing…",openingMic:"Opening the microphone",holdToTalk:"Hold to talk",photoLibrary:"Photo library",takePhoto:"Take photo",photosAndVideos:"Photos and videos",pickFile:"File",largeVideo:(e,o)=>e===1?`This video is ${o} MB`:`These ${e} videos are ${o} MB`,largeVideoSub:e=>`As ${e===1?"it is":"they are"}, it takes a while to send. At 720p ${e===1?"it is":"they are"} much smaller, and the stills Claude looks at are the same; you pick ${e===1?"it":"them"} again in Photos.`,sendAsIs:"Send as it is",sendSmaller:"Make smaller and send",attach:"Add a photo, video or file",removeFile:"Remove file",fileUploadFailed:e=>`${e} did not upload`,whatAndWhy:(e,o)=>`${e}: ${o}`,cameraDenied:"WorkOffDesk may not use the camera. Allow it in Settings.",speechDeniedApp:"WorkOffDesk may not use the microphone or speech recognition. Allow both in Settings, then try again.",speechOff:"Speech recognition is unavailable right now. Check that Dictation is on in Settings › General › Keyboard and that you are online.",speechLanguage:"Speech recognition does not support the languages this phone is set to.",openSettings:"Open Settings"},...{notConnectedSend:"Not connected to the Mac yet; send again once it is",modeNotSwitched:"Did not switch to that mode; Claude may not offer it",switchingMode:"Switching…",applying:"Setting…",clipboardUnreadable:"Cannot read the clipboard. Long-press the box to paste.",endFailed:"Not ended: cannot reach the Mac, tap again in a moment",notSentGiveBack:"Not sent; the text is back in the box",alreadySent:"This one has already been sent",takeBackFailed:"Could not take it back, try again",deleteFailed:"Not deleted, try again",notConnectedTap:"Not connected to the Mac yet; tap again once it is",notSentRetry:"Not sent, try again",notMoved:"Not moved, try again",notEnded:"Not ended, try again",notRun:"Not run, try again",queueWhenStarted:e=>`Goes out in order once ${e} has started`,queueWhenContinued:e=>`Goes out in order once ${e} is back on this conversation`,queueAfterCompact:"Goes out in order after compacting",queueAfterWaiting:e=>`${e} is waiting for you; goes out in order after that`,queueAfterTurn:e=>`${e} reads these after the step it is on`,inAgentsQueue:e=>`In ${e}’s queue`,queueNow:"Goes out in order right away",renameSession:e=>`Rename: ${e}`,ending:"Ending…",confirmEnd:"Confirm end",end:"End",shellSession:"This is a command-line session on the Mac",shellSessionSub:"The phone shows only Claude conversations; use this session on the Mac",syncing:"Syncing",reconnecting:"Reconnecting…",reconnectingSub:"It reconnects when the network is back; the session keeps running on the Mac",sessionEnded:"Session ended",updateReady:"New version",updateReadySub:"Downloaded. It starts the next time the app opens.",updateNow:"Update now",sessionEndedSub:"This session has exited on the Mac",startAnother:"Start a new one",agentQuit:e=>`${e} has quit`,agentQuitSub:"Continue picks up this conversation where it stopped; a new one starts afresh in this folder",endedGoOnSub:"Continue picks this conversation up in a new session; a new one starts afresh in this folder",continueConversation:"Continue this conversation",continueFailed:"Not continued",suggestion:"Suggested next message · tap to put it in the box",dismissSuggestion:"Dismiss this suggestion",macSession:"Session on the Mac",readOnly:"Read-only",cannotRead:"Cannot read this conversation",openAlreadyOnPhone:"Open (already open on the phone)",inBackgroundNoResume:"In a Claude background session, cannot resume here",openElsewhereNoResume:"Open in another Codex app, cannot resume here",continueOnPhone:"Continue on the phone",onMacIdle:"Open on the Mac",onMacBusy:"Working on the Mac",onMacWaiting:"Asking you on the Mac",openInTerminals:e=>`Open in ${e} terminals`,takeOverNow:"Take over to the phone",folderGoneNoResume:"Its folder is gone, so it cannot go on here",folderGoneSub:e=>`${e} is not on the Mac any more, as when a worktree is removed. Start a new conversation in another folder.`,takeOverWhenDone:"Take over when this step is done",takeOverInterrupt:"Take over now (stops this step)",takeOverDropsQuestion:"Its question is dropped: once here, ask it to redo that step.",takeOverNote:e=>`${e} on the Mac quits and goes on here. Back at the Mac: workoffdesk attach`,takingOverWait:"Waiting for this step on the Mac to finish…",takeOverCancel:"Cancel",takeOverMissed:"It was not taken over. Try again.",startInTmuxHint:"Start Claude or Codex on the Mac with workoffdesk claude or workoffdesk codex and there is nothing to take over.",continueOnMac:"Continue on the Mac",continueOnMacSub:"Run this in a terminal on the Mac:",renameAction:"Rename",busy:"Running",needsYou:"Needs you",unread:"Unread",sessions:"Sessions",chooseSession:"Choose a session on the left.",search:"Search",noSessions:"No sessions yet",noSessionsSub:"Tap ⊕ at the top right to open a Shell or Claude.",noSessionsPhone:"Tap + at the top right to start Claude in a project.",sessionMenu:"Session actions",endSession:"End session",notFound:e=>`Nothing found for “${e}”`,otherMacSessions:"Other sessions on the Mac",wrongPassword:"Wrong username or password",loginNotKept:"Signed in, but the login could not be saved on this phone. Try again.",loginFailedOther:"Login failed. Try again.",tooManyTries:e=>`Too many tries, try again in ${e} min`,loginFailed:e=>`Login failed (${e})`,noServer:"Cannot reach the server, check the network",noAnswer:"The server did not answer, so this may or may not have happened. Check before trying again",unknownPasskey:"This passkey is not recognized. Log in with the password, then add this device in Settings.",tagline:"Your Mac’s Claude, on your phone",faceId:"Log in with Face ID",orPassword:"or with a password",username:"Username",password:"Password",login:"Log in",serverAddress:"Server address",serverAddressHint:"Where you open WorkOffDesk in a browser, like https://workoffdesk.example.com",badServerAddress:"That is not a web address"},...{textSize:"Text size",wholeApp:"Text in the whole app",thisDeviceOnly:"This device only",smaller:"Smaller text",larger:"Larger text",textPreview:"Claude’s replies, your messages and the lists all show at this size.",appearance:"Appearance",theme:"Theme",followSystem:"System",themeLight:"Light",themeDark:"Dark",themeEye:"Eye care",language:"Language",languageRestarts:"The app reopens in the language you pick.",snippetsLines:"Snippets, one per line",snippetsPlaceholder:`One per line, like:
|
|
1
|
+
(function(){"use strict";var l;const u={...{justNow:"just now",minutesAgo:e=>`${e} min ago`,hoursAgo:e=>`${e} h ago`,daysAgo:e=>`${e} d ago`,today:"Today",yesterday:"Yesterday",seconds:e=>`${e}s`,minutesSeconds:(e,n)=>`${e}m ${n}s`,status:{starting:"Starting",working:"Working",waiting:"Needs you",idle:"Idle",ended:"Ended",compacting:"Compacting"},previewStarting:"Starting…",previewWorking:"Working…",compactingContext:"Compacting context…",close:"Close",back:"Back",save:"Save",delete:"Delete",edit:"Edit",copy:"Copy",copied:"Copied",appError:"Something went wrong",reopen:"Reopen",loading:"Loading…",reading:"Loading…",refresh:"Refresh",open:"Open",showScreen:"Screen",session:"Session",settings:"Settings",sent:"Sent",sentMessage:"Sent message",sending:"Sending…",sendingMessage:"Message being sent",tryAgain:"Try again",macTooOld:"Update WorkOffDesk on your Mac",macTooOldWhy:(e,n)=>`Your Mac runs WorkOffDesk ${e}; this app needs ${n} or newer. On the Mac, run:`,device:"Device",serverErrors:{"dialog-open":"A menu is open above. Pick an option or press Esc first.","background-session":"This conversation is in a Claude background session and cannot be resumed here.","open-on-mac":"This conversation is still open in a terminal on the Mac.","mac-would-not-quit":"It did not quit on the Mac, so nothing was resumed.","mac-unanswered":"The Mac did not say in time whether this conversation is still open there. Try again in a moment.","peer-gone":"The session that sent this is no longer running on the Mac.",demo:"Not in the demo: connect your Mac to do this.","open-elsewhere":"This conversation is open in another Codex app (an editor or the Codex app). Close it there first.","conversation-gone":"The agent no longer keeps this conversation (Claude Code deletes them after 30 days unless set to keep them longer). What was said can still be read here.","not-an-image":"Only images can be uploaded (PNG, JPEG, GIF, WebP, HEIC).","upload-incomplete":"The file did not all reach the Mac. Send it again.","upload-offset":"The Mac has a different part of this file. It is being sent again from where the Mac is.","not-managed":"This server was started by hand, not as the service, so it cannot be restarted from here.","op-busy":"A restart or rollback is already running.","rollback-moved":"The releases changed in the meantime. Look again before rolling back.","account-unusable":"That account cannot be used now.","account-none-picked":"Pick an account first.","folder-gone":"Its folder is not on the Mac any more.","session-busy":"Claude is still on its reply.","cannot-move":"Only a session whose Claude runs, in a folder still on the Mac, can move to another account.","move-failed":"Its Claude did not quit in time, so it stays on its account; try again.","open-on-mac-busy":"This conversation is also open in a terminal on the Mac, where Claude is at work or asking something.","terminal-busy":"Something is running in this session’s terminal on the Mac. Quit it there first, or start another conversation."},noteCompacted:"Earlier conversation compacted",noteInterrupted:"Interrupted",toolStopped:e=>`Not run: ${e} was stopped (Esc) before it ran this.`,noteFailed:"Something went wrong",noteLimit:"Usage limit reached",noteTask:(e,n)=>`${e==="completed"?"Background task done":e==="failed"?"Background task failed":"Background task"}: ${n}`,notePeer:e=>`Message from ${e||"another session"}`,goToSender:"Go to that session",seeWhatItDid:"See what it did",tryDemo:"Try the demo",tryDemoSub:"No Mac at hand? See how it works on made-up sessions.",demoBanner:"Demo: made-up sessions, no Mac connected.",connectMyMac:"Connect my Mac",builtinCommands:{},push:{waiting:"Needs your confirmation",idle:"Done with this turn",hidden:"Something new on your Mac"}},...{panelTitles:{Model:"Model",Effort:"Effort",Settings:"Settings",Usage:"Usage",Btw:"Side question"},panelNamed:e=>`the “${e}” panel`,aPanel:"a panel",agentOpened:(e,n)=>`${e} opened ${n}`,agentHasOpen:(e,n)=>`${e} has ${n} open`,heldWhilePanel:"Messages stay in the box until it is closed",fiveHourUnseen:"5-hour limit: not on screen",fiveHourUsed:e=>`5-hour limit ${e}% used`,weekUnseen:"Weekly limit: not on screen",weekUsed:e=>`Weekly limit ${e}% used`,effortHint:"Left is faster, right is smarter; this session only",effortLevels:{},dialogAbout:{Model:"Your pick becomes the default for new sessions"},closeEsc:"Close (Esc)",otherModels:"Other models…",btwAsked:"Side question (/btw)",showKeys:"Show keys",hideKeys:"Hide keys",scrollUp:"Up",scrollDown:"Down",agentAsks:e=>`${e} is asking`,plan:"Plan",writeOwnAnswer:"Write your own answer",writeBelow:"Write the answer in the box below and send it",noneTicked:"None",typedHint:"To write your own answer, tap “Screen” and answer with the key bar",nextQuestion:"Next",submit:"Submit",ticked:e=>`(${e})`,listSeparator:", ",optionsChanged:"The options changed; these are the current ones",allowTool:e=>`Allow ${e}?`,allowYes:"Yes",allowAlways:e=>`Yes, and from now on ${e}`,alwaysMode:e=>e==="acceptEdits"?"accept all edits":`switch to ${e} mode`,alwaysRules:"allow these",alwaysDirs:e=>`allow access to ${e}`,alwaysJoin:" and ",allowNo:"No",allowNoDetail:"It stops and waits for you to say what to do",askOver:"Already answered on the Mac",notPressed:"Did not go through, tap again",escCancel:"Esc to cancel",youChose:"You chose: ",continueWord:"Continue",moveAccount:"Go on with another account",moveAccountTitle:"Go on with another account?",moveAccountNote:"The open conversations go on there from where they stopped, and new ones start on that account too.",moveAccountHow:"Another Claude account would go on from here. In a terminal on the Mac, run CLAUDE_CONFIG_DIR=~/.claude-<name> claude and sign in with /login; it then shows here.",moveAccountThen:e=>`“${e}” waits, and goes once on the other account.`,movingAccount:e=>`Moving to ${e}; it goes on once there…`,moveNow:"Switch now, interrupting it",moveWhenFree:"Switch once it stops",switchAccount:"Switch Claude account"},...{sendPaused:"Sending paused",loadingEarlier:"Loading earlier conversation",noConversation:"No conversation yet",typeBelow:"Type below; the replies show up here",agentWriting:e=>`${e} is writing…`,chatUnreadable:"Cannot read the conversation, retrying…",endedNoChat:"This conversation was not kept on this device.",goneOnMac:"It is no longer there on the Mac.",claudeWorking:"Working",agentWaiting:e=>`${e} is waiting for you`,toBottom:"Back to bottom",changes:"Changes",newFile:"New file",atLine:e=>`Line ${e}`,diffCut:"Too long, only the start is shown",changedFiles:"Files changed this time",filesChanged:e=>`${e} file${e===1?"":"s"} changed`,newMark:"new",viewImage:"View image",image:"Image",imageCount:e=>`${e} image${e===1?"":"s"}`,fileCount:e=>`${e} file${e===1?"":"s"}`,unseenImages:e=>`${e} image${e===1?"":"s"} attached (pasted on the Mac, not shown here)`,collapse:"Collapse",expandAll:"Show all",allLines:e=>`Show all ${e} lines`,rewind:"Rewind",stopReading:"Stop reading",readAloud:"Read aloud",webImage:"Web image",seeImageAbove:"↑ See the image above",running:"Running",noOutput:"(no output)",noResultYet:"No result yet",toolsCalled:e=>`${e} tool call${e===1?"":"s"}`,toolsDone:e=>`✓ ${e} tool call${e===1?"":"s"}`,took:e=>`took ${e}`,toolErrors:e=>`${e} failed`,imageExpired:"Image expired",imageGone:"Image no longer there",imageNotLoaded:"The image did not load · Tap to try again",playVideo:e=>`Play ${e}`,videoNotLoaded:"The video did not open · Tap to try again",videoGone:"This video is no longer on the Mac",tasks:(e,n)=>`Tasks ${e}/${n}`,taskNow:e=>`Now: ${e}`,taskNotStarted:"Next one not started",runningInBackground:"In the background",runInBackground:"Run in background",foregroundRuns:e=>`${e} is running a command in the foreground`,foregroundSub:"New messages wait until it is over, or until it runs in the background",backgroundRunning:e=>`${e} running`,backgroundOpen:"View / stop (opens /tasks)",queuedMessages:"Queued messages",queued:e=>`${e} queued`,sendNow:"Send now",moveUp:"Up",moveDown:"Down",compactingQueued:e=>`Your ${e} message${e===1?" is":"s are"} queued and will go out in order after compacting`,compactingWillQueue:"Messages sent now are queued and go out after compacting",alsoOnMac:e=>e===1?"Also open in a terminal on the Mac":`Also open in ${e} terminals on the Mac`,alsoOnMacSub:"Each writes its own turns, unseen by the other.",quitOnMac:"Quit it on the Mac",quitOnMacBusy:"Claude there is at work or asking something. Quitting it now stops what it is doing.",quitAnyway:"Quit it",keys:"Keys",paste:"Paste",enter:"Enter",modes:{default:"Ask every step","accept edits":"Auto-edit files","plan mode":"Plan only","auto mode":"Auto","bypass permissions":"Allow everything"},permissions:"Permissions",permissionsIs:e=>`Permissions: ${e}`,unknown:"unknown",modelIs:e=>`Model: ${e}, tap to switch`,model:"Model",effortIs:e=>`Effort: ${e}, tap to change`,resetsInMinutes:e=>`resets in ${e} min`,resetsInHours:(e,n)=>`resets in ${e} h ${n} min`,resetsInDays:(e,n)=>`resets in ${e} d ${n} h`,context:"Context",fiveHourLimit:"5-hour limit",sevenDayLimit:"7-day limit",sessionCost:"This session cost",linesChanged:"Changed",lines:(e,n)=>`+${e} −${n} lines`,contextLabel:e=>`Context ${e}`,contextIs:e=>`${e} of context used, tap for usage`,fiveHourLabel:e=>`5-hour ${e}`,sevenDayLabel:e=>`7-day ${e}`,limitIs:(e,n)=>`${n} of the ${e} used, tap for usage`,copyUsage:"Copy usage",rename:"Rename",name:"Name",renameFailed:"Not renamed",renameNote:"Every device, and the conversation in Claude or Codex, goes by this name.",newSession:"New session",pickProject:"Pick a project",resumeRecent:"Resume a recent conversation",openFailed:"Not opened",newInProject:"New Claude in a project",newInProjectSub:"Pick a folder and start a new Claude Code",newCodexInProject:"New Codex in a project",newCodexInProjectSub:"Pick a folder and start a new Codex",resumeRecentSub:"Pick up a conversation from this Mac",loadFailed:"Could not load",nameOptional:"Name (optional)",nameOptionalHint:"Name (optional, the folder name by default)",findProject:"Search, or type a path (~/…)",noFolders:"No folders here",lookInside:e=>`Show the folders in ${e}`,noProjects:"No projects have used Claude yet. Type a path above, such as ~/",alreadyOpen:"Already open · ",folderGoneShort:"Folder gone, cannot resume here · ",inBackground:"In a Claude background session, cannot resume here · ",openElsewhere:"Open in another Codex app, cannot resume here · ",searchTitlePath:"Search titles or paths",noMatch:"No matching conversations",noConversations:"No Claude conversations on this Mac yet",automated:e=>`Sessions of automated tasks (${e})`,screenTitle:"Screen on the Mac",screenUnread:"Could not read the screen, try refreshing",screenContent:"Screen content",screenEmpty:"(the screen is empty)"},...{uploadFailed:"The image did not upload",speechBlocked:"Speech recognition is not available here (a home-screen web app may not get it). Tap the box and use the keyboard’s microphone.",speechDenied:"Speech recognition is not allowed. Allow this site the microphone and speech recognition in Settings, then try again.",speechStopped:"Speech recognition stopped. Hold to try again.",speechErrors:{network:"Speech recognition needs the network. Check the connection and hold to try again.","audio-capture":"The microphone could not be used. Another app may have it.",interrupted:"Listening was interrupted, by a call or another app taking the microphone.",busy:"Speech recognition is busy. Hold to try again in a moment.","speech-timeout":"Nothing was heard for a while, so listening stopped."},notHeard:"Did not catch that",micJustOn:"The microphone just turned on, hold and speak again",speechUnavailable:"Speech recognition is unavailable",noLiveSpeech:"This browser has no live speech recognition",commands:"Commands",snippet:e=>`Snippet ${e}`,snippets:"Snippets",files:"Files",removeImage:"Remove image",uploading:"Uploading",input:"Message",placeholderSpeech:"Message, or hold to talk…",placeholder:"Message",stop:"Stop",send:"Send",holdSend:"Release to send · slide to ✕ to cancel",holdSendSlide:"Release to send · slide up to ✕ to cancel, or to edit as text",holdCancel:"Release to cancel",holdText:"Release to edit as text",cancel:"Cancel",toText:"To text",heardLabel:"Speech to text",recognizing:"Recognizing…",openingMic:"Opening the microphone",holdToTalk:"Hold to talk",photoLibrary:"Photo library",takePhoto:"Take photo",photosAndVideos:"Photos and videos",pickFile:"File",largeVideo:(e,n)=>e===1?`This video is ${n} MB`:`These ${e} videos are ${n} MB`,largeVideoSub:e=>`As ${e===1?"it is":"they are"}, it takes a while to send. At 720p ${e===1?"it is":"they are"} much smaller, and the stills Claude looks at are the same; you pick ${e===1?"it":"them"} again in Photos.`,sendAsIs:"Send as it is",sendSmaller:"Make smaller and send",attach:"Add a photo, video or file",removeFile:"Remove file",fileUploadFailed:e=>`${e} did not upload`,whatAndWhy:(e,n)=>`${e}: ${n}`,cameraDenied:"WorkOffDesk may not use the camera. Allow it in Settings.",speechDeniedApp:"WorkOffDesk may not use the microphone or speech recognition. Allow both in Settings, then try again.",speechOff:"Speech recognition is unavailable right now. Check that Dictation is on in Settings › General › Keyboard and that you are online.",speechLanguage:"Speech recognition does not support the languages this phone is set to.",openSettings:"Open Settings"},...{notConnectedSend:"Not connected to the Mac yet; send again once it is",modeNotSwitched:"Did not switch to that mode; Claude may not offer it",switchingMode:"Switching…",applying:"Setting…",clipboardUnreadable:"Cannot read the clipboard. Long-press the box to paste.",endFailed:"Not ended: cannot reach the Mac, tap again in a moment",notSentGiveBack:"Not sent; the text is back in the box",alreadySent:"This one has already been sent",takeBackFailed:"Could not take it back, try again",deleteFailed:"Not deleted, try again",notConnectedTap:"Not connected to the Mac yet; tap again once it is",notSentRetry:"Not sent, try again",backgroundOver:"That command is over already",notBackgrounded:"Not sent to the background, try again",notMoved:"Not moved, try again",notEnded:"Not ended, try again",notRun:"Not run, try again",queueWhenStarted:e=>`Goes out in order once ${e} has started`,queueWhenContinued:e=>`Goes out in order once ${e} is back on this conversation`,queueAfterCompact:"Goes out in order after compacting",queueAfterWaiting:e=>`${e} is waiting for you; goes out in order after that`,queueAfterTurn:e=>`${e} reads these after the step it is on`,inAgentsQueue:e=>`In ${e}’s queue`,queueNow:"Goes out in order right away",renameSession:e=>`Rename: ${e}`,ending:"Ending…",confirmEnd:"Confirm end",end:"End",shellSession:"This is a command-line session on the Mac",shellSessionSub:"The phone shows only Claude conversations; use this session on the Mac",syncing:"Syncing",reconnecting:"Reconnecting…",reconnectingSub:"It reconnects when the network is back; the session keeps running on the Mac",sessionEnded:"Session ended",updateReady:"New version",updateReadySub:"Downloaded. It starts the next time the app opens.",updateNow:"Update now",reopenStuck:"The app did not start again",reopenStuckSub:"Swipe up from the bottom of the screen, swipe WorkOffDesk away and open it again.",sessionEndedSub:"This session has exited on the Mac",startAnother:"Start a new one",agentQuit:e=>`${e} has quit`,agentQuitSub:"Continue picks up this conversation where it stopped; a new one starts afresh in this folder",endedGoOnSub:"Continue picks this conversation up again in this session; a new one starts afresh in this folder",continueConversation:"Continue this conversation",continueFailed:"Not continued",suggestion:"Suggested next message · tap to put it in the box",dismissSuggestion:"Dismiss this suggestion",macSession:"Session on the Mac",notOnMac:"This conversation is no longer on the Mac",readOnly:"Read-only",cannotRead:"Cannot read this conversation",subagent:"Sub-agent",openAlreadyOnPhone:"Open (already open on the phone)",inBackgroundNoResume:"In a Claude background session, cannot resume here",openElsewhereNoResume:"Open in another Codex app, cannot resume here",continueOnPhone:"Continue on the phone",onMacIdle:"Open on the Mac",onMacBusy:"Working on the Mac",onMacWaiting:"Asking you on the Mac",onMacBackground:"Commands left running on the Mac",openInTerminals:e=>`Open in ${e} terminals`,takeOverNow:"Take over to the phone",folderGoneNoResume:"Its folder is gone, so it cannot go on here",folderGoneSub:e=>`${e} is not on the Mac any more, as when a worktree is removed. Start a new conversation in another folder.`,takeOverWhenDone:"Take over when this step is done",takeOverInterrupt:"Take over now (stops this step)",takeOverStopsCommands:"Taking it over stops those commands.",takeOverDropsQuestion:"Its question is dropped: once here, ask it to redo that step.",takeOverNote:e=>`${e} on the Mac quits and goes on here.`,backAtMac:"Back at the Mac: ",takingOverWait:"Waiting for this step on the Mac to finish…",takeOverCancel:"Cancel",takeOverMissed:"It was not taken over. Try again.",startInTmuxHint:"Start Claude or Codex on the Mac with workoffdesk claude or workoffdesk codex and there is nothing to take over.",continueOnMac:"Continue on the Mac",continueOnMacSub:"Run this in a terminal on the Mac:",renameAction:"Rename",pin:"Pin",unpin:"Unpin",pinFailed:"Not pinned or unpinned",busy:"Running",needsYou:"Needs you",unread:"Unread",sessions:"Sessions",chooseSession:"Choose a session on the left.",search:"Search",noSessions:"No sessions yet",noSessionsSub:"Tap ⊕ at the top right to open a Shell or Claude.",noSessionsPhone:"Tap + at the top right to start Claude in a project.",sessionMenu:"Session actions",endSession:"End session",conversationsOnMac:"Conversations on the Mac",noConversations:"No other conversations on the Mac",deleteSessionTitle:"Delete this session?",deleteSessionSub:"Its conversation goes from WorkOffDesk. Claude's or Codex's own record on the Mac is left as it is.",notFound:e=>`Nothing found for “${e}”`,endedSessions:"Ended",otherMacSessions:"Other sessions on the Mac",wrongPassword:"Wrong username or password",loginNotKept:"Signed in, but the login could not be saved on this phone. Try again.",loginFailedOther:"Login failed. Try again.",tooManyTries:e=>`Too many tries, try again in ${e} min`,loginFailed:e=>`Login failed (${e})`,noServer:"Cannot reach the server, check the network",noAnswer:"The server did not answer, so this may or may not have happened. Check before trying again",unknownPasskey:"This passkey is not recognized. Log in with the password, then add this device in Settings.",tagline:"Your Mac’s Claude, on your phone",faceId:"Log in with Face ID",orPassword:"or with a password",username:"Username",password:"Password",login:"Log in",serverAddress:"Server address",serverAddressHint:"Where you open WorkOffDesk in a browser, like https://workoffdesk.example.com",badServerAddress:"That is not a web address"},...{textSize:"Text size",wholeApp:"Text in the whole app",thisDeviceOnly:"This device only",smaller:"Smaller text",larger:"Larger text",textPreview:"Claude’s replies, your messages and the lists all show at this size.",appearance:"Appearance",theme:"Theme",followSystem:"System",themeLight:"Light",themeDark:"Dark",themeEye:"Eye care",listGrouping:"Session list",groupByProject:"By project",notGrouped:"Not grouped",language:"Language",languageRestarts:"The app reopens in the language you pick.",snippetsLines:"Snippets, one per line",snippetsPlaceholder:`One per line, like:
|
|
2
2
|
Continue
|
|
3
3
|
Run lint and the type check
|
|
4
|
-
Commit the changes`,snippetsNote:"They come first when you type / in the box; a tap puts the whole line in. Kept on this device only.",pushInsecure:"Push needs this site opened over https (your real domain, for example).",pushUnsupported:"This browser does not support push. On iPhone, first “Share → Add to Home Screen” in Safari, then open it from the home screen.",pushDenied:"Notifications were denied; allow them for this site in the system settings.",failed:"Did not work",passkeyNone:"No passkeys yet. Add one to log in with Face ID.",passkeyNoneOnPhone:"No passkeys yet. Add one in the web app's Settings to log in there with Face ID.",pushAppUnready:"This Mac cannot reach the iPhone app yet: its server needs an Apple push key (apns.json in ~/.workoffdesk).",pushAppDenied:"Notifications are off for WorkOffDesk. Turn them on in the iPhone Settings app → WorkOffDesk → Notifications.",addedAgo:e=>`Added ${e}`,lastUsedAgo:e=>` · last used ${e}`,passkeysTitle:"Passkeys",addPasskey:"Add a passkey for this device",loggedIn:"Logged-in devices",thisDevice:"This device",loginBy:(e,o)=>`${e?"Passkey":"Password"} login · last active ${o}`,revoke:"Revoke",confirmDelete:"Confirm delete",confirmRevoke:"Confirm revoke",pushTitle:"Push notifications",pushRemind:"Tell me when Claude needs me",pushRemindSub:"Pushed to this device when Claude needs you or finishes a turn",logOut:"Log out",addAccount:"Add account",addAccountTagline:"Sign in to another account or server",signInAgainTagline:"Its Mac no longer takes this sign-in; sign in again",removeAccount:"Remove",confirmRemoveAccount:"Remove from this phone",account:"Account",appRelease:e=>e?`This app runs ${e}`:"This app runs the version it was installed with",thisMac:"This Mac",thisMacSub:"Checks, version, restart",macAllGood:"Everything works",macProblemCount:e=>e===1?"1 problem":`${e} problems`,macChecks:"Checks",checkNames:{macos:"macOS",node:"Node.js",tmux:"tmux",claude:"Claude Code",codex:"Codex",setup:"Account",service:"Service",origin:"Address",sleep:"Staying awake",apns:"iPhone notifications"},macFixTap:"Tap to copy",macCheckPassed:"Passed",macCheckFailed:"Failed",macVersion:"Version",macBuiltFrom:(e,o)=>`Built from ${e}${o?" with uncommitted changes":""}`,macServingSince:e=>`Serving since ${e}`,macReleases:"Releases kept",macRunning:"Running",macActions:"Service",macRestart:"Restart the service",macRestartNote:"Sessions keep running; the page comes back by itself.",macRestartConfirm:"Restart now",macRestartShort:"Restart",macRollbackShort:"Roll back",macRollbackSure:"Sure?",macPassed:e=>`${e} more passed`,macAllPassed:e=>`All ${e} checks passed`,macRollback:e=>`Roll back to ${e}`,macNoRollback:"No earlier release is kept to go back to.",macNotManaged:"This server was started by hand (workoffdesk serve), not as the service, so it cannot be restarted from here.",macRestarting:"Restarting…",macRollingBack:"Rolling back…",macRestarted:"Restarted",macRolledBack:"Rolled back",macNoReturn:"The Mac has not come back within a minute. Look at the Mac, or run workoffdesk doctor there.",macProblems:"Recent warnings and errors",macNoProblems:"Nothing went wrong lately.",macLogNote:"The full log is in the logs folder of ~/.workoffdesk on the Mac.",macClaudeAccounts:"Claude account",macAccountNote:"New sessions start on the account checked. Open ones keep theirs unless moved.",macElsewhere:e=>e===1?"1 open session is on another account":`${e} open sessions are on another account`,macMoveTo:e=>`Move to ${e}; it goes on from where it stopped.`,macMoveButton:"Move",macMovingSessions:e=>e===1?"Moving 1 session":`Moving ${e} sessions`,macMovingTo:e=>`Moving to ${e}: idle ones at once, ones replying once their reply is done.`,accountSignedOut:"Signed out",accountNotReady:"Open Claude Code with it in a terminal once first",accountApart:"Its conversations are kept apart from this Mac’s",accountNotSeen:"Not seen in use yet",limitReset:"reset",claudeAccountLine:"Account"},...{setupTitle:"Set up WorkOffDesk",setupSub:"Once, on this Mac. Then the phone does the rest.",setupSteps:{checks:"This Mac",account:"Account",address:"Address",service:"Service",phone:"Phone"},setupChange:"Change",setupContinue:"Continue",setupCheckAgain:"Check again",setupChecksNote:"What WorkOffDesk needs on this Mac.",setupChecksFix:"Run the commands in Terminal, then check again.",setupChecksOk:"This Mac has everything it needs.",setupAccountNote:"The name and password the phone signs in with.",setupAccountHave:e=>`There is an account: ${e}`,setupKeep:"Keep it",setupReplace:"Replace it",setupReplaceNote:"A new account signs every device out.",setupPasswordRule:e=>`At least ${e} characters`,setupPasswordAgain:"Password again",setupPasswordsDiffer:"The two passwords are not the same",setupSaveAccount:"Save the account",setupAddressNote:"The HTTPS address the phone opens, wherever it is.",setupAddressNow:e=>`Now: ${e}`,setupTailscale:"Tailscale",setupTailscaleUse:e=>`https://${e}, reached only from your own devices`,setupTailscaleDown:"Tailscale is installed but not running. Open it and sign in, then check again.",setupCloudflare:"Cloudflare tunnel",setupCloudflareNote:"A hostname on your domain, through a tunnel you made.",setupTunnel:"Tunnel",setupHostname:"Hostname",setupOther:"Another address",setupOtherNote:e=>`Any HTTPS address that reaches port ${e} on this Mac.`,setupNoWayIn:"The simplest way in: Tailscale on this Mac and on the phone. Install it, then check again.",setupUseAddress:"Use this address",setupServiceNote:"WorkOffDesk runs as a service that starts when you log in to this Mac.",setupInstall:"Install and start",setupInstalling:"Starting it. This can take half a minute.",setupPhoneNote:e=>`Point the phone's camera at the code, then sign in as ${e}.`,setupFinish:"Finish",setupFinished:"All set. You can close this tab.",setupNoToken:"Open this page from the address that workoffdesk setup --web printed in Terminal. Running it again prints a new one.",setupGone:"Setup is no longer running. Run workoffdesk setup --web again."}},h={...{justNow:"刚刚",minutesAgo:e=>`${e} 分钟前`,hoursAgo:e=>`${e} 小时前`,daysAgo:e=>`${e} 天前`,yesterday:"昨天",seconds:e=>`${e} 秒`,minutesSeconds:(e,o)=>`${e} 分 ${o} 秒`,status:{starting:"启动中",working:"在干活",waiting:"等你确认",idle:"空闲",ended:"已结束",compacting:"压缩中"},previewStarting:"启动中…",previewWorking:"在干活…",compactingContext:"正在压缩上下文…",close:"关闭",back:"返回",save:"保存",delete:"删除",edit:"编辑",copy:"复制",copied:"已复制",appError:"出了点问题",reopen:"重新打开",loading:"加载中…",reading:"读取中…",refresh:"刷新",open:"打开",showScreen:"看屏幕",session:"会话",settings:"设置",sent:"已送出",sentMessage:"已送出的消息",sending:"发送中…",sendingMessage:"正在发送的消息",tryAgain:"再试一次",device:"设备",serverErrors:{"dialog-open":"上面的菜单还开着,先选一项或按 Esc","background-session":"这个对话在 Claude 的后台会话里,不能在这里续","open-on-mac":"这个对话还开在电脑的终端里","mac-would-not-quit":"电脑上那边没有退出,没有续上","open-elsewhere":"这个对话开在别的 Codex 应用里(编辑器或 Codex App),先在那边关掉","not-an-image":"只能上传图片(PNG、JPEG、GIF、WebP、HEIC)","upload-incomplete":"文件没有完整传到 Mac,请重新发送","upload-offset":"Mac 上这个文件的进度对不上,正从 Mac 那边的位置接着发","not-managed":"这个服务是手动起的,不是后台服务,这里不能重启它。","op-busy":"已经有一次重启或回退在进行。","rollback-moved":"版本刚刚变了,再看一眼再回退。","account-unusable":"这个账号现在用不了。","account-none-picked":"先选一个账号。","folder-gone":"它的文件夹已经不在这台 Mac 上了。","terminal-busy":"这个会话在电脑的终端里正跑着别的程序,先在那边退出它,或者开一个新对话"},noteCompacted:"更早的对话已压缩",noteInterrupted:"已中断",toolStopped:e=>`没有执行:这一步还没跑,${e} 就收到 Esc 停下了。`,noteFailed:"出错了",noteLimit:"额度用完了",noteTask:(e,o)=>`${e==="completed"?"后台任务完成":e==="failed"?"后台任务失败":"后台任务"}:${o}`,notePeer:e=>`收到 ${e||"另一个会话"} 的消息`,builtinCommands:{agents:"管理子 agent",clear:"清空对话,从头开始",compact:"压缩对话,腾出上下文",config:"打开设置",context:"看上下文用了多少",cost:"看这次会话花了多少",doctor:"检查 Claude Code 的安装",export:"导出对话",help:"帮助",hooks:"管理钩子",init:"为项目写一份 CLAUDE.md",mcp:"管理 MCP 服务",memory:"编辑记忆文件",model:"换模型",permissions:"管理权限",plugin:"管理插件",resume:"接着以前的对话",review:"审查一个 PR",rewind:"回到之前的某一步",status:"看版本、账号和连接",todos:"看待办",usage:"看额度用了多少"},push:{waiting:"需要你确认",idle:"这一轮做完了"}},...{panelTitles:{Model:"模型",Effort:"思考强度",Settings:"设置",Usage:"用量",Btw:"顺带一问"},panelNamed:e=>`「${e}」面板`,aPanel:"一个面板",agentOpened:(e,o)=>`${e} 打开了${o}`,agentHasOpen:(e,o)=>`${e} 开着${o}`,heldWhilePanel:"发的消息先留在框里,关掉再发",fiveHourUnseen:"5 小时额度:屏幕上没露出来",fiveHourUsed:e=>`5 小时额度已用 ${e}%`,weekUnseen:"本周额度:屏幕上没露出来",weekUsed:e=>`本周额度已用 ${e}%`,effortHint:"左边更快,右边更聪明;只改这个会话",effortLevels:{low:"低",medium:"中",high:"高",xhigh:"超高",max:"最高"},dialogAbout:{Model:"选中的会成为新会话的默认模型"},closeEsc:"关闭 (Esc)",otherModels:"其他模型…",btwAsked:"顺带一问 (/btw)",showKeys:"显示按键",hideKeys:"收起按键",scrollUp:"上翻",scrollDown:"下翻",agentAsks:e=>`${e} 在问你`,plan:"计划",writeOwnAnswer:"自己写一个回答",writeBelow:"在下面的输入框写回答,发送就行",noneTicked:"都不选",typedHint:"要自己写答案的话,点「看屏幕」用快捷键条作答",nextQuestion:"下一题",submit:"提交",ticked:e=>`(${e} 项)`,listSeparator:"、",optionsChanged:"选项已经变了,这是现在的",allowTool:e=>`允许使用 ${e} 吗?`,allowYes:"允许",allowAlways:e=>`允许,并且以后${e}`,alwaysMode:e=>e==="acceptEdits"?"所有修改都直接接受":`切换到 ${e} 模式`,alwaysRules:"这些不再问",alwaysDirs:e=>`可以访问 ${e}`,alwaysJoin:",",allowNo:"不允许",allowNoDetail:"停下来,等你说该怎么做",askOver:"已经在电脑上回答过了",notPressed:"没按到,再点一次试试",escCancel:"Esc 取消",youChose:"你选了:",continueWord:"继续",moveAccount:"换个账号接着跑",moveAccountTitle:"换个账号接着跑?",moveAccountNote:"开着的会话都会在那个账号上从停下的地方接着跑,之后新开的会话也用它。",moveAccountHow:"换一个 Claude 账号就能接着用:在 Mac 的终端里运行 CLAUDE_CONFIG_DIR=~/.claude-<名字> claude,用 /login 登录另一个账号,它就会出现在这里。",moveAccountThen:e=>`「${e}」先留着,换好账号就发出去。`,movingAccount:e=>`正在换到 ${e},换好就接着跑…`},...{sendPaused:"发送暂停",loadingEarlier:"正在加载更早的对话",noConversation:"还没有对话",typeBelow:"在下面输入,回复会出现在这里",agentWriting:e=>`${e} 正在写…`,chatUnreadable:"读不到对话,正在重试…",endedNoChat:"这台设备上没有这段对话的记录。",goneOnMac:"Mac 上已经没有它了。",claudeWorking:"在干活",agentWaiting:e=>`${e} 在等你确认`,toBottom:"回到底部",changes:"改动",newFile:"新文件",atLine:e=>`第 ${e} 行`,diffCut:"太长了,只显示前面一部分",changedFiles:"这次改动的文件",filesChanged:e=>`改了 ${e} 个文件`,newMark:"新",viewImage:"查看图片",image:"图片",imageCount:e=>`${e} 张图`,fileCount:e=>`${e} 个文件`,unseenImages:e=>`附了 ${e} 张图(在 Mac 上粘贴的,这里看不到)`,collapse:"收起",expandAll:"展开全部",allLines:e=>`查看全部 ${e} 行`,rewind:"回退",stopReading:"停止朗读",readAloud:"朗读",webImage:"外链图片",seeImageAbove:"↑ 看上面那张图",running:"运行中",noOutput:"(没有输出)",noResultYet:"还没有结果",toolsCalled:e=>`已调 ${e} 个工具`,toolsDone:e=>`✓ 调了 ${e} 个工具`,took:e=>`用时 ${e}`,toolErrors:e=>`${e} 个出错`,imageExpired:"图片已过期",imageGone:"图片已不在",imageNotLoaded:"图片没加载出来 · 点按重试",playVideo:e=>`播放 ${e}`,videoNotLoaded:"视频没打开 · 点按重试",videoGone:"Mac 上已经没有这个视频了",tasks:(e,o)=>`任务 ${e}/${o}`,taskNow:e=>`正在:${e}`,taskNotStarted:"还没开始下一项",backgroundCommands:"后台命令",backgroundRunning:e=>`${e} 个运行中`,backgroundOpen:"查看 / 停止(打开 /tasks)",queuedMessages:"排队的消息",queued:e=>`排队 ${e} 条`,sendNow:"立即发送",moveUp:"上移",moveDown:"下移",compactingQueued:e=>`你的 ${e} 条消息在排队,压缩完按顺序自动发出`,compactingWillQueue:"现在发的消息会先排队,压缩完自动发出",alsoOnMac:e=>e===1?"这个对话在 Mac 的终端里也开着":`这个对话在 Mac 的 ${e} 个终端里也开着`,alsoOnMacSub:e=>`两个 Claude 在同时写它,各自只看得见自己那几轮。退出那边的 Claude;要在 Mac 上接着用,跑 workoffdesk attach ${e}`,keys:"快捷键",paste:"粘贴",enter:"回车",modes:{default:"每步都问","accept edits":"自动改文件","plan mode":"只做计划","auto mode":"自动","bypass permissions":"全部放行"},permissions:"权限",permissionsIs:e=>`权限:${e}`,unknown:"未知",modelIs:e=>`模型:${e},点开换模型`,model:"模型",effortIs:e=>`思考强度:${e},点开调整`,resetsInMinutes:e=>`${e} 分钟后重置`,resetsInHours:(e,o)=>`${e} 小时 ${o} 分后重置`,resetsInDays:(e,o)=>`${e} 天 ${o} 小时后重置`,context:"上下文",fiveHourLimit:"5 小时额度",sevenDayLimit:"7 天额度",sessionCost:"这个会话花了",linesChanged:"改了",lines:(e,o)=>`+${e} −${o} 行`,contextLabel:e=>`上下文 ${e}`,contextIs:e=>`上下文用了 ${e},点开看用量`,fiveHourLabel:e=>`5 小时 ${e}`,sevenDayLabel:e=>`7 天 ${e}`,limitIs:(e,o)=>`${e}用了 ${o},点开看用量`,copyUsage:"复制用量",rename:"改名",name:"名字",renameFailed:"没改成",renameNote:"不填就用 Claude 或 Codex 给这个对话起的名字,还没有就用目录名。各设备上都显示这个名字。",newSession:"新建会话",pickProject:"选一个项目",resumeRecent:"续上最近的对话",openFailed:"没开成",newInProject:"在项目里新开 Claude",newInProjectSub:"选一个目录,开一个新的 Claude Code",newCodexInProject:"在项目里新开 Codex",newCodexInProjectSub:"选一个目录,开一个新的 Codex",resumeRecentSub:"接着这台 Mac 上之前的对话",loadFailed:"加载失败",nameOptional:"名字(可不填)",nameOptionalHint:"名字(可不填,默认用目录名)",findProject:"搜索,或输入路径(~/…)",noFolders:"这里没有文件夹",lookInside:e=>`看看 ${e} 里的文件夹`,noProjects:"还没有用过 Claude 的项目。在上面输入一个路径,比如 ~/",alreadyOpen:"已打开 · ",folderGoneShort:"文件夹已不在,这里不能续 · ",inBackground:"在 Claude 后台会话里,这里不能续 · ",openElsewhere:"开在别的 Codex 应用里,这里不能续 · ",searchTitlePath:"搜标题或路径",noMatch:"没有匹配的对话",noConversations:"这台 Mac 上还没有 Claude 对话记录",automated:e=>`自动任务的会话(${e})`,screenTitle:"Mac 上的屏幕",screenUnread:"没读到屏幕,再刷新一次试试",screenContent:"屏幕内容",screenEmpty:"(屏幕是空的)"},...{uploadFailed:"图片没传上去",speechBlocked:"这里用不了语音识别(主屏幕上的网页可能不让用)。点输入框,用键盘上的麦克风说话。",speechDenied:"不能用语音识别。在 iPhone 的设置里允许这个网站使用麦克风和语音识别后再试。",speechStopped:"语音识别停了,再按住试一次。",speechErrors:{network:"语音识别要联网。看看网络,再按住试一次。","audio-capture":"麦克风用不了,可能被别的 App 占着。",interrupted:"听写被打断了,来电或别的 App 占了麦克风。",busy:"语音识别正忙,稍后再按住试一次。","speech-timeout":"好一会没听到声音,停止了听写。"},notHeard:"没听清",micJustOn:"麦克风刚打开,再按住说一次",speechUnavailable:"不能用语音识别",noLiveSpeech:"这个浏览器不支持实时语音",commands:"命令",snippet:e=>`常用语 ${e}`,snippets:"常用语",files:"文件",removeImage:"移除图片",uploading:"正在上传",input:"输入",placeholderSpeech:"发消息或按住说话…",placeholder:"发消息",stop:"停止",send:"发送",holdSend:"松开发送 · 滑到 ✕ 取消",holdSendSlide:"松开发送 · 上滑到 ✕ 取消 · 上滑到「转文字」转文字",holdCancel:"松开取消",holdText:"松开转文字",cancel:"取消",toText:"转文字",heardLabel:"语音转文字",recognizing:"正在识别…",openingMic:"正在打开麦克风",holdToTalk:"按住说话",photoLibrary:"照片图库",takePhoto:"拍照",photosAndVideos:"照片和视频",pickFile:"文件",largeVideo:(e,o)=>e===1?`这个视频有 ${o} MB`:`这 ${e} 个视频共 ${o} MB`,largeVideoSub:()=>"原样发要传一阵。压缩成 720p 会小很多,Claude 看的截图不受影响,但要在相册里再选一次。",sendAsIs:"原样发",sendSmaller:"压缩后发",attach:"添加照片、视频或文件",removeFile:"移除文件",fileUploadFailed:e=>`${e} 没传上去`,whatAndWhy:(e,o)=>`${e}:${o}`,cameraDenied:"WorkOffDesk 不能用相机。在设置里允许后再试。",speechDeniedApp:"WorkOffDesk 不能用麦克风或语音识别。在设置里两项都打开后再试。",speechOff:"现在用不了语音识别。看看 设置 › 通用 › 键盘 里的「听写」开着没有,网络通不通。",speechLanguage:"语音识别不支持这台手机设置的语言。",openSettings:"打开设置"},...{notConnectedSend:"还没连上 Mac,连上后再发一次",modeNotSwitched:"没切到那个模式,Claude 可能没开放它",switchingMode:"正在切换…",applying:"正在设置…",clipboardUnreadable:"读不到剪贴板。可以长按输入框粘贴。",endFailed:"没结束掉,连不上 Mac,稍后再点一次",notSentGiveBack:"没发出去,文字放回输入框了",alreadySent:"这条已经发出去了",takeBackFailed:"没拿回来,再试一次",deleteFailed:"没删掉,再试一次",notConnectedTap:"还没连上 Mac,连上后再点一次",notSentRetry:"没发出去,再试一次",notMoved:"没移动,再试一次",notEnded:"没结束掉,再试一次",notRun:"没运行,再试一次",queueWhenStarted:e=>`${e} 启动好就按顺序发出`,queueWhenContinued:e=>`接着这个对话后,${e} 一启动好就按顺序发出`,queueAfterCompact:"压缩完按顺序自动发出",queueAfterWaiting:e=>`${e} 在等你确认,之后按顺序发出`,queueAfterTurn:e=>`${e} 做完手上这一步就会读到`,inAgentsQueue:e=>`${e} 排队中`,queueNow:"马上按顺序发出",renameSession:e=>`改名:${e}`,ending:"正在结束…",confirmEnd:"确认结束",end:"结束",shellSession:"这是 Mac 上的命令行会话",shellSessionSub:"手机上只看 Claude 的对话,这个会话在 Mac 上用",syncing:"同步中",reconnecting:"重连中…",reconnectingSub:"网络恢复后会自动接上,会话一直在 Mac 上跑着",sessionEnded:"会话已结束",updateReady:"有新版本",updateReadySub:"已下载好,下次打开 App 时生效",updateNow:"立即更新",sessionEndedSub:"这个会话在 Mac 上已经退出了",startAnother:"重新开一个",agentQuit:e=>`${e} 已退出`,agentQuitSub:"「接着这个对话」接上原来的上下文;「重新开一个」在这个文件夹里开一段全新的对话",endedGoOnSub:"「接着这个对话」在新会话里接上原来的上下文;「重新开一个」在这个文件夹里开一段全新的对话",continueConversation:"接着这个对话",continueFailed:"没接上",suggestion:"猜你接下来想发 · 点一下填进输入框",dismissSuggestion:"不要这条建议",macSession:"Mac 上的会话",readOnly:"只读",cannotRead:"读不到这个对话",openAlreadyOnPhone:"打开(已经在手机上开着)",inBackgroundNoResume:"在 Claude 后台会话里,这里不能续",openElsewhereNoResume:"开在别的 Codex 应用里,这里不能续",continueOnPhone:"在手机上接着聊",onMacIdle:"电脑上开着",onMacBusy:"电脑上在干活",onMacWaiting:"电脑上在等你确认",openInTerminals:e=>`开了 ${e} 个`,takeOverNow:"接管到手机",folderGoneNoResume:"它的文件夹已经不在了,这里接不上",folderGoneSub:e=>`${e} 已经不在这台 Mac 上了(比如 worktree 被删掉了)。换个文件夹开一个新对话吧。`,takeOverWhenDone:"等这一步做完再接管",takeOverInterrupt:"立即接管(打断这一步)",takeOverDropsQuestion:"这个确认会作废,接上后让它重做这一步。",takeOverNote:e=>`电脑上的 ${e} 会退出,在手机上接着跑。回电脑:workoffdesk attach`,takingOverWait:"等电脑上这一步做完…",takeOverCancel:"取消",takeOverMissed:"没接上,再点一次",startInTmuxHint:"在电脑上用 workoffdesk claude 或 workoffdesk codex 启动,就不用接管",continueOnMac:"在电脑上继续",continueOnMacSub:"在 Mac 的终端里运行:",renameAction:"改名",busy:"运行中",needsYou:"等你确认",unread:"未读",sessions:"会话",chooseSession:"在左边选一个会话。",search:"搜索",noSessions:"还没有会话",noSessionsSub:"点右上角 ⊕,开一个 Shell 或 Claude。",noSessionsPhone:"点右上角 +,在一个项目里开 Claude。",sessionMenu:"会话操作",endSession:"结束会话",notFound:e=>`没有找到「${e}」`,otherMacSessions:"Mac 上的其他会话",wrongPassword:"用户名或密码不对",loginNotKept:"登录成功了,但没能存到这台手机上,再试一次。",loginFailedOther:"登录没成功,再试一次。",tooManyTries:e=>`尝试太多次了,${e} 分钟后再试`,loginFailed:e=>`登录失败(${e})`,noServer:"连不上服务器,检查一下网络",noAnswer:"服务器没有回应,这一步可能做了,也可能没做。先看一眼再重试",unknownPasskey:"这个 Passkey 不认识。先用密码登录,再到「设置」里添加这台设备。",tagline:"在手机上接着用 Mac 上的 Claude",faceId:"用 Face ID 登录",orPassword:"或者用密码",username:"用户名",password:"密码",login:"登录",serverAddress:"服务器地址",serverAddressHint:"在浏览器里打开 WorkOffDesk 的地址,比如 https://workoffdesk.example.com",badServerAddress:"这不是一个网址"},...{textSize:"文字大小",wholeApp:"整个 App 的字",thisDeviceOnly:"只改这台设备",smaller:"文字减小",larger:"文字加大",textPreview:"Claude 的回复、你发的消息和列表,都按这个大小显示。",appearance:"外观",theme:"主题",followSystem:"跟随系统",themeLight:"浅色",themeDark:"深色",themeEye:"护眼",language:"语言",languageRestarts:"选好后 App 会重新打开,换成这个语言。",snippetsLines:"常用语,一行一条",snippetsPlaceholder:`一行一条,例如:
|
|
4
|
+
Commit the changes`,snippetsNote:"They come first when you type / in the box; a tap puts the whole line in. Kept on this device only.",pushInsecure:"Push needs this site opened over https (your real domain, for example).",pushUnsupported:"This browser does not support push. On iPhone, first “Share → Add to Home Screen” in Safari, then open it from the home screen.",pushDenied:"Notifications were denied; allow them for this site in the system settings.",failed:"Did not work",passkeyNone:"No passkeys yet. Add one to log in with Face ID.",passkeyNoneOnPhone:"No passkeys yet. Add one in the web app's Settings to log in there with Face ID.",pushAppUnready:"This Mac cannot reach the iPhone app yet: its server needs an Apple push key (apns.json in ~/.workoffdesk).",pushAppDenied:"Notifications are off for WorkOffDesk. Turn them on in the iPhone Settings app → WorkOffDesk → Notifications.",addedAgo:e=>`Added ${e}`,lastUsedAgo:e=>` · last used ${e}`,passkeysTitle:"Passkeys",addPasskey:"Add a passkey for this device",loggedIn:"Logged-in devices",thisDevice:"This device",loginBy:(e,n)=>`${e?"Passkey":"Password"} login · last active ${n}`,revoke:"Revoke",confirmDelete:"Confirm delete",confirmRevoke:"Confirm revoke",pushTitle:"Push notifications",pushRemind:"Tell me when Claude needs me",pushRemindSub:"Pushed to this device when Claude needs you or finishes a turn",logOut:"Log out",addAccount:"Add account",addAccountTagline:"Sign in to another account or server",signInAgainTagline:"Its Mac no longer takes this sign-in; sign in again",removeAccount:"Remove",confirmRemoveAccount:"Remove from this phone",account:"Account",appRelease:e=>e?`This app runs ${e}`:"This app runs the version it was installed with",thisMac:"This Mac",thisMacSub:"Checks, version, restart",macAllGood:"Everything works",macProblemCount:e=>e===1?"1 problem":`${e} problems`,macChecks:"Checks",checkNames:{macos:"macOS",node:"Node.js",tmux:"tmux",claude:"Claude Code",codex:"Codex",setup:"Account",service:"Service",origin:"Address",sleep:"Staying awake",apns:"iPhone notifications"},macFixTap:"Tap to copy",macCheckPassed:"Passed",macCheckFailed:"Failed",macVersion:"Version",macBuiltFrom:(e,n)=>`Built from ${e}${n?" with uncommitted changes":""}`,macServingSince:e=>`Serving since ${e}`,macReleases:"Releases kept",macRunning:"Running",macActions:"Service",macRestart:"Restart the service",macRestartNote:"Sessions keep running; the page comes back by itself.",macRestartConfirm:"Restart now",macRestartShort:"Restart",macRollbackShort:"Roll back",macRollbackSure:"Sure?",macPassed:e=>`${e} more passed`,macAllPassed:e=>`All ${e} checks passed`,macRollback:e=>`Roll back to ${e}`,macNoRollback:"No earlier release is kept to go back to.",macNotManaged:"This server was started by hand (workoffdesk serve), not as the service, so it cannot be restarted from here.",macRestarting:"Restarting…",macRollingBack:"Rolling back…",macRestarted:"Restarted",macRolledBack:"Rolled back",macNoReturn:"The Mac has not come back within a minute. Look at the Mac, or run workoffdesk doctor there.",macProblems:"Recent warnings and errors",macNoProblems:"Nothing went wrong lately.",macLogNote:"The full log is in the logs folder of ~/.workoffdesk on the Mac.",macClaudeAccounts:"Claude account",macAccountNote:"New sessions start on the account checked. Open ones keep theirs unless moved.",macElsewhere:e=>e===1?"1 open session is on another account":`${e} open sessions are on another account`,macMoveTo:e=>`Move to ${e}; it goes on from where it stopped.`,macMoveButton:"Move",macMovingSessions:e=>e===1?"Moving 1 session":`Moving ${e} sessions`,macMovingTo:e=>`Moving to ${e}: idle ones at once, ones replying once their reply is done.`,accountSignedOut:"Signed out",accountNotReady:"Open Claude Code with it in a terminal once first",accountApart:"Its conversations are kept apart from this Mac’s",accountNotSeen:"Not seen in use yet",limitReset:"reset",claudeAccountLine:"Account"},...{setupTitle:"Set up WorkOffDesk",setupSub:"Once, on this Mac. Then the phone does the rest.",setupSteps:{checks:"This Mac",account:"Account",address:"Address",service:"Service",phone:"Phone"},setupChange:"Change",setupContinue:"Continue",setupCheckAgain:"Check again",setupChecksNote:"What WorkOffDesk needs on this Mac.",setupChecksFix:"Run the commands in Terminal, then check again.",setupChecksOk:"This Mac has everything it needs.",setupAccountNote:"The name and password the phone signs in with.",setupAccountHave:e=>`There is an account: ${e}`,setupKeep:"Keep it",setupReplace:"Replace it",setupReplaceNote:"A new account signs every device out.",setupPasswordRule:e=>`At least ${e} characters`,setupPasswordAgain:"Password again",setupPasswordsDiffer:"The two passwords are not the same",setupSaveAccount:"Save the account",setupAddressNote:"The HTTPS address the phone opens, wherever it is.",setupAddressNow:e=>`Now: ${e}`,setupTailscale:"Tailscale",setupTailscaleUse:e=>`https://${e}, reached only from your own devices`,setupTailscaleDown:"Tailscale is installed but not running. Open it and sign in, then check again.",setupCloudflare:"Cloudflare tunnel",setupCloudflareNote:"A hostname on your domain, through a tunnel you made.",setupTunnel:"Tunnel",setupHostname:"Hostname",setupOther:"Another address",setupOtherNote:e=>`Any HTTPS address that reaches port ${e} on this Mac.`,setupNoWayIn:"The simplest way in: Tailscale on this Mac and on the phone. Install it, then check again.",setupUseAddress:"Use this address",setupServiceNote:"WorkOffDesk runs as a service that starts when you log in to this Mac.",setupInstall:"Install and start",setupInstalling:"Starting it. This can take half a minute.",setupPhoneNote:e=>`Point the phone's camera at the code, then sign in as ${e}.`,setupFinish:"Finish",setupFinished:"All set. You can close this tab.",setupNoToken:"Open this page from the address that workoffdesk setup --web printed in Terminal. Running it again prints a new one.",setupGone:"Setup is no longer running. Run workoffdesk setup --web again."}},h={...{justNow:"刚刚",minutesAgo:e=>`${e} 分钟前`,hoursAgo:e=>`${e} 小时前`,daysAgo:e=>`${e} 天前`,today:"今天",yesterday:"昨天",seconds:e=>`${e} 秒`,minutesSeconds:(e,n)=>`${e} 分 ${n} 秒`,status:{starting:"启动中",working:"在干活",waiting:"等你确认",idle:"空闲",ended:"已结束",compacting:"压缩中"},previewStarting:"启动中…",previewWorking:"在干活…",compactingContext:"正在压缩上下文…",close:"关闭",back:"返回",save:"保存",delete:"删除",edit:"编辑",copy:"复制",copied:"已复制",appError:"出了点问题",reopen:"重新打开",loading:"加载中…",reading:"读取中…",refresh:"刷新",open:"打开",showScreen:"看屏幕",session:"会话",settings:"设置",sent:"已送出",sentMessage:"已送出的消息",sending:"发送中…",sendingMessage:"正在发送的消息",tryAgain:"再试一次",macTooOld:"请更新 Mac 上的 WorkOffDesk",macTooOldWhy:(e,n)=>`你的 Mac 上是 WorkOffDesk ${e},这个 App 需要 ${n} 或更新的版本。在 Mac 上运行:`,device:"设备",serverErrors:{"dialog-open":"上面的菜单还开着,先选一项或按 Esc","background-session":"这个对话在 Claude 的后台会话里,不能在这里续","open-on-mac":"这个对话还开在电脑的终端里","mac-would-not-quit":"电脑上那边没有退出,没有续上","mac-unanswered":"电脑没及时说清这个对话是不是还开着,稍等再试一次","peer-gone":"发这条消息的会话已经不在 Mac 上运行了",demo:"演示里做不了这个,连上你的 Mac 就可以","open-elsewhere":"这个对话开在别的 Codex 应用里(编辑器或 Codex App),先在那边关掉","conversation-gone":"这个对话已经不在 Agent 那里了(Claude Code 默认 30 天后删除),这里仍能查看说过的内容","not-an-image":"只能上传图片(PNG、JPEG、GIF、WebP、HEIC)","upload-incomplete":"文件没有完整传到 Mac,请重新发送","upload-offset":"Mac 上这个文件的进度对不上,正从 Mac 那边的位置接着发","not-managed":"这个服务是手动起的,不是后台服务,这里不能重启它。","op-busy":"已经有一次重启或回退在进行。","rollback-moved":"版本刚刚变了,再看一眼再回退。","account-unusable":"这个账号现在用不了。","account-none-picked":"先选一个账号。","folder-gone":"它的文件夹已经不在这台 Mac 上了。","session-busy":"Claude 这轮还没回复完。","cannot-move":"只有 Claude 还在跑、文件夹也还在的会话才能换账号。","move-failed":"它的 Claude 没有及时退出,还在原来的账号上,再试一次。","open-on-mac-busy":"这个对话在 Mac 的终端里也开着,那边的 Claude 正在干活或在问你问题。","terminal-busy":"这个会话在电脑的终端里正跑着别的程序,先在那边退出它,或者开一个新对话"},noteCompacted:"更早的对话已压缩",noteInterrupted:"已中断",toolStopped:e=>`没有执行:这一步还没跑,${e} 就收到 Esc 停下了。`,noteFailed:"出错了",noteLimit:"额度用完了",noteTask:(e,n)=>`${e==="completed"?"后台任务完成":e==="failed"?"后台任务失败":"后台任务"}:${n}`,notePeer:e=>`收到 ${e||"另一个会话"} 的消息`,goToSender:"去那个会话",seeWhatItDid:"看它做了什么",tryDemo:"先看看演示",tryDemoSub:"手边没有 Mac?用预先写好的会话看看它怎么用。",demoBanner:"演示:会话是预先写好的,没有连任何 Mac。",connectMyMac:"连接我的 Mac",builtinCommands:{agents:"管理子 agent",clear:"清空对话,从头开始",compact:"压缩对话,腾出上下文",config:"打开设置",context:"看上下文用了多少",cost:"看这次会话花了多少",doctor:"检查 Claude Code 的安装",export:"导出对话",help:"帮助",hooks:"管理钩子",init:"为项目写一份 CLAUDE.md",mcp:"管理 MCP 服务",memory:"编辑记忆文件",model:"换模型",permissions:"管理权限",plugin:"管理插件",resume:"接着以前的对话",review:"审查一个 PR",rewind:"回到之前的某一步",status:"看版本、账号和连接",todos:"看待办",usage:"看额度用了多少"},push:{waiting:"需要你确认",idle:"这一轮做完了",hidden:"你的 Mac 上有新动态"}},...{panelTitles:{Model:"模型",Effort:"思考强度",Settings:"设置",Usage:"用量",Btw:"顺带一问"},panelNamed:e=>`「${e}」面板`,aPanel:"一个面板",agentOpened:(e,n)=>`${e} 打开了${n}`,agentHasOpen:(e,n)=>`${e} 开着${n}`,heldWhilePanel:"发的消息先留在框里,关掉再发",fiveHourUnseen:"5 小时额度:屏幕上没露出来",fiveHourUsed:e=>`5 小时额度已用 ${e}%`,weekUnseen:"本周额度:屏幕上没露出来",weekUsed:e=>`本周额度已用 ${e}%`,effortHint:"左边更快,右边更聪明;只改这个会话",effortLevels:{low:"低",medium:"中",high:"高",xhigh:"超高",max:"最高"},dialogAbout:{Model:"选中的会成为新会话的默认模型"},closeEsc:"关闭 (Esc)",otherModels:"其他模型…",btwAsked:"顺带一问 (/btw)",showKeys:"显示按键",hideKeys:"收起按键",scrollUp:"上翻",scrollDown:"下翻",agentAsks:e=>`${e} 在问你`,plan:"计划",writeOwnAnswer:"自己写一个回答",writeBelow:"在下面的输入框写回答,发送就行",noneTicked:"都不选",typedHint:"要自己写答案的话,点「看屏幕」用快捷键条作答",nextQuestion:"下一题",submit:"提交",ticked:e=>`(${e} 项)`,listSeparator:"、",optionsChanged:"选项已经变了,这是现在的",allowTool:e=>`允许使用 ${e} 吗?`,allowYes:"允许",allowAlways:e=>`允许,并且以后${e}`,alwaysMode:e=>e==="acceptEdits"?"所有修改都直接接受":`切换到 ${e} 模式`,alwaysRules:"这些不再问",alwaysDirs:e=>`可以访问 ${e}`,alwaysJoin:",",allowNo:"不允许",allowNoDetail:"停下来,等你说该怎么做",askOver:"已经在电脑上回答过了",notPressed:"没按到,再点一次试试",escCancel:"Esc 取消",youChose:"你选了:",continueWord:"继续",moveAccount:"换个账号接着跑",moveAccountTitle:"换个账号接着跑?",moveAccountNote:"开着的会话都会在那个账号上从停下的地方接着跑,之后新开的会话也用它。",moveAccountHow:"换一个 Claude 账号就能接着用:在 Mac 的终端里运行 CLAUDE_CONFIG_DIR=~/.claude-<名字> claude,用 /login 登录另一个账号,它就会出现在这里。",moveAccountThen:e=>`「${e}」先留着,换好账号就发出去。`,movingAccount:e=>`正在换到 ${e},换好就接着跑…`,moveNow:"现在就换(会打断它)",moveWhenFree:"等它停下再换",switchAccount:"换 Claude 账号"},...{sendPaused:"发送暂停",loadingEarlier:"正在加载更早的对话",noConversation:"还没有对话",typeBelow:"在下面输入,回复会出现在这里",agentWriting:e=>`${e} 正在写…`,chatUnreadable:"读不到对话,正在重试…",endedNoChat:"这台设备上没有这段对话的记录。",goneOnMac:"Mac 上已经没有它了。",claudeWorking:"在干活",agentWaiting:e=>`${e} 在等你确认`,toBottom:"回到底部",changes:"改动",newFile:"新文件",atLine:e=>`第 ${e} 行`,diffCut:"太长了,只显示前面一部分",changedFiles:"这次改动的文件",filesChanged:e=>`改了 ${e} 个文件`,newMark:"新",viewImage:"查看图片",image:"图片",imageCount:e=>`${e} 张图`,fileCount:e=>`${e} 个文件`,unseenImages:e=>`附了 ${e} 张图(在 Mac 上粘贴的,这里看不到)`,collapse:"收起",expandAll:"展开全部",allLines:e=>`查看全部 ${e} 行`,rewind:"回退",stopReading:"停止朗读",readAloud:"朗读",webImage:"外链图片",seeImageAbove:"↑ 看上面那张图",running:"运行中",noOutput:"(没有输出)",noResultYet:"还没有结果",toolsCalled:e=>`已调 ${e} 个工具`,toolsDone:e=>`✓ 调了 ${e} 个工具`,took:e=>`用时 ${e}`,toolErrors:e=>`${e} 个出错`,imageExpired:"图片已过期",imageGone:"图片已不在",imageNotLoaded:"图片没加载出来 · 点按重试",playVideo:e=>`播放 ${e}`,videoNotLoaded:"视频没打开 · 点按重试",videoGone:"Mac 上已经没有这个视频了",tasks:(e,n)=>`任务 ${e}/${n}`,taskNow:e=>`正在:${e}`,taskNotStarted:"还没开始下一项",runningInBackground:"在后台运行",runInBackground:"后台执行",foregroundRuns:e=>`${e} 在前台跑一条命令`,foregroundSub:"新消息要等它跑完才会被读到,转到后台就不用等",backgroundRunning:e=>`${e} 个运行中`,backgroundOpen:"查看 / 停止(打开 /tasks)",queuedMessages:"排队的消息",queued:e=>`排队 ${e} 条`,sendNow:"立即发送",moveUp:"上移",moveDown:"下移",compactingQueued:e=>`你的 ${e} 条消息在排队,压缩完按顺序自动发出`,compactingWillQueue:"现在发的消息会先排队,压缩完自动发出",alsoOnMac:e=>e===1?"这个对话在 Mac 的终端里也开着":`这个对话在 Mac 的 ${e} 个终端里也开着`,alsoOnMacSub:"两边各写各的,互相看不见。",quitOnMac:"退出那边的 Claude",quitOnMacBusy:"那边的 Claude 正在干活或在问你问题,现在退出会打断它。",quitAnyway:"仍然退出",keys:"快捷键",paste:"粘贴",enter:"回车",modes:{default:"每步都问","accept edits":"自动改文件","plan mode":"只做计划","auto mode":"自动","bypass permissions":"全部放行"},permissions:"权限",permissionsIs:e=>`权限:${e}`,unknown:"未知",modelIs:e=>`模型:${e},点开换模型`,model:"模型",effortIs:e=>`思考强度:${e},点开调整`,resetsInMinutes:e=>`${e} 分钟后重置`,resetsInHours:(e,n)=>`${e} 小时 ${n} 分后重置`,resetsInDays:(e,n)=>`${e} 天 ${n} 小时后重置`,context:"上下文",fiveHourLimit:"5 小时额度",sevenDayLimit:"7 天额度",sessionCost:"这个会话花了",linesChanged:"改了",lines:(e,n)=>`+${e} −${n} 行`,contextLabel:e=>`上下文 ${e}`,contextIs:e=>`上下文用了 ${e},点开看用量`,fiveHourLabel:e=>`5 小时 ${e}`,sevenDayLabel:e=>`7 天 ${e}`,limitIs:(e,n)=>`${e}用了 ${n},点开看用量`,copyUsage:"复制用量",rename:"改名",name:"名字",renameFailed:"没改成",renameNote:"各设备上,以及 Claude 或 Codex 里的这个对话,都叫这个名字。",newSession:"新建会话",pickProject:"选一个项目",resumeRecent:"续上最近的对话",openFailed:"没开成",newInProject:"在项目里新开 Claude",newInProjectSub:"选一个目录,开一个新的 Claude Code",newCodexInProject:"在项目里新开 Codex",newCodexInProjectSub:"选一个目录,开一个新的 Codex",resumeRecentSub:"接着这台 Mac 上之前的对话",loadFailed:"加载失败",nameOptional:"名字(可不填)",nameOptionalHint:"名字(可不填,默认用目录名)",findProject:"搜索,或输入路径(~/…)",noFolders:"这里没有文件夹",lookInside:e=>`看看 ${e} 里的文件夹`,noProjects:"还没有用过 Claude 的项目。在上面输入一个路径,比如 ~/",alreadyOpen:"已打开 · ",folderGoneShort:"文件夹已不在,这里不能续 · ",inBackground:"在 Claude 后台会话里,这里不能续 · ",openElsewhere:"开在别的 Codex 应用里,这里不能续 · ",searchTitlePath:"搜标题或路径",noMatch:"没有匹配的对话",noConversations:"这台 Mac 上还没有 Claude 对话记录",automated:e=>`自动任务的会话(${e})`,screenTitle:"Mac 上的屏幕",screenUnread:"没读到屏幕,再刷新一次试试",screenContent:"屏幕内容",screenEmpty:"(屏幕是空的)"},...{uploadFailed:"图片没传上去",speechBlocked:"这里用不了语音识别(主屏幕上的网页可能不让用)。点输入框,用键盘上的麦克风说话。",speechDenied:"不能用语音识别。在 iPhone 的设置里允许这个网站使用麦克风和语音识别后再试。",speechStopped:"语音识别停了,再按住试一次。",speechErrors:{network:"语音识别要联网。看看网络,再按住试一次。","audio-capture":"麦克风用不了,可能被别的 App 占着。",interrupted:"听写被打断了,来电或别的 App 占了麦克风。",busy:"语音识别正忙,稍后再按住试一次。","speech-timeout":"好一会没听到声音,停止了听写。"},notHeard:"没听清",micJustOn:"麦克风刚打开,再按住说一次",speechUnavailable:"不能用语音识别",noLiveSpeech:"这个浏览器不支持实时语音",commands:"命令",snippet:e=>`常用语 ${e}`,snippets:"常用语",files:"文件",removeImage:"移除图片",uploading:"正在上传",input:"输入",placeholderSpeech:"发消息或按住说话…",placeholder:"发消息",stop:"停止",send:"发送",holdSend:"松开发送 · 滑到 ✕ 取消",holdSendSlide:"松开发送 · 上滑到 ✕ 取消 · 上滑到「转文字」转文字",holdCancel:"松开取消",holdText:"松开转文字",cancel:"取消",toText:"转文字",heardLabel:"语音转文字",recognizing:"正在识别…",openingMic:"正在打开麦克风",holdToTalk:"按住说话",photoLibrary:"照片图库",takePhoto:"拍照",photosAndVideos:"照片和视频",pickFile:"文件",largeVideo:(e,n)=>e===1?`这个视频有 ${n} MB`:`这 ${e} 个视频共 ${n} MB`,largeVideoSub:()=>"原样发要传一阵。压缩成 720p 会小很多,Claude 看的截图不受影响,但要在相册里再选一次。",sendAsIs:"原样发",sendSmaller:"压缩后发",attach:"添加照片、视频或文件",removeFile:"移除文件",fileUploadFailed:e=>`${e} 没传上去`,whatAndWhy:(e,n)=>`${e}:${n}`,cameraDenied:"WorkOffDesk 不能用相机。在设置里允许后再试。",speechDeniedApp:"WorkOffDesk 不能用麦克风或语音识别。在设置里两项都打开后再试。",speechOff:"现在用不了语音识别。看看 设置 › 通用 › 键盘 里的「听写」开着没有,网络通不通。",speechLanguage:"语音识别不支持这台手机设置的语言。",openSettings:"打开设置"},...{notConnectedSend:"还没连上 Mac,连上后再发一次",modeNotSwitched:"没切到那个模式,Claude 可能没开放它",switchingMode:"正在切换…",applying:"正在设置…",clipboardUnreadable:"读不到剪贴板。可以长按输入框粘贴。",endFailed:"没结束掉,连不上 Mac,稍后再点一次",notSentGiveBack:"没发出去,文字放回输入框了",alreadySent:"这条已经发出去了",takeBackFailed:"没拿回来,再试一次",deleteFailed:"没删掉,再试一次",notConnectedTap:"还没连上 Mac,连上后再点一次",notSentRetry:"没发出去,再试一次",backgroundOver:"那条命令已经跑完了",notBackgrounded:"没转到后台,再试一次",notMoved:"没移动,再试一次",notEnded:"没结束掉,再试一次",notRun:"没运行,再试一次",queueWhenStarted:e=>`${e} 启动好就按顺序发出`,queueWhenContinued:e=>`接着这个对话后,${e} 一启动好就按顺序发出`,queueAfterCompact:"压缩完按顺序自动发出",queueAfterWaiting:e=>`${e} 在等你确认,之后按顺序发出`,queueAfterTurn:e=>`${e} 做完手上这一步就会读到`,inAgentsQueue:e=>`${e} 排队中`,queueNow:"马上按顺序发出",renameSession:e=>`改名:${e}`,ending:"正在结束…",confirmEnd:"确认结束",end:"结束",shellSession:"这是 Mac 上的命令行会话",shellSessionSub:"手机上只看 Claude 的对话,这个会话在 Mac 上用",syncing:"同步中",reconnecting:"重连中…",reconnectingSub:"网络恢复后会自动接上,会话一直在 Mac 上跑着",sessionEnded:"会话已结束",updateReady:"有新版本",updateReadySub:"已下载好,下次打开 App 时生效",updateNow:"立即更新",reopenStuck:"App 没能马上重新打开",reopenStuckSub:"从屏幕底部上滑,把 WorkOffDesk 划掉再打开就好。",sessionEndedSub:"这个会话在 Mac 上已经退出了",startAnother:"重新开一个",agentQuit:e=>`${e} 已退出`,agentQuitSub:"「接着这个对话」接上原来的上下文;「重新开一个」在这个文件夹里开一段全新的对话",endedGoOnSub:"「接着这个对话」在这个会话里接着原来的上下文;「重新开一个」在这个文件夹里开一段全新的对话",continueConversation:"接着这个对话",continueFailed:"没接上",suggestion:"猜你接下来想发 · 点一下填进输入框",dismissSuggestion:"不要这条建议",macSession:"Mac 上的会话",notOnMac:"Mac 上已经没有这个对话了",readOnly:"只读",cannotRead:"读不到这个对话",subagent:"子 agent",openAlreadyOnPhone:"打开(已经在手机上开着)",inBackgroundNoResume:"在 Claude 后台会话里,这里不能续",openElsewhereNoResume:"开在别的 Codex 应用里,这里不能续",continueOnPhone:"在手机上接着聊",onMacIdle:"电脑上开着",onMacBusy:"电脑上在干活",onMacWaiting:"电脑上在等你确认",onMacBackground:"电脑上有后台命令在跑",openInTerminals:e=>`开了 ${e} 个`,takeOverNow:"接管到手机",folderGoneNoResume:"它的文件夹已经不在了,这里接不上",folderGoneSub:e=>`${e} 已经不在这台 Mac 上了(比如 worktree 被删掉了)。换个文件夹开一个新对话吧。`,takeOverWhenDone:"等这一步做完再接管",takeOverInterrupt:"立即接管(打断这一步)",takeOverStopsCommands:"接管后,这些后台命令会停掉。",takeOverDropsQuestion:"这个确认会作废,接上后让它重做这一步。",takeOverNote:e=>`电脑上的 ${e} 会退出,在手机上接着跑。`,backAtMac:"回到电脑上接着用:",takingOverWait:"等电脑上这一步做完…",takeOverCancel:"取消",takeOverMissed:"没接上,再点一次",startInTmuxHint:"在电脑上用 workoffdesk claude 或 workoffdesk codex 启动,就不用接管",continueOnMac:"在电脑上继续",continueOnMacSub:"在 Mac 的终端里运行:",renameAction:"改名",pin:"置顶",unpin:"取消置顶",pinFailed:"置顶没改成",busy:"运行中",needsYou:"等你确认",unread:"未读",sessions:"会话",chooseSession:"在左边选一个会话。",search:"搜索",noSessions:"还没有会话",noSessionsSub:"点右上角 ⊕,开一个 Shell 或 Claude。",noSessionsPhone:"点右上角 +,在一个项目里开 Claude。",sessionMenu:"会话操作",endSession:"结束会话",conversationsOnMac:"Mac 上的对话",noConversations:"Mac 上没有别的对话",deleteSessionTitle:"删除这个会话?",deleteSessionSub:"它的对话会从 WorkOffDesk 里删掉,Mac 上 Claude 或 Codex 自己的记录不受影响。",notFound:e=>`没有找到「${e}」`,endedSessions:"已结束",otherMacSessions:"Mac 上的其他会话",wrongPassword:"用户名或密码不对",loginNotKept:"登录成功了,但没能存到这台手机上,再试一次。",loginFailedOther:"登录没成功,再试一次。",tooManyTries:e=>`尝试太多次了,${e} 分钟后再试`,loginFailed:e=>`登录失败(${e})`,noServer:"连不上服务器,检查一下网络",noAnswer:"服务器没有回应,这一步可能做了,也可能没做。先看一眼再重试",unknownPasskey:"这个 Passkey 不认识。先用密码登录,再到「设置」里添加这台设备。",tagline:"在手机上接着用 Mac 上的 Claude",faceId:"用 Face ID 登录",orPassword:"或者用密码",username:"用户名",password:"密码",login:"登录",serverAddress:"服务器地址",serverAddressHint:"在浏览器里打开 WorkOffDesk 的地址,比如 https://workoffdesk.example.com",badServerAddress:"这不是一个网址"},...{textSize:"文字大小",wholeApp:"整个 App 的字",thisDeviceOnly:"只改这台设备",smaller:"文字减小",larger:"文字加大",textPreview:"Claude 的回复、你发的消息和列表,都按这个大小显示。",appearance:"外观",theme:"主题",followSystem:"跟随系统",themeLight:"浅色",themeDark:"深色",themeEye:"护眼",listGrouping:"会话列表",groupByProject:"按项目分组",notGrouped:"不分组",language:"语言",languageRestarts:"选好后 App 会重新打开,换成这个语言。",snippetsLines:"常用语,一行一条",snippetsPlaceholder:`一行一条,例如:
|
|
5
5
|
继续
|
|
6
6
|
跑一下 lint 和类型检查
|
|
7
|
-
把改动提交了`,snippetsNote:"输入框里打 / 时排在最前面,点一下整句放进去。只存在这台设备上。",pushInsecure:"推送需要通过 https 打开这个网站(例如你的正式域名)。",pushUnsupported:"这个浏览器不支持推送。iPhone 上要先在 Safari 里「分享 → 添加到主屏幕」,再从主屏幕打开。",pushDenied:"通知权限被拒绝了,要到系统设置里给这个网站打开通知。",failed:"没成功",passkeyNone:"还没有 Passkey。添加后可以用 Face ID 直接登录。",passkeyNoneOnPhone:"还没有 Passkey。在网页版的「设置」里添加后,就能在网页上用 Face ID 登录。",pushAppUnready:"这台 Mac 还推送不到 iPhone App:服务器需要一把 Apple 推送密钥(~/.workoffdesk 里的 apns.json)。",pushAppDenied:"WorkOffDesk 的通知被关掉了,要到 iPhone「设置」→ WorkOffDesk →「通知」里打开。",addedAgo:e=>`添加于 ${e}`,lastUsedAgo:e=>` · 上次使用 ${e}`,passkeysTitle:"通行密钥(Passkey)",addPasskey:"添加这台设备的 Passkey",loggedIn:"已登录的设备",thisDevice:"这台设备",loginBy:(e,
|
|
8
|
-
${
|
|
7
|
+
把改动提交了`,snippetsNote:"输入框里打 / 时排在最前面,点一下整句放进去。只存在这台设备上。",pushInsecure:"推送需要通过 https 打开这个网站(例如你的正式域名)。",pushUnsupported:"这个浏览器不支持推送。iPhone 上要先在 Safari 里「分享 → 添加到主屏幕」,再从主屏幕打开。",pushDenied:"通知权限被拒绝了,要到系统设置里给这个网站打开通知。",failed:"没成功",passkeyNone:"还没有 Passkey。添加后可以用 Face ID 直接登录。",passkeyNoneOnPhone:"还没有 Passkey。在网页版的「设置」里添加后,就能在网页上用 Face ID 登录。",pushAppUnready:"这台 Mac 还推送不到 iPhone App:服务器需要一把 Apple 推送密钥(~/.workoffdesk 里的 apns.json)。",pushAppDenied:"WorkOffDesk 的通知被关掉了,要到 iPhone「设置」→ WorkOffDesk →「通知」里打开。",addedAgo:e=>`添加于 ${e}`,lastUsedAgo:e=>` · 上次使用 ${e}`,passkeysTitle:"通行密钥(Passkey)",addPasskey:"添加这台设备的 Passkey",loggedIn:"已登录的设备",thisDevice:"这台设备",loginBy:(e,n)=>`${e?"Passkey":"密码"}登录 · 最近活动 ${n}`,revoke:"吊销",confirmDelete:"确认删除",confirmRevoke:"确认吊销",pushTitle:"推送通知",pushRemind:"Claude 需要你时提醒我",pushRemindSub:"等你确认、或一轮做完时推送到这台设备",logOut:"退出登录",addAccount:"添加账号",addAccountTagline:"登录另一个账号或服务器",signInAgainTagline:"这个账号在它的 Mac 上已失效,请重新登录",removeAccount:"移除",confirmRemoveAccount:"从这台手机移除",account:"账号",appRelease:e=>e?`App 当前版本 ${e}`:"App 当前版本:随安装包",thisMac:"这台 Mac",thisMacSub:"检查、版本、重启",macAllGood:"一切正常",macProblemCount:e=>`有 ${e} 个问题`,macChecks:"检查",checkNames:{macos:"macOS",node:"Node.js",tmux:"tmux",claude:"Claude Code",codex:"Codex",setup:"账号",service:"服务",origin:"地址",sleep:"防休眠",apns:"iPhone 通知"},macFixTap:"点一下复制",macCheckPassed:"通过",macCheckFailed:"没通过",macVersion:"版本",macBuiltFrom:(e,n)=>`构建自 ${e}${n?"(含未提交的改动)":""}`,macServingSince:e=>`${e}开始上线`,macReleases:"保留的版本",macRunning:"运行中",macActions:"服务",macRestart:"重启服务",macRestartNote:"会话不会断;页面会自己连回来。",macRestartConfirm:"现在重启",macRestartShort:"重启",macRollbackShort:"回退",macRollbackSure:"确定?",macPassed:e=>`另外 ${e} 项正常`,macAllPassed:e=>`${e} 项检查全部通过`,macRollback:e=>`回退到 ${e}`,macNoRollback:"没有保留更早的版本可以回退。",macNotManaged:"这个服务是手动起的(workoffdesk serve),不是作为后台服务运行的,所以这里不能重启它。",macRestarting:"正在重启…",macRollingBack:"正在回退…",macRestarted:"已重启",macRolledBack:"已回退",macNoReturn:"一分钟了 Mac 还没回来。去 Mac 上看看,或者在那里运行 workoffdesk doctor。",macProblems:"最近的警告和错误",macNoProblems:"最近没出过问题。",macLogNote:"完整日志在 Mac 上 ~/.workoffdesk 的 logs 文件夹里。",macClaudeAccounts:"Claude 账号",macAccountNote:"新会话用打勾的账号开;开着的会话不变,除非搬过去。",macElsewhere:e=>`${e} 个开着的会话还在别的账号上`,macMoveTo:e=>`搬到 ${e},从停下的地方接着跑。`,macMoveButton:"搬过去",macMovingSessions:e=>`正在搬 ${e} 个会话`,macMovingTo:e=>`正在搬到 ${e}:空闲的马上搬,正在回复的等这轮完了再搬。`,accountSignedOut:"已退出登录",accountNotReady:"先在终端里用它打开一次 Claude Code",accountApart:"它的对话没有和这台 Mac 的共用",accountNotSeen:"还没看到它的用量",limitReset:"已重置",claudeAccountLine:"账号"},...{setupTitle:"设置 WorkOffDesk",setupSub:"在这台 Mac 上设一次,之后就用手机。",setupSteps:{checks:"这台 Mac",account:"账号",address:"地址",service:"服务",phone:"手机"},setupChange:"修改",setupContinue:"继续",setupCheckAgain:"再检查一次",setupChecksNote:"WorkOffDesk 在这台 Mac 上需要的东西。",setupChecksFix:"在终端里运行这些命令,然后再检查一次。",setupChecksOk:"这台 Mac 需要的都有了。",setupAccountNote:"手机登录用的用户名和密码。",setupAccountHave:e=>`已有账号:${e}`,setupKeep:"保留",setupReplace:"换一个",setupReplaceNote:"换账号会让所有设备退出登录。",setupPasswordRule:e=>`至少 ${e} 个字符`,setupPasswordAgain:"再输一次密码",setupPasswordsDiffer:"两次输入的密码不一样",setupSaveAccount:"保存账号",setupAddressNote:"手机打开的 HTTPS 地址,手机在哪儿都能连上。",setupAddressNow:e=>`当前:${e}`,setupTailscale:"Tailscale",setupTailscaleUse:e=>`https://${e},只有你自己的设备能访问`,setupTailscaleDown:"Tailscale 装了但没在运行。打开它并登录,然后再检查一次。",setupCloudflare:"Cloudflare 隧道",setupCloudflareNote:"用你域名下的一个主机名,走你建好的隧道。",setupTunnel:"隧道",setupHostname:"主机名",setupOther:"其他地址",setupOtherNote:e=>`任何能连到这台 Mac ${e} 端口的 HTTPS 地址。`,setupNoWayIn:"最省事的连法:这台 Mac 和手机都装上 Tailscale。装好后再检查一次。",setupUseAddress:"用这个地址",setupServiceNote:"WorkOffDesk 作为服务运行,登录这台 Mac 时自动启动。",setupInstall:"安装并启动",setupInstalling:"正在启动,可能要半分钟。",setupPhoneNote:e=>`用手机相机对准这个码,然后用 ${e} 登录。`,setupFinish:"完成",setupFinished:"都设好了。可以关掉这个页面了。",setupNoToken:"请从终端里 workoffdesk setup --web 打印的地址打开这个页面。再运行一次会打印新地址。",setupGone:"设置已经结束了。再运行一次 workoffdesk setup --web。"}};function p(e){for(const n of e){if(/^zh\b/i.test(n))return"zh";if(/^en\b/i.test(n))return"en"}return"en"}const r=((l=globalThis.navigator)==null?void 0:l.languages)??[Intl.DateTimeFormat().resolvedOptions().locale],s=globalThis.workoffdeskLanguage,c=s==="zh"||s==="en"?s:p(r);r[0];const d=c==="zh"?h:u,o=self;o.addEventListener("install",()=>void o.skipWaiting()),o.addEventListener("activate",e=>e.waitUntil(o.clients.claim())),o.addEventListener("push",e=>{var t,a;let n={};try{n=((t=e.data)==null?void 0:t.json())??{}}catch{n={body:(a=e.data)==null?void 0:a.text()}}e.waitUntil(o.registration.showNotification(n.title??"WorkOffDesk",{body:n.event==="waiting"||n.event==="idle"?g(n.event,n.said):n.body,tag:n.tag,icon:"/icon-192.png",badge:"/icon-192.png",data:{url:n.url??"/"}}))});const g=(e,n="")=>n?e==="waiting"?`${d.push.waiting}
|
|
8
|
+
${n}`:n:d.push[e];o.addEventListener("notificationclick",e=>{var t;e.notification.close();const n=((t=e.notification.data)==null?void 0:t.url)??"/";e.waitUntil((async()=>{const i=(await o.clients.matchAll({type:"window",includeUncontrolled:!0}))[0];return i?(i.postMessage({type:"open",url:n}),i.focus()):o.clients.openWindow(n)})())})})();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "workoffdesk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Your Mac's Claude Code and Codex sessions, on your phone: chat, answer prompts, pick up where the terminal left off. Self-hosted, no account.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|
|
@@ -73,7 +73,7 @@
|
|
|
73
73
|
"tsx": "4.23.13",
|
|
74
74
|
"typescript": "5.9.3",
|
|
75
75
|
"typescript-eslint": "^8.56.1",
|
|
76
|
-
"vitest": "
|
|
77
|
-
"ws": "8.
|
|
76
|
+
"vitest": "4.1.11",
|
|
77
|
+
"ws": "8.22.0"
|
|
78
78
|
}
|
|
79
79
|
}
|