@monotykamary/localterm-server 2.75.0 → 2.76.1

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 (83) 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/session-client-hub.d.ts.map +1 -1
  21. package/dist/session-client-hub.js +1 -0
  22. package/dist/session-client-hub.js.map +1 -1
  23. package/dist/session-manager.d.ts +4 -1
  24. package/dist/session-manager.d.ts.map +1 -1
  25. package/dist/session-manager.js +36 -1
  26. package/dist/session-manager.js.map +1 -1
  27. package/dist/session-output-coordinator.d.ts.map +1 -1
  28. package/dist/session-output-coordinator.js +2 -1
  29. package/dist/session-output-coordinator.js.map +1 -1
  30. package/dist/session.d.ts.map +1 -1
  31. package/dist/session.js +8 -0
  32. package/dist/session.js.map +1 -1
  33. package/dist/types.d.ts +1 -0
  34. package/dist/types.d.ts.map +1 -1
  35. package/dist/utils/append-to-bounded-utf8-ring.d.ts +2 -0
  36. package/dist/utils/append-to-bounded-utf8-ring.d.ts.map +1 -0
  37. package/dist/utils/append-to-bounded-utf8-ring.js +32 -0
  38. package/dist/utils/append-to-bounded-utf8-ring.js.map +1 -0
  39. package/dist/utils/create-bounded-debounce.d.ts +13 -0
  40. package/dist/utils/create-bounded-debounce.d.ts.map +1 -0
  41. package/dist/utils/create-bounded-debounce.js +43 -0
  42. package/dist/utils/create-bounded-debounce.js.map +1 -0
  43. package/dist/utils/find-terminal-safe-trim-offset.d.ts +2 -0
  44. package/dist/utils/find-terminal-safe-trim-offset.d.ts.map +1 -0
  45. package/dist/utils/find-terminal-safe-trim-offset.js +96 -0
  46. package/dist/utils/find-terminal-safe-trim-offset.js.map +1 -0
  47. package/dist/utils/main-screen-output-filter.d.ts +17 -0
  48. package/dist/utils/main-screen-output-filter.d.ts.map +1 -0
  49. package/dist/utils/main-screen-output-filter.js +185 -0
  50. package/dist/utils/main-screen-output-filter.js.map +1 -0
  51. package/dist/utils/merge-workspace-restore-entries.d.ts +9 -0
  52. package/dist/utils/merge-workspace-restore-entries.d.ts.map +1 -0
  53. package/dist/utils/merge-workspace-restore-entries.js +79 -0
  54. package/dist/utils/merge-workspace-restore-entries.js.map +1 -0
  55. package/dist/utils/normalize-hibernate-scrollback.d.ts +2 -0
  56. package/dist/utils/normalize-hibernate-scrollback.d.ts.map +1 -0
  57. package/dist/utils/normalize-hibernate-scrollback.js +23 -0
  58. package/dist/utils/normalize-hibernate-scrollback.js.map +1 -0
  59. package/dist/utils/pending-workspace-restore-tabs.d.ts +4 -0
  60. package/dist/utils/pending-workspace-restore-tabs.d.ts.map +1 -0
  61. package/dist/utils/pending-workspace-restore-tabs.js +21 -0
  62. package/dist/utils/pending-workspace-restore-tabs.js.map +1 -0
  63. package/dist/utils/plan-workspace-restore.d.ts +14 -0
  64. package/dist/utils/plan-workspace-restore.d.ts.map +1 -0
  65. package/dist/utils/plan-workspace-restore.js +12 -0
  66. package/dist/utils/plan-workspace-restore.js.map +1 -0
  67. package/dist/utils/render-buffer-line-with-sgr.d.ts +3 -0
  68. package/dist/utils/render-buffer-line-with-sgr.d.ts.map +1 -0
  69. package/dist/utils/render-buffer-line-with-sgr.js +100 -0
  70. package/dist/utils/render-buffer-line-with-sgr.js.map +1 -0
  71. package/dist/utils/render-legacy-hibernate-scrollback.d.ts +2 -0
  72. package/dist/utils/render-legacy-hibernate-scrollback.d.ts.map +1 -0
  73. package/dist/utils/render-legacy-hibernate-scrollback.js +56 -0
  74. package/dist/utils/render-legacy-hibernate-scrollback.js.map +1 -0
  75. package/dist/utils/workspace-session-ids.d.ts +3 -0
  76. package/dist/utils/workspace-session-ids.d.ts.map +1 -0
  77. package/dist/utils/workspace-session-ids.js +11 -0
  78. package/dist/utils/workspace-session-ids.js.map +1 -0
  79. package/dist/utils/write-file-atomically.d.ts +2 -0
  80. package/dist/utils/write-file-atomically.d.ts.map +1 -0
  81. package/dist/utils/write-file-atomically.js +38 -0
  82. package/dist/utils/write-file-atomically.js.map +1 -0
  83. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-bounded-debounce.d.ts","sourceRoot":"","sources":["../../src/utils/create-bounded-debounce.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,UAAU,4BAA4B;IACpC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAGD,eAAO,MAAM,qBAAqB,yCAI/B,4BAA4B,KAAG,eAqCjC,CAAC"}
