@simon_he/vue-tui 1.1.6 → 1.1.7

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 (39) hide show
  1. package/README.md +1 -0
  2. package/dist/TAgentTerminalGraphic-B8-YZfuP.js +1198 -0
  3. package/dist/{TSelect-CMBOOFwK.js → TSelect-CCsjjCOr.js} +41 -12
  4. package/dist/{TTree-kk8ntrpg.js → TTree-3W5A2_EH.js} +4 -3
  5. package/dist/TVideo-D9AOiyq2.js +948 -0
  6. package/dist/agent.cjs +4926 -4364
  7. package/dist/agent.js +11 -9
  8. package/dist/{block-source-DByORvKG.js → block-source-BhvdZomx.js} +3 -3
  9. package/dist/cli.cjs +8 -8
  10. package/dist/cli.js +15 -5
  11. package/dist/core.js +2 -2
  12. package/dist/experimental/browser.cjs +3705 -0
  13. package/dist/experimental/browser.d.cts +3 -0
  14. package/dist/experimental/browser.d.ts +3 -0
  15. package/dist/experimental/browser.js +413 -0
  16. package/dist/experimental.cjs +1 -1
  17. package/dist/experimental.js +9 -947
  18. package/dist/{linkify-CL9wwnZN.js → frame-mailbox-DaTrfyaF.js} +2 -297
  19. package/dist/index.cjs +25 -8
  20. package/dist/index.js +6 -5
  21. package/dist/linkify-CklfA1vp.js +298 -0
  22. package/dist/markdown.cjs +4907 -4362
  23. package/dist/markdown.js +4 -4
  24. package/dist/{mermaid-CWy4wtCL.js → mermaid-D0ov4_A1.js} +3 -3
  25. package/dist/mermaid.cjs +1 -1
  26. package/dist/mermaid.js +4 -4
  27. package/dist/{path-suggest-Dndu4dTi.js → path-suggest-fPzRsgPv.js} +1 -1
  28. package/dist/renderer/terminal-graphics.d.ts +1 -1
  29. package/dist/{terminal-graphics-D6KErRBY.js → terminal-graphics-DpSL29OQ.js} +1 -1
  30. package/dist/{tlog-theme-DIrlCw6m.js → tlog-theme-BnILsD3n.js} +10 -1203
  31. package/dist/vue/browser/types.d.ts +52 -0
  32. package/dist/vue/components/TBrowser.d.ts +231 -0
  33. package/dist/vue.cjs +25 -8
  34. package/dist/vue.js +8 -7
  35. package/package.json +16 -2
  36. /package/dist/{TMermaidText-wLnMMvVS.js → TMermaidText-C1akgJPU.js} +0 -0
  37. /package/dist/{math-image-BZhmfUeu.js → math-image-CcUpBnW0.js} +0 -0
  38. /package/dist/{path-mnSgEpCm.js → path-BI9W15Zt.js} +0 -0
  39. /package/dist/{wheel-scroll-DASkEZr-.js → wheel-scroll-CQ22Hcyj.js} +0 -0
