@songsid/agend 2.0.11-beta.31 โ†’ 2.0.11-beta.32

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.
@@ -108,6 +108,11 @@
108
108
  <div class="card" id="agents"></div>
109
109
  </section>
110
110
 
111
+ <section id="classicSection">
112
+ <div class="sec-head"><h2 data-i18n="classicChannels">๐ŸŽฎ ClassicBot Channels</h2></div>
113
+ <div class="card" id="classicList"></div>
114
+ </section>
115
+
111
116
  <section>
112
117
  <div class="sec-head"><h2 data-i18n="bots">๐Ÿ”Œ Bots</h2><div class="grow"></div><button class="sm" id="newBotBtn" data-i18n="add">+ Add</button></div>
113
118
  <div id="newBot"></div>
@@ -146,7 +151,7 @@
146
151
  // โ”€โ”€ i18n โ”€โ”€
147
152
  const I18N = {
148
153
  en: {
149
- title: "โš™๏ธ AgEnD Settings", reloadFleet: "โ†ป Reload Fleet", myAgents: "๐Ÿค– My Agents", bots: "๐Ÿ”Œ Bots",
154
+ title: "โš™๏ธ AgEnD Settings", reloadFleet: "โ†ป Reload Fleet", myAgents: "๐Ÿค– My Agents", bots: "๐Ÿ”Œ Bots", classicChannels: "๐ŸŽฎ ClassicBot Channels", noClassic: "No ClassicBot channels โ€” start one with /start in a chat.",
150
155
  general: "โš™๏ธ General Settings", autoUpdate: "๐Ÿ”„ Auto Update", whatsNew: "๐Ÿ†• What's New", advanced: "๐Ÿ“‹ Advanced",
151
156
  expand: "โ–ถ Expand", collapse: "โ–ผ Collapse", new: "+ New", add: "+ Add", searchPh: "๐Ÿ” Searchโ€ฆ",
152
157
  edit: "Edit", close: "Close", save: "Save", cancel: "Cancel", create: "Create", start: "Start", stop: "Stop",
@@ -163,7 +168,7 @@
163
168
  wnIntro: "Recent highlights:",
164
169
  },
165
170
  "zh-TW": {
166
- title: "โš™๏ธ AgEnD ่จญๅฎš", reloadFleet: "โ†ป ้‡ๆ–ฐ่ผ‰ๅ…ฅ", myAgents: "๐Ÿค– ๆˆ‘็š„ Agent", bots: "๐Ÿ”Œ ๆฉŸๅ™จไบบ",
171
+ title: "โš™๏ธ AgEnD ่จญๅฎš", reloadFleet: "โ†ป ้‡ๆ–ฐ่ผ‰ๅ…ฅ", myAgents: "๐Ÿค– ๆˆ‘็š„ Agent", bots: "๐Ÿ”Œ ๆฉŸๅ™จไบบ", classicChannels: "๐ŸŽฎ ClassicBot ้ ป้“", noClassic: "ๆฒ’ๆœ‰ ClassicBot ้ ป้“ โ€” ๅœจ่Šๅคฉไธญ็”จ /start ๅปบ็ซ‹ใ€‚",
167
172
  general: "โš™๏ธ ไธ€่ˆฌ่จญๅฎš", autoUpdate: "๐Ÿ”„ ่‡ชๅ‹•ๆ›ดๆ–ฐ", whatsNew: "๐Ÿ†• ๆ›ดๆ–ฐ้‡้ปž", advanced: "๐Ÿ“‹ ้€ฒ้šŽ",
168
173
  expand: "โ–ถ ๅฑ•้–‹", collapse: "โ–ผ ๆ”ถๅˆ", new: "+ ๆ–ฐๅขž", add: "+ ๅŠ ๅ…ฅ", searchPh: "๐Ÿ” ๆœๅฐ‹โ€ฆ",
169
174
  edit: "็ทจ่ผฏ", close: "้—œ้–‰", save: "ๅ„ฒๅญ˜", cancel: "ๅ–ๆถˆ", create: "ๅปบ็ซ‹", start: "ๅ•Ÿๅ‹•", stop: "ๅœๆญข",
@@ -257,7 +262,7 @@
257
262
  }
258
263
 
259
264
  // โ”€โ”€ State โ”€โ”€
260
- const state = { fleet: {}, classic: {}, live: {}, fleetUp: false, advFmt: "yaml", advEdit: false, collapsedGroups: new Set(), updateSchedule: null, version: "", newAgentOpen: false, newBotOpen: false };
265
+ const state = { fleet: {}, classic: {}, classicStatus: {}, live: {}, fleetUp: false, advFmt: "yaml", advEdit: false, collapsedGroups: new Set(), updateSchedule: null, version: "", newAgentOpen: false, newBotOpen: false };
261
266
  const channels = () => state.fleet.channels || (state.fleet.channel ? [state.fleet.channel] : []);
262
267
  const channelIds = () => channels().map(c => c.id || c.type).filter(Boolean);
263
268
  const chLabel = (i) => i === 0 ? "primary" : "persona";
@@ -421,6 +426,34 @@
421
426
  host.append(item);
422
427
  });
423
428
  }
