speechflow 1.5.1 → 1.6.1

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 (232) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +192 -171
  3. package/etc/claude.md +83 -46
  4. package/etc/speechflow.yaml +84 -84
  5. package/package.json +3 -3
  6. package/speechflow-cli/dst/speechflow-main-api.d.ts +12 -0
  7. package/speechflow-cli/dst/speechflow-main-api.js +319 -0
  8. package/speechflow-cli/dst/speechflow-main-api.js.map +1 -0
  9. package/speechflow-cli/dst/speechflow-main-cli.d.ts +28 -0
  10. package/speechflow-cli/dst/speechflow-main-cli.js +271 -0
  11. package/speechflow-cli/dst/speechflow-main-cli.js.map +1 -0
  12. package/speechflow-cli/dst/speechflow-main-config.d.ts +9 -0
  13. package/speechflow-cli/dst/speechflow-main-config.js +27 -0
  14. package/speechflow-cli/dst/speechflow-main-config.js.map +1 -0
  15. package/speechflow-cli/dst/speechflow-main-graph.d.ts +34 -0
  16. package/speechflow-cli/dst/speechflow-main-graph.js +367 -0
  17. package/speechflow-cli/dst/speechflow-main-graph.js.map +1 -0
  18. package/speechflow-cli/dst/speechflow-main-nodes.d.ts +10 -0
  19. package/speechflow-cli/dst/speechflow-main-nodes.js +60 -0
  20. package/speechflow-cli/dst/speechflow-main-nodes.js.map +1 -0
  21. package/speechflow-cli/dst/speechflow-main-status.d.ts +11 -0
  22. package/speechflow-cli/dst/speechflow-main-status.js +60 -0
  23. package/speechflow-cli/dst/speechflow-main-status.js.map +1 -0
  24. package/speechflow-cli/dst/speechflow-main.d.ts +7 -0
  25. package/speechflow-cli/dst/speechflow-main.js +127 -0
  26. package/speechflow-cli/dst/speechflow-main.js.map +1 -0
  27. package/speechflow-cli/dst/speechflow-node-a2a-compressor-wt.js +4 -4
  28. package/speechflow-cli/dst/speechflow-node-a2a-compressor-wt.js.map +1 -1
  29. package/speechflow-cli/dst/speechflow-node-a2a-compressor.d.ts +1 -1
  30. package/speechflow-cli/dst/speechflow-node-a2a-compressor.js +8 -9
  31. package/speechflow-cli/dst/speechflow-node-a2a-compressor.js.map +1 -1
  32. package/speechflow-cli/dst/speechflow-node-a2a-expander-wt.js +5 -5
  33. package/speechflow-cli/dst/speechflow-node-a2a-expander-wt.js.map +1 -1
  34. package/speechflow-cli/dst/speechflow-node-a2a-expander.d.ts +1 -1
  35. package/speechflow-cli/dst/speechflow-node-a2a-expander.js +8 -9
  36. package/speechflow-cli/dst/speechflow-node-a2a-expander.js.map +1 -1
  37. package/speechflow-cli/dst/speechflow-node-a2a-ffmpeg.d.ts +1 -1
  38. package/speechflow-cli/dst/speechflow-node-a2a-ffmpeg.js +8 -8
  39. package/speechflow-cli/dst/speechflow-node-a2a-ffmpeg.js.map +1 -1
  40. package/speechflow-cli/dst/speechflow-node-a2a-filler.d.ts +1 -1
  41. package/speechflow-cli/dst/speechflow-node-a2a-filler.js +6 -6
  42. package/speechflow-cli/dst/speechflow-node-a2a-filler.js.map +1 -1
  43. package/speechflow-cli/dst/speechflow-node-a2a-gain.d.ts +1 -1
  44. package/speechflow-cli/dst/speechflow-node-a2a-gain.js +5 -5
  45. package/speechflow-cli/dst/speechflow-node-a2a-gain.js.map +1 -1
  46. package/speechflow-cli/dst/speechflow-node-a2a-gender.d.ts +1 -1
  47. package/speechflow-cli/dst/speechflow-node-a2a-gender.js +7 -7
  48. package/speechflow-cli/dst/speechflow-node-a2a-gender.js.map +1 -1
  49. package/speechflow-cli/dst/speechflow-node-a2a-meter.d.ts +1 -1
  50. package/speechflow-cli/dst/speechflow-node-a2a-meter.js +5 -5
  51. package/speechflow-cli/dst/speechflow-node-a2a-meter.js.map +1 -1
  52. package/speechflow-cli/dst/speechflow-node-a2a-mute.d.ts +1 -1
  53. package/speechflow-cli/dst/speechflow-node-a2a-mute.js +3 -3
  54. package/speechflow-cli/dst/speechflow-node-a2a-mute.js.map +1 -1
  55. package/speechflow-cli/dst/speechflow-node-a2a-rnnoise.d.ts +1 -1
  56. package/speechflow-cli/dst/speechflow-node-a2a-rnnoise.js +7 -7
  57. package/speechflow-cli/dst/speechflow-node-a2a-rnnoise.js.map +1 -1
  58. package/speechflow-cli/dst/speechflow-node-a2a-speex.d.ts +1 -1
  59. package/speechflow-cli/dst/speechflow-node-a2a-speex.js +7 -7
  60. package/speechflow-cli/dst/speechflow-node-a2a-speex.js.map +1 -1
  61. package/speechflow-cli/dst/speechflow-node-a2a-vad.d.ts +1 -1
  62. package/speechflow-cli/dst/speechflow-node-a2a-vad.js +7 -7
  63. package/speechflow-cli/dst/speechflow-node-a2a-vad.js.map +1 -1
  64. package/speechflow-cli/dst/speechflow-node-a2a-wav.d.ts +1 -1
  65. package/speechflow-cli/dst/speechflow-node-a2a-wav.js +3 -3
  66. package/speechflow-cli/dst/speechflow-node-a2a-wav.js.map +1 -1
  67. package/speechflow-cli/dst/{speechflow-node-a2t-awstranscribe.d.ts → speechflow-node-a2t-amazon.d.ts} +1 -1
  68. package/speechflow-cli/dst/{speechflow-node-a2t-awstranscribe.js → speechflow-node-a2t-amazon.js} +11 -11
  69. package/speechflow-cli/dst/speechflow-node-a2t-amazon.js.map +1 -0
  70. package/speechflow-cli/dst/speechflow-node-a2t-deepgram.d.ts +1 -1
  71. package/speechflow-cli/dst/speechflow-node-a2t-deepgram.js +7 -7
  72. package/speechflow-cli/dst/speechflow-node-a2t-deepgram.js.map +1 -1
  73. package/speechflow-cli/dst/{speechflow-node-a2t-openaitranscribe.d.ts → speechflow-node-a2t-openai.d.ts} +1 -1
  74. package/speechflow-cli/dst/{speechflow-node-a2t-openaitranscribe.js → speechflow-node-a2t-openai.js} +11 -11
  75. package/speechflow-cli/dst/speechflow-node-a2t-openai.js.map +1 -0
  76. package/speechflow-cli/dst/{speechflow-node-t2a-awspolly.d.ts → speechflow-node-t2a-amazon.d.ts} +1 -1
  77. package/speechflow-cli/dst/{speechflow-node-t2a-awspolly.js → speechflow-node-t2a-amazon.js} +9 -9
  78. package/speechflow-cli/dst/speechflow-node-t2a-amazon.js.map +1 -0
  79. package/speechflow-cli/dst/speechflow-node-t2a-elevenlabs.d.ts +1 -1
  80. package/speechflow-cli/dst/speechflow-node-t2a-elevenlabs.js +5 -5
  81. package/speechflow-cli/dst/speechflow-node-t2a-elevenlabs.js.map +1 -1
  82. package/speechflow-cli/dst/speechflow-node-t2a-kokoro.d.ts +1 -1
  83. package/speechflow-cli/dst/speechflow-node-t2a-kokoro.js +7 -7
  84. package/speechflow-cli/dst/speechflow-node-t2a-kokoro.js.map +1 -1
  85. package/speechflow-cli/dst/{speechflow-node-t2t-awstranslate.d.ts → speechflow-node-t2t-amazon.d.ts} +1 -1
  86. package/speechflow-cli/dst/{speechflow-node-t2t-awstranslate.js → speechflow-node-t2t-amazon.js} +7 -7
  87. package/speechflow-cli/dst/speechflow-node-t2t-amazon.js.map +1 -0
  88. package/speechflow-cli/dst/speechflow-node-t2t-deepl.d.ts +1 -1
  89. package/speechflow-cli/dst/speechflow-node-t2t-deepl.js +5 -5
  90. package/speechflow-cli/dst/speechflow-node-t2t-deepl.js.map +1 -1
  91. package/speechflow-cli/dst/speechflow-node-t2t-format.d.ts +1 -1
  92. package/speechflow-cli/dst/speechflow-node-t2t-format.js +3 -3
  93. package/speechflow-cli/dst/speechflow-node-t2t-format.js.map +1 -1
  94. package/speechflow-cli/dst/speechflow-node-t2t-google.d.ts +1 -1
  95. package/speechflow-cli/dst/speechflow-node-t2t-google.js +8 -8
  96. package/speechflow-cli/dst/speechflow-node-t2t-google.js.map +1 -1
  97. package/speechflow-cli/dst/{speechflow-node-a2a-dynamics.d.ts → speechflow-node-t2t-modify.d.ts} +1 -5
  98. package/speechflow-cli/dst/speechflow-node-t2t-modify.js +111 -0
  99. package/speechflow-cli/dst/speechflow-node-t2t-modify.js.map +1 -0
  100. package/speechflow-cli/dst/speechflow-node-t2t-ollama.d.ts +1 -1
  101. package/speechflow-cli/dst/speechflow-node-t2t-ollama.js +5 -5
  102. package/speechflow-cli/dst/speechflow-node-t2t-ollama.js.map +1 -1
  103. package/speechflow-cli/dst/speechflow-node-t2t-openai.d.ts +1 -1
  104. package/speechflow-cli/dst/speechflow-node-t2t-openai.js +5 -5
  105. package/speechflow-cli/dst/speechflow-node-t2t-openai.js.map +1 -1
  106. package/speechflow-cli/dst/speechflow-node-t2t-sentence.d.ts +1 -1
  107. package/speechflow-cli/dst/speechflow-node-t2t-sentence.js +5 -5
  108. package/speechflow-cli/dst/speechflow-node-t2t-sentence.js.map +1 -1
  109. package/speechflow-cli/dst/speechflow-node-t2t-subtitle.d.ts +1 -1
  110. package/speechflow-cli/dst/speechflow-node-t2t-subtitle.js +5 -5
  111. package/speechflow-cli/dst/speechflow-node-t2t-subtitle.js.map +1 -1
  112. package/speechflow-cli/dst/speechflow-node-t2t-transformers.d.ts +1 -1
  113. package/speechflow-cli/dst/speechflow-node-t2t-transformers.js +5 -5
  114. package/speechflow-cli/dst/speechflow-node-t2t-transformers.js.map +1 -1
  115. package/speechflow-cli/dst/speechflow-node-x2x-filter.d.ts +1 -1
  116. package/speechflow-cli/dst/speechflow-node-x2x-filter.js +5 -5
  117. package/speechflow-cli/dst/speechflow-node-x2x-filter.js.map +1 -1
  118. package/speechflow-cli/dst/speechflow-node-x2x-trace.d.ts +1 -1
  119. package/speechflow-cli/dst/speechflow-node-x2x-trace.js +3 -3
  120. package/speechflow-cli/dst/speechflow-node-x2x-trace.js.map +1 -1
  121. package/speechflow-cli/dst/speechflow-node-xio-device.d.ts +1 -1
  122. package/speechflow-cli/dst/speechflow-node-xio-device.js +8 -8
  123. package/speechflow-cli/dst/speechflow-node-xio-device.js.map +1 -1
  124. package/speechflow-cli/dst/speechflow-node-xio-file.d.ts +1 -1
  125. package/speechflow-cli/dst/speechflow-node-xio-file.js +50 -29
  126. package/speechflow-cli/dst/speechflow-node-xio-file.js.map +1 -1
  127. package/speechflow-cli/dst/speechflow-node-xio-mqtt.d.ts +1 -1
  128. package/speechflow-cli/dst/speechflow-node-xio-mqtt.js +7 -7
  129. package/speechflow-cli/dst/speechflow-node-xio-mqtt.js.map +1 -1
  130. package/speechflow-cli/dst/speechflow-node-xio-websocket.d.ts +1 -1
  131. package/speechflow-cli/dst/speechflow-node-xio-websocket.js +10 -10
  132. package/speechflow-cli/dst/speechflow-node-xio-websocket.js.map +1 -1
  133. package/speechflow-cli/dst/{speechflow-utils-audio-wt.js → speechflow-util-audio-wt.js} +1 -1
  134. package/speechflow-cli/dst/speechflow-util-audio-wt.js.map +1 -0
  135. package/speechflow-cli/dst/speechflow-util-audio.d.ts +22 -0
  136. package/speechflow-cli/dst/speechflow-util-audio.js +251 -0
  137. package/speechflow-cli/dst/speechflow-util-audio.js.map +1 -0
  138. package/speechflow-cli/dst/speechflow-util-error.d.ts +14 -0
  139. package/speechflow-cli/dst/speechflow-util-error.js +131 -0
  140. package/speechflow-cli/dst/speechflow-util-error.js.map +1 -0
  141. package/speechflow-cli/dst/speechflow-util-queue.d.ts +68 -0
  142. package/speechflow-cli/dst/speechflow-util-queue.js +338 -0
  143. package/speechflow-cli/dst/speechflow-util-queue.js.map +1 -0
  144. package/speechflow-cli/dst/speechflow-util-stream.d.ts +18 -0
  145. package/speechflow-cli/dst/speechflow-util-stream.js +219 -0
  146. package/speechflow-cli/dst/speechflow-util-stream.js.map +1 -0
  147. package/speechflow-cli/dst/speechflow-util-webaudio-wt.js +124 -0
  148. package/speechflow-cli/dst/speechflow-util-webaudio-wt.js.map +1 -0
  149. package/speechflow-cli/dst/{speechflow-utils-audio.js → speechflow-util-webaudio.js} +2 -2
  150. package/speechflow-cli/dst/speechflow-util-webaudio.js.map +1 -0
  151. package/speechflow-cli/dst/speechflow-util.d.ts +4 -0
  152. package/speechflow-cli/dst/speechflow-util.js +26 -0
  153. package/speechflow-cli/dst/speechflow-util.js.map +1 -0
  154. package/speechflow-cli/dst/speechflow.js +3 -906
  155. package/speechflow-cli/dst/speechflow.js.map +1 -1
  156. package/speechflow-cli/etc/oxlint.jsonc +4 -1
  157. package/speechflow-cli/package.json +12 -11
  158. package/speechflow-cli/src/speechflow-main-api.ts +315 -0
  159. package/speechflow-cli/src/speechflow-main-cli.ts +259 -0
  160. package/speechflow-cli/src/speechflow-main-config.ts +17 -0
  161. package/speechflow-cli/src/speechflow-main-graph.ts +372 -0
  162. package/speechflow-cli/src/speechflow-main-nodes.ts +61 -0
  163. package/speechflow-cli/src/speechflow-main-status.ts +70 -0
  164. package/speechflow-cli/src/speechflow-main.ts +106 -0
  165. package/speechflow-cli/src/speechflow-node-a2a-compressor-wt.ts +4 -4
  166. package/speechflow-cli/src/speechflow-node-a2a-compressor.ts +7 -8
  167. package/speechflow-cli/src/speechflow-node-a2a-expander-wt.ts +5 -5
  168. package/speechflow-cli/src/speechflow-node-a2a-expander.ts +7 -8
  169. package/speechflow-cli/src/speechflow-node-a2a-ffmpeg.ts +7 -7
  170. package/speechflow-cli/src/speechflow-node-a2a-filler.ts +6 -6
  171. package/speechflow-cli/src/speechflow-node-a2a-gain.ts +4 -4
  172. package/speechflow-cli/src/speechflow-node-a2a-gender.ts +6 -6
  173. package/speechflow-cli/src/speechflow-node-a2a-meter.ts +4 -4
  174. package/speechflow-cli/src/speechflow-node-a2a-mute.ts +2 -2
  175. package/speechflow-cli/src/speechflow-node-a2a-rnnoise.ts +6 -6
  176. package/speechflow-cli/src/speechflow-node-a2a-speex.ts +6 -6
  177. package/speechflow-cli/src/speechflow-node-a2a-vad.ts +6 -6
  178. package/speechflow-cli/src/speechflow-node-a2a-wav.ts +2 -2
  179. package/speechflow-cli/src/{speechflow-node-a2t-awstranscribe.ts → speechflow-node-a2t-amazon.ts} +10 -10
  180. package/speechflow-cli/src/speechflow-node-a2t-deepgram.ts +7 -7
  181. package/speechflow-cli/src/{speechflow-node-a2t-openaitranscribe.ts → speechflow-node-a2t-openai.ts} +10 -10
  182. package/speechflow-cli/src/{speechflow-node-t2a-awspolly.ts → speechflow-node-t2a-amazon.ts} +7 -7
  183. package/speechflow-cli/src/speechflow-node-t2a-elevenlabs.ts +4 -4
  184. package/speechflow-cli/src/speechflow-node-t2a-kokoro.ts +6 -6
  185. package/speechflow-cli/src/{speechflow-node-t2t-awstranslate.ts → speechflow-node-t2t-amazon.ts} +5 -5
  186. package/speechflow-cli/src/speechflow-node-t2t-deepl.ts +4 -4
  187. package/speechflow-cli/src/speechflow-node-t2t-format.ts +2 -2
  188. package/speechflow-cli/src/speechflow-node-t2t-google.ts +7 -7
  189. package/speechflow-cli/src/speechflow-node-t2t-modify.ts +84 -0
  190. package/speechflow-cli/src/speechflow-node-t2t-ollama.ts +4 -4
  191. package/speechflow-cli/src/speechflow-node-t2t-openai.ts +4 -4
  192. package/speechflow-cli/src/speechflow-node-t2t-sentence.ts +4 -4
  193. package/speechflow-cli/src/speechflow-node-t2t-subtitle.ts +9 -9
  194. package/speechflow-cli/src/speechflow-node-t2t-transformers.ts +4 -4
  195. package/speechflow-cli/src/speechflow-node-x2x-filter.ts +4 -4
  196. package/speechflow-cli/src/speechflow-node-x2x-trace.ts +2 -2
  197. package/speechflow-cli/src/speechflow-node-xio-device.ts +7 -7
  198. package/speechflow-cli/src/speechflow-node-xio-file.ts +49 -28
  199. package/speechflow-cli/src/speechflow-node-xio-mqtt.ts +7 -7
  200. package/speechflow-cli/src/speechflow-node-xio-websocket.ts +9 -9
  201. package/speechflow-cli/src/{speechflow-utils-audio.ts → speechflow-util-audio.ts} +131 -1
  202. package/speechflow-cli/src/speechflow-util-error.ts +184 -0
  203. package/speechflow-cli/src/speechflow-util-queue.ts +320 -0
  204. package/speechflow-cli/src/speechflow-util-stream.ts +197 -0
  205. package/speechflow-cli/src/speechflow-util.ts +10 -0
  206. package/speechflow-cli/src/speechflow.ts +3 -947
  207. package/speechflow-ui-db/package.json +3 -3
  208. package/speechflow-ui-st/dst/app-font-fa-brands-400.woff2 +0 -0
  209. package/speechflow-ui-st/dst/app-font-fa-regular-400.woff2 +0 -0
  210. package/speechflow-ui-st/dst/app-font-fa-solid-900.woff2 +0 -0
  211. package/speechflow-ui-st/dst/app-font-fa-v4compatibility.woff2 +0 -0
  212. package/speechflow-ui-st/dst/index.css +2 -2
  213. package/speechflow-ui-st/dst/index.js +32 -33
  214. package/speechflow-ui-st/package.json +4 -4
  215. package/speechflow-cli/dst/speechflow-node-a2a-dynamics-wt.js +0 -208
  216. package/speechflow-cli/dst/speechflow-node-a2a-dynamics-wt.js.map +0 -1
  217. package/speechflow-cli/dst/speechflow-node-a2a-dynamics.js +0 -312
  218. package/speechflow-cli/dst/speechflow-node-a2a-dynamics.js.map +0 -1
  219. package/speechflow-cli/dst/speechflow-node-a2t-awstranscribe.js.map +0 -1
  220. package/speechflow-cli/dst/speechflow-node-a2t-openaitranscribe.js.map +0 -1
  221. package/speechflow-cli/dst/speechflow-node-t2a-awspolly.js.map +0 -1
  222. package/speechflow-cli/dst/speechflow-node-t2t-awstranslate.js.map +0 -1
  223. package/speechflow-cli/dst/speechflow-utils-audio-wt.js.map +0 -1
  224. package/speechflow-cli/dst/speechflow-utils-audio.js.map +0 -1
  225. package/speechflow-cli/dst/speechflow-utils.d.ts +0 -108
  226. package/speechflow-cli/dst/speechflow-utils.js +0 -740
  227. package/speechflow-cli/dst/speechflow-utils.js.map +0 -1
  228. package/speechflow-cli/src/speechflow-utils.ts +0 -804
  229. /package/speechflow-cli/dst/{speechflow-node-a2a-dynamics-wt.d.ts → speechflow-util-audio-wt.d.ts} +0 -0
  230. /package/speechflow-cli/dst/{speechflow-utils-audio-wt.d.ts → speechflow-util-webaudio-wt.d.ts} +0 -0
  231. /package/speechflow-cli/dst/{speechflow-utils-audio.d.ts → speechflow-util-webaudio.d.ts} +0 -0
  232. /package/speechflow-cli/src/{speechflow-utils-audio-wt.ts → speechflow-util-audio-wt.ts} +0 -0
