@forthix/forthic 0.3.0 → 0.4.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 (272) hide show
  1. package/README.md +63 -73
  2. package/dist/cjs/common/temporal_utils.d.ts +36 -0
  3. package/dist/cjs/common/temporal_utils.js +80 -0
  4. package/dist/cjs/common/temporal_utils.js.map +1 -0
  5. package/dist/cjs/common/type_utils.d.ts +31 -0
  6. package/dist/cjs/common/type_utils.js +79 -0
  7. package/dist/cjs/common/type_utils.js.map +1 -0
  8. package/dist/cjs/forthic/decorators/word.d.ts +15 -7
  9. package/dist/cjs/forthic/decorators/word.js +52 -21
  10. package/dist/cjs/forthic/decorators/word.js.map +1 -1
  11. package/dist/cjs/forthic/execution_planner.d.ts +76 -0
  12. package/dist/cjs/forthic/execution_planner.js +125 -0
  13. package/dist/cjs/forthic/execution_planner.js.map +1 -0
  14. package/dist/cjs/forthic/interpreter.d.ts +12 -2
  15. package/dist/cjs/forthic/interpreter.js +95 -14
  16. package/dist/cjs/forthic/interpreter.js.map +1 -1
  17. package/dist/cjs/forthic/module.d.ts +28 -0
  18. package/dist/cjs/forthic/module.js +72 -8
  19. package/dist/cjs/forthic/module.js.map +1 -1
  20. package/dist/cjs/forthic/modules/{array_module.d.ts → standard/array_module.d.ts} +2 -2
  21. package/dist/cjs/forthic/modules/{array_module.js → standard/array_module.js} +32 -32
  22. package/dist/cjs/forthic/modules/standard/array_module.js.map +1 -0
  23. package/dist/{esm/forthic/modules → cjs/forthic/modules/standard}/boolean_module.d.ts +2 -2
  24. package/dist/cjs/forthic/modules/{boolean_module.js → standard/boolean_module.js} +17 -17
  25. package/dist/cjs/forthic/modules/standard/boolean_module.js.map +1 -0
  26. package/dist/cjs/forthic/modules/{core_module.d.ts → standard/core_module.d.ts} +2 -2
  27. package/dist/cjs/forthic/modules/{core_module.js → standard/core_module.js} +32 -32
  28. package/dist/cjs/forthic/modules/standard/core_module.js.map +1 -0
  29. package/dist/{esm/forthic/modules → cjs/forthic/modules/standard}/datetime_module.d.ts +2 -2
  30. package/dist/cjs/forthic/modules/{datetime_module.js → standard/datetime_module.js} +17 -17
  31. package/dist/cjs/forthic/modules/standard/datetime_module.js.map +1 -0
  32. package/dist/cjs/forthic/modules/{json_module.d.ts → standard/json_module.d.ts} +1 -1
  33. package/dist/cjs/forthic/modules/{json_module.js → standard/json_module.js} +4 -4
  34. package/dist/cjs/forthic/modules/standard/json_module.js.map +1 -0
  35. package/dist/cjs/forthic/modules/{math_module.d.ts → standard/math_module.d.ts} +2 -2
  36. package/dist/cjs/forthic/modules/{math_module.js → standard/math_module.js} +26 -26
  37. package/dist/cjs/forthic/modules/standard/math_module.js.map +1 -0
  38. package/dist/cjs/forthic/modules/{record_module.d.ts → standard/record_module.d.ts} +1 -1
  39. package/dist/cjs/forthic/modules/{record_module.js → standard/record_module.js} +11 -11
  40. package/dist/cjs/forthic/modules/standard/record_module.js.map +1 -0
  41. package/dist/cjs/forthic/modules/{string_module.d.ts → standard/string_module.d.ts} +2 -2
  42. package/dist/cjs/forthic/modules/{string_module.js → standard/string_module.js} +19 -19
  43. package/dist/cjs/forthic/modules/standard/string_module.js.map +1 -0
  44. package/dist/cjs/forthic/modules/typescript/fs_module.d.ts +17 -0
  45. package/dist/cjs/forthic/modules/typescript/fs_module.js +169 -0
  46. package/dist/cjs/forthic/modules/typescript/fs_module.js.map +1 -0
  47. package/dist/cjs/grpc/browser-stub.d.ts +26 -0
  48. package/dist/cjs/grpc/browser-stub.js +45 -0
  49. package/dist/cjs/grpc/browser-stub.js.map +1 -0
  50. package/dist/cjs/grpc/client.d.ts +53 -0
  51. package/dist/cjs/grpc/client.js +186 -0
  52. package/dist/cjs/grpc/client.js.map +1 -0
  53. package/dist/cjs/grpc/config_loader.d.ts +72 -0
  54. package/dist/cjs/grpc/config_loader.js +198 -0
  55. package/dist/cjs/grpc/config_loader.js.map +1 -0
  56. package/dist/cjs/grpc/errors.d.ts +55 -0
  57. package/dist/cjs/grpc/errors.js +126 -0
  58. package/dist/cjs/grpc/errors.js.map +1 -0
  59. package/dist/cjs/grpc/index.d.ts +15 -0
  60. package/dist/cjs/grpc/index.js +23 -0
  61. package/dist/cjs/grpc/index.js.map +1 -0
  62. package/dist/cjs/grpc/remote_module.d.ts +66 -0
  63. package/dist/cjs/grpc/remote_module.js +105 -0
  64. package/dist/cjs/grpc/remote_module.js.map +1 -0
  65. package/dist/cjs/grpc/remote_runtime_module.d.ts +33 -0
  66. package/dist/cjs/grpc/remote_runtime_module.js +171 -0
  67. package/dist/cjs/grpc/remote_runtime_module.js.map +1 -0
  68. package/dist/cjs/grpc/remote_word.d.ts +53 -0
  69. package/dist/cjs/grpc/remote_word.js +94 -0
  70. package/dist/cjs/grpc/remote_word.js.map +1 -0
  71. package/dist/cjs/grpc/runtime_manager.d.ts +63 -0
  72. package/dist/cjs/grpc/runtime_manager.js +100 -0
  73. package/dist/cjs/grpc/runtime_manager.js.map +1 -0
  74. package/dist/cjs/grpc/serializer.d.ts +45 -0
  75. package/dist/cjs/grpc/serializer.js +105 -0
  76. package/dist/cjs/grpc/serializer.js.map +1 -0
  77. package/dist/cjs/grpc/server.d.ts +14 -0
  78. package/dist/cjs/grpc/server.js +362 -0
  79. package/dist/cjs/grpc/server.js.map +1 -0
  80. package/dist/cjs/grpc/server.test.d.ts +1 -0
  81. package/dist/cjs/grpc/server.test.js +156 -0
  82. package/dist/cjs/grpc/server.test.js.map +1 -0
  83. package/dist/cjs/grpc/temporal_utils.d.ts +36 -0
  84. package/dist/cjs/grpc/temporal_utils.js +80 -0
  85. package/dist/cjs/grpc/temporal_utils.js.map +1 -0
  86. package/dist/cjs/index.d.ts +1 -0
  87. package/dist/cjs/index.js +1 -0
  88. package/dist/cjs/index.js.map +1 -1
  89. package/dist/cjs/websocket/action_cable/client.d.ts +106 -0
  90. package/dist/cjs/websocket/action_cable/client.js +269 -0
  91. package/dist/cjs/websocket/action_cable/client.js.map +1 -0
  92. package/dist/cjs/websocket/action_cable/index.d.ts +8 -0
  93. package/dist/cjs/websocket/action_cable/index.js +16 -0
  94. package/dist/cjs/websocket/action_cable/index.js.map +1 -0
  95. package/dist/cjs/websocket/action_cable/remote_module.d.ts +68 -0
  96. package/dist/cjs/websocket/action_cable/remote_module.js +107 -0
  97. package/dist/cjs/websocket/action_cable/remote_module.js.map +1 -0
  98. package/dist/cjs/websocket/action_cable/remote_word.d.ts +53 -0
  99. package/dist/cjs/websocket/action_cable/remote_word.js +93 -0
  100. package/dist/cjs/websocket/action_cable/remote_word.js.map +1 -0
  101. package/dist/cjs/websocket/action_cable/runtime_manager.d.ts +69 -0
  102. package/dist/cjs/websocket/action_cable/runtime_manager.js +112 -0
  103. package/dist/cjs/websocket/action_cable/runtime_manager.js.map +1 -0
  104. package/dist/cjs/websocket/action_cable_client.d.ts +106 -0
  105. package/dist/cjs/websocket/action_cable_client.js +269 -0
  106. package/dist/cjs/websocket/action_cable_client.js.map +1 -0
  107. package/dist/cjs/websocket/client.d.ts +103 -0
  108. package/dist/cjs/websocket/client.js +266 -0
  109. package/dist/cjs/websocket/client.js.map +1 -0
  110. package/dist/cjs/websocket/errors.d.ts +45 -0
  111. package/dist/cjs/websocket/errors.js +98 -0
  112. package/dist/cjs/websocket/errors.js.map +1 -0
  113. package/dist/cjs/websocket/index.d.ts +13 -0
  114. package/dist/cjs/websocket/index.js +28 -0
  115. package/dist/cjs/websocket/index.js.map +1 -0
  116. package/dist/cjs/websocket/remote_module.d.ts +68 -0
  117. package/dist/cjs/websocket/remote_module.js +107 -0
  118. package/dist/cjs/websocket/remote_module.js.map +1 -0
  119. package/dist/cjs/websocket/remote_word.d.ts +53 -0
  120. package/dist/cjs/websocket/remote_word.js +93 -0
  121. package/dist/cjs/websocket/remote_word.js.map +1 -0
  122. package/dist/cjs/websocket/runtime_manager.d.ts +69 -0
  123. package/dist/cjs/websocket/runtime_manager.js +112 -0
  124. package/dist/cjs/websocket/runtime_manager.js.map +1 -0
  125. package/dist/cjs/websocket/serializer.d.ts +27 -0
  126. package/dist/cjs/websocket/serializer.js +106 -0
  127. package/dist/cjs/websocket/serializer.js.map +1 -0
  128. package/dist/esm/common/temporal_utils.d.ts +36 -0
  129. package/dist/esm/common/temporal_utils.js +72 -0
  130. package/dist/esm/common/temporal_utils.js.map +1 -0
  131. package/dist/esm/common/type_utils.d.ts +31 -0
  132. package/dist/esm/common/type_utils.js +73 -0
  133. package/dist/esm/common/type_utils.js.map +1 -0
  134. package/dist/esm/forthic/decorators/word.d.ts +15 -7
  135. package/dist/esm/forthic/decorators/word.js +51 -20
  136. package/dist/esm/forthic/decorators/word.js.map +1 -1
  137. package/dist/esm/forthic/execution_planner.d.ts +76 -0
  138. package/dist/esm/forthic/execution_planner.js +121 -0
  139. package/dist/esm/forthic/execution_planner.js.map +1 -0
  140. package/dist/esm/forthic/interpreter.d.ts +12 -2
  141. package/dist/esm/forthic/interpreter.js +95 -14
  142. package/dist/esm/forthic/interpreter.js.map +1 -1
  143. package/dist/esm/forthic/module.d.ts +28 -0
  144. package/dist/esm/forthic/module.js +72 -8
  145. package/dist/esm/forthic/module.js.map +1 -1
  146. package/dist/esm/forthic/modules/{array_module.d.ts → standard/array_module.d.ts} +2 -2
  147. package/dist/esm/forthic/modules/{array_module.js → standard/array_module.js} +32 -32
  148. package/dist/esm/forthic/modules/standard/array_module.js.map +1 -0
  149. package/dist/{cjs/forthic/modules → esm/forthic/modules/standard}/boolean_module.d.ts +2 -2
  150. package/dist/esm/forthic/modules/{boolean_module.js → standard/boolean_module.js} +16 -16
  151. package/dist/esm/forthic/modules/standard/boolean_module.js.map +1 -0
  152. package/dist/esm/forthic/modules/{core_module.d.ts → standard/core_module.d.ts} +2 -2
  153. package/dist/esm/forthic/modules/{core_module.js → standard/core_module.js} +32 -32
  154. package/dist/esm/forthic/modules/standard/core_module.js.map +1 -0
  155. package/dist/{cjs/forthic/modules → esm/forthic/modules/standard}/datetime_module.d.ts +2 -2
  156. package/dist/esm/forthic/modules/{datetime_module.js → standard/datetime_module.js} +16 -16
  157. package/dist/esm/forthic/modules/standard/datetime_module.js.map +1 -0
  158. package/dist/esm/forthic/modules/{json_module.d.ts → standard/json_module.d.ts} +1 -1
  159. package/dist/esm/forthic/modules/{json_module.js → standard/json_module.js} +4 -4
  160. package/dist/esm/forthic/modules/standard/json_module.js.map +1 -0
  161. package/dist/esm/forthic/modules/{math_module.d.ts → standard/math_module.d.ts} +2 -2
  162. package/dist/esm/forthic/modules/{math_module.js → standard/math_module.js} +25 -25
  163. package/dist/esm/forthic/modules/standard/math_module.js.map +1 -0
  164. package/dist/esm/forthic/modules/{record_module.d.ts → standard/record_module.d.ts} +1 -1
  165. package/dist/esm/forthic/modules/{record_module.js → standard/record_module.js} +11 -11
  166. package/dist/esm/forthic/modules/standard/record_module.js.map +1 -0
  167. package/dist/esm/forthic/modules/{string_module.d.ts → standard/string_module.d.ts} +2 -2
  168. package/dist/esm/forthic/modules/{string_module.js → standard/string_module.js} +18 -18
  169. package/dist/esm/forthic/modules/standard/string_module.js.map +1 -0
  170. package/dist/esm/forthic/modules/typescript/fs_module.d.ts +17 -0
  171. package/dist/esm/forthic/modules/typescript/fs_module.js +102 -0
  172. package/dist/esm/forthic/modules/typescript/fs_module.js.map +1 -0
  173. package/dist/esm/grpc/browser-stub.d.ts +26 -0
  174. package/dist/esm/grpc/browser-stub.js +36 -0
  175. package/dist/esm/grpc/browser-stub.js.map +1 -0
  176. package/dist/esm/grpc/client.d.ts +53 -0
  177. package/dist/esm/grpc/client.js +149 -0
  178. package/dist/esm/grpc/client.js.map +1 -0
  179. package/dist/esm/grpc/config_loader.d.ts +72 -0
  180. package/dist/esm/grpc/config_loader.js +158 -0
  181. package/dist/esm/grpc/config_loader.js.map +1 -0
  182. package/dist/esm/grpc/errors.d.ts +55 -0
  183. package/dist/esm/grpc/errors.js +121 -0
  184. package/dist/esm/grpc/errors.js.map +1 -0
  185. package/dist/esm/grpc/index.d.ts +15 -0
  186. package/dist/esm/grpc/index.js +14 -0
  187. package/dist/esm/grpc/index.js.map +1 -0
  188. package/dist/esm/grpc/remote_module.d.ts +66 -0
  189. package/dist/esm/grpc/remote_module.js +101 -0
  190. package/dist/esm/grpc/remote_module.js.map +1 -0
  191. package/dist/esm/grpc/remote_runtime_module.d.ts +33 -0
  192. package/dist/esm/grpc/remote_runtime_module.js +149 -0
  193. package/dist/esm/grpc/remote_runtime_module.js.map +1 -0
  194. package/dist/esm/grpc/remote_word.d.ts +53 -0
  195. package/dist/esm/grpc/remote_word.js +90 -0
  196. package/dist/esm/grpc/remote_word.js.map +1 -0
  197. package/dist/esm/grpc/runtime_manager.d.ts +63 -0
  198. package/dist/esm/grpc/runtime_manager.js +96 -0
  199. package/dist/esm/grpc/runtime_manager.js.map +1 -0
  200. package/dist/esm/grpc/serializer.d.ts +45 -0
  201. package/dist/esm/grpc/serializer.js +101 -0
  202. package/dist/esm/grpc/serializer.js.map +1 -0
  203. package/dist/esm/grpc/server.d.ts +14 -0
  204. package/dist/esm/grpc/server.js +325 -0
  205. package/dist/esm/grpc/server.js.map +1 -0
  206. package/dist/esm/grpc/server.test.d.ts +1 -0
  207. package/dist/esm/grpc/server.test.js +121 -0
  208. package/dist/esm/grpc/server.test.js.map +1 -0
  209. package/dist/esm/grpc/temporal_utils.d.ts +36 -0
  210. package/dist/esm/grpc/temporal_utils.js +72 -0
  211. package/dist/esm/grpc/temporal_utils.js.map +1 -0
  212. package/dist/esm/index.d.ts +1 -0
  213. package/dist/esm/index.js +1 -0
  214. package/dist/esm/index.js.map +1 -1
  215. package/dist/esm/websocket/action_cable/client.d.ts +106 -0
  216. package/dist/esm/websocket/action_cable/client.js +265 -0
  217. package/dist/esm/websocket/action_cable/client.js.map +1 -0
  218. package/dist/esm/websocket/action_cable/index.d.ts +8 -0
  219. package/dist/esm/websocket/action_cable/index.js +9 -0
  220. package/dist/esm/websocket/action_cable/index.js.map +1 -0
  221. package/dist/esm/websocket/action_cable/remote_module.d.ts +68 -0
  222. package/dist/esm/websocket/action_cable/remote_module.js +103 -0
  223. package/dist/esm/websocket/action_cable/remote_module.js.map +1 -0
  224. package/dist/esm/websocket/action_cable/remote_word.d.ts +53 -0
  225. package/dist/esm/websocket/action_cable/remote_word.js +89 -0
  226. package/dist/esm/websocket/action_cable/remote_word.js.map +1 -0
  227. package/dist/esm/websocket/action_cable/runtime_manager.d.ts +69 -0
  228. package/dist/esm/websocket/action_cable/runtime_manager.js +108 -0
  229. package/dist/esm/websocket/action_cable/runtime_manager.js.map +1 -0
  230. package/dist/esm/websocket/action_cable_client.d.ts +106 -0
  231. package/dist/esm/websocket/action_cable_client.js +265 -0
  232. package/dist/esm/websocket/action_cable_client.js.map +1 -0
  233. package/dist/esm/websocket/client.d.ts +103 -0
  234. package/dist/esm/websocket/client.js +262 -0
  235. package/dist/esm/websocket/client.js.map +1 -0
  236. package/dist/esm/websocket/errors.d.ts +45 -0
  237. package/dist/esm/websocket/errors.js +94 -0
  238. package/dist/esm/websocket/errors.js.map +1 -0
  239. package/dist/esm/websocket/index.d.ts +13 -0
  240. package/dist/esm/websocket/index.js +16 -0
  241. package/dist/esm/websocket/index.js.map +1 -0
  242. package/dist/esm/websocket/remote_module.d.ts +68 -0
  243. package/dist/esm/websocket/remote_module.js +103 -0
  244. package/dist/esm/websocket/remote_module.js.map +1 -0
  245. package/dist/esm/websocket/remote_word.d.ts +53 -0
  246. package/dist/esm/websocket/remote_word.js +89 -0
  247. package/dist/esm/websocket/remote_word.js.map +1 -0
  248. package/dist/esm/websocket/runtime_manager.d.ts +69 -0
  249. package/dist/esm/websocket/runtime_manager.js +108 -0
  250. package/dist/esm/websocket/runtime_manager.js.map +1 -0
  251. package/dist/esm/websocket/serializer.d.ts +27 -0
  252. package/dist/esm/websocket/serializer.js +100 -0
  253. package/dist/esm/websocket/serializer.js.map +1 -0
  254. package/package.json +37 -6
  255. package/protos/README.md +45 -0
  256. package/protos/v1/forthic_runtime.proto +200 -0
  257. package/dist/cjs/forthic/modules/array_module.js.map +0 -1
  258. package/dist/cjs/forthic/modules/boolean_module.js.map +0 -1
  259. package/dist/cjs/forthic/modules/core_module.js.map +0 -1
  260. package/dist/cjs/forthic/modules/datetime_module.js.map +0 -1
  261. package/dist/cjs/forthic/modules/json_module.js.map +0 -1
  262. package/dist/cjs/forthic/modules/math_module.js.map +0 -1
  263. package/dist/cjs/forthic/modules/record_module.js.map +0 -1
  264. package/dist/cjs/forthic/modules/string_module.js.map +0 -1
  265. package/dist/esm/forthic/modules/array_module.js.map +0 -1
  266. package/dist/esm/forthic/modules/boolean_module.js.map +0 -1
  267. package/dist/esm/forthic/modules/core_module.js.map +0 -1
  268. package/dist/esm/forthic/modules/datetime_module.js.map +0 -1
  269. package/dist/esm/forthic/modules/json_module.js.map +0 -1
  270. package/dist/esm/forthic/modules/math_module.js.map +0 -1
  271. package/dist/esm/forthic/modules/record_module.js.map +0 -1
  272. package/dist/esm/forthic/modules/string_module.js.map +0 -1
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebSocketRemoteWord = void 0;
4
+ /**
5
+ * WebSocketRemoteWord - Word that executes in a remote runtime via ActionCable
6
+ * Mirrors RemoteWord from gRPC implementation
7
+ */
8
+ const module_js_1 = require("../../forthic/module.js");
9
+ /**
10
+ * WebSocketRemoteWord - Proxy word that delegates execution to a remote runtime
11
+ *
12
+ * When executed:
13
+ * 1. Captures current interpreter stack
14
+ * 2. Sends word name + stack to remote runtime via ActionCable
15
+ * 3. Replaces local stack with result stack from remote execution
16
+ *
17
+ * This allows seamless integration of remote runtime words
18
+ * into the local TypeScript interpreter.
19
+ */
20
+ class WebSocketRemoteWord extends module_js_1.Word {
21
+ client;
22
+ runtimeName;
23
+ moduleName;
24
+ stackEffect;
25
+ description;
26
+ /**
27
+ * @param name - Word name (e.g., "DF_FROM_RECORDS")
28
+ * @param client - ActionCable client connected to remote runtime
29
+ * @param runtimeName - Name of remote runtime (e.g., "rails", "ruby")
30
+ * @param moduleName - Module name (e.g., "pandas")
31
+ * @param stackEffect - Stack notation (e.g., "( records:array -- df:DataFrame )")
32
+ * @param description - Human-readable description
33
+ */
34
+ constructor(name, client, runtimeName, moduleName, stackEffect = '( -- )', description = '') {
35
+ super(name);
36
+ this.client = client;
37
+ this.runtimeName = runtimeName;
38
+ this.moduleName = moduleName;
39
+ this.stackEffect = stackEffect;
40
+ this.description = description;
41
+ }
42
+ /**
43
+ * Execute word in remote runtime
44
+ *
45
+ * Captures entire stack, sends to remote runtime, and replaces stack with result.
46
+ */
47
+ async execute(interp) {
48
+ try {
49
+ // Capture current stack state
50
+ const stack = interp.get_stack();
51
+ const stackItems = stack.get_items();
52
+ // Execute word in remote runtime
53
+ const resultStack = await this.client.executeWord(this.name, stackItems);
54
+ // Clear local stack and replace with result
55
+ while (interp.get_stack().length > 0) {
56
+ interp.stack_pop();
57
+ }
58
+ // Push all result items
59
+ for (const item of resultStack) {
60
+ interp.stack_push(item);
61
+ }
62
+ }
63
+ catch (error) {
64
+ throw new Error(`Error executing remote word ${this.moduleName}.${this.name} in ${this.runtimeName} runtime: ${error.message}`);
65
+ }
66
+ }
67
+ /**
68
+ * Get runtime name for debugging/introspection
69
+ */
70
+ getRuntimeName() {
71
+ return this.runtimeName;
72
+ }
73
+ /**
74
+ * Get module name for debugging/introspection
75
+ */
76
+ getModuleName() {
77
+ return this.moduleName;
78
+ }
79
+ /**
80
+ * Get runtime execution information
81
+ * RemoteWords are runtime-specific and can only execute in their designated runtime
82
+ */
83
+ getRuntimeInfo() {
84
+ return {
85
+ runtime: this.runtimeName,
86
+ isRemote: true,
87
+ isStandard: false,
88
+ availableIn: [this.runtimeName]
89
+ };
90
+ }
91
+ }
92
+ exports.WebSocketRemoteWord = WebSocketRemoteWord;
93
+ //# sourceMappingURL=remote_word.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote_word.js","sourceRoot":"","sources":["../../../../src/websocket/action_cable/remote_word.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,uDAA4D;AAI5D;;;;;;;;;;GAUG;AACH,MAAa,mBAAoB,SAAQ,gBAAI;IACnC,MAAM,CAAoB;IAC1B,WAAW,CAAS;IACpB,UAAU,CAAS;IACpB,WAAW,CAAS;IACpB,WAAW,CAAS;IAE3B;;;;;;;OAOG;IACH,YACE,IAAY,EACZ,MAAyB,EACzB,WAAmB,EACnB,UAAkB,EAClB,cAAsB,QAAQ,EAC9B,cAAsB,EAAE;QAExB,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,MAAmB;QAC/B,IAAI,CAAC;YACH,8BAA8B;YAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YACjC,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YAErC,iCAAiC;YACjC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAEzE,4CAA4C;YAC5C,OAAO,MAAM,CAAC,SAAS,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrC,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,CAAC;YAED,wBAAwB;YACxB,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;gBAC/B,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,+BAA+B,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,WAAW,aAAc,KAAe,CAAC,OAAO,EAAE,CAC1H,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,cAAc;QACZ,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,WAAW;YACzB,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,KAAK;YACjB,WAAW,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC;SAChC,CAAC;IACJ,CAAC;CACF;AAvFD,kDAuFC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * WebSocketRuntimeManager - Singleton for managing ActionCable connections to remote runtimes
3
+ *
4
+ * Provides centralized access to ActionCable clients for different runtimes
5
+ * Mirrors the gRPC RuntimeManager API for compatibility
6
+ */
7
+ import { ActionCableClient, ActionCableClientConfig } from './client.js';
8
+ /**
9
+ * WebSocketRuntimeManager - Manages ActionCable connections to remote Forthic runtimes
10
+ */
11
+ export declare class WebSocketRuntimeManager {
12
+ private static instance;
13
+ private clients;
14
+ private constructor();
15
+ /**
16
+ * Get the singleton instance
17
+ */
18
+ static getInstance(): WebSocketRuntimeManager;
19
+ /**
20
+ * Connect to a runtime and register the client
21
+ *
22
+ * @param runtimeName - Name of the runtime (e.g., "rails", "ruby")
23
+ * @param url - ActionCable URL (e.g., "ws://localhost:3000/cable")
24
+ * @param config - Optional additional configuration
25
+ * @returns ActionCableClient instance
26
+ */
27
+ connectRuntime(runtimeName: string, url: string, config?: Partial<ActionCableClientConfig>): ActionCableClient;
28
+ /**
29
+ * Register an ActionCable client for a specific runtime
30
+ *
31
+ * @param runtimeName - Name of the runtime (e.g., "rails", "ruby")
32
+ * @param client - ActionCableClient instance connected to that runtime
33
+ */
34
+ registerClient(runtimeName: string, client: ActionCableClient): void;
35
+ /**
36
+ * Get the ActionCable client for a specific runtime
37
+ *
38
+ * @param runtimeName - Name of the runtime
39
+ * @returns ActionCableClient instance or undefined if not registered
40
+ */
41
+ getClient(runtimeName: string): ActionCableClient | undefined;
42
+ /**
43
+ * Check if a runtime has a registered client
44
+ *
45
+ * @param runtimeName - Name of the runtime
46
+ * @returns True if client is registered
47
+ */
48
+ hasClient(runtimeName: string): boolean;
49
+ /**
50
+ * Get all registered runtime names
51
+ *
52
+ * @returns Array of runtime names
53
+ */
54
+ getRegisteredRuntimes(): string[];
55
+ /**
56
+ * Disconnect a specific runtime
57
+ *
58
+ * @param runtimeName - Name of the runtime to disconnect
59
+ */
60
+ disconnectRuntime(runtimeName: string): void;
61
+ /**
62
+ * Clear all registered clients (useful for testing)
63
+ */
64
+ clearAll(): void;
65
+ /**
66
+ * Reset the singleton (useful for testing)
67
+ */
68
+ static reset(): void;
69
+ }
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebSocketRuntimeManager = void 0;
4
+ /**
5
+ * WebSocketRuntimeManager - Singleton for managing ActionCable connections to remote runtimes
6
+ *
7
+ * Provides centralized access to ActionCable clients for different runtimes
8
+ * Mirrors the gRPC RuntimeManager API for compatibility
9
+ */
10
+ const client_js_1 = require("./client.js");
11
+ /**
12
+ * WebSocketRuntimeManager - Manages ActionCable connections to remote Forthic runtimes
13
+ */
14
+ class WebSocketRuntimeManager {
15
+ static instance = null;
16
+ clients;
17
+ constructor() {
18
+ this.clients = new Map();
19
+ }
20
+ /**
21
+ * Get the singleton instance
22
+ */
23
+ static getInstance() {
24
+ if (!WebSocketRuntimeManager.instance) {
25
+ WebSocketRuntimeManager.instance = new WebSocketRuntimeManager();
26
+ }
27
+ return WebSocketRuntimeManager.instance;
28
+ }
29
+ /**
30
+ * Connect to a runtime and register the client
31
+ *
32
+ * @param runtimeName - Name of the runtime (e.g., "rails", "ruby")
33
+ * @param url - ActionCable URL (e.g., "ws://localhost:3000/cable")
34
+ * @param config - Optional additional configuration
35
+ * @returns ActionCableClient instance
36
+ */
37
+ connectRuntime(runtimeName, url, config) {
38
+ // Create a new client for the runtime
39
+ const client = new client_js_1.ActionCableClient({ url, ...config });
40
+ // Register it
41
+ this.clients.set(runtimeName, client);
42
+ return client;
43
+ }
44
+ /**
45
+ * Register an ActionCable client for a specific runtime
46
+ *
47
+ * @param runtimeName - Name of the runtime (e.g., "rails", "ruby")
48
+ * @param client - ActionCableClient instance connected to that runtime
49
+ */
50
+ registerClient(runtimeName, client) {
51
+ this.clients.set(runtimeName, client);
52
+ }
53
+ /**
54
+ * Get the ActionCable client for a specific runtime
55
+ *
56
+ * @param runtimeName - Name of the runtime
57
+ * @returns ActionCableClient instance or undefined if not registered
58
+ */
59
+ getClient(runtimeName) {
60
+ return this.clients.get(runtimeName);
61
+ }
62
+ /**
63
+ * Check if a runtime has a registered client
64
+ *
65
+ * @param runtimeName - Name of the runtime
66
+ * @returns True if client is registered
67
+ */
68
+ hasClient(runtimeName) {
69
+ return this.clients.has(runtimeName);
70
+ }
71
+ /**
72
+ * Get all registered runtime names
73
+ *
74
+ * @returns Array of runtime names
75
+ */
76
+ getRegisteredRuntimes() {
77
+ return Array.from(this.clients.keys());
78
+ }
79
+ /**
80
+ * Disconnect a specific runtime
81
+ *
82
+ * @param runtimeName - Name of the runtime to disconnect
83
+ */
84
+ disconnectRuntime(runtimeName) {
85
+ const client = this.clients.get(runtimeName);
86
+ if (client) {
87
+ client.close();
88
+ this.clients.delete(runtimeName);
89
+ }
90
+ }
91
+ /**
92
+ * Clear all registered clients (useful for testing)
93
+ */
94
+ clearAll() {
95
+ // Close all clients
96
+ for (const client of this.clients.values()) {
97
+ client.close();
98
+ }
99
+ this.clients.clear();
100
+ }
101
+ /**
102
+ * Reset the singleton (useful for testing)
103
+ */
104
+ static reset() {
105
+ if (WebSocketRuntimeManager.instance) {
106
+ WebSocketRuntimeManager.instance.clearAll();
107
+ WebSocketRuntimeManager.instance = null;
108
+ }
109
+ }
110
+ }
111
+ exports.WebSocketRuntimeManager = WebSocketRuntimeManager;
112
+ //# sourceMappingURL=runtime_manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime_manager.js","sourceRoot":"","sources":["../../../../src/websocket/action_cable/runtime_manager.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACH,2CAAyE;AAEzE;;GAEG;AACH,MAAa,uBAAuB;IAC1B,MAAM,CAAC,QAAQ,GAAmC,IAAI,CAAC;IACvD,OAAO,CAAiC;IAEhD;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,CAAC;YACtC,uBAAuB,CAAC,QAAQ,GAAG,IAAI,uBAAuB,EAAE,CAAC;QACnE,CAAC;QACD,OAAO,uBAAuB,CAAC,QAAQ,CAAC;IAC1C,CAAC;IAED;;;;;;;OAOG;IACH,cAAc,CACZ,WAAmB,EACnB,GAAW,EACX,MAAyC;QAEzC,sCAAsC;QACtC,MAAM,MAAM,GAAG,IAAI,6BAAiB,CAAC,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QAEzD,cAAc;QACd,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAEtC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACH,cAAc,CAAC,WAAmB,EAAE,MAAyB;QAC3D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED;;;;;OAKG;IACH,SAAS,CAAC,WAAmB;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC;IAED;;;;;OAKG;IACH,SAAS,CAAC,WAAmB;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACH,qBAAqB;QACnB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED;;;;OAIG;IACH,iBAAiB,CAAC,WAAmB;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC7C,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,oBAAoB;QACpB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK;QACV,IAAI,uBAAuB,CAAC,QAAQ,EAAE,CAAC;YACrC,uBAAuB,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YAC5C,uBAAuB,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC1C,CAAC;IACH,CAAC;;AA/GH,0DAgHC"}
@@ -0,0 +1,106 @@
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
+ }
@@ -0,0 +1,269 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action_cable_client.js","sourceRoot":"","sources":["../../../src/websocket/action_cable_client.ts"],"names":[],"mappings":"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"}