fix(tui): restore the launch mark and finish community candidate notes

Restore the canonical raster-derived mark in a responsive header while retaining full-width session rows and reachable launch controls. Pin the first-party catalog to marketplace d8640b1 after its three-OS CI passed, including the matching Computer Use fix. Credit AdityaVG13 and record branch/compaction fixes in the candidate changelog and website ledger.

Validation: mark/launch/marketplace focused tests 51 passed, 0 failed; fresh npm test 551 passed, 0 failed; npm run check:web passed; fmt and version consistency checks passed (48 feature-note references). The candidate remains 0.9.14; no release or publication.
This commit is contained in:
CodeWhale Bot committed 2026-09-19 17:51:20 -07:00
1 parent 4ab08d49bf
commit 515eef83dc
8 files changed
+153 -22

No files matched your search

+11
View File
@@ -14,6 +14,7 @@ tag, packages, checksums and release assets exist.
### Contributors
- **[@AdityaVG13](https://github.com/AdityaVG13)** — fixed composer wrapping, tab/caret placement, pasted and editor-returned draft history, painted-column transcript copying, explicit terminal foregrounds, and headless user-input tool availability ([#6363](https://github.com/Hmbown/Codewhale/pull/6363), [#6365](https://github.com/Hmbown/Codewhale/pull/6365)).
- **[@aboimpinto](https://github.com/aboimpinto)** — moved the TUI session-export slice onto shared command contracts (FEAT-025): a session-export contract facet with one shared sanitizer, `/export` routed through the facet, pinned with baseline-captured goldens and gates ([#6096](https://github.com/Hmbown/Codewhale/pull/6096)).
- **[@BX166](https://github.com/BX166)** — contributed the AICraft provider template and its documentation ([#6171](https://github.com/Hmbown/Codewhale/pull/6171)). It was closed unmerged, but it is what surfaced the decision to stop special-casing named OpenAI-compatible hosts ([#6289](https://github.com/Hmbown/Codewhale/issues/6289)).
- **[@7jrxt42BxFZo4iAnN4CX](https://github.com/7jrxt42BxFZo4iAnN4CX)** — reported the session-retention defects behind archive-past-the-cap and empty-session cap occupancy ([#6136](https://github.com/Hmbown/Codewhale/issues/6136), [#6137](https://github.com/Hmbown/Codewhale/issues/6137)), the resume-failure design behind durable transcript errors ([#6138](https://github.com/Hmbown/Codewhale/issues/6138)), and the gaps behind the opt-in approval timeout ([#6101](https://github.com/Hmbown/Codewhale/issues/6101)), `codewhale exec --hooks` ([#6099](https://github.com/Hmbown/Codewhale/issues/6099)), Markdown drag-copy ([#6156](https://github.com/Hmbown/Codewhale/issues/6156)), and the browsable, current-aware session picker ([#6014](https://github.com/Hmbown/Codewhale/issues/6014)); the goal token-budget hard stop ([#6013](https://github.com/Hmbown/Codewhale/issues/6013)) and the fleet no-progress guard shared with child workers ([#6015](https://github.com/Hmbown/Codewhale/issues/6015)) landed as first slices of two larger proposals, and the runtime-store session refusal ([#6207](https://github.com/Hmbown/Codewhale/issues/6207)).
@@ -216,6 +217,16 @@ tag, packages, checksums and release assets exist.
### Fixed
- Branch navigation preserves sibling histories, stable entry IDs and timestamps
through autosave, resume and forks, and synchronizes the selected branch into
the live engine. Thanks to @7jrxt42BxFZo4iAnN4CX for the report (#6367).
- Compaction now writes local diagnostic records for completed passes and
automatic refusals. `codewhale metrics` reports them with summarizer token
usage; text-mode exec retains its session after attempting compaction.
Historical artifacts are not backfilled. Thanks to @7jrxt42BxFZo4iAnN4CX
for identifying the missing producer (#6368).
- The opening workbench retains the canonical Codewhale mark in a responsive
header while keeping recent-session titles full-width and actions clickable.
- `serve --acp` no longer ignores the approval posture. The ACP adapter
hardcoded `ApprovalMode::Suggest`, so `--yolo` (and any configured
`approval_policy`) never reached admission: every mutating tool parked
+11
View File
@@ -14,6 +14,7 @@ tag, packages, checksums and release assets exist.
### Contributors
- **[@AdityaVG13](https://github.com/AdityaVG13)** — fixed composer wrapping, tab/caret placement, pasted and editor-returned draft history, painted-column transcript copying, explicit terminal foregrounds, and headless user-input tool availability ([#6363](https://github.com/Hmbown/Codewhale/pull/6363), [#6365](https://github.com/Hmbown/Codewhale/pull/6365)).
- **[@aboimpinto](https://github.com/aboimpinto)** — moved the TUI session-export slice onto shared command contracts (FEAT-025): a session-export contract facet with one shared sanitizer, `/export` routed through the facet, pinned with baseline-captured goldens and gates ([#6096](https://github.com/Hmbown/Codewhale/pull/6096)).
- **[@BX166](https://github.com/BX166)** — contributed the AICraft provider template and its documentation ([#6171](https://github.com/Hmbown/Codewhale/pull/6171)). It was closed unmerged, but it is what surfaced the decision to stop special-casing named OpenAI-compatible hosts ([#6289](https://github.com/Hmbown/Codewhale/issues/6289)).
- **[@7jrxt42BxFZo4iAnN4CX](https://github.com/7jrxt42BxFZo4iAnN4CX)** — reported the session-retention defects behind archive-past-the-cap and empty-session cap occupancy ([#6136](https://github.com/Hmbown/Codewhale/issues/6136), [#6137](https://github.com/Hmbown/Codewhale/issues/6137)), the resume-failure design behind durable transcript errors ([#6138](https://github.com/Hmbown/Codewhale/issues/6138)), and the gaps behind the opt-in approval timeout ([#6101](https://github.com/Hmbown/Codewhale/issues/6101)), `codewhale exec --hooks` ([#6099](https://github.com/Hmbown/Codewhale/issues/6099)), Markdown drag-copy ([#6156](https://github.com/Hmbown/Codewhale/issues/6156)), and the browsable, current-aware session picker ([#6014](https://github.com/Hmbown/Codewhale/issues/6014)); the goal token-budget hard stop ([#6013](https://github.com/Hmbown/Codewhale/issues/6013)) and the fleet no-progress guard shared with child workers ([#6015](https://github.com/Hmbown/Codewhale/issues/6015)) landed as first slices of two larger proposals, and the runtime-store session refusal ([#6207](https://github.com/Hmbown/Codewhale/issues/6207)).
@@ -216,6 +217,16 @@ tag, packages, checksums and release assets exist.
### Fixed
- Branch navigation preserves sibling histories, stable entry IDs and timestamps
through autosave, resume and forks, and synchronizes the selected branch into
the live engine. Thanks to @7jrxt42BxFZo4iAnN4CX for the report (#6367).
- Compaction now writes local diagnostic records for completed passes and
automatic refusals. `codewhale metrics` reports them with summarizer token
usage; text-mode exec retains its session after attempting compaction.
Historical artifacts are not backfilled. Thanks to @7jrxt42BxFZo4iAnN4CX
for identifying the missing producer (#6368).
- The opening workbench retains the canonical Codewhale mark in a responsive
header while keeping recent-session titles full-width and actions clickable.
- `serve --acp` no longer ignores the approval posture. The ACP adapter
hardcoded `ApprovalMode::Suggest`, so `--yolo` (and any configured
`approval_policy`) never reached admission: every mutating tool parked
@@ -1,6 +1,6 @@
{
"repository": "https://github.com/Hmbown/codewhale-plugin-marketplace",
"revision": "a9c2302c96b03ebf64a1562ea4ccdaea32c3c5cc",
"revision": "d8640b17f27542e7122c76368724196f92a0af61",
"catalog": {
"name": "codewhale",
"description": "First-party Codewhale extensions: the plugins and skills Codewhale ships, maintained in the open so anyone can propose a change.",
@@ -8,7 +8,7 @@
"plugins": [
{
"name": "computer-use",
"source": "https://codeload.github.com/Hmbown/codewhale-plugin-marketplace/tar.gz/a9c2302c96b03ebf64a1562ea4ccdaea32c3c5cc#path=plugins/computer-use",
"source": "https://codeload.github.com/Hmbown/codewhale-plugin-marketplace/tar.gz/d8640b17f27542e7122c76368724196f92a0af61#path=plugins/computer-use",
"version": "0.11.2",
"description": "Control apps with Codewhale. macOS beta; Windows and Linux backends are experimental and source-only.",
"homepage": "https://codewhale.net/computer-use",
@@ -21,7 +21,7 @@
},
{
"name": "whalesong",
"source": "https://codeload.github.com/Hmbown/codewhale-plugin-marketplace/tar.gz/a9c2302c96b03ebf64a1562ea4ccdaea32c3c5cc#path=plugins/whalesong",
"source": "https://codeload.github.com/Hmbown/codewhale-plugin-marketplace/tar.gz/d8640b17f27542e7122c76368724196f92a0af61#path=plugins/whalesong",
"version": "0.2.0",
"description": "Review agent traces and failures, compare runs, and turn session timing into audio. Requires the local Whalesong platform.",
"homepage": "https://github.com/Hmbown/codewhale-plugin-marketplace",
@@ -30,7 +30,7 @@
},
{
"name": "whalewiki",
"source": "https://codeload.github.com/Hmbown/codewhale-plugin-marketplace/tar.gz/a9c2302c96b03ebf64a1562ea4ccdaea32c3c5cc#path=plugins/whalewiki",
"source": "https://codeload.github.com/Hmbown/codewhale-plugin-marketplace/tar.gz/d8640b17f27542e7122c76368724196f92a0af61#path=plugins/whalewiki",
"version": "0.2.0",
"description": "Understand a repo, find where to change it, and see which docs depend on a file. Source citations, freshness checks and a searchable offline reader.",
"homepage": "https://github.com/Hmbown/codewhale-plugin-marketplace",
@@ -39,7 +39,7 @@
},
{
"name": "cloudflare-docs",
"source": "https://codeload.github.com/Hmbown/codewhale-plugin-marketplace/tar.gz/a9c2302c96b03ebf64a1562ea4ccdaea32c3c5cc#path=plugins/cloudflare-docs",
"source": "https://codeload.github.com/Hmbown/codewhale-plugin-marketplace/tar.gz/d8640b17f27542e7122c76368724196f92a0af61#path=plugins/cloudflare-docs",
"version": "0.1.0",
"description": "Search current Cloudflare documentation through its official remote MCP. No account or credential required.",
"homepage": "https://github.com/Hmbown/codewhale-plugin-marketplace",
@@ -48,7 +48,7 @@
},
{
"name": "codewhale-skills",
"source": "https://codeload.github.com/Hmbown/codewhale-plugin-marketplace/tar.gz/a9c2302c96b03ebf64a1562ea4ccdaea32c3c5cc#path=skills",
"source": "https://codeload.github.com/Hmbown/codewhale-plugin-marketplace/tar.gz/d8640b17f27542e7122c76368724196f92a0af61#path=skills",
"version": "1.1.0",
"description": "47 workflows for coding, research, documents, email, calendar, travel, shopping and local audio. Account and tool setup is separate; see the skill directory.",
"homepage": "https://github.com/Hmbown/codewhale-plugin-marketplace",
+67 -2
View File
@@ -1,10 +1,75 @@
//! Terminal color transitions and graphics capability diagnostics.
//! Launch identity is now a compact wordmark; no image is transmitted.
//! The Codewhale mark, derived from the canonical founder raster by
//! `scripts/brand/braille-mark.py`, and terminal color/capability helpers.
//! The launch header paints the mark as terminal cells; no image is transmitted.
use std::sync::OnceLock;
use ratatui::style::Color;
/// Rungs of the mark's scale ladder, each generated at its own box.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MarkSize {
/// Box 22×6, ink 14×6 — the launch screen's hero mark. Generated from the
/// same founder raster as the smaller rungs, at a size where the whale
/// reads as a whale.
Large,
/// Box 11×3, ink 7×3 — the launch header's mark.
Small,
/// Box 8×2, ink 5×2 — for stages too narrow for the header lines beside
/// the small rung.
Tiny,
}
// generated by scripts/brand/braille-mark.py from brand/codewhalemarkfinal.png
// (founder hero whale 504x453px, threshold 0.3, aspect preserved,
// edge columns trimmed, eye carved)
// LARGE: box 22x6 -> ink 14x6
const LARGE_ROWS: [&str; 6] = [
" ⣀⣴⣶⣾⣶⣆ ",
"⢀⣼⣿⠛⠉⠉⠙⠻⠟⠃ ",
"⢸⣿⡇ ⢀⣀⣤⣤⣤⣤⡀",
"⢸⣿⣷⣤⣤⣶⣿⣿⣿⡿⠟⠉⣹⠁",
"⠈⢻⣿⣿⣿⣿⣿⣷⠟ ⢀⡴⠁ ",
" ⠈⠉⠽⠿⣿⠥⠤⠒⠉ ",
];
// SMALL: box 11x3 -> ink 7x3
const SMALL_ROWS: [&str; 3] = [
"⢠⡶⠛⠧⠄ ", //
"⣿⣄⣠⣤⣶⠶⠆",
"⠘⠻⣿⣗⠡⠊ ",
];
// TINY: box 8x2 -> ink 5x2
const TINY_ROWS: [&str; 2] = [
"⢠⡞⠛⢂⣀", //
"⠘⠿⣿⠍⠉",
];
impl MarkSize {
/// Cell footprint as `(cols, rows)` — the ink's, not the design box's.
#[must_use]
pub const fn cells(self) -> (u16, u16) {
match self {
Self::Large => (14, 6),
Self::Small => (7, 3),
Self::Tiny => (5, 2),
}
}
/// The braille rows for this rung. Blank cells are spaces so the
/// renderer leaves the field behind them untouched.
#[must_use]
pub const fn rows(self) -> &'static [&'static str] {
match self {
Self::Large => &LARGE_ROWS,
Self::Small => &SMALL_ROWS,
Self::Tiny => &TINY_ROWS,
}
}
}
/// Blend `from` toward `to` (0.0 → `from`, 1.0 → `to`). At 0 the mark is
/// exactly the field colour, so it rises out of the water rather than over it.
#[must_use]
+49 -8
View File
@@ -1591,13 +1591,41 @@ pub fn launch_empty_state(app: &App, area: Rect) -> LaunchEmptyState {
// Built before the fit ladder runs: how many rows the block wants is a
// fact about this workspace's servers, not about the pane.
let mcp_block = mcp_launch_lines(app, text_width);
let fit = launch_fit(
height,
// Brand occupies the header only; recent titles retain the whole reading lane.
// Scale the canonical raster derivative before sacrificing any controls.
use crate::tui::mark::MarkSize;
let mut mark = if crate::tui::color_compat::ascii_safe_enabled() {
None
} else if height >= 14 && text_width >= 40 {
Some(MarkSize::Large)
} else if height >= 8 && text_width >= 26 {
Some(MarkSize::Small)
} else if height >= 4 && text_width >= 19 {
Some(MarkSize::Tiny)
} else {
None
};
let mark_extra = mark.map_or(0, |size| usize::from(size.cells().1).saturating_sub(2));
let mut fit = launch_fit(
height.saturating_sub(mark_extra),
entries.len(),
has_more,
app.launch.claude_code_detected,
mcp_block.lines.len(),
);
if mark.is_some() && !(fit.brand && fit.context) {
// At the absolute height floor the wordmark yields to the actions too.
mark = None;
fit = launch_fit(
height,
entries.len(),
has_more,
app.launch.claude_code_detected,
mcp_block.lines.len(),
);
}
let header_width =
text_width.saturating_sub(mark.map_or(0, |size| usize::from(size.cells().0) + 2));
let spacious = fit.blanks == LAUNCH_SEPARATORS;
let visible: Vec<LaunchRecentEntry> = entries.into_iter().take(fit.shown).collect();
let card_rows = launch_card_rows(locale, &visible, fit.see_all);
@@ -1608,15 +1636,15 @@ pub fn launch_empty_state(app: &App, area: Rect) -> LaunchEmptyState {
let brand = "codewhale";
let version = format!("v{}", env!("CODEWHALE_BUILD_VERSION"));
let mut spans = vec![Span::styled(
semantic_truncate(brand, text_width),
semantic_truncate(brand, header_width),
Style::default().fg(theme.accent_primary).bold(),
)];
if text_width >= text_display_width(brand) + 1 + text_display_width(&version) {
if header_width >= text_display_width(brand) + 1 + text_display_width(&version) {
spans.push(Span::styled(
format!(
"{}{version}",
" ".repeat(
text_width - text_display_width(brand) - text_display_width(&version)
header_width - text_display_width(brand) - text_display_width(&version)
)
),
Style::default().fg(theme.text_muted),
@@ -1631,17 +1659,30 @@ pub fn launch_empty_state(app: &App, area: Rect) -> LaunchEmptyState {
app.workspace_context.as_deref(),
);
let mut spans = vec![Span::styled(
semantic_truncate(&workspace, text_width),
semantic_truncate(&workspace, header_width),
Style::default().fg(theme.text_soft),
)];
if let Some(branch) = identity.branch {
let detail = format!(" · {branch}");
if text_display_width(&workspace) + text_display_width(&detail) <= text_width {
if text_display_width(&workspace) + text_display_width(&detail) <= header_width {
spans.push(Span::styled(detail, Style::default().fg(theme.text_muted)));
}
}
text.push(Some(Line::from(spans)));
}
if let Some(mark) = mark {
text.resize_with(usize::from(mark.cells().1), || None);
for (row, dots) in mark.rows().iter().enumerate() {
let mut spans = vec![
Span::styled(*dots, Style::default().fg(theme.accent_primary)),
Span::raw(" "),
];
if let Some(line) = text[row].take() {
spans.extend(line.spans);
}
text[row] = Some(Line::from(spans));
}
}
// The migration notice, while there is still a question to answer. It
// retires for good once `/import-claude` has been run.
if fit.notice {
@@ -2094,7 +2135,7 @@ mod launch_card_tests {
with_mcp(app_with_recent(&["one", "two", "three", "four", "five"], 9)),
] {
for width in [0u16, 1, 2, 3, 8, 12, 20, 31, 32, 40, 44, 64, 80, 120, 200] {
for height in 0u16..=10 {
for height in 0u16..=30 {
let state = launch_empty_state(&app, Rect::new(0, 0, width, height));
assert!(
state.lines.len() <= usize::from(height),
+1
View File
@@ -32,6 +32,7 @@ notes, and relevant issue/PR comments.
**Merged or adapted contributions**
- **[AdityaVG13](https://github.com/AdityaVG13)** — composer wrapping, pasted/editor draft history, painted-column transcript copying, tab/caret placement, explicit terminal foregrounds, and headless user-input tool availability ([#6363](https://github.com/Hmbown/Codewhale/pull/6363), [#6365](https://github.com/Hmbown/Codewhale/pull/6365)); both PRs merged with their original ancestry.
- **[aboimpinto](https://github.com/aboimpinto)** — moved the TUI session-export slice onto shared command contracts (FEAT-025): a session-export contract facet with one shared sanitizer, `/export` routed through the facet, pinned with baseline-captured goldens and gates ([#6096](https://github.com/Hmbown/Codewhale/pull/6096)).
**Reports and reproductions**
+7 -6
View File
@@ -37,6 +37,7 @@ export const CHANGELOG: ChangelogRelease[] = [
{
"heading": "Contributors",
"items": [
"@AdityaVG13 — fixed composer wrapping, tab/caret placement, pasted and editor-returned draft history, painted-column transcript copying, explicit terminal foregrounds, and headless user-input tool availability (#6363, #6365).",
"@aboimpinto — moved the TUI session-export slice onto shared command contracts (FEAT-025): a session-export contract facet with one shared sanitizer, /export routed through the facet, pinned with baseline-captured goldens and gates (#6096).",
"@BX166 — contributed the AICraft provider template and its documentation (#6171). It was closed unmerged, but it is what surfaced the decision to stop special-casing named OpenAI-compatible hosts (#6289).",
"@7jrxt42BxFZo4iAnN4CX — reported the session-retention defects behind archive-past-the-cap and empty-session cap occupancy (#6136, #6137), the resume-failure design behind durable transcript errors (#6138), and the gaps behind the opt-in approval timeout (#6101), codewhale exec --hooks (#6099), Markdown drag-copy (#6156), and the browsable, current-aware session picker (#6014); the goal token-budget hard stop (#6013) and the fleet no-progress guard shared with child workers…",
@@ -46,7 +47,7 @@ export const CHANGELOG: ChangelogRelease[] = [
"@sequico — reported the ACP session/new ids that session/load could not resolve, fixed by minting resolvable session ids (#6174).",
"@bevis-wong — reported the mid-run engine freeze behind the bounded turn-end foreground-child join, and the resume path that re-ran identical tool-call repair on every load instead of persisting it (#6184, #6185)."
],
"itemCount": 8
"itemCount": 9
},
{
"heading": "Security",
@@ -91,6 +92,9 @@ export const CHANGELOG: ChangelogRelease[] = [
{
"heading": "Fixed",
"items": [
"Branch navigation preserves sibling histories, stable entry IDs and timestamps through autosave, resume and forks, and synchronizes the selected branch into the live engine. Thanks to @7jrxt42BxFZo4iAnN4CX for the report (#6367).",
"Compaction now writes local diagnostic records for completed passes and automatic refusals. codewhale metrics reports them with summarizer token usage; text-mode exec retains its session after attempting compaction. Historical artifacts are not backfilled. Thanks to @7jrxt42BxFZo4iAnN4CX for identifying the missing producer (#6368).",
"The opening workbench retains the canonical Codewhale mark in a responsive header while keeping recent-session titles full-width and actions clickable.",
"serve --acp no longer ignores the approval posture. The ACP adapter hardcoded ApprovalMode::Suggest, so --yolo (and any configured approval_policy) never reached admission: every mutating tool parked behind a permission request no unattended client answers, and sessions executed zero tools. Posture now derives from server config — --yolo pre-approves prompts and flows into the sandbox policy — while hard blocks (safety floor, repo law, reviewer consult) and the Plan…",
"Plain agent spawns could not resolve. built_in_members() seeded both general and worker, and the role parse boundary migrates worker to general, so both canonicalized to the same role — and role:general, the selector the roster advertises for the default posture, matched two members and raised Ambiguous every time, permanently. The duplicate built-in is gone. The legacy name still resolves: general, member:general, role:general and default all land on the worker posture…",
"Clicking a path:line in tool output no longer spawns $EDITOR detached while the TUI still owns the terminal, and no longer spawns one editor per matching line. The launch goes through the single terminal-handoff path, and a click is one request to open one file (#6235).",
@@ -99,12 +103,9 @@ export const CHANGELOG: ChangelogRelease[] = [
"Double-tap Enter now sends every queued follow-up into the running turn, oldest first. The second Enter used to steer only the most recent message and leave older ones queued; a failed steer restores the failed message plus everything unattempted in original order, so nothing is lost or reordered.",
"Only the most recently sent prompt carries the elevated-surface background now; every older prompt renders on the bare ground. The fill used to sit behind every user row (striping), then behind none; newest-only keeps the eye on the turn in play. Sending a new prompt moves the highlight and un-highlights its predecessor.",
"Diff rows tint whole: added/deleted line numbers now share the row's green / red background instead of sitting bare next to a painted body. Context rows stay on the bare ground.",
"MCP connections are supervised now: a background task notices a dead server within one sweep, reconnects on the existing backoff ladder, and reports each transition, so Extensions rows flip with liveness instead of parking on stale-ready or a silent [reconnect]. Five consecutive failures park the server with a notice naming /mcp retry; an explicit retry or a fresh connection resumes watching. Tool calls also retry once across a dead pipe/socket (not just stale sessions), and…",
"A steer the engine never delivered is no longer reported as sent. The runtime API persisted the steer item as already-Completed and emitted turn.steered + item.completed the moment the text entered the engine's mailbox — before the engine decided anything. The engine discards a steer whose turn has moved on, and an interrupted or failed turn drops whatever it had queued, so a GUI could show \"Guidance sent\", clear the composer, and lose the user's words. The engine now…",
"<recommended_plugins> suggestions stop nagging: a plugin id is now injected at most once per engine lifetime, and a plugin whose name a loaded skill already covers is never suggested — the local skill owns the domain, so the nudge was noise. Dismissals still apply, and the fragment stays append-only on the user turn (#6274).",
"A canceled automation run now settles with a transcript receipt that names the cancellation (by request, cancel timeout, or shutdown) instead of vanishing from the live band silently. The receipt wears attention ink and never lights the failure demand; the run record keeps the cancellation reason as its error detail. (#6162)"
"MCP connections are supervised now: a background task notices a dead server within one sweep, reconnects on the existing backoff ladder, and reports each transition, so Extensions rows flip with liveness instead of parking on stale-ready or a silent [reconnect]. Five consecutive failures park the server with a notice naming /mcp retry; an explicit retry or a fresh connection resumes watching. Tool calls also retry once across a dead pipe/socket (not just stale sessions), and…"
],
"itemCount": 21
"itemCount": 24
}
]
},
+1
View File
@@ -20,6 +20,7 @@
/** Contributors whose PRs were merged or harvested into this release. */
export const RELEASE_CONTRIBUTORS: string[] = [
"@AdityaVG13",
"@aboimpinto",
];