@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,664 @@
|
|
|
1
|
+
# Runtime
|
|
2
|
+
|
|
3
|
+
Where services actually run. A board has one or more, they are chained in order, and each one is a place with different capabilities — a browser tab, a Node process, a Python process, a C++ binary.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Why there is more than one
|
|
8
|
+
|
|
9
|
+
A board is one app, but the things an app does do not all belong in the same
|
|
10
|
+
place. Drawing on a canvas belongs in the browser. Reading IMAP belongs on a
|
|
11
|
+
server. Running Whisper belongs where the model is. Audio DSP belongs in C++.
|
|
12
|
+
|
|
13
|
+
A **runtime** is that place. Splitting a board across several is what lets one
|
|
14
|
+
app span them, and the chain between them is what makes it one app rather than
|
|
15
|
+
several.
|
|
16
|
+
|
|
17
|
+
| Runtime | Language | How the browser talks to it | Typically used for |
|
|
18
|
+
|---|---|---|---|
|
|
19
|
+
| Browser | TypeScript | direct JS call — same process as the UI | UI, interaction, fast iteration, most services |
|
|
20
|
+
| hkp-node | TypeScript | REST + WebSocket | messaging, server I/O, webhooks |
|
|
21
|
+
| hkp-python | Python | REST + WebSocket | AI/ML, model inference |
|
|
22
|
+
| hkp-rt | C++ | REST + WebSocket | audio, high performance, embedded in the app |
|
|
23
|
+
| hkp-go | Go | REST | in development |
|
|
24
|
+
| GraphQL | — | GraphQL | legacy; one integration |
|
|
25
|
+
|
|
26
|
+
Not every service exists on every runtime. Where the same service id exists in
|
|
27
|
+
two runtimes it is meant to be the same *concept* with the same state contract —
|
|
28
|
+
`http-client` in node and hkp-rt share a UI panel for exactly that reason.
|
|
29
|
+
|
|
30
|
+
### Choosing where a step runs is a real decision
|
|
31
|
+
|
|
32
|
+
The same step can often be placed in more than one runtime, and where you put it
|
|
33
|
+
decides three things that no amount of configuration can change afterwards:
|
|
34
|
+
|
|
35
|
+
**Where the data goes.** A runtime is a physical place. A step in the browser
|
|
36
|
+
runtime on your laptop keeps its data on your laptop; the same step in a runtime
|
|
37
|
+
on a server puts that data on the server. This is not a privacy policy, it is
|
|
38
|
+
which machine the bytes are on. A board that transcribes a recording locally and
|
|
39
|
+
sends only the resulting text onwards is not promising that — it is what the
|
|
40
|
+
board does.
|
|
41
|
+
|
|
42
|
+
**What it can reach.** A runtime can touch only what its host can touch: the
|
|
43
|
+
microphone and camera of the device in your hand, an audio interface plugged
|
|
44
|
+
into it, files on that machine, a device on that network segment and nothing
|
|
45
|
+
else. If a board needs a thing, it needs a runtime on the host that has it.
|
|
46
|
+
|
|
47
|
+
**What it can afford.** Compute, memory, and the models installed. A phone can
|
|
48
|
+
drive a small speech model; a workstation can run a large one; a cheap always-on
|
|
49
|
+
box can do neither but never sleeps. Placement is how the work is matched to the
|
|
50
|
+
hardware — which is why the same service ids exist on several runtimes, so
|
|
51
|
+
moving a step is moving it in the list rather than rewriting it.
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
### Choosing, in practice
|
|
55
|
+
|
|
56
|
+
Four worked cases, to make those three axes concrete:
|
|
57
|
+
|
|
58
|
+
**Transcribing a private recording.** The audio should not leave the device, and
|
|
59
|
+
transcription needs a model. Put speech-to-text in a local runtime — hkp-rt
|
|
60
|
+
embedded in Readymade, or hkp-python on your own machine — and let only the
|
|
61
|
+
resulting text continue. The privacy property is structural: no step in the
|
|
62
|
+
board sends audio anywhere.
|
|
63
|
+
|
|
64
|
+
**A chat bot that answers while you sleep.** None of it can live in a browser,
|
|
65
|
+
because there is no browser open. Messaging belongs in hkp-node on a server, and
|
|
66
|
+
the board wants deploying so a coordinator keeps it running — see
|
|
67
|
+
`concepts/cloud-boards.md`.
|
|
68
|
+
|
|
69
|
+
**A live audio analyser with a UI.** Split it: capture and FFT in hkp-rt where
|
|
70
|
+
the sample buffers are, the display in the browser runtime where the person is.
|
|
71
|
+
What crosses between them is the analysis, not the audio.
|
|
72
|
+
|
|
73
|
+
**A model too big for your laptop.** Put hkp-python on the machine that has the
|
|
74
|
+
memory and leave everything else where it was. Only the prompt and the answer
|
|
75
|
+
travel.
|
|
76
|
+
|
|
77
|
+
The pattern in all four: put each step where its data should be and where its
|
|
78
|
+
work can happen, and let the board carry the results between them.
|
|
79
|
+
|
|
80
|
+
A consequence worth saying out loud: a board is portable in the sense that the
|
|
81
|
+
document is complete and the same JSON opens anywhere — but "anywhere" means
|
|
82
|
+
anywhere the runtimes it names can be reached. **A board built against a machine
|
|
83
|
+
on your desk is a board about your desk.** When one that worked yesterday will
|
|
84
|
+
not open, the runtime URL is the first thing to check.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Where a runtime comes from
|
|
89
|
+
|
|
90
|
+
A board names runtimes; something has to be there to be named.
|
|
91
|
+
|
|
92
|
+
### The browser runtime: nothing to run
|
|
93
|
+
|
|
94
|
+
It is the tab. Adding one to a board takes no credentials, no address and no
|
|
95
|
+
server, which is why it is the one a board starts with and the one every example
|
|
96
|
+
assumes. A board may hold several; they run independently and share nothing, the
|
|
97
|
+
same isolation any two runtimes have.
|
|
98
|
+
|
|
99
|
+
What it does need is **permission**, for the services that reach hardware. A
|
|
100
|
+
camera or microphone service triggers the browser's own permission prompt the
|
|
101
|
+
first time it starts; denied, the service reports the failure in its panel and
|
|
102
|
+
recovers when the permission is granted and the page reloaded — the rest of the
|
|
103
|
+
board is untouched, because a permission belongs to the service asking, not to
|
|
104
|
+
the board. In the packaged desktop app the same permissions are declared in the
|
|
105
|
+
application bundle and granted once by the operating system.
|
|
106
|
+
|
|
107
|
+
### The servers
|
|
108
|
+
|
|
109
|
+
| Runtime | Started by | Listens on |
|
|
110
|
+
|---|---|---|
|
|
111
|
+
| hkp-node | `HKP_INSTANCE=<name> npx hkp-node`, a global install, or `docker run -p 8080:8080 -e HKP_INSTANCE=<name> cbastuck/hkp-node` | `PORT`, default 8080 |
|
|
112
|
+
| hkp-python | `hkp-python` from its virtualenv | `PORT`, default 8080 |
|
|
113
|
+
| hkp-rt | embedded in the Readymade app — it is already running when the app is | the app's `runtimePort`, off unless external access is enabled |
|
|
114
|
+
|
|
115
|
+
hkp-node and hkp-python take the same environment, because they answer the same
|
|
116
|
+
API: `PORT`, `HOST` (default `0.0.0.0`), `ALLOWED_ORIGINS`, and `EXTERNAL_HOST`.
|
|
117
|
+
|
|
118
|
+
An hkp-node is also a named **instance**, and will not start without one:
|
|
119
|
+
`HKP_INSTANCE` names the folder everything it keeps between runs lives in,
|
|
120
|
+
`~/.hkp/node-<instance>/` — its boards' data, the tickets it reconnects to
|
|
121
|
+
coordinators with, the boards it coordinates, its mount secret. A server's state
|
|
122
|
+
is otherwise invisible to whoever starts the next one, and two servers on one
|
|
123
|
+
machine would restore each other's tickets and deployed boards without a word.
|
|
124
|
+
Restarting under the same name is the same server; a second server is refused
|
|
125
|
+
while one is running as that instance. `hkp-node reset --yes` moves that folder
|
|
126
|
+
aside — to `~/.hkp/node-<instance>.reset-<date>T<hh-mm>/` — so the next start
|
|
127
|
+
begins with nothing restored.
|
|
128
|
+
|
|
129
|
+
`EXTERNAL_HOST` is the one worth understanding, because it is not the address the
|
|
130
|
+
server binds — it is the address the server *writes into what it hands back*: the
|
|
131
|
+
`outputUrl` a client is told to open its socket on, and the mount addresses it
|
|
132
|
+
publishes. It defaults to `127.0.0.1`, which is right until something on another
|
|
133
|
+
machine has to reach it, and then a runtime that binds every interface still
|
|
134
|
+
hands out an address only the host can dial. That is what makes a runtime look
|
|
135
|
+
provisioned and unreachable at once, and setting it to the LAN address is the fix.
|
|
136
|
+
|
|
137
|
+
### Who may call a server from a browser
|
|
138
|
+
|
|
139
|
+
A runtime server on a person's own machine usually runs without
|
|
140
|
+
authentication, on the grounds that only that machine can reach it. That keeps
|
|
141
|
+
other machines out. It does not keep out a web page: every site open in a
|
|
142
|
+
browser on the machine can address `127.0.0.1`, and a board's runtime is not
|
|
143
|
+
something a stranger's page should be able to build.
|
|
144
|
+
|
|
145
|
+
So a request that carries no credential is let in only when it does not come
|
|
146
|
+
from a foreign page, and that is decided from what a browser states and a page
|
|
147
|
+
cannot forge:
|
|
148
|
+
|
|
149
|
+
| The request says | It is |
|
|
150
|
+
|---|---|
|
|
151
|
+
| no `Origin` | a caller that is not a browser — a coordinator, another runtime, `curl` — and is let in |
|
|
152
|
+
| an `Origin` the server allows | let in, and told it may read the answer |
|
|
153
|
+
| any other `Origin` | refused |
|
|
154
|
+
| no `Origin`, and `Sec-Fetch-Site: cross-site` | a page fetching the address as an image or a script; refused |
|
|
155
|
+
| a `Host` that is a name the server was not given | a page that resolved its own name to this machine; refused |
|
|
156
|
+
| `Forwarded`, `X-Forwarded-For` or `X-Real-IP` | a request a proxy passed on; refused (below) |
|
|
157
|
+
|
|
158
|
+
What a server allows without being told is the origins Readymade's own apps
|
|
159
|
+
run from and any page served from the machine itself, whatever its port. Every
|
|
160
|
+
other site — the playground on the public website included — is allowed at the
|
|
161
|
+
server's end and nowhere else: `ALLOWED_ORIGINS` for hkp-node, hkp-python and a
|
|
162
|
+
standalone hkp-rt, which replaces the default with exactly what it names; and
|
|
163
|
+
**Settings → Access → Allowed websites** in the Readymade app, which adds to it
|
|
164
|
+
and applies at once.
|
|
165
|
+
|
|
166
|
+
**Behind a proxy, where a request comes from says nothing.** A reverse proxy
|
|
167
|
+
on the same host — nginx, Caddy — makes every caller a loopback one, at a name
|
|
168
|
+
the server knows. So a request that says a proxy passed it on is never let in
|
|
169
|
+
for where it comes from: a server without auth refuses it, and hkp-rt's pass
|
|
170
|
+
for loopback callers does not apply to it — it has to carry a token. A proxy
|
|
171
|
+
that adds none of those headers cannot be told apart, which is why a loopback
|
|
172
|
+
bind is a boundary only while nothing forwards to it: put a server behind a
|
|
173
|
+
proxy only with authentication on.
|
|
174
|
+
|
|
175
|
+
A refusal is a `403` with nothing in it a page can read. To the page that was
|
|
176
|
+
refused it is indistinguishable from a server that is not running, and that is
|
|
177
|
+
the point: a site somebody merely has open learns nothing about what runs on
|
|
178
|
+
their machine. The playground therefore says both things when a board's server
|
|
179
|
+
gives no answer — it is not running, or it does not allow this page — with
|
|
180
|
+
what to change for each, and waits. **Check again** asks the server once more,
|
|
181
|
+
and the board carries on by itself the moment it answers.
|
|
182
|
+
|
|
183
|
+
Three things this does not cover. A request carrying a verified token is let
|
|
184
|
+
in by the token, and the origin list then says only which pages may send one.
|
|
185
|
+
A mount is reachable by anyone holding its address, as it is meant to be. And
|
|
186
|
+
another *program* on the same machine — or another account on it — is not a
|
|
187
|
+
browser, states no origin and is let in: a loopback bind is a boundary against
|
|
188
|
+
other machines and, with this, against web pages, not against the machine's own
|
|
189
|
+
software.
|
|
190
|
+
|
|
191
|
+
### Where a hosted server may connect
|
|
192
|
+
|
|
193
|
+
The other direction. A board names destinations — an HTTP Client's URL, a feed,
|
|
194
|
+
an asset, a mail server, a model's base URL — and the server dials them. On a
|
|
195
|
+
person's own machine that is the point: a board talks to the printer, the NAS,
|
|
196
|
+
a model on the LAN. On a server other people's boards run on it is not: that
|
|
197
|
+
server's loopback, its private network and a cloud provider's metadata endpoint
|
|
198
|
+
(`169.254.169.254`, which hands out the machine's credentials) are reachable
|
|
199
|
+
from where it runs and are not a board's to reach.
|
|
200
|
+
|
|
201
|
+
So a server is told it is hosted with **`HKP_EGRESS=public`**, the same in
|
|
202
|
+
hkp-node, hkp-python and a standalone hkp-rt. A destination is then reached only
|
|
203
|
+
when every address its name resolves to is a public internet address — never
|
|
204
|
+
`127.0.0.0/8`, the private ranges (`10/8`, `172.16/12`, `192.168/16`), shared
|
|
205
|
+
address space (`100.64/10`), link-local (`169.254/16`), the IPv6 equivalents, or
|
|
206
|
+
an IPv6 address carrying one of those. Unset, nothing is refused; the desktop
|
|
207
|
+
app's embedded runtime is never told otherwise.
|
|
208
|
+
|
|
209
|
+
- **Judged on the address connected to**, not on the name a board wrote: a name
|
|
210
|
+
can be pointed anywhere, and repointed between being checked and being
|
|
211
|
+
dialled. Every redirect hop is judged the same way, and so is every spelling
|
|
212
|
+
of an address (`2130706433` is `127.0.0.1`).
|
|
213
|
+
- **`HKP_EGRESS_ALLOW`** lists addresses or ranges reached anyway, an internal
|
|
214
|
+
model server for instance. Addresses, not names, for the same reason.
|
|
215
|
+
- **A refusal says so** — "This server does not reach private addresses
|
|
216
|
+
(10.0.0.5)" — where it would otherwise be a timeout or a misleading hint.
|
|
217
|
+
- **What the operator configured is not judged:** the link to a coordinator,
|
|
218
|
+
the token issuer's keys, a model downloaded from a fixed release address.
|
|
219
|
+
|
|
220
|
+
The rule lives in one place per runtime (`hkp-node/src/egress.ts`,
|
|
221
|
+
`hkp-python/src/hkp/egress.py`, `hkp-rt/lib/include/egress.h`), and each
|
|
222
|
+
runtime's tests read its sources and fail on any other way of opening a
|
|
223
|
+
connection, so a service added later cannot quietly go around it.
|
|
224
|
+
|
|
225
|
+
On a machine you run, add the same rule in its **firewall** as a backstop: drop
|
|
226
|
+
the hosted process's traffic to those ranges (by its user, with
|
|
227
|
+
`iptables`/`nftables` owner matching, or as a container's egress policy). It
|
|
228
|
+
covers what code cannot — a library opening a socket nobody listed. Mind what
|
|
229
|
+
the server itself needs on the private network: another runtime's mount on the
|
|
230
|
+
same host, the coordinator, a database. The code-level rule exempts those by
|
|
231
|
+
where they come from; a firewall rule sees one process and has to be told.
|
|
232
|
+
|
|
233
|
+
### What a token must carry
|
|
234
|
+
|
|
235
|
+
Every server checks a token the same way (hkp-node `src/auth.ts`,
|
|
236
|
+
hkp-python `hkp/auth.py`, hkp-rt `http/auth.cpp`, the website's `api/auth.php`):
|
|
237
|
+
signed with RS256 by a key of the issuer it names, that issuer being
|
|
238
|
+
`https://<AUTH0_DOMAIN>/`; addressed to one of the accepted audiences
|
|
239
|
+
(`AUTH0_AUDIENCE`); carrying an expiry that has not passed and a subject; and
|
|
240
|
+
not used before its `nbf`. Expiry and subject must be *there* — a check that
|
|
241
|
+
only applied when they were present would accept a token without them. A minute
|
|
242
|
+
of clock skew is allowed. On the desktop, an issuer listed in `settings.json`
|
|
243
|
+
without audiences accepts nothing, rather than a token minted for any
|
|
244
|
+
application of its tenant.
|
|
245
|
+
|
|
246
|
+
### Opening a socket without the token in its address
|
|
247
|
+
|
|
248
|
+
A browser cannot set a header on a WebSocket handshake, so a token that
|
|
249
|
+
authenticated one would have to ride in the address — and an address is what
|
|
250
|
+
proxies and access logs keep. So the browser buys a **ticket** first:
|
|
251
|
+
`POST <server>/ws-tickets` with its token in the `Authorization` header, like
|
|
252
|
+
any request, answered with a random value good for one socket, for 30 seconds.
|
|
253
|
+
The socket is opened with `?ticket=` (`hkp-frontend/src/runtime/rest/wsTicket.ts`).
|
|
254
|
+
A ticket remembers what checking the token found — who the caller is, and
|
|
255
|
+
whether the allowlist lets them own — so a coordinator's bridge, which members
|
|
256
|
+
not on the allowlist open too, is judged exactly as the token would have been.
|
|
257
|
+
|
|
258
|
+
Every runtime server and coordinator issues them. `?access_token=` is still
|
|
259
|
+
accepted from a client that predates tickets, and the browser falls back to it
|
|
260
|
+
only for a server that has no `/ws-tickets` route.
|
|
261
|
+
|
|
262
|
+
### What an expression may reach
|
|
263
|
+
|
|
264
|
+
A Map's terms and a Filter's predicate are expressions a board wrote, evaluated
|
|
265
|
+
inside the runtime — on a hosted server, inside a process everyone it lets in
|
|
266
|
+
shares. The evaluator (hkp-node `src/expressionEval.ts`, and its twin in the
|
|
267
|
+
browser runtime) is kept in the repository and changed like security code:
|
|
268
|
+
an expression reads and calls what its scope hands it and nothing else. It has
|
|
269
|
+
no assignment, a name is only one of the scope's own properties, and
|
|
270
|
+
`constructor`, `prototype`, `__proto__` and every other `__` member are refused
|
|
271
|
+
however they are reached, which closes the way from a value to the code behind
|
|
272
|
+
it.
|
|
273
|
+
|
|
274
|
+
### Where a board may read and write files
|
|
275
|
+
|
|
276
|
+
A board is a document somebody wrote, and opening one builds its runtimes. A
|
|
277
|
+
service on hkp-rt that opens a path the board names — a
|
|
278
|
+
[Filesystem](../services/filesystem.md)'s file, a Monitor's log, a Cache's
|
|
279
|
+
folder, a WAV to read — would otherwise open it wherever it is: beside the
|
|
280
|
+
desktop app that is `~/.hkp`, which holds the vault, the remembered grants and
|
|
281
|
+
the settings that say which websites may call the runtime; on a server it is the
|
|
282
|
+
mount secret, the coordinator tickets and the process's environment.
|
|
283
|
+
|
|
284
|
+
So hkp-rt opens such a path only inside a **folder it was given**:
|
|
285
|
+
|
|
286
|
+
| hkp-rt runs as | Default folder | Others |
|
|
287
|
+
|---|---|---|
|
|
288
|
+
| the desktop app's runtime | `~/.hkp/cpp/files` | **Settings → Access → Folders boards may use**, applied at once. A folder holding `~/.hkp`, or inside it, is refused — the home folder among them |
|
|
289
|
+
| a standalone server | `HKP_FILES_DIR`, else `~/.hkp/cpp/files`; empty for none | `HKP_FILES_ALLOW`, absolute paths separated as `PATH` is |
|
|
290
|
+
| the iOS and Android apps' runtime | none | — |
|
|
291
|
+
|
|
292
|
+
A relative path is taken from the default folder, which is what makes a board
|
|
293
|
+
that writes `"recordings"` portable. A path is judged on what it is rather than
|
|
294
|
+
how it is spelled: `..` and symlinks are followed before it is compared, and a
|
|
295
|
+
name that arrives with the data — a file inside a configured folder, a cache
|
|
296
|
+
entry's name — is taken inside that folder whatever it says. The rule lives in
|
|
297
|
+
one place (`hkp-rt/lib/include/files.h`); every service resolves through it, and
|
|
298
|
+
a test fails on a file opened any other way. The test reads hkp-rt's own sources,
|
|
299
|
+
so a library that opens files is closed where it is set up: Inja's `include`,
|
|
300
|
+
which would read any path a template names, is switched off wherever hkp-rt
|
|
301
|
+
renders one (`hkp-rt/lib/src/common/inja.h`).
|
|
302
|
+
|
|
303
|
+
What it does not cover: hkp-rt has one tenant, so everyone a hosted server lets
|
|
304
|
+
in shares its folders; paths the operator names — a runtime config, plugins —
|
|
305
|
+
are the operator's; and a folder should hold nothing but what boards may have,
|
|
306
|
+
because a board that may write there may write all of it. The models the speech
|
|
307
|
+
and text-generation services load are named by path too and are not confined:
|
|
308
|
+
the model library reads them, and a file that is not a model fails to load.
|
|
309
|
+
The one way any of it comes back is speech-to-text's `tokensPath`, the
|
|
310
|
+
vocabulary a transcript is spelled from: a file shaped like one, should it load,
|
|
311
|
+
spells the transcript.
|
|
312
|
+
|
|
313
|
+
### Adding one to a board
|
|
314
|
+
|
|
315
|
+
In the app: the runtimes menu, **add an external runtime**, a name and a host URL
|
|
316
|
+
(`http://localhost:8080`). The name is yours; the URL is what is dialled.
|
|
317
|
+
|
|
318
|
+
A saved server and the board are separate things, joined by the server's
|
|
319
|
+
**name**. The list of servers is the host's — kept by whoever is running the
|
|
320
|
+
app, edited and deleted there — and a runtime added from it gives the board the
|
|
321
|
+
name and nothing else: `"remote": "node"` for a server that answers to `node`,
|
|
322
|
+
`"remote": "Laptop"` for one that is only called that. The board holds no
|
|
323
|
+
address at all, and opens on whichever server the person opening it keeps under
|
|
324
|
+
that name, on whatever port and machine that is for them.
|
|
325
|
+
|
|
326
|
+
So a board depends on the name staying answered. Renaming a server keeps the
|
|
327
|
+
old name as an alias, and a name nobody is kept under any more is asked about
|
|
328
|
+
when the board opens — *which runtime server is `Laptop`?* — rather than left
|
|
329
|
+
to fail (`concepts/remotes.md`). A board that carries a `url` instead, written
|
|
330
|
+
by hand or from before any of this, still opens exactly as it did.
|
|
331
|
+
|
|
332
|
+
`hkp://remotes/<name>` is the other way in, and it means something narrower than
|
|
333
|
+
it looks: it addresses the runtime **the app itself hosts**, under the name that
|
|
334
|
+
app runs as — every other remote is listed with its real URL. A name that is not
|
|
335
|
+
the app's own therefore names nothing and is refused, rather than being quietly
|
|
336
|
+
answered by whichever runtime happens to be embedded
|
|
337
|
+
(`meander/backend/remoteRoute.h`). A board pinned to a runtime that is
|
|
338
|
+
not running should fail visibly, not run somewhere else.
|
|
339
|
+
|
|
340
|
+
---
|
|
341
|
+
|
|
342
|
+
## The chain
|
|
343
|
+
|
|
344
|
+
Runtimes run **in board order**: the output of one is the input of the next.
|
|
345
|
+
|
|
346
|
+
```
|
|
347
|
+
runtimes[0] → runtimes[1] → runtimes[2]
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
The step between two runtimes is `onRuntimeResult()` in
|
|
351
|
+
`hkp-frontend/src/views/playground/Board/index.tsx`: when a runtime finishes, it
|
|
352
|
+
finds the next runtime in the array and calls its `processRuntime()`. Two things
|
|
353
|
+
about that step are worth knowing:
|
|
354
|
+
|
|
355
|
+
- **`null` stops the board.** The chain only continues `if (result !== null)`.
|
|
356
|
+
The same value that stops a pipeline inside a runtime also stops the chain
|
|
357
|
+
between them.
|
|
358
|
+
- **The board is driven from the first runtime.** The `playBoard` action calls
|
|
359
|
+
`processRuntime` on `runtimes[0]`; everything after that is the chain. A
|
|
360
|
+
service can also emit on its own (a Timer, an HTTP request arriving), which
|
|
361
|
+
starts the chain from wherever that service sits.
|
|
362
|
+
|
|
363
|
+
For a deployed board the same chaining is done by the coordinator
|
|
364
|
+
(`routeResult()` / `nextRuntime()` in `hkp-node/src/coordinator/session.ts`),
|
|
365
|
+
including the case where the next runtime is a browser runtime it must reach
|
|
366
|
+
over the bridge.
|
|
367
|
+
|
|
368
|
+
Either way the result passes **through whoever runs the board** — runtimes do
|
|
369
|
+
not dial each other — and it travels on the sockets each runtime already has to
|
|
370
|
+
it. What cannot be JSON goes as a YAS frame: a `FloatRingBuffer`, and bytes,
|
|
371
|
+
which arrive in the next runtime as bytes (`Uint8Array` in the browser, a
|
|
372
|
+
`Buffer` in hkp-node, `BinaryData` in hkp-rt and hkp-python) — an encoder's
|
|
373
|
+
output handed to a server in another runtime, say. Everything else is JSON.
|
|
374
|
+
Results enter the next runtime in the order they were produced.
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
## What crosses a runtime boundary
|
|
379
|
+
|
|
380
|
+
Because a runtime is a physical place, it is worth being precise about what
|
|
381
|
+
actually leaves one.
|
|
382
|
+
|
|
383
|
+
In normal operation:
|
|
384
|
+
|
|
385
|
+
| What crosses | When |
|
|
386
|
+
|---|---|
|
|
387
|
+
| **The result** a runtime hands to the next | every pass — this is the flow the board describes |
|
|
388
|
+
| **Configuration**, and the state a service reports back | whenever a service is configured or reports; the coordinator keeps the last state of every service, which is how whole-board questions are answered |
|
|
389
|
+
| **Log entries** | only while the board has logging switched on — see `concepts/logging.md` |
|
|
390
|
+
|
|
391
|
+
Everything else — the intermediate values passing between the services inside
|
|
392
|
+
one runtime — stays there. A runtime is a box that can be closed.
|
|
393
|
+
|
|
394
|
+
**With one exception, and it is the useful one.** Attach a UI to a runtime and
|
|
395
|
+
it reports each call its services make: a pair of notifications around every
|
|
396
|
+
call (`{__internal: {state: "call-process"}}` before it,
|
|
397
|
+
`"call-process-finished"` after it). That is what makes the panels live: the
|
|
398
|
+
processing indicator, the output plug lighting, the overview's activity.
|
|
399
|
+
|
|
400
|
+
**What a report carries depends on Capture mode.** Without it, a report says
|
|
401
|
+
only that the call happened and, when it ends, whether it passed nothing on
|
|
402
|
+
(`stopped: true`). With it, a report also carries the value going in and the
|
|
403
|
+
value coming out, which is what the Flow Inspector shows. What passes between
|
|
404
|
+
the services of a run is private, and only what a board outputs is public. So
|
|
405
|
+
the values leave a runtime only while someone building the board asks to see
|
|
406
|
+
them:
|
|
407
|
+
|
|
408
|
+
- **The switch** is the Capture button beside the toolbar's Play buttons, or
|
|
409
|
+
for a deployed board its owner's in the Cloud Boards view. Opening the
|
|
410
|
+
inspector while it is off asks whether to turn it on. On a phone it is the
|
|
411
|
+
round button beside Play in the top bar, and in a deployed board's top bar
|
|
412
|
+
on the Cloud tab. A service's card, tapped, expands to show what it passed on
|
|
413
|
+
last, with its own panel a tap further (**UI**), and its **Inspect** opens
|
|
414
|
+
the inspector, which is also **Flow** in the
|
|
415
|
+
service's sheet; both ask the same question in place
|
|
416
|
+
(`views/playground/mobile/capture.tsx`, `MobileFlowInspector.tsx`).
|
|
417
|
+
- **It is never saved.** It is not in the board document or a runtime's
|
|
418
|
+
configuration (`PATCH /runtimes/:id/state` sets it on a running runtime and
|
|
419
|
+
answers it, and nothing builds a runtime with it). A board always opens with
|
|
420
|
+
it off. A deployed board's coordinator holds it in its session only, and it
|
|
421
|
+
ends when the owner's last bridge to the board closes.
|
|
422
|
+
- **Where it is applied:** where a report leaves. In hkp-node and hkp-python
|
|
423
|
+
that is the server's two exits, the notification socket and the coordinator
|
|
424
|
+
link (`outgoingPayload`). In hkp-rt it is where the report is made, which a
|
|
425
|
+
nested pipeline asks of the runtime around it (`capturesCalls`). In the
|
|
426
|
+
browser it is `serviceState.ts`. A pipeline nested at any depth follows the
|
|
427
|
+
runtime that holds it.
|
|
428
|
+
|
|
429
|
+
Even with Capture mode on, a report carries a value only up to 5 MiB. Above
|
|
430
|
+
that, a description takes its place, `{"__hkpTooLarge": {type, bytes, exact,
|
|
431
|
+
preview}}`: what the value is, how large (`exact` is false where counting
|
|
432
|
+
stopped at the limit), and how it begins. The Flow Inspector shows the
|
|
433
|
+
description and will not run it again. Without the limit, a value that never
|
|
434
|
+
needs to leave its runtime would leave it anyway, once for every service it
|
|
435
|
+
passes through. On a deployed board that is past the coordinator's frame limit,
|
|
436
|
+
and enough to close the runtime's connection. The rule is the same in every
|
|
437
|
+
runtime (`callReport.ts`, `call_report.py`, `call_report.h`).
|
|
438
|
+
|
|
439
|
+
A phone keeps what the inspector shows for the **whole board** rather than per
|
|
440
|
+
service frame: it opens a service only when asked, so a history begun then
|
|
441
|
+
would miss everything before it. The mobile canvas listens to every service a
|
|
442
|
+
runtime holds from the moment the board is shown (`boardFlow.tsx`), and the
|
|
443
|
+
same listening lights a service's card while it runs. Both read a report with
|
|
444
|
+
the desktop's rule (`readCallReport` in
|
|
445
|
+
`ui-components/service/flowRecords.ts`). A service nested inside another is
|
|
446
|
+
not listened to there yet.
|
|
447
|
+
|
|
448
|
+
When nothing is attached, nothing is sent at all. This is not a filter applied
|
|
449
|
+
afterwards: the browser drops a notification with no target (`hasCallbacks`),
|
|
450
|
+
and a runtime server returns early when its socket set is empty
|
|
451
|
+
(`sendJsonNotification`).
|
|
452
|
+
|
|
453
|
+
The caveat is a service's own notifications. A Monitor shows what passed
|
|
454
|
+
through it, and an error message can quote a value. Capture mode covers call
|
|
455
|
+
reports, not what a service chooses to say. And **a deployed board's
|
|
456
|
+
coordinator holds its own socket to every runtime it provisioned**, so on a
|
|
457
|
+
deployed board, assume there is always a listener for what services say. A step
|
|
458
|
+
whose intermediate data must not leave its machine belongs on a board you own
|
|
459
|
+
yourself.
|
|
460
|
+
|
|
461
|
+
---
|
|
462
|
+
|
|
463
|
+
## Inside a runtime: the pipeline
|
|
464
|
+
|
|
465
|
+
Each runtime owns an **ordered list of services**, and that order is the wiring.
|
|
466
|
+
The browser's loop (`BrowserRuntimeScope.next()`) is the shortest illustration of
|
|
467
|
+
the contract every runtime implements:
|
|
468
|
+
|
|
469
|
+
```ts
|
|
470
|
+
for (let i = position + 1; !!services[i] && result !== null; ++i) {
|
|
471
|
+
svc = services[i];
|
|
472
|
+
if (svc && !svc.bypass) {
|
|
473
|
+
result = await svc.process(params);
|
|
474
|
+
params = result;
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
Three things fall out of those five lines: services run in order, a **bypassed**
|
|
480
|
+
service is skipped rather than removed, and `null` ends the pass. `next()` also
|
|
481
|
+
takes a *starting* service — which is what makes the pull and early-return
|
|
482
|
+
patterns below possible.
|
|
483
|
+
|
|
484
|
+
### Control flow
|
|
485
|
+
|
|
486
|
+
Four mechanisms, and they are not all implemented everywhere:
|
|
487
|
+
|
|
488
|
+
| Mechanism | How | Runtimes |
|
|
489
|
+
|---|---|---|
|
|
490
|
+
| **Stop** | return `null` — nothing downstream, and nothing in the next runtime, runs | all |
|
|
491
|
+
| **Early return** | return a `ControlFlowData` / `makeEarlyReturn` — skip the rest of this pipeline but carry a result out | hkp-rt, hkp-python |
|
|
492
|
+
| **Inversion of control (pull)** | return `null`, then drive the services after you yourself and act on their result | all (`app.next`, `host.processFrom`, `next()` / `nextAsync()`) |
|
|
493
|
+
| **Deferred / multi-emit** | answer later: `deferCompletion()` returns Null and suppresses the finish event, a later `emit()` delivers the real result | hkp-rt (`emitResult` in node) |
|
|
494
|
+
|
|
495
|
+
hkp-node and the browser break on `null`/`undefined` only — do not write a board
|
|
496
|
+
that relies on early return there. The loops to read are
|
|
497
|
+
`hkp-rt/lib/src/runtime.cpp` (`processFrom`), `hkp-node/src/runtime.ts`
|
|
498
|
+
(`processFromIndex`), `hkp-python/src/hkp/runtime.py`, and
|
|
499
|
+
`BrowserRuntimeScope.next`.
|
|
500
|
+
|
|
501
|
+
The canonical use of pull is a cache: on a **hit** it early-returns the cached
|
|
502
|
+
value; on a **miss** it stops the push, lets the services behind it fetch, keeps
|
|
503
|
+
what they produced, and emits that.
|
|
504
|
+
|
|
505
|
+
---
|
|
506
|
+
|
|
507
|
+
## Leaving the line
|
|
508
|
+
|
|
509
|
+
The chain and the pipeline are the default shape, not the only one. A service can
|
|
510
|
+
reach a *named* service or runtime and act on it directly:
|
|
511
|
+
|
|
512
|
+
| Mechanism | What it does | Where |
|
|
513
|
+
|---|---|---|
|
|
514
|
+
| `app.getServiceById(uuid)` | the live instance of another service in this runtime | `AppImpl` |
|
|
515
|
+
| `app.configureService` / `configureServiceInRuntime(runtimeId, uuid, config)` | reconfigure a service here or on another runtime | `AppImpl` |
|
|
516
|
+
| `app.processRuntimeByName(name, params)` | run a whole runtime by its name, out of order | `AppImpl` |
|
|
517
|
+
| `app.next(svc, result)` | emit as if `svc` had just produced this — the services after it run, it does not | `AppImpl` |
|
|
518
|
+
| **Configurator** service | calls `configure()` on `targetServiceUuid` (+ optional `targetRuntime`), then stops by default | `services/Configurator.ts` |
|
|
519
|
+
|
|
520
|
+
These exist for actions such as a panel reconfiguring a service elsewhere on
|
|
521
|
+
the board. Processing still follows the ordered services or a nested pipeline.
|
|
522
|
+
|
|
523
|
+
**They are `goto`, and they cost what `goto` costs.** Two parts of the board now
|
|
524
|
+
know about each other, neither can be moved or reused alone, and the ordered list
|
|
525
|
+
no longer tells you what runs. Every such reference is also a field the generic
|
|
526
|
+
machinery must know by name — `targetServiceUuid`, `targetRuntime` and friends
|
|
527
|
+
are in `KNOWN_REFERENCE_FIELDS` (`core/forkBoard.ts`) precisely so a fork can
|
|
528
|
+
rewrite them; anything a service invents for itself is not carried across.
|
|
529
|
+
|
|
530
|
+
So: use them when the shape really is a cycle, and reach for **nesting** first
|
|
531
|
+
everywhere else. A nested pipeline is a step in the outer one — the host knows
|
|
532
|
+
its pipeline, the pipeline knows nothing of its host — and that ignorance is what
|
|
533
|
+
makes the group movable and readable. `join` is the pattern to imitate: a nested
|
|
534
|
+
pipeline whose result is merged *beside* the input, so a value can be computed
|
|
535
|
+
where it is needed instead of fetched from somewhere that has to be named.
|
|
536
|
+
|
|
537
|
+
---
|
|
538
|
+
|
|
539
|
+
## How the browser talks to a runtime
|
|
540
|
+
|
|
541
|
+
Three abstractions, all in `hkp-frontend/src/types.ts`:
|
|
542
|
+
|
|
543
|
+
| | What it is |
|
|
544
|
+
|---|---|
|
|
545
|
+
| `RuntimeApi` | the verbs, per runtime *type*: `addRuntime`, `restoreRuntime`, `processRuntime`, `addService`, `configureService`, `getServiceConfig`, `rearrangeServices`, … |
|
|
546
|
+
| `RuntimeScope` | one *live* runtime: its descriptor, its registry, `onResult`, and how to close it |
|
|
547
|
+
| `AppImpl` | what a **service** may do — `notify`, `next`, `log`, `createSubService`, `coordinator`, … |
|
|
548
|
+
|
|
549
|
+
There is one `RuntimeApi` implementation per runtime type
|
|
550
|
+
(`runtime/browser/BrowserRuntimeApi.ts`, `runtime/rest/RuntimeRestApi.ts`,
|
|
551
|
+
`runtime/graphql/…`), and the board picks the one matching `runtime.type`. This
|
|
552
|
+
is the seam that lets a cloud board swap in a REST api that talks over the
|
|
553
|
+
coordinator's bridge instead of dialling the runtime
|
|
554
|
+
(`views/cloud/bridgeRuntimeApi.ts`) without anything else noticing.
|
|
555
|
+
|
|
556
|
+
Runtime types carry two deprecated aliases — `realtime` → `rest` and `remote` →
|
|
557
|
+
`graphql` — normalised by `toCanonicalRuntimeClassType()`. Boards in the wild
|
|
558
|
+
still use them, so always compare canonical forms.
|
|
559
|
+
|
|
560
|
+
---
|
|
561
|
+
|
|
562
|
+
## Provisioning: `GET` attaches, `POST` provisions
|
|
563
|
+
|
|
564
|
+
For a remote runtime, `restoreRuntime()` in `runtime/rest/RuntimeRestApi.ts`:
|
|
565
|
+
|
|
566
|
+
1. `attachRuntime()` — `GET /runtimes`, find this id, and compare **service
|
|
567
|
+
identity only** (uuid + serviceId, in order — never state, which legitimately
|
|
568
|
+
drifts). Same board still running there? Attach to it, and re-push secrets,
|
|
569
|
+
because a runtime that restarted still has its services and no longer has
|
|
570
|
+
their credentials.
|
|
571
|
+
2. Otherwise `POST /runtimes` and build it.
|
|
572
|
+
|
|
573
|
+
> The verb is the intent; no server infers it.
|
|
574
|
+
|
|
575
|
+
A `RuntimeRestScope` then opens **one WebSocket per runtime** to the `outputUrl`
|
|
576
|
+
the server returned. That socket carries results and notifications — and it is
|
|
577
|
+
also what keeps the runtime alive, because of the lifecycle flag below.
|
|
578
|
+
|
|
579
|
+
### Lifecycle is declared, never inferred
|
|
580
|
+
|
|
581
|
+
In the create payload, by whoever creates the runtime:
|
|
582
|
+
|
|
583
|
+
| `garbageCollected` | Meaning | Who sends it |
|
|
584
|
+
|---|---|---|
|
|
585
|
+
| `true` | reap when the last client socket closes | a browser — its runtimes should not outlive the tab |
|
|
586
|
+
| absent / `false` | persist until an explicit `DELETE` | a coordinator, a config file, a script |
|
|
587
|
+
|
|
588
|
+
The default is persist, and a runtime nobody ever connected to is never reaped:
|
|
589
|
+
cleanup happens when a client *goes away*. All three servers honour it, pinned by
|
|
590
|
+
`hkp-node/tests/runtime-lifecycle.test.ts`,
|
|
591
|
+
`hkp-python/tests/test_runtime_lifecycle.py`,
|
|
592
|
+
`hkp-rt/tests/runtime_lifecycle.test.cpp`.
|
|
593
|
+
|
|
594
|
+
---
|
|
595
|
+
|
|
596
|
+
## Multi-tenancy
|
|
597
|
+
|
|
598
|
+
A runtime server is shared. Runtimes are namespaced by the authenticated `sub`,
|
|
599
|
+
so two people loading the same board each get their own runtime rather than
|
|
600
|
+
fighting over one (`TenantRuntimes` in `hkp-node/src/runtime.ts`). Every route
|
|
601
|
+
resolves runtimes through one of those views, so a handler cannot reach another
|
|
602
|
+
tenant's runtime even by id.
|
|
603
|
+
|
|
604
|
+
This is also why a service that must be reachable from outside cannot bind a
|
|
605
|
+
port of its own — see `concepts/mounts.md`.
|
|
606
|
+
|
|
607
|
+
---
|
|
608
|
+
|
|
609
|
+
## What a runtime carries besides services
|
|
610
|
+
|
|
611
|
+
- **A registry**: what services this runtime can create. Sent back when the
|
|
612
|
+
runtime is provisioned, and used to offer the right service list and pick the
|
|
613
|
+
right UI panel (`ServiceRegistry` per runtime id).
|
|
614
|
+
- **A server kind**: remote servers report what they are (`"server": "node"`,
|
|
615
|
+
`"python"`, `"c++"`) beside the registry, and the runtime header shows it
|
|
616
|
+
next to the `rest` badge. It lives on the live scope, never in the board — the
|
|
617
|
+
same board can point a runtime at a different server tomorrow.
|
|
618
|
+
- **State**: presentation and per-runtime settings, e.g. `color`,
|
|
619
|
+
`wrapServices`, `minimized`, `logData` — `runtime.state` in the board.
|
|
620
|
+
- **Where it runs**, for remote runtimes: a `url`, or a `remote` — the name of
|
|
621
|
+
a runtime server the client opening the board keeps (`embedded`, `node`,
|
|
622
|
+
`python`, or a name of the person's own; `concepts/remotes.md`).
|
|
623
|
+
`hkp://remotes/<name>` addresses the app's own embedded runtime (above);
|
|
624
|
+
`HKP_RUNTIME_HOST` is substituted at load for boards that cannot know the host
|
|
625
|
+
when they are written.
|
|
626
|
+
- **Bundles**: optional plugin libraries a runtime loads (`bundles[]`).
|
|
627
|
+
- **Custom actions**: host-level buttons a runtime can offer.
|
|
628
|
+
|
|
629
|
+
---
|
|
630
|
+
|
|
631
|
+
## Sub-runtimes
|
|
632
|
+
|
|
633
|
+
Every runtime supports a `sub-service`: a service that owns an ordered pipeline
|
|
634
|
+
of its own and runs it as one step of the outer pipeline. That nested pipeline is
|
|
635
|
+
a full runtime pass with the same rules — which is what makes reusable
|
|
636
|
+
higher-level building blocks possible, and what `http-server-subservices` uses to
|
|
637
|
+
answer a request with a pipeline rather than a single service.
|
|
638
|
+
|
|
639
|
+
Implementations: `runtime/browser/services/BrowserSubService.tsx`,
|
|
640
|
+
`hkp-node/src/services/sub-service.ts`, `hkp-rt/lib/src/services/sub_service.h`
|
|
641
|
+
(+ `sub_runtime.cpp`).
|
|
642
|
+
|
|
643
|
+
---
|
|
644
|
+
|
|
645
|
+
## Rough index into the source
|
|
646
|
+
|
|
647
|
+
| Concern | Where |
|
|
648
|
+
|---|---|
|
|
649
|
+
| Types (`RuntimeDescriptor`, `RuntimeApi`, `RuntimeScope`, `AppImpl`) | `hkp-frontend/src/types.ts` |
|
|
650
|
+
| Runtime-to-runtime chain | `hkp-frontend/src/views/playground/Board/index.tsx` (`onRuntimeResult`) |
|
|
651
|
+
| Browser runtime | `hkp-frontend/src/runtime/browser/` (`BrowserRuntimeApi.ts`, `BrowserRuntimeScope.ts`, `BrowserRuntimeApp.ts`) |
|
|
652
|
+
| REST runtime client | `hkp-frontend/src/runtime/rest/` (`RuntimeRestApi.ts`, `RuntimeRestScope.ts`, `Message.ts`) |
|
|
653
|
+
| Board load / restore | `hkp-frontend/src/core/boardPersistence.ts` |
|
|
654
|
+
| Node runtime + tenancy | `hkp-node/src/runtime.ts` |
|
|
655
|
+
| Python runtime | `hkp-python/src/hkp/runtime.py` |
|
|
656
|
+
| C++ runtime + sub-runtime | `hkp-rt/lib/src/runtime.cpp`, `sub_runtime.cpp` |
|
|
657
|
+
| Folders an hkp-rt board may use | `hkp-rt/lib/include/files.h`; the desktop's in `meander/backend/fileFolders.h` |
|
|
658
|
+
| Chain for deployed boards | `hkp-node/src/coordinator/session.ts` (`routeResult`, `nextRuntime`) |
|
|
659
|
+
|
|
660
|
+
---
|
|
661
|
+
|
|
662
|
+
See also: **Board** (`concepts/board.md`), **Service** (`concepts/service.md`),
|
|
663
|
+
**Mounts** (`concepts/mounts.md`), **Units and compositions**
|
|
664
|
+
(`concepts/units.md`) — the runtime is the axis a unit is projected along.
|