@aigne/afs-ui 1.11.0-beta.12

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 (196) hide show
  1. package/LICENSE.md +26 -0
  2. package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.cjs +11 -0
  3. package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.mjs +10 -0
  4. package/dist/aup-protocol.cjs +235 -0
  5. package/dist/aup-protocol.d.cts +78 -0
  6. package/dist/aup-protocol.d.cts.map +1 -0
  7. package/dist/aup-protocol.d.mts +78 -0
  8. package/dist/aup-protocol.d.mts.map +1 -0
  9. package/dist/aup-protocol.mjs +235 -0
  10. package/dist/aup-protocol.mjs.map +1 -0
  11. package/dist/aup-registry.cjs +2489 -0
  12. package/dist/aup-registry.mjs +2487 -0
  13. package/dist/aup-registry.mjs.map +1 -0
  14. package/dist/aup-spec.cjs +1467 -0
  15. package/dist/aup-spec.mjs +1466 -0
  16. package/dist/aup-spec.mjs.map +1 -0
  17. package/dist/aup-types.cjs +165 -0
  18. package/dist/aup-types.d.cts +157 -0
  19. package/dist/aup-types.d.cts.map +1 -0
  20. package/dist/aup-types.d.mts +157 -0
  21. package/dist/aup-types.d.mts.map +1 -0
  22. package/dist/aup-types.mjs +157 -0
  23. package/dist/aup-types.mjs.map +1 -0
  24. package/dist/backend.cjs +14 -0
  25. package/dist/backend.d.cts +104 -0
  26. package/dist/backend.d.cts.map +1 -0
  27. package/dist/backend.d.mts +104 -0
  28. package/dist/backend.d.mts.map +1 -0
  29. package/dist/backend.mjs +13 -0
  30. package/dist/backend.mjs.map +1 -0
  31. package/dist/degradation.cjs +85 -0
  32. package/dist/degradation.d.cts +17 -0
  33. package/dist/degradation.d.cts.map +1 -0
  34. package/dist/degradation.d.mts +17 -0
  35. package/dist/degradation.d.mts.map +1 -0
  36. package/dist/degradation.mjs +84 -0
  37. package/dist/degradation.mjs.map +1 -0
  38. package/dist/index.cjs +36 -0
  39. package/dist/index.d.cts +12 -0
  40. package/dist/index.d.mts +12 -0
  41. package/dist/index.mjs +13 -0
  42. package/dist/runtime.cjs +117 -0
  43. package/dist/runtime.d.cts +59 -0
  44. package/dist/runtime.d.cts.map +1 -0
  45. package/dist/runtime.d.mts +59 -0
  46. package/dist/runtime.d.mts.map +1 -0
  47. package/dist/runtime.mjs +118 -0
  48. package/dist/runtime.mjs.map +1 -0
  49. package/dist/session.cjs +159 -0
  50. package/dist/session.d.cts +80 -0
  51. package/dist/session.d.cts.map +1 -0
  52. package/dist/session.d.mts +80 -0
  53. package/dist/session.d.mts.map +1 -0
  54. package/dist/session.mjs +159 -0
  55. package/dist/session.mjs.map +1 -0
  56. package/dist/snapshot.cjs +162 -0
  57. package/dist/snapshot.mjs +163 -0
  58. package/dist/snapshot.mjs.map +1 -0
  59. package/dist/term-page.cjs +264 -0
  60. package/dist/term-page.mjs +264 -0
  61. package/dist/term-page.mjs.map +1 -0
  62. package/dist/term.cjs +295 -0
  63. package/dist/term.d.cts +84 -0
  64. package/dist/term.d.cts.map +1 -0
  65. package/dist/term.d.mts +84 -0
  66. package/dist/term.d.mts.map +1 -0
  67. package/dist/term.mjs +296 -0
  68. package/dist/term.mjs.map +1 -0
  69. package/dist/tty.cjs +136 -0
  70. package/dist/tty.d.cts +53 -0
  71. package/dist/tty.d.cts.map +1 -0
  72. package/dist/tty.d.mts +53 -0
  73. package/dist/tty.d.mts.map +1 -0
  74. package/dist/tty.mjs +135 -0
  75. package/dist/tty.mjs.map +1 -0
  76. package/dist/ui-provider.cjs +4615 -0
  77. package/dist/ui-provider.d.cts +307 -0
  78. package/dist/ui-provider.d.cts.map +1 -0
  79. package/dist/ui-provider.d.mts +307 -0
  80. package/dist/ui-provider.d.mts.map +1 -0
  81. package/dist/ui-provider.mjs +4616 -0
  82. package/dist/ui-provider.mjs.map +1 -0
  83. package/dist/web-page/core.cjs +1388 -0
  84. package/dist/web-page/core.mjs +1387 -0
  85. package/dist/web-page/core.mjs.map +1 -0
  86. package/dist/web-page/css.cjs +1699 -0
  87. package/dist/web-page/css.mjs +1698 -0
  88. package/dist/web-page/css.mjs.map +1 -0
  89. package/dist/web-page/icons.cjs +248 -0
  90. package/dist/web-page/icons.mjs +248 -0
  91. package/dist/web-page/icons.mjs.map +1 -0
  92. package/dist/web-page/overlay-themes.cjs +514 -0
  93. package/dist/web-page/overlay-themes.mjs +513 -0
  94. package/dist/web-page/overlay-themes.mjs.map +1 -0
  95. package/dist/web-page/renderers/action.cjs +72 -0
  96. package/dist/web-page/renderers/action.mjs +72 -0
  97. package/dist/web-page/renderers/action.mjs.map +1 -0
  98. package/dist/web-page/renderers/broadcast.cjs +160 -0
  99. package/dist/web-page/renderers/broadcast.mjs +160 -0
  100. package/dist/web-page/renderers/broadcast.mjs.map +1 -0
  101. package/dist/web-page/renderers/calendar.cjs +137 -0
  102. package/dist/web-page/renderers/calendar.mjs +137 -0
  103. package/dist/web-page/renderers/calendar.mjs.map +1 -0
  104. package/dist/web-page/renderers/canvas.cjs +173 -0
  105. package/dist/web-page/renderers/canvas.mjs +173 -0
  106. package/dist/web-page/renderers/canvas.mjs.map +1 -0
  107. package/dist/web-page/renderers/cdn-loader.cjs +25 -0
  108. package/dist/web-page/renderers/cdn-loader.mjs +25 -0
  109. package/dist/web-page/renderers/cdn-loader.mjs.map +1 -0
  110. package/dist/web-page/renderers/chart.cjs +101 -0
  111. package/dist/web-page/renderers/chart.mjs +101 -0
  112. package/dist/web-page/renderers/chart.mjs.map +1 -0
  113. package/dist/web-page/renderers/deck.cjs +390 -0
  114. package/dist/web-page/renderers/deck.mjs +390 -0
  115. package/dist/web-page/renderers/deck.mjs.map +1 -0
  116. package/dist/web-page/renderers/device.cjs +1015 -0
  117. package/dist/web-page/renderers/device.mjs +1015 -0
  118. package/dist/web-page/renderers/device.mjs.map +1 -0
  119. package/dist/web-page/renderers/editor.cjs +127 -0
  120. package/dist/web-page/renderers/editor.mjs +127 -0
  121. package/dist/web-page/renderers/editor.mjs.map +1 -0
  122. package/dist/web-page/renderers/finance-chart.cjs +178 -0
  123. package/dist/web-page/renderers/finance-chart.mjs +178 -0
  124. package/dist/web-page/renderers/finance-chart.mjs.map +1 -0
  125. package/dist/web-page/renderers/frame.cjs +274 -0
  126. package/dist/web-page/renderers/frame.mjs +274 -0
  127. package/dist/web-page/renderers/frame.mjs.map +1 -0
  128. package/dist/web-page/renderers/globe.cjs +119 -0
  129. package/dist/web-page/renderers/globe.mjs +119 -0
  130. package/dist/web-page/renderers/globe.mjs.map +1 -0
  131. package/dist/web-page/renderers/input.cjs +137 -0
  132. package/dist/web-page/renderers/input.mjs +137 -0
  133. package/dist/web-page/renderers/input.mjs.map +1 -0
  134. package/dist/web-page/renderers/list.cjs +1243 -0
  135. package/dist/web-page/renderers/list.mjs +1243 -0
  136. package/dist/web-page/renderers/list.mjs.map +1 -0
  137. package/dist/web-page/renderers/map.cjs +126 -0
  138. package/dist/web-page/renderers/map.mjs +126 -0
  139. package/dist/web-page/renderers/map.mjs.map +1 -0
  140. package/dist/web-page/renderers/media.cjs +106 -0
  141. package/dist/web-page/renderers/media.mjs +106 -0
  142. package/dist/web-page/renderers/media.mjs.map +1 -0
  143. package/dist/web-page/renderers/moonphase.cjs +105 -0
  144. package/dist/web-page/renderers/moonphase.mjs +105 -0
  145. package/dist/web-page/renderers/moonphase.mjs.map +1 -0
  146. package/dist/web-page/renderers/natal-chart.cjs +222 -0
  147. package/dist/web-page/renderers/natal-chart.mjs +222 -0
  148. package/dist/web-page/renderers/natal-chart.mjs.map +1 -0
  149. package/dist/web-page/renderers/overlay.cjs +531 -0
  150. package/dist/web-page/renderers/overlay.mjs +531 -0
  151. package/dist/web-page/renderers/overlay.mjs.map +1 -0
  152. package/dist/web-page/renderers/table.cjs +74 -0
  153. package/dist/web-page/renderers/table.mjs +74 -0
  154. package/dist/web-page/renderers/table.mjs.map +1 -0
  155. package/dist/web-page/renderers/terminal.cjs +30 -0
  156. package/dist/web-page/renderers/terminal.mjs +30 -0
  157. package/dist/web-page/renderers/terminal.mjs.map +1 -0
  158. package/dist/web-page/renderers/text.cjs +109 -0
  159. package/dist/web-page/renderers/text.mjs +109 -0
  160. package/dist/web-page/renderers/text.mjs.map +1 -0
  161. package/dist/web-page/renderers/ticker.cjs +133 -0
  162. package/dist/web-page/renderers/ticker.mjs +133 -0
  163. package/dist/web-page/renderers/ticker.mjs.map +1 -0
  164. package/dist/web-page/renderers/time.cjs +69 -0
  165. package/dist/web-page/renderers/time.mjs +69 -0
  166. package/dist/web-page/renderers/time.mjs.map +1 -0
  167. package/dist/web-page/renderers/unknown.cjs +20 -0
  168. package/dist/web-page/renderers/unknown.mjs +20 -0
  169. package/dist/web-page/renderers/unknown.mjs.map +1 -0
  170. package/dist/web-page/renderers/view.cjs +161 -0
  171. package/dist/web-page/renderers/view.mjs +161 -0
  172. package/dist/web-page/renderers/view.mjs.map +1 -0
  173. package/dist/web-page/renderers/wm.cjs +669 -0
  174. package/dist/web-page/renderers/wm.mjs +669 -0
  175. package/dist/web-page/renderers/wm.mjs.map +1 -0
  176. package/dist/web-page/skeleton.cjs +103 -0
  177. package/dist/web-page/skeleton.mjs +103 -0
  178. package/dist/web-page/skeleton.mjs.map +1 -0
  179. package/dist/web-page.cjs +114 -0
  180. package/dist/web-page.d.cts +19 -0
  181. package/dist/web-page.d.cts.map +1 -0
  182. package/dist/web-page.d.mts +19 -0
  183. package/dist/web-page.d.mts.map +1 -0
  184. package/dist/web-page.mjs +115 -0
  185. package/dist/web-page.mjs.map +1 -0
  186. package/dist/web.cjs +827 -0
  187. package/dist/web.d.cts +144 -0
  188. package/dist/web.d.cts.map +1 -0
  189. package/dist/web.d.mts +144 -0
  190. package/dist/web.d.mts.map +1 -0
  191. package/dist/web.mjs +828 -0
  192. package/dist/web.mjs.map +1 -0
  193. package/dist/wm-state.cjs +172 -0
  194. package/dist/wm-state.mjs +171 -0
  195. package/dist/wm-state.mjs.map +1 -0
  196. package/package.json +59 -0
