@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,201 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <atomic>
|
|
4
|
+
#include <functional>
|
|
5
|
+
#include <list>
|
|
6
|
+
#include <map>
|
|
7
|
+
#include <memory>
|
|
8
|
+
#include <mutex>
|
|
9
|
+
#include <vector>
|
|
10
|
+
#include <chrono>
|
|
11
|
+
|
|
12
|
+
#include <boost/asio.hpp>
|
|
13
|
+
|
|
14
|
+
#include "./registry.h"
|
|
15
|
+
#include <types/types.h>
|
|
16
|
+
#include <types/validation.h>
|
|
17
|
+
#include <types/message.h>
|
|
18
|
+
#include <log_entry.h>
|
|
19
|
+
|
|
20
|
+
namespace hkp
|
|
21
|
+
{
|
|
22
|
+
|
|
23
|
+
class Service;
|
|
24
|
+
class Runtime;
|
|
25
|
+
class Server;
|
|
26
|
+
struct ProcessContext;
|
|
27
|
+
struct Caller;
|
|
28
|
+
|
|
29
|
+
class App
|
|
30
|
+
{
|
|
31
|
+
public:
|
|
32
|
+
App();
|
|
33
|
+
~App();
|
|
34
|
+
|
|
35
|
+
// A runtime id is unique within a space, and there are two kinds. What a
|
|
36
|
+
// client creates over the api shares one space, the empty one. What a
|
|
37
|
+
// coordinator builds for a board gets a space per board
|
|
38
|
+
// (`RuntimeConfiguration::space`), so two boards that both call a runtime
|
|
39
|
+
// `cpp` each keep their own, and neither is replaced by a client creating a
|
|
40
|
+
// runtime of that id.
|
|
41
|
+
//
|
|
42
|
+
// Everything below that names a runtime means the one in the api's space
|
|
43
|
+
// unless it is given another.
|
|
44
|
+
RuntimeConfiguration createRuntime(json config);
|
|
45
|
+
RuntimeConfiguration createRuntime(RuntimeConfiguration config);
|
|
46
|
+
|
|
47
|
+
std::vector<RuntimeConfiguration> getRuntimes(const std::string& space = "") const;
|
|
48
|
+
std::optional<RuntimeConfiguration> getRuntime(const std::string runtimeId,
|
|
49
|
+
const std::string& space = "") const;
|
|
50
|
+
|
|
51
|
+
bool removeRuntime(const std::string &id, const std::string& space = "");
|
|
52
|
+
// Removes what is in the api's space; a board's runtimes are its
|
|
53
|
+
// coordinator's to remove.
|
|
54
|
+
void removeAllRuntimes();
|
|
55
|
+
|
|
56
|
+
json configureService(const std::string &runtimeId, const std::string &instanceId, json config,
|
|
57
|
+
const std::string& space = "", const ProcessContext* context = nullptr);
|
|
58
|
+
json getServiceState(const std::string &runtimeId, const std::string &instanceId) const;
|
|
59
|
+
json getServices(const std::string &runtimeId, const std::string& space = "") const;
|
|
60
|
+
json appendService(const std::string& runtimeId, const ServiceConfiguration& service);
|
|
61
|
+
json removeService(const std::string& runtimeId, const std::string& instanceId);
|
|
62
|
+
Data processRuntime(const std::string& runtimeId, const Data& data);
|
|
63
|
+
// The same, as part of a run somebody else began: `context` is what a peer
|
|
64
|
+
// sent (`runId`, `parentRunId`, `requestId`), and anything it leaves out is
|
|
65
|
+
// filled in. See ProcessContext::fromJson.
|
|
66
|
+
Data processRuntime(const std::string& runtimeId, const Data& data, const json& context,
|
|
67
|
+
const std::string& space = "");
|
|
68
|
+
// The same, as a run whose context has already been established — by a
|
|
69
|
+
// route that knows who is calling, or a link that was told. Whoever builds
|
|
70
|
+
// the context decides what of it to believe; see ProcessContext.
|
|
71
|
+
Data processRuntimeAs(const std::string& runtimeId, const Data& data,
|
|
72
|
+
const ProcessContext& context, const std::string& space = "");
|
|
73
|
+
// Runs a runtime's pipeline starting at one service; see Runtime::processAt.
|
|
74
|
+
// Throws std::runtime_error when the runtime holds no such service.
|
|
75
|
+
Data processServiceAt(const std::string& runtimeId,
|
|
76
|
+
const std::string& instanceId, const Data& data);
|
|
77
|
+
// The same, as a run whose context has already been established.
|
|
78
|
+
Data processServiceAtAs(const std::string& runtimeId, const std::string& instanceId,
|
|
79
|
+
const Data& data, const ProcessContext& context,
|
|
80
|
+
const std::string& space = "");
|
|
81
|
+
// Whether a runtime holds the service an address names.
|
|
82
|
+
bool hasService(const std::string& runtimeId, const std::string& instanceId,
|
|
83
|
+
const std::string& space = "") const;
|
|
84
|
+
json getRegistry() const;
|
|
85
|
+
|
|
86
|
+
json rearrangeServices(const std::string& runtimeId, const std::vector<std::string>& newOrder);
|
|
87
|
+
|
|
88
|
+
// Hand a running runtime values for the references its services hold.
|
|
89
|
+
//
|
|
90
|
+
// Answers with the aliases it then holds, and null when there is no such
|
|
91
|
+
// runtime. Naming them is all that can be asked: there is no route from here
|
|
92
|
+
// back to a value.
|
|
93
|
+
json setRuntimeSecrets(const std::string& runtimeId,
|
|
94
|
+
const std::map<std::string, SecretEntry>& entries);
|
|
95
|
+
|
|
96
|
+
// Hand a running runtime asset descriptors, or null for one deleted. Answers
|
|
97
|
+
// with the ids it then holds, and null when there is no such runtime.
|
|
98
|
+
json setRuntimeAssets(const std::string& runtimeId,
|
|
99
|
+
const std::map<std::string, nlohmann::json>& entries);
|
|
100
|
+
|
|
101
|
+
// Whether an asset resolves on a runtime, and to what — a check, never the
|
|
102
|
+
// content. Null when there is no such runtime.
|
|
103
|
+
json checkRuntimeAsset(const std::string& runtimeId, const std::string& assetId);
|
|
104
|
+
|
|
105
|
+
// Changes what a running runtime records — `logging`, `logLevel`, `logData`
|
|
106
|
+
// — without rebuilding it. A field left out is left as it was.
|
|
107
|
+
//
|
|
108
|
+
// Answers with the settings the runtime then has, and null when there is no
|
|
109
|
+
// such runtime.
|
|
110
|
+
json setRuntimeState(const std::string& runtimeId, const json& state,
|
|
111
|
+
const std::string& space = "");
|
|
112
|
+
|
|
113
|
+
// Where a runtime's output also goes, beside the clients watching it.
|
|
114
|
+
//
|
|
115
|
+
// One sink per runtime, replaced by the next and removed by an empty one. It
|
|
116
|
+
// is called on the event loop, with what the runtime hands to the next one
|
|
117
|
+
// (`onData`, under a result purpose), what its services say (`onData`, as a
|
|
118
|
+
// notification from `sender`) and what it records (`onLog`). `run` is the
|
|
119
|
+
// run the data was produced in — which a coordinator hands to the next
|
|
120
|
+
// runtime, and reads whose a notification is to hear from — or null when it
|
|
121
|
+
// was produced outside one.
|
|
122
|
+
struct RuntimeOutputSink
|
|
123
|
+
{
|
|
124
|
+
std::function<void(const Data&, MessagePurpose, const std::string& sender,
|
|
125
|
+
const ProcessContext* run)> onData;
|
|
126
|
+
std::function<void(const LogEntry&)> onLog;
|
|
127
|
+
};
|
|
128
|
+
void setRuntimeOutputSink(const std::string& runtimeId, RuntimeOutputSink sink,
|
|
129
|
+
const std::string& space = "");
|
|
130
|
+
void clearRuntimeOutputSink(const std::string& runtimeId, const std::string& space = "");
|
|
131
|
+
// Hands a runtime's output to its sink, when it has one. For the runtime.
|
|
132
|
+
void emitRuntimeData(const std::string& runtimeId, const Data& data,
|
|
133
|
+
MessagePurpose purpose, const std::string& sender,
|
|
134
|
+
const std::string& space = "", const ProcessContext* run = nullptr);
|
|
135
|
+
void emitRuntimeLog(const std::string& runtimeId, const LogEntry& entry,
|
|
136
|
+
const std::string& space = "");
|
|
137
|
+
|
|
138
|
+
std::shared_ptr<Service> createService(const std::string& serviceId);
|
|
139
|
+
std::shared_ptr<Service> createService(const std::string& serviceId, const std::string& instanceId);
|
|
140
|
+
const ServiceClass* findServiceClass(const std::string& serviceId) const;
|
|
141
|
+
|
|
142
|
+
Data processRuntimeWithName(const std::string& name, const Data& params) const;
|
|
143
|
+
|
|
144
|
+
// Delivers a notification-WebSocket message (raw frame) to the runtime it
|
|
145
|
+
// belongs to. Called by the Server's WS layer once a connection has bound
|
|
146
|
+
// itself to a runtimeId via the protocol handshake.
|
|
147
|
+
// `caller` is whoever opened the socket, as the server verified them; null
|
|
148
|
+
// where it let the socket in without a token.
|
|
149
|
+
void dispatchRuntimeWsMessage(const std::string& runtimeId, const std::string& message, bool isBinary,
|
|
150
|
+
const Caller* caller = nullptr);
|
|
151
|
+
|
|
152
|
+
void postCallback(std::function<void()> callback);
|
|
153
|
+
// The loop `postCallback` posts to, for something that keeps a connection
|
|
154
|
+
// of its own on it.
|
|
155
|
+
boost::asio::io_context& ioContext() { return m_io; }
|
|
156
|
+
|
|
157
|
+
// Replacing or clearing a server returns only once the event loop is past
|
|
158
|
+
// any callback that could still hold the one that left, so its owner may
|
|
159
|
+
// destroy it right after.
|
|
160
|
+
void setServer(Server* server);
|
|
161
|
+
Server* getServer() const { return m_server.load(); }
|
|
162
|
+
|
|
163
|
+
template<typename T>
|
|
164
|
+
void registerService() { m_registry->registerService<T>(); }
|
|
165
|
+
|
|
166
|
+
unsigned int scanForPlugins(const std::string& bundleRoot);
|
|
167
|
+
bool loadPlugin(const std::string& path);
|
|
168
|
+
|
|
169
|
+
private:
|
|
170
|
+
std::list<std::shared_ptr<Runtime>>::iterator findRuntime(const std::string& runtimeId,
|
|
171
|
+
const std::string& space = "");
|
|
172
|
+
std::list<std::shared_ptr<Runtime>>::const_iterator findRuntime(const std::string& runtimeId,
|
|
173
|
+
const std::string& space = "") const;
|
|
174
|
+
|
|
175
|
+
// Look a runtime up and return a shared_ptr copy under the lock. Callers then
|
|
176
|
+
// operate on the copy without holding the lock: the copy keeps the Runtime
|
|
177
|
+
// alive even if another thread removes it concurrently, so operations never
|
|
178
|
+
// touch a half-destroyed Runtime. Returns nullptr when not found.
|
|
179
|
+
std::shared_ptr<Runtime> findRuntimeShared(const std::string& runtimeId,
|
|
180
|
+
const std::string& space = "") const;
|
|
181
|
+
|
|
182
|
+
std::shared_ptr<Runtime> appendRuntime(const RuntimeConfiguration& config);
|
|
183
|
+
|
|
184
|
+
void startEventLoop();
|
|
185
|
+
void stopEventLoop();
|
|
186
|
+
private:
|
|
187
|
+
// Guards the structure of m_runtimes (find/insert/erase) only. Held just long
|
|
188
|
+
// enough to look up or mutate the list — never across a Runtime operation
|
|
189
|
+
// (process/getConfiguration), which run on a shared_ptr copy instead.
|
|
190
|
+
mutable std::mutex m_runtimesMutex;
|
|
191
|
+
std::list<std::shared_ptr<Runtime>> m_runtimes;
|
|
192
|
+
std::unique_ptr<Registry> m_registry;
|
|
193
|
+
boost::asio::io_context m_io;
|
|
194
|
+
boost::asio::executor_work_guard<boost::asio::io_context::executor_type> m_work_guard;
|
|
195
|
+
std::thread m_eventThread;
|
|
196
|
+
std::atomic<Server*> m_server{nullptr};
|
|
197
|
+
mutable std::mutex m_sinksMutex;
|
|
198
|
+
std::map<std::string, RuntimeOutputSink> m_sinks;
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <algorithm>
|
|
4
|
+
#include <cstdint>
|
|
5
|
+
#include <functional>
|
|
6
|
+
#include <list>
|
|
7
|
+
#include <map>
|
|
8
|
+
#include <memory>
|
|
9
|
+
#include <mutex>
|
|
10
|
+
#include <optional>
|
|
11
|
+
#include <regex>
|
|
12
|
+
#include <string>
|
|
13
|
+
#include <vector>
|
|
14
|
+
|
|
15
|
+
#include <nlohmann/json.hpp>
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
namespace hkp {
|
|
19
|
+
|
|
20
|
+
// Assets a runtime was given, and the one way to their content.
|
|
21
|
+
//
|
|
22
|
+
// A board declares content once — a page, a script, an image, a model — as an
|
|
23
|
+
// asset *descriptor*: an id, a media type and exactly one source. Service state
|
|
24
|
+
// names one by reference, `hkp-asset://<id>`, as a whole field, and never holds
|
|
25
|
+
// the content itself. getState() therefore echoes the reference, and saving a
|
|
26
|
+
// board writes back what was configured: there is no round trip to undo.
|
|
27
|
+
//
|
|
28
|
+
// The descriptors arrive with the runtime's create payload, or on
|
|
29
|
+
// POST /runtimes/<id>/assets — and again whenever an asset is edited, which is
|
|
30
|
+
// the point: a service resolves its reference at the moment it uses it, so the
|
|
31
|
+
// next use gets the new content without anything being reconfigured. A runtime
|
|
32
|
+
// is given every asset of its board that is not kept to other runtimes, named
|
|
33
|
+
// by its services or not: which one a service uses can be decided as it runs.
|
|
34
|
+
//
|
|
35
|
+
// Where the content comes from depends on the source:
|
|
36
|
+
//
|
|
37
|
+
// text, base64 already in the descriptor
|
|
38
|
+
// http(s):// fetched by this runtime as anyone would fetch it, following
|
|
39
|
+
// redirects to other http(s) addresses, cached by sha256 or
|
|
40
|
+
// revalidated by ETag
|
|
41
|
+
// file:// only inside the root this host was given (HKP_ASSET_ROOT);
|
|
42
|
+
// refused everywhere else, never read
|
|
43
|
+
//
|
|
44
|
+
// An asset carries no request headers and names no secret. It is resolved
|
|
45
|
+
// without anyone looking, by every runtime holding it, which is no place for a
|
|
46
|
+
// credential; content that needs one is fetched by a service that says where
|
|
47
|
+
// it sends it.
|
|
48
|
+
//
|
|
49
|
+
// The format matches hkp-frontend/src/runtime/board/assets.ts and
|
|
50
|
+
// hkp-node/src/assets.ts: a board written against one runtime has to open
|
|
51
|
+
// against another.
|
|
52
|
+
|
|
53
|
+
using AssetDescriptor = nlohmann::json;
|
|
54
|
+
|
|
55
|
+
struct ResolvedAsset
|
|
56
|
+
{
|
|
57
|
+
std::string id;
|
|
58
|
+
std::string mediaType;
|
|
59
|
+
std::string content; // raw bytes
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
struct AssetResolution
|
|
63
|
+
{
|
|
64
|
+
// Empty when there is none.
|
|
65
|
+
std::optional<ResolvedAsset> asset;
|
|
66
|
+
// Why there is none, or empty when there is.
|
|
67
|
+
std::string problem;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
inline const std::string& assetScheme()
|
|
71
|
+
{
|
|
72
|
+
static const std::string scheme = "hkp-asset://";
|
|
73
|
+
return scheme;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
inline bool isAssetId(const std::string& id)
|
|
77
|
+
{
|
|
78
|
+
static const std::regex pattern(R"(^[A-Za-z0-9_.\-]+$)");
|
|
79
|
+
return std::regex_match(id, pattern);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// The id a whole-value reference names, or nothing for anything else. A
|
|
83
|
+
// reference inside a longer string is not one: nothing is spliced into text.
|
|
84
|
+
inline std::optional<std::string> parseAssetRef(const std::string& value)
|
|
85
|
+
{
|
|
86
|
+
static const std::regex pattern(R"(^hkp-asset://([A-Za-z0-9_.\-]+)$)");
|
|
87
|
+
std::smatch match;
|
|
88
|
+
if (std::regex_match(value, match, pattern))
|
|
89
|
+
{
|
|
90
|
+
return match[1].str();
|
|
91
|
+
}
|
|
92
|
+
return std::nullopt;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
inline std::optional<std::string> parseAssetRef(const nlohmann::json& value)
|
|
96
|
+
{
|
|
97
|
+
return value.is_string() ? parseAssetRef(value.get<std::string>()) : std::nullopt;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Every asset id a value mentions, however deeply it is nested — found anywhere
|
|
101
|
+
// in a string, so a reference an expression produces is still one this runtime
|
|
102
|
+
// is told about. Finding is generous; resolving is not.
|
|
103
|
+
inline void findAssetRefs(const nlohmann::json& value, std::vector<std::string>& into)
|
|
104
|
+
{
|
|
105
|
+
static const std::regex pattern(R"(hkp-asset://([A-Za-z0-9_.\-]+))");
|
|
106
|
+
if (value.is_string())
|
|
107
|
+
{
|
|
108
|
+
const auto text = value.get<std::string>();
|
|
109
|
+
for (std::sregex_iterator it(text.begin(), text.end(), pattern), end; it != end; ++it)
|
|
110
|
+
{
|
|
111
|
+
const auto id = (*it)[1].str();
|
|
112
|
+
if (std::find(into.begin(), into.end(), id) == into.end())
|
|
113
|
+
{
|
|
114
|
+
into.push_back(id);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else if (value.is_array() || value.is_object())
|
|
119
|
+
{
|
|
120
|
+
for (const auto& child : value)
|
|
121
|
+
{
|
|
122
|
+
findAssetRefs(child, into);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Whether a media type is text a pipeline can carry as a string.
|
|
128
|
+
inline bool isTextMediaType(std::string mediaType)
|
|
129
|
+
{
|
|
130
|
+
mediaType = mediaType.substr(0, mediaType.find(';'));
|
|
131
|
+
mediaType.erase(0, mediaType.find_first_not_of(" \t"));
|
|
132
|
+
mediaType.erase(mediaType.find_last_not_of(" \t") + 1);
|
|
133
|
+
std::transform(mediaType.begin(), mediaType.end(), mediaType.begin(),
|
|
134
|
+
[](unsigned char c) { return std::tolower(c); });
|
|
135
|
+
auto endsWith = [&](const std::string& suffix)
|
|
136
|
+
{
|
|
137
|
+
return mediaType.size() >= suffix.size() &&
|
|
138
|
+
mediaType.compare(mediaType.size() - suffix.size(), suffix.size(), suffix) == 0;
|
|
139
|
+
};
|
|
140
|
+
return mediaType.rfind("text/", 0) == 0 || mediaType == "application/json" ||
|
|
141
|
+
endsWith("+json") || mediaType == "application/javascript" ||
|
|
142
|
+
mediaType == "application/xml" || endsWith("+xml");
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// One descriptor off the wire, or nothing when it is not one. Exactly one
|
|
146
|
+
// source, or it is not an asset: two would leave a runtime choosing between
|
|
147
|
+
// them.
|
|
148
|
+
std::optional<AssetDescriptor> readAssetDescriptor(const nlohmann::json& value,
|
|
149
|
+
const std::string& fallbackId = "");
|
|
150
|
+
|
|
151
|
+
// Reads an assets payload off the wire: a map of id to descriptor, where null
|
|
152
|
+
// removes one, or a list of descriptors. Anything it cannot read is dropped
|
|
153
|
+
// rather than failing the request — a malformed entry costs one asset, and the
|
|
154
|
+
// service referencing it says so by name. A removal is an entry holding null.
|
|
155
|
+
std::map<std::string, nlohmann::json> readAssetsPayload(const nlohmann::json& value);
|
|
156
|
+
|
|
157
|
+
// The bytes base64 text stands for, or nothing when it is not base64.
|
|
158
|
+
//
|
|
159
|
+
// Beast's decoder stops at the first character it does not recognise and hands
|
|
160
|
+
// back what it had, so text that is not base64 — or base64 wrapped over lines —
|
|
161
|
+
// would come out as some of its bytes. What is taken here is what a browser's
|
|
162
|
+
// atob takes — ASCII whitespace ignored, the standard alphabet, padding
|
|
163
|
+
// optional — so that a descriptor resolves to the same content, or the same
|
|
164
|
+
// refusal, on every runtime.
|
|
165
|
+
std::optional<std::string> decodeBase64(const std::string& encoded);
|
|
166
|
+
|
|
167
|
+
class AssetStore
|
|
168
|
+
{
|
|
169
|
+
public:
|
|
170
|
+
// How one address is fetched. Supplied for tests; the default speaks HTTP and
|
|
171
|
+
// HTTPS through Beast. Answers status, body and ETag, or throws. One request:
|
|
172
|
+
// the store follows a redirect itself, so it does with any fetch.
|
|
173
|
+
struct FetchResponse
|
|
174
|
+
{
|
|
175
|
+
int status = 0;
|
|
176
|
+
std::string body;
|
|
177
|
+
std::string etag;
|
|
178
|
+
// Where a redirect points, as the response gave it; empty otherwise.
|
|
179
|
+
std::string location;
|
|
180
|
+
};
|
|
181
|
+
using Fetch = std::function<FetchResponse(const std::string& url,
|
|
182
|
+
const std::map<std::string, std::string>& headers)>;
|
|
183
|
+
|
|
184
|
+
explicit AssetStore(Fetch fetch = nullptr);
|
|
185
|
+
|
|
186
|
+
// Replaces everything held.
|
|
187
|
+
void replace(const std::map<std::string, nlohmann::json>& entries);
|
|
188
|
+
|
|
189
|
+
// Adds, replaces or removes (a null entry) individual descriptors, leaving the
|
|
190
|
+
// rest alone. An asset deleted from the board is gone from every runtime that
|
|
191
|
+
// was told about it, rather than served on from a stale copy.
|
|
192
|
+
void merge(const std::map<std::string, nlohmann::json>& entries);
|
|
193
|
+
|
|
194
|
+
// The ids held, for saying what a runtime knows about.
|
|
195
|
+
std::vector<std::string> ids() const;
|
|
196
|
+
|
|
197
|
+
// Called with an asset's id whenever its descriptor changes or goes away.
|
|
198
|
+
// Only a service that loads something once needs it. Returns a handle for
|
|
199
|
+
// unsubscribe().
|
|
200
|
+
std::size_t subscribe(const std::string& id, std::function<void(const std::string&)> listener);
|
|
201
|
+
void unsubscribe(std::size_t handle);
|
|
202
|
+
|
|
203
|
+
// An asset's content for one use, or a sentence saying why there is none.
|
|
204
|
+
// Blocking: a URL source is fetched on the calling thread.
|
|
205
|
+
AssetResolution resolve(const std::string& reference);
|
|
206
|
+
|
|
207
|
+
// Where file:// sources may be read from; empty refuses them all. Defaults to
|
|
208
|
+
// HKP_ASSET_ROOT.
|
|
209
|
+
void setFileRoot(const std::string& root);
|
|
210
|
+
|
|
211
|
+
std::size_t maxBytes = 64 * 1024 * 1024;
|
|
212
|
+
std::size_t maxCacheBytes = 128 * 1024 * 1024;
|
|
213
|
+
|
|
214
|
+
private:
|
|
215
|
+
struct CacheEntry
|
|
216
|
+
{
|
|
217
|
+
std::string version;
|
|
218
|
+
ResolvedAsset asset;
|
|
219
|
+
std::string etag;
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
std::string load(const AssetDescriptor& descriptor, const CacheEntry* cached,
|
|
223
|
+
std::string& etagOut, std::string& problem);
|
|
224
|
+
void remember(const std::string& id, CacheEntry entry);
|
|
225
|
+
void forget(const std::string& id);
|
|
226
|
+
void changed(const std::string& id);
|
|
227
|
+
|
|
228
|
+
mutable std::recursive_mutex m_mutex;
|
|
229
|
+
std::map<std::string, AssetDescriptor> m_descriptors;
|
|
230
|
+
std::map<std::string, CacheEntry> m_cache;
|
|
231
|
+
std::list<std::string> m_cacheOrder; // least recently used first
|
|
232
|
+
std::size_t m_cachedBytes = 0;
|
|
233
|
+
std::map<std::size_t, std::pair<std::string, std::function<void(const std::string&)>>> m_listeners;
|
|
234
|
+
std::size_t m_nextListener = 1;
|
|
235
|
+
Fetch m_fetch;
|
|
236
|
+
std::string m_fileRoot;
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
} // namespace hkp
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <chrono>
|
|
4
|
+
#include <functional>
|
|
5
|
+
#include <memory>
|
|
6
|
+
#include <optional>
|
|
7
|
+
#include <string>
|
|
8
|
+
#include <vector>
|
|
9
|
+
|
|
10
|
+
namespace hkp
|
|
11
|
+
{
|
|
12
|
+
|
|
13
|
+
// A verified caller identity extracted from a bearer token.
|
|
14
|
+
struct Principal
|
|
15
|
+
{
|
|
16
|
+
std::string email;
|
|
17
|
+
std::string sub;
|
|
18
|
+
std::string iss;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
// A trusted OIDC issuer. A token is accepted only if it is signed by a key from
|
|
22
|
+
// this issuer's JWKS and its `aud` claim is one of `audiences`. It is `iss`+`aud`
|
|
23
|
+
// that defines a trusted issuer — `sub` identifies the *user* and is matched
|
|
24
|
+
// separately against the allow-list.
|
|
25
|
+
struct TrustedIssuer
|
|
26
|
+
{
|
|
27
|
+
std::string iss; // exact `iss` claim, e.g. "https://hookitapp.eu.auth0.com/"
|
|
28
|
+
std::string jwksUri; // JWKS endpoint; derived from `iss` when empty
|
|
29
|
+
std::vector<std::string> audiences; // acceptable `aud` values (e.g. SPA client ids)
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
enum class AuthMode
|
|
33
|
+
{
|
|
34
|
+
None, // every request is authorized (loopback / dev). The bind is the boundary.
|
|
35
|
+
Jwt, // bearer token must verify against a trusted issuer and an allowed email.
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
struct AuthConfig
|
|
39
|
+
{
|
|
40
|
+
AuthMode mode = AuthMode::None;
|
|
41
|
+
std::vector<TrustedIssuer> issuers;
|
|
42
|
+
std::vector<std::string> allowedEmails; // matched case-insensitively
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
enum class AuthStatus
|
|
46
|
+
{
|
|
47
|
+
Ok, // authorized; `principal` is set
|
|
48
|
+
Unauthenticated, // missing/invalid/untrusted token → HTTP 401
|
|
49
|
+
Forbidden, // valid token, but identity is not allowed → HTTP 403
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
struct AuthResult
|
|
53
|
+
{
|
|
54
|
+
AuthStatus status = AuthStatus::Unauthenticated;
|
|
55
|
+
std::optional<Principal> principal;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
// Resolves an opaque (non-JWT) bearer token to a principal, or nullopt.
|
|
59
|
+
//
|
|
60
|
+
// Reserved for future server-to-server ephemeral session tokens — the same
|
|
61
|
+
// shape as hkp-node's OpaqueTokenResolver, where a long-lived caller keeps
|
|
62
|
+
// acting on a user's behalf past JWT expiry. The LAN peer model has no such
|
|
63
|
+
// intermediary today, so this is unset; the seam lets us add it later as a
|
|
64
|
+
// localized change rather than a middleware refactor. Checked BEFORE JWT
|
|
65
|
+
// verification, exactly like hkp-node.
|
|
66
|
+
using OpaqueTokenResolver =
|
|
67
|
+
std::function<std::optional<Principal>(const std::string& token)>;
|
|
68
|
+
|
|
69
|
+
// True when `host` is reachable only from the local machine. A loopback bind is
|
|
70
|
+
// itself an access-control boundary, so running without auth there is safe
|
|
71
|
+
// (matches hkp-node's isLoopbackHost).
|
|
72
|
+
bool isLoopbackHost(const std::string& host);
|
|
73
|
+
|
|
74
|
+
// Verifies bearer tokens against a fixed set of trusted issuers (JWKS-backed
|
|
75
|
+
// RS256) and authorizes them against an email allow-list. Thread-safe; the JWKS
|
|
76
|
+
// cache is populated lazily and refreshed on an unknown key id.
|
|
77
|
+
class Authenticator
|
|
78
|
+
{
|
|
79
|
+
public:
|
|
80
|
+
explicit Authenticator(AuthConfig config, OpaqueTokenResolver resolveOpaque = {});
|
|
81
|
+
~Authenticator();
|
|
82
|
+
|
|
83
|
+
Authenticator(const Authenticator&) = delete;
|
|
84
|
+
Authenticator& operator=(const Authenticator&) = delete;
|
|
85
|
+
|
|
86
|
+
Authenticator(Authenticator&&) noexcept;
|
|
87
|
+
Authenticator& operator=(Authenticator&&) noexcept;
|
|
88
|
+
|
|
89
|
+
// True when mode == None: every request is authorized without a token.
|
|
90
|
+
bool isNoAuth() const;
|
|
91
|
+
|
|
92
|
+
// True when the config cannot authorize anyone (Jwt mode with no issuers or no
|
|
93
|
+
// allowed emails). Callers that resolve to this while exposed are running
|
|
94
|
+
// fail-closed: every authorize() denies. Surfaced so startup can warn loudly.
|
|
95
|
+
bool isMisconfigured() const;
|
|
96
|
+
|
|
97
|
+
// Authorizes a raw Authorization header value (e.g. "Bearer eyJ...").
|
|
98
|
+
AuthResult authorize(const std::string& authorizationHeader) const;
|
|
99
|
+
|
|
100
|
+
// Replaces the allow-listed emails at runtime (thread-safe). Used by hosts
|
|
101
|
+
// that learn the permitted identity after the server starts — e.g. iOS pushes
|
|
102
|
+
// the signed-in user's email once login completes. Issuers/mode are fixed at
|
|
103
|
+
// construction; only the allow-list is mutable.
|
|
104
|
+
void setAllowedEmails(std::vector<std::string> emails);
|
|
105
|
+
|
|
106
|
+
// Pins a PEM signing key for (iss, kid), bypassing the JWKS fetch for that
|
|
107
|
+
// key. Useful for offline key pinning and for deterministic, network-free
|
|
108
|
+
// tests. Safe to call before serving.
|
|
109
|
+
void pinSigningKey(const std::string& iss, const std::string& kid, const std::string& pem);
|
|
110
|
+
|
|
111
|
+
private:
|
|
112
|
+
struct Impl;
|
|
113
|
+
std::unique_ptr<Impl> m_impl;
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
// A short-lived, scoped capability grant. Possession of the token authorizes
|
|
117
|
+
// exactly one request shape — a specific HTTP method + path (a runtime's
|
|
118
|
+
// process endpoint) — until it expires, and nothing else.
|
|
119
|
+
//
|
|
120
|
+
// The point is least privilege for out-of-band devices: a trusted caller (the
|
|
121
|
+
// host's own owner UI) mints a grant and hands the token to an unauthenticated
|
|
122
|
+
// device through a side channel (a QR code). That device can process one
|
|
123
|
+
// runtime without a user session, but a leaked or sniffed token cannot drive
|
|
124
|
+
// the wider API — it is bound to a single method + path, so it is deliberately
|
|
125
|
+
// NOT routed through the (unscoped) OpaqueTokenResolver, which would resolve to
|
|
126
|
+
// a full principal.
|
|
127
|
+
//
|
|
128
|
+
// The middleware checks this BEFORE JWT verification. Grants are reusable
|
|
129
|
+
// within their TTL (a chunked upload issues many POSTs); confidentiality on the
|
|
130
|
+
// wire and short lifetimes — not single use — bound the exposure.
|
|
131
|
+
class CapabilityStore
|
|
132
|
+
{
|
|
133
|
+
public:
|
|
134
|
+
CapabilityStore();
|
|
135
|
+
~CapabilityStore();
|
|
136
|
+
|
|
137
|
+
CapabilityStore(const CapabilityStore&) = delete;
|
|
138
|
+
CapabilityStore& operator=(const CapabilityStore&) = delete;
|
|
139
|
+
|
|
140
|
+
// Mints a token authorizing exactly one request shape — `method path` — for
|
|
141
|
+
// `ttl` (clamped to a sane maximum). Returns the raw token — the only point
|
|
142
|
+
// at which it exists in cleartext server-side; only its SHA-256 digest is
|
|
143
|
+
// retained. Returns an empty string if either argument is empty or secure
|
|
144
|
+
// randomness is unavailable.
|
|
145
|
+
std::string mintGrant(const std::string& method, const std::string& path,
|
|
146
|
+
std::chrono::seconds ttl);
|
|
147
|
+
|
|
148
|
+
// Convenience wrapper for the process-runtime endpoint: mints a grant scoped
|
|
149
|
+
// to `POST /runtimes/<runtimeId>`. Returns "" if `runtimeId` is empty. Add
|
|
150
|
+
// sibling wrappers as more scoped capabilities are needed.
|
|
151
|
+
std::string mintProcessRuntimeGrant(const std::string& runtimeId,
|
|
152
|
+
std::chrono::seconds ttl);
|
|
153
|
+
|
|
154
|
+
// True iff `token` is an unexpired grant whose scope matches this exact
|
|
155
|
+
// method + path. Expired grants are pruned opportunistically.
|
|
156
|
+
bool authorize(const std::string& token, const std::string& method,
|
|
157
|
+
const std::string& path) const;
|
|
158
|
+
|
|
159
|
+
// Revokes every outstanding grant (e.g. a "stop sharing" action).
|
|
160
|
+
void clear();
|
|
161
|
+
|
|
162
|
+
private:
|
|
163
|
+
struct Impl;
|
|
164
|
+
std::unique_ptr<Impl> m_impl;
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
} // namespace hkp
|