@@ -0,0 +1,52 @@
1
+ import type { TVideoFrame, TVideoFrameFormat } from "../video/types.js";
2
+ export type TBrowserModifiers = Readonly<{
3
+ ctrl: boolean;
4
+ shift: boolean;
5
+ alt: boolean;
6
+ meta: boolean;
7
+ }>;
8
+ export type TBrowserInputEvent = Readonly<{
9
+ type: "pointermove" | "pointerdown" | "pointerup";
10
+ x: number;
11
+ y: number;
12
+ button?: number;
13
+ buttons?: number;
14
+ modifiers: TBrowserModifiers;
15
+ }> | Readonly<{
16
+ type: "wheel";
17
+ x: number;
18
+ y: number;
19
+ deltaY: number;
20
+ modifiers: TBrowserModifiers;
21
+ }> | Readonly<{
22
+ type: "keydown" | "keyup";
23
+ key: string;
24
+ code: string;
25
+ repeat: boolean;
26
+ modifiers: TBrowserModifiers;
27
+ }> | Readonly<{
28
+ type: "text" | "paste";
29
+ text: string;
30
+ }>;
31
+ export type TBrowserSessionContext = Readonly<{
32
+ url: string;
33
+ signal: AbortSignal;
34
+ maxFps: number;
35
+ pixelWidth: number;
36
+ pixelHeight: number;
37
+ preferredFormat: TVideoFrameFormat;
38
+ onNavigate: (url: string) => void;
39
+ onTitleChange: (title: string) => void;
40
+ }>;
41
+ export type TBrowserSession = Readonly<{
42
+ frames: AsyncIterable<TVideoFrame>;
43
+ dispatch: (event: TBrowserInputEvent) => void | Promise<void>;
44
+ navigate?: (url: string) => void | Promise<void>;
45
+ back?: () => void | Promise<void>;
46
+ forward?: () => void | Promise<void>;
47
+ reload?: () => void | Promise<void>;
48
+ newPage?: () => void | Promise<void>;
49
+ closePage?: () => boolean | void | Promise<boolean | void>;
50
+ close: () => void | Promise<void>;
51
+ }>;
52
+ export type TBrowserSessionFactory = (context: TBrowserSessionContext) => TBrowserSession | Promise<TBrowserSession>;
@@ -0,0 +1,231 @@
1
+ import type { ExtractPublicPropTypes, PropType } from "vue";
2
+ import type { Style } from "../../core/types.js";
3
+ import type { TBrowserInputEvent, TBrowserSession, TBrowserSessionFactory } from "../browser/types.js";
4
+ import type { TVideoFrameEvent } from "../video/types.js";
5
+ export declare const tBrowserProps: {
6
+ readonly x: {
7
+ readonly type: NumberConstructor;
8
+ readonly required: true;
9
+ };
10
+ readonly y: {
11
+ readonly type: NumberConstructor;
12
+ readonly required: true;
13
+ };
14
+ readonly w: {
15
+ readonly type: NumberConstructor;
16
+ readonly required: true;
17
+ };
18
+ readonly h: {
19
+ readonly type: NumberConstructor;
20
+ readonly required: true;
21
+ };
22
+ readonly zIndex: {
23
+ readonly type: NumberConstructor;
24
+ readonly default: 0;
25
+ };
26
+ readonly url: {
27
+ readonly type: StringConstructor;
28
+ readonly required: true;
29
+ };
30
+ readonly sessionFactory: {
31
+ readonly type: PropType<TBrowserSessionFactory>;
32
+ readonly required: true;
33
+ };
34
+ readonly autoFocus: {
35
+ readonly type: BooleanConstructor;
36
+ readonly default: false;
37
+ };
38
+ readonly maxFps: {
39
+ readonly type: NumberConstructor;
40
+ readonly default: 60;
41
+ };
42
+ readonly pixelWidth: {
43
+ readonly type: NumberConstructor;
44
+ readonly default: undefined;
45
+ };
46
+ readonly pixelHeight: {
47
+ readonly type: NumberConstructor;
48
+ readonly default: undefined;
49
+ };
50
+ readonly fallback: {
51
+ readonly type: StringConstructor;
52
+ readonly default: "[browser requires terminal graphics]";
53
+ };
54
+ readonly style: {
55
+ readonly type: PropType<Style>;
56
+ readonly default: undefined;
57
+ };
58
+ readonly clear: {
59
+ readonly type: BooleanConstructor;
60
+ readonly default: true;
61
+ };
62
+ };
63
+ export type TBrowserProps = ExtractPublicPropTypes<typeof tBrowserProps>;
64
+ export declare const TBrowser: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
65
+ readonly x: {
66
+ readonly type: NumberConstructor;
67
+ readonly required: true;
68
+ };
69
+ readonly y: {
70
+ readonly type: NumberConstructor;
71
+ readonly required: true;
72
+ };
73
+ readonly w: {
74
+ readonly type: NumberConstructor;
75
+ readonly required: true;
76
+ };
77
+ readonly h: {
78
+ readonly type: NumberConstructor;
79
+ readonly required: true;
80
+ };
81
+ readonly zIndex: {
82
+ readonly type: NumberConstructor;
83
+ readonly default: 0;
84
+ };
85
+ readonly url: {
86
+ readonly type: StringConstructor;
87
+ readonly required: true;
88
+ };
89
+ readonly sessionFactory: {
90
+ readonly type: PropType<TBrowserSessionFactory>;
91
+ readonly required: true;
92
+ };
93
+ readonly autoFocus: {
94
+ readonly type: BooleanConstructor;
95
+ readonly default: false;
96
+ };
97
+ readonly maxFps: {
98
+ readonly type: NumberConstructor;
99
+ readonly default: 60;
100
+ };
101
+ readonly pixelWidth: {
102
+ readonly type: NumberConstructor;
103
+ readonly default: undefined;
104
+ };
105
+ readonly pixelHeight: {
106
+ readonly type: NumberConstructor;
107
+ readonly default: undefined;
108
+ };
109
+ readonly fallback: {
110
+ readonly type: StringConstructor;
111
+ readonly default: "[browser requires terminal graphics]";
112
+ };
113
+ readonly style: {
114
+ readonly type: PropType<Style>;
115
+ readonly default: undefined;
116
+ };
117
+ readonly clear: {
118
+ readonly type: BooleanConstructor;
119
+ readonly default: true;
120
+ };
121
+ }>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
122
+ [key: string]: any;
123
+ }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
124
+ ready: (_session: TBrowserSession) => true;
125
+ frame: (_event: TVideoFrameEvent) => true;
126
+ navigate: (_url: string) => true;
127
+ titleChange: (_title: string) => true;
128
+ requestAddress: () => true;
129
+ close: () => true;
130
+ error: (_error: unknown) => true;
131
+ }, string, (import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps), Readonly<import("vue").ExtractPropTypes<{
132
+ readonly x: {
133
+ readonly type: NumberConstructor;
134
+ readonly required: true;
135
+ };
136
+ readonly y: {
137
+ readonly type: NumberConstructor;
138
+ readonly required: true;
139
+ };
140
+ readonly w: {
141
+ readonly type: NumberConstructor;
142
+ readonly required: true;
143
+ };
144
+ readonly h: {
145
+ readonly type: NumberConstructor;
146
+ readonly required: true;
147
+ };
148
+ readonly zIndex: {
149
+ readonly type: NumberConstructor;
150
+ readonly default: 0;
151
+ };
152
+ readonly url: {
153
+ readonly type: StringConstructor;
154
+ readonly required: true;
155
+ };
156
+ readonly sessionFactory: {
157
+ readonly type: PropType<TBrowserSessionFactory>;
158
+ readonly required: true;
159
+ };
160
+ readonly autoFocus: {
161
+ readonly type: BooleanConstructor;
162
+ readonly default: false;
163
+ };
164
+ readonly maxFps: {
165
+ readonly type: NumberConstructor;
166
+ readonly default: 60;
167
+ };
168
+ readonly pixelWidth: {
169
+ readonly type: NumberConstructor;
170
+ readonly default: undefined;
171
+ };
172
+ readonly pixelHeight: {
173
+ readonly type: NumberConstructor;
174
+ readonly default: undefined;
175
+ };
176
+ readonly fallback: {
177
+ readonly type: StringConstructor;
178
+ readonly default: "[browser requires terminal graphics]";
179
+ };
180
+ readonly style: {
181
+ readonly type: PropType<Style>;
182
+ readonly default: undefined;
183
+ };
184
+ readonly clear: {
185
+ readonly type: BooleanConstructor;
186
+ readonly default: true;
187
+ };
188
+ }>> & Readonly<{
189
+ onClose?: (() => any) | undefined;
190
+ onError?: ((_error: unknown) => any) | undefined;
191
+ onFrame?: ((_event: Readonly<{
192
+ timestampMs: number;
193
+ pixelWidth: number;
194
+ pixelHeight: number;
195
+ droppedFrames: number;
196
+ durationMs?: number;
197
+ playbackRate?: import("../video/types.js").TVideoPlaybackRate;
198
+ }>) => any) | undefined;
199
+ onReady?: ((_session: Readonly<{
200
+ frames: AsyncIterable<import("../video/types.js").TVideoFrame>;
201
+ dispatch: (event: TBrowserInputEvent) => void | Promise<void>;
202
+ navigate?: (url: string) => void | Promise<void>;
203
+ back?: () => void | Promise<void>;
204
+ forward?: () => void | Promise<void>;
205
+ reload?: () => void | Promise<void>;
206
+ newPage?: () => void | Promise<void>;
207
+ closePage?: () => boolean | void | Promise<boolean | void>;
208
+ close: () => void | Promise<void>;
209
+ }>) => any) | undefined;
210
+ onNavigate?: ((_url: string) => any) | undefined;
211
+ onTitleChange?: ((_title: string) => any) | undefined;
212
+ onRequestAddress?: (() => any) | undefined;
213
+ }>, {
214
+ readonly style: Readonly<{
215
+ fg?: string;
216
+ bg?: string;
217
+ bold?: boolean;
218
+ dim?: boolean;
219
+ italic?: boolean;
220
+ underline?: boolean;
221
+ inverse?: boolean;
222
+ href?: string;
223
+ }>;
224
+ readonly zIndex: number;
225
+ readonly clear: boolean;
226
+ readonly fallback: string;
227
+ readonly autoFocus: boolean;
228
+ readonly maxFps: number;
229
+ readonly pixelWidth: number;
230
+ readonly pixelHeight: number;
231
+ }, {}>;
package/dist/vue.cjs CHANGED
@@ -4481,21 +4481,32 @@ var nextImeOwnerId = 0, nextPasteImageId = 0, TInput = (0, import_vue15.defineCo
4481
4481
  let hasValue = getValue().length > 0, hasMentions = (props.mentions?.length ?? 0) > 0, hasMultiline = (props.multilineTexts?.length ?? 0) > 0;
4482
4482
  !hasValue && !hasMentions && !hasMultiline || (anchor.value = null, hasMentions && emitMentions([]), hasMultiline && emit("update:multilineTexts", []), hasValue || cursor.value !== 0 ? (pushUndoSnapshot(""), applyEdit("", 0)) : (ensureCursorVisible(), syncImeAnchorNow(), scheduler.invalidate()));
4483
4483
  }
