@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,465 @@
|
|
|
1
|
+
import { MountHandle, MountHandlers } from "./mounts";
|
|
2
|
+
import { SecretVault } from "./secrets";
|
|
3
|
+
import { AssetDescriptor, AssetStore } from "./assets";
|
|
4
|
+
|
|
5
|
+
export type JsonRecord = Record<string, unknown>;
|
|
6
|
+
|
|
7
|
+
export type ServiceRegistryEntry = {
|
|
8
|
+
serviceId: string;
|
|
9
|
+
serviceName: string;
|
|
10
|
+
version?: string;
|
|
11
|
+
capabilities?: string[];
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export type ServiceConfiguration = {
|
|
15
|
+
serviceId: string;
|
|
16
|
+
uuid: string;
|
|
17
|
+
name?: string;
|
|
18
|
+
serviceName?: string;
|
|
19
|
+
state?: JsonRecord;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export type RuntimeConfiguration = {
|
|
23
|
+
id: string;
|
|
24
|
+
name: string;
|
|
25
|
+
boardName?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Whether this runtime should be torn down once the last client that was
|
|
28
|
+
* connected to it disconnects.
|
|
29
|
+
*
|
|
30
|
+
* Declared by whoever creates it, because only they know: a browser
|
|
31
|
+
* provisioning a board it is running says `true` — it is the controller, and
|
|
32
|
+
* its runtimes should not outlive it — while a coordinator, a config file or
|
|
33
|
+
* a script says nothing and gets a runtime that lives until it is deleted.
|
|
34
|
+
*
|
|
35
|
+
* Absent means persist. Cleanup is opted into, so nothing that exists today
|
|
36
|
+
* starts disappearing, and a runtime is never reaped because of who happened
|
|
37
|
+
* to connect to it.
|
|
38
|
+
*/
|
|
39
|
+
garbageCollected?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Values for the `{{secret.<alias>}}` references this runtime's services
|
|
42
|
+
* carry, by alias.
|
|
43
|
+
*
|
|
44
|
+
* They ride with the create payload because provisioning is one call: the
|
|
45
|
+
* services in it are constructed *and* configured before it returns, and a
|
|
46
|
+
* service that opens a connection on configure needs its credential by then.
|
|
47
|
+
* Sending them later would be too late for exactly the services that have
|
|
48
|
+
* one.
|
|
49
|
+
*
|
|
50
|
+
* They are unpacked into the runtime's vault and go no further — never into
|
|
51
|
+
* a service's state, never into a serialized runtime, never back out over
|
|
52
|
+
* the wire.
|
|
53
|
+
*/
|
|
54
|
+
secrets?: Record<string, { value: string; audience?: string[] }>;
|
|
55
|
+
/**
|
|
56
|
+
* Descriptors for the `hkp-asset://<id>` references this runtime's services
|
|
57
|
+
* carry, by id.
|
|
58
|
+
*
|
|
59
|
+
* With the create payload for the reason secrets are: provisioning is one
|
|
60
|
+
* call, and a service that loads its content while being configured needs
|
|
61
|
+
* the descriptor by then. Only what this runtime's services reference — a
|
|
62
|
+
* board's inline assets can be large, and a runtime holds none it has no use
|
|
63
|
+
* for. They go into the runtime's asset store and never into service state.
|
|
64
|
+
*/
|
|
65
|
+
assets?: Record<string, AssetDescriptor>;
|
|
66
|
+
/**
|
|
67
|
+
* Whether this runtime records anything at all.
|
|
68
|
+
*
|
|
69
|
+
* Off unless the board turns it on. A board that is not being looked into has
|
|
70
|
+
* no reason to be writing a line per call to somebody's disk, and a log kept
|
|
71
|
+
* by default is one nobody decided to keep — including for the data it holds.
|
|
72
|
+
* Turning it on is the act that makes the rest of this meaningful.
|
|
73
|
+
*/
|
|
74
|
+
logging?: boolean;
|
|
75
|
+
/**
|
|
76
|
+
* The least severe level this runtime records. Absent means `info`.
|
|
77
|
+
*
|
|
78
|
+
* The flow itself — every service call and return — is recorded at `debug`,
|
|
79
|
+
* so this is what decides whether a board keeps a trace of what ran or only
|
|
80
|
+
* what its services chose to say. That is the difference between a log that
|
|
81
|
+
* answers "where did this stop" and one that costs almost nothing to keep.
|
|
82
|
+
*/
|
|
83
|
+
logLevel?: LogLevel;
|
|
84
|
+
/**
|
|
85
|
+
* Whether this runtime's log entries may carry their `data` payload.
|
|
86
|
+
*
|
|
87
|
+
* Declared by the board, in the runtime's state, because it is a decision
|
|
88
|
+
* about what the board is willing to record rather than one a service can
|
|
89
|
+
* make for itself: `data` is the one free-form field, so it is the only place
|
|
90
|
+
* a service can put something it did not mean to keep. Absent means off, so
|
|
91
|
+
* the quiet default is the safe one and switching it on is deliberate.
|
|
92
|
+
*/
|
|
93
|
+
logData?: boolean;
|
|
94
|
+
services: ServiceConfiguration[];
|
|
95
|
+
inputs?: Array<Record<string, unknown>>;
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export type RuntimeDescriptor = {
|
|
99
|
+
id: string;
|
|
100
|
+
name: string;
|
|
101
|
+
/** How this runtime is cleaned up; see RuntimeConfiguration. Reported so a
|
|
102
|
+
* client can see whether it outlives them. */
|
|
103
|
+
garbageCollected?: boolean;
|
|
104
|
+
boardName: string;
|
|
105
|
+
services: ServiceDescriptor[];
|
|
106
|
+
inputs: Array<Record<string, unknown>>;
|
|
107
|
+
outputUrl?: string;
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
export type ServiceDescriptor = {
|
|
111
|
+
serviceId: string;
|
|
112
|
+
serviceName: string;
|
|
113
|
+
version?: string;
|
|
114
|
+
capabilities?: string[];
|
|
115
|
+
uuid: string;
|
|
116
|
+
state: JsonRecord;
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
export interface HostedService {
|
|
120
|
+
readonly serviceId: string;
|
|
121
|
+
readonly serviceName: string;
|
|
122
|
+
readonly version?: string;
|
|
123
|
+
readonly capabilities?: string[];
|
|
124
|
+
readonly uuid: string;
|
|
125
|
+
configure(config: JsonRecord): JsonRecord;
|
|
126
|
+
getState(): JsonRecord;
|
|
127
|
+
process(
|
|
128
|
+
input: unknown,
|
|
129
|
+
notify: (payload: unknown, instanceId?: string) => void,
|
|
130
|
+
): unknown;
|
|
131
|
+
setHost?(host: RuntimeHost): void;
|
|
132
|
+
/**
|
|
133
|
+
* The tenant and board this service now answers to.
|
|
134
|
+
*
|
|
135
|
+
* Only a service holding a pipeline of its own needs this: its nested runtime
|
|
136
|
+
* was built before anything knew the scope, and being told once at `setHost`
|
|
137
|
+
* only reaches one level down. A scope that stops propagating is not a
|
|
138
|
+
* cosmetic problem — a nested runtime's default owner is the anonymous one,
|
|
139
|
+
* so a service that never heard the real scope reads and writes what every
|
|
140
|
+
* tenant shares.
|
|
141
|
+
*/
|
|
142
|
+
setScope?(scope: RuntimeScope): void;
|
|
143
|
+
/**
|
|
144
|
+
* The service one segment of a scoped address names inside this one.
|
|
145
|
+
*
|
|
146
|
+
* Only a service holding a pipeline answers: it is what lets an address
|
|
147
|
+
* reach past the runtime's flat list into what a scope contains. A service
|
|
148
|
+
* with several pipelines searches them in declaration order. See
|
|
149
|
+
* `address.ts`.
|
|
150
|
+
*/
|
|
151
|
+
/**
|
|
152
|
+
* Try again to claim an endpoint, now that the runtime can serve one.
|
|
153
|
+
*
|
|
154
|
+
* A mount is claimed once, eagerly, when a service is given its host — and a
|
|
155
|
+
* service inside a pipeline is built before the pipeline has a host to pass
|
|
156
|
+
* on, so its first attempt reaches nothing. Secrets and slots do not need
|
|
157
|
+
* this because they are looked up on each use; a mount is held, so the
|
|
158
|
+
* service that gave up on one has to be told to ask again.
|
|
159
|
+
*
|
|
160
|
+
* Implemented by a service that claims a mount, and by one holding a
|
|
161
|
+
* pipeline, which passes it down.
|
|
162
|
+
*/
|
|
163
|
+
remount?(): void;
|
|
164
|
+
findNested?(instanceId: string): HostedService | undefined;
|
|
165
|
+
/**
|
|
166
|
+
* Runs from a service inside this one to the end of the pipeline holding it,
|
|
167
|
+
* the way `processAt` does at the top level.
|
|
168
|
+
*
|
|
169
|
+
* Only a service whose pipeline is a chain answers. An endpoint's entries and
|
|
170
|
+
* a Tracks branch are driven by the thing that owns them — a request
|
|
171
|
+
* arriving, a fan-out — so entering one from outside would run half of an
|
|
172
|
+
* arrangement whose other half never happened. Those stay readable and
|
|
173
|
+
* configurable by address without being enterable by one.
|
|
174
|
+
*/
|
|
175
|
+
processNested?(
|
|
176
|
+
address: string,
|
|
177
|
+
input: unknown,
|
|
178
|
+
context?: ProcessContext,
|
|
179
|
+
): Promise<unknown>;
|
|
180
|
+
destroy?(): void;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export type ServiceCreator = (config: ServiceConfiguration) => HostedService;
|
|
184
|
+
|
|
185
|
+
export type HostedServiceFactory = {
|
|
186
|
+
descriptor: ServiceRegistryEntry;
|
|
187
|
+
create: (
|
|
188
|
+
config: ServiceConfiguration,
|
|
189
|
+
createService: ServiceCreator,
|
|
190
|
+
) => HostedService;
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
export type RuntimeNotification = {
|
|
194
|
+
instanceId: string;
|
|
195
|
+
payload: unknown;
|
|
196
|
+
/** The run in which it was raised, captured at the service call boundary. */
|
|
197
|
+
context?: ProcessContext;
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* The tenant and board a runtime belongs to.
|
|
202
|
+
*
|
|
203
|
+
* Board rather than runtime, because a board is the unit a person thinks in:
|
|
204
|
+
* two runtimes of one board are two halves of one app, and something one half
|
|
205
|
+
* stored is something the other half should find.
|
|
206
|
+
*/
|
|
207
|
+
export type RuntimeScope = {
|
|
208
|
+
/** The authenticated `sub`, or ANONYMOUS_SUB where auth is off. */
|
|
209
|
+
owner: string;
|
|
210
|
+
boardName: string;
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* What travels with a process call rather than with the data it carries.
|
|
215
|
+
*
|
|
216
|
+
* The ordered service list says what runs; this says which invocation it is
|
|
217
|
+
* running as. The distinction matters as soon as anything has to attribute work
|
|
218
|
+
* after the fact — which run produced this, and what invoked that run — because
|
|
219
|
+
* the payload cannot answer it: the same data can flow through the same
|
|
220
|
+
* services for entirely unrelated reasons.
|
|
221
|
+
*
|
|
222
|
+
* Kept deliberately separate from `requestId`, which the browser and hkp-rt
|
|
223
|
+
* runtimes carry for a different purpose: `requestId` is a *reply address*,
|
|
224
|
+
* exists only while someone awaits a response, and is consumed on resolution.
|
|
225
|
+
* A run outlives any number of those, so the two are not interchangeable — see
|
|
226
|
+
* plans/TODO-CONSOLIDATION.md section 4.
|
|
227
|
+
*/
|
|
228
|
+
/**
|
|
229
|
+
* Who took the action a run began with.
|
|
230
|
+
*
|
|
231
|
+
* Stated by the server that verified their token, never read from what they
|
|
232
|
+
* sent: a payload saying who its sender is proves nothing about them. A run
|
|
233
|
+
* nobody began — a timer tick, a request arriving at a mount — has none, and
|
|
234
|
+
* neither does anything on a server running without authentication, where
|
|
235
|
+
* there is nobody to tell apart.
|
|
236
|
+
*/
|
|
237
|
+
export type Caller = {
|
|
238
|
+
/** The token's `sub`. */
|
|
239
|
+
sub: string;
|
|
240
|
+
/** Present only when the token carried a verified one; normalised. */
|
|
241
|
+
email?: string;
|
|
242
|
+
/**
|
|
243
|
+
* What the board's member list calls that email. Set by a coordinator that
|
|
244
|
+
* keeps such a list, and absent everywhere else — a name from the token
|
|
245
|
+
* would be the person's own choice.
|
|
246
|
+
*/
|
|
247
|
+
name?: string;
|
|
248
|
+
/**
|
|
249
|
+
* What they are to the board: its `owner`, in whose tenant it runs, or a
|
|
250
|
+
* `member` its list admitted. Stated by whoever admitted them — the
|
|
251
|
+
* coordinator for a bridge, the runtime server for a client acting in its
|
|
252
|
+
* own tenant — so a statement can tell who may set things up from who may
|
|
253
|
+
* only take part.
|
|
254
|
+
*/
|
|
255
|
+
role?: CallerRole;
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
export type CallerRole = "owner" | "member";
|
|
259
|
+
|
|
260
|
+
/** What is acting in a run. Person identity is present only in that case. */
|
|
261
|
+
export type RunActor =
|
|
262
|
+
| ({ kind: "person"; expiresAt: number } & Caller)
|
|
263
|
+
| { kind: "board" }
|
|
264
|
+
| { kind: "mount" }
|
|
265
|
+
| { kind: "local" };
|
|
266
|
+
|
|
267
|
+
export type ProcessContext = {
|
|
268
|
+
/**
|
|
269
|
+
* Identifies one invocation of a board — one webhook, one timer tick, one
|
|
270
|
+
* user action — across every service and runtime it reaches.
|
|
271
|
+
*/
|
|
272
|
+
runId: string;
|
|
273
|
+
/**
|
|
274
|
+
* The run this one was invoked from, for a nested pipeline. Absent on a run
|
|
275
|
+
* that was triggered from outside rather than from inside another run, which
|
|
276
|
+
* is what makes a trace reconstructable as a tree rather than a list.
|
|
277
|
+
*/
|
|
278
|
+
parentRunId?: string;
|
|
279
|
+
/**
|
|
280
|
+
* Where to send a result somebody is waiting for. Absent for the fire-and-
|
|
281
|
+
* forget calls that make up most traffic. Unused by this runtime today; named
|
|
282
|
+
* here so the shape matches the runtimes that do carry one.
|
|
283
|
+
*/
|
|
284
|
+
requestId?: string;
|
|
285
|
+
/**
|
|
286
|
+
* What is acting in this run. A person actor is stated only by the server
|
|
287
|
+
* that verified them and carries the deadline of that delegated authority.
|
|
288
|
+
*/
|
|
289
|
+
actor: RunActor;
|
|
290
|
+
};
|
|
291
|
+
|
|
292
|
+
export type LogLevel = "debug" | "info" | "warn" | "error";
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* One thing worth recording about a run.
|
|
296
|
+
*
|
|
297
|
+
* A board's log is assembled by its coordinator from every runtime it spans,
|
|
298
|
+
* because only the coordinator can see the whole board — a log held per runtime
|
|
299
|
+
* would have to be stitched back together by timestamp to answer the first
|
|
300
|
+
* question anyone asks it, which is what one run did.
|
|
301
|
+
*
|
|
302
|
+
* `data` is the only free-form field and therefore the only one that can carry
|
|
303
|
+
* something a service did not mean to record. It is dropped unless a board asks
|
|
304
|
+
* for it, so a service that forgets to redact can only leak through a channel
|
|
305
|
+
* somebody deliberately opened.
|
|
306
|
+
*/
|
|
307
|
+
export type LogEntry = {
|
|
308
|
+
runId: string;
|
|
309
|
+
parentRunId?: string;
|
|
310
|
+
/** ISO 8601, set by the runtime that produced the entry. */
|
|
311
|
+
ts: string;
|
|
312
|
+
runtimeId: string;
|
|
313
|
+
serviceUuid: string;
|
|
314
|
+
level: LogLevel;
|
|
315
|
+
/** What happened, as a short stable name a reader can group by. */
|
|
316
|
+
event: string;
|
|
317
|
+
data?: unknown;
|
|
318
|
+
durationMs?: number;
|
|
319
|
+
/**
|
|
320
|
+
* The `sub` of whoever began the run, when somebody did. Enough to answer
|
|
321
|
+
* "who did this" from a board's log without the log collecting addresses.
|
|
322
|
+
*/
|
|
323
|
+
caller?: string;
|
|
324
|
+
};
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Named cells two pipelines can share a value through.
|
|
328
|
+
*
|
|
329
|
+
* A pipeline pass carries one value and ends; anything that has to survive
|
|
330
|
+
* until a *different* pipeline runs has nowhere to live. A store gives it a
|
|
331
|
+
* name, and whoever owns the pipelines that must share decides which store they
|
|
332
|
+
* see — which is what keeps the sharing scoped to the arrangement that needs it
|
|
333
|
+
* rather than being ambient across a runtime.
|
|
334
|
+
*
|
|
335
|
+
* Deliberately not a cache: nothing expires, nothing is computed on a miss. It
|
|
336
|
+
* is a cell, and the services that read and write it say what it means.
|
|
337
|
+
*/
|
|
338
|
+
export interface SlotStore {
|
|
339
|
+
get(name: string): unknown;
|
|
340
|
+
set(name: string, value: unknown): void;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
export interface RuntimeHost {
|
|
344
|
+
/**
|
|
345
|
+
* Runs the services after `startAfterUuid` and answers with what they
|
|
346
|
+
* produced.
|
|
347
|
+
*
|
|
348
|
+
* Asynchronous because a pass is: the runtime awaits each service, so a
|
|
349
|
+
* service that pulls the ones behind it has to await them too.
|
|
350
|
+
*/
|
|
351
|
+
processFrom(
|
|
352
|
+
startAfterUuid: string,
|
|
353
|
+
data: unknown,
|
|
354
|
+
onNotification: (notification: RuntimeNotification) => void,
|
|
355
|
+
context?: ProcessContext,
|
|
356
|
+
): Promise<unknown>;
|
|
357
|
+
/**
|
|
358
|
+
* Reports something to whoever is watching. Said from inside a run, it is
|
|
359
|
+
* reported as part of it; `context` names the run instead where the report
|
|
360
|
+
* is being carried out of a nested pipeline, which knows the run it was made
|
|
361
|
+
* in when the runtime around it does not.
|
|
362
|
+
*/
|
|
363
|
+
notify(
|
|
364
|
+
payload: unknown,
|
|
365
|
+
instanceId: string,
|
|
366
|
+
context?: ProcessContext | null,
|
|
367
|
+
): void;
|
|
368
|
+
/**
|
|
369
|
+
* Hands a value to whatever follows this runtime. Called from inside a run,
|
|
370
|
+
* the value goes on as part of it — the next runtime of a deployed board is
|
|
371
|
+
* told the same run and the same caller. `context` names the run where the
|
|
372
|
+
* value is handed on from outside the call that produced it.
|
|
373
|
+
*/
|
|
374
|
+
emitResult(output: unknown, context?: ProcessContext | null): void;
|
|
375
|
+
/**
|
|
376
|
+
* The context of the call currently being processed, or null outside one.
|
|
377
|
+
*
|
|
378
|
+
* A service that finishes its work after its `process` returns — an HTTP
|
|
379
|
+
* response arriving, a socket pushing — has left the call it belongs to by
|
|
380
|
+
* the time it has something to pass on. Capturing this while still inside
|
|
381
|
+
* `process` and handing it back to `processFrom` is what keeps the two halves
|
|
382
|
+
* recognisable as one run.
|
|
383
|
+
*/
|
|
384
|
+
currentContext(): ProcessContext | null;
|
|
385
|
+
/**
|
|
386
|
+
* Record something about the run in progress.
|
|
387
|
+
*
|
|
388
|
+
* Unlike `notify`, which exists for whoever is watching and may be dropped
|
|
389
|
+
* when nobody is, an entry has to survive with nobody attached — a board
|
|
390
|
+
* running unwatched is exactly the case a log is for. The run and the service
|
|
391
|
+
* are taken from the call in progress, so a service says only what happened.
|
|
392
|
+
*/
|
|
393
|
+
log(level: LogLevel, event: string, data?: unknown): void;
|
|
394
|
+
/**
|
|
395
|
+
* Pass an entry a nested pipeline produced outward, unchanged.
|
|
396
|
+
*
|
|
397
|
+
* Distinct from `log` because the entry already names its own run and
|
|
398
|
+
* service: re-deriving those from the call in progress would relabel work
|
|
399
|
+
* done inside a sub-pipeline as the work of the service hosting it, which is
|
|
400
|
+
* the nesting the entry exists to record.
|
|
401
|
+
*/
|
|
402
|
+
forwardLog(entry: LogEntry): void;
|
|
403
|
+
/**
|
|
404
|
+
* What the runtime around a nested pipeline records, so the pipeline can
|
|
405
|
+
* record the same.
|
|
406
|
+
*
|
|
407
|
+
* A nested runtime is built from a service's own configuration, which says
|
|
408
|
+
* nothing about logging — so without asking, a sub-pipeline would sit silent
|
|
409
|
+
* inside a board that is being looked into, which is where its entries are
|
|
410
|
+
* most wanted.
|
|
411
|
+
*/
|
|
412
|
+
logSettings(): { logging: boolean; logData: boolean; logLevel: LogLevel };
|
|
413
|
+
/**
|
|
414
|
+
* Who this runtime belongs to and which board it is part of.
|
|
415
|
+
*
|
|
416
|
+
* For a service that keeps something between calls: this server is
|
|
417
|
+
* multi-tenant and runtimes are namespaced by the authenticated `sub`, so
|
|
418
|
+
* anything durable has to be namespaced the same way or one tenant's data
|
|
419
|
+
* becomes another's. A service cannot work that out for itself — it is told
|
|
420
|
+
* its own configuration and nothing about who asked for it — which is why it
|
|
421
|
+
* comes from the host rather than from state.
|
|
422
|
+
*/
|
|
423
|
+
scope(): RuntimeScope;
|
|
424
|
+
/**
|
|
425
|
+
* Claim a publicly reachable endpoint served by the shared server, for a
|
|
426
|
+
* service that needs to be called from outside (an HTTP endpoint, a
|
|
427
|
+
* signalling server). Returns null when the host cannot serve mounts — an
|
|
428
|
+
* inner sub-service pipeline, or a server that is not listening yet — in
|
|
429
|
+
* which case the service has no public endpoint and should say so in its
|
|
430
|
+
* state rather than falling back to a port of its own.
|
|
431
|
+
*/
|
|
432
|
+
mount?(
|
|
433
|
+
serviceUuid: string,
|
|
434
|
+
handlers: MountHandlers,
|
|
435
|
+
options?: { mountName?: string },
|
|
436
|
+
): MountHandle | null;
|
|
437
|
+
/**
|
|
438
|
+
* The runtime's secrets, for a service that has a credential to send.
|
|
439
|
+
*
|
|
440
|
+
* A service holds the reference it was configured with and asks here for the
|
|
441
|
+
* value, naming where it is about to send it. What comes back is used and
|
|
442
|
+
* dropped: assigning it to state would put it back on the path a board is
|
|
443
|
+
* saved from, which is the whole thing this arrangement exists to prevent.
|
|
444
|
+
*/
|
|
445
|
+
secrets(): SecretVault;
|
|
446
|
+
/**
|
|
447
|
+
* The runtime's assets, for a service that consumes content by reference.
|
|
448
|
+
*
|
|
449
|
+
* A service holds `hkp-asset://<id>` and resolves it here at the moment it
|
|
450
|
+
* uses it, so an asset edited while the board runs is what the next use
|
|
451
|
+
* gets. The content is used and dropped, never put into state. Optional
|
|
452
|
+
* because a host that was not provisioned with any has nothing to answer.
|
|
453
|
+
*/
|
|
454
|
+
assets?(): AssetStore;
|
|
455
|
+
/**
|
|
456
|
+
* The slots this pipeline's values may be held in, or nothing where no store
|
|
457
|
+
* has been provided.
|
|
458
|
+
*
|
|
459
|
+
* A nested runtime answers with the store the service hosting it gave it, and
|
|
460
|
+
* otherwise with its parent's — so a slot named inside a sub-pipeline reaches
|
|
461
|
+
* the nearest owner that declared one, and a service that declared none does
|
|
462
|
+
* not silently isolate what is nested in it.
|
|
463
|
+
*/
|
|
464
|
+
slots?(): SlotStore | null;
|
|
465
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
|
|
3
|
+
import { AuthenticatedUser } from "./auth";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Single-use tickets that open a WebSocket in place of a token.
|
|
7
|
+
*
|
|
8
|
+
* A browser cannot set a header on a WebSocket handshake, so a token it
|
|
9
|
+
* authenticated one with would have to ride in the address — and an address
|
|
10
|
+
* is what proxies and access logs keep. So a browser first asks for a ticket
|
|
11
|
+
* (`POST /ws-tickets`, with its token in the `Authorization` header like any
|
|
12
|
+
* request) and opens the socket with `?ticket=` instead. A ticket opens one
|
|
13
|
+
* socket, within seconds, as whoever asked for it, and is worth nothing once
|
|
14
|
+
* written down.
|
|
15
|
+
*
|
|
16
|
+
* What the ticket remembers is what checking the token found: who the caller
|
|
17
|
+
* is, and whether this server's allowlist lets them own. The socket is then
|
|
18
|
+
* judged exactly as the token would have been, without the token.
|
|
19
|
+
*
|
|
20
|
+
* The same in hkp-python (`ws_tickets.py`) and hkp-rt (`http/server.cpp`).
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
export type TicketHolder = {
|
|
24
|
+
/** Who the token named; null for a token that names nobody. */
|
|
25
|
+
identity: AuthenticatedUser | null;
|
|
26
|
+
/** The same person, when they may own here; null otherwise. */
|
|
27
|
+
owner: AuthenticatedUser | null;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/** Long enough for a browser to open the socket it asked for, and no longer. */
|
|
31
|
+
export const TICKET_TTL_MS = 30_000;
|
|
32
|
+
|
|
33
|
+
/** Outstanding tickets kept; past this the oldest go first. */
|
|
34
|
+
const MAX_OUTSTANDING = 10_000;
|
|
35
|
+
|
|
36
|
+
export class WsTickets {
|
|
37
|
+
private readonly tickets = new Map<string, TicketHolder & { expires: number }>();
|
|
38
|
+
|
|
39
|
+
constructor(private readonly now: () => number = Date.now) {}
|
|
40
|
+
|
|
41
|
+
/** A ticket for `holder`, good for one socket within TICKET_TTL_MS. */
|
|
42
|
+
mint(holder: TicketHolder): string {
|
|
43
|
+
this.prune();
|
|
44
|
+
while (this.tickets.size >= MAX_OUTSTANDING) {
|
|
45
|
+
const oldest = this.tickets.keys().next().value;
|
|
46
|
+
if (oldest === undefined) {
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
this.tickets.delete(oldest);
|
|
50
|
+
}
|
|
51
|
+
const ticket = randomBytes(32).toString("base64url");
|
|
52
|
+
this.tickets.set(ticket, { ...holder, expires: this.now() + TICKET_TTL_MS });
|
|
53
|
+
return ticket;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Who a ticket was minted for — once. Unknown, used or expired: null. */
|
|
57
|
+
redeem(ticket: string): TicketHolder | null {
|
|
58
|
+
const held = this.tickets.get(ticket);
|
|
59
|
+
if (!held) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
this.tickets.delete(ticket);
|
|
63
|
+
if (held.expires < this.now()) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
return { identity: held.identity, owner: held.owner };
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
private prune(): void {
|
|
70
|
+
const now = this.now();
|
|
71
|
+
for (const [ticket, held] of this.tickets) {
|
|
72
|
+
if (held.expires < now) {
|
|
73
|
+
this.tickets.delete(ticket);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The YAS frames a runtime socket carries when what flows is not JSON.
|
|
3
|
+
*
|
|
4
|
+
* Reference implementations:
|
|
5
|
+
* hkp-frontend/src/runtime/rest/Message.ts (TypeScript, the peer here)
|
|
6
|
+
* hkp-rt/lib/src/types/message.cpp (C++, yas library)
|
|
7
|
+
* hkp-python/src/hkp/yas.py (Python)
|
|
8
|
+
*
|
|
9
|
+
* Frame layout, integers little-endian:
|
|
10
|
+
*
|
|
11
|
+
* 7 bytes YAS header, b"yas" + 4 flag/version bytes (only "yas" is checked)
|
|
12
|
+
* uint16 message purpose
|
|
13
|
+
* uint16 data type id
|
|
14
|
+
* uint64 sender length
|
|
15
|
+
* bytes sender (ascii)
|
|
16
|
+
* ... payload — for BinaryData the raw bytes to the end of the frame,
|
|
17
|
+
* for Null a single ignored byte
|
|
18
|
+
*
|
|
19
|
+
* Only those two types are read and written: a Node service has nothing to do
|
|
20
|
+
* with a FloatRingBuffer, and JSON and text travel as JSON frames.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
export enum MessagePurpose {
|
|
24
|
+
NOTIFICATION = 0,
|
|
25
|
+
RESULT = 1,
|
|
26
|
+
RESULT_AWAITING_RESPONSE = 2,
|
|
27
|
+
RESULT_WITH_REQUEST_ID = 3,
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** In sync with hkp-rt/lib/include/types/data.h. */
|
|
31
|
+
export enum DataTypeId {
|
|
32
|
+
Undefined = 0,
|
|
33
|
+
FloatRingBuffer = 1,
|
|
34
|
+
JSON = 2,
|
|
35
|
+
BinaryData = 3,
|
|
36
|
+
String = 4,
|
|
37
|
+
Null = 5,
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export type YasMessage = {
|
|
41
|
+
purpose: number;
|
|
42
|
+
dataType: number;
|
|
43
|
+
sender: string;
|
|
44
|
+
/** A Buffer for BinaryData, null for Null; undefined for a type not read. */
|
|
45
|
+
data: Buffer | null | undefined;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const HEADER = Buffer.from("yas0017", "latin1");
|
|
49
|
+
const FIXED = HEADER.length + 2 + 2 + 8;
|
|
50
|
+
|
|
51
|
+
/** The frame, or null when the bytes are not one. */
|
|
52
|
+
export function decodeYasMessage(frame: Buffer): YasMessage | null {
|
|
53
|
+
if (frame.length < FIXED || frame.toString("latin1", 0, 3) !== "yas") {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
let offset = HEADER.length;
|
|
57
|
+
const purpose = frame.readUInt16LE(offset);
|
|
58
|
+
offset += 2;
|
|
59
|
+
const dataType = frame.readUInt16LE(offset);
|
|
60
|
+
offset += 2;
|
|
61
|
+
const senderLength = Number(frame.readBigUInt64LE(offset));
|
|
62
|
+
offset += 8;
|
|
63
|
+
if (offset + senderLength > frame.length) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
const sender = frame.toString("latin1", offset, offset + senderLength);
|
|
67
|
+
offset += senderLength;
|
|
68
|
+
|
|
69
|
+
let data: Buffer | null | undefined;
|
|
70
|
+
if (dataType === DataTypeId.BinaryData) {
|
|
71
|
+
data = frame.subarray(offset);
|
|
72
|
+
} else if (dataType === DataTypeId.Null) {
|
|
73
|
+
data = null;
|
|
74
|
+
}
|
|
75
|
+
return { purpose, dataType, sender, data };
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** The bytes as a BinaryData frame. */
|
|
79
|
+
export function encodeYasBinary(
|
|
80
|
+
bytes: Uint8Array,
|
|
81
|
+
purpose: MessagePurpose,
|
|
82
|
+
sender = "",
|
|
83
|
+
): Buffer {
|
|
84
|
+
const head = Buffer.alloc(FIXED + sender.length);
|
|
85
|
+
HEADER.copy(head, 0);
|
|
86
|
+
let offset = HEADER.length;
|
|
87
|
+
head.writeUInt16LE(purpose, offset);
|
|
88
|
+
offset += 2;
|
|
89
|
+
head.writeUInt16LE(DataTypeId.BinaryData, offset);
|
|
90
|
+
offset += 2;
|
|
91
|
+
head.writeBigUInt64LE(BigInt(sender.length), offset);
|
|
92
|
+
offset += 8;
|
|
93
|
+
head.write(sender, offset, "latin1");
|
|
94
|
+
return Buffer.concat([head, bytes]);
|
|
95
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""hkp-python — asyncio port of hkp-node runtime engine."""
|