@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,333 @@
|
|
|
1
|
+
# Timeline
|
|
2
|
+
|
|
3
|
+
Time as a value: an object animated through keyframes, and actions fired when
|
|
4
|
+
time reaches them.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Available in
|
|
9
|
+
|
|
10
|
+
| Runtime | Service ID |
|
|
11
|
+
|---|---|
|
|
12
|
+
| Browser | `hookup.to/service/timeline` |
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## What it does
|
|
17
|
+
|
|
18
|
+
A Timeline animates **one object** (typically an image, given as a Canvas
|
|
19
|
+
drawing instruction) through **keyframes** for its properties: where it is, how
|
|
20
|
+
big, how far turned, how opaque. It emits the object as it is at each moment.
|
|
21
|
+
It also carries **actions**: data placed at a moment and emitted when time
|
|
22
|
+
reaches it.
|
|
23
|
+
|
|
24
|
+
Nothing is scheduled per action. A timeline takes a time `t` and works out
|
|
25
|
+
what lies between the time it last saw and the time it sees now. That is what
|
|
26
|
+
lets it be paused, sought and looped, and the same time always gives the same
|
|
27
|
+
output.
|
|
28
|
+
|
|
29
|
+
Timelines nest. An outer timeline keeps the clock and drives the inner ones by
|
|
30
|
+
passing time down the pipeline. The outer one also says, by name, when each
|
|
31
|
+
inner one plays (see *Placements*). Several animated pieces are mixed with
|
|
32
|
+
[Tracks](./tracks.md), one track per piece, onto one [Canvas](./canvas.md).
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Where time comes from
|
|
37
|
+
|
|
38
|
+
`clock` decides it:
|
|
39
|
+
|
|
40
|
+
| `clock` | Time comes from | Used for |
|
|
41
|
+
|---|---|---|
|
|
42
|
+
| `"own"` (default) | Its own clock, emitting `fps` frames a second while it plays. Its input is an action happening now (see [Recording](#recording)). | The outermost timeline, the one the facade starts and stops, and a timeline recording what arrives |
|
|
43
|
+
| `"input"` | The frames it is given: `t` from the input (or a bare number), in whatever unit the driver counts | Every inner timeline |
|
|
44
|
+
|
|
45
|
+
An own clock counts in seconds or in **beats** (`unit`). Beats read the tempo
|
|
46
|
+
held in the slot `tempoSlot` names, as [Timer](./timer.md#beats) does. The
|
|
47
|
+
tempo is read every frame, so a change applies from the next frame. With no
|
|
48
|
+
tempo held, a beat is counted at 120 BPM.
|
|
49
|
+
|
|
50
|
+
Counting beats, every frame carries the **`tempo`** it was counted at, and a
|
|
51
|
+
driven timeline passes it on. What follows can then turn beats into time
|
|
52
|
+
without reaching the slot, which a service inside a Tracks track cannot: a
|
|
53
|
+
[Sound](./sound.md#envelope) holds its notes for beats of it.
|
|
54
|
+
|
|
55
|
+
### Length and looping
|
|
56
|
+
|
|
57
|
+
`length` 0 is unbounded. A non-looping timeline's positions are
|
|
58
|
+
`[0, length]`.
|
|
59
|
+
|
|
60
|
+
A looping timeline repeats its **loop range**, `[loopStart, loopEnd)`. By
|
|
61
|
+
default the range is the whole timeline (`loopStart` 0, and `loopEnd` 0 means
|
|
62
|
+
the length), so a looping timeline wraps at `length`. An action at the range's
|
|
63
|
+
end never fires, because that moment is the next pass's start.
|
|
64
|
+
|
|
65
|
+
- Time before `loopStart` plays once, on the way into the range, like a count-in.
|
|
66
|
+
- What lies past `loopEnd` does not play while the timeline loops. Switch
|
|
67
|
+
looping off and everything plays again; `length` stays where a non-looping
|
|
68
|
+
timeline ends.
|
|
69
|
+
- An own clock set past the range's end goes to its start. That applies when
|
|
70
|
+
it is sought there, when it stands there as it starts playing, and when the
|
|
71
|
+
range moves to before where it stands.
|
|
72
|
+
- An unbounded timeline (`length` 0) loops only with a `loopEnd`.
|
|
73
|
+
|
|
74
|
+
- An own clock that does not loop halts at its end. Playing again starts over.
|
|
75
|
+
- A driven timeline that does not loop emits **null** past its end, so the
|
|
76
|
+
pipeline behind it does not run. The one exception is the frame that leaves
|
|
77
|
+
the stretch: if an action or the end of a placement fell due on the way out,
|
|
78
|
+
that frame is emitted at the edge (`t` = `length`).
|
|
79
|
+
|
|
80
|
+
### A jump is not a wrap
|
|
81
|
+
|
|
82
|
+
A driven timeline sees time go backwards both when its driver loops and when
|
|
83
|
+
its driver is sought backwards. The two need opposite answers:
|
|
84
|
+
|
|
85
|
+
- The frame after a seek carries **`jump: true`**. Time was set, not
|
|
86
|
+
travelled, so only what sits exactly there fires.
|
|
87
|
+
- Time going backwards **without** `jump` means the driver started over (a
|
|
88
|
+
loop, or a stop and play). The driven timeline settles what it still owed
|
|
89
|
+
from the pass it was in, then starts its own from the beginning.
|
|
90
|
+
|
|
91
|
+
A timeline passes `jump` on, so a seek is a seek at every level.
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## The object and its keyframes
|
|
96
|
+
|
|
97
|
+
`object` is any JSON object, usually a drawing instruction.
|
|
98
|
+
`keyframes` maps each animated property to the moments it passes through:
|
|
99
|
+
|
|
100
|
+
```json
|
|
101
|
+
"object": { "type": "image", "url": "…", "height": "20%" },
|
|
102
|
+
"keyframes": {
|
|
103
|
+
"rotate": [ { "at": 0, "value": 0, "ease": "in-out" }, { "at": 3, "value": 360 } ],
|
|
104
|
+
"centerX": [ { "at": 0, "value": "10%" }, { "at": 3, "value": "90%" } ]
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
- Before its first keyframe a property holds that keyframe's value; after its
|
|
109
|
+
last, the last one's.
|
|
110
|
+
- In between it travels from the keyframe before `t` to the one after, eased
|
|
111
|
+
by the earlier keyframe's `ease`: `linear` (default), `in`, `out`, `in-out`
|
|
112
|
+
(cubic), or `step` (hold until the next).
|
|
113
|
+
- Numbers interpolate, as do strings that are a number with the same suffix at
|
|
114
|
+
both ends (`"30%"` to `"70%"`) and `#rrggbb` colours. Anything else holds.
|
|
115
|
+
- Two keyframes at the same moment make the value jump there.
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Actions
|
|
120
|
+
|
|
121
|
+
Actions are `{ "at": <number>, "data": <anything> }`. An action is due in a
|
|
122
|
+
frame when its time lies in `(previous t, t]`. It is also due when it sits
|
|
123
|
+
exactly where time was set: playing from the start, or a seek. Several actions
|
|
124
|
+
at one moment all fire, in list order. A frame can cover several passes of a
|
|
125
|
+
loop and fires the actions of each. An action without data is reported as null.
|
|
126
|
+
|
|
127
|
+
Because actions fire only when time passes over them, a seek skips them. For
|
|
128
|
+
state that must be right wherever time lands ("from here on, scene B"), use a
|
|
129
|
+
keyframe with `step` ease instead.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Recording
|
|
134
|
+
|
|
135
|
+
Whatever arrives at an own clock's input is an **action happening now**. The
|
|
136
|
+
timeline does not look at what it is: a pad's audio, a note, a click, a line of
|
|
137
|
+
text are all recorded and played back the same way.
|
|
138
|
+
|
|
139
|
+
- **Playing:** the clock moves to the moment the input arrived (that exact
|
|
140
|
+
moment, not the last frame's) and the input leaves in that frame's
|
|
141
|
+
`actions`, after anything else due by then.
|
|
142
|
+
- **Recording** (`recording: true`, while playing): the input also stays, as
|
|
143
|
+
`{ "at": <that moment>, "data": <the input> }`. From then on it plays
|
|
144
|
+
whenever time reaches it, like any other action: faster or slower with
|
|
145
|
+
`speed`, and again on every pass of a loop.
|
|
146
|
+
- **Stopped or paused:** the input passes through on a frame for where the
|
|
147
|
+
timeline stands, `{ "t": …, "actions": [<the input>] }`. Nothing is recorded,
|
|
148
|
+
so what follows sees the same shape whether the timeline plays or not.
|
|
149
|
+
|
|
150
|
+
`recordMode` says what a recording does to the actions already there:
|
|
151
|
+
|
|
152
|
+
| Mode | While recording |
|
|
153
|
+
|---|---|
|
|
154
|
+
| `"overdub"` (default) | What is there stays and plays; new actions are added to it |
|
|
155
|
+
| `"replace"` | What time passes over is cleared: it neither fires nor stays. What lies past the point where recording stopped is kept. On a loop, each pass replaces the one before. |
|
|
156
|
+
|
|
157
|
+
Stopping or pausing ends a recording, so playing a take back never records over
|
|
158
|
+
it. Recorded actions are saved with the board like any others, but only as
|
|
159
|
+
far as their data is JSON: audio (a Blob) lasts only while the board is open.
|
|
160
|
+
|
|
161
|
+
Actions are emitted on the first frame at or after their moment, so a recorded
|
|
162
|
+
action plays back up to one frame (`1 / fps` seconds) late. Raise `fps` for
|
|
163
|
+
tighter timing.
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## Placements
|
|
168
|
+
|
|
169
|
+
Placements arrange driven timelines on the one driving them, **by name**. The
|
|
170
|
+
outer timeline's `placements` say when each name plays and for how long. An
|
|
171
|
+
inner timeline's `placement` says which name it takes. Neither knows where the
|
|
172
|
+
other sits: the name is all they share, as two [Holds](./hold.md) share a slot.
|
|
173
|
+
|
|
174
|
+
```json
|
|
175
|
+
// outer
|
|
176
|
+
"placements": [
|
|
177
|
+
{ "name": "star-1", "at": 0, "duration": 3 },
|
|
178
|
+
{ "name": "rocket", "at": 2.5, "duration": 4 },
|
|
179
|
+
{ "name": "star-1", "at": 6, "duration": 1.5 }
|
|
180
|
+
]
|
|
181
|
+
|
|
182
|
+
// inner, e.g. inside a block whose param names it
|
|
183
|
+
{ "clock": "input", "placement": "{{param.name}}" }
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Each frame the outer timeline emits carries `placements`: for **every** name it
|
|
187
|
+
places, `{ "progress", "elapsed" }` while that name plays (`progress` 0 to 1
|
|
188
|
+
through the placement, `elapsed` the outer time since it started), and `null`
|
|
189
|
+
while it does not.
|
|
190
|
+
|
|
191
|
+
| Rule | Behaviour |
|
|
192
|
+
|---|---|
|
|
193
|
+
| Stretching | A non-looping inner timeline with a length is **stretched** to its placement: its time is `progress × length`. A looping or unbounded one plays at its own speed (`elapsed`) and, if it loops, repeats for as long as the placement lasts. |
|
|
194
|
+
| The end | A placement that ends between two frames is reported once more, at its end (`progress` 1), so its final pose and any action at its end are not skipped. |
|
|
195
|
+
| Not playing | While its name is not playing, a placed timeline emits null. |
|
|
196
|
+
| Entering | A name that starts playing without a jump enters from its start: what sits at 0 fires. |
|
|
197
|
+
| The same name twice | Allowed. Where two placements of a name overlap, the one that started later wins. |
|
|
198
|
+
| Scoping | A timeline's frames carry **its own** placements only, replacing its driver's, so each level sees the names of the one directly driving it. |
|
|
199
|
+
| Looping outer timeline | Placements lie within `[0, length)`; one running past the end is cut there. |
|
|
200
|
+
| Not placed | A driven timeline without `placement` reads `t` from its input. |
|
|
201
|
+
|
|
202
|
+
A mistyped name is a contract nothing checks, so a placed timeline reports its
|
|
203
|
+
`placementStatus`:
|
|
204
|
+
|
|
205
|
+
| Status | Meaning |
|
|
206
|
+
|---|---|
|
|
207
|
+
| `playing` | Its name is playing now |
|
|
208
|
+
| `waiting` | Its name is placed, but not at this time |
|
|
209
|
+
| `unplaced` | Frames place other names, never this one: most likely a name mistyped on one side |
|
|
210
|
+
| `no-placements` | Frames place nothing at all |
|
|
211
|
+
|
|
212
|
+
Its panel warns on `unplaced` and `no-placements`.
|
|
213
|
+
|
|
214
|
+
Everything between two timelines must pass `placements` on. Tracks,
|
|
215
|
+
sub-services and Switch do. A [Map](./map.md) in replace mode drops it, as it
|
|
216
|
+
drops `t`.
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## Configuration
|
|
221
|
+
|
|
222
|
+
| Property | Type | Default | Description |
|
|
223
|
+
|---|---|---|---|
|
|
224
|
+
| `clock` | `"own" \| "input"` | `"own"` | Where time comes from |
|
|
225
|
+
| `object` | `object \| null` | `null` | What the timeline animates |
|
|
226
|
+
| `keyframes` | `{ [property]: { at, value, ease? }[] }` | `{}` | Keyframes per property of the object |
|
|
227
|
+
| `actions` | `{ at, data }[]` | `[]` | Data emitted when time reaches `at` |
|
|
228
|
+
| `length` | `number` | `0` | Length in the timeline's unit; `0` is unbounded |
|
|
229
|
+
| `loop` | `boolean` | `false` | Repeat the loop range |
|
|
230
|
+
| `loopStart` | `number` | `0` | Where the loop starts over from |
|
|
231
|
+
| `loopEnd` | `number` | `0` | Where the loop starts over; `0` is the length |
|
|
232
|
+
| `unit` | `"s" \| "beats"` | `"s"` | How an own clock counts |
|
|
233
|
+
| `tempoSlot` | `string` | `"tempo"` | Slot holding the tempo (BPM) for `"beats"` |
|
|
234
|
+
| `fps` | `number` | `30` | Frames a second an own clock emits |
|
|
235
|
+
| `speed` | `number` | `1` | Playback speed of an own clock |
|
|
236
|
+
| `running` | `boolean` | `false` | Whether an own clock is playing; `true` plays, `false` pauses |
|
|
237
|
+
| `recording` | `boolean` | `false` | Whether what arrives at a playing own clock's input is kept as actions. Stopping or pausing sets it to `false`. |
|
|
238
|
+
| `recordMode` | `"overdub" \| "replace"` | `"overdub"` | Whether a recording keeps the actions it passes over or clears them |
|
|
239
|
+
| `placements` | `{ name, at, duration }[]` | `[]` | When each name plays on this timeline |
|
|
240
|
+
| `placement` | `string` | `""` | The name a driven timeline takes from its driver; `""` takes none |
|
|
241
|
+
|
|
242
|
+
### Commands
|
|
243
|
+
|
|
244
|
+
Only an own clock responds to these.
|
|
245
|
+
|
|
246
|
+
| Command | Effect |
|
|
247
|
+
|---|---|
|
|
248
|
+
| `play: true` | Plays from where it is (from the start if it played through to its end), emitting a frame at once |
|
|
249
|
+
| `pause: true` | Pauses where it is |
|
|
250
|
+
| `stop: true` | Pauses and goes back to 0 |
|
|
251
|
+
| `recording: true` | Records what arrives at the input while playing. Send it with `play: true` to start playing and recording at once. |
|
|
252
|
+
| `seek: <number>` | Sets the time. Paused, a frame is emitted at once, so scrubbing a paused timeline scrubs everything it drives. The next frame carries `jump: true`. |
|
|
253
|
+
|
|
254
|
+
Changing `object`, `keyframes` or `placements` re-emits the current frame
|
|
255
|
+
without firing anything, so an edit shows while paused. While bypassed, an own
|
|
256
|
+
clock keeps time but emits nothing.
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## Input and output
|
|
261
|
+
|
|
262
|
+
A driven timeline takes a frame `{ "t": <number>, "placements"?: {…}, "jump"?: true }`
|
|
263
|
+
or a bare number. An own clock takes anything, as an action happening now; no
|
|
264
|
+
input (`null` or `undefined`) emits nothing.
|
|
265
|
+
|
|
266
|
+
It emits **every frame**, not only those an action falls in, because what
|
|
267
|
+
follows has to redraw:
|
|
268
|
+
|
|
269
|
+
```json
|
|
270
|
+
{ "type": "image", "url": "…", "height": "20%", "rotate": 180, "centerX": "50%",
|
|
271
|
+
"t": 1.5, "actions": [], "placements": { "star-1": { "progress": 0.5, "elapsed": 1.5 } } }
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
- With an `object`: the object with each keyframed property at its value, plus
|
|
275
|
+
`t` and `actions`. It does not take on its driver's fields, except `jump`. A
|
|
276
|
+
timeline animating a drawing instruction therefore emits a drawing
|
|
277
|
+
instruction, and a Canvas draws it directly, ignoring the other fields.
|
|
278
|
+
- Without one: a driven timeline keeps its input's other fields and overwrites
|
|
279
|
+
`t` and `actions`, so a frame can carry more than time down through nested
|
|
280
|
+
timelines.
|
|
281
|
+
- `placements` appears when the timeline places names, or when its input
|
|
282
|
+
carried `placements`, and holds this timeline's own.
|
|
283
|
+
- `null` where a driven timeline is outside its stretch or its placement is
|
|
284
|
+
not playing.
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## The panel
|
|
289
|
+
|
|
290
|
+
Compact, the panel shows the transport, a preview drawn with the Canvas
|
|
291
|
+
service's drawing code, the ruler, one lane with every keyframe and action, and
|
|
292
|
+
the placements beneath. Expanded, it grows to one row per property (value at
|
|
293
|
+
the playhead, a ◆ to set or remove a keyframe there), one per placed name (bars
|
|
294
|
+
to drag and resize), and one for the actions.
|
|
295
|
+
|
|
296
|
+
- A property that is not animated has a fixed value on the object. Once it has
|
|
297
|
+
a keyframe, a value typed at the playhead sets a keyframe there.
|
|
298
|
+
- The strip above the ruler shows the loop range. Drag across it to draw a
|
|
299
|
+
new range, which also switches looping on. Drag the range to move it, or drag
|
|
300
|
+
an edge to move that edge. Press the range to switch looping on or off. The
|
|
301
|
+
repeat button in the transport switches looping too. While looping, the
|
|
302
|
+
range is shaded over the rows, and the expanded view has `from` and `to`
|
|
303
|
+
fields for it.
|
|
304
|
+
- The record button in the transport records what arrives while playing; the
|
|
305
|
+
button beside it switches between `overdub` and `replace`. Recorded data that
|
|
306
|
+
is not JSON (a Blob) is described on its marker rather than written out, and
|
|
307
|
+
cannot be edited as text.
|
|
308
|
+
- The image button in the transport, or dropping an image on the preview, sets
|
|
309
|
+
the object's image, kept as a data URL.
|
|
310
|
+
- Scrubbing an own clock seeks it, and so moves the whole board. A driven
|
|
311
|
+
timeline's playhead is its driver's: scrubbing pins it for editing, and
|
|
312
|
+
"live" follows the driver again.
|
|
313
|
+
- Inside a [block](../concepts/blocks.md) use the panel is read-only: keyframes
|
|
314
|
+
and actions can be picked and read, but nothing configures the service.
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
## Example
|
|
319
|
+
|
|
320
|
+
`boards/timeline-demo-board.json` keeps the clock in a
|
|
321
|
+
**Show** timeline (eight seconds, looping) that feeds a Tracks scene, one track
|
|
322
|
+
per image, onto one Canvas. Two blocks write the motions once (**Pop** and
|
|
323
|
+
**Fly**) and each use names the placement it plays under. The Show's
|
|
324
|
+
placements say when each plays and for how long.
|
|
325
|
+
|
|
326
|
+
`boards/night-groove-demo-board.json` puts a drum groove under the same sky.
|
|
327
|
+
Its Show counts in beats at a tempo held in a slot, and places drums and
|
|
328
|
+
images alike. Each drum is a looping timeline whose actions are its hits,
|
|
329
|
+
followed by a Sound.
|
|
330
|
+
|
|
331
|
+
`boards/pad-groove-demo-board.json` is the same idea with no picture: a pad,
|
|
332
|
+
a bass line and drums. Its chords are several actions at one moment, played by
|
|
333
|
+
a synth that holds them for beats of the tempo on the frame.
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Timer
|
|
2
|
+
|
|
3
|
+
Generates periodic or one-shot timing events to drive pipeline execution.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
The Timer service produces trigger events on a time-based schedule. It supports two operating modes: **periodic** (repeating interval) and **one-shot** (fires once after a delay). Each trigger increments an internal counter and emits the current count downstream.
|
|
10
|
+
|
|
11
|
+
**Available in:**
|
|
12
|
+
- Browser Runtime — service ID `hookup.to/service/timer`
|
|
13
|
+
- hkp-node — service ID `timer`
|
|
14
|
+
- hkp-python — service ID `timer` (also answers to `hookup.to/service/timer`, the
|
|
15
|
+
id it used before it matched the other runtimes; that alias is not advertised
|
|
16
|
+
in the registry)
|
|
17
|
+
- hkp-rt — service ID `timer`
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Operating Modes
|
|
22
|
+
|
|
23
|
+
| Mode | How it works | Relevant properties |
|
|
24
|
+
|---|---|---|
|
|
25
|
+
| **Periodic** | Fires repeatedly on a fixed interval using `setInterval` | `periodic: true`, `periodicValue`, `periodicUnit` |
|
|
26
|
+
| **One-shot** | Fires once after a delay using `setTimeout` | `periodic: false` (default), `oneShotDelay`, `oneShotDelayUnit` |
|
|
27
|
+
|
|
28
|
+
Setting `immediate: true` in either mode causes the first tick to fire almost instantly (1 ms) before the regular schedule begins.
|
|
29
|
+
|
|
30
|
+
### As a delay
|
|
31
|
+
|
|
32
|
+
A one-shot Timer placed in a pipeline also delays what flows through it: `process` waits `oneShotDelay`, then passes its input on with `triggerCount` added; a delay of zero passes it on at once, without yielding. Each input waits on its own, so one arriving while an earlier one is still waiting is not dropped or let through early, but held for its full delay too. A periodic Timer passes its input straight through. The [Nested Rhythm](../boards/nested-rhythm-demo-board.md) board times a whole drum groove this way.
|
|
33
|
+
|
|
34
|
+
### Beats
|
|
35
|
+
|
|
36
|
+
**Browser only.** `"beats"` as `periodicUnit` or `oneShotDelayUnit` measures a duration in beats of a tempo held in a [slot](./hold.md#where-its-cells-live), named by `tempoSlot`. `oneShotDelay: 0.5` in beats is an eighth note; `periodicValue: 4` is a bar of 4/4. The slot holds a number of beats per minute, usually written by a [Hold](./hold.md) given a `value`. With no tempo held, a beat is counted at 120 BPM.
|
|
37
|
+
|
|
38
|
+
The slot is read each time a duration is needed rather than when the Timer is configured. A delay picks up a new tempo on its next wait. A periodic Timer in beats schedules one tick at a time, each at the tempo held when its interval starts, so a change applies from the tick after the one already scheduled. Because the tempo is looked up rather than configured, it can sit in the outermost of several nested [scopes](../concepts/scopes.md) and reach every Timer inside the ones that inherit its slots.
|
|
39
|
+
|
|
40
|
+
`"bpm"` is different: it is a *rate* for a periodic Timer (`periodicValue: 120, periodicUnit: "bpm"` ticks 120 times a minute) and reads no slot.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Configuration
|
|
45
|
+
|
|
46
|
+
| Property | Type | Default | Description |
|
|
47
|
+
|---|---|---|---|
|
|
48
|
+
| `periodic` | `boolean` | `false` | When `true`, the timer fires repeatedly at the configured interval. When `false`, fires once. |
|
|
49
|
+
| `periodicValue` | `number` | `1` | Numeric amount for the repeating interval. Interpreted in `periodicUnit`. |
|
|
50
|
+
| `periodicUnit` | `string` | `"s"` | Time unit for `periodicValue`. Accepts any [moment.js duration unit](https://momentjs.com/docs/#/durations/): `"ms"`, `"s"`, `"m"`, `"h"`, `"d"`, etc., as well as the rates `"bpm"` and `"hz"` and, in the browser, `"beats"`. |
|
|
51
|
+
| `oneShotDelay` | `number` | `0` | Delay before a one-shot timer fires. |
|
|
52
|
+
| `oneShotDelayUnit` | `string` | `"ms"` | Time unit for `oneShotDelay`: `"ms"`, `"s"`, `"beats"`, or any moment.js unit. |
|
|
53
|
+
| `tempoSlot` | `string` | `"tempo"` | **Browser only.** The slot a `"beats"` duration reads its tempo from, in BPM. See *Beats* below. |
|
|
54
|
+
| `immediate` | `boolean` | — | When `true`, fires one tick immediately (after ~1 ms) in addition to the normal schedule. |
|
|
55
|
+
| `counter` | `number` | — | Overrides the internal trigger counter to a specific value. |
|
|
56
|
+
| `running` | `boolean` | — | Setting to `false` stops the timer. Setting to `true` starts it if `start` is not otherwise specified. |
|
|
57
|
+
| `until.triggerCount` | `number` | — | Automatically stops the timer after this many triggers have fired. |
|
|
58
|
+
|
|
59
|
+
### Commands
|
|
60
|
+
|
|
61
|
+
Commands are special keys that trigger immediate actions when passed to `configure`:
|
|
62
|
+
|
|
63
|
+
| Command | Description |
|
|
64
|
+
|---|---|
|
|
65
|
+
| `start` | Starts the timer. Equivalent to sending `{ start: true }`. |
|
|
66
|
+
| `stop` | Stops the timer and resets the counter to 0. |
|
|
67
|
+
| `restart` | Stops the timer then immediately starts it again (equivalent to `stop` + `start`). |
|
|
68
|
+
|
|
69
|
+
Changing `periodicValue` or `periodicUnit` while the timer is running silently restarts it with the new interval.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Output Data
|
|
74
|
+
|
|
75
|
+
Each tick emits a single object downstream:
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
{ "triggerCount": 1 }
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
`triggerCount` starts at 1 and increments by 1 on every tick.
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Example: 1-second Periodic Timer
|
|
86
|
+
|
|
87
|
+
The following Board Blueprint snippet configures a timer to fire once per second, starting immediately:
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"serviceId": "hookup.to/service/timer",
|
|
92
|
+
"config": {
|
|
93
|
+
"periodic": true,
|
|
94
|
+
"periodicValue": 1,
|
|
95
|
+
"periodicUnit": "s",
|
|
96
|
+
"immediate": true,
|
|
97
|
+
"start": true
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## hkp-rt Differences
|
|
105
|
+
|
|
106
|
+
The hkp-rt `timer` service uses a single `delay` property expressed in **microseconds** instead of the `periodicValue`/`periodicUnit` pair used by the browser runtime.
|
|
107
|
+
|
|
108
|
+
| Browser Runtime | hkp-rt equivalent |
|
|
109
|
+
|---|---|
|
|
110
|
+
| `periodicValue: 1, periodicUnit: "s"` | `delay: 1000000` (1 second in µs) |
|
|
111
|
+
| `periodicValue: 500, periodicUnit: "ms"` | `delay: 500000` |
|
|
112
|
+
|
|
113
|
+
All other behaviour (counter, trigger output shape, `until.triggerCount`) is equivalent. Consult the hkp-rt source for the complete list of supported properties.
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# Tracks
|
|
2
|
+
|
|
3
|
+
Several pipelines over one input, and one answer out.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Available in
|
|
8
|
+
|
|
9
|
+
| Runtime | Service ID |
|
|
10
|
+
|---|---|
|
|
11
|
+
| Browser | `tracks` |
|
|
12
|
+
| Node.js (hkp-node) | `tracks` |
|
|
13
|
+
| Python (hkp-python) | `tracks` |
|
|
14
|
+
| C++ (hkp-rt) | `tracks` |
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## What it does
|
|
19
|
+
|
|
20
|
+
[Iterator](./iterator.md) runs one pipeline over many items. This is the other
|
|
21
|
+
half of that pair: many pipelines over one item.
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
input ──┬── track ── answer ──┬── reduce ── output
|
|
25
|
+
├── track ── answer ──┤
|
|
26
|
+
└── track ── answer ──┘
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
A board that has to do two unrelated things with the same value — write it to a
|
|
30
|
+
table *and* tell somebody about it, ask three services and compare what they say
|
|
31
|
+
— could always fake this by putting those things in a row and teaching each of
|
|
32
|
+
them to pass its input through. That works, and records nothing: not that they
|
|
33
|
+
are siblings rather than a sequence, not in which order they may run, not which
|
|
34
|
+
of their answers matters. All three are this service's subject.
|
|
35
|
+
|
|
36
|
+
**Every track is given the same input**, and no track can see another's answer.
|
|
37
|
+
That is what lets a track be read on its own.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## The answers are an array, holes included
|
|
42
|
+
|
|
43
|
+
One element per track, in declaration order. A track that stopped — declined,
|
|
44
|
+
found nothing, failed — leaves `null` in its place rather than being left out,
|
|
45
|
+
so position still names the track that produced it and a missing answer is
|
|
46
|
+
visible rather than absent.
|
|
47
|
+
|
|
48
|
+
An array of nothing but nulls is still an array. This service never stops a
|
|
49
|
+
pipeline by itself; whether silence means stop is the reducer's to say:
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
{ "=": "filter(params.results, 'item !== null').length ? params.results : null" }
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
That one is worth knowing, because tracks whose work is **asynchronous** answer
|
|
56
|
+
nothing on the pass that feeds them — an aggregator collecting over an interval,
|
|
57
|
+
a service that emits when a reply arrives. Their real output reaches the board
|
|
58
|
+
later, by the same route any autonomous emitter's does: it leaves through this
|
|
59
|
+
service and carries on down the pipeline. Without the reducer above, everything
|
|
60
|
+
after this service is also handed a row of nulls on every pass.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## `run` — one at a time, or all at once
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{ "run": "serial" }
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
`serial` is the default and the safe one: two tracks writing to the same table
|
|
71
|
+
are a race the moment they overlap, and concurrency should be asked for rather
|
|
72
|
+
than discovered. `parallel` is for tracks that spend their time waiting on
|
|
73
|
+
something else — an HTTP call, another runtime — where the waiting is the cost.
|
|
74
|
+
|
|
75
|
+
Either way the answers come back in **declaration order**. How they ran is not
|
|
76
|
+
something the next service should be able to tell.
|
|
77
|
+
|
|
78
|
+
**Runtime differences:** the browser and hkp-node overlap tracks under
|
|
79
|
+
`parallel`. hkp-python and hkp-rt process synchronously, so they record the
|
|
80
|
+
setting and still run one track at a time — a board says the same thing and gets
|
|
81
|
+
the same answers in every runtime; only the wall clock differs.
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## `reduce` is a pipeline, not a list of strategies
|
|
86
|
+
|
|
87
|
+
Taking the first answer, merging them, keeping only what came in: each is one
|
|
88
|
+
`map` term, so there is nothing here to choose from and nothing to wait for
|
|
89
|
+
somebody to add. The reducer is given both halves of what happened:
|
|
90
|
+
|
|
91
|
+
```json
|
|
92
|
+
{ "input": <what the tracks were run on>, "results": [ <answer>, … ] }
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Carrying on as though the tracks were side effects — the commonest case, and the
|
|
96
|
+
reason the reducer sees the input at all:
|
|
97
|
+
|
|
98
|
+
```json
|
|
99
|
+
{ "serviceId": "map", "state": { "mode": "replace", "template": { "=": "params.input" } } }
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
The first answer anything had: `{"=": "find(params.results, 'item !== null')"}`.
|
|
103
|
+
Everything together under names the board chose: a template naming
|
|
104
|
+
`params.results[0]`, `params.results[1]`. Something stranger: more services in
|
|
105
|
+
the reduce pipeline, which is a pipeline like any other.
|
|
106
|
+
|
|
107
|
+
With no reducer configured the array travels on as it is. **A reducer returning
|
|
108
|
+
`null` stops the pipeline**, as any service does.
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Configuration
|
|
113
|
+
|
|
114
|
+
| Property | Type | Default | Description |
|
|
115
|
+
|---|---|---|---|
|
|
116
|
+
| `tracks` | `Track[]` | `[]` | The pipelines, in the order their answers appear |
|
|
117
|
+
| `reduce` | `PipelineEntry[]` | `[]` | Pipeline given `{ input, results }`; empty emits the array |
|
|
118
|
+
| `run` | `"serial" \| "parallel"` | `"serial"` | One at a time, or together |
|
|
119
|
+
| `bypass` | `boolean` | `false` | Passes the input straight through |
|
|
120
|
+
|
|
121
|
+
A track is `{ "name": string, "bypass"?: boolean, "pipeline": PipelineEntry[] }`.
|
|
122
|
+
The name is what a log, a panel and a reducer call it; a track without one is
|
|
123
|
+
called by the position it was declared in. `reduce` is reserved — a track may
|
|
124
|
+
not take it, since that is the name a pipeline edit uses to reach the reducer.
|
|
125
|
+
A bypassed track leaves a hole, like one that stopped.
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Example
|
|
130
|
+
|
|
131
|
+
Two writes about the same thing, and the thing itself carrying on:
|
|
132
|
+
|
|
133
|
+
```json
|
|
134
|
+
{
|
|
135
|
+
"uuid": "record-svc",
|
|
136
|
+
"serviceId": "tracks",
|
|
137
|
+
"serviceName": "Keep or drop",
|
|
138
|
+
"state": {
|
|
139
|
+
"run": "serial",
|
|
140
|
+
"tracks": [
|
|
141
|
+
{ "name": "keep", "pipeline": [
|
|
142
|
+
{ "instanceId": "insert", "serviceId": "sql", "serviceName": "Save an article",
|
|
143
|
+
"state": { "mode": "run", "statement": "INSERT INTO article (link) SELECT $link WHERE $intent = 'keep'" } }
|
|
144
|
+
] },
|
|
145
|
+
{ "name": "drop", "pipeline": [
|
|
146
|
+
{ "instanceId": "delete", "serviceId": "sql", "serviceName": "Remove an article",
|
|
147
|
+
"state": { "mode": "run", "statement": "DELETE FROM article WHERE $intent = 'drop' AND link = $link" } }
|
|
148
|
+
] }
|
|
149
|
+
],
|
|
150
|
+
"reduce": [
|
|
151
|
+
{ "instanceId": "carry", "serviceId": "map", "serviceName": "What came in",
|
|
152
|
+
"state": { "mode": "replace", "template": { "=": "params.input" } } }
|
|
153
|
+
]
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Note what each half is for. The **guards stay in SQL**, because a condition about
|
|
159
|
+
the data belongs in the language that addresses the data, and one guarded
|
|
160
|
+
statement beats a filter and a statement. What the board gains is everything
|
|
161
|
+
around them: that the two writes are independent, that they run in a known
|
|
162
|
+
order, and that what leaves is the article rather than a count of changed rows.
|
|
163
|
+
|
|
164
|
+
Demo board: `tracks-demo-board.json`.
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Input / Output
|
|
169
|
+
|
|
170
|
+
| | Shape |
|
|
171
|
+
|---|---|
|
|
172
|
+
| **Input** | Any value; every track is given it unchanged |
|
|
173
|
+
| **Output** | The answers as an array, or whatever the reducer made of them |
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Addressing a service inside
|
|
178
|
+
|
|
179
|
+
A service in a track, or in the reduce, is addressed through the Tracks holding
|
|
180
|
+
it — `<tracks>.<instanceId>` — the way one inside a
|
|
181
|
+
[SubService](./sub-service.md) is (see [Scopes](../concepts/scopes.md)). The
|
|
182
|
+
track's name is not part of the address: an address runs through services, and
|
|
183
|
+
a track is a pipeline of this one, so instance ids are unique across all of its
|
|
184
|
+
tracks. A facade widget reads a request inside a track at that address, a
|
|
185
|
+
notice watches it there, and a configure sent to it reaches the live service
|
|
186
|
+
and is kept when the board is saved.
|
|
187
|
+
|
|
188
|
+
In the browser, a facade whose `init` processes the Tracks waits until every
|
|
189
|
+
track has been built, so a widget reading a service inside is listening before
|
|
190
|
+
the first answer arrives.
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## Replaces Stack
|
|
195
|
+
|
|
196
|
+
The browser's `Stack` service was the first go at this idea: it fanned an input
|
|
197
|
+
out to a list of sub-services and collected an array. It is gone, and boards
|
|
198
|
+
carrying it have been rewritten. Three things changed.
|
|
199
|
+
|
|
200
|
+
Its `output` setting was declared and never read, so there was no reduce at all.
|
|
201
|
+
Its execution mode was welded to its input mode — `multiplex` ran serially,
|
|
202
|
+
`lanes` ran everything at once — so neither could be chosen. And it existed only
|
|
203
|
+
in the browser, so a board could not move.
|
|
204
|
+
|
|
205
|
+
`lanes` is gone with it: it dealt element *i* of an incoming array to
|
|
206
|
+
sub-service *i*, which reads as magic at the call site and is one `map` term at
|
|
207
|
+
the start of a track — `{"=": "params[0]"}` — where it can be seen.
|