@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,314 @@
|
|
|
1
|
+
# Mounts
|
|
2
|
+
|
|
3
|
+
How a service that must be reachable from outside the board gets an address, and how another service points at it without knowing that address in advance.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## The problem
|
|
8
|
+
|
|
9
|
+
Most services only talk to the service next to them in the pipeline. A few have
|
|
10
|
+
to be reachable by something that is not part of the board at all: a webhook
|
|
11
|
+
posted by someone else's product, a phone scanning a QR code, a PeerJS client
|
|
12
|
+
looking for its signalling server, or a service on another runtime — possibly on
|
|
13
|
+
another machine — calling in.
|
|
14
|
+
|
|
15
|
+
Those services need an address, and originally each one bound a port it chose.
|
|
16
|
+
That broke in three separate ways:
|
|
17
|
+
|
|
18
|
+
- **Ports are a single machine-wide namespace.** With several tenants sharing one
|
|
19
|
+
hkp-node, a service asking for port 8081 is a land grab: the second claimant
|
|
20
|
+
fails to start, and whoever wins receives traffic the other one expected.
|
|
21
|
+
- **Runtime ids are only unique per tenant.** Boards ship stable ids like `node`
|
|
22
|
+
or `chat-node`, and hkp-node namespaces runtimes by the authenticated user, so
|
|
23
|
+
two people can load the same board without colliding. Such an id cannot appear
|
|
24
|
+
in a publicly routable path.
|
|
25
|
+
- **These endpoints are deliberately unauthenticated.** They exist to be called
|
|
26
|
+
by outside parties who hold no token, so something other than a credential has
|
|
27
|
+
to gate access.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## What a mount is
|
|
32
|
+
|
|
33
|
+
A **mount** is an endpoint that a service's *runtime* assigns to it, rather than
|
|
34
|
+
one the service claims for itself. The runtime serves it on its own server under
|
|
35
|
+
an opaque path:
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
http://<host>:<port>/hosted/<mountId>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
and publishes the resulting address in the service's own state, in the reserved
|
|
42
|
+
field `__hkpMount`. The service never learns a port; it asks its host for a
|
|
43
|
+
mount and gets back a URL.
|
|
44
|
+
|
|
45
|
+
Because the endpoint is unauthenticated by design, **the unguessable id is the
|
|
46
|
+
capability**: knowing the address is what it takes to reach it, and the address
|
|
47
|
+
carries no user identifier that a public URL would otherwise leak.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Why the id is derived, not drawn
|
|
52
|
+
|
|
53
|
+
The id is an HMAC of everything that identifies the mount — the owner, the
|
|
54
|
+
board, the runtime, and what the mount is called (`mountName`, defaulting to the
|
|
55
|
+
service's uuid) — keyed by a secret only the server holds (`HKP_MOUNT_SECRET`,
|
|
56
|
+
otherwise persisted per server at `~/.hkp/node-<instance>/mount-secret` or
|
|
57
|
+
`~/.hkp/python/mount-secret`).
|
|
58
|
+
|
|
59
|
+
Random ids were the first implementation. They were just as unguessable, but the
|
|
60
|
+
address changed every time a board loaded — so a webhook configured by hand in
|
|
61
|
+
somebody else's product broke on every restart, and a board could not be
|
|
62
|
+
redeployed without reconfiguring its callers.
|
|
63
|
+
|
|
64
|
+
Deriving the id keeps the address stable across reloads, restarts and redeploys
|
|
65
|
+
while keeping the secret out of the board. The board says only what the mount is
|
|
66
|
+
*called*, which is not sensitive. Renaming one mount rotates that one address;
|
|
67
|
+
rotating the server's secret rotates all of them.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## More than one claim to an address
|
|
72
|
+
|
|
73
|
+
Because the address is derived from what the mount is called, more than one
|
|
74
|
+
runtime can derive the same one:
|
|
75
|
+
|
|
76
|
+
- a runtime rebuilt under its id claims the address before the one it replaces
|
|
77
|
+
lets go;
|
|
78
|
+
- a board that is deployed and also open in the playground has two copies of
|
|
79
|
+
each of its mounts on the server — the deployed board's runtimes and the
|
|
80
|
+
playground's are kept apart (`concepts/cloud-boards.md`), their addresses
|
|
81
|
+
are not.
|
|
82
|
+
|
|
83
|
+
A runtime server keeps every claim and lets one answer: a **deployed board's
|
|
84
|
+
before a client's**, and the newest of its kind. Releasing a claim releases
|
|
85
|
+
that claim only, and the address stays with whoever still holds one. So
|
|
86
|
+
opening a deployed board does not take its endpoint, closing it again does not
|
|
87
|
+
take the endpoint away, and the playground's copy answers only where no
|
|
88
|
+
deployed board claims the address.
|
|
89
|
+
|
|
90
|
+
The same on all three: `hkp-node/src/mounts.ts`, `hkp-python/src/hkp/mounts.py`,
|
|
91
|
+
`hkp-rt/lib/src/http/front_door.cpp`.
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## What each runtime actually does
|
|
96
|
+
|
|
97
|
+
"Mount" is the board-wide vocabulary. Every runtime server assigns a path on its
|
|
98
|
+
own port; hkp-rt does so where its host has turned that on:
|
|
99
|
+
|
|
100
|
+
| Runtime | How a hosted service becomes reachable | Published address |
|
|
101
|
+
|---|---|---|
|
|
102
|
+
| hkp-node | mount path on the runtime's shared server | `http://host:port/hosted/<mountId>` |
|
|
103
|
+
| hkp-python | same | `http://host:port/hosted/<mountId>` |
|
|
104
|
+
| hkp-rt, standalone or in a container | same | `http://host:port/hosted/<mountId>`, or under `HKP_EXTERNAL_URL` |
|
|
105
|
+
| hkp-rt, embedded in an app | binds a port of its own | `http://<lan-ip>:<port>/` |
|
|
106
|
+
| Browser | hosts nothing; it consumes mounts | — |
|
|
107
|
+
|
|
108
|
+
Services that own a mount today: `http-server-subservices` (node, python,
|
|
109
|
+
hkp-rt), `http-server` (hkp-rt), `peer-server` (node, hkp-rt) and
|
|
110
|
+
`websocket-reader` (node).
|
|
111
|
+
|
|
112
|
+
### hkp-rt
|
|
113
|
+
|
|
114
|
+
The id is derived exactly as hkp-node derives it, with an empty tenant — hkp-rt
|
|
115
|
+
has one — so the same board on the same secret gets the same address. The
|
|
116
|
+
secret is `HKP_MOUNT_SECRET`, else kept at `~/.hkp/cpp/mount-secret`.
|
|
117
|
+
|
|
118
|
+
How a mounted request is served differs from the other two, because an hkp-rt
|
|
119
|
+
endpoint may hold a response open and stream into it, which the server's REST
|
|
120
|
+
framework cannot do. So the server's port is a **front door**
|
|
121
|
+
(`hkp-rt/lib/src/http/front_door.cpp`): a connection whose first request is for
|
|
122
|
+
`/hosted/<id>` is handed, socket and all, to the service that owns the mount;
|
|
123
|
+
anything else is passed through to the REST api, which listens on loopback on a
|
|
124
|
+
port nobody is told. Two things follow:
|
|
125
|
+
|
|
126
|
+
- **One request per connection.** Who a connection belongs to is decided once,
|
|
127
|
+
so what is passed through to the api is marked `Connection: close`. A
|
|
128
|
+
WebSocket upgrade is passed through as one.
|
|
129
|
+
- **The api still knows who is calling.** It trusts the machine's own UI without
|
|
130
|
+
a token, by the caller's address — and passed through, everything comes from
|
|
131
|
+
the same process. The front door says who the caller was in a header the api
|
|
132
|
+
believes only beside a secret this process alone knows; both are removed from
|
|
133
|
+
anything a caller sent.
|
|
134
|
+
|
|
135
|
+
Mounted, `host` and `port` in a board are accepted and not acted on.
|
|
136
|
+
`mountName` names the mount, defaulting to the service's id.
|
|
137
|
+
|
|
138
|
+
A host turns this on with `Server::enableMounts`. The standalone server does.
|
|
139
|
+
**The apps do not yet**: there an endpoint still binds the port its board names,
|
|
140
|
+
`"port": 0` asks the operating system for any free one, and whatever it got is
|
|
141
|
+
what the service reports and a saved board records. See the gaps below.
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Pointing at a mount
|
|
146
|
+
|
|
147
|
+
Since the address is assigned when the board loads, a board cannot hard-code it.
|
|
148
|
+
So a board names the **service** instead, and the address is resolved at connect
|
|
149
|
+
time.
|
|
150
|
+
|
|
151
|
+
Two things, with one job each:
|
|
152
|
+
|
|
153
|
+
| | Written by | Holds |
|
|
154
|
+
|---|---|---|
|
|
155
|
+
| the service's own target field (`url`, `peerHost`, …) | a person | a `hkp-mount://<runtimeId>/<serviceUuid>` reference, or a plain address |
|
|
156
|
+
| `__hkpMount` | machinery | the address a mount currently has — published by the owner, written onto a consumer by the coordinator |
|
|
157
|
+
|
|
158
|
+
```json
|
|
159
|
+
{
|
|
160
|
+
"serviceId": "http-client",
|
|
161
|
+
"state": {
|
|
162
|
+
"url": "hkp-mount://endpoint-node/echo-server",
|
|
163
|
+
"path": "/hello"
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
A consumer prefers `__hkpMount` when it holds an address and falls back to its
|
|
169
|
+
own field; a reference in *either* means "not resolved yet" rather than
|
|
170
|
+
something to dial. Because the two live in separate fields, resolution never
|
|
171
|
+
overwrites what was written — so a board saves and reopens with its reference
|
|
172
|
+
intact.
|
|
173
|
+
|
|
174
|
+
References are found by their **scheme**, wherever they appear in a service's
|
|
175
|
+
state, rather than by living in one agreed field. That is what lets a reference
|
|
176
|
+
go in whatever field a service already calls its target, and it is safe because
|
|
177
|
+
a `hkp-mount://` value cannot be mistaken for anything else — the same reason
|
|
178
|
+
`{{secret.…}}` is resolved wherever it occurs. A bare
|
|
179
|
+
`<runtimeId>/<serviceUuid>` would *not* be safe: it is indistinguishable from a
|
|
180
|
+
relative URL, and the hosts these boards run on resolve those against a base
|
|
181
|
+
that differs between builds (`hkp://` packaged, `http://` in dev). It is
|
|
182
|
+
deliberately not a path under the existing `hkp://` scheme either — that one
|
|
183
|
+
addresses servable resources, and a reference is not one.
|
|
184
|
+
|
|
185
|
+
Boards written before the split put the reference in `__hkpMount` itself. Those
|
|
186
|
+
keep working: it is a string in service state like any other, and it is found
|
|
187
|
+
the same way.
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## Who resolves a reference
|
|
192
|
+
|
|
193
|
+
Resolving one needs a view of the **whole board** — a runtime sees only its own
|
|
194
|
+
services, while a reference names a service somewhere else, possibly on another
|
|
195
|
+
machine. That view belongs to the board's **coordinator**, the instance that
|
|
196
|
+
owns the board: the browser for a playground or Readymade board, hkp-node for a
|
|
197
|
+
cloud board.
|
|
198
|
+
|
|
199
|
+
Two paths, depending on where the consumer lives:
|
|
200
|
+
|
|
201
|
+
- **A service the browser hosts** asks the coordinator whenever it needs the
|
|
202
|
+
address (`coordinator.resolveMount`), and retries. Peer Socket does this at
|
|
203
|
+
connect time.
|
|
204
|
+
- **A service on a remote runtime** cannot ask, so the coordinator pushes: as
|
|
205
|
+
soon as an address exists, it configures the consumer with the plain address —
|
|
206
|
+
the same value that service would have received had the board been exported.
|
|
207
|
+
|
|
208
|
+
An unresolved reference is **normal, not an error**. A board restores its
|
|
209
|
+
runtimes concurrently, so when a consumer is created its owner has usually not
|
|
210
|
+
published anything yet; a mount can also appear much later, when someone
|
|
211
|
+
unbypasses a server by hand. Consumers therefore wait rather than calling
|
|
212
|
+
something else.
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## Exporting, forking, and the reserved prefix
|
|
217
|
+
|
|
218
|
+
- **Export** substitutes the resolved address into the same field. A board sent
|
|
219
|
+
to another device is not the board that holds the referenced runtime — a
|
|
220
|
+
partner board drops runtimes the partner cannot reach — so a reference sent as
|
|
221
|
+
such would leave the receiver waiting forever. Because both forms live in one
|
|
222
|
+
field, the receiving service reads it exactly as it always does and needs to
|
|
223
|
+
know nothing about export. References that cannot be resolved are left
|
|
224
|
+
untouched rather than blanked, so a board exported before its runtime came up
|
|
225
|
+
still describes what it wanted.
|
|
226
|
+
- **Forking** a board regenerates every runtime id and service uuid, and rewrites
|
|
227
|
+
the ids *inside* mount references along with them, so the copy points at the
|
|
228
|
+
copy. An address rather than a reference is left alone: it may name something
|
|
229
|
+
outside this board entirely.
|
|
230
|
+
- **The `__hkp` prefix** marks a state property whose meaning is defined outside
|
|
231
|
+
the service holding it — generic board machinery reads and rewrites it. The
|
|
232
|
+
name is reserved: services must not use it for anything else.
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## Worked example
|
|
237
|
+
|
|
238
|
+
`mounted-endpoint-demo-board.json`: one hkp-node runtime hosts an endpoint, another
|
|
239
|
+
calls it, and no address appears anywhere in the board.
|
|
240
|
+
|
|
241
|
+
```json
|
|
242
|
+
{
|
|
243
|
+
"services": {
|
|
244
|
+
"endpoint-node": [
|
|
245
|
+
{
|
|
246
|
+
"uuid": "echo-server",
|
|
247
|
+
"serviceId": "http-server-subservices",
|
|
248
|
+
"state": { "bypass": false, "pipeline": [ … ] }
|
|
249
|
+
}
|
|
250
|
+
],
|
|
251
|
+
"caller-node": [
|
|
252
|
+
{
|
|
253
|
+
"uuid": "call",
|
|
254
|
+
"serviceId": "http-client",
|
|
255
|
+
"state": { "__hkpMount": "hkp-mount://endpoint-node/echo-server" }
|
|
256
|
+
}
|
|
257
|
+
]
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
On load, `echo-server` receives a mount and publishes its address into its own
|
|
263
|
+
`__hkpMount`. The coordinator sees both runtimes, matches the reference held by
|
|
264
|
+
`call`, and configures it with that address. The client starts calling.
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## Known gaps
|
|
269
|
+
|
|
270
|
+
Current limitations, stated so a board author is not surprised by them:
|
|
271
|
+
|
|
272
|
+
- **References name ids, not names.** `hkp-mount://<runtimeId>/<serviceUuid>`
|
|
273
|
+
only — a runtime's display name or a service's alias cannot be used, so
|
|
274
|
+
hand-written boards carry uuids.
|
|
275
|
+
- **An unresolvable reference looks exactly like a slow one.** Both leave the
|
|
276
|
+
consumer waiting, so a typo in a reference produces no error, just silence.
|
|
277
|
+
- **A board that still writes its reference into `__hkpMount` loses it on save.**
|
|
278
|
+
Serialization asks each service for its live state, and the coordinator has by
|
|
279
|
+
then written the resolved address into that field. Writing the reference in the
|
|
280
|
+
service's own field instead (`url`) avoids this entirely — nothing overwrites
|
|
281
|
+
it.
|
|
282
|
+
- **One mount per consumer.** The resolved address has one field to go in, so a
|
|
283
|
+
service naming two mounts gets only the first resolved (and a warning). A
|
|
284
|
+
service that needs two should host a pipeline instead.
|
|
285
|
+
- **hkp-rt embedded in an app still binds ports.** A standalone hkp-rt mounts
|
|
286
|
+
on its own port; the desktop and phone apps do not, because it changes who
|
|
287
|
+
can reach an endpoint. Today an endpoint in the desktop app binds every
|
|
288
|
+
interface whatever the app's *external access* setting says, and that is what
|
|
289
|
+
lets a phone reach it. Mounted, it would be reachable only as far as the
|
|
290
|
+
server's own port is — loopback, unless external access is on. Turning mounts
|
|
291
|
+
on there means the front door listening on every interface and refusing the
|
|
292
|
+
api to anyone but the machine itself, which is a decision about the app's
|
|
293
|
+
exposure and has not been taken.
|
|
294
|
+
|
|
295
|
+
---
|
|
296
|
+
|
|
297
|
+
## Where it lives in the code
|
|
298
|
+
|
|
299
|
+
| Concern | File |
|
|
300
|
+
|---|---|
|
|
301
|
+
| Vocabulary: field, scheme, finding references | `hkp-frontend/src/runtime/board/mount.ts` (`parseMountRef`, `findMountRefs`) |
|
|
302
|
+
| Resolution (browser as coordinator) | `hkp-frontend/src/core/coordinator.ts` |
|
|
303
|
+
| Pushing addresses to remote consumers | `hkp-frontend/src/core/mountPublication.ts` |
|
|
304
|
+
| Rewriting references when forking | `hkp-frontend/src/core/forkBoard.ts` |
|
|
305
|
+
| Mount registry, id derivation | `hkp-node/src/mounts.ts`, `hkp-python/src/hkp/mounts.py` |
|
|
306
|
+
| Resolution (hkp-node as coordinator) | `hkp-node/src/coordinator/session.ts` |
|
|
307
|
+
| C++ vocabulary | `hkp-rt/lib/src/mount.h` |
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
See also: **Coordinator** (`concepts/coordinator.md`) for who resolves a
|
|
312
|
+
reference, **Runtime** (`concepts/runtime.md`) for the host that assigns a
|
|
313
|
+
mount, and **Units and compositions** (`concepts/units.md`) for what happens to
|
|
314
|
+
a reference when a unit's runtime is renamed.
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
# Presets
|
|
2
|
+
|
|
3
|
+
A service's configuration as a file: written once, shared, and applied to any
|
|
4
|
+
service of that kind on any runtime that hosts it.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## The problem
|
|
9
|
+
|
|
10
|
+
Picking a service takes a second. Configuring it takes the afternoon.
|
|
11
|
+
|
|
12
|
+
`http-client` is the clearest case. Adding one is trivial; making it call
|
|
13
|
+
ElevenLabs is a URL, a path with a voice id in it, three headers one of which
|
|
14
|
+
carries a key, a query parameter for the audio format, and a JSON body in the
|
|
15
|
+
shape that API expects. None of that is *your* work — it is the same for
|
|
16
|
+
everybody who calls that API, and it is written down in a reference manual
|
|
17
|
+
somewhere. It is also, today, the part that cannot be handed to anyone:
|
|
18
|
+
sharing it means sharing the whole board built around it.
|
|
19
|
+
|
|
20
|
+
A board is the wrong unit for this. A board is an app. What a person wants to
|
|
21
|
+
pass along is much smaller: *this service, set up this way.*
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## What a preset is
|
|
26
|
+
|
|
27
|
+
A JSON document naming a service and carrying its state:
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"preset": "v1",
|
|
32
|
+
"id": "elevenlabs-text-to-speech",
|
|
33
|
+
"name": "ElevenLabs — Text to speech",
|
|
34
|
+
"serviceId": "http-client",
|
|
35
|
+
"serviceName": "ElevenLabs TTS",
|
|
36
|
+
"description": "Renders text as speech …",
|
|
37
|
+
"runtimes": ["rest"],
|
|
38
|
+
"secrets": {
|
|
39
|
+
"elevenlabs": {
|
|
40
|
+
"label": "ElevenLabs API key",
|
|
41
|
+
"url": "https://elevenlabs.io/app/settings/api-keys"
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"state": {
|
|
45
|
+
"url": "https://api.elevenlabs.io",
|
|
46
|
+
"path": "/v1/text-to-speech/21m00Tcm4TlvDq8ikWAM",
|
|
47
|
+
"method": "post",
|
|
48
|
+
"query": { "output_format": "mp3_44100_128" },
|
|
49
|
+
"headers": {
|
|
50
|
+
"xi-api-key": "{{secret.elevenlabs}}",
|
|
51
|
+
"content-type": "application/json",
|
|
52
|
+
"accept": "audio/mpeg"
|
|
53
|
+
},
|
|
54
|
+
"body": "{\"text\": \"…\", \"model_id\": \"eleven_multilingual_v2\"}",
|
|
55
|
+
"timeoutMs": 30000
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
| Field | Required | What it is |
|
|
61
|
+
| ------------- | -------- | --------------------------------------------------------------------------- |
|
|
62
|
+
| `preset` | yes | Format marker. `"v1"`, and how a preset file is recognised at all |
|
|
63
|
+
| `serviceId` | yes | The service this configures. Not a runtime |
|
|
64
|
+
| `name` | yes | What it is called in a menu |
|
|
65
|
+
| `state` | yes | The service's **whole** configuration |
|
|
66
|
+
| `id` | no | Stable identity, unique per service. Derived from the name when absent |
|
|
67
|
+
| `serviceName` | no | Names the instance when applied, and the palette card that offers it. Defaults to the preset's name when saved from a service |
|
|
68
|
+
| `description` | no | What it does, and what it expects on its input |
|
|
69
|
+
| `version` | no | The author's revision of this preset. Not the format version |
|
|
70
|
+
| `author`, `homepage` | no | Who wrote it, and where the API is documented |
|
|
71
|
+
| `tags` | no | What it *is* — the second axis the browser files it under |
|
|
72
|
+
| `runtimes` | no | The runtime classes it suits — a hint shown to a person, never a restriction |
|
|
73
|
+
| `secrets` | no | Display information for the aliases `state` refers to, keyed by alias |
|
|
74
|
+
| `params` | no | Defaults for the `{{param.name}}` references in `state`, substituted when the preset is applied |
|
|
75
|
+
| `origin` | no | The URL it was imported from, as typed. Written on import; what *Update from source* reads again |
|
|
76
|
+
|
|
77
|
+
A file holds one preset, or several under `{"presets": [ … ]}`.
|
|
78
|
+
|
|
79
|
+
### It is keyed by service, not by runtime
|
|
80
|
+
|
|
81
|
+
`http-client` exists on hkp-node and on hkp-rt with the same state contract, so
|
|
82
|
+
one preset applies wherever the service is hosted. Matching is by the
|
|
83
|
+
**canonical** service id: the browser's legacy `hookup.to/service/*` ids are
|
|
84
|
+
aliases of the bare slugs the runtimes are converging on, and they stay, so both
|
|
85
|
+
spellings name one service everywhere a preset is filed, listed or applied. `runtimes` says which side a
|
|
86
|
+
preset is *meant* for — an API that sets no CORS headers, or a call carrying a
|
|
87
|
+
credential, wants a remote runtime rather than the browser — but it is advice
|
|
88
|
+
printed next to the name, not a rule that stops anything.
|
|
89
|
+
|
|
90
|
+
### No runtime knows presets exist
|
|
91
|
+
|
|
92
|
+
Applying one is an ordinary `configure` call. There is no preset support in
|
|
93
|
+
hkp-node, hkp-rt, hkp-python or hkp-go, and none is needed: presets are a
|
|
94
|
+
document format and a step in the playground.
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Applying replaces, it does not merge
|
|
99
|
+
|
|
100
|
+
Applying a preset produces *exactly* the preset's configuration. Never a mix of
|
|
101
|
+
it and whatever the service happened to hold.
|
|
102
|
+
|
|
103
|
+
A half-applied preset is the worst of the available outcomes. A header or a
|
|
104
|
+
body left behind from a previous API silently breaks the request, while the
|
|
105
|
+
board looks exactly as the preset says it does. So `state` is the service's
|
|
106
|
+
whole configuration, and applying one resets the service first.
|
|
107
|
+
|
|
108
|
+
There is no cross-runtime "reset to defaults" call to do that with, and there
|
|
109
|
+
should not be one — the runtime already knows how to build a fresh service, and
|
|
110
|
+
that is what restoring a board does to every service it loads. Applying a
|
|
111
|
+
preset therefore **recreates the instance**: removed, created again under the
|
|
112
|
+
same uuid and at the same position, then configured. Facade widgets reference a
|
|
113
|
+
service by uuid and a [mount](mounts.md) address is derived from one, so keeping
|
|
114
|
+
it is what makes this an edit of a service rather than a replacement of it.
|
|
115
|
+
|
|
116
|
+
**Order matters, and it is the part that breaks quietly.** The new instance is
|
|
117
|
+
configured *before* the board is told it exists. A service panel initialises
|
|
118
|
+
itself once per service object — it reads the configuration the first time it
|
|
119
|
+
sees one, and after that only listens for notifications. Publish first and the
|
|
120
|
+
panel meets the instance in the gap between its creation and its configuration:
|
|
121
|
+
it shows the defaults, never hears the configure that follows, and the preset is
|
|
122
|
+
applied while the panel says it is not.
|
|
123
|
+
|
|
124
|
+
Two things survive that a preset does not touch:
|
|
125
|
+
|
|
126
|
+
- **`__hkp*` state**, which belongs to board machinery rather than to the
|
|
127
|
+
service holding it — `__hkpMount` is an address a coordinator published onto
|
|
128
|
+
this instance. It is lifted off the old instance and put back on the new one.
|
|
129
|
+
- **The service's name**, unless the preset gives a `serviceName`.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Secrets travel as references
|
|
134
|
+
|
|
135
|
+
A preset holds `{{secret.elevenlabs}}`, the same reference a board holds. The
|
|
136
|
+
value is resolved at the point of use and never enters service state (see
|
|
137
|
+
[secrets](../board-json.md)), which is what makes a preset safe to publish:
|
|
138
|
+
there is nothing in the file to redact.
|
|
139
|
+
|
|
140
|
+
The aliases a preset needs are **derived from its state**, not declared — the
|
|
141
|
+
state is where an alias is actually used, so the list cannot fall out of step
|
|
142
|
+
with what the preset does. The optional `secrets` block only says how to
|
|
143
|
+
describe one to a person: what the key is called, and where to get one.
|
|
144
|
+
|
|
145
|
+
A preset applies whether or not the key exists on this device. The panel says
|
|
146
|
+
which alias is missing; it does not refuse to configure the service, because the
|
|
147
|
+
preset is correct either way and the key is a separate errand.
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Where presets come from
|
|
152
|
+
|
|
153
|
+
Two origins, no difference in how they apply:
|
|
154
|
+
|
|
155
|
+
- **Built in** — shipped with the build, under `hkp-frontend/presets/<serviceId>/`
|
|
156
|
+
and listed in `hkp-frontend/src/presetRegistry.ts`. The equivalent of the demo
|
|
157
|
+
boards, and not deletable: there is nothing on the device to delete.
|
|
158
|
+
- **Kept on this device** — imported from a disk or a URL, or saved from a
|
|
159
|
+
service that was already configured the way someone wanted to keep it.
|
|
160
|
+
|
|
161
|
+
A preset fetched from a URL is fetched from whatever address serves the file; a
|
|
162
|
+
GitHub page link is rewritten to the raw file behind it, so pasting the page you
|
|
163
|
+
are looking at works.
|
|
164
|
+
|
|
165
|
+
### Where the device keeps them
|
|
166
|
+
|
|
167
|
+
Where is the host's business, the way where boards are saved is:
|
|
168
|
+
|
|
169
|
+
| Host | Store |
|
|
170
|
+
| --- | --- |
|
|
171
|
+
| Web | `localStorage` |
|
|
172
|
+
| Readymade desktop | `~/.hkp/presets/` |
|
|
173
|
+
| Readymade iOS | `Documents/Presets/` in the app's container |
|
|
174
|
+
| Readymade Android | `files/Presets/` in the app's storage |
|
|
175
|
+
|
|
176
|
+
The native apps keep **files, one per preset** — the file as it was imported,
|
|
177
|
+
or `<service>--<id>.json` for one saved from a service — served to the web app
|
|
178
|
+
over `hkp://presets` (`GET` lists every file unparsed, `POST` and `DELETE` take
|
|
179
|
+
a file name). So the folder *is* the library: it is read when the app starts,
|
|
180
|
+
and a preset file put there by hand is in it the next time. A file holding
|
|
181
|
+
several presets stays one file; changing or forgetting one of them rewrites it.
|
|
182
|
+
A file that is not a preset is skipped and reported in the console, not
|
|
183
|
+
refused. Presets an older build kept in `localStorage` are moved into the folder
|
|
184
|
+
the first time; if the host cannot list its store they stay where they were.
|
|
185
|
+
|
|
186
|
+
The seam is `PlatformCapabilities.presetStorage` (`platform/PlatformContext`),
|
|
187
|
+
attached when the host's `PlatformProvider` renders; the store itself is in
|
|
188
|
+
`core/presets.ts`.
|
|
189
|
+
|
|
190
|
+
### Imported from a URL, updated when asked
|
|
191
|
+
|
|
192
|
+
A preset imported from a URL remembers the address as `origin`, and the details
|
|
193
|
+
column offers **Update from source**, which fetches it again and keeps the newer
|
|
194
|
+
version in place of this device's copy. It never happens on its own: what an
|
|
195
|
+
author publishes later reaches this device when someone decides to take it.
|
|
196
|
+
A board that holds a copy of a block from the library keeps its copy either way.
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## Two axes: the service, then what it is
|
|
201
|
+
|
|
202
|
+
A preset is filed under **the service it configures**. That is the axis that
|
|
203
|
+
decides what can be done with it — an `http-client` preset is applicable to an
|
|
204
|
+
`http-client` and to nothing else — and it is the list a service's own menu
|
|
205
|
+
shows.
|
|
206
|
+
|
|
207
|
+
For most services that is the whole answer. Every `http-client` preset is a
|
|
208
|
+
request to some API, so the service already says what its presets are.
|
|
209
|
+
|
|
210
|
+
**It is not the answer for `sub-service`.** A sub-service's state *is* a
|
|
211
|
+
pipeline, so a preset of one is a reusable building block made of other
|
|
212
|
+
services — a meta-service. What those building blocks *do* varies completely: a
|
|
213
|
+
Telegram responder, a spectral analyser, a geocoding lookup. They share a
|
|
214
|
+
serviceId and nothing else. Filed by service alone they would be one
|
|
215
|
+
undifferentiated bucket that only grows, and the more useful the mechanism is,
|
|
216
|
+
the worse the bucket gets.
|
|
217
|
+
|
|
218
|
+
So a preset says what it is, in `tags`:
|
|
219
|
+
|
|
220
|
+
```json
|
|
221
|
+
"tags": ["Messaging"]
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
and the browser puts a **tag column after the service column**:
|
|
225
|
+
|
|
226
|
+
```
|
|
227
|
+
Presets ▸ sub-service ▸ Messaging ▸ Telegram responder
|
|
228
|
+
▸ Audio ▸ Spectral analyser
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
Tags work the way the folders in the board browser work: a preset with tags
|
|
232
|
+
lives in each of its tag folders, and a preset with none sits in the service
|
|
233
|
+
folder itself — the way an unfiled board sits at the root of its source. So the
|
|
234
|
+
column appears exactly where someone has said something, and a service whose
|
|
235
|
+
presets are untagged still reads as a plain list. That is why the presets this
|
|
236
|
+
build ships carry no tags: a handful of `http-client` requests is a list, not a
|
|
237
|
+
filing problem.
|
|
238
|
+
|
|
239
|
+
Tags are compared without case — `Messaging` and `messaging` are one tag, not
|
|
240
|
+
two folders that look alike — and kept in the spelling they first arrived in.
|
|
241
|
+
|
|
242
|
+
**A tag is part of the file.** Refiling a preset rewrites it, which is what makes
|
|
243
|
+
the filing travel: someone who imports your building block gets it filed the way
|
|
244
|
+
you filed it. A preset is tagged when it is saved (the field is in the save
|
|
245
|
+
dialog) and re-tagged in the details column; a shipped preset's tags are part of
|
|
246
|
+
the build, like everything else about it.
|
|
247
|
+
|
|
248
|
+
### What a sub-service preset is, and is not
|
|
249
|
+
|
|
250
|
+
It is a pipeline, captured. Applying one rebuilds that pipeline inside the
|
|
251
|
+
sub-service, because applying any preset replaces the service's whole state.
|
|
252
|
+
|
|
253
|
+
It is less portable than a simple preset, for two reasons that are worth telling
|
|
254
|
+
apart. The state names the nested services and carries their state, so a
|
|
255
|
+
composed preset can only be applied where those services **exist** — that is
|
|
256
|
+
real, and permanent, and `runtimes` is where to say which side it is meant for.
|
|
257
|
+
|
|
258
|
+
The other reason is temporary: the browser's older service ids carry a
|
|
259
|
+
`hookup.to/service/` prefix where the backend runtimes use a bare slug, so the
|
|
260
|
+
same nested service is spelled two ways. The runtimes are converging on the bare
|
|
261
|
+
slug, and the prefixed ids stay as aliases so existing boards keep loading.
|
|
262
|
+
Anything asking *is this the same service* therefore asks it of the canonical id
|
|
263
|
+
— which is what the Presets source files by, what a service's menu matches on,
|
|
264
|
+
and what applying one checks — so a preset authored against either spelling
|
|
265
|
+
applies to the other. Neither a board nor a preset is rewritten; they keep the
|
|
266
|
+
id they were authored with.
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## Where presets are used
|
|
271
|
+
|
|
272
|
+
**Organising them is the start page's job.** The Presets source lists a folder
|
|
273
|
+
per service that has one, and the presets themselves as the leaves — the same
|
|
274
|
+
browser the boards are organised in, with a details column saying where a preset
|
|
275
|
+
came from, what it needs, and what is in it, and the actions that belong to a
|
|
276
|
+
file: export it, delete it. Importing one is the source's own action.
|
|
277
|
+
|
|
278
|
+
**A composed preset is a building block, and sits in the palette.** A preset of
|
|
279
|
+
`sub-service` is a pipeline someone built and kept — a service made of services
|
|
280
|
+
— so the sidebar lists it beside the primitives, as a card of its own under its
|
|
281
|
+
own name, dragged onto a runtime the same way. Dropping one creates the
|
|
282
|
+
sub-service, names it after the preset and configures it from the preset, in
|
|
283
|
+
that order: a panel reads a service's configuration once, when it first sees the
|
|
284
|
+
instance, so the configure has to happen before the board is told the service
|
|
285
|
+
exists.
|
|
286
|
+
|
|
287
|
+
A card *is* the preset, so it carries the preset's name — not `serviceName`,
|
|
288
|
+
which is the name a preset gives a service it is **applied** to, and which a
|
|
289
|
+
preset captured from a service inherits from it (a second card called
|
|
290
|
+
"SubService", beside the SubService primitive it came from).
|
|
291
|
+
|
|
292
|
+
What is published to the board is the state the service holds after the
|
|
293
|
+
configure, not the one its runtime answered the create with. A nested pipeline
|
|
294
|
+
is rendered straight off the board's descriptor, so publishing the create's
|
|
295
|
+
answer leaves a sub-service showing as empty while its runtime holds the whole
|
|
296
|
+
pipeline — right in the configuration dialog, wrong on the board.
|
|
297
|
+
|
|
298
|
+
A card appears only where the runtime has a `sub-service` to put it in, and only
|
|
299
|
+
where the preset belongs — `runtimes` is how a composed preset says which side
|
|
300
|
+
it was built for, since it names nested services that one registry has and
|
|
301
|
+
another may not.
|
|
302
|
+
|
|
303
|
+
**A composed preset with params is a block, and a drop uses it.** A
|
|
304
|
+
sub-service preset that declares `params` is written to be placed several times
|
|
305
|
+
with different values, so the palette marks it as a block and dropping it
|
|
306
|
+
places a [use](blocks.md) rather than a copy: the preset's definition is copied
|
|
307
|
+
into the board's own `blocks` — once; a second drop names the copy the board
|
|
308
|
+
already holds — and the new entry is a use of it, varied from its bar. The board
|
|
309
|
+
then opens anywhere, with or without this library. The library's card stays
|
|
310
|
+
where it is and stands for the board's copy too; that copy gets a card of its
|
|
311
|
+
own once it differs (after *Edit block*). Without `params` there is nothing to
|
|
312
|
+
vary per use, and a drop applies the preset as above. The build ships one:
|
|
313
|
+
**ntfy notification**, which sends its input as a push notification through
|
|
314
|
+
[ntfy](https://ntfy.sh), with the topic, title, priority, tags and server as
|
|
315
|
+
params. Its topic defaults to `readymade-{{random}}`: every use is given a
|
|
316
|
+
topic of its own ([a value made for each use](blocks.md)), since anyone who
|
|
317
|
+
knows an ntfy.sh topic can read it.
|
|
318
|
+
|
|
319
|
+
**Picking one is the playground's job.** A service's menu has a *Presets*
|
|
320
|
+
submenu listing what is available for that service and nothing else. The menu
|
|
321
|
+
answers one question — which preset do I want on this service — and a list of
|
|
322
|
+
names is the whole of that answer; a panel there would be a second place to
|
|
323
|
+
manage the same files.
|
|
324
|
+
|
|
325
|
+
The one action that cannot live on the start page is the reverse direction:
|
|
326
|
+
what is worth keeping is a service someone has working in front of them, and
|
|
327
|
+
that only exists in a board. So *Save configuration…* sits at the foot of the
|
|
328
|
+
same submenu, and what it produces is an ordinary preset on this device — in the
|
|
329
|
+
Presets source, in every menu for that service, and exportable as a file, which
|
|
330
|
+
is the only form in which it reaches anybody else.
|
|
331
|
+
|
|
332
|
+
On a phone both are one row of a service's sheet, **Presets**, which opens the
|
|
333
|
+
list and the saving in one sheet; the add-service sheet offers composed presets
|
|
334
|
+
and blocks behind its Building Blocks tab, from the same list the sidebar draws
|
|
335
|
+
(`core/palette.ts`). The iOS and Android apps keep presets as files in their
|
|
336
|
+
presets folder (`hkp://presets`), as the desktop does. A deployed board can be
|
|
337
|
+
saved from but not applied to: applying recreates the service.
|
|
338
|
+
|
|
339
|
+
The two surfaces read one list. The store says when it changes, because
|
|
340
|
+
`localStorage` reports nothing to the tab that wrote it, a native host's folder
|
|
341
|
+
is read after the app has started, and a preset imported on the start page has
|
|
342
|
+
to appear in the playground's menu without a reload.
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
## Presets, sub-services and units
|
|
347
|
+
|
|
348
|
+
A `SubService`'s state *is* its pipeline, so a preset of one is a reusable
|
|
349
|
+
pipeline — several services, wired in order, as one file. This needs no second
|
|
350
|
+
mechanism: it is an ordinary preset whose `state` happens to contain a list of
|
|
351
|
+
services. What it needs is a way to say what it is, which is what tags are for.
|
|
352
|
+
|
|
353
|
+
That is a different thing from [units](units.md), which assemble whole
|
|
354
|
+
*runtimes* into a board. A preset never crosses a service boundary; a unit never
|
|
355
|
+
reaches inside one.
|
|
356
|
+
|
|
357
|
+
And it is the same document as a [block](blocks.md), with the other verb: a
|
|
358
|
+
preset is *applied* — copied, independent from then on — while a block is
|
|
359
|
+
*used*, and every use follows its definition. A block is read as a preset without
|
|
360
|
+
the format marker, and `params` means the same in both.
|