package/dist/tty.mjs ADDED
@@ -0,0 +1,135 @@
1
+ //#region src/tty.ts
2
+ var TTYBackend = class {
3
+ type = "tty";
4
+ supportedFormats = ["text"];
5
+ capabilities = ["text"];
6
+ stdout;
7
+ inputSource;
8
+ inputTimeout;
9
+ constructor(options = {}) {
10
+ this.stdout = options.stdout ?? process.stdout;
11
+ this.inputSource = options.inputSource ?? createStdinSource();
12
+ this.inputTimeout = options.inputTimeout ?? 0;
13
+ }
14
+ async write(content, options) {
15
+ if (options?.format && options.format !== "text") throw new Error(`TTY backend does not support format: ${options.format}`);
16
+ this.stdout.write(content);
17
+ }
18
+ async read(options) {
19
+ const timeout = options?.timeout ?? this.inputTimeout;
20
+ if (timeout > 0) return withTimeout(this.inputSource.readLine(), timeout);
21
+ return this.inputSource.readLine();
22
+ }
23
+ async prompt(options) {
24
+ const { message, type } = options;
25
+ switch (type) {
26
+ case "text":
27
+ case "password":
28
+ this.stdout.write(`${message} `);
29
+ return (await this.read()).trim();
30
+ case "confirm":
31
+ this.stdout.write(`${message} (y/n) `);
32
+ return (await this.read()).trim().toLowerCase().startsWith("y");
33
+ case "select": {
34
+ if (!options.options || options.options.length === 0) throw new Error("select prompt requires options");
35
+ this.stdout.write(`${message}\n`);
36
+ for (let i = 0; i < options.options.length; i++) this.stdout.write(` ${i + 1}. ${options.options[i]}\n`);
37
+ this.stdout.write("Choice: ");
38
+ const input = await this.read();
39
+ const idx = Number.parseInt(input.trim(), 10) - 1;
40
+ if (idx >= 0 && idx < options.options.length) return options.options[idx];
41
+ return options.options[0];
42
+ }
43
+ case "multiselect":
44
+ if (!options.options || options.options.length === 0) throw new Error("multiselect prompt requires options");
45
+ this.stdout.write(`${message}\n`);
46
+ for (let i = 0; i < options.options.length; i++) this.stdout.write(` ${i + 1}. ${options.options[i]}\n`);
47
+ this.stdout.write("Choices (comma-separated): ");
48
+ return (await this.read()).split(",").map((s) => Number.parseInt(s.trim(), 10) - 1).filter((i) => i >= 0 && i < options.options.length).map((i) => options.options[i]);
49
+ default: throw new Error(`Unknown prompt type: ${type}`);
50
+ }
51
+ }
52
+ async notify(message) {
53
+ this.stdout.write(`${message}\n`);
54
+ }
55
+ async clear() {
56
+ this.stdout.write("\x1B[2J\x1B[H");
57
+ }
58
+ hasPendingInput() {
59
+ return this.inputSource.hasPending();
60
+ }
61
+ getViewport() {
62
+ if (typeof process !== "undefined" && process.stdout && "columns" in process.stdout) return {
63
+ cols: process.stdout.columns,
64
+ rows: process.stdout.rows
65
+ };
66
+ return {};
67
+ }
68
+ async dispose() {}
69
+ };
70
+ /** Create a stdin-based input source (production use) */
71
+ function createStdinSource() {
72
+ const pendingLines = [];
73
+ let pendingResolve = null;
74
+ if (typeof process !== "undefined" && process.stdin) {
75
+ process.stdin.setEncoding("utf8");
76
+ process.stdin.on("data", (data) => {
77
+ const lines = data.split("\n").filter((l) => l.length > 0);
78
+ for (const line of lines) if (pendingResolve) {
79
+ const resolve = pendingResolve;
80
+ pendingResolve = null;
81
+ resolve(line);
82
+ } else pendingLines.push(line);
83
+ });
84
+ }
85
+ return {
86
+ readLine() {
87
+ if (pendingLines.length > 0) return Promise.resolve(pendingLines.shift());
88
+ return new Promise((resolve) => {
89
+ pendingResolve = resolve;
90
+ });
91
+ },
92
+ hasPending() {
93
+ return pendingLines.length > 0;
94
+ }
95
+ };
96
+ }
97
+ /** Create a mock input source for testing */
98
+ function createMockInputSource(inputs = []) {
99
+ const queue = [...inputs];
100
+ let pendingResolve = null;
101
+ return {
102
+ readLine() {
103
+ if (queue.length > 0) return Promise.resolve(queue.shift());
104
+ return new Promise((resolve) => {
105
+ pendingResolve = resolve;
106
+ });
107
+ },
108
+ hasPending() {
109
+ return queue.length > 0;
110
+ },
111
+ push(line) {
112
+ if (pendingResolve) {
113
+ const resolve = pendingResolve;
114
+ pendingResolve = null;
115
+ resolve(line);
116
+ } else queue.push(line);
117
+ }
118
+ };
119
+ }
120
+ function withTimeout(promise, ms) {
121
+ return new Promise((resolve, reject) => {
122
+ const timer = setTimeout(() => reject(/* @__PURE__ */ new Error("Input timeout")), ms);
123
+ promise.then((val) => {
124
+ clearTimeout(timer);
125
+ resolve(val);
126
+ }, (err) => {
127
+ clearTimeout(timer);
128
+ reject(err);
129
+ });
130
+ });
131
+ }
132
+
133
+ //#endregion
134
+ export { TTYBackend, createMockInputSource };
135
+ //# sourceMappingURL=tty.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tty.mjs","names":[],"sources":["../src/tty.ts"],"sourcesContent":["import type {\n PromptOptions,\n PromptResult,\n ReadOptions,\n UIBackend,\n ViewportInfo,\n WriteOptions,\n} from \"./backend.js\";\n\n/**\n * TTY Backend — stdin/stdout based terminal I/O.\n *\n * For testing, provide mock stdin/stdout via options.\n */\nexport interface TTYBackendOptions {\n /** Custom writable stream (defaults to process.stdout) */\n stdout?: { write(data: string): boolean };\n /** Custom input source for testing */\n inputSource?: TTYInputSource;\n /** Input timeout in ms (0 = no timeout) */\n inputTimeout?: number;\n}\n\n/**\n * Input source abstraction for testability.\n * In production, reads from process.stdin.\n * In tests, provides programmatic input.\n */\nexport interface TTYInputSource {\n /** Read a line of input */\n readLine(): Promise<string>;\n /** Check if input is available */\n hasPending(): boolean;\n}\n\nexport class TTYBackend implements UIBackend {\n readonly type = \"tty\";\n readonly supportedFormats = [\"text\"];\n readonly capabilities = [\"text\"];\n\n private stdout: { write(data: string): boolean };\n private inputSource: TTYInputSource;\n private inputTimeout: number;\n\n constructor(options: TTYBackendOptions = {}) {\n this.stdout = options.stdout ?? process.stdout;\n this.inputSource = options.inputSource ?? createStdinSource();\n this.inputTimeout = options.inputTimeout ?? 0;\n }\n\n async write(content: string, options?: WriteOptions): Promise<void> {\n if (options?.format && options.format !== \"text\") {\n throw new Error(`TTY backend does not support format: ${options.format}`);\n }\n this.stdout.write(content);\n }\n\n async read(options?: ReadOptions): Promise<string> {\n const timeout = options?.timeout ?? this.inputTimeout;\n if (timeout > 0) {\n return withTimeout(this.inputSource.readLine(), timeout);\n }\n return this.inputSource.readLine();\n }\n\n async prompt(options: PromptOptions): Promise<PromptResult> {\n const { message, type } = options;\n\n switch (type) {\n case \"text\":\n case \"password\": {\n this.stdout.write(`${message} `);\n const input = await this.read();\n return input.trim();\n }\n case \"confirm\": {\n this.stdout.write(`${message} (y/n) `);\n const input = await this.read();\n return input.trim().toLowerCase().startsWith(\"y\");\n }\n case \"select\": {\n if (!options.options || options.options.length === 0) {\n throw new Error(\"select prompt requires options\");\n }\n this.stdout.write(`${message}\\n`);\n for (let i = 0; i < options.options.length; i++) {\n this.stdout.write(` ${i + 1}. ${options.options[i]}\\n`);\n }\n this.stdout.write(\"Choice: \");\n const input = await this.read();\n const idx = Number.parseInt(input.trim(), 10) - 1;\n if (idx >= 0 && idx < options.options.length) {\n return options.options[idx]!;\n }\n return options.options[0]!;\n }\n case \"multiselect\": {\n if (!options.options || options.options.length === 0) {\n throw new Error(\"multiselect prompt requires options\");\n }\n this.stdout.write(`${message}\\n`);\n for (let i = 0; i < options.options.length; i++) {\n this.stdout.write(` ${i + 1}. ${options.options[i]}\\n`);\n }\n this.stdout.write(\"Choices (comma-separated): \");\n const input = await this.read();\n const indices = input\n .split(\",\")\n .map((s) => Number.parseInt(s.trim(), 10) - 1)\n .filter((i) => i >= 0 && i < options.options!.length);\n return indices.map((i) => options.options![i]!);\n }\n default:\n throw new Error(`Unknown prompt type: ${type}`);\n }\n }\n\n async notify(message: string): Promise<void> {\n this.stdout.write(`${message}\\n`);\n }\n\n async clear(): Promise<void> {\n // ANSI escape: clear screen + move cursor to top-left\n this.stdout.write(\"\\x1b[2J\\x1b[H\");\n }\n\n hasPendingInput(): boolean {\n return this.inputSource.hasPending();\n }\n\n getViewport(): ViewportInfo {\n if (typeof process !== \"undefined\" && process.stdout && \"columns\" in process.stdout) {\n return {\n cols: (process.stdout as { columns?: number }).columns,\n rows: (process.stdout as { rows?: number }).rows,\n };\n }\n return {};\n }\n\n async dispose(): Promise<void> {\n // No cleanup needed for TTY\n }\n}\n\n/** Create a stdin-based input source (production use) */\nfunction createStdinSource(): TTYInputSource {\n const pendingLines: string[] = [];\n let pendingResolve: ((line: string) => void) | null = null;\n\n if (typeof process !== \"undefined\" && process.stdin) {\n process.stdin.setEncoding(\"utf8\");\n process.stdin.on(\"data\", (data: string) => {\n const lines = data.split(\"\\n\").filter((l) => l.length > 0);\n for (const line of lines) {\n if (pendingResolve) {\n const resolve = pendingResolve;\n pendingResolve = null;\n resolve(line);\n } else {\n pendingLines.push(line);\n }\n }\n });\n }\n\n return {\n readLine(): Promise<string> {\n if (pendingLines.length > 0) {\n return Promise.resolve(pendingLines.shift()!);\n }\n return new Promise((resolve) => {\n pendingResolve = resolve;\n });\n },\n hasPending(): boolean {\n return pendingLines.length > 0;\n },\n };\n}\n\n/** Create a mock input source for testing */\nexport function createMockInputSource(inputs: string[] = []): TTYInputSource & {\n push(line: string): void;\n} {\n const queue = [...inputs];\n let pendingResolve: ((line: string) => void) | null = null;\n\n return {\n readLine(): Promise<string> {\n if (queue.length > 0) {\n return Promise.resolve(queue.shift()!);\n }\n return new Promise((resolve) => {\n pendingResolve = resolve;\n });\n },\n hasPending(): boolean {\n return queue.length > 0;\n },\n push(line: string): void {\n if (pendingResolve) {\n const resolve = pendingResolve;\n pendingResolve = null;\n resolve(line);\n } else {\n queue.push(line);\n }\n },\n };\n}\n\nfunction withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => reject(new Error(\"Input timeout\")), ms);\n promise.then(\n (val) => {\n clearTimeout(timer);\n resolve(val);\n },\n (err) => {\n clearTimeout(timer);\n reject(err);\n },\n );\n });\n}\n"],"mappings":"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"}