4484
- function deleteSelectionIfAny(value) {
4485
- let sel = selection.value;
4486
- if (!sel)
4484
+ function deleteRangeIfAny(value, start, end) {
4485
+ let from = clamp2(Math.min(start, end), 0, value.length), to = clamp2(Math.max(start, end), 0, value.length);
4486
+ if (to <= from)
4487
4487
  return { value, cursor: cursor.value, deleted: !1 };
4488
- let tokenStart = countMultilineTokens2(value, sel.start), tokenEnd = countMultilineTokens2(value, sel.end);
4488
+ let tokenStart = countMultilineTokens2(value, from), tokenEnd = countMultilineTokens2(value, to);
4489
4489
  if (tokenEnd > tokenStart) {
4490
4490
  let current = props.multilineTexts ?? [], nextMultiline = [...current.slice(0, tokenStart), ...current.slice(tokenEnd)];
4491
4491
  emit("update:multilineTexts", nextMultiline);
4492
4492
  }
4493
- let mentionStart = countMentionTokens3(value, sel.start), mentionEnd = countMentionTokens3(value, sel.end);
4493
+ let mentionStart = countMentionTokens3(value, from), mentionEnd = countMentionTokens3(value, to);
4494
4494
  if (mentionEnd > mentionStart) {
4495
4495
  let current = pendingMentions.value ?? props.mentions ?? [], nextMentions = [...current.slice(0, mentionStart), ...current.slice(mentionEnd)];
4496
4496
  emitMentions(nextMentions);
4497
4497
  }
4498
- return { value: value.slice(0, sel.start) + value.slice(sel.end), cursor: sel.start, deleted: !0 };
4498
+ return { value: value.slice(0, from) + value.slice(to), cursor: from, deleted: !0 };
4499
+ }
4500
+ function deleteSelectionIfAny(value) {
4501
+ let sel = selection.value;
4502
+ return sel ? deleteRangeIfAny(value, sel.start, sel.end) : { value, cursor: cursor.value, deleted: !1 };
4503
+ }
4504
+ function deleteToLineBoundary(value, direction) {
4505
+ let sel = selection.value;
4506
+ if (sel)
4507
+ return deleteRangeIfAny(value, sel.start, sel.end);
4508
+ let { line, lines } = indexToLineCellCol(value, cursor.value), target = direction === "start" ? lines[line].start : lines[line].end;
4509
+ return deleteRangeIfAny(value, cursor.value, target);
4499
4510
  }
4500
4511
  function insertText(rawText) {
4501
4512
  let text = rawText || "";
@@ -5051,7 +5062,13 @@ var nextImeOwnerId = 0, nextPasteImageId = 0, TInput = (0, import_vue15.defineCo
5051
5062
  }
5052
5063
  return;
5053
5064
  }
5054
- let clearWithDeleteOrBackspace = !!(!e.altKey && (e.ctrlKey && !e.metaKey || e.metaKey && !e.ctrlKey));
5065
+ let clearWithDeleteOrBackspace = !!(!e.altKey && e.ctrlKey && !e.metaKey);
5066
+ if (e.metaKey && !e.ctrlKey && !e.altKey && (e.key === "Backspace" || e.key === "Delete")) {
5067
+ e.preventDefault(), e.stopPropagation();
5068
+ let next = deleteToLineBoundary(value, e.key === "Backspace" ? "start" : "end");
5069
+ next.deleted && (pushUndoSnapshot(next.value), applyEdit(next.value, next.cursor));
5070
+ return;
5071
+ }
5055
5072
  if (e.key === "Delete" && clearWithDeleteOrBackspace) {
5056
5073
  e.preventDefault(), e.stopPropagation(), clearAll();
5057
5074
  return;
@@ -5509,7 +5526,7 @@ var nextImeOwnerId = 0, nextPasteImageId = 0, TInput = (0, import_vue15.defineCo
5509
5526
  }
5510
5527
  }
5511
5528
  })), (0, import_vue15.onBeforeUnmount)(() => {
5512
- stopBlink();
5529
+ stopBlink(), imeAnchor?.value?.ownerId === imeOwnerId && (imeAnchor.value = null);
5513
5530
  }), () => (0, import_vue15.h)("span", rootProps);
