@knpkv/herdr-connect 0.3.1 → 0.4.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 (80) hide show
  1. package/README.md +2 -0
  2. package/dist/activity-store.d.ts +2 -2
  3. package/dist/activity-store.d.ts.map +1 -1
  4. package/dist/activity-store.js +20 -26
  5. package/dist/activity-store.js.map +1 -1
  6. package/dist/client.d.ts +986 -2
  7. package/dist/client.d.ts.map +1 -1
  8. package/dist/client.js +353 -54
  9. package/dist/client.js.map +1 -1
  10. package/dist/directory.d.ts +1 -1
  11. package/dist/directory.d.ts.map +1 -1
  12. package/dist/directory.js +1 -1
  13. package/dist/directory.js.map +1 -1
  14. package/dist/id.d.ts.map +1 -1
  15. package/dist/id.js +3 -2
  16. package/dist/id.js.map +1 -1
  17. package/dist/index.d.ts +4 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +4 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/internal/terminal-release.d.ts.map +1 -1
  22. package/dist/internal/terminal-release.js +3 -1
  23. package/dist/internal/terminal-release.js.map +1 -1
  24. package/dist/model.d.ts.map +1 -1
  25. package/dist/model.js +3 -2
  26. package/dist/model.js.map +1 -1
  27. package/dist/relationship-store.d.ts +2 -2
  28. package/dist/relationship-store.d.ts.map +1 -1
  29. package/dist/relationship-store.js +23 -32
  30. package/dist/relationship-store.js.map +1 -1
  31. package/dist/terminal-dimensions.d.ts +25 -0
  32. package/dist/terminal-dimensions.d.ts.map +1 -0
  33. package/dist/terminal-dimensions.js +19 -0
  34. package/dist/terminal-dimensions.js.map +1 -0
  35. package/dist/terminal-keyboard.d.ts +52 -0
  36. package/dist/terminal-keyboard.d.ts.map +1 -0
  37. package/dist/terminal-keyboard.js +141 -0
  38. package/dist/terminal-keyboard.js.map +1 -0
  39. package/dist/terminal-output.d.ts +30 -0
  40. package/dist/terminal-output.d.ts.map +1 -0
  41. package/dist/terminal-output.js +54 -0
  42. package/dist/terminal-output.js.map +1 -0
  43. package/dist/terminal-rail-navigation.d.ts +4 -0
  44. package/dist/terminal-rail-navigation.d.ts.map +1 -0
  45. package/dist/terminal-rail-navigation.js +13 -0
  46. package/dist/terminal-rail-navigation.js.map +1 -0
  47. package/dist/terminal-viewport.d.ts +32 -2
  48. package/dist/terminal-viewport.d.ts.map +1 -1
  49. package/dist/terminal-viewport.js +131 -12
  50. package/dist/terminal-viewport.js.map +1 -1
  51. package/dist/terminal-worker-guard.d.ts +7 -0
  52. package/dist/terminal-worker-guard.d.ts.map +1 -0
  53. package/dist/terminal-worker-guard.js +11 -0
  54. package/dist/terminal-worker-guard.js.map +1 -0
  55. package/dist/terminal.d.ts +1746 -110
  56. package/dist/terminal.d.ts.map +1 -1
  57. package/dist/terminal.js +1 -1
  58. package/dist/terminal.js.map +1 -1
  59. package/dist/view.d.ts +15 -2
  60. package/dist/view.d.ts.map +1 -1
  61. package/dist/view.js +46 -2
  62. package/dist/view.js.map +1 -1
  63. package/dist/work-goal-link-view.d.ts +8 -0
  64. package/dist/work-goal-link-view.d.ts.map +1 -0
  65. package/dist/work-goal-link-view.js +3 -0
  66. package/dist/work-goal-link-view.js.map +1 -0
  67. package/dist/work-goal-link.d.ts +24 -0
  68. package/dist/work-goal-link.d.ts.map +1 -0
  69. package/dist/work-goal-link.js +34 -0
  70. package/dist/work-goal-link.js.map +1 -0
  71. package/dist/work-poll.d.ts +6 -0
  72. package/dist/work-poll.d.ts.map +1 -0
  73. package/dist/work-poll.js +7 -0
  74. package/dist/work-poll.js.map +1 -0
  75. package/dist/workspace-focus.d.ts +23 -0
  76. package/dist/workspace-focus.d.ts.map +1 -0
  77. package/dist/workspace-focus.js +69 -0
  78. package/dist/workspace-focus.js.map +1 -0
  79. package/package.json +17 -15
  80. package/src/styles.css +139 -12
