nterminal 1.2.80 → 1.2.82
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.
- package/dist/client/assets/MarkdownPreview-C-ZqElTb.js +1 -0
- package/dist/client/assets/{TranscriptMarkdownBody-BFu2FzgT.js → TranscriptMarkdownBody-UgmTgEmq.js} +1 -1
- package/dist/client/assets/index-CEMuRNoD.js +57 -0
- package/dist/client/assets/{index-BFs4imuQ.js → index-i3y_vda1.js} +1 -1
- package/dist/client/assets/{index-rROkcwjD.css → index-yKhwlegq.css} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/server/agent/agentRoutes.js +41 -1
- package/dist/server/agent/agentRoutes.js.map +1 -1
- package/dist/server/routes/agentManagementRoutes.js +29 -0
- package/dist/server/routes/agentManagementRoutes.js.map +1 -1
- package/dist/server/routes/terminalRoutes.js +51 -0
- package/dist/server/routes/terminalRoutes.js.map +1 -1
- package/dist/server/routes/terminalWebSocket.js +1 -1
- package/dist/server/routes/terminalWebSocket.js.map +1 -1
- package/dist/server/terminal/TerminalManager.d.ts +17 -2
- package/dist/server/terminal/TerminalManager.js +155 -62
- package/dist/server/terminal/TerminalManager.js.map +1 -1
- package/dist/server/terminal/TmuxPtyAdapter.d.ts +6 -0
- package/dist/server/terminal/TmuxPtyAdapter.js +29 -2
- package/dist/server/terminal/TmuxPtyAdapter.js.map +1 -1
- package/dist/server/terminal/codexTranscriptSource.d.ts +2 -2
- package/dist/server/terminal/codexTranscriptSource.js +1 -1
- package/dist/server/terminal/codexTranscriptSource.js.map +1 -1
- package/dist/server/terminal/subagentSources.d.ts +20 -0
- package/dist/server/terminal/subagentSources.js +1072 -0
- package/dist/server/terminal/subagentSources.js.map +1 -0
- package/dist/server/terminal/transcriptHistory.d.ts +2 -0
- package/dist/server/terminal/transcriptHistory.js +62 -37
- package/dist/server/terminal/transcriptHistory.js.map +1 -1
- package/dist/shared/protocol.d.ts +19 -0
- package/dist/shared/protocol.js.map +1 -1
- package/package.json +1 -1
- package/dist/client/assets/MarkdownPreview-D2UZ6wJU.js +0 -1
- package/dist/client/assets/index-4MeJRcb6.js +0 -57
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminalWebSocket.js","sourceRoot":"","sources":["../../../src/server/routes/terminalWebSocket.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"terminalWebSocket.js","sourceRoot":"","sources":["../../../src/server/routes/terminalWebSocket.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { AppConfig } from '../config.js';
|
|
2
|
-
import type { ServerTerminalMessage, TerminalHistoryCursor, TerminalHistoryResponse, TerminalTranscriptHistoryResponse, TerminalTranscriptSourceResponse } from '../../shared/protocol.js';
|
|
2
|
+
import type { ServerTerminalMessage, TerminalHistoryCursor, TerminalHistoryResponse, TerminalSubagentsResponse, TerminalTranscriptHistoryResponse, TerminalTranscriptSourceResponse } from '../../shared/protocol.js';
|
|
3
3
|
import type { TerminalCompletionOutcome, TerminalId, TerminalSummary } from '../../shared/types.js';
|
|
4
4
|
import { type PtyAdapter } from './PtyAdapter.js';
|
|
5
5
|
export interface CreateTerminalOptions {
|
|
@@ -40,7 +40,7 @@ export interface TerminalManagerCompletionEvent {
|
|
|
40
40
|
occurredAt: string;
|
|
41
41
|
}
|
|
42
42
|
export interface TerminalManagerDiagnostic {
|
|
43
|
-
event: 'terminal.status_poll_failed' | 'terminal.process_snapshot_failed' | 'terminal.restore_failed' | 'terminal.transcript_poll_failed' | 'terminal.transcript_poll_slow' | 'terminal.destroy_failed' | 'terminal.close_failed';
|
|
43
|
+
event: 'terminal.status_poll_failed' | 'terminal.process_snapshot_failed' | 'terminal.restore_failed' | 'terminal.transcript_poll_failed' | 'terminal.transcript_poll_slow' | 'terminal.reattach_failed' | 'terminal.destroy_failed' | 'terminal.close_failed';
|
|
44
44
|
terminalId?: TerminalId;
|
|
45
45
|
queueDepth?: number;
|
|
46
46
|
elapsedMs?: number;
|
|
@@ -78,6 +78,7 @@ export declare class TerminalManager {
|
|
|
78
78
|
private statusPollInflight;
|
|
79
79
|
private activeTranscriptWorkers;
|
|
80
80
|
private readonly pendingInitializations;
|
|
81
|
+
private readonly reattachInflight;
|
|
81
82
|
private terminalResetBlockers;
|
|
82
83
|
private terminalMutationGeneration;
|
|
83
84
|
private shutdownRequested;
|
|
@@ -115,6 +116,8 @@ export declare class TerminalManager {
|
|
|
115
116
|
snapshotPaneWidth?: number;
|
|
116
117
|
limit?: number;
|
|
117
118
|
}): Promise<TerminalHistoryResponse | null>;
|
|
119
|
+
private resolveLiveTranscriptSource;
|
|
120
|
+
private transcriptRequestStillLive;
|
|
118
121
|
getTerminalTranscriptHistory(id: TerminalId, options?: {
|
|
119
122
|
cursor?: string;
|
|
120
123
|
limit?: number;
|
|
@@ -122,10 +125,19 @@ export declare class TerminalManager {
|
|
|
122
125
|
includeTools?: boolean;
|
|
123
126
|
}): Promise<TerminalTranscriptHistoryResponse | null>;
|
|
124
127
|
getTerminalTranscriptSource(id: TerminalId): Promise<TerminalTranscriptSourceResponse | null>;
|
|
128
|
+
getTerminalSubagents(id: TerminalId): Promise<TerminalSubagentsResponse | null>;
|
|
129
|
+
getTerminalSubagentTranscript(id: TerminalId, subagentId: string, options?: {
|
|
130
|
+
cursor?: string;
|
|
131
|
+
limit?: number;
|
|
132
|
+
maxLines?: number;
|
|
133
|
+
includeTools?: boolean;
|
|
134
|
+
}): Promise<TerminalTranscriptHistoryResponse | null>;
|
|
125
135
|
resolveTerminalCwd(id: TerminalId): Promise<string | null>;
|
|
126
136
|
renameTerminal(id: TerminalId, title: string): Promise<RenameTerminalResult>;
|
|
127
137
|
refreshTerminalCwd(id: TerminalId): Promise<TerminalSummary | null>;
|
|
128
138
|
attachTerminal(id: TerminalId, subscriber: TerminalSubscriber, options?: AttachTerminalOptions): TerminalAttachment | null;
|
|
139
|
+
attachTerminalAsync(id: TerminalId, subscriber: TerminalSubscriber, options?: AttachTerminalOptions): Promise<TerminalAttachment | null>;
|
|
140
|
+
private createAttachment;
|
|
129
141
|
writeToTerminal(id: TerminalId, data: string, options?: WriteTerminalOptions): Promise<boolean>;
|
|
130
142
|
scrollTerminalScrollback(id: TerminalId, lines: number, options?: TerminalControlOptions): Promise<boolean>;
|
|
131
143
|
cancelTerminalScrollbackMode(id: TerminalId, options?: TerminalControlOptions): Promise<boolean>;
|
|
@@ -138,6 +150,9 @@ export declare class TerminalManager {
|
|
|
138
150
|
destroyAllTerminals(): Promise<DestroyAllTerminalsResult>;
|
|
139
151
|
private awaitPendingInitializations;
|
|
140
152
|
private ensureAttached;
|
|
153
|
+
private ensureAttachedAsync;
|
|
154
|
+
private attachOrRefresh;
|
|
155
|
+
private refreshAndAttach;
|
|
141
156
|
private resolveInitialCwd;
|
|
142
157
|
private safeResolveCwd;
|
|
143
158
|
private refreshCwd;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import { normalizeTerminalTitle
|
|
3
|
+
import { normalizeTerminalTitle } from './PtyAdapter.js';
|
|
4
4
|
import { resolveProcessCwd } from './cwdResolver.js';
|
|
5
5
|
import { OutputBuffer } from './outputBuffer.js';
|
|
6
6
|
import { readTranscriptHistoryPage } from './transcriptHistory.js';
|
|
7
7
|
import { AgentTranscriptTracker } from './agentTranscriptStatus.js';
|
|
8
|
+
import { listTerminalSubagents, resolveSubagentTranscriptSource, subagentSummary } from './subagentSources.js';
|
|
8
9
|
import { mapWithConcurrency } from './asyncCommand.js';
|
|
9
10
|
// Window for the output-rate component of busy detection. Slightly larger
|
|
10
11
|
// than the poll interval so a tab that just stopped emitting output
|
|
@@ -51,6 +52,10 @@ export class TerminalManager {
|
|
|
51
52
|
statusPollInflight = false;
|
|
52
53
|
activeTranscriptWorkers = 0;
|
|
53
54
|
pendingInitializations = new Set();
|
|
55
|
+
// Restored tmux sessions start without a local PTY client. Keep a single
|
|
56
|
+
// reattach/catalog refresh in flight per terminal so an input burst cannot
|
|
57
|
+
// spawn competing tmux clients or repeatedly query the catalog.
|
|
58
|
+
reattachInflight = new Map();
|
|
54
59
|
terminalResetBlockers = 0;
|
|
55
60
|
terminalMutationGeneration = 0;
|
|
56
61
|
shutdownRequested = false;
|
|
@@ -110,14 +115,6 @@ export class TerminalManager {
|
|
|
110
115
|
this.reportDiagnostic({ event: 'terminal.process_snapshot_failed', terminalId, error });
|
|
111
116
|
}
|
|
112
117
|
}
|
|
113
|
-
for (const record of this.terminals.values()) {
|
|
114
|
-
if (record.summary.status === 'running' &&
|
|
115
|
-
!record.closing &&
|
|
116
|
-
record.pty === null &&
|
|
117
|
-
!result.has(record.summary.id)) {
|
|
118
|
-
this.markSessionUnavailable(record, null);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
118
|
}
|
|
122
119
|
applyProcessSnapshot(terminalId, snapshot, now) {
|
|
123
120
|
const record = this.terminals.get(terminalId);
|
|
@@ -550,17 +547,9 @@ export class TerminalManager {
|
|
|
550
547
|
record.summary.status = 'running';
|
|
551
548
|
record.summary.exitCode = null;
|
|
552
549
|
if (record.subscribers.size > 0) {
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
catch (error) {
|
|
557
|
-
if (error instanceof PtySessionUnavailableError) {
|
|
558
|
-
this.markSessionUnavailable(record, exitCode);
|
|
559
|
-
return;
|
|
560
|
-
}
|
|
561
|
-
// Keep the live backing session lazily reattachable. A later
|
|
562
|
-
// browser reconnect can retry after a transient adapter failure.
|
|
563
|
-
}
|
|
550
|
+
// A local tmux client can exit while the backing session remains
|
|
551
|
+
// alive. Refresh the catalog before deciding it disappeared.
|
|
552
|
+
void this.ensureAttachedAsync(record);
|
|
564
553
|
}
|
|
565
554
|
record.summary.updatedAt = this.timestamp();
|
|
566
555
|
this.publish(record, { type: 'terminal_updated', terminal: cloneSummary(record.summary) });
|
|
@@ -642,7 +631,7 @@ export class TerminalManager {
|
|
|
642
631
|
if (!record || record.summary.status !== 'running' || record.closing) {
|
|
643
632
|
return null;
|
|
644
633
|
}
|
|
645
|
-
if (!record.pty && !this.
|
|
634
|
+
if (!record.pty && !await this.ensureAttachedAsync(record)) {
|
|
646
635
|
return null;
|
|
647
636
|
}
|
|
648
637
|
const limit = normalizeHistoryLimit(options.limit);
|
|
@@ -682,7 +671,10 @@ export class TerminalManager {
|
|
|
682
671
|
output: capture.output
|
|
683
672
|
};
|
|
684
673
|
}
|
|
685
|
-
|
|
674
|
+
// Shared liveness guard for the transcript endpoints: resolve the pane's
|
|
675
|
+
// source, re-validating the record after the await so a pane that closed
|
|
676
|
+
// or switched sessions mid-request never serves another session's data.
|
|
677
|
+
async resolveLiveTranscriptSource(id) {
|
|
686
678
|
const record = this.terminals.get(id);
|
|
687
679
|
if (!record || record.summary.status !== 'running' || record.closing) {
|
|
688
680
|
return null;
|
|
@@ -691,44 +683,78 @@ export class TerminalManager {
|
|
|
691
683
|
const source = await this.ptyAdapter.resolveTranscriptSource?.(id);
|
|
692
684
|
if (!source ||
|
|
693
685
|
!transcriptSourceMatchesForeground(record.summary, source.provider) ||
|
|
694
|
-
this.
|
|
695
|
-
record.summary.status !== 'running' ||
|
|
696
|
-
record.closing ||
|
|
697
|
-
record.transcriptGeneration !== generation) {
|
|
686
|
+
!this.transcriptRequestStillLive(id, record, generation)) {
|
|
698
687
|
return null;
|
|
699
688
|
}
|
|
700
|
-
|
|
701
|
-
|
|
689
|
+
return { record, generation, source };
|
|
690
|
+
}
|
|
691
|
+
transcriptRequestStillLive(id, record, generation) {
|
|
692
|
+
return this.terminals.get(id) === record &&
|
|
702
693
|
record.summary.status === 'running' &&
|
|
703
694
|
!record.closing &&
|
|
704
|
-
record.transcriptGeneration === generation
|
|
695
|
+
record.transcriptGeneration === generation;
|
|
696
|
+
}
|
|
697
|
+
async getTerminalTranscriptHistory(id, options = {}) {
|
|
698
|
+
const live = await this.resolveLiveTranscriptSource(id);
|
|
699
|
+
if (!live) {
|
|
700
|
+
return null;
|
|
701
|
+
}
|
|
702
|
+
const page = await readTranscriptHistoryPage(id, live.source, options);
|
|
703
|
+
return this.transcriptRequestStillLive(id, live.record, live.generation) ? page : null;
|
|
705
704
|
}
|
|
706
705
|
async getTerminalTranscriptSource(id) {
|
|
707
|
-
const
|
|
708
|
-
if (!
|
|
706
|
+
const live = await this.resolveLiveTranscriptSource(id);
|
|
707
|
+
if (!live) {
|
|
709
708
|
return null;
|
|
710
709
|
}
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
710
|
+
return {
|
|
711
|
+
terminalId: id,
|
|
712
|
+
source: { provider: live.source.provider, sessionId: live.source.sessionId }
|
|
713
|
+
};
|
|
714
|
+
}
|
|
715
|
+
async getTerminalSubagents(id) {
|
|
716
|
+
const live = await this.resolveLiveTranscriptSource(id);
|
|
717
|
+
if (!live) {
|
|
718
|
+
return null;
|
|
719
|
+
}
|
|
720
|
+
const subagents = await listTerminalSubagents(live.source);
|
|
721
|
+
if (!this.transcriptRequestStillLive(id, live.record, live.generation)) {
|
|
719
722
|
return null;
|
|
720
723
|
}
|
|
721
724
|
return {
|
|
722
725
|
terminalId: id,
|
|
723
|
-
source: { provider: source.provider, sessionId: source.sessionId }
|
|
726
|
+
source: { provider: live.source.provider, sessionId: live.source.sessionId },
|
|
727
|
+
subagents: subagents.map(subagentSummary)
|
|
724
728
|
};
|
|
725
729
|
}
|
|
730
|
+
async getTerminalSubagentTranscript(id, subagentId, options = {}) {
|
|
731
|
+
const live = await this.resolveLiveTranscriptSource(id);
|
|
732
|
+
if (!live) {
|
|
733
|
+
return null;
|
|
734
|
+
}
|
|
735
|
+
// Resolve the child through the server-side listing rather than trusting
|
|
736
|
+
// the client id as a path component: the transcript path is always
|
|
737
|
+
// server-derived.
|
|
738
|
+
const child = await resolveSubagentTranscriptSource(live.source, subagentId);
|
|
739
|
+
if (!child || !this.transcriptRequestStillLive(id, live.record, live.generation)) {
|
|
740
|
+
return null;
|
|
741
|
+
}
|
|
742
|
+
const page = await readTranscriptHistoryPage(id, child.source, {
|
|
743
|
+
...options,
|
|
744
|
+
archiveTrailer: false,
|
|
745
|
+
minOffset: child.startOffset
|
|
746
|
+
});
|
|
747
|
+
return this.transcriptRequestStillLive(id, live.record, live.generation) ? page : null;
|
|
748
|
+
}
|
|
726
749
|
async resolveTerminalCwd(id) {
|
|
727
750
|
const record = this.terminals.get(id);
|
|
728
|
-
if (!record || !this.
|
|
751
|
+
if (!record || !await this.ensureAttachedAsync(record)) {
|
|
729
752
|
return null;
|
|
730
753
|
}
|
|
731
754
|
const pty = record.pty;
|
|
755
|
+
if (!pty) {
|
|
756
|
+
return null;
|
|
757
|
+
}
|
|
732
758
|
const cwd = await this.safeResolveCwd(pty.pid);
|
|
733
759
|
return (cwd &&
|
|
734
760
|
this.terminals.get(id) === record &&
|
|
@@ -783,7 +809,7 @@ export class TerminalManager {
|
|
|
783
809
|
}
|
|
784
810
|
async refreshTerminalCwd(id) {
|
|
785
811
|
const record = this.terminals.get(id);
|
|
786
|
-
if (!record || !this.
|
|
812
|
+
if (!record || !await this.ensureAttachedAsync(record)) {
|
|
787
813
|
return null;
|
|
788
814
|
}
|
|
789
815
|
await this.refreshCwd(record);
|
|
@@ -804,6 +830,23 @@ export class TerminalManager {
|
|
|
804
830
|
if (record.summary.status === 'running' && !this.ensureAttached(record)) {
|
|
805
831
|
return null;
|
|
806
832
|
}
|
|
833
|
+
return this.createAttachment(record, subscriber, options);
|
|
834
|
+
}
|
|
835
|
+
async attachTerminalAsync(id, subscriber, options = {}) {
|
|
836
|
+
const record = this.terminals.get(id);
|
|
837
|
+
if (!record || record.closing) {
|
|
838
|
+
return null;
|
|
839
|
+
}
|
|
840
|
+
if (record.summary.status === 'running' && !await this.ensureAttachedAsync(record)) {
|
|
841
|
+
return null;
|
|
842
|
+
}
|
|
843
|
+
if (this.terminals.get(id) !== record || record.closing) {
|
|
844
|
+
return null;
|
|
845
|
+
}
|
|
846
|
+
return this.createAttachment(record, subscriber, options);
|
|
847
|
+
}
|
|
848
|
+
createAttachment(record, subscriber, options) {
|
|
849
|
+
const id = record.summary.id;
|
|
807
850
|
if (record.summary.status === 'running') {
|
|
808
851
|
record.history = typeof this.ptyAdapter.captureHistory === 'function'
|
|
809
852
|
? { startLine: 0, endLine: 0, hasMore: true }
|
|
@@ -854,7 +897,7 @@ export class TerminalManager {
|
|
|
854
897
|
return false;
|
|
855
898
|
}
|
|
856
899
|
if (record && !record.pty && record.summary.status === 'running' && !record.closing) {
|
|
857
|
-
this.
|
|
900
|
+
await this.ensureAttachedAsync(record);
|
|
858
901
|
}
|
|
859
902
|
if (!record?.pty ||
|
|
860
903
|
record.summary.status !== 'running' ||
|
|
@@ -888,25 +931,27 @@ export class TerminalManager {
|
|
|
888
931
|
return true;
|
|
889
932
|
}, inputBytes);
|
|
890
933
|
}
|
|
891
|
-
scrollTerminalScrollback(id, lines, options = {}) {
|
|
934
|
+
async scrollTerminalScrollback(id, lines, options = {}) {
|
|
892
935
|
const record = this.terminals.get(id);
|
|
893
936
|
const scroll = this.ptyAdapter.scrollbackScroll;
|
|
894
937
|
if (!controlOperationAllowed(options) ||
|
|
895
938
|
!record ||
|
|
896
939
|
record.summary.status !== 'running' ||
|
|
897
940
|
record.closing ||
|
|
898
|
-
!this.ensureAttached(record) ||
|
|
899
941
|
!scroll) {
|
|
900
|
-
return
|
|
942
|
+
return false;
|
|
943
|
+
}
|
|
944
|
+
if (!record.pty && !await this.ensureAttachedAsync(record)) {
|
|
945
|
+
return false;
|
|
901
946
|
}
|
|
902
947
|
const normalizedLines = clampScrollLines(lines);
|
|
903
948
|
const pending = record.pendingScroll;
|
|
904
949
|
if (pending) {
|
|
905
950
|
addPendingScrollDelta(pending.groups, options.canExecute, normalizedLines);
|
|
906
|
-
return pending.promise;
|
|
951
|
+
return await pending.promise;
|
|
907
952
|
}
|
|
908
953
|
if (!this.canEnqueueControl(record)) {
|
|
909
|
-
return
|
|
954
|
+
return false;
|
|
910
955
|
}
|
|
911
956
|
const groups = new Map();
|
|
912
957
|
addPendingScrollDelta(groups, options.canExecute, normalizedLines);
|
|
@@ -941,10 +986,12 @@ export class TerminalManager {
|
|
|
941
986
|
!record ||
|
|
942
987
|
record.summary.status !== 'running' ||
|
|
943
988
|
record.closing ||
|
|
944
|
-
!this.ensureAttached(record) ||
|
|
945
989
|
!this.canEnqueueControl(record)) {
|
|
946
990
|
return false;
|
|
947
991
|
}
|
|
992
|
+
if (!record.pty && !await this.ensureAttachedAsync(record)) {
|
|
993
|
+
return false;
|
|
994
|
+
}
|
|
948
995
|
this.sealPendingScroll(record);
|
|
949
996
|
return await this.enqueueControl(record, async () => {
|
|
950
997
|
if (!controlOperationAllowed(options) ||
|
|
@@ -1049,16 +1096,7 @@ export class TerminalManager {
|
|
|
1049
1096
|
record.summary.exitCode = null;
|
|
1050
1097
|
record.summary.updatedAt = this.timestamp();
|
|
1051
1098
|
if (record.subscribers.size > 0) {
|
|
1052
|
-
|
|
1053
|
-
this.reattachToSession(record);
|
|
1054
|
-
}
|
|
1055
|
-
catch (error) {
|
|
1056
|
-
if (error instanceof PtySessionUnavailableError) {
|
|
1057
|
-
this.markSessionUnavailable(record, null);
|
|
1058
|
-
return false;
|
|
1059
|
-
}
|
|
1060
|
-
// A later browser attach can retry after the transient failure.
|
|
1061
|
-
}
|
|
1099
|
+
void this.ensureAttachedAsync(record);
|
|
1062
1100
|
}
|
|
1063
1101
|
this.publish(record, {
|
|
1064
1102
|
type: 'terminal_updated',
|
|
@@ -1122,7 +1160,7 @@ export class TerminalManager {
|
|
|
1122
1160
|
await Promise.allSettled([...this.pendingInitializations]);
|
|
1123
1161
|
}
|
|
1124
1162
|
}
|
|
1125
|
-
ensureAttached(record) {
|
|
1163
|
+
ensureAttached(record, onAttachFailure) {
|
|
1126
1164
|
if (record.closing) {
|
|
1127
1165
|
return false;
|
|
1128
1166
|
}
|
|
@@ -1136,12 +1174,67 @@ export class TerminalManager {
|
|
|
1136
1174
|
this.reattachToSession(record);
|
|
1137
1175
|
}
|
|
1138
1176
|
catch (error) {
|
|
1139
|
-
|
|
1177
|
+
onAttachFailure?.(error);
|
|
1178
|
+
return false;
|
|
1179
|
+
}
|
|
1180
|
+
return record.pty !== null;
|
|
1181
|
+
}
|
|
1182
|
+
async ensureAttachedAsync(record) {
|
|
1183
|
+
if (this.terminals.get(record.summary.id) !== record ||
|
|
1184
|
+
record.closing ||
|
|
1185
|
+
record.summary.status !== 'running') {
|
|
1186
|
+
return false;
|
|
1187
|
+
}
|
|
1188
|
+
if (record.pty)
|
|
1189
|
+
return true;
|
|
1190
|
+
if (!this.ptyAdapter.listExisting || !this.ptyAdapter.attachExisting) {
|
|
1191
|
+
return false;
|
|
1192
|
+
}
|
|
1193
|
+
const existing = this.reattachInflight.get(record.summary.id);
|
|
1194
|
+
if (existing) {
|
|
1195
|
+
return await existing;
|
|
1196
|
+
}
|
|
1197
|
+
const recovery = this.attachOrRefresh(record);
|
|
1198
|
+
this.reattachInflight.set(record.summary.id, recovery);
|
|
1199
|
+
try {
|
|
1200
|
+
return await recovery;
|
|
1201
|
+
}
|
|
1202
|
+
finally {
|
|
1203
|
+
if (this.reattachInflight.get(record.summary.id) === recovery) {
|
|
1204
|
+
this.reattachInflight.delete(record.summary.id);
|
|
1205
|
+
}
|
|
1206
|
+
}
|
|
1207
|
+
}
|
|
1208
|
+
async attachOrRefresh(record) {
|
|
1209
|
+
if (this.ensureAttached(record)) {
|
|
1210
|
+
return true;
|
|
1211
|
+
}
|
|
1212
|
+
return await this.refreshAndAttach(record);
|
|
1213
|
+
}
|
|
1214
|
+
async refreshAndAttach(record) {
|
|
1215
|
+
const id = record.summary.id;
|
|
1216
|
+
try {
|
|
1217
|
+
const existing = await this.ptyAdapter.listExisting?.();
|
|
1218
|
+
if (this.terminals.get(id) !== record ||
|
|
1219
|
+
record.closing ||
|
|
1220
|
+
record.summary.status !== 'running') {
|
|
1221
|
+
return false;
|
|
1222
|
+
}
|
|
1223
|
+
if (!existing?.some((session) => session.sessionId === id)) {
|
|
1140
1224
|
this.markSessionUnavailable(record, null);
|
|
1225
|
+
return false;
|
|
1141
1226
|
}
|
|
1227
|
+
// listExisting() refreshes the tmux adapter's pane-PID catalog. This
|
|
1228
|
+
// second attach is the only retry; terminal input itself is never
|
|
1229
|
+
// replayed by the manager.
|
|
1230
|
+
return this.ensureAttached(record, (attachError) => {
|
|
1231
|
+
this.reportDiagnostic({ event: 'terminal.reattach_failed', terminalId: id, error: attachError });
|
|
1232
|
+
});
|
|
1233
|
+
}
|
|
1234
|
+
catch (error) {
|
|
1235
|
+
this.reportDiagnostic({ event: 'terminal.reattach_failed', terminalId: id, error });
|
|
1142
1236
|
return false;
|
|
1143
1237
|
}
|
|
1144
|
-
return record.pty !== null;
|
|
1145
1238
|
}
|
|
1146
1239
|
async resolveInitialCwd(options) {
|
|
1147
1240
|
if (options.cwd?.trim()) {
|