5514
5531
  }
5515
5532
  });
package/dist/vue.js CHANGED
@@ -3,19 +3,20 @@ import "./ansi-palette-BHF1rN7R.js";
3
3
  import "./hyperlink-clbb_ha_.js";
4
4
  import "./dom-renderer-BfwAEQMf.js";
5
5
  import { EventZIndexContextKey, LayoutContextKey, RenderStackKey, TInputPluginsContextKey, TPathPickerProviderContextKey, VisibilityContextKey, injectionKey, intersectRect, padEndByCells$1 as padEndByCells, repeatChar, sanitizeInlineText, sanitizeTextBlock, sliceByCells, sliceByCellsRange, spaces, textCellWidth$1 as textCellWidth, translateRect, useLayout, useRenderNode, useRenderStack, useTerminal, useTerminalNode, useVisibility, wrapByCells } from "./rect-JzWMJxxc.js";
6
- import { TText, TView, clamp, createTheme, fitCellText, linkifyTextSegments, mergeStyle, tuiDefaultTheme } from "./linkify-CL9wwnZN.js";
6
+ import { clamp, createTheme, fitCellText, linkifyTextSegments, mergeStyle, tuiDefaultTheme } from "./linkify-CklfA1vp.js";
7
7
  import "./runtime-Byf8XXOT.js";
