Merge origin/main into bb/gui

This commit is contained in:
Brooklyn Nicholson
2026-05-05 00:21:31 -05:00
51 changed files with 2822 additions and 223 deletions
+4 -1
View File
@@ -1996,7 +1996,10 @@
return h("div", { className: "hermes-kanban-actions" },
b("→ triage", { status: "triage" }, t.status !== "triage"),
b("→ ready", { status: "ready" }, t.status !== "ready"),
b("→ running", { status: "running" }, t.status !== "running"),
// No direct → running button: /tasks/:id PATCH rejects status=running
// with 400 (issue #19535). Tasks enter running only through the
// dispatcher's claim_task path, which atomically creates the run row,
// claim lock, and worker process metadata.
b("Block", { status: "blocked" },
t.status === "running" || t.status === "ready",
DESTRUCTIVE_TRANSITIONS.blocked),
+8 -4
View File
@@ -364,11 +364,15 @@
letter-spacing: 0.02em;
}
.hermes-kanban-home-sub--on {
/* Subtly indicate the subscribed state without a hard color change so
* dashboard themes stay coherent. Border + tinted background. */
border-color: color-mix(in srgb, var(--color-ring) 55%, var(--color-border));
background: color-mix(in srgb, var(--color-ring) 14%, transparent);
/* Subscribed toggle — use a strong ring-colored accent so the on/off
* distinction reads at a glance, not just from the ✓ prefix. Border +
* filled background + bolder weight keep the state obvious across
* themes (tested on default teal and NERV orange). */
border-color: var(--color-ring);
background: color-mix(in srgb, var(--color-ring) 32%, transparent);
color: var(--color-foreground);
font-weight: 600;
box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--color-ring) 40%, transparent);
}
.hermes-kanban-section {
+14 -1
View File
@@ -509,7 +509,20 @@ class TeamsAdapter(BasePlatformAdapter):
for chunk in chunks:
try:
result = await self._app.send(chat_id, chunk)
if reply_to and reply_to.isdigit() and reply_to != "0":
try:
result = await self._app.reply(chat_id, reply_to, chunk)
except Exception as reply_err:
# Group chats 400 on threaded sends; the Teams SDK
# doesn't expose typed HTTP errors, so fall back on
# any exception and log for diagnostics.
logger.debug(
"Teams reply() failed, falling back to flat send: %s",
reply_err,
)
result = await self._app.send(chat_id, chunk)
else:
result = await self._app.send(chat_id, chunk)
last_message_id = getattr(result, "id", None)
except Exception as e:
return SendResult(success=False, error=str(e), retryable=True)