@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.
- package/README.md +114 -2
- package/bundle/LICENSE +201 -0
- package/bundle/boards/aggregator-demo-board.json +54 -0
- package/bundle/boards/alpaca-board.json +316 -0
- package/bundle/boards/animate-board.json +159 -0
- package/bundle/boards/ascii-art-demo-board.json +33 -0
- package/bundle/boards/ascii-cam-board.json +184 -0
- package/bundle/boards/asset-demo-board.json +54 -0
- package/bundle/boards/audio-encode-demo-board.json +153 -0
- package/bundle/boards/audiolize-board.json +152 -0
- package/bundle/boards/batcher-demo-board.json +43 -0
- package/bundle/boards/buffer-demo-board.json +53 -0
- package/bundle/boards/cache-demo-board.json +59 -0
- package/bundle/boards/camera-demo-board.json +28 -0
- package/bundle/boards/canvas-demo-board.json +55 -0
- package/bundle/boards/changes-demo-board.json +60 -0
- package/bundle/boards/court-booking-browser-demo-board.json +221 -0
- package/bundle/boards/court-booking-demo-board.json +218 -0
- package/bundle/boards/current-time-board.json +32 -0
- package/bundle/boards/debounce-demo-board.json +43 -0
- package/bundle/boards/decrypt-demo-board.json +47 -0
- package/bundle/boards/delay-demo-board.json +28 -0
- package/bundle/boards/detect-demo-board.json +64 -0
- package/bundle/boards/document-extract-demo-board.json +55 -0
- package/bundle/boards/dropitapp-board.json +138 -0
- package/bundle/boards/encode-demo-board.json +39 -0
- package/bundle/boards/encrypt-board.json +185 -0
- package/bundle/boards/encrypt-demo-board.json +39 -0
- package/bundle/boards/face-alert-board.json +181 -0
- package/bundle/boards/fetcher-demo-board.json +40 -0
- package/bundle/boards/fft-demo-board.json +28 -0
- package/bundle/boards/filter-demo-board.json +55 -0
- package/bundle/boards/flat-map-demo-board.json +42 -0
- package/bundle/boards/frame-limit-test-board.json +130 -0
- package/bundle/boards/game-board.json +413 -0
- package/bundle/boards/game-of-life-board.json +139 -0
- package/bundle/boards/game-of-life-demo-board.json +34 -0
- package/bundle/boards/gather-demo-board.json +62 -0
- package/bundle/boards/group-by-demo-board.json +62 -0
- package/bundle/boards/hacker-demo-board.json +45 -0
- package/bundle/boards/hacker-news-board.json +741 -0
- package/bundle/boards/hash-demo-board.json +40 -0
- package/bundle/boards/health-log-browser-demo-board.json +537 -0
- package/bundle/boards/health-log-demo-board.json +498 -0
- package/bundle/boards/helloworld-board.json +57 -0
- package/bundle/boards/hold-demo-board.json +67 -0
- package/bundle/boards/hold-scopes-demo-board.json +141 -0
- package/bundle/boards/http-client-browser-demo-board.json +379 -0
- package/bundle/boards/http-client-demo-board.json +380 -0
- package/bundle/boards/image-picker-demo-board.json +22 -0
- package/bundle/boards/imap-email-demo-board.json +35 -0
- package/bundle/boards/injector-demo-board.json +55 -0
- package/bundle/boards/iterator-demo-board.json +55 -0
- package/bundle/boards/limit-demo-board.json +66 -0
- package/bundle/boards/link-debugger.json +32 -0
- package/bundle/boards/live-location-demo-board.json +93 -0
- package/bundle/boards/live-radio-cloud-demo-board.json +216 -0
- package/bundle/boards/live-radio-cloud-direct-demo-board.json +311 -0
- package/bundle/boards/live-radio-demo-board.json +211 -0
- package/bundle/boards/live-radio-members-demo-board.json +314 -0
- package/bundle/boards/local-storage-demo-board.json +30 -0
- package/bundle/boards/lz-compress-demo-board.json +52 -0
- package/bundle/boards/map-demo-board.json +46 -0
- package/bundle/boards/match-filter-demo-board.json +43 -0
- package/bundle/boards/meeting-poll-browser-demo-board.json +649 -0
- package/bundle/boards/meeting-poll-demo-board.json +650 -0
- package/bundle/boards/microphone-monitor-demo-board.json +28 -0
- package/bundle/boards/microphone-speaker-demo-board.json +86 -0
- package/bundle/boards/monitor-demo-board.json +52 -0
- package/bundle/boards/mounted-endpoint-demo-board-hkp-rt.json +84 -0
- package/bundle/boards/mounted-endpoint-demo-board.json +84 -0
- package/bundle/boards/nested-rhythm-demo-board.json +1160 -0
- package/bundle/boards/next-bus-board.json +52 -0
- package/bundle/boards/next-bus-switch-board.json +79 -0
- package/bundle/boards/night-groove-demo-board.json +742 -0
- package/bundle/boards/noise-alert-board.json +146 -0
- package/bundle/boards/offer-followup-demo-board.json +291 -0
- package/bundle/boards/offer-intake-demo-board.json +289 -0
- package/bundle/boards/offer-intake-hetzner-demo-board.json +286 -0
- package/bundle/boards/offer-intake-imap-demo-board.json +289 -0
- package/bundle/boards/offer-intake-imap-hetzner-demo-board.json +354 -0
- package/bundle/boards/p2p-receiver-demo-board.json +65 -0
- package/bundle/boards/p2p-sender-demo-board.json +94 -0
- package/bundle/boards/pad-groove-demo-board.json +644 -0
- package/bundle/boards/peer-chat-board.json +109 -0
- package/bundle/boards/peer-chat-node-board.json +97 -0
- package/bundle/boards/qr-code-demo-board.json +22 -0
- package/bundle/boards/queue-demo-board.json +239 -0
- package/bundle/boards/reduce-demo-board.json +54 -0
- package/bundle/boards/remote-named-demo-board-hkp-rt.json +61 -0
- package/bundle/boards/remote-named-demo-board.json +61 -0
- package/bundle/boards/rss-demo-board.json +530 -0
- package/bundle/boards/rss-radio-board.json +515 -0
- package/bundle/boards/rss-radio-brief-one-board.json +237 -0
- package/bundle/boards/rss-radio-editor-unit-board.json +555 -0
- package/bundle/boards/rss-radio-library-unit-board.json +293 -0
- package/bundle/boards/rss-radio-unit-board.json +809 -0
- package/bundle/boards/rss-radio-voice-unit-board.json +146 -0
- package/bundle/boards/runtime-configs/hold-example.json +41 -0
- package/bundle/boards/runtime-configs/injector-example.json +23 -0
- package/bundle/boards/runtime-configs/speech-to-text-example.json +35 -0
- package/bundle/boards/runtime-configs/text-generation-example.json +31 -0
- package/bundle/boards/runtime-configs/text-to-speech-example.json +28 -0
- package/bundle/boards/runtime-configs/text-to-speech-inflect-example.json +28 -0
- package/bundle/boards/runtime-configs/ws-audio-playback-example.json +23 -0
- package/bundle/boards/select-demo-board.json +32 -0
- package/bundle/boards/send-ntfy-board.json +52 -0
- package/bundle/boards/shared-costs-demo-board.json +361 -0
- package/bundle/boards/sign-demo-board.json +41 -0
- package/bundle/boards/skill-router-demo-board.json +210 -0
- package/bundle/boards/smooth-demo-board.json +91 -0
- package/bundle/boards/smtp-email-demo-board.json +34 -0
- package/bundle/boards/sort-demo-board.json +55 -0
- package/bundle/boards/sound-demo-board.json +65 -0
- package/bundle/boards/spectral-modifier-board.json +98 -0
- package/bundle/boards/speech-synth-demo-board.json +37 -0
- package/bundle/boards/speech-to-text-demo-board.json +146 -0
- package/bundle/boards/spotify-board.json +75 -0
- package/bundle/boards/spread-demo-board.json +35 -0
- package/bundle/boards/sql-demo-board.json +56 -0
- package/bundle/boards/sql-explorer-board.json +447 -0
- package/bundle/boards/sql-explorer-node-board.json +474 -0
- package/bundle/boards/sql-import-board.json +156 -0
- package/bundle/boards/state-demo-board.json +65 -0
- package/bundle/boards/stopper-demo-board.json +40 -0
- package/bundle/boards/storage-demo-board.json +193 -0
- package/bundle/boards/store-demo-board.json +63 -0
- package/bundle/boards/swimlanes-demo-board.json +197 -0
- package/bundle/boards/switch-demo-board.json +51 -0
- package/bundle/boards/syn-board.json +19 -0
- package/bundle/boards/syn-booking-unit-board.json +998 -0
- package/bundle/boards/syn-conversations-anthropic-demo-board.json +925 -0
- package/bundle/boards/syn-conversations-demo-board.json +925 -0
- package/bundle/boards/syn-hotels-unit-board.json +287 -0
- package/bundle/boards/syn-mail-desk-board.json +25 -0
- package/bundle/boards/syn-mail-desk-unit-board.json +254 -0
- package/bundle/boards/telegram-listener-demo-board.json +31 -0
- package/bundle/boards/text-generation-anthropic-demo-board.json +66 -0
- package/bundle/boards/text-generation-demo-board.json +51 -0
- package/bundle/boards/text-generation-local-demo-board.json +80 -0
- package/bundle/boards/text-to-speech-demo-board.json +58 -0
- package/bundle/boards/timeline-demo-board.json +477 -0
- package/bundle/boards/timer-demo-board.json +35 -0
- package/bundle/boards/tracks-demo-board.json +95 -0
- package/bundle/boards/trigger-pad-demo-board.json +47 -0
- package/bundle/boards/triggerpad-board.json +31 -0
- package/bundle/boards/triggerpad-recorder-board.json +56 -0
- package/bundle/boards/uuid-generator-demo-board.json +166 -0
- package/bundle/boards/voice-assistant-demo-board.json +230 -0
- package/bundle/boards/voice-assistant-hkp-rt-demo-board.json +239 -0
- package/bundle/boards/voice-assistant-local-demo-board.json +232 -0
- package/bundle/boards/voice-assistant-skills-demo-board.json +316 -0
- package/bundle/boards/voice-assistant-skills-local-demo-board.json +316 -0
- package/bundle/boards/xy-pad-demo-board.json +36 -0
- package/bundle/docs/content/board-json.md +277 -0
- package/bundle/docs/content/boards/alpaca-board.md +56 -0
- package/bundle/docs/content/boards/animate-board.md +40 -0
- package/bundle/docs/content/boards/ascii-cam-board.md +37 -0
- package/bundle/docs/content/boards/audiolize-board.md +47 -0
- package/bundle/docs/content/boards/court-booking-browser-demo-board.md +43 -0
- package/bundle/docs/content/boards/court-booking-demo-board.md +120 -0
- package/bundle/docs/content/boards/current-time-board.md +32 -0
- package/bundle/docs/content/boards/dropitapp-board.md +57 -0
- package/bundle/docs/content/boards/encrypt-board.md +36 -0
- package/bundle/docs/content/boards/face-alert-board.md +50 -0
- package/bundle/docs/content/boards/game-board.md +69 -0
- package/bundle/docs/content/boards/game-of-life-board.md +47 -0
- package/bundle/docs/content/boards/hacker-news-board.md +76 -0
- package/bundle/docs/content/boards/health-log-browser-demo-board.md +56 -0
- package/bundle/docs/content/boards/health-log-demo-board.md +138 -0
- package/bundle/docs/content/boards/helloworld-board.md +40 -0
- package/bundle/docs/content/boards/link-debugger.md +31 -0
- package/bundle/docs/content/boards/live-radio-cloud-demo-board.md +70 -0
- package/bundle/docs/content/boards/live-radio-cloud-direct-demo-board.md +89 -0
- package/bundle/docs/content/boards/live-radio-demo-board.md +102 -0
- package/bundle/docs/content/boards/live-radio-members-demo-board.md +91 -0
- package/bundle/docs/content/boards/meeting-poll-browser-demo-board.md +45 -0
- package/bundle/docs/content/boards/meeting-poll-demo-board.md +121 -0
- package/bundle/docs/content/boards/mounted-endpoint-demo-board-hkp-rt.md +50 -0
- package/bundle/docs/content/boards/nested-rhythm-demo-board.md +165 -0
- package/bundle/docs/content/boards/next-bus-board.md +38 -0
- package/bundle/docs/content/boards/next-bus-switch-board.md +44 -0
- package/bundle/docs/content/boards/night-groove-demo-board.md +110 -0
- package/bundle/docs/content/boards/noise-alert-board.md +44 -0
- package/bundle/docs/content/boards/pad-groove-demo-board.md +93 -0
- package/bundle/docs/content/boards/peer-chat-board.md +49 -0
- package/bundle/docs/content/boards/peer-chat-node-board.md +47 -0
- package/bundle/docs/content/boards/rss-radio-board.md +221 -0
- package/bundle/docs/content/boards/send-ntfy-board.md +33 -0
- package/bundle/docs/content/boards/shared-costs-demo-board.md +65 -0
- package/bundle/docs/content/boards/spectral-modifier-board.md +55 -0
- package/bundle/docs/content/boards/spotify-board.md +46 -0
- package/bundle/docs/content/boards/sql-explorer-board.md +70 -0
- package/bundle/docs/content/boards/sql-explorer-node-board.md +76 -0
- package/bundle/docs/content/boards/sql-import-board.md +37 -0
- package/bundle/docs/content/boards/swimlanes-demo-board.md +148 -0
- package/bundle/docs/content/boards/syn-mail-desk-board.md +52 -0
- package/bundle/docs/content/boards/timeline-demo-board.md +115 -0
- package/bundle/docs/content/boards/triggerpad-board.md +32 -0
- package/bundle/docs/content/boards/triggerpad-recorder-board.md +52 -0
- package/bundle/docs/content/boards/voice-assistant-demo-board.md +51 -0
- package/bundle/docs/content/concepts/assets.md +245 -0
- package/bundle/docs/content/concepts/blocks.md +300 -0
- package/bundle/docs/content/concepts/board-assistant.md +307 -0
- package/bundle/docs/content/concepts/board.md +265 -0
- package/bundle/docs/content/concepts/cloud-boards.md +803 -0
- package/bundle/docs/content/concepts/coordinator.md +297 -0
- package/bundle/docs/content/concepts/logging.md +293 -0
- package/bundle/docs/content/concepts/mounts.md +314 -0
- package/bundle/docs/content/concepts/presets.md +360 -0
- package/bundle/docs/content/concepts/remotes.md +423 -0
- package/bundle/docs/content/concepts/runtime.md +664 -0
- package/bundle/docs/content/concepts/scopes.md +256 -0
- package/bundle/docs/content/concepts/service.md +227 -0
- package/bundle/docs/content/concepts/units.md +321 -0
- package/bundle/docs/content/introduction.md +163 -0
- package/bundle/docs/content/llm/circle-text-board.json +55 -0
- package/bundle/docs/content/llm/howto-workflow.md +369 -0
- package/bundle/docs/content/repository.md +161 -0
- package/bundle/docs/content/services/aggregator.md +76 -0
- package/bundle/docs/content/services/analyzer.md +44 -0
- package/bundle/docs/content/services/ascii-art.md +58 -0
- package/bundle/docs/content/services/asset.md +88 -0
- package/bundle/docs/content/services/audio-editor.md +57 -0
- package/bundle/docs/content/services/audio-encode.md +115 -0
- package/bundle/docs/content/services/audio-io.md +173 -0
- package/bundle/docs/content/services/batcher.md +49 -0
- package/bundle/docs/content/services/board-service.md +48 -0
- package/bundle/docs/content/services/browser-sub-service.md +75 -0
- package/bundle/docs/content/services/buffer.md +70 -0
- package/bundle/docs/content/services/cache.md +92 -0
- package/bundle/docs/content/services/camera.md +85 -0
- package/bundle/docs/content/services/canvas.md +196 -0
- package/bundle/docs/content/services/changes.md +87 -0
- package/bundle/docs/content/services/chunked-file-provider.md +63 -0
- package/bundle/docs/content/services/communication-dispatcher.md +190 -0
- package/bundle/docs/content/services/configurator.md +66 -0
- package/bundle/docs/content/services/conversations.md +244 -0
- package/bundle/docs/content/services/debounce.md +45 -0
- package/bundle/docs/content/services/decrypt.md +53 -0
- package/bundle/docs/content/services/delay.md +55 -0
- package/bundle/docs/content/services/detect.md +101 -0
- package/bundle/docs/content/services/document-extract.md +174 -0
- package/bundle/docs/content/services/download.md +67 -0
- package/bundle/docs/content/services/encode.md +63 -0
- package/bundle/docs/content/services/encrypt.md +53 -0
- package/bundle/docs/content/services/fetcher.md +122 -0
- package/bundle/docs/content/services/fft.md +96 -0
- package/bundle/docs/content/services/file-source.md +67 -0
- package/bundle/docs/content/services/filesystem.md +157 -0
- package/bundle/docs/content/services/filter.md +133 -0
- package/bundle/docs/content/services/flat-map.md +62 -0
- package/bundle/docs/content/services/game-of-life.md +93 -0
- package/bundle/docs/content/services/gather.md +135 -0
- package/bundle/docs/content/services/gif-encoder.md +56 -0
- package/bundle/docs/content/services/github.md +85 -0
- package/bundle/docs/content/services/group-by.md +54 -0
- package/bundle/docs/content/services/hacker.md +79 -0
- package/bundle/docs/content/services/hash.md +59 -0
- package/bundle/docs/content/services/hold.md +182 -0
- package/bundle/docs/content/services/http-relay-client.md +48 -0
- package/bundle/docs/content/services/http-uploader.md +62 -0
- package/bundle/docs/content/services/http.md +424 -0
- package/bundle/docs/content/services/if.md +79 -0
- package/bundle/docs/content/services/ifft.md +46 -0
- package/bundle/docs/content/services/image-picker.md +50 -0
- package/bundle/docs/content/services/imap-email.md +104 -0
- package/bundle/docs/content/services/injector.md +129 -0
- package/bundle/docs/content/services/input.md +90 -0
- package/bundle/docs/content/services/iterator.md +186 -0
- package/bundle/docs/content/services/join.md +153 -0
- package/bundle/docs/content/services/limit.md +47 -0
- package/bundle/docs/content/services/local-storage.md +47 -0
- package/bundle/docs/content/services/looper.md +62 -0
- package/bundle/docs/content/services/lz-compress.md +52 -0
- package/bundle/docs/content/services/map.md +257 -0
- package/bundle/docs/content/services/match-filter.md +38 -0
- package/bundle/docs/content/services/microphone-monitor.md +66 -0
- package/bundle/docs/content/services/monitor.md +67 -0
- package/bundle/docs/content/services/ollama.md +116 -0
- package/bundle/docs/content/services/openai-prompt.md +74 -0
- package/bundle/docs/content/services/output.md +107 -0
- package/bundle/docs/content/services/peer-socket.md +61 -0
- package/bundle/docs/content/services/qr-code.md +48 -0
- package/bundle/docs/content/services/queue.md +201 -0
- package/bundle/docs/content/services/reduce.md +51 -0
- package/bundle/docs/content/services/rss.md +232 -0
- package/bundle/docs/content/services/select.md +47 -0
- package/bundle/docs/content/services/sign.md +53 -0
- package/bundle/docs/content/services/skill-router.md +154 -0
- package/bundle/docs/content/services/smooth.md +59 -0
- package/bundle/docs/content/services/smtp-email.md +129 -0
- package/bundle/docs/content/services/sort.md +48 -0
- package/bundle/docs/content/services/sound.md +87 -0
- package/bundle/docs/content/services/speech-synth.md +46 -0
- package/bundle/docs/content/services/speech-to-text.md +172 -0
- package/bundle/docs/content/services/spotify.md +77 -0
- package/bundle/docs/content/services/spread.md +111 -0
- package/bundle/docs/content/services/sql.md +491 -0
- package/bundle/docs/content/services/state.md +57 -0
- package/bundle/docs/content/services/static.md +47 -0
- package/bundle/docs/content/services/stopper.md +55 -0
- package/bundle/docs/content/services/storage.md +155 -0
- package/bundle/docs/content/services/store.md +255 -0
- package/bundle/docs/content/services/sub-service.md +152 -0
- package/bundle/docs/content/services/switch.md +67 -0
- package/bundle/docs/content/services/telegram-listener.md +76 -0
- package/bundle/docs/content/services/text-generation.md +390 -0
- package/bundle/docs/content/services/text-to-speech.md +130 -0
- package/bundle/docs/content/services/timeline.md +333 -0
- package/bundle/docs/content/services/timer.md +113 -0
- package/bundle/docs/content/services/tracks.md +207 -0
- package/bundle/docs/content/services/trigger-pad.md +68 -0
- package/bundle/docs/content/services/uuid-generator.md +48 -0
- package/bundle/docs/content/services/wav-reader.md +66 -0
- package/bundle/docs/content/services/websocket.md +189 -0
- package/bundle/docs/content/services/workflow-board-builder.md +65 -0
- package/bundle/docs/content/services/xy-pad.md +60 -0
- package/bundle/docs/content/targets.md +434 -0
- package/bundle/docs/content/testing.md +263 -0
- package/bundle/docs/content/vocabulary.md +171 -0
- package/bundle/hkp-frontend/src/runtime/browser/BrowserRegistry.tsx +141 -0
- package/bundle/hkp-frontend/src/runtime/browser/BrowserRuntime.tsx +202 -0
- package/bundle/hkp-frontend/src/runtime/browser/BrowserRuntimeApi.ts +306 -0
- package/bundle/hkp-frontend/src/runtime/browser/BrowserRuntimeApp.ts +310 -0
- package/bundle/hkp-frontend/src/runtime/browser/BrowserRuntimeScope.ts +500 -0
- package/bundle/hkp-frontend/src/runtime/browser/UIRegistry.ts +150 -0
- package/bundle/hkp-frontend/src/runtime/browser/assetResolver.ts +123 -0
- package/bundle/hkp-frontend/src/runtime/browser/pipelineNames.ts +65 -0
- package/bundle/hkp-frontend/src/runtime/browser/registry/Default.ts +237 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Aggregator.ts +127 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/AggregatorUI.tsx +83 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Analyzer.tsx +43 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/AnalyzerUI/Bars.tsx +33 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/AnalyzerUI/HorizontalSpectrogram.tsx +53 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/AnalyzerUI/VerticalSpectogram.tsx +56 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/AnalyzerUI/Waveform.tsx +109 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/AnalyzerUI/index.tsx +99 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/AsciiArt.ts +119 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/AsciiArtUI.tsx +131 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Asset.ts +125 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/AssetUI.tsx +37 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/AudioDeviceSettings.tsx +56 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/AudioEditor.ts +129 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/AudioEditorUI.tsx +549 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/AudioInput.ts +298 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/AudioInputUI.tsx +257 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/AudioOutput.ts +189 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/AudioOutputUI.tsx +63 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Batcher.ts +11 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/BoardService.tsx +86 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/BoardServiceUI.tsx +410 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/BrowserGather.ts +311 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/BrowserIterator.ts +167 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/BrowserSubService.tsx +583 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/BrowserSubServiceUI.tsx +187 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/BrowserTracks.tsx +477 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Buffer.ts +11 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Cache.ts +134 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/CacheUI.tsx +125 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Camera.ts +90 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/CameraUI.tsx +321 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Canvas.ts +139 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/CanvasUI/canvasDraw.ts +543 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/CanvasUI/canvasUtils.ts +39 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/CanvasUI/index.tsx +287 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/CanvasUI/tests/canvasDraw.test.ts +355 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/CanvasUI/tests/canvasUtils.test.ts +89 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/CanvasUI/tests/fullscreen.test.tsx +26 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Changes.ts +201 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/ChangesUI.tsx +85 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/ChunkedFileProvider.tsx +183 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Configurator.ts +258 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/ConfiguratorUI.tsx +83 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/ConsideredHacker.tsx +28 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Debounce.ts +75 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/DebounceUI.tsx +70 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Decrypt.ts +127 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/DecryptUI.tsx +39 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Delay.tsx +110 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Detect.ts +214 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/DetectUI.tsx +86 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Download.ts +120 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/DownloadUI.tsx +61 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Encode.ts +138 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/EncodeUI.tsx +52 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Encrypt.ts +125 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/EncryptUI.tsx +39 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/FFT.tsx +238 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/FFTUI.tsx +112 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/FeedbackService.ts +247 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/FeedbackServiceUI.tsx +35 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Fetcher.tsx +232 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/FetcherUI.tsx +154 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/FileSource.tsx +171 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Filter.tsx +18 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/FilterUI.tsx +89 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/FlatMap.ts +68 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/FlatMapUI.tsx +38 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/GameOfLife.ts +210 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/GameOfLifeRenderer.ts +182 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/GameOfLifeRendererUI.tsx +48 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/GameOfLifeUI.tsx +58 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/GatherUI.tsx +84 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/GifEncoder.tsx +651 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/GithubAPI.ts +294 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/GithubComponents.tsx +389 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/GithubSink.tsx +109 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/GithubSinkUI.tsx +143 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/GithubSource.tsx +86 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/GithubSourceUI.tsx +162 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/GroupBy.ts +11 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/HTTPUploader.ts +102 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Hacker.ts +73 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/HackerUI.tsx +134 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Hash.ts +134 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/HashUI.tsx +45 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Hold.ts +288 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/HoldUI.tsx +43 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/HttpClient.ts +558 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/HttpClientUI.tsx +212 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/HttpUploaderTokenInjector.ts +149 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/IfService.ts +231 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/IfServiceUI.tsx +50 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/ImagePicker.tsx +118 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Injector.ts +61 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/InjectorUI.tsx +389 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Input.ts +214 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/InputUI.tsx +71 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/IteratorUI.tsx +59 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/LZCompress.ts +63 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Limit.ts +39 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/LimitUI.tsx +41 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/LocalStorage.ts +65 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/LocalStorageUI.tsx +72 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Map.ts +14 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/MapUI.tsx +334 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/MapUIModeAssist.tsx +61 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/MatchFilter.ts +11 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/MicrophoneMonitor.ts +190 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/MicrophoneMonitorUI.tsx +94 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Monitor.tsx +15 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/MonitorUI.tsx +281 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/OllamaPrompt.ts +237 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/OllamaPromptUI/BusyIndicator.tsx +18 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/OllamaPromptUI/PromptInput.tsx +71 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/OllamaPromptUI/StreamingPreview.tsx +24 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/OllamaPromptUI/index.tsx +156 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/OpenAIPrompt.ts +254 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/OpenAIPromptUI.tsx +189 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Output.tsx +145 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/OutputUI.tsx +118 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/PeerChatTemplate.json +43 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/PeerConnection.ts +260 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/PeerSocket.tsx +268 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/PeerSocketReceiverTemplate.json +29 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/PeerSocketUI.tsx +341 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/PlaceholderUI.tsx +72 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/QrCode.ts +63 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/QrCodeUI.tsx +197 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Select.ts +40 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/SelectUI.tsx +41 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/ServiceBase.ts +50 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/SetRuntimeVariable.ts +65 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/SetRuntimeVariableUI.tsx +50 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Sign.ts +182 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/SignUI.tsx +55 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Smooth.ts +101 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/SmoothUI.tsx +50 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Sort.ts +59 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/SortUI.tsx +61 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Sound.ts +541 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/SoundUI.tsx +183 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/SpeechSynth.ts +56 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/SpeechSynthUI.tsx +108 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Spotify.tsx +111 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/SpotifyAPI.ts +113 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/SpotifyComponents.tsx +104 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/SpotifyUI.tsx +186 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Spread.ts +117 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/SpreadUI.tsx +38 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Sql.ts +448 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/SqlInspector.tsx +332 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/SqlUI.tsx +226 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/State.ts +149 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Stopper.ts +29 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Switch.tsx +419 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/SwitchUI.tsx +171 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/TickRuleDelta.ts +101 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/TickRuleDeltaUI.tsx +56 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Timeline.ts +709 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/TimelineUI/TimelinePanel.tsx +79 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/TimelineUI/TimelineRows.tsx +574 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/TimelineUI/Transport.tsx +141 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/TimelineUI/index.tsx +119 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/TimelineUI/model.ts +425 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/TimelineUI/parts.tsx +708 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/Timer.ts +15 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/TimerUI.tsx +213 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/TracksUI.tsx +81 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/TriggerPad.ts +108 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/TriggerPadUI.tsx +160 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/UuidGenerator.ts +74 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/UuidGeneratorUI.tsx +59 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/WaveformDisplay.tsx +104 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/WebsocketClient.ts +114 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/WebsocketClientUI.tsx +42 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/WorkflowBoardBuilder.ts +499 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/WorkflowBoardBuilderUI.tsx +521 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/XYPad.ts +68 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/XYPadUI.tsx +274 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/audio/audioHelper.ts +36 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/base/Batcher.ts +76 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/base/Buffer.ts +142 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/base/Filter.ts +125 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/base/GroupBy.ts +101 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/base/Map.ts +543 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/base/MatchFilter.ts +49 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/base/Monitor.ts +75 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/base/Reduce.ts +74 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/base/Timer.ts +342 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/base/bundle.js +7375 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/base/eval.ts +208 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/base/expressionEval.ts +223 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/base/helpers.ts +10 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/base/index.ts +37 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/camera/videoCapture.ts +78 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/changes-modes.ts +9 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/colorpalette.ts +26 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/detect/DetectionPreview.tsx +76 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/detect/mediapipe.ts +34 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/detect/models/README.md +14 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/detect/models/blaze_face_short_range.tflite +0 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/detect-modes.ts +7 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/encode-modes.ts +10 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/helpers.ts +300 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/http-client-methods.ts +10 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/sql-database.ts +594 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/sql-dump.ts +192 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/sql-inspect.ts +130 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/sql-inspector.css +155 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/sql-modes.ts +27 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/TESTING_APPROACH.md +169 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/__snapshots__/service-ui.future-enhancements.test.tsx.snap +5 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/audio-input-permissions.test.ts +42 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/audiolizeLanes.test.ts +70 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/browser-scopes.test.ts +305 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/cache-service.test.ts +53 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/camera-video-capture.test.ts +24 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/changes-service.test.ts +133 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/crypto-secrets.test.ts +196 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/detect-service.test.ts +119 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/download.test.ts +100 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/expressionEval.test.ts +117 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/fetcher-panel.test.tsx +35 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/fetcher-service.test.ts +80 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/filter-service.test.ts +37 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/github-secrets.test.ts +108 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/group-by-board.test.ts +42 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/hold-service.test.ts +199 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/http-client-service.test.ts +474 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/http-uploader-token-injector.test.ts +152 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/iterator-gather-service.test.ts +277 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/map-service.test.ts +1047 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/map-ui.test.tsx +70 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/nested-rhythm-board.test.ts +311 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/night-groove-board.test.ts +290 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/pad-groove-board.test.ts +230 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/peer-host-discovery.test.ts +77 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/peer-socket-discovery.test.ts +69 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/pipeline-names.test.ts +63 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/secret-canary.test.ts +121 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/service-modules.contract.test.ts +229 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/service-ui.advanced.test.tsx +670 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/service-ui.future-enhancements.test.tsx +219 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/service-ui.integration.test.tsx +432 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/service-ui.smoke.test.tsx +140 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/sound-service.test.ts +293 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/spread-service.test.ts +137 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/sql-dump.test.ts +172 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/sql-inspect.test.ts +163 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/sql-inspector.test.tsx +121 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/sql.test.ts +702 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/sub-service-in-block.test.tsx +84 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/switch-service.test.ts +254 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/timeline-board.test.ts +218 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/timeline-service.test.ts +1002 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/timeline-ui-model.test.ts +230 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/timeline-ui.test.tsx +371 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/timer-service.test.ts +902 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/tracks-service.test.ts +275 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/tracks-ui.test.tsx +126 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/triggerpad-recorder-board.test.ts +100 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/tests/uuid-generator-service.test.ts +214 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/timeline-core.ts +410 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/workflow-prompt/DefaultWorkflowBoard.ts +90 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/workflow-prompt/RefinementSession.ts +121 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/workflow-prompt/SystemPromptCatalog.ts +245 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/workflow-prompt/catalog/browser-service-specs.json +110 -0
- package/bundle/hkp-frontend/src/runtime/browser/services/workflow-prompt/catalog/runtime-capabilities.json +37 -0
- package/bundle/hkp-frontend/src/runtime/browser/tests/asset-service.test.ts +73 -0
- package/bundle/hkp-frontend/src/runtime/browser/tests/board-persistence.integration.test.tsx +391 -0
- package/bundle/hkp-frontend/src/runtime/browser/tests/browser-runtime.identity-binding.test.tsx +81 -0
- package/bundle/hkp-frontend/src/runtime/browser/tests/demo-boards.regression.test.tsx +386 -0
- package/bundle/hkp-frontend/src/runtime/browser/tests/failed-call-lifecycle.test.ts +56 -0
- package/bundle/hkp-frontend/src/runtime/browser/tests/http-client.integration.test.ts +146 -0
- package/bundle/hkp-frontend/src/runtime/browser/tests/nested-run.integration.test.ts +415 -0
- package/bundle/hkp-frontend/src/runtime/browser/tests/replay-next.test.ts +391 -0
- package/bundle/hkp-frontend/src/runtime/browser/tests/rerun.test.ts +71 -0
- package/bundle/hkp-frontend/src/runtime/browser/tests/run-no-input.test.ts +72 -0
- package/bundle/hkp-frontend/src/runtime/browser/tests/runtime-add.integration.test.tsx +256 -0
- package/bundle/hkp-frontend/src/runtime/browser/tests/runtime-operations.integration.test.tsx +310 -0
- package/bundle/hkp-frontend/src/runtime/browser/tests/runtime-processing.integration.test.ts +311 -0
- package/bundle/hkp-frontend/src/runtime/browser/tests/runtime-removal.integration.test.tsx +454 -0
- package/bundle/hkp-frontend/src/runtime/browser/tests/runtime-update.identity.integration.test.tsx +145 -0
- package/bundle/hkp-frontend/src/runtime/browser/tests/service-operations.integration.test.tsx +511 -0
- package/bundle/hkp-node/src/address.ts +72 -0
- package/bundle/hkp-node/src/assets.ts +582 -0
- package/bundle/hkp-node/src/auth.ts +369 -0
- package/bundle/hkp-node/src/callReport.ts +281 -0
- package/bundle/hkp-node/src/coordinator/auth.ts +85 -0
- package/bundle/hkp-node/src/coordinator/binaryFrame.ts +189 -0
- package/bundle/hkp-node/src/coordinator/boardStore.ts +0 -0
- package/bundle/hkp-node/src/coordinator/bridge.ts +242 -0
- package/bundle/hkp-node/src/coordinator/bridgeProtocol.ts +200 -0
- package/bundle/hkp-node/src/coordinator/coordinator.ts +594 -0
- package/bundle/hkp-node/src/coordinator/facadeAccess.ts +426 -0
- package/bundle/hkp-node/src/coordinator/fileBoardStore.ts +159 -0
- package/bundle/hkp-node/src/coordinator/frameLimits.ts +41 -0
- package/bundle/hkp-node/src/coordinator/index.ts +12 -0
- package/bundle/hkp-node/src/coordinator/join.ts +62 -0
- package/bundle/hkp-node/src/coordinator/logStore.ts +335 -0
- package/bundle/hkp-node/src/coordinator/members.ts +133 -0
- package/bundle/hkp-node/src/coordinator/mount.ts +124 -0
- package/bundle/hkp-node/src/coordinator/participantProtocol.ts +169 -0
- package/bundle/hkp-node/src/coordinator/participants.ts +666 -0
- package/bundle/hkp-node/src/coordinator/router.ts +416 -0
- package/bundle/hkp-node/src/coordinator/session.ts +1610 -0
- package/bundle/hkp-node/src/coordinator/types.ts +95 -0
- package/bundle/hkp-node/src/coordinatorLinks.ts +712 -0
- package/bundle/hkp-node/src/credentialedFetch.ts +122 -0
- package/bundle/hkp-node/src/egress.ts +344 -0
- package/bundle/hkp-node/src/expressionEval.ts +223 -0
- package/bundle/hkp-node/src/index.ts +470 -0
- package/bundle/hkp-node/src/instance.ts +172 -0
- package/bundle/hkp-node/src/mounts.ts +296 -0
- package/bundle/hkp-node/src/origins.ts +201 -0
- package/bundle/hkp-node/src/reset.ts +187 -0
- package/bundle/hkp-node/src/runtime.ts +1345 -0
- package/bundle/hkp-node/src/secrets.ts +292 -0
- package/bundle/hkp-node/src/server.ts +2120 -0
- package/bundle/hkp-node/src/services/asset.ts +150 -0
- package/bundle/hkp-node/src/services/claudeModels.ts +370 -0
- package/bundle/hkp-node/src/services/communication-dispatcher.ts +735 -0
- package/bundle/hkp-node/src/services/conversations.ts +914 -0
- package/bundle/hkp-node/src/services/database.ts +386 -0
- package/bundle/hkp-node/src/services/document-extract.ts +575 -0
- package/bundle/hkp-node/src/services/expression.ts +417 -0
- package/bundle/hkp-node/src/services/fileStore.ts +369 -0
- package/bundle/hkp-node/src/services/filesystem.ts +280 -0
- package/bundle/hkp-node/src/services/gather.ts +335 -0
- package/bundle/hkp-node/src/services/hold.ts +275 -0
- package/bundle/hkp-node/src/services/http-client.ts +525 -0
- package/bundle/hkp-node/src/services/http-server.ts +1222 -0
- package/bundle/hkp-node/src/services/imap-email.ts +627 -0
- package/bundle/hkp-node/src/services/injector.ts +135 -0
- package/bundle/hkp-node/src/services/iterator.ts +203 -0
- package/bundle/hkp-node/src/services/join.ts +226 -0
- package/bundle/hkp-node/src/services/map.ts +632 -0
- package/bundle/hkp-node/src/services/monitor.ts +128 -0
- package/bundle/hkp-node/src/services/nested-pipeline.ts +405 -0
- package/bundle/hkp-node/src/services/peer-server.ts +268 -0
- package/bundle/hkp-node/src/services/queue-store.ts +301 -0
- package/bundle/hkp-node/src/services/queue.ts +316 -0
- package/bundle/hkp-node/src/services/recordStore.ts +341 -0
- package/bundle/hkp-node/src/services/rss-parse.ts +281 -0
- package/bundle/hkp-node/src/services/rss.ts +392 -0
- package/bundle/hkp-node/src/services/smtp-email.ts +398 -0
- package/bundle/hkp-node/src/services/spread.ts +153 -0
- package/bundle/hkp-node/src/services/sql-dump.ts +192 -0
- package/bundle/hkp-node/src/services/sql.ts +429 -0
- package/bundle/hkp-node/src/services/stopper.ts +69 -0
- package/bundle/hkp-node/src/services/storage.ts +332 -0
- package/bundle/hkp-node/src/services/store.ts +609 -0
- package/bundle/hkp-node/src/services/stream.ts +367 -0
- package/bundle/hkp-node/src/services/sub-service.ts +600 -0
- package/bundle/hkp-node/src/services/telegram-listener.ts +263 -0
- package/bundle/hkp-node/src/services/telegram-sender.ts +136 -0
- package/bundle/hkp-node/src/services/text-generation.ts +1249 -0
- package/bundle/hkp-node/src/services/timer.ts +273 -0
- package/bundle/hkp-node/src/services/tracks.ts +381 -0
- package/bundle/hkp-node/src/services/websocket-reader.ts +364 -0
- package/bundle/hkp-node/src/types.ts +465 -0
- package/bundle/hkp-node/src/wsTickets.ts +77 -0
- package/bundle/hkp-node/src/yas.ts +95 -0
- package/bundle/hkp-python/src/hkp/__init__.py +1 -0
- package/bundle/hkp-python/src/hkp/__main__.py +241 -0
- package/bundle/hkp-python/src/hkp/address.py +56 -0
- package/bundle/hkp-python/src/hkp/assets.py +439 -0
- package/bundle/hkp-python/src/hkp/auth.py +252 -0
- package/bundle/hkp-python/src/hkp/binary_frame.py +100 -0
- package/bundle/hkp-python/src/hkp/call_report.py +201 -0
- package/bundle/hkp-python/src/hkp/coordinator_links.py +667 -0
- package/bundle/hkp-python/src/hkp/data.py +118 -0
- package/bundle/hkp-python/src/hkp/egress.py +310 -0
- package/bundle/hkp-python/src/hkp/mount.py +46 -0
- package/bundle/hkp-python/src/hkp/mounts.py +288 -0
- package/bundle/hkp-python/src/hkp/origins.py +169 -0
- package/bundle/hkp-python/src/hkp/runtime.py +1131 -0
- package/bundle/hkp-python/src/hkp/secrets.py +261 -0
- package/bundle/hkp-python/src/hkp/server.py +1714 -0
- package/bundle/hkp-python/src/hkp/services/__init__.py +0 -0
- package/bundle/hkp-python/src/hkp/services/asset.py +123 -0
- package/bundle/hkp-python/src/hkp/services/audio_encode.py +190 -0
- package/bundle/hkp-python/src/hkp/services/expression.py +942 -0
- package/bundle/hkp-python/src/hkp/services/gather.py +266 -0
- package/bundle/hkp-python/src/hkp/services/hold.py +246 -0
- package/bundle/hkp-python/src/hkp/services/http_client.py +444 -0
- package/bundle/hkp-python/src/hkp/services/http_server.py +790 -0
- package/bundle/hkp-python/src/hkp/services/iterator.py +141 -0
- package/bundle/hkp-python/src/hkp/services/join.py +173 -0
- package/bundle/hkp-python/src/hkp/services/map_service.py +452 -0
- package/bundle/hkp-python/src/hkp/services/monitor.py +99 -0
- package/bundle/hkp-python/src/hkp/services/nested_pipeline.py +278 -0
- package/bundle/hkp-python/src/hkp/services/skill_router.py +388 -0
- package/bundle/hkp-python/src/hkp/services/speech_to_text.py +186 -0
- package/bundle/hkp-python/src/hkp/services/spread.py +114 -0
- package/bundle/hkp-python/src/hkp/services/stopper.py +59 -0
- package/bundle/hkp-python/src/hkp/services/sub_service.py +417 -0
- package/bundle/hkp-python/src/hkp/services/text_generation.py +498 -0
- package/bundle/hkp-python/src/hkp/services/text_to_speech.py +237 -0
- package/bundle/hkp-python/src/hkp/services/timer.py +267 -0
- package/bundle/hkp-python/src/hkp/services/tracks.py +251 -0
- package/bundle/hkp-python/src/hkp/types.py +412 -0
- package/bundle/hkp-python/src/hkp/ws_tickets.py +54 -0
- package/bundle/hkp-python/src/hkp/yas.py +192 -0
- package/bundle/hkp-rt/lib/CMakeLists.txt +193 -0
- package/bundle/hkp-rt/lib/hkp-bundles/CMakeLists.txt +55 -0
- package/bundle/hkp-rt/lib/hkp-bundles/plugin_register.cpp +14 -0
- package/bundle/hkp-rt/lib/include/app.h +201 -0
- package/bundle/hkp-rt/lib/include/assets.h +239 -0
- package/bundle/hkp-rt/lib/include/auth.h +167 -0
- package/bundle/hkp-rt/lib/include/call_report.h +197 -0
- package/bundle/hkp-rt/lib/include/coordinator_links.h +127 -0
- package/bundle/hkp-rt/lib/include/discovery_hooks.h +29 -0
- package/bundle/hkp-rt/lib/include/egress.h +379 -0
- package/bundle/hkp-rt/lib/include/files.h +275 -0
- package/bundle/hkp-rt/lib/include/log_entry.h +131 -0
- package/bundle/hkp-rt/lib/include/mounts.h +139 -0
- package/bundle/hkp-rt/lib/include/origins.h +363 -0
- package/bundle/hkp-rt/lib/include/registry.h +119 -0
- package/bundle/hkp-rt/lib/include/secrets.h +414 -0
- package/bundle/hkp-rt/lib/include/server.h +122 -0
- package/bundle/hkp-rt/lib/include/service.h +190 -0
- package/bundle/hkp-rt/lib/include/slot_store.h +41 -0
- package/bundle/hkp-rt/lib/include/standalone_config.h +253 -0
- package/bundle/hkp-rt/lib/include/types/audio.h +3 -0
- package/bundle/hkp-rt/lib/include/types/data.h +152 -0
- package/bundle/hkp-rt/lib/include/types/message.h +56 -0
- package/bundle/hkp-rt/lib/include/types/models.h +154 -0
- package/bundle/hkp-rt/lib/include/types/owns_me.h +19 -0
- package/bundle/hkp-rt/lib/include/types/ringbuffer.h +86 -0
- package/bundle/hkp-rt/lib/include/types/types.h +33 -0
- package/bundle/hkp-rt/lib/include/types/validation.h +205 -0
- package/bundle/hkp-rt/lib/src/address.h +88 -0
- package/bundle/hkp-rt/lib/src/app.cpp +591 -0
- package/bundle/hkp-rt/lib/src/assets.cpp +686 -0
- package/bundle/hkp-rt/lib/src/binary_frame.h +154 -0
- package/bundle/hkp-rt/lib/src/common/expression.h +1481 -0
- package/bundle/hkp-rt/lib/src/common/inja.h +36 -0
- package/bundle/hkp-rt/lib/src/common/link_socket.cpp +437 -0
- package/bundle/hkp-rt/lib/src/common/link_socket.h +97 -0
- package/bundle/hkp-rt/lib/src/common/realtime_wakeup.h +120 -0
- package/bundle/hkp-rt/lib/src/common/stream_broadcast.h +250 -0
- package/bundle/hkp-rt/lib/src/common/string_util.h +31 -0
- package/bundle/hkp-rt/lib/src/common/websocket_client_session.cpp +217 -0
- package/bundle/hkp-rt/lib/src/common/websocket_client_session.h +37 -0
- package/bundle/hkp-rt/lib/src/common/websocket_config.h +119 -0
- package/bundle/hkp-rt/lib/src/common/websocket_protocol.h +32 -0
- package/bundle/hkp-rt/lib/src/common/websocket_server.cpp +82 -0
- package/bundle/hkp-rt/lib/src/common/websocket_server.h +57 -0
- package/bundle/hkp-rt/lib/src/common/websocket_server_listener.cpp +115 -0
- package/bundle/hkp-rt/lib/src/common/websocket_server_listener.h +35 -0
- package/bundle/hkp-rt/lib/src/common/websocket_server_session.cpp +172 -0
- package/bundle/hkp-rt/lib/src/common/websocket_server_session.h +53 -0
- package/bundle/hkp-rt/lib/src/common.h +13 -0
- package/bundle/hkp-rt/lib/src/coordinator_links.cpp +1142 -0
- package/bundle/hkp-rt/lib/src/discovery/discovery.cpp +707 -0
- package/bundle/hkp-rt/lib/src/discovery/discovery.h +89 -0
- package/bundle/hkp-rt/lib/src/http/auth.cpp +569 -0
- package/bundle/hkp-rt/lib/src/http/front_door.cpp +518 -0
- package/bundle/hkp-rt/lib/src/http/front_door.h +131 -0
- package/bundle/hkp-rt/lib/src/http/server.cpp +1539 -0
- package/bundle/hkp-rt/lib/src/http/ws_tickets.h +125 -0
- package/bundle/hkp-rt/lib/src/mount.h +63 -0
- package/bundle/hkp-rt/lib/src/process_context.h +335 -0
- package/bundle/hkp-rt/lib/src/process_depth.h +20 -0
- package/bundle/hkp-rt/lib/src/registry.cpp +233 -0
- package/bundle/hkp-rt/lib/src/runtime.cpp +986 -0
- package/bundle/hkp-rt/lib/src/runtime.h +225 -0
- package/bundle/hkp-rt/lib/src/runtime_host.h +180 -0
- package/bundle/hkp-rt/lib/src/service.cpp +315 -0
- package/bundle/hkp-rt/lib/src/services/asset.h +185 -0
- package/bundle/hkp-rt/lib/src/services/audio_encode.cpp +372 -0
- package/bundle/hkp-rt/lib/src/services/audio_encode.h +97 -0
- package/bundle/hkp-rt/lib/src/services/cache.h +362 -0
- package/bundle/hkp-rt/lib/src/services/cache_subservices.h +463 -0
- package/bundle/hkp-rt/lib/src/services/core_audio.cpp +384 -0
- package/bundle/hkp-rt/lib/src/services/core_audio.h +22 -0
- package/bundle/hkp-rt/lib/src/services/core_input.h +337 -0
- package/bundle/hkp-rt/lib/src/services/core_output.h +370 -0
- package/bundle/hkp-rt/lib/src/services/ffmpeg/detail.cpp +749 -0
- package/bundle/hkp-rt/lib/src/services/ffmpeg/detail.h +29 -0
- package/bundle/hkp-rt/lib/src/services/ffmpeg/ffmpeg.cpp +193 -0
- package/bundle/hkp-rt/lib/src/services/ffmpeg/ffmpeg.h +40 -0
- package/bundle/hkp-rt/lib/src/services/ffmpeg/types.h +120 -0
- package/bundle/hkp-rt/lib/src/services/fft_service.h +190 -0
- package/bundle/hkp-rt/lib/src/services/filesystem.h +309 -0
- package/bundle/hkp-rt/lib/src/services/filter.h +208 -0
- package/bundle/hkp-rt/lib/src/services/gather.h +272 -0
- package/bundle/hkp-rt/lib/src/services/hold.h +304 -0
- package/bundle/hkp-rt/lib/src/services/http_client.cpp +347 -0
- package/bundle/hkp-rt/lib/src/services/http_client.h +67 -0
- package/bundle/hkp-rt/lib/src/services/http_client_impl.h +45 -0
- package/bundle/hkp-rt/lib/src/services/http_client_template_examples.md +202 -0
- package/bundle/hkp-rt/lib/src/services/http_server/http_listener.cpp +130 -0
- package/bundle/hkp-rt/lib/src/services/http_server/http_listener.h +33 -0
- package/bundle/hkp-rt/lib/src/services/http_server/http_server.cpp +351 -0
- package/bundle/hkp-rt/lib/src/services/http_server/http_server.h +79 -0
- package/bundle/hkp-rt/lib/src/services/http_server/http_server_impl.cpp +230 -0
- package/bundle/hkp-rt/lib/src/services/http_server/http_server_impl.h +64 -0
- package/bundle/hkp-rt/lib/src/services/http_server/http_server_subservices.cpp +950 -0
- package/bundle/hkp-rt/lib/src/services/http_server/http_server_subservices.h +253 -0
- package/bundle/hkp-rt/lib/src/services/http_server/http_session.cpp +495 -0
- package/bundle/hkp-rt/lib/src/services/http_server/http_session.h +169 -0
- package/bundle/hkp-rt/lib/src/services/http_server/http_stream_listener.cpp +270 -0
- package/bundle/hkp-rt/lib/src/services/http_server/http_stream_listener.h +104 -0
- package/bundle/hkp-rt/lib/src/services/http_server/request_decode.h +164 -0
- package/bundle/hkp-rt/lib/src/services/if_service.h +210 -0
- package/bundle/hkp-rt/lib/src/services/ifft_service.h +198 -0
- package/bundle/hkp-rt/lib/src/services/injector.h +162 -0
- package/bundle/hkp-rt/lib/src/services/iterator.h +201 -0
- package/bundle/hkp-rt/lib/src/services/map.h +641 -0
- package/bundle/hkp-rt/lib/src/services/monitor.h +161 -0
- package/bundle/hkp-rt/lib/src/services/mp3_frames.h +119 -0
- package/bundle/hkp-rt/lib/src/services/mp4_to_wav.cpp +281 -0
- package/bundle/hkp-rt/lib/src/services/mp4_to_wav.h +263 -0
- package/bundle/hkp-rt/lib/src/services/peer_server/peer_registry.cpp +88 -0
- package/bundle/hkp-rt/lib/src/services/peer_server/peer_registry.h +43 -0
- package/bundle/hkp-rt/lib/src/services/peer_server/peer_server.h +163 -0
- package/bundle/hkp-rt/lib/src/services/peer_server/peer_server_listener.cpp +133 -0
- package/bundle/hkp-rt/lib/src/services/peer_server/peer_server_listener.h +46 -0
- package/bundle/hkp-rt/lib/src/services/peer_server/peer_server_session.cpp +165 -0
- package/bundle/hkp-rt/lib/src/services/peer_server/peer_server_session.h +44 -0
- package/bundle/hkp-rt/lib/src/services/peer_server/peer_ws_session.cpp +184 -0
- package/bundle/hkp-rt/lib/src/services/peer_server/peer_ws_session.h +55 -0
- package/bundle/hkp-rt/lib/src/services/receiver_session.h +172 -0
- package/bundle/hkp-rt/lib/src/services/root_certificates.h +3959 -0
- package/bundle/hkp-rt/lib/src/services/sha256_openssl.h +49 -0
- package/bundle/hkp-rt/lib/src/services/speech_http.h +306 -0
- package/bundle/hkp-rt/lib/src/services/speech_to_text.cpp +595 -0
- package/bundle/hkp-rt/lib/src/services/speech_to_text.h +69 -0
- package/bundle/hkp-rt/lib/src/services/static.cpp +45 -0
- package/bundle/hkp-rt/lib/src/services/static.h +41 -0
- package/bundle/hkp-rt/lib/src/services/stopper.h +72 -0
- package/bundle/hkp-rt/lib/src/services/sub_service.h +286 -0
- package/bundle/hkp-rt/lib/src/services/text_generation.cpp +1132 -0
- package/bundle/hkp-rt/lib/src/services/text_generation.h +71 -0
- package/bundle/hkp-rt/lib/src/services/text_to_speech.cpp +853 -0
- package/bundle/hkp-rt/lib/src/services/text_to_speech.h +97 -0
- package/bundle/hkp-rt/lib/src/services/timer.h +300 -0
- package/bundle/hkp-rt/lib/src/services/tracks.h +397 -0
- package/bundle/hkp-rt/lib/src/services/tts_inflect.cpp +149 -0
- package/bundle/hkp-rt/lib/src/services/tts_inflect.h +82 -0
- package/bundle/hkp-rt/lib/src/services/wav_reader.h +213 -0
- package/bundle/hkp-rt/lib/src/services/websocket_client_service.h +182 -0
- package/bundle/hkp-rt/lib/src/services/websocket_reader.h +148 -0
- package/bundle/hkp-rt/lib/src/services/websocket_server_service.h +196 -0
- package/bundle/hkp-rt/lib/src/services/websocket_writer.cpp +641 -0
- package/bundle/hkp-rt/lib/src/services/websocket_writer.h +117 -0
- package/bundle/hkp-rt/lib/src/sub_runtime.cpp +234 -0
- package/bundle/hkp-rt/lib/src/sub_runtime.h +160 -0
- package/bundle/hkp-rt/lib/src/types/data.cpp +237 -0
- package/bundle/hkp-rt/lib/src/types/message.cpp +148 -0
- package/bundle/hkp-rt/lib/src/types/models.cpp +83 -0
- package/bundle/hkp-rt/lib/src/types/ringbuffer.cpp +336 -0
- package/bundle/hkp-rt/lib/src/uuid.h +12 -0
- package/bundle/readymade-mcp-commits.json +5 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +79 -0
- package/dist/git.d.ts +8 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +53 -0
- package/dist/http.d.ts +17 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +130 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/repository.d.ts +49 -0
- package/dist/repository.d.ts.map +1 -0
- package/dist/repository.js +452 -0
- package/dist/schemas.d.ts +156 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +43 -0
- package/dist/server.d.ts +4 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +83 -0
- package/dist/types.d.ts +63 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +20 -0
- package/dist/validation.d.ts +9 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +101 -0
- 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.
|