@songsid/agend 2.2.0-beta.4 → 2.2.0-beta.6

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.
Files changed (116) hide show
  1. package/dist/backend/claude-carry.d.ts +22 -0
  2. package/dist/backend/claude-carry.js +170 -0
  3. package/dist/backend/claude-carry.js.map +1 -0
  4. package/dist/backend/claude-code.d.ts +23 -0
  5. package/dist/backend/claude-code.js +102 -2
  6. package/dist/backend/claude-code.js.map +1 -1
  7. package/dist/backend/credential-profile.d.ts +7 -0
  8. package/dist/backend/credential-profile.js +7 -1
  9. package/dist/backend/credential-profile.js.map +1 -1
  10. package/dist/backend/kiro.js +5 -2
  11. package/dist/backend/kiro.js.map +1 -1
  12. package/dist/backend/muse.d.ts +41 -0
  13. package/dist/backend/muse.js +239 -44
  14. package/dist/backend/muse.js.map +1 -1
  15. package/dist/backend/types.d.ts +7 -0
  16. package/dist/backend/types.js.map +1 -1
  17. package/dist/background-work-ended.d.ts +18 -0
  18. package/dist/background-work-ended.js +30 -0
  19. package/dist/background-work-ended.js.map +1 -0
  20. package/dist/channel/adapters/telegram.d.ts +4 -5
  21. package/dist/channel/adapters/telegram.js +33 -17
  22. package/dist/channel/adapters/telegram.js.map +1 -1
  23. package/dist/channel/message-edit-errors.d.ts +5 -0
  24. package/dist/channel/message-edit-errors.js +24 -0
  25. package/dist/channel/message-edit-errors.js.map +1 -0
  26. package/dist/cli.js +60 -10
  27. package/dist/cli.js.map +1 -1
  28. package/dist/config-validator.js +3 -0
  29. package/dist/config-validator.js.map +1 -1
  30. package/dist/daemon.js +41 -0
  31. package/dist/daemon.js.map +1 -1
  32. package/dist/fleet-context.d.ts +4 -1
  33. package/dist/fleet-manager.d.ts +112 -5
  34. package/dist/fleet-manager.js +516 -52
  35. package/dist/fleet-manager.js.map +1 -1
  36. package/dist/general-knowledge/skills/credential-profiles/SKILL.md +44 -9
  37. package/dist/locale.js +18 -2
  38. package/dist/locale.js.map +1 -1
  39. package/dist/needs-you-hub.js +2 -0
  40. package/dist/needs-you-hub.js.map +1 -1
  41. package/dist/needs-you-live.d.ts +6 -0
  42. package/dist/needs-you-live.js +23 -3
  43. package/dist/needs-you-live.js.map +1 -1
  44. package/dist/outbound-handlers.d.ts +7 -0
  45. package/dist/outbound-handlers.js +19 -10
  46. package/dist/outbound-handlers.js.map +1 -1
  47. package/dist/public-preview.d.ts +100 -0
  48. package/dist/public-preview.js +233 -0
  49. package/dist/public-preview.js.map +1 -0
  50. package/dist/public-web-gateway.js +4 -3
  51. package/dist/public-web-gateway.js.map +1 -1
  52. package/dist/public-web-link.d.ts +20 -0
  53. package/dist/public-web-link.js +26 -1
  54. package/dist/public-web-link.js.map +1 -1
  55. package/dist/restart-progress.d.ts +33 -0
  56. package/dist/restart-progress.js +30 -0
  57. package/dist/restart-progress.js.map +1 -1
  58. package/dist/service-installer.d.ts +31 -0
  59. package/dist/service-installer.js +41 -2
  60. package/dist/service-installer.js.map +1 -1
  61. package/dist/topic-commands.js +3 -1
  62. package/dist/topic-commands.js.map +1 -1
  63. package/dist/tunnel/purpose-lane.d.ts +5 -1
  64. package/dist/tunnel/purpose-lane.js +14 -7
  65. package/dist/tunnel/purpose-lane.js.map +1 -1
  66. package/dist/types.d.ts +6 -0
  67. package/dist/ui/chat-strings.js +14 -2
  68. package/dist/ui/chat-thread.js +2 -2
  69. package/dist/ui/panel-chat.js +9 -2
  70. package/dist/ui/panel-fleet.js +148 -35
  71. package/dist/ui/panel-needs.js +4 -3
  72. package/dist/ui/panel-settings.js +1 -1
  73. package/dist/ui/preview-status.js +28 -0
  74. package/dist/ui/preview.js +35 -2
  75. package/dist/ui/shared/app-i18n.js +4 -0
  76. package/dist/ui/shared/app-prefs.js +1 -0
  77. package/dist/ui/shared/app-shell.js +146 -2
  78. package/dist/ui/shared/app-stream.js +21 -4
  79. package/dist/ui/shared/app.css +41 -15
  80. package/dist/ui/shared/instance-nav.js +47 -16
  81. package/dist/ui/shared/usage-dialog.js +10 -1
  82. package/dist/ui/shared/view-strings.js +4 -0
  83. package/dist/update-install.d.ts +13 -1
  84. package/dist/update-install.js +16 -4
  85. package/dist/update-install.js.map +1 -1
  86. package/dist/update-marker.d.ts +51 -0
  87. package/dist/update-marker.js +61 -0
  88. package/dist/update-marker.js.map +1 -1
  89. package/dist/usage/i18n-keys.d.ts +1 -1
  90. package/dist/usage/i18n-keys.js +1 -1
  91. package/dist/usage/i18n-keys.js.map +1 -1
  92. package/dist/usage/providers.d.ts +34 -5
  93. package/dist/usage/providers.js +160 -27
  94. package/dist/usage/providers.js.map +1 -1
  95. package/dist/usage/statusline-usage.d.ts +6 -2
  96. package/dist/usage/statusline-usage.js +10 -4
  97. package/dist/usage/statusline-usage.js.map +1 -1
  98. package/dist/web-api.d.ts +20 -1
  99. package/dist/web-api.js +101 -13
  100. package/dist/web-api.js.map +1 -1
  101. package/dist/web-auth.js +2 -1
  102. package/dist/web-auth.js.map +1 -1
  103. package/dist/web-prefs.js +2 -0
  104. package/dist/web-prefs.js.map +1 -1
  105. package/dist/web-preview.d.ts +14 -1
  106. package/dist/web-preview.js +35 -13
  107. package/dist/web-preview.js.map +1 -1
  108. package/dist/web-schedules.d.ts +12 -0
  109. package/dist/web-schedules.js +34 -0
  110. package/dist/web-schedules.js.map +1 -0
  111. package/dist/web-server-drain.d.ts +10 -0
  112. package/dist/web-server-drain.js +50 -0
  113. package/dist/web-server-drain.js.map +1 -0
  114. package/package.json +1 -1
  115. package/templates/launchd.plist.ejs +3 -1
  116. package/templates/systemd.service.ejs +2 -1
