@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/web.d.cts ADDED
@@ -0,0 +1,144 @@
1
+ import { PromptOptions, PromptResult, ReadOptions, UIBackend, ViewportInfo, WriteOptions } from "./backend.cjs";
2
+ import { TTYInputSource } from "./tty.cjs";
3
+ import { AFSRoot } from "@aigne/afs";
4
+
5
+ //#region src/web.d.ts
6
+ interface WebBackendOptions {
7
+ /** Port to listen on (0 = OS-assigned random port) */
8
+ port?: number;
9
+ /** Host to bind to */
10
+ host?: string;
11
+ /** For testing: custom input source (bypasses WebSocket) */
12
+ inputSource?: TTYInputSource & {
13
+ push?: (line: string) => void;
14
+ };
15
+ /** For testing: custom output handler (bypasses WebSocket) */
16
+ stdout?: {
17
+ write(data: string): boolean;
18
+ };
19
+ }
20
+ /**
21
+ * WebBackend — HTTP + WebSocket based browser UI.
22
+ *
23
+ * Serves a web page and communicates with it via WebSocket.
24
+ * For agent code, this behaves identically to TTYBackend — pure text I/O.
25
+ *
26
+ * For testing, accepts an inputSource/stdout to bypass WebSocket entirely.
27
+ */
28
+ declare class WebBackend implements UIBackend {
29
+ readonly type = "web";
30
+ readonly supportedFormats: string[];
31
+ readonly capabilities: string[];
32
+ private static readonly KNOWN_COMPONENTS;
33
+ private port;
34
+ private host;
35
+ private server;
36
+ private wss;
37
+ private clients;
38
+ /** Track all TCP sockets so we can force-destroy on close */
39
+ private sockets;
40
+ /** Input queue — fed by WebSocket messages or test inputSource */
41
+ private inputSource;
42
+ /** Output handler — sends to WebSocket clients or test stdout */
43
+ private outputHandler;
44
+ /** Queue for messages sent before any client connects */
45
+ private pendingMessages;
46
+ /** Pending prompt resolve — only one prompt at a time */
47
+ private promptResolve;
48
+ /** Pending prompt message — re-sent on client reconnect */
49
+ private pendingPromptMessage;
50
+ private testMode;
51
+ private _url;
52
+ /** Per-client session tracking */
53
+ private sessionForClient;
54
+ /** Per-client session token tracking */
55
+ private sessionTokenForClient;
56
+ private createSessionCallback;
57
+ /** AUP event handler callback */
58
+ private aupEventHandler;
59
+ /** Page resolver callback — returns page content for HTTP serving */
60
+ private pageResolver;
61
+ /** Snapshot resolver callback — returns snapshot HTML for a sharing slug */
62
+ private snapshotResolver;
63
+ /** AFS root instance — injected via setAFS() when provider is mounted */
64
+ private afs;
65
+ /** Per-client AFS event subscriptions: ws → subId → unsubscribe */
66
+ private clientSubscriptions;
67
+ /** Live channel subscribers: channelId → set of viewer WebSockets */
68
+ private channelSubscribers;
69
+ /** Reverse map: ws → channelId (only for channel viewers) */
70
+ private channelForClient;
71
+ /** Callback invoked when a viewer joins a channel — provider sends snapshot */
72
+ private channelJoinHandler;
73
+ /** Callback invoked when a client joins/reconnects a session — provider sends snapshot if stale */
74
+ private sessionJoinHandler;
75
+ constructor(options?: WebBackendOptions);
76
+ /** URL of the running server, or null if not started. */
77
+ get url(): string | null;
78
+ /** Register a factory that creates or reattaches a session for each new WebSocket client. */
79
+ setSessionFactory(fn: (endpoint: string, requestedSessionId?: string, requestedSessionToken?: string, caps?: Record<string, unknown>) => {
80
+ sessionId: string;
81
+ sessionToken?: string;
82
+ }): void;
83
+ /** Broadcast a raw JSON-serializable message to all connected clients. */
84
+ broadcastRaw(msg: Record<string, unknown>): void;
85
+ /** Send a raw JSON message to the client that owns a specific session. */
86
+ sendToSession(sessionId: string, msg: Record<string, unknown>): void;
87
+ /** Send a raw JSON message to all viewers of a live channel. */
88
+ sendToLiveChannel(channelId: string, msg: Record<string, unknown>): void;
89
+ /** Register a handler called when a viewer joins a channel (for snapshot delivery). */
90
+ setChannelJoinHandler(fn: (channelId: string, send: (msg: Record<string, unknown>) => void) => void): void;
91
+ /** Register a handler called when a client joins/reconnects a session (for snapshot replay). */
92
+ setSessionJoinHandler(fn: (sessionId: string, clientVersion: number, send: (msg: Record<string, unknown>) => void) => void): void;
93
+ /** Return the set of active channel IDs. */
94
+ getActiveChannelIds(): string[];
95
+ /** Register a handler for AUP events from clients. */
96
+ setAupEventHandler(fn: (msg: {
97
+ nodeId: string;
98
+ event: string;
99
+ data?: Record<string, unknown>;
100
+ }, sessionId?: string, channelId?: string) => Promise<unknown>): void;
101
+ /** Inject the AFS root for browser AFS proxy operations. */
102
+ setAFS(afs: AFSRoot): void;
103
+ /** Register a resolver for serving pages via HTTP (/p/:id). */
104
+ setPageResolver(fn: (pageId: string, sessionId?: string, sessionToken?: string) => Promise<{
105
+ content: string;
106
+ format: string;
107
+ } | null>): void;
108
+ /** Set the snapshot resolver for web sharing. */
109
+ setSnapshotResolver(fn: (slug: string) => string | null): void;
110
+ /** Start the HTTP + WebSocket server. */
111
+ listen(): Promise<{
112
+ port: number;
113
+ host: string;
114
+ }>;
115
+ /** Shut down the server and disconnect all clients. */
116
+ close(): Promise<void>;
117
+ write(content: string, options?: WriteOptions): Promise<void>;
118
+ read(options?: ReadOptions): Promise<string>;
119
+ prompt(options: PromptOptions): Promise<PromptResult>;
120
+ notify(message: string): Promise<void>;
121
+ navigate(pageId: string, content: string, format?: string, layout?: Record<string, string>): Promise<void>;
122
+ clear(): Promise<void>;
123
+ hasPendingInput(): boolean;
124
+ getViewport(): ViewportInfo;
125
+ dispose(): Promise<void>;
126
+ private onConnection;
127
+ /** Handle the first WS message as a typed handshake. */
128
+ private onHandshake;
129
+ private onMessage;
130
+ /** Handle AFS proxy messages from browser clients. */
131
+ private handleAfsMessage;
132
+ /** Serve a page as standalone HTML via /p/:id[?sid=xxx][&st=xxx][&bridge=1] */
133
+ private handlePageRequest;
134
+ /** Handle HTTP GET /s/:slug — serve snapshot HTML for a sharing entry */
135
+ private handleSnapshotRequest;
136
+ private broadcast;
137
+ private isLoopbackHost;
138
+ private isAllowedWsOrigin;
139
+ /** TTY-style prompt for test mode (reuses TTYBackend logic) */
140
+ private ttyStylePrompt;
141
+ }
142
+ //#endregion
143
+ export { WebBackend, WebBackendOptions };
144
+ //# sourceMappingURL=web.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.d.cts","names":[],"sources":["../src/web.ts"],"mappings":"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"}
package/dist/web.d.mts ADDED
@@ -0,0 +1,144 @@
1
+ import { PromptOptions, PromptResult, ReadOptions, UIBackend, ViewportInfo, WriteOptions } from "./backend.mjs";
2
+ import { TTYInputSource } from "./tty.mjs";
3
+ import { AFSRoot } from "@aigne/afs";
4
+
5
+ //#region src/web.d.ts
6
+ interface WebBackendOptions {
7
+ /** Port to listen on (0 = OS-assigned random port) */
8
+ port?: number;
9
+ /** Host to bind to */
10
+ host?: string;
11
+ /** For testing: custom input source (bypasses WebSocket) */
12
+ inputSource?: TTYInputSource & {
13
+ push?: (line: string) => void;
14
+ };
15
+ /** For testing: custom output handler (bypasses WebSocket) */
16
+ stdout?: {
17
+ write(data: string): boolean;
18
+ };
19
+ }
20
+ /**
21
+ * WebBackend — HTTP + WebSocket based browser UI.
22
+ *
23
+ * Serves a web page and communicates with it via WebSocket.
24
+ * For agent code, this behaves identically to TTYBackend — pure text I/O.
25
+ *
26
+ * For testing, accepts an inputSource/stdout to bypass WebSocket entirely.
27
+ */
28
+ declare class WebBackend implements UIBackend {
29
+ readonly type = "web";
30
+ readonly supportedFormats: string[];
31
+ readonly capabilities: string[];
32
+ private static readonly KNOWN_COMPONENTS;
33
+ private port;
34
+ private host;
35
+ private server;
36
+ private wss;
37
+ private clients;
38
+ /** Track all TCP sockets so we can force-destroy on close */
39
+ private sockets;
40
+ /** Input queue — fed by WebSocket messages or test inputSource */
41
+ private inputSource;
42
+ /** Output handler — sends to WebSocket clients or test stdout */
43
+ private outputHandler;
44
+ /** Queue for messages sent before any client connects */
45
+ private pendingMessages;
46
+ /** Pending prompt resolve — only one prompt at a time */
47
+ private promptResolve;
48
+ /** Pending prompt message — re-sent on client reconnect */
49
+ private pendingPromptMessage;
50
+ private testMode;
51
+ private _url;
52
+ /** Per-client session tracking */
53
+ private sessionForClient;
54
+ /** Per-client session token tracking */
55
+ private sessionTokenForClient;
56
+ private createSessionCallback;
57
+ /** AUP event handler callback */
58
+ private aupEventHandler;
59
+ /** Page resolver callback — returns page content for HTTP serving */
60
+ private pageResolver;
61
+ /** Snapshot resolver callback — returns snapshot HTML for a sharing slug */
62
+ private snapshotResolver;
63
+ /** AFS root instance — injected via setAFS() when provider is mounted */
64
+ private afs;
65
+ /** Per-client AFS event subscriptions: ws → subId → unsubscribe */
66
+ private clientSubscriptions;
67
+ /** Live channel subscribers: channelId → set of viewer WebSockets */
68
+ private channelSubscribers;
69
+ /** Reverse map: ws → channelId (only for channel viewers) */
70
+ private channelForClient;
71
+ /** Callback invoked when a viewer joins a channel — provider sends snapshot */
72
+ private channelJoinHandler;
73
+ /** Callback invoked when a client joins/reconnects a session — provider sends snapshot if stale */
74
+ private sessionJoinHandler;
75
+ constructor(options?: WebBackendOptions);
76
+ /** URL of the running server, or null if not started. */
77
+ get url(): string | null;
78
+ /** Register a factory that creates or reattaches a session for each new WebSocket client. */
79
+ setSessionFactory(fn: (endpoint: string, requestedSessionId?: string, requestedSessionToken?: string, caps?: Record<string, unknown>) => {
80
+ sessionId: string;
81
+ sessionToken?: string;
82
+ }): void;
83
+ /** Broadcast a raw JSON-serializable message to all connected clients. */
84
+ broadcastRaw(msg: Record<string, unknown>): void;
85
+ /** Send a raw JSON message to the client that owns a specific session. */
86
+ sendToSession(sessionId: string, msg: Record<string, unknown>): void;
87
+ /** Send a raw JSON message to all viewers of a live channel. */
88
+ sendToLiveChannel(channelId: string, msg: Record<string, unknown>): void;
89
+ /** Register a handler called when a viewer joins a channel (for snapshot delivery). */
90
+ setChannelJoinHandler(fn: (channelId: string, send: (msg: Record<string, unknown>) => void) => void): void;
91
+ /** Register a handler called when a client joins/reconnects a session (for snapshot replay). */
92
+ setSessionJoinHandler(fn: (sessionId: string, clientVersion: number, send: (msg: Record<string, unknown>) => void) => void): void;
93
+ /** Return the set of active channel IDs. */
94
+ getActiveChannelIds(): string[];
95
+ /** Register a handler for AUP events from clients. */
96
+ setAupEventHandler(fn: (msg: {
97
+ nodeId: string;
98
+ event: string;
99
+ data?: Record<string, unknown>;
100
+ }, sessionId?: string, channelId?: string) => Promise<unknown>): void;
101
+ /** Inject the AFS root for browser AFS proxy operations. */
102
+ setAFS(afs: AFSRoot): void;
103
+ /** Register a resolver for serving pages via HTTP (/p/:id). */
104
+ setPageResolver(fn: (pageId: string, sessionId?: string, sessionToken?: string) => Promise<{
105
+ content: string;
106
+ format: string;
107
+ } | null>): void;
108
+ /** Set the snapshot resolver for web sharing. */
109
+ setSnapshotResolver(fn: (slug: string) => string | null): void;
110
+ /** Start the HTTP + WebSocket server. */
111
+ listen(): Promise<{
112
+ port: number;
113
+ host: string;
114
+ }>;
115
+ /** Shut down the server and disconnect all clients. */
116
+ close(): Promise<void>;
117
+ write(content: string, options?: WriteOptions): Promise<void>;
118
+ read(options?: ReadOptions): Promise<string>;
119
+ prompt(options: PromptOptions): Promise<PromptResult>;
120
+ notify(message: string): Promise<void>;
121
+ navigate(pageId: string, content: string, format?: string, layout?: Record<string, string>): Promise<void>;
122
+ clear(): Promise<void>;
123
+ hasPendingInput(): boolean;
124
+ getViewport(): ViewportInfo;
125
+ dispose(): Promise<void>;
126
+ private onConnection;
127
+ /** Handle the first WS message as a typed handshake. */
128
+ private onHandshake;
129
+ private onMessage;
130
+ /** Handle AFS proxy messages from browser clients. */
131
+ private handleAfsMessage;
132
+ /** Serve a page as standalone HTML via /p/:id[?sid=xxx][&st=xxx][&bridge=1] */
133
+ private handlePageRequest;
134
+ /** Handle HTTP GET /s/:slug — serve snapshot HTML for a sharing entry */
135
+ private handleSnapshotRequest;
136
+ private broadcast;
137
+ private isLoopbackHost;
138
+ private isAllowedWsOrigin;
139
+ /** TTY-style prompt for test mode (reuses TTYBackend logic) */
140
+ private ttyStylePrompt;
141
+ }
142
+ //#endregion
143
+ export { WebBackend, WebBackendOptions };
144
+ //# sourceMappingURL=web.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.d.mts","names":[],"sources":["../src/web.ts"],"mappings":"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"}