@forthix/forthic 0.7.2 → 0.8.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 (73) hide show
  1. package/dist/cjs/forthic/decorators/schemaUtils.d.ts +70 -0
  2. package/dist/cjs/forthic/decorators/schemaUtils.js +77 -0
  3. package/dist/cjs/forthic/decorators/schemaUtils.js.map +1 -0
  4. package/dist/cjs/forthic/decorators/stackEffect.d.ts +63 -0
  5. package/dist/cjs/forthic/decorators/stackEffect.js +179 -0
  6. package/dist/cjs/forthic/decorators/stackEffect.js.map +1 -0
  7. package/dist/cjs/forthic/interpreter.d.ts +21 -0
  8. package/dist/cjs/forthic/interpreter.js +76 -1
  9. package/dist/cjs/forthic/interpreter.js.map +1 -1
  10. package/dist/cjs/forthic/module.d.ts +2 -0
  11. package/dist/cjs/forthic/module.js +4 -0
  12. package/dist/cjs/forthic/module.js.map +1 -1
  13. package/dist/cjs/index.d.ts +1 -0
  14. package/dist/cjs/index.js +1 -0
  15. package/dist/cjs/index.js.map +1 -1
  16. package/dist/esm/forthic/decorators/schemaUtils.d.ts +70 -0
  17. package/dist/esm/forthic/decorators/schemaUtils.js +72 -0
  18. package/dist/esm/forthic/decorators/schemaUtils.js.map +1 -0
  19. package/dist/esm/forthic/decorators/stackEffect.d.ts +63 -0
  20. package/dist/esm/forthic/decorators/stackEffect.js +174 -0
  21. package/dist/esm/forthic/decorators/stackEffect.js.map +1 -0
  22. package/dist/esm/forthic/interpreter.d.ts +21 -0
  23. package/dist/esm/forthic/interpreter.js +74 -1
  24. package/dist/esm/forthic/interpreter.js.map +1 -1
  25. package/dist/esm/forthic/module.d.ts +2 -0
  26. package/dist/esm/forthic/module.js +4 -0
  27. package/dist/esm/forthic/module.js.map +1 -1
  28. package/dist/esm/index.d.ts +1 -0
  29. package/dist/esm/index.js +1 -0
  30. package/dist/esm/index.js.map +1 -1
  31. package/package.json +1 -1
  32. package/dist/cjs/grpc/server.test.d.ts +0 -1
  33. package/dist/cjs/grpc/server.test.js +0 -156
  34. package/dist/cjs/grpc/server.test.js.map +0 -1
  35. package/dist/cjs/grpc/temporal_utils.d.ts +0 -36
  36. package/dist/cjs/grpc/temporal_utils.js +0 -80
  37. package/dist/cjs/grpc/temporal_utils.js.map +0 -1
  38. package/dist/cjs/websocket/action_cable_client.d.ts +0 -106
  39. package/dist/cjs/websocket/action_cable_client.js +0 -269
  40. package/dist/cjs/websocket/action_cable_client.js.map +0 -1
  41. package/dist/cjs/websocket/client.d.ts +0 -103
  42. package/dist/cjs/websocket/client.js +0 -266
  43. package/dist/cjs/websocket/client.js.map +0 -1
  44. package/dist/cjs/websocket/remote_module.d.ts +0 -68
  45. package/dist/cjs/websocket/remote_module.js +0 -107
  46. package/dist/cjs/websocket/remote_module.js.map +0 -1
  47. package/dist/cjs/websocket/remote_word.d.ts +0 -53
  48. package/dist/cjs/websocket/remote_word.js +0 -93
  49. package/dist/cjs/websocket/remote_word.js.map +0 -1
  50. package/dist/cjs/websocket/runtime_manager.d.ts +0 -69
  51. package/dist/cjs/websocket/runtime_manager.js +0 -112
  52. package/dist/cjs/websocket/runtime_manager.js.map +0 -1
  53. package/dist/esm/grpc/server.test.d.ts +0 -1
  54. package/dist/esm/grpc/server.test.js +0 -121
  55. package/dist/esm/grpc/server.test.js.map +0 -1
  56. package/dist/esm/grpc/temporal_utils.d.ts +0 -36
  57. package/dist/esm/grpc/temporal_utils.js +0 -72
  58. package/dist/esm/grpc/temporal_utils.js.map +0 -1
  59. package/dist/esm/websocket/action_cable_client.d.ts +0 -106
  60. package/dist/esm/websocket/action_cable_client.js +0 -265
  61. package/dist/esm/websocket/action_cable_client.js.map +0 -1
  62. package/dist/esm/websocket/client.d.ts +0 -103
  63. package/dist/esm/websocket/client.js +0 -262
  64. package/dist/esm/websocket/client.js.map +0 -1
  65. package/dist/esm/websocket/remote_module.d.ts +0 -68
  66. package/dist/esm/websocket/remote_module.js +0 -103
  67. package/dist/esm/websocket/remote_module.js.map +0 -1
  68. package/dist/esm/websocket/remote_word.d.ts +0 -53
  69. package/dist/esm/websocket/remote_word.js +0 -89
  70. package/dist/esm/websocket/remote_word.js.map +0 -1
  71. package/dist/esm/websocket/runtime_manager.d.ts +0 -69
  72. package/dist/esm/websocket/runtime_manager.js +0 -108
  73. package/dist/esm/websocket/runtime_manager.js.map +0 -1
