@songsid/agend 2.1.5-beta.9 → 2.1.5

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 (86) hide show
  1. package/dist/backend/claude-code.d.ts +12 -0
  2. package/dist/backend/claude-code.js +12 -0
  3. package/dist/backend/claude-code.js.map +1 -1
  4. package/dist/backend/codex.d.ts +25 -1
  5. package/dist/backend/codex.js +76 -0
  6. package/dist/backend/codex.js.map +1 -1
  7. package/dist/backend/kiro.js +30 -2
  8. package/dist/backend/kiro.js.map +1 -1
  9. package/dist/backend/types.d.ts +48 -0
  10. package/dist/backend/types.js.map +1 -1
  11. package/dist/channel/adapters/discord.d.ts +17 -2
  12. package/dist/channel/adapters/discord.js +64 -5
  13. package/dist/channel/adapters/discord.js.map +1 -1
  14. package/dist/channel/adapters/telegram.d.ts +41 -2
  15. package/dist/channel/adapters/telegram.js +116 -20
  16. package/dist/channel/adapters/telegram.js.map +1 -1
  17. package/dist/channel/factory.js +6 -1
  18. package/dist/channel/factory.js.map +1 -1
  19. package/dist/channel/types.d.ts +33 -1
  20. package/dist/classic-channel-manager.d.ts +23 -3
  21. package/dist/classic-channel-manager.js +35 -0
  22. package/dist/classic-channel-manager.js.map +1 -1
  23. package/dist/config-validator.js +23 -0
  24. package/dist/config-validator.js.map +1 -1
  25. package/dist/config.d.ts +4 -0
  26. package/dist/config.js +5 -0
  27. package/dist/config.js.map +1 -1
  28. package/dist/daemon.d.ts +143 -21
  29. package/dist/daemon.js +969 -185
  30. package/dist/daemon.js.map +1 -1
  31. package/dist/deadline.d.ts +23 -0
  32. package/dist/deadline.js +29 -0
  33. package/dist/deadline.js.map +1 -0
  34. package/dist/fleet-context.d.ts +15 -1
  35. package/dist/fleet-context.js.map +1 -1
  36. package/dist/fleet-manager.d.ts +178 -3
  37. package/dist/fleet-manager.js +759 -119
  38. package/dist/fleet-manager.js.map +1 -1
  39. package/dist/general-knowledge/skills/fleet-config/SKILL.md +26 -2
  40. package/dist/instance-lifecycle.d.ts +8 -2
  41. package/dist/instance-lifecycle.js +47 -3
  42. package/dist/instance-lifecycle.js.map +1 -1
  43. package/dist/instance-removal.d.ts +13 -0
  44. package/dist/instance-removal.js +14 -0
  45. package/dist/instance-removal.js.map +1 -0
  46. package/dist/instructions.js +2 -2
  47. package/dist/instructions.js.map +1 -1
  48. package/dist/locale.js +28 -2
  49. package/dist/locale.js.map +1 -1
  50. package/dist/login-controller.d.ts +31 -4
  51. package/dist/login-controller.js +52 -4
  52. package/dist/login-controller.js.map +1 -1
  53. package/dist/login-flows.d.ts +29 -0
  54. package/dist/login-flows.js +48 -1
  55. package/dist/login-flows.js.map +1 -1
  56. package/dist/outbound-handlers.d.ts +1 -0
  57. package/dist/outbound-handlers.js +118 -29
  58. package/dist/outbound-handlers.js.map +1 -1
  59. package/dist/outbound-schemas.d.ts +7 -0
  60. package/dist/outbound-schemas.js +3 -0
  61. package/dist/outbound-schemas.js.map +1 -1
  62. package/dist/pane-input-residue.d.ts +25 -2
  63. package/dist/pane-input-residue.js +31 -2
  64. package/dist/pane-input-residue.js.map +1 -1
  65. package/dist/restart-progress.js +3 -21
  66. package/dist/restart-progress.js.map +1 -1
  67. package/dist/settings-api.d.ts +1 -1
  68. package/dist/settings-api.js +38 -6
  69. package/dist/settings-api.js.map +1 -1
  70. package/dist/topic-commands.d.ts +27 -2
  71. package/dist/topic-commands.js +37 -6
  72. package/dist/topic-commands.js.map +1 -1
  73. package/dist/turn-reply-guard.d.ts +41 -0
  74. package/dist/turn-reply-guard.js +77 -0
  75. package/dist/turn-reply-guard.js.map +1 -0
  76. package/dist/types.d.ts +7 -0
  77. package/dist/ui/dashboard.html +38 -10
  78. package/dist/ui/settings.html +93 -15
  79. package/dist/ui/view.html +35 -20
  80. package/dist/view-api.d.ts +1 -0
  81. package/dist/view-api.js +12 -2
  82. package/dist/view-api.js.map +1 -1
  83. package/dist/web-api.d.ts +22 -1
  84. package/dist/web-api.js +25 -1
  85. package/dist/web-api.js.map +1 -1
  86. package/package.json +1 -1
@@ -194,7 +194,7 @@
194
194
  backend: "Backend", model: "Model", workingDir: "Working directory", channelBinding: "Channel binding",
195
195
  description: "Description", systemPrompt: "System prompt", tags: "Tags", generalTopicField: "General topic (fleet dispatcher)",
196
196
  runtimeResources: "Runtime & Resources", autoPause: "Auto-pause after", minutes: "minutes", inheritDefault: "Inherit from defaults",