8
8
  import "./frame-perf-CHpWhbC4.js";
9
9
  import "./trace-Bh8WnoMo.js";
10
10
  import "./env-Cl8qmNFN.js";
11
- import { TAutocompleteInput, TBadge, TCheckbox, TCode, TDataTable, TDivider, TForm, TFormContextKey, TFormField, TLink, TLinkifyText, TList, TPasswordInput, TProgress, TRadioGroup, TSlider, TSpinner, TSwitch, TTable, TTag, TToastViewport, TTree, TerminalProvider, createTInputHostPlugin, useTForm } from "./TTree-kk8ntrpg.js";
11
+ import { TAutocompleteInput, TBadge, TCheckbox, TCode, TDataTable, TDivider, TForm, TFormContextKey, TFormField, TLink, TLinkifyText, TList, TPasswordInput, TProgress, TRadioGroup, TSlider, TSpinner, TSwitch, TTable, TTag, TToastViewport, TTree, TerminalProvider, createTInputHostPlugin, useTForm } from "./TTree-3W5A2_EH.js";
12
12
  import "./terminal-selection-4W1SJj4c.js";
13
13
  import "./debug-logger-CmsGI4of.js";
14
- import { TBox, TCommandPalette, TDialog, TInput, TRenderPlane, TSelect, clamp$1, computeCommandPaletteMatchRanges, createOverlayFocusStack, isCommitMention, isWhitespace, mentionChipStyle, padEndByCells as padEndByCells$1, resolveOverlayPlacement, sliceByCellsWindow, textCellWidth as textCellWidth$1 } from "./TSelect-CMBOOFwK.js";
15
- import { normalizePath, stripTrailingSlash } from "./path-mnSgEpCm.js";
16
- import { applyWheelScroll, createWheelScrollState } from "./wheel-scroll-DASkEZr-.js";
17
- import { parsePathQuery, resolveUserPath, suggestPaths } from "./path-suggest-Dndu4dTi.js";
18
- import { TMermaid$1 as TMermaid, TMermaidText$1 as TMermaidText, isSimpleMermaidFlowchartSource, markMermaidRenderErrorFatal } from "./TMermaidText-wLnMMvVS.js";
14
+ import { TBox, TCommandPalette, TDialog, TInput, TRenderPlane, TSelect, clamp$1, computeCommandPaletteMatchRanges, createOverlayFocusStack, isCommitMention, isWhitespace, mentionChipStyle, padEndByCells as padEndByCells$1, resolveOverlayPlacement, sliceByCellsWindow, textCellWidth as textCellWidth$1 } from "./TSelect-CCsjjCOr.js";
15
+ import { TText, TView } from "./frame-mailbox-DaTrfyaF.js";
16
+ import { normalizePath, stripTrailingSlash } from "./path-BI9W15Zt.js";
17
+ import { applyWheelScroll, createWheelScrollState } from "./wheel-scroll-CQ22Hcyj.js";
18
+ import { parsePathQuery, resolveUserPath, suggestPaths } from "./path-suggest-fPzRsgPv.js";
19
+ import { TMermaid$1 as TMermaid, TMermaidText$1 as TMermaidText, isSimpleMermaidFlowchartSource, markMermaidRenderErrorFatal } from "./TMermaidText-C1akgJPU.js";
19
20
  import { Comment, Fragment, computed, defineComponent, h, inject, onBeforeUnmount, onMounted, onUnmounted, provide, reactive, ref, shallowReactive, shallowRef, watch, watchEffect } from "vue";
