@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,251 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
# Service Documentation
|
|
4
|
+
# Service ID: tracks
|
|
5
|
+
# Service Name: Tracks
|
|
6
|
+
# Runtime: hkp-python
|
|
7
|
+
# Modes: serial | parallel
|
|
8
|
+
# Key Config: tracks, reduce, run, bypass
|
|
9
|
+
# IO: in=any -> out=what the reducer made of the tracks' answers
|
|
10
|
+
# Arrays: the answers are an array, one element per track, in declaration order
|
|
11
|
+
# Binary: handed to every track untouched
|
|
12
|
+
# MixedData: not native in runtime
|
|
13
|
+
|
|
14
|
+
"""Several pipelines over one input, and one answer out.
|
|
15
|
+
|
|
16
|
+
``iterator`` runs one pipeline over many items. This is the other half of that
|
|
17
|
+
pair: many pipelines over one item. A board that has to do two unrelated things
|
|
18
|
+
with the same value — write it to a table *and* tell somebody about it, ask
|
|
19
|
+
three services and compare — has otherwise to fake it by putting those things in
|
|
20
|
+
a row and teaching each of them to pass its input through. That works and says
|
|
21
|
+
nothing: nothing in the board records that they are siblings rather than a
|
|
22
|
+
sequence, in which order they may run, or which of their answers matters.
|
|
23
|
+
|
|
24
|
+
input ──┬── track ── answer ──┬── reduce ── output
|
|
25
|
+
├── track ── answer ──┤
|
|
26
|
+
└── track ── answer ──┘
|
|
27
|
+
|
|
28
|
+
**Every track is given the same input.** They do not feed each other, which is
|
|
29
|
+
the whole point: a track can be read on its own.
|
|
30
|
+
|
|
31
|
+
**The answers are a list with one element per track, nulls included.** A track
|
|
32
|
+
that stopped — declined, found nothing, failed — leaves a hole rather than being
|
|
33
|
+
left out, so position still names the track that produced it.
|
|
34
|
+
|
|
35
|
+
**``reduce`` is a pipeline, not a list of strategies.** It is given
|
|
36
|
+
``{"input": …, "results": [...]}``: the value the tracks were run on, and what
|
|
37
|
+
they answered. Carrying on as though the tracks were side effects is then
|
|
38
|
+
``{"=": "params.input"}``. With no reducer the answers travel on as they are,
|
|
39
|
+
and a reducer returning ``None`` stops the pipeline as any service does.
|
|
40
|
+
|
|
41
|
+
**``run`` is recorded and honoured where a runtime can.** This one cannot: the
|
|
42
|
+
python runtime processes synchronously, so tracks here always run one at a time.
|
|
43
|
+
A board says the same thing in either runtime and gets the same answers; only
|
|
44
|
+
the wall clock differs.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
from typing import Any, Callable
|
|
48
|
+
|
|
49
|
+
from ..types import (
|
|
50
|
+
JsonRecord,
|
|
51
|
+
NotifyCallback,
|
|
52
|
+
RuntimeHost,
|
|
53
|
+
ServiceConfiguration,
|
|
54
|
+
ServiceCreator,
|
|
55
|
+
ServiceRegistryEntry,
|
|
56
|
+
SlotStore,
|
|
57
|
+
)
|
|
58
|
+
from .nested_pipeline import NestedPipeline
|
|
59
|
+
from .sub_service import _is_json_record
|
|
60
|
+
|
|
61
|
+
TRACKS_DESCRIPTOR = ServiceRegistryEntry(
|
|
62
|
+
service_id="tracks",
|
|
63
|
+
service_name="Tracks",
|
|
64
|
+
version="v1",
|
|
65
|
+
capabilities=["subservices"],
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
RUN_MODES = ("serial", "parallel")
|
|
69
|
+
|
|
70
|
+
#: What the reducer answers to when an edit names a branch. A track may not take it.
|
|
71
|
+
REDUCE = "reduce"
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class _Track:
|
|
75
|
+
def __init__(self, name: str, bypass: bool, pipeline: NestedPipeline) -> None:
|
|
76
|
+
self.name = name
|
|
77
|
+
self.bypass = bypass
|
|
78
|
+
self.pipeline = pipeline
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class TracksService:
|
|
82
|
+
service_id = TRACKS_DESCRIPTOR.service_id
|
|
83
|
+
service_name = TRACKS_DESCRIPTOR.service_name
|
|
84
|
+
version = TRACKS_DESCRIPTOR.version
|
|
85
|
+
capabilities = TRACKS_DESCRIPTOR.capabilities
|
|
86
|
+
|
|
87
|
+
def __init__(self, config: ServiceConfiguration, create_service: ServiceCreator) -> None:
|
|
88
|
+
self.uuid = config.uuid
|
|
89
|
+
self._create_service = create_service
|
|
90
|
+
self._host: RuntimeHost | None = None
|
|
91
|
+
self._bypass = False
|
|
92
|
+
self._run = "serial"
|
|
93
|
+
self._tracks: list[_Track] = []
|
|
94
|
+
#: The cells this service's pipelines hold values in.
|
|
95
|
+
#:
|
|
96
|
+
#: Owned here, like an endpoint's: the branches are pipelines of one
|
|
97
|
+
#: arrangement, so a value one leaves for another belongs to this
|
|
98
|
+
#: service rather than to the runtime around it — and two of these on a
|
|
99
|
+
#: runtime may both use a name without meeting.
|
|
100
|
+
self._slot_store = SlotStore()
|
|
101
|
+
self._reduce = NestedPipeline(
|
|
102
|
+
f"{self.uuid}:{REDUCE}", create_service, "Tracks", self.uuid
|
|
103
|
+
)
|
|
104
|
+
self._reduce.share_slots(self._slot_store)
|
|
105
|
+
self._last_error = ""
|
|
106
|
+
|
|
107
|
+
if config.state:
|
|
108
|
+
self.configure(config.state)
|
|
109
|
+
|
|
110
|
+
def set_host(self, host: RuntimeHost) -> None:
|
|
111
|
+
self._host = host
|
|
112
|
+
self._reduce.attach(host)
|
|
113
|
+
for track in self._tracks:
|
|
114
|
+
track.pipeline.attach(host)
|
|
115
|
+
|
|
116
|
+
def find_nested(self, instance_id: str) -> Any | None:
|
|
117
|
+
"""The nested service a scoped address names, tracks first and in
|
|
118
|
+
declaration order, then the reducer. A name used in two tracks resolves
|
|
119
|
+
to the earlier, which is the cost of addressing a branch by what is in
|
|
120
|
+
it rather than by the branch's own name.
|
|
121
|
+
"""
|
|
122
|
+
for track in self._tracks:
|
|
123
|
+
found = track.pipeline.find(instance_id)
|
|
124
|
+
if found is not None:
|
|
125
|
+
return found
|
|
126
|
+
return self._reduce.find(instance_id)
|
|
127
|
+
|
|
128
|
+
def get_state(self) -> JsonRecord:
|
|
129
|
+
return {
|
|
130
|
+
"bypass": self._bypass,
|
|
131
|
+
"run": self._run,
|
|
132
|
+
"tracks": [
|
|
133
|
+
{"name": t.name, "bypass": t.bypass, "pipeline": t.pipeline.state()}
|
|
134
|
+
for t in self._tracks
|
|
135
|
+
],
|
|
136
|
+
"reduce": self._reduce.state(),
|
|
137
|
+
"error": self._last_error,
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
def configure(self, config: JsonRecord) -> JsonRecord:
|
|
141
|
+
# An edit naming a track is about one pipeline under this service rather
|
|
142
|
+
# than about the service; without it there is no way to say which.
|
|
143
|
+
if isinstance(config.get("track"), str):
|
|
144
|
+
self._configure_track(config["track"], config)
|
|
145
|
+
return self.get_state()
|
|
146
|
+
|
|
147
|
+
if isinstance(config.get("bypass"), bool):
|
|
148
|
+
self._bypass = config["bypass"]
|
|
149
|
+
if isinstance(config.get("run"), str) and config["run"] in RUN_MODES:
|
|
150
|
+
self._run = config["run"]
|
|
151
|
+
if isinstance(config.get("tracks"), list):
|
|
152
|
+
self._set_tracks(config["tracks"])
|
|
153
|
+
if isinstance(config.get("reduce"), list):
|
|
154
|
+
self._reduce.set_pipeline(config["reduce"])
|
|
155
|
+
|
|
156
|
+
return self.get_state()
|
|
157
|
+
|
|
158
|
+
def process(self, input: Any, _notify: NotifyCallback) -> Any:
|
|
159
|
+
if self._bypass or not self._tracks:
|
|
160
|
+
return input
|
|
161
|
+
|
|
162
|
+
parent = self._host.current_context() if self._host else None
|
|
163
|
+
results = [self._run_track(track, input, parent) for track in self._tracks]
|
|
164
|
+
|
|
165
|
+
if self._reduce.is_empty():
|
|
166
|
+
return results
|
|
167
|
+
return self._reduce.process({"input": input, "results": results}, parent)
|
|
168
|
+
|
|
169
|
+
def destroy(self) -> None:
|
|
170
|
+
self._reduce.destroy()
|
|
171
|
+
for track in self._tracks:
|
|
172
|
+
track.pipeline.destroy()
|
|
173
|
+
self._tracks = []
|
|
174
|
+
self._host = None
|
|
175
|
+
|
|
176
|
+
# ── Private ────────────────────────────────────────────────────────────────
|
|
177
|
+
|
|
178
|
+
def _run_track(self, track: _Track, input: Any, parent: Any) -> Any:
|
|
179
|
+
"""One track's answer, or None where it has none.
|
|
180
|
+
|
|
181
|
+
A track that raises is reported and leaves a hole rather than taking the
|
|
182
|
+
others down with it: they were given the same input and have nothing to
|
|
183
|
+
do with each other, which is exactly why they are tracks.
|
|
184
|
+
"""
|
|
185
|
+
if track.bypass or track.pipeline.is_empty():
|
|
186
|
+
return None
|
|
187
|
+
try:
|
|
188
|
+
return track.pipeline.process(input, parent)
|
|
189
|
+
except Exception as error: # noqa: BLE001 - reported, not swallowed
|
|
190
|
+
self._last_error = f"track '{track.name}' failed: {error}"
|
|
191
|
+
if self._host:
|
|
192
|
+
self._host.log("error", "service.failed", {"message": self._last_error})
|
|
193
|
+
return None
|
|
194
|
+
|
|
195
|
+
def _set_tracks(self, value: list[Any]) -> None:
|
|
196
|
+
previous = {track.name: track for track in self._tracks}
|
|
197
|
+
nxt: list[_Track] = []
|
|
198
|
+
|
|
199
|
+
for index, entry in enumerate(value):
|
|
200
|
+
if not _is_json_record(entry):
|
|
201
|
+
raise ValueError("every track is an object with a name and a pipeline")
|
|
202
|
+
# A name is what a reducer, a log and a panel call this track.
|
|
203
|
+
# Unnamed, it is called by the position it was declared in.
|
|
204
|
+
name = entry["name"] if isinstance(entry.get("name"), str) and entry.get("name") else str(index)
|
|
205
|
+
if name == REDUCE:
|
|
206
|
+
raise ValueError(f"'{REDUCE}' is the reducer's name and cannot be a track's")
|
|
207
|
+
if any(track.name == name for track in nxt):
|
|
208
|
+
raise ValueError(f"two tracks are both called '{name}'")
|
|
209
|
+
|
|
210
|
+
# A track already here keeps its pipeline: rebuilding it would
|
|
211
|
+
# destroy what is running inside it because a track beside it was
|
|
212
|
+
# edited.
|
|
213
|
+
existing = previous.pop(name, None)
|
|
214
|
+
pipeline = (
|
|
215
|
+
existing.pipeline
|
|
216
|
+
if existing
|
|
217
|
+
else NestedPipeline(
|
|
218
|
+
f"{self.uuid}:{name}", self._create_service, "Tracks", self.uuid
|
|
219
|
+
)
|
|
220
|
+
)
|
|
221
|
+
pipeline.share_slots(self._slot_store)
|
|
222
|
+
if isinstance(entry.get("pipeline"), list):
|
|
223
|
+
pipeline.set_pipeline(entry["pipeline"])
|
|
224
|
+
if existing is None and self._host:
|
|
225
|
+
pipeline.attach(self._host)
|
|
226
|
+
|
|
227
|
+
nxt.append(_Track(name, entry.get("bypass") is True, pipeline))
|
|
228
|
+
|
|
229
|
+
# Whatever is left was removed, and holds services nothing will reach.
|
|
230
|
+
for dropped in previous.values():
|
|
231
|
+
dropped.pipeline.destroy()
|
|
232
|
+
self._tracks = nxt
|
|
233
|
+
|
|
234
|
+
def _configure_track(self, name: str, config: JsonRecord) -> None:
|
|
235
|
+
track = next((t for t in self._tracks if t.name == name), None)
|
|
236
|
+
pipeline = self._reduce if name == REDUCE else (track.pipeline if track else None)
|
|
237
|
+
if pipeline is None:
|
|
238
|
+
raise ValueError(f"no track called '{name}'")
|
|
239
|
+
|
|
240
|
+
if isinstance(config.get("bypass"), bool) and track:
|
|
241
|
+
track.bypass = config["bypass"]
|
|
242
|
+
if isinstance(config.get("pipeline"), list):
|
|
243
|
+
pipeline.set_pipeline(config["pipeline"])
|
|
244
|
+
if _is_json_record(config.get("appendService")):
|
|
245
|
+
pipeline.append(config["appendService"])
|
|
246
|
+
if isinstance(config.get("removeService"), str):
|
|
247
|
+
pipeline.remove(config["removeService"])
|
|
248
|
+
if _is_json_record(config.get("configureService")):
|
|
249
|
+
payload = config["configureService"]
|
|
250
|
+
if isinstance(payload.get("instanceId"), str) and _is_json_record(payload.get("state")):
|
|
251
|
+
pipeline.configure_service(payload["instanceId"], payload["state"])
|
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass, field
|
|
4
|
+
from typing import Any, Callable, Literal, Protocol, runtime_checkable
|
|
5
|
+
|
|
6
|
+
from .secrets import SecretEntry, SecretVault
|
|
7
|
+
|
|
8
|
+
# Generic JSON object type
|
|
9
|
+
JsonRecord = dict[str, Any]
|
|
10
|
+
|
|
11
|
+
# Callback signatures
|
|
12
|
+
NotifyCallback = Callable[[Any, str | None], None]
|
|
13
|
+
NotificationCallback = Callable[["RuntimeNotification"], None]
|
|
14
|
+
ServiceCreator = Callable[["ServiceConfiguration"], "HostedService"]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class ServiceRegistryEntry:
|
|
19
|
+
service_id: str
|
|
20
|
+
service_name: str
|
|
21
|
+
version: str | None = None
|
|
22
|
+
capabilities: list[str] | None = None
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@dataclass
|
|
26
|
+
class ServiceConfiguration:
|
|
27
|
+
service_id: str
|
|
28
|
+
uuid: str
|
|
29
|
+
name: str | None = None
|
|
30
|
+
service_name: str | None = None
|
|
31
|
+
state: JsonRecord | None = None
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@dataclass
|
|
35
|
+
class RuntimeConfiguration:
|
|
36
|
+
id: str
|
|
37
|
+
name: str
|
|
38
|
+
board_name: str = ""
|
|
39
|
+
#: Whether this runtime should be torn down once the last client that was
|
|
40
|
+
#: connected to it disconnects.
|
|
41
|
+
#:
|
|
42
|
+
#: Declared by whoever creates it, because only they know: a browser
|
|
43
|
+
#: running a board says ``True`` — it is the controller, and its runtimes
|
|
44
|
+
#: should not outlive it — while a coordinator, a config file or a script
|
|
45
|
+
#: says nothing and gets a runtime that lives until it is deleted.
|
|
46
|
+
#:
|
|
47
|
+
#: Absent means persist. Cleanup is opted into, so nothing that exists
|
|
48
|
+
#: today starts disappearing, and a runtime is never reaped because of who
|
|
49
|
+
#: happened to connect to it.
|
|
50
|
+
garbage_collected: bool = False
|
|
51
|
+
#: Whether this runtime records anything at all.
|
|
52
|
+
#:
|
|
53
|
+
#: Off unless the board turns it on. A board that is not being looked into
|
|
54
|
+
#: has no reason to be writing a line per call to somebody's disk, and a log
|
|
55
|
+
#: kept by default is one nobody decided to keep — including for the data it
|
|
56
|
+
#: holds.
|
|
57
|
+
logging: bool = False
|
|
58
|
+
#: The least severe level this runtime records.
|
|
59
|
+
#:
|
|
60
|
+
#: The flow itself — every service call and return — is recorded at
|
|
61
|
+
#: ``debug``, so this is what decides whether a board keeps a trace of what
|
|
62
|
+
#: ran or only what its services chose to say.
|
|
63
|
+
log_level: str = "info"
|
|
64
|
+
|
|
65
|
+
#: Whether an entry may carry the ``data`` a service passed with it.
|
|
66
|
+
#:
|
|
67
|
+
#: Only service-authored entries have one: the flow this runtime records for
|
|
68
|
+
#: itself never carries the values passing through, so nothing reaches a log
|
|
69
|
+
#: unless a service was configured to put it there. That per-service opt-in
|
|
70
|
+
#: is the real gate, which is why this defaults to allowed. Setting it False
|
|
71
|
+
#: is a board-wide override for a deployment that must never write payloads.
|
|
72
|
+
log_data: bool = True
|
|
73
|
+
#: Values for the ``{{secret.<alias>}}`` references this runtime's services
|
|
74
|
+
#: carry, by alias.
|
|
75
|
+
#:
|
|
76
|
+
#: They ride with the create payload because provisioning is one call: the
|
|
77
|
+
#: services in it are constructed *and* configured before it returns, and a
|
|
78
|
+
#: service that opens a connection while being configured needs its
|
|
79
|
+
#: credential by then. Sending them later would be too late for exactly the
|
|
80
|
+
#: services that have one.
|
|
81
|
+
#:
|
|
82
|
+
#: They are unpacked into the runtime's vault and go no further — never into
|
|
83
|
+
#: a service's state, never into a serialized runtime, never back out.
|
|
84
|
+
secrets: dict[str, SecretEntry] = field(default_factory=dict)
|
|
85
|
+
#: Descriptors for the ``hkp-asset://<id>`` references this runtime's
|
|
86
|
+
#: services carry, by id — with the create payload for the reason secrets
|
|
87
|
+
#: are, and only what the services reference. They go into the runtime's
|
|
88
|
+
#: asset store and never into service state. See ``assets.py``.
|
|
89
|
+
assets: dict[str, dict[str, Any]] = field(default_factory=dict)
|
|
90
|
+
services: list[ServiceConfiguration] = field(default_factory=list)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
@dataclass
|
|
94
|
+
class ServiceDescriptor:
|
|
95
|
+
service_id: str
|
|
96
|
+
service_name: str
|
|
97
|
+
uuid: str
|
|
98
|
+
state: JsonRecord
|
|
99
|
+
version: str | None = None
|
|
100
|
+
capabilities: list[str] | None = None
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
@dataclass
|
|
104
|
+
class RuntimeDescriptor:
|
|
105
|
+
id: str
|
|
106
|
+
name: str
|
|
107
|
+
board_name: str
|
|
108
|
+
services: list[ServiceDescriptor]
|
|
109
|
+
inputs: list[dict[str, Any]] = field(default_factory=list)
|
|
110
|
+
output_url: str | None = None
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
@dataclass
|
|
114
|
+
class RuntimeNotification:
|
|
115
|
+
instance_id: str
|
|
116
|
+
payload: Any
|
|
117
|
+
context: "ProcessContext | None" = None
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
CallerRole = Literal["owner", "member"]
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
@dataclass
|
|
124
|
+
class Caller:
|
|
125
|
+
"""Who took the action a run began with.
|
|
126
|
+
|
|
127
|
+
Stated by the server that verified their token, never read from what they
|
|
128
|
+
sent: a payload saying who its sender is proves nothing about them. A run
|
|
129
|
+
nobody began — a timer tick, a request arriving at a mount — has none, and
|
|
130
|
+
neither does anything on a server running without authentication, where
|
|
131
|
+
there is nobody to tell apart.
|
|
132
|
+
"""
|
|
133
|
+
|
|
134
|
+
#: The token's ``sub``.
|
|
135
|
+
sub: str
|
|
136
|
+
#: Present only when the token carried a verified one; normalised.
|
|
137
|
+
email: str | None = None
|
|
138
|
+
#: What the board's member list calls that email. Set by a coordinator
|
|
139
|
+
#: that keeps such a list, and absent everywhere else — a name from the
|
|
140
|
+
#: token would be the person's own choice.
|
|
141
|
+
name: str | None = None
|
|
142
|
+
#: What they are to the board: its ``owner``, in whose tenant it runs, or a
|
|
143
|
+
#: ``member`` its list admitted. Stated by whoever admitted them.
|
|
144
|
+
role: CallerRole | None = None
|
|
145
|
+
|
|
146
|
+
def to_wire(self) -> dict[str, Any]:
|
|
147
|
+
wire: dict[str, Any] = {"sub": self.sub}
|
|
148
|
+
if self.email:
|
|
149
|
+
wire["email"] = self.email
|
|
150
|
+
if self.name:
|
|
151
|
+
wire["name"] = self.name
|
|
152
|
+
if self.role:
|
|
153
|
+
wire["role"] = self.role
|
|
154
|
+
return wire
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
@dataclass(frozen=True)
|
|
158
|
+
class PersonRunActor:
|
|
159
|
+
"""The verified person acting in a run and their authority deadline."""
|
|
160
|
+
|
|
161
|
+
kind: Literal["person"]
|
|
162
|
+
sub: str
|
|
163
|
+
expires_at: int
|
|
164
|
+
email: str | None = None
|
|
165
|
+
name: str | None = None
|
|
166
|
+
role: CallerRole | None = None
|
|
167
|
+
|
|
168
|
+
def to_wire(self) -> dict[str, Any]:
|
|
169
|
+
wire: dict[str, Any] = {
|
|
170
|
+
"kind": self.kind,
|
|
171
|
+
"sub": self.sub,
|
|
172
|
+
"expiresAt": self.expires_at,
|
|
173
|
+
}
|
|
174
|
+
if self.email:
|
|
175
|
+
wire["email"] = self.email
|
|
176
|
+
if self.name:
|
|
177
|
+
wire["name"] = self.name
|
|
178
|
+
if self.role:
|
|
179
|
+
wire["role"] = self.role
|
|
180
|
+
return wire
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
@dataclass(frozen=True)
|
|
184
|
+
class SourceRunActor:
|
|
185
|
+
"""A run created without delegated person authority."""
|
|
186
|
+
|
|
187
|
+
kind: Literal["board", "mount", "local"]
|
|
188
|
+
|
|
189
|
+
def to_wire(self) -> dict[str, Any]:
|
|
190
|
+
return {"kind": self.kind}
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
RunActor = PersonRunActor | SourceRunActor
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
@dataclass
|
|
197
|
+
class ProcessContext:
|
|
198
|
+
"""What travels with a process call rather than with the data it carries.
|
|
199
|
+
|
|
200
|
+
The ordered service list says what runs; this says which invocation it is
|
|
201
|
+
running as. The distinction matters as soon as anything has to attribute
|
|
202
|
+
work after the fact — which run produced this, and what invoked that run —
|
|
203
|
+
because the payload cannot answer it: the same data can flow through the
|
|
204
|
+
same services for entirely unrelated reasons.
|
|
205
|
+
|
|
206
|
+
Kept deliberately separate from ``request_id``, which the browser and hkp-rt
|
|
207
|
+
runtimes carry for a different purpose: that is a *reply address*, exists
|
|
208
|
+
only while someone awaits a response, and is consumed on resolution. A run
|
|
209
|
+
outlives any number of those, so the two are not interchangeable — see
|
|
210
|
+
plans/TODO-CONSOLIDATION.md section 4.
|
|
211
|
+
"""
|
|
212
|
+
|
|
213
|
+
#: Identifies one invocation of a board — one webhook, one timer tick, one
|
|
214
|
+
#: user action — across every service and runtime it reaches.
|
|
215
|
+
run_id: str
|
|
216
|
+
#: What is acting in this run. Only the person variant carries identity
|
|
217
|
+
#: and an authority deadline.
|
|
218
|
+
actor: RunActor
|
|
219
|
+
#: The run this one was invoked from, for a nested pipeline. Absent on a run
|
|
220
|
+
#: triggered from outside rather than from inside another run, which is what
|
|
221
|
+
#: makes a trace reconstructable as a tree rather than a list.
|
|
222
|
+
parent_run_id: str | None = None
|
|
223
|
+
#: Where to send a result somebody is waiting for. Absent for the fire-and-
|
|
224
|
+
#: forget calls that make up most traffic. Unused by this runtime today;
|
|
225
|
+
#: named here so the shape matches the runtimes that do carry one.
|
|
226
|
+
request_id: str | None = None
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
LogLevel = Literal["debug", "info", "warn", "error"]
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
@dataclass
|
|
233
|
+
class LogEntry:
|
|
234
|
+
"""One thing worth recording about a run.
|
|
235
|
+
|
|
236
|
+
A board's log is assembled by its coordinator from every runtime it spans,
|
|
237
|
+
because only the coordinator can see the whole board — a log held per
|
|
238
|
+
runtime would have to be stitched back together by timestamp to answer the
|
|
239
|
+
first question anyone asks it, which is what one run did.
|
|
240
|
+
|
|
241
|
+
``data`` is the only free-form field and therefore the only one that can
|
|
242
|
+
carry something a service did not mean to record. It is dropped unless a
|
|
243
|
+
board asks for it, so a service that forgets to redact can only leak
|
|
244
|
+
through a channel somebody deliberately opened.
|
|
245
|
+
"""
|
|
246
|
+
|
|
247
|
+
run_id: str
|
|
248
|
+
#: ISO 8601, set by the runtime that produced the entry.
|
|
249
|
+
ts: str
|
|
250
|
+
runtime_id: str
|
|
251
|
+
service_uuid: str
|
|
252
|
+
level: LogLevel
|
|
253
|
+
#: What happened, as a short stable name a reader can group by.
|
|
254
|
+
event: str
|
|
255
|
+
parent_run_id: str | None = None
|
|
256
|
+
data: Any = None
|
|
257
|
+
duration_ms: float | None = None
|
|
258
|
+
#: The ``sub`` of whoever began the run, when somebody did. Enough to
|
|
259
|
+
#: answer "who did this" from a board's log without it collecting addresses.
|
|
260
|
+
caller: str | None = None
|
|
261
|
+
|
|
262
|
+
def to_wire(self) -> dict[str, Any]:
|
|
263
|
+
"""The entry as the other runtimes spell it.
|
|
264
|
+
|
|
265
|
+
A board's log is one file assembled from every runtime it spans, so an
|
|
266
|
+
entry leaving this process has to be indistinguishable from one written
|
|
267
|
+
by hkp-node or hkp-rt — camelCase, and the optional fields absent rather
|
|
268
|
+
than null, since a reader that filters on ``data`` being present would
|
|
269
|
+
otherwise see every entry as carrying one.
|
|
270
|
+
"""
|
|
271
|
+
wire: dict[str, Any] = {
|
|
272
|
+
"runId": self.run_id,
|
|
273
|
+
"ts": self.ts,
|
|
274
|
+
"runtimeId": self.runtime_id,
|
|
275
|
+
"serviceUuid": self.service_uuid,
|
|
276
|
+
"level": self.level,
|
|
277
|
+
"event": self.event,
|
|
278
|
+
}
|
|
279
|
+
if self.parent_run_id:
|
|
280
|
+
wire["parentRunId"] = self.parent_run_id
|
|
281
|
+
if self.caller:
|
|
282
|
+
wire["caller"] = self.caller
|
|
283
|
+
if self.data is not None:
|
|
284
|
+
wire["data"] = self.data
|
|
285
|
+
if self.duration_ms is not None:
|
|
286
|
+
wire["durationMs"] = self.duration_ms
|
|
287
|
+
return wire
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
class RuntimeHost(Protocol):
|
|
291
|
+
def process_from(
|
|
292
|
+
self,
|
|
293
|
+
start_after_uuid: str,
|
|
294
|
+
data: Any,
|
|
295
|
+
on_notification: NotificationCallback,
|
|
296
|
+
context: "ProcessContext | None" = None,
|
|
297
|
+
) -> Any: ...
|
|
298
|
+
|
|
299
|
+
def notify(
|
|
300
|
+
self,
|
|
301
|
+
payload: Any,
|
|
302
|
+
instance_id: str,
|
|
303
|
+
context: "ProcessContext | None" = None,
|
|
304
|
+
) -> None:
|
|
305
|
+
"""Report something to whoever is watching.
|
|
306
|
+
|
|
307
|
+
Said from inside a run, it is reported as part of it. ``context`` names
|
|
308
|
+
the run instead where the report is being carried out of a nested
|
|
309
|
+
pipeline, which knows the run it was made in when the runtime around it
|
|
310
|
+
does not.
|
|
311
|
+
"""
|
|
312
|
+
...
|
|
313
|
+
|
|
314
|
+
def emit_result(self, output: Any) -> None: ...
|
|
315
|
+
|
|
316
|
+
def spawn(self, coro: Any) -> bool:
|
|
317
|
+
"""Run a coroutine on the server's loop, from wherever this is called.
|
|
318
|
+
|
|
319
|
+
A service that starts work during ``process`` is running on a worker
|
|
320
|
+
thread, where there is no loop to schedule on. False means there was
|
|
321
|
+
none to schedule on at all, so the caller can say so in its own words.
|
|
322
|
+
"""
|
|
323
|
+
...
|
|
324
|
+
|
|
325
|
+
def log(self, level: LogLevel, event: str, data: Any = None) -> None:
|
|
326
|
+
"""Record something about the run in progress.
|
|
327
|
+
|
|
328
|
+
Unlike ``notify``, which exists for whoever is watching and may be
|
|
329
|
+
dropped when nobody is, an entry has to survive with nobody attached —
|
|
330
|
+
a board running unwatched is exactly the case a log is for. The run and
|
|
331
|
+
the service are taken from the call in progress, so a service says only
|
|
332
|
+
what happened.
|
|
333
|
+
"""
|
|
334
|
+
...
|
|
335
|
+
|
|
336
|
+
def log_settings(self) -> dict[str, bool]:
|
|
337
|
+
"""What the runtime around a nested pipeline records.
|
|
338
|
+
|
|
339
|
+
A nested runtime is built from a service's own configuration, which says
|
|
340
|
+
nothing about logging — so without asking, a sub-pipeline would sit
|
|
341
|
+
silent inside a board that is being looked into.
|
|
342
|
+
"""
|
|
343
|
+
...
|
|
344
|
+
|
|
345
|
+
def forward_log(self, entry: "LogEntry") -> None:
|
|
346
|
+
"""Pass an entry a nested pipeline produced outward, unchanged.
|
|
347
|
+
|
|
348
|
+
Distinct from ``log`` because the entry already names its own run and
|
|
349
|
+
service: re-deriving those from the call in progress would relabel work
|
|
350
|
+
done inside a sub-pipeline as the work of the service hosting it, which
|
|
351
|
+
is the nesting the entry exists to record.
|
|
352
|
+
"""
|
|
353
|
+
...
|
|
354
|
+
|
|
355
|
+
def current_context(self) -> "ProcessContext | None":
|
|
356
|
+
"""The context of the call being processed now, or None outside one.
|
|
357
|
+
|
|
358
|
+
A service that finishes its work after ``process`` returns — an HTTP
|
|
359
|
+
response arriving, a socket pushing — has left the call it belongs to by
|
|
360
|
+
the time it has something to pass on. Capturing this while still inside
|
|
361
|
+
``process`` and handing it back to ``process_from`` is what keeps the
|
|
362
|
+
two halves recognisable as one run.
|
|
363
|
+
"""
|
|
364
|
+
...
|
|
365
|
+
|
|
366
|
+
def slots(self) -> "SlotStore | None":
|
|
367
|
+
"""The cells this pipeline's values may be held in, or None.
|
|
368
|
+
|
|
369
|
+
A nested runtime answers with the store the service hosting it gave it,
|
|
370
|
+
and otherwise with its parent's — so a slot named inside a sub-pipeline
|
|
371
|
+
reaches the nearest owner that declared one, and a service that declared
|
|
372
|
+
none does not silently isolate what is nested in it.
|
|
373
|
+
"""
|
|
374
|
+
...
|
|
375
|
+
|
|
376
|
+
|
|
377
|
+
class SlotStore:
|
|
378
|
+
"""Named cells two pipelines can share a value through.
|
|
379
|
+
|
|
380
|
+
A pipeline pass carries one value and ends; anything that has to survive
|
|
381
|
+
until a *different* pipeline runs has nowhere to live. A store gives it a
|
|
382
|
+
name, and whoever owns the pipelines that must share decides which store
|
|
383
|
+
they see — which is what keeps the sharing scoped to the arrangement that
|
|
384
|
+
needs it rather than being ambient across a runtime.
|
|
385
|
+
|
|
386
|
+
Deliberately not a cache: nothing expires, nothing is computed on a miss.
|
|
387
|
+
It is a cell, and the services that read and write it say what it means.
|
|
388
|
+
"""
|
|
389
|
+
|
|
390
|
+
def __init__(self) -> None:
|
|
391
|
+
self._cells: dict[str, Any] = {}
|
|
392
|
+
|
|
393
|
+
def get(self, name: str) -> Any:
|
|
394
|
+
return self._cells.get(name)
|
|
395
|
+
|
|
396
|
+
def set(self, name: str, value: Any) -> None:
|
|
397
|
+
self._cells[name] = value
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
@runtime_checkable
|
|
401
|
+
class HostedService(Protocol):
|
|
402
|
+
service_id: str
|
|
403
|
+
service_name: str
|
|
404
|
+
uuid: str
|
|
405
|
+
version: str | None
|
|
406
|
+
capabilities: list[str] | None
|
|
407
|
+
|
|
408
|
+
def configure(self, config: JsonRecord) -> JsonRecord: ...
|
|
409
|
+
def get_state(self) -> JsonRecord: ...
|
|
410
|
+
def process(self, input: Any, notify: NotifyCallback) -> Any: ...
|
|
411
|
+
def set_host(self, host: RuntimeHost) -> None: ...
|
|
412
|
+
def destroy(self) -> None: ...
|