197
- detection: "Detection", startup: "Startup", backendSection: "Backend", advancedSection: "Advanced & Access", hangEnabled: "Hang detector enabled", hangTimeout: "Stuck timeout", agentMode: "Agent mode", toolSet: "Tool set", toolProgress: "Tool progress", logLevel: "Log level", concurrency: "Startup concurrency", staggerDelay: "Stagger delay", lightweight: "Lightweight mode", modelFailover: "Fallback model", displayName: "Display name", pause: "Pause", wake: "Wake", accessMode: "Access mode", affected: "Affected instances",
197
+ detection: "Detection", startup: "Startup", backendSection: "Backend", advancedSection: "Advanced & Access", hangEnabled: "Hang detector enabled", hangTimeout: "Stuck timeout", agentMode: "Agent mode", toolSet: "Tool set", toolProgress: "Tool progress", replyCompletionGuard: "Require a delivered reply", replyGuardSupported: "Active for Claude Code in MCP mode.", replyGuardUnsupported: "Stored but inactive: {0} in {1} mode does not support reply-drop recovery.", logLevel: "Log level", concurrency: "Startup concurrency", staggerDelay: "Stagger delay", lightweight: "Lightweight mode", modelFailover: "Fallback model", displayName: "Display name", pause: "Pause", wake: "Wake", accessMode: "Access mode", affected: "Affected instances",
198
198
  language: "Language (bot replies)", defaultBackend: "Default backend", defaultModel: "Default model", allowedUsers: "Allowed users (primary bot)",
199
199
  classicAdmins: "ClassicBot admins", allowedGuilds: "Allowed guilds", type: "Type", adapterId: "Adapter id",
200
200
  tokenEnv: "Bot token env var", groupId: "Group / guild id", nameField: "Name",
@@ -216,7 +216,7 @@
216
216
  backend: "後端", model: "模型", workingDir: "工作目錄", channelBinding: "頻道綁定",
217
217
  description: "描述", systemPrompt: "System prompt", tags: "標籤", generalTopicField: "General topic(fleet 分派器)",
218
218
  runtimeResources: "執行環境與資源", autoPause: "閒置後自動暫停", minutes: "分鐘", inheritDefault: "沿用全域預設值",
219
- detection: "偵測", startup: "啟動", backendSection: "後端", advancedSection: "進階與存取", hangEnabled: "啟用卡住偵測", hangTimeout: "卡住逾時", agentMode: "Agent 模式", toolSet: "工具集", toolProgress: "工具進度", logLevel: "Log 等級", concurrency: "啟動併發數", staggerDelay: "錯開延遲", lightweight: "輕量模式", modelFailover: "備援模型", displayName: "顯示名稱", pause: "暫停", wake: "喚醒", accessMode: "存取模式", affected: "受影響 instances",
219
+ detection: "偵測", startup: "啟動", backendSection: "後端", advancedSection: "進階與存取", hangEnabled: "啟用卡住偵測", hangTimeout: "卡住逾時", agentMode: "Agent 模式", toolSet: "工具集", toolProgress: "工具進度", replyCompletionGuard: "要求送出回覆", replyGuardSupported: "Claude Code 的 MCP 模式可用。", replyGuardUnsupported: "設定會保留,但不會生效:{0} 的 {1} 模式不支援回覆遺失補救。", logLevel: "Log 等級", concurrency: "啟動併發數", staggerDelay: "錯開延遲", lightweight: "輕量模式", modelFailover: "備援模型", displayName: "顯示名稱", pause: "暫停", wake: "喚醒", accessMode: "存取模式", affected: "受影響 instances",
220
220
  language: "語言(bot 回覆)", defaultBackend: "預設後端", defaultModel: "預設模型", allowedUsers: "允許使用者(主 bot)",
221
221
  classicAdmins: "ClassicBot 管理員", allowedGuilds: "允許的伺服器", type: "類型", adapterId: "Adapter id",
222
222
  tokenEnv: "Bot token 環境變數", groupId: "群組 / guild id", nameField: "名稱",
@@ -373,7 +373,7 @@
373
373
  button.disabled = false;
374
374
  }
375
375
  const hasOwn = (obj, key) => Object.prototype.hasOwnProperty.call(obj || {}, key);
376
- const HOT_FIELDS = new Set(["tool_progress", "mcp_proxy_reply", "auto_pause_after", "warm_cap", "display_name", "description", "tags", "log_level"]);
376
+ const HOT_FIELDS = new Set(["tool_progress", "reply_completion_guard", "mcp_proxy_reply", "auto_pause_after", "warm_cap", "display_name", "description", "tags", "log_level"]);
377
377
  const sameValue = (a, b) => JSON.stringify(a) === JSON.stringify(b);
378
378
  function changedFields(next, baseline) {
379
379
  return Object.fromEntries(Object.entries(next).filter(([key, value]) => !sameValue(value, baseline[key])));
@@ -389,6 +389,12 @@
389
389
  toggle.onchange = () => { input.disabled = toggle.checked; };
390
390
  return { input, toggle, row: el("div", {}, input, el("label", { class: "inherit-row" }, toggle, el("span", {}, t("inheritDefault")), impact(impactKind))) };
391
391
  }
392
+ const replyGuardSupported = (backend, mode) => backend === "claude-code" && mode === "mcp";
393
+ const replyGuardHint = (backend, mode) => el(
394
+ "div",
395
+ { class: "hint" },
396
+ replyGuardSupported(backend, mode) ? t("replyGuardSupported") : tf("replyGuardUnsupported", backend, mode),
397
+ );
392
398
  function setValidation(input, feedback, error, warning) {
393
399
  input.classList.toggle("invalid", !!error);
394
400
  feedback.className = "feedback" + (error ? " error" : warning ? " warning" : "");
@@ -501,7 +507,17 @@
501
507
  const hang = overrideControl(hangHolder, "value", el("input", { type: "number", min: "0.1", step: "0.5", value: hangRaw.timeout_minutes ?? defaults.hang_detector?.timeout_minutes ?? 15 }), defaults.hang_detector?.timeout_minutes ?? 15);
502
508
  const agentMode = overrideControl(inst, "agent_mode", select(inst.agent_mode || defaults.agent_mode || "mcp", ["mcp", "cli"]), defaults.agent_mode || "mcp");
503
509
  const toolSet = overrideControl(inst, "tool_set", select(inst.tool_set || defaults.tool_set || "full", ["full", "standard", "minimal"]), defaults.tool_set || "full");
504
- const toolProgress = overrideControl(inst, "tool_progress", select(inst.tool_progress || defaults.tool_progress || "off", ["off", "standard", "verbose"]), defaults.tool_progress || "off", "now");
510
+ const toolProgress = overrideControl(inst, "tool_progress", select(inst.tool_progress ?? defaults.tool_progress ?? "off", ["off", "standard", "verbose"]), defaults.tool_progress ?? "off", "now");
511
+ const fReplyGuard = el("input", { type: "checkbox" });
512
+ fReplyGuard.checked = inst.reply_completion_guard ?? defaults.reply_completion_guard ?? true;
513
+ const replyGuard = overrideControl(inst, "reply_completion_guard", fReplyGuard, defaults.reply_completion_guard ?? true, "now");
514
+ const replyHint = replyGuardHint(fBackend.value, agentMode.input.value);
515
+ const refreshReplyHint = () => {
516
+ const supported = replyGuardSupported(fBackend.value, agentMode.input.value);
517
+ replyHint.textContent = supported ? t("replyGuardSupported") : tf("replyGuardUnsupported", fBackend.value, agentMode.input.value);
518
+ };
519
+ fBackend.addEventListener("change", refreshReplyHint);
520
+ agentMode.input.addEventListener("change", refreshReplyHint);
505
521
  const logLevel = overrideControl(inst, "log_level", select(inst.log_level || defaults.log_level || "info", ["trace", "debug", "info", "warn", "error"]), defaults.log_level || "info");
506
522
  const fLightweight = el("input", { type: "checkbox" }); fLightweight.checked = inst.lightweight ?? defaults.lightweight ?? false;
507
523
  const lightweight = overrideControl(inst, "lightweight", fLightweight, defaults.lightweight ?? false);
@@ -521,7 +537,7 @@
521
537
  saveBtn.disabled = !(validAuto && validHang);
522
538
  return !saveBtn.disabled;
523
539
  };
