@monotykamary/localterm-server 2.74.1 → 2.76.0

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.
Files changed (91) hide show
  1. package/dist/capture-renderer.d.ts +1 -0
  2. package/dist/capture-renderer.d.ts.map +1 -1
  3. package/dist/capture-renderer.js +25 -1
  4. package/dist/capture-renderer.js.map +1 -1
  5. package/dist/constants.d.ts +4 -0
  6. package/dist/constants.d.ts.map +1 -1
  7. package/dist/constants.js +6 -0
  8. package/dist/constants.js.map +1 -1
  9. package/dist/hibernate-ledger.d.ts +16 -0
  10. package/dist/hibernate-ledger.d.ts.map +1 -0
  11. package/dist/hibernate-ledger.js +37 -0
  12. package/dist/hibernate-ledger.js.map +1 -0
  13. package/dist/hibernate-store.d.ts +18 -0
  14. package/dist/hibernate-store.d.ts.map +1 -0
  15. package/dist/hibernate-store.js +56 -0
  16. package/dist/hibernate-store.js.map +1 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +94 -72
  19. package/dist/index.js.map +1 -1
  20. package/dist/schemas.d.ts +9 -0
  21. package/dist/schemas.d.ts.map +1 -1
  22. package/dist/schemas.js +1 -1
  23. package/dist/schemas.js.map +1 -1
  24. package/dist/session-client-hub.d.ts.map +1 -1
  25. package/dist/session-client-hub.js +1 -0
  26. package/dist/session-client-hub.js.map +1 -1
  27. package/dist/session-manager.d.ts +4 -1
  28. package/dist/session-manager.d.ts.map +1 -1
  29. package/dist/session-manager.js +36 -1
  30. package/dist/session-manager.js.map +1 -1
  31. package/dist/session-output-coordinator.d.ts.map +1 -1
  32. package/dist/session-output-coordinator.js +2 -1
  33. package/dist/session-output-coordinator.js.map +1 -1
  34. package/dist/session.d.ts.map +1 -1
  35. package/dist/session.js +8 -0
  36. package/dist/session.js.map +1 -1
  37. package/dist/types.d.ts +1 -0
  38. package/dist/types.d.ts.map +1 -1
  39. package/dist/utils/append-to-bounded-utf8-ring.d.ts +2 -0
  40. package/dist/utils/append-to-bounded-utf8-ring.d.ts.map +1 -0
  41. package/dist/utils/append-to-bounded-utf8-ring.js +32 -0
  42. package/dist/utils/append-to-bounded-utf8-ring.js.map +1 -0
  43. package/dist/utils/create-bounded-debounce.d.ts +13 -0
  44. package/dist/utils/create-bounded-debounce.d.ts.map +1 -0
  45. package/dist/utils/create-bounded-debounce.js +43 -0
  46. package/dist/utils/create-bounded-debounce.js.map +1 -0
  47. package/dist/utils/find-terminal-safe-trim-offset.d.ts +2 -0
  48. package/dist/utils/find-terminal-safe-trim-offset.d.ts.map +1 -0
  49. package/dist/utils/find-terminal-safe-trim-offset.js +96 -0
  50. package/dist/utils/find-terminal-safe-trim-offset.js.map +1 -0
  51. package/dist/utils/main-screen-output-filter.d.ts +17 -0
  52. package/dist/utils/main-screen-output-filter.d.ts.map +1 -0
  53. package/dist/utils/main-screen-output-filter.js +185 -0
  54. package/dist/utils/main-screen-output-filter.js.map +1 -0
  55. package/dist/utils/merge-workspace-restore-entries.d.ts +9 -0
  56. package/dist/utils/merge-workspace-restore-entries.d.ts.map +1 -0
  57. package/dist/utils/merge-workspace-restore-entries.js +79 -0
  58. package/dist/utils/merge-workspace-restore-entries.js.map +1 -0
  59. package/dist/utils/normalize-hibernate-scrollback.d.ts +2 -0
  60. package/dist/utils/normalize-hibernate-scrollback.d.ts.map +1 -0
  61. package/dist/utils/normalize-hibernate-scrollback.js +23 -0
  62. package/dist/utils/normalize-hibernate-scrollback.js.map +1 -0
  63. package/dist/utils/pending-workspace-restore-tabs.d.ts +4 -0
  64. package/dist/utils/pending-workspace-restore-tabs.d.ts.map +1 -0
  65. package/dist/utils/pending-workspace-restore-tabs.js +21 -0
  66. package/dist/utils/pending-workspace-restore-tabs.js.map +1 -0
  67. package/dist/utils/plan-workspace-restore.d.ts +14 -0
  68. package/dist/utils/plan-workspace-restore.d.ts.map +1 -0
  69. package/dist/utils/plan-workspace-restore.js +12 -0
  70. package/dist/utils/plan-workspace-restore.js.map +1 -0
  71. package/dist/utils/render-buffer-line-with-sgr.d.ts +3 -0
  72. package/dist/utils/render-buffer-line-with-sgr.d.ts.map +1 -0
  73. package/dist/utils/render-buffer-line-with-sgr.js +100 -0
  74. package/dist/utils/render-buffer-line-with-sgr.js.map +1 -0
  75. package/dist/utils/render-legacy-hibernate-scrollback.d.ts +2 -0
  76. package/dist/utils/render-legacy-hibernate-scrollback.d.ts.map +1 -0
  77. package/dist/utils/render-legacy-hibernate-scrollback.js +56 -0
  78. package/dist/utils/render-legacy-hibernate-scrollback.js.map +1 -0
  79. package/dist/utils/terminal-mode-state.d.ts +0 -1
  80. package/dist/utils/terminal-mode-state.d.ts.map +1 -1
  81. package/dist/utils/terminal-mode-state.js +1 -1
  82. package/dist/utils/terminal-mode-state.js.map +1 -1
  83. package/dist/utils/workspace-session-ids.d.ts +3 -0
  84. package/dist/utils/workspace-session-ids.d.ts.map +1 -0
  85. package/dist/utils/workspace-session-ids.js +11 -0
  86. package/dist/utils/workspace-session-ids.js.map +1 -0
  87. package/dist/utils/write-file-atomically.d.ts +2 -0
  88. package/dist/utils/write-file-atomically.d.ts.map +1 -0
  89. package/dist/utils/write-file-atomically.js +38 -0
  90. package/dist/utils/write-file-atomically.js.map +1 -0
  91. package/package.json +1 -1