@@ -36,7 +36,7 @@ const POLL_LIMIT_MS = 10000; // a poll that has not answered by the
36
36
  const MAX_OVERFLOW_READS = 3; // reads again after dropped live events, within one catch-up
37
37
  // #1580: the reconnect backoff — step n waits min(cap, base·2ⁿ), drawn from 50–100 % of that (jitter: tabs that lost
38
38
  // the fleet together do not come back together).
39
- export const RECONNECT = { baseMs: 1000, capMs: 30000 };
39
+ export const RECONNECT = { baseMs: 1000, capMs: 30000, shutdownMs: 10000 };
40
40
  export function reconnectDelay(step, random = Math.random) {
41
41
  const full = Math.min(RECONNECT.capMs, RECONNECT.baseMs * 2 ** Math.min(step, 20));
42
42
  return Math.round(full * (0.5 + random() * 0.5));
@@ -49,6 +49,7 @@ export function createStream(opts) {
49
49
  let sse = null, pollTimer = null, silentTimer = null, closed = false, started = false;
50
50
  // #1580: the reconnect step waiting, how many failed in a row, a step waiting for the tab to be shown, a page that left.
51
51
  let reconnectTimer = null, attempts = 0, waitingVisible = false, suspended = false, ended = false, retryAt = 0;
52
+ let shutdownUntil = 0; // monotonic; retained through pagehide/pageshow
52
53
  const random = typeof env.random === "function" ? env.random : Math.random;
53
54
  const doc = env.document || null;
54
55
  const hidden = () => !!(doc && doc.hidden);
@@ -188,6 +189,18 @@ export function createStream(opts) {
188
189
  const es = sse = new env.EventSource("/ui/events");
189
190
  let spoke = false;
190
191
  silentTimer = env.setTimeout(startPolling, 15000); // the server sends a status frame the moment a stream opens
192
+ es.addEventListener("shutdown", (e) => {
193
+ if (es !== sse || closed || suspended || ended) return;
194
+ let data;
195
+ try { data = JSON.parse(e.data); } catch { return; }
196
+ if (data?.retry_ms !== RECONNECT.shutdownMs) return;
197
+ shutdownUntil = now() + RECONNECT.shutdownMs + Math.round(random() * 5000);
198
+ cancelWork(); closeStream(); stopPolling();
199
+ env.clearTimeout(reconnectTimer); reconnectTimer = null; waitingVisible = false;
200
+ attempts = Math.max(attempts, 4);
201
+ setConnection("reconnecting");
202
+ scheduleStep(shutdownUntil - now());
203
+ });
191
204
  for (const name of EVENTS) {
192
205
  es.addEventListener(name, (e) => {
193
206
  if (es !== sse) return; // a stream this page already let go of
@@ -216,15 +229,16 @@ export function createStream(opts) {
216
229
  else setConnection("reconnecting");
217
230
  scheduleStep();
218
231
  }
219
- function scheduleStep() {
232
+ function scheduleStep(delay) {
220
233
  if (reconnectTimer || closed || suspended || ended) return;
221
- const ms = reconnectDelay(attempts++, random);
234
+ const ms = Math.max(delay ?? reconnectDelay(attempts++, random), shutdownUntil - now());
222
235
  retryAt = now() + ms;
223
236
  emit("retry", { inMs: ms });
224
237
  reconnectTimer = env.setTimeout(() => { reconnectTimer = null; step(); }, ms);
225
238
  }
226
239
  function step() {
227
240
  if (closed || suspended || ended) return;
241
+ if (shutdownUntil > now()) { scheduleStep(shutdownUntil - now()); return; }
228
242
  if (hidden()) { waitingVisible = true; return; } // not while nobody looks: the next step waits to be shown
229
243
  if (opts.transport === "poll") { pollProbe(); return; }
230
244
  openStream(true);
@@ -255,7 +269,7 @@ export function createStream(opts) {
255
269
  * It opens no transport: still the one EventSource, and no polling loop.
256
270
  */
257
271
  function catchUp() {
258
- if (closed || ended) return Promise.resolve(false);
272
+ if (closed || ended || shutdownUntil > now()) return Promise.resolve(false);
259
273
  if (catching) return catching;
260
274
  env.clearTimeout(retryTimer); retryTimer = null;
261
275
  setHydration("catching");
@@ -327,6 +341,9 @@ export function createStream(opts) {
327
341
  if (closed || !suspended || ended) return;
328
342
  suspended = false;
329
343
  epoch++;
344
+ if (shutdownUntil > now()) {
345
+ setConnection("reconnecting"); scheduleStep(shutdownUntil - now()); return;
346
+ }
330
347
  attempts = 0;
331
348
  if (opts.transport === "poll") { startPolling(); return; }
332
349
  openStream(true);
@@ -68,6 +68,7 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
68
68
 
69
69
  .sidebar {
70
70
  width: var(--sidebar-w); flex-shrink: 0; display: flex; flex-direction: column; background: var(--bg-sidebar);
71
+ position: relative; /* #1722: the resize handle sits on its right edge (the width above: tokens.css, or this device's) */
71
72
  padding: env(safe-area-inset-top) 0 env(safe-area-inset-bottom) env(safe-area-inset-left);
72
73
  }
73
74
  .sb-collapsed .sidebar { display: none; }
@@ -112,18 +113,23 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
112
113
  .av.ring { box-shadow: 0 0 0 2px var(--ring, transparent); }
113
114
  .av-text { overflow: hidden; }
114
115
  .av .av-dot { position: absolute; right: -2px; bottom: -2px; margin: 0; box-shadow: 0 0 0 2px var(--bg-sidebar); }
116
+ /* #1722: the CLI as a letter on the avatar's top-left corner — monochrome (the #1630 ring keeps the colour), cut out like the dot */
117
+ .av-cli { position: absolute; left: -4px; top: -4px; width: 14px; height: 14px; border-radius: 50%; box-sizing: border-box;
118
+ background: var(--surface); border: 1px solid var(--border-strong); box-shadow: 0 0 0 1.5px var(--bg-sidebar);
119
+ color: var(--text-2); font-size: 9px; line-height: 12px; font-weight: var(--fw-semibold); text-align: center; pointer-events: auto; }
120
+ .inst.active .av .av-cli, .inst:hover .av .av-cli { box-shadow: 0 0 0 1.5px var(--surface-2); }
115
121
  .inst.active .av .av-dot, .inst:hover .av .av-dot { box-shadow: 0 0 0 2px var(--surface-2); }
116
122
  .dot.hollow { background: transparent; border: 1.5px solid var(--text-3); }
117
123
  /* On a grey avatar a grey dot needs more contrast: stopped is a stronger grey, paused a clear ring around the sidebar colour. */
118
124
  .av .av-dot.off { background: var(--text-2); }
119
125
  .av .av-dot.hollow { box-sizing: border-box; width: 10px; height: 10px; background: var(--bg-sidebar); border: 2.5px solid var(--text-2); }
120
126
  .inst .av { margin-top: 1px; }
121
- .inst-id { font-family: var(--font-mono); }
122
127
  .inst-text { flex: 1; min-width: 0; display: flex; flex-direction: column; }
123
128
  .inst-name { font-size: var(--fs-sm); line-height: var(--lh-md); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
129
+ /* #1722: the other name, under the one that leads — smaller, muted, truncated on its own */
130
+ .inst-alt { font-size: var(--fs-xs); line-height: var(--lh-xs); color: var(--text-3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
124
131
  .inst.active .inst-name { font-weight: var(--fw-semibold); }
125
132
  .inst-sub { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-1) var(--s-2); }
126
- .inst-alias { font-size: var(--fs-xs); line-height: var(--lh-xs); color: var(--text-3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; max-width: 100%; }
127
133
  .badge-await {
128
134
  flex-shrink: 0; font-size: 11px; line-height: 16px; font-weight: var(--fw-semibold); padding: 0 var(--s-2); border-radius: var(--r-full);
129
135
  background: var(--warn-bg); color: var(--warn); border: 1px solid var(--warn-line); white-space: nowrap;
@@ -307,6 +313,16 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
307
313
  .pill.open { background: var(--accent-dim); color: var(--accent); }
308
314
  .pill.claimed { background: var(--warn-bg); color: var(--warn); }
309
315
  .pill.done { color: var(--ok); }
316
+ /* #1724: a disabled schedule — its own look (not the green of "done"): a dashed, muted badge and a dimmed row */
317
+ .pill.off { background: transparent; color: var(--text-3); border: 1px dashed var(--border-strong); }
318
+ .row-item.is-off { opacity: 0.62; }
319
+ .row-item.sched { flex-wrap: nowrap; }
320
+ .row-item.sched .sched-text { display: flex; flex-direction: column; flex: 1; min-width: 0; gap: 2px; }
321
+ .sched-actions { display: inline-flex; flex: none; gap: var(--s-1); }
322
+ .sched-title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
323
+ .sched-sub { font-size: var(--fs-xs); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
324
+ @media (max-width: 899px) { .sched-sub { white-space: normal; } } /* a phone: the run time wraps rather than being cut */
325
+ .sched-mode { margin-bottom: var(--s-2); }
310
326
  .save-row { display: flex; align-items: center; gap: var(--s-3); flex-wrap: wrap; }
311
327
 
312
328
  /* ── Chat ── */
@@ -315,17 +331,21 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
315
331
  .msg { font-size: var(--fs-md); line-height: var(--lh-md); overflow-wrap: anywhere; min-width: 0; }
316
332
  .msg .meta { display: flex; align-items: baseline; gap: var(--s-2); font-size: var(--fs-xs); color: var(--text-3); margin-bottom: var(--s-1); }
317
333
  .msg .sender { font-weight: var(--fw-semibold); color: var(--text-2); }
318
- .msg .time { font-family: var(--font-mono); }
334
+ /* The time never wraps or gives up its width to a long neighbour: a flex child shrinks to its min-content, and with
335
+ the message's overflow-wrap: anywhere that is one character wide (the #1672 status line's time, one glyph per line). */
336
+ .msg .time { font-family: var(--font-mono); white-space: nowrap; flex: none; }
319
337
  .msg.user { align-self: flex-end; max-width: min(80%, 620px); }
320
338
  .msg.user .meta { justify-content: flex-end; }
321
339
  .msg.user .body { background: var(--user-bubble); border-radius: var(--r-xl); padding: 10px var(--s-4); }
322
340
  .msg.agent { align-self: stretch; }
323
- /* #1672: a status line (another instance's message, a daemon notice): muted plain text, no bubble; a long one folds. */
324
- .msg.status { align-self: stretch; font-size: var(--fs-sm); color: var(--text-3); }
325
- .msg.status .st-text { white-space: pre-wrap; border-left: 2px solid var(--border); padding-left: var(--s-3); }
326
- .msg.status.folded .st-text { max-height: 9em; overflow: hidden; mask-image: linear-gradient(to bottom, #000 60%, transparent); -webkit-mask-image: linear-gradient(to bottom, #000 60%, transparent); }
327
- .msg.status .st-more { border: 0; background: none; color: var(--text-2); cursor: pointer; font-size: var(--fs-xs); padding: var(--s-1) 0 0 var(--s-3); }
328
- .msg.status .st-more:hover { color: var(--text); }
341
+ /* #1672: a status line (another instance's message, a daemon notice): muted plain text, no bubble; a long one folds.
342
+ Its class is `status-line`, never `status`: that is the header's inline-flex badge class, and on a message it turned
343
+ the meta, body and tools into one flex row. */
344
+ .msg.status-line { align-self: stretch; font-size: var(--fs-sm); color: var(--text-3); }
345
+ .msg.status-line .st-text { white-space: pre-wrap; border-left: 2px solid var(--border); padding-left: var(--s-3); }
346
+ .msg.status-line.folded .st-text { max-height: 9em; overflow: hidden; mask-image: linear-gradient(to bottom, #000 60%, transparent); -webkit-mask-image: linear-gradient(to bottom, #000 60%, transparent); }
347
+ .msg.status-line .st-more { border: 0; background: none; color: var(--text-2); cursor: pointer; font-size: var(--fs-xs); padding: var(--s-1) 0 0 var(--s-3); }
348
+ .msg.status-line .st-more:hover { color: var(--text); }
329
349
  .msg-tools { display: flex; gap: var(--s-1); margin-top: var(--s-1); opacity: 0; transition: opacity var(--t-fast); }
330
350
  .msg:hover .msg-tools, .msg:focus-within .msg-tools { opacity: 1; }
331
351
  @media (hover: none) { .msg-tools { opacity: 1; } }
@@ -611,13 +631,16 @@ html.lb-open .scroller { overflow: hidden; }
611
631
  @media (hover: hover) { .inst-nav:not(.fav-editing) .v-li:hover .inst-star, .inst-nav:not(.fav-editing) .v-li:focus-within .inst-star { visibility: visible; } }
612
632
  @media (hover: none) { .inst-nav:not(.fav-editing) .inst-star { display: none; } }
613
633
  /* Edit: room for ↑ ↓ ☆ — the context and CLI marks step aside so the name keeps its width. */
614
- .fav-editing .v-li .v-meta, .fav-editing .v-li .cli-icon { display: none; }
634
+ .fav-editing .v-li .v-meta { display: none; }
615
635
  @media (max-width: 899px) { .fav-editing .inst-star, .fav-editing .inst-move { width: 36px; height: 36px; } }
616
636
  .v-inst .dot { margin-top: 0; }
617
637
  .v-meta { color: var(--text-3); font-size: var(--fs-xs); font-variant-numeric: tabular-nums; }
618
- .cli-icon { width: 10px; height: 10px; flex: 0 0 10px; border-radius: 50%; border: 1px solid var(--border-strong); }
619
- .cli-claude-code { background: #c678dd; } .cli-kiro-cli { background: #58a6ff; } .cli-codex { background: #3fb950; }
620
- .cli-grok { background: #0d1117; border-color: #f0f6fc; } .cli-antigravity { background: #f85149; } .cli-opencode { background: #f0f6fc; } .cli-other { background: #6e7681; }
638
+ /* #1722: the sidebar's width — a separator on its right edge (drag, arrows, Home/End, double-click resets); not on a phone */
639
+ .side-resize { position: absolute; top: 0; right: -3px; width: 6px; height: 100%; z-index: 5; cursor: col-resize; touch-action: none; }
640
+ .side-resize:hover, .side-resize:focus-visible, .side-resize.dragging { background: var(--accent-dim, var(--border-strong)); }
641
+ .side-resize:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
642
+ body.side-resizing, body.side-resizing * { cursor: col-resize !important; user-select: none; }
643
+ @media (max-width: 899px) { .side-resize { display: none; } }
621
644
  .dragging { opacity: 0.4; }
622
645
  .drop-before { box-shadow: inset 0 2px 0 var(--accent); }
623
646
  .drop-after { box-shadow: inset 0 -2px 0 var(--accent); }
@@ -667,8 +690,11 @@ html.lb-open .scroller { overflow: hidden; }
667
690
  .help-list { list-style: disc; padding-left: var(--s-5); display: flex; flex-direction: column; gap: var(--s-2); font-size: var(--fs-sm); }
668
691
  .err { color: var(--danger); font-size: var(--fs-sm); }
669
692
  .u-provider { padding: var(--s-3) var(--s-4); border-radius: var(--r-md); background: var(--surface); display: flex; flex-direction: column; gap: var(--s-2); }
670
- .u-head { display: flex; align-items: center; gap: var(--s-2); }
671
- .u-order { margin-left: auto; display: flex; gap: 2px; }
693
+ .u-head { display: flex; align-items: center; gap: var(--s-2); min-width: 0; }
694
+ /* #1749: one line beside ↑↓ — the name gives way first, then the plan badge (each with an ellipsis); ↑↓ never wrap. */
695
+ .u-head strong { min-width: 0; flex: 0 1 auto; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
696
+ .u-plan { min-width: 0; flex: none; max-width: 55%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
697
+ .u-order { margin-left: auto; display: flex; gap: 2px; flex: none; }
672
698
  .u-order .icon-btn { width: 28px; height: 28px; }
673
699
  .u-order .icon-btn:disabled { opacity: 0.3; }
674
700
  .u-metric { display: flex; flex-direction: column; gap: var(--s-1); }
@@ -174,7 +174,10 @@ function moveIn(arr, moving, target, before) {
174
174
  /** The list's state for the page's life: this browser's order, folded groups and filter (each also kept in storage). */
175
175
  export const navStore = createStore({ order: readOrder(), collapsed: readCollapsed(), filter: readFilter(), favorites: readFavorites() });
176
176
  /** Read them again from this browser's storage — what a page load does (the store above is made that way). */
177
- export function loadNavPrefs() { navStore.set({ order: readOrder(), collapsed: readCollapsed(), filter: readFilter(), favorites: readFavorites() }); }
177
+ export function loadNavPrefs() {
178
+ navStore.set({ order: readOrder(), collapsed: readCollapsed(), filter: readFilter(), favorites: readFavorites() });
179
+ namesStore.set({ primary: readNamesPrimary() });
180
+ }
178
181
  /** Change the filter ({ q?, status?, cli? }): the same on every page, and kept by this browser. */
179
182
  export function setNavFilter(patch) {
180
183
  const filter = { ...navStore.get().filter, ...patch };
@@ -245,6 +248,35 @@ export function labelOf(it) {
245
248
  const d = it && typeof it.display_name === "string" ? it.display_name.trim() : "";
246
249
  return d || nameOf(it);
247
250
  }
251
+
252
+ // ── #1722: both names — which one leads is a synced preference (#1665 "names.primary", default the nickname) ──
253
+ const NAMES_KEY = "agend_names_primary";
254
+ function readNamesPrimary() {
255
+ const p = prefInForce("names.primary");
256
+ const v = p ? p.value : stored(NAMES_KEY);
257
+ return v === "instance" ? "instance" : "nickname";
258
+ }
259
+ /** { primary: "nickname" | "instance" } — every surface that names an instance (sidebar, chat header, Needs you) reads it. */
260
+ export const namesStore = createStore({ primary: readNamesPrimary() });
261
+ export function setNamesPrimary(value) {
262
+ const primary = value === "instance" ? "instance" : "nickname";
263
+ namesStore.set({ primary });
264
+ savePref("names.primary", primary);
265
+ }
266
+ onPrefsChanged((keys) => { if (keys.has("names.primary")) namesStore.set({ primary: readNamesPrimary() }); });
267
+ /**
268
+ * An instance's two names as the web shows them: the one leading (`primary`) and the other (`secondary`), or "" when
269
+ * there is no other — no nickname, or a nickname that is the instance name itself (one line).
270
+ */
271
+ export function namesOf(it, primary = namesStore.get().primary) {
272
+ const real = nameOf(it);
273
+ const nick = it && typeof it.display_name === "string" ? it.display_name.trim() : "";
274
+ if (!nick || nick === real) return { primary: real, secondary: "" };
275
+ return primary === "instance" ? { primary: real, secondary: nick } : { primary: nick, secondary: real };
276
+ }
277
+
278
+ /** #1722: the CLI on the avatar's corner — a letter, so it reads without colour (its name is in the row's text too). */
279
+ const CLI_MONOGRAM = { "claude-code": "C", codex: "X", "kiro-cli": "K", grok: "G", antigravity: "A", opencode: "O", muse: "M" };
248
280
  // One path segment under /ui/img/<kind>/ — no further slash or backslash, and not a dot segment ("." / ".." or their
249
281
  // %2e spellings, which a browser resolves too): the picture can only ever be one of those routes (#1642 review).
250
282
  const sameOrigin = (src) => typeof src === "string"
@@ -255,7 +287,8 @@ export function avatarOf(it) {
255
287
  if (a && a.kind === "image" && sameOrigin(a.src)) return { kind: "image", src: a.src };
256
288
  if (a && a.kind === "emoji" && sameOrigin(a.src)) return { kind: "emoji", src: a.src, alt: typeof a.alt === "string" ? a.alt : "" };
257
289
  if (a && a.kind === "emoji" && typeof a.text === "string" && a.text.trim()) return { kind: "emoji", text: a.text.trim() };
258
- return { kind: "initial", text: a && a.kind === "initial" && typeof a.text === "string" && a.text ? a.text : firstCharacter(labelOf(it)) };
290
+ // #1722: the initial is the leading name's ("Names"), not the server's (which is always the nickname's).
291
+ return { kind: "initial", text: firstCharacter(namesOf(it).primary) || (a && a.kind === "initial" && typeof a.text === "string" ? a.text : "") };
259
292
  }
260
293
  const ACCENT = /^#[0-9a-f]{6}$/i;
261
294
  /** The status dot on the avatar: needs you, crashed, paused, stopped, looks stuck, working, idle — colour AND a label. */
@@ -274,7 +307,7 @@ const DOT = {
274
307
  export function dotLabel(state) { return (DOT[state] || DOT.stopped)[1](); }
275
308
 
276
309
  /** An instance's avatar with its status dot. The ring (its bot's colour) is a CSS custom property set through the CSSOM. */
277
- export function InstanceAvatar({ it, state }) {
310
+ export function InstanceAvatar({ it, state, cli = false }) {
278
311
  const a = avatarOf(it);
279
312
  const [broken, setBroken] = useState("");
280
313
  const el = useRef(null);
@@ -285,12 +318,13 @@ export function InstanceAvatar({ it, state }) {
285
318
  if (accent) node.style.setProperty("--ring", accent); else node.style.removeProperty("--ring");
286
319
  }, [accent]);
287
320
  const src = a.kind !== "initial" && a.src && broken !== a.src ? a.src : "";
288
- const text = a.kind === "emoji" && a.text ? a.text : a.kind === "initial" ? a.text : firstCharacter(labelOf(it));
321
+ const text = a.kind === "emoji" && a.text ? a.text : a.kind === "initial" ? a.text : firstCharacter(namesOf(it).primary);
289
322
  const [cls] = DOT[state] || DOT.stopped;
290
323
  const label = dotLabel(state);
291
324
  return html`<span ref=${el} class=${`av${accent ? " ring" : ""}${a.kind === "emoji" ? " av-emoji" : ""}`}>
292
325
  ${src ? html`<img src=${src} alt="" decoding="async" onError=${() => setBroken(src)} />` : html`<span class="av-text" aria-hidden="true">${text}</span>`}
293
- <span class=${`av-dot dot ${cls}`} role="img" aria-label=${label} title=${label}></span></span>`;
326
+ <span class=${`av-dot dot ${cls}`} role="img" aria-label=${label} title=${label}></span>${cli
327
+ ? html`<span class="av-cli" aria-hidden="true" title=${backendLabel(it.backend)}>${CLI_MONOGRAM[it.backend] || "·"}</span>` : null}</span>`;
294
328
  }
295
329
 
296
330
  // ── The list ──
@@ -306,6 +340,7 @@ const statusText = (facet) => (facet === "needs" ? t("app.needsYou") : facet ===
306
340
  */
307
341
  export function InstanceNav({ route, items, loaded = true, exec = {}, awaiting = {}, viewOnly = false, onPick }) {
308
342
  const nav = useStore(navStore);
343
+ const names = useStore(namesStore); // #1722: which name leads
309
344
  const filterRef = useRef(null);
310
345
  const list = useRef(null);
311
346
  const drag = useRef(null);
@@ -338,9 +373,6 @@ export function InstanceNav({ route, items, loaded = true, exec = {}, awaiting =
338
373
  const f = nav.filter;
339
374
  const shown = filterSidebar(shownGroups, shownInsts, byName, f.q, backendLabel, { status: f.status, cli: f.cli, statusOf: facetOf });
340
375
  const backends = [...new Set(items.map((it) => it.backend).filter((b) => typeof b === "string" && b))].sort((a, b) => backendLabel(a).localeCompare(backendLabel(b)));
341
- // #1630: a display name two rows share would tell them apart from nothing — only then does the row keep its name too.
342
- const labelCount = new Map();
343
- for (const it of items) { const l = labelOf(it); labelCount.set(l, (labelCount.get(l) || 0) + 1); }
344
376
  const toggle = (g) => { const c = new Set(navStore.get().collapsed); if (c.has(g)) c.delete(g); else c.add(g); setCollapsed(c); };
345
377
  // From the store, not this render's copy: two clicks before the next render must both count.
346
378
  const flip = (key, value) => { const cur = new Set(navStore.get().filter[key]); if (cur.has(value)) cur.delete(value); else cur.add(value); setNavFilter({ [key]: [...cur] }); };
@@ -392,9 +424,8 @@ export function InstanceNav({ route, items, loaded = true, exec = {}, awaiting =
392
424
  };
393
425
  const row = (name, g, i, count) => {
394
426
  const it = byName.get(name);
395
- const label = labelOf(it);
396
- // The instance name under a display name only when another row has the same display name.
397
- const twin = label !== name && (labelCount.get(label) || 0) > 1 ? name : "";
427
+ // #1722: both names, the preferred one first; one line when there is no other.
428
+ const { primary: label, secondary } = namesOf(it, names.primary);
398
429
  const facet = facetOf(name);
399
430
  const waiting = own(awaiting, name) ? awaiting[name] : null;
400
431
  const on = name === active;
@@ -402,12 +433,12 @@ export function InstanceNav({ route, items, loaded = true, exec = {}, awaiting =
402
433
  const full = !starred && favs.length >= MAX_FAVORITES;
403
434
  return html`<li key=${name} class="v-li"><a class=${`inst v-inst${on ? " active" : ""}`} href=${rowPath(name)} title=${instanceTooltip(it)}
404
435
  aria-current=${on ? "page" : undefined} onClick=${onPick} ...${fav ? {} : dragProps({ type: "instance", name, group: g })}>
405
- <${InstanceAvatar} it=${it} state=${dotState(it, own(exec, name) ? exec[name] : null, waiting)} />
406
- <span class="inst-text"><span class="inst-name">${label}</span>
407
- ${twin || facet === "needs" ? html`<span class="inst-sub">${twin ? html`<span class="inst-alias inst-id">${twin}</span>` : null}
408
- ${facet === "needs" ? html`<span class="badge-await" title=${waiting || t("app.approxNote")}>${t("app.needsYou")}</span>` : null}</span>` : null}</span>
436
+ <${InstanceAvatar} it=${it} state=${dotState(it, own(exec, name) ? exec[name] : null, waiting)} cli=${true} />
437
+ <span class="inst-text"><span class="inst-name" title=${label}>${label}</span>
438
+ ${secondary ? html`<span class="inst-alt" title=${secondary}>${secondary}</span>` : null}
439
+ ${facet === "needs" ? html`<span class="inst-sub"><span class="badge-await" title=${waiting || t("app.approxNote")}>${t("app.needsYou")}</span></span>` : null}
440
+ <span class="sr-only">${tn("tooltipBackend", { value: backendLabel(it.backend) })}</span></span>
409
441
  <span class="v-meta">${it.context_pct != null ? `${Math.round(it.context_pct)}%` : ""}</span>
410
- <span class=${`cli-icon cli-${KNOWN_BACKENDS.has(it.backend) ? it.backend : "other"}`} title=${backendLabel(it.backend)} aria-label=${tn("tooltipBackend", { value: backendLabel(it.backend) })}></span>
411
442
  </a>${fav && editing && canStar ? html`<button type="button" class="icon-btn inst-move" aria-label=${tn("favUp", { name: label })}
412
443
  title=${shown.active ? tn("favFiltered") : tn("favUp", { name: label })} disabled=${shown.active || i === 0} onClick=${() => { if (!shown.active) moveFavorite(name, -1, known); }}><${Icon} name="up" size=${14} /></button><button type="button" class="icon-btn inst-move"
413
444
  aria-label=${tn("favDown", { name: label })} title=${shown.active ? tn("favFiltered") : tn("favDown", { name: label })} disabled=${shown.active || i === count - 1}
@@ -67,6 +67,15 @@ export function UsageMetric({ m }) {
67
67
  return html`<div class="u-metric"><div class="u-row"><span class="u-label">${label}</span><span class="u-val">${val}</span></div>${sub ? html`<div class="u-sub">${sub}</div>` : null}</div>`;
68
68
  }
69
69
  /** "Updated 3 min ago" (#1585): how old the numbers are — the panel may show the last snapshot while a fresh one comes. */
70
+ /**
71
+ * #1749: a plan as its badge reads — one short line. "Name [Tier] (N×)" (Claude's "Team Premium (6.25x)", "Max (20x)")
72
+ * becomes "Name ×N"; anything else (Pro, Codex's and muse's labels) as it is. The full name stays on the badge's
73
+ * tooltip and for a screen reader.
74
+ */
75
+ export function planBadge(plan) {
76
+ const m = /^(\S+)(?: [^()]+)? \((\d+(?:\.\d+)?)x\)$/i.exec(String(plan || "").trim());
77
+ return m ? `${m[1]} ×${m[2]}` : String(plan || "");
78
+ }
70
79
  export function updatedAgo(fetchedAt, now = Date.now()) {
71
80
  const ms = now - new Date(fetchedAt).getTime();
72
81
  if (!Number.isFinite(ms) || ms < 60_000) return tn("usageUpdatedJustNow");
@@ -125,7 +134,7 @@ export function UsageBody({ owner }) {
125
134
  const providers = ordered(data.providers);
126
135
  content = html`${!providers.length ? html`<p class="note">${tn("usage.empty_active")}</p>` : null}
127
136
  ${providers.map((p, i) => html`<section key=${key(p)} class="u-provider">
128
- <div class="u-head"><strong>${p.name}</strong>${p.plan ? html`<span class="pill">${p.plan}</span>` : null}
137
+ <div class="u-head"><strong title=${p.name}>${p.name}</strong>${p.plan ? html`<span class="pill u-plan" title=${p.plan}><span aria-hidden="true">${planBadge(p.plan)}</span><span class="sr-only">${p.plan}</span></span>` : null}
129
138
  <span class="u-order">
130
139
  <button type="button" class="icon-btn" disabled=${i === 0} aria-label=${tn("usageMoveUp")} title=${tn("usageMoveUp")} onClick=${() => move(key(p), -1, data.providers)}><${Icon} name="up" size=${14} /></button>
131
140
  <button type="button" class="icon-btn" disabled=${i === providers.length - 1} aria-label=${tn("usageMoveDown")} title=${tn("usageMoveDown")} onClick=${() => move(key(p), 1, data.providers)}><${Icon} name="down" size=${14} /></button>
@@ -115,6 +115,8 @@ register("view", {
115
115
  "usage.hint.grok_no_login": "auth.json has no usable login. Run `grok login`.",
116
116
  "usage.hint.login_kiro": "Log in with the Kiro CLI (`kiro-cli`).",
117
117
  "usage.hint.kiro_signed_out": "Signed out — run `kiro-cli` to log in.",
118
+ "usage.hint.claude_profile_signed_out": "Not logged in — sign in with: {0}",
119
+ "usage.hint.claude_profile_signed_out_chat": "Not logged in — sign in with `{0}` (or run `{1}` on the host).",
118
120
  "usage.hint.token_refreshing": "Token refreshing — try again in a moment.",
119
121
  "usage.hint.subscription_no_credit": "Subscription — no credit usage to report.",
120
122
  "usage.hint.no_quota_account": "No quota information available for this account type.",
@@ -289,6 +291,8 @@ register("view", {
289
291
  "usage.hint.grok_no_login": "auth.json 沒有可用的登入資料。請執行 `grok login`。",
290
292
  "usage.hint.login_kiro": "請使用 Kiro CLI(`kiro-cli`)登入。",
291
293
  "usage.hint.kiro_signed_out": "目前已登出;請執行 `kiro-cli` 登入。",
294
+ "usage.hint.claude_profile_signed_out": "尚未登入;請用這行指令登入:{0}",
295
+ "usage.hint.claude_profile_signed_out_chat": "尚未登入;請用 `{0}` 登入(或在主機上執行 `{1}`)。",
292
296
  "usage.hint.token_refreshing": "Token 更新中 — 請稍候再試。",
293
297
  "usage.hint.subscription_no_credit": "訂閱方案沒有可回報的額度用量。",
294
298
  "usage.hint.no_quota_account": "此帳號類型沒有可用的額度資訊。",
@@ -143,6 +143,14 @@ export declare function activationSettled(outcome: {
143
143
  */
144
144
  export type RetireSystemCopyResult = {
145
145
  ok: true;
146
+ /** The old copy is still there: cleanup, not failure. Prose; names the old copy's directory only when it is plain (#1735). */
147
+ warning?: string;
148
+ /**
149
+ * The manual removal, shell-quoted and byte-exact — never normalized or
150
+ * sliced, so unusual npm paths survive copy-paste (#1660 review). The
151
+ * caller prints it; nothing here logs it (single print, #1660 review).
152
+ */
153
+ cleanupCommand?: string;
146
154
  } | {
147
155
  ok: false;
148
156
  reason: string;
@@ -151,5 +159,9 @@ export type RetireSystemCopyResult = {
151
159
  * Remove the old system npm global after an nvm transition.
152
160
  * @param npmPath - The absolute npm path used during this install (from UpdateInstallOutcome.npmPath).
153
161
  * Passing undefined or a non-absolute path is a caller error and results in a failure.
162
+ * @param oldCopyDir - #1735: where the old copy is (the package the updater runs from), named in the warning when it
163
+ * is a plain `…/node_modules/@songsid/agend` path — absolute, no whitespace and no control/format/unassigned code point
164
+ * (`\p{C}`: C0, DEL, C1 such as U+0085/U+009B, bidi overrides), ≤ 200 chars (#1737 review) — so
165
+ * the prose (whitespace-collapsed and sliced in the marker) can never mangle it. Anything else is left unnamed.
154
166
  */
155
- export declare function retireSystemCopy(runner: CommandRunner, npmPath?: string): RetireSystemCopyResult;
167
+ export declare function retireSystemCopy(runner: CommandRunner, npmPath?: string, oldCopyDir?: string): RetireSystemCopyResult;
@@ -11,6 +11,7 @@
11
11
  */
12
12
  import { dirname, join } from "node:path";
13
13
  import { rmSync } from "node:fs";
14
+ import { shellQuote } from "./backend/types.js";
14
15
  import { restorePackagePreimage, takePackagePreimage } from "./package-preimage.js";
15
16
  /**
16
17
  * The `bash -c` script that puts nvm's Node 22 on PATH for the rest of the same shell (nvm only changes its own shell),
@@ -277,8 +278,12 @@ export function activationSettled(outcome, restart) {
277
278
  * Remove the old system npm global after an nvm transition.
278
279
  * @param npmPath - The absolute npm path used during this install (from UpdateInstallOutcome.npmPath).
279
280
  * Passing undefined or a non-absolute path is a caller error and results in a failure.
281
+ * @param oldCopyDir - #1735: where the old copy is (the package the updater runs from), named in the warning when it
282
+ * is a plain `…/node_modules/@songsid/agend` path — absolute, no whitespace and no control/format/unassigned code point
283
+ * (`\p{C}`: C0, DEL, C1 such as U+0085/U+009B, bidi overrides), ≤ 200 chars (#1737 review) — so
284
+ * the prose (whitespace-collapsed and sliced in the marker) can never mangle it. Anything else is left unnamed.
280
285
  */
281
- export function retireSystemCopy(runner, npmPath) {
286
+ export function retireSystemCopy(runner, npmPath, oldCopyDir) {
282
287
  runner.log(" Note: removing old system install (may require sudo)...");
283
288
  // Use the exact npm binary that performed this install, so retirement uses the
284
289
  // same identity rather than re-querying a potentially-different sudo secure_path.
@@ -289,9 +294,16 @@ export function retireSystemCopy(runner, npmPath) {
289
294
  }
290
295
  const result = runner.run("sudo", ["-n", npmPath, "uninstall", "-g", "@songsid/agend"], { inherit: true, timeoutMs: 10_000 });
291
296
  if (result.status !== 0) {
292
- const reason = `sudo npm uninstall failed (status ${result.status})`;
293
- runner.log(` ⚠️ ${reason}; the old system copy may still exist.`);
294
- return { ok: false, reason };
297
+ // #1660: retiring the old copy is cleanup. The new version is installed,
298
+ // verified and running at this point, so a refused removal must not fail
299
+ // the update — it becomes a warning plus a verbatim manual command.
300
+ // `-n` is non-interactive: sudo fails fast here, it never prompts. No
301
+ // further sudo calls on this path. The caller prints once (P3-1).
302
+ const cleanupCommand = `sudo ${shellQuote(npmPath)} uninstall -g @songsid/agend`;
303
+ const where = oldCopyDir && oldCopyDir.length <= 200 && /^\/[^\s\p{C}]*\/node_modules\/@songsid\/agend$/u.test(oldCopyDir)
304
+ ? ` at ${oldCopyDir}` : "";
305
+ const warning = `Old system install${where} was not removed (sudo refused); remove it by hand.`;
306
+ return { ok: true, warning, cleanupCommand };
295
307
  }
296
308
  return { ok: true };
297
309
  }
@@ -1 +1 @@
1
- {"version":3,"file":"update-install.js","sourceRoot":"","sources":["../src/update-install.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update-install.js","sourceRoot":"","sources":["../src/update-install.ts"],"names":[],"mappings":"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"}
@@ -20,7 +20,55 @@ export interface UpdateProgressState {
20
20
  version?: string;
21
21
  error?: string;
22
22
  failedStage?: UpdateProgressStage;
23
+ /** Non-fatal cleanup note (e.g. old system copy left behind, #1660). */
24
+ warning?: string;
25
+ /**
26
+ * Verbatim copy-paste cleanup command. Unlike prose it is never whitespace-
27
+ * normalized or sliced: a path with double spaces or a long absolute npm
28
+ * path must survive byte-exact (#1660 review). Bounded by the platform
29
+ * (it names one absolute path), not by a prose length cap.
30
+ */
31
+ cleanupCommand?: string;
32
+ /** #1660: the retire outcome is still owed (set before restart) or recorded. */
33
+ cleanup?: "pending" | "done";
23
34
  }
35
+ /** Which update receipt a cleanup outcome belongs to (owner fence, #1660). */
36
+ export interface UpdateReceipt {
37
+ startedAt: number;
38
+ messageId: string;
39
+ operation: UpdateProgressOperation;
40
+ }
41
+ export declare function updateReceiptOf(marker: (UpdateMarker & {
42
+ progress: UpdateProgressState;
43
+ }) | null): UpdateReceipt | null;
44
+ /**
45
+ * #1737 review: a marker's identity — when it was started and, for a chat-tracked one, its receipt — so a reader can
46
+ * tell "still the marker I adopted" from a newer one written since (a `/restart full`, a new `/update`).
47
+ */
48
+ export interface UpdateMarkerIdentity {
49
+ startedAt: number;
50
+ receipt: UpdateReceipt | null;
51
+ }
52
+ export declare function updateMarkerIdentity(dataDir: string): UpdateMarkerIdentity | null;
53
+ /** The same marker: started at the same time, with the same receipt (or none on both). */
54
+ export declare function sameUpdateMarker(a: UpdateMarkerIdentity | null, b: UpdateMarkerIdentity | null): boolean;
55
+ /**
56
+ * Mark the current update as owing its retire outcome, before the restart
57
+ * that may let a new fleet consume this receipt. Returns the receipt the
58
+ * later write must still match.
59
+ */
60
+ export declare function markCleanupPending(dataDir: string): UpdateReceipt | null;
61
+ /**
62
+ * Record a retire outcome against the receipt captured before the restart.
63
+ * Refuses when the marker is gone (the new fleet already consumed it) or
64
+ * belongs to another operation (e.g. a later full-restart adopted it) — the
65
+ * warning was already printed to the updater's own output, so refusing here
66
+ * loses nothing the operator saw.
67
+ */
68
+ export declare function writeCleanupOutcome(dataDir: string, receipt: UpdateReceipt | null, outcome: {
69
+ warning?: string;
70
+ cleanupCommand?: string;
71
+ } | null): boolean;
24
72
  export interface UpdateMarker {
25
73
  startedAt: number;
26
74
  pid: number;
@@ -43,6 +91,9 @@ export declare function readUpdateProgress(dataDir: string): (UpdateMarker & {
43
91
  export declare function setUpdateProgressStage(dataDir: string, stage: UpdateProgressStage, details?: {
44
92
  version?: string;
45
93
  error?: string;
94
+ warning?: string;
95
+ cleanupCommand?: string;
96
+ cleanup?: "pending" | "done";
46
97
  }): boolean;
47
98
  /** Called by `agend update` before it touches anything. */
48
99
  export declare function markUpdateInProgress(dataDir: string, now?: number, pid?: number): void;