@termaxjs/web-addons 0.1.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 (42) hide show
  1. package/LICENSE +201 -0
  2. package/dist/AsciinemaAddon.d.ts +28 -0
  3. package/dist/AsciinemaAddon.d.ts.map +1 -0
  4. package/dist/AsciinemaAddon.js +77 -0
  5. package/dist/AsciinemaAddon.js.map +1 -0
  6. package/dist/CopyModeAddon.d.ts +21 -0
  7. package/dist/CopyModeAddon.d.ts.map +1 -0
  8. package/dist/CopyModeAddon.js +164 -0
  9. package/dist/CopyModeAddon.js.map +1 -0
  10. package/dist/GhostTextManager.d.ts +41 -0
  11. package/dist/GhostTextManager.d.ts.map +1 -0
  12. package/dist/GhostTextManager.js +181 -0
  13. package/dist/GhostTextManager.js.map +1 -0
  14. package/dist/ImagePreviewAddon.d.ts +14 -0
  15. package/dist/ImagePreviewAddon.d.ts.map +1 -0
  16. package/dist/ImagePreviewAddon.js +54 -0
  17. package/dist/ImagePreviewAddon.js.map +1 -0
  18. package/dist/Osc133Addon.d.ts +30 -0
  19. package/dist/Osc133Addon.d.ts.map +1 -0
  20. package/dist/Osc133Addon.js +96 -0
  21. package/dist/Osc133Addon.js.map +1 -0
  22. package/dist/PathLinkProvider.d.ts +13 -0
  23. package/dist/PathLinkProvider.d.ts.map +1 -0
  24. package/dist/PathLinkProvider.js +103 -0
  25. package/dist/PathLinkProvider.js.map +1 -0
  26. package/dist/PromptMarkerAddon.d.ts +17 -0
  27. package/dist/PromptMarkerAddon.d.ts.map +1 -0
  28. package/dist/PromptMarkerAddon.js +58 -0
  29. package/dist/PromptMarkerAddon.js.map +1 -0
  30. package/dist/SessionReplayAddon.d.ts +18 -0
  31. package/dist/SessionReplayAddon.d.ts.map +1 -0
  32. package/dist/SessionReplayAddon.js +73 -0
  33. package/dist/SessionReplayAddon.js.map +1 -0
  34. package/dist/index.d.ts +10 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +10 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/xtermCompat.d.ts +126 -0
  39. package/dist/xtermCompat.d.ts.map +1 -0
  40. package/dist/xtermCompat.js +331 -0
  41. package/dist/xtermCompat.js.map +1 -0
  42. package/package.json +37 -0