@@ -0,0 +1,319 @@
1
+ "use strict";
2
+ /*
3
+ ** SpeechFlow - Speech Processing Flow Graph
4
+ ** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
5
+ ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ var __importDefault = (this && this.__importDefault) || function (mod) {
41
+ return (mod && mod.__esModule) ? mod : { "default": mod };
42
+ };
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.APIServer = void 0;
45
+ /* standard dependencies */
46
+ const node_path_1 = __importDefault(require("node:path"));
47
+ /* external dependencies */
48
+ const HAPI = __importStar(require("@hapi/hapi"));
49
+ const inert_1 = __importDefault(require("@hapi/inert"));
50
+ const ws_1 = __importDefault(require("ws"));
51
+ const hapi_plugin_websocket_1 = __importDefault(require("hapi-plugin-websocket"));
52
+ const hapi_plugin_header_1 = __importDefault(require("hapi-plugin-header"));
53
+ const osc_js_1 = __importDefault(require("osc-js"));
54
+ const arktype = __importStar(require("arktype"));
55
+ /* internal dependencies */
56
+ const util = __importStar(require("./speechflow-util"));
57
+ const package_json_1 = __importDefault(require("../../package.json"));
58
+ /* Application Programming Interface (API) server management class */
59
+ class APIServer {
60
+ cli;
61
+ /* internal state */
62
+ wsPeers = new Map();
63
+ hapi = null;
64
+ sendOSC = null;
65
+ /* creation */
66
+ constructor(cli) {
67
+ this.cli = cli;
68
+ }
69
+ /* start API server service */
70
+ async start(args, graph) {
71
+ /* define external request/response structure */
72
+ const requestValidator = arktype.type({
73
+ request: "string",
74
+ node: "string",
75
+ args: "unknown[]"
76
+ });
77
+ /* forward external request to target node in graph */
78
+ const consumeExternalRequest = async (_req) => {
79
+ const req = requestValidator(_req);
80
+ if (req instanceof arktype.type.errors)
81
+ throw new Error(`invalid request: ${req.summary}`);
82
+ if (req.request !== "COMMAND")
83
+ throw new Error("invalid external request (command expected)");
84
+ const name = req.node;
85
+ const argList = req.args;
86
+ const foundNode = graph.findGraphNode(name);
87
+ if (foundNode === undefined) {
88
+ this.cli.log("warning", `external request failed: no such node <${name}>`);
89
+ throw new Error(`external request failed: no such node <${name}>`);
90
+ }
91
+ else {
92
+ await Promise.race([
93
+ foundNode.receiveRequest(argList),
94
+ new Promise((resolve, reject) => setTimeout(() => reject(new Error("timeout")), 10 * 1000))
95
+ ]).catch((err) => {
96
+ this.cli.log("warning", `external request to node <${name}> failed: ${err.message}`);
97
+ });
98
+ }
99
+ };
100
+ /* establish REST/WebSocket API */
101
+ this.hapi = new HAPI.Server({
102
+ address: args.a,
103
+ port: args.p
104
+ });
105
+ await this.hapi.register({ plugin: inert_1.default });
106
+ await this.hapi.register({ plugin: hapi_plugin_header_1.default, options: { Server: `${package_json_1.default.name}/${package_json_1.default.version}` } });
107
+ await this.hapi.register({ plugin: hapi_plugin_websocket_1.default });
108
+ this.hapi.events.on("response", (request) => {
109
+ let protocol = `HTTP/${request.raw.req.httpVersion}`;
110
+ const ws = request.websocket();
111
+ if (ws.mode === "websocket") {
112
+ const wsVersion = ws.ws.protocolVersion ??
113
+ request.headers["sec-websocket-version"] ?? "13?";
114
+ protocol = `WebSocket/${wsVersion}+${protocol}`;
115
+ }
116
+ const msg = "remote=" + request.info.remoteAddress + ", " +
117
+ "method=" + request.method.toUpperCase() + ", " +
118
+ "url=" + request.url.pathname + ", " +
119
+ "protocol=" + protocol + ", " +
120
+ "response=" + ("statusCode" in request.response ? request.response.statusCode : "<unknown>");
121
+ this.cli.log("info", `HAPI: request: ${msg}`);
122
+ });
123
+ this.hapi.events.on({ name: "request", channels: ["error"] }, (request, event, tags) => {
124
+ if (event.error instanceof Error)
125
+ this.cli.log("error", `HAPI: request-error: ${event.error.message}`);
126
+ else
127
+ this.cli.log("error", `HAPI: request-error: ${event.error}`);
128
+ });
129
+ this.hapi.events.on("log", (event, tags) => {
130
+ if (tags.error) {
131
+ const err = event.error;
132
+ if (err instanceof Error)
133
+ this.cli.log("error", `HAPI: log: ${err.message}`);
134
+ else
135
+ this.cli.log("error", `HAPI: log: ${err}`);
136
+ }
137
+ });
138
+ /* define REST/WebSocket API endpoints */
139
+ this.hapi.route({
140
+ method: "GET",
141
+ path: "/{param*}",
142
+ handler: {
143
+ directory: {
144
+ path: node_path_1.default.join(__dirname, "../../speechflow-ui-db/dst"),
145
+ redirectToSlash: true,
146
+ index: true
147
+ }
148
+ }
149
+ });
150
+ this.hapi.route({
151
+ method: "GET",
152
+ path: "/api/dashboard",
153
+ handler: (request, h) => {
154
+ const config = [];
155
+ for (const block of args.d.split(",")) {
156
+ const [type, id, name] = block.split(":");
157
+ config.push({ type, id, name });
158
+ }
159
+ return h.response(config).code(200);
160
+ }
161
+ });
162
+ this.hapi.route({
163
+ method: "GET",
164
+ path: "/api/{req}/{node}/{params*}",
165
+ options: {},
166
+ handler: (request, h) => {
167
+ const peer = request.info.remoteAddress;
168
+ const params = request.params.params ?? "";
169
+ if (params.length > 1000)
170
+ return h.response({ response: "ERROR", data: "parameters too long" }).code(400);
171
+ const req = {
172
+ request: request.params.req,
173
+ node: request.params.node,
174
+ args: params.split("/").filter((seg) => seg !== "")
175
+ };
176
+ this.cli.log("info", `HAPI: peer ${peer}: GET: ${JSON.stringify(req)}`);
177
+ return consumeExternalRequest(req)
178
+ .then(() => h.response({ response: "OK" }).code(200))
179
+ .catch((error) => h.response({ response: "ERROR", data: util.ensureError(error).message }).code(417));
180
+ }
181
+ });
182
+ this.hapi.route({
183
+ method: "POST",
184
+ path: "/api",
185
+ options: {
186
+ payload: {
187
+ output: "data",
188
+ parse: true,
189
+ allow: "application/json",
190
+ maxBytes: 1 * 1024 * 1024
191
+ },
192
+ plugins: {
193
+ websocket: {
194
+ autoping: 30 * 1000,
195
+ connect: (argList) => {
196
+ const ctx = argList.ctx;
197
+ const ws = argList.ws;
198
+ const req = argList.req;
199
+ const peer = `${req.socket.remoteAddress}:${req.socket.remotePort}`;
200
+ ctx.peer = peer;
201
+ this.wsPeers.set(peer, { ctx, ws, req });
202
+ this.cli.log("info", `HAPI: WebSocket: connect: peer ${peer}`);
203
+ },
204
+ disconnect: (argList) => {
205
+ const ctx = argList.ctx;
206
+ const ws = argList.ws;
207
+ const peer = ctx.peer;
208
+ this.wsPeers.delete(peer);
209
+ ws.removeAllListeners();
210
+ if (ws.readyState === ws_1.default.OPEN)
211
+ ws.close();
212
+ this.cli.log("info", `HAPI: WebSocket: disconnect: peer ${peer}`);
213
+ }
214
+ }
215
+ }
216
+ },
217
+ handler: (request, h) => {
218
+ /* on WebSocket message transfer */
219
+ const peer = request.info.remoteAddress;
220
+ const req = requestValidator(request.payload);
221
+ if (req instanceof arktype.type.errors)
222
+ return h.response({ response: "ERROR", data: `invalid request: ${req.summary}` }).code(417);
223
+ this.cli.log("info", `HAPI: peer ${peer}: POST: ${JSON.stringify(req)}`);
224
+ return consumeExternalRequest(req)
225
+ .then(() => h.response({ response: "OK" }).code(200))
226
+ .catch((err) => h.response({ response: "ERROR", data: err.message }).code(417));
227
+ }
228
+ });
229
+ /* start up REST/WebSockets service */
230
+ await this.hapi.start();
231
+ this.cli.log("info", `HAPI: started REST/WebSocket network service: http://${args.a}:${args.p}`);
232
+ /* hook for sendResponse method of nodes */
233
+ for (const node of graph.getGraphNodes()) {
234
+ node.on("send-response", (argList) => {
235
+ const data = JSON.stringify({ response: "NOTIFY", node: node.id, args: argList });
236
+ for (const [peer, info] of this.wsPeers.entries()) {
237
+ this.cli.log("debug", `HAPI: remote peer ${peer}: sending ${data}`);
238
+ if (info.ws.readyState === ws_1.default.OPEN)
239
+ info.ws.send(data);
240
+ }
241
+ });
242
+ }
243
+ /* establish Open State Control (OSC) event emission */
244
+ if (args.o !== "") {
245
+ const osc = new osc_js_1.default({ plugin: new osc_js_1.default.DatagramPlugin({ type: "udp4" }) });
246
+ const m = args.o.match(/^(.+?):(\d+)$/);
247
+ if (m === null)
248
+ throw new Error("invalid OSC/UDP endpoint (expected <ip-adress>:<udp-port>)");
249
+ const host = m[1];
250
+ const port = m[2];
251
+ this.sendOSC = (url, ...argList) => {
252
+ const msg = new osc_js_1.default.Message(url, ...argList);
253
+ osc.send(msg, { host, port });
254
+ };
255
+ }
256
+ /* hook for send-dashboard method of nodes */
257
+ for (const node of graph.getGraphNodes()) {
258
+ node.on("send-dashboard", (info) => {
259
+ const data = JSON.stringify({
260
+ response: "DASHBOARD",
261
+ node: "",
262
+ args: [info.type, info.id, info.kind, info.value]
263
+ });
264
+ for (const [peer, info] of this.wsPeers.entries()) {
265
+ this.cli.log("debug", `HAPI: dashboard peer ${peer}: send ${data}`);
266
+ info.ws.send(data);
267
+ }
268
+ for (const n of graph.getGraphNodes()) {
269
+ Promise.race([
270
+ n.receiveDashboard(info.type, info.id, info.kind, info.value),
271
+ new Promise((resolve, reject) => setTimeout(() => reject(new Error("timeout")), 10 * 1000))
272
+ ]).catch((err) => {
273
+ this.cli.log("warning", `sending dashboard info to node <${n.id}> failed: ${err.message}`);
274
+ });
275
+ }
276
+ if (args.o !== "" && this.sendOSC)
277
+ this.sendOSC("/speechflow/dashboard", info.type, info.id, info.kind, info.value);
278
+ });
279
+ }
280
+ }
281
+ /* stop API server service */
282
+ async stop(args) {
283
+ /* shutdown HAPI service */
284
+ if (this.hapi) {
285
+ this.cli.log("info", `HAPI: stopping REST/WebSocket network service: http://${args.a}:${args.p}`);
286
+ await this.hapi.stop({ timeout: 2000 });
287
+ }
288
+ /* clear WebSocket connections */
289
+ if (this.wsPeers.size > 0) {
290
+ this.cli.log("info", "HAPI: closing WebSocket connections");
291
+ const closePromises = [];
292
+ for (const [peer, info] of this.wsPeers.entries()) {
293
+ closePromises.push(new Promise((resolve, reject) => {
294
+ if (info.ws.readyState !== ws_1.default.OPEN)
295
+ resolve();
296
+ else {
297
+ const timeout = setTimeout(() => {
298
+ reject(new Error(`timeout for peer ${peer}`));
299
+ }, 2 * 1000);
300
+ info.ws.once("close", () => {
301
+ clearTimeout(timeout);
302
+ resolve();
303
+ });
304
+ info.ws.close();
305
+ }
306
+ }));
307
+ }
308
+ await Promise.race([
309
+ Promise.all(closePromises),
310
+ new Promise((resolve, reject) => setTimeout(() => reject(new Error("timeout for all peers")), 5 * 1000))
311
+ ]).catch((error) => {
312
+ this.cli.log("warning", `HAPI: WebSockets failed to close: ${util.ensureError(error).message}`);
313
+ });
314
+ this.wsPeers.clear();
315
+ }
316
+ }
317
+ }
318
+ exports.APIServer = APIServer;
319
+ //# sourceMappingURL=speechflow-main-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"speechflow-main-api.js","sourceRoot":"","sources":["../src/speechflow-main-api.ts"],"names":[],"mappings":";AAAA;;;;EAIE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEF,6BAA6B;AAC7B,0DAA0C;AAG1C,6BAA6B;AAC7B,iDAA2C;AAC3C,wDAA4C;AAC5C,4CAAmC;AACnC,kFAAsD;AACtD,4EAAmD;AACnD,oDAAuC;AACvC,iDAAwC;AAGxC,6BAA6B;AAC7B,wDAAkD;AAGlD,sEAAmD;AAYnD,uEAAuE;AACvE,MAAa,SAAS;IAQN;IAPZ,sBAAsB;IACd,OAAO,GAAI,IAAI,GAAG,EAAsB,CAAA;IACxC,IAAI,GAA0B,IAAI,CAAA;IAClC,OAAO,GAAmD,IAAI,CAAA;IAEtE,gBAAgB;IAChB,YACY,GAAU;QAAV,QAAG,GAAH,GAAG,CAAO;IACnB,CAAC;IAEJ,gCAAgC;IAChC,KAAK,CAAC,KAAK,CAAC,IAAgB,EAAE,KAAgB;QAC1C,kDAAkD;QAClD,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;YAClC,OAAO,EAAE,QAAQ;YACjB,IAAI,EAAK,QAAQ;YACjB,IAAI,EAAK,WAAW;SACvB,CAAC,CAAA;QAEF,wDAAwD;QACxD,MAAM,sBAAsB,GAAG,KAAK,EAAE,IAAa,EAAE,EAAE;YACnD,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAA;YAClC,IAAI,GAAG,YAAY,OAAO,CAAC,IAAI,CAAC,MAAM;gBAClC,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;YACtD,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS;gBACzB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;YAClE,MAAM,IAAI,GAAG,GAAG,CAAC,IAAc,CAAA;YAC/B,MAAM,OAAO,GAAG,GAAG,CAAC,IAAa,CAAA;YACjC,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;YAC3C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,0CAA0C,IAAI,GAAG,CAAC,CAAA;gBAC1E,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,GAAG,CAAC,CAAA;YACtE,CAAC;iBACI,CAAC;gBACF,MAAM,OAAO,CAAC,IAAI,CAAO;oBACrB,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC;oBACjC,IAAI,OAAO,CAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CACpD,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;iBAChD,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;oBACpB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,6BAA6B,IAAI,aAAa,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;gBACxF,CAAC,CAAC,CAAA;YACN,CAAC;QACL,CAAC,CAAA;QAED,oCAAoC;QACpC,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC;YACxB,OAAO,EAAE,IAAI,CAAC,CAAC;YACf,IAAI,EAAK,IAAI,CAAC,CAAC;SAClB,CAAC,CAAA;QACF,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,eAAK,EAAE,CAAC,CAAA;QAC3C,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,4BAAU,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,sBAAG,CAAC,IAAI,IAAI,sBAAG,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;QACnG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,+BAAa,EAAE,CAAC,CAAA;QACnD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,OAAqB,EAAE,EAAE;YACtD,IAAI,QAAQ,GAAG,QAAQ,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAA;YACpD,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAA;YAC9B,IAAI,EAAE,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC1B,MAAM,SAAS,GAAI,EAAE,CAAC,EAAU,CAAC,eAAe;oBAC5C,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,IAAI,KAAK,CAAA;gBACrD,QAAQ,GAAG,aAAa,SAAS,IAAI,QAAQ,EAAE,CAAA;YACnD,CAAC;YACD,MAAM,GAAG,GACL,SAAS,GAAK,OAAO,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI;gBAC/C,SAAS,GAAK,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,IAAI;gBACjD,MAAM,GAAQ,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI;gBACzC,WAAW,GAAG,QAAQ,GAAG,IAAI;gBAC7B,WAAW,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;YAChG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,kBAAkB,GAAG,EAAE,CAAC,CAAA;QACjD,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAE,OAAO,CAAE,EAAE,EAAE,CAAC,OAAqB,EAAE,KAAwB,EAAE,IAA6B,EAAE,EAAE;YAC/I,IAAI,KAAK,CAAC,KAAK,YAAY,KAAK;gBAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,wBAAwB,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;;gBAEpE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,wBAAwB,KAAK,CAAC,KAAK,EAAE,CAAC,CAAA;QACpE,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAoB,EAAE,IAA6B,EAAE,EAAE;YAC/E,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAA;gBACvB,IAAI,GAAG,YAAY,KAAK;oBACpB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,cAAc,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;;oBAElD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,cAAc,GAAG,EAAE,CAAC,CAAA;YAClD,CAAC;QACL,CAAC,CAAC,CAAA;QAEF,2CAA2C;QAC3C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YACZ,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE;gBACL,SAAS,EAAE;oBACP,IAAI,EAAE,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,4BAA4B,CAAC;oBACxD,eAAe,EAAE,IAAI;oBACrB,KAAK,EAAE,IAAI;iBACd;aACJ;SACJ,CAAC,CAAA;QACF,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YACZ,MAAM,EAAE,KAAK;YACb,IAAI,EAAI,gBAAgB;YACxB,OAAO,EAAE,CAAC,OAAqB,EAAE,CAAuB,EAAE,EAAE;gBACxD,MAAM,MAAM,GAAG,EAAE,CAAA;gBACjB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;oBACpC,MAAM,CAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAE,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;oBAC3C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;gBACnC,CAAC;gBACD,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACvC,CAAC;SACJ,CAAC,CAAA;QACF,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YACZ,MAAM,EAAE,KAAK;YACb,IAAI,EAAI,6BAA6B;YACrC,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,CAAC,OAAqB,EAAE,CAAuB,EAAE,EAAE;gBACxD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,aAAa,CAAA;gBACvC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAgB,IAAI,EAAE,CAAA;gBACpD,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI;oBACpB,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACnF,MAAM,GAAG,GAAG;oBACR,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG;oBAC3B,IAAI,EAAK,OAAO,CAAC,MAAM,CAAC,IAAI;oBAC5B,IAAI,EAAK,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC;iBACzD,CAAA;gBACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,IAAI,UAAU,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;gBACvE,OAAO,sBAAsB,CAAC,GAAG,CAAC;qBAC7B,IAAI,CAAC,GAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;qBACxD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;YACtH,CAAC;SACJ,CAAC,CAAA;QACF,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YACZ,MAAM,EAAE,MAAM;YACd,IAAI,EAAI,MAAM;YACd,OAAO,EAAE;gBACL,OAAO,EAAE;oBACL,MAAM,EAAI,MAAM;oBAChB,KAAK,EAAK,IAAI;oBACd,KAAK,EAAK,kBAAkB;oBAC5B,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;iBAC5B;gBACD,OAAO,EAAE;oBACL,SAAS,EAAE;wBACP,QAAQ,EAAE,EAAE,GAAG,IAAI;wBACnB,OAAO,EAAE,CAAC,OAAY,EAAE,EAAE;4BACtB,MAAM,GAAG,GAAyB,OAAO,CAAC,GAAG,CAAA;4BAC7C,MAAM,EAAE,GAA0B,OAAO,CAAC,EAAE,CAAA;4BAC5C,MAAM,GAAG,GAAyB,OAAO,CAAC,GAAG,CAAA;4BAC7C,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,CAAA;4BACnE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAA;4BACf,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;4BACxC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,kCAAkC,IAAI,EAAE,CAAC,CAAA;wBAClE,CAAC;wBACD,UAAU,EAAE,CAAC,OAAY,EAAE,EAAE;4BACzB,MAAM,GAAG,GAAkB,OAAO,CAAC,GAAG,CAAA;4BACtC,MAAM,EAAE,GAAc,OAAO,CAAC,EAAE,CAAA;4BAChC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAA;4BACrB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;4BACzB,EAAE,CAAC,kBAAkB,EAAE,CAAA;4BACvB,IAAI,EAAE,CAAC,UAAU,KAAK,YAAS,CAAC,IAAI;gCAChC,EAAE,CAAC,KAAK,EAAE,CAAA;4BACd,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,qCAAqC,IAAI,EAAE,CAAC,CAAA;wBACrE,CAAC;qBACJ;iBACJ;aACJ;YACD,OAAO,EAAE,CAAC,OAAqB,EAAE,CAAuB,EAAE,EAAE;gBACxD,qCAAqC;gBACrC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,aAAa,CAAA;gBACvC,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;gBAC7C,IAAI,GAAG,YAAY,OAAO,CAAC,IAAI,CAAC,MAAM;oBAClC,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBAC/F,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,IAAI,WAAW,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;gBACxE,OAAO,sBAAsB,CAAC,GAAG,CAAC;qBAC7B,IAAI,CAAC,GAAc,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;qBAC/D,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;YAC9F,CAAC;SACJ,CAAC,CAAA;QAEF,wCAAwC;QACxC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;QACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,wDAAwD,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAA;QAEhG,6CAA6C;QAC7C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,aAAa,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,OAAc,EAAE,EAAE;gBACxC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;gBACjF,KAAK,MAAM,CAAE,IAAI,EAAE,IAAI,CAAE,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;oBAClD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,qBAAqB,IAAI,aAAa,IAAI,EAAE,CAAC,CAAA;oBACnE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,YAAS,CAAC,IAAI;wBACrC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAC1B,CAAC;YACL,CAAC,CAAC,CAAA;QACN,CAAC;QAED,yDAAyD;QACzD,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;YAChB,MAAM,GAAG,GAAG,IAAI,gBAAG,CAAC,EAAE,MAAM,EAAE,IAAI,gBAAG,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAA;YACzE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;YACvC,IAAI,CAAC,KAAK,IAAI;gBACV,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAA;YACjF,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YACjB,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YACjB,IAAI,CAAC,OAAO,GAAG,CAAC,GAAW,EAAE,GAAG,OAAc,EAAE,EAAE;gBAC9C,MAAM,GAAG,GAAG,IAAI,gBAAG,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAA;gBAC5C,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;YACjC,CAAC,CAAA;QACL,CAAC;QAED,+CAA+C;QAC/C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,aAAa,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,IAK1B,EAAE,EAAE;gBACD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;oBACxB,QAAQ,EAAE,WAAW;oBACrB,IAAI,EAAM,EAAE;oBACZ,IAAI,EAAM,CAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAE;iBAC1D,CAAC,CAAA;gBACF,KAAK,MAAM,CAAE,IAAI,EAAE,IAAI,CAAE,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;oBAClD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,wBAAwB,IAAI,UAAU,IAAI,EAAE,CAAC,CAAA;oBACnE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACtB,CAAC;gBACD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,aAAa,EAAE,EAAE,CAAC;oBACpC,OAAO,CAAC,IAAI,CAAO;wBACf,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;wBAC7D,IAAI,OAAO,CAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CACpD,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;qBAChD,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;wBACpB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,mCAAmC,CAAC,CAAC,EAAE,aAAa,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;oBAC9F,CAAC,CAAC,CAAA;gBACN,CAAC;gBACD,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,OAAO;oBAC7B,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;YACxF,CAAC,CAAC,CAAA;QACN,CAAC;IACL,CAAC;IAED,+BAA+B;IAC/B,KAAK,CAAC,IAAI,CAAC,IAAgB;QACvB,6BAA6B;QAC7B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,yDAAyD,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAA;YACjG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;QAC3C,CAAC;QAED,mCAAmC;QACnC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,qCAAqC,CAAC,CAAA;YAC3D,MAAM,aAAa,GAAoB,EAAE,CAAA;YACzC,KAAK,MAAM,CAAE,IAAI,EAAE,IAAI,CAAE,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;gBAClD,aAAa,CAAC,IAAI,CAAC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBACrD,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,YAAS,CAAC,IAAI;wBACrC,OAAO,EAAE,CAAA;yBACR,CAAC;wBACF,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;4BAC5B,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC,CAAA;wBACjD,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAA;wBACZ,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;4BACvB,YAAY,CAAC,OAAO,CAAC,CAAA;4BACrB,OAAO,EAAE,CAAA;wBACb,CAAC,CAAC,CAAA;wBACF,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAA;oBACnB,CAAC;gBACL,CAAC,CAAC,CAAC,CAAA;YACP,CAAC;YACD,MAAM,OAAO,CAAC,IAAI,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;gBAC1B,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAC5B,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;aAC9E,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;gBACxB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,qCAAqC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;YACnG,CAAC,CAAC,CAAA;YACF,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;QACxB,CAAC;IACL,CAAC;CACJ;AArRD,8BAqRC"}
@@ -0,0 +1,28 @@
1
+ import CLIio from "cli-io";
2
+ export interface CLIOptions {
3
+ V: boolean;
4
+ S: boolean;
5
+ v: string;
6
+ a: string;
7
+ p: number;
8
+ C: string;
9
+ d: string;
10
+ o: string;
11
+ e: string;
12
+ f: string;
13
+ c: string;
14
+ _: (string | number)[];
15
+ }
16
+ export declare class CLIContext {
17
+ cli: CLIio | null;
18
+ args: CLIOptions | null;
19
+ config: string | null;
20
+ debug: boolean;
21
+ isInitialized(): this is CLIContext & {
22
+ cli: CLIio;
23
+ args: CLIOptions;
24
+ config: string;
25
+ };
26
+ init(): Promise<void>;
27
+ handleTopLevelError(err: Error): never;
28
+ }
@@ -0,0 +1,271 @@
1
+ "use strict";
2
+ /*
3
+ ** SpeechFlow - Speech Processing Flow Graph
4
+ ** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
5
+ ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ var __importDefault = (this && this.__importDefault) || function (mod) {
41
+ return (mod && mod.__esModule) ? mod : { "default": mod };
42
+ };
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.CLIContext = void 0;
45
+ /* standard dependencies */
46
+ const node_path_1 = __importDefault(require("node:path"));
47
+ /* external dependencies */
48
+ const cli_io_1 = __importDefault(require("cli-io"));
49
+ const yargs_1 = __importDefault(require("yargs"));
50
+ const helpers_1 = require("yargs/helpers");
51
+ const js_yaml_1 = __importDefault(require("js-yaml"));
52
+ const dotenvx_1 = __importDefault(require("@dotenvx/dotenvx"));
53
+ const syspath_1 = __importDefault(require("syspath"));
54
+ const chalk_1 = __importDefault(require("chalk"));
55
+ /* internal dependencies */
56
+ const util = __importStar(require("./speechflow-util"));
57
+ const package_json_1 = __importDefault(require("../../package.json"));
58
+ class CLIContext {
59
+ cli = null;
60
+ args = null;
61
+ config = null;
62
+ debug = false;
63
+ /* type guard for initialization */
64
+ isInitialized() {
65
+ return this.cli !== null && this.args !== null && this.config !== null;
66
+ }
67
+ /* initialization of CLI */
68
+ async init() {
69
+ /* determine system paths */
70
+ const { dataDir } = (0, syspath_1.default)({
71
+ appName: "speechflow",
72
+ dataDirAutoCreate: true
73
+ });
74
+ /* parse command-line arguments */
75
+ const coerce = (arg) => Array.isArray(arg) ? arg[arg.length - 1] : arg;
76
+ this.args = await (0, yargs_1.default)()
77
+ /* eslint @stylistic/indent: off */
78
+ .usage("Usage: $0 " +
79
+ "[-h|--help] " +
80
+ "[-V|--version] " +
81
+ "[-S|--status] " +
82
+ "[-v|--verbose <level>] " +
83
+ "[-a|--address <ip-address>] " +
84
+ "[-p|--port <tcp-port>] " +
85
+ "[-C|--cache <directory>] " +
86
+ "[-d|--dashboard <type>:<id>:<name>[,...]] " +
87
+ "[-o|--osc <ip-address>:<udp-port> " +
88
+ "[-e|--expression <expression>] " +
89
+ "[-f|--file <file>] " +
90
+ "[-c|--config <id>@<yaml-config-file>] " +
91
+ "[<argument> [...]]")
92
+ .version(false)
93
+ .option("V", {
94
+ alias: "version",
95
+ type: "boolean",
96
+ array: false,
97
+ coerce,
98
+ default: false,
99
+ describe: "show program version information"
100
+ })
101
+ .option("S", {
102
+ alias: "status",
103
+ type: "boolean",
104
+ array: false,
105
+ coerce,
106
+ default: false,
107
+ describe: "show one-time status of nodes"
108
+ })
109
+ .option("v", {
110
+ alias: "log-level",
111
+ type: "string",
112
+ array: false,
113
+ coerce,
114
+ nargs: 1,
115
+ default: "warning",
116
+ describe: "level for verbose logging ('none', 'error', 'warning', 'info', 'debug')"
117
+ })
118
+ .option("a", {
119
+ alias: "address",
120
+ type: "string",
121
+ array: false,
122
+ coerce,
123
+ nargs: 1,
124
+ default: "0.0.0.0",
125
+ describe: "IP address for REST/WebSocket API"
126
+ })
127
+ .option("p", {
128
+ alias: "port",
129
+ type: "number",
130
+ array: false,
131
+ coerce,
132
+ nargs: 1,
133
+ default: 8484,
134
+ describe: "TCP port for REST/WebSocket API"
135
+ })
136
+ .option("C", {
137
+ alias: "cache",
138
+ type: "string",
139
+ array: false,
140
+ coerce,
141
+ nargs: 1,
142
+ default: node_path_1.default.join(dataDir, "cache"),
143
+ describe: "directory for cached files (primarily AI model files)"
144
+ })
145
+ .option("d", {
146
+ alias: "dashboard",
147
+ type: "string",
148
+ array: false,
149
+ coerce,
150
+ nargs: 1,
151
+ default: "",
152
+ describe: "list of dashboard block types and names"
153
+ })
154
+ .option("o", {
155
+ alias: "osc",
156
+ type: "string",
157
+ array: false,
158
+ coerce,
159
+ nargs: 1,
160
+ default: "",
161
+ describe: "OSC/UDP endpoint to send dashboard information"
162
+ })
163
+ .option("e", {
164
+ alias: "expression",
165
+ type: "string",
166
+ array: false,
167
+ coerce,
168
+ nargs: 1,
169
+ default: "",
170
+ describe: "FlowLink expression string"
171
+ })
172
+ .option("f", {
173
+ alias: "file",
174
+ type: "string",
175
+ array: false,
176
+ coerce,
177
+ nargs: 1,
178
+ default: "",
179
+ describe: "FlowLink expression file"
180
+ })
181
+ .option("c", {
182
+ alias: "config",
183
+ type: "string",
184
+ array: false,
185
+ coerce,
186
+ nargs: 1,
187
+ default: "",
188
+ describe: "FlowLink expression reference into YAML file (in format <id>@<file>)"
189
+ })
190
+ .help("h", "show usage help")
191
+ .alias("h", "help")
192
+ .showHelpOnFail(true)
193
+ .strict()
194
+ .demand(0)
195
+ .parse((0, helpers_1.hideBin)(process.argv));
196
+ /* short-circuit version request */
197
+ if (this.args.V) {
198
+ process.stderr.write(`SpeechFlow ${package_json_1.default["x-stdver"]} (${package_json_1.default["x-release"]}) <${package_json_1.default.homepage}>\n`);
199
+ process.stderr.write(`${package_json_1.default.description}\n`);
200
+ process.stderr.write(`Copyright (c) 2024-2025 ${package_json_1.default.author.name} <${package_json_1.default.author.url}>\n`);
201
+ process.stderr.write(`Licensed under ${package_json_1.default.license} <http://spdx.org/licenses/${package_json_1.default.license}.html>\n`);
202
+ process.exit(0);
203
+ }
204
+ /* establish CLI environment */
205
+ this.cli = new cli_io_1.default({
206
+ encoding: "utf8",
207
+ logLevel: this.args.v,
208
+ logTime: true,
209
+ logPrefix: package_json_1.default.name
210
+ });
211
+ if (this.args.v.match(/^(?:info|debug)$/))
212
+ this.debug = true;
213
+ /* provide startup information */
214
+ this.cli.log("info", `starting SpeechFlow ${package_json_1.default["x-stdver"]} (${package_json_1.default["x-release"]})`);
215
+ /* load .env files */
216
+ const result = dotenvx_1.default.config({
217
+ encoding: "utf8",
218
+ ignore: ["MISSING_ENV_FILE"],
219
+ quiet: true
220
+ });
221
+ if (result?.parsed !== undefined)
222
+ for (const key of Object.keys(result.parsed))
223
+ this.cli.log("info", `loaded environment variable "${key}" from ".env" files`);
224
+ /* sanity check configuration situation */
225
+ let n = 0;
226
+ if (typeof this.args.e === "string" && this.args.e !== "")
227
+ n++;
228
+ if (typeof this.args.f === "string" && this.args.f !== "")
229
+ n++;
230
+ if (typeof this.args.c === "string" && this.args.c !== "")
231
+ n++;
232
+ if (n === 0)
233
+ throw new Error("need at least one FlowLink specification source (use one of the options -e, -f or -c)");
234
+ else if (n !== 1)
235
+ throw new Error("cannot use more than one FlowLink specification source (use only one of the options -e, -f or -c)");
236
+ /* read configuration */
237
+ if (typeof this.args.e === "string" && this.args.e !== "")
238
+ this.config = this.args.e;
239
+ else if (typeof this.args.f === "string" && this.args.f !== "")
240
+ this.config = await this.cli.input(this.args.f, { encoding: "utf8" });
241
+ else if (typeof this.args.c === "string" && this.args.c !== "") {
242
+ const m = this.args.c.match(/^(.+?)@(.+)$/);
243
+ if (m === null)
244
+ throw new Error("invalid configuration file specification (expected \"<id>@<yaml-config-file>\")");
245
+ const [, id, file] = m;
246
+ const yaml = await this.cli.input(file, { encoding: "utf8" });
247
+ const obj = util.run("parsing YAML configuration", () => js_yaml_1.default.load(yaml));
248
+ if (obj[id] === undefined)
249
+ throw new Error(`no such id "${id}" found in configuration file "${file}"`);
250
+ this.config = obj[id];
251
+ }
252
+ }
253
+ /* utility function for handling a top-level error */
254
+ handleTopLevelError(err) {
255
+ if (this.cli !== null) {
256
+ if (this.debug)
257
+ this.cli.log("error", `${err.message}\n${err.stack}`);
258
+ else
259
+ this.cli.log("error", `${err.message}`);
260
+ }
261
+ else {
262
+ if (this.debug)
263
+ process.stderr.write(`${package_json_1.default.name}: ${chalk_1.default.red("ERROR")}: ${err.message}\n${err.stack}\n`);
264
+ else
265
+ process.stderr.write(`${package_json_1.default.name}: ${chalk_1.default.red("ERROR")}: ${err.message}`);
266
+ }
267
+ process.exit(1);
268
+ }
269
+ }
270
+ exports.CLIContext = CLIContext;
271
+ //# sourceMappingURL=speechflow-main-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"speechflow-main-cli.js","sourceRoot":"","sources":["../src/speechflow-main-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare class NodeConfig {
2
+ readonly audioChannels: number;
3
+ readonly audioBitDepth: number;
4
+ readonly audioLittleEndian: boolean;
5
+ readonly audioSampleRate: number;
6
+ readonly textEncoding: string;
7
+ cacheDir: string;
8
+ constructor(audioChannels?: number, audioBitDepth?: number, audioLittleEndian?: boolean, audioSampleRate?: number, textEncoding?: string, cacheDir?: string);
9
+ }