@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,986 @@
1
+ #include "./runtime.h"
2
+
3
+ #include <fstream>
4
+ #include <boost/beast.hpp>
5
+
6
+ #include "./address.h"
7
+ #include "./app.h"
8
+ #include "./registry.h"
9
+ #include "./service.h"
10
+ #include "./server.h"
11
+ #include "./sub_runtime.h"
12
+
13
+ #include <types/validation.h>
14
+ #include <types/message.h>
15
+ #include "common.h"
16
+
17
+ namespace hkp
18
+ {
19
+
20
+ namespace
21
+ {
22
+
23
+ // The calls a thread is inside, innermost first.
24
+ //
25
+ // Per thread, because a call is: a pass runs to its end on the thread that
26
+ // began it, while other threads are in calls of their own — a REST request, a
27
+ // coordinator's message, a worker reporting progress, an audio callback. Kept
28
+ // on the runtime instead, a call beginning on one thread would save the context
29
+ // of a call on another and put it back after that one had ended, leaving a
30
+ // finished run — and whoever began it — in place for everything that followed.
31
+ //
32
+ // A frame points at a context its caller keeps alive for as long as the frame
33
+ // stands, so entering a call copies nothing.
34
+ struct ContextFrame
35
+ {
36
+ const Runtime* runtime;
37
+ const ProcessContext* context;
38
+ const ContextFrame* outer;
39
+ };
40
+
41
+ thread_local const ContextFrame* t_frame = nullptr;
42
+
43
+ class ContextScope
44
+ {
45
+ public:
46
+ ContextScope(const Runtime* runtime, const ProcessContext* context)
47
+ : m_frame{runtime, context, t_frame}
48
+ {
49
+ t_frame = &m_frame;
50
+ }
51
+ ~ContextScope() { t_frame = m_frame.outer; }
52
+ ContextScope(const ContextScope&) = delete;
53
+ ContextScope& operator=(const ContextScope&) = delete;
54
+
55
+ private:
56
+ ContextFrame m_frame;
57
+ };
58
+
59
+ }
60
+
61
+ Runtime::Runtime(OwnsMe<App> app, const std::string& runtimeId, const std::string& runtimeName)
62
+ : m_app(app)
63
+ , m_runtimeId(runtimeId)
64
+ , m_runtimeName(runtimeName)
65
+ , m_boardRun(std::make_shared<const ProcessContext>(ProcessContext::newRun("board")))
66
+ {
67
+ // Notifications are served by the shared Server WebSocket (one port for the
68
+ // whole process, multiplexed by runtimeId), not a per-runtime socket. Nothing
69
+ // to start here; the Server owns the transport.
70
+ }
71
+
72
+ Runtime::~Runtime()
73
+ {
74
+ // Wind down any async service workers while this Runtime — its service list,
75
+ // process context, everything — is still fully alive. A worker's final emit()
76
+ // then traverses a live pipeline; joining later (during member destruction)
77
+ // would let it touch already-destroyed state.
78
+ for (auto& svc : m_services)
79
+ {
80
+ svc->shutdown();
81
+ }
82
+ }
83
+
84
+ void Runtime::onWebSocketMessage(const std::string& message, bool isBinary,
85
+ const Caller& caller)
86
+ {
87
+ if (isBinary)
88
+ {
89
+ try
90
+ {
91
+ MessageHeader header;
92
+ auto data = Message::deserializeFromString(message, &header);
93
+ onSessionBinaryData(data, header, caller);
94
+ }
95
+ catch (const std::exception& e)
96
+ {
97
+ std::cerr << "Runtime::onWebSocketMessage failed to process binary frame: " << e.what() << std::endl;
98
+ }
99
+ return;
100
+ }
101
+
102
+ json msg;
103
+ try
104
+ {
105
+ msg = json::parse(message);
106
+ }
107
+ catch (const std::exception& e)
108
+ {
109
+ std::cerr << "Runtime::onWebSocketMessage failed to parse JSON: " << e.what() << std::endl;
110
+ return;
111
+ }
112
+ if (!msg.is_object())
113
+ {
114
+ std::cerr << "Runtime::onWebSocketMessage: invalid JSON object received: " << message << std::endl;
115
+ return;
116
+ }
117
+ try
118
+ {
119
+ onSessionJSONData(msg, caller);
120
+ }
121
+ catch (const std::exception& e)
122
+ {
123
+ std::cerr << "Runtime::onWebSocketMessage failed to handle JSON message: " << e.what() << std::endl;
124
+ }
125
+ }
126
+
127
+ void Runtime::loadFromDisk(const std::string& path)
128
+ {
129
+ std::cout << "Loading runtime from: " << path << std::endl;
130
+ std::ifstream ifs(path);
131
+ if (!ifs)
132
+ {
133
+ throw std::runtime_error("Could not open file: " + path);
134
+ }
135
+ json jf = json::parse(ifs);
136
+ load(jf);
137
+ }
138
+
139
+ void Runtime::load(const json& buffer)
140
+ {
141
+ auto rt = validateRuntime(buffer);
142
+ if (!rt)
143
+ {
144
+ throw std::runtime_error("Runtime::load: invalid runtime configuration");
145
+ }
146
+
147
+ load(*rt);
148
+ }
149
+
150
+ void Runtime::load(const RuntimeConfiguration& config)
151
+ {
152
+ m_services.clear();
153
+
154
+ if (!config.boardName.empty())
155
+ {
156
+ m_boardName = config.boardName;
157
+ }
158
+ m_runtimeId = config.runtimeId;
159
+ m_space = config.space;
160
+ m_runtimeName = config.runtimeName;
161
+ m_garbageCollected = config.garbageCollected;
162
+ m_logData = config.logData;
163
+ m_logging = config.logging;
164
+ m_logLevel = levelFromString(config.logLevel);
165
+ // Before any service is built, because a service that opens a connection
166
+ // while being configured asks for its credential during construction.
167
+ m_vault.replace(config.secrets);
168
+ // Likewise assets: a service that loads its content while being configured
169
+ // asks for it during construction.
170
+ m_assets.replace(config.assets);
171
+ auto services = config.services;
172
+ for (auto &service : services)
173
+ {
174
+ std::string serviceId = service.serviceId;
175
+ std::string instanceId = service.instanceId;
176
+ auto svc = m_app->createService(serviceId, instanceId);
177
+ if (!svc)
178
+ {
179
+ throw std::runtime_error("Service not found: " + serviceId);
180
+ }
181
+ svc->setParentRuntime(*this);
182
+ m_services.push_back(svc); // this implicitly connects
183
+ }
184
+
185
+ auto service = m_services.begin();
186
+ for (auto &config : services)
187
+ {
188
+ auto cfg = config.state;
189
+ if (!cfg.is_null())
190
+ {
191
+ if ((*service)->configure(cfg).is_null())
192
+ {
193
+ throw std::runtime_error("Runtime::load: failed to configure service");
194
+ }
195
+ }
196
+ ++service;
197
+ }
198
+
199
+ m_inputs = config.inputs;
200
+ }
201
+
202
+ RuntimeConfiguration Runtime::getConfiguration() const
203
+ {
204
+ RuntimeConfiguration config;
205
+ config.runtimeId = m_runtimeId;
206
+ config.runtimeName = m_runtimeName;
207
+ config.boardName = m_boardName;
208
+ config.space = m_space;
209
+ config.garbageCollected = m_garbageCollected;
210
+ config.logData = m_logData;
211
+ config.logging = m_logging;
212
+ config.logLevel = toString(m_logLevel);
213
+
214
+ for (auto &svc : m_services)
215
+ {
216
+ ServiceConfiguration sc;
217
+ sc.serviceId = svc->getServiceId();
218
+ sc.instanceId = svc->getId();
219
+ if (const auto* serviceClass = m_app->findServiceClass(sc.serviceId))
220
+ {
221
+ sc.version = serviceClass->version;
222
+ sc.capabilities = serviceClass->capabilities;
223
+ }
224
+ sc.state = svc->getState();
225
+ config.services.push_back(sc);
226
+
227
+ for (auto& input : svc->getExternalInputs())
228
+ {
229
+ sc.inputs.push_back(input);
230
+ config.inputs.push_back(RuntimeInput{
231
+ .id = input.id,
232
+ .url = replaceHostWithExternalAddress(input.url),
233
+ .serviceId = svc->getServiceId(),
234
+ .runtimeId = m_runtimeId,
235
+ .runtimeUrl = getRuntimeUrl(),
236
+ .type = RuntimeInput::EXTERNAL
237
+ });
238
+ }
239
+ }
240
+
241
+ for (RuntimeInput input: m_inputs)
242
+ {
243
+ input.url = getRuntimeUrl() + "/services/" + input.serviceId;
244
+ input.runtimeId = m_runtimeId;
245
+ input.runtimeUrl = getRuntimeUrl();
246
+ config.inputs.push_back(input);
247
+ }
248
+
249
+ auto server = m_app->getServer();
250
+ if (server)
251
+ {
252
+ // Notifications share the REST server's port; the connection binds to this
253
+ // runtime via the protocol handshake ({type, id}), so the path is fixed.
254
+ config.outputUrl = "ws://" + server->externalIP() + ":" + std::to_string(server->port()) + "/notifications";
255
+ }
256
+
257
+ return config;
258
+ }
259
+
260
+ json Runtime::configureService(const std::string &instanceId, json config,
261
+ const ProcessContext* context)
262
+ {
263
+ auto svc = resolveService(instanceId);
264
+ if (!svc)
265
+ {
266
+ return false;
267
+ }
268
+
269
+ if (!context)
270
+ {
271
+ return svc->configure(config);
272
+ }
273
+
274
+ ContextScope scope(this, context);
275
+ return svc->configure(config);
276
+ }
277
+
278
+ json Runtime::getServiceState(const std::string &instanceId) const
279
+ {
280
+ auto svc = resolveService(instanceId);
281
+ if (!svc)
282
+ {
283
+ return false;
284
+ }
285
+
286
+ return svc->getState();
287
+ }
288
+
289
+ json Runtime::getServices() const
290
+ {
291
+ json services;
292
+ for (auto &svc : m_services)
293
+ {
294
+ auto s = json{
295
+ { "serviceId", svc->getServiceId() },
296
+ { "instanceId", svc->getId() },
297
+ { "instanceName", svc->getName() },
298
+ };
299
+ if (const auto* serviceClass = m_app->findServiceClass(svc->getServiceId()))
300
+ {
301
+ if (!serviceClass->version.empty())
302
+ {
303
+ s["version"] = serviceClass->version;
304
+ }
305
+ }
306
+ s.update(json{{"state", svc->getState()}});
307
+ services.push_back(s);
308
+ }
309
+ return services;
310
+ }
311
+
312
+ void Runtime::sendData(Data data, MessagePurpose purpose, const std::string& sender, std::function<void(Data)> callback)
313
+ {
314
+ // Marshal onto the event loop and hand the serialized frame to the shared
315
+ // Server WebSocket, which fans it out to the connections bound to this
316
+ // runtime. (Server::sendNotification / Crow's send_binary are thread-safe.)
317
+ //
318
+ // Capture app + runtimeId by value, not `this`: this callback runs later, and
319
+ // a notification posted just before the Runtime is torn down (e.g. a worker's
320
+ // final emit during shutdown) must not dereference a freed Runtime.
321
+ App* app = m_app.get();
322
+ std::string runtimeId = m_runtimeId;
323
+ std::string space = m_space;
324
+ // The run this is said in, read now: by the time the callback runs the call
325
+ // has returned and the runtime is in another run, or in none.
326
+ //
327
+ // Said outside any call it is the board's own work, and that run is shared
328
+ // rather than copied: this is the path a meter or a streaming source takes
329
+ // many times a second.
330
+ std::shared_ptr<const ProcessContext> run;
331
+ if (const auto* current = currentContext())
332
+ {
333
+ run = current == m_boardRun.get()
334
+ ? m_boardRun
335
+ : std::make_shared<const ProcessContext>(*current);
336
+ }
337
+ else
338
+ {
339
+ run = autonomousRun();
340
+ }
341
+ app->postCallback([app, runtimeId, space, data, purpose, sender, run = std::move(run)]() {
342
+ try
343
+ {
344
+ // Before serializing for the clients watching: a sink takes the value
345
+ // as it is, and must not lose it to a frame that cannot be built.
346
+ app->emitRuntimeData(runtimeId, data, purpose, sender, space, run.get());
347
+ }
348
+ catch (const std::exception& e)
349
+ {
350
+ std::cerr << "Runtime::sendData: output sink failed: " << e.what() << std::endl;
351
+ }
352
+ try
353
+ {
354
+ // The server's sockets watch what its clients created. A board's
355
+ // runtime is heard through its coordinator alone.
356
+ auto server = app->getServer();
357
+ if (server && space.empty())
358
+ {
359
+ server->sendNotification(runtimeId, Message::serializeToString(data, purpose, sender));
360
+ }
361
+ }
362
+ catch (const std::exception& e)
363
+ {
364
+ // A single unserializable payload (e.g. a streamed text chunk split
365
+ // mid-UTF-8) must never terminate the event-loop thread and take the whole
366
+ // process with it. Drop it and carry on.
367
+ std::cerr << "Runtime::sendData: dropping notification: " << e.what() << std::endl;
368
+ }
369
+ });
370
+ }
371
+
372
+ MountHandle Runtime::mountEndpoint(const std::string& name, MountAdopter adopter)
373
+ {
374
+ auto server = m_app->getServer();
375
+ return server
376
+ ? server->mount(m_boardName, m_runtimeId, name, std::move(adopter), !m_space.empty())
377
+ : MountHandle();
378
+ }
379
+
380
+ void Runtime::notifyProcessFinished(const Service& service, const Data& data)
381
+ {
382
+ // Same lifecycle event the synchronous loop sends, but driven by emit() when
383
+ // deferred async work lands — so a service's processing indicator brackets the
384
+ // real duration instead of the instant deferCompletion() return.
385
+ sendServiceLifecycleNotification(service, "call-process-finished", data);
386
+ }
387
+
388
+ const ProcessContext* Runtime::currentContext() const
389
+ {
390
+ // Another runtime's call on this thread is not this runtime's: the nearest
391
+ // frame of its own is, and there are never more than a few to pass over.
392
+ for (const auto* frame = t_frame; frame; frame = frame->outer)
393
+ {
394
+ if (frame->runtime == this)
395
+ return frame->context;
396
+ }
397
+ return nullptr;
398
+ }
399
+
400
+ std::shared_ptr<const ProcessContext> Runtime::autonomousRun() const
401
+ {
402
+ // An identity per emission is what lets a log tell one tick from the next,
403
+ // and a log is the only thing that reads it. A board that keeps none gets
404
+ // the one run this runtime stands in, at the cost of a reference count.
405
+ if (m_logging)
406
+ return std::make_shared<const ProcessContext>(ProcessContext::newRun("board"));
407
+ return m_boardRun;
408
+ }
409
+
410
+ Data Runtime::process(Data data)
411
+ {
412
+ const auto run = autonomousRun();
413
+ return process(std::move(data), *run);
414
+ }
415
+
416
+ Data Runtime::process(Data data, const ProcessContext& context)
417
+ {
418
+ // Restored rather than cleared, so that a service calling back into this
419
+ // runtime from inside its own process — the pull a cache miss performs —
420
+ // leaves the outer call running under what it started with.
421
+ ContextScope scope(this, &context);
422
+
423
+ // Every onProcessBegin is paired with an onProcessEnd, empty runtime included:
424
+ // the depth they count decides when a result leaves this runtime, and one
425
+ // left unbalanced keeps every later result from leaving. With no services the
426
+ // input is the result, passed on unchanged.
427
+ onProcessBegin();
428
+ auto result = m_services.empty() ? data : processFrom(*m_services.front(), data, false);
429
+ return onProcessEnd(result, &context);
430
+ }
431
+
432
+ Data Runtime::processAt(const std::string& instanceId, Data data)
433
+ {
434
+ const auto run = autonomousRun();
435
+ return processAt(instanceId, std::move(data), *run);
436
+ }
437
+
438
+ Data Runtime::processAt(const std::string& instanceId, Data data,
439
+ const ProcessContext& context)
440
+ {
441
+ auto it = findServiceById(instanceId);
442
+ if (it == m_services.cend())
443
+ {
444
+ // Not one of this runtime's own: a scoped address enters the pipeline that
445
+ // holds it instead, and runs to the end of *that* list. What it produces is
446
+ // the nested pipeline's answer.
447
+ const auto segments = splitAddress(instanceId);
448
+ if (segments.size() > 1)
449
+ {
450
+ auto head = findServiceById(segments[0]);
451
+ if (head != m_services.cend())
452
+ {
453
+ Data nested;
454
+ if ((*head)->processNested(restOfAddress(segments, 1), data, nested))
455
+ return nested;
456
+ }
457
+ }
458
+ throw std::runtime_error("Runtime::processAt service not found in runtime");
459
+ }
460
+
461
+ // The same context bookkeeping process() does, and for the same reason: a
462
+ // service pulling back into this runtime from inside its own call must leave
463
+ // the outer call running under what it started with.
464
+ ContextScope scope(this, &context);
465
+
466
+ onProcessBegin();
467
+ auto result = processFrom(**it, data, /*advanceBefore=*/false);
468
+ return onProcessEnd(result, &context);
469
+ }
470
+
471
+ Data Runtime::withContext(const ProcessContext& context, std::function<Data()> fn)
472
+ {
473
+ ContextScope scope(this, &context);
474
+ return fn();
475
+ }
476
+
477
+ bool Runtime::holdsService(const std::string& instanceId) const
478
+ {
479
+ if (findServiceById(instanceId) != m_services.cend())
480
+ {
481
+ return true;
482
+ }
483
+ const auto segments = splitAddress(instanceId);
484
+ return segments.size() > 1 && findServiceById(segments[0]) != m_services.cend();
485
+ }
486
+
487
+ void Runtime::log(const Service& svc, LogLevel level, const std::string& event,
488
+ const nlohmann::json& data)
489
+ {
490
+ // Nothing to attribute an entry to means nothing worth recording: a service
491
+ // logging outside a call has no run, and an entry naming no run cannot be
492
+ // found again.
493
+ //
494
+ // Deliberately not also skipping when no local target is registered: entries
495
+ // leave this runtime over its socket as well, so "nobody registered a
496
+ // callback here" does not mean nobody is collecting. Whether anything is
497
+ // attached to that socket is the server's to know.
498
+ //
499
+ // Below the level the board keeps is the same as off: no entry is built.
500
+ if (!m_logging || levelRank(level) < levelRank(m_logLevel))
501
+ return;
502
+ const auto* run = currentContext();
503
+ if (!run)
504
+ return;
505
+
506
+ LogEntry entry;
507
+ entry.runId = run->runId;
508
+ entry.parentRunId = run->parentRunId;
509
+ if (const auto person = run->personActor())
510
+ entry.caller = person->caller.sub;
511
+ entry.ts = isoTimestamp();
512
+ entry.runtimeId = m_runtimeId;
513
+ entry.serviceUuid = svc.getId();
514
+ entry.level = level;
515
+ entry.event = event;
516
+ if (m_logData && !data.is_null())
517
+ entry.data = data;
518
+
519
+ forwardLog(entry);
520
+ }
521
+
522
+ void Runtime::forwardLog(const LogEntry& entry)
523
+ {
524
+ for (const auto& target : m_logTargets)
525
+ target(entry);
526
+
527
+ // Out to whoever is collecting this runtime's output — in a deployed board,
528
+ // the coordinator, which is the only instance that keeps a board's log.
529
+ //
530
+ // Captured by value rather than through `this`, as sendData is and for the
531
+ // same reason: this runs later, and an entry recorded just before teardown
532
+ // must not dereference a freed Runtime.
533
+ App* app = m_app.get();
534
+ const std::string runtimeId = m_runtimeId;
535
+ const std::string space = m_space;
536
+ const nlohmann::json message = {{"type", "log"}, {"entry", entry.toJson()}};
537
+ app->postCallback([app, runtimeId, space, message, entry]() {
538
+ try
539
+ {
540
+ app->emitRuntimeLog(runtimeId, entry, space);
541
+ }
542
+ catch (const std::exception& e)
543
+ {
544
+ std::cerr << "Runtime::forwardLog: output sink failed: " << e.what() << std::endl;
545
+ }
546
+ try
547
+ {
548
+ if (auto server = app->getServer(); server && space.empty())
549
+ {
550
+ server->sendText(runtimeId, message.dump());
551
+ }
552
+ }
553
+ catch (const std::exception& e)
554
+ {
555
+ // Losing an entry is not worth taking the event loop down for.
556
+ std::cerr << "Runtime::forwardLog: dropping entry: " << e.what() << std::endl;
557
+ }
558
+ });
559
+ }
560
+
561
+ void Runtime::registerLogTarget(std::function<void(const LogEntry&)> target)
562
+ {
563
+ m_logTargets.push_back(std::move(target));
564
+ }
565
+
566
+ Data Runtime::processFrom(const Service &service, Data data, bool advanceBefore, std::function<void(Data)> callback)
567
+ {
568
+ const ProcessContext* run = currentContext();
569
+ if (!run)
570
+ {
571
+ // Nobody asked for this: a source handing on what it produced. Entered
572
+ // without a copy, a closure or an id of its own, because a streaming
573
+ // source arrives here for every buffer.
574
+ const auto autonomous = autonomousRun();
575
+ ContextScope scope(this, autonomous.get());
576
+ return processFrom(service, std::move(data), advanceBefore, std::move(callback));
577
+ }
578
+ onProcessBegin();
579
+ auto it = findServiceById(service.getId());
580
+ if (it == m_services.cend())
581
+ {
582
+ throw std::runtime_error("Runtime::processNext service not found in runtime");
583
+ }
584
+
585
+ for (auto next = advanceBefore ? std::next(it) : it;
586
+ next != m_services.cend();
587
+ ++next)
588
+ {
589
+ if (run->expired())
590
+ return onProcessEnd(Null());
591
+ sendServiceLifecycleNotification(**next, "call-process", data);
592
+ // The flow itself, at debug: which service the runtime called, and below,
593
+ // what it returned and how long it took.
594
+ //
595
+ // Deliberately without the value flowing through. The level says how much
596
+ // of the shape of a run to keep, and turning it up must not also start
597
+ // recording the data — what flows through is recorded only where a service
598
+ // was configured to record it.
599
+ log(**next, LogLevel::Debug, "service.process");
600
+ // Timed only when the duration will be kept; see below.
601
+ const bool timed = m_logging && levelRank(LogLevel::Debug) >= levelRank(m_logLevel);
602
+ const auto startedAt = timed
603
+ ? std::chrono::steady_clock::now()
604
+ : std::chrono::steady_clock::time_point();
605
+ data = (*next)->startProcess(data);
606
+ if ((*next)->takeProcessDeferred())
607
+ {
608
+ // The service handed its work to a worker and will emit() the real result
609
+ // later; emit() sends this service's "call-process-finished" then. Withhold
610
+ // it here and stop the synchronous push (the deferred result re-enters via
611
+ // emit → nextAsync, driving the services that follow).
612
+ return onProcessEnd(Null());
613
+ }
614
+ sendServiceLifecycleNotification(**next, "call-process-finished", data);
615
+ // Built only when it will be kept: this is inside the loop every pass
616
+ // runs, and an entry is several strings and a timestamp.
617
+ if (timed)
618
+ {
619
+ LogEntry done;
620
+ done.runId = run->runId;
621
+ done.parentRunId = run->parentRunId;
622
+ if (const auto person = run->personActor())
623
+ done.caller = person->caller.sub;
624
+ done.ts = isoTimestamp();
625
+ done.runtimeId = m_runtimeId;
626
+ done.serviceUuid = (*next)->getId();
627
+ done.level = LogLevel::Debug;
628
+ done.event = "service.processed";
629
+ done.durationMs = std::chrono::duration<double, std::milli>(
630
+ std::chrono::steady_clock::now() - startedAt).count();
631
+ forwardLog(done);
632
+ }
633
+ if (isNull(data)) // stop processing on null
634
+ {
635
+ // Where the run ended, named. Above debug because it is the outcome of
636
+ // the run rather than a step in it.
637
+ log(**next, LogLevel::Info, "pipeline.stopped");
638
+ return onProcessEnd(data);
639
+ }
640
+ if (isEarlyReturn(data))
641
+ {
642
+ return onProcessEnd(getControlFlowData(data), nullptr, callback);
643
+ }
644
+ }
645
+ return onProcessEnd(data, nullptr, callback);
646
+ }
647
+
648
+ void Runtime::sendServiceLifecycleNotification(const Service& service, const std::string& state, const Data& data)
649
+ {
650
+ sendData(lifecycleNotification(state, data, capturesCalls()), MessagePurpose::NOTIFICATION,
651
+ service.getId());
652
+ }
653
+
654
+ void Runtime::post(std::function<void()> fn)
655
+ {
656
+ m_app->postCallback(std::move(fn));
657
+ }
658
+
659
+ void Runtime::scheduleProcessFrom(const Service &service, Data data, bool advanceBefore)
660
+ {
661
+ auto pService = &service;
662
+ for (size_t idx = 0; idx < m_scheduledProcesses.size(); ++idx)
663
+ {
664
+ if (!m_scheduledProcesses[idx])
665
+ {
666
+ m_scheduledProcesses[idx] = [this, pService, data, advanceBefore]() {
667
+ return this->processFrom(*pService, data, advanceBefore);
668
+ };
669
+ m_app->postCallback([this]() { processScheduled(); });
670
+ return;
671
+ }
672
+ }
673
+
674
+ std::cout << "Runtime::scheduleProcessFrom() No empty slot available in m_scheduledProcesses" << std::endl;
675
+ }
676
+
677
+ void Runtime::processScheduled()
678
+ {
679
+ auto cpy = m_scheduledProcesses;
680
+ m_scheduledProcesses.fill(nullptr); // clear scheduled processes
681
+ for (auto &process : cpy)
682
+ {
683
+ if (process)
684
+ {
685
+ process();
686
+ }
687
+ }
688
+ }
689
+
690
+ json Runtime::appendService(const ServiceConfiguration& newService)
691
+ {
692
+ auto svc = m_app->createService(newService.serviceId, newService.instanceId);
693
+ if (!svc)
694
+ {
695
+ return false;
696
+ }
697
+ svc->setParentRuntime(*this);
698
+ m_services.push_back(svc);
699
+ if (!newService.state.is_null())
700
+ {
701
+ return svc->configure(newService.state);
702
+ }
703
+ return svc->getState();
704
+ }
705
+
706
+ bool Runtime::removeService(const std::string& instanceId)
707
+ {
708
+ auto it = findServiceById(instanceId);
709
+ if (it == m_services.end())
710
+ {
711
+ return false;
712
+ }
713
+ m_services.erase(it);
714
+ return true;
715
+ }
716
+
717
+ bool Runtime::insertService(std::shared_ptr<Service> newService, std::shared_ptr<Service> predecessor)
718
+ {
719
+ if (predecessor)
720
+ {
721
+ auto it = findServiceById(predecessor->getId());
722
+ if (it == m_services.cend())
723
+ {
724
+ throw std::runtime_error("Runtime::insert: predecessor not found in runtime");
725
+ }
726
+ m_services.insert(std::next(it), newService);
727
+ return true;
728
+ }
729
+
730
+ m_services.push_back(newService);
731
+ return true;
732
+ }
733
+
734
+ std::shared_ptr<SubRuntime> Runtime::createSubRuntime(const Service& ownerInParent,
735
+ const json& servicesConfig)
736
+ {
737
+ auto factory = [this](const std::string& serviceId, const std::string& instanceId)
738
+ {
739
+ return m_app->createService(serviceId, instanceId);
740
+ };
741
+ auto post = [this](std::function<void()> fn)
742
+ {
743
+ m_app->postCallback(std::move(fn));
744
+ };
745
+
746
+ auto sr = std::make_shared<SubRuntime>(*this, &ownerInParent,
747
+ std::move(factory), std::move(post));
748
+ sr->populate(servicesConfig);
749
+ return sr;
750
+ }
751
+
752
+ bool Runtime::rearrangeServices(const std::vector<std::string>& newOrder)
753
+ {
754
+ std::list<std::shared_ptr<Service>> sorted;
755
+ for (auto &id : newOrder)
756
+ {
757
+ auto it = findServiceById(id);
758
+ if (it == m_services.cend())
759
+ {
760
+ return false;
761
+ }
762
+ sorted.push_back(*it);
763
+ }
764
+ m_services = sorted;
765
+ return true;
766
+ }
767
+
768
+ bool Runtime::isConnected(const Service &svc) const
769
+ {
770
+ return findServiceById(svc.getId()) != m_services.cend();
771
+ }
772
+
773
+ std::list<std::shared_ptr<Service>>::const_iterator Runtime::findServiceById(const std::string& instanceId)
774
+ {
775
+ return std::find_if(
776
+ m_services.begin(),
777
+ m_services.end(),
778
+ [&instanceId](auto svc) { return svc->getId() == instanceId; }
779
+ );
780
+ }
781
+
782
+ std::list<std::shared_ptr<Service>>::const_iterator Runtime::findServiceById(const std::string& instanceId) const
783
+ {
784
+ return std::find_if(
785
+ m_services.cbegin(),
786
+ m_services.cend(),
787
+ [&instanceId](auto ptr) { return ptr.get()->getId() == instanceId; }
788
+ );
789
+ }
790
+
791
+ std::shared_ptr<Service> Runtime::resolveService(const std::string& address) const
792
+ {
793
+ auto direct = findServiceById(address);
794
+ if (direct != m_services.cend())
795
+ return *direct;
796
+
797
+ const auto segments = splitAddress(address);
798
+ if (segments.size() < 2)
799
+ return nullptr;
800
+
801
+ auto head = findServiceById(segments[0]);
802
+ if (head == m_services.cend())
803
+ return nullptr;
804
+
805
+ // A partial address is a miss, not a match: answering with the nearest
806
+ // service the path did reach would act on something nobody named.
807
+ std::shared_ptr<Service> current = *head;
808
+ for (size_t i = 1; i < segments.size(); ++i)
809
+ {
810
+ current = current->findNested(segments[i]);
811
+ if (!current)
812
+ return nullptr;
813
+ }
814
+ return current;
815
+ }
816
+
817
+ std::string Runtime::replaceHostWithExternalAddress(std::string url) const
818
+ {
819
+ if (!m_app->getServer())
820
+ {
821
+ return url;
822
+ }
823
+ return replaceAll(url, "0.0.0.0", m_app->getServer()->externalIP());
824
+ }
825
+
826
+ std::string Runtime::getRuntimeUrl() const
827
+ {
828
+ if (!m_app->getServer())
829
+ {
830
+ std::cerr << "Runtime::getRuntimeUrl: no server available" << std::endl;
831
+ return "";
832
+ }
833
+ return m_app->getServer()->externalIP() + ":" + std::to_string(m_app->getServer()->port()) + "/runtimes/" + m_runtimeId;
834
+ }
835
+
836
+ void Runtime::onProcessBegin()
837
+ {
838
+ m_processDepth.increment();
839
+ }
840
+
841
+ const Data& Runtime::onProcessEnd(const Data& data, const ProcessContext* context, std::function<void(Data)> callback)
842
+ {
843
+ static const std::string noRequest;
844
+ const std::string& awaited = context ? context->requestId : noRequest;
845
+ if (m_processDepth.decrement() == 0)
846
+ {
847
+ // If we are the last initiator, communicate the result to whoever is
848
+ // listening on this runtime — the next runtime in the chain. Whether the
849
+ // runtime was created with a board name does not matter: an unnamed board
850
+ // chains the same way, and with no listener sendData delivers nothing.
851
+ std::string requestId = "RUNTIME";
852
+ auto purpose = MessagePurpose::RESULT;
853
+ if (callback)
854
+ {
855
+ requestId = generateUUID();
856
+ }
857
+ else if (!awaited.empty())
858
+ {
859
+ requestId = awaited;
860
+ }
861
+ if (callback)
862
+ {
863
+ purpose = MessagePurpose::RESULT_AWAITING_RESPONSE;
864
+ std::cout << "Await pending resolve for request: " << requestId << std::endl;
865
+ if (!storePendingCallback(requestId, callback))
866
+ {
867
+ std::cerr << "Runtime::onProcessEnd: No empty slot available in m_pendingResolve" << std::endl;
868
+ }
869
+ }
870
+ else if (!awaited.empty())
871
+ {
872
+ purpose = MessagePurpose::RESULT_WITH_REQUEST_ID;
873
+ }
874
+ sendData(data, purpose, requestId, callback);
875
+ }
876
+ return data;
877
+ }
878
+
879
+ bool Runtime::storePendingCallback(const std::string& requestId, std::function<void(Data)> callback)
880
+ {
881
+ for (auto& slot : m_pendingResolve)
882
+ {
883
+ if (slot.callback == nullptr)
884
+ {
885
+ slot.requestId = requestId;
886
+ slot.callback = callback;
887
+ return true;
888
+ }
889
+ }
890
+ return false;
891
+ }
892
+
893
+ std::function<void(Data)> Runtime::findAndRemovePendingCallback(const std::string& requestId)
894
+ {
895
+ for (auto& slot : m_pendingResolve)
896
+ {
897
+ if (slot.callback != nullptr && slot.requestId == requestId)
898
+ {
899
+ auto callback = slot.callback;
900
+ slot.callback = nullptr;
901
+ slot.requestId.clear();
902
+ return callback;
903
+ }
904
+ }
905
+ return nullptr;
906
+ }
907
+
908
+ void Runtime::onSessionBinaryData(Data data, MessageHeader header, const Caller& caller)
909
+ {
910
+ if (header.messagePurpose == MessagePurpose::NOTIFICATION)
911
+ {
912
+ auto requestId = header.sender;
913
+ auto callback = findAndRemovePendingCallback(requestId);
914
+ if (callback)
915
+ {
916
+ callback(data);
917
+ }
918
+ else
919
+ {
920
+ std::cout << "Runtime::onSessionBinaryData: no pending resolve available" << std::endl;
921
+ }
922
+ }
923
+ else
924
+ {
925
+ // A frame has no room for a run context, so the pass begins a run of its
926
+ // own — as whoever opened the socket.
927
+ this->process(data, ProcessContext::forClient(json(), caller));
928
+ }
929
+ }
930
+
931
+ void Runtime::onSessionJSONData(json msg, const Caller& caller)
932
+ {
933
+ auto data = msg["params"];
934
+ auto context = msg["context"];
935
+ auto type = msg["type"].get<std::string>();
936
+ if (type == "processRuntime")
937
+ {
938
+ // A null payload is a run with nothing on the input, not a malformed
939
+ // message: JSON has no undefined, so that is how a sender says it. The
940
+ // first service is handed Undefined, which is what it is given anywhere
941
+ // else nothing precedes it.
942
+ // The run is the one the message names. Who is calling is not the
943
+ // message's to say: it is whoever opened this socket.
944
+ process(data.is_null() ? Data() : Data(data), ProcessContext::forClient(context, caller));
945
+ }
946
+ else if (type == "resolveResult")
947
+ {
948
+ if (data.is_null())
949
+ {
950
+ std::cout << "Runtime::onSessionJSONData: received null result: " << msg.dump() << std::endl;
951
+ return;
952
+ }
953
+ std::cout << "Need to resolve the result: " << data << context << std::endl;
954
+ auto requestId = ProcessContext::fromJson(context).requestId;
955
+ auto callback = findAndRemovePendingCallback(requestId);
956
+ if (callback)
957
+ {
958
+ // A JSON string arriving here was originally a C++ std::string (e.g. an
959
+ // HTML page) that was round-tripped through the browser WebSocket as a
960
+ // JSON-encoded string. Re-wrap it as Data(std::string) so that
961
+ // sendResult() dispatches to sendHtmlResponse() rather than
962
+ // sendJsonResponseWithCors().
963
+ if (data.is_string())
964
+ {
965
+ auto str = data.get<std::string>();
966
+ Data d = Data(str);
967
+ callback(d);
968
+ }
969
+ else
970
+ {
971
+ Data d = Data(data);
972
+ callback(d);
973
+ }
974
+ }
975
+ else
976
+ {
977
+ std::cout << "Runtime::onSessionJSONData: no pending resolve available" << std::endl;
978
+ }
979
+ }
980
+ else
981
+ {
982
+ std::cout << "Runtime::onSessionJSONData: unsupported message type: " << msg["type"] << std::endl;
983
+ }
984
+ }
985
+
986
+ }