@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,803 @@
1
+ # Cloud boards
2
+
3
+ A board whose owner is a coordinator rather than a browser tab — provisioned once, kept running with nobody watching, and attached to when someone wants to look.
4
+
5
+ ---
6
+
7
+ ## The problem
8
+
9
+ A board built in the playground lives in the tab that built it. That browser
10
+ provisions the runtimes, so it asks for them with `garbageCollected: true` —
11
+ reap them when my socket closes — because runtimes that outlived the tab that
12
+ made them would pile up on a server with nothing to clean them.
13
+
14
+ That is right for building, and wrong for everything a board is *for* once it
15
+ works. A board that receives webhooks, answers a chat, or ticks on a timer has
16
+ to keep running when the person who built it closes their laptop.
17
+
18
+ A **cloud board** is that board, still the same board, with a different owner.
19
+
20
+ ---
21
+
22
+ ## Not a different kind of board
23
+
24
+ There is no cloud-board format, no separate schema, no flag in the JSON. The
25
+ same document runs either way; what differs is who provisions its runtimes:
26
+
27
+ | Board runs as | Owner | Its runtimes | The browser's role |
28
+ |---|---|---|---|
29
+ | Playground / Readymade | this browser | provisioned by it, over REST | owner |
30
+ | Deployed | a coordinator | built by it over connections their runtime servers opened, kept alive with nobody watching | viewer, over the bridge |
31
+
32
+ Moving between them is **deploying**. See the **Coordinator** concept
33
+ (`concepts/coordinator.md`) for the role itself; this page is what happens when
34
+ it moves to a server.
35
+
36
+ ---
37
+
38
+ ## Deploying, in order
39
+
40
+ The order is the whole trick, on both sides. Everything that can fail is done
41
+ before the coordinator is asked to take the board.
42
+
43
+ > **Warning — unit assets are not deployed:** Deployment carries only the
44
+ > top-level board's assets. A runtime contributed by a unit receives none of
45
+ > that unit's assets, so its `hkp-asset://…` references will fail to resolve.
46
+ > See [Assets: Units and deploying](./assets.md#units-and-deploying).
47
+
48
+ ### Browser side — `hkp-frontend/src/core/deploy.ts`
49
+
50
+ The rocket in the toolbar opens `DeployDialog` (desktop) or `DeployBoardSheet`
51
+ (mobile); deploying calls `deployBoard()`, which:
52
+
53
+ 1. serializes the board,
54
+ 2. runs the **preflight** — below — and stops here if a runtime would not come
55
+ up,
56
+ 3. makes the **introduction**: asks the coordinator for a ticket per remote
57
+ runtime and tells each runtime's server to connect to the coordinator with
58
+ it — and stops here if one cannot,
59
+ 4. `POST /coordinator/users/<sub>/boards`, and reports what came back: a board
60
+ the coordinator took but could not fully start is said to be exactly that,
61
+ not "running".
62
+
63
+ A deploy either goes through or changes nothing. From the first ticket to the
64
+ board being registered, a failure is **taken back**
65
+ (`DELETE /coordinator/users/<sub>/boards/<board>/tickets`): the tickets asked
66
+ for are given up and a runtime server left waiting with one is let go. A board
67
+ that was already running keeps the servers and the tickets it had
68
+ (→ `concepts/remotes.md`, *What a ticket is*).
69
+
70
+ The browser gives nothing up. Both sides use the board's own runtime ids, on
71
+ the same runtime server, and still hold different runtimes: what a coordinator
72
+ builds for a board lives in that board's own **space** on the server, apart
73
+ from what the server's clients create (below). The runtimes this browser built
74
+ stay its own and go when it leaves, as they always did. Pinned by
75
+ `core/tests/deploy.test.ts` and `core/tests/board-unmount.test.tsx`.
76
+
77
+ ### A board's runtimes on a runtime server
78
+
79
+ A runtime id is unique within a space, and a runtime server keeps two kinds:
80
+
81
+ | Space | Holds | Reached by |
82
+ |---|---|---|
83
+ | the tenant's own | what its clients create with `POST /runtimes` | the REST api and the runtime's socket |
84
+ | one per deployed board | what a coordinator builds over a link, keyed by tenant, board and runtime id | that link, and nothing else |
85
+
86
+ So two deployed boards that both call a runtime `node` each have their own on
87
+ one server, and opening either board in the playground — which creates a
88
+ runtime under that same id, and deletes it on leaving — touches neither. A
89
+ board's runtimes are not in `GET /runtimes`; `GET /coordinator-links` lists
90
+ them, each with whether it is `running`. `DELETE /runtimes` removes what
91
+ clients created and leaves boards alone.
92
+
93
+ Mount addresses do not change with the space: they are derived from the
94
+ tenant, the board, the runtime and the mount's name, so a board played in the
95
+ playground and the same board deployed derive the same address. A runtime
96
+ server keeps every claim to an address and lets one answer: **the deployed
97
+ board's**, whoever claimed last. Opening a deployed board in the playground
98
+ therefore does not take its endpoint, and leaving does not take the endpoint
99
+ away; the playground's copy answers only where no deployed board claims the
100
+ address (`concepts/mounts.md`).
101
+
102
+ `hkp-node/src/runtime.ts` (`boardSpace`), `hkp-python/src/hkp/runtime.py`
103
+ (`board_space`), `hkp-rt/lib/include/app.h` (`RuntimeConfiguration::space`).
104
+
105
+ ### Preflight — `hkp-frontend/src/core/deployPreflight.ts`
106
+
107
+ Past registering a problem can only be reported, not avoided. So everything
108
+ knowable beforehand is asked beforehand, from the browser — the one party that
109
+ knows this person's runtime servers and can reach them — and answered **per
110
+ runtime**. It is also where a board's `remote` becomes an address
111
+ (→ `concepts/remotes.md`); the coordinator is told none.
112
+
113
+ | Finding | Meaning | Stops the deploy |
114
+ |---|---|---|
115
+ | `ready` | its server is running, accepted this person, has every service the board uses there, and can connect to a coordinator | |
116
+ | `transient` | a browser runtime — run by whichever browser has the board open | |
117
+ | `invalid` | it says where it runs more than once (`url` *and* `remote`, say) | yes |
118
+ | `unresolved` | the remote it names is not one this client knows | yes |
119
+ | `unreachable` | its server did not answer | yes |
120
+ | `refused` | its server answered `401`/`403` | yes |
121
+ | `missing-services` | its server's registry lacks services the board uses, which are listed | yes |
122
+ | `cannot-join` | its server cannot connect to a coordinator (the phone apps' embedded runtime, or a server that predates links) | yes |
123
+ | `outdated` | its server can connect to a coordinator but does not keep a board's runtimes apart from a client's (it does not report `boardRuntimes`): the deployed board would stop when the client that deployed it leaves | yes |
124
+ | `unsupported` | a kind of runtime a coordinator does not run (GraphQL) | |
125
+
126
+ Every server answer comes from one `GET <server>/runtimes`, which already
127
+ returns the server's kind, registry and whether it can join. Only a runtime's
128
+ own pipeline is compared; what a service nests in its state is not walked. The
129
+ desktop dialog shows each finding before anything is deployed, names the
130
+ remote a name resolved to, and offers **Check again**. The mobile deploy sheet
131
+ shows the same findings above the coordinators, as soon as it opens — they do
132
+ not depend on which coordinator is chosen — and keeps every coordinator out of
133
+ reach while one of them stops the deploy. A deploy that preflight stops after
134
+ all (something changed since the check) puts its findings there too.
135
+
136
+ ### The introduction
137
+
138
+ A coordinator never dials a runtime server — each one connects to it
139
+ (→ `concepts/remotes.md`). The browser is the only party with a session on both
140
+ sides, so it introduces them: a **ticket** from the coordinator
141
+ (`POST …/boards/<board>/tickets`), handed to the runtime server
142
+ (`POST <server>/coordinator-links`) together with the values for the secret
143
+ references that runtime's services hold. The runtime server connects to
144
+ `/coordinator/join` with the ticket and keeps it to reconnect with.
145
+
146
+ ### Coordinator side — `hkp-node/src/coordinator/`
147
+
148
+ 1. **Auth**, then `requireSelf`: the `:username` in the path must equal the
149
+ token's `sub` (`coordinator/auth.ts`). In no-auth dev mode the path param is
150
+ taken *as* the subject — only reachable in a checkout that set
151
+ `ALLOW_NO_AUTH`.
152
+ 2. **`BoardCoordinator.registerBoard()`** — serialized per `(user, board)`
153
+ through a promise map, so two registrations cannot interleave: registering
154
+ replaces a board's session, and replacing it destroys the old one, which
155
+ releases the runtimes it had built. It lifts connected browser bridges out of
156
+ the old session (`takeBridges()`), awaits `destroy()`, revokes the tickets of
157
+ any runtime the board no longer has, starts a new `BoardSession`, and
158
+ re-attaches the bridges — so a watching browser sees no disconnect.
159
+ 3. **Per remote runtime — `BoardSession.bringUp()`**, over the connection its
160
+ runtime server opened (`coordinator/participantProtocol.ts`):
161
+ - `provision` — the runtime is built from the board's description of it, as
162
+ the user who introduced the link, with `garbageCollected: false`. It
163
+ replaces anything under that id, which is what makes a deploy safe: the
164
+ browser's dying socket cannot reap the coordinator's fresh runtime.
165
+ - the runtime's results, notifications and log entries arrive on the same
166
+ connection from then on, and the coordinator drives the runtime over it.
167
+ - a runtime whose server is **not connected** is not waited for. The board
168
+ says which one is missing and builds it when that server connects.
169
+ 4. **Mounts, once every runtime exists** — the addresses each runtime's
170
+ services published in `__hkpMount` are recorded as it is built;
171
+ `publishMountAddresses()` configures the consumers. A second pass, because a
172
+ service can point at a mount on a runtime built later. The board keeps its
173
+ `hkp-mount://` references: an address is only true of one run.
174
+
175
+ ### Why tickets, and not the user's token
176
+
177
+ The coordinator's dealings with a runtime — driving it, configuring a service
178
+ an hour later, rebuilding it after its server restarted — must keep working
179
+ after the user's id token expires, and with nobody present. A ticket is **the
180
+ user's permissions for one runtime, delegated to a machine**: it resolves to
181
+ their `sub` on the runtime server, so there is no service superuser, and it
182
+ speaks for nothing but that runtime of that board. Because the runtime server
183
+ keeps it, a restart on either side is recovered from without the user.
184
+
185
+ ---
186
+
187
+ ## Attached: what a viewer may do
188
+
189
+ Opening a deployed board attaches to it. `views/cloud/bridgeRuntimeApi.ts`
190
+ builds runtime scopes that **open no socket** — the one bridge socket already
191
+ carries every runtime's state, and a cloud runtime may live where the browser
192
+ has no route to it at all.
193
+
194
+ | | How |
195
+ |---|---|
196
+ | Reads | from the coordinator's snapshot (`coordinatorSnapshot.ts`) — config, each runtime's registry, each service's live state |
197
+ | Configure | a request over the bridge; the coordinator makes the call |
198
+ | Process at a service | a request over the bridge (`processService`) — what a facade's `process` action means here. The coordinator begins the run on the runtime holding the service, answers once the work is taken, and carries what the pipeline produces to the board's next runtime |
199
+ | Notifications | their own bridge message. They are **not** state — a Monitor's output is deliberately absent from `getState()`, so a browser rendering state alone would show an empty Monitor on a running board |
200
+ | Structural edits | refused. Adding a service means owning the board |
201
+
202
+ Leaving the view closes the bridge scopes; it does not delete runtimes. A
203
+ deployed board keeps running.
204
+
205
+ Nothing here dials a runtime, and that is a rule rather than a convenience: a
206
+ request the browser wrote itself would go around the one party that can say
207
+ who is calling. `processService` in `facade/boardServices.ts` therefore asks
208
+ the runtime's own API, which for an attached scope is the bridge.
209
+
210
+ Editing a deployed board means editing it in a playground and deploying again —
211
+ or forking it, below.
212
+
213
+ ### Browser runtimes in a cloud board
214
+
215
+ A coordinator cannot host a browser runtime, so it routes results into one over
216
+ the bridge (`routeResult()` → `processRuntime` → `result-from-browser`). A
217
+ browser is a **transient** participant: with no viewer attached, data arriving
218
+ for that runtime stops there — as it would at a service that returned `null` —
219
+ and the board stays `running`. The consequence is worth stating plainly: **the
220
+ part of a cloud board downstream of a browser runtime does not run headless.**
221
+
222
+ ### Bytes between runtimes
223
+
224
+ Both of a coordinator's connections — the link to a runtime server and the
225
+ bridge to a browser — carry JSON as text frames. A value that holds bytes
226
+ would not survive that: as text, a byte array arrives as an object of numbered
227
+ keys. So what one runtime hands the next travels as a **binary frame** when it
228
+ is not JSON:
229
+
230
+ ```
231
+ [ 4 bytes: header length, big-endian ][ header: UTF-8 JSON ][ payload ]
232
+ ```
233
+
234
+ The header is the message that would have been sent as text —
235
+ `{ "type": "result" }`, `{ "type": "processRuntime", … }` — with the value left
236
+ out and a `binary` field saying what the payload is:
237
+
238
+ | `binary.kind` | Payload | Also in the header |
239
+ |---|---|---|
240
+ | `bytes` | the value | — |
241
+ | `floatRingBuffer` | little-endian float32 samples | `id`, `ts` |
242
+ | `mixed` | the bytes of an object's `binary` field | `json`: the rest of the object |
243
+
244
+ `mixed` is what an HTTP response or a file read is on every runtime: bytes with
245
+ something said about them.
246
+
247
+ **The coordinator does not read the payload.** It parses the header, keeps the
248
+ bytes as they came, and writes them out under the next runtime's header. It
249
+ cannot corrupt what it does not interpret, and a new shape is a change to the
250
+ runtimes that produce and consume it, not to the coordinator.
251
+
252
+ Each runtime maps the shapes onto its own types. hkp-node has no ring buffer,
253
+ so one passing through it is held as
254
+ `{ type: "FloatRingBuffer", id, ts, binary }` and leaves as a ring buffer again
255
+ if nothing touched it.
256
+
257
+ Only a runtime's output and the next runtime's input travel this way. A
258
+ notification or a log entry that mentions bytes describes them — a size, a
259
+ type — because those are for a person to read.
260
+
261
+ **A value has a ceiling, and passing it drops the value, not the board.** A
262
+ coordinator is shared and holds a frame once per attached viewer, so it passes
263
+ on values up to 64 MiB — `HKP_COORDINATOR_MAX_FRAME_BYTES` raises or lowers
264
+ that, and it is never off. A frame over it is dropped and recorded in the
265
+ board's log as `frame-dropped`; the connection, and the board, stay up. Every
266
+ coordinator connection — a runtime server joining, a browser attaching, a
267
+ runtime server's own link out — also has a ceiling of the WebSocket library's,
268
+ 16 MiB above that limit, so nothing is buffered without bound before anyone
269
+ looks at it; past it the connection is closed (`coordinator/frameLimits.ts`).
270
+ Runtime servers read the same setting for their links, so one value describes
271
+ the deployment.
272
+
273
+ This is not YAS, which is what a runtime server and a browser speak when the
274
+ browser drives the runtime itself. The link already has
275
+ a JSON header to say what the bytes are, and YAS has no encoding for `mixed`.
276
+
277
+ ---
278
+
279
+ ## Running, stopped, error
280
+
281
+ | Status | Meaning |
282
+ |---|---|
283
+ | `running` | every runtime the board cannot run without is built, on a runtime server that is connected |
284
+ | `stopped` | the coordinator still holds the **board** — its place in the list, its config, its tickets — but not its runtimes |
285
+ | `error` | a required runtime's server is not connected, or the runtime could not be built; `errors[]` names it |
286
+
287
+ **`error` is not terminal.** It is what a board is while a runtime server is
288
+ away, and it ends when that server reconnects: the runtime is picked back up if
289
+ it is still running there, and rebuilt from the board's config if it is not. An
290
+ attached browser is told as it happens — status and reasons travel together in
291
+ the bridge snapshot. A browser runtime with nobody attached is **not** an error
292
+ (→ *required and transient*, `concepts/remotes.md`).
293
+
294
+ **Stopping is not deleting.** `BoardSession.stop()` releases the runtimes and
295
+ clears everything that described that run — mount addresses, service states,
296
+ registries — while the board keeps its config. That is what editing does: the
297
+ browser takes the runtimes over, so the coordinator must not still hold them,
298
+ but a board being edited must not be a board that can be lost. The runtime
299
+ servers stay connected, so **Start needs no new tickets**.
300
+
301
+ Residue is reported rather than swallowed: a runtime that could not be released
302
+ — its server was not connected — is very likely still running, so those are
303
+ collected into `errors[]` while the status stays `stopped`. It is released when
304
+ that server next connects.
305
+
306
+ **Starting a stopped board is registering its config again** — there is no
307
+ separate start path.
308
+
309
+ ---
310
+
311
+ ## Who began a run
312
+
313
+ A deployed board is one set of runtimes that several browsers may act on, so
314
+ "who did this" cannot be a field of the request — a payload naming its sender
315
+ proves nothing about them. A run therefore carries one actor:
316
+
317
+ ```ts
318
+ type RunActor =
319
+ | { kind: "person"; sub: string; email?: string; name?: string;
320
+ role?: "owner" | "member"; expiresAt: number }
321
+ | { kind: "board" }
322
+ | { kind: "mount" }
323
+ | { kind: "local" };
324
+ ```
325
+
326
+ `email` is there only when the token carried a **verified** one. `name` is what
327
+ the board's member list calls that address, set by the coordinator and absent
328
+ everywhere else. `role` is what the person is to the board — its `owner`, or a
329
+ `member` its list admitted — and is stated by whoever admitted them: the
330
+ coordinator when it admits a bridge, a runtime server for a client acting with
331
+ its own token, which reaches only its own tenant's runtimes and so owns them. A run begins in one of these ways, and each has its own code
332
+ path — not one parser with a flag:
333
+
334
+ | Entered by | Actor |
335
+ |---|---|
336
+ | A client holding a token — runtime or service `process`, service `configure`, or a `processRuntime` on the runtime's socket | `person`; whatever the request says is never read, and identity comes from the verified token (`contextForClient`) |
337
+ | A coordinator, over a participant link | taken as stated — the link is the board's own, and the coordinator on it verified any person (`contextFromLink`) |
338
+ | A board timer or standing subscription | `board` |
339
+ | A request at a public mount | `mount` |
340
+ | A runtime with authentication disabled | `local` |
341
+
342
+ `local` names the auth-off trust mode, not a network location; a runtime in
343
+ that mode may still be reached beyond loopback if its host explicitly allows
344
+ that configuration.
345
+
346
+ A server without authentication resolves everyone to one anonymous tenant.
347
+ That is **no caller**, not a caller called anonymous: otherwise everybody on a
348
+ development machine would be the same person.
349
+
350
+ **The run survives the chain.** A participant's `result` is `{ data, context }`,
351
+ the coordinator hands that context to the next runtime, and a browser runtime
352
+ in between is told the run but not trusted with it — what continues is the
353
+ context the coordinator held. Without this the caller would be known to the
354
+ first runtime of a board and lost to the second. Nested pipelines inherit it
355
+ through `childRun`.
356
+
357
+ **A browser runtime runs it as the run it was handed** (`continuedRun`,
358
+ `hkp-frontend/src/runtime/processContext.ts`). Its services are called with the
359
+ coordinator's actor, and what it records carries that attribution. A board,
360
+ mount or local run does not become the person signed in to the
361
+ browser running it, which on a shared board is the owner. Only a run that began
362
+ as their gesture gets that person actor.
363
+
364
+ `app.next()` keeps that context while the emitting service is still answering
365
+ its call. A service which will answer once after returning calls `app.defer()`
366
+ before it gives up control; the returned resolver carries that same run exactly
367
+ once. Standing timers, sockets and subscriptions do not continue the person who
368
+ created them: each emission starts a `board` run. Browser panels receive a
369
+ runtime-routed service handle, so the framework snapshots the signed-in person
370
+ when a panel calls a service method and keeps that run across an `await`.
371
+ Services use ordinary `next()` and `defer()`; they do not label their own calls
372
+ as user actions. Once the panel call ends, a timer or other standing callback
373
+ installed by it uses the underlying service handle and therefore starts a
374
+ `board` run.
375
+
376
+ Configuration is a run entry too. A browser panel crosses the in-process
377
+ runtime boundary above; REST runtime servers derive its actor from the bearer
378
+ token; and an attached cloud board sends it through the authenticated bridge.
379
+ If configuring one service makes it configure another, the framework carries
380
+ the same run into that call. The configured service therefore may inspect or
381
+ emit under the actor without either service deciding who that actor is.
382
+
383
+ Person authority is bounded twice. Every runtime checks the actor's `expiresAt`
384
+ before each service, including after an awaited service returns. At every
385
+ coordinator hop the coordinator checks the deadline again and checks that the
386
+ person is still the owner or a current member — and that a run claiming the
387
+ owner's role is the owner's (`mayActOn`). Removing a member therefore also
388
+ revokes work that finishes late.
389
+
390
+ That holds at any depth. A service that holds a pipeline — a sub-service, an
391
+ If, a case of a Switch, a track, or a Configurator's transform — runs it as a
392
+ run of its own under the one it was called in
393
+ (`nestedRun`), with the same actor, and points the scope it builds at the app
394
+ around it for who is signed in (`delegateIdentity`). A service inside one is
395
+ told what a service at the top of the runtime is told.
396
+
397
+ A service asks the run, never its input. [`sql`](../services/sql.md) binds
398
+ `$caller_email`, `$caller_name`, `$caller_sub`, `$caller_role` and `$actor_kind`
399
+ from it; a log
400
+ entry carries the person actor's `sub`, so the owner's run log answers "who did
401
+ this" without collecting addresses.
402
+
403
+ All three runtime servers do this the same way — hkp-node (`runtime.ts`),
404
+ hkp-python (`runtime.py`) and hkp-rt (`process_context.h`) each keep the
405
+ client's reader and the link's reader apart — so a run that crosses languages
406
+ keeps its caller.
407
+
408
+ ## Sharing a board: members
409
+
410
+ A deployed board has one **owner** — whoever deployed it, in whose tenant its
411
+ runtimes run and its data lives — and a list of **members**: people who may
412
+ attach to that board and use its facade, and nothing else. The list is the
413
+ membership.
414
+
415
+ ```
416
+ GET /coordinator/users/:username/boards/:boardName/members
417
+ POST /coordinator/users/:username/boards/:boardName/members { email, name }
418
+ DELETE /coordinator/users/:username/boards/:boardName/members/:email
419
+ GET /coordinator/shared → boards whose list names the caller's email
420
+ ```
421
+
422
+ An entry is a **verified email** and a **name**. The name is the owner's to
423
+ set: it is what other members see where the board shows who did something, and
424
+ a name from the person's own token would let them appear as someone else.
425
+ `POST` adds an entry or renames the one with that email. The list is kept by
426
+ the coordinator beside the board — in `PersistedBoard`, never in the board
427
+ document — so it survives the board being deployed again and goes when the
428
+ board is deleted.
429
+
430
+ ### Two questions, not one
431
+
432
+ `auth.ts` separates who somebody **is** from what they may **own**:
433
+
434
+ - `identifyToken` — signature, audience, `sub`; the email only if
435
+ `email_verified`, normalised. An unverified address is dropped, not refused.
436
+ - `authorizeOwner` — that, then the server's allowlist. What every route uses
437
+ unless it says otherwise.
438
+
439
+ `ALLOWED_EMAILS` therefore gates **who may own** — runtimes, boards — and a
440
+ board's list gates who may attach to that board. Two paths authenticate their
441
+ own callers and are named explicitly, the way the join endpoint is:
442
+ `GET /coordinator/shared` (`addSelfAuthenticatedRoute`) and the bridge upgrade.
443
+ Everything else a member's token tries is refused as before.
444
+
445
+ ### Attaching by role
446
+
447
+ A bridge names an owner and a board (`coordinator/bridge.ts`). Admitted: the
448
+ owner (`sub` matches and passes `authorizeOwner`), or a verified email on that
449
+ board's list. Anybody else is closed on the way an unknown board is — after
450
+ the same wait, saying the same nothing. Each bridge remembers its caller and
451
+ role; a redeploy carries both into the new session and **asks the list again**.
452
+
453
+ | | Owner | Member |
454
+ |---|---|---|
455
+ | Sent | the board, every service's state, the log | a **projection** |
456
+ | `resync` | yes | yes |
457
+ | `processService` | at any service | only at a service the facade names in a `process` action |
458
+ | `configureService`, `log`, `result`, `result-from-browser` | yes | refused |
459
+ | Hosts browser runtimes | yes | never |
460
+
461
+ **A member is sent a projection, not the board** (`coordinator/facadeAccess.ts`).
462
+ A board's config carries service state and state can carry credentials, so
463
+ hiding the editor would mean little if the bridge sent the JSON. The
464
+ projection is the facade; for each service the facade names its `uuid`,
465
+ `serviceId` and `serviceName`, and of its state only the paths the facade's
466
+ sources read; and whether the board is running. No runtime address, no
467
+ statement, no registry, no log.
468
+
469
+ **What the facade keeps for its owner is not part of it.** A widget,
470
+ container, panel, tab or notice marked `"visibleTo": "owner"` is left out of
471
+ the facade before anything is read from it (`facadeForMembers`), along with a
472
+ tab left with none of its panels, the panels only an owner's tab names — which
473
+ would otherwise sit above the tabs for everybody — and a `defaultTab` naming
474
+ a tab that went. So it is not
475
+ drawn for a member, a `process` action inside it is not a member's to call,
476
+ and a path only it reads is not projected to them. That is what a member is
477
+ *shown*; a service that is a member's to call still decides for itself what
478
+ they may do through it. The
479
+ [members' live radio](../boards/live-radio-members-demo-board.md) keeps its
480
+ station controls this way.
481
+
482
+ **The entry point is the capability, not the payload.** Naming a service in a
483
+ `process` action makes it member-callable with *any* payload — a custom client
484
+ is not bound to what the widget would send. So everything that matters has to
485
+ be checked behind the entry point, from the run's person actor. The
486
+ [court-booking board](../boards/court-booking-demo-board.md) is the worked
487
+ example; the [meeting poll](../boards/meeting-poll-demo-board.md) adds the
488
+ actor's role, keeping what only the owner may do — calling a meeting,
489
+ putting up its dates — to the owner.
490
+
491
+ **Who hears what.** A notification raised with a person actor goes to **that
492
+ person's bridges only** — not to other members, and not to the owner. One from
493
+ a board, mount or local actor goes to everyone. A member is sent only
494
+ notifications from services the facade reads, and never the runtime's own
495
+ account of its flow (`__internal`), which carries the data passing through.
496
+
497
+ **And how much of it.** A member's copy of a notification is cut down the way
498
+ state is (`projectNotification`): to the paths the facade's sources read from
499
+ that service, so a facade reading `rows` of `{ rows, count, … }` gives a member
500
+ `rows`. A source with no `path` reads the notification whole and is given it
501
+ whole — which is a reason to name a path. A path inside one that is sent whole
502
+ adds nothing and is skipped: a calendar reading `rows` beside a line reading
503
+ `rows.0.day` is sent the rows as a list, not rebuilt as an object holding `0`. A notification holding none of the
504
+ paths is not sent to a member: an empty projection would reveal that the
505
+ service spoke without changing or clearing the widget. Clearing is explicit —
506
+ for example, a table sends `rows: []` — and that value is projected normally.
507
+ The owner is sent what was said.
508
+
509
+ **A path names data, never what every object inherits.** A source path is the
510
+ owner's to write and projecting it writes along it, so a segment `__proto__`,
511
+ `constructor` or `prototype` would reach `Object.prototype` — every object in
512
+ the coordinator, every tenant's, and from there the identity of a token that
513
+ carries no email. A board whose facade has such a path is refused when it is
514
+ deployed (`400`, naming it), wherever in the facade it is, kept for the owner
515
+ or not. Behind that, projection reads own properties only and builds what it
516
+ sends without a prototype, and identity is read only from the claims a token
517
+ itself carries (`identityFromClaims`).
518
+
519
+ **A member's bridge never hosts a runtime.** It is never sent `processRuntime`
520
+ and is not a target when the chain reaches a browser runtime. A board with a
521
+ browser runtime still works for members; that runtime runs only while its
522
+ owner is attached, which is what "a browser runtime with nobody attached"
523
+ already means.
524
+
525
+ **Removing a member closes their bridges at once** (close code 4403), and a
526
+ client told that does not reconnect.
527
+
528
+ **A refusal is a close code, so that it can be told from a dropped
529
+ connection.** Three are answers, and a client stops on them:
530
+
531
+ | Code | Says |
532
+ |---|---|
533
+ | 4403 | the board was shared with you and no longer is |
534
+ | 4404 | no such board for you — it does not exist, or it is not yours and not shared with you. One code for both, after the same wait, so asking does not reveal which |
535
+ | 4429 | you already hold as many bridges as one member may; only ever said to a member |
536
+
537
+ Any other close — a coordinator restarting, a network that went away — says
538
+ nothing about the board, and the client opens the bridge again. An owner's
539
+ client keeps asking on 4404 as well: their board is briefly away while it is
540
+ deployed again.
541
+
542
+ **What is written down is written in order.** A board's writes to the store,
543
+ and its removal, wait in one line per board (`inStoreOrder`), and each write
544
+ takes the board as it is when its turn comes. Two changes made at once
545
+ therefore leave the later one on disk whichever the store finishes first, a
546
+ slow request cannot write down a session a deploy has since replaced, and a
547
+ write still on its way cannot bring back a board that was deleted.
548
+
549
+ **Bounds**: members per board, bridges per member, and a member's process
550
+ calls per minute — `HKP_COORDINATOR_MAX_MEMBERS` (200),
551
+ `HKP_COORDINATOR_MAX_MEMBER_BRIDGES` (4),
552
+ `HKP_COORDINATOR_MAX_MEMBER_PROCESS_PER_MINUTE` (120), and person-run lifetime
553
+ `HKP_COORDINATOR_MAX_PERSON_RUN_AGE_MS` (15 minutes).
554
+
555
+ ### What is still open
556
+
557
+ - **Telling everyone something changed.** With private notifications, one
558
+ member's calendar does not move when another books; it is right again on
559
+ their next action. A live board needs a way for a run to say "everyone, look
560
+ again" without sending anyone's view.
561
+ - **Shared state.** `sql` keeps `error` and `lastCount` in its state, so a
562
+ facade reading them shows what the last caller left.
563
+ - **Members cannot configure.** A knob or field that configures a service is a
564
+ facade action a member cannot take.
565
+ - **A bridge outlives its token.** The socket is authenticated once, at
566
+ upgrade. Removal evicts; expiry does not.
567
+ - **hkp-rt has no nested runs to inherit into.** Its sub-pipelines run without
568
+ a context of their own, so a caller is carried across its runtimes and into
569
+ its log, and not into a scope. Nothing there reads one yet.
570
+
571
+ ## Persistence, and what deliberately is not persisted
572
+
573
+ Enabled with `COORDINATOR_ENABLED=true`. Boards are one JSON file each under
574
+ `HKP_COORDINATOR_DATA_DIR` (default `~/.hkp/node-<instance>/coordinator/boards`,
575
+ inside the folder of the hkp-node playing coordinator); setting that
576
+ to the empty string keeps them in memory instead.
577
+
578
+ It persists `userId`, `boardName`, `createdAt`, `config`, whether the board was
579
+ **stopped**, the **hashes of its tickets** and its **member list** — the board,
580
+ not the run. Built
581
+ runtimes, live service state, registries, mount addresses and status each
582
+ describe one run against processes that may not exist on load, so writing them
583
+ down would persist claims that are false when read back.
584
+
585
+ - **Paths are hashed**, never built from names:
586
+ `<sha256(userId)>/<sha256(boardName)>.json`. Both names come off the wire, so a
587
+ board called `../../etc/passwd` must not escape the root — and `Foo` and `foo`,
588
+ two boards to the coordinator, must not become one file on a case-insensitive
589
+ filesystem. Real names live inside.
590
+ - **Writes are temp-then-rename**, so a crash leaves the previous board intact.
591
+ Files are `0600`, directories `0700`: a board config carries service state,
592
+ which can carry credentials.
593
+ - **Only ticket hashes are stored.** What is on disk recognises a ticket and
594
+ cannot present one.
595
+ - **A restored board runs again by itself.** One that was running comes back in
596
+ `error`, naming every runtime it is waiting for, and builds each as its
597
+ runtime server reconnects with the ticket it kept. One that was stopped stays
598
+ stopped. A file written before tickets existed comes back stopped — nothing
599
+ holds a ticket for it, so nothing could reconnect.
600
+ - **A corrupt or newer-format file is skipped and logged**, never fatal.
601
+ - **A failing save does not fail a deploy**: the board runs, and only its
602
+ survival of a restart is in doubt.
603
+
604
+ ### While the coordinator is away
605
+
606
+ Runtimes are built to persist, so they outlive the coordinator that built them:
607
+ a webhook arriving while it restarts is still answered. Their runtime servers
608
+ keep trying to reconnect, and when the coordinator is back the board's runtimes
609
+ are rebuilt from its config under the same ids — one runtime, not two — at the
610
+ mount addresses they had. `hkp-node/tests/coordinator-restart.test.ts` covers
611
+ this end to end, in both directions.
612
+
613
+ ### One directory, one coordinator
614
+
615
+ Not enforced, and worth knowing: two coordinator processes pointed at the same
616
+ data directory both restore every board and both believe they own them, and
617
+ both would accept the same tickets. There is no lock.
618
+
619
+ ---
620
+
621
+ ## The board's log
622
+
623
+ A board's log spans every runtime it uses, and **that stitching is why the
624
+ coordinator keeps it** — a runtime could only ever answer for its own slice. One
625
+ JSONL file per board under `HKP_COORDINATOR_LOG_DIR` (default: beside the
626
+ boards), size-bounded and rolled, with the board store's per-user owner-only
627
+ posture because entries carry board data (`coordinator/logStore.ts`).
628
+
629
+ - Entries from remote runtimes arrive on the connections their runtime servers
630
+ opened.
631
+ - Entries from a browser runtime arrive over the bridge as `log` messages —
632
+ that runtime has no other route into the board's log.
633
+ - Read back with `GET /coordinator/users/:username/boards/:boardName/runs`.
634
+ - The switch is `POST …/logging`; it is applied to the runtimes already running
635
+ *and* written into the stored config, so it neither restarts anything nor
636
+ quietly reverts on the next start. Runtimes that did not take it are reported
637
+ rather than assumed.
638
+
639
+ Runs, entries, levels and what each runtime actually does: **Logging**
640
+ (`concepts/logging.md`).
641
+
642
+ **Capture mode is the opposite of the log switch in one respect: it is never
643
+ kept.** It decides whether the runtimes' call reports carry the values going
644
+ into and out of each service, or only that a call happened
645
+ (`concepts/runtime.md`, "What crosses a runtime boundary").
646
+ - The switch is `POST …/capture`, the owner's alone.
647
+ - It is applied to the runtimes already running over the same `setState`
648
+ operation logging uses, and to a runtime the session rebuilds while it is on.
649
+ - It is held by the session and written nowhere. A restart or a redeploy turns
650
+ it off, and so does the owner's last bridge to the board closing.
651
+ - The board list reports it as `capture`.
652
+ - The owner switches it in the Cloud Boards view, beside Logging, and on a
653
+ phone with the round button in the open board's top bar. Turning it on from
654
+ a service's Flow on a phone asks the coordinator too, never only the phone.
655
+
656
+ ---
657
+
658
+ ## Getting back to an editor: fork
659
+
660
+ A deployed board is the coordinator's. The way back to something editable is to
661
+ **fork** it — "Fork board" in the start page's details column, for boards opened
662
+ from a coordinator. The host reads the config from the coordinator, copies it
663
+ with `hkp-frontend/src/core/forkBoard.ts`, saves it and opens it. Implemented in
664
+ both hosts (`meander/frontend/src/StartPage.tsx`, `hkp-website/src/pages/Start.tsx`).
665
+
666
+ **Every id is renamed, and everything naming an id is renamed with it** — a copy
667
+ that kept them would provision over the runtimes the original is running on, an
668
+ editor whose changes land on the deployed board:
669
+
670
+ | Kind | Where |
671
+ |---|---|
672
+ | Runtime ids | `runtimes[].id`, the keys of `services`, `targetRuntime`, `runtimeId` |
673
+ | Service ids | each service `uuid`, `instanceId` of nested services, `targetServiceUuid`, the facade's `serviceUuid` |
674
+ | Mounts | `__hkpMount`, when it holds a `hkp-mount://` reference |
675
+
676
+ Rewriting is driven by **field name, not by value**: an id like `node` or
677
+ `mon-1` is an ordinary string that can appear anywhere in a board.
678
+ `KNOWN_REFERENCE_FIELDS` is where a new such field is added. A `__hkpMount`
679
+ holding an *address* is left alone — it may name something outside the board
680
+ entirely.
681
+
682
+ Stopping the original and deploying the fork stays the user's call.
683
+
684
+ ---
685
+
686
+ ## Where a user meets all this
687
+
688
+ - **Deploy**: the rocket in the playground toolbar (`components/Toolbar/DeployMenu.tsx`),
689
+ or "Deploy board" in the mobile board menu.
690
+ - **Find deployed boards**: the start page's **Cloud Boards** source — one
691
+ folder per configured coordinator, its boards inside, labelled *Running in
692
+ cloud* / *Stopped* / *Failed to start* (`views/start/useCloudBoardsFolder.ts`).
693
+ - **Open one**: the Cloud Boards view on desktop (`views/cloud/index.tsx`), the
694
+ Cloud tab on mobile (`views/cloud/mobile/MobileCloudBoards.tsx`). On desktop
695
+ a board with a facade opens on it, with the playground's facade / split /
696
+ runtimes toggles in the toolbar: deployed, a board is used rather than
697
+ built, and what its facade does goes over the bridge as the owner's action.
698
+ The mobile tab has had the same through its App / Board toggle.
699
+ - **Share one**: **Members** on an open board — an address and a name per
700
+ entry, and *Copy link* (`views/cloud/MembersDialog.tsx`).
701
+ - **Find what is shared with you**: *Shared with me* under each coordinator,
702
+ in the same three places. Opening one renders the **facade from the
703
+ projection** — there is no board underneath to show
704
+ (`views/cloud/SharedBoard.tsx`).
705
+ - **A link to a shared board** names the coordinator, the owner and the board,
706
+ and is not a credential (`views/cloud/sharedLink.ts`). A client never sends a
707
+ token to a coordinator the person does not already keep: a link naming any
708
+ other host asks first, otherwise a link would be a way to collect tokens.
709
+ - **Coordinators themselves** are `{ name, url }` pairs in `localStorage` under
710
+ `hkp-coordinators` (`hkp-frontend/src/common.tsx`), managed in the
711
+ Manage-coordinators dialog. The same host also serves runtimes, so it appears
712
+ in the add-runtime picker too.
713
+ - **Login is required.** Cloud boards are per user; the whole view is gated
714
+ (`views/cloud/CloudLoginGate.tsx`).
715
+
716
+ Two different behaviours to know about here. The attached runtime scopes refuse
717
+ structural edits outright (`notWhileAttached` in `bridgeRuntimeApi.ts`) — adding
718
+ a service means owning the board. The **mobile** Cloud tab additionally watches
719
+ for structural change and re-registers the board when its runtimes or services
720
+ actually differ, so a change made there provisions rather than silently
721
+ diverging; the desktop view has explicit **Start** / **Stop** instead and
722
+ registers only when asked.
723
+
724
+ ---
725
+
726
+ ## When touching this area
727
+
728
+ - **Ownership before anything.** Ask who built the runtime you are about to
729
+ change or delete. Runtime ids are the board's, so "it has the right id" is not
730
+ evidence that it is yours.
731
+ - **Ids are per user for clients, per board for coordinators.** The stable ids
732
+ boards ship (`node`, `chat-node`) do not collide between people, between two
733
+ deployed boards of one person, or between a deployed board and the same
734
+ board open in a browser. They *do* collide between two browsers of one
735
+ person playing boards that share an id against one server.
736
+ - **The coordinator dials nothing.** If a change needs the coordinator to reach
737
+ a runtime server, it needs an operation on the connection that server opened
738
+ (`participantProtocol.ts`) — implemented on every runtime server that joins.
739
+ - **A missing participant is not one thing.** A remote runtime away is an
740
+ error that names it; a browser runtime away is normal operation.
741
+ - **Reconnection is a real state**, on both kinds of connection. A dropped
742
+ bridge re-snapshots; a runtime server that returns is picked up or rebuilt.
743
+ - **A person actor is stated, never read.** Anything that begins a run for a client
744
+ goes through `contextForClient`; only a participant link is believed.
745
+ - **What a member can reach is what the facade names.** A new bridge message
746
+ is the owner's unless it is added to the member's short list on purpose, and
747
+ anything new sent to browsers has to say what a member gets of it.
748
+ - **Mount references, not addresses, are what a board stores** — and names, not
749
+ addresses, for its runtime servers. Resolving a mount belongs to the
750
+ coordinator; resolving a remote belongs to the person's client.
751
+
752
+ ---
753
+
754
+ ## Rough index into the source
755
+
756
+ | Concern | Where |
757
+ |---|---|
758
+ | Deploy (browser side) | `hkp-frontend/src/core/deploy.ts`, `core/deployPreflight.ts`, `components/Toolbar/DeployMenu.tsx`, `DeployDialog.tsx`, `views/playground/mobile/DeployBoardSheet.tsx` |
759
+ | Naming a remote | `hkp-frontend/src/runtime/board/remote.ts` |
760
+ | Coordinator REST client | `hkp-frontend/src/views/cloud/coordinatorClient.ts` |
761
+ | Attached view | `hkp-frontend/src/views/cloud/index.tsx`, `useCoordinatorBridge.ts`, `coordinatorSnapshot.ts`, `bridgeRuntimeApi.ts` |
762
+ | Mobile | `hkp-frontend/src/views/cloud/mobile/MobileCloudBoards.tsx` |
763
+ | Finding boards | `hkp-frontend/src/views/start/useCloudBoardsFolder.ts` |
764
+ | Fork | `hkp-frontend/src/core/forkBoard.ts` |
765
+ | Coordinator role, sessions | `hkp-node/src/coordinator/coordinator.ts`, `session.ts` |
766
+ | HTTP API | `hkp-node/src/coordinator/router.ts` (`/coordinator/users/:username/boards…`) |
767
+ | Bridge socket | `hkp-node/src/coordinator/bridge.ts` (who is admitted, as what), `coordinator/bridgeProtocol.ts`, mounted in `hkp-node/src/index.ts` at `/coordinator/bridge` |
768
+ | Members | `hkp-node/src/coordinator/members.ts`, `facadeAccess.ts` (what a facade grants, the projection); `hkp-frontend/src/views/cloud/MembersDialog.tsx`, `SharedBoard.tsx`, `sharedLink.ts` |
769
+ | Who began a run | `hkp-node/src/runtime.ts` (`contextForClient`, `contextFromLink`, `childRun`), `hkp-node/src/auth.ts` (`identifyToken`, `authorizeOwner`); `hkp-python/src/hkp/runtime.py`, `auth.py`; `hkp-rt/lib/src/process_context.h`, `lib/src/http/server.cpp` |
770
+ | Board + log persistence | `hkp-node/src/coordinator/fileBoardStore.ts`, `logStore.ts` |
771
+ | Tickets, joining, the participant protocol | `hkp-node/src/coordinator/participants.ts`, `join.ts`, `participantProtocol.ts` |
772
+ | Bytes between runtimes | `hkp-node/src/coordinator/binaryFrame.ts`, `hkp-python/src/hkp/binary_frame.py`, `hkp-rt/lib/src/binary_frame.h`, `hkp-frontend/src/views/cloud/bridgeBinary.ts` |
773
+ | A runtime server's link to a coordinator | `hkp-node/src/coordinatorLinks.ts`, `hkp-python/src/hkp/coordinator_links.py`, `hkp-rt/lib/src/coordinator_links.cpp` |
774
+ | Tests | `hkp-node/tests/coordinator-*.test.ts`, `bridge-snapshot.test.ts`, `bridge-process.test.ts`, `board-members.test.ts`, `caller.test.ts`, `court-booking-board.test.ts`, `board-log.test.ts`; `hkp-python/tests/test_caller.py`; `hkp-rt/tests/runtime_output_sink.test.cpp`; `hkp-python/tests/test_coordinator_links.py`; `hkp-frontend/src/views/cloud/tests/`, `core/tests/deploy*.test.*`; `e2e/tests/cloud/` |
775
+
776
+ ---
777
+
778
+ ## Known gaps
779
+
780
+ - **Unit-owned assets are not deployed.** Deployment carries only the
781
+ top-level board's asset descriptors. A runtime contributed by a unit receives
782
+ none of that unit's assets, so its `hkp-asset://…` references will not resolve
783
+ in the deployed board. See [Assets: Units and deploying](./assets.md#units-and-deploying).
784
+ - **A phone's embedded runtime cannot join a coordinator**, by decision: the
785
+ app is suspended at will. The preflight stops a board that places a runtime
786
+ there.
787
+ - **Credentials do not survive a runtime server restart.** The ticket does; the
788
+ values handed over with the introduction are held in memory. The board says
789
+ which are missing, and deploying again supplies them.
790
+ - **No lock on the data directory** (see above).
791
+ - **The part of a board downstream of a browser runtime does not run headless.**
792
+ - **The mobile cloud view reads a board's reasons from the listing** rather
793
+ than live.
794
+ - **Deploy is one-way per board**: the way back is a fork, which is a *copy* —
795
+ the deployed board keeps running until someone stops it.
796
+
797
+ ---
798
+
799
+ See also: **Coordinator** (`concepts/coordinator.md`), **Remotes**
800
+ (`concepts/remotes.md`), **Mounts** (`concepts/mounts.md`) and **Logging**
801
+ (`concepts/logging.md`).
802
+ `plans/TODO-CLOUD-COORDINATOR.md` records why it is built this way and what is
803
+ still open.