@@ -0,0 +1,52 @@
1
+ import { Schema } from "effect";
2
+ import type { TerminalClientCommand } from "./model.js";
3
+ export declare const TerminalModifier: Schema.Literals<readonly ["ctrl", "alt"]>;
4
+ export type TerminalModifier = typeof TerminalModifier.Type;
5
+ export declare const TerminalCursorMode: Schema.Literals<readonly ["normal", "application"]>;
6
+ export type TerminalCursorMode = typeof TerminalCursorMode.Type;
7
+ export declare const TerminalRailKey: Schema.Literals<readonly ["escape", "tab", "arrowLeft", "arrowUp", "arrowDown", "arrowRight"]>;
8
+ export type TerminalRailKey = typeof TerminalRailKey.Type;
9
+ export type TerminalKeyDescriptor = {
10
+ readonly key: TerminalRailKey;
11
+ readonly label: string;
12
+ readonly ariaLabel: string;
13
+ };
14
+ export declare const terminalModifiers: ReadonlyArray<TerminalModifier>;
15
+ export declare const terminalKeyDescriptors: ReadonlyArray<TerminalKeyDescriptor>;
16
+ export type TerminalKeySerialization = {
17
+ readonly _tag: "supported";
18
+ readonly text: string;
19
+ } | {
20
+ readonly _tag: "unsupported";
21
+ readonly reason: "modifier_combination_not_supported";
22
+ };
23
+ type TerminalInputCommand = Extract<TerminalClientCommand, {
24
+ readonly type: "terminal.input";
25
+ }>;
26
+ /** Serialize one fixed terminal key without accepting arbitrary command text. */
27
+ export declare const serializeTerminalKey: (key: TerminalRailKey, modifier: TerminalModifier | null, cursorMode?: TerminalCursorMode) => TerminalKeySerialization;
28
+ export type TerminalKeyDispatch = {
29
+ readonly _tag: "sent";
30
+ readonly command: TerminalInputCommand;
31
+ readonly nextModifier: null;
32
+ } | {
33
+ readonly _tag: "unsupported";
34
+ readonly reason: "modifier_combination_not_supported";
35
+ readonly nextModifier: TerminalModifier | null;
36
+ };
37
+ /** Apply a rail key and clear a successful one-shot modifier. */
38
+ export declare const dispatchTerminalKey: (key: TerminalRailKey, modifier: TerminalModifier | null, cursorMode?: TerminalCursorMode) => TerminalKeyDispatch;
39
+ export declare const toggleTerminalModifier: (current: TerminalModifier | null, next: TerminalModifier) => TerminalModifier | null;
40
+ export type TerminalInputApplication = {
41
+ readonly _tag: "supported";
42
+ readonly text: string;
43
+ readonly nextModifier: null;
44
+ } | {
45
+ readonly _tag: "unsupported";
46
+ readonly reason: "modifier_combination_not_supported";
47
+ readonly nextModifier: TerminalModifier;
48
+ };
49
+ /** Apply a latched modifier to one Ghostty input chunk using only known encodings. */
50
+ export declare const applyTerminalModifierToInput: (modifier: TerminalModifier | null, text: string) => TerminalInputApplication;
51
+ export {};
52
+ //# sourceMappingURL=terminal-keyboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-keyboard.d.ts","sourceRoot":"","sources":["../src/terminal-keyboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAEvD,eAAO,MAAM,gBAAgB,2CAAmC,CAAA;AAChE,MAAM,MAAM,gBAAgB,GAAG,OAAO,gBAAgB,CAAC,IAAI,CAAA;AAE3D,eAAO,MAAM,kBAAkB,qDAA6C,CAAA;AAC5E,MAAM,MAAM,kBAAkB,GAAG,OAAO,kBAAkB,CAAC,IAAI,CAAA;AAE/D,eAAO,MAAM,eAAe,gGAO1B,CAAA;AACF,MAAM,MAAM,eAAe,GAAG,OAAO,eAAe,CAAC,IAAI,CAAA;AAEzD,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAA;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,aAAa,CAAC,gBAAgB,CAAmB,CAAA;AAEjF,eAAO,MAAM,sBAAsB,EAAE,aAAa,CAAC,qBAAqB,CAOvE,CAAA;AAED,MAAM,MAAM,wBAAwB,GAChC;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,oCAAoC,CAAA;CAAE,CAAA;AAE3F,KAAK,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC,CAAA;AAsD/F,iFAAiF;AACjF,eAAO,MAAM,oBAAoB,QAC1B,eAAe,YACV,gBAAgB,GAAG,IAAI,eACrB,kBAAkB,KAC7B,wBAoBF,CAAA;AAED,MAAM,MAAM,mBAAmB,GAC3B;IACA,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAA;IACtC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAA;CAC5B,GACC;IACA,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;IAC5B,QAAQ,CAAC,MAAM,EAAE,oCAAoC,CAAA;IACrD,QAAQ,CAAC,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAA;CAC/C,CAAA;AAEH,iEAAiE;AACjE,eAAO,MAAM,mBAAmB,QACzB,eAAe,YACV,gBAAgB,GAAG,IAAI,eACrB,kBAAkB,KAC7B,mBAaF,CAAA;AAED,eAAO,MAAM,sBAAsB,YACxB,gBAAgB,GAAG,IAAI,QAC1B,gBAAgB,KACrB,gBAAgB,GAAG,IAAwC,CAAA;AAE9D,MAAM,MAAM,wBAAwB,GAChC;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAA;CAAE,GAClF;IACA,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;IAC5B,QAAQ,CAAC,MAAM,EAAE,oCAAoC,CAAA;IACrD,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAA;CACxC,CAAA;AAgEH,sFAAsF;AACtF,eAAO,MAAM,4BAA4B,aAC7B,gBAAgB,GAAG,IAAI,QAC3B,MAAM,KACX,wBAG4C,CAAA"}
@@ -0,0 +1,141 @@
1
+ import { Schema } from "effect";
2
+ export const TerminalModifier = Schema.Literals(["ctrl", "alt"]);
3
+ export const TerminalCursorMode = Schema.Literals(["normal", "application"]);
4
+ export const TerminalRailKey = Schema.Literals([
5
+ "escape",
6
+ "tab",
7
+ "arrowLeft",
8
+ "arrowUp",
9
+ "arrowDown",
10
+ "arrowRight"
11
+ ]);
12
+ export const terminalModifiers = ["ctrl", "alt"];
13
+ export const terminalKeyDescriptors = [
14
+ { key: "escape", label: "Esc", ariaLabel: "Escape" },
15
+ { key: "tab", label: "Tab", ariaLabel: "Tab" },
16
+ { key: "arrowLeft", label: "←", ariaLabel: "Arrow left" },
17
+ { key: "arrowUp", label: "↑", ariaLabel: "Arrow up" },
18
+ { key: "arrowDown", label: "↓", ariaLabel: "Arrow down" },
19
+ { key: "arrowRight", label: "→", ariaLabel: "Arrow right" }
20
+ ];
21
+ const unsupported = () => ({
22
+ _tag: "unsupported",
23
+ reason: "modifier_combination_not_supported"
24
+ });
25
+ const supported = (text) => ({ _tag: "supported", text });
26
+ const controlCharacter = (key) => {
27
+ switch (key) {
28
+ case "c":
29
+ return "\u0003";
30
+ case "d":
31
+ return "\u0004";
32
+ case "l":
33
+ return "\u000c";
34
+ case "z":
35
+ return "\u001a";
36
+ }
37
+ };
38
+ const arrowCode = (key) => {
39
+ switch (key) {
40
+ case "arrowLeft":
41
+ return "D";
42
+ case "arrowUp":
43
+ return "A";
44
+ case "arrowDown":
45
+ return "B";
46
+ case "arrowRight":
47
+ return "C";
48
+ }
49
+ };
50
+ const arrowSequence = (code, cursorMode) => cursorMode === "application" ? `\u001bO${code}` : `\u001b[${code}`;
51
+ const arrowDefinitions = [
52
+ { key: "arrowUp", code: "A" },
53
+ { key: "arrowDown", code: "B" },
54
+ { key: "arrowRight", code: "C" },
55
+ { key: "arrowLeft", code: "D" }
56
+ ];
57
+ /** Serialize one fixed terminal key without accepting arbitrary command text. */
58
+ export const serializeTerminalKey = (key, modifier, cursorMode = "normal") => {
59
+ switch (key) {
60
+ case "escape":
61
+ return modifier === null ? supported("\u001b") : unsupported();
62
+ case "tab":
63
+ return modifier === "ctrl" ? unsupported() : supported(modifier === "alt" ? "\u001b\t" : "\t");
64
+ case "arrowLeft":
65
+ case "arrowUp":
66
+ case "arrowDown":
67
+ case "arrowRight": {
68
+ const code = arrowCode(key);
69
+ return supported(modifier === null
70
+ ? arrowSequence(code, cursorMode)
71
+ : `\u001b[1;${modifier === "ctrl" ? "5" : "3"}${code}`);
72
+ }
73
+ default:
74
+ return unsupported();
75
+ }
76
+ };
77
+ /** Apply a rail key and clear a successful one-shot modifier. */
78
+ export const dispatchTerminalKey = (key, modifier, cursorMode = "normal") => {
79
+ const serialization = serializeTerminalKey(key, modifier, cursorMode);
80
+ return serialization._tag === "supported"
81
+ ? {
82
+ _tag: "sent",
83
+ command: { type: "terminal.input", text: serialization.text },
84
+ nextModifier: null
85
+ }
86
+ : {
87
+ _tag: "unsupported",
88
+ reason: serialization.reason,
89
+ nextModifier: modifier
90
+ };
91
+ };
92
+ export const toggleTerminalModifier = (current, next) => (current === next ? null : next);
93
+ const arrowInputs = arrowDefinitions.map(({ code }) => ({
94
+ plain: `\u001b[${code}`,
95
+ application: `\u001bO${code}`,
96
+ ctrl: `\u001b[1;5${code}`,
97
+ alt: `\u001b[1;3${code}`
98
+ }));
99
+ const modifierCharacterInputs = ["c", "d", "l", "z"].map((key) => ({
100
+ plain: key,
101
+ encoded: `\u001b${key}`
102
+ }));
103
+ const terminalInputWithModifier = (modifier, text) => {
104
+ const arrow = arrowInputs.find((candidate) => candidate.plain === text || candidate.application === text || candidate[modifier] === text);
105
+ if (arrow !== undefined) {
106
+ return { _tag: "supported", text: arrow[modifier], nextModifier: null };
107
+ }
108
+ if (modifier === "ctrl") {
109
+ if (text === "\u0003" || text === "\u0004" || text === "\u000c" || text === "\u001a") {
110
+ return { _tag: "supported", text, nextModifier: null };
111
+ }
112
+ const controlKey = text.length === 1 ? text.toLowerCase() : text;
113
+ if (controlKey === "c" || controlKey === "d" || controlKey === "l" || controlKey === "z") {
114
+ return { _tag: "supported", text: controlCharacter(controlKey), nextModifier: null };
115
+ }
116
+ }
117
+ if (modifier === "alt") {
118
+ const normalized = text.length === 1
119
+ ? text.toLowerCase()
120
+ : text.length === 2 && text.startsWith("\u001b")
121
+ ? `\u001b${text.slice(1).toLowerCase()}`
122
+ : text;
123
+ const character = modifierCharacterInputs.find((candidate) => candidate.plain === normalized || candidate.encoded === normalized);
124
+ if (character !== undefined) {
125
+ return {
126
+ _tag: "supported",
127
+ text: text.length === 1 ? `\u001b${text}` : text,
128
+ nextModifier: null
129
+ };
130
+ }
131
+ if (text === "\t" || text === "\u001b\t") {
132
+ return { _tag: "supported", text: "\u001b\t", nextModifier: null };
133
+ }
134
+ }
135
+ return { _tag: "unsupported", reason: "modifier_combination_not_supported", nextModifier: modifier };
136
+ };
137
+ /** Apply a latched modifier to one Ghostty input chunk using only known encodings. */
138
+ export const applyTerminalModifierToInput = (modifier, text) => modifier === null
139
+ ? { _tag: "supported", text, nextModifier: null }
140
+ : terminalInputWithModifier(modifier, text);
141
+ //# sourceMappingURL=terminal-keyboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-keyboard.js","sourceRoot":"","sources":["../src/terminal-keyboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { PendingTerminalInput } from "./terminal-input.js";
2
+ import type { TerminalInputApplication, TerminalModifier } from "./terminal-keyboard.js";
3
+ export type TerminalOutputBoundary = {
4
+ readonly isActive: () => boolean;
5
+ readonly run: (write: () => void) => void;
6
+ };
7
+ type TerminalOutputWriter = {
8
+ readonly write: (data: Uint8Array) => void;
9
+ };
10
+ /** Mark synchronous Ghostty output so generated protocol replies bypass key modifiers. */
11
+ export declare const makeTerminalOutputBoundary: () => TerminalOutputBoundary;
12
+ /** Render server output through the production provenance boundary. */
13
+ export declare const writeTerminalOutput: (terminal: TerminalOutputWriter, data: Uint8Array, outputBoundary: TerminalOutputBoundary) => void;
14
+ export type TerminalInputFailure = "connection_unavailable" | "input_queue_overflow";
15
+ type SupportedTerminalInput = Extract<TerminalInputApplication, {
16
+ readonly _tag: "supported";
17
+ }>;
18
+ export type TerminalInputHandlerOptions = {
19
+ readonly applyInput: (text: string) => SupportedTerminalInput | null;
20
+ readonly isReady: () => boolean;
21
+ readonly onFailure: (failure: TerminalInputFailure) => void;
22
+ readonly outputBoundary: TerminalOutputBoundary;
23
+ readonly pendingInput: PendingTerminalInput;
24
+ readonly sendInput: (text: string) => boolean;
25
+ readonly setModifier: (modifier: TerminalModifier | null) => void;
26
+ };
27
+ /** Route Ghostty data by provenance so terminal replies bypass user modifiers. */
28
+ export declare const makeTerminalInputHandler: ({ applyInput, isReady, onFailure, outputBoundary, pendingInput, sendInput, setModifier }: TerminalInputHandlerOptions) => (text: string) => void;
29
+ export {};
30
+ //# sourceMappingURL=terminal-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-output.d.ts","sourceRoot":"","sources":["../src/terminal-output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,KAAK,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAExF,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAA;IAChC,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,IAAI,KAAK,IAAI,CAAA;CAC1C,CAAA;AAED,KAAK,oBAAoB,GAAG;IAC1B,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAA;CAC3C,CAAA;AAED,0FAA0F;AAC1F,eAAO,MAAM,0BAA0B,QAAO,sBAa7C,CAAA;AAED,uEAAuE;AACvE,eAAO,MAAM,mBAAmB,aACpB,oBAAoB,QACxB,UAAU,kBACA,sBAAsB,KACrC,IAAsD,CAAA;AAEzD,MAAM,MAAM,oBAAoB,GAAG,wBAAwB,GAAG,sBAAsB,CAAA;AAEpF,KAAK,sBAAsB,GAAG,OAAO,CAAC,wBAAwB,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC,CAAA;AAE/F,MAAM,MAAM,2BAA2B,GAAG;IACxC,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,sBAAsB,GAAG,IAAI,CAAA;IACpE,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAA;IAC/B,QAAQ,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAA;IAC3D,QAAQ,CAAC,cAAc,EAAE,sBAAsB,CAAA;IAC/C,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAA;IAC3C,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;IAC7C,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,KAAK,IAAI,CAAA;CAClE,CAAA;AAED,kFAAkF;AAClF,eAAO,MAAM,wBAAwB,6FAQlC,2BAA2B,KAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IA0BlD,CAAA"}
@@ -0,0 +1,54 @@
1
+ /** Mark synchronous Ghostty output so generated protocol replies bypass key modifiers. */
2
+ export const makeTerminalOutputBoundary = () => {
3
+ let depth = 0;
4
+ return {
5
+ isActive: () => depth > 0,
6
+ run: (write) => {
7
+ depth += 1;
8
+ try {
9
+ write();
10
+ }
11
+ finally {
12
+ depth -= 1;
13
+ }
14
+ }
15
+ };
16
+ };
17
+ /** Render server output through the production provenance boundary. */
18
+ export const writeTerminalOutput = (terminal, data, outputBoundary) => outputBoundary.run(() => terminal.write(data));
19
+ /** Route Ghostty data by provenance so terminal replies bypass user modifiers. */
20
+ export const makeTerminalInputHandler = ({ applyInput, isReady, onFailure, outputBoundary, pendingInput, sendInput, setModifier }) => {
21
+ const sendOrFail = (text) => {
22
+ if (sendInput(text))
23
+ return true;
24
+ onFailure("connection_unavailable");
25
+ return false;
26
+ };
27
+ const queueOrFail = (text) => {
28
+ if (pendingInput.push(text) !== "overflow")
29
+ return true;
30
+ onFailure("input_queue_overflow");
31
+ return false;
32
+ };
33
+ return (text) => {
34
+ if (outputBoundary.isActive()) {
35
+ if (isReady())
36
+ sendOrFail(text);
37
+ else
38
+ queueOrFail(text);
39
+ return;
40
+ }
41
+ const appliedText = applyInput(text);
42
+ if (appliedText === null)
43
+ return;
44
+ if (isReady()) {
45
+ if (!sendOrFail(appliedText.text))
46
+ return;
47
+ setModifier(appliedText.nextModifier);
48
+ return;
49
+ }
50
+ if (queueOrFail(appliedText.text))
51
+ setModifier(appliedText.nextModifier);
52
+ };
53
+ };
54
+ //# sourceMappingURL=terminal-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-output.js","sourceRoot":"","sources":["../src/terminal-output.ts"],"names":[],"mappings":"AAYA,0FAA0F;AAC1F,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAA2B,EAAE;IACrE,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,OAAO;QACL,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,GAAG,CAAC;QACzB,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE;YACb,KAAK,IAAI,CAAC,CAAA;YACV,IAAI,CAAC;gBACH,KAAK,EAAE,CAAA;YACT,CAAC;oBAAS,CAAC;gBACT,KAAK,IAAI,CAAC,CAAA;YACZ,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC,CAAA;AAED,uEAAuE;AACvE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,QAA8B,EAC9B,IAAgB,EAChB,cAAsC,EAChC,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;AAgBzD,kFAAkF;AAClF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,EACvC,UAAU,EACV,OAAO,EACP,SAAS,EACT,cAAc,EACd,YAAY,EACZ,SAAS,EACT,WAAW,EACiB,EAA0B,EAAE;IACxD,MAAM,UAAU,GAAG,CAAC,IAAY,EAAW,EAAE;QAC3C,IAAI,SAAS,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAA;QAChC,SAAS,CAAC,wBAAwB,CAAC,CAAA;QACnC,OAAO,KAAK,CAAA;IACd,CAAC,CAAA;IACD,MAAM,WAAW,GAAG,CAAC,IAAY,EAAW,EAAE;QAC5C,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,UAAU;YAAE,OAAO,IAAI,CAAA;QACvD,SAAS,CAAC,sBAAsB,CAAC,CAAA;QACjC,OAAO,KAAK,CAAA;IACd,CAAC,CAAA;IACD,OAAO,CAAC,IAAI,EAAE,EAAE;QACd,IAAI,cAAc,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC9B,IAAI,OAAO,EAAE;gBAAE,UAAU,CAAC,IAAI,CAAC,CAAA;;gBAC1B,WAAW,CAAC,IAAI,CAAC,CAAA;YACtB,OAAM;QACR,CAAC;QACD,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;QACpC,IAAI,WAAW,KAAK,IAAI;YAAE,OAAM;QAChC,IAAI,OAAO,EAAE,EAAE,CAAC;YACd,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC;gBAAE,OAAM;YACzC,WAAW,CAAC,WAAW,CAAC,YAAY,CAAC,CAAA;YACrC,OAAM;QACR,CAAC;QACD,IAAI,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC;YAAE,WAAW,CAAC,WAAW,CAAC,YAAY,CAAC,CAAA;IAC1E,CAAC,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ export type TerminalRailNavigationKey = "ArrowLeft" | "ArrowRight";
2
+ /** Find the next enabled terminal control for horizontal toolbar navigation. */
3
+ export declare const nextTerminalRailIndex: (key: string, currentIndex: number, enabled: ReadonlyArray<boolean>) => number | null;
4
+ //# sourceMappingURL=terminal-rail-navigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-rail-navigation.d.ts","sourceRoot":"","sources":["../src/terminal-rail-navigation.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,yBAAyB,GAAG,WAAW,GAAG,YAAY,CAAA;AAElE,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,QAC3B,MAAM,gBACG,MAAM,WACX,aAAa,CAAC,OAAO,CAAC,KAC9B,MAAM,GAAG,IAQX,CAAA"}
@@ -0,0 +1,13 @@
1
+ /** Find the next enabled terminal control for horizontal toolbar navigation. */
2
+ export const nextTerminalRailIndex = (key, currentIndex, enabled) => {
3
+ if ((key !== "ArrowLeft" && key !== "ArrowRight") || enabled.length < 2)
4
+ return null;
5
+ const offset = key === "ArrowLeft" ? -1 : 1;
6
+ for (let step = 1; step < enabled.length; step += 1) {
7
+ const index = (currentIndex + offset * step + enabled.length) % enabled.length;
8
+ if (enabled[index] === true)
9
+ return index;
10
+ }
11
+ return null;
12
+ };
13
+ //# sourceMappingURL=terminal-rail-navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-rail-navigation.js","sourceRoot":"","sources":["../src/terminal-rail-navigation.ts"],"names":[],"mappings":"AAEA,gFAAgF;AAChF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,GAAW,EACX,YAAoB,EACpB,OAA+B,EAChB,EAAE;IACjB,IAAI,CAAC,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,YAAY,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IACpF,MAAM,MAAM,GAAG,GAAG,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3C,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,CAAC,YAAY,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAA;QAC9E,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI;YAAE,OAAO,KAAK,CAAA;IAC3C,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
@@ -1,12 +1,42 @@
1
1
  export interface TerminalViewportTarget {
2
2
  readonly style: Pick<CSSStyleDeclaration, "removeProperty" | "setProperty">;
3
3
  }