@@ -0,0 +1,185 @@
1
+ import { TERMINAL_CONTROL_STRING_RECOVERY_CODE_UNITS } from "../constants.js";
2
+ const ESC = "\x1b";
3
+ const CSI_8_BIT = "\x9b";
4
+ const STRING_TERMINATOR_8_BIT = "\x9c";
5
+ const OSC_8_BIT = "\x9d";
6
+ const CONTROL_STRING_8_BIT = new Set(["\x90", "\x98", OSC_8_BIT, "\x9e", "\x9f"]);
7
+ const ALTERNATE_SCREEN_MODES = new Set([47, 1047, 1049]);
8
+ const MAX_ESCAPE_SEQUENCE_CODE_UNITS = 4096;
9
+ const isCsiFinal = (code) => code >= 0x40 && code <= 0x7e;
10
+ const isEscapeIntermediate = (code) => code >= 0x20 && code <= 0x2f;
11
+ const alternateScreenAction = (sequence) => {
12
+ const prefixLength = sequence.startsWith(`${ESC}[`) ? 2 : 1;
13
+ const final = sequence.at(-1);
14
+ if ((final !== "h" && final !== "l") || sequence[prefixLength] !== "?")
15
+ return null;
16
+ const parameters = sequence.slice(prefixLength + 1, -1);
17
+ const containsAlternateMode = parameters.split(";").some((parameter) => {
18
+ const value = Number.parseInt(parameter.split(":", 1)[0] ?? "", 10);
19
+ return ALTERNATE_SCREEN_MODES.has(value);
20
+ });
21
+ return containsAlternateMode ? final === "h" : null;
22
+ };
23
+ // Streaming ANSI filter for the durable hibernate transcript. It copies exact
24
+ // normal-screen bytes, omits DEC alternate-screen episodes, and drops control
25
+ // strings (OSC/DCS/SOS/PM/APC) that carry metadata or images rather than cells.
26
+ export class MainScreenOutputFilter {
27
+ state = "ground";
28
+ alternateScreenActive = false;
29
+ sequence = "";
30
+ controlStringKind = "other";
31
+ controlStringCodeUnits = 0;
32
+ push(data) {
33
+ if (!data)
34
+ return "";
35
+ const output = [];
36
+ for (const character of data) {
37
+ if (this.state === "ground") {
38
+ this.processGroundCharacter(character, output);
39
+ }
40
+ else if (this.state === "escape") {
41
+ this.processEscapeCharacter(character, output);
42
+ }
43
+ else if (this.state === "csi") {
44
+ this.processCsiCharacter(character, output);
45
+ }
46
+ else if (this.state === "control-string") {
47
+ this.processControlStringCharacter(character);
48
+ }
49
+ else if (this.state === "string-escape") {
50
+ this.processStringEscapeCharacter(character, output);
51
+ }
52
+ else {
53
+ this.processControlStringRecoveryCharacter(character, output);
54
+ }
55
+ }
56
+ return output.join("");
57
+ }
58
+ processGroundCharacter(character, output) {
59
+ if (character === ESC) {
60
+ this.sequence = ESC;
61
+ this.state = "escape";
62
+ }
63
+ else if (character === CSI_8_BIT) {
64
+ this.sequence = character;
65
+ this.state = "csi";
66
+ }
67
+ else if (CONTROL_STRING_8_BIT.has(character)) {
68
+ this.startControlString(character === OSC_8_BIT ? "osc" : "other");
69
+ }
70
+ else if (!this.alternateScreenActive) {
71
+ output.push(character);
72
+ }
73
+ }
74
+ processEscapeCharacter(character, output) {
75
+ if (character === ESC) {
76
+ this.sequence = ESC;
77
+ return;
78
+ }
79
+ this.sequence += character;
80
+ if (character === "[") {
81
+ this.state = "csi";
82
+ return;
83
+ }
84
+ if (character === "]" ||
85
+ character === "P" ||
86
+ character === "X" ||
87
+ character === "^" ||
88
+ character === "_") {
89
+ this.startControlString(character === "]" ? "osc" : "other");
90
+ return;
91
+ }
92
+ if (isEscapeIntermediate(character.charCodeAt(0))) {
93
+ if (this.sequence.length > MAX_ESCAPE_SEQUENCE_CODE_UNITS)
94
+ this.resetToGround();
95
+ return;
96
+ }
97
+ if (character === "c") {
98
+ // RIS resets both alternate-screen state and the normal buffer. Retain it
99
+ // so replay cannot resurrect main-screen rows the real terminal cleared.
100
+ this.alternateScreenActive = false;
101
+ output.push(this.sequence);
102
+ }
103
+ else if (!this.alternateScreenActive) {
104
+ output.push(this.sequence);
105
+ }
106
+ this.resetToGround();
107
+ }
108
+ processCsiCharacter(character, output) {
109
+ // ESC cancels an incomplete CSI and starts a new escape sequence. Without
110
+ // this, a following valid alternate-screen entry can leak into the replay.
111
+ if (character === ESC) {
112
+ this.sequence = ESC;
113
+ this.state = "escape";
114
+ return;
115
+ }
116
+ this.sequence += character;
117
+ if (isCsiFinal(character.charCodeAt(0))) {
118
+ const action = alternateScreenAction(this.sequence);
119
+ if (action === null) {
120
+ if (!this.alternateScreenActive)
121
+ output.push(this.sequence);
122
+ }
123
+ else {
124
+ this.alternateScreenActive = action;
125
+ }
126
+ this.resetToGround();
127
+ }
128
+ else if (this.sequence.length > MAX_ESCAPE_SEQUENCE_CODE_UNITS) {
129
+ this.resetToGround();
130
+ }
131
+ }
132
+ processControlStringCharacter(character) {
133
+ this.controlStringCodeUnits += character.length;
134
+ if (character === STRING_TERMINATOR_8_BIT ||
135
+ (this.controlStringKind === "osc" && character === "\x07")) {
136
+ this.resetToGround();
137
+ }
138
+ else if (character === ESC) {
139
+ this.state = "string-escape";
140
+ }
141
+ else if (this.controlStringCodeUnits > TERMINAL_CONTROL_STRING_RECOVERY_CODE_UNITS) {
142
+ // Drop the ambiguous tail until a parser boundary. Treating payload bytes
143
+ // as visible here would leak title/image data into restored scrollback.
144
+ this.state = "control-string-recovery";
145
+ }
146
+ }
147
+ processStringEscapeCharacter(character, output) {
148
+ if (character === "\\") {
149
+ this.resetToGround();
150
+ return;
151
+ }
152
+ // Any non-ST ESC sequence aborts the control string. Reprocess the byte as
153
+ // the second character of an ordinary ESC sequence (xterm/ECMA-48 behavior).
154
+ this.controlStringCodeUnits = 0;
155
+ this.sequence = ESC;
156
+ this.state = "escape";
157
+ this.processEscapeCharacter(character, output);
158
+ }
159
+ processControlStringRecoveryCharacter(character, output) {
160
+ if (character === ESC) {
161
+ this.sequence = ESC;
162
+ this.state = "escape";
163
+ }
164
+ else if (character === STRING_TERMINATOR_8_BIT || character === "\x07") {
165
+ this.resetToGround();
166
+ }
167
+ else if (character === "\r" || character === "\n") {
168
+ this.resetToGround();
169
+ if (!this.alternateScreenActive)
170
+ output.push(character);
171
+ }
172
+ }
173
+ startControlString(kind) {
174
+ this.sequence = "";
175
+ this.controlStringKind = kind;
176
+ this.controlStringCodeUnits = 0;
177
+ this.state = "control-string";
178
+ }
179
+ resetToGround() {
180
+ this.sequence = "";
181
+ this.controlStringCodeUnits = 0;
182
+ this.state = "ground";
183
+ }
184
+ }
185
+ //# sourceMappingURL=main-screen-output-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main-screen-output-filter.js","sourceRoot":"","sources":["../../src/utils/main-screen-output-filter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { WorkspaceEntry } from "../workspace-store.js";
2
+ export interface RestoredWorkspaceTab {
3
+ owner: string | null;
4
+ windowId: string;
5
+ previousSessionId: string | null;
6
+ replacementSessionId: string;
7
+ }
8
+ export declare const mergeWorkspaceRestoreEntries: (liveEntries: readonly WorkspaceEntry[], startupEntries: readonly WorkspaceEntry[], restoredTabs: readonly RestoredWorkspaceTab[]) => WorkspaceEntry[];
9
+ //# sourceMappingURL=merge-workspace-restore-entries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-workspace-restore-entries.d.ts","sourceRoot":"","sources":["../../src/utils/merge-workspace-restore-entries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAI1E,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAKD,eAAO,MAAM,4BAA4B,gBAC1B,SAAS,cAAc,EAAE,kBACtB,SAAS,cAAc,EAAE,gBAC3B,SAAS,oBAAoB,EAAE,KAC5C,cAAc,EA6EhB,CAAC"}
@@ -0,0 +1,79 @@
1
+ const entryKey = (entry) => `${entry.owner ?? ""}\u0000${entry.windowId}`;
2
+ // Keep each boot-generation slot until it has a live replacement. Exact old
3
+ // ids preserve hibernate identity; a null key pairs pre-hibernate occurrences.
4
+ // Queues preserve duplicate browser tabs instead of collapsing their slots.
5
+ export const mergeWorkspaceRestoreEntries = (liveEntries, startupEntries, restoredTabs) => {
6
+ const liveByKey = new Map(liveEntries.map((entry) => [entryKey(entry), entry]));
7
+ const replacementIdsByKey = new Map();
8
+ for (const restored of restoredTabs) {
9
+ const key = `${restored.owner ?? ""}\u0000${restored.windowId}`;
10
+ let replacements = replacementIdsByKey.get(key);
11
+ if (!replacements) {
12
+ replacements = new Map();
13
+ replacementIdsByKey.set(key, replacements);
14
+ }
15
+ const previousKey = restored.previousSessionId ?? "";
16
+ const ids = replacements.get(previousKey) ?? [];
17
+ ids.push(restored.replacementSessionId);
18
+ replacements.set(previousKey, ids);
19
+ }
20
+ const merged = [];
21
+ const startupKeys = new Set();
22
+ for (const startupEntry of startupEntries) {
23
+ const key = entryKey(startupEntry);
24
+ startupKeys.add(key);
25
+ const liveEntry = liveByKey.get(key);
26
+ const liveTabSlots = (liveEntry?.tabs ?? []).map((tab) => ({ tab, used: false }));
27
+ const replacementIds = replacementIdsByKey.get(key);
28
+ let allLinkedTabsResolved = true;
29
+ let unresolvedSlotCount = 0;
30
+ const tabs = startupEntry.tabs.flatMap((startupTab) => {
31
+ if (!startupTab.sessionId) {
32
+ // A restore-plan pairing takes precedence; otherwise migrate an older
33
+ // manifest opportunistically by matching cwd/shell. Queues preserve
34
+ // duplicate no-id occurrences.
35
+ const replacementId = replacementIds?.get("")?.shift();
36
+ const liveSlot = liveTabSlots.find((slot) => !slot.used &&
37
+ (replacementId
38
+ ? slot.tab.sessionId === replacementId
39
+ : slot.tab.cwd === startupTab.cwd && slot.tab.shell === startupTab.shell));
40
+ if (!liveSlot) {
41
+ allLinkedTabsResolved = false;
42
+ unresolvedSlotCount += 1;
43
+ return [startupTab];
44
+ }
45
+ liveSlot.used = true;
46
+ return [liveSlot.tab];
47
+ }
48
+ const replacementId = replacementIds?.get(startupTab.sessionId)?.shift();
49
+ if (!replacementId) {
50
+ allLinkedTabsResolved = false;
51
+ unresolvedSlotCount += 1;
52
+ return [startupTab];
53
+ }
54
+ const liveSlot = liveTabSlots.find((slot) => !slot.used && slot.tab.sessionId === replacementId);
55
+ if (!liveSlot)
56
+ return [];
57
+ liveSlot.used = true;
58
+ return [liveSlot.tab];
59
+ });
60
+ if (allLinkedTabsResolved) {
61
+ if (liveEntry)
62
+ merged.push(liveEntry);
63
+ }
64
+ else {
65
+ const unmatchedLiveTabs = liveTabSlots.filter((slot) => !slot.used).map((slot) => slot.tab);
66
+ // Unpaired live tabs cover unresolved durable slots by count. Keep old
67
+ // identities until an explicit pairing advances them; persist only the
68
+ // surplus so a crash window cannot double the tab count.
69
+ const surplusLiveTabs = unmatchedLiveTabs.slice(unresolvedSlotCount);
70
+ merged.push({ ...startupEntry, tabs: [...tabs, ...surplusLiveTabs] });
71
+ }
72
+ }
73
+ for (const liveEntry of liveEntries) {
74
+ if (!startupKeys.has(entryKey(liveEntry)))
75
+ merged.push(liveEntry);
76
+ }
77
+ return merged;
78
+ };
79
+ //# sourceMappingURL=merge-workspace-restore-entries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-workspace-restore-entries.js","sourceRoot":"","sources":["../../src/utils/merge-workspace-restore-entries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const normalizeHibernateScrollback: (data: string) => string;
2
+ //# sourceMappingURL=normalize-hibernate-scrollback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-hibernate-scrollback.d.ts","sourceRoot":"","sources":["../../src/utils/normalize-hibernate-scrollback.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,4BAA4B,SAAU,MAAM,KAAG,MAe3D,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { HIBERNATE_LEGACY_RESTORE_TRAILERS, HIBERNATE_RESTORE_TRAILER } from "../constants.js";
2
+ import { MainScreenOutputFilter } from "./main-screen-output-filter.js";
3
+ import { renderLegacyHibernateScrollback } from "./render-legacy-hibernate-scrollback.js";
4
+ // Converts any hibernate generation (including legacy raw streams) to a pure
5
+ // normal-screen transcript plus exactly one cursor-neutral boundary.
6
+ export const normalizeHibernateScrollback = (data) => {
7
+ const isLegacy = HIBERNATE_LEGACY_RESTORE_TRAILERS.some((trailer) => data.includes(trailer));
8
+ let transcript = data;
9
+ for (const legacyTrailer of HIBERNATE_LEGACY_RESTORE_TRAILERS) {
10
+ transcript = transcript.replaceAll(legacyTrailer, "");
11
+ }
12
+ // Canonicalize only the trailing boundary. Internal boundaries separate an
13
+ // older terminal generation from the fresh shell bytes that followed it;
14
+ // removing them would let stale modes/margins reinterpret later generations.
15
+ while (transcript.endsWith(HIBERNATE_RESTORE_TRAILER)) {
16
+ transcript = transcript.slice(0, -HIBERNATE_RESTORE_TRAILER.length);
17
+ }
18
+ transcript = new MainScreenOutputFilter().push(transcript);
19
+ if (isLegacy)
20
+ transcript = renderLegacyHibernateScrollback(transcript);
21
+ return transcript ? transcript + HIBERNATE_RESTORE_TRAILER : "";
22
+ };
23
+ //# sourceMappingURL=normalize-hibernate-scrollback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-hibernate-scrollback.js","sourceRoot":"","sources":["../../src/utils/normalize-hibernate-scrollback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iCAAiC,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC/F,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,+BAA+B,EAAE,MAAM,yCAAyC,CAAC;AAE1F,6EAA6E;AAC7E,qEAAqE;AACrE,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,IAAY,EAAU,EAAE;IACnE,MAAM,QAAQ,GAAG,iCAAiC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7F,IAAI,UAAU,GAAG,IAAI,CAAC;IACtB,KAAK,MAAM,aAAa,IAAI,iCAAiC,EAAE,CAAC;QAC9D,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,2EAA2E;IAC3E,yEAAyE;IACzE,6EAA6E;IAC7E,OAAO,UAAU,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,CAAC;QACtD,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IACtE,CAAC;IACD,UAAU,GAAG,IAAI,sBAAsB,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC3D,IAAI,QAAQ;QAAE,UAAU,GAAG,+BAA+B,CAAC,UAAU,CAAC,CAAC;IACvE,OAAO,UAAU,CAAC,CAAC,CAAC,UAAU,GAAG,yBAAyB,CAAC,CAAC,CAAC,EAAE,CAAC;AAClE,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { RestoredWorkspaceTab } from "./merge-workspace-restore-entries.js";
2
+ import type { WorkspaceEntry, WorkspaceTab } from "../workspace-store.js";
3
+ export declare const pendingWorkspaceRestoreTabs: (entry: WorkspaceEntry, restoredTabs: readonly RestoredWorkspaceTab[]) => WorkspaceTab[];
4
+ //# sourceMappingURL=pending-workspace-restore-tabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pending-workspace-restore-tabs.d.ts","sourceRoot":"","sources":["../../src/utils/pending-workspace-restore-tabs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAK1E,eAAO,MAAM,2BAA2B,UAC/B,cAAc,gBACP,SAAS,oBAAoB,EAAE,KAC5C,YAAY,EAed,CAAC"}
@@ -0,0 +1,21 @@
1
+ // Subtract paired browser-tab occurrences from the immutable boot entry. Exact
2
+ // session-id counts preserve hibernate identities; the empty key tracks legacy
3
+ // no-id occurrences one at a time.
4
+ export const pendingWorkspaceRestoreTabs = (entry, restoredTabs) => {
5
+ const restoredCounts = new Map();
6
+ for (const restored of restoredTabs) {
7
+ if (restored.owner !== entry.owner || restored.windowId !== entry.windowId)
8
+ continue;
9
+ const previousKey = restored.previousSessionId ?? "";
10
+ restoredCounts.set(previousKey, (restoredCounts.get(previousKey) ?? 0) + 1);
11
+ }
12
+ return entry.tabs.filter((tab) => {
13
+ const previousKey = tab.sessionId ?? "";
14
+ const count = restoredCounts.get(previousKey) ?? 0;
15
+ if (count === 0)
16
+ return true;
17
+ restoredCounts.set(previousKey, count - 1);
18
+ return false;
19
+ });
20
+ };
21
+ //# sourceMappingURL=pending-workspace-restore-tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pending-workspace-restore-tabs.js","sourceRoot":"","sources":["../../src/utils/pending-workspace-restore-tabs.ts"],"names":[],"mappings":"AAGA,+EAA+E;AAC/E,+EAA+E;AAC/E,mCAAmC;AACnC,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,KAAqB,EACrB,YAA6C,EAC7B,EAAE;IAClB,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IACjD,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QACpC,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ;YAAE,SAAS;QACrF,MAAM,WAAW,GAAG,QAAQ,CAAC,iBAAiB,IAAI,EAAE,CAAC;QACrD,cAAc,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;QAC/B,MAAM,WAAW,GAAG,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7B,cAAc,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { WorkspaceTab } from "../workspace-store.js";
2
+ export interface WorkspaceRestorePlan {
3
+ navigate: WorkspaceTab | null;
4
+ covered: WorkspaceTab[];
5
+ open: WorkspaceTab[];
6
+ }
7
+ interface PlanWorkspaceRestoreOptions {
8
+ pendingTabs: readonly WorkspaceTab[];
9
+ plainOpenCount: number;
10
+ hasBootstrapTarget: boolean;
11
+ }
12
+ export declare const planWorkspaceRestore: ({ pendingTabs, plainOpenCount, hasBootstrapTarget, }: PlanWorkspaceRestoreOptions) => WorkspaceRestorePlan;
13
+ export {};
14
+ //# sourceMappingURL=plan-workspace-restore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-workspace-restore.d.ts","sourceRoot":"","sources":["../../src/utils/plan-workspace-restore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,IAAI,EAAE,YAAY,EAAE,CAAC;CACtB;AAED,UAAU,2BAA2B;IACnC,WAAW,EAAE,SAAS,YAAY,EAAE,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAID,eAAO,MAAM,oBAAoB,yDAI9B,2BAA2B,KAAG,oBAQhC,CAAC"}
@@ -0,0 +1,12 @@
1
+ // Decide tab occurrence roles; index.ts performs navigation/opening and
2
+ // durably pairs every covered slot with its live replacement session.
3
+ export const planWorkspaceRestore = ({ pendingTabs, plainOpenCount, hasBootstrapTarget, }) => {
4
+ const remaining = [...pendingTabs];
5
+ if (remaining.length === 0)
6
+ return { navigate: null, covered: [], open: [] };
7
+ const navigate = hasBootstrapTarget && plainOpenCount > 0 ? (remaining.shift() ?? null) : null;
8
+ const coverCount = Math.max(plainOpenCount - (navigate ? 1 : 0), 0);
9
+ const covered = remaining.splice(0, coverCount);
10
+ return { navigate, covered, open: remaining };
11
+ };
12
+ //# sourceMappingURL=plan-workspace-restore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-workspace-restore.js","sourceRoot":"","sources":["../../src/utils/plan-workspace-restore.ts"],"names":[],"mappings":"AAcA,wEAAwE;AACxE,sEAAsE;AACtE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,EACnC,WAAW,EACX,cAAc,EACd,kBAAkB,GACU,EAAwB,EAAE;IACtD,MAAM,SAAS,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC;IACnC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAE7E,MAAM,QAAQ,GAAG,kBAAkB,IAAI,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/F,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAChD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAChD,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { IBufferCell, IBufferLine } from "@xterm/headless";
2
+ export declare const renderBufferLineWithSgr: (line: IBufferLine, cell: IBufferCell) => string;
3
+ //# sourceMappingURL=render-buffer-line-with-sgr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-buffer-line-with-sgr.d.ts","sourceRoot":"","sources":["../../src/utils/render-buffer-line-with-sgr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAkGhE,eAAO,MAAM,uBAAuB,SAAU,WAAW,QAAQ,WAAW,KAAG,MAwB9E,CAAC"}
@@ -0,0 +1,100 @@
1
+ const ESC = "\x1b";
2
+ const RESET_SEQUENCE = `${ESC}[0m`;
3
+ const BASIC_PALETTE_SIZE = 8;
4
+ const BRIGHT_PALETTE_LIMIT = 16;
5
+ const COLOR_COMPONENT_MASK = 0xff;
6
+ const RED_COMPONENT_SHIFT = 16;
7
+ const GREEN_COMPONENT_SHIFT = 8;
8
+ const SGR_BOLD = 1;
9
+ const SGR_DIM = 2;
10
+ const SGR_ITALIC = 3;
11
+ const SGR_UNDERLINE = 4;
12
+ const SGR_BLINK = 5;
13
+ const SGR_INVERSE = 7;
14
+ const SGR_INVISIBLE = 8;
15
+ const SGR_STRIKETHROUGH = 9;
16
+ const SGR_FOREGROUND_BASE = 30;
17
+ const SGR_BACKGROUND_BASE = 40;
18
+ const SGR_EXTENDED_FOREGROUND = 38;
19
+ const SGR_EXTENDED_BACKGROUND = 48;
20
+ const SGR_BRIGHT_FOREGROUND_BASE = 90;
21
+ const SGR_BRIGHT_BACKGROUND_BASE = 100;
22
+ const SGR_OVERLINE = 53;
23
+ const SGR_RGB_MODE = 2;
24
+ const SGR_PALETTE_MODE = 5;
25
+ const appendPaletteColor = (parameters, color, standardBase, brightBase, extendedCode) => {
26
+ if (color < BASIC_PALETTE_SIZE) {
27
+ parameters.push(standardBase + color);
28
+ return;
29
+ }
30
+ if (color < BRIGHT_PALETTE_LIMIT) {
31
+ parameters.push(brightBase + color - BASIC_PALETTE_SIZE);
32
+ return;
33
+ }
34
+ parameters.push(extendedCode, SGR_PALETTE_MODE, color);
35
+ };
36
+ const appendRgbColor = (parameters, color, extendedCode) => {
37
+ parameters.push(extendedCode, SGR_RGB_MODE, (color >> RED_COMPONENT_SHIFT) & COLOR_COMPONENT_MASK, (color >> GREEN_COMPONENT_SHIFT) & COLOR_COMPONENT_MASK, color & COLOR_COMPONENT_MASK);
38
+ };
39
+ const styleParameters = (cell) => {
40
+ const parameters = [];
41
+ if (cell.isBold())
42
+ parameters.push(SGR_BOLD);
43
+ if (cell.isDim())
44
+ parameters.push(SGR_DIM);
45
+ if (cell.isItalic())
46
+ parameters.push(SGR_ITALIC);
47
+ if (cell.isUnderline())
48
+ parameters.push(SGR_UNDERLINE);
49
+ if (cell.isBlink())
50
+ parameters.push(SGR_BLINK);
51
+ if (cell.isInverse())
52
+ parameters.push(SGR_INVERSE);
53
+ if (cell.isInvisible())
54
+ parameters.push(SGR_INVISIBLE);
55
+ if (cell.isStrikethrough())
56
+ parameters.push(SGR_STRIKETHROUGH);
57
+ if (cell.isOverline())
58
+ parameters.push(SGR_OVERLINE);
59
+ if (cell.isFgPalette()) {
60
+ appendPaletteColor(parameters, cell.getFgColor(), SGR_FOREGROUND_BASE, SGR_BRIGHT_FOREGROUND_BASE, SGR_EXTENDED_FOREGROUND);
61
+ }
62
+ else if (cell.isFgRGB()) {
63
+ appendRgbColor(parameters, cell.getFgColor(), SGR_EXTENDED_FOREGROUND);
64
+ }
65
+ if (cell.isBgPalette()) {
66
+ appendPaletteColor(parameters, cell.getBgColor(), SGR_BACKGROUND_BASE, SGR_BRIGHT_BACKGROUND_BASE, SGR_EXTENDED_BACKGROUND);
67
+ }
68
+ else if (cell.isBgRGB()) {
69
+ appendRgbColor(parameters, cell.getBgColor(), SGR_EXTENDED_BACKGROUND);
70
+ }
71
+ return parameters;
72
+ };
73
+ // Convert an already-rendered xterm row into text plus SGR only. Resetting before
74
+ // every style run makes each row independently replayable if older rows are evicted.
75
+ export const renderBufferLineWithSgr = (line, cell) => {
76
+ const plainText = line.translateToString(true);
77
+ if (!plainText)
78
+ return "";
79
+ let activeStyle = "";
80
+ let consumedCodeUnits = 0;
81
+ let rendered = "";
82
+ for (let column = 0; column < line.length && consumedCodeUnits < plainText.length; column += 1) {
83
+ const current = line.getCell(column, cell);
84
+ if (!current || current.getWidth() === 0)
85
+ continue;
86
+ const characters = current.getChars() || " ";
87
+ const parameters = styleParameters(current);
88
+ const style = parameters.join(";");
89
+ if (style !== activeStyle) {
90
+ rendered += style ? `${ESC}[0;${style}m` : RESET_SEQUENCE;
91
+ activeStyle = style;
92
+ }
93
+ rendered += characters;
94
+ consumedCodeUnits += characters.length;
95
+ }
96
+ if (activeStyle)
97
+ rendered += RESET_SEQUENCE;
98
+ return rendered;
99
+ };
100
+ //# sourceMappingURL=render-buffer-line-with-sgr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-buffer-line-with-sgr.js","sourceRoot":"","sources":["../../src/utils/render-buffer-line-with-sgr.ts"],"names":[],"mappings":"AAEA,MAAM,GAAG,GAAG,MAAM,CAAC;AACnB,MAAM,cAAc,GAAG,GAAG,GAAG,KAAK,CAAC;AAEnC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAC7B,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAChC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAClC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEhC,MAAM,QAAQ,GAAG,CAAC,CAAC;AACnB,MAAM,OAAO,GAAG,CAAC,CAAC;AAClB,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,SAAS,GAAG,CAAC,CAAC;AACpB,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAC5B,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B,MAAM,uBAAuB,GAAG,EAAE,CAAC;AACnC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AACnC,MAAM,0BAA0B,GAAG,EAAE,CAAC;AACtC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AACvC,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3B,MAAM,kBAAkB,GAAG,CACzB,UAAoB,EACpB,KAAa,EACb,YAAoB,EACpB,UAAkB,EAClB,YAAoB,EACd,EAAE;IACR,IAAI,KAAK,GAAG,kBAAkB,EAAE,CAAC;QAC/B,UAAU,CAAC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;IACD,IAAI,KAAK,GAAG,oBAAoB,EAAE,CAAC;QACjC,UAAU,CAAC,IAAI,CAAC,UAAU,GAAG,KAAK,GAAG,kBAAkB,CAAC,CAAC;QACzD,OAAO;IACT,CAAC;IACD,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAC;AACzD,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,UAAoB,EAAE,KAAa,EAAE,YAAoB,EAAQ,EAAE;IACzF,UAAU,CAAC,IAAI,CACb,YAAY,EACZ,YAAY,EACZ,CAAC,KAAK,IAAI,mBAAmB,CAAC,GAAG,oBAAoB,EACrD,CAAC,KAAK,IAAI,qBAAqB,CAAC,GAAG,oBAAoB,EACvD,KAAK,GAAG,oBAAoB,CAC7B,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,IAAiB,EAAY,EAAE;IACtD,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,IAAI,CAAC,MAAM,EAAE;QAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,IAAI,CAAC,KAAK,EAAE;QAAE,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,QAAQ,EAAE;QAAE,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,IAAI,CAAC,WAAW,EAAE;QAAE,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACvD,IAAI,IAAI,CAAC,OAAO,EAAE;QAAE,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,IAAI,CAAC,SAAS,EAAE;QAAE,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACnD,IAAI,IAAI,CAAC,WAAW,EAAE;QAAE,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACvD,IAAI,IAAI,CAAC,eAAe,EAAE;QAAE,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC/D,IAAI,IAAI,CAAC,UAAU,EAAE;QAAE,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAErD,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACvB,kBAAkB,CAChB,UAAU,EACV,IAAI,CAAC,UAAU,EAAE,EACjB,mBAAmB,EACnB,0BAA0B,EAC1B,uBAAuB,CACxB,CAAC;IACJ,CAAC;SAAM,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1B,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,uBAAuB,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACvB,kBAAkB,CAChB,UAAU,EACV,IAAI,CAAC,UAAU,EAAE,EACjB,mBAAmB,EACnB,0BAA0B,EAC1B,uBAAuB,CACxB,CAAC;IACJ,CAAC;SAAM,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1B,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,uBAAuB,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAEF,kFAAkF;AAClF,qFAAqF;AACrF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,IAAiB,EAAE,IAAiB,EAAU,EAAE;IACtF,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAE1B,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,iBAAiB,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;QAC/F,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC;YAAE,SAAS;QAEnD,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC;QAC7C,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;YAC1B,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC;YAC1D,WAAW,GAAG,KAAK,CAAC;QACtB,CAAC;QACD,QAAQ,IAAI,UAAU,CAAC;QACvB,iBAAiB,IAAI,UAAU,CAAC,MAAM,CAAC;IACzC,CAAC;IAED,IAAI,WAAW;QAAE,QAAQ,IAAI,cAAc,CAAC;IAC5C,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const renderLegacyHibernateScrollback: (data: string) => string;
2
+ //# sourceMappingURL=render-legacy-hibernate-scrollback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-legacy-hibernate-scrollback.d.ts","sourceRoot":"","sources":["../../src/utils/render-legacy-hibernate-scrollback.ts"],"names":[],"mappings":"AAwBA,eAAO,MAAM,+BAA+B,SAAU,MAAM,KAAG,MA6B9D,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { createRequire } from "node:module";
2
+ import { DEFAULT_COLS, DEFAULT_ROWS, SESSION_SCROLLBACK_REPLAY_BYTES } from "../constants.js";
3
+ const require = createRequire(import.meta.url);
4
+ const { Terminal } = require("@xterm/headless");
5
+ const writeSynchronously = (terminal, data) => {
6
+ // The exact headless-xterm beta is pinned. Its public write API is async, but
7
+ // seed normalization runs before PTY spawn; use the pinned write buffer only
8
+ // for this one-time legacy migration and fail loudly if its shape ever moves.
9
+ const core = Reflect.get(terminal, "_core");
10
+ if (!core || typeof core !== "object")
11
+ throw new Error("xterm core unavailable");
12
+ const writeBuffer = Reflect.get(core, "_writeBuffer");
13
+ if (!writeBuffer || typeof writeBuffer !== "object") {
14
+ throw new Error("xterm write buffer unavailable");
15
+ }
16
+ const writeSync = Reflect.get(writeBuffer, "writeSync");
17
+ if (typeof writeSync !== "function")
18
+ throw new Error("xterm synchronous write unavailable");
19
+ Reflect.apply(writeSync, writeBuffer, [data]);
20
+ };
21
+ // Old hibernate rings may begin halfway through a TUI after its alt-entry bytes
22
+ // were evicted. Rendering collapses cursor/erase redraws into stable normal-
23
+ // buffer rows, so the first fixed restart cannot replay legacy screen poison.
24
+ export const renderLegacyHibernateScrollback = (data) => {
25
+ if (!data)
26
+ return "";
27
+ const terminal = new Terminal({
28
+ cols: DEFAULT_COLS,
29
+ rows: DEFAULT_ROWS,
30
+ // A byte can encode a whole blank row (LF), so the byte cap is also the
31
+ // conservative maximum row count for a legacy hibernate generation.
32
+ scrollback: SESSION_SCROLLBACK_REPLAY_BYTES,
33
+ allowProposedApi: true,
34
+ });
35
+ try {
36
+ writeSynchronously(terminal, data);
37
+ const buffer = terminal.buffer.normal;
38
+ const cursorRow = Math.min(buffer.baseY + buffer.cursorY, buffer.length - 1);
39
+ let lastRow = Math.max(cursorRow, 0);
40
+ for (let row = buffer.length - 1; row > lastRow; row -= 1) {
41
+ if (buffer.getLine(row)?.translateToString(true)) {
42
+ lastRow = row;
43
+ break;
44
+ }
45
+ }
46
+ const rows = [];
47
+ for (let row = 0; row <= lastRow; row += 1) {
48
+ rows.push(buffer.getLine(row)?.translateToString(true) ?? "");
49
+ }
50
+ return rows.join("\r\n");
51
+ }
52
+ finally {
53
+ terminal.dispose();
54
+ }
55
+ };
56
+ //# sourceMappingURL=render-legacy-hibernate-scrollback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-legacy-hibernate-scrollback.js","sourceRoot":"","sources":["../../src/utils/render-legacy-hibernate-scrollback.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- export declare const TERMINAL_FOCUS_REPORTING_MODE = 1004;
2
1
  export declare const DECRQM_FOCUS_QUERY = "\u001B[?1004$p";
