Merge #550: keep Respawn and Ralph visible in Session Options for Claude sessions

This commit is contained in:
Codeman maintainer
2026-10-09 04:46:45 +02:00
6 changed files with 64 additions and 5 deletions
+8 -1
View File
@@ -151,6 +151,13 @@ function isExternalCliRunMode(mode) {
return EXTERNAL_CLI_MODES.has(mode) || registryCliById(mode)?.kind === 'agent';
}
// Does this session lack the Claude-only features (Respawn, Ralph)? The registry's
// `capabilities.external`, the flag the server's isExternalCliMode() reads. Not
// isExternalCliRunMode(): that picks a launch path, and claude is `kind: 'agent'` too.
function isExternalCliSession(mode) {
return registryCliById(mode)?.external ?? isExternalCliRunMode(mode);
}
Object.assign(CodemanApp.prototype, {
/**
* Build envOverrides payload from case + global settings.
@@ -2477,7 +2484,7 @@ Object.assign(CodemanApp.prototype, {
if (detachToggle) detachToggle.checked = this.hasTabDetachOverride(sessionId);
// Reset to an appropriate tab — Summary for external CLIs (Respawn/Ralph are Claude-only)
const isAltMode = isExternalCliRunMode(session.mode);
const isAltMode = isExternalCliSession(session.mode);
this.switchOptionsTab(isAltMode ? 'summary' : 'respawn');
// Update respawn status display and buttons
+6
View File
@@ -3226,12 +3226,18 @@ Object.assign(CodemanApp.prototype, {
/** Keep the launch surfaces in sync with Settings mutations without a reload. */
_syncCliLaunchCatalog() {
if (!Array.isArray(this._cliList) || this._cliList.length === 0) return;
// /api/clis rows carry no capabilities, so keep the served catalog's `external`
// (isExternalCliSession() reads it). A new custom CLI has none and falls back to `kind`.
const previous = new Map(
(Array.isArray(window.__codemanCliCatalog) ? window.__codemanCliCatalog : []).map((cli) => [cli.id, cli])
);
window.__codemanCliCatalog = this._cliList.map((cli) => ({
id: cli.id,
label: cli.label,
shortBadge: cli.shortBadge,
order: cli.order,
kind: cli.kind,
external: previous.get(cli.id)?.external,
enabled: cli.enabled,
available: cli.kind === 'shell' || (cli.enabled && cli.installed),
}));
+3 -1
View File
@@ -312,7 +312,9 @@ export function registerCliRegistryRoutes(app: FastifyInstance): void {
// admin/settings surface; every SPAWN-time caller elsewhere uses
// enabledClis() instead). Deliberately excludes launch/env/capabilities/
// overlays/discovery — the same rule every other catalogue-export surface in
// this codebase follows.
// this codebase follows, with one deliberate exception: the page catalog
// (`window.__codemanCliCatalog`, server.ts) carries `capabilities.external`,
// which Session Options reads to keep Claude's Respawn and Ralph tabs.
//
// NOT gated on cliManagementEnabled: reading the list is cheap and is not
// the risky part. The Settings UI section simply never fetches this while
+1
View File
@@ -1713,6 +1713,7 @@ export class WebServer extends EventEmitter {
shortBadge: entry.shortBadge,
order: entry.order,
kind: entry.kind,
external: entry.capabilities.external,
enabled,
available: enabled && installed,
};