@loomwork/ui-renderer-terminal 0.0.0-stage → 0.1.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.
Files changed (46) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +8 -0
  3. package/README.md +369 -2
  4. package/dist/esm/index.js +6 -0
  5. package/dist/esm/index.js.map +1 -0
  6. package/dist/esm/inert.js +13 -0
  7. package/dist/esm/inert.js.map +1 -0
  8. package/dist/esm/interactive.js +677 -0
  9. package/dist/esm/interactive.js.map +1 -0
  10. package/dist/esm/registry.js +428 -0
  11. package/dist/esm/registry.js.map +1 -0
  12. package/dist/esm/status.js +64 -0
  13. package/dist/esm/status.js.map +1 -0
  14. package/dist/esm/watch.js +17 -0
  15. package/dist/esm/watch.js.map +1 -0
  16. package/dist/index.d.ts +9 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +22 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/inert.d.ts +12 -0
  21. package/dist/inert.d.ts.map +1 -0
  22. package/dist/inert.js +17 -0
  23. package/dist/inert.js.map +1 -0
  24. package/dist/interactive.d.ts +142 -0
  25. package/dist/interactive.d.ts.map +1 -0
  26. package/dist/interactive.js +685 -0
  27. package/dist/interactive.js.map +1 -0
  28. package/dist/registry.d.ts +55 -0
  29. package/dist/registry.d.ts.map +1 -0
  30. package/dist/registry.js +434 -0
  31. package/dist/registry.js.map +1 -0
  32. package/dist/status.d.ts +49 -0
  33. package/dist/status.d.ts.map +1 -0
  34. package/dist/status.js +69 -0
  35. package/dist/status.js.map +1 -0
  36. package/dist/watch.d.ts +9 -0
  37. package/dist/watch.d.ts.map +1 -0
  38. package/dist/watch.js +20 -0
  39. package/dist/watch.js.map +1 -0
  40. package/package.json +60 -3
  41. package/src/index.ts +25 -0
  42. package/src/inert.ts +14 -0
  43. package/src/interactive.ts +868 -0
  44. package/src/registry.ts +630 -0
  45. package/src/status.ts +103 -0
  46. package/src/watch.ts +22 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/watch.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgC,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE1E;;;GAGG;AACH,MAAM,UAAU,KAAK,CACnB,SAAoB,EACpB,KAAqB,EACrB,OAAgC,EAChC,OAAgC,EAAE;IAElC,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,GAAS,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9C,IAAI,IAAI,CAAC,mBAAmB,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;IACxF,OAAO,GAAG,EAAE;QACV,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,IAAI,EAAE,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ export { createLoomUiTerminalRegistry, loomUiTerminalRegistry, sparkline, terminalRegistry, } from "./registry";