524
- for (const ctl of [auto, hang, agentMode, toolSet, toolProgress, logLevel, lightweight, failover, displayName]) {
540
+ for (const ctl of [auto, hang, agentMode, toolSet, toolProgress, replyGuard, logLevel, lightweight, failover, displayName]) {
525
541
  ctl.input.addEventListener("input", validate); ctl.input.addEventListener("change", validate); ctl.toggle.addEventListener("change", validate);
526
542
  }
527
543
  saveBtn.onclick = async () => {
@@ -536,6 +552,7 @@
536
552
  agent_mode: agentMode.toggle.checked ? null : agentMode.input.value,
537
553
  tool_set: toolSet.toggle.checked ? null : toolSet.input.value,
538
554
  tool_progress: toolProgress.toggle.checked ? null : toolProgress.input.value,
555
+ reply_completion_guard: replyGuard.toggle.checked ? null : replyGuard.input.checked,
539
556
  log_level: logLevel.toggle.checked ? null : logLevel.input.value,
540
557
  lightweight: lightweight.toggle.checked ? null : lightweight.input.checked,
541
558
  model_failover: failover.toggle.checked ? null : (failover.input.value.trim() ? [failover.input.value.trim()] : []),
@@ -555,6 +572,7 @@
555
572
  agent_mode: hasOwn(inst, "agent_mode") ? inst.agent_mode : null,
556
573
  tool_set: hasOwn(inst, "tool_set") ? inst.tool_set : null,
557
574
  tool_progress: hasOwn(inst, "tool_progress") ? inst.tool_progress : null,
575
+ reply_completion_guard: hasOwn(inst, "reply_completion_guard") ? inst.reply_completion_guard : null,
558
576
  log_level: hasOwn(inst, "log_level") ? inst.log_level : null,
559
577
  lightweight: hasOwn(inst, "lightweight") ? inst.lightweight : null,
560
578
  model_failover: hasOwn(inst, "model_failover") ? inst.model_failover : null,
@@ -591,6 +609,7 @@
591
609
  el("div", {}, el("label", {}, t("agentMode")), agentMode.row),
592
610
  el("div", {}, el("label", {}, t("toolSet")), toolSet.row),
593
611
  el("div", {}, el("label", {}, t("toolProgress"), impact("now")), toolProgress.row),
612
+ el("div", {}, el("label", {}, t("replyCompletionGuard"), impact("now")), replyGuard.row, replyHint),
594
613
  el("div", {}, el("label", {}, t("logLevel"), impact("now")), logLevel.row),
595
614
  el("div", {}, el("label", {}, t("lightweight")), lightweight.row),
596
615
  el("div", {}, el("label", {}, t("modelFailover")), failover.row, failoverFeedback)),
@@ -717,10 +736,22 @@
717
736
  const inheritedBackend = classicDefaults.backend || fleetDefaults.backend || "claude-code";
718
737
  const inheritedModel = classicDefaults.model || fleetDefaults.model || "";
719
738
  const inheritedAutoPause = classicDefaults.auto_pause_after ?? fleetDefaults.auto_pause_after ?? 0;
739
+ const inheritedToolProgress = classicDefaults.tool_progress ?? fleetDefaults.tool_progress ?? "off";
740
+ const inheritedReplyGuard = classicDefaults.reply_completion_guard ?? fleetDefaults.reply_completion_guard ?? true;
720
741
  const runtime = classicRuntime(c.instanceName);
721
742
  const fBackend = select(c.backend || inheritedBackend, BACKENDS.filter(value => value !== "gemini-cli"));
722
743
  const fModel = el("input", { type: "text", value: c.model || "", placeholder: inheritedModel || "(inherit default)" });
723
744
  const auto = overrideControl(c, "auto_pause_after", el("input", { type: "number", min: "0", step: "1", value: c.auto_pause_after ?? inheritedAutoPause, placeholder: "0 = disabled" }), inheritedAutoPause);
745
+ const toolProgress = overrideControl(c, "tool_progress", select(c.tool_progress ?? inheritedToolProgress, ["off", "standard", "verbose"]), inheritedToolProgress, "now");
746
+ const fReplyGuard = el("input", { type: "checkbox" });
747
+ fReplyGuard.checked = c.reply_completion_guard ?? inheritedReplyGuard;
748
+ const replyGuard = overrideControl(c, "reply_completion_guard", fReplyGuard, inheritedReplyGuard, "now");
749
+ const classicMode = fleetDefaults.agent_mode ?? "mcp";
750
+ const replyHint = replyGuardHint(fBackend.value, classicMode);
751
+ fBackend.addEventListener("change", () => {
752
+ const supported = replyGuardSupported(fBackend.value, classicMode);
753
+ replyHint.textContent = supported ? t("replyGuardSupported") : tf("replyGuardUnsupported", fBackend.value, classicMode);
754
+ });
724
755
  const fCollab = el("input", { type: "checkbox" }); fCollab.checked = !!c.collab;
725
756
  const fContext = el("input", { type: "number", min: "0", step: "1", value: c.context_lines ?? classicDefaults.context_lines ?? 5 });
726
757
  const autoFeedback = el("div", { class: "feedback" });
@@ -734,24 +765,39 @@
734
765
  saveBtn.disabled = !(validAuto && validContext);
735
766
  return !saveBtn.disabled;
736
767
  };