3
2
  export declare const TERMINAL_FOCUS_IN_SEQUENCE = "\u001B[I";
4
3
  export declare const TERMINAL_FOCUS_OUT_SEQUENCE = "\u001B[O";
@@ -1 +1 @@
1
- {"version":3,"file":"terminal-mode-state.d.ts","sourceRoot":"","sources":["../../src/utils/terminal-mode-state.ts"],"names":[],"mappings":"AAyCA,eAAO,MAAM,6BAA6B,OAAO,CAAC;AAClD,eAAO,MAAM,kBAAkB,mBAA+C,CAAC;AAC/E,eAAO,MAAM,0BAA0B,aAAa,CAAC;AACrD,eAAO,MAAM,2BAA2B,aAAa,CAAC;AAOtD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAIvF;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAE5D;AAmCD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAkC;IACxE,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAkC;IAC7E,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,uBAAuB,CAAS;IACxC,OAAO,CAAC,mBAAmB,CAAM;IAEjC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAoBzB;IAED,aAAa,IAAI,MAAM,CAOtB;IAED,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElC;IAED,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAC,uBAAuB;IA+B/B,OAAO,CAAC,uBAAuB;IAM/B,OAAO,CAAC,wBAAwB;IAkBhC,OAAO,CAAC,KAAK;IAcb,IAAI,YAAY,IAAI,OAAO,CAK1B;IAMD,IAAI,qBAAqB,IAAI,OAAO,CAEnC;CACF"}
1
+ {"version":3,"file":"terminal-mode-state.d.ts","sourceRoot":"","sources":["../../src/utils/terminal-mode-state.ts"],"names":[],"mappings":"AA0CA,eAAO,MAAM,kBAAkB,mBAA+C,CAAC;AAC/E,eAAO,MAAM,0BAA0B,aAAa,CAAC;AACrD,eAAO,MAAM,2BAA2B,aAAa,CAAC;AAOtD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAIvF;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAE5D;AAmCD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAkC;IACxE,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAkC;IAC7E,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,uBAAuB,CAAS;IACxC,OAAO,CAAC,mBAAmB,CAAM;IAEjC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAoBzB;IAED,aAAa,IAAI,MAAM,CAOtB;IAED,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElC;IAED,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAC,uBAAuB;IA+B/B,OAAO,CAAC,uBAAuB;IAM/B,OAAO,CAAC,wBAAwB;IAkBhC,OAAO,CAAC,KAAK;IAcb,IAAI,YAAY,IAAI,OAAO,CAK1B;IAMD,IAAI,qBAAqB,IAAI,OAAO,CAEnC;CACF"}
@@ -24,7 +24,7 @@ const RIS_SEQUENCE = `${ESC}c`;
24
24
  // xterm.js neither answers DECRQM nor emits focus events, so the server —
25
25
  // which already tracks the mode here and knows tab focus via client-focus
26
26
  // messages — provides both pieces itself (see session-client-hub.ts).
27
- export const TERMINAL_FOCUS_REPORTING_MODE = 1004;
27
+ const TERMINAL_FOCUS_REPORTING_MODE = 1004;
28
28
  export const DECRQM_FOCUS_QUERY = `${ESC}[?${TERMINAL_FOCUS_REPORTING_MODE}$p`;
29
29
  export const TERMINAL_FOCUS_IN_SEQUENCE = `${ESC}[I`;
30
30
  export const TERMINAL_FOCUS_OUT_SEQUENCE = `${ESC}[O`;