@@ -0,0 +1,181 @@
1
+ // terminal type from core
2
+ export class GhostTextManager {
3
+ terminal;
4
+ currentSuggestion = null;
5
+ overlayElement = null;
6
+ options;
7
+ listeners = [];
8
+ keyDisposable;
9
+ history = [];
10
+ customProvider;
11
+ constructor(terminal, options = {}) {
12
+ this.terminal = terminal;
13
+ this.history = options.history ? [...options.history] : [];
14
+ this.customProvider = options.provider;
15
+ this.options = {
16
+ textColor: "rgba(160, 160, 170, 0.55)",
17
+ backgroundColor: "transparent",
18
+ opacity: 0.85,
19
+ enableKeyboardInterception: true,
20
+ ...options,
21
+ };
22
+ if (this.options.enableKeyboardInterception) {
23
+ this.attachKeyHandler();
24
+ }
25
+ }
26
+ setHistory(history) {
27
+ this.history = [...history];
28
+ }
29
+ addHistory(cmd) {
30
+ const trimmed = cmd.trim();
31
+ if (!trimmed)
32
+ return;
33
+ this.history = [trimmed, ...this.history.filter((h) => h !== trimmed)].slice(0, 2000);
34
+ }
35
+ setProvider(provider) {
36
+ this.customProvider = provider;
37
+ }
38
+ async updateInput(inputLine) {
39
+ const trimmed = inputLine.trimStart();
40
+ if (!trimmed) {
41
+ this.setSuggestion(null);
42
+ return;
43
+ }
44
+ if (this.customProvider) {
45
+ const res = await this.customProvider(inputLine);
46
+ this.setSuggestion(res);
47
+ return;
48
+ }
49
+ const match = this.history.find((h) => h.startsWith(inputLine) && h !== inputLine);
50
+ if (match) {
51
+ const suffix = match.slice(inputLine.length);
52
+ this.setSuggestion(suffix);
53
+ }
54
+ else {
55
+ this.setSuggestion(null);
56
+ }
57
+ }
58
+ addListener(listener) {
59
+ this.listeners.push(listener);
60
+ return () => {
61
+ this.listeners = this.listeners.filter((l) => l !== listener);
62
+ };
63
+ }
64
+ setSuggestion(text) {
65
+ this.currentSuggestion = text;
66
+ this.render();
67
+ for (const l of this.listeners)
68
+ l.onChange?.(text);
69
+ }
70
+ appendSuggestion(delta) {
71
+ const next = (this.currentSuggestion || "") + delta;
72
+ this.setSuggestion(next);
73
+ }
74
+ getSuggestion() {
75
+ return this.currentSuggestion;
76
+ }
77
+ hasSuggestion() {
78
+ return Boolean(this.currentSuggestion && this.currentSuggestion.length > 0);
79
+ }
80
+ accept() {
81
+ const text = this.currentSuggestion;
82
+ if (!text)
83
+ return null;
84
+ this.setSuggestion(null);
85
+ for (const l of this.listeners)
86
+ l.onAccept?.(text);
87
+ return text;
88
+ }
89
+ acceptWord() {
90
+ if (!this.currentSuggestion)
91
+ return null;
92
+ const match = this.currentSuggestion.match(/^(\s*\S+\s*)/);
93
+ if (!match)
94
+ return this.accept();
95
+ const word = match[1];
96
+ const remainder = this.currentSuggestion.slice(word.length);
97
+ this.setSuggestion(remainder.length > 0 ? remainder : null);
98
+ for (const l of this.listeners)
99
+ l.onAccept?.(word);
100
+ return word;
101
+ }
102
+ dismiss() {
103
+ if (!this.currentSuggestion)
104
+ return;
105
+ this.setSuggestion(null);
106
+ for (const l of this.listeners)
107
+ l.onDismiss?.();
108
+ }
109
+ attachKeyHandler() {
110
+ if (typeof this.terminal.onKey === "function") {
111
+ const d = this.terminal.onKey(({ domEvent }) => {
112
+ if (!this.hasSuggestion())
113
+ return;
114
+ if (domEvent.key === "Tab" || (domEvent.key === "ArrowRight" && !domEvent.altKey && !domEvent.metaKey)) {
115
+ domEvent.preventDefault();
116
+ domEvent.stopPropagation();
117
+ this.accept();
118
+ }
119
+ else if (domEvent.key === "ArrowRight" && (domEvent.altKey || domEvent.ctrlKey)) {
120
+ domEvent.preventDefault();
121
+ domEvent.stopPropagation();
122
+ this.acceptWord();
123
+ }
124
+ else if (domEvent.key === "Escape") {
125
+ domEvent.preventDefault();
126
+ domEvent.stopPropagation();
127
+ this.dismiss();
128
+ }
129
+ });
130
+ this.keyDisposable = d;
131
+ }
132
+ }
133
+ render() {
134
+ if (typeof document === "undefined")
135
+ return;
136
+ if (!this.currentSuggestion) {
137
+ if (this.overlayElement) {
138
+ this.overlayElement.style.display = "none";
139
+ }
140
+ return;
141
+ }
142
+ if (!this.overlayElement) {
143
+ this.overlayElement = document.createElement("div");
144
+ this.overlayElement.className = "termax-ghost-text-overlay";
145
+ this.overlayElement.style.cssText = `
146
+ position: absolute;
147
+ pointer-events: none;
148
+ user-select: none;
149
+ z-index: 20;
150
+ font-family: inherit;
151
+ font-size: inherit;
152
+ line-height: inherit;
153
+ color: ${this.options.textColor};
154
+ background: ${this.options.backgroundColor};
155
+ opacity: ${this.options.opacity};
156
+ white-space: pre;
157
+ `;
158
+ this.terminal.element?.appendChild(this.overlayElement);
159
+ }
160
+ const charWidth = this.terminal.renderer?.charWidth || 9;
161
+ const charHeight = this.terminal.renderer?.charHeight || 18;
162
+ const cursorX = this.terminal.buffer.active.cursorX ?? 0;
163
+ const cursorY = this.terminal.buffer.active.cursorY ?? 0;
164
+ const leftPx = cursorX * charWidth;
165
+ const topPx = cursorY * charHeight;
166
+ this.overlayElement.style.left = `${leftPx}px`;
167
+ this.overlayElement.style.top = `${topPx}px`;
168
+ this.overlayElement.style.display = "block";
169
+ this.overlayElement.textContent = this.currentSuggestion;
170
+ }
171
+ dispose() {
172
+ this.keyDisposable?.dispose();
173
+ if (this.overlayElement && this.overlayElement.parentNode) {
174
+ this.overlayElement.parentNode.removeChild(this.overlayElement);
175
+ }
176
+ this.overlayElement = null;
177
+ this.currentSuggestion = null;
178
+ this.listeners = [];
179
+ }
180
+ }
181
+ //# sourceMappingURL=GhostTextManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GhostTextManager.js","sourceRoot":"","sources":["../src/GhostTextManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { ITerminalAddon } from "@termaxjs/web-core";
2
+ export interface ImagePreviewOptions {
3
+ onHover?: (event: MouseEvent, uri: string) => void;
4
+ onLeave?: (event: MouseEvent) => void;
5
+ }
6
+ export declare class ImagePreviewAddon implements ITerminalAddon {
7
+ private terminal;
8
+ private options;
9
+ private imageRegex;
10
+ constructor(options?: ImagePreviewOptions);
11
+ activate(terminal: any): void;
12
+ dispose(): void;
13
+ }
14
+ //# sourceMappingURL=ImagePreviewAddon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImagePreviewAddon.d.ts","sourceRoot":"","sources":["../src/ImagePreviewAddon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACvC;AAED,qBAAa,iBAAkB,YAAW,cAAc;IACtD,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,UAAU,CAAoG;gBAE1G,OAAO,GAAE,mBAAwB;IAItC,QAAQ,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI;IA6C7B,OAAO,IAAI,IAAI;CAGvB"}
@@ -0,0 +1,54 @@
1
+ export class ImagePreviewAddon {
2
+ terminal;
3
+ options;
4
+ imageRegex = /(?:https?:\/\/[^\s"'`]+|\/[^\s"'`]+|\.\.?[^\s"'`]*)\.(?:png|jpe?g|gif|webp|svg|bmp)(?::\d+)?/gi;
5
+ constructor(options = {}) {
6
+ this.options = options;
7
+ }
8
+ activate(terminal) {
9
+ this.terminal = terminal;
10
+ if (terminal.registerLinkProvider) {
11
+ terminal.registerLinkProvider({
12
+ provideLinks: (y, callback) => {
13
+ const line = terminal.buffer.active.getLine(y);
14
+ if (!line) {
15
+ callback(undefined);
16
+ return;
17
+ }
18
+ const text = line.translateToString(true);
19
+ const links = [];
20
+ let match;
21
+ this.imageRegex.lastIndex = 0;
22
+ for (;;) {
23
+ const match = this.imageRegex.exec(text);
24
+ if (match === null)
25
+ break;
26
+ const startX = match.index + 1;
27
+ const endX = startX + match[0].length;
28
+ const uri = match[0];
29
+ links.push({
30
+ range: { start: { x: startX, y: y + 1 }, end: { x: endX, y: y + 1 } },
31
+ text: uri,
32
+ activate: (e) => {
33
+ if (e.metaKey || e.ctrlKey) {
34
+ window.open(uri, "_blank");
35
+ }
36
+ },
37
+ hover: (e) => {
38
+ this.options.onHover?.(e, uri);
39
+ },
40
+ leave: (e) => {
41
+ this.options.onLeave?.(e);
42
+ },
43
+ });
44
+ }
45
+ callback(links);
46
+ },
47
+ });
48
+ }
49
+ }
50
+ dispose() {
51
+ this.terminal = undefined;
52
+ }
53
+ }
54
+ //# sourceMappingURL=ImagePreviewAddon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImagePreviewAddon.js","sourceRoot":"","sources":["../src/ImagePreviewAddon.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,iBAAiB;IACpB,QAAQ,CAAM;IACd,OAAO,CAAsB;IAC7B,UAAU,GAAG,gGAAgG,CAAC;IAEtH,YAAY,UAA+B,EAAE;QAC3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAEM,QAAQ,CAAC,QAAa;QAC3B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,QAAQ,CAAC,oBAAoB,EAAE,CAAC;YAClC,QAAQ,CAAC,oBAAoB,CAAC;gBAC5B,YAAY,EAAE,CAAC,CAAS,EAAE,QAA4C,EAAE,EAAE;oBACxE,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBAC/C,IAAI,CAAC,IAAI,EAAE,CAAC;wBACV,QAAQ,CAAC,SAAS,CAAC,CAAC;wBACpB,OAAO;oBACT,CAAC;oBACD,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;oBAC1C,MAAM,KAAK,GAAU,EAAE,CAAC;oBACxB,IAAI,KAA6B,CAAC;oBAClC,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,CAAC,CAAC;oBAE9B,SAAS,CAAC;wBACR,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBACzC,IAAI,KAAK,KAAK,IAAI;4BAAE,MAAM;wBAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;wBAC/B,MAAM,IAAI,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;wBACtC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;wBAErB,KAAK,CAAC,IAAI,CAAC;4BACT,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE;4BACrE,IAAI,EAAE,GAAG;4BACT,QAAQ,EAAE,CAAC,CAAa,EAAE,EAAE;gCAC1B,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;oCAC3B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gCAC7B,CAAC;4BACH,CAAC;4BACD,KAAK,EAAE,CAAC,CAAa,EAAE,EAAE;gCACvB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;4BACjC,CAAC;4BACD,KAAK,EAAE,CAAC,CAAa,EAAE,EAAE;gCACvB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;4BAC5B,CAAC;yBACF,CAAC,CAAC;oBACL,CAAC;oBAED,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAClB,CAAC;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEM,OAAO;QACZ,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC5B,CAAC;CACF"}
@@ -0,0 +1,30 @@
1
+ import type { IDisposable } from '@termaxjs/web-core';
2
+ import type { ITerminalAddon } from './xtermCompat.js';
3
+ export interface TerminalBlock {
4
+ id: string;
5
+ command?: string;
6
+ startTime: number;
7
+ endTime?: number;
8
+ durationMs?: number;
9
+ exitCode?: number;
10
+ status: "prompt" | "running" | "success" | "error";
11
+ startRow: number;
12
+ endRow?: number;
13
+ }
14
+ export type BlockListener = (block: TerminalBlock) => void;
15
+ export declare class Osc133Addon implements ITerminalAddon {
16
+ private terminal?;
17
+ private disposables;
18
+ private currentBlock;
19
+ private blocks;
20
+ private listeners;
21
+ activate(terminal: any): void;
22
+ handleOsc133(data: string): void;
23
+ private finishBlock;
24
+ getBlocks(): readonly TerminalBlock[];
25
+ getCurrentBlock(): TerminalBlock | null;
26
+ onBlockStart(cb: BlockListener): IDisposable;
27
+ onBlockEnd(cb: BlockListener): IDisposable;
28
+ dispose(): void;
29
+ }
30
+ //# sourceMappingURL=Osc133Addon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Osc133Addon.d.ts","sourceRoot":"","sources":["../src/Osc133Addon.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGvD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;AAE3D,qBAAa,WAAY,YAAW,cAAc;IAChD,OAAO,CAAC,QAAQ,CAAC,CAAM;IACvB,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAQf;IAEK,QAAQ,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI;IAS7B,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAkCvC,OAAO,CAAC,WAAW;IAiBZ,SAAS,IAAI,SAAS,aAAa,EAAE;IAIrC,eAAe,IAAI,aAAa,GAAG,IAAI;IAIvC,YAAY,CAAC,EAAE,EAAE,aAAa,GAAG,WAAW;IAS5C,UAAU,CAAC,EAAE,EAAE,aAAa,GAAG,WAAW;IAS1C,OAAO,IAAI,IAAI;CAMvB"}
@@ -0,0 +1,96 @@
1
+ export class Osc133Addon {
2
+ terminal;
3
+ disposables = [];
4
+ currentBlock = null;
5
+ blocks = [];
6
+ listeners = {
7
+ onBlockStart: [],
8
+ onBlockEnd: [],
9
+ onBlockChange: [],
10
+ };
11
+ activate(terminal) {
12
+ this.terminal = terminal;
13
+ const disposable = terminal.parser.registerOscHandler(133, (data) => {
14
+ this.handleOsc133(data);
15
+ return true;
16
+ });
17
+ this.disposables.push(disposable);
18
+ }
19
+ handleOsc133(data) {
20
+ const parts = data.split(";");
21
+ const action = parts[0];
22
+ const now = Date.now();
23
+ const cursorY = this.terminal?.buffer.active.cursorY ?? 0;
24
+ switch (action) {
25
+ case "A":
26
+ if (this.currentBlock && this.currentBlock.status === "running") {
27
+ this.finishBlock(0);
28
+ }
29
+ break;
30
+ case "B":
31
+ break;
32
+ case "C":
33
+ this.currentBlock = {
34
+ id: `block_${now}_${Math.random().toString(36).slice(2, 7)}`,
35
+ startTime: now,
36
+ status: "running",
37
+ startRow: cursorY,
38
+ };
39
+ for (const l of this.listeners.onBlockStart)
40
+ l(this.currentBlock);
41
+ break;
42
+ case "D": {
43
+ const exitCode = parts[1] !== undefined ? parseInt(parts[1], 10) : 0;
44
+ this.finishBlock(Number.isNaN(exitCode) ? 0 : exitCode);
45
+ break;
46
+ }
47
+ }
48
+ }
49
+ finishBlock(exitCode) {
50
+ if (!this.currentBlock)
51
+ return;
52
+ const now = Date.now();
53
+ const cursorY = this.terminal?.buffer.active.cursorY ?? 0;
54
+ this.currentBlock.endTime = now;
55
+ this.currentBlock.durationMs = now - this.currentBlock.startTime;
56
+ this.currentBlock.exitCode = exitCode;
57
+ this.currentBlock.status = exitCode === 0 ? "success" : "error";
58
+ this.currentBlock.endRow = cursorY;
59
+ this.blocks.push(this.currentBlock);
60
+ for (const l of this.listeners.onBlockEnd)
61
+ l(this.currentBlock);
62
+ for (const l of this.listeners.onBlockChange)
63
+ l(this.currentBlock);
64
+ this.currentBlock = null;
65
+ }
66
+ getBlocks() {
67
+ return this.blocks;
68
+ }
69
+ getCurrentBlock() {
70
+ return this.currentBlock;
71
+ }
72
+ onBlockStart(cb) {
73
+ this.listeners.onBlockStart.push(cb);
74
+ return {
75
+ dispose: () => {
76
+ this.listeners.onBlockStart = this.listeners.onBlockStart.filter((l) => l !== cb);
77
+ },
78
+ };
79
+ }
80
+ onBlockEnd(cb) {
81
+ this.listeners.onBlockEnd.push(cb);
82
+ return {
83
+ dispose: () => {
84
+ this.listeners.onBlockEnd = this.listeners.onBlockEnd.filter((l) => l !== cb);
85
+ },
86
+ };
87
+ }
88
+ dispose() {
89
+ for (const d of this.disposables)
90
+ d.dispose();
91
+ this.disposables = [];
92
+ this.blocks = [];
93
+ this.currentBlock = null;
94
+ }
95
+ }
96
+ //# sourceMappingURL=Osc133Addon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Osc133Addon.js","sourceRoot":"","sources":["../src/Osc133Addon.ts"],"names":[],"mappings":"AAkBA,MAAM,OAAO,WAAW;IACd,QAAQ,CAAO;IACf,WAAW,GAAkB,EAAE,CAAC;IAChC,YAAY,GAAyB,IAAI,CAAC;IAC1C,MAAM,GAAoB,EAAE,CAAC;IAC7B,SAAS,GAIb;QACF,YAAY,EAAE,EAAE;QAChB,UAAU,EAAE,EAAE;QACd,aAAa,EAAE,EAAE;KAClB,CAAC;IAEK,QAAQ,CAAC,QAAa;QAC3B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,IAAY,EAAE,EAAE;YAC1E,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;IAEM,YAAY,CAAC,IAAY;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;QAE1D,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,GAAG;gBACN,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBAChE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;gBACtB,CAAC;gBACD,MAAM;YAER,KAAK,GAAG;gBACN,MAAM;YAER,KAAK,GAAG;gBACN,IAAI,CAAC,YAAY,GAAG;oBAClB,EAAE,EAAE,SAAS,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;oBAC5D,SAAS,EAAE,GAAG;oBACd,MAAM,EAAE,SAAS;oBACjB,QAAQ,EAAE,OAAO;iBAClB,CAAC;gBACF,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY;oBAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAClE,MAAM;YAER,KAAK,GAAG,CAAC,CAAC,CAAC;gBACT,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBACxD,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,QAAgB;QAClC,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAO;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;QAE1D,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,GAAG,CAAC;QAChC,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;QACjE,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACtC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;QAChE,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,OAAO,CAAC;QAEnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACpC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU;YAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAChE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa;YAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACnE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3B,CAAC;IAEM,SAAS;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAEM,eAAe;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAEM,YAAY,CAAC,EAAiB;QACnC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrC,OAAO;YACL,OAAO,EAAE,GAAG,EAAE;gBACZ,IAAI,CAAC,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACpF,CAAC;SACF,CAAC;IACJ,CAAC;IAEM,UAAU,CAAC,EAAiB;QACjC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,OAAO;YACL,OAAO,EAAE,GAAG,EAAE;gBACZ,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAChF,CAAC;SACF,CAAC;IACJ,CAAC;IAEM,OAAO;QACZ,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW;YAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QAC9C,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ import type { ILink, ILinkProvider } from '@termaxjs/web-core';
2
+ export type TooltipCallbacks = {
3
+ hover?: (e: MouseEvent, text: string) => void;
4
+ leave?: () => void;
5
+ };
6
+ export declare class PathLinkProvider implements ILinkProvider {
7
+ private readonly terminal;
8
+ private readonly tooltip?;
9
+ private readonly onOpen?;
10
+ constructor(terminal: any, tooltip?: TooltipCallbacks | undefined, onOpen?: ((path: string, line?: number, col?: number) => void) | undefined);
11
+ provideLinks(bufferLineNumber: number, callback: (links: ILink[] | undefined) => void): void;
12
+ }
13
+ //# sourceMappingURL=PathLinkProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PathLinkProvider.d.ts","sourceRoot":"","sources":["../src/PathLinkProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAM/D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAEF,qBAAa,gBAAiB,YAAW,aAAa;IAElD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAFP,QAAQ,EAAE,GAAG,EACb,OAAO,CAAC,EAAE,gBAAgB,YAAA,EAC1B,MAAM,CAAC,GAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,IAAI,aAAA;IAGxE,YAAY,CACjB,gBAAgB,EAAE,MAAM,EACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,SAAS,KAAK,IAAI,GAC7C,IAAI;CA+FR"}
@@ -0,0 +1,103 @@
1
+ // terminal type from core
2
+ const PATH_REGEX = /(?:[a-zA-Z]:[\\/]|(?:\.\/|\.\.\/|\/)|[a-zA-Z0-9_.-]+[\\/])[a-zA-Z0-9_.-]+(?:[\\/][a-zA-Z0-9_.-]+)*(?::\d+(?::\d+)?)?/g;
3
+ export class PathLinkProvider {
4
+ terminal;
5
+ tooltip;
6
+ onOpen;
7
+ constructor(terminal, tooltip, onOpen) {
8
+ this.terminal = terminal;
9
+ this.tooltip = tooltip;
10
+ this.onOpen = onOpen;
11
+ }
12
+ provideLinks(bufferLineNumber, callback) {
13
+ const buffer = this.terminal.buffer.active;
14
+ const line = buffer.getLine(bufferLineNumber - 1);
15
+ if (!line) {
16
+ callback(undefined);
17
+ return;
18
+ }
19
+ const text = line.translateToString(true);
20
+ if (!text) {
21
+ callback(undefined);
22
+ return;
23
+ }
24
+ const links = [];
25
+ let match;
26
+ PATH_REGEX.lastIndex = 0;
27
+ for (;;) {
28
+ const match = PATH_REGEX.exec(text);
29
+ if (match === null)
30
+ break;
31
+ const matchText = match[0];
32
+ const startIndex = match.index;
33
+ if (matchText === "." || matchText === "/" || matchText === "./") {
34
+ continue;
35
+ }
36
+ let cellX = 0;
37
+ let stringIdx = 0;
38
+ for (let i = 0; i < line.length; i++) {
39
+ if (stringIdx === startIndex) {
40
+ cellX = i;
41
+ break;
42
+ }
43
+ const cell = line.getCell(i);
44
+ if (!cell)
45
+ break;
46
+ const chars = cell.getChars();
47
+ stringIdx += chars.length;
48
+ if (cell.getWidth() === 2)
49
+ i++;
50
+ }
51
+ const start = { x: cellX + 1, y: bufferLineNumber };
52
+ let endCellX = cellX;
53
+ for (let i = cellX; i < line.length; i++) {
54
+ if (stringIdx === startIndex + matchText.length) {
55
+ endCellX = i;
56
+ break;
57
+ }
58
+ const cell = line.getCell(i);
59
+ if (!cell)
60
+ break;
61
+ const chars = cell.getChars();
62
+ stringIdx += chars.length;
63
+ if (cell.getWidth() === 2)
64
+ i++;
65
+ }
66
+ const end = { x: endCellX, y: bufferLineNumber };
67
+ links.push({
68
+ text: matchText,
69
+ range: { start, end },
70
+ activate: (e, text) => {
71
+ if (!e.metaKey && !e.ctrlKey)
72
+ return;
73
+ e.preventDefault();
74
+ let filePath = text;
75
+ let lineNum;
76
+ let colNum;
77
+ const parts = text.split(":");
78
+ if (parts.length >= 2) {
79
+ const possibleLine = parseInt(parts[parts.length - (parts.length === 3 ? 2 : 1)], 10);
80
+ if (!Number.isNaN(possibleLine)) {
81
+ lineNum = possibleLine;
82
+ if (parts.length === 3) {
83
+ const possibleCol = parseInt(parts[2], 10);
84
+ if (!Number.isNaN(possibleCol))
85
+ colNum = possibleCol;
86
+ }
87
+ filePath = parts.slice(0, parts.length - (parts.length === 3 ? 2 : 1)).join(":");
88
+ }
89
+ }
90
+ this.onOpen?.(filePath, lineNum, colNum);
91
+ },
92
+ hover: (e, text) => {
93
+ this.tooltip?.hover?.(e, text);
94
+ },
95
+ leave: () => {
96
+ this.tooltip?.leave?.();
97
+ },
98
+ });
99
+ }
100
+ callback(links);
101
+ }
102
+ }
103
+ //# sourceMappingURL=PathLinkProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PathLinkProvider.js","sourceRoot":"","sources":["../src/PathLinkProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { ITerminalAddon } from "@termaxjs/web-core";
2
+ export interface PromptMarker {
3
+ line: number;
4
+ type: "prompt" | "command" | "output";
5
+ exitCode?: number;
6
+ timestamp: number;
7
+ }
8
+ export declare class PromptMarkerAddon implements ITerminalAddon {
9
+ private terminal;
10
+ private markers;
11
+ activate(terminal: any): void;
12
+ getMarkers(): PromptMarker[];
13
+ jumpToPreviousPrompt(): void;
14
+ jumpToNextPrompt(): void;
15
+ dispose(): void;
16
+ }
17
+ //# sourceMappingURL=PromptMarkerAddon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptMarkerAddon.d.ts","sourceRoot":"","sources":["../src/PromptMarkerAddon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,iBAAkB,YAAW,cAAc;IACtD,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,OAAO,CAAsB;IAE9B,QAAQ,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI;IAuB7B,UAAU,IAAI,YAAY,EAAE;IAI5B,oBAAoB,IAAI,IAAI;IAa5B,gBAAgB,IAAI,IAAI;IAaxB,OAAO,IAAI,IAAI;CAIvB"}
@@ -0,0 +1,58 @@
1
+ export class PromptMarkerAddon {
2
+ terminal;
3
+ markers = [];
4
+ activate(terminal) {
5
+ this.terminal = terminal;
6
+ // Listen to OSC 133 prompt markers
7
+ if (terminal.parser?.registerOscHandler) {
8
+ terminal.parser.registerOscHandler(133, (data) => {
9
+ const line = terminal.buffer.active.cursorY + terminal.buffer.active.baseY;
10
+ const kind = data[0];
11
+ if (kind === "A") {
12
+ this.markers.push({ line, type: "prompt", timestamp: Date.now() });
13
+ }
14
+ else if (kind === "C") {
15
+ this.markers.push({ line, type: "command", timestamp: Date.now() });
16
+ }
17
+ else if (kind === "D") {
18
+ const semi = data.indexOf(";");
19
+ const exitCode = semi !== -1 ? parseInt(data.slice(semi + 1), 10) : 0;
20
+ this.markers.push({ line, type: "output", exitCode, timestamp: Date.now() });
21
+ }
22
+ return false;
23
+ });
24
+ }
25
+ }
26
+ getMarkers() {
27
+ return [...this.markers];
28
+ }
29
+ jumpToPreviousPrompt() {
30
+ if (!this.terminal || this.markers.length === 0)
31
+ return;
32
+ const currentY = this.terminal.buffer.active.viewportY;
33
+ const promptMarkers = this.markers.filter((m) => m.type === "prompt");
34
+ for (let i = promptMarkers.length - 1; i >= 0; i--) {
35
+ if (promptMarkers[i].line < currentY) {
36
+ this.terminal.scrollToLine(promptMarkers[i].line);
37
+ return;
38
+ }
39
+ }
40
+ }
41
+ jumpToNextPrompt() {
42
+ if (!this.terminal || this.markers.length === 0)
43
+ return;
44
+ const currentY = this.terminal.buffer.active.viewportY;
45
+ const promptMarkers = this.markers.filter((m) => m.type === "prompt");
46
+ for (let i = 0; i < promptMarkers.length; i++) {
47
+ if (promptMarkers[i].line > currentY) {
48
+ this.terminal.scrollToLine(promptMarkers[i].line);
49
+ return;
50
+ }
51
+ }
52
+ }
53
+ dispose() {
54
+ this.terminal = undefined;
55
+ this.markers = [];
56
+ }
57
+ }
58
+ //# sourceMappingURL=PromptMarkerAddon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptMarkerAddon.js","sourceRoot":"","sources":["../src/PromptMarkerAddon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { ITerminalAddon } from "@termaxjs/web-core";
2
+ export declare class SessionReplayAddon implements ITerminalAddon {
3
+ private terminal;
4
+ private header?;
5
+ private events;
6
+ private isPlaying;
7
+ private currentIndex;
8
+ private playbackSpeed;
9
+ private timerId;
10
+ activate(terminal: any): void;
11
+ loadCast(castJsonLines: string): boolean;
12
+ play(): void;
13
+ pause(): void;
14
+ setSpeed(speed: number): void;
15
+ private step;
16
+ dispose(): void;
17
+ }
18
+ //# sourceMappingURL=SessionReplayAddon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionReplayAddon.d.ts","sourceRoot":"","sources":["../src/SessionReplayAddon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIpD,qBAAa,kBAAmB,YAAW,cAAc;IACvD,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,MAAM,CAAC,CAAa;IAC5B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,OAAO,CAAa;IAErB,QAAQ,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI;IAI7B,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO;IAmBxC,IAAI,IAAI,IAAI;IAMZ,KAAK,IAAI,IAAI;IAQb,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIpC,OAAO,CAAC,IAAI;IAuBL,OAAO,IAAI,IAAI;CAKvB"}