737
- for (const input of [fBackend, fModel, auto.input, auto.toggle, fCollab, fContext]) {
768
+ for (const input of [fBackend, fModel, auto.input, auto.toggle, toolProgress.input, toolProgress.toggle, replyGuard.input, replyGuard.toggle, fCollab, fContext]) {
738
769
  input.addEventListener("input", validate); input.addEventListener("change", validate);
739
770
  }
740
771
  saveBtn.onclick = () => {
741
772
  if (!validate()) return;
742
- const patch = {
773
+ const nextPatch = {
743
774
  backend: fBackend.value,
744
775
  model: fModel.value.trim() || null,
745
776
  auto_pause_after: auto.toggle.checked ? null : Number(auto.input.value),
777
+ tool_progress: toolProgress.toggle.checked ? null : toolProgress.input.value,
778
+ reply_completion_guard: replyGuard.toggle.checked ? null : replyGuard.input.checked,
746
779
  collab: fCollab.checked,
747
780
  context_lines: Number(fContext.value),
748
781
  };
782
+ const patch = changedFields(nextPatch, {
783
+ backend: c.backend || inheritedBackend,
784
+ model: c.model?.trim() || null,
785
+ auto_pause_after: hasOwn(c, "auto_pause_after") ? c.auto_pause_after : null,
786
+ tool_progress: hasOwn(c, "tool_progress") ? c.tool_progress : null,
787
+ reply_completion_guard: hasOwn(c, "reply_completion_guard") ? c.reply_completion_guard : null,
788
+ collab: !!c.collab,
789
+ context_lines: c.context_lines ?? classicDefaults.context_lines ?? 5,
790
+ });
791
+ if (Object.keys(patch).length === 0) { editingClassic = null; renderClassic(); return; }
749
792
  state.classic.channels[c.key] = { ...state.classic.channels[c.key], ...patch };
750
793
  if (patch.model === null) delete state.classic.channels[c.key].model;
751
794
  if (patch.auto_pause_after === null) delete state.classic.channels[c.key].auto_pause_after;
795
+ if (patch.tool_progress === null) delete state.classic.channels[c.key].tool_progress;
796
+ if (patch.reply_completion_guard === null) delete state.classic.channels[c.key].reply_completion_guard;
797
+ const hotOnly = Object.keys(patch).every(key => key === "tool_progress" || key === "reply_completion_guard");
752
798
  stageChange(`classic:${c.key}`, {
753
799
  label: `Update ${c.name || c.instanceName}`,
754
- impact: "instance",
800
+ impact: hotOnly ? "now" : "instance",
755
801
  apply: () => api(`/api/settings/classic/channels/${encodeURIComponent(c.key)}`, { method: "PATCH", body: JSON.stringify(patch) }),
756
802
  });
757
803
  editingClassic = null;
@@ -763,6 +809,8 @@
763
809
  el("div", {}, el("label", {}, t("backend"), impact("instance")), fBackend),
764
810
  el("div", {}, el("label", {}, t("model"), impact("instance")), fModel),
765
811
  el("div", {}, el("label", {}, `${t("autoPause")} (${t("minutes")})`, impact("instance")), auto.row, autoFeedback),
812
+ el("div", {}, el("label", {}, t("toolProgress"), impact("now")), toolProgress.row),
813
+ el("div", {}, el("label", {}, t("replyCompletionGuard"), impact("now")), replyGuard.row, replyHint),
766
814
  el("div", {}, el("label", { style: "display:flex;align-items:center;gap:8px;cursor:pointer;margin-top:28px" }, fCollab, el("span", {}, "Collaboration mode"), impact("instance")))),
767
815
  el("div", { class: "advanced-only" },
768
816
  el("label", {}, "Context lines", impact("instance")), fContext, contextFeedback),
@@ -872,7 +920,11 @@
872
920
  const fModel = el("input", { type: "text", value: d.model || "", placeholder: "e.g. claude-opus-4-8" });
873
921
  const fAgentMode = select(d.agent_mode || "mcp", ["mcp", "cli"]);
874
922
  const fToolSet = select(d.tool_set || "full", ["full", "standard", "minimal"]);
875
- const fToolProgress = select(d.tool_progress || "off", ["off", "standard", "verbose"]);
923
+ const fToolProgress = select(d.tool_progress ?? "off", ["off", "standard", "verbose"]);
924
+ const fReplyGuard = el("input", { type: "checkbox" }); fReplyGuard.checked = d.reply_completion_guard ?? true;
925
+ const fClassicToolProgress = overrideControl(c, "tool_progress", select(c.tool_progress ?? d.tool_progress ?? "off", ["off", "standard", "verbose"]), d.tool_progress ?? "off", "now");
926
+ const fClassicReplyInput = el("input", { type: "checkbox" }); fClassicReplyInput.checked = c.reply_completion_guard ?? d.reply_completion_guard ?? true;
927
+ const fClassicReplyGuard = overrideControl(c, "reply_completion_guard", fClassicReplyInput, d.reply_completion_guard ?? true, "now");
876
928
  const fAccessMode = select(originalPrimaryAccess.mode || "locked", ["locked", "open", "pairing"]);
877
929
  const fLogLevel = select(d.log_level || "info", ["trace", "debug", "info", "warn", "error"]);
878
930
  const fLocale = el("select");
@@ -889,6 +941,17 @@
889
941
  const staggerFeedback = el("div", { class: "feedback" });
890
942
  const accessFeedback = el("div", { class: "feedback" });
891
943
  const saveBtn = el("button", { class: "primary" }, t("save"));
944
+ const defaultReplyHint = replyGuardHint(fBackend.value, fAgentMode.value);
945
+ const classicReplyHint = replyGuardHint(fClassicBackend.value, fAgentMode.value);
946
+ const refreshDefaultReplyHints = () => {
947
+ const fleetSupported = replyGuardSupported(fBackend.value, fAgentMode.value);
948
+ defaultReplyHint.textContent = fleetSupported ? t("replyGuardSupported") : tf("replyGuardUnsupported", fBackend.value, fAgentMode.value);
949
+ const classicSupported = replyGuardSupported(fClassicBackend.value, fAgentMode.value);
950
+ classicReplyHint.textContent = classicSupported ? t("replyGuardSupported") : tf("replyGuardUnsupported", fClassicBackend.value, fAgentMode.value);
951
+ };
952
+ fBackend.addEventListener("change", refreshDefaultReplyHints);
953
+ fClassicBackend.addEventListener("change", refreshDefaultReplyHints);
954
+ fAgentMode.addEventListener("change", refreshDefaultReplyHints);
892
955
  const validate = () => {
893
956
  const auto = Number(fAutoPause.value), timeout = Number(fHangTimeout.value);
894
957
  const concurrency = Number(fConcurrency.value), stagger = Number(fStagger.value);
@@ -915,6 +978,7 @@
915
978
  agent_mode: fAgentMode.value,
916
979
  tool_set: fToolSet.value,
917
980
  tool_progress: fToolProgress.value,
981
+ reply_completion_guard: fReplyGuard.checked,
918
982
  log_level: fLogLevel.value,
919
983
  hang_detector: { enabled: fHangEnabled.checked, timeout_minutes: Number(fHangTimeout.value) },
920
984
  startup: { concurrency: Number(fConcurrency.value), stagger_delay_ms: Number(fStagger.value) },
@@ -926,21 +990,31 @@
926
990
  auto_pause_after: d.auto_pause_after ?? 0,
927
991
  agent_mode: d.agent_mode || "mcp",
928
992
  tool_set: d.tool_set || "full",
929
- tool_progress: d.tool_progress || "off",
993
+ tool_progress: d.tool_progress ?? "off",
994
+ reply_completion_guard: d.reply_completion_guard ?? true,
930
995
  log_level: d.log_level || "info",
931
996
  hang_detector: { enabled: hang.enabled !== false, timeout_minutes: hang.timeout_minutes ?? 15 },
932
997
  startup: { concurrency: startup.concurrency ?? 10, stagger_delay_ms: startup.stagger_delay_ms ?? 500 },
933
998
  });
934
999
  const classicPatch = changedFields(
935
- { backend: fClassicBackend.value, admin_users: c.admin_users, allowed_guilds: c.allowed_guilds },
1000
+ {
1001
+ backend: fClassicBackend.value,
1002
+ tool_progress: fClassicToolProgress.toggle.checked ? null : fClassicToolProgress.input.value,
1003
+ reply_completion_guard: fClassicReplyGuard.toggle.checked ? null : fClassicReplyGuard.input.checked,
1004
+ admin_users: c.admin_users,
1005
+ allowed_guilds: c.allowed_guilds,
1006
+ },
936
1007
  {
937
1008
  backend: originalClassicDefaults.backend || d.backend || "claude-code",
1009
+ tool_progress: hasOwn(originalClassicDefaults, "tool_progress") ? originalClassicDefaults.tool_progress : null,
1010
+ reply_completion_guard: hasOwn(originalClassicDefaults, "reply_completion_guard") ? originalClassicDefaults.reply_completion_guard : null,
938
1011
  admin_users: originalClassicDefaults.admin_users || [],
939
1012
  allowed_guilds: originalClassicDefaults.allowed_guilds || [],
940
1013
  },
941
1014
  );
942
1015
  state.fleet.defaults = { ...d, ...defaultsPatch };
943
1016
  state.classic.defaults = { ...c, ...classicPatch };
1017
+ for (const [key, value] of Object.entries(classicPatch)) if (value === null) delete state.classic.defaults[key];
944
1018
  if (Object.keys(defaultsPatch).length > 0) {
945
1019
  stageChange("defaults:fleet", { label: "Update Agent defaults", impact: Object.keys(defaultsPatch).every(key => HOT_FIELDS.has(key)) ? "now" : "instance", apply: () => api("/api/settings/fleet/defaults", { method: "PUT", body: JSON.stringify(defaultsPatch) }) });
946
1020
  }
@@ -962,7 +1036,8 @@
962
1036
  }