20
21
 
21
22
  //#region src/observability/cli-latency.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simon_he/vue-tui",
3
- "version": "1.1.6",
3
+ "version": "1.1.7",
4
4
  "description": "Vue 3 terminal UI components and renderers for browser DOM, CLI stdout, logs, markdown transcripts, and agent consoles",
5
5
  "keywords": [
6
6
  "agent-console",
@@ -85,6 +85,9 @@
85
85
  "experimental": [
86
86
  "./dist/experimental.d.ts"
87
87
  ],
88
+ "experimental/browser": [
89
+ "./dist/experimental/browser.d.ts"
90
+ ],
88
91
  "experimental/video/node": [
89
92
  "./dist/experimental/video/node.d.ts"
90
93
  ],
@@ -190,6 +193,16 @@
190
193
  "default": "./dist/experimental.cjs"
191
194
  }
192
195
  },
196
+ "./experimental/browser": {
197
+ "import": {
198
+ "types": "./dist/experimental/browser.d.ts",
199
+ "default": "./dist/experimental/browser.js"
200
+ },
201
+ "require": {
202
+ "types": "./dist/experimental/browser.d.cts",
203
+ "default": "./dist/experimental/browser.cjs"
204
+ }
205
+ },
193
206
  "./experimental/video/node": {
194
207
  "import": {
195
208
  "types": "./dist/experimental/video/node.d.ts",
@@ -246,7 +259,7 @@
246
259
  "access": "public"
247
260
  },
248
261
  "dependencies": {
249
- "stream-markdown-parser": "1.2.3"
262
+ "stream-markdown-parser": "1.2.12"
250
263
  },
251
264
  "devDependencies": {
252
265
  "@arethetypeswrong/core": "^0.18.5",
@@ -351,6 +364,7 @@
351
364
  "run:contra-text:terminal": "tsx examples/contra-terminal.ts",
352
365
  "example:contra-text:smoke": "VT_SMOKE=1 tsx examples/contra-terminal.ts",
353
366
  "run:nes:terminal": "tsx examples/nes-terminal.ts",
367
+ "run:browser:terminal": "tsx examples/browser-component-demo.ts",
354
368
  "example:nes:smoke": "VT_SMOKE=1 tsx examples/nes-terminal.ts",
355
369
  "check:nes:rom": "tsx examples/nes/check-rom.ts",
356
370
  "check:nes:input": "tsx examples/nes/input-flip-check.ts",
File without changes