mirror of
https://github.com/Ark0N/Codeman.git
synced 2026-10-05 23:19:43 +02:00
Seven things, none of which changes what the feature does. 1. The rebuilt Session dropped `nameSource`, so the constructor re-inferred it from the name: a session the user renamed by hand to something shaped like `w<n>-<case>` came back as `placeholder`, and with auto-naming on the next prompt overwrote their name. The route persists right after, so the loss went to disk. `restoreMuxSessions()` already passes it. 2. The already-live sets were snapshotted once before a loop that awaits a real `startInteractive()` per entry, so by the tenth entry the snapshot was tens of seconds old and a conversation resumed by hand from the Resume list in that window was invisible to it: two panes on one transcript, the exact thing the check exists to prevent. Both sets are now read per iteration, and the late case is spent rather than re-offered for the same reason the batch case is. 3. Auto-resume no longer re-arms the pre-reboot `autoResumeAt` on this path. The stamp predates the reboot and the pane is new, so honouring it meant one click had every restored session type `continue` into itself about a minute later, unattended, against the route header's own promise that a restored session comes back idle and disarmed. The setting stays ENABLED, so it re-arms on the next real limit message. A Codeman restart still re-arms from the stamp, because the limit footer will not reprint on its own; the new option exists only to tell the two paths apart. 4. `discardPartiallyBuiltSession()` now also calls `recordSessionStopped()` and `ralphTracker.fullReset()`, the two teardown steps `_doCleanupSession` performs that it was missing. Cosmetic, but a run left open reads as still going in the away digest. 5. A restored claude session gets `seedAgentSessionPreamble()` like both create paths, so the agent skill's bootstrap stays a two-line loader. 6. The heuristic's container comment was wrong in one direction and quiet about the real gap: after a genuine host reboot a containerized Codeman sees the host's short uptime and the banner does appear. What it cannot see is a container-only restart, which is where this would help most. 7. The banner is hidden in a solo window, which shows one session and has no tab strip to put restored ones in. Also reverts 17 of the 18 hunks in docs/api-reference.md, which were Prettier reformatting of prose the PR does not otherwise touch (docs/ is outside the format glob), keeping only the Reboot restore section and repairing the two continuation lines that reformat de-indented; renumbers reboot-restore-ui.js to @loadorder 11.65, since 11.7 is admin-ui.js, which loads after it; and gives the feature its CLAUDE.md entry plus a route test for the multi-user workspace-forbidden branch, the only new rule that had nothing behind it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
53 lines
2.4 KiB
TypeScript
53 lines
2.4 KiB
TypeScript
/**
|
|
* @fileoverview Session port — capabilities for session lifecycle management.
|
|
* Route modules that manage sessions depend on this port.
|
|
*/
|
|
|
|
import type { Session } from '../../session.js';
|
|
import type { SessionState } from '../../types.js';
|
|
|
|
export interface SessionPort {
|
|
readonly sessions: ReadonlyMap<string, Session>;
|
|
addSession(session: Session): Promise<void>;
|
|
cleanupSession(sessionId: string, killMux?: boolean, reason?: string): Promise<void>;
|
|
setupSessionListeners(session: Session): Promise<void>;
|
|
persistSessionState(session: Session): void;
|
|
persistSessionStateNow(session: Session): void;
|
|
/**
|
|
* Re-apply the persisted state a freshly CONSTRUCTED session does not carry.
|
|
*
|
|
* A `Session` built from a record holds only what its constructor takes, so
|
|
* persisting it would otherwise REPLACE the fuller record with the reduced one.
|
|
* Two phases: `before-spawn` shapes the pane (the custom-model environment and
|
|
* the nice priority) and must precede `startInteractive()`; `after-spawn` is
|
|
* the session's own history (the pin, token and cost totals, auto-compact,
|
|
* auto-clear, auto-resume, colour, image watcher, flicker filter) and must NOT
|
|
* land on a session whose pane failed to start.
|
|
*/
|
|
reapplyPersistedSessionState(
|
|
session: Session,
|
|
saved: SessionState,
|
|
phase: 'before-spawn' | 'after-spawn',
|
|
options?: {
|
|
/**
|
|
* Re-arm a PENDING auto-resume schedule from the record's `autoResumeAt`.
|
|
* Default true, which is what a Codeman restart wants: the limit footer
|
|
* will not reprint on its own, so dropping the stamp there strands the
|
|
* pause. A reboot restore passes false: the stamp predates the reboot,
|
|
* the pane is new, and re-arming means every restored session types
|
|
* `continue` into itself about a minute after one click. Auto-resume
|
|
* stays ENABLED either way, so it re-arms on fresh evidence.
|
|
*/
|
|
rearmAutoResumeSchedule?: boolean;
|
|
}
|
|
): Promise<void>;
|
|
/**
|
|
* Undo a session that was registered but never got a working pane: the map
|
|
* entry, its tab-layout slot, and any pane the launch created before throwing.
|
|
* Unlike {@link cleanupSession} it leaves the persisted record, the lifetime
|
|
* token totals, the Ralph state and the workspace's own files untouched.
|
|
*/
|
|
discardPartiallyBuiltSession(sessionId: string): Promise<void>;
|
|
getSessionStateWithRespawn(session: Session): unknown;
|
|
}
|