2
+ export { DEFAULT_TERMINAL_LOCALE } from "./registry";
3
+ export type { TerminalMediaOptions, TerminalRegistryOptions, TitleChrome } from "./registry";
4
+ export { kindValueCheck, kindValueCheckFor, renderExperience } from "./status";
5
+ export type { RenderExperienceOptions } from "./status";
6
+ export { watch } from "./watch";
7
+ export { decodeKeys, diffFrames, interactiveTerminal, paintPatches } from "./interactive";
8
+ export type { Control, ControlKind, InteractiveLabels, InteractiveOptions, InteractiveTerminal, Key, KeyName, LinePatch, PaintStats, TerminalInput, TerminalOutput, } from "./interactive";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4BAA4B,EAC5B,sBAAsB,EACtB,SAAS,EACT,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACrD,YAAY,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC7F,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC/E,YAAY,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC1F,YAAY,EACV,OAAO,EACP,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,GAAG,EACH,OAAO,EACP,SAAS,EACT,UAAU,EACV,aAAa,EACb,cAAc,GACf,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.paintPatches = exports.interactiveTerminal = exports.diffFrames = exports.decodeKeys = exports.watch = exports.renderExperience = exports.kindValueCheckFor = exports.kindValueCheck = exports.DEFAULT_TERMINAL_LOCALE = exports.terminalRegistry = exports.sparkline = exports.loomUiTerminalRegistry = exports.createLoomUiTerminalRegistry = void 0;
4
+ var registry_1 = require("./registry");
5
+ Object.defineProperty(exports, "createLoomUiTerminalRegistry", { enumerable: true, get: function () { return registry_1.createLoomUiTerminalRegistry; } });
6
+ Object.defineProperty(exports, "loomUiTerminalRegistry", { enumerable: true, get: function () { return registry_1.loomUiTerminalRegistry; } });
7
+ Object.defineProperty(exports, "sparkline", { enumerable: true, get: function () { return registry_1.sparkline; } });
8
+ Object.defineProperty(exports, "terminalRegistry", { enumerable: true, get: function () { return registry_1.terminalRegistry; } });
9
+ var registry_2 = require("./registry");
10
+ Object.defineProperty(exports, "DEFAULT_TERMINAL_LOCALE", { enumerable: true, get: function () { return registry_2.DEFAULT_TERMINAL_LOCALE; } });
11
+ var status_1 = require("./status");
12
+ Object.defineProperty(exports, "kindValueCheck", { enumerable: true, get: function () { return status_1.kindValueCheck; } });
13
+ Object.defineProperty(exports, "kindValueCheckFor", { enumerable: true, get: function () { return status_1.kindValueCheckFor; } });
14
+ Object.defineProperty(exports, "renderExperience", { enumerable: true, get: function () { return status_1.renderExperience; } });
15
+ var watch_1 = require("./watch");
16
+ Object.defineProperty(exports, "watch", { enumerable: true, get: function () { return watch_1.watch; } });
17
+ var interactive_1 = require("./interactive");
18
+ Object.defineProperty(exports, "decodeKeys", { enumerable: true, get: function () { return interactive_1.decodeKeys; } });
19
+ Object.defineProperty(exports, "diffFrames", { enumerable: true, get: function () { return interactive_1.diffFrames; } });
20
+ Object.defineProperty(exports, "interactiveTerminal", { enumerable: true, get: function () { return interactive_1.interactiveTerminal; } });
21
+ Object.defineProperty(exports, "paintPatches", { enumerable: true, get: function () { return interactive_1.paintPatches; } });
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uCAKoB;AAJlB,wHAAA,4BAA4B,OAAA;AAC5B,kHAAA,sBAAsB,OAAA;AACtB,qGAAA,SAAS,OAAA;AACT,4GAAA,gBAAgB,OAAA;AAElB,uCAAqD;AAA5C,mHAAA,uBAAuB,OAAA;AAEhC,mCAA+E;AAAtE,wGAAA,cAAc,OAAA;AAAE,2GAAA,iBAAiB,OAAA;AAAE,0GAAA,gBAAgB,OAAA;AAE5D,iCAAgC;AAAvB,8FAAA,KAAK,OAAA;AACd,6CAA0F;AAAjF,yGAAA,UAAU,OAAA;AAAE,yGAAA,UAAU,OAAA;AAAE,kHAAA,mBAAmB,OAAA;AAAE,2GAAA,YAAY,OAAA"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Make text inert for a terminal: core's ONE unsafe set (`stripUnsafeChars` — the same class
3
+ * `sanitizeChatText` removes: C0/C1 controls incl. ESC and NUL, bidi overrides/isolates, zero-width
4
+ * and invisible marks, soft hyphen, TAG characters), plus tab, carriage return and the Unicode line
5
+ * separators. Newline is the only control kept: it is the frame's own line structure.
6
+ *
7
+ * It STRIPS; it does not parse. The bytes after a stripped ESC are ordinary printable text, so
8
+ * `ESC ]8;;http://x BEL` leaves a harmless visible `]8;;http://x`. Idempotent; printable text is
9
+ * never touched.
10
+ */
11
+ export declare const inert: (text: string) => string;
12
+ //# sourceMappingURL=inert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inert.d.ts","sourceRoot":"","sources":["../src/inert.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,eAAO,MAAM,KAAK,GAAI,MAAM,MAAM,KAAG,MAC2B,CAAC"}
package/dist/inert.js ADDED
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.inert = void 0;
4
+ const chat_ui_1 = require("@loomwork/ui-core/chat-ui");
5
+ /**
6
+ * Make text inert for a terminal: core's ONE unsafe set (`stripUnsafeChars` — the same class
7
+ * `sanitizeChatText` removes: C0/C1 controls incl. ESC and NUL, bidi overrides/isolates, zero-width
8
+ * and invisible marks, soft hyphen, TAG characters), plus tab, carriage return and the Unicode line
9
+ * separators. Newline is the only control kept: it is the frame's own line structure.
10
+ *
11
+ * It STRIPS; it does not parse. The bytes after a stripped ESC are ordinary printable text, so
12
+ * `ESC ]8;;http://x BEL` leaves a harmless visible `]8;;http://x`. Idempotent; printable text is
13
+ * never touched.
14
+ */
15
+ const inert = (text) => (0, chat_ui_1.stripUnsafeChars)(text).replace(/[\t\r\u{2028}\u{2029}]/gu, "");
16
+ exports.inert = inert;
17
+ //# sourceMappingURL=inert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inert.js","sourceRoot":"","sources":["../src/inert.ts"],"names":[],"mappings":";;;AAAA,uDAA6D;AAE7D;;;;;;;;;GASG;AACI,MAAM,KAAK,GAAG,CAAC,IAAY,EAAU,EAAE,CAC5C,IAAA,0BAAgB,EAAC,IAAI,CAAC,CAAC,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC;AADpD,QAAA,KAAK,SAC+C"}
@@ -0,0 +1,142 @@
1
+ import type { Blueprint } from "@loomwork/blueprint-runtime";
2
+ import { type StampedAction } from "@loomwork/ui-core";
3
+ import type { HydrationStore } from "@loomwork/ui-hydration/client";
4
+ import { type RenderExperienceOptions } from "./status";
5
+ /** What the session reads keys from: a TTY's `process.stdin`, or any emitter of `data` chunks. */
6
+ export interface TerminalInput {
7
+ on(event: "data", listener: (chunk: string | Uint8Array) => void): unknown;
8
+ off?(event: "data", listener: (chunk: string | Uint8Array) => void): unknown;
9
+ removeListener?(event: "data", listener: (chunk: string | Uint8Array) => void): unknown;
10
+ /** A TTY's raw mode: set while the session is live so keys arrive unbuffered. Optional. */
11
+ setRawMode?(raw: boolean): unknown;
12
+ resume?(): unknown;
13
+ }
14
+ /** Where frames are painted: a TTY's `process.stdout`, or any sink with `write`. */
15
+ export interface TerminalOutput {
16
+ write(chunk: string): unknown;
17
+ }
18
+ export type KeyName = "tab" | "shift-tab" | "up" | "down" | "enter" | "escape" | "backspace" | "interrupt" | "paste" | "ignored" | "char";
19
+ export interface Key {
20
+ readonly name: KeyName;
21
+ /** The printable character, for `name: "char"`. */
22
+ readonly char?: string;
23
+ /** The pasted text, for `name: "paste"`: already inert, newlines normalised to `\n`. It is TEXT only, never a command. */
24
+ readonly text?: string;
25
+ }
26
+ /** One printable code point: what a `char` key may carry. Anything else is not typed text. */
27
+ export declare function isPrintableChar(ch: unknown): ch is string;
28
+ export interface KeyDecoderOptions {
29
+ /** The clock the paste idle bound reads (ms). Default `Date.now`. Injected so a test needs no sleep. */
30
+ readonly now?: () => number;
31
+ /** A paste with no byte for this long is discarded and paste mode left. Default 2000. */
32
+ readonly pasteIdleMs?: number;
33
+ }
34
+ /**
35
+ * A decoder that remembers an unfinished bracketed paste across chunks. `decodeKeys` is the
36
+ * stateless form (one chunk, a fresh decoder). It returns EVERY input unit, dropped sequences and
37
+ * non-printables included as `ignored`, so a caller can tell a lone key from one with company.
38
+ *
39
+ * Paste mode always ends: at the end marker (even split across chunks), at Ctrl-C (the paste is
40
+ * discarded and the interrupt delivered), when the paste outgrows MAX_PASTE (it is discarded, and
41
+ * the rest is swallowed up to the end marker, never typed), or after `pasteIdleMs` of silence, when the
42
+ * remainder (if any) is drained: discarded up to the end marker, Ctrl-C, or MAX_PASTE more UTF-16
43
+ * code units AND `pasteIdleMs` of silence (a still-flowing paste keeps draining). A drain or an
44
+ * overflowed paste that ends inside a chunk emits an `ignored` key, so what follows is never sole.
45
+ * Nothing it discards ever becomes a key.
46
+ */
47
+ export declare function createKeyDecoder(opts?: KeyDecoderOptions): (chunk: string) => Key[];
48
+ /**
49
+ * Split a chunk of terminal input into keys. Unknown escape sequences (arrows left/right, function
50
+ * keys, mouse reports, OSC strings) are dropped whole rather than leaking their bytes in as
51
+ * characters; a lone ESC is `escape`. Printable code points become `char` keys; a bracketed paste
52
+ * (`ESC[200~ … ESC[201~`) is ONE `paste` key, text only.
53
+ */
54
+ export declare function decodeKeys(chunk: string): Key[];
55
+ /** One changed line of a repaint. `text: undefined` = the line no longer exists. */
56
+ export interface LinePatch {
57
+ /** 0-based line index within the frame. */
58
+ readonly line: number;
59
+ readonly text: string | undefined;
60
+ }
61
+ /** The lines that differ between two frames, in order. Equal frames diff to nothing. */
62
+ export declare function diffFrames(prev: readonly string[], next: readonly string[]): LinePatch[];
63
+ /** The escape sequences that apply `patches`, then park the cursor under the frame. */
64
+ export declare function paintPatches(patches: readonly LinePatch[], nextLength: number): string;
65
+ /** The fixed words the controls footer uses beyond `LU_MESSAGES`: symbols, host-overridable. */
66
+ export interface InteractiveLabels {
67
+ /** The key legend under the controls. Default: symbols only (no words to translate). */
68
+ readonly hint?: string;
69
+ /** The marker before the focused control. Default `▸`. */
70
+ readonly focus?: string;
71
+ /** Shown after a first `y` / `n` when `confirmConsent` is on. Default: a symbols-only prompt. */
72
+ readonly confirm?: string;
73
+ }
74
+ export interface InteractiveOptions extends RenderExperienceOptions {
75
+ readonly store: HydrationStore;
76
+ /**
77
+ * Every `WidgetAction` a control emits, stamped with `viewedVersion` like the web's. It MAY return
78
+ * (a promise of) an `ActionOutcome`; nothing returned is success, `ok: false` / a throw is failure.
79
+ * No handler = "not available here": nothing is pretended to be sent.
80
+ */
81
+ readonly onAction?: (action: StampedAction) => unknown;
82
+ readonly input?: TerminalInput;
83
+ readonly output?: TerminalOutput;
84
+ /** Called after each repaint with what changed (the incremental-render evidence). */
85
+ readonly onPaint?: (stats: PaintStats) => void;
86
+ /** Called on Ctrl-C. Default: `stop()`. */
87
+ readonly onInterrupt?: () => void;
88
+ readonly labels?: InteractiveLabels;
89
+ /** The compile fingerprint stamped on every action (`viewedVersion.compile`). */
90
+ readonly compile?: string;
91
+ /**
92
+ * Require a SECOND, deliberate key for an approval: the first `y` / `n` only arms it (the frame
93
+ * says "press again"), and the same key, alone in a LATER chunk on the same frame, acts. Any other
94
+ * key disarms it. Default off. RECOMMENDED when the host reads a raw byte stream (see the known
95
+ * limits on `interactiveTerminal`).
96
+ */
97
+ readonly confirmConsent?: boolean;
98
+ /** The clock (ms) the bracketed-paste idle bound reads. Default `Date.now`; injected by tests. */
99
+ readonly now?: () => number;
100
+ /** A bracketed paste with no byte for this long is discarded. Default 2000. */
101
+ readonly pasteIdleMs?: number;
102
+ }
103
+ export interface PaintStats {
104
+ /** `full` is the first paint (or a forced one); `patch` rewrote only the changed lines. */
105
+ readonly mode: "full" | "patch" | "none";
106
+ readonly changedLines: number;
107
+ readonly totalLines: number;
108
+ }
109
+ export type ControlKind = "approval" | "select" | "multi" | "text";
110
+ export interface Control {
111
+ readonly id: string;
112
+ readonly kind: ControlKind;
113
+ readonly label: string;
114
+ }
115
+ export interface InteractiveTerminal {
116
+ /** The current frame: the snapshot, then the controls footer when there are controls. */
117
+ frame(): string;
118
+ /** The controls in reading order, with the focused one's id. */
119
+ controls(): readonly Control[];
120
+ focused(): string | undefined;
121
+ /** Feed raw input (what a TTY would deliver). Resolves when every effect, incl. an action, has settled. */
122
+ send(chunk: string): Promise<void>;
123
+ /** Feed decoded keys. */
124
+ press(...keys: Key[]): Promise<void>;
125
+ /** Land a revised Blueprint: only the lines that changed are repainted; focus follows the control's id. */
126
+ update(next: Blueprint): void;
127
+ /** Detach from the input, the store and the output. Idempotent. */
128
+ stop(): void;
129
+ }
130
+ /**
131
+ * Run the renderer as a live, keyboard-driven session.
132
+ *
133
+ * Consent (`y` / `n`, a submit) acts only as the SOLE unit of an input chunk: every decoded unit
134
+ * counts, dropped escape sequences and non-printables included. KNOWN LIMITS, because a chunk
135
+ * boundary is all the terminal gives us: (1) a terminal WITHOUT bracketed paste delivers a one-char
136
+ * paste (`y`) as a one-key chunk, indistinguishable from a keypress; (2) a host that reads byte by
137
+ * byte (slow serial / ssh) makes every key a one-key chunk, so a multi-line non-bracketed paste can
138
+ * reach `\t`, `y`. For such hosts turn on `confirmConsent`, which asks for the same key again in a
139
+ * later chunk. Default off.
140
+ */
141
+ export declare function interactiveTerminal(initial: Blueprint, opts: InteractiveOptions): InteractiveTerminal;
142
+ //# sourceMappingURL=interactive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../src/interactive.ts"],"names":[],"mappings":"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"}