4
+ export interface TerminalViewportScrollAncestor extends EventTarget {
5
+ readonly parentElement?: TerminalViewportScrollAncestor | null;
6
+ }
7
+ export interface TerminalViewportBoundary {
8
+ readonly getBoundingClientRect: () => Pick<DOMRect, "top">;
9
+ readonly parentElement?: TerminalViewportScrollAncestor | null;
10
+ }
4
11
  export interface TerminalVisualViewport extends EventTarget {
5
12
  readonly height: number;
6
13
  readonly offsetTop: number;
7
14
  }
8
- export interface TerminalViewportHost {
15
+ export interface TerminalViewportHost extends EventTarget {
16
+ readonly document?: {
17
+ readonly body: {
18
+ readonly classList: Pick<DOMTokenList, "add" | "contains" | "remove">;
19
+ };
20
+ readonly documentElement: {
21
+ readonly classList: Pick<DOMTokenList, "add" | "contains" | "remove">;
22
+ };
23
+ };
24
+ readonly innerHeight?: number;
25
+ readonly scrollX?: number;
26
+ readonly scrollY?: number;
9
27
  readonly visualViewport?: TerminalVisualViewport | null;
28
+ readonly scrollTo?: (options: ScrollToOptions) => void;
29
+ }
30
+ export type TerminalViewportCleanup = () => void;
31
+ export interface TerminalViewportBindingState {
32
+ readonly connectionRequested: boolean;
33
+ readonly focusRejected: boolean;
34
+ readonly terminalConnected: boolean;
10
35
  }
11
- export declare const bindTerminalViewport: (target: TerminalViewportTarget, host: TerminalViewportHost) => () => void;
36
+ /** Keeps geometry installed for every state that can render the fixed terminal. */
37
+ export declare const terminalViewportBindingActive: ({ connectionRequested, focusRejected, terminalConnected }: TerminalViewportBindingState) => boolean;
38
+ /** Locks document scrolling without mutating inline styles until cleanup. */
39
+ export declare const bindTerminalDocumentLock: (host: TerminalViewportHost) => TerminalViewportCleanup;
40
+ /** Locks document scroll and fits the terminal to the visual viewport until cleanup. */
41
+ export declare const bindTerminalViewport: (target: TerminalViewportTarget, host: TerminalViewportHost, topBoundary?: TerminalViewportBoundary, lockDocument?: boolean) => TerminalViewportCleanup;
12
42
  //# sourceMappingURL=terminal-viewport.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"terminal-viewport.d.ts","sourceRoot":"","sources":["../src/terminal-viewport.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,mBAAmB,EAAE,gBAAgB,GAAG,aAAa,CAAC,CAAA;CAC5E;AAED,MAAM,WAAW,sBAAuB,SAAQ,WAAW;IACzD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,cAAc,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAA;CACxD;AAKD,eAAO,MAAM,oBAAoB,WACvB,sBAAsB,QACxB,oBAAoB,KACzB,MAAM,IAmBR,CAAA"}
1
+ {"version":3,"file":"terminal-viewport.d.ts","sourceRoot":"","sources":["../src/terminal-viewport.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,mBAAmB,EAAE,gBAAgB,GAAG,aAAa,CAAC,CAAA;CAC5E;AAED,MAAM,WAAW,8BAA+B,SAAQ,WAAW;IACjE,QAAQ,CAAC,aAAa,CAAC,EAAE,8BAA8B,GAAG,IAAI,CAAA;CAC/D;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAC1D,QAAQ,CAAC,aAAa,CAAC,EAAE,8BAA8B,GAAG,IAAI,CAAA;CAC/D;AAED,MAAM,WAAW,sBAAuB,SAAQ,WAAW;IACzD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,oBAAqB,SAAQ,WAAW;IACvD,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAClB,QAAQ,CAAC,IAAI,EAAE;YAAE,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC,CAAA;SAAE,CAAA;QACxF,QAAQ,CAAC,eAAe,EAAE;YAAE,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC,CAAA;SAAE,CAAA;KACpG,CAAA;IACD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,cAAc,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAA;IACvD,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAA;CACvD;AAED,MAAM,MAAM,uBAAuB,GAAG,MAAM,IAAI,CAAA;AAEhD,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAA;IACrC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAA;CACpC;AAED,mFAAmF;AACnF,eAAO,MAAM,6BAA6B,8DAIvC,4BAA4B,KAAG,OAAoE,CAAA;AAuCtG,6EAA6E;AAC7E,eAAO,MAAM,wBAAwB,SAAU,oBAAoB,KAAG,uBAyCrE,CAAA;AAED,wFAAwF;AACxF,eAAO,MAAM,oBAAoB,WACvB,sBAAsB,QACxB,oBAAoB,gBACZ,wBAAwB,6BAErC,uBAwDF,CAAA"}
@@ -1,21 +1,140 @@
1
+ /** Keeps geometry installed for every state that can render the fixed terminal. */
2
+ export const terminalViewportBindingActive = ({ connectionRequested, focusRejected, terminalConnected }) => connectionRequested || focusRejected || terminalConnected;
1
3
  const viewportHeightProperty = "--connect-visual-viewport-height";
2
4
  const viewportOffsetProperty = "--connect-visual-viewport-offset";
3
- export const bindTerminalViewport = (target, host) => {
4
- const viewport = host.visualViewport;
5
- if (viewport === undefined || viewport === null)
5
+ const documentLockClass = "connect-terminal-document-lock";
6
+ const terminalDocumentLocks = new WeakMap();
7
+ const bindTerminalDocumentRelease = (host, lock) => {
8
+ let released = false;
9
+ const release = () => {
10
+ if (released)
11
+ return;
12
+ released = true;
13
+ host.removeEventListener("pagehide", releaseOnPageHide);
14
+ lock.count -= 1;
15
+ if (lock.count === 0)
16
+ lock.restore();
17
+ };
18
+ const releaseOnPageHide = (event) => {
19
+ if ("persisted" in event && event.persisted === true)
20
+ return;
21
+ release();
22
+ };
23
+ try {
24
+ host.addEventListener("pagehide", releaseOnPageHide);
25
+ }
26
+ catch (error) {
27
+ lock.count -= 1;
28
+ if (lock.count === 0)
29
+ lock.restore();
30
+ throw error;
31
+ }
32
+ return release;
33
+ };
34
+ /** Locks document scrolling without mutating inline styles until cleanup. */
35
+ export const bindTerminalDocumentLock = (host) => {
36
+ const document = host.document;
37
+ if (document === undefined)
6
38
  return () => undefined;
39
+ const active = terminalDocumentLocks.get(document);
40
+ if (active !== undefined) {
41
+ active.count += 1;
42
+ return bindTerminalDocumentRelease(host, active);
43
+ }
44
+ const bodyWasLocked = document.body.classList.contains(documentLockClass);
45
+ const documentWasLocked = document.documentElement.classList.contains(documentLockClass);
46
+ const scrollX = host.scrollX ?? 0;
47
+ const scrollY = host.scrollY ?? 0;
48
+ const restoreScroll = () => host.scrollTo?.({ behavior: "instant", left: scrollX, top: scrollY });
49
+ let restoring = false;
50
+ const retainScroll = () => {
51
+ if (restoring || (host.scrollX === scrollX && host.scrollY === scrollY))
52
+ return;
53
+ restoring = true;
54
+ restoreScroll();
55
+ restoring = false;
56
+ };
57
+ const restore = () => {
58
+ host.removeEventListener("scroll", retainScroll, true);
59
+ terminalDocumentLocks.delete(document);
60
+ if (!documentWasLocked)
61
+ document.documentElement.classList.remove(documentLockClass);
62
+ if (!bodyWasLocked)
63
+ document.body.classList.remove(documentLockClass);
64
+ restoreScroll();
65
+ };
66
+ const lock = { count: 1, restore };
67
+ terminalDocumentLocks.set(document, lock);
68
+ try {
69
+ document.documentElement.classList.add(documentLockClass);
70
+ document.body.classList.add(documentLockClass);
71
+ host.addEventListener("scroll", retainScroll, true);
72
+ }
73
+ catch (error) {
74
+ restore();
75
+ throw error;
76
+ }
77
+ return bindTerminalDocumentRelease(host, lock);
78
+ };
79
+ /** Locks document scroll and fits the terminal to the visual viewport until cleanup. */
80
+ export const bindTerminalViewport = (target, host, topBoundary, lockDocument = true) => {
81
+ const releaseDocumentLock = lockDocument ? bindTerminalDocumentLock(host) : () => undefined;
82
+ const viewport = host.visualViewport;
83
+ if ((viewport === undefined || viewport === null) && topBoundary === undefined)
84
+ return releaseDocumentLock;
85
+ const scrollAncestors = [];
86
+ let scrollAncestor = topBoundary?.parentElement ?? null;
87
+ while (scrollAncestor !== null) {
88
+ scrollAncestors.push(scrollAncestor);
89
+ scrollAncestor = scrollAncestor.parentElement ?? null;
90
+ }
7
91
  const update = () => {
8
- target.style.setProperty(viewportHeightProperty, `${String(Math.max(0, viewport.height))}px`);
9
- target.style.setProperty(viewportOffsetProperty, `${String(Math.max(0, viewport.offsetTop))}px`);
92
+ const viewportTop = Math.max(0, viewport?.offsetTop ?? 0);
93
+ const viewportHeight = Math.max(0, viewport?.height ?? host.innerHeight ?? 0);
94
+ const viewportBottom = viewportTop + viewportHeight;
95
+ const boundaryTop = Math.max(viewportTop, topBoundary?.getBoundingClientRect().top ?? viewportTop);
96
+ target.style.setProperty(viewportHeightProperty, `${String(Math.max(0, viewportBottom - boundaryTop))}px`);
97
+ target.style.setProperty(viewportOffsetProperty, `${String(boundaryTop)}px`);
98
+ };
99
+ const releaseGeometry = () => {
100
+ viewport?.removeEventListener("resize", update);
101
+ viewport?.removeEventListener("scroll", update);
102
+ if (topBoundary !== undefined) {
103
+ host.removeEventListener("resize", update);
104
+ host.removeEventListener("scroll", update, true);
105
+ for (const ancestor of scrollAncestors)
106
+ ancestor.removeEventListener("scroll", update, true);
107
+ }
10
108
  };
11
- viewport.addEventListener("resize", update);
12
- viewport.addEventListener("scroll", update);
13
- update();
109
+ try {
110
+ viewport?.addEventListener("resize", update);
111
+ viewport?.addEventListener("scroll", update);
112
+ if (topBoundary !== undefined) {
113
+ host.addEventListener("resize", update);
114
+ host.addEventListener("scroll", update, true);
115
+ for (const ancestor of scrollAncestors)
116
+ ancestor.addEventListener("scroll", update, true);
117
+ }
118
+ update();
119
+ }
120
+ catch (error) {
121
+ releaseGeometry();
122
+ releaseDocumentLock();
123
+ throw error;
124
+ }
125
+ let released = false;
14
126
  return () => {
15
- viewport.removeEventListener("resize", update);
16
- viewport.removeEventListener("scroll", update);
17
- target.style.removeProperty(viewportHeightProperty);
18
- target.style.removeProperty(viewportOffsetProperty);
127
+ if (released)
128
+ return;
129
+ released = true;
130
+ try {
131
+ releaseGeometry();
132
+ target.style.removeProperty(viewportHeightProperty);
133
+ target.style.removeProperty(viewportOffsetProperty);
134
+ }
135
+ finally {
136
+ releaseDocumentLock();
137
+ }
19
138
  };
20
139
  };
21
140
  //# sourceMappingURL=terminal-viewport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"terminal-viewport.js","sourceRoot":"","sources":["../src/terminal-viewport.ts"],"names":[],"mappings":"AAaA,MAAM,sBAAsB,GAAG,kCAAkC,CAAA;AACjE,MAAM,sBAAsB,GAAG,kCAAkC,CAAA;AAEjE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,MAA8B,EAC9B,IAA0B,EACd,EAAE;IACd,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAA;IACpC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,GAAG,EAAE,CAAC,SAAS,CAAA;IAEvE,MAAM,MAAM,GAAG,GAAS,EAAE;QACxB,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,sBAAsB,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAA;QAC7F,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,sBAAsB,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAA;IAClG,CAAC,CAAA;IAED,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IAC3C,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IAC3C,MAAM,EAAE,CAAA;IAER,OAAO,GAAG,EAAE;QACV,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAC9C,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAC9C,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAAA;QACnD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAAA;IACrD,CAAC,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"terminal-viewport.js","sourceRoot":"","sources":["../src/terminal-viewport.ts"],"names":[],"mappings":"AAsCA,mFAAmF;AACnF,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,EAC5C,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACY,EAAW,EAAE,CAAC,mBAAmB,IAAI,aAAa,IAAI,iBAAiB,CAAA;AAEtG,MAAM,sBAAsB,GAAG,kCAAkC,CAAA;AACjE,MAAM,sBAAsB,GAAG,kCAAkC,CAAA;AACjE,MAAM,iBAAiB,GAAG,gCAAgC,CAAA;AAO1D,MAAM,qBAAqB,GAAG,IAAI,OAAO,EAAgC,CAAA;AAEzE,MAAM,2BAA2B,GAAG,CAClC,IAA0B,EAC1B,IAA0B,EACD,EAAE;IAC3B,IAAI,QAAQ,GAAG,KAAK,CAAA;IACpB,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,IAAI,QAAQ;YAAE,OAAM;QACpB,QAAQ,GAAG,IAAI,CAAA;QACf,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAA;QACvD,IAAI,CAAC,KAAK,IAAI,CAAC,CAAA;QACf,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC;YAAE,IAAI,CAAC,OAAO,EAAE,CAAA;IACtC,CAAC,CAAA;IACD,MAAM,iBAAiB,GAAG,CAAC,KAAY,EAAQ,EAAE;QAC/C,IAAI,WAAW,IAAI,KAAK,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI;YAAE,OAAM;QAC5D,OAAO,EAAE,CAAA;IACX,CAAC,CAAA;IACD,IAAI,CAAC;QACH,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAA;IACtD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,KAAK,IAAI,CAAC,CAAA;QACf,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC;YAAE,IAAI,CAAC,OAAO,EAAE,CAAA;QACpC,MAAM,KAAK,CAAA;IACb,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED,6EAA6E;AAC7E,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,IAA0B,EAA2B,EAAE;IAC9F,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;IAC9B,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,GAAG,EAAE,CAAC,SAAS,CAAA;IAClD,MAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAClD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,CAAC,KAAK,IAAI,CAAC,CAAA;QACjB,OAAO,2BAA2B,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAClD,CAAC;IAED,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAA;IACzE,MAAM,iBAAiB,GAAG,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAA;IACxF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;IACjC,MAAM,aAAa,GAAG,GAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;IACvG,IAAI,SAAS,GAAG,KAAK,CAAA;IACrB,MAAM,YAAY,GAAG,GAAS,EAAE;QAC9B,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC;YAAE,OAAM;QAC/E,SAAS,GAAG,IAAI,CAAA;QAChB,aAAa,EAAE,CAAA;QACf,SAAS,GAAG,KAAK,CAAA;IACnB,CAAC,CAAA;IACD,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,CAAA;QACtD,qBAAqB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QACtC,IAAI,CAAC,iBAAiB;YAAE,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAA;QACpF,IAAI,CAAC,aAAa;YAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAA;QACrE,aAAa,EAAE,CAAA;IACjB,CAAC,CAAA;IACD,MAAM,IAAI,GAAyB,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAA;IACxD,qBAAqB,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAEzC,IAAI,CAAC;QACH,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;QACzD,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;QAC9C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,CAAA;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,CAAA;QACT,MAAM,KAAK,CAAA;IACb,CAAC;IAED,OAAO,2BAA2B,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AAChD,CAAC,CAAA;AAED,wFAAwF;AACxF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,MAA8B,EAC9B,IAA0B,EAC1B,WAAsC,EACtC,YAAY,GAAG,IAAI,EACM,EAAE;IAC3B,MAAM,mBAAmB,GAAG,YAAY,CAAC,CAAC,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,SAAS,CAAA;IAC3F,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAA;IACpC,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,CAAC,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,mBAAmB,CAAA;IAC1G,MAAM,eAAe,GAA0C,EAAE,CAAA;IACjE,IAAI,cAAc,GAAG,WAAW,EAAE,aAAa,IAAI,IAAI,CAAA;IACvD,OAAO,cAAc,KAAK,IAAI,EAAE,CAAC;QAC/B,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QACpC,cAAc,GAAG,cAAc,CAAC,aAAa,IAAI,IAAI,CAAA;IACvD,CAAC;IAED,MAAM,MAAM,GAAG,GAAS,EAAE;QACxB,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,IAAI,CAAC,CAAC,CAAA;QACzD,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,CAAA;QAC7E,MAAM,cAAc,GAAG,WAAW,GAAG,cAAc,CAAA;QACnD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC,GAAG,IAAI,WAAW,CAAC,CAAA;QAClG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,sBAAsB,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,CAAA;QAC1G,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,sBAAsB,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;IAC9E,CAAC,CAAA;IACD,MAAM,eAAe,GAAG,GAAS,EAAE;QACjC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAC/C,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAC/C,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;YAC1C,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;YAChD,KAAK,MAAM,QAAQ,IAAI,eAAe;gBAAE,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;QAC9F,CAAC;IACH,CAAC,CAAA;IAED,IAAI,CAAC;QACH,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAC5C,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAC5C,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;YACvC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;YAC7C,KAAK,MAAM,QAAQ,IAAI,eAAe;gBAAE,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;QAC3F,CAAC;QACD,MAAM,EAAE,CAAA;IACV,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAe,EAAE,CAAA;QACjB,mBAAmB,EAAE,CAAA;QACrB,MAAM,KAAK,CAAA;IACb,CAAC;IAED,IAAI,QAAQ,GAAG,KAAK,CAAA;IACpB,OAAO,GAAG,EAAE;QACV,IAAI,QAAQ;YAAE,OAAM;QACpB,QAAQ,GAAG,IAAI,CAAA;QACf,IAAI,CAAC;YACH,eAAe,EAAE,CAAA;YACjB,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAAA;YACnD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAAA;QACrD,CAAC;gBAAS,CAAC;YACT,mBAAmB,EAAE,CAAA;QACvB,CAAC;IACH,CAAC,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,7 @@
1
+ export interface TerminalWorkerGuard {
2
+ readonly accepts: (currentRequestId: number) => boolean;
3
+ readonly release: () => void;
4
+ }
5
+ /** Rejects callbacks after an effect cleanup, even when a remount reuses the persisted request id. */
6
+ export declare const makeTerminalWorkerGuard: (ownedRequestId: number) => TerminalWorkerGuard;
7
+ //# sourceMappingURL=terminal-worker-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-worker-guard.d.ts","sourceRoot":"","sources":["../src/terminal-worker-guard.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK,OAAO,CAAA;IACvD,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAC7B;AAED,sGAAsG;AACtG,eAAO,MAAM,uBAAuB,mBAAoB,MAAM,KAAG,mBAQhE,CAAA"}
@@ -0,0 +1,11 @@
1
+ /** Rejects callbacks after an effect cleanup, even when a remount reuses the persisted request id. */
2
+ export const makeTerminalWorkerGuard = (ownedRequestId) => {
3
+ let active = true;
4
+ return {
5
+ accepts: (currentRequestId) => active && currentRequestId === ownedRequestId,
6
+ release: () => {
7
+ active = false;
8
+ }
9
+ };
10
+ };
11
+ //# sourceMappingURL=terminal-worker-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-worker-guard.js","sourceRoot":"","sources":["../src/terminal-worker-guard.ts"],"names":[],"mappings":"AAKA,sGAAsG;AACtG,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,cAAsB,EAAuB,EAAE;IACrF,IAAI,MAAM,GAAG,IAAI,CAAA;IACjB,OAAO;QACL,OAAO,EAAE,CAAC,gBAAgB,EAAE,EAAE,CAAC,MAAM,IAAI,gBAAgB,KAAK,cAAc;QAC5E,OAAO,EAAE,GAAG,EAAE;YACZ,MAAM,GAAG,KAAK,CAAA;QAChB,CAAC;KACF,CAAA;AACH,CAAC,CAAA"}