@@ -1,80 +0,0 @@
1
- "use strict";
2
- /**
3
- * Temporal Type Utilities
4
- *
5
- * Provides duck-typing helpers for checking Temporal types.
6
- * Uses duck typing instead of instanceof to avoid issues with multiple
7
- * instances of temporal-polyfill being loaded.
8
- */
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.isPlainDate = isPlainDate;
11
- exports.isInstant = isInstant;
12
- exports.isZonedDateTime = isZonedDateTime;
13
- exports.isPlainTime = isPlainTime;
14
- exports.isPlainDateTime = isPlainDateTime;
15
- exports.isTemporal = isTemporal;
16
- /**
17
- * Check if a value is a Temporal.PlainDate
18
- * PlainDate has year, month, day properties but no hour property
19
- */
20
- function isPlainDate(value) {
21
- return value && typeof value === 'object' &&
22
- typeof value.year === 'number' &&
23
- typeof value.month === 'number' &&
24
- typeof value.day === 'number' &&
25
- typeof value.toString === 'function' &&
26
- !value.hour; // PlainDate doesn't have hour
27
- }
28
- /**
29
- * Check if a value is a Temporal.Instant
30
- * Instant has epochNanoseconds property as a bigint
31
- */
32
- function isInstant(value) {
33
- return value && typeof value === 'object' &&
34
- typeof value.epochNanoseconds === 'bigint' &&
35
- typeof value.toString === 'function';
36
- }
37
- /**
38
- * Check if a value is a Temporal.ZonedDateTime
39
- * ZonedDateTime has a timeZoneId property
40
- */
41
- function isZonedDateTime(value) {
42
- return value && typeof value === 'object' &&
43
- typeof value.timeZoneId === 'string' &&
44
- typeof value.toString === 'function';
45
- }
46
- /**
47
- * Check if a value is a Temporal.PlainTime
48
- * PlainTime has hour and minute properties but no year
49
- */
50
- function isPlainTime(value) {
51
- return value && typeof value === 'object' &&
52
- typeof value.hour === 'number' &&
53
- typeof value.minute === 'number' &&
54
- typeof value.toString === 'function' &&
55
- !value.year; // PlainTime doesn't have year
56
- }
57
- /**
58
- * Check if a value is a Temporal.PlainDateTime
59
- * PlainDateTime has year, month, day, hour properties but no timeZoneId
60
- */
61
- function isPlainDateTime(value) {
62
- return value && typeof value === 'object' &&
63
- typeof value.year === 'number' &&
64
- typeof value.month === 'number' &&
65
- typeof value.day === 'number' &&
66
- typeof value.hour === 'number' &&
67
- typeof value.toString === 'function' &&
68
- !value.timeZoneId; // PlainDateTime doesn't have timeZoneId
69
- }
70
- /**
71
- * Check if a value is any Temporal type
72
- */
73
- function isTemporal(value) {
74
- return isPlainDate(value) ||
75
- isInstant(value) ||
76
- isZonedDateTime(value) ||
77
- isPlainTime(value) ||
78
- isPlainDateTime(value);
79
- }
80
- //# sourceMappingURL=temporal_utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"temporal_utils.js","sourceRoot":"","sources":["../../../src/grpc/temporal_utils.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAMH,kCAOC;AAMD,8BAIC;AAMD,0CAIC;AAMD,kCAMC;AAMD,0CAQC;AAKD,gCAMC;AApED;;;GAGG;AACH,SAAgB,WAAW,CAAC,KAAU;IACpC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAClC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;QAC/B,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ;QAC7B,OAAO,KAAK,CAAC,QAAQ,KAAK,UAAU;QACpC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAE,8BAA8B;AACrD,CAAC;AAED;;;GAGG;AACH,SAAgB,SAAS,CAAC,KAAU;IAClC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAClC,OAAO,KAAK,CAAC,gBAAgB,KAAK,QAAQ;QAC1C,OAAO,KAAK,CAAC,QAAQ,KAAK,UAAU,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAAC,KAAU;IACxC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAClC,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;QACpC,OAAO,KAAK,CAAC,QAAQ,KAAK,UAAU,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,SAAgB,WAAW,CAAC,KAAU;IACpC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAClC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;QAChC,OAAO,KAAK,CAAC,QAAQ,KAAK,UAAU;QACpC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAE,8BAA8B;AACrD,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAAC,KAAU;IACxC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAClC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;QAC/B,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ;QAC7B,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,OAAO,KAAK,CAAC,QAAQ,KAAK,UAAU;QACpC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAE,wCAAwC;AACrE,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CAAC,KAAU;IACnC,OAAO,WAAW,CAAC,KAAK,CAAC;QAClB,SAAS,CAAC,KAAK,CAAC;QAChB,eAAe,CAAC,KAAK,CAAC;QACtB,WAAW,CAAC,KAAK,CAAC;QAClB,eAAe,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC"}
@@ -1,106 +0,0 @@
1
- /**
2
- * ActionCable Client for Forthic
3
- * Browser-compatible client that mirrors GrpcClient API
4
- * Specifically designed for Rails ActionCable WebSocket protocol
5
- */
6
- import { StackValue } from './serializer.js';
7
- export interface ModuleSummary {
8
- name: string;
9
- description: string;
10
- word_count: number;
11
- }
12
- export interface WordInfo {
13
- name: string;
14
- stack_effect: string;
15
- description: string;
16
- }
17
- export interface ModuleInfo {
18
- module_name: string;
19
- words: WordInfo[];
20
- }
21
- export interface ProgressUpdate {
22
- step: number;
23
- total_steps: number;
24
- current_word: string;
25
- message?: string;
26
- partial_stack?: StackValue[];
27
- }
28
- export interface ActionCableClientConfig {
29
- url: string;
30
- timezone?: string;
31
- reconnect?: boolean;
32
- reconnectDelay?: number;
33
- channel?: string;
34
- }
35
- /**
36
- * ActionCable client for executing words in remote Forthic runtimes
37
- * Mirrors the GrpcClient API for compatibility
38
- * Uses Rails ActionCable WebSocket protocol
39
- */
40
- export declare class ActionCableClient {
41
- private ws?;
42
- private config;
43
- private pendingRequests;
44
- private messageId;
45
- private connected;
46
- private connectionPromise?;
47
- constructor(config: ActionCableClientConfig);
48
- /**
49
- * Connect to the WebSocket server
50
- */
51
- private connect;
52
- /**
53
- * Handle incoming WebSocket messages
54
- */
55
- private handleMessage;
56
- /**
57
- * Generate next message ID
58
- */
59
- private nextMessageId;
60
- /**
61
- * Send a request and wait for response
62
- * @template T The expected result type (the value of the `result` field)
63
- */
64
- private sendRequest;
65
- /**
66
- * Send a streaming request with progress callbacks
67
- * @template T The expected result type (the value of the `result` field)
68
- */
69
- private sendStreamingRequest;
70
- /**
71
- * Ensure WebSocket is connected
72
- */
73
- private ensureConnected;
74
- /**
75
- * Execute a word in the remote runtime
76
- * Mirrors GrpcClient.executeWord
77
- */
78
- executeWord(word: string, stack: any[]): Promise<any[]>;
79
- /**
80
- * Execute a sequence of words (batched execution)
81
- * Mirrors GrpcClient.executeSequence
82
- */
83
- executeSequence(words: string[], stack: any[]): Promise<any[]>;
84
- /**
85
- * List available runtime-specific modules
86
- * Mirrors GrpcClient.listModules
87
- */
88
- listModules(): Promise<ModuleSummary[]>;
89
- /**
90
- * Get detailed information about a specific module
91
- * Mirrors GrpcClient.getModuleInfo
92
- */
93
- getModuleInfo(moduleName: string): Promise<ModuleInfo>;
94
- /**
95
- * Execute code with streaming progress updates (NEW capability)
96
- */
97
- streamingExecute(code: string, stack: any[], onProgress?: (progress: ProgressUpdate) => void): Promise<any[]>;
98
- /**
99
- * Close the WebSocket connection
100
- */
101
- close(): void;
102
- /**
103
- * Check if the client is connected
104
- */
105
- isConnected(): boolean;
106
- }
@@ -1,269 +0,0 @@
1
- "use strict";
2
- /**
3
- * ActionCable Client for Forthic
4
- * Browser-compatible client that mirrors GrpcClient API
5
- * Specifically designed for Rails ActionCable WebSocket protocol
6
- */
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.ActionCableClient = void 0;
9
- const serializer_js_1 = require("./serializer.js");
10
- const errors_js_1 = require("./errors.js");
11
- /**
12
- * ActionCable client for executing words in remote Forthic runtimes
13
- * Mirrors the GrpcClient API for compatibility
14
- * Uses Rails ActionCable WebSocket protocol
15
- */
16
- class ActionCableClient {
17
- ws;
18
- config;
19
- pendingRequests = new Map();
20
- messageId = 0;
21
- connected = false;
22
- connectionPromise;
23
- constructor(config) {
24
- this.config = {
25
- url: config.url,
26
- timezone: config.timezone || 'UTC',
27
- reconnect: config.reconnect ?? true,
28
- reconnectDelay: config.reconnectDelay || 3000,
29
- channel: config.channel || 'ForthicRuntimeChannel',
30
- };
31
- this.connect();
32
- }
33
- /**
34
- * Connect to the WebSocket server
35
- */
36
- connect() {
37
- if (this.connectionPromise) {
38
- return this.connectionPromise;
39
- }
40
- this.connectionPromise = new Promise((resolve, reject) => {
41
- try {
42
- this.ws = new WebSocket(this.config.url);
43
- this.ws.onopen = () => {
44
- this.connected = true;
45
- // Subscribe to ActionCable channel
46
- const subscribeMessage = {
47
- command: 'subscribe',
48
- identifier: JSON.stringify({
49
- channel: this.config.channel,
50
- timezone: this.config.timezone,
51
- }),
52
- };
53
- this.ws.send(JSON.stringify(subscribeMessage));
54
- resolve();
55
- };
56
- this.ws.onmessage = (event) => {
57
- this.handleMessage(event);
58
- };
59
- this.ws.onerror = (error) => {
60
- console.error('WebSocket error:', error);
61
- reject(new Error('WebSocket connection error'));
62
- };
63
- this.ws.onclose = () => {
64
- this.connected = false;
65
- this.connectionPromise = undefined;
66
- // Reject all pending requests
67
- for (const [id, pending] of this.pendingRequests.entries()) {
68
- pending.reject(new Error('WebSocket connection closed'));
69
- }
70
- this.pendingRequests.clear();
71
- // Attempt reconnect if enabled
72
- if (this.config.reconnect) {
73
- setTimeout(() => this.connect(), this.config.reconnectDelay);
74
- }
75
- };
76
- }
77
- catch (error) {
78
- reject(error);
79
- }
80
- });
81
- return this.connectionPromise;
82
- }
83
- /**
84
- * Handle incoming WebSocket messages
85
- */
86
- handleMessage(event) {
87
- try {
88
- const data = JSON.parse(event.data);
89
- // Handle ActionCable control messages
90
- if (data.type === 'welcome' || data.type === 'ping' || data.type === 'confirm_subscription') {
91
- return;
92
- }
93
- // Extract the actual message from ActionCable envelope
94
- const message = data.message || data;
95
- if (!message.id) {
96
- console.warn('Received message without ID:', message);
97
- return;
98
- }
99
- // Handle streaming progress updates
100
- if (message.type === 'streaming_progress') {
101
- const pending = this.pendingRequests.get(message.id);
102
- if (pending?.onProgress) {
103
- pending.onProgress(message.progress);
104
- }
105
- return;
106
- }
107
- // Handle final responses
108
- const pending = this.pendingRequests.get(message.id);
109
- if (!pending) {
110
- console.warn('Received response for unknown request:', message.id);
111
- return;
112
- }
113
- if (message.error) {
114
- pending.reject(new errors_js_1.RemoteRuntimeError(message.error));
115
- }
116
- else {
117
- pending.resolve(message.result);
118
- }
119
- this.pendingRequests.delete(message.id);
120
- }
121
- catch (error) {
122
- console.error('Error handling WebSocket message:', error);
123
- }
124
- }
125
- /**
126
- * Generate next message ID
127
- */
128
- nextMessageId() {
129
- return `msg-${++this.messageId}-${Date.now()}`;
130
- }
131
- /**
132
- * Send a request and wait for response
133
- * @template T The expected result type (the value of the `result` field)
134
- */
135
- async sendRequest(message) {
136
- await this.ensureConnected();
137
- return new Promise((resolve, reject) => {
138
- this.pendingRequests.set(message.id, { resolve, reject });
139
- // Wrap message in ActionCable format
140
- const actionCableMessage = {
141
- command: 'message',
142
- identifier: JSON.stringify({
143
- channel: this.config.channel,
144
- }),
145
- data: JSON.stringify(message),
146
- };
147
- this.ws.send(JSON.stringify(actionCableMessage));
148
- });
149
- }
150
- /**
151
- * Send a streaming request with progress callbacks
152
- * @template T The expected result type (the value of the `result` field)
153
- */
154
- async sendStreamingRequest(message, onProgress) {
155
- await this.ensureConnected();
156
- return new Promise((resolve, reject) => {
157
- this.pendingRequests.set(message.id, { resolve, reject, onProgress });
158
- // Wrap message in ActionCable format
159
- const actionCableMessage = {
160
- command: 'message',
161
- identifier: JSON.stringify({
162
- channel: this.config.channel,
163
- }),
164
- data: JSON.stringify(message),
165
- };
166
- this.ws.send(JSON.stringify(actionCableMessage));
167
- });
168
- }
169
- /**
170
- * Ensure WebSocket is connected
171
- */
172
- async ensureConnected() {
173
- if (!this.connected) {
174
- await this.connect();
175
- }
176
- }
177
- /**
178
- * Execute a word in the remote runtime
179
- * Mirrors GrpcClient.executeWord
180
- */
181
- async executeWord(word, stack) {
182
- const message = {
183
- type: 'execute_word',
184
- id: this.nextMessageId(),
185
- params: {
186
- word,
187
- stack: (0, serializer_js_1.serializeStack)(stack),
188
- },
189
- };
190
- const result = await this.sendRequest(message);
191
- return (0, serializer_js_1.deserializeStack)(result.stack);
192
- }
193
- /**
194
- * Execute a sequence of words (batched execution)
195
- * Mirrors GrpcClient.executeSequence
196
- */
197
- async executeSequence(words, stack) {
198
- const message = {
199
- type: 'execute_sequence',
200
- id: this.nextMessageId(),
201
- params: {
202
- words,
203
- stack: (0, serializer_js_1.serializeStack)(stack),
204
- },
205
- };
206
- const result = await this.sendRequest(message);
207
- return (0, serializer_js_1.deserializeStack)(result.stack);
208
- }
209
- /**
210
- * List available runtime-specific modules
211
- * Mirrors GrpcClient.listModules
212
- */
213
- async listModules() {
214
- const message = {
215
- type: 'list_modules',
216
- id: this.nextMessageId(),
217
- };
218
- const result = await this.sendRequest(message);
219
- return result.modules || [];
220
- }
221
- /**
222
- * Get detailed information about a specific module
223
- * Mirrors GrpcClient.getModuleInfo
224
- */
225
- async getModuleInfo(moduleName) {
226
- const message = {
227
- type: 'get_module_info',
228
- id: this.nextMessageId(),
229
- params: {
230
- module_name: moduleName,
231
- },
232
- };
233
- return await this.sendRequest(message);
234
- }
235
- /**
236
- * Execute code with streaming progress updates (NEW capability)
237
- */
238
- async streamingExecute(code, stack, onProgress) {
239
- const message = {
240
- type: 'streaming_execute',
241
- id: this.nextMessageId(),
242
- params: {
243
- code,
244
- stack: (0, serializer_js_1.serializeStack)(stack),
245
- },
246
- };
247
- const result = await this.sendStreamingRequest(message, onProgress);
248
- return (0, serializer_js_1.deserializeStack)(result.stack);
249
- }
250
- /**
251
- * Close the WebSocket connection
252
- */
253
- close() {
254
- if (this.ws) {
255
- this.config.reconnect = false; // Disable auto-reconnect
256
- this.ws.close();
257
- this.ws = undefined;
258
- this.connected = false;
259
- }
260
- }
261
- /**
262
- * Check if the client is connected
263
- */
264
- isConnected() {
265
- return this.connected;
266
- }
267
- }
268
- exports.ActionCableClient = ActionCableClient;
269
- //# sourceMappingURL=action_cable_client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"action_cable_client.js","sourceRoot":"","sources":["../../../src/websocket/action_cable_client.ts"],"names":[],"mappings":"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"}
@@ -1,103 +0,0 @@
1
- /**
2
- * WebSocket Client for Forthic
3
- * Browser-compatible client that mirrors GrpcClient API
4
- * Connects to Rails ActionCable server and executes remote words
5
- */
6
- import { StackValue } from './serializer.js';
7
- export interface ModuleSummary {
8
- name: string;
9
- description: string;
10
- word_count: number;
11
- }
12
- export interface WordInfo {
13
- name: string;
14
- stack_effect: string;
15
- description: string;
16
- }
17
- export interface ModuleInfo {
18
- module_name: string;
19
- words: WordInfo[];
20
- }
21
- export interface ProgressUpdate {
22
- step: number;
23
- total_steps: number;
24
- current_word: string;
25
- message?: string;
26
- partial_stack?: StackValue[];
27
- }
28
- export interface WebSocketClientConfig {
29
- url: string;
30
- timezone?: string;
31
- reconnect?: boolean;
32
- reconnectDelay?: number;
33
- channel?: string;
34
- }
35
- /**
36
- * WebSocket client for executing words in remote Forthic runtimes
37
- * Mirrors the GrpcClient API for compatibility
38
- */
39
- export declare class WebSocketClient {
40
- private ws?;
41
- private config;
42
- private pendingRequests;
43
- private messageId;
44
- private connected;
45
- private connectionPromise?;
46
- constructor(config: WebSocketClientConfig);
47
- /**
48
- * Connect to the WebSocket server
49
- */
50
- private connect;
51
- /**
52
- * Handle incoming WebSocket messages
53
- */
54
- private handleMessage;
55
- /**
56
- * Generate next message ID
57
- */
58
- private nextMessageId;
59
- /**
60
- * Send a request and wait for response
61
- */
62
- private sendRequest;
63
- /**
64
- * Send a streaming request with progress callbacks
65
- */
66
- private sendStreamingRequest;
67
- /**
68
- * Ensure WebSocket is connected
69
- */
70
- private ensureConnected;
71
- /**
72
- * Execute a word in the remote runtime
73
- * Mirrors GrpcClient.executeWord
74
- */
75
- executeWord(word: string, stack: any[]): Promise<any[]>;
76
- /**
77
- * Execute a sequence of words (batched execution)
78
- * Mirrors GrpcClient.executeSequence
79
- */
80
- executeSequence(words: string[], stack: any[]): Promise<any[]>;
81
- /**
82
- * List available runtime-specific modules
83
- * Mirrors GrpcClient.listModules
84
- */
85
- listModules(): Promise<ModuleSummary[]>;
86
- /**
87
- * Get detailed information about a specific module
88
- * Mirrors GrpcClient.getModuleInfo
89
- */
90
- getModuleInfo(moduleName: string): Promise<ModuleInfo>;
91
- /**
92
- * Execute code with streaming progress updates (NEW capability)
93
- */
94
- streamingExecute(code: string, stack: any[], onProgress?: (progress: ProgressUpdate) => void): Promise<any[]>;
95
- /**
96
- * Close the WebSocket connection
97
- */
98
- close(): void;
99
- /**
100
- * Check if the client is connected
101
- */
102
- isConnected(): boolean;
103
- }