@@ -0,0 +1,43 @@
1
+ // Runs after a quiet debounce, but no later than maxWait after the first event.
2
+ export const createBoundedDebounce = ({ callback, debounceMs, maxWaitMs, }) => {
3
+ let debounceTimer = null;
4
+ let maxWaitTimer = null;
5
+ let disposed = false;
6
+ const clearTimers = () => {
7
+ if (debounceTimer !== null)
8
+ clearTimeout(debounceTimer);
9
+ if (maxWaitTimer !== null)
10
+ clearTimeout(maxWaitTimer);
11
+ debounceTimer = null;
12
+ maxWaitTimer = null;
13
+ };
14
+ const run = () => {
15
+ clearTimers();
16
+ if (disposed)
17
+ return;
18
+ callback();
19
+ };
20
+ return {
21
+ schedule: () => {
22
+ if (disposed)
23
+ return;
24
+ if (debounceTimer !== null)
25
+ clearTimeout(debounceTimer);
26
+ debounceTimer = setTimeout(run, debounceMs);
27
+ debounceTimer.unref?.();
28
+ if (maxWaitTimer === null) {
29
+ maxWaitTimer = setTimeout(run, maxWaitMs);
30
+ maxWaitTimer.unref?.();
31
+ }
32
+ },
33
+ flush: () => {
34
+ if (!disposed)
35
+ run();
36
+ },
37
+ dispose: () => {
38
+ disposed = true;
39
+ clearTimers();
40
+ },
41
+ };
42
+ };
43
+ //# sourceMappingURL=create-bounded-debounce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-bounded-debounce.js","sourceRoot":"","sources":["../../src/utils/create-bounded-debounce.ts"],"names":[],"mappings":"AAYA,gFAAgF;AAChF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,EACpC,QAAQ,EACR,UAAU,EACV,SAAS,GACoB,EAAmB,EAAE;IAClD,IAAI,aAAa,GAA0B,IAAI,CAAC;IAChD,IAAI,YAAY,GAA0B,IAAI,CAAC;IAC/C,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,MAAM,WAAW,GAAG,GAAS,EAAE;QAC7B,IAAI,aAAa,KAAK,IAAI;YAAE,YAAY,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,YAAY,KAAK,IAAI;YAAE,YAAY,CAAC,YAAY,CAAC,CAAC;QACtD,aAAa,GAAG,IAAI,CAAC;QACrB,YAAY,GAAG,IAAI,CAAC;IACtB,CAAC,CAAC;IAEF,MAAM,GAAG,GAAG,GAAS,EAAE;QACrB,WAAW,EAAE,CAAC;QACd,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,EAAE,CAAC;IACb,CAAC,CAAC;IAEF,OAAO;QACL,QAAQ,EAAE,GAAG,EAAE;YACb,IAAI,QAAQ;gBAAE,OAAO;YACrB,IAAI,aAAa,KAAK,IAAI;gBAAE,YAAY,CAAC,aAAa,CAAC,CAAC;YACxD,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YAC5C,aAAa,CAAC,KAAK,EAAE,EAAE,CAAC;YACxB,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;gBAC1B,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAC1C,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACV,IAAI,CAAC,QAAQ;gBAAE,GAAG,EAAE,CAAC;QACvB,CAAC;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,QAAQ,GAAG,IAAI,CAAC;YAChB,WAAW,EAAE,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const findTerminalSafeTrimOffset: (data: string, minimumByteOffset: number) => number;
2
+ //# sourceMappingURL=find-terminal-safe-trim-offset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-terminal-safe-trim-offset.d.ts","sourceRoot":"","sources":["../../src/utils/find-terminal-safe-trim-offset.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,0BAA0B,SAC/B,MAAM,qBACO,MAAM,KACxB,MAiFF,CAAC"}
@@ -0,0 +1,96 @@
1
+ const ESC = "\x1b";
2
+ const CSI_8_BIT = "\x9b";
3
+ const STRING_TERMINATOR_8_BIT = "\x9c";
4
+ const OSC_8_BIT = "\x9d";
5
+ const CONTROL_STRING_8_BIT = new Set(["\x90", "\x98", OSC_8_BIT, "\x9e", "\x9f"]);
6
+ const isCsiFinal = (code) => code >= 0x40 && code <= 0x7e;
7
+ const isEscapeIntermediate = (code) => code >= 0x20 && code <= 0x2f;
8
+ // Returns the first replay-safe byte offset at or after minimumByteOffset.
9
+ // Newline boundaries win so retained history starts on a complete row; if a
10
+ // stream has no newline, a parser-confirmed ground-state boundary prevents a
11
+ // capped ring from exposing the numeric tail of CSI/OSC/DCS as visible text.
12
+ export const findTerminalSafeTrimOffset = (data, minimumByteOffset) => {
13
+ let state = "ground";
14
+ let controlStringIsOsc = false;
15
+ let byteOffset = 0;
16
+ let firstGroundOffset = null;
17
+ let lineBoundaryOffset = null;
18
+ const processEscapeCharacter = (character) => {
19
+ if (character === ESC) {
20
+ state = "escape";
21
+ }
22
+ else if (character === "[") {
23
+ state = "csi";
24
+ }
25
+ else if (character === "]" ||
26
+ character === "P" ||
27
+ character === "X" ||
28
+ character === "^" ||
29
+ character === "_") {
30
+ controlStringIsOsc = character === "]";
31
+ state = "control-string";
32
+ }
33
+ else if (isEscapeIntermediate(character.charCodeAt(0))) {
34
+ state = "escape";
35
+ }
36
+ else {
37
+ state = "ground";
38
+ }
39
+ };
40
+ for (const character of data) {
41
+ const characterOffset = byteOffset;
42
+ const wasGround = state === "ground";
43
+ if (wasGround && characterOffset >= minimumByteOffset && firstGroundOffset === null) {
44
+ firstGroundOffset = characterOffset;
45
+ }
46
+ if (lineBoundaryOffset !== null && character !== "\r" && character !== "\n") {
47
+ return characterOffset;
48
+ }
49
+ if (state === "ground") {
50
+ if (character === ESC) {
51
+ state = "escape";
52
+ }
53
+ else if (character === CSI_8_BIT) {
54
+ state = "csi";
55
+ }
56
+ else if (CONTROL_STRING_8_BIT.has(character)) {
57
+ controlStringIsOsc = character === OSC_8_BIT;
58
+ state = "control-string";
59
+ }
60
+ }
61
+ else if (state === "escape") {
62
+ processEscapeCharacter(character);
63
+ }
64
+ else if (state === "csi") {
65
+ if (character === ESC)
66
+ state = "escape";
67
+ else if (isCsiFinal(character.charCodeAt(0)))
68
+ state = "ground";
69
+ }
70
+ else if (state === "control-string") {
71
+ if (character === STRING_TERMINATOR_8_BIT ||
72
+ (controlStringIsOsc && character === "\x07")) {
73
+ state = "ground";
74
+ }
75
+ else if (character === ESC) {
76
+ state = "string-escape";
77
+ }
78
+ }
79
+ else if (character === "\\") {
80
+ state = "ground";
81
+ }
82
+ else {
83
+ state = "escape";
84
+ processEscapeCharacter(character);
85
+ }
86
+ byteOffset += Buffer.byteLength(character, "utf8");
87
+ if (wasGround &&
88
+ state === "ground" &&
89
+ (character === "\r" || character === "\n") &&
90
+ byteOffset >= minimumByteOffset) {
91
+ lineBoundaryOffset = byteOffset;
92
+ }
93
+ }
94
+ return lineBoundaryOffset ?? firstGroundOffset ?? byteOffset;
95
+ };
96
+ //# sourceMappingURL=find-terminal-safe-trim-offset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-terminal-safe-trim-offset.js","sourceRoot":"","sources":["../../src/utils/find-terminal-safe-trim-offset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export declare class MainScreenOutputFilter {
2
+ private state;
3
+ private alternateScreenActive;
4
+ private sequence;
5
+ private controlStringKind;
6
+ private controlStringCodeUnits;
7
+ push(data: string): string;
8
+ private processGroundCharacter;
9
+ private processEscapeCharacter;
10
+ private processCsiCharacter;
11
+ private processControlStringCharacter;
12
+ private processStringEscapeCharacter;
13
+ private processControlStringRecoveryCharacter;
14
+ private startControlString;
15
+ private resetToGround;
16
+ }
17
+ //# sourceMappingURL=main-screen-output-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main-screen-output-filter.d.ts","sourceRoot":"","sources":["../../src/utils/main-screen-output-filter.ts"],"names":[],"mappings":"AAqCA,qBAAa,sBAAsB;IACjC,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,iBAAiB,CAA8B;IACvD,OAAO,CAAC,sBAAsB,CAAK;IAEnC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAqBzB;IAED,OAAO,CAAC,sBAAsB;IAc9B,OAAO,CAAC,sBAAsB;IAmC9B,OAAO,CAAC,mBAAmB;IAsB3B,OAAO,CAAC,6BAA6B;IAgBrC,OAAO,CAAC,4BAA4B;IAapC,OAAO,CAAC,qCAAqC;IAY7C,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,aAAa;CAKtB"}
@@ -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"}