@pstdio/ui 0.24.2 → 0.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -1
- package/dist/{MermaidComponent-DSvPk-J8.js → MermaidComponent-X__B6qib.js} +3 -3
- package/dist/{MermaidComponent-DSvPk-J8.js.map → MermaidComponent-X__B6qib.js.map} +1 -1
- package/dist/activity-timeline-BynMjXSB.js +283 -0
- package/dist/activity-timeline-BynMjXSB.js.map +1 -0
- package/dist/alert-ubcrW24X.js +33 -0
- package/dist/alert-ubcrW24X.js.map +1 -0
- package/dist/browser-storage-BinyFNJX.js +40 -0
- package/dist/browser-storage-BinyFNJX.js.map +1 -0
- package/dist/chat-ui.js +1515 -1428
- package/dist/chat-ui.js.map +1 -1
- package/dist/components/activity/activity-comment.d.ts +10 -2
- package/dist/components/chat-ui/components/chat-history-story.d.ts +14 -0
- package/dist/components/chat-ui/components/chat-input-history.d.ts +6 -0
- package/dist/components/chat-ui/components/chat-input.d.ts +2 -0
- package/dist/components/chat-ui/components/chat-panel-composer.d.ts +49 -0
- package/dist/components/chat-ui/components/use-chat-input-history.d.ts +16 -0
- package/dist/components/diff-viewer/code-editor.d.ts +2 -0
- package/dist/components/rich-text/index.d.ts +2 -0
- package/dist/components/rich-text/markdown-editor/markdown-editor-scrolling.play.d.ts +4 -0
- package/dist/components/rich-text/prompt-input/plugins/KeyboardShortcutPlugin.d.ts +3 -1
- package/dist/components/rich-text/prompt-input/plugins/keyboard-shortcuts.d.ts +2 -0
- package/dist/components/rich-text/prompt-input/prompt-input.d.ts +2 -0
- package/dist/components/rich-text/resource-activity-feed/resource-activity-feed.d.ts +58 -0
- package/dist/components/rich-text/shared/plugins/FloatingTextFormatToolbarPlugin/should-show-floating-toolbar.d.ts +1 -0
- package/dist/data-table.js +6 -6
- package/dist/diff.js +524 -522
- package/dist/diff.js.map +1 -1
- package/dist/{edit-mode-data-table-2E4GSOou.js → edit-mode-data-table-Nfmfi7bz.js} +23 -22
- package/dist/{edit-mode-data-table-2E4GSOou.js.map → edit-mode-data-table-Nfmfi7bz.js.map} +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +1619 -1852
- package/dist/index.js.map +1 -1
- package/dist/{kanban-renderer-toolbar-Dcbxujbk.js → kanban-renderer-toolbar-Buek4icz.js} +34 -33
- package/dist/{kanban-renderer-toolbar-Dcbxujbk.js.map → kanban-renderer-toolbar-Buek4icz.js.map} +1 -1
- package/dist/kanban-renderer.js +31 -30
- package/dist/kanban-renderer.js.map +1 -1
- package/dist/lazy-markdown-editor-PzIBc9-l.js +42 -0
- package/dist/lazy-markdown-editor-PzIBc9-l.js.map +1 -0
- package/dist/{list-row-BDoV_iMV.js → list-row-DHzRa9-O.js} +2 -2
- package/dist/{list-row-BDoV_iMV.js.map → list-row-DHzRa9-O.js.map} +1 -1
- package/dist/{markdown-Cli3KGu9.js → markdown-BCfPxNpb.js} +322 -302
- package/dist/markdown-BCfPxNpb.js.map +1 -0
- package/dist/markdown-editor-CsJ4KNGu.js +1034 -0
- package/dist/markdown-editor-CsJ4KNGu.js.map +1 -0
- package/dist/{mermaid-renderer-CVnuKs-A.js → mermaid-renderer-D0YP0FmJ.js} +3 -3
- package/dist/{mermaid-renderer-CVnuKs-A.js.map → mermaid-renderer-D0YP0FmJ.js.map} +1 -1
- package/dist/mermaid.js +1 -1
- package/dist/{param-editor-CaRflJ3e.js → param-editor-CFM2Nf3l.js} +2 -2
- package/dist/{param-editor-CaRflJ3e.js.map → param-editor-CFM2Nf3l.js.map} +1 -1
- package/dist/param-editor-field-Bj-AGUY6.js +1728 -0
- package/dist/param-editor-field-Bj-AGUY6.js.map +1 -0
- package/dist/param-editor.d.ts +2 -0
- package/dist/param-editor.js +47 -0
- package/dist/param-editor.js.map +1 -0
- package/dist/prism-n5gcERyD.js +202 -0
- package/dist/prism-n5gcERyD.js.map +1 -0
- package/dist/radio-BfjibByI.js +51 -0
- package/dist/radio-BfjibByI.js.map +1 -0
- package/dist/rich-message-q6Y6QJOq.js +633 -0
- package/dist/rich-message-q6Y6QJOq.js.map +1 -0
- package/dist/rich-text.js +342 -177
- package/dist/rich-text.js.map +1 -1
- package/dist/scroll-area-BMbg1WcD.js +91 -0
- package/dist/scroll-area-BMbg1WcD.js.map +1 -0
- package/dist/slider-DBHjdxsU.js +1092 -0
- package/dist/slider-DBHjdxsU.js.map +1 -0
- package/dist/style.css +1 -1
- package/dist/terminal.js +96 -93
- package/dist/terminal.js.map +1 -1
- package/dist/theme/primitives/colors.d.ts +0 -23
- package/dist/theme/recipes/activity-comment.d.ts +36 -0
- package/dist/theme/recipes/alert.d.ts +1 -1
- package/dist/theme/recipes/dialog.d.ts +1 -1
- package/dist/theme/recipes/drawer.d.ts +1 -1
- package/dist/theme/recipes/menu.d.ts +1 -1
- package/dist/theme/recipes/popover.d.ts +1 -1
- package/dist/theme/recipes/progress-circle.d.ts +3 -3
- package/dist/theme/recipes/switch.d.ts +1 -1
- package/dist/theme/recipes/timeline.d.ts +10 -1
- package/dist/theme/recipes/tooltip.d.ts +1 -1
- package/dist/theme/recipes/window-title-bar.d.ts +1 -1
- package/dist/{theme-B5OVwYEU.js → theme-AzJH4Om3.js} +127 -808
- package/dist/theme-AzJH4Om3.js.map +1 -0
- package/dist/{theme-preference-Bpobguh4.js → theme-preference-DxGW1qg-.js} +2 -2
- package/dist/{theme-preference-Bpobguh4.js.map → theme-preference-DxGW1qg-.js.map} +1 -1
- package/dist/theme.js +1 -1
- package/dist/{tree-list-CZvcg3_6.js → tree-list-CPjbGTvs.js} +2 -2
- package/dist/{tree-list-CZvcg3_6.js.map → tree-list-CPjbGTvs.js.map} +1 -1
- package/dist/{workspace-badge-BR_GgsAG.js → workspace-badge-CuOcmnZc.js} +2 -2
- package/dist/{workspace-badge-BR_GgsAG.js.map → workspace-badge-CuOcmnZc.js.map} +1 -1
- package/package.json +7 -2
- package/dist/browser-storage-DPtOQJx0.js +0 -127
- package/dist/browser-storage-DPtOQJx0.js.map +0 -1
- package/dist/lazy-markdown-editor-DSlelhHV.js +0 -235
- package/dist/lazy-markdown-editor-DSlelhHV.js.map +0 -1
- package/dist/markdown-Cli3KGu9.js.map +0 -1
- package/dist/markdown-editor-BHoRATej.js +0 -1019
- package/dist/markdown-editor-BHoRATej.js.map +0 -1
- package/dist/param-editor-field-DVQlXbid.js +0 -2810
- package/dist/param-editor-field-DVQlXbid.js.map +0 -1
- package/dist/radio-cLMEBBZk.js +0 -76
- package/dist/radio-cLMEBBZk.js.map +0 -1
- package/dist/rich-message-gWYlm8Ji.js +0 -628
- package/dist/rich-message-gWYlm8Ji.js.map +0 -1
- package/dist/theme/recipes/landing-story.d.ts +0 -10
- package/dist/theme/recipes/landing-tool-demo.d.ts +0 -1
- package/dist/theme/recipes/landing.d.ts +0 -23
- package/dist/theme-B5OVwYEU.js.map +0 -1
package/dist/terminal.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { FitAddon as
|
|
3
|
-
import {
|
|
1
|
+
import { jsx as C } from "react/jsx-runtime";
|
|
2
|
+
import { FitAddon as j } from "@xterm/addon-fit";
|
|
3
|
+
import { WebLinksAddon as G } from "@xterm/addon-web-links";
|
|
4
|
+
import { Terminal as J } from "@xterm/xterm";
|
|
4
5
|
import "@xterm/xterm/css/xterm.css";
|
|
5
6
|
import { useState as q, useEffect as v, useRef as T } from "react";
|
|
6
|
-
import { c as
|
|
7
|
-
const
|
|
7
|
+
import { c as P } from "react/compiler-runtime";
|
|
8
|
+
const Y = (e, n, r = {}) => {
|
|
8
9
|
const o = [];
|
|
9
10
|
return o.push(n.onData((t) => e.write(t))), o.push(e.onInput((t) => {
|
|
10
11
|
n.write(t), r.onInput?.(t);
|
|
@@ -22,25 +23,25 @@ const G = (e, n, r = {}) => {
|
|
|
22
23
|
}
|
|
23
24
|
}
|
|
24
25
|
};
|
|
25
|
-
},
|
|
26
|
+
}, $ = new TextEncoder(), Z = (e) => typeof e == "string" ? $.encode(e) : e, Q = (e) => e > 0 ? new Promise((n) => setTimeout(n, e)) : Promise.resolve(), V = (e) => [{
|
|
26
27
|
data: e.replace(/\r/g, `\r
|
|
27
28
|
`)
|
|
28
|
-
}],
|
|
29
|
-
n.data !== void 0 && e.emitData(
|
|
29
|
+
}], X = (e, n) => {
|
|
30
|
+
n.data !== void 0 && e.emitData(Z(n.data)), n.error !== void 0 && e.emitError({
|
|
30
31
|
message: n.error
|
|
31
32
|
}), n.exit !== void 0 && e.emitExit({
|
|
32
33
|
code: n.exit.code,
|
|
33
34
|
signal: n.exit.signal ?? null
|
|
34
35
|
});
|
|
35
|
-
},
|
|
36
|
+
}, U = async (e, n) => {
|
|
36
37
|
for (const r of n) {
|
|
37
|
-
if (e.isExited() || (await
|
|
38
|
-
|
|
38
|
+
if (e.isExited() || (await Q(r.delayMs ?? 0), e.isExited())) return;
|
|
39
|
+
X(e, r);
|
|
39
40
|
}
|
|
40
|
-
},
|
|
41
|
+
}, ee = (e, n) => {
|
|
41
42
|
const r = /* @__PURE__ */ new Set(), o = /* @__PURE__ */ new Set(), t = /* @__PURE__ */ new Set();
|
|
42
|
-
let s = !1,
|
|
43
|
-
const
|
|
43
|
+
let s = !1, p = !1;
|
|
44
|
+
const c = {
|
|
44
45
|
isExited: () => s,
|
|
45
46
|
emitData(i) {
|
|
46
47
|
for (const a of r) a(i);
|
|
@@ -61,7 +62,7 @@ const G = (e, n, r = {}) => {
|
|
|
61
62
|
write(i) {
|
|
62
63
|
if (s) return;
|
|
63
64
|
const a = typeof i == "string" ? i : new TextDecoder().decode(i), d = n(a);
|
|
64
|
-
d &&
|
|
65
|
+
d && U(c, d);
|
|
65
66
|
},
|
|
66
67
|
resize(i, a) {
|
|
67
68
|
e.onResize?.({
|
|
@@ -70,13 +71,13 @@ const G = (e, n, r = {}) => {
|
|
|
70
71
|
});
|
|
71
72
|
},
|
|
72
73
|
kill(i) {
|
|
73
|
-
s || (e.onKill?.(i),
|
|
74
|
+
s || (e.onKill?.(i), c.emitExit({
|
|
74
75
|
code: null,
|
|
75
76
|
signal: i ?? null
|
|
76
77
|
}));
|
|
77
78
|
},
|
|
78
79
|
onData(i) {
|
|
79
|
-
return r.add(i), !
|
|
80
|
+
return r.add(i), !p && e.initial && (p = !0, U(c, e.initial)), () => r.delete(i);
|
|
80
81
|
},
|
|
81
82
|
onExit(i) {
|
|
82
83
|
return o.add(i), () => o.delete(i);
|
|
@@ -86,21 +87,21 @@ const G = (e, n, r = {}) => {
|
|
|
86
87
|
}
|
|
87
88
|
}
|
|
88
89
|
};
|
|
89
|
-
},
|
|
90
|
-
const n = e.onInput ??
|
|
90
|
+
}, Te = (e = {}) => {
|
|
91
|
+
const n = e.onInput ?? V;
|
|
91
92
|
return {
|
|
92
93
|
async openSession(r) {
|
|
93
94
|
const {
|
|
94
95
|
session: o
|
|
95
|
-
} =
|
|
96
|
+
} = ee(e, n);
|
|
96
97
|
return o;
|
|
97
98
|
}
|
|
98
99
|
};
|
|
99
|
-
},
|
|
100
|
+
}, K = {
|
|
100
101
|
cursorAccent: "#000000",
|
|
101
102
|
selectionForeground: void 0
|
|
102
|
-
},
|
|
103
|
-
...
|
|
103
|
+
}, ne = {
|
|
104
|
+
...K,
|
|
104
105
|
background: "#f4f4f5",
|
|
105
106
|
foreground: "#171717",
|
|
106
107
|
cursor: "#171717",
|
|
@@ -121,8 +122,8 @@ const G = (e, n, r = {}) => {
|
|
|
121
122
|
brightMagenta: "#d946ef",
|
|
122
123
|
brightCyan: "#06b6d4",
|
|
123
124
|
brightWhite: "#fafafa"
|
|
124
|
-
},
|
|
125
|
-
...
|
|
125
|
+
}, te = {
|
|
126
|
+
...K,
|
|
126
127
|
background: "#0a0a0a",
|
|
127
128
|
foreground: "#fafafa",
|
|
128
129
|
cursor: "#fafafa",
|
|
@@ -143,24 +144,24 @@ const G = (e, n, r = {}) => {
|
|
|
143
144
|
brightMagenta: "#f0abfc",
|
|
144
145
|
brightCyan: "#67e8f9",
|
|
145
146
|
brightWhite: "#fafafa"
|
|
146
|
-
},
|
|
147
|
-
light:
|
|
148
|
-
dark:
|
|
149
|
-
},
|
|
147
|
+
}, L = {
|
|
148
|
+
light: ne,
|
|
149
|
+
dark: te
|
|
150
|
+
}, re = (e) => e ? typeof e == "string" ? L[e] : e : L.dark, oe = (e) => JSON.stringify({
|
|
150
151
|
command: e.command,
|
|
151
152
|
cwd: e.cwd,
|
|
152
153
|
env: e.env ? Object.fromEntries(Object.entries(e.env).sort(([n], [r]) => n.localeCompare(r))) : void 0,
|
|
153
154
|
cols: e.cols,
|
|
154
155
|
rows: e.rows
|
|
155
|
-
}),
|
|
156
|
-
const n =
|
|
156
|
+
}), ie = (e) => JSON.parse(e), se = (e) => {
|
|
157
|
+
const n = P(8), {
|
|
157
158
|
bridge: r,
|
|
158
159
|
request: o,
|
|
159
160
|
killOnUnmount: t
|
|
160
161
|
} = e, s = t === void 0 ? !0 : t;
|
|
161
|
-
let
|
|
162
|
-
n[0] !== o ? (
|
|
163
|
-
const
|
|
162
|
+
let p;
|
|
163
|
+
n[0] !== o ? (p = oe(o), n[0] = o, n[1] = p) : p = n[1];
|
|
164
|
+
const c = p;
|
|
164
165
|
let S;
|
|
165
166
|
n[2] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (S = {
|
|
166
167
|
session: null,
|
|
@@ -170,7 +171,7 @@ const G = (e, n, r = {}) => {
|
|
|
170
171
|
}, n[2] = S) : S = n[2];
|
|
171
172
|
const [i, a] = q(S);
|
|
172
173
|
let d, x;
|
|
173
|
-
return n[3] !== r || n[4] !== s || n[5] !==
|
|
174
|
+
return n[3] !== r || n[4] !== s || n[5] !== c ? (d = () => {
|
|
174
175
|
if (!r) {
|
|
175
176
|
a({
|
|
176
177
|
session: null,
|
|
@@ -180,7 +181,7 @@ const G = (e, n, r = {}) => {
|
|
|
180
181
|
});
|
|
181
182
|
return;
|
|
182
183
|
}
|
|
183
|
-
let
|
|
184
|
+
let g = !1, w = null, h = "opening";
|
|
184
185
|
const f = [];
|
|
185
186
|
a({
|
|
186
187
|
session: null,
|
|
@@ -188,34 +189,34 @@ const G = (e, n, r = {}) => {
|
|
|
188
189
|
exit: null,
|
|
189
190
|
error: null
|
|
190
191
|
});
|
|
191
|
-
const
|
|
192
|
-
return r.openSession(
|
|
193
|
-
if (
|
|
194
|
-
s &&
|
|
192
|
+
const O = ie(c);
|
|
193
|
+
return r.openSession(O).then((l) => {
|
|
194
|
+
if (g) {
|
|
195
|
+
s && l.kill();
|
|
195
196
|
return;
|
|
196
197
|
}
|
|
197
|
-
|
|
198
|
+
w = l, f.push(l.onExit((b) => {
|
|
198
199
|
h = "exited", a((E) => ({
|
|
199
200
|
...E,
|
|
200
201
|
status: "exited",
|
|
201
202
|
exit: b
|
|
202
203
|
}));
|
|
203
|
-
}),
|
|
204
|
+
}), l.onError((b) => {
|
|
204
205
|
h = "error", a((E) => ({
|
|
205
206
|
...E,
|
|
206
207
|
status: "error",
|
|
207
208
|
error: b
|
|
208
209
|
}));
|
|
209
210
|
})), h = "open", a({
|
|
210
|
-
session:
|
|
211
|
+
session: l,
|
|
211
212
|
status: "open",
|
|
212
213
|
exit: null,
|
|
213
214
|
error: null
|
|
214
215
|
});
|
|
215
|
-
}).catch((
|
|
216
|
-
if (
|
|
216
|
+
}).catch((l) => {
|
|
217
|
+
if (g)
|
|
217
218
|
return;
|
|
218
|
-
const b =
|
|
219
|
+
const b = l instanceof Error ? l.message : String(l);
|
|
219
220
|
h = "error", a({
|
|
220
221
|
session: null,
|
|
221
222
|
status: "error",
|
|
@@ -225,16 +226,16 @@ const G = (e, n, r = {}) => {
|
|
|
225
226
|
}
|
|
226
227
|
});
|
|
227
228
|
}), () => {
|
|
228
|
-
for (
|
|
229
|
+
for (g = !0; f.length > 0; )
|
|
229
230
|
f.pop()?.();
|
|
230
|
-
s &&
|
|
231
|
+
s && w && h !== "exited" && w.kill();
|
|
231
232
|
};
|
|
232
|
-
}, x = [r,
|
|
233
|
-
},
|
|
233
|
+
}, x = [r, c, s], n[3] = r, n[4] = s, n[5] = c, n[6] = d, n[7] = x) : (d = n[6], x = n[7]), v(d, x), i;
|
|
234
|
+
}, ae = '"JetBrains Mono", "Fira Code", Menlo, Consolas, monospace', le = 13, M = 80, N = 24, ce = (e) => ({
|
|
234
235
|
...e,
|
|
235
236
|
cols: e?.cols ?? M,
|
|
236
237
|
rows: e?.rows ?? N
|
|
237
|
-
}),
|
|
238
|
+
}), ue = (e) => {
|
|
238
239
|
const n = /* @__PURE__ */ new Set(), r = [], o = e.onData((t) => {
|
|
239
240
|
if (n.size === 0) {
|
|
240
241
|
r.push(t);
|
|
@@ -258,75 +259,77 @@ const G = (e, n, r = {}) => {
|
|
|
258
259
|
o.dispose(), n.clear(), r.length = 0;
|
|
259
260
|
}
|
|
260
261
|
};
|
|
261
|
-
},
|
|
262
|
+
}, A = (e) => {
|
|
262
263
|
try {
|
|
263
264
|
e?.fit();
|
|
264
265
|
} catch {
|
|
265
266
|
}
|
|
266
|
-
},
|
|
267
|
+
}, de = (e, n) => {
|
|
267
268
|
n.resize(e.cols, e.rows);
|
|
268
|
-
},
|
|
269
|
-
const t =
|
|
269
|
+
}, fe = (e, n, r, o) => {
|
|
270
|
+
const t = Y(n, r, {
|
|
270
271
|
onExit: o.onSessionExit
|
|
271
272
|
});
|
|
272
|
-
return
|
|
273
|
-
},
|
|
273
|
+
return de(e, r), o.onSessionOpen?.(r.id), t;
|
|
274
|
+
}, me = (e, n, r, o) => fe(e, n, r, {
|
|
274
275
|
onSessionOpen: (t) => o.onSessionOpen.current?.(t),
|
|
275
276
|
onSessionExit: (t) => o.onSessionExit.current?.(t)
|
|
276
|
-
}),
|
|
277
|
+
}), Ee = (e) => {
|
|
277
278
|
const {
|
|
278
279
|
bridge: n,
|
|
279
280
|
request: r,
|
|
280
281
|
theme: o,
|
|
281
|
-
fontFamily: t =
|
|
282
|
-
fontSize: s =
|
|
283
|
-
killOnUnmount:
|
|
284
|
-
autoFocus:
|
|
282
|
+
fontFamily: t = ae,
|
|
283
|
+
fontSize: s = le,
|
|
284
|
+
killOnUnmount: p = !0,
|
|
285
|
+
autoFocus: c = !0,
|
|
285
286
|
className: S,
|
|
286
287
|
style: i,
|
|
287
288
|
onSessionOpen: a,
|
|
288
289
|
onSessionExit: d
|
|
289
|
-
} = e, x = T(null),
|
|
290
|
-
b.current = a, E.current = d,
|
|
291
|
-
const F =
|
|
290
|
+
} = e, x = T(null), g = T(null), w = T(null), h = T(null), [f, O] = q(!1), l = T(null), b = T(a), E = T(d);
|
|
291
|
+
b.current = a, E.current = d, l.current || (l.current = ce(r));
|
|
292
|
+
const F = re(o);
|
|
292
293
|
v(() => {
|
|
293
294
|
const u = x.current;
|
|
294
295
|
if (!u) return;
|
|
295
|
-
let
|
|
296
|
-
const
|
|
297
|
-
|
|
296
|
+
let m, y, k, _, D;
|
|
297
|
+
const W = window.requestAnimationFrame(() => {
|
|
298
|
+
m = new J({
|
|
298
299
|
cols: M,
|
|
299
300
|
rows: N,
|
|
300
301
|
cursorBlink: !0,
|
|
301
302
|
convertEol: !0,
|
|
302
303
|
allowProposedApi: !0
|
|
303
304
|
});
|
|
304
|
-
const I = new
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
305
|
+
const I = new j();
|
|
306
|
+
m.loadAddon(I), m.loadAddon(new G((B, H) => {
|
|
307
|
+
(B.ctrlKey || B.metaKey) && window.open(H, "_blank", "noopener,noreferrer");
|
|
308
|
+
})), m.open(u), y = ue(m), g.current = m, w.current = I, h.current = y;
|
|
309
|
+
const R = () => A(I);
|
|
310
|
+
R(), k = window.requestAnimationFrame(R), _ = window.setTimeout(R, 50), D = new ResizeObserver(R), D.observe(u), O(!0);
|
|
308
311
|
});
|
|
309
312
|
return () => {
|
|
310
|
-
window.cancelAnimationFrame(
|
|
313
|
+
window.cancelAnimationFrame(W), k !== void 0 && window.cancelAnimationFrame(k), _ !== void 0 && window.clearTimeout(_), D?.disconnect(), y?.dispose(), m?.dispose(), g.current = null, w.current = null, h.current = null;
|
|
311
314
|
};
|
|
312
315
|
}, []), v(() => {
|
|
313
316
|
if (!f) return;
|
|
314
|
-
const u =
|
|
315
|
-
u && (u.options.theme = F, u.options.fontFamily = t, u.options.fontSize = s,
|
|
317
|
+
const u = g.current;
|
|
318
|
+
u && (u.options.theme = F, u.options.fontFamily = t, u.options.fontSize = s, A(w.current));
|
|
316
319
|
}, [f, F, t, s]);
|
|
317
320
|
const {
|
|
318
321
|
session: z
|
|
319
|
-
} =
|
|
322
|
+
} = se({
|
|
320
323
|
bridge: n,
|
|
321
|
-
request:
|
|
322
|
-
killOnUnmount:
|
|
324
|
+
request: l.current,
|
|
325
|
+
killOnUnmount: p
|
|
323
326
|
});
|
|
324
327
|
return v(() => {
|
|
325
328
|
if (!f) return;
|
|
326
|
-
const u =
|
|
327
|
-
if (!u || !
|
|
328
|
-
|
|
329
|
-
const y = window.requestAnimationFrame(() =>
|
|
329
|
+
const u = g.current, m = h.current;
|
|
330
|
+
if (!u || !m || !z) return;
|
|
331
|
+
A(w.current);
|
|
332
|
+
const y = window.requestAnimationFrame(() => A(w.current)), k = me(u, m, z, {
|
|
330
333
|
onSessionOpen: b,
|
|
331
334
|
onSessionExit: E
|
|
332
335
|
});
|
|
@@ -334,26 +337,26 @@ const G = (e, n, r = {}) => {
|
|
|
334
337
|
window.cancelAnimationFrame(y), k();
|
|
335
338
|
};
|
|
336
339
|
}, [z, f]), v(() => {
|
|
337
|
-
f &&
|
|
338
|
-
}, [
|
|
340
|
+
f && c && g.current?.focus();
|
|
341
|
+
}, [c, f]), /* @__PURE__ */ C("div", { className: S, style: {
|
|
339
342
|
position: "relative",
|
|
340
343
|
width: "100%",
|
|
341
344
|
height: "100%",
|
|
342
345
|
backgroundColor: typeof F.background == "string" ? F.background : void 0,
|
|
343
346
|
...i
|
|
344
|
-
}, children: /* @__PURE__ */
|
|
347
|
+
}, children: /* @__PURE__ */ C("div", { ref: x, className: "pstdio-terminal", style: {
|
|
345
348
|
position: "absolute",
|
|
346
349
|
inset: 0
|
|
347
350
|
} }) });
|
|
348
351
|
};
|
|
349
352
|
export {
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
353
|
+
Ee as Terminal,
|
|
354
|
+
Y as bindSessionToSink,
|
|
355
|
+
Te as createScriptedTerminalBridge,
|
|
356
|
+
te as darkTerminalTheme,
|
|
357
|
+
ne as lightTerminalTheme,
|
|
358
|
+
re as resolveTerminalTheme,
|
|
359
|
+
L as terminalThemes,
|
|
360
|
+
se as useTerminalSession
|
|
358
361
|
};
|
|
359
362
|
//# sourceMappingURL=terminal.js.map
|
package/dist/terminal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.js","sources":["../src/components/terminal/bind-session.ts","../src/components/terminal/scripted-bridge.ts","../src/components/terminal/terminal-theme.ts","../src/components/terminal/use-terminal-session.ts","../src/components/terminal/terminal.tsx"],"sourcesContent":["import type { TerminalSessionAdapter } from \"./types\";\n\n/**\n * Minimal subset of xterm.js that the binding needs. Tests substitute a fake\n * sink so the wire-up logic can be exercised without a DOM.\n */\nexport interface TerminalSink {\n write(data: string | Uint8Array): void;\n onInput(handler: (data: string) => void): () => void;\n onResize(handler: (size: { cols: number; rows: number }) => void): () => void;\n}\n\nexport interface BindSessionOptions {\n /** Forwarded to the session when the user types in the sink. */\n onInput?: (data: string) => void;\n /** Called once the session exits; useful for surfacing status. */\n onExit?: (exit: { code: number | null; signal: string | null }) => void;\n /** Called on transport errors. */\n onError?: (error: { message: string }) => void;\n}\n\n/**\n * Wires a {@link TerminalSink} (typically xterm.js) to a\n * {@link TerminalSessionAdapter}. Returns a disposer that detaches every\n * subscription it created. The session itself is *not* killed — owning the\n * session lifecycle is the caller's responsibility.\n */\nexport const bindSessionToSink = (\n sink: TerminalSink,\n session: TerminalSessionAdapter,\n options: BindSessionOptions = {},\n) => {\n const disposers: Array<() => void> = [];\n\n disposers.push(session.onData((chunk) => sink.write(chunk)));\n\n disposers.push(\n sink.onInput((data) => {\n session.write(data);\n options.onInput?.(data);\n }),\n );\n\n disposers.push(\n sink.onResize(({ cols, rows }) => {\n session.resize(cols, rows);\n }),\n );\n\n if (options.onExit) disposers.push(session.onExit(options.onExit));\n if (options.onError) disposers.push(session.onError(options.onError));\n\n return () => {\n while (disposers.length > 0) {\n const dispose = disposers.pop();\n try {\n dispose?.();\n } catch {\n // Disposer errors during teardown are intentionally swallowed so a\n // partially-bound session still cleans up the remaining subscriptions.\n }\n }\n };\n};\n","import type { TerminalBridge, TerminalSessionAdapter, TerminalSessionError, TerminalSessionExit } from \"./types\";\n\nexport interface ScriptedTerminalStep {\n /** Bytes the host pushes back to the renderer (utf-8 string is encoded for you). */\n data?: string | Uint8Array;\n /** Milliseconds to wait before delivering this step. */\n delayMs?: number;\n /** Marks the session as exited after this step. */\n exit?: { code: number | null; signal?: string | null };\n /** Delivers a transport error after this step. */\n error?: string;\n}\n\nexport interface ScriptedBridgeOptions {\n /** Initial script delivered after the first data subscriber attaches. */\n initial?: ScriptedTerminalStep[];\n /**\n * Responds to user input. Return additional steps to play, or `undefined`\n * to ignore. Defaults to echoing the input followed by a newline.\n */\n onInput?: (input: string) => ScriptedTerminalStep[] | undefined;\n /** Called whenever the renderer requests a resize. */\n onResize?: (size: { cols: number; rows: number }) => void;\n /** Called once when the renderer kills the session. */\n onKill?: (signal?: string) => void;\n}\n\nconst encoder = new TextEncoder();\n\nconst toChunk = (data: string | Uint8Array) => (typeof data === \"string\" ? encoder.encode(data) : data);\n\nconst wait = (ms: number) => (ms > 0 ? new Promise<void>((resolve) => setTimeout(resolve, ms)) : Promise.resolve());\n\nconst defaultEcho = (input: string): ScriptedTerminalStep[] => [{ data: input.replace(/\\r/g, \"\\r\\n\") }];\n\ninterface SessionEmitter {\n isExited(): boolean;\n emitData(chunk: Uint8Array): void;\n emitExit(exit: TerminalSessionExit): void;\n emitError(error: TerminalSessionError): void;\n}\n\nconst runStep = (emitter: SessionEmitter, step: ScriptedTerminalStep) => {\n if (step.data !== undefined) emitter.emitData(toChunk(step.data));\n if (step.error !== undefined) emitter.emitError({ message: step.error });\n if (step.exit !== undefined) emitter.emitExit({ code: step.exit.code, signal: step.exit.signal ?? null });\n};\n\nconst playSteps = async (emitter: SessionEmitter, steps: ScriptedTerminalStep[]) => {\n for (const step of steps) {\n if (emitter.isExited()) return;\n await wait(step.delayMs ?? 0);\n if (emitter.isExited()) return;\n runStep(emitter, step);\n }\n};\n\nconst createScriptedSession = (\n options: ScriptedBridgeOptions,\n onInput: NonNullable<ScriptedBridgeOptions[\"onInput\"]>,\n) => {\n const dataHandlers = new Set<(chunk: Uint8Array) => void>();\n const exitHandlers = new Set<(exit: TerminalSessionExit) => void>();\n const errorHandlers = new Set<(error: TerminalSessionError) => void>();\n let exited = false;\n let startedInitial = false;\n\n const emitter: SessionEmitter = {\n isExited: () => exited,\n emitData(chunk) {\n for (const handler of dataHandlers) handler(chunk);\n },\n emitExit(exit) {\n if (exited) return;\n exited = true;\n for (const handler of exitHandlers) handler(exit);\n },\n emitError(error) {\n for (const handler of errorHandlers) handler(error);\n },\n };\n\n const session: TerminalSessionAdapter = {\n id: crypto.randomUUID(),\n write(data) {\n if (exited) return;\n const text = typeof data === \"string\" ? data : new TextDecoder().decode(data);\n const response = onInput(text);\n if (response) void playSteps(emitter, response);\n },\n resize(cols, rows) {\n options.onResize?.({ cols, rows });\n },\n kill(signal) {\n if (exited) return;\n options.onKill?.(signal);\n emitter.emitExit({ code: null, signal: signal ?? null });\n },\n onData(handler) {\n dataHandlers.add(handler);\n if (!startedInitial && options.initial) {\n startedInitial = true;\n void playSteps(emitter, options.initial);\n }\n return () => dataHandlers.delete(handler);\n },\n onExit(handler) {\n exitHandlers.add(handler);\n return () => exitHandlers.delete(handler);\n },\n onError(handler) {\n errorHandlers.add(handler);\n return () => errorHandlers.delete(handler);\n },\n };\n\n return { session };\n};\n\n/**\n * Deterministic in-memory bridge. Used by stories and tests to exercise the\n * terminal UI without a real PTY supervisor.\n */\nexport const createScriptedTerminalBridge = (options: ScriptedBridgeOptions = {}): TerminalBridge => {\n const onInput = options.onInput ?? defaultEcho;\n\n return {\n async openSession(_request) {\n const { session } = createScriptedSession(options, onInput);\n return session;\n },\n };\n};\n","import type { ITheme } from \"@xterm/xterm\";\n\n/**\n * xterm theme presets aligned with the workbench `bg.inverted` / `fg.inverted`\n * pairings so the terminal blends with the surrounding chrome without the\n * consuming extension touching xterm directly. Consumers can still pass any\n * `ITheme` they like via the `theme` prop.\n */\nexport type TerminalThemeName = \"light\" | \"dark\";\n\nconst baseTheme: Partial<ITheme> = {\n cursorAccent: \"#000000\",\n selectionForeground: undefined,\n};\n\nexport const lightTerminalTheme: ITheme = {\n ...baseTheme,\n background: \"#f4f4f5\",\n foreground: \"#171717\",\n cursor: \"#171717\",\n selectionBackground: \"#d4d4d8\",\n black: \"#27272a\",\n red: \"#dc2626\",\n green: \"#16a34a\",\n yellow: \"#ca8a04\",\n blue: \"#2563eb\",\n magenta: \"#c026d3\",\n cyan: \"#0891b2\",\n white: \"#e4e4e7\",\n brightBlack: \"#52525b\",\n brightRed: \"#ef4444\",\n brightGreen: \"#22c55e\",\n brightYellow: \"#eab308\",\n brightBlue: \"#3b82f6\",\n brightMagenta: \"#d946ef\",\n brightCyan: \"#06b6d4\",\n brightWhite: \"#fafafa\",\n};\n\nexport const darkTerminalTheme: ITheme = {\n ...baseTheme,\n background: \"#0a0a0a\",\n foreground: \"#fafafa\",\n cursor: \"#fafafa\",\n selectionBackground: \"#3f3f46\",\n black: \"#27272a\",\n red: \"#f87171\",\n green: \"#4ade80\",\n yellow: \"#facc15\",\n blue: \"#60a5fa\",\n magenta: \"#e879f9\",\n cyan: \"#22d3ee\",\n white: \"#e4e4e7\",\n brightBlack: \"#52525b\",\n brightRed: \"#fca5a5\",\n brightGreen: \"#86efac\",\n brightYellow: \"#fde047\",\n brightBlue: \"#93c5fd\",\n brightMagenta: \"#f0abfc\",\n brightCyan: \"#67e8f9\",\n brightWhite: \"#fafafa\",\n};\n\nexport const terminalThemes: Record<TerminalThemeName, ITheme> = {\n light: lightTerminalTheme,\n dark: darkTerminalTheme,\n};\n\nexport const resolveTerminalTheme = (theme: TerminalThemeName | ITheme | undefined) => {\n if (!theme) return terminalThemes.dark;\n if (typeof theme === \"string\") return terminalThemes[theme];\n return theme;\n};\n","import { useEffect, useState } from \"react\";\nimport type {\n TerminalBridge,\n TerminalSessionAdapter,\n TerminalSessionError,\n TerminalSessionExit,\n TerminalSessionRequest,\n} from \"./types\";\n\nexport type TerminalSessionStatus = \"idle\" | \"opening\" | \"open\" | \"exited\" | \"error\";\n\nexport interface UseTerminalSessionResult {\n session: TerminalSessionAdapter | null;\n status: TerminalSessionStatus;\n exit: TerminalSessionExit | null;\n error: TerminalSessionError | null;\n}\n\nexport interface UseTerminalSessionOptions {\n bridge: TerminalBridge | null;\n request: TerminalSessionRequest;\n /** Set to false to keep the session alive when the hook unmounts. */\n killOnUnmount?: boolean;\n}\n\nexport const createTerminalSessionRequestKey = (request: TerminalSessionRequest) =>\n JSON.stringify({\n command: request.command,\n cwd: request.cwd,\n env: request.env\n ? Object.fromEntries(Object.entries(request.env).sort(([left], [right]) => left.localeCompare(right)))\n : undefined,\n cols: request.cols,\n rows: request.rows,\n });\n\nconst readTerminalSessionRequestKey = (requestKey: string): TerminalSessionRequest => JSON.parse(requestKey);\n\n/**\n * Opens a terminal session via the provided bridge and surfaces its lifecycle\n * for the renderer. The session is killed on unmount unless explicitly opted\n * out; switching bridges or request contents triggers a fresh open.\n */\nexport const useTerminalSession = ({ bridge, request, killOnUnmount = true }: UseTerminalSessionOptions) => {\n const requestKey = createTerminalSessionRequestKey(request);\n const [state, setState] = useState<UseTerminalSessionResult>({\n session: null,\n status: \"idle\",\n exit: null,\n error: null,\n });\n\n useEffect(() => {\n if (!bridge) {\n setState({ session: null, status: \"idle\", exit: null, error: null });\n return;\n }\n\n let cancelled = false;\n let activeSession: TerminalSessionAdapter | null = null;\n let terminalState: TerminalSessionStatus = \"opening\";\n const disposers: Array<() => void> = [];\n\n setState({ session: null, status: \"opening\", exit: null, error: null });\n const requestSnapshot = readTerminalSessionRequestKey(requestKey);\n\n bridge\n .openSession(requestSnapshot)\n .then((session) => {\n if (cancelled) {\n if (killOnUnmount) void session.kill();\n return;\n }\n activeSession = session;\n disposers.push(\n session.onExit((exit) => {\n terminalState = \"exited\";\n setState((prev) => ({ ...prev, status: \"exited\", exit }));\n }),\n session.onError((error) => {\n terminalState = \"error\";\n setState((prev) => ({ ...prev, status: \"error\", error }));\n }),\n );\n terminalState = \"open\";\n setState({ session, status: \"open\", exit: null, error: null });\n })\n .catch((cause: unknown) => {\n if (cancelled) return;\n const message = cause instanceof Error ? cause.message : String(cause);\n terminalState = \"error\";\n setState({ session: null, status: \"error\", exit: null, error: { message } });\n });\n\n return () => {\n cancelled = true;\n while (disposers.length > 0) disposers.pop()?.();\n if (killOnUnmount && activeSession && terminalState !== \"exited\") void activeSession.kill();\n };\n }, [bridge, requestKey, killOnUnmount]);\n\n return state;\n};\n","import { FitAddon } from \"@xterm/addon-fit\";\nimport type { ITheme } from \"@xterm/xterm\";\nimport { Terminal as Xterm } from \"@xterm/xterm\";\nimport \"@xterm/xterm/css/xterm.css\";\nimport \"./terminal.css\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { bindSessionToSink, type TerminalSink } from \"./bind-session\";\nimport { resolveTerminalTheme, type TerminalThemeName } from \"./terminal-theme\";\nimport type { TerminalBridge, TerminalSessionAdapter, TerminalSessionRequest } from \"./types\";\nimport { useTerminalSession } from \"./use-terminal-session\";\n\nconst DEFAULT_FONT_FAMILY = '\"JetBrains Mono\", \"Fira Code\", Menlo, Consolas, monospace';\nconst DEFAULT_FONT_SIZE = 13;\nconst DEFAULT_COLS = 80;\nconst DEFAULT_ROWS = 24;\n\nexport const createInitialTerminalSessionRequest = (\n request?: Partial<TerminalSessionRequest>,\n): TerminalSessionRequest => ({\n ...request,\n cols: request?.cols ?? DEFAULT_COLS,\n rows: request?.rows ?? DEFAULT_ROWS,\n});\n\nexport const createTerminalSink = (xterm: Pick<Xterm, \"write\" | \"onData\" | \"onResize\">) => {\n const inputHandlers = new Set<(data: string) => void>();\n const pendingInput: string[] = [];\n const inputDisposable = xterm.onData((data) => {\n if (inputHandlers.size === 0) {\n pendingInput.push(data);\n return;\n }\n for (const handler of inputHandlers) handler(data);\n });\n\n return {\n write(data: string | Uint8Array) {\n xterm.write(data);\n },\n onInput(handler: (data: string) => void) {\n inputHandlers.add(handler);\n while (pendingInput.length > 0) handler(pendingInput.shift() as string);\n return () => inputHandlers.delete(handler);\n },\n onResize(handler: (size: { cols: number; rows: number }) => void) {\n const disposable = xterm.onResize(handler);\n return () => disposable.dispose();\n },\n dispose() {\n inputDisposable.dispose();\n inputHandlers.clear();\n pendingInput.length = 0;\n },\n } satisfies TerminalSink & { dispose(): void };\n};\n\nconst fitTerminal = (fit: FitAddon | null) => {\n try {\n fit?.fit();\n } catch {\n // fit() throws if the container has zero size (e.g. hidden via CSS).\n }\n};\n\nexport const resizeSessionToTerminalGeometry = (\n terminal: Pick<Xterm, \"cols\" | \"rows\">,\n session: Pick<TerminalSessionAdapter, \"resize\">,\n) => {\n session.resize(terminal.cols, terminal.rows);\n};\n\nexport const bindTerminalSession = (\n terminal: Pick<Xterm, \"cols\" | \"rows\">,\n sink: TerminalSink,\n session: TerminalSessionAdapter,\n options: Pick<TerminalProps, \"onSessionOpen\" | \"onSessionExit\">,\n) => {\n const unbind = bindSessionToSink(sink, session, {\n onExit: options.onSessionExit,\n });\n resizeSessionToTerminalGeometry(terminal, session);\n options.onSessionOpen?.(session.id);\n return unbind;\n};\n\nexport interface TerminalSessionCallbackRefs {\n onSessionOpen: React.RefObject<TerminalProps[\"onSessionOpen\"]>;\n onSessionExit: React.RefObject<TerminalProps[\"onSessionExit\"]>;\n}\n\nexport const bindTerminalSessionWithCallbackRefs = (\n terminal: Pick<Xterm, \"cols\" | \"rows\">,\n sink: TerminalSink,\n session: TerminalSessionAdapter,\n callbackRefs: TerminalSessionCallbackRefs,\n) =>\n bindTerminalSession(terminal, sink, session, {\n onSessionOpen: (sessionId) => callbackRefs.onSessionOpen.current?.(sessionId),\n onSessionExit: (exit) => callbackRefs.onSessionExit.current?.(exit),\n });\n\nexport interface TerminalProps {\n /** Bridge adapter the component opens its session through. */\n bridge: TerminalBridge;\n /**\n * Optional initial session request overrides. `cols`/`rows` default to\n * 80x24; container resizes are forwarded after the session opens.\n */\n request?: Partial<TerminalSessionRequest>;\n /** Theme preset name or full xterm theme. */\n theme?: TerminalThemeName | ITheme;\n /** Monospace font family. */\n fontFamily?: string;\n fontSize?: number;\n /** Whether to kill the session when the component unmounts. Defaults to true. */\n killOnUnmount?: boolean;\n /** Focus the terminal while it is the active surface. Defaults to true. */\n autoFocus?: boolean;\n /** Forwarded to the container element. */\n className?: string;\n style?: React.CSSProperties;\n /** Called once the session is open; useful for imperative refs. */\n onSessionOpen?: (sessionId: string) => void;\n /** Called once the session exits. */\n onSessionExit?: (exit: { code: number | null; signal: string | null }) => void;\n}\n\n/**\n * High-level terminal component. Mounts xterm.js inside a `<div>` and binds it\n * to the session opened from `bridge.openSession(...)`. Resize is driven by\n * `ResizeObserver` so the terminal fills its container and the host PTY\n * geometry stays in sync.\n */\nexport const Terminal = (props: TerminalProps) => {\n const {\n bridge,\n request,\n theme,\n fontFamily = DEFAULT_FONT_FAMILY,\n fontSize = DEFAULT_FONT_SIZE,\n killOnUnmount = true,\n autoFocus = true,\n className,\n style,\n onSessionOpen,\n onSessionExit,\n } = props;\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const xtermRef = useRef<Xterm | null>(null);\n const fitRef = useRef<FitAddon | null>(null);\n const sinkRef = useRef<ReturnType<typeof createTerminalSink> | null>(null);\n const [terminalReady, setTerminalReady] = useState(false);\n const initialSessionRequestRef = useRef<TerminalSessionRequest | null>(null);\n const onSessionOpenRef = useRef(onSessionOpen);\n const onSessionExitRef = useRef(onSessionExit);\n\n onSessionOpenRef.current = onSessionOpen;\n onSessionExitRef.current = onSessionExit;\n\n if (!initialSessionRequestRef.current) {\n initialSessionRequestRef.current = createInitialTerminalSessionRequest(request);\n }\n\n const resolvedTheme = resolveTerminalTheme(theme);\n\n // Mount xterm once on the container. Theme, font, and size updates flow\n // through the dedicated options-sync effect below to avoid a full remount on\n // every prop change.\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n let xterm: Xterm | undefined;\n let sink: ReturnType<typeof createTerminalSink> | undefined;\n let measureAnimationFrame: number | undefined;\n let measureTimeout: number | undefined;\n let observer: ResizeObserver | undefined;\n\n // Deferring construction skips React Strict Mode's disposable probe mount.\n // xterm schedules internal viewport work during construction that otherwise\n // runs after the probe instance has already been disposed.\n const initializationFrame = window.requestAnimationFrame(() => {\n xterm = new Xterm({\n cols: DEFAULT_COLS,\n rows: DEFAULT_ROWS,\n cursorBlink: true,\n convertEol: true,\n allowProposedApi: true,\n });\n const fit = new FitAddon();\n xterm.loadAddon(fit);\n xterm.open(container);\n sink = createTerminalSink(xterm);\n\n xtermRef.current = xterm;\n fitRef.current = fit;\n sinkRef.current = sink;\n\n const measure = () => fitTerminal(fit);\n measure();\n measureAnimationFrame = window.requestAnimationFrame(measure);\n measureTimeout = window.setTimeout(measure, 50);\n observer = new ResizeObserver(measure);\n observer.observe(container);\n setTerminalReady(true);\n });\n\n return () => {\n window.cancelAnimationFrame(initializationFrame);\n if (measureAnimationFrame !== undefined) window.cancelAnimationFrame(measureAnimationFrame);\n if (measureTimeout !== undefined) window.clearTimeout(measureTimeout);\n observer?.disconnect();\n sink?.dispose();\n xterm?.dispose();\n xtermRef.current = null;\n fitRef.current = null;\n sinkRef.current = null;\n };\n }, []);\n\n useEffect(() => {\n if (!terminalReady) return;\n const xterm = xtermRef.current;\n if (!xterm) return;\n xterm.options.theme = resolvedTheme;\n xterm.options.fontFamily = fontFamily;\n xterm.options.fontSize = fontSize;\n fitTerminal(fitRef.current);\n }, [terminalReady, resolvedTheme, fontFamily, fontSize]);\n\n const { session } = useTerminalSession({ bridge, request: initialSessionRequestRef.current, killOnUnmount });\n\n useEffect(() => {\n if (!terminalReady) return;\n const xterm = xtermRef.current;\n const sink = sinkRef.current;\n if (!xterm || !sink || !session) return;\n fitTerminal(fitRef.current);\n const animationFrame = window.requestAnimationFrame(() => fitTerminal(fitRef.current));\n const unbind = bindTerminalSessionWithCallbackRefs(xterm, sink, session, {\n onSessionOpen: onSessionOpenRef,\n onSessionExit: onSessionExitRef,\n });\n return () => {\n window.cancelAnimationFrame(animationFrame);\n unbind();\n };\n }, [session, terminalReady]);\n\n useEffect(() => {\n if (terminalReady && autoFocus) xtermRef.current?.focus();\n }, [autoFocus, terminalReady]);\n\n // The mount element fills its box absolutely so xterm sizes to the panel\n // rather than growing it: inside a scrollable host, a self-sized terminal\n // would define its own height and never fit, leaving the host to scroll it.\n return (\n <div\n className={className}\n style={{\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n backgroundColor: typeof resolvedTheme.background === \"string\" ? resolvedTheme.background : undefined,\n ...style,\n }}\n >\n <div ref={containerRef} className=\"pstdio-terminal\" style={{ position: \"absolute\", inset: 0 }} />\n </div>\n );\n};\n"],"names":["bindSessionToSink","sink","session","options","disposers","push","onData","chunk","write","onInput","data","onResize","cols","rows","resize","onExit","onError","length","dispose","pop","encoder","TextEncoder","toChunk","encode","wait","ms","Promise","resolve","setTimeout","defaultEcho","input","replace","runStep","emitter","step","undefined","emitData","error","emitError","message","exit","emitExit","code","signal","playSteps","steps","isExited","delayMs","createScriptedSession","dataHandlers","Set","exitHandlers","errorHandlers","exited","startedInitial","handler","id","crypto","randomUUID","text","TextDecoder","decode","response","kill","onKill","add","initial","delete","createScriptedTerminalBridge","openSession","_request","baseTheme","cursorAccent","selectionForeground","lightTerminalTheme","background","foreground","cursor","selectionBackground","black","red","green","yellow","blue","magenta","cyan","white","brightBlack","brightRed","brightGreen","brightYellow","brightBlue","brightMagenta","brightCyan","brightWhite","darkTerminalTheme","terminalThemes","light","dark","resolveTerminalTheme","theme","createTerminalSessionRequestKey","request","JSON","stringify","command","cwd","env","Object","fromEntries","entries","sort","left","right","localeCompare","readTerminalSessionRequestKey","requestKey","parse","useTerminalSession","t0","$","_c","bridge","killOnUnmount","t1","t2","t3","Symbol","for","status","state","setState","useState","t4","t5","cancelled","activeSession","terminalState","requestSnapshot","then","prev","prev_0","catch","cause","Error","String","useEffect","DEFAULT_FONT_FAMILY","DEFAULT_FONT_SIZE","DEFAULT_COLS","DEFAULT_ROWS","createInitialTerminalSessionRequest","createTerminalSink","xterm","inputHandlers","pendingInput","inputDisposable","size","shift","disposable","clear","fitTerminal","fit","resizeSessionToTerminalGeometry","terminal","bindTerminalSession","unbind","onSessionExit","onSessionOpen","bindTerminalSessionWithCallbackRefs","callbackRefs","sessionId","current","Terminal","props","fontFamily","fontSize","autoFocus","className","style","containerRef","useRef","xtermRef","fitRef","sinkRef","terminalReady","setTerminalReady","initialSessionRequestRef","onSessionOpenRef","onSessionExitRef","resolvedTheme","container","measureAnimationFrame","measureTimeout","observer","initializationFrame","window","requestAnimationFrame","Xterm","cursorBlink","convertEol","allowProposedApi","FitAddon","loadAddon","open","measure","ResizeObserver","observe","cancelAnimationFrame","clearTimeout","disconnect","animationFrame","focus","jsx","position","width","height","backgroundColor","inset"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"terminal.js","sources":["../src/components/terminal/bind-session.ts","../src/components/terminal/scripted-bridge.ts","../src/components/terminal/terminal-theme.ts","../src/components/terminal/use-terminal-session.ts","../src/components/terminal/terminal.tsx"],"sourcesContent":["import type { TerminalSessionAdapter } from \"./types\";\n\n/**\n * Minimal subset of xterm.js that the binding needs. Tests substitute a fake\n * sink so the wire-up logic can be exercised without a DOM.\n */\nexport interface TerminalSink {\n write(data: string | Uint8Array): void;\n onInput(handler: (data: string) => void): () => void;\n onResize(handler: (size: { cols: number; rows: number }) => void): () => void;\n}\n\nexport interface BindSessionOptions {\n /** Forwarded to the session when the user types in the sink. */\n onInput?: (data: string) => void;\n /** Called once the session exits; useful for surfacing status. */\n onExit?: (exit: { code: number | null; signal: string | null }) => void;\n /** Called on transport errors. */\n onError?: (error: { message: string }) => void;\n}\n\n/**\n * Wires a {@link TerminalSink} (typically xterm.js) to a\n * {@link TerminalSessionAdapter}. Returns a disposer that detaches every\n * subscription it created. The session itself is *not* killed — owning the\n * session lifecycle is the caller's responsibility.\n */\nexport const bindSessionToSink = (\n sink: TerminalSink,\n session: TerminalSessionAdapter,\n options: BindSessionOptions = {},\n) => {\n const disposers: Array<() => void> = [];\n\n disposers.push(session.onData((chunk) => sink.write(chunk)));\n\n disposers.push(\n sink.onInput((data) => {\n session.write(data);\n options.onInput?.(data);\n }),\n );\n\n disposers.push(\n sink.onResize(({ cols, rows }) => {\n session.resize(cols, rows);\n }),\n );\n\n if (options.onExit) disposers.push(session.onExit(options.onExit));\n if (options.onError) disposers.push(session.onError(options.onError));\n\n return () => {\n while (disposers.length > 0) {\n const dispose = disposers.pop();\n try {\n dispose?.();\n } catch {\n // Disposer errors during teardown are intentionally swallowed so a\n // partially-bound session still cleans up the remaining subscriptions.\n }\n }\n };\n};\n","import type { TerminalBridge, TerminalSessionAdapter, TerminalSessionError, TerminalSessionExit } from \"./types\";\n\nexport interface ScriptedTerminalStep {\n /** Bytes the host pushes back to the renderer (utf-8 string is encoded for you). */\n data?: string | Uint8Array;\n /** Milliseconds to wait before delivering this step. */\n delayMs?: number;\n /** Marks the session as exited after this step. */\n exit?: { code: number | null; signal?: string | null };\n /** Delivers a transport error after this step. */\n error?: string;\n}\n\nexport interface ScriptedBridgeOptions {\n /** Initial script delivered after the first data subscriber attaches. */\n initial?: ScriptedTerminalStep[];\n /**\n * Responds to user input. Return additional steps to play, or `undefined`\n * to ignore. Defaults to echoing the input followed by a newline.\n */\n onInput?: (input: string) => ScriptedTerminalStep[] | undefined;\n /** Called whenever the renderer requests a resize. */\n onResize?: (size: { cols: number; rows: number }) => void;\n /** Called once when the renderer kills the session. */\n onKill?: (signal?: string) => void;\n}\n\nconst encoder = new TextEncoder();\n\nconst toChunk = (data: string | Uint8Array) => (typeof data === \"string\" ? encoder.encode(data) : data);\n\nconst wait = (ms: number) => (ms > 0 ? new Promise<void>((resolve) => setTimeout(resolve, ms)) : Promise.resolve());\n\nconst defaultEcho = (input: string): ScriptedTerminalStep[] => [{ data: input.replace(/\\r/g, \"\\r\\n\") }];\n\ninterface SessionEmitter {\n isExited(): boolean;\n emitData(chunk: Uint8Array): void;\n emitExit(exit: TerminalSessionExit): void;\n emitError(error: TerminalSessionError): void;\n}\n\nconst runStep = (emitter: SessionEmitter, step: ScriptedTerminalStep) => {\n if (step.data !== undefined) emitter.emitData(toChunk(step.data));\n if (step.error !== undefined) emitter.emitError({ message: step.error });\n if (step.exit !== undefined) emitter.emitExit({ code: step.exit.code, signal: step.exit.signal ?? null });\n};\n\nconst playSteps = async (emitter: SessionEmitter, steps: ScriptedTerminalStep[]) => {\n for (const step of steps) {\n if (emitter.isExited()) return;\n await wait(step.delayMs ?? 0);\n if (emitter.isExited()) return;\n runStep(emitter, step);\n }\n};\n\nconst createScriptedSession = (\n options: ScriptedBridgeOptions,\n onInput: NonNullable<ScriptedBridgeOptions[\"onInput\"]>,\n) => {\n const dataHandlers = new Set<(chunk: Uint8Array) => void>();\n const exitHandlers = new Set<(exit: TerminalSessionExit) => void>();\n const errorHandlers = new Set<(error: TerminalSessionError) => void>();\n let exited = false;\n let startedInitial = false;\n\n const emitter: SessionEmitter = {\n isExited: () => exited,\n emitData(chunk) {\n for (const handler of dataHandlers) handler(chunk);\n },\n emitExit(exit) {\n if (exited) return;\n exited = true;\n for (const handler of exitHandlers) handler(exit);\n },\n emitError(error) {\n for (const handler of errorHandlers) handler(error);\n },\n };\n\n const session: TerminalSessionAdapter = {\n id: crypto.randomUUID(),\n write(data) {\n if (exited) return;\n const text = typeof data === \"string\" ? data : new TextDecoder().decode(data);\n const response = onInput(text);\n if (response) void playSteps(emitter, response);\n },\n resize(cols, rows) {\n options.onResize?.({ cols, rows });\n },\n kill(signal) {\n if (exited) return;\n options.onKill?.(signal);\n emitter.emitExit({ code: null, signal: signal ?? null });\n },\n onData(handler) {\n dataHandlers.add(handler);\n if (!startedInitial && options.initial) {\n startedInitial = true;\n void playSteps(emitter, options.initial);\n }\n return () => dataHandlers.delete(handler);\n },\n onExit(handler) {\n exitHandlers.add(handler);\n return () => exitHandlers.delete(handler);\n },\n onError(handler) {\n errorHandlers.add(handler);\n return () => errorHandlers.delete(handler);\n },\n };\n\n return { session };\n};\n\n/**\n * Deterministic in-memory bridge. Used by stories and tests to exercise the\n * terminal UI without a real PTY supervisor.\n */\nexport const createScriptedTerminalBridge = (options: ScriptedBridgeOptions = {}): TerminalBridge => {\n const onInput = options.onInput ?? defaultEcho;\n\n return {\n async openSession(_request) {\n const { session } = createScriptedSession(options, onInput);\n return session;\n },\n };\n};\n","import type { ITheme } from \"@xterm/xterm\";\n\n/**\n * xterm theme presets aligned with the workbench `bg.inverted` / `fg.inverted`\n * pairings so the terminal blends with the surrounding chrome without the\n * consuming extension touching xterm directly. Consumers can still pass any\n * `ITheme` they like via the `theme` prop.\n */\nexport type TerminalThemeName = \"light\" | \"dark\";\n\nconst baseTheme: Partial<ITheme> = {\n cursorAccent: \"#000000\",\n selectionForeground: undefined,\n};\n\nexport const lightTerminalTheme: ITheme = {\n ...baseTheme,\n background: \"#f4f4f5\",\n foreground: \"#171717\",\n cursor: \"#171717\",\n selectionBackground: \"#d4d4d8\",\n black: \"#27272a\",\n red: \"#dc2626\",\n green: \"#16a34a\",\n yellow: \"#ca8a04\",\n blue: \"#2563eb\",\n magenta: \"#c026d3\",\n cyan: \"#0891b2\",\n white: \"#e4e4e7\",\n brightBlack: \"#52525b\",\n brightRed: \"#ef4444\",\n brightGreen: \"#22c55e\",\n brightYellow: \"#eab308\",\n brightBlue: \"#3b82f6\",\n brightMagenta: \"#d946ef\",\n brightCyan: \"#06b6d4\",\n brightWhite: \"#fafafa\",\n};\n\nexport const darkTerminalTheme: ITheme = {\n ...baseTheme,\n background: \"#0a0a0a\",\n foreground: \"#fafafa\",\n cursor: \"#fafafa\",\n selectionBackground: \"#3f3f46\",\n black: \"#27272a\",\n red: \"#f87171\",\n green: \"#4ade80\",\n yellow: \"#facc15\",\n blue: \"#60a5fa\",\n magenta: \"#e879f9\",\n cyan: \"#22d3ee\",\n white: \"#e4e4e7\",\n brightBlack: \"#52525b\",\n brightRed: \"#fca5a5\",\n brightGreen: \"#86efac\",\n brightYellow: \"#fde047\",\n brightBlue: \"#93c5fd\",\n brightMagenta: \"#f0abfc\",\n brightCyan: \"#67e8f9\",\n brightWhite: \"#fafafa\",\n};\n\nexport const terminalThemes: Record<TerminalThemeName, ITheme> = {\n light: lightTerminalTheme,\n dark: darkTerminalTheme,\n};\n\nexport const resolveTerminalTheme = (theme: TerminalThemeName | ITheme | undefined) => {\n if (!theme) return terminalThemes.dark;\n if (typeof theme === \"string\") return terminalThemes[theme];\n return theme;\n};\n","import { useEffect, useState } from \"react\";\nimport type {\n TerminalBridge,\n TerminalSessionAdapter,\n TerminalSessionError,\n TerminalSessionExit,\n TerminalSessionRequest,\n} from \"./types\";\n\nexport type TerminalSessionStatus = \"idle\" | \"opening\" | \"open\" | \"exited\" | \"error\";\n\nexport interface UseTerminalSessionResult {\n session: TerminalSessionAdapter | null;\n status: TerminalSessionStatus;\n exit: TerminalSessionExit | null;\n error: TerminalSessionError | null;\n}\n\nexport interface UseTerminalSessionOptions {\n bridge: TerminalBridge | null;\n request: TerminalSessionRequest;\n /** Set to false to keep the session alive when the hook unmounts. */\n killOnUnmount?: boolean;\n}\n\nexport const createTerminalSessionRequestKey = (request: TerminalSessionRequest) =>\n JSON.stringify({\n command: request.command,\n cwd: request.cwd,\n env: request.env\n ? Object.fromEntries(Object.entries(request.env).sort(([left], [right]) => left.localeCompare(right)))\n : undefined,\n cols: request.cols,\n rows: request.rows,\n });\n\nconst readTerminalSessionRequestKey = (requestKey: string): TerminalSessionRequest => JSON.parse(requestKey);\n\n/**\n * Opens a terminal session via the provided bridge and surfaces its lifecycle\n * for the renderer. The session is killed on unmount unless explicitly opted\n * out; switching bridges or request contents triggers a fresh open.\n */\nexport const useTerminalSession = ({ bridge, request, killOnUnmount = true }: UseTerminalSessionOptions) => {\n const requestKey = createTerminalSessionRequestKey(request);\n const [state, setState] = useState<UseTerminalSessionResult>({\n session: null,\n status: \"idle\",\n exit: null,\n error: null,\n });\n\n useEffect(() => {\n if (!bridge) {\n setState({ session: null, status: \"idle\", exit: null, error: null });\n return;\n }\n\n let cancelled = false;\n let activeSession: TerminalSessionAdapter | null = null;\n let terminalState: TerminalSessionStatus = \"opening\";\n const disposers: Array<() => void> = [];\n\n setState({ session: null, status: \"opening\", exit: null, error: null });\n const requestSnapshot = readTerminalSessionRequestKey(requestKey);\n\n bridge\n .openSession(requestSnapshot)\n .then((session) => {\n if (cancelled) {\n if (killOnUnmount) void session.kill();\n return;\n }\n activeSession = session;\n disposers.push(\n session.onExit((exit) => {\n terminalState = \"exited\";\n setState((prev) => ({ ...prev, status: \"exited\", exit }));\n }),\n session.onError((error) => {\n terminalState = \"error\";\n setState((prev) => ({ ...prev, status: \"error\", error }));\n }),\n );\n terminalState = \"open\";\n setState({ session, status: \"open\", exit: null, error: null });\n })\n .catch((cause: unknown) => {\n if (cancelled) return;\n const message = cause instanceof Error ? cause.message : String(cause);\n terminalState = \"error\";\n setState({ session: null, status: \"error\", exit: null, error: { message } });\n });\n\n return () => {\n cancelled = true;\n while (disposers.length > 0) disposers.pop()?.();\n if (killOnUnmount && activeSession && terminalState !== \"exited\") void activeSession.kill();\n };\n }, [bridge, requestKey, killOnUnmount]);\n\n return state;\n};\n","import { FitAddon } from \"@xterm/addon-fit\";\nimport { WebLinksAddon } from \"@xterm/addon-web-links\";\nimport type { ITheme } from \"@xterm/xterm\";\nimport { Terminal as Xterm } from \"@xterm/xterm\";\nimport \"@xterm/xterm/css/xterm.css\";\nimport \"./terminal.css\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { bindSessionToSink, type TerminalSink } from \"./bind-session\";\nimport { resolveTerminalTheme, type TerminalThemeName } from \"./terminal-theme\";\nimport type { TerminalBridge, TerminalSessionAdapter, TerminalSessionRequest } from \"./types\";\nimport { useTerminalSession } from \"./use-terminal-session\";\n\nconst DEFAULT_FONT_FAMILY = '\"JetBrains Mono\", \"Fira Code\", Menlo, Consolas, monospace';\nconst DEFAULT_FONT_SIZE = 13;\nconst DEFAULT_COLS = 80;\nconst DEFAULT_ROWS = 24;\n\nexport const createInitialTerminalSessionRequest = (\n request?: Partial<TerminalSessionRequest>,\n): TerminalSessionRequest => ({\n ...request,\n cols: request?.cols ?? DEFAULT_COLS,\n rows: request?.rows ?? DEFAULT_ROWS,\n});\n\nexport const createTerminalSink = (xterm: Pick<Xterm, \"write\" | \"onData\" | \"onResize\">) => {\n const inputHandlers = new Set<(data: string) => void>();\n const pendingInput: string[] = [];\n const inputDisposable = xterm.onData((data) => {\n if (inputHandlers.size === 0) {\n pendingInput.push(data);\n return;\n }\n for (const handler of inputHandlers) handler(data);\n });\n\n return {\n write(data: string | Uint8Array) {\n xterm.write(data);\n },\n onInput(handler: (data: string) => void) {\n inputHandlers.add(handler);\n while (pendingInput.length > 0) handler(pendingInput.shift() as string);\n return () => inputHandlers.delete(handler);\n },\n onResize(handler: (size: { cols: number; rows: number }) => void) {\n const disposable = xterm.onResize(handler);\n return () => disposable.dispose();\n },\n dispose() {\n inputDisposable.dispose();\n inputHandlers.clear();\n pendingInput.length = 0;\n },\n } satisfies TerminalSink & { dispose(): void };\n};\n\nconst fitTerminal = (fit: FitAddon | null) => {\n try {\n fit?.fit();\n } catch {\n // fit() throws if the container has zero size (e.g. hidden via CSS).\n }\n};\n\nexport const resizeSessionToTerminalGeometry = (\n terminal: Pick<Xterm, \"cols\" | \"rows\">,\n session: Pick<TerminalSessionAdapter, \"resize\">,\n) => {\n session.resize(terminal.cols, terminal.rows);\n};\n\nexport const bindTerminalSession = (\n terminal: Pick<Xterm, \"cols\" | \"rows\">,\n sink: TerminalSink,\n session: TerminalSessionAdapter,\n options: Pick<TerminalProps, \"onSessionOpen\" | \"onSessionExit\">,\n) => {\n const unbind = bindSessionToSink(sink, session, {\n onExit: options.onSessionExit,\n });\n resizeSessionToTerminalGeometry(terminal, session);\n options.onSessionOpen?.(session.id);\n return unbind;\n};\n\nexport interface TerminalSessionCallbackRefs {\n onSessionOpen: React.RefObject<TerminalProps[\"onSessionOpen\"]>;\n onSessionExit: React.RefObject<TerminalProps[\"onSessionExit\"]>;\n}\n\nexport const bindTerminalSessionWithCallbackRefs = (\n terminal: Pick<Xterm, \"cols\" | \"rows\">,\n sink: TerminalSink,\n session: TerminalSessionAdapter,\n callbackRefs: TerminalSessionCallbackRefs,\n) =>\n bindTerminalSession(terminal, sink, session, {\n onSessionOpen: (sessionId) => callbackRefs.onSessionOpen.current?.(sessionId),\n onSessionExit: (exit) => callbackRefs.onSessionExit.current?.(exit),\n });\n\nexport interface TerminalProps {\n /** Bridge adapter the component opens its session through. */\n bridge: TerminalBridge;\n /**\n * Optional initial session request overrides. `cols`/`rows` default to\n * 80x24; container resizes are forwarded after the session opens.\n */\n request?: Partial<TerminalSessionRequest>;\n /** Theme preset name or full xterm theme. */\n theme?: TerminalThemeName | ITheme;\n /** Monospace font family. */\n fontFamily?: string;\n fontSize?: number;\n /** Whether to kill the session when the component unmounts. Defaults to true. */\n killOnUnmount?: boolean;\n /** Focus the terminal while it is the active surface. Defaults to true. */\n autoFocus?: boolean;\n /** Forwarded to the container element. */\n className?: string;\n style?: React.CSSProperties;\n /** Called once the session is open; useful for imperative refs. */\n onSessionOpen?: (sessionId: string) => void;\n /** Called once the session exits. */\n onSessionExit?: (exit: { code: number | null; signal: string | null }) => void;\n}\n\n/**\n * High-level terminal component. Mounts xterm.js inside a `<div>` and binds it\n * to the session opened from `bridge.openSession(...)`. Resize is driven by\n * `ResizeObserver` so the terminal fills its container and the host PTY\n * geometry stays in sync.\n */\nexport const Terminal = (props: TerminalProps) => {\n const {\n bridge,\n request,\n theme,\n fontFamily = DEFAULT_FONT_FAMILY,\n fontSize = DEFAULT_FONT_SIZE,\n killOnUnmount = true,\n autoFocus = true,\n className,\n style,\n onSessionOpen,\n onSessionExit,\n } = props;\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const xtermRef = useRef<Xterm | null>(null);\n const fitRef = useRef<FitAddon | null>(null);\n const sinkRef = useRef<ReturnType<typeof createTerminalSink> | null>(null);\n const [terminalReady, setTerminalReady] = useState(false);\n const initialSessionRequestRef = useRef<TerminalSessionRequest | null>(null);\n const onSessionOpenRef = useRef(onSessionOpen);\n const onSessionExitRef = useRef(onSessionExit);\n\n onSessionOpenRef.current = onSessionOpen;\n onSessionExitRef.current = onSessionExit;\n\n if (!initialSessionRequestRef.current) {\n initialSessionRequestRef.current = createInitialTerminalSessionRequest(request);\n }\n\n const resolvedTheme = resolveTerminalTheme(theme);\n\n // Mount xterm once on the container. Theme, font, and size updates flow\n // through the dedicated options-sync effect below to avoid a full remount on\n // every prop change.\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n let xterm: Xterm | undefined;\n let sink: ReturnType<typeof createTerminalSink> | undefined;\n let measureAnimationFrame: number | undefined;\n let measureTimeout: number | undefined;\n let observer: ResizeObserver | undefined;\n\n // Deferring construction skips React Strict Mode's disposable probe mount.\n // xterm schedules internal viewport work during construction that otherwise\n // runs after the probe instance has already been disposed.\n const initializationFrame = window.requestAnimationFrame(() => {\n xterm = new Xterm({\n cols: DEFAULT_COLS,\n rows: DEFAULT_ROWS,\n cursorBlink: true,\n convertEol: true,\n allowProposedApi: true,\n });\n const fit = new FitAddon();\n xterm.loadAddon(fit);\n xterm.loadAddon(\n new WebLinksAddon((event, uri) => {\n if (event.ctrlKey || event.metaKey) window.open(uri, \"_blank\", \"noopener,noreferrer\");\n }),\n );\n xterm.open(container);\n sink = createTerminalSink(xterm);\n\n xtermRef.current = xterm;\n fitRef.current = fit;\n sinkRef.current = sink;\n\n const measure = () => fitTerminal(fit);\n measure();\n measureAnimationFrame = window.requestAnimationFrame(measure);\n measureTimeout = window.setTimeout(measure, 50);\n observer = new ResizeObserver(measure);\n observer.observe(container);\n setTerminalReady(true);\n });\n\n return () => {\n window.cancelAnimationFrame(initializationFrame);\n if (measureAnimationFrame !== undefined) window.cancelAnimationFrame(measureAnimationFrame);\n if (measureTimeout !== undefined) window.clearTimeout(measureTimeout);\n observer?.disconnect();\n sink?.dispose();\n xterm?.dispose();\n xtermRef.current = null;\n fitRef.current = null;\n sinkRef.current = null;\n };\n }, []);\n\n useEffect(() => {\n if (!terminalReady) return;\n const xterm = xtermRef.current;\n if (!xterm) return;\n xterm.options.theme = resolvedTheme;\n xterm.options.fontFamily = fontFamily;\n xterm.options.fontSize = fontSize;\n fitTerminal(fitRef.current);\n }, [terminalReady, resolvedTheme, fontFamily, fontSize]);\n\n const { session } = useTerminalSession({ bridge, request: initialSessionRequestRef.current, killOnUnmount });\n\n useEffect(() => {\n if (!terminalReady) return;\n const xterm = xtermRef.current;\n const sink = sinkRef.current;\n if (!xterm || !sink || !session) return;\n fitTerminal(fitRef.current);\n const animationFrame = window.requestAnimationFrame(() => fitTerminal(fitRef.current));\n const unbind = bindTerminalSessionWithCallbackRefs(xterm, sink, session, {\n onSessionOpen: onSessionOpenRef,\n onSessionExit: onSessionExitRef,\n });\n return () => {\n window.cancelAnimationFrame(animationFrame);\n unbind();\n };\n }, [session, terminalReady]);\n\n useEffect(() => {\n if (terminalReady && autoFocus) xtermRef.current?.focus();\n }, [autoFocus, terminalReady]);\n\n // The mount element fills its box absolutely so xterm sizes to the panel\n // rather than growing it: inside a scrollable host, a self-sized terminal\n // would define its own height and never fit, leaving the host to scroll it.\n return (\n <div\n className={className}\n style={{\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n backgroundColor: typeof resolvedTheme.background === \"string\" ? resolvedTheme.background : undefined,\n ...style,\n }}\n >\n <div ref={containerRef} className=\"pstdio-terminal\" style={{ position: \"absolute\", inset: 0 }} />\n </div>\n );\n};\n"],"names":["bindSessionToSink","sink","session","options","disposers","push","onData","chunk","write","onInput","data","onResize","cols","rows","resize","onExit","onError","length","dispose","pop","encoder","TextEncoder","toChunk","encode","wait","ms","Promise","resolve","setTimeout","defaultEcho","input","replace","runStep","emitter","step","undefined","emitData","error","emitError","message","exit","emitExit","code","signal","playSteps","steps","isExited","delayMs","createScriptedSession","dataHandlers","Set","exitHandlers","errorHandlers","exited","startedInitial","handler","id","crypto","randomUUID","text","TextDecoder","decode","response","kill","onKill","add","initial","delete","createScriptedTerminalBridge","openSession","_request","baseTheme","cursorAccent","selectionForeground","lightTerminalTheme","background","foreground","cursor","selectionBackground","black","red","green","yellow","blue","magenta","cyan","white","brightBlack","brightRed","brightGreen","brightYellow","brightBlue","brightMagenta","brightCyan","brightWhite","darkTerminalTheme","terminalThemes","light","dark","resolveTerminalTheme","theme","createTerminalSessionRequestKey","request","JSON","stringify","command","cwd","env","Object","fromEntries","entries","sort","left","right","localeCompare","readTerminalSessionRequestKey","requestKey","parse","useTerminalSession","t0","$","_c","bridge","killOnUnmount","t1","t2","t3","Symbol","for","status","state","setState","useState","t4","t5","cancelled","activeSession","terminalState","requestSnapshot","then","prev","prev_0","catch","cause","Error","String","useEffect","DEFAULT_FONT_FAMILY","DEFAULT_FONT_SIZE","DEFAULT_COLS","DEFAULT_ROWS","createInitialTerminalSessionRequest","createTerminalSink","xterm","inputHandlers","pendingInput","inputDisposable","size","shift","disposable","clear","fitTerminal","fit","resizeSessionToTerminalGeometry","terminal","bindTerminalSession","unbind","onSessionExit","onSessionOpen","bindTerminalSessionWithCallbackRefs","callbackRefs","sessionId","current","Terminal","props","fontFamily","fontSize","autoFocus","className","style","containerRef","useRef","xtermRef","fitRef","sinkRef","terminalReady","setTerminalReady","initialSessionRequestRef","onSessionOpenRef","onSessionExitRef","resolvedTheme","container","measureAnimationFrame","measureTimeout","observer","initializationFrame","window","requestAnimationFrame","Xterm","cursorBlink","convertEol","allowProposedApi","FitAddon","loadAddon","WebLinksAddon","event","uri","ctrlKey","metaKey","open","measure","ResizeObserver","observe","cancelAnimationFrame","clearTimeout","disconnect","animationFrame","focus","jsx","position","width","height","backgroundColor","inset"],"mappings":"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"}
|
|
@@ -544,29 +544,6 @@ export declare const colors: {
|
|
|
544
544
|
value: string;
|
|
545
545
|
};
|
|
546
546
|
};
|
|
547
|
-
illustration: {
|
|
548
|
-
desktop: {
|
|
549
|
-
value: string;
|
|
550
|
-
};
|
|
551
|
-
page: {
|
|
552
|
-
value: string;
|
|
553
|
-
};
|
|
554
|
-
command: {
|
|
555
|
-
value: string;
|
|
556
|
-
};
|
|
557
|
-
editor: {
|
|
558
|
-
value: string;
|
|
559
|
-
};
|
|
560
|
-
skill: {
|
|
561
|
-
value: string;
|
|
562
|
-
};
|
|
563
|
-
hook: {
|
|
564
|
-
value: string;
|
|
565
|
-
};
|
|
566
|
-
automation: {
|
|
567
|
-
value: string;
|
|
568
|
-
};
|
|
569
|
-
};
|
|
570
547
|
sand: {
|
|
571
548
|
DEFAULT: {
|
|
572
549
|
value: string;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export declare const activityCommentSlotRecipe: import('@chakra-ui/react').SlotRecipeDefinition<"content" | "body" | "root", {
|
|
2
|
+
tone: {
|
|
3
|
+
default: {
|
|
4
|
+
root: {
|
|
5
|
+
background: "bg";
|
|
6
|
+
borderColor: "border.subtle";
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
attention: {
|
|
10
|
+
root: {
|
|
11
|
+
background: "bg.warning";
|
|
12
|
+
borderColor: "border.warning";
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
size: {
|
|
17
|
+
comfortable: {
|
|
18
|
+
body: {
|
|
19
|
+
gap: "sm";
|
|
20
|
+
padding: "md";
|
|
21
|
+
};
|
|
22
|
+
content: {
|
|
23
|
+
textStyle: "label/S/regular";
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
compact: {
|
|
27
|
+
body: {
|
|
28
|
+
gap: "xs";
|
|
29
|
+
padding: "sm";
|
|
30
|
+
};
|
|
31
|
+
content: {
|
|
32
|
+
textStyle: "label/S/regular";
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const alertSlotRecipe: import('@chakra-ui/react').SlotRecipeDefinition<"content" | "title" | "root" | "
|
|
1
|
+
export declare const alertSlotRecipe: import('@chakra-ui/react').SlotRecipeDefinition<"content" | "title" | "root" | "description" | "indicator", import('@chakra-ui/react').SlotRecipeVariantRecord<"content" | "title" | "root" | "description" | "indicator">>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const dialogSlotRecipe: import('@chakra-ui/react').SlotRecipeDefinition<"content" | "body" | "footer" | "header" | "title" | "
|
|
1
|
+
export declare const dialogSlotRecipe: import('@chakra-ui/react').SlotRecipeDefinition<"content" | "body" | "footer" | "header" | "title" | "description" | "trigger" | "backdrop" | "positioner" | "closeTrigger", import('@chakra-ui/react').SlotRecipeVariantRecord<"content" | "body" | "footer" | "header" | "title" | "description" | "trigger" | "backdrop" | "positioner" | "closeTrigger">>;
|