963
1037
  }
964
1038
  if (Object.keys(classicPatch).length > 0) {
965
- stageChange("defaults:classic", { label: "Update ClassicBot defaults and access", impact: "fleet", apply: () => api("/api/settings/classic/defaults", { method: "PUT", body: JSON.stringify(classicPatch) }) });
1039
+ const classicHotOnly = Object.keys(classicPatch).every(key => key === "tool_progress" || key === "reply_completion_guard");
1040
+ stageChange("defaults:classic", { label: "Update ClassicBot defaults and access", impact: classicHotOnly ? "now" : "fleet", apply: () => api("/api/settings/classic/defaults", { method: "PUT", body: JSON.stringify(classicPatch) }) });
966
1041
  }
967
1042
  msg.innerHTML = `<span class="s">${esc(t("readyApply"))}</span>`;
968
1043
  };
@@ -978,10 +1053,14 @@
978
1053
  el("div", { class: "field" }, el("label", {}, t("language"), impact("now")), fLocale),
979
1054
  el("div", { class: "field" }, el("label", {}, t("defaultBackend"), impact("instance")), fBackend),
980
1055
  el("div", { class: "field" }, el("label", {}, t("defaultModel"), impact("instance")), fModel),
981
- el("div", { class: "field" }, el("label", {}, `${t("autoPause")} (${t("minutes")})`, impact("now")), fAutoPause, autoFeedback))),
1056
+ el("div", { class: "field" }, el("label", {}, `${t("autoPause")} (${t("minutes")})`, impact("now")), fAutoPause, autoFeedback),
1057
+ el("div", { class: "field" }, el("label", {}, t("toolProgress"), impact("now")), fToolProgress),
1058
+ el("div", { class: "field" }, el("label", { style: "display:flex;align-items:center;gap:8px" }, fReplyGuard, el("span", {}, t("replyCompletionGuard")), impact("now")), defaultReplyHint))),
982
1059
  section("ClassicBot", true,
983
1060
  el("div", { class: "grid2" },
984
- el("div", { class: "field" }, el("label", {}, "Classic default backend", impact("instance")), fClassicBackend)),
1061
+ el("div", { class: "field" }, el("label", {}, "Classic default backend", impact("instance")), fClassicBackend),
1062
+ el("div", { class: "field" }, el("label", {}, t("toolProgress"), impact("now")), fClassicToolProgress.row),
1063
+ el("div", { class: "field" }, el("label", {}, t("replyCompletionGuard"), impact("now")), fClassicReplyGuard.row, classicReplyHint)),
985
1064
  el("div", { class: "field" }, el("strong", {}, "Who can use ClassicBot"),
986
1065
  el("div", { class: "grid2" },
987
1066
  el("div", {}, el("label", {}, t("classicAdmins"), impact("fleet")), chipList(c.admin_users, null, "user id")),
@@ -990,7 +1069,6 @@
990
1069
  section(t("runtimeResources"), false,
991
1070
  el("div", { class: "grid2" },
992
1071
  el("div", { class: "field" }, el("label", {}, t("toolSet"), impact("instance")), fToolSet),
993
- el("div", { class: "field" }, el("label", {}, t("toolProgress"), impact("now")), fToolProgress),
994
1072
  el("div", { class: "field" }, el("label", {}, t("logLevel"), impact("now")), fLogLevel),
995
1073
  el("div", { class: "field" }, el("label", {}, t("agentMode"), impact("instance")), fAgentMode))),
996
1074
  section(t("detection"), false,
package/dist/ui/view.html CHANGED
@@ -26,7 +26,9 @@
26
26
  .inst.active { background: rgba(88,166,255,.14); border-left: 3px solid var(--accent); padding-left: 13px; }
27
27
  .dot { width: 8px; height: 8px; border-radius: 50%; flex: 0 0 8px; }
28
28
  .dot.running { background: #3fb950; } .dot.stopped { background: #6e7681; } .dot.crashed { background: #f85149; }
29
- .inst .nm { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
29
+ .inst .identity { flex: 1; min-width: 0; }
30
+ .inst .nm { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
31
+ .inst .alias { display: block; margin-top: 2px; color: var(--dim); font-size: 11px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
30
32
  .inst .pct { color: var(--dim); font-size: 11px; }
31
33
  .cli-icon { width: 10px; height: 10px; flex: 0 0 10px; border-radius: 50%; border: 1px solid rgba(255,255,255,.24); box-shadow: 0 0 0 1px rgba(0,0,0,.18); }
32
34
  .cli-claude-code { background: #c678dd; }
@@ -191,6 +193,7 @@
191
193
  usageUpdated: "updated", usageRefresh: "Refresh", usageHigh: "high", usageNear: "near limit",
192
194
  usageMoveUp: "Move up", usageMoveDown: "Move down",
193
195
  tooltipBackend: "Backend: {value}", tooltipStatus: "Status: {value}", tooltipContext: "Context: {value}",
196
+ tooltipModel: "Model: {value}", tooltipEffort: "Effort: {value}",
194
197
  tooltipUnavailable: "Unavailable", statusRunning: "Running", statusPaused: "Paused",
195
198
  statusStopped: "Stopped", statusCrashed: "Crashed", statusUnknown: "Unknown",
196
199
  usageResets: "resets in {t}", usageSoon: "resets soon", usageFail: "Could not load usage data.",
@@ -253,6 +256,7 @@
253
256
  usageUpdated: "更新於", usageRefresh: "重新整理", usageHigh: "偏高", usageNear: "接近上限",
254
257
  usageMoveUp: "上移", usageMoveDown: "下移",
255
258
  tooltipBackend: "後端:{value}", tooltipStatus: "狀態:{value}", tooltipContext: "上下文:{value}",
259
+ tooltipModel: "模型:{value}", tooltipEffort: "推理強度:{value}",
256
260
  tooltipUnavailable: "無資料", statusRunning: "運行中", statusPaused: "已暫停",
257
261
  statusStopped: "已停止", statusCrashed: "已崩潰", statusUnknown: "未知",
258
262
  usageResets: "{t}後重置", usageSoon: "即將重置", usageFail: "無法載入用量資料。",
@@ -414,14 +418,9 @@
414
418
  if (tags.length) return tags[0];
415
419
  return "Other";
416
420
  }
417
- // Short label: display name if set, else instance name minus its tag prefix
418
- // and the -t<id> suffix (doupo-server-t1503… → server).
419
- function shortName(it) {
420
- if (it.display_name) return it.display_name;
421
- let n = it.instance_name.replace(/-t[0-9a-z]+$/i, "");
422
- const tag = (it.tags || [])[0];
423
- if (tag && n.toLowerCase().startsWith(tag.toLowerCase() + "-")) n = n.slice(tag.length + 1);
424
- return n || it.instance_name;
421
+ function sidebarAlias(it) {
422
+ const alias = typeof it.display_name === "string" ? it.display_name.trim() : "";
423
+ return alias && alias !== it.instance_name ? alias : "";
425
424
  }
426
425
 
427
426
  const BACKEND_LABELS = {
@@ -451,18 +450,33 @@
451
450
  }
452
451
 
453
452
  function instanceTooltip(it) {
454
- const context = typeof it.context_pct === "number" && Number.isFinite(it.context_pct)
453
+ const context = it.context_pct != null && Number.isFinite(it.context_pct)
455
454
  ? `${Math.round(Math.min(100, Math.max(0, it.context_pct)))}%`
456
455
  : T("tooltipUnavailable");
457
456
  const statusKey = STATUS_LABEL_KEYS[it.status];
458
457
  const status = statusKey ? T(statusKey) : it.status || T("statusUnknown");
459
458
  const translated = (key, value) => T(key).replace("{value}", value);
460
- const lines = [
461
- it.instance_name,
462
- translated("tooltipBackend", backendLabel(it.backend)),
463
- translated("tooltipStatus", status),
464
- translated("tooltipContext", context),
465
- ];
459
+ // B3: display_name as first line, then raw instance_name if they differ
460
+ const lines = [];
461
+ if (it.display_name && it.display_name !== it.instance_name) {
462
+ lines.push(it.display_name);
463
+ lines.push(`(${it.instance_name})`);
464
+ } else {
465
+ lines.push(it.instance_name);
466
+ }
467
+ lines.push(translated("tooltipBackend", backendLabel(it.backend)));
468
+ // Model with source labeling: instance/classic → configured, fleet-default → fleet default
469
+ // live/cli-default/unresolved → no suffix (resolved.display already explains)
470
+ const modelDisplay = it.model || T("tooltipUnavailable");
471
+ const modelSuffix = it.model_source === "instance" || it.model_source === "classic" ? " (configured)" : it.model_source === "fleet-default" ? " (fleet default)" : "";
472
+ lines.push(translated("tooltipModel", modelDisplay + modelSuffix));
473
+ lines.push(translated("tooltipStatus", status));
474
+ lines.push(translated("tooltipContext", context));
475
+ // Effort: only show if present (backend capability already filtered by getUiStatus)
476
+ if (it.effort) {
477
+ const effortSuffix = it.effort_source === "instance" || it.effort_source === "classic" ? " (configured)" : it.effort_source === "fleet-default" ? " (fleet default)" : "";
478
+ lines.push(translated("tooltipEffort", it.effort + effortSuffix));
479
+ }
466
480
  if (typeof it.description === "string" && it.description.trim()) {
467
481
  lines.push("", it.description.trim());
468
482
  }
@@ -521,7 +535,9 @@
521
535
  const el = document.createElement("div");
522
536
  el.className = "inst" + (name === current ? " active" : "");
523
537
  el.draggable = true;
524
- el.innerHTML = `<span class="dot ${it.status}"></span><span class="nm">${esc(shortName(it))}</span><span class="pct">${it.context_pct ? Math.round(it.context_pct)+"%" : ""}</span>${backendIconHtml(it.backend)}`;
538
+ // M2: context_pct != null shows value including 0%; null means unavailable (empty)
539
+ const alias = sidebarAlias(it);
540
+ el.innerHTML = `<span class="dot ${it.status}"></span><span class="identity"><span class="nm">${esc(it.instance_name)}</span>${alias ? `<span class="alias">${esc(alias)}</span>` : ""}</span><span class="pct">${it.context_pct != null ? Math.round(it.context_pct)+"%" : ""}</span>${backendIconHtml(it.backend)}`;
525
541
  el.title = instanceTooltip(it);
526
542
  el.onclick = () => select(name);
527
543
  wireDrag(el, { type: "instance", name, group: g });
@@ -612,9 +628,8 @@
612
628
  if (!it) return;
613
629
  q("dname").textContent = it.display_name || it.instance_name;
614
630
  q("role").textContent = it.role || "";
615
- // Only show ctx% when we actually have a reading (>0); 0/null means the
616
- // backend didn't report one, so hiding it avoids a misleading "0%".
617
- const ctxPart = it.context_pct ? ` · ctx ${Math.round(it.context_pct)}%` : "";
631
+ // R2: context_pct != null shows value including 0%; null means unavailable (hide)
632
+ const ctxPart = it.context_pct != null ? ` · ctx ${Math.round(it.context_pct)}%` : "";
618
633
  q("meta").textContent = `${it.instance_name} · ${it.backend}${it.model ? " · " + it.model : ""}${ctxPart} · ${it.status}`;
619
634
  q("desc").textContent = it.description || "";
620
635
  // Only issue an <img> request when an avatar actually exists — otherwise a
@@ -13,6 +13,7 @@ export interface ViewApiContext {
13
13
  name: string;
14
14
  backend?: string;
15
15
  channelId: string;
16
+ displayName?: string;
16
17
  }[];
17
18
  getBackendByInstance(name: string, fleetDefault?: string): string;
18
19
  } | null;
package/dist/view-api.js CHANGED
@@ -228,13 +228,23 @@ export function handleViewRequest(req, res, url, ctx) {
228
228
  const classic = classicByName.get(name);
229
229
  const l = live.get(name);
230
230
  const p = profiles.get(name);
231
+ // display_name priority: profile DB > fleet config > classic channel > null
232
+ const display_name = p?.display_name
233
+ ?? cfg?.display_name
234
+ ?? classic?.displayName
235
+ ?? l?.display_name
236
+ ?? null;
231
237
  return {
232
238
  instance_name: name,
233
239
  status: l?.status ?? ctx.getInstanceStatus(name),
234
- context_pct: l?.context_pct ?? 0,
240
+ context_pct: l?.context_pct ?? null, // null when unavailable, not 0
235
241
  // Prefer the CLI's live statusline when it reports a model; Classic and
236
242
  // non-statusline backends fall back to the shared effective resolver.
237
243
  model: l?.model || ctx.resolveInstanceModel?.(name).model || "",
244
+ model_source: l?.model_source ?? "unresolved",
245
+ // Effort: only the configured value (no live file from CLI), with capability check.
246
+ effort: l?.effort ?? null,
247
+ effort_source: l?.effort_source ?? null,
238
248
  // Prefer explicit instance backend; else classic resolver; else fleet
239
249
  // default — never hardcode "claude-code" when defaults.backend is kiro.
240
250
  backend: cfg?.backend
@@ -243,7 +253,7 @@ export function handleViewRequest(req, res, url, ctx) {
243
253
  : ctx.fleetConfig?.defaults?.backend)
244
254
  ?? "claude-code",
245
255
  tags: cfg?.tags ?? (classic ? ["classic"] : []),
246
- display_name: p?.display_name ?? null,
256
+ display_name,
247
257
  role: p?.role ?? null,
248
258
  avatar_path: p?.avatar_path ?? null,
249
259
  description: p?.description ?? cfg?.description ?? null,
@@ -1 +1 @@
1
- {"version":3,"file":"view-api.js","sourceRoot":"","sources":["../src/view-api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"view-api.js","sourceRoot":"","sources":["../src/view-api.ts"],"names":[],"mappings":"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"}
package/dist/web-api.d.ts CHANGED
@@ -4,6 +4,7 @@
4
4
  */
5
5
  import type { IncomingMessage, ServerResponse } from "node:http";
6
6
  import type { LifecycleCreateArgs } from "./instance-lifecycle.js";
7
+ import type { ExplicitInstanceRemoval } from "./instance-removal.js";
7
8
  /**
8
9
  * Push a single SSE frame to every client. If a client throws (closed socket
9
10
  * after a network drop, etc.), evict it from the set and continue — without
@@ -21,11 +22,16 @@ export interface WebApiContext {
21
22
  group_id?: number | string;
22
23
  mode?: string;
23
24
  };
25
+ defaults?: {
26
+ backend?: string;
27
+ effort?: string;
28
+ };
24
29
  instances: Record<string, {
25
30
  topic_id?: number | string;
26
31
  working_directory: string;
27
32
  description?: string;
28
33
  display_name?: string;
34
+ backend?: string;
29
35
  }>;
30
36
  teams?: Record<string, {
31
37
  members: string[];
@@ -67,13 +73,28 @@ export interface WebApiContext {
67
73
  startInstance(name: string, config: unknown, topicMode: boolean): Promise<void>;
68
74
  stopInstance(name: string): Promise<void>;
69
75
  restartSingleInstance(name: string): Promise<void>;
70
- removeInstance(name: string): Promise<void>;
76
+ removeInstance(name: string, authorization: ExplicitInstanceRemoval): Promise<void>;
71
77
  lastInboundUser: Map<string, string>;
72
78
  saveFleetConfig(): void;
73
79
  readonly lifecycle: {
74
80
  handleCreate(args: LifecycleCreateArgs, respond: (result: unknown, error?: string) => void): Promise<void>;
75
81
  };
76
82
  connectIpcToInstance(name: string): Promise<void>;
83
+ /** Human-readable model string (aligned with /ctx). */
84
+ modelDisplayForInstance?(name: string): string;
85
+ /** Full model resolution with source. */
86
+ resolveInstanceModel?(name: string): {
87
+ model: string;
88
+ source: string;
89
+ display: string;
90
+ };
91
+ /** Configured effort for an instance (no live file from CLI). */
92
+ resolveInstanceEffort?(name: string): {
93
+ effort: string | null;
94
+ source: "instance" | "fleet-default" | "unset";
95
+ };
96
+ /** Effort strategy for backend capability check. */
97
+ effortStrategyFor?(name: string): "runtime" | "restart" | "unsupported";
77
98
  readonly scheduler: {
78
99
  db: {
79
100
  listTasks(opts?: {
package/dist/web-api.js CHANGED
@@ -3,8 +3,10 @@ import { join, dirname } from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
4
  import { execFileSync } from "node:child_process";
5
5
  import { CreateInstanceArgs, validateArgs } from "./outbound-schemas.js";
6
+ import { readStatuslineModel, resolveInstanceContext } from "./topic-commands.js";
6
7
  import { z } from "zod";
7
8
  import { WEB_TOKEN_INVALID_MESSAGE } from "./web-auth.js";
9
+ import { authorizeExplicitInstanceRemoval } from "./instance-removal.js";
8
10
  // ── Strict public-facing schemas ────────────────────────────────────────────
9
11
  // web-api endpoints must reject unknown fields so the dashboard cannot inject
10
12
  // internal-only flags that would reach handleCreate/scheduler/config writers.
@@ -278,7 +280,7 @@ export function handleWebRequest(req, res, url, ctx) {
278
280
  json(res, 400, { error: `Confirmation required: { "confirm": "delete ${name}" }` });
279
281
  return;
280
282
  }
281
- await ctx.removeInstance(name);
283
+ await ctx.removeInstance(name, authorizeExplicitInstanceRemoval("dashboard-confirmed"));
282
284
  ctx.emitSseEvent("status", ctx.getUiStatus());
283
285
  json(res, 200, { deleted: name });
284
286
  }
@@ -305,12 +307,34 @@ export function handleWebRequest(req, res, url, ctx) {
305
307
  catch { /* */ }
306
308
  const activity = ctx.eventLog?.listActivity({ since: new Date(Date.now() - 3600_000).toISOString(), limit: 50 }) ?? [];
307
309
  const instanceActivity = activity.filter(a => a.sender === name || a.receiver === name);
310
+ // Backend: instance → fleet default → claude-code
311
+ const backend = config.backend ?? ctx.fleetConfig?.defaults?.backend ?? "claude-code";
312
+ // Context: aligned with /ctx — resolveInstanceContext, not statusline
313
+ const { context } = resolveInstanceContext(ctx.dataDir, name, backend);
314
+ const context_pct = context; // null when unavailable, not 0
315
+ // Model: Claude Code has live statusline, others use the effective resolver (aligned with /ctx).
316
+ const statuslineModel = backend === "claude-code" ? readStatuslineModel(ctx.dataDir, name) : null;
317
+ const resolved = ctx.resolveInstanceModel?.(name);
318
+ const model = statuslineModel ?? resolved?.display ?? ctx.modelDisplayForInstance?.(name);
319
+ const model_source = statuslineModel ? "live" : (resolved?.source ?? "unresolved");
320
+ // Effort: aligned with /ctx's effortLineFor — unsupported and antigravity don't show effort.
321
+ const effortStrategy = ctx.effortStrategyFor?.(name) ?? "unsupported";
322
+ const isAgy = backend === "antigravity" || backend === "agy";
323
+ const effortResolved = ctx.resolveInstanceEffort?.(name);
324
+ const effort = (effortStrategy === "unsupported" || isAgy) ? null : (effortResolved?.effort ?? null);
325
+ const effort_source = (effortStrategy === "unsupported" || isAgy) ? null : (effortResolved?.source ?? "unset");
308
326
  json(res, 200, {
309
327
  name,
310
328
  status: ctx.getInstanceStatus(name),
311
329
  description: config.description,
312
330
  display_name: config.display_name,
313
331
  working_directory: config.working_directory,
332
+ backend,
333
+ context_pct,
334
+ model,
335
+ model_source,
336
+ effort,
337
+ effort_source,
314
338
  statusline,
315
339
  recent_activity: instanceActivity.slice(0, 20),
316
340
  });