429
+
430
+ // โ”€โ”€ ClassicBot Channels (read-only; created dynamically via /start /stop) โ”€โ”€
431
+ function renderClassic() {
432
+ const host = $("classicList"); if (!host) return; host.innerHTML = "";
433
+ const chans = Object.values(state.classic?.channels || {});
434
+ if (!chans.length) { host.className = "card empty"; host.textContent = t("noClassic"); return; }
435
+ const filter = ($("agentSearch")?.value || "").trim().toLowerCase();
436
+ let list = chans;
437
+ if (filter) list = list.filter(c => String(c.name || "").toLowerCase().includes(filter) || String(c.instanceName || "").toLowerCase().includes(filter));
438
+ if (!list.length) { host.className = "card empty"; host.textContent = "โ€”"; return; }
439
+ host.className = "card";
440
+ list.sort((a, b) => {
441
+ const sa = STATUS_ORDER[state.classicStatus[a.instanceName] || "stopped"], sb = STATUS_ORDER[state.classicStatus[b.instanceName] || "stopped"];
442
+ return sa !== sb ? sa - sb : String(a.name || "").localeCompare(String(b.name || ""));
443
+ });
444
+ for (const c of list) {
445
+ const st = state.classicStatus[c.instanceName] || "stopped";
446
+ const adapter = c.adapterId || "discord";
447
+ host.append(el("div", { class: "item" }, el("div", { class: "item-row" },
448
+ el("span", { class: "dot " + st, title: STATUS_TEXT[st] || st }),
449
+ el("span", { class: "name", title: c.instanceName || "" }, c.name || c.instanceName || "?"),
450
+ el("span", { class: "sub", style: "margin:0" }, c.backend || state.classic?.defaults?.backend || "claude-code"),
451
+ el("span", { class: "tag" + (adapter !== "discord" ? " persona" : "") }, adapter),
452
+ c.collab ? el("span", { class: "tag", style: "background:#ecfdf5;color:#065f46" }, "collab") : null,
453
+ )));
454
+ }
455
+ }
456
+
424
457
  async function saveChannels(msgEl) {
425
458
  const res = await api("/api/settings/fleet/channels", { method: "PUT", body: JSON.stringify(channels()) });
426
459
  if (msgEl) resultMsg(msgEl, res);
@@ -575,12 +608,16 @@
575
608
  }
576
609
 
577
610
  // โ”€โ”€ Load / render โ”€โ”€
578
- function renderAll() { renderAgents(); renderBots(); renderGeneral(); renderAutoUpdate(); renderWhatsNew(); renderAdvanced(); applyStaticI18n(); }
611
+ function renderAll() { renderAgents(); renderClassic(); renderBots(); renderGeneral(); renderAutoUpdate(); renderWhatsNew(); renderAdvanced(); applyStaticI18n(); }
579
612
  async function reloadLive() {
580
613
  const f = await api("/api/fleet");
581
614
  state.fleetUp = f.ok;
582
615
  state.live = {}; if (f.ok && f.body?.instances) for (const i of f.body.instances) state.live[i.name] = { status: i.status };
583
- renderAgents(); renderBots();
616
+ // /api/fleet is fleet-config only; classic instance statuses come from the
617
+ // merged roster (/api/profiles, open GET).
618
+ const pr = await api("/api/profiles");
619
+ state.classicStatus = {}; if (pr.ok && Array.isArray(pr.body)) for (const r of pr.body) state.classicStatus[r.instance_name] = r.status;
620
+ renderAgents(); renderBots(); renderClassic();
584
621
  }
585
622
  async function reload() {
586
623
  const f = await api("/api/settings/fleet");
@@ -598,7 +635,7 @@
598
635
  $("helpBackdrop").onclick = () => setHelp(false);
599
636
  $("langBtn").onclick = () => { lang = lang === "en" ? "zh-TW" : "en"; localStorage.setItem("agend_lang", lang); renderAll(); };
600
637
  $("verBadge").onclick = () => { const b = $("wnBody"); b.classList.add("open"); $("wnToggle").textContent = t("collapse"); b.scrollIntoView({ behavior: "smooth" }); };
601
- $("agentSearch").oninput = () => renderAgents();
638
+ $("agentSearch").oninput = () => { renderAgents(); renderClassic(); };
602
639
  $("newAgentBtn").onclick = () => { state.newAgentOpen = !state.newAgentOpen; $("newAgentBtn").textContent = state.newAgentOpen ? t("cancel") : t("new"); renderNewAgent(state.newAgentOpen); };
603
640
  $("newBotBtn").onclick = () => { state.newBotOpen = !state.newBotOpen; $("newBotBtn").textContent = state.newBotOpen ? t("cancel") : t("add"); renderNewBot(state.newBotOpen); };
604
641
  $("advToggle").onclick = () => { const b = $("advBody"); const open = !b.classList.contains("open"); b.classList.toggle("open", open); $("advToggle").textContent = open ? t("collapse") : t("expand"); };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@songsid/agend",
3
- "version": "2.0.11-beta.31",
3
+ "version": "2.0.11-beta.32",
4
4
  "description": "Multi-agent fleet daemon โ€” run any coding CLI (Claude, Gemini, Codex, OpenCode) from Telegram",
5
5
  "type": "module",
6
6
  "bin": {