@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,986 @@
|
|
|
1
|
+
#include "./runtime.h"
|
|
2
|
+
|
|
3
|
+
#include <fstream>
|
|
4
|
+
#include <boost/beast.hpp>
|
|
5
|
+
|
|
6
|
+
#include "./address.h"
|
|
7
|
+
#include "./app.h"
|
|
8
|
+
#include "./registry.h"
|
|
9
|
+
#include "./service.h"
|
|
10
|
+
#include "./server.h"
|
|
11
|
+
#include "./sub_runtime.h"
|
|
12
|
+
|
|
13
|
+
#include <types/validation.h>
|
|
14
|
+
#include <types/message.h>
|
|
15
|
+
#include "common.h"
|
|
16
|
+
|
|
17
|
+
namespace hkp
|
|
18
|
+
{
|
|
19
|
+
|
|
20
|
+
namespace
|
|
21
|
+
{
|
|
22
|
+
|
|
23
|
+
// The calls a thread is inside, innermost first.
|
|
24
|
+
//
|
|
25
|
+
// Per thread, because a call is: a pass runs to its end on the thread that
|
|
26
|
+
// began it, while other threads are in calls of their own — a REST request, a
|
|
27
|
+
// coordinator's message, a worker reporting progress, an audio callback. Kept
|
|
28
|
+
// on the runtime instead, a call beginning on one thread would save the context
|
|
29
|
+
// of a call on another and put it back after that one had ended, leaving a
|
|
30
|
+
// finished run — and whoever began it — in place for everything that followed.
|
|
31
|
+
//
|
|
32
|
+
// A frame points at a context its caller keeps alive for as long as the frame
|
|
33
|
+
// stands, so entering a call copies nothing.
|
|
34
|
+
struct ContextFrame
|
|
35
|
+
{
|
|
36
|
+
const Runtime* runtime;
|
|
37
|
+
const ProcessContext* context;
|
|
38
|
+
const ContextFrame* outer;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
thread_local const ContextFrame* t_frame = nullptr;
|
|
42
|
+
|
|
43
|
+
class ContextScope
|
|
44
|
+
{
|
|
45
|
+
public:
|
|
46
|
+
ContextScope(const Runtime* runtime, const ProcessContext* context)
|
|
47
|
+
: m_frame{runtime, context, t_frame}
|
|
48
|
+
{
|
|
49
|
+
t_frame = &m_frame;
|
|
50
|
+
}
|
|
51
|
+
~ContextScope() { t_frame = m_frame.outer; }
|
|
52
|
+
ContextScope(const ContextScope&) = delete;
|
|
53
|
+
ContextScope& operator=(const ContextScope&) = delete;
|
|
54
|
+
|
|
55
|
+
private:
|
|
56
|
+
ContextFrame m_frame;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
Runtime::Runtime(OwnsMe<App> app, const std::string& runtimeId, const std::string& runtimeName)
|
|
62
|
+
: m_app(app)
|
|
63
|
+
, m_runtimeId(runtimeId)
|
|
64
|
+
, m_runtimeName(runtimeName)
|
|
65
|
+
, m_boardRun(std::make_shared<const ProcessContext>(ProcessContext::newRun("board")))
|
|
66
|
+
{
|
|
67
|
+
// Notifications are served by the shared Server WebSocket (one port for the
|
|
68
|
+
// whole process, multiplexed by runtimeId), not a per-runtime socket. Nothing
|
|
69
|
+
// to start here; the Server owns the transport.
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
Runtime::~Runtime()
|
|
73
|
+
{
|
|
74
|
+
// Wind down any async service workers while this Runtime — its service list,
|
|
75
|
+
// process context, everything — is still fully alive. A worker's final emit()
|
|
76
|
+
// then traverses a live pipeline; joining later (during member destruction)
|
|
77
|
+
// would let it touch already-destroyed state.
|
|
78
|
+
for (auto& svc : m_services)
|
|
79
|
+
{
|
|
80
|
+
svc->shutdown();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
void Runtime::onWebSocketMessage(const std::string& message, bool isBinary,
|
|
85
|
+
const Caller& caller)
|
|
86
|
+
{
|
|
87
|
+
if (isBinary)
|
|
88
|
+
{
|
|
89
|
+
try
|
|
90
|
+
{
|
|
91
|
+
MessageHeader header;
|
|
92
|
+
auto data = Message::deserializeFromString(message, &header);
|
|
93
|
+
onSessionBinaryData(data, header, caller);
|
|
94
|
+
}
|
|
95
|
+
catch (const std::exception& e)
|
|
96
|
+
{
|
|
97
|
+
std::cerr << "Runtime::onWebSocketMessage failed to process binary frame: " << e.what() << std::endl;
|
|
98
|
+
}
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
json msg;
|
|
103
|
+
try
|
|
104
|
+
{
|
|
105
|
+
msg = json::parse(message);
|
|
106
|
+
}
|
|
107
|
+
catch (const std::exception& e)
|
|
108
|
+
{
|
|
109
|
+
std::cerr << "Runtime::onWebSocketMessage failed to parse JSON: " << e.what() << std::endl;
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (!msg.is_object())
|
|
113
|
+
{
|
|
114
|
+
std::cerr << "Runtime::onWebSocketMessage: invalid JSON object received: " << message << std::endl;
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
try
|
|
118
|
+
{
|
|
119
|
+
onSessionJSONData(msg, caller);
|
|
120
|
+
}
|
|
121
|
+
catch (const std::exception& e)
|
|
122
|
+
{
|
|
123
|
+
std::cerr << "Runtime::onWebSocketMessage failed to handle JSON message: " << e.what() << std::endl;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
void Runtime::loadFromDisk(const std::string& path)
|
|
128
|
+
{
|
|
129
|
+
std::cout << "Loading runtime from: " << path << std::endl;
|
|
130
|
+
std::ifstream ifs(path);
|
|
131
|
+
if (!ifs)
|
|
132
|
+
{
|
|
133
|
+
throw std::runtime_error("Could not open file: " + path);
|
|
134
|
+
}
|
|
135
|
+
json jf = json::parse(ifs);
|
|
136
|
+
load(jf);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
void Runtime::load(const json& buffer)
|
|
140
|
+
{
|
|
141
|
+
auto rt = validateRuntime(buffer);
|
|
142
|
+
if (!rt)
|
|
143
|
+
{
|
|
144
|
+
throw std::runtime_error("Runtime::load: invalid runtime configuration");
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
load(*rt);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
void Runtime::load(const RuntimeConfiguration& config)
|
|
151
|
+
{
|
|
152
|
+
m_services.clear();
|
|
153
|
+
|
|
154
|
+
if (!config.boardName.empty())
|
|
155
|
+
{
|
|
156
|
+
m_boardName = config.boardName;
|
|
157
|
+
}
|
|
158
|
+
m_runtimeId = config.runtimeId;
|
|
159
|
+
m_space = config.space;
|
|
160
|
+
m_runtimeName = config.runtimeName;
|
|
161
|
+
m_garbageCollected = config.garbageCollected;
|
|
162
|
+
m_logData = config.logData;
|
|
163
|
+
m_logging = config.logging;
|
|
164
|
+
m_logLevel = levelFromString(config.logLevel);
|
|
165
|
+
// Before any service is built, because a service that opens a connection
|
|
166
|
+
// while being configured asks for its credential during construction.
|
|
167
|
+
m_vault.replace(config.secrets);
|
|
168
|
+
// Likewise assets: a service that loads its content while being configured
|
|
169
|
+
// asks for it during construction.
|
|
170
|
+
m_assets.replace(config.assets);
|
|
171
|
+
auto services = config.services;
|
|
172
|
+
for (auto &service : services)
|
|
173
|
+
{
|
|
174
|
+
std::string serviceId = service.serviceId;
|
|
175
|
+
std::string instanceId = service.instanceId;
|
|
176
|
+
auto svc = m_app->createService(serviceId, instanceId);
|
|
177
|
+
if (!svc)
|
|
178
|
+
{
|
|
179
|
+
throw std::runtime_error("Service not found: " + serviceId);
|
|
180
|
+
}
|
|
181
|
+
svc->setParentRuntime(*this);
|
|
182
|
+
m_services.push_back(svc); // this implicitly connects
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
auto service = m_services.begin();
|
|
186
|
+
for (auto &config : services)
|
|
187
|
+
{
|
|
188
|
+
auto cfg = config.state;
|
|
189
|
+
if (!cfg.is_null())
|
|
190
|
+
{
|
|
191
|
+
if ((*service)->configure(cfg).is_null())
|
|
192
|
+
{
|
|
193
|
+
throw std::runtime_error("Runtime::load: failed to configure service");
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
++service;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
m_inputs = config.inputs;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
RuntimeConfiguration Runtime::getConfiguration() const
|
|
203
|
+
{
|
|
204
|
+
RuntimeConfiguration config;
|
|
205
|
+
config.runtimeId = m_runtimeId;
|
|
206
|
+
config.runtimeName = m_runtimeName;
|
|
207
|
+
config.boardName = m_boardName;
|
|
208
|
+
config.space = m_space;
|
|
209
|
+
config.garbageCollected = m_garbageCollected;
|
|
210
|
+
config.logData = m_logData;
|
|
211
|
+
config.logging = m_logging;
|
|
212
|
+
config.logLevel = toString(m_logLevel);
|
|
213
|
+
|
|
214
|
+
for (auto &svc : m_services)
|
|
215
|
+
{
|
|
216
|
+
ServiceConfiguration sc;
|
|
217
|
+
sc.serviceId = svc->getServiceId();
|
|
218
|
+
sc.instanceId = svc->getId();
|
|
219
|
+
if (const auto* serviceClass = m_app->findServiceClass(sc.serviceId))
|
|
220
|
+
{
|
|
221
|
+
sc.version = serviceClass->version;
|
|
222
|
+
sc.capabilities = serviceClass->capabilities;
|
|
223
|
+
}
|
|
224
|
+
sc.state = svc->getState();
|
|
225
|
+
config.services.push_back(sc);
|
|
226
|
+
|
|
227
|
+
for (auto& input : svc->getExternalInputs())
|
|
228
|
+
{
|
|
229
|
+
sc.inputs.push_back(input);
|
|
230
|
+
config.inputs.push_back(RuntimeInput{
|
|
231
|
+
.id = input.id,
|
|
232
|
+
.url = replaceHostWithExternalAddress(input.url),
|
|
233
|
+
.serviceId = svc->getServiceId(),
|
|
234
|
+
.runtimeId = m_runtimeId,
|
|
235
|
+
.runtimeUrl = getRuntimeUrl(),
|
|
236
|
+
.type = RuntimeInput::EXTERNAL
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
for (RuntimeInput input: m_inputs)
|
|
242
|
+
{
|
|
243
|
+
input.url = getRuntimeUrl() + "/services/" + input.serviceId;
|
|
244
|
+
input.runtimeId = m_runtimeId;
|
|
245
|
+
input.runtimeUrl = getRuntimeUrl();
|
|
246
|
+
config.inputs.push_back(input);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
auto server = m_app->getServer();
|
|
250
|
+
if (server)
|
|
251
|
+
{
|
|
252
|
+
// Notifications share the REST server's port; the connection binds to this
|
|
253
|
+
// runtime via the protocol handshake ({type, id}), so the path is fixed.
|
|
254
|
+
config.outputUrl = "ws://" + server->externalIP() + ":" + std::to_string(server->port()) + "/notifications";
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
return config;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
json Runtime::configureService(const std::string &instanceId, json config,
|
|
261
|
+
const ProcessContext* context)
|
|
262
|
+
{
|
|
263
|
+
auto svc = resolveService(instanceId);
|
|
264
|
+
if (!svc)
|
|
265
|
+
{
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
if (!context)
|
|
270
|
+
{
|
|
271
|
+
return svc->configure(config);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
ContextScope scope(this, context);
|
|
275
|
+
return svc->configure(config);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
json Runtime::getServiceState(const std::string &instanceId) const
|
|
279
|
+
{
|
|
280
|
+
auto svc = resolveService(instanceId);
|
|
281
|
+
if (!svc)
|
|
282
|
+
{
|
|
283
|
+
return false;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
return svc->getState();
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
json Runtime::getServices() const
|
|
290
|
+
{
|
|
291
|
+
json services;
|
|
292
|
+
for (auto &svc : m_services)
|
|
293
|
+
{
|
|
294
|
+
auto s = json{
|
|
295
|
+
{ "serviceId", svc->getServiceId() },
|
|
296
|
+
{ "instanceId", svc->getId() },
|
|
297
|
+
{ "instanceName", svc->getName() },
|
|
298
|
+
};
|
|
299
|
+
if (const auto* serviceClass = m_app->findServiceClass(svc->getServiceId()))
|
|
300
|
+
{
|
|
301
|
+
if (!serviceClass->version.empty())
|
|
302
|
+
{
|
|
303
|
+
s["version"] = serviceClass->version;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
s.update(json{{"state", svc->getState()}});
|
|
307
|
+
services.push_back(s);
|
|
308
|
+
}
|
|
309
|
+
return services;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
void Runtime::sendData(Data data, MessagePurpose purpose, const std::string& sender, std::function<void(Data)> callback)
|
|
313
|
+
{
|
|
314
|
+
// Marshal onto the event loop and hand the serialized frame to the shared
|
|
315
|
+
// Server WebSocket, which fans it out to the connections bound to this
|
|
316
|
+
// runtime. (Server::sendNotification / Crow's send_binary are thread-safe.)
|
|
317
|
+
//
|
|
318
|
+
// Capture app + runtimeId by value, not `this`: this callback runs later, and
|
|
319
|
+
// a notification posted just before the Runtime is torn down (e.g. a worker's
|
|
320
|
+
// final emit during shutdown) must not dereference a freed Runtime.
|
|
321
|
+
App* app = m_app.get();
|
|
322
|
+
std::string runtimeId = m_runtimeId;
|
|
323
|
+
std::string space = m_space;
|
|
324
|
+
// The run this is said in, read now: by the time the callback runs the call
|
|
325
|
+
// has returned and the runtime is in another run, or in none.
|
|
326
|
+
//
|
|
327
|
+
// Said outside any call it is the board's own work, and that run is shared
|
|
328
|
+
// rather than copied: this is the path a meter or a streaming source takes
|
|
329
|
+
// many times a second.
|
|
330
|
+
std::shared_ptr<const ProcessContext> run;
|
|
331
|
+
if (const auto* current = currentContext())
|
|
332
|
+
{
|
|
333
|
+
run = current == m_boardRun.get()
|
|
334
|
+
? m_boardRun
|
|
335
|
+
: std::make_shared<const ProcessContext>(*current);
|
|
336
|
+
}
|
|
337
|
+
else
|
|
338
|
+
{
|
|
339
|
+
run = autonomousRun();
|
|
340
|
+
}
|
|
341
|
+
app->postCallback([app, runtimeId, space, data, purpose, sender, run = std::move(run)]() {
|
|
342
|
+
try
|
|
343
|
+
{
|
|
344
|
+
// Before serializing for the clients watching: a sink takes the value
|
|
345
|
+
// as it is, and must not lose it to a frame that cannot be built.
|
|
346
|
+
app->emitRuntimeData(runtimeId, data, purpose, sender, space, run.get());
|
|
347
|
+
}
|
|
348
|
+
catch (const std::exception& e)
|
|
349
|
+
{
|
|
350
|
+
std::cerr << "Runtime::sendData: output sink failed: " << e.what() << std::endl;
|
|
351
|
+
}
|
|
352
|
+
try
|
|
353
|
+
{
|
|
354
|
+
// The server's sockets watch what its clients created. A board's
|
|
355
|
+
// runtime is heard through its coordinator alone.
|
|
356
|
+
auto server = app->getServer();
|
|
357
|
+
if (server && space.empty())
|
|
358
|
+
{
|
|
359
|
+
server->sendNotification(runtimeId, Message::serializeToString(data, purpose, sender));
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
catch (const std::exception& e)
|
|
363
|
+
{
|
|
364
|
+
// A single unserializable payload (e.g. a streamed text chunk split
|
|
365
|
+
// mid-UTF-8) must never terminate the event-loop thread and take the whole
|
|
366
|
+
// process with it. Drop it and carry on.
|
|
367
|
+
std::cerr << "Runtime::sendData: dropping notification: " << e.what() << std::endl;
|
|
368
|
+
}
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
MountHandle Runtime::mountEndpoint(const std::string& name, MountAdopter adopter)
|
|
373
|
+
{
|
|
374
|
+
auto server = m_app->getServer();
|
|
375
|
+
return server
|
|
376
|
+
? server->mount(m_boardName, m_runtimeId, name, std::move(adopter), !m_space.empty())
|
|
377
|
+
: MountHandle();
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
void Runtime::notifyProcessFinished(const Service& service, const Data& data)
|
|
381
|
+
{
|
|
382
|
+
// Same lifecycle event the synchronous loop sends, but driven by emit() when
|
|
383
|
+
// deferred async work lands — so a service's processing indicator brackets the
|
|
384
|
+
// real duration instead of the instant deferCompletion() return.
|
|
385
|
+
sendServiceLifecycleNotification(service, "call-process-finished", data);
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
const ProcessContext* Runtime::currentContext() const
|
|
389
|
+
{
|
|
390
|
+
// Another runtime's call on this thread is not this runtime's: the nearest
|
|
391
|
+
// frame of its own is, and there are never more than a few to pass over.
|
|
392
|
+
for (const auto* frame = t_frame; frame; frame = frame->outer)
|
|
393
|
+
{
|
|
394
|
+
if (frame->runtime == this)
|
|
395
|
+
return frame->context;
|
|
396
|
+
}
|
|
397
|
+
return nullptr;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
std::shared_ptr<const ProcessContext> Runtime::autonomousRun() const
|
|
401
|
+
{
|
|
402
|
+
// An identity per emission is what lets a log tell one tick from the next,
|
|
403
|
+
// and a log is the only thing that reads it. A board that keeps none gets
|
|
404
|
+
// the one run this runtime stands in, at the cost of a reference count.
|
|
405
|
+
if (m_logging)
|
|
406
|
+
return std::make_shared<const ProcessContext>(ProcessContext::newRun("board"));
|
|
407
|
+
return m_boardRun;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
Data Runtime::process(Data data)
|
|
411
|
+
{
|
|
412
|
+
const auto run = autonomousRun();
|
|
413
|
+
return process(std::move(data), *run);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
Data Runtime::process(Data data, const ProcessContext& context)
|
|
417
|
+
{
|
|
418
|
+
// Restored rather than cleared, so that a service calling back into this
|
|
419
|
+
// runtime from inside its own process — the pull a cache miss performs —
|
|
420
|
+
// leaves the outer call running under what it started with.
|
|
421
|
+
ContextScope scope(this, &context);
|
|
422
|
+
|
|
423
|
+
// Every onProcessBegin is paired with an onProcessEnd, empty runtime included:
|
|
424
|
+
// the depth they count decides when a result leaves this runtime, and one
|
|
425
|
+
// left unbalanced keeps every later result from leaving. With no services the
|
|
426
|
+
// input is the result, passed on unchanged.
|
|
427
|
+
onProcessBegin();
|
|
428
|
+
auto result = m_services.empty() ? data : processFrom(*m_services.front(), data, false);
|
|
429
|
+
return onProcessEnd(result, &context);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
Data Runtime::processAt(const std::string& instanceId, Data data)
|
|
433
|
+
{
|
|
434
|
+
const auto run = autonomousRun();
|
|
435
|
+
return processAt(instanceId, std::move(data), *run);
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
Data Runtime::processAt(const std::string& instanceId, Data data,
|
|
439
|
+
const ProcessContext& context)
|
|
440
|
+
{
|
|
441
|
+
auto it = findServiceById(instanceId);
|
|
442
|
+
if (it == m_services.cend())
|
|
443
|
+
{
|
|
444
|
+
// Not one of this runtime's own: a scoped address enters the pipeline that
|
|
445
|
+
// holds it instead, and runs to the end of *that* list. What it produces is
|
|
446
|
+
// the nested pipeline's answer.
|
|
447
|
+
const auto segments = splitAddress(instanceId);
|
|
448
|
+
if (segments.size() > 1)
|
|
449
|
+
{
|
|
450
|
+
auto head = findServiceById(segments[0]);
|
|
451
|
+
if (head != m_services.cend())
|
|
452
|
+
{
|
|
453
|
+
Data nested;
|
|
454
|
+
if ((*head)->processNested(restOfAddress(segments, 1), data, nested))
|
|
455
|
+
return nested;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
throw std::runtime_error("Runtime::processAt service not found in runtime");
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
// The same context bookkeeping process() does, and for the same reason: a
|
|
462
|
+
// service pulling back into this runtime from inside its own call must leave
|
|
463
|
+
// the outer call running under what it started with.
|
|
464
|
+
ContextScope scope(this, &context);
|
|
465
|
+
|
|
466
|
+
onProcessBegin();
|
|
467
|
+
auto result = processFrom(**it, data, /*advanceBefore=*/false);
|
|
468
|
+
return onProcessEnd(result, &context);
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
Data Runtime::withContext(const ProcessContext& context, std::function<Data()> fn)
|
|
472
|
+
{
|
|
473
|
+
ContextScope scope(this, &context);
|
|
474
|
+
return fn();
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
bool Runtime::holdsService(const std::string& instanceId) const
|
|
478
|
+
{
|
|
479
|
+
if (findServiceById(instanceId) != m_services.cend())
|
|
480
|
+
{
|
|
481
|
+
return true;
|
|
482
|
+
}
|
|
483
|
+
const auto segments = splitAddress(instanceId);
|
|
484
|
+
return segments.size() > 1 && findServiceById(segments[0]) != m_services.cend();
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
void Runtime::log(const Service& svc, LogLevel level, const std::string& event,
|
|
488
|
+
const nlohmann::json& data)
|
|
489
|
+
{
|
|
490
|
+
// Nothing to attribute an entry to means nothing worth recording: a service
|
|
491
|
+
// logging outside a call has no run, and an entry naming no run cannot be
|
|
492
|
+
// found again.
|
|
493
|
+
//
|
|
494
|
+
// Deliberately not also skipping when no local target is registered: entries
|
|
495
|
+
// leave this runtime over its socket as well, so "nobody registered a
|
|
496
|
+
// callback here" does not mean nobody is collecting. Whether anything is
|
|
497
|
+
// attached to that socket is the server's to know.
|
|
498
|
+
//
|
|
499
|
+
// Below the level the board keeps is the same as off: no entry is built.
|
|
500
|
+
if (!m_logging || levelRank(level) < levelRank(m_logLevel))
|
|
501
|
+
return;
|
|
502
|
+
const auto* run = currentContext();
|
|
503
|
+
if (!run)
|
|
504
|
+
return;
|
|
505
|
+
|
|
506
|
+
LogEntry entry;
|
|
507
|
+
entry.runId = run->runId;
|
|
508
|
+
entry.parentRunId = run->parentRunId;
|
|
509
|
+
if (const auto person = run->personActor())
|
|
510
|
+
entry.caller = person->caller.sub;
|
|
511
|
+
entry.ts = isoTimestamp();
|
|
512
|
+
entry.runtimeId = m_runtimeId;
|
|
513
|
+
entry.serviceUuid = svc.getId();
|
|
514
|
+
entry.level = level;
|
|
515
|
+
entry.event = event;
|
|
516
|
+
if (m_logData && !data.is_null())
|
|
517
|
+
entry.data = data;
|
|
518
|
+
|
|
519
|
+
forwardLog(entry);
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
void Runtime::forwardLog(const LogEntry& entry)
|
|
523
|
+
{
|
|
524
|
+
for (const auto& target : m_logTargets)
|
|
525
|
+
target(entry);
|
|
526
|
+
|
|
527
|
+
// Out to whoever is collecting this runtime's output — in a deployed board,
|
|
528
|
+
// the coordinator, which is the only instance that keeps a board's log.
|
|
529
|
+
//
|
|
530
|
+
// Captured by value rather than through `this`, as sendData is and for the
|
|
531
|
+
// same reason: this runs later, and an entry recorded just before teardown
|
|
532
|
+
// must not dereference a freed Runtime.
|
|
533
|
+
App* app = m_app.get();
|
|
534
|
+
const std::string runtimeId = m_runtimeId;
|
|
535
|
+
const std::string space = m_space;
|
|
536
|
+
const nlohmann::json message = {{"type", "log"}, {"entry", entry.toJson()}};
|
|
537
|
+
app->postCallback([app, runtimeId, space, message, entry]() {
|
|
538
|
+
try
|
|
539
|
+
{
|
|
540
|
+
app->emitRuntimeLog(runtimeId, entry, space);
|
|
541
|
+
}
|
|
542
|
+
catch (const std::exception& e)
|
|
543
|
+
{
|
|
544
|
+
std::cerr << "Runtime::forwardLog: output sink failed: " << e.what() << std::endl;
|
|
545
|
+
}
|
|
546
|
+
try
|
|
547
|
+
{
|
|
548
|
+
if (auto server = app->getServer(); server && space.empty())
|
|
549
|
+
{
|
|
550
|
+
server->sendText(runtimeId, message.dump());
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
catch (const std::exception& e)
|
|
554
|
+
{
|
|
555
|
+
// Losing an entry is not worth taking the event loop down for.
|
|
556
|
+
std::cerr << "Runtime::forwardLog: dropping entry: " << e.what() << std::endl;
|
|
557
|
+
}
|
|
558
|
+
});
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
void Runtime::registerLogTarget(std::function<void(const LogEntry&)> target)
|
|
562
|
+
{
|
|
563
|
+
m_logTargets.push_back(std::move(target));
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
Data Runtime::processFrom(const Service &service, Data data, bool advanceBefore, std::function<void(Data)> callback)
|
|
567
|
+
{
|
|
568
|
+
const ProcessContext* run = currentContext();
|
|
569
|
+
if (!run)
|
|
570
|
+
{
|
|
571
|
+
// Nobody asked for this: a source handing on what it produced. Entered
|
|
572
|
+
// without a copy, a closure or an id of its own, because a streaming
|
|
573
|
+
// source arrives here for every buffer.
|
|
574
|
+
const auto autonomous = autonomousRun();
|
|
575
|
+
ContextScope scope(this, autonomous.get());
|
|
576
|
+
return processFrom(service, std::move(data), advanceBefore, std::move(callback));
|
|
577
|
+
}
|
|
578
|
+
onProcessBegin();
|
|
579
|
+
auto it = findServiceById(service.getId());
|
|
580
|
+
if (it == m_services.cend())
|
|
581
|
+
{
|
|
582
|
+
throw std::runtime_error("Runtime::processNext service not found in runtime");
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
for (auto next = advanceBefore ? std::next(it) : it;
|
|
586
|
+
next != m_services.cend();
|
|
587
|
+
++next)
|
|
588
|
+
{
|
|
589
|
+
if (run->expired())
|
|
590
|
+
return onProcessEnd(Null());
|
|
591
|
+
sendServiceLifecycleNotification(**next, "call-process", data);
|
|
592
|
+
// The flow itself, at debug: which service the runtime called, and below,
|
|
593
|
+
// what it returned and how long it took.
|
|
594
|
+
//
|
|
595
|
+
// Deliberately without the value flowing through. The level says how much
|
|
596
|
+
// of the shape of a run to keep, and turning it up must not also start
|
|
597
|
+
// recording the data — what flows through is recorded only where a service
|
|
598
|
+
// was configured to record it.
|
|
599
|
+
log(**next, LogLevel::Debug, "service.process");
|
|
600
|
+
// Timed only when the duration will be kept; see below.
|
|
601
|
+
const bool timed = m_logging && levelRank(LogLevel::Debug) >= levelRank(m_logLevel);
|
|
602
|
+
const auto startedAt = timed
|
|
603
|
+
? std::chrono::steady_clock::now()
|
|
604
|
+
: std::chrono::steady_clock::time_point();
|
|
605
|
+
data = (*next)->startProcess(data);
|
|
606
|
+
if ((*next)->takeProcessDeferred())
|
|
607
|
+
{
|
|
608
|
+
// The service handed its work to a worker and will emit() the real result
|
|
609
|
+
// later; emit() sends this service's "call-process-finished" then. Withhold
|
|
610
|
+
// it here and stop the synchronous push (the deferred result re-enters via
|
|
611
|
+
// emit → nextAsync, driving the services that follow).
|
|
612
|
+
return onProcessEnd(Null());
|
|
613
|
+
}
|
|
614
|
+
sendServiceLifecycleNotification(**next, "call-process-finished", data);
|
|
615
|
+
// Built only when it will be kept: this is inside the loop every pass
|
|
616
|
+
// runs, and an entry is several strings and a timestamp.
|
|
617
|
+
if (timed)
|
|
618
|
+
{
|
|
619
|
+
LogEntry done;
|
|
620
|
+
done.runId = run->runId;
|
|
621
|
+
done.parentRunId = run->parentRunId;
|
|
622
|
+
if (const auto person = run->personActor())
|
|
623
|
+
done.caller = person->caller.sub;
|
|
624
|
+
done.ts = isoTimestamp();
|
|
625
|
+
done.runtimeId = m_runtimeId;
|
|
626
|
+
done.serviceUuid = (*next)->getId();
|
|
627
|
+
done.level = LogLevel::Debug;
|
|
628
|
+
done.event = "service.processed";
|
|
629
|
+
done.durationMs = std::chrono::duration<double, std::milli>(
|
|
630
|
+
std::chrono::steady_clock::now() - startedAt).count();
|
|
631
|
+
forwardLog(done);
|
|
632
|
+
}
|
|
633
|
+
if (isNull(data)) // stop processing on null
|
|
634
|
+
{
|
|
635
|
+
// Where the run ended, named. Above debug because it is the outcome of
|
|
636
|
+
// the run rather than a step in it.
|
|
637
|
+
log(**next, LogLevel::Info, "pipeline.stopped");
|
|
638
|
+
return onProcessEnd(data);
|
|
639
|
+
}
|
|
640
|
+
if (isEarlyReturn(data))
|
|
641
|
+
{
|
|
642
|
+
return onProcessEnd(getControlFlowData(data), nullptr, callback);
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
return onProcessEnd(data, nullptr, callback);
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
void Runtime::sendServiceLifecycleNotification(const Service& service, const std::string& state, const Data& data)
|
|
649
|
+
{
|
|
650
|
+
sendData(lifecycleNotification(state, data, capturesCalls()), MessagePurpose::NOTIFICATION,
|
|
651
|
+
service.getId());
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
void Runtime::post(std::function<void()> fn)
|
|
655
|
+
{
|
|
656
|
+
m_app->postCallback(std::move(fn));
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
void Runtime::scheduleProcessFrom(const Service &service, Data data, bool advanceBefore)
|
|
660
|
+
{
|
|
661
|
+
auto pService = &service;
|
|
662
|
+
for (size_t idx = 0; idx < m_scheduledProcesses.size(); ++idx)
|
|
663
|
+
{
|
|
664
|
+
if (!m_scheduledProcesses[idx])
|
|
665
|
+
{
|
|
666
|
+
m_scheduledProcesses[idx] = [this, pService, data, advanceBefore]() {
|
|
667
|
+
return this->processFrom(*pService, data, advanceBefore);
|
|
668
|
+
};
|
|
669
|
+
m_app->postCallback([this]() { processScheduled(); });
|
|
670
|
+
return;
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
std::cout << "Runtime::scheduleProcessFrom() No empty slot available in m_scheduledProcesses" << std::endl;
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
void Runtime::processScheduled()
|
|
678
|
+
{
|
|
679
|
+
auto cpy = m_scheduledProcesses;
|
|
680
|
+
m_scheduledProcesses.fill(nullptr); // clear scheduled processes
|
|
681
|
+
for (auto &process : cpy)
|
|
682
|
+
{
|
|
683
|
+
if (process)
|
|
684
|
+
{
|
|
685
|
+
process();
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
json Runtime::appendService(const ServiceConfiguration& newService)
|
|
691
|
+
{
|
|
692
|
+
auto svc = m_app->createService(newService.serviceId, newService.instanceId);
|
|
693
|
+
if (!svc)
|
|
694
|
+
{
|
|
695
|
+
return false;
|
|
696
|
+
}
|
|
697
|
+
svc->setParentRuntime(*this);
|
|
698
|
+
m_services.push_back(svc);
|
|
699
|
+
if (!newService.state.is_null())
|
|
700
|
+
{
|
|
701
|
+
return svc->configure(newService.state);
|
|
702
|
+
}
|
|
703
|
+
return svc->getState();
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
bool Runtime::removeService(const std::string& instanceId)
|
|
707
|
+
{
|
|
708
|
+
auto it = findServiceById(instanceId);
|
|
709
|
+
if (it == m_services.end())
|
|
710
|
+
{
|
|
711
|
+
return false;
|
|
712
|
+
}
|
|
713
|
+
m_services.erase(it);
|
|
714
|
+
return true;
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
bool Runtime::insertService(std::shared_ptr<Service> newService, std::shared_ptr<Service> predecessor)
|
|
718
|
+
{
|
|
719
|
+
if (predecessor)
|
|
720
|
+
{
|
|
721
|
+
auto it = findServiceById(predecessor->getId());
|
|
722
|
+
if (it == m_services.cend())
|
|
723
|
+
{
|
|
724
|
+
throw std::runtime_error("Runtime::insert: predecessor not found in runtime");
|
|
725
|
+
}
|
|
726
|
+
m_services.insert(std::next(it), newService);
|
|
727
|
+
return true;
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
m_services.push_back(newService);
|
|
731
|
+
return true;
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
std::shared_ptr<SubRuntime> Runtime::createSubRuntime(const Service& ownerInParent,
|
|
735
|
+
const json& servicesConfig)
|
|
736
|
+
{
|
|
737
|
+
auto factory = [this](const std::string& serviceId, const std::string& instanceId)
|
|
738
|
+
{
|
|
739
|
+
return m_app->createService(serviceId, instanceId);
|
|
740
|
+
};
|
|
741
|
+
auto post = [this](std::function<void()> fn)
|
|
742
|
+
{
|
|
743
|
+
m_app->postCallback(std::move(fn));
|
|
744
|
+
};
|
|
745
|
+
|
|
746
|
+
auto sr = std::make_shared<SubRuntime>(*this, &ownerInParent,
|
|
747
|
+
std::move(factory), std::move(post));
|
|
748
|
+
sr->populate(servicesConfig);
|
|
749
|
+
return sr;
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
bool Runtime::rearrangeServices(const std::vector<std::string>& newOrder)
|
|
753
|
+
{
|
|
754
|
+
std::list<std::shared_ptr<Service>> sorted;
|
|
755
|
+
for (auto &id : newOrder)
|
|
756
|
+
{
|
|
757
|
+
auto it = findServiceById(id);
|
|
758
|
+
if (it == m_services.cend())
|
|
759
|
+
{
|
|
760
|
+
return false;
|
|
761
|
+
}
|
|
762
|
+
sorted.push_back(*it);
|
|
763
|
+
}
|
|
764
|
+
m_services = sorted;
|
|
765
|
+
return true;
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
bool Runtime::isConnected(const Service &svc) const
|
|
769
|
+
{
|
|
770
|
+
return findServiceById(svc.getId()) != m_services.cend();
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
std::list<std::shared_ptr<Service>>::const_iterator Runtime::findServiceById(const std::string& instanceId)
|
|
774
|
+
{
|
|
775
|
+
return std::find_if(
|
|
776
|
+
m_services.begin(),
|
|
777
|
+
m_services.end(),
|
|
778
|
+
[&instanceId](auto svc) { return svc->getId() == instanceId; }
|
|
779
|
+
);
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
std::list<std::shared_ptr<Service>>::const_iterator Runtime::findServiceById(const std::string& instanceId) const
|
|
783
|
+
{
|
|
784
|
+
return std::find_if(
|
|
785
|
+
m_services.cbegin(),
|
|
786
|
+
m_services.cend(),
|
|
787
|
+
[&instanceId](auto ptr) { return ptr.get()->getId() == instanceId; }
|
|
788
|
+
);
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
std::shared_ptr<Service> Runtime::resolveService(const std::string& address) const
|
|
792
|
+
{
|
|
793
|
+
auto direct = findServiceById(address);
|
|
794
|
+
if (direct != m_services.cend())
|
|
795
|
+
return *direct;
|
|
796
|
+
|
|
797
|
+
const auto segments = splitAddress(address);
|
|
798
|
+
if (segments.size() < 2)
|
|
799
|
+
return nullptr;
|
|
800
|
+
|
|
801
|
+
auto head = findServiceById(segments[0]);
|
|
802
|
+
if (head == m_services.cend())
|
|
803
|
+
return nullptr;
|
|
804
|
+
|
|
805
|
+
// A partial address is a miss, not a match: answering with the nearest
|
|
806
|
+
// service the path did reach would act on something nobody named.
|
|
807
|
+
std::shared_ptr<Service> current = *head;
|
|
808
|
+
for (size_t i = 1; i < segments.size(); ++i)
|
|
809
|
+
{
|
|
810
|
+
current = current->findNested(segments[i]);
|
|
811
|
+
if (!current)
|
|
812
|
+
return nullptr;
|
|
813
|
+
}
|
|
814
|
+
return current;
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
std::string Runtime::replaceHostWithExternalAddress(std::string url) const
|
|
818
|
+
{
|
|
819
|
+
if (!m_app->getServer())
|
|
820
|
+
{
|
|
821
|
+
return url;
|
|
822
|
+
}
|
|
823
|
+
return replaceAll(url, "0.0.0.0", m_app->getServer()->externalIP());
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
std::string Runtime::getRuntimeUrl() const
|
|
827
|
+
{
|
|
828
|
+
if (!m_app->getServer())
|
|
829
|
+
{
|
|
830
|
+
std::cerr << "Runtime::getRuntimeUrl: no server available" << std::endl;
|
|
831
|
+
return "";
|
|
832
|
+
}
|
|
833
|
+
return m_app->getServer()->externalIP() + ":" + std::to_string(m_app->getServer()->port()) + "/runtimes/" + m_runtimeId;
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
void Runtime::onProcessBegin()
|
|
837
|
+
{
|
|
838
|
+
m_processDepth.increment();
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
const Data& Runtime::onProcessEnd(const Data& data, const ProcessContext* context, std::function<void(Data)> callback)
|
|
842
|
+
{
|
|
843
|
+
static const std::string noRequest;
|
|
844
|
+
const std::string& awaited = context ? context->requestId : noRequest;
|
|
845
|
+
if (m_processDepth.decrement() == 0)
|
|
846
|
+
{
|
|
847
|
+
// If we are the last initiator, communicate the result to whoever is
|
|
848
|
+
// listening on this runtime — the next runtime in the chain. Whether the
|
|
849
|
+
// runtime was created with a board name does not matter: an unnamed board
|
|
850
|
+
// chains the same way, and with no listener sendData delivers nothing.
|
|
851
|
+
std::string requestId = "RUNTIME";
|
|
852
|
+
auto purpose = MessagePurpose::RESULT;
|
|
853
|
+
if (callback)
|
|
854
|
+
{
|
|
855
|
+
requestId = generateUUID();
|
|
856
|
+
}
|
|
857
|
+
else if (!awaited.empty())
|
|
858
|
+
{
|
|
859
|
+
requestId = awaited;
|
|
860
|
+
}
|
|
861
|
+
if (callback)
|
|
862
|
+
{
|
|
863
|
+
purpose = MessagePurpose::RESULT_AWAITING_RESPONSE;
|
|
864
|
+
std::cout << "Await pending resolve for request: " << requestId << std::endl;
|
|
865
|
+
if (!storePendingCallback(requestId, callback))
|
|
866
|
+
{
|
|
867
|
+
std::cerr << "Runtime::onProcessEnd: No empty slot available in m_pendingResolve" << std::endl;
|
|
868
|
+
}
|
|
869
|
+
}
|
|
870
|
+
else if (!awaited.empty())
|
|
871
|
+
{
|
|
872
|
+
purpose = MessagePurpose::RESULT_WITH_REQUEST_ID;
|
|
873
|
+
}
|
|
874
|
+
sendData(data, purpose, requestId, callback);
|
|
875
|
+
}
|
|
876
|
+
return data;
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
bool Runtime::storePendingCallback(const std::string& requestId, std::function<void(Data)> callback)
|
|
880
|
+
{
|
|
881
|
+
for (auto& slot : m_pendingResolve)
|
|
882
|
+
{
|
|
883
|
+
if (slot.callback == nullptr)
|
|
884
|
+
{
|
|
885
|
+
slot.requestId = requestId;
|
|
886
|
+
slot.callback = callback;
|
|
887
|
+
return true;
|
|
888
|
+
}
|
|
889
|
+
}
|
|
890
|
+
return false;
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
std::function<void(Data)> Runtime::findAndRemovePendingCallback(const std::string& requestId)
|
|
894
|
+
{
|
|
895
|
+
for (auto& slot : m_pendingResolve)
|
|
896
|
+
{
|
|
897
|
+
if (slot.callback != nullptr && slot.requestId == requestId)
|
|
898
|
+
{
|
|
899
|
+
auto callback = slot.callback;
|
|
900
|
+
slot.callback = nullptr;
|
|
901
|
+
slot.requestId.clear();
|
|
902
|
+
return callback;
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
return nullptr;
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
void Runtime::onSessionBinaryData(Data data, MessageHeader header, const Caller& caller)
|
|
909
|
+
{
|
|
910
|
+
if (header.messagePurpose == MessagePurpose::NOTIFICATION)
|
|
911
|
+
{
|
|
912
|
+
auto requestId = header.sender;
|
|
913
|
+
auto callback = findAndRemovePendingCallback(requestId);
|
|
914
|
+
if (callback)
|
|
915
|
+
{
|
|
916
|
+
callback(data);
|
|
917
|
+
}
|
|
918
|
+
else
|
|
919
|
+
{
|
|
920
|
+
std::cout << "Runtime::onSessionBinaryData: no pending resolve available" << std::endl;
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
else
|
|
924
|
+
{
|
|
925
|
+
// A frame has no room for a run context, so the pass begins a run of its
|
|
926
|
+
// own — as whoever opened the socket.
|
|
927
|
+
this->process(data, ProcessContext::forClient(json(), caller));
|
|
928
|
+
}
|
|
929
|
+
}
|
|
930
|
+
|
|
931
|
+
void Runtime::onSessionJSONData(json msg, const Caller& caller)
|
|
932
|
+
{
|
|
933
|
+
auto data = msg["params"];
|
|
934
|
+
auto context = msg["context"];
|
|
935
|
+
auto type = msg["type"].get<std::string>();
|
|
936
|
+
if (type == "processRuntime")
|
|
937
|
+
{
|
|
938
|
+
// A null payload is a run with nothing on the input, not a malformed
|
|
939
|
+
// message: JSON has no undefined, so that is how a sender says it. The
|
|
940
|
+
// first service is handed Undefined, which is what it is given anywhere
|
|
941
|
+
// else nothing precedes it.
|
|
942
|
+
// The run is the one the message names. Who is calling is not the
|
|
943
|
+
// message's to say: it is whoever opened this socket.
|
|
944
|
+
process(data.is_null() ? Data() : Data(data), ProcessContext::forClient(context, caller));
|
|
945
|
+
}
|
|
946
|
+
else if (type == "resolveResult")
|
|
947
|
+
{
|
|
948
|
+
if (data.is_null())
|
|
949
|
+
{
|
|
950
|
+
std::cout << "Runtime::onSessionJSONData: received null result: " << msg.dump() << std::endl;
|
|
951
|
+
return;
|
|
952
|
+
}
|
|
953
|
+
std::cout << "Need to resolve the result: " << data << context << std::endl;
|
|
954
|
+
auto requestId = ProcessContext::fromJson(context).requestId;
|
|
955
|
+
auto callback = findAndRemovePendingCallback(requestId);
|
|
956
|
+
if (callback)
|
|
957
|
+
{
|
|
958
|
+
// A JSON string arriving here was originally a C++ std::string (e.g. an
|
|
959
|
+
// HTML page) that was round-tripped through the browser WebSocket as a
|
|
960
|
+
// JSON-encoded string. Re-wrap it as Data(std::string) so that
|
|
961
|
+
// sendResult() dispatches to sendHtmlResponse() rather than
|
|
962
|
+
// sendJsonResponseWithCors().
|
|
963
|
+
if (data.is_string())
|
|
964
|
+
{
|
|
965
|
+
auto str = data.get<std::string>();
|
|
966
|
+
Data d = Data(str);
|
|
967
|
+
callback(d);
|
|
968
|
+
}
|
|
969
|
+
else
|
|
970
|
+
{
|
|
971
|
+
Data d = Data(data);
|
|
972
|
+
callback(d);
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
else
|
|
976
|
+
{
|
|
977
|
+
std::cout << "Runtime::onSessionJSONData: no pending resolve available" << std::endl;
|
|
978
|
+
}
|
|
979
|
+
}
|
|
980
|
+
else
|
|
981
|
+
{
|
|
982
|
+
std::cout << "Runtime::onSessionJSONData: unsupported message type: " << msg["type"] << std::endl;
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
}
|