@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,5 @@
|
|
|
1
|
+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
2
|
+
|
|
3
|
+
exports[`Service UI Future Enhancements > Visual Regression > matches snapshot for AggregatorUI initial render 1`] = `"<div id="__dynamic_id__"><div class="flex items-center"><div class="hkp-service-card" style="user-select: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); transition: border 800ms; border: 1px solid lightgray; border-radius: 0; text-align: center; background-color: white; margin: var(--hkp-svc-card-margin-y, 10px) 0px; box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); overflow: hidden;"><div class="bg-white" style="cursor: move;" draggable="true"><div data-service-header="true" class="flex items-end"><button class="inline-flex items-center justify-center whitespace-nowrap rounded-none text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 hover:text-accent p-4 h-min w-min" type="button" id="__dynamic_id__" aria-haspopup="menu" aria-expanded="false" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-menu" aria-hidden="true"><path d="M4 5h16"></path><path d="M4 12h16"></path><path d="M4 19h16"></path></svg></button><div class="w-full flex mb-4 font-sans"><button class="inline-flex items-center justify-center font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 hover:text-accent cursor-text p-0 h-min rounded-none whitespace-nowrap text-base font-sans tracking-widest">Test Service</button></div><button class="inline-flex items-center justify-center whitespace-nowrap rounded-none font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border border-input bg-background hover:text-accent-foreground px-4 py-2 text-base tracking-widest h-[50px] w-[50px] border-none hover:bg-sky"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-power mt-0 mb-1 mr-0 w-min h-min hover:stroke-sky-400 stroke-gray-400" aria-hidden="true" name="power off"><path d="M12 2v10"></path><path d="M18.4 6.6a9 9 0 1 1-12.77.04"></path></svg></button></div></div><div style="position: relative;"><div class="h-full w-full overflow-y-auto"><div class="flex flex-col font-sans px-4 h-full w-full pb-2"><div style="height: var(--hkp-svc-body-pad-top, 8px);"></div><div class="flex flex-col gap-2"><div class="flex items-center h-full w-full gap-2"><h4 class="text-left tracking-[6px] pt-0 whitespace-nowrap undefined">Property</h4><input class="flex w-full border border-input bg-background ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 m-0 p-0 border-x-0 border-t-0 border-b-1 rounded-none h-min pl-1 text-base undefined text-ellipsis" spellcheck="false" value="temperature"></div><div class="pt-4"><div class="flex-col undefined "><h3 class="text-left tracking-[6px] text-gray-300 undefined">Mode</h3><div role="radiogroup" aria-required="false" data-disabled="" dir="ltr" class="gap-2 py-2 flex" tabindex="-1" style="outline: none;"><div class="flex items-center space-x-2"><button type="button" role="radio" aria-checked="true" data-state="checked" data-disabled="" disabled="" value="max value count" class="aspect-square h-4 w-4 rounded-full border border-primary text-primary ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50" id="__dynamic_id__" tabindex="-1" data-radix-collection-item=""><span data-state="checked" data-disabled="" class="flex items-center justify-center"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-circle h-2.5 w-2.5 fill-current text-current" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle></svg></span></button><label class="font-medium peer-disabled:cursor-not-allowed peer-disabled:opacity-70 text-base capitalize tracking-widest" for="__dynamic_id__" aria-disabled="true">max value count</label></div></div></div></div><div class="flex items-end gap-2 undefined"><h4 class="text-left tracking-[6px] hkp-svc-field-label">Interval</h4><input class="flex rounded-md border-input bg-background ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 w-[60px] border-0 border-none p-0 h-min text-lg" type="number" value="100"><div class="pl-2 tracking-[1px] text-xs">ms</div></div></div></div><div style="position: absolute; bottom: 0px; right: 0px; width: 12px; height: 12px; cursor: nwse-resize;"><svg viewBox="0 0 10 10"><polygon points="0,10, 10,0, 10,10" style="fill: #9f9f9f; stroke: transparent; stroke-width: 1;"></polygon></svg></div></div></div></div><span data-state="closed"><button type="button" aria-label="Inspect input and output" style="margin-top: 18px; margin-left: 4px; position: relative; z-index: 21;" aria-haspopup="dialog" aria-expanded="false" aria-controls="__dynamic_id__" data-state="closed"><svg width="30" height="12" viewBox="0 0 30 12" fill="none" stroke="currentColor" stroke-width="0.5" stroke-linecap="round" style="opacity: 0.35; position: relative; top: -1px; transition: stroke 400ms, opacity 400ms, stroke-width 400ms;"><path d="M1 4 C7 1 11 7 18 4 C25 1 29 7 36 4 C43 1 47 7 54 4 C61 1 65 7 73 4"></path><path d="M1 8 C7 5 11 11 18 8 C25 5 29 11 36 8 C43 5 47 11 54 8 C61 5 65 11 73 8"></path></svg></button></span></div></div>"`;
|
|
4
|
+
|
|
5
|
+
exports[`Service UI Future Enhancements > Visual Regression > matches snapshot for InputUI initial render 1`] = `"<div id="__dynamic_id__"><div class="flex items-center"><div class="hkp-service-card" style="user-select: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); transition: border 800ms; border: 1px solid lightgray; border-radius: 0; text-align: center; background-color: white; margin: var(--hkp-svc-card-margin-y, 10px) 0px; box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); overflow: hidden;"><div class="bg-white" style="cursor: move;" draggable="true"><div data-service-header="true" class="flex items-end"><button class="inline-flex items-center justify-center whitespace-nowrap rounded-none text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 hover:text-accent p-4 h-min w-min" type="button" id="__dynamic_id__" aria-haspopup="menu" aria-expanded="false" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-menu" aria-hidden="true"><path d="M4 5h16"></path><path d="M4 12h16"></path><path d="M4 19h16"></path></svg></button><div class="w-full flex mb-4 font-sans"><button class="inline-flex items-center justify-center font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 hover:text-accent cursor-text p-0 h-min rounded-none whitespace-nowrap text-base font-sans tracking-widest">Test Service</button></div><button class="inline-flex items-center justify-center whitespace-nowrap rounded-none font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border border-input bg-background hover:text-accent-foreground px-4 py-2 text-base tracking-widest h-[50px] w-[50px] border-none hover:bg-sky"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-power mt-0 mb-1 mr-0 w-min h-min hover:stroke-sky-400 stroke-gray-400" aria-hidden="true" name="power off"><path d="M12 2v10"></path><path d="M18.4 6.6a9 9 0 1 1-12.77.04"></path></svg></button></div></div><div style="position: relative;"><div class="h-full w-full overflow-y-auto" style="width: 480px;"><div class="flex flex-col font-sans px-4 h-full w-full pb-4"><div style="height: var(--hkp-svc-body-pad-top, 8px);"></div><div class="flex flex-col gap-2"><div><h4 class="text-left tracking-[6px] hkp-svc-field-label pb-1">Input Mode</h4><div role="radiogroup" aria-label="Input Mode" style="display: flex; gap: 5px;"><button type="button" role="radio" aria-checked="true" tabindex="0" class="hkp-rpill sel capitalize">eventsource</button><button type="button" role="radio" aria-checked="false" tabindex="-1" class="hkp-rpill capitalize">websocket</button></div></div><div class="flex relative w-full items-center pr-2 "><div class="flex items-center h-full w-full gap-2"><h4 class="text-left tracking-[6px] pt-0 whitespace-nowrap hkp-svc-field-label">URL</h4><input class="flex w-full border border-input ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 m-0 p-0 border-x-0 border-t-0 border-b-1 rounded-none h-min pl-1 font-menu text-[0.87rem] mr-2 bg-transparent undefined text-ellipsis" spellcheck="false" value="https://example.com/stream"></div></div></div></div><div style="position: absolute; bottom: 0px; right: 0px; width: 12px; height: 12px; cursor: nwse-resize;"><svg viewBox="0 0 10 10"><polygon points="0,10, 10,0, 10,10" style="fill: #9f9f9f; stroke: transparent; stroke-width: 1;"></polygon></svg></div></div></div></div><span data-state="closed"><button type="button" aria-label="Inspect input and output" style="margin-top: 18px; margin-left: 4px; position: relative; z-index: 21;" aria-haspopup="dialog" aria-expanded="false" aria-controls="__dynamic_id__" data-state="closed"><svg width="30" height="12" viewBox="0 0 30 12" fill="none" stroke="currentColor" stroke-width="0.5" stroke-linecap="round" style="opacity: 0.35; position: relative; top: -1px; transition: stroke 400ms, opacity 400ms, stroke-width 400ms;"><path d="M1 4 C7 1 11 7 18 4 C25 1 29 7 36 4 C43 1 47 7 54 4 C61 1 65 7 73 4"></path><path d="M1 8 C7 5 11 11 18 8 C25 5 29 11 36 8 C43 5 47 11 54 8 C61 5 65 11 73 8"></path></svg></button></span></div></div>"`;
|
package/bundle/hkp-frontend/src/runtime/browser/services/tests/audio-input-permissions.test.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
|
|
3
|
+
import AudioInputDescriptor from "../AudioInput";
|
|
4
|
+
|
|
5
|
+
afterEach(() => {
|
|
6
|
+
vi.restoreAllMocks();
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
describe("Audio Input permissions", () => {
|
|
10
|
+
it("reports a denied startup request without rejecting board construction", async () => {
|
|
11
|
+
const denial = new DOMException("Permission denied", "NotAllowedError");
|
|
12
|
+
Object.defineProperty(navigator, "mediaDevices", {
|
|
13
|
+
configurable: true,
|
|
14
|
+
value: { getUserMedia: vi.fn().mockRejectedValue(denial) },
|
|
15
|
+
});
|
|
16
|
+
const app = {
|
|
17
|
+
notify: vi.fn(),
|
|
18
|
+
next: vi.fn(),
|
|
19
|
+
sendAction: vi.fn(),
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const service = AudioInputDescriptor.create(
|
|
23
|
+
app as any,
|
|
24
|
+
"test-board",
|
|
25
|
+
{} as any,
|
|
26
|
+
"audio-input-1",
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
// Let the constructor's best-effort media request settle.
|
|
30
|
+
await Promise.resolve();
|
|
31
|
+
await Promise.resolve();
|
|
32
|
+
|
|
33
|
+
expect(app.sendAction).toHaveBeenCalledWith({
|
|
34
|
+
action: "notification",
|
|
35
|
+
service,
|
|
36
|
+
payload: {
|
|
37
|
+
type: "error",
|
|
38
|
+
message: "Could not access audio input: Permission denied",
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
});
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
|
|
3
|
+
import MapDescriptor from "../base/Map";
|
|
4
|
+
import board from "../../../../../../boards/audiolize-board.json";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The lane each track takes for itself.
|
|
8
|
+
*
|
|
9
|
+
* The board fans a keypress into two notes, and the two aggregators after them
|
|
10
|
+
* each want one of those notes. Under `tracks` every track is given the whole
|
|
11
|
+
* array, so each says which element is its own — and a Map given an array maps
|
|
12
|
+
* over its *elements* unless told the array is the subject. Missing that, every
|
|
13
|
+
* lane answered null for every note, and the synth was handed a grid of
|
|
14
|
+
* nothing.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
const MapService = MapDescriptor.Map;
|
|
18
|
+
|
|
19
|
+
function aggregates() {
|
|
20
|
+
return (board.services.ui as any[]).find((svc) => svc.uuid === "aggregates-svc");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function laneMaps() {
|
|
24
|
+
return (aggregates().state.tracks as any[]).map((track) => track.pipeline[0]);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async function run(state: Record<string, unknown>, input: unknown) {
|
|
28
|
+
const app = {
|
|
29
|
+
notify: vi.fn(),
|
|
30
|
+
next: vi.fn(),
|
|
31
|
+
sendAction: vi.fn(),
|
|
32
|
+
processRuntimeByName: vi.fn(),
|
|
33
|
+
getRuntimeVariable: vi.fn(() => ({})),
|
|
34
|
+
setRuntimeVariable: vi.fn(),
|
|
35
|
+
};
|
|
36
|
+
const service = new MapService(app as any, "test-board", {} as any, "map-1") as any;
|
|
37
|
+
service.configure(state);
|
|
38
|
+
return await service.process(input);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
describe("audiolize's lanes", () => {
|
|
42
|
+
it("takes one note per track out of the notes the tracks before it answered", async () => {
|
|
43
|
+
const notes = [{ note: "D4" }, { note: "C4" }];
|
|
44
|
+
const answers = await Promise.all(
|
|
45
|
+
laneMaps().map((lane) => run(lane.state, notes)),
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
expect(answers).toEqual([{ note: "D4" }, { note: "C4" }]);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("says the array is the subject, not each element of it", () => {
|
|
52
|
+
for (const lane of laneMaps()) {
|
|
53
|
+
expect(lane.state.arrayMode).toBe("single");
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it("stops the pass when neither aggregator had anything to play", async () => {
|
|
58
|
+
// The aggregators collect over an interval and emit on their own, so on the
|
|
59
|
+
// pass that feeds them they answer nothing. Handing the synth a pair of
|
|
60
|
+
// nulls on every keystroke is noise; the reducer is where a board says that
|
|
61
|
+
// silence means stop.
|
|
62
|
+
const reduce = aggregates().state.reduce[0];
|
|
63
|
+
|
|
64
|
+
expect(await run(reduce.state, { results: [null, null] })).toBeNull();
|
|
65
|
+
expect(await run(reduce.state, { results: [null, { note: "C4" }] })).toEqual([
|
|
66
|
+
null,
|
|
67
|
+
{ note: "C4" },
|
|
68
|
+
]);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
|
|
3
|
+
import HoldDescriptor from "../Hold";
|
|
4
|
+
import { BrowserSubService } from "../BrowserSubService";
|
|
5
|
+
import { createSlotStore } from "../../../slots";
|
|
6
|
+
import board from "../../../../../../boards/hold-scopes-demo-board.json";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* A scope in the browser runtime: what it keeps to itself, what leaves it, and
|
|
10
|
+
* what a board can name inside it.
|
|
11
|
+
*
|
|
12
|
+
* The demo board is the case this has to carry — two scopes on one runtime,
|
|
13
|
+
* one running on its own schedule and passing nothing on, the other entered by
|
|
14
|
+
* a button and answering from the cell the first one wrote.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
function makeApp(slots = createSlotStore()) {
|
|
18
|
+
return {
|
|
19
|
+
notify: vi.fn(),
|
|
20
|
+
next: vi.fn(),
|
|
21
|
+
sendAction: vi.fn(),
|
|
22
|
+
slots: () => slots,
|
|
23
|
+
} as any;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Every serviceUuid the facade mentions, however deeply nested. */
|
|
27
|
+
function referenced(node: unknown, found = new Set<string>()): Set<string> {
|
|
28
|
+
if (Array.isArray(node)) {
|
|
29
|
+
node.forEach((child) => referenced(child, found));
|
|
30
|
+
return found;
|
|
31
|
+
}
|
|
32
|
+
if (node && typeof node === "object") {
|
|
33
|
+
for (const [key, value] of Object.entries(node)) {
|
|
34
|
+
if (key === "serviceUuid" && typeof value === "string") {
|
|
35
|
+
found.add(value);
|
|
36
|
+
} else {
|
|
37
|
+
referenced(value, found);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return found;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function scopeOf(uuid: string) {
|
|
45
|
+
return (board.services.ui as any[]).find((svc) => svc.uuid === uuid);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
describe("the Hold-across-scopes demo board", () => {
|
|
49
|
+
it("is two scopes, and the ticker passes nothing on", () => {
|
|
50
|
+
// What a Stopper between them would have said, said by the flow that ends.
|
|
51
|
+
const ticker = scopeOf("ticker");
|
|
52
|
+
expect(ticker.serviceId).toBe("sub-service");
|
|
53
|
+
expect(ticker.state.stopPropagation).toBe(true);
|
|
54
|
+
expect(scopeOf("reader").state.stopPropagation).toBeUndefined();
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it("has both scopes hold in the runtime's cells", () => {
|
|
58
|
+
// One slot name reaching across two scopes is the whole arrangement, and
|
|
59
|
+
// it only works because both say they inherit. Left alone a scope keeps
|
|
60
|
+
// its cells to itself, which would leave the reader answering nothing.
|
|
61
|
+
for (const uuid of ["ticker", "reader"]) {
|
|
62
|
+
expect(scopeOf(uuid).state.scope).toEqual({ slots: "inherit" });
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it("names the two ends of one slot", () => {
|
|
67
|
+
const writer = scopeOf("ticker").state.pipeline.at(-1);
|
|
68
|
+
const reader = scopeOf("reader").state.pipeline[0];
|
|
69
|
+
expect(writer.state.op).toBe("write");
|
|
70
|
+
expect(reader.state.op).toBe("read");
|
|
71
|
+
expect(reader.state.slot).toBe(writer.state.slot);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it("addresses what it reads by the path through the scope holding it", () => {
|
|
75
|
+
// A service inside a scope is named by where it sits, so moving one
|
|
76
|
+
// between scopes is visible in the board rather than silent.
|
|
77
|
+
expect([...referenced(board.facade)].sort()).toEqual([
|
|
78
|
+
"reader",
|
|
79
|
+
"reader.serve",
|
|
80
|
+
"ticker.keep",
|
|
81
|
+
]);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
describe("a browser scope", () => {
|
|
86
|
+
it("passes its result on unless it says otherwise", async () => {
|
|
87
|
+
const scope = new BrowserSubService(makeApp(), "board", {} as any, "scope");
|
|
88
|
+
scope.configure({ pipeline: [] });
|
|
89
|
+
// An empty scope is a wire, which keeps a half-built board legible.
|
|
90
|
+
expect(await scope.process({ mark: true })).toEqual({ mark: true });
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it("answers nothing when it says it stops", async () => {
|
|
94
|
+
const scope = new BrowserSubService(makeApp(), "board", {} as any, "scope");
|
|
95
|
+
scope.configure({ stopPropagation: true, pipeline: [] });
|
|
96
|
+
expect(await scope.process({ mark: true })).toBeNull();
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it("reports what it keeps to itself, both fields, always", () => {
|
|
100
|
+
// Reported even at their defaults, like the bypass beside them: a saved
|
|
101
|
+
// board then says outright what each scope does with its answer and its
|
|
102
|
+
// cells, instead of leaving a reader to infer a boundary.
|
|
103
|
+
const scope = new BrowserSubService(makeApp(), "board", {} as any, "scope");
|
|
104
|
+
expect(scope.state.stopPropagation).toBe(false);
|
|
105
|
+
expect(scope.state.scope).toEqual({ slots: "own" });
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
describe("two Holds naming one slot", () => {
|
|
110
|
+
it("meet when the scopes around them inherit the runtime's cells", () => {
|
|
111
|
+
// The demo board's arrangement, without the timer: the cell is what makes
|
|
112
|
+
// a value produced on one schedule readable on another.
|
|
113
|
+
const slots = createSlotStore();
|
|
114
|
+
const writer = HoldDescriptor.create(
|
|
115
|
+
makeApp(slots),
|
|
116
|
+
"board",
|
|
117
|
+
{} as any,
|
|
118
|
+
"keep",
|
|
119
|
+
) as any;
|
|
120
|
+
const reader = HoldDescriptor.create(
|
|
121
|
+
makeApp(slots),
|
|
122
|
+
"board",
|
|
123
|
+
{} as any,
|
|
124
|
+
"serve",
|
|
125
|
+
) as any;
|
|
126
|
+
writer.configure({ slot: "latest", op: "write" });
|
|
127
|
+
reader.configure({ slot: "latest", op: "read" });
|
|
128
|
+
|
|
129
|
+
writer.process({ count: 3 });
|
|
130
|
+
expect(reader.process(undefined)).toEqual({ count: 3 });
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
describe("what a scope can say about its cells", () => {
|
|
135
|
+
it("lists them, and reports a write or a removal to whoever is watching", () => {
|
|
136
|
+
// What a panel needs of a store: everything in it, word that it changed —
|
|
137
|
+
// a cell is written by whichever pipeline happens to run, not by the one
|
|
138
|
+
// being looked at — and a way to take one away again.
|
|
139
|
+
const slots = createSlotStore();
|
|
140
|
+
const seen = vi.fn();
|
|
141
|
+
const stop = slots.watch(seen);
|
|
142
|
+
|
|
143
|
+
slots.set("latest", { triggerCount: 3 });
|
|
144
|
+
expect(slots.entries()).toEqual([["latest", { triggerCount: 3 }]]);
|
|
145
|
+
expect(seen).toHaveBeenCalledTimes(1);
|
|
146
|
+
|
|
147
|
+
slots.remove("latest");
|
|
148
|
+
expect(slots.entries()).toEqual([]);
|
|
149
|
+
expect(seen).toHaveBeenCalledTimes(2);
|
|
150
|
+
// Removing what is not there says nothing happened, because nothing did.
|
|
151
|
+
slots.remove("latest");
|
|
152
|
+
expect(seen).toHaveBeenCalledTimes(2);
|
|
153
|
+
|
|
154
|
+
stop();
|
|
155
|
+
slots.set("latest", { triggerCount: 4 });
|
|
156
|
+
expect(seen).toHaveBeenCalledTimes(2);
|
|
157
|
+
expect(slots.entries()).toEqual([["latest", { triggerCount: 4 }]]);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
it("calls the cells inherited only when they are the ones around it", async () => {
|
|
161
|
+
// Which store a scope reached, rather than what it asked for: the two
|
|
162
|
+
// differ where a scope says `inherit` and nothing around it has cells.
|
|
163
|
+
const runtimeSlots = createSlotStore();
|
|
164
|
+
const inheriting = new BrowserSubService(
|
|
165
|
+
makeApp(runtimeSlots),
|
|
166
|
+
"board",
|
|
167
|
+
{} as any,
|
|
168
|
+
"reader",
|
|
169
|
+
);
|
|
170
|
+
inheriting.configure({ scope: { slots: "inherit" }, pipeline: [] });
|
|
171
|
+
await (inheriting as any)._scopeBuilding;
|
|
172
|
+
expect(inheriting.slotsInUse()).toEqual({
|
|
173
|
+
store: runtimeSlots,
|
|
174
|
+
inherited: true,
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
const owning = new BrowserSubService(
|
|
178
|
+
makeApp(runtimeSlots),
|
|
179
|
+
"board",
|
|
180
|
+
{} as any,
|
|
181
|
+
"unit",
|
|
182
|
+
);
|
|
183
|
+
owning.configure({ scope: { slots: "own" }, pipeline: [] });
|
|
184
|
+
await (owning as any)._scopeBuilding;
|
|
185
|
+
const own = owning.slotsInUse();
|
|
186
|
+
expect(own.inherited).toBe(false);
|
|
187
|
+
expect(own.store).not.toBe(runtimeSlots);
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
describe("changing what leaves a scope", () => {
|
|
192
|
+
it("says it without rebuilding what the scope is running", async () => {
|
|
193
|
+
// Read on the way out of every call, so saying it is all it takes: a
|
|
194
|
+
// scope told to keep its answer to itself should not lose the Timer it
|
|
195
|
+
// was holding in the telling.
|
|
196
|
+
const app = makeApp(createSlotStore());
|
|
197
|
+
const scope = new BrowserSubService(app, "board", {} as any, "read");
|
|
198
|
+
scope.configure({ pipeline: [] });
|
|
199
|
+
await (scope as any)._scopeBuilding;
|
|
200
|
+
|
|
201
|
+
const built = (scope as any)._scope;
|
|
202
|
+
expect(scope.state.stopPropagation).toBe(false);
|
|
203
|
+
|
|
204
|
+
scope.configure({ stopPropagation: true });
|
|
205
|
+
|
|
206
|
+
expect(scope.state.stopPropagation).toBe(true);
|
|
207
|
+
expect((scope as any)._scope).toBe(built);
|
|
208
|
+
expect(app.notify).toHaveBeenCalledWith(scope, { stopPropagation: true });
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
it("answers nothing once it does, whatever the pipeline produced", async () => {
|
|
212
|
+
// The half of it a panel is promising: the services after this one stop
|
|
213
|
+
// running from it the moment the choice is made.
|
|
214
|
+
const scope = new BrowserSubService(
|
|
215
|
+
makeApp(createSlotStore()),
|
|
216
|
+
"board",
|
|
217
|
+
{} as any,
|
|
218
|
+
"read",
|
|
219
|
+
);
|
|
220
|
+
scope.configure({ pipeline: [] });
|
|
221
|
+
await (scope as any)._scopeBuilding;
|
|
222
|
+
|
|
223
|
+
expect(await scope.process({ carried: true })).toEqual({ carried: true });
|
|
224
|
+
scope.configure({ stopPropagation: true });
|
|
225
|
+
expect(await scope.process({ carried: true })).toBeNull();
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
describe("what a scope hands on", () => {
|
|
230
|
+
it("answers a call by returning, and only by returning", async () => {
|
|
231
|
+
// Pushing the same answer onward as well would run everything after the
|
|
232
|
+
// scope twice — and twice again for every scope nested inside it.
|
|
233
|
+
const app = makeApp(createSlotStore());
|
|
234
|
+
const scope = new BrowserSubService(app, "board", {} as any, "scope");
|
|
235
|
+
scope.configure({
|
|
236
|
+
pipeline: [{ serviceId: "hookup.to/service/monitor", instanceId: "m" }],
|
|
237
|
+
} as any);
|
|
238
|
+
await (scope as any)._scopeBuilding;
|
|
239
|
+
|
|
240
|
+
expect(await scope.process({ carried: true })).toEqual({ carried: true });
|
|
241
|
+
expect(app.next).not.toHaveBeenCalled();
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
it("pushes onward what a service inside emits on its own", async () => {
|
|
245
|
+
// The other route out, which stays open: a Timer ticking inside a scope
|
|
246
|
+
// has no call to answer, so its result leaves by being pushed.
|
|
247
|
+
const app = makeApp(createSlotStore());
|
|
248
|
+
const scope = new BrowserSubService(app, "board", {} as any, "scope");
|
|
249
|
+
scope.configure({
|
|
250
|
+
pipeline: [{ serviceId: "hookup.to/service/monitor", instanceId: "m" }],
|
|
251
|
+
} as any);
|
|
252
|
+
await (scope as any)._scopeBuilding;
|
|
253
|
+
|
|
254
|
+
const inner = scope.getInnerInstance("m")!;
|
|
255
|
+
await (scope as any)._scope.next(inner, { tick: 1 }, null, false);
|
|
256
|
+
// With the run it was emitted in, which here is none.
|
|
257
|
+
expect(app.next).toHaveBeenCalledWith(scope, { tick: 1 }, { run: null });
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
describe("changing which cells a scope holds in", () => {
|
|
262
|
+
it("re-points the store and leaves the built scope alone", async () => {
|
|
263
|
+
// The cheap half of the change is the point: a scope may be holding a
|
|
264
|
+
// Timer, and rebuilding it to answer a question about where a value is
|
|
265
|
+
// kept would restart what it is running — a heavy way to say it.
|
|
266
|
+
const runtimeSlots = createSlotStore();
|
|
267
|
+
const app = makeApp(runtimeSlots);
|
|
268
|
+
const scope = new BrowserSubService(app, "board", {} as any, "reader");
|
|
269
|
+
scope.configure({ scope: { slots: "inherit" }, pipeline: [] });
|
|
270
|
+
await (scope as any)._scopeBuilding;
|
|
271
|
+
|
|
272
|
+
const built = (scope as any)._scope;
|
|
273
|
+
expect(built).not.toBeNull();
|
|
274
|
+
expect(scope.slotsInUse().inherited).toBe(true);
|
|
275
|
+
|
|
276
|
+
scope.configure({ scope: { slots: "own" } });
|
|
277
|
+
|
|
278
|
+
// The same scope object, so everything it holds is still the instance it
|
|
279
|
+
// was — nothing was torn down and built again.
|
|
280
|
+
expect((scope as any)._scope).toBe(built);
|
|
281
|
+
const after = scope.slotsInUse();
|
|
282
|
+
expect(after.inherited).toBe(false);
|
|
283
|
+
expect(after.store).not.toBe(runtimeSlots);
|
|
284
|
+
// Nothing else would tell a panel reading those cells that they changed.
|
|
285
|
+
expect(app.notify).toHaveBeenCalledWith(scope, {
|
|
286
|
+
scope: { slots: "own" },
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
it("keeps what a scope of its own was holding across the trip out and back", async () => {
|
|
291
|
+
// Its own cells live on the service rather than on the scope, so a value
|
|
292
|
+
// held before a detour through the runtime's cells is still there after.
|
|
293
|
+
const app = makeApp(createSlotStore());
|
|
294
|
+
const scope = new BrowserSubService(app, "board", {} as any, "unit");
|
|
295
|
+
scope.configure({ scope: { slots: "own" }, pipeline: [] });
|
|
296
|
+
await (scope as any)._scopeBuilding;
|
|
297
|
+
|
|
298
|
+
scope.slotsInUse().store?.set("draft", "unsent");
|
|
299
|
+
scope.configure({ scope: { slots: "inherit" } });
|
|
300
|
+
expect(scope.slotsInUse().store?.get("draft")).toBeUndefined();
|
|
301
|
+
|
|
302
|
+
scope.configure({ scope: { slots: "own" } });
|
|
303
|
+
expect(scope.slotsInUse().store?.get("draft")).toBe("unsent");
|
|
304
|
+
});
|
|
305
|
+
});
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
|
|
3
|
+
import CacheDescriptor from "../Cache";
|
|
4
|
+
|
|
5
|
+
function makeCache(state: Record<string, unknown>) {
|
|
6
|
+
const notify = vi.fn();
|
|
7
|
+
const app = { notify, next: vi.fn() } as any;
|
|
8
|
+
const service = CacheDescriptor.create(app, "board", {} as any, "cache-1") as any;
|
|
9
|
+
service.configure(state);
|
|
10
|
+
return { service, notify };
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
describe("Cache", () => {
|
|
14
|
+
it("reports its configuration and values as separate fields", async () => {
|
|
15
|
+
const { service, notify } = makeCache({
|
|
16
|
+
updateTrigger: "process",
|
|
17
|
+
initial: { x: 1, y: 2 },
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
await service.process({ x: 5 });
|
|
21
|
+
|
|
22
|
+
expect(notify).toHaveBeenLastCalledWith(service, {
|
|
23
|
+
updateTrigger: "process",
|
|
24
|
+
initial: { x: 1, y: 2 },
|
|
25
|
+
values: { x: 5, y: 2 },
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it("reports on every update a process makes", async () => {
|
|
30
|
+
const { service, notify } = makeCache({ updateTrigger: "process" });
|
|
31
|
+
notify.mockClear();
|
|
32
|
+
|
|
33
|
+
await service.process({ a: 1 });
|
|
34
|
+
await service.process({ a: 2 });
|
|
35
|
+
|
|
36
|
+
expect(notify).toHaveBeenCalledTimes(2);
|
|
37
|
+
expect(notify.mock.calls[1][1].values).toEqual({ a: 2 });
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("keeps its setup on the board, not the values it gathered", async () => {
|
|
41
|
+
const { service } = makeCache({
|
|
42
|
+
updateTrigger: "process",
|
|
43
|
+
initial: { x: 1 },
|
|
44
|
+
});
|
|
45
|
+
await service.process({ x: 9 });
|
|
46
|
+
|
|
47
|
+
expect(await service.getConfiguration()).toEqual({
|
|
48
|
+
updateTrigger: "process",
|
|
49
|
+
initial: { x: 1 },
|
|
50
|
+
bypass: false,
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
|
|
3
|
+
import { startVideoStream } from "../camera/videoCapture";
|
|
4
|
+
|
|
5
|
+
describe("camera video capture", () => {
|
|
6
|
+
it("releases a granted camera when the video element cannot play it", async () => {
|
|
7
|
+
const stop = vi.fn();
|
|
8
|
+
const stream = {
|
|
9
|
+
getTracks: () => [{ stop }],
|
|
10
|
+
} as unknown as MediaStream;
|
|
11
|
+
Object.defineProperty(navigator, "mediaDevices", {
|
|
12
|
+
configurable: true,
|
|
13
|
+
value: { getUserMedia: vi.fn().mockResolvedValue(stream) },
|
|
14
|
+
});
|
|
15
|
+
const video = document.createElement("video");
|
|
16
|
+
const failure = new DOMException("Not supported", "NotSupportedError");
|
|
17
|
+
vi.spyOn(video, "play").mockRejectedValue(failure);
|
|
18
|
+
|
|
19
|
+
await expect(startVideoStream(video)).rejects.toBe(failure);
|
|
20
|
+
|
|
21
|
+
expect(stop).toHaveBeenCalledOnce();
|
|
22
|
+
expect(video.srcObject).toBeNull();
|
|
23
|
+
});
|
|
24
|
+
});
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
|
|
3
|
+
import ChangesDescriptor from "../Changes";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Changes turns a stream of reports into events: the input passes only when
|
|
7
|
+
* what it watches differs from what it watched last time.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
function makeChanges(state: Record<string, unknown> = {}) {
|
|
11
|
+
const app = {
|
|
12
|
+
notify: vi.fn(),
|
|
13
|
+
next: vi.fn(),
|
|
14
|
+
sendAction: vi.fn(),
|
|
15
|
+
getRuntimeVariable: () => ({}),
|
|
16
|
+
} as any;
|
|
17
|
+
const service = ChangesDescriptor.create(app, "board", {} as any, "changes-1") as any;
|
|
18
|
+
service.configure(state);
|
|
19
|
+
return { service, app };
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async function run(service: any, inputs: unknown[]) {
|
|
23
|
+
const out: unknown[] = [];
|
|
24
|
+
for (const input of inputs) {
|
|
25
|
+
out.push(await service.process(input));
|
|
26
|
+
}
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
describe("Changes", () => {
|
|
31
|
+
it("passes the whole input when it differs from the last one", async () => {
|
|
32
|
+
const { service } = makeChanges();
|
|
33
|
+
expect(await run(service, ["a", "a", "b", "b", "a"])).toEqual(["a", null, "b", null, "a"]);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("compares objects by what they say, not by identity", async () => {
|
|
37
|
+
const { service } = makeChanges();
|
|
38
|
+
expect(await run(service, [{ n: 1 }, { n: 1 }, { n: 2 }])).toEqual([{ n: 1 }, null, { n: 2 }]);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it("sees a change in an object that is reused and given other content", async () => {
|
|
42
|
+
const { service } = makeChanges();
|
|
43
|
+
const input = { n: 1 };
|
|
44
|
+
expect(await service.process(input)).toBe(input);
|
|
45
|
+
expect(await service.process(input)).toBeNull();
|
|
46
|
+
input.n = 2;
|
|
47
|
+
expect(await service.process(input)).toBe(input);
|
|
48
|
+
expect(await service.process(input)).toBeNull();
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("takes binary content JSON cannot read as changed whenever it is another object", async () => {
|
|
52
|
+
const { service } = makeChanges();
|
|
53
|
+
const first = new Blob(["one"]);
|
|
54
|
+
const second = new Blob(["two"]);
|
|
55
|
+
expect(await run(service, [first, first, second, second])).toEqual([
|
|
56
|
+
first,
|
|
57
|
+
null,
|
|
58
|
+
second,
|
|
59
|
+
null,
|
|
60
|
+
]);
|
|
61
|
+
|
|
62
|
+
const buffers = makeChanges().service;
|
|
63
|
+
const a = new ArrayBuffer(4);
|
|
64
|
+
const b = new ArrayBuffer(4);
|
|
65
|
+
expect(await run(buffers, [a, b, b])).toEqual([a, b, null]);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("sees binary content change inside an object, and bytes by what they hold", async () => {
|
|
69
|
+
const { service } = makeChanges();
|
|
70
|
+
const image = new Blob(["frame"]);
|
|
71
|
+
const frames = [
|
|
72
|
+
{ id: 1, image },
|
|
73
|
+
{ id: 1, image },
|
|
74
|
+
{ id: 1, image: new Blob(["frame"]) },
|
|
75
|
+
];
|
|
76
|
+
expect(await run(service, frames)).toEqual([frames[0], null, frames[2]]);
|
|
77
|
+
|
|
78
|
+
const bytes = makeChanges().service;
|
|
79
|
+
const inputs = [new Uint8Array([1, 2]), new Uint8Array([1, 2]), new Uint8Array([1, 3])];
|
|
80
|
+
expect(await run(bytes, inputs)).toEqual([inputs[0], null, inputs[2]]);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it("watches an expression and passes the input it was read from", async () => {
|
|
84
|
+
const { service } = makeChanges({ value: "params.count > 0", emit: "rise" });
|
|
85
|
+
const frames = [
|
|
86
|
+
{ count: 0 },
|
|
87
|
+
{ count: 1 },
|
|
88
|
+
{ count: 2 },
|
|
89
|
+
{ count: 0 },
|
|
90
|
+
{ count: 1 },
|
|
91
|
+
];
|
|
92
|
+
expect(await run(service, frames)).toEqual([null, { count: 1 }, null, null, { count: 1 }]);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it("counts a truthy first value as a rise, and a falsy one as no fall", async () => {
|
|
96
|
+
const rise = makeChanges({ value: "params.on", emit: "rise" }).service;
|
|
97
|
+
expect(await run(rise, [{ on: true }])).toEqual([{ on: true }]);
|
|
98
|
+
const fall = makeChanges({ value: "params.on", emit: "fall" }).service;
|
|
99
|
+
expect(await run(fall, [{ on: false }, { on: true }, { on: false }])).toEqual([
|
|
100
|
+
null,
|
|
101
|
+
null,
|
|
102
|
+
{ on: false },
|
|
103
|
+
]);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it("forgets on reset, and when the expression changes", async () => {
|
|
107
|
+
const { service } = makeChanges({ value: "params.on", emit: "rise" });
|
|
108
|
+
await run(service, [{ on: true }]);
|
|
109
|
+
service.configure({ reset: true });
|
|
110
|
+
expect(await service.process({ on: true })).toEqual({ on: true });
|
|
111
|
+
service.configure({ value: "params.other" });
|
|
112
|
+
expect(service.remembered).toEqual({ seen: false, value: undefined });
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it("keeps what it remembers out of the board's configuration", async () => {
|
|
116
|
+
const { service } = makeChanges({ value: "params.on" });
|
|
117
|
+
await run(service, [{ on: true }]);
|
|
118
|
+
expect(await service.getConfiguration()).toEqual({
|
|
119
|
+
value: "params.on",
|
|
120
|
+
emit: "change",
|
|
121
|
+
bypass: false,
|
|
122
|
+
});
|
|
123
|
+
expect(service.remembered).toEqual({ seen: true, value: true });
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it("stops, and says so, on an expression it cannot read", async () => {
|
|
127
|
+
const { service, app } = makeChanges({ value: "params.(" });
|
|
128
|
+
expect(await service.process({})).toBeNull();
|
|
129
|
+
expect(app.sendAction).toHaveBeenCalledWith(
|
|
130
|
+
expect.objectContaining({ action: "notification" }),
|
|
131
|
+
);
|
|
132
|
+
});
|
|
133
|
+
});
|