@readymadeit/mcp 0.0.0-stage → 0.1.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 (916) hide show
  1. package/README.md +114 -2
  2. package/bundle/LICENSE +201 -0
  3. package/bundle/boards/aggregator-demo-board.json +54 -0
  4. package/bundle/boards/alpaca-board.json +316 -0
  5. package/bundle/boards/animate-board.json +159 -0
  6. package/bundle/boards/ascii-art-demo-board.json +33 -0
  7. package/bundle/boards/ascii-cam-board.json +184 -0
  8. package/bundle/boards/asset-demo-board.json +54 -0
  9. package/bundle/boards/audio-encode-demo-board.json +153 -0
  10. package/bundle/boards/audiolize-board.json +152 -0
  11. package/bundle/boards/batcher-demo-board.json +43 -0
  12. package/bundle/boards/buffer-demo-board.json +53 -0
  13. package/bundle/boards/cache-demo-board.json +59 -0
  14. package/bundle/boards/camera-demo-board.json +28 -0
  15. package/bundle/boards/canvas-demo-board.json +55 -0
  16. package/bundle/boards/changes-demo-board.json +60 -0
  17. package/bundle/boards/court-booking-browser-demo-board.json +221 -0
  18. package/bundle/boards/court-booking-demo-board.json +218 -0
  19. package/bundle/boards/current-time-board.json +32 -0
  20. package/bundle/boards/debounce-demo-board.json +43 -0
  21. package/bundle/boards/decrypt-demo-board.json +47 -0
  22. package/bundle/boards/delay-demo-board.json +28 -0
  23. package/bundle/boards/detect-demo-board.json +64 -0
  24. package/bundle/boards/document-extract-demo-board.json +55 -0
  25. package/bundle/boards/dropitapp-board.json +138 -0
  26. package/bundle/boards/encode-demo-board.json +39 -0
  27. package/bundle/boards/encrypt-board.json +185 -0
  28. package/bundle/boards/encrypt-demo-board.json +39 -0
  29. package/bundle/boards/face-alert-board.json +181 -0
  30. package/bundle/boards/fetcher-demo-board.json +40 -0
  31. package/bundle/boards/fft-demo-board.json +28 -0
  32. package/bundle/boards/filter-demo-board.json +55 -0
  33. package/bundle/boards/flat-map-demo-board.json +42 -0
  34. package/bundle/boards/frame-limit-test-board.json +130 -0
  35. package/bundle/boards/game-board.json +413 -0
  36. package/bundle/boards/game-of-life-board.json +139 -0
  37. package/bundle/boards/game-of-life-demo-board.json +34 -0
  38. package/bundle/boards/gather-demo-board.json +62 -0
  39. package/bundle/boards/group-by-demo-board.json +62 -0
  40. package/bundle/boards/hacker-demo-board.json +45 -0
  41. package/bundle/boards/hacker-news-board.json +741 -0
  42. package/bundle/boards/hash-demo-board.json +40 -0
  43. package/bundle/boards/health-log-browser-demo-board.json +537 -0
  44. package/bundle/boards/health-log-demo-board.json +498 -0
  45. package/bundle/boards/helloworld-board.json +57 -0
  46. package/bundle/boards/hold-demo-board.json +67 -0
  47. package/bundle/boards/hold-scopes-demo-board.json +141 -0
  48. package/bundle/boards/http-client-browser-demo-board.json +379 -0
  49. package/bundle/boards/http-client-demo-board.json +380 -0
  50. package/bundle/boards/image-picker-demo-board.json +22 -0
  51. package/bundle/boards/imap-email-demo-board.json +35 -0
  52. package/bundle/boards/injector-demo-board.json +55 -0
  53. package/bundle/boards/iterator-demo-board.json +55 -0
  54. package/bundle/boards/limit-demo-board.json +66 -0
  55. package/bundle/boards/link-debugger.json +32 -0
  56. package/bundle/boards/live-location-demo-board.json +93 -0
  57. package/bundle/boards/live-radio-cloud-demo-board.json +216 -0
  58. package/bundle/boards/live-radio-cloud-direct-demo-board.json +311 -0
  59. package/bundle/boards/live-radio-demo-board.json +211 -0
  60. package/bundle/boards/live-radio-members-demo-board.json +314 -0
  61. package/bundle/boards/local-storage-demo-board.json +30 -0
  62. package/bundle/boards/lz-compress-demo-board.json +52 -0
  63. package/bundle/boards/map-demo-board.json +46 -0
  64. package/bundle/boards/match-filter-demo-board.json +43 -0
  65. package/bundle/boards/meeting-poll-browser-demo-board.json +649 -0
  66. package/bundle/boards/meeting-poll-demo-board.json +650 -0
  67. package/bundle/boards/microphone-monitor-demo-board.json +28 -0
  68. package/bundle/boards/microphone-speaker-demo-board.json +86 -0
  69. package/bundle/boards/monitor-demo-board.json +52 -0
  70. package/bundle/boards/mounted-endpoint-demo-board-hkp-rt.json +84 -0
  71. package/bundle/boards/mounted-endpoint-demo-board.json +84 -0
  72. package/bundle/boards/nested-rhythm-demo-board.json +1160 -0
  73. package/bundle/boards/next-bus-board.json +52 -0
  74. package/bundle/boards/next-bus-switch-board.json +79 -0
  75. package/bundle/boards/night-groove-demo-board.json +742 -0
  76. package/bundle/boards/noise-alert-board.json +146 -0
  77. package/bundle/boards/offer-followup-demo-board.json +291 -0
  78. package/bundle/boards/offer-intake-demo-board.json +289 -0
  79. package/bundle/boards/offer-intake-hetzner-demo-board.json +286 -0
  80. package/bundle/boards/offer-intake-imap-demo-board.json +289 -0
  81. package/bundle/boards/offer-intake-imap-hetzner-demo-board.json +354 -0
  82. package/bundle/boards/p2p-receiver-demo-board.json +65 -0
  83. package/bundle/boards/p2p-sender-demo-board.json +94 -0
  84. package/bundle/boards/pad-groove-demo-board.json +644 -0
  85. package/bundle/boards/peer-chat-board.json +109 -0
  86. package/bundle/boards/peer-chat-node-board.json +97 -0
  87. package/bundle/boards/qr-code-demo-board.json +22 -0
  88. package/bundle/boards/queue-demo-board.json +239 -0
  89. package/bundle/boards/reduce-demo-board.json +54 -0
  90. package/bundle/boards/remote-named-demo-board-hkp-rt.json +61 -0
  91. package/bundle/boards/remote-named-demo-board.json +61 -0
  92. package/bundle/boards/rss-demo-board.json +530 -0
  93. package/bundle/boards/rss-radio-board.json +515 -0
  94. package/bundle/boards/rss-radio-brief-one-board.json +237 -0
  95. package/bundle/boards/rss-radio-editor-unit-board.json +555 -0
  96. package/bundle/boards/rss-radio-library-unit-board.json +293 -0
  97. package/bundle/boards/rss-radio-unit-board.json +809 -0
  98. package/bundle/boards/rss-radio-voice-unit-board.json +146 -0
  99. package/bundle/boards/runtime-configs/hold-example.json +41 -0
  100. package/bundle/boards/runtime-configs/injector-example.json +23 -0
  101. package/bundle/boards/runtime-configs/speech-to-text-example.json +35 -0
  102. package/bundle/boards/runtime-configs/text-generation-example.json +31 -0
  103. package/bundle/boards/runtime-configs/text-to-speech-example.json +28 -0
  104. package/bundle/boards/runtime-configs/text-to-speech-inflect-example.json +28 -0
  105. package/bundle/boards/runtime-configs/ws-audio-playback-example.json +23 -0
  106. package/bundle/boards/select-demo-board.json +32 -0
  107. package/bundle/boards/send-ntfy-board.json +52 -0
  108. package/bundle/boards/shared-costs-demo-board.json +361 -0
  109. package/bundle/boards/sign-demo-board.json +41 -0
  110. package/bundle/boards/skill-router-demo-board.json +210 -0
  111. package/bundle/boards/smooth-demo-board.json +91 -0
  112. package/bundle/boards/smtp-email-demo-board.json +34 -0
  113. package/bundle/boards/sort-demo-board.json +55 -0
  114. package/bundle/boards/sound-demo-board.json +65 -0
  115. package/bundle/boards/spectral-modifier-board.json +98 -0
  116. package/bundle/boards/speech-synth-demo-board.json +37 -0
  117. package/bundle/boards/speech-to-text-demo-board.json +146 -0
  118. package/bundle/boards/spotify-board.json +75 -0
  119. package/bundle/boards/spread-demo-board.json +35 -0
  120. package/bundle/boards/sql-demo-board.json +56 -0
  121. package/bundle/boards/sql-explorer-board.json +447 -0
  122. package/bundle/boards/sql-explorer-node-board.json +474 -0
  123. package/bundle/boards/sql-import-board.json +156 -0
  124. package/bundle/boards/state-demo-board.json +65 -0
  125. package/bundle/boards/stopper-demo-board.json +40 -0
  126. package/bundle/boards/storage-demo-board.json +193 -0
  127. package/bundle/boards/store-demo-board.json +63 -0
  128. package/bundle/boards/swimlanes-demo-board.json +197 -0
  129. package/bundle/boards/switch-demo-board.json +51 -0
  130. package/bundle/boards/syn-board.json +19 -0
  131. package/bundle/boards/syn-booking-unit-board.json +998 -0
  132. package/bundle/boards/syn-conversations-anthropic-demo-board.json +925 -0
  133. package/bundle/boards/syn-conversations-demo-board.json +925 -0
  134. package/bundle/boards/syn-hotels-unit-board.json +287 -0
  135. package/bundle/boards/syn-mail-desk-board.json +25 -0
  136. package/bundle/boards/syn-mail-desk-unit-board.json +254 -0
  137. package/bundle/boards/telegram-listener-demo-board.json +31 -0
  138. package/bundle/boards/text-generation-anthropic-demo-board.json +66 -0
  139. package/bundle/boards/text-generation-demo-board.json +51 -0
  140. package/bundle/boards/text-generation-local-demo-board.json +80 -0
  141. package/bundle/boards/text-to-speech-demo-board.json +58 -0
  142. package/bundle/boards/timeline-demo-board.json +477 -0
  143. package/bundle/boards/timer-demo-board.json +35 -0
  144. package/bundle/boards/tracks-demo-board.json +95 -0
  145. package/bundle/boards/trigger-pad-demo-board.json +47 -0
  146. package/bundle/boards/triggerpad-board.json +31 -0
  147. package/bundle/boards/triggerpad-recorder-board.json +56 -0
  148. package/bundle/boards/uuid-generator-demo-board.json +166 -0
  149. package/bundle/boards/voice-assistant-demo-board.json +230 -0
  150. package/bundle/boards/voice-assistant-hkp-rt-demo-board.json +239 -0
  151. package/bundle/boards/voice-assistant-local-demo-board.json +232 -0
  152. package/bundle/boards/voice-assistant-skills-demo-board.json +316 -0
  153. package/bundle/boards/voice-assistant-skills-local-demo-board.json +316 -0
  154. package/bundle/boards/xy-pad-demo-board.json +36 -0
  155. package/bundle/docs/content/board-json.md +277 -0
  156. package/bundle/docs/content/boards/alpaca-board.md +56 -0
  157. package/bundle/docs/content/boards/animate-board.md +40 -0
  158. package/bundle/docs/content/boards/ascii-cam-board.md +37 -0
  159. package/bundle/docs/content/boards/audiolize-board.md +47 -0
  160. package/bundle/docs/content/boards/court-booking-browser-demo-board.md +43 -0
  161. package/bundle/docs/content/boards/court-booking-demo-board.md +120 -0
  162. package/bundle/docs/content/boards/current-time-board.md +32 -0
  163. package/bundle/docs/content/boards/dropitapp-board.md +57 -0
  164. package/bundle/docs/content/boards/encrypt-board.md +36 -0
  165. package/bundle/docs/content/boards/face-alert-board.md +50 -0
  166. package/bundle/docs/content/boards/game-board.md +69 -0
  167. package/bundle/docs/content/boards/game-of-life-board.md +47 -0
  168. package/bundle/docs/content/boards/hacker-news-board.md +76 -0
  169. package/bundle/docs/content/boards/health-log-browser-demo-board.md +56 -0
  170. package/bundle/docs/content/boards/health-log-demo-board.md +138 -0
  171. package/bundle/docs/content/boards/helloworld-board.md +40 -0
  172. package/bundle/docs/content/boards/link-debugger.md +31 -0
  173. package/bundle/docs/content/boards/live-radio-cloud-demo-board.md +70 -0
  174. package/bundle/docs/content/boards/live-radio-cloud-direct-demo-board.md +89 -0
  175. package/bundle/docs/content/boards/live-radio-demo-board.md +102 -0
  176. package/bundle/docs/content/boards/live-radio-members-demo-board.md +91 -0
  177. package/bundle/docs/content/boards/meeting-poll-browser-demo-board.md +45 -0
  178. package/bundle/docs/content/boards/meeting-poll-demo-board.md +121 -0
  179. package/bundle/docs/content/boards/mounted-endpoint-demo-board-hkp-rt.md +50 -0
  180. package/bundle/docs/content/boards/nested-rhythm-demo-board.md +165 -0
  181. package/bundle/docs/content/boards/next-bus-board.md +38 -0
  182. package/bundle/docs/content/boards/next-bus-switch-board.md +44 -0
  183. package/bundle/docs/content/boards/night-groove-demo-board.md +110 -0
  184. package/bundle/docs/content/boards/noise-alert-board.md +44 -0
  185. package/bundle/docs/content/boards/pad-groove-demo-board.md +93 -0
  186. package/bundle/docs/content/boards/peer-chat-board.md +49 -0
  187. package/bundle/docs/content/boards/peer-chat-node-board.md +47 -0
  188. package/bundle/docs/content/boards/rss-radio-board.md +221 -0
  189. package/bundle/docs/content/boards/send-ntfy-board.md +33 -0
  190. package/bundle/docs/content/boards/shared-costs-demo-board.md +65 -0
  191. package/bundle/docs/content/boards/spectral-modifier-board.md +55 -0
  192. package/bundle/docs/content/boards/spotify-board.md +46 -0
  193. package/bundle/docs/content/boards/sql-explorer-board.md +70 -0
  194. package/bundle/docs/content/boards/sql-explorer-node-board.md +76 -0
  195. package/bundle/docs/content/boards/sql-import-board.md +37 -0
  196. package/bundle/docs/content/boards/swimlanes-demo-board.md +148 -0
  197. package/bundle/docs/content/boards/syn-mail-desk-board.md +52 -0
  198. package/bundle/docs/content/boards/timeline-demo-board.md +115 -0
  199. package/bundle/docs/content/boards/triggerpad-board.md +32 -0
  200. package/bundle/docs/content/boards/triggerpad-recorder-board.md +52 -0
  201. package/bundle/docs/content/boards/voice-assistant-demo-board.md +51 -0
  202. package/bundle/docs/content/concepts/assets.md +245 -0
  203. package/bundle/docs/content/concepts/blocks.md +300 -0
  204. package/bundle/docs/content/concepts/board-assistant.md +307 -0
  205. package/bundle/docs/content/concepts/board.md +265 -0
  206. package/bundle/docs/content/concepts/cloud-boards.md +803 -0
  207. package/bundle/docs/content/concepts/coordinator.md +297 -0
  208. package/bundle/docs/content/concepts/logging.md +293 -0
  209. package/bundle/docs/content/concepts/mounts.md +314 -0
  210. package/bundle/docs/content/concepts/presets.md +360 -0
  211. package/bundle/docs/content/concepts/remotes.md +423 -0
  212. package/bundle/docs/content/concepts/runtime.md +664 -0
  213. package/bundle/docs/content/concepts/scopes.md +256 -0
  214. package/bundle/docs/content/concepts/service.md +227 -0
  215. package/bundle/docs/content/concepts/units.md +321 -0
  216. package/bundle/docs/content/introduction.md +163 -0
  217. package/bundle/docs/content/llm/circle-text-board.json +55 -0
  218. package/bundle/docs/content/llm/howto-workflow.md +369 -0
  219. package/bundle/docs/content/repository.md +161 -0
  220. package/bundle/docs/content/services/aggregator.md +76 -0
  221. package/bundle/docs/content/services/analyzer.md +44 -0
  222. package/bundle/docs/content/services/ascii-art.md +58 -0
  223. package/bundle/docs/content/services/asset.md +88 -0
  224. package/bundle/docs/content/services/audio-editor.md +57 -0
  225. package/bundle/docs/content/services/audio-encode.md +115 -0
  226. package/bundle/docs/content/services/audio-io.md +173 -0
  227. package/bundle/docs/content/services/batcher.md +49 -0
  228. package/bundle/docs/content/services/board-service.md +48 -0
  229. package/bundle/docs/content/services/browser-sub-service.md +75 -0
  230. package/bundle/docs/content/services/buffer.md +70 -0
  231. package/bundle/docs/content/services/cache.md +92 -0
  232. package/bundle/docs/content/services/camera.md +85 -0
  233. package/bundle/docs/content/services/canvas.md +196 -0
  234. package/bundle/docs/content/services/changes.md +87 -0
  235. package/bundle/docs/content/services/chunked-file-provider.md +63 -0
  236. package/bundle/docs/content/services/communication-dispatcher.md +190 -0
  237. package/bundle/docs/content/services/configurator.md +66 -0
  238. package/bundle/docs/content/services/conversations.md +244 -0
  239. package/bundle/docs/content/services/debounce.md +45 -0
  240. package/bundle/docs/content/services/decrypt.md +53 -0
  241. package/bundle/docs/content/services/delay.md +55 -0
  242. package/bundle/docs/content/services/detect.md +101 -0
  243. package/bundle/docs/content/services/document-extract.md +174 -0
  244. package/bundle/docs/content/services/download.md +67 -0
  245. package/bundle/docs/content/services/encode.md +63 -0
  246. package/bundle/docs/content/services/encrypt.md +53 -0
  247. package/bundle/docs/content/services/fetcher.md +122 -0
  248. package/bundle/docs/content/services/fft.md +96 -0
  249. package/bundle/docs/content/services/file-source.md +67 -0
  250. package/bundle/docs/content/services/filesystem.md +157 -0
  251. package/bundle/docs/content/services/filter.md +133 -0
  252. package/bundle/docs/content/services/flat-map.md +62 -0
  253. package/bundle/docs/content/services/game-of-life.md +93 -0
  254. package/bundle/docs/content/services/gather.md +135 -0
  255. package/bundle/docs/content/services/gif-encoder.md +56 -0
  256. package/bundle/docs/content/services/github.md +85 -0
  257. package/bundle/docs/content/services/group-by.md +54 -0
  258. package/bundle/docs/content/services/hacker.md +79 -0
  259. package/bundle/docs/content/services/hash.md +59 -0
  260. package/bundle/docs/content/services/hold.md +182 -0
  261. package/bundle/docs/content/services/http-relay-client.md +48 -0
  262. package/bundle/docs/content/services/http-uploader.md +62 -0
  263. package/bundle/docs/content/services/http.md +424 -0
  264. package/bundle/docs/content/services/if.md +79 -0
  265. package/bundle/docs/content/services/ifft.md +46 -0
  266. package/bundle/docs/content/services/image-picker.md +50 -0
  267. package/bundle/docs/content/services/imap-email.md +104 -0
  268. package/bundle/docs/content/services/injector.md +129 -0
  269. package/bundle/docs/content/services/input.md +90 -0
  270. package/bundle/docs/content/services/iterator.md +186 -0
  271. package/bundle/docs/content/services/join.md +153 -0
  272. package/bundle/docs/content/services/limit.md +47 -0
  273. package/bundle/docs/content/services/local-storage.md +47 -0
  274. package/bundle/docs/content/services/looper.md +62 -0
  275. package/bundle/docs/content/services/lz-compress.md +52 -0
  276. package/bundle/docs/content/services/map.md +257 -0
  277. package/bundle/docs/content/services/match-filter.md +38 -0
  278. package/bundle/docs/content/services/microphone-monitor.md +66 -0
  279. package/bundle/docs/content/services/monitor.md +67 -0
  280. package/bundle/docs/content/services/ollama.md +116 -0
  281. package/bundle/docs/content/services/openai-prompt.md +74 -0
  282. package/bundle/docs/content/services/output.md +107 -0
  283. package/bundle/docs/content/services/peer-socket.md +61 -0
  284. package/bundle/docs/content/services/qr-code.md +48 -0
  285. package/bundle/docs/content/services/queue.md +201 -0
  286. package/bundle/docs/content/services/reduce.md +51 -0
  287. package/bundle/docs/content/services/rss.md +232 -0
  288. package/bundle/docs/content/services/select.md +47 -0
  289. package/bundle/docs/content/services/sign.md +53 -0
  290. package/bundle/docs/content/services/skill-router.md +154 -0
  291. package/bundle/docs/content/services/smooth.md +59 -0
  292. package/bundle/docs/content/services/smtp-email.md +129 -0
  293. package/bundle/docs/content/services/sort.md +48 -0
  294. package/bundle/docs/content/services/sound.md +87 -0
  295. package/bundle/docs/content/services/speech-synth.md +46 -0
  296. package/bundle/docs/content/services/speech-to-text.md +172 -0
  297. package/bundle/docs/content/services/spotify.md +77 -0
  298. package/bundle/docs/content/services/spread.md +111 -0
  299. package/bundle/docs/content/services/sql.md +491 -0
  300. package/bundle/docs/content/services/state.md +57 -0
  301. package/bundle/docs/content/services/static.md +47 -0
  302. package/bundle/docs/content/services/stopper.md +55 -0
  303. package/bundle/docs/content/services/storage.md +155 -0
  304. package/bundle/docs/content/services/store.md +255 -0
  305. package/bundle/docs/content/services/sub-service.md +152 -0
  306. package/bundle/docs/content/services/switch.md +67 -0
  307. package/bundle/docs/content/services/telegram-listener.md +76 -0
  308. package/bundle/docs/content/services/text-generation.md +390 -0
  309. package/bundle/docs/content/services/text-to-speech.md +130 -0
  310. package/bundle/docs/content/services/timeline.md +333 -0
  311. package/bundle/docs/content/services/timer.md +113 -0
  312. package/bundle/docs/content/services/tracks.md +207 -0
  313. package/bundle/docs/content/services/trigger-pad.md +68 -0
  314. package/bundle/docs/content/services/uuid-generator.md +48 -0
  315. package/bundle/docs/content/services/wav-reader.md +66 -0
  316. package/bundle/docs/content/services/websocket.md +189 -0
  317. package/bundle/docs/content/services/workflow-board-builder.md +65 -0
  318. package/bundle/docs/content/services/xy-pad.md +60 -0
  319. package/bundle/docs/content/targets.md +434 -0
  320. package/bundle/docs/content/testing.md +263 -0
  321. package/bundle/docs/content/vocabulary.md +171 -0
  322. package/bundle/hkp-frontend/src/runtime/browser/BrowserRegistry.tsx +141 -0
  323. package/bundle/hkp-frontend/src/runtime/browser/BrowserRuntime.tsx +202 -0
  324. package/bundle/hkp-frontend/src/runtime/browser/BrowserRuntimeApi.ts +306 -0
  325. package/bundle/hkp-frontend/src/runtime/browser/BrowserRuntimeApp.ts +310 -0
  326. package/bundle/hkp-frontend/src/runtime/browser/BrowserRuntimeScope.ts +500 -0
  327. package/bundle/hkp-frontend/src/runtime/browser/UIRegistry.ts +150 -0
  328. package/bundle/hkp-frontend/src/runtime/browser/assetResolver.ts +123 -0
  329. package/bundle/hkp-frontend/src/runtime/browser/pipelineNames.ts +65 -0
  330. package/bundle/hkp-frontend/src/runtime/browser/registry/Default.ts +237 -0
  331. package/bundle/hkp-frontend/src/runtime/browser/services/Aggregator.ts +127 -0
  332. package/bundle/hkp-frontend/src/runtime/browser/services/AggregatorUI.tsx +83 -0
  333. package/bundle/hkp-frontend/src/runtime/browser/services/Analyzer.tsx +43 -0
  334. package/bundle/hkp-frontend/src/runtime/browser/services/AnalyzerUI/Bars.tsx +33 -0
  335. package/bundle/hkp-frontend/src/runtime/browser/services/AnalyzerUI/HorizontalSpectrogram.tsx +53 -0
  336. package/bundle/hkp-frontend/src/runtime/browser/services/AnalyzerUI/VerticalSpectogram.tsx +56 -0
  337. package/bundle/hkp-frontend/src/runtime/browser/services/AnalyzerUI/Waveform.tsx +109 -0
  338. package/bundle/hkp-frontend/src/runtime/browser/services/AnalyzerUI/index.tsx +99 -0
  339. package/bundle/hkp-frontend/src/runtime/browser/services/AsciiArt.ts +119 -0
  340. package/bundle/hkp-frontend/src/runtime/browser/services/AsciiArtUI.tsx +131 -0
  341. package/bundle/hkp-frontend/src/runtime/browser/services/Asset.ts +125 -0
  342. package/bundle/hkp-frontend/src/runtime/browser/services/AssetUI.tsx +37 -0
  343. package/bundle/hkp-frontend/src/runtime/browser/services/AudioDeviceSettings.tsx +56 -0
  344. package/bundle/hkp-frontend/src/runtime/browser/services/AudioEditor.ts +129 -0
  345. package/bundle/hkp-frontend/src/runtime/browser/services/AudioEditorUI.tsx +549 -0
  346. package/bundle/hkp-frontend/src/runtime/browser/services/AudioInput.ts +298 -0
  347. package/bundle/hkp-frontend/src/runtime/browser/services/AudioInputUI.tsx +257 -0
  348. package/bundle/hkp-frontend/src/runtime/browser/services/AudioOutput.ts +189 -0
  349. package/bundle/hkp-frontend/src/runtime/browser/services/AudioOutputUI.tsx +63 -0
  350. package/bundle/hkp-frontend/src/runtime/browser/services/Batcher.ts +11 -0
  351. package/bundle/hkp-frontend/src/runtime/browser/services/BoardService.tsx +86 -0
  352. package/bundle/hkp-frontend/src/runtime/browser/services/BoardServiceUI.tsx +410 -0
  353. package/bundle/hkp-frontend/src/runtime/browser/services/BrowserGather.ts +311 -0
  354. package/bundle/hkp-frontend/src/runtime/browser/services/BrowserIterator.ts +167 -0
  355. package/bundle/hkp-frontend/src/runtime/browser/services/BrowserSubService.tsx +583 -0
  356. package/bundle/hkp-frontend/src/runtime/browser/services/BrowserSubServiceUI.tsx +187 -0
  357. package/bundle/hkp-frontend/src/runtime/browser/services/BrowserTracks.tsx +477 -0
  358. package/bundle/hkp-frontend/src/runtime/browser/services/Buffer.ts +11 -0
  359. package/bundle/hkp-frontend/src/runtime/browser/services/Cache.ts +134 -0
  360. package/bundle/hkp-frontend/src/runtime/browser/services/CacheUI.tsx +125 -0
  361. package/bundle/hkp-frontend/src/runtime/browser/services/Camera.ts +90 -0
  362. package/bundle/hkp-frontend/src/runtime/browser/services/CameraUI.tsx +321 -0
  363. package/bundle/hkp-frontend/src/runtime/browser/services/Canvas.ts +139 -0
  364. package/bundle/hkp-frontend/src/runtime/browser/services/CanvasUI/canvasDraw.ts +543 -0
  365. package/bundle/hkp-frontend/src/runtime/browser/services/CanvasUI/canvasUtils.ts +39 -0
  366. package/bundle/hkp-frontend/src/runtime/browser/services/CanvasUI/index.tsx +287 -0
  367. package/bundle/hkp-frontend/src/runtime/browser/services/CanvasUI/tests/canvasDraw.test.ts +355 -0
  368. package/bundle/hkp-frontend/src/runtime/browser/services/CanvasUI/tests/canvasUtils.test.ts +89 -0
  369. package/bundle/hkp-frontend/src/runtime/browser/services/CanvasUI/tests/fullscreen.test.tsx +26 -0
  370. package/bundle/hkp-frontend/src/runtime/browser/services/Changes.ts +201 -0
  371. package/bundle/hkp-frontend/src/runtime/browser/services/ChangesUI.tsx +85 -0
  372. package/bundle/hkp-frontend/src/runtime/browser/services/ChunkedFileProvider.tsx +183 -0
  373. package/bundle/hkp-frontend/src/runtime/browser/services/Configurator.ts +258 -0
  374. package/bundle/hkp-frontend/src/runtime/browser/services/ConfiguratorUI.tsx +83 -0
  375. package/bundle/hkp-frontend/src/runtime/browser/services/ConsideredHacker.tsx +28 -0
  376. package/bundle/hkp-frontend/src/runtime/browser/services/Debounce.ts +75 -0
  377. package/bundle/hkp-frontend/src/runtime/browser/services/DebounceUI.tsx +70 -0
  378. package/bundle/hkp-frontend/src/runtime/browser/services/Decrypt.ts +127 -0
  379. package/bundle/hkp-frontend/src/runtime/browser/services/DecryptUI.tsx +39 -0
  380. package/bundle/hkp-frontend/src/runtime/browser/services/Delay.tsx +110 -0
  381. package/bundle/hkp-frontend/src/runtime/browser/services/Detect.ts +214 -0
  382. package/bundle/hkp-frontend/src/runtime/browser/services/DetectUI.tsx +86 -0
  383. package/bundle/hkp-frontend/src/runtime/browser/services/Download.ts +120 -0
  384. package/bundle/hkp-frontend/src/runtime/browser/services/DownloadUI.tsx +61 -0
  385. package/bundle/hkp-frontend/src/runtime/browser/services/Encode.ts +138 -0
  386. package/bundle/hkp-frontend/src/runtime/browser/services/EncodeUI.tsx +52 -0
  387. package/bundle/hkp-frontend/src/runtime/browser/services/Encrypt.ts +125 -0
  388. package/bundle/hkp-frontend/src/runtime/browser/services/EncryptUI.tsx +39 -0
  389. package/bundle/hkp-frontend/src/runtime/browser/services/FFT.tsx +238 -0
  390. package/bundle/hkp-frontend/src/runtime/browser/services/FFTUI.tsx +112 -0
  391. package/bundle/hkp-frontend/src/runtime/browser/services/FeedbackService.ts +247 -0
  392. package/bundle/hkp-frontend/src/runtime/browser/services/FeedbackServiceUI.tsx +35 -0
  393. package/bundle/hkp-frontend/src/runtime/browser/services/Fetcher.tsx +232 -0
  394. package/bundle/hkp-frontend/src/runtime/browser/services/FetcherUI.tsx +154 -0
  395. package/bundle/hkp-frontend/src/runtime/browser/services/FileSource.tsx +171 -0
  396. package/bundle/hkp-frontend/src/runtime/browser/services/Filter.tsx +18 -0
  397. package/bundle/hkp-frontend/src/runtime/browser/services/FilterUI.tsx +89 -0
  398. package/bundle/hkp-frontend/src/runtime/browser/services/FlatMap.ts +68 -0
  399. package/bundle/hkp-frontend/src/runtime/browser/services/FlatMapUI.tsx +38 -0
  400. package/bundle/hkp-frontend/src/runtime/browser/services/GameOfLife.ts +210 -0
  401. package/bundle/hkp-frontend/src/runtime/browser/services/GameOfLifeRenderer.ts +182 -0
  402. package/bundle/hkp-frontend/src/runtime/browser/services/GameOfLifeRendererUI.tsx +48 -0
  403. package/bundle/hkp-frontend/src/runtime/browser/services/GameOfLifeUI.tsx +58 -0
  404. package/bundle/hkp-frontend/src/runtime/browser/services/GatherUI.tsx +84 -0
  405. package/bundle/hkp-frontend/src/runtime/browser/services/GifEncoder.tsx +651 -0
  406. package/bundle/hkp-frontend/src/runtime/browser/services/GithubAPI.ts +294 -0
  407. package/bundle/hkp-frontend/src/runtime/browser/services/GithubComponents.tsx +389 -0
  408. package/bundle/hkp-frontend/src/runtime/browser/services/GithubSink.tsx +109 -0
  409. package/bundle/hkp-frontend/src/runtime/browser/services/GithubSinkUI.tsx +143 -0
  410. package/bundle/hkp-frontend/src/runtime/browser/services/GithubSource.tsx +86 -0
  411. package/bundle/hkp-frontend/src/runtime/browser/services/GithubSourceUI.tsx +162 -0
  412. package/bundle/hkp-frontend/src/runtime/browser/services/GroupBy.ts +11 -0
  413. package/bundle/hkp-frontend/src/runtime/browser/services/HTTPUploader.ts +102 -0
  414. package/bundle/hkp-frontend/src/runtime/browser/services/Hacker.ts +73 -0
  415. package/bundle/hkp-frontend/src/runtime/browser/services/HackerUI.tsx +134 -0
  416. package/bundle/hkp-frontend/src/runtime/browser/services/Hash.ts +134 -0
  417. package/bundle/hkp-frontend/src/runtime/browser/services/HashUI.tsx +45 -0
  418. package/bundle/hkp-frontend/src/runtime/browser/services/Hold.ts +288 -0
  419. package/bundle/hkp-frontend/src/runtime/browser/services/HoldUI.tsx +43 -0
  420. package/bundle/hkp-frontend/src/runtime/browser/services/HttpClient.ts +558 -0
  421. package/bundle/hkp-frontend/src/runtime/browser/services/HttpClientUI.tsx +212 -0
  422. package/bundle/hkp-frontend/src/runtime/browser/services/HttpUploaderTokenInjector.ts +149 -0
  423. package/bundle/hkp-frontend/src/runtime/browser/services/IfService.ts +231 -0
  424. package/bundle/hkp-frontend/src/runtime/browser/services/IfServiceUI.tsx +50 -0
  425. package/bundle/hkp-frontend/src/runtime/browser/services/ImagePicker.tsx +118 -0
  426. package/bundle/hkp-frontend/src/runtime/browser/services/Injector.ts +61 -0
  427. package/bundle/hkp-frontend/src/runtime/browser/services/InjectorUI.tsx +389 -0
  428. package/bundle/hkp-frontend/src/runtime/browser/services/Input.ts +214 -0
  429. package/bundle/hkp-frontend/src/runtime/browser/services/InputUI.tsx +71 -0
  430. package/bundle/hkp-frontend/src/runtime/browser/services/IteratorUI.tsx +59 -0
  431. package/bundle/hkp-frontend/src/runtime/browser/services/LZCompress.ts +63 -0
  432. package/bundle/hkp-frontend/src/runtime/browser/services/Limit.ts +39 -0
  433. package/bundle/hkp-frontend/src/runtime/browser/services/LimitUI.tsx +41 -0
  434. package/bundle/hkp-frontend/src/runtime/browser/services/LocalStorage.ts +65 -0
  435. package/bundle/hkp-frontend/src/runtime/browser/services/LocalStorageUI.tsx +72 -0
  436. package/bundle/hkp-frontend/src/runtime/browser/services/Map.ts +14 -0
  437. package/bundle/hkp-frontend/src/runtime/browser/services/MapUI.tsx +334 -0
  438. package/bundle/hkp-frontend/src/runtime/browser/services/MapUIModeAssist.tsx +61 -0
  439. package/bundle/hkp-frontend/src/runtime/browser/services/MatchFilter.ts +11 -0
  440. package/bundle/hkp-frontend/src/runtime/browser/services/MicrophoneMonitor.ts +190 -0
  441. package/bundle/hkp-frontend/src/runtime/browser/services/MicrophoneMonitorUI.tsx +94 -0
  442. package/bundle/hkp-frontend/src/runtime/browser/services/Monitor.tsx +15 -0
  443. package/bundle/hkp-frontend/src/runtime/browser/services/MonitorUI.tsx +281 -0
  444. package/bundle/hkp-frontend/src/runtime/browser/services/OllamaPrompt.ts +237 -0
  445. package/bundle/hkp-frontend/src/runtime/browser/services/OllamaPromptUI/BusyIndicator.tsx +18 -0
  446. package/bundle/hkp-frontend/src/runtime/browser/services/OllamaPromptUI/PromptInput.tsx +71 -0
  447. package/bundle/hkp-frontend/src/runtime/browser/services/OllamaPromptUI/StreamingPreview.tsx +24 -0
  448. package/bundle/hkp-frontend/src/runtime/browser/services/OllamaPromptUI/index.tsx +156 -0
  449. package/bundle/hkp-frontend/src/runtime/browser/services/OpenAIPrompt.ts +254 -0
  450. package/bundle/hkp-frontend/src/runtime/browser/services/OpenAIPromptUI.tsx +189 -0
  451. package/bundle/hkp-frontend/src/runtime/browser/services/Output.tsx +145 -0
  452. package/bundle/hkp-frontend/src/runtime/browser/services/OutputUI.tsx +118 -0
  453. package/bundle/hkp-frontend/src/runtime/browser/services/PeerChatTemplate.json +43 -0
  454. package/bundle/hkp-frontend/src/runtime/browser/services/PeerConnection.ts +260 -0
  455. package/bundle/hkp-frontend/src/runtime/browser/services/PeerSocket.tsx +268 -0
  456. package/bundle/hkp-frontend/src/runtime/browser/services/PeerSocketReceiverTemplate.json +29 -0
  457. package/bundle/hkp-frontend/src/runtime/browser/services/PeerSocketUI.tsx +341 -0
  458. package/bundle/hkp-frontend/src/runtime/browser/services/PlaceholderUI.tsx +72 -0
  459. package/bundle/hkp-frontend/src/runtime/browser/services/QrCode.ts +63 -0
  460. package/bundle/hkp-frontend/src/runtime/browser/services/QrCodeUI.tsx +197 -0
  461. package/bundle/hkp-frontend/src/runtime/browser/services/Select.ts +40 -0
  462. package/bundle/hkp-frontend/src/runtime/browser/services/SelectUI.tsx +41 -0
  463. package/bundle/hkp-frontend/src/runtime/browser/services/ServiceBase.ts +50 -0
  464. package/bundle/hkp-frontend/src/runtime/browser/services/SetRuntimeVariable.ts +65 -0
  465. package/bundle/hkp-frontend/src/runtime/browser/services/SetRuntimeVariableUI.tsx +50 -0
  466. package/bundle/hkp-frontend/src/runtime/browser/services/Sign.ts +182 -0
  467. package/bundle/hkp-frontend/src/runtime/browser/services/SignUI.tsx +55 -0
  468. package/bundle/hkp-frontend/src/runtime/browser/services/Smooth.ts +101 -0
  469. package/bundle/hkp-frontend/src/runtime/browser/services/SmoothUI.tsx +50 -0
  470. package/bundle/hkp-frontend/src/runtime/browser/services/Sort.ts +59 -0
  471. package/bundle/hkp-frontend/src/runtime/browser/services/SortUI.tsx +61 -0
  472. package/bundle/hkp-frontend/src/runtime/browser/services/Sound.ts +541 -0
  473. package/bundle/hkp-frontend/src/runtime/browser/services/SoundUI.tsx +183 -0
  474. package/bundle/hkp-frontend/src/runtime/browser/services/SpeechSynth.ts +56 -0
  475. package/bundle/hkp-frontend/src/runtime/browser/services/SpeechSynthUI.tsx +108 -0
  476. package/bundle/hkp-frontend/src/runtime/browser/services/Spotify.tsx +111 -0
  477. package/bundle/hkp-frontend/src/runtime/browser/services/SpotifyAPI.ts +113 -0
  478. package/bundle/hkp-frontend/src/runtime/browser/services/SpotifyComponents.tsx +104 -0
  479. package/bundle/hkp-frontend/src/runtime/browser/services/SpotifyUI.tsx +186 -0
  480. package/bundle/hkp-frontend/src/runtime/browser/services/Spread.ts +117 -0
  481. package/bundle/hkp-frontend/src/runtime/browser/services/SpreadUI.tsx +38 -0
  482. package/bundle/hkp-frontend/src/runtime/browser/services/Sql.ts +448 -0
  483. package/bundle/hkp-frontend/src/runtime/browser/services/SqlInspector.tsx +332 -0
  484. package/bundle/hkp-frontend/src/runtime/browser/services/SqlUI.tsx +226 -0
  485. package/bundle/hkp-frontend/src/runtime/browser/services/State.ts +149 -0
  486. package/bundle/hkp-frontend/src/runtime/browser/services/Stopper.ts +29 -0
  487. package/bundle/hkp-frontend/src/runtime/browser/services/Switch.tsx +419 -0
  488. package/bundle/hkp-frontend/src/runtime/browser/services/SwitchUI.tsx +171 -0
  489. package/bundle/hkp-frontend/src/runtime/browser/services/TickRuleDelta.ts +101 -0
  490. package/bundle/hkp-frontend/src/runtime/browser/services/TickRuleDeltaUI.tsx +56 -0
  491. package/bundle/hkp-frontend/src/runtime/browser/services/Timeline.ts +709 -0
  492. package/bundle/hkp-frontend/src/runtime/browser/services/TimelineUI/TimelinePanel.tsx +79 -0
  493. package/bundle/hkp-frontend/src/runtime/browser/services/TimelineUI/TimelineRows.tsx +574 -0
  494. package/bundle/hkp-frontend/src/runtime/browser/services/TimelineUI/Transport.tsx +141 -0
  495. package/bundle/hkp-frontend/src/runtime/browser/services/TimelineUI/index.tsx +119 -0
  496. package/bundle/hkp-frontend/src/runtime/browser/services/TimelineUI/model.ts +425 -0
  497. package/bundle/hkp-frontend/src/runtime/browser/services/TimelineUI/parts.tsx +708 -0
  498. package/bundle/hkp-frontend/src/runtime/browser/services/Timer.ts +15 -0
  499. package/bundle/hkp-frontend/src/runtime/browser/services/TimerUI.tsx +213 -0
  500. package/bundle/hkp-frontend/src/runtime/browser/services/TracksUI.tsx +81 -0
  501. package/bundle/hkp-frontend/src/runtime/browser/services/TriggerPad.ts +108 -0
  502. package/bundle/hkp-frontend/src/runtime/browser/services/TriggerPadUI.tsx +160 -0
  503. package/bundle/hkp-frontend/src/runtime/browser/services/UuidGenerator.ts +74 -0
  504. package/bundle/hkp-frontend/src/runtime/browser/services/UuidGeneratorUI.tsx +59 -0
  505. package/bundle/hkp-frontend/src/runtime/browser/services/WaveformDisplay.tsx +104 -0
  506. package/bundle/hkp-frontend/src/runtime/browser/services/WebsocketClient.ts +114 -0
  507. package/bundle/hkp-frontend/src/runtime/browser/services/WebsocketClientUI.tsx +42 -0
  508. package/bundle/hkp-frontend/src/runtime/browser/services/WorkflowBoardBuilder.ts +499 -0
  509. package/bundle/hkp-frontend/src/runtime/browser/services/WorkflowBoardBuilderUI.tsx +521 -0
  510. package/bundle/hkp-frontend/src/runtime/browser/services/XYPad.ts +68 -0
  511. package/bundle/hkp-frontend/src/runtime/browser/services/XYPadUI.tsx +274 -0
  512. package/bundle/hkp-frontend/src/runtime/browser/services/audio/audioHelper.ts +36 -0
  513. package/bundle/hkp-frontend/src/runtime/browser/services/base/Batcher.ts +76 -0
  514. package/bundle/hkp-frontend/src/runtime/browser/services/base/Buffer.ts +142 -0
  515. package/bundle/hkp-frontend/src/runtime/browser/services/base/Filter.ts +125 -0
  516. package/bundle/hkp-frontend/src/runtime/browser/services/base/GroupBy.ts +101 -0
  517. package/bundle/hkp-frontend/src/runtime/browser/services/base/Map.ts +543 -0
  518. package/bundle/hkp-frontend/src/runtime/browser/services/base/MatchFilter.ts +49 -0
  519. package/bundle/hkp-frontend/src/runtime/browser/services/base/Monitor.ts +75 -0
  520. package/bundle/hkp-frontend/src/runtime/browser/services/base/Reduce.ts +74 -0
  521. package/bundle/hkp-frontend/src/runtime/browser/services/base/Timer.ts +342 -0
  522. package/bundle/hkp-frontend/src/runtime/browser/services/base/bundle.js +7375 -0
  523. package/bundle/hkp-frontend/src/runtime/browser/services/base/eval.ts +208 -0
  524. package/bundle/hkp-frontend/src/runtime/browser/services/base/expressionEval.ts +223 -0
  525. package/bundle/hkp-frontend/src/runtime/browser/services/base/helpers.ts +10 -0
  526. package/bundle/hkp-frontend/src/runtime/browser/services/base/index.ts +37 -0
  527. package/bundle/hkp-frontend/src/runtime/browser/services/camera/videoCapture.ts +78 -0
  528. package/bundle/hkp-frontend/src/runtime/browser/services/changes-modes.ts +9 -0
  529. package/bundle/hkp-frontend/src/runtime/browser/services/colorpalette.ts +26 -0
  530. package/bundle/hkp-frontend/src/runtime/browser/services/detect/DetectionPreview.tsx +76 -0
  531. package/bundle/hkp-frontend/src/runtime/browser/services/detect/mediapipe.ts +34 -0
  532. package/bundle/hkp-frontend/src/runtime/browser/services/detect/models/README.md +14 -0
  533. package/bundle/hkp-frontend/src/runtime/browser/services/detect/models/blaze_face_short_range.tflite +0 -0
  534. package/bundle/hkp-frontend/src/runtime/browser/services/detect-modes.ts +7 -0
  535. package/bundle/hkp-frontend/src/runtime/browser/services/encode-modes.ts +10 -0
  536. package/bundle/hkp-frontend/src/runtime/browser/services/helpers.ts +300 -0
  537. package/bundle/hkp-frontend/src/runtime/browser/services/http-client-methods.ts +10 -0
  538. package/bundle/hkp-frontend/src/runtime/browser/services/sql-database.ts +594 -0
  539. package/bundle/hkp-frontend/src/runtime/browser/services/sql-dump.ts +192 -0
  540. package/bundle/hkp-frontend/src/runtime/browser/services/sql-inspect.ts +130 -0
  541. package/bundle/hkp-frontend/src/runtime/browser/services/sql-inspector.css +155 -0
  542. package/bundle/hkp-frontend/src/runtime/browser/services/sql-modes.ts +27 -0
  543. package/bundle/hkp-frontend/src/runtime/browser/services/tests/TESTING_APPROACH.md +169 -0
  544. package/bundle/hkp-frontend/src/runtime/browser/services/tests/__snapshots__/service-ui.future-enhancements.test.tsx.snap +5 -0
  545. package/bundle/hkp-frontend/src/runtime/browser/services/tests/audio-input-permissions.test.ts +42 -0
  546. package/bundle/hkp-frontend/src/runtime/browser/services/tests/audiolizeLanes.test.ts +70 -0
  547. package/bundle/hkp-frontend/src/runtime/browser/services/tests/browser-scopes.test.ts +305 -0
  548. package/bundle/hkp-frontend/src/runtime/browser/services/tests/cache-service.test.ts +53 -0
  549. package/bundle/hkp-frontend/src/runtime/browser/services/tests/camera-video-capture.test.ts +24 -0
  550. package/bundle/hkp-frontend/src/runtime/browser/services/tests/changes-service.test.ts +133 -0
  551. package/bundle/hkp-frontend/src/runtime/browser/services/tests/crypto-secrets.test.ts +196 -0
  552. package/bundle/hkp-frontend/src/runtime/browser/services/tests/detect-service.test.ts +119 -0
  553. package/bundle/hkp-frontend/src/runtime/browser/services/tests/download.test.ts +100 -0
  554. package/bundle/hkp-frontend/src/runtime/browser/services/tests/expressionEval.test.ts +117 -0
  555. package/bundle/hkp-frontend/src/runtime/browser/services/tests/fetcher-panel.test.tsx +35 -0
  556. package/bundle/hkp-frontend/src/runtime/browser/services/tests/fetcher-service.test.ts +80 -0
  557. package/bundle/hkp-frontend/src/runtime/browser/services/tests/filter-service.test.ts +37 -0
  558. package/bundle/hkp-frontend/src/runtime/browser/services/tests/github-secrets.test.ts +108 -0
  559. package/bundle/hkp-frontend/src/runtime/browser/services/tests/group-by-board.test.ts +42 -0
  560. package/bundle/hkp-frontend/src/runtime/browser/services/tests/hold-service.test.ts +199 -0
  561. package/bundle/hkp-frontend/src/runtime/browser/services/tests/http-client-service.test.ts +474 -0
  562. package/bundle/hkp-frontend/src/runtime/browser/services/tests/http-uploader-token-injector.test.ts +152 -0
  563. package/bundle/hkp-frontend/src/runtime/browser/services/tests/iterator-gather-service.test.ts +277 -0
  564. package/bundle/hkp-frontend/src/runtime/browser/services/tests/map-service.test.ts +1047 -0
  565. package/bundle/hkp-frontend/src/runtime/browser/services/tests/map-ui.test.tsx +70 -0
  566. package/bundle/hkp-frontend/src/runtime/browser/services/tests/nested-rhythm-board.test.ts +311 -0
  567. package/bundle/hkp-frontend/src/runtime/browser/services/tests/night-groove-board.test.ts +290 -0
  568. package/bundle/hkp-frontend/src/runtime/browser/services/tests/pad-groove-board.test.ts +230 -0
  569. package/bundle/hkp-frontend/src/runtime/browser/services/tests/peer-host-discovery.test.ts +77 -0
  570. package/bundle/hkp-frontend/src/runtime/browser/services/tests/peer-socket-discovery.test.ts +69 -0
  571. package/bundle/hkp-frontend/src/runtime/browser/services/tests/pipeline-names.test.ts +63 -0
  572. package/bundle/hkp-frontend/src/runtime/browser/services/tests/secret-canary.test.ts +121 -0
  573. package/bundle/hkp-frontend/src/runtime/browser/services/tests/service-modules.contract.test.ts +229 -0
  574. package/bundle/hkp-frontend/src/runtime/browser/services/tests/service-ui.advanced.test.tsx +670 -0
  575. package/bundle/hkp-frontend/src/runtime/browser/services/tests/service-ui.future-enhancements.test.tsx +219 -0
  576. package/bundle/hkp-frontend/src/runtime/browser/services/tests/service-ui.integration.test.tsx +432 -0
  577. package/bundle/hkp-frontend/src/runtime/browser/services/tests/service-ui.smoke.test.tsx +140 -0
  578. package/bundle/hkp-frontend/src/runtime/browser/services/tests/sound-service.test.ts +293 -0
  579. package/bundle/hkp-frontend/src/runtime/browser/services/tests/spread-service.test.ts +137 -0
  580. package/bundle/hkp-frontend/src/runtime/browser/services/tests/sql-dump.test.ts +172 -0
  581. package/bundle/hkp-frontend/src/runtime/browser/services/tests/sql-inspect.test.ts +163 -0
  582. package/bundle/hkp-frontend/src/runtime/browser/services/tests/sql-inspector.test.tsx +121 -0
  583. package/bundle/hkp-frontend/src/runtime/browser/services/tests/sql.test.ts +702 -0
  584. package/bundle/hkp-frontend/src/runtime/browser/services/tests/sub-service-in-block.test.tsx +84 -0
  585. package/bundle/hkp-frontend/src/runtime/browser/services/tests/switch-service.test.ts +254 -0
  586. package/bundle/hkp-frontend/src/runtime/browser/services/tests/timeline-board.test.ts +218 -0
  587. package/bundle/hkp-frontend/src/runtime/browser/services/tests/timeline-service.test.ts +1002 -0
  588. package/bundle/hkp-frontend/src/runtime/browser/services/tests/timeline-ui-model.test.ts +230 -0
  589. package/bundle/hkp-frontend/src/runtime/browser/services/tests/timeline-ui.test.tsx +371 -0
  590. package/bundle/hkp-frontend/src/runtime/browser/services/tests/timer-service.test.ts +902 -0
  591. package/bundle/hkp-frontend/src/runtime/browser/services/tests/tracks-service.test.ts +275 -0
  592. package/bundle/hkp-frontend/src/runtime/browser/services/tests/tracks-ui.test.tsx +126 -0
  593. package/bundle/hkp-frontend/src/runtime/browser/services/tests/triggerpad-recorder-board.test.ts +100 -0
  594. package/bundle/hkp-frontend/src/runtime/browser/services/tests/uuid-generator-service.test.ts +214 -0
  595. package/bundle/hkp-frontend/src/runtime/browser/services/timeline-core.ts +410 -0
  596. package/bundle/hkp-frontend/src/runtime/browser/services/workflow-prompt/DefaultWorkflowBoard.ts +90 -0
  597. package/bundle/hkp-frontend/src/runtime/browser/services/workflow-prompt/RefinementSession.ts +121 -0
  598. package/bundle/hkp-frontend/src/runtime/browser/services/workflow-prompt/SystemPromptCatalog.ts +245 -0
  599. package/bundle/hkp-frontend/src/runtime/browser/services/workflow-prompt/catalog/browser-service-specs.json +110 -0
  600. package/bundle/hkp-frontend/src/runtime/browser/services/workflow-prompt/catalog/runtime-capabilities.json +37 -0
  601. package/bundle/hkp-frontend/src/runtime/browser/tests/asset-service.test.ts +73 -0
  602. package/bundle/hkp-frontend/src/runtime/browser/tests/board-persistence.integration.test.tsx +391 -0
  603. package/bundle/hkp-frontend/src/runtime/browser/tests/browser-runtime.identity-binding.test.tsx +81 -0
  604. package/bundle/hkp-frontend/src/runtime/browser/tests/demo-boards.regression.test.tsx +386 -0
  605. package/bundle/hkp-frontend/src/runtime/browser/tests/failed-call-lifecycle.test.ts +56 -0
  606. package/bundle/hkp-frontend/src/runtime/browser/tests/http-client.integration.test.ts +146 -0
  607. package/bundle/hkp-frontend/src/runtime/browser/tests/nested-run.integration.test.ts +415 -0
  608. package/bundle/hkp-frontend/src/runtime/browser/tests/replay-next.test.ts +391 -0
  609. package/bundle/hkp-frontend/src/runtime/browser/tests/rerun.test.ts +71 -0
  610. package/bundle/hkp-frontend/src/runtime/browser/tests/run-no-input.test.ts +72 -0
  611. package/bundle/hkp-frontend/src/runtime/browser/tests/runtime-add.integration.test.tsx +256 -0
  612. package/bundle/hkp-frontend/src/runtime/browser/tests/runtime-operations.integration.test.tsx +310 -0
  613. package/bundle/hkp-frontend/src/runtime/browser/tests/runtime-processing.integration.test.ts +311 -0
  614. package/bundle/hkp-frontend/src/runtime/browser/tests/runtime-removal.integration.test.tsx +454 -0
  615. package/bundle/hkp-frontend/src/runtime/browser/tests/runtime-update.identity.integration.test.tsx +145 -0
  616. package/bundle/hkp-frontend/src/runtime/browser/tests/service-operations.integration.test.tsx +511 -0
  617. package/bundle/hkp-node/src/address.ts +72 -0
  618. package/bundle/hkp-node/src/assets.ts +582 -0
  619. package/bundle/hkp-node/src/auth.ts +369 -0
  620. package/bundle/hkp-node/src/callReport.ts +281 -0
  621. package/bundle/hkp-node/src/coordinator/auth.ts +85 -0
  622. package/bundle/hkp-node/src/coordinator/binaryFrame.ts +189 -0
  623. package/bundle/hkp-node/src/coordinator/boardStore.ts +0 -0
  624. package/bundle/hkp-node/src/coordinator/bridge.ts +242 -0
  625. package/bundle/hkp-node/src/coordinator/bridgeProtocol.ts +200 -0
  626. package/bundle/hkp-node/src/coordinator/coordinator.ts +594 -0
  627. package/bundle/hkp-node/src/coordinator/facadeAccess.ts +426 -0
  628. package/bundle/hkp-node/src/coordinator/fileBoardStore.ts +159 -0
  629. package/bundle/hkp-node/src/coordinator/frameLimits.ts +41 -0
  630. package/bundle/hkp-node/src/coordinator/index.ts +12 -0
  631. package/bundle/hkp-node/src/coordinator/join.ts +62 -0
  632. package/bundle/hkp-node/src/coordinator/logStore.ts +335 -0
  633. package/bundle/hkp-node/src/coordinator/members.ts +133 -0
  634. package/bundle/hkp-node/src/coordinator/mount.ts +124 -0
  635. package/bundle/hkp-node/src/coordinator/participantProtocol.ts +169 -0
  636. package/bundle/hkp-node/src/coordinator/participants.ts +666 -0
  637. package/bundle/hkp-node/src/coordinator/router.ts +416 -0
  638. package/bundle/hkp-node/src/coordinator/session.ts +1610 -0
  639. package/bundle/hkp-node/src/coordinator/types.ts +95 -0
  640. package/bundle/hkp-node/src/coordinatorLinks.ts +712 -0
  641. package/bundle/hkp-node/src/credentialedFetch.ts +122 -0
  642. package/bundle/hkp-node/src/egress.ts +344 -0
  643. package/bundle/hkp-node/src/expressionEval.ts +223 -0
  644. package/bundle/hkp-node/src/index.ts +470 -0
  645. package/bundle/hkp-node/src/instance.ts +172 -0
  646. package/bundle/hkp-node/src/mounts.ts +296 -0
  647. package/bundle/hkp-node/src/origins.ts +201 -0
  648. package/bundle/hkp-node/src/reset.ts +187 -0
  649. package/bundle/hkp-node/src/runtime.ts +1345 -0
  650. package/bundle/hkp-node/src/secrets.ts +292 -0
  651. package/bundle/hkp-node/src/server.ts +2120 -0
  652. package/bundle/hkp-node/src/services/asset.ts +150 -0
  653. package/bundle/hkp-node/src/services/claudeModels.ts +370 -0
  654. package/bundle/hkp-node/src/services/communication-dispatcher.ts +735 -0
  655. package/bundle/hkp-node/src/services/conversations.ts +914 -0
  656. package/bundle/hkp-node/src/services/database.ts +386 -0
  657. package/bundle/hkp-node/src/services/document-extract.ts +575 -0
  658. package/bundle/hkp-node/src/services/expression.ts +417 -0
  659. package/bundle/hkp-node/src/services/fileStore.ts +369 -0
  660. package/bundle/hkp-node/src/services/filesystem.ts +280 -0
  661. package/bundle/hkp-node/src/services/gather.ts +335 -0
  662. package/bundle/hkp-node/src/services/hold.ts +275 -0
  663. package/bundle/hkp-node/src/services/http-client.ts +525 -0
  664. package/bundle/hkp-node/src/services/http-server.ts +1222 -0
  665. package/bundle/hkp-node/src/services/imap-email.ts +627 -0
  666. package/bundle/hkp-node/src/services/injector.ts +135 -0
  667. package/bundle/hkp-node/src/services/iterator.ts +203 -0
  668. package/bundle/hkp-node/src/services/join.ts +226 -0
  669. package/bundle/hkp-node/src/services/map.ts +632 -0
  670. package/bundle/hkp-node/src/services/monitor.ts +128 -0
  671. package/bundle/hkp-node/src/services/nested-pipeline.ts +405 -0
  672. package/bundle/hkp-node/src/services/peer-server.ts +268 -0
  673. package/bundle/hkp-node/src/services/queue-store.ts +301 -0
  674. package/bundle/hkp-node/src/services/queue.ts +316 -0
  675. package/bundle/hkp-node/src/services/recordStore.ts +341 -0
  676. package/bundle/hkp-node/src/services/rss-parse.ts +281 -0
  677. package/bundle/hkp-node/src/services/rss.ts +392 -0
  678. package/bundle/hkp-node/src/services/smtp-email.ts +398 -0
  679. package/bundle/hkp-node/src/services/spread.ts +153 -0
  680. package/bundle/hkp-node/src/services/sql-dump.ts +192 -0
  681. package/bundle/hkp-node/src/services/sql.ts +429 -0
  682. package/bundle/hkp-node/src/services/stopper.ts +69 -0
  683. package/bundle/hkp-node/src/services/storage.ts +332 -0
  684. package/bundle/hkp-node/src/services/store.ts +609 -0
  685. package/bundle/hkp-node/src/services/stream.ts +367 -0
  686. package/bundle/hkp-node/src/services/sub-service.ts +600 -0
  687. package/bundle/hkp-node/src/services/telegram-listener.ts +263 -0
  688. package/bundle/hkp-node/src/services/telegram-sender.ts +136 -0
  689. package/bundle/hkp-node/src/services/text-generation.ts +1249 -0
  690. package/bundle/hkp-node/src/services/timer.ts +273 -0
  691. package/bundle/hkp-node/src/services/tracks.ts +381 -0
  692. package/bundle/hkp-node/src/services/websocket-reader.ts +364 -0
  693. package/bundle/hkp-node/src/types.ts +465 -0
  694. package/bundle/hkp-node/src/wsTickets.ts +77 -0
  695. package/bundle/hkp-node/src/yas.ts +95 -0
  696. package/bundle/hkp-python/src/hkp/__init__.py +1 -0
  697. package/bundle/hkp-python/src/hkp/__main__.py +241 -0
  698. package/bundle/hkp-python/src/hkp/address.py +56 -0
  699. package/bundle/hkp-python/src/hkp/assets.py +439 -0
  700. package/bundle/hkp-python/src/hkp/auth.py +252 -0
  701. package/bundle/hkp-python/src/hkp/binary_frame.py +100 -0
  702. package/bundle/hkp-python/src/hkp/call_report.py +201 -0
  703. package/bundle/hkp-python/src/hkp/coordinator_links.py +667 -0
  704. package/bundle/hkp-python/src/hkp/data.py +118 -0
  705. package/bundle/hkp-python/src/hkp/egress.py +310 -0
  706. package/bundle/hkp-python/src/hkp/mount.py +46 -0
  707. package/bundle/hkp-python/src/hkp/mounts.py +288 -0
  708. package/bundle/hkp-python/src/hkp/origins.py +169 -0
  709. package/bundle/hkp-python/src/hkp/runtime.py +1131 -0
  710. package/bundle/hkp-python/src/hkp/secrets.py +261 -0
  711. package/bundle/hkp-python/src/hkp/server.py +1714 -0
  712. package/bundle/hkp-python/src/hkp/services/__init__.py +0 -0
  713. package/bundle/hkp-python/src/hkp/services/asset.py +123 -0
  714. package/bundle/hkp-python/src/hkp/services/audio_encode.py +190 -0
  715. package/bundle/hkp-python/src/hkp/services/expression.py +942 -0
  716. package/bundle/hkp-python/src/hkp/services/gather.py +266 -0
  717. package/bundle/hkp-python/src/hkp/services/hold.py +246 -0
  718. package/bundle/hkp-python/src/hkp/services/http_client.py +444 -0
  719. package/bundle/hkp-python/src/hkp/services/http_server.py +790 -0
  720. package/bundle/hkp-python/src/hkp/services/iterator.py +141 -0
  721. package/bundle/hkp-python/src/hkp/services/join.py +173 -0
  722. package/bundle/hkp-python/src/hkp/services/map_service.py +452 -0
  723. package/bundle/hkp-python/src/hkp/services/monitor.py +99 -0
  724. package/bundle/hkp-python/src/hkp/services/nested_pipeline.py +278 -0
  725. package/bundle/hkp-python/src/hkp/services/skill_router.py +388 -0
  726. package/bundle/hkp-python/src/hkp/services/speech_to_text.py +186 -0
  727. package/bundle/hkp-python/src/hkp/services/spread.py +114 -0
  728. package/bundle/hkp-python/src/hkp/services/stopper.py +59 -0
  729. package/bundle/hkp-python/src/hkp/services/sub_service.py +417 -0
  730. package/bundle/hkp-python/src/hkp/services/text_generation.py +498 -0
  731. package/bundle/hkp-python/src/hkp/services/text_to_speech.py +237 -0
  732. package/bundle/hkp-python/src/hkp/services/timer.py +267 -0
  733. package/bundle/hkp-python/src/hkp/services/tracks.py +251 -0
  734. package/bundle/hkp-python/src/hkp/types.py +412 -0
  735. package/bundle/hkp-python/src/hkp/ws_tickets.py +54 -0
  736. package/bundle/hkp-python/src/hkp/yas.py +192 -0
  737. package/bundle/hkp-rt/lib/CMakeLists.txt +193 -0
  738. package/bundle/hkp-rt/lib/hkp-bundles/CMakeLists.txt +55 -0
  739. package/bundle/hkp-rt/lib/hkp-bundles/plugin_register.cpp +14 -0
  740. package/bundle/hkp-rt/lib/include/app.h +201 -0
  741. package/bundle/hkp-rt/lib/include/assets.h +239 -0
  742. package/bundle/hkp-rt/lib/include/auth.h +167 -0
  743. package/bundle/hkp-rt/lib/include/call_report.h +197 -0
  744. package/bundle/hkp-rt/lib/include/coordinator_links.h +127 -0
  745. package/bundle/hkp-rt/lib/include/discovery_hooks.h +29 -0
  746. package/bundle/hkp-rt/lib/include/egress.h +379 -0
  747. package/bundle/hkp-rt/lib/include/files.h +275 -0
  748. package/bundle/hkp-rt/lib/include/log_entry.h +131 -0
  749. package/bundle/hkp-rt/lib/include/mounts.h +139 -0
  750. package/bundle/hkp-rt/lib/include/origins.h +363 -0
  751. package/bundle/hkp-rt/lib/include/registry.h +119 -0
  752. package/bundle/hkp-rt/lib/include/secrets.h +414 -0
  753. package/bundle/hkp-rt/lib/include/server.h +122 -0
  754. package/bundle/hkp-rt/lib/include/service.h +190 -0
  755. package/bundle/hkp-rt/lib/include/slot_store.h +41 -0
  756. package/bundle/hkp-rt/lib/include/standalone_config.h +253 -0
  757. package/bundle/hkp-rt/lib/include/types/audio.h +3 -0
  758. package/bundle/hkp-rt/lib/include/types/data.h +152 -0
  759. package/bundle/hkp-rt/lib/include/types/message.h +56 -0
  760. package/bundle/hkp-rt/lib/include/types/models.h +154 -0
  761. package/bundle/hkp-rt/lib/include/types/owns_me.h +19 -0
  762. package/bundle/hkp-rt/lib/include/types/ringbuffer.h +86 -0
  763. package/bundle/hkp-rt/lib/include/types/types.h +33 -0
  764. package/bundle/hkp-rt/lib/include/types/validation.h +205 -0
  765. package/bundle/hkp-rt/lib/src/address.h +88 -0
  766. package/bundle/hkp-rt/lib/src/app.cpp +591 -0
  767. package/bundle/hkp-rt/lib/src/assets.cpp +686 -0
  768. package/bundle/hkp-rt/lib/src/binary_frame.h +154 -0
  769. package/bundle/hkp-rt/lib/src/common/expression.h +1481 -0
  770. package/bundle/hkp-rt/lib/src/common/inja.h +36 -0
  771. package/bundle/hkp-rt/lib/src/common/link_socket.cpp +437 -0
  772. package/bundle/hkp-rt/lib/src/common/link_socket.h +97 -0
  773. package/bundle/hkp-rt/lib/src/common/realtime_wakeup.h +120 -0
  774. package/bundle/hkp-rt/lib/src/common/stream_broadcast.h +250 -0
  775. package/bundle/hkp-rt/lib/src/common/string_util.h +31 -0
  776. package/bundle/hkp-rt/lib/src/common/websocket_client_session.cpp +217 -0
  777. package/bundle/hkp-rt/lib/src/common/websocket_client_session.h +37 -0
  778. package/bundle/hkp-rt/lib/src/common/websocket_config.h +119 -0
  779. package/bundle/hkp-rt/lib/src/common/websocket_protocol.h +32 -0
  780. package/bundle/hkp-rt/lib/src/common/websocket_server.cpp +82 -0
  781. package/bundle/hkp-rt/lib/src/common/websocket_server.h +57 -0
  782. package/bundle/hkp-rt/lib/src/common/websocket_server_listener.cpp +115 -0
  783. package/bundle/hkp-rt/lib/src/common/websocket_server_listener.h +35 -0
  784. package/bundle/hkp-rt/lib/src/common/websocket_server_session.cpp +172 -0
  785. package/bundle/hkp-rt/lib/src/common/websocket_server_session.h +53 -0
  786. package/bundle/hkp-rt/lib/src/common.h +13 -0
  787. package/bundle/hkp-rt/lib/src/coordinator_links.cpp +1142 -0
  788. package/bundle/hkp-rt/lib/src/discovery/discovery.cpp +707 -0
  789. package/bundle/hkp-rt/lib/src/discovery/discovery.h +89 -0
  790. package/bundle/hkp-rt/lib/src/http/auth.cpp +569 -0
  791. package/bundle/hkp-rt/lib/src/http/front_door.cpp +518 -0
  792. package/bundle/hkp-rt/lib/src/http/front_door.h +131 -0
  793. package/bundle/hkp-rt/lib/src/http/server.cpp +1539 -0
  794. package/bundle/hkp-rt/lib/src/http/ws_tickets.h +125 -0
  795. package/bundle/hkp-rt/lib/src/mount.h +63 -0
  796. package/bundle/hkp-rt/lib/src/process_context.h +335 -0
  797. package/bundle/hkp-rt/lib/src/process_depth.h +20 -0
  798. package/bundle/hkp-rt/lib/src/registry.cpp +233 -0
  799. package/bundle/hkp-rt/lib/src/runtime.cpp +986 -0
  800. package/bundle/hkp-rt/lib/src/runtime.h +225 -0
  801. package/bundle/hkp-rt/lib/src/runtime_host.h +180 -0
  802. package/bundle/hkp-rt/lib/src/service.cpp +315 -0
  803. package/bundle/hkp-rt/lib/src/services/asset.h +185 -0
  804. package/bundle/hkp-rt/lib/src/services/audio_encode.cpp +372 -0
  805. package/bundle/hkp-rt/lib/src/services/audio_encode.h +97 -0
  806. package/bundle/hkp-rt/lib/src/services/cache.h +362 -0
  807. package/bundle/hkp-rt/lib/src/services/cache_subservices.h +463 -0
  808. package/bundle/hkp-rt/lib/src/services/core_audio.cpp +384 -0
  809. package/bundle/hkp-rt/lib/src/services/core_audio.h +22 -0
  810. package/bundle/hkp-rt/lib/src/services/core_input.h +337 -0
  811. package/bundle/hkp-rt/lib/src/services/core_output.h +370 -0
  812. package/bundle/hkp-rt/lib/src/services/ffmpeg/detail.cpp +749 -0
  813. package/bundle/hkp-rt/lib/src/services/ffmpeg/detail.h +29 -0
  814. package/bundle/hkp-rt/lib/src/services/ffmpeg/ffmpeg.cpp +193 -0
  815. package/bundle/hkp-rt/lib/src/services/ffmpeg/ffmpeg.h +40 -0
  816. package/bundle/hkp-rt/lib/src/services/ffmpeg/types.h +120 -0
  817. package/bundle/hkp-rt/lib/src/services/fft_service.h +190 -0
  818. package/bundle/hkp-rt/lib/src/services/filesystem.h +309 -0
  819. package/bundle/hkp-rt/lib/src/services/filter.h +208 -0
  820. package/bundle/hkp-rt/lib/src/services/gather.h +272 -0
  821. package/bundle/hkp-rt/lib/src/services/hold.h +304 -0
  822. package/bundle/hkp-rt/lib/src/services/http_client.cpp +347 -0
  823. package/bundle/hkp-rt/lib/src/services/http_client.h +67 -0
  824. package/bundle/hkp-rt/lib/src/services/http_client_impl.h +45 -0
  825. package/bundle/hkp-rt/lib/src/services/http_client_template_examples.md +202 -0
  826. package/bundle/hkp-rt/lib/src/services/http_server/http_listener.cpp +130 -0
  827. package/bundle/hkp-rt/lib/src/services/http_server/http_listener.h +33 -0
  828. package/bundle/hkp-rt/lib/src/services/http_server/http_server.cpp +351 -0
  829. package/bundle/hkp-rt/lib/src/services/http_server/http_server.h +79 -0
  830. package/bundle/hkp-rt/lib/src/services/http_server/http_server_impl.cpp +230 -0
  831. package/bundle/hkp-rt/lib/src/services/http_server/http_server_impl.h +64 -0
  832. package/bundle/hkp-rt/lib/src/services/http_server/http_server_subservices.cpp +950 -0
  833. package/bundle/hkp-rt/lib/src/services/http_server/http_server_subservices.h +253 -0
  834. package/bundle/hkp-rt/lib/src/services/http_server/http_session.cpp +495 -0
  835. package/bundle/hkp-rt/lib/src/services/http_server/http_session.h +169 -0
  836. package/bundle/hkp-rt/lib/src/services/http_server/http_stream_listener.cpp +270 -0
  837. package/bundle/hkp-rt/lib/src/services/http_server/http_stream_listener.h +104 -0
  838. package/bundle/hkp-rt/lib/src/services/http_server/request_decode.h +164 -0
  839. package/bundle/hkp-rt/lib/src/services/if_service.h +210 -0
  840. package/bundle/hkp-rt/lib/src/services/ifft_service.h +198 -0
  841. package/bundle/hkp-rt/lib/src/services/injector.h +162 -0
  842. package/bundle/hkp-rt/lib/src/services/iterator.h +201 -0
  843. package/bundle/hkp-rt/lib/src/services/map.h +641 -0
  844. package/bundle/hkp-rt/lib/src/services/monitor.h +161 -0
  845. package/bundle/hkp-rt/lib/src/services/mp3_frames.h +119 -0
  846. package/bundle/hkp-rt/lib/src/services/mp4_to_wav.cpp +281 -0
  847. package/bundle/hkp-rt/lib/src/services/mp4_to_wav.h +263 -0
  848. package/bundle/hkp-rt/lib/src/services/peer_server/peer_registry.cpp +88 -0
  849. package/bundle/hkp-rt/lib/src/services/peer_server/peer_registry.h +43 -0
  850. package/bundle/hkp-rt/lib/src/services/peer_server/peer_server.h +163 -0
  851. package/bundle/hkp-rt/lib/src/services/peer_server/peer_server_listener.cpp +133 -0
  852. package/bundle/hkp-rt/lib/src/services/peer_server/peer_server_listener.h +46 -0
  853. package/bundle/hkp-rt/lib/src/services/peer_server/peer_server_session.cpp +165 -0
  854. package/bundle/hkp-rt/lib/src/services/peer_server/peer_server_session.h +44 -0
  855. package/bundle/hkp-rt/lib/src/services/peer_server/peer_ws_session.cpp +184 -0
  856. package/bundle/hkp-rt/lib/src/services/peer_server/peer_ws_session.h +55 -0
  857. package/bundle/hkp-rt/lib/src/services/receiver_session.h +172 -0
  858. package/bundle/hkp-rt/lib/src/services/root_certificates.h +3959 -0
  859. package/bundle/hkp-rt/lib/src/services/sha256_openssl.h +49 -0
  860. package/bundle/hkp-rt/lib/src/services/speech_http.h +306 -0
  861. package/bundle/hkp-rt/lib/src/services/speech_to_text.cpp +595 -0
  862. package/bundle/hkp-rt/lib/src/services/speech_to_text.h +69 -0
  863. package/bundle/hkp-rt/lib/src/services/static.cpp +45 -0
  864. package/bundle/hkp-rt/lib/src/services/static.h +41 -0
  865. package/bundle/hkp-rt/lib/src/services/stopper.h +72 -0
  866. package/bundle/hkp-rt/lib/src/services/sub_service.h +286 -0
  867. package/bundle/hkp-rt/lib/src/services/text_generation.cpp +1132 -0
  868. package/bundle/hkp-rt/lib/src/services/text_generation.h +71 -0
  869. package/bundle/hkp-rt/lib/src/services/text_to_speech.cpp +853 -0
  870. package/bundle/hkp-rt/lib/src/services/text_to_speech.h +97 -0
  871. package/bundle/hkp-rt/lib/src/services/timer.h +300 -0
  872. package/bundle/hkp-rt/lib/src/services/tracks.h +397 -0
  873. package/bundle/hkp-rt/lib/src/services/tts_inflect.cpp +149 -0
  874. package/bundle/hkp-rt/lib/src/services/tts_inflect.h +82 -0
  875. package/bundle/hkp-rt/lib/src/services/wav_reader.h +213 -0
  876. package/bundle/hkp-rt/lib/src/services/websocket_client_service.h +182 -0
  877. package/bundle/hkp-rt/lib/src/services/websocket_reader.h +148 -0
  878. package/bundle/hkp-rt/lib/src/services/websocket_server_service.h +196 -0
  879. package/bundle/hkp-rt/lib/src/services/websocket_writer.cpp +641 -0
  880. package/bundle/hkp-rt/lib/src/services/websocket_writer.h +117 -0
  881. package/bundle/hkp-rt/lib/src/sub_runtime.cpp +234 -0
  882. package/bundle/hkp-rt/lib/src/sub_runtime.h +160 -0
  883. package/bundle/hkp-rt/lib/src/types/data.cpp +237 -0
  884. package/bundle/hkp-rt/lib/src/types/message.cpp +148 -0
  885. package/bundle/hkp-rt/lib/src/types/models.cpp +83 -0
  886. package/bundle/hkp-rt/lib/src/types/ringbuffer.cpp +336 -0
  887. package/bundle/hkp-rt/lib/src/uuid.h +12 -0
  888. package/bundle/readymade-mcp-commits.json +5 -0
  889. package/dist/cli.d.ts +3 -0
  890. package/dist/cli.d.ts.map +1 -0
  891. package/dist/cli.js +79 -0
  892. package/dist/git.d.ts +8 -0
  893. package/dist/git.d.ts.map +1 -0
  894. package/dist/git.js +53 -0
  895. package/dist/http.d.ts +17 -0
  896. package/dist/http.d.ts.map +1 -0
  897. package/dist/http.js +130 -0
  898. package/dist/index.d.ts +7 -0
  899. package/dist/index.d.ts.map +1 -0
  900. package/dist/index.js +6 -0
  901. package/dist/repository.d.ts +49 -0
  902. package/dist/repository.d.ts.map +1 -0
  903. package/dist/repository.js +452 -0
  904. package/dist/schemas.d.ts +156 -0
  905. package/dist/schemas.d.ts.map +1 -0
  906. package/dist/schemas.js +43 -0
  907. package/dist/server.d.ts +4 -0
  908. package/dist/server.d.ts.map +1 -0
  909. package/dist/server.js +83 -0
  910. package/dist/types.d.ts +63 -0
  911. package/dist/types.d.ts.map +1 -0
  912. package/dist/types.js +20 -0
  913. package/dist/validation.d.ts +9 -0
  914. package/dist/validation.d.ts.map +1 -0
  915. package/dist/validation.js +101 -0
  916. package/package.json +52 -4
@@ -0,0 +1,950 @@
1
+ #include "./http_server_subservices.h"
2
+ #include "../../process_context.h"
3
+
4
+ #include "../../mount.h"
5
+
6
+ #include <boost/beast.hpp>
7
+ #include <boost/asio/strand.hpp>
8
+ #include <boost/json.hpp>
9
+
10
+ #include "./http_server_impl.h"
11
+ #include "./http_listener.h"
12
+ #include "./http_session.h"
13
+ #include "./http_stream_listener.h"
14
+ #include "./request_decode.h"
15
+ #include "../../uuid.h"
16
+ #include "../../runtime_host.h"
17
+
18
+ #include <algorithm>
19
+ #include <optional>
20
+ #include <string>
21
+ #include <thread>
22
+
23
+ #if !defined(_WIN32)
24
+ #include <ifaddrs.h>
25
+ #include <net/if.h>
26
+ #include <netinet/in.h>
27
+ #include <arpa/inet.h>
28
+ #endif
29
+
30
+ namespace beast = boost::beast;
31
+ namespace http = beast::http;
32
+ namespace net = boost::asio;
33
+ using tcp = net::ip::tcp;
34
+
35
+ namespace {
36
+
37
+ // Best-effort primary LAN IPv4, so the running server can advertise a link that
38
+ // other devices on the same network can reach (it binds 0.0.0.0). Prefers the
39
+ // Wi-Fi interface (en0 on Apple platforms). Falls back to loopback.
40
+ std::string primaryIPv4()
41
+ {
42
+ std::string result = "127.0.0.1";
43
+ #if !defined(_WIN32)
44
+ struct ifaddrs* ifaddr = nullptr;
45
+ if (getifaddrs(&ifaddr) == -1)
46
+ {
47
+ return result;
48
+ }
49
+ bool foundPreferred = false;
50
+ for (struct ifaddrs* ifa = ifaddr; ifa != nullptr; ifa = ifa->ifa_next)
51
+ {
52
+ if (!ifa->ifa_addr || ifa->ifa_addr->sa_family != AF_INET)
53
+ {
54
+ continue;
55
+ }
56
+ if (!(ifa->ifa_flags & IFF_UP) || (ifa->ifa_flags & IFF_LOOPBACK))
57
+ {
58
+ continue;
59
+ }
60
+ char buf[INET_ADDRSTRLEN] = {0};
61
+ auto* sin = reinterpret_cast<struct sockaddr_in*>(ifa->ifa_addr);
62
+ if (!inet_ntop(AF_INET, &sin->sin_addr, buf, sizeof(buf)))
63
+ {
64
+ continue;
65
+ }
66
+ const std::string name = ifa->ifa_name ? ifa->ifa_name : "";
67
+ if (!foundPreferred)
68
+ {
69
+ result = buf; // first non-loopback candidate
70
+ }
71
+ if (name == "en0") // Wi-Fi on iOS/macOS — strongly preferred
72
+ {
73
+ result = buf;
74
+ foundPreferred = true;
75
+ break;
76
+ }
77
+ }
78
+ freeifaddrs(ifaddr);
79
+ #endif
80
+ return result;
81
+ }
82
+
83
+ // Where a player connects to the stream: its path under the endpoint's
84
+ // address. A bound server's address ends in a slash and a mount's does not, so
85
+ // the two are joined rather than appended. Empty while there is no address.
86
+ std::string streamUrlAt(const std::string& base, const std::string& path)
87
+ {
88
+ if (base.empty())
89
+ {
90
+ return {};
91
+ }
92
+ const bool slashed = base.back() == '/';
93
+ const std::string relative = !path.empty() && path.front() == '/' ? path.substr(1) : path;
94
+ return slashed ? base + relative : base + "/" + relative;
95
+ }
96
+
97
+ } // namespace
98
+
99
+ namespace hkp {
100
+
101
+ using namespace request_decode;
102
+
103
+ std::optional<HttpStreamConfig> parseHttpStreamConfig(const nlohmann::json& value)
104
+ {
105
+ if (!value.is_object() || !value.contains("path") || !value["path"].is_string())
106
+ {
107
+ return std::nullopt;
108
+ }
109
+ HttpStreamConfig config;
110
+ config.path = value["path"].get<std::string>();
111
+ if (config.path.empty())
112
+ {
113
+ return std::nullopt;
114
+ }
115
+ // Compared against a request's path, which always starts with one.
116
+ if (config.path.front() != '/')
117
+ {
118
+ config.path.insert(config.path.begin(), '/');
119
+ }
120
+ if (value.contains("contentType") && value["contentType"].is_string()
121
+ && !value["contentType"].get<std::string>().empty())
122
+ {
123
+ config.contentType = value["contentType"].get<std::string>();
124
+ }
125
+ // Integers as JSON writes them are signed; only a negative one is refused.
126
+ const auto bytesOf = [&value](const char* key) -> std::optional<std::size_t> {
127
+ if (!value.contains(key) || !value[key].is_number_integer() || value[key].get<int64_t>() < 0)
128
+ {
129
+ return std::nullopt;
130
+ }
131
+ return static_cast<std::size_t>(value[key].get<int64_t>());
132
+ };
133
+ if (auto burst = bytesOf("burstBytes"))
134
+ {
135
+ config.burstBytes = *burst;
136
+ }
137
+ if (auto queue = bytesOf("maxQueueBytes"); queue && *queue > 0)
138
+ {
139
+ config.maxQueueBytes = *queue;
140
+ }
141
+ if (auto stall = bytesOf("stallTimeoutMs"); stall && *stall > 0)
142
+ {
143
+ config.stallTimeoutMs = *stall;
144
+ }
145
+ return config;
146
+ }
147
+
148
+ HttpServerSubservices::HttpServerSubservices(const std::string& instanceId)
149
+ : Service(instanceId, serviceId())
150
+ , m_impl(std::make_shared<HttpServerImpl>())
151
+ {
152
+ m_bypass = true; // Start in bypass mode
153
+ // Where the nested pipeline is entered from. Alternatives:
154
+ // process_on_data — data from the outer chain is stored and served back to
155
+ // requests verbatim; the nested pipeline is not used.
156
+ // process_on_both — both entry points run the nested pipeline. It is a
157
+ // single ordered list either way, so a service inside it that needs to
158
+ // tell a request from a data arrival has to do so from the input.
159
+ m_mode = "process_on_session";
160
+ m_broadcast.onListenersChanged([this](std::size_t count) {
161
+ sendNotification(json{{"listeners", count}});
162
+ });
163
+ m_impl->setOnSessionOpenedCallback(
164
+ [this](std::shared_ptr<Session> session, const std::string& path, const std::string& method) {
165
+ onNewSession(session, path, method);
166
+ }
167
+ );
168
+ }
169
+
170
+ HttpServerSubservices::~HttpServerSubservices()
171
+ {
172
+ m_broadcast.onListenersChanged(nullptr);
173
+ m_mount.release();
174
+ m_impl->stop();
175
+ m_broadcast.closeAll();
176
+ }
177
+
178
+ MountHandle HttpServerSubservices::claimMount(const std::string& name)
179
+ {
180
+ // Held weakly: the mount must not keep this service's endpoint alive.
181
+ std::weak_ptr<HttpServerImpl> held = m_impl;
182
+ return mountEndpoint(name, [held](MountedConnection connection) {
183
+ if (auto impl = held.lock())
184
+ {
185
+ impl->adopt(std::move(connection));
186
+ }
187
+ });
188
+ }
189
+
190
+ void HttpServerSubservices::onNewSession(std::shared_ptr<Session> session,
191
+ const std::string& path,
192
+ const std::string& method,
193
+ bool awaitResponse)
194
+ {
195
+ if (!session)
196
+ {
197
+ return;
198
+ }
199
+
200
+ // Describe the request the same way hkp-node's http-server-subservices does,
201
+ // so a pipeline written for one runtime works on the other:
202
+ // meta.method / meta.path / meta.query / meta.headers, plus
203
+ // meta.contentType and meta.filename when the request carries a body.
204
+ // The body then arrives in exactly one form — decoded as `body` when its
205
+ // content type says what the bytes mean, raw as MixedData binary otherwise.
206
+ json meta;
207
+ std::string requestPath;
208
+ json query;
209
+ splitTarget(path, requestPath, query);
210
+
211
+ if (joinStream(session, requestPath, method))
212
+ {
213
+ return;
214
+ }
215
+ meta["method"] = method;
216
+ meta["path"] = requestPath;
217
+ meta["query"] = query;
218
+ // A caller that has to prove who it is does so in a header — a shared secret,
219
+ // a signature, a bearer token — so a pipeline that cannot see them cannot
220
+ // check one. What a board does not name, it does not receive.
221
+ meta["headers"] =
222
+ session ? filterRequestHeaders(session->getRequestHeaders(), m_forwardHeaders)
223
+ : json::object();
224
+
225
+ std::optional<json> decodedBody;
226
+ BinaryData rawBody;
227
+
228
+ if (session && (method == "POST" || method == "PUT" || method == "PATCH"))
229
+ {
230
+ const auto& body = session->getRequestBody();
231
+ const auto contentDisposition = session->getRequestHeader("content-disposition");
232
+ const auto contentType = session->getRequestHeader("content-type");
233
+ const auto uploadId = session->getRequestHeader("x-upload-id");
234
+
235
+ if (!contentType.empty()) meta["contentType"] = contentType;
236
+
237
+ // A named attachment is a file to keep whole, whatever its content type.
238
+ if (isFileTransfer(contentDisposition, uploadId))
239
+ {
240
+ meta["filename"] = extractFilename(contentDisposition);
241
+ rawBody = BinaryData(body.begin(), body.end());
242
+ }
243
+ else
244
+ {
245
+ decodedBody = decodeBody(body, contentType);
246
+ if (!decodedBody && !body.empty())
247
+ {
248
+ rawBody = BinaryData(body.begin(), body.end());
249
+ }
250
+ }
251
+ }
252
+
253
+ Data data = Null();
254
+ if (rawBody.empty())
255
+ {
256
+ json envelope = json{{"meta", meta}};
257
+ if (decodedBody) envelope["body"] = *decodedBody;
258
+ data = Data(envelope);
259
+ }
260
+ else
261
+ {
262
+ MixedData mixed;
263
+ mixed.meta = meta;
264
+ mixed.binary = std::move(rawBody);
265
+ data = Data(mixed);
266
+ }
267
+
268
+ // A declared handler is what takes the answer away from the chain — not the
269
+ // presence of a pipeline, which says only that this endpoint has something to
270
+ // run, possibly on the other side. What the handler returns is what the caller
271
+ // gets; the outer runtime still runs and its result still drives the rest of
272
+ // the board, but it runs after the answer is decided — it is where the side
273
+ // effects of having served a request live, not where the answer is shaped.
274
+ // Without a handler the rest of the board is the handler instead, and its
275
+ // result is the answer.
276
+ const auto requestRun = ProcessContext::newRun("mount");
277
+ const auto handler = entryFor(HttpEntry::kOnRequest);
278
+ if (handler && !handler->empty())
279
+ {
280
+ Data answer = parentHost()
281
+ ? parentHost()->withContext(requestRun, [&handler, &data]() {
282
+ return handler->process(data);
283
+ })
284
+ : handler->process(data);
285
+ Data served = resolveAssetBody(answer);
286
+ session->sendDataSync(served);
287
+ // No callback: nothing downstream is awaited, because the caller has been
288
+ // answered already. Registering one would leave the runtime waiting for a
289
+ // response to a request nobody is holding open.
290
+ nextInRun(answer, requestRun);
291
+ return;
292
+ }
293
+
294
+ if (!awaitResponse)
295
+ {
296
+ Data result = nextInRun(data, requestRun);
297
+ Data served = resolveAssetBody(result);
298
+ session->sendDataSync(served);
299
+ return;
300
+ }
301
+
302
+ nextInRun(data, requestRun, [this, session](Data result) {
303
+ Data served = resolveAssetBody(result);
304
+ session->sendDataSync(served);
305
+ });
306
+ }
307
+
308
+ Data HttpServerSubservices::resolveAssetBody(const Data& answer)
309
+ {
310
+ auto value = getJSONFromData(answer);
311
+ if (!value || !value->is_object() || !value->contains("meta") || !value->contains("body"))
312
+ {
313
+ return answer;
314
+ }
315
+ const auto& meta = (*value)["meta"];
316
+ if (!meta.is_object() || !meta.contains("status") || !meta["status"].is_number_integer())
317
+ {
318
+ return answer;
319
+ }
320
+ const auto& body = (*value)["body"];
321
+ if (!parseAssetRef(body))
322
+ {
323
+ return answer;
324
+ }
325
+
326
+ auto* host = parentHost();
327
+ auto* store = host ? host->assets() : nullptr;
328
+ AssetResolution resolution = store
329
+ ? store->resolve(body.get<std::string>())
330
+ : AssetResolution{ std::nullopt, "this runtime has no assets" };
331
+ if (!resolution.asset)
332
+ {
333
+ sendNotification(json{ { "error", resolution.problem } });
334
+ return Data(json{ { "meta", { { "status", 500 }, { "contentType", "application/json" } } },
335
+ { "body", { { "error", resolution.problem } } } });
336
+ }
337
+
338
+ MixedData served;
339
+ served.meta = meta;
340
+ if (!meta.contains("contentType") || !meta["contentType"].is_string() ||
341
+ meta["contentType"].get<std::string>().empty())
342
+ {
343
+ served.meta["contentType"] = resolution.asset->mediaType;
344
+ }
345
+ served.binary.assign(resolution.asset->content.begin(), resolution.asset->content.end());
346
+ return Data(served);
347
+ }
348
+
349
+ std::string HttpServerSubservices::getServiceId() const
350
+ {
351
+ return serviceId();
352
+ }
353
+
354
+ json HttpServerSubservices::configure(Data data)
355
+ {
356
+ auto buf = getJSONFromData(data);
357
+ if (!buf)
358
+ {
359
+ return Service::configure(data); // handle bypass
360
+ }
361
+
362
+ const bool wasRunning = m_impl->running();
363
+
364
+ unsigned short port = m_impl->port();
365
+ const bool portChanged = updateIfNeeded(port, (*buf)["port"]);
366
+ if (portChanged)
367
+ {
368
+ m_impl->setPort(port);
369
+ }
370
+
371
+ if (buf->contains("mountName") && (*buf)["mountName"].is_string())
372
+ {
373
+ m_mountName = (*buf)["mountName"].get<std::string>();
374
+ }
375
+
376
+ // An array is a decision, including an empty one. Anything else — absent,
377
+ // null, a string — leaves the default of forwarding all of them.
378
+ if (buf->contains("forwardHeaders"))
379
+ {
380
+ const auto& named = (*buf)["forwardHeaders"];
381
+ if (named.is_array())
382
+ {
383
+ std::vector<std::string> names;
384
+ for (const auto& entry : named)
385
+ {
386
+ if (entry.is_string())
387
+ {
388
+ auto name = entry.get<std::string>();
389
+ std::transform(name.begin(), name.end(), name.begin(),
390
+ [](unsigned char c) { return std::tolower(c); });
391
+ names.push_back(name);
392
+ }
393
+ }
394
+ m_forwardHeaders = names;
395
+ }
396
+ else
397
+ {
398
+ m_forwardHeaders.reset();
399
+ }
400
+ }
401
+
402
+ if (updateIfNeeded(m_mode, (*buf)["mode"]))
403
+ {
404
+ // process_on_both serves requests exactly as process_on_session does; what
405
+ // it adds is running the nested pipeline for data arriving from the outer
406
+ // chain too, which happens in process().
407
+ if (m_mode == "process_on_session" || m_mode == "process_on_both")
408
+ {
409
+ m_impl->setOnSessionOpenedCallback(
410
+ [this](std::shared_ptr<Session> session, const std::string& path, const std::string& method) {
411
+ onNewSession(session, path, method);
412
+ }
413
+ );
414
+ }
415
+ else
416
+ {
417
+ m_impl->resetOnSessionOpenedCallback();
418
+ }
419
+ }
420
+
421
+ // Declaring an entry point by name is what puts this endpoint in the newer
422
+ // form, and from then on its state is reported that way.
423
+ for (const auto& [key, entry] : {std::pair{"onProcess", HttpEntry::kOnProcess},
424
+ std::pair{"onRequest", HttpEntry::kOnRequest}})
425
+ {
426
+ if (buf->contains(key) && (*buf)[key].is_array())
427
+ {
428
+ m_named = true;
429
+ editPipeline(entryPipeline(entry), json{{"pipeline", (*buf)[key]}});
430
+ // A named endpoint always enters onNewSession, which decides for itself
431
+ // whether it has a handler. Only the legacy process_on_data answers out
432
+ // of the server's own store, with no session callback at all.
433
+ m_impl->setOnSessionOpenedCallback(
434
+ [this](std::shared_ptr<Session> session, const std::string& path, const std::string& method) {
435
+ onNewSession(session, path, method);
436
+ }
437
+ );
438
+ }
439
+ }
440
+
441
+ // `null`, or anything that names no path, ends the stream: whoever is
442
+ // listening is let go, since nothing will be written to them again.
443
+ if (buf->contains("stream"))
444
+ {
445
+ auto declared = parseHttpStreamConfig((*buf)["stream"]);
446
+ bool ended = false;
447
+ {
448
+ std::lock_guard<std::mutex> lock(m_streamMutex);
449
+ ended = m_stream && !declared;
450
+ m_stream = declared;
451
+ }
452
+ m_broadcast.setBurstBytes(declared ? declared->burstBytes : 0);
453
+ if (ended)
454
+ {
455
+ m_broadcast.closeAll();
456
+ }
457
+ }
458
+
459
+ // An edit aimed at one named entry. The unscoped verbs below cannot say which
460
+ // pipeline they mean once there is more than one.
461
+ if (buf->contains("configurePipeline") && (*buf)["configurePipeline"].is_object())
462
+ {
463
+ const auto& payload = (*buf)["configurePipeline"];
464
+ const std::string named = payload.value("entry", "");
465
+ if (named == "onProcess" || named == "onRequest")
466
+ {
467
+ m_named = true;
468
+ editPipeline(
469
+ entryPipeline(named == "onProcess" ? HttpEntry::kOnProcess : HttpEntry::kOnRequest),
470
+ payload);
471
+ }
472
+ }
473
+
474
+ // The unscoped verbs belong to the one pipeline a legacy board declares. Left
475
+ // working rather than redirected at an entry, because which entry they would
476
+ // mean is exactly what the older form cannot say.
477
+ if (buf->contains("pipeline") || buf->contains("appendService")
478
+ || buf->contains("removeService") || buf->contains("configureService"))
479
+ {
480
+ editPipeline(m_legacy, *buf);
481
+ }
482
+
483
+ // Bypass last. Leaving bypass binds a port and publishes the address, so both
484
+ // have to be decided by the configuration this same call carries: a board
485
+ // being restored arrives as one configure holding the saved port and
486
+ // bypass:false together, and handling the bypass first would bind before the
487
+ // port was applied — the server would come up on an OS-assigned port and the
488
+ // board would advertise a different endpoint on every load.
489
+ Service::configure(data);
490
+
491
+ // The port is only read when the acceptor binds, so changing it on a running
492
+ // server takes a rebind — otherwise the state advertises a port nothing is
493
+ // listening on.
494
+ // Served from a mount there is no port to rebind: the address is the
495
+ // server's, and what a board says of a port is not acted on.
496
+ if (portChanged && wasRunning && m_impl->running() && !m_impl->mounted())
497
+ {
498
+ stop();
499
+ if (!start())
500
+ {
501
+ std::cerr << "HttpServerSubservices::configure() Failed to rebind on port: "
502
+ << port << std::endl;
503
+ setBypass(true); // nothing is listening; say so rather than report online
504
+ }
505
+ }
506
+
507
+ // Renaming a mount rotates its capability URL. Move the live adopter to the
508
+ // newly derived address and release the one it previously held.
509
+ if (m_mount && mountName() != m_mount.name())
510
+ {
511
+ m_mount = claimMount(mountName());
512
+ m_url = m_mount.url();
513
+ if (m_mount)
514
+ {
515
+ sendNotification(json{{MOUNT_FIELD, m_url}, {"status", "online"}});
516
+ }
517
+ }
518
+
519
+ return getState();
520
+ }
521
+
522
+ json HttpServerSubservices::pipelineState(const Pipeline& pipeline)
523
+ {
524
+ json state = json::array();
525
+ if (!pipeline.runtime)
526
+ {
527
+ for (const auto& cfg : pipeline.config)
528
+ {
529
+ state.push_back(json{
530
+ {"serviceId", cfg.value("serviceId", "")},
531
+ {"instanceId", cfg.value("instanceId", "")},
532
+ {"state", cfg.value("state", json::object())}
533
+ });
534
+ }
535
+ return state;
536
+ }
537
+
538
+ for (auto it = pipeline.runtime->begin(); it != pipeline.runtime->end(); ++it)
539
+ {
540
+ const auto& svc = *it;
541
+ state.push_back(json{
542
+ {"serviceId", svc->getServiceId()},
543
+ {"instanceId", svc->getId()},
544
+ {"state", svc->getState()}
545
+ });
546
+ }
547
+ return state;
548
+ }
549
+
550
+ json HttpServerSubservices::getState() const
551
+ {
552
+ json state = json{
553
+ {"port", m_impl->port()},
554
+ {"host", m_host},
555
+ // Public endpoint. Reserved name: generic board machinery reads and
556
+ // rewrites it (see the frontend's runtime/board/mount).
557
+ {MOUNT_FIELD, m_url},
558
+ {"mountName", m_mountName},
559
+ {"status", isBypass() ? "offline" : "online"},
560
+ {"forwardHeaders", m_forwardHeaders ? json(*m_forwardHeaders) : json(nullptr)}
561
+ };
562
+
563
+ {
564
+ std::lock_guard<std::mutex> lock(m_streamMutex);
565
+ if (m_stream)
566
+ {
567
+ state["stream"] = json{
568
+ {"path", m_stream->path},
569
+ {"contentType", m_stream->contentType},
570
+ {"burstBytes", m_stream->burstBytes},
571
+ {"maxQueueBytes", m_stream->maxQueueBytes},
572
+ {"stallTimeoutMs", m_stream->stallTimeoutMs},
573
+ };
574
+ // Who, not only how many: a count alone cannot tell a second player from
575
+ // a request a browser opened and never closed.
576
+ json details = json::array();
577
+ for (const auto& listener : m_broadcast.listeners())
578
+ {
579
+ if (auto http = std::dynamic_pointer_cast<HttpStreamListener>(listener))
580
+ {
581
+ details.push_back(http->describe());
582
+ }
583
+ }
584
+ state["listeners"] = details.size();
585
+ state["listenerDetails"] = details;
586
+ // Where a player connects. Empty while nothing is listening for it.
587
+ state["streamUrl"] = streamUrlAt(m_url, m_stream->path);
588
+ }
589
+ }
590
+
591
+ // What was declared, not what it was understood as. A board that named its
592
+ // entries gets them back; one that declared a single pipeline keeps that,
593
+ // because it is the version an older runtime can still load.
594
+ if (m_named)
595
+ {
596
+ if (m_onProcess.runtime || !m_onProcess.config.empty())
597
+ {
598
+ state["onProcess"] = pipelineState(m_onProcess);
599
+ }
600
+ if (m_onRequest.runtime || !m_onRequest.config.empty())
601
+ {
602
+ state["onRequest"] = pipelineState(m_onRequest);
603
+ }
604
+ }
605
+ else
606
+ {
607
+ state["pipeline"] = pipelineState(m_legacy);
608
+ }
609
+
610
+ return Service::mergeStateWith(state);
611
+ }
612
+
613
+ bool HttpServerSubservices::onBypassChanged(bool bypass)
614
+ {
615
+ // The return value is the bypass the service ends up in, which is a statement
616
+ // about the server: bypassed means nothing is listening. A start that fails
617
+ // — a port already taken is the usual way — therefore stays bypassed, rather
618
+ // than reporting a service that is online with no server behind it.
619
+ if (bypass)
620
+ {
621
+ stop(); // no-op when nothing is listening, which is the state asked for
622
+ return true;
623
+ }
624
+
625
+ if (!start())
626
+ {
627
+ std::cerr << "Failed to start HTTP server on port: " << m_impl->port() << std::endl;
628
+ return true;
629
+ }
630
+ return false;
631
+ }
632
+
633
+ Data HttpServerSubservices::process(Data data)
634
+ {
635
+ // The legacy built-in slot: what the board hands this endpoint is what a
636
+ // caller gets back. Expressible now as an `onProcess` that writes a slot and
637
+ // an `onRequest` that reads it, and kept because boards carry the older
638
+ // spelling and a board is a document people keep.
639
+ if (!m_named && m_mode == "process_on_data")
640
+ {
641
+ m_impl->processData(data);
642
+ return data;
643
+ }
644
+
645
+ const auto entry = isBypass() ? nullptr : entryFor(HttpEntry::kOnProcess);
646
+
647
+ // Routing only: what the pass's own pipeline returns carries on down the
648
+ // chain. Whatever has to survive until a request arrives — a value this side
649
+ // produces and the other reads — belongs in a slot, which is a service's job
650
+ // and not this one's.
651
+ Data result = (!entry || entry->empty()) ? data : entry->process(data);
652
+
653
+ // And is what the stream carries, to whoever is listening now.
654
+ if (!isBypass())
655
+ {
656
+ publishToStream(result);
657
+ }
658
+ return result;
659
+ }
660
+
661
+ bool HttpServerSubservices::joinStream(const std::shared_ptr<Session>& session,
662
+ const std::string& requestPath,
663
+ const std::string& method)
664
+ {
665
+ std::optional<HttpStreamConfig> stream;
666
+ StreamChunk sample;
667
+ {
668
+ std::lock_guard<std::mutex> lock(m_streamMutex);
669
+ stream = m_stream;
670
+ sample = m_lastChunk;
671
+ }
672
+ if (!stream || method != "GET" || requestPath != stream->path)
673
+ {
674
+ return false;
675
+ }
676
+
677
+ // A probe, not a listener. Until something has been streamed there is
678
+ // nothing to answer it with, and it is served the stream like anyone else.
679
+ if (auto range = boundedRange(session->getRequestHeader("range")); range && sample)
680
+ {
681
+ answerRangeProbe(session, stream->contentType, range->first, range->second, *sample);
682
+ return true;
683
+ }
684
+
685
+ auto listener = std::make_shared<HttpStreamListener>(
686
+ session, stream->maxQueueBytes, std::chrono::milliseconds(stream->stallTimeoutMs),
687
+ [this](HttpStreamListener* closed) { m_broadcast.leave(closed); });
688
+ listener->start(stream->contentType);
689
+ m_broadcast.join(listener);
690
+ return true;
691
+ }
692
+
693
+ void HttpServerSubservices::publishToStream(const Data& data)
694
+ {
695
+ {
696
+ std::lock_guard<std::mutex> lock(m_streamMutex);
697
+ if (!m_stream)
698
+ {
699
+ return;
700
+ }
701
+ }
702
+
703
+ // One copy, shared by every listener: the pass's own value carries on down
704
+ // the chain.
705
+ StreamChunk chunk;
706
+ if (const auto* bytes = boost::get<BinaryData>(&data))
707
+ {
708
+ chunk = std::make_shared<const std::vector<uint8_t>>(*bytes);
709
+ }
710
+ else if (const auto* mixed = boost::get<MixedData>(&data))
711
+ {
712
+ chunk = std::make_shared<const std::vector<uint8_t>>(mixed->binary);
713
+ }
714
+ else if (const auto* text = boost::get<std::string>(&data))
715
+ {
716
+ chunk = std::make_shared<const std::vector<uint8_t>>(text->begin(), text->end());
717
+ }
718
+ if (chunk && !chunk->empty())
719
+ {
720
+ {
721
+ std::lock_guard<std::mutex> lock(m_streamMutex);
722
+ m_lastChunk = chunk;
723
+ }
724
+ m_broadcast.publish(std::move(chunk));
725
+ }
726
+ }
727
+
728
+ bool HttpServerSubservices::start()
729
+ {
730
+ // Guarded on what is actually listening rather than on the bypass flag, so a
731
+ // rebind — stop and start again on a changed port, with bypass unchanged
732
+ // throughout — is not mistaken for a second start.
733
+ if (m_impl->running())
734
+ {
735
+ std::cout << "HttpServerSubservices::start() HTTP server is already running on port: " << m_impl->port() << std::endl;
736
+ return false;
737
+ }
738
+
739
+ // A runtime server that serves mounts gives this endpoint a path on its own
740
+ // port: nothing is bound here, and the address does not depend on a port
741
+ // being free. One that serves none leaves this endpoint to bind its own.
742
+ m_impl->startMounted();
743
+ m_mount = claimMount(mountName());
744
+ if (m_mount)
745
+ {
746
+ m_host.clear();
747
+ m_url = m_mount.url();
748
+ std::cout << "HttpServerSubservices::start() mounted at " << m_url << std::endl;
749
+ json online{{MOUNT_FIELD, m_url}, {"status", "online"}};
750
+ {
751
+ std::lock_guard<std::mutex> lock(m_streamMutex);
752
+ if (m_stream)
753
+ {
754
+ online["streamUrl"] = streamUrlAt(m_url, m_stream->path);
755
+ }
756
+ }
757
+ sendNotification(online);
758
+ return true;
759
+ }
760
+ m_impl->stop();
761
+
762
+ auto port = m_impl->start();
763
+ if (port == 0)
764
+ {
765
+ std::cerr << "HttpServerSubservices::start() Failed to start HTTP server, port is not set or already in use." << std::endl;
766
+ return false;
767
+ }
768
+
769
+ std::cout << "HttpServerSubservices::start() HTTP server started on port: " << m_impl->port() << std::endl;
770
+ m_host = primaryIPv4();
771
+ m_url = "http://" + m_host + ":" + std::to_string(m_impl->port()) + "/";
772
+ json online{
773
+ {"port", m_impl->port()},
774
+ {"host", m_host},
775
+ {MOUNT_FIELD, m_url},
776
+ {"status", "online"}
777
+ };
778
+ {
779
+ std::lock_guard<std::mutex> lock(m_streamMutex);
780
+ if (m_stream)
781
+ {
782
+ online["streamUrl"] = streamUrlAt(m_url, m_stream->path);
783
+ }
784
+ }
785
+ sendNotification(online);
786
+ return true;
787
+ }
788
+
789
+ bool HttpServerSubservices::stop()
790
+ {
791
+ if (!m_impl->running())
792
+ {
793
+ std::cout << "HttpServerSubservices::stop() HTTP server is not running" << std::endl;
794
+ return false;
795
+ }
796
+ m_mount.release();
797
+ m_host.clear();
798
+ m_url.clear();
799
+ // Everything that named where to connect goes with the server, as getState
800
+ // already reports it.
801
+ sendNotification(json{{"status", "offline"}, {MOUNT_FIELD, ""}, {"streamUrl", ""}});
802
+ const bool stopped = m_impl->stop();
803
+ // After the server's thread has stopped, so the connections are closed here
804
+ // rather than by handlers that would not run until a restart.
805
+ m_broadcast.closeAll();
806
+ return stopped;
807
+ }
808
+
809
+ void HttpServerSubservices::syncSubserviceStates(Pipeline& pipeline)
810
+ {
811
+ if (!pipeline.runtime)
812
+ {
813
+ return;
814
+ }
815
+
816
+ for (auto it = pipeline.runtime->begin(); it != pipeline.runtime->end(); ++it)
817
+ {
818
+ const auto& svc = *it;
819
+ for (auto& cfg : pipeline.config)
820
+ {
821
+ if (cfg.value("instanceId", "") == svc->getId())
822
+ {
823
+ cfg["state"] = svc->getState();
824
+ break;
825
+ }
826
+ }
827
+ }
828
+ }
829
+
830
+ void HttpServerSubservices::rebuildSubservices(Pipeline& pipeline)
831
+ {
832
+ json arr = json::array();
833
+ for (const auto& cfg : pipeline.config)
834
+ {
835
+ arr.push_back(cfg);
836
+ }
837
+ pipeline.runtime = createSubRuntime(arr);
838
+ // Both entries hold in the same cells: that they can is the whole reason for
839
+ // declaring them separately.
840
+ if (pipeline.runtime)
841
+ {
842
+ pipeline.runtime->shareSlots(m_slots);
843
+ }
844
+ }
845
+
846
+ std::shared_ptr<Service> HttpServerSubservices::findNested(
847
+ const std::string& instanceId) const
848
+ {
849
+ for (const auto* pipeline : {&m_onProcess, &m_onRequest})
850
+ {
851
+ if (!pipeline->runtime)
852
+ continue;
853
+ if (auto found = pipeline->runtime->find(instanceId))
854
+ return found;
855
+ }
856
+ return nullptr;
857
+ }
858
+
859
+ HttpServerSubservices::Pipeline& HttpServerSubservices::entryPipeline(HttpEntry entry)
860
+ {
861
+ return entry == HttpEntry::kOnProcess ? m_onProcess : m_onRequest;
862
+ }
863
+
864
+ /**
865
+ * The pipeline one side enters through, or null where that side has none.
866
+ *
867
+ * This is where a legacy `mode` is read, and the only place it is: a board that
868
+ * names its entries never reaches the table below.
869
+ *
870
+ * | declared | onProcess | onRequest |
871
+ * |----------------------|-----------|-----------|
872
+ * | process_on_session | — | the one |
873
+ * | process_on_both | the one | the one |
874
+ * | process_on_data | — | — |
875
+ *
876
+ * `process_on_both` answers with *the same instance* on both sides, never a
877
+ * second copy of the configuration: a pipeline holding a Hold, a timer or a
878
+ * mount is one running thing, and duplicating it would give a board two of each
879
+ * and a slot that never reaches itself.
880
+ */
881
+ std::shared_ptr<SubRuntime> HttpServerSubservices::entryFor(HttpEntry entry) const
882
+ {
883
+ if (m_named)
884
+ {
885
+ return entry == HttpEntry::kOnProcess ? m_onProcess.runtime : m_onRequest.runtime;
886
+ }
887
+ if (m_mode == "process_on_data")
888
+ {
889
+ return nullptr;
890
+ }
891
+ if (entry == HttpEntry::kOnProcess && m_mode != "process_on_both")
892
+ {
893
+ return nullptr;
894
+ }
895
+ return m_legacy.runtime;
896
+ }
897
+
898
+ void HttpServerSubservices::editPipeline(Pipeline& pipeline, const json& payload)
899
+ {
900
+ if (payload.contains("pipeline") && payload["pipeline"].is_array())
901
+ {
902
+ pipeline.config.clear();
903
+ for (const auto& cfg : payload["pipeline"])
904
+ {
905
+ pipeline.config.push_back(cfg);
906
+ }
907
+ rebuildSubservices(pipeline);
908
+ }
909
+ else if (payload.contains("appendService"))
910
+ {
911
+ auto svcCfg = payload["appendService"];
912
+ if (!svcCfg.contains("instanceId") || svcCfg["instanceId"].get<std::string>().empty())
913
+ {
914
+ svcCfg["instanceId"] = generateUUID();
915
+ }
916
+ syncSubserviceStates(pipeline);
917
+ pipeline.config.push_back(std::move(svcCfg));
918
+ rebuildSubservices(pipeline);
919
+ }
920
+ else if (payload.contains("removeService") && payload["removeService"].is_string())
921
+ {
922
+ const std::string id = payload["removeService"].get<std::string>();
923
+ syncSubserviceStates(pipeline);
924
+ pipeline.config.erase(
925
+ std::remove_if(pipeline.config.begin(), pipeline.config.end(),
926
+ [&id](const json& cfg) { return cfg.value("instanceId", "") == id; }),
927
+ pipeline.config.end()
928
+ );
929
+ rebuildSubservices(pipeline);
930
+ }
931
+ else if (payload.contains("configureService") && payload["configureService"].is_object())
932
+ {
933
+ const auto& cfg = payload["configureService"];
934
+ if (cfg.contains("instanceId") && cfg.contains("state") && pipeline.runtime)
935
+ {
936
+ const std::string id = cfg["instanceId"].get<std::string>();
937
+ for (auto it = pipeline.runtime->begin(); it != pipeline.runtime->end(); ++it)
938
+ {
939
+ if ((*it)->getId() == id)
940
+ {
941
+ (*it)->configure(cfg["state"]);
942
+ syncSubserviceStates(pipeline);
943
+ break;
944
+ }
945
+ }
946
+ }
947
+ }
948
+ }
949
+
950
+ } // namespace hkp