@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,735 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service Documentation
|
|
3
|
+
* Service ID: communication-dispatcher
|
|
4
|
+
* Service Name: Communication Dispatcher
|
|
5
|
+
* Runtime: hkp-node
|
|
6
|
+
* Modes: none
|
|
7
|
+
* Key Config: goal, states, actions ([{ name, describe, available, pipeline }]),
|
|
8
|
+
* decide (the pipeline that asks a model), instruction, stateFrom,
|
|
9
|
+
* maxContextChars
|
|
10
|
+
* IO: in=the exchange so far (JSON) -> out={ ...input, action, params, reason,
|
|
11
|
+
* result, state } — or nothing at all when there is nothing to do and
|
|
12
|
+
* nothing to change
|
|
13
|
+
* Notifies: { decidePrompt, decideAnswer } — the question put to the decide
|
|
14
|
+
* pipeline and what came back, every pass, for reading a decision that
|
|
15
|
+
* went wrong; `lastAnswer` keeps an abbreviated copy in state
|
|
16
|
+
* Arrays: treated as one context, not iterated (pair with `iterator`)
|
|
17
|
+
* Binary: not accepted
|
|
18
|
+
* MixedData: not native in runtime
|
|
19
|
+
*
|
|
20
|
+
* The manager in the middle of the star.
|
|
21
|
+
*
|
|
22
|
+
* Around it sit the actions — a nested pipeline each, doing one thing a
|
|
23
|
+
* business does: understand what was asked, ask for what is missing, quote,
|
|
24
|
+
* send. This service decides which of them is the right thing to do next, runs
|
|
25
|
+
* it, and takes the result back. A board grows by gaining an action, not by
|
|
26
|
+
* gaining a runtime, and the workflow stays readable in one place.
|
|
27
|
+
*
|
|
28
|
+
* The decision is a model's, not a rule's, and deliberately so: what arrives is
|
|
29
|
+
* a person writing an email, and no expression over `state` anticipates what
|
|
30
|
+
* they will say. The model is given what a new colleague would be given — the
|
|
31
|
+
* goal, the states the work can be in, the actions available and when each is
|
|
32
|
+
* for, and the exchange so far — and answers with one action and the state that
|
|
33
|
+
* follows if it works.
|
|
34
|
+
*
|
|
35
|
+
* Two things keep that from being a licence to invent. The answer is
|
|
36
|
+
* constrained by a JSON schema this service generates from its own
|
|
37
|
+
* configuration, so `action` and `next` are enums of what actually exists —
|
|
38
|
+
* an invented name cannot be uttered, never mind acted on. And an action can
|
|
39
|
+
* declare `available`, an expression over the input, which decides whether it
|
|
40
|
+
* is on the menu this turn at all; sending an approved draft is not a judgement
|
|
41
|
+
* call when there is no approved draft. Narrowing the menu to the legal moves
|
|
42
|
+
* is what makes the choice good, and it is a different question from which of
|
|
43
|
+
* the legal moves to make.
|
|
44
|
+
*
|
|
45
|
+
* One action per pass, and the state it moves to is persisted by whatever comes
|
|
46
|
+
* next in the board. The loop is the poll that fed this service, not a loop in
|
|
47
|
+
* here: the position of the machine is then a row someone can read rather than
|
|
48
|
+
* a stack frame, a restart resumes rather than restarts, and a model that
|
|
49
|
+
* changes its mind costs one call per tick instead of spending a budget in a
|
|
50
|
+
* cycle nobody is watching.
|
|
51
|
+
*/
|
|
52
|
+
import { compileExpression } from "./expression";
|
|
53
|
+
import { isJsonRecord, NestedPipeline } from "./nested-pipeline";
|
|
54
|
+
import {
|
|
55
|
+
HostedService,
|
|
56
|
+
JsonRecord,
|
|
57
|
+
RuntimeHost,
|
|
58
|
+
RuntimeScope,
|
|
59
|
+
ServiceConfiguration,
|
|
60
|
+
ServiceCreator,
|
|
61
|
+
ServiceRegistryEntry,
|
|
62
|
+
SlotStore,
|
|
63
|
+
} from "../types";
|
|
64
|
+
|
|
65
|
+
export const communicationDispatcherDescriptor: ServiceRegistryEntry = {
|
|
66
|
+
serviceId: "communication-dispatcher",
|
|
67
|
+
serviceName: "Communication Dispatcher",
|
|
68
|
+
capabilities: ["subservices"],
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
/** The branch that asks the model, as opposed to the branches that act. */
|
|
72
|
+
const DECIDE = "decide";
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Always offered, never configured: the manager's right to do nothing.
|
|
76
|
+
*
|
|
77
|
+
* Without it a model asked to choose an action must choose one, and a
|
|
78
|
+
* conversation waiting on a customer gets a second follow-up because answering
|
|
79
|
+
* "none of these" was not among the things it could say.
|
|
80
|
+
*/
|
|
81
|
+
const WAIT = "wait";
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Sent as the opening of the question rather than as a system message.
|
|
85
|
+
*
|
|
86
|
+
* The decide pipeline is a pipeline, not a model handle: what is in it may take
|
|
87
|
+
* a system prompt, may already have one saying something else, or may not be a
|
|
88
|
+
* model at all. Putting the instruction in the question means the whole of what
|
|
89
|
+
* was asked is one string a board author can read.
|
|
90
|
+
*/
|
|
91
|
+
const DEFAULT_INSTRUCTION =
|
|
92
|
+
"You manage an ongoing exchange with a customer on behalf of a business. " +
|
|
93
|
+
"You are given the goal, the states the exchange can be in, the actions you " +
|
|
94
|
+
"may take, and everything that has happened so far. Choose the single next " +
|
|
95
|
+
"action, and say which state the exchange is in once that action has been " +
|
|
96
|
+
"carried out. Do not repeat an action that has already been taken unless " +
|
|
97
|
+
"what has happened since calls for it. Choose '" +
|
|
98
|
+
WAIT +
|
|
99
|
+
"' when the right thing to do is nothing — when the exchange is waiting on " +
|
|
100
|
+
"someone else.";
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* How much of an answer is kept, and how much is sent.
|
|
104
|
+
*
|
|
105
|
+
* The state figure is the one that matters: state is what the frontend writes
|
|
106
|
+
* back into the board when it saves, so anything kept here is kept forever.
|
|
107
|
+
* Enough to see the shape of what came back; the notification carries enough
|
|
108
|
+
* to read it.
|
|
109
|
+
*/
|
|
110
|
+
const ANSWER_STATE_CHARS = 600;
|
|
111
|
+
/** Also the cap on the question, which goes the same way and is far longer. */
|
|
112
|
+
const ANSWER_NOTIFY_CHARS = 8_000;
|
|
113
|
+
|
|
114
|
+
type DeclaredState = { name: string; describe: string };
|
|
115
|
+
|
|
116
|
+
type Action = {
|
|
117
|
+
name: string;
|
|
118
|
+
describe: string;
|
|
119
|
+
/** Expression over the input deciding whether this action is offered at all. */
|
|
120
|
+
available: string;
|
|
121
|
+
pipeline: NestedPipeline;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
export class CommunicationDispatcherService implements HostedService {
|
|
125
|
+
readonly serviceId = communicationDispatcherDescriptor.serviceId;
|
|
126
|
+
readonly serviceName = communicationDispatcherDescriptor.serviceName;
|
|
127
|
+
readonly capabilities = communicationDispatcherDescriptor.capabilities;
|
|
128
|
+
readonly uuid: string;
|
|
129
|
+
|
|
130
|
+
private host: RuntimeHost | null = null;
|
|
131
|
+
private readonly createService: ServiceCreator;
|
|
132
|
+
|
|
133
|
+
private goal = "";
|
|
134
|
+
private instruction = DEFAULT_INSTRUCTION;
|
|
135
|
+
private states: DeclaredState[] = [];
|
|
136
|
+
private stateFrom = "state";
|
|
137
|
+
private maxContextChars = 20_000;
|
|
138
|
+
private actions: Action[] = [];
|
|
139
|
+
/**
|
|
140
|
+
* The cells this service's pipelines hold values in.
|
|
141
|
+
*
|
|
142
|
+
* Owned here, like an endpoint's: `decide` and the actions are pipelines of
|
|
143
|
+
* one arrangement, so a value one leaves for another belongs to this service
|
|
144
|
+
* rather than to the runtime around it.
|
|
145
|
+
*/
|
|
146
|
+
private readonly slotStore: SlotStore = new Map<string, unknown>();
|
|
147
|
+
private decide: NestedPipeline;
|
|
148
|
+
|
|
149
|
+
private lastAction = "";
|
|
150
|
+
private lastReason = "";
|
|
151
|
+
private lastNext = "";
|
|
152
|
+
private lastError = "";
|
|
153
|
+
private lastAnswer = "";
|
|
154
|
+
|
|
155
|
+
constructor(config: ServiceConfiguration, createService: ServiceCreator) {
|
|
156
|
+
this.uuid = config.uuid;
|
|
157
|
+
this.createService = createService;
|
|
158
|
+
this.decide = new NestedPipeline(`${this.uuid}:${DECIDE}`, createService, this.uuid);
|
|
159
|
+
this.decide.shareSlots(this.slotStore);
|
|
160
|
+
|
|
161
|
+
if (config.state) {
|
|
162
|
+
this.configure(config.state);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
setHost(host: RuntimeHost): void {
|
|
167
|
+
this.host = host;
|
|
168
|
+
this.decide.attach(host);
|
|
169
|
+
for (const action of this.actions) {
|
|
170
|
+
action.pipeline.attach(host);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/** Passes the scope on to every nested pipeline; see NestedPipeline.setScope. */
|
|
175
|
+
setScope(scope: RuntimeScope): void {
|
|
176
|
+
this.decide.setScope(scope);
|
|
177
|
+
for (const action of this.actions) {
|
|
178
|
+
action.pipeline.setScope(scope);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/** The nested service a scoped address names: the actions, then `decide`. */
|
|
183
|
+
findNested(instanceId: string): HostedService | undefined {
|
|
184
|
+
for (const action of this.actions) {
|
|
185
|
+
const found = action.pipeline.find(instanceId);
|
|
186
|
+
if (found) {
|
|
187
|
+
return found;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return this.decide.find(instanceId);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
getState(): JsonRecord {
|
|
194
|
+
return {
|
|
195
|
+
goal: this.goal,
|
|
196
|
+
instruction: this.instruction,
|
|
197
|
+
stateFrom: this.stateFrom,
|
|
198
|
+
maxContextChars: this.maxContextChars,
|
|
199
|
+
states: this.states.map((state) => ({ ...state })),
|
|
200
|
+
decide: this.decide.state(),
|
|
201
|
+
actions: this.actions.map((action) => ({
|
|
202
|
+
name: action.name,
|
|
203
|
+
describe: action.describe,
|
|
204
|
+
available: action.available,
|
|
205
|
+
pipeline: action.pipeline.state(),
|
|
206
|
+
})),
|
|
207
|
+
lastAction: this.lastAction,
|
|
208
|
+
lastReason: this.lastReason,
|
|
209
|
+
lastNext: this.lastNext,
|
|
210
|
+
// Kept short and kept here, unlike the question: a decision that did not
|
|
211
|
+
// parse is unreadable without the thing that failed to parse, and this
|
|
212
|
+
// is the one part small enough to live in state a board writes to disk.
|
|
213
|
+
lastAnswer: this.lastAnswer,
|
|
214
|
+
error: this.lastError,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
configure(config: JsonRecord): JsonRecord {
|
|
219
|
+
// Branch-scoped edits arrive from the UI, which speaks one pipeline at a
|
|
220
|
+
// time and says which one it means. Handled first: the rest of this method
|
|
221
|
+
// is about the dispatcher, this is about one of the pipelines under it.
|
|
222
|
+
if (typeof config.branch === "string") {
|
|
223
|
+
this.configureBranch(config.branch, config);
|
|
224
|
+
return this.getState();
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
if (typeof config.goal === "string") {
|
|
228
|
+
this.goal = config.goal;
|
|
229
|
+
}
|
|
230
|
+
if (typeof config.instruction === "string") {
|
|
231
|
+
this.instruction = config.instruction;
|
|
232
|
+
}
|
|
233
|
+
if (typeof config.stateFrom === "string") {
|
|
234
|
+
this.stateFrom = config.stateFrom;
|
|
235
|
+
}
|
|
236
|
+
if (typeof config.maxContextChars === "number") {
|
|
237
|
+
this.maxContextChars = Math.max(0, Math.floor(config.maxContextChars));
|
|
238
|
+
}
|
|
239
|
+
if (config.states !== undefined) {
|
|
240
|
+
this.states = declaredStates(config.states);
|
|
241
|
+
}
|
|
242
|
+
if (Array.isArray(config.decide)) {
|
|
243
|
+
this.decide.setPipeline(config.decide);
|
|
244
|
+
}
|
|
245
|
+
if (Array.isArray(config.actions)) {
|
|
246
|
+
this.setActions(config.actions);
|
|
247
|
+
}
|
|
248
|
+
if (isJsonRecord(config.addAction)) {
|
|
249
|
+
this.setActions([...this.actionConfigs(), config.addAction]);
|
|
250
|
+
}
|
|
251
|
+
if (typeof config.removeAction === "string") {
|
|
252
|
+
const name = config.removeAction;
|
|
253
|
+
this.setActions(
|
|
254
|
+
this.actionConfigs().filter((entry) => entry.name !== name),
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// The shape of the answer follows from what there is to answer with, so it
|
|
259
|
+
// is rewritten whenever either changes rather than configured by hand and
|
|
260
|
+
// left to drift out of step with the actions it names.
|
|
261
|
+
this.publishSchema();
|
|
262
|
+
return this.getState();
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
async process(
|
|
266
|
+
input: unknown,
|
|
267
|
+
notify: (payload: unknown, instanceId?: string) => void,
|
|
268
|
+
): Promise<unknown> {
|
|
269
|
+
if (input === null || input === undefined) {
|
|
270
|
+
return null;
|
|
271
|
+
}
|
|
272
|
+
if (this.decide.isEmpty()) {
|
|
273
|
+
return this.fail(notify, "no decide pipeline — add a text-generation service to it");
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
const offered = this.availableActions(input);
|
|
277
|
+
const decision = await this.ask(input, offered, notify);
|
|
278
|
+
if (!decision) {
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
const { action: name, reason, next, params } = decision;
|
|
283
|
+
this.lastAction = name;
|
|
284
|
+
this.lastReason = reason;
|
|
285
|
+
this.lastNext = next;
|
|
286
|
+
|
|
287
|
+
if (name === WAIT) {
|
|
288
|
+
// Nothing to *do* is not the same as nothing to say. A manager reading a
|
|
289
|
+
// complete enquiry decides there is nothing left to obtain and moves the
|
|
290
|
+
// exchange on; without that, a state reachable only by judgement would be
|
|
291
|
+
// unreachable, because every other route out of here runs an action.
|
|
292
|
+
notify({ action: WAIT, reason, next, lastAction: WAIT, lastReason: reason });
|
|
293
|
+
const current = valueAt(input, this.stateFrom);
|
|
294
|
+
if (!next || next === current) {
|
|
295
|
+
// Nothing changed, so nothing is passed on: whatever follows would
|
|
296
|
+
// otherwise write a transition for a pass in which nothing happened.
|
|
297
|
+
return null;
|
|
298
|
+
}
|
|
299
|
+
return { ...(isJsonRecord(input) ? input : { input }), action: WAIT, reason, state: next };
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
const action = offered.find((entry) => entry.name === name);
|
|
303
|
+
if (!action) {
|
|
304
|
+
// The schema enumerates what may be said, so this is a model ignoring it
|
|
305
|
+
// rather than a board naming something that does not exist.
|
|
306
|
+
return this.fail(notify, `'${name}' is not an action available here`);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
notify({ action: name, reason, next, params, lastAction: name, lastReason: reason });
|
|
310
|
+
|
|
311
|
+
const carried = isJsonRecord(input) ? input : { input };
|
|
312
|
+
const result = await action.pipeline.process(
|
|
313
|
+
{ ...carried, action: name, params, reason },
|
|
314
|
+
this.host?.currentContext() ?? null,
|
|
315
|
+
);
|
|
316
|
+
if (result === null || result === undefined) {
|
|
317
|
+
// The action did not do what it was asked, so the state it would have
|
|
318
|
+
// moved to is not the state anything is in. Nothing to pass on.
|
|
319
|
+
return this.fail(notify, `action '${name}' produced nothing — not advancing`);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
this.lastError = "";
|
|
323
|
+
return { ...carried, action: name, params, reason, result, state: next };
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
destroy(): void {
|
|
327
|
+
this.decide.destroy();
|
|
328
|
+
for (const action of this.actions) {
|
|
329
|
+
action.pipeline.destroy();
|
|
330
|
+
}
|
|
331
|
+
this.actions = [];
|
|
332
|
+
this.host = null;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// ── Private ──────────────────────────────────────────────────────────────
|
|
336
|
+
|
|
337
|
+
/** The actions on the menu for this input. */
|
|
338
|
+
private availableActions(input: unknown): Action[] {
|
|
339
|
+
return this.actions.filter((action) => {
|
|
340
|
+
if (!action.available) {
|
|
341
|
+
return true;
|
|
342
|
+
}
|
|
343
|
+
try {
|
|
344
|
+
return !!compileExpression(action.available)(input);
|
|
345
|
+
} catch (error) {
|
|
346
|
+
// A broken predicate hides an action rather than offering it: the
|
|
347
|
+
// safe reading of "we could not tell whether this is allowed".
|
|
348
|
+
this.host?.log("warn", "service.degraded", {
|
|
349
|
+
message: `action '${action.name}' has an unusable 'available' expression: ${
|
|
350
|
+
error instanceof Error ? error.message : String(error)
|
|
351
|
+
}`,
|
|
352
|
+
});
|
|
353
|
+
return false;
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* What the decide pipeline's own services are reporting, if anything.
|
|
360
|
+
*
|
|
361
|
+
* A pipeline that produced nothing has already been told why by whatever
|
|
362
|
+
* failed inside it — an address that refused, a key that was not accepted —
|
|
363
|
+
* and that sits in the failing service's state, one level down from anything
|
|
364
|
+
* a board shows. Reading it out here is the difference between "it did not
|
|
365
|
+
* work" and knowing what to fix.
|
|
366
|
+
*/
|
|
367
|
+
private decideErrors(): string {
|
|
368
|
+
const reported: string[] = [];
|
|
369
|
+
for (const service of this.decide.services()) {
|
|
370
|
+
const state = service.state;
|
|
371
|
+
if (isJsonRecord(state) && typeof state.error === "string" && state.error) {
|
|
372
|
+
reported.push(`${service.uuid}: ${preview(state.error, 300)}`);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
return reported.join("; ");
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/** Puts the question to the decide pipeline and reads the answer back. */
|
|
379
|
+
private async ask(
|
|
380
|
+
input: unknown,
|
|
381
|
+
offered: Action[],
|
|
382
|
+
notify: (payload: unknown, instanceId?: string) => void,
|
|
383
|
+
): Promise<{ action: string; reason: string; next: string; params: JsonRecord } | null> {
|
|
384
|
+
const prompt = this.prompt(input, offered);
|
|
385
|
+
const answer = await this.decide.process(
|
|
386
|
+
{ prompt },
|
|
387
|
+
this.host?.currentContext() ?? null,
|
|
388
|
+
);
|
|
389
|
+
|
|
390
|
+
// What was asked and what came back, verbatim, every pass — a decision is
|
|
391
|
+
// a model's, so the only way to see why it went the way it did is to read
|
|
392
|
+
// the exchange that produced it. Sent rather than stored: the question
|
|
393
|
+
// carries the whole conversation, and a board that saved it would write
|
|
394
|
+
// that conversation into itself.
|
|
395
|
+
this.lastAnswer = preview(answer, ANSWER_STATE_CHARS);
|
|
396
|
+
notify({
|
|
397
|
+
decidePrompt: preview(prompt, ANSWER_NOTIFY_CHARS),
|
|
398
|
+
decideAnswer: preview(answer, ANSWER_NOTIFY_CHARS),
|
|
399
|
+
lastAnswer: this.lastAnswer,
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
// Nothing came back at all, which is a service in the pipeline failing
|
|
403
|
+
// rather than a model answering badly — a different thing to go and look
|
|
404
|
+
// at, and the service that failed has already said what went wrong.
|
|
405
|
+
if (answer === null || answer === undefined) {
|
|
406
|
+
const reported = this.decideErrors();
|
|
407
|
+
return this.failNull(
|
|
408
|
+
notify,
|
|
409
|
+
reported
|
|
410
|
+
? `the decide pipeline produced nothing — ${reported}`
|
|
411
|
+
: "the decide pipeline produced nothing, and none of its services " +
|
|
412
|
+
"reported why — something in it returned null and stopped the run",
|
|
413
|
+
);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
const record = isJsonRecord(answer) ? answer : null;
|
|
417
|
+
const decision = record && isJsonRecord(record.json) ? record.json : null;
|
|
418
|
+
if (!decision) {
|
|
419
|
+
const reported = this.decideErrors();
|
|
420
|
+
return this.failNull(
|
|
421
|
+
notify,
|
|
422
|
+
`the decide pipeline did not answer in the required shape — ${describeAnswer(answer)}` +
|
|
423
|
+
(reported ? `; ${reported}` : ""),
|
|
424
|
+
);
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
const action = typeof decision.action === "string" ? decision.action : "";
|
|
428
|
+
if (!action) {
|
|
429
|
+
return this.failNull(notify, "the decision named no action");
|
|
430
|
+
}
|
|
431
|
+
const next = typeof decision.next === "string" ? decision.next : "";
|
|
432
|
+
if (next && this.states.length > 0 && !this.states.some((s) => s.name === next)) {
|
|
433
|
+
return this.failNull(
|
|
434
|
+
notify,
|
|
435
|
+
`'${next}' is not one of this board's states (${this.states
|
|
436
|
+
.map((s) => s.name)
|
|
437
|
+
.join(", ")})`,
|
|
438
|
+
);
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
return {
|
|
442
|
+
action,
|
|
443
|
+
reason: typeof decision.reason === "string" ? decision.reason : "",
|
|
444
|
+
next,
|
|
445
|
+
params: isJsonRecord(decision.params) ? decision.params : {},
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
/** Everything a new colleague would be told before being asked to decide. */
|
|
450
|
+
private prompt(input: unknown, offered: Action[]): string {
|
|
451
|
+
const lines: string[] = [];
|
|
452
|
+
if (this.instruction) {
|
|
453
|
+
lines.push(this.instruction, "");
|
|
454
|
+
}
|
|
455
|
+
if (this.goal) {
|
|
456
|
+
lines.push(`GOAL: ${this.goal}`, "");
|
|
457
|
+
}
|
|
458
|
+
if (this.states.length > 0) {
|
|
459
|
+
lines.push("STATES THE EXCHANGE CAN BE IN:");
|
|
460
|
+
for (const state of this.states) {
|
|
461
|
+
lines.push(state.describe ? `- ${state.name}: ${state.describe}` : `- ${state.name}`);
|
|
462
|
+
}
|
|
463
|
+
lines.push("");
|
|
464
|
+
}
|
|
465
|
+
lines.push("ACTIONS YOU MAY TAKE NOW:");
|
|
466
|
+
for (const action of offered) {
|
|
467
|
+
lines.push(action.describe ? `- ${action.name}: ${action.describe}` : `- ${action.name}`);
|
|
468
|
+
}
|
|
469
|
+
lines.push(`- ${WAIT}: do nothing; the exchange is waiting on someone else.`, "");
|
|
470
|
+
|
|
471
|
+
const current = valueAt(input, this.stateFrom);
|
|
472
|
+
if (typeof current === "string" && current) {
|
|
473
|
+
lines.push(`CURRENT STATE: ${current}`, "");
|
|
474
|
+
}
|
|
475
|
+
lines.push("WHAT HAS HAPPENED SO FAR:", this.context(input));
|
|
476
|
+
return lines.join("\n");
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
/**
|
|
480
|
+
* The input, as the model sees it.
|
|
481
|
+
*
|
|
482
|
+
* All of it: what is worth knowing about an exchange is whatever the board
|
|
483
|
+
* put in front of this service — the thread, what has already been extracted,
|
|
484
|
+
* what has already been drafted — and a service that named the parts it
|
|
485
|
+
* understood would stop being general the first time a board added one.
|
|
486
|
+
* Truncated only so that one long attachment cannot cost a context window.
|
|
487
|
+
*/
|
|
488
|
+
private context(input: unknown): string {
|
|
489
|
+
let text: string;
|
|
490
|
+
try {
|
|
491
|
+
text = JSON.stringify(input, null, 1) ?? String(input);
|
|
492
|
+
} catch {
|
|
493
|
+
text = String(input);
|
|
494
|
+
}
|
|
495
|
+
if (this.maxContextChars > 0 && text.length > this.maxContextChars) {
|
|
496
|
+
return `${text.slice(0, this.maxContextChars)}\n… (truncated)`;
|
|
497
|
+
}
|
|
498
|
+
return text;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
/**
|
|
502
|
+
* The shape of an answer, as a JSON schema, handed to the decide pipeline.
|
|
503
|
+
*
|
|
504
|
+
* `action` and `next` are enums of what this dispatcher actually has, which
|
|
505
|
+
* is what stops a decision naming something that does not exist. Pushed into
|
|
506
|
+
* whichever nested services take a `jsonSchema`, so that the constraint
|
|
507
|
+
* follows the configuration rather than being written out by hand beside it.
|
|
508
|
+
*/
|
|
509
|
+
private publishSchema(): void {
|
|
510
|
+
const schema: JsonRecord = {
|
|
511
|
+
type: "object",
|
|
512
|
+
properties: {
|
|
513
|
+
action: {
|
|
514
|
+
type: "string",
|
|
515
|
+
enum: [...this.actions.map((action) => action.name), WAIT],
|
|
516
|
+
description: "The single next action to take.",
|
|
517
|
+
},
|
|
518
|
+
reason: {
|
|
519
|
+
type: "string",
|
|
520
|
+
description: "Why this action, in one sentence.",
|
|
521
|
+
},
|
|
522
|
+
next: {
|
|
523
|
+
type: "string",
|
|
524
|
+
enum: this.states.map((state) => state.name),
|
|
525
|
+
description: "The state the exchange is in once the action is done.",
|
|
526
|
+
},
|
|
527
|
+
params: {
|
|
528
|
+
type: "object",
|
|
529
|
+
description: "What the action needs to know, if anything.",
|
|
530
|
+
additionalProperties: true,
|
|
531
|
+
},
|
|
532
|
+
},
|
|
533
|
+
required: ["action", "reason", "next"],
|
|
534
|
+
};
|
|
535
|
+
|
|
536
|
+
for (const service of this.decide.services()) {
|
|
537
|
+
if (isJsonRecord(service.state) && "jsonSchema" in service.state) {
|
|
538
|
+
this.decide.configureService(service.uuid, { jsonSchema: schema });
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
/** The actions as configuration, for edits that rewrite the whole list. */
|
|
544
|
+
private actionConfigs(): JsonRecord[] {
|
|
545
|
+
return this.actions.map((action) => ({
|
|
546
|
+
name: action.name,
|
|
547
|
+
describe: action.describe,
|
|
548
|
+
available: action.available,
|
|
549
|
+
pipeline: action.pipeline.state(),
|
|
550
|
+
}));
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
private setActions(value: unknown[]): void {
|
|
554
|
+
const previous = new Map(this.actions.map((action) => [action.name, action]));
|
|
555
|
+
const next: Action[] = [];
|
|
556
|
+
|
|
557
|
+
for (const entry of value) {
|
|
558
|
+
if (!isJsonRecord(entry) || typeof entry.name !== "string" || !entry.name) {
|
|
559
|
+
throw new Error("every action needs a name");
|
|
560
|
+
}
|
|
561
|
+
if (entry.name === WAIT) {
|
|
562
|
+
throw new Error(`'${WAIT}' is always available and cannot be configured`);
|
|
563
|
+
}
|
|
564
|
+
if (next.some((action) => action.name === entry.name)) {
|
|
565
|
+
throw new Error(`two actions are both called '${entry.name}'`);
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
// An action already here keeps its pipeline: rebuilding it would destroy
|
|
569
|
+
// running services — a mount, a timer — because something unrelated
|
|
570
|
+
// beside it was edited.
|
|
571
|
+
const existing = previous.get(entry.name);
|
|
572
|
+
const pipeline =
|
|
573
|
+
existing?.pipeline ??
|
|
574
|
+
new NestedPipeline(`${this.uuid}:${entry.name}`, this.createService, this.uuid);
|
|
575
|
+
pipeline.shareSlots(this.slotStore);
|
|
576
|
+
if (Array.isArray(entry.pipeline)) {
|
|
577
|
+
pipeline.setPipeline(entry.pipeline);
|
|
578
|
+
}
|
|
579
|
+
if (!existing && this.host) {
|
|
580
|
+
pipeline.attach(this.host);
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
next.push({
|
|
584
|
+
name: entry.name,
|
|
585
|
+
describe: typeof entry.describe === "string" ? entry.describe : "",
|
|
586
|
+
available: typeof entry.available === "string" ? entry.available : "",
|
|
587
|
+
pipeline,
|
|
588
|
+
});
|
|
589
|
+
previous.delete(entry.name);
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
// Whatever is left was removed, and holds services nothing will reach again.
|
|
593
|
+
for (const dropped of previous.values()) {
|
|
594
|
+
dropped.pipeline.destroy();
|
|
595
|
+
}
|
|
596
|
+
this.actions = next;
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
/** Applies a pipeline edit to one branch: an action by name, or `decide`. */
|
|
600
|
+
private configureBranch(branch: string, config: JsonRecord): void {
|
|
601
|
+
const pipeline =
|
|
602
|
+
branch === DECIDE
|
|
603
|
+
? this.decide
|
|
604
|
+
: this.actions.find((action) => action.name === branch)?.pipeline;
|
|
605
|
+
if (!pipeline) {
|
|
606
|
+
throw new Error(`no action called '${branch}'`);
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
if (typeof config.describe === "string" || typeof config.available === "string") {
|
|
610
|
+
this.actions = this.actions.map((action) =>
|
|
611
|
+
action.name === branch
|
|
612
|
+
? {
|
|
613
|
+
...action,
|
|
614
|
+
describe:
|
|
615
|
+
typeof config.describe === "string" ? config.describe : action.describe,
|
|
616
|
+
available:
|
|
617
|
+
typeof config.available === "string" ? config.available : action.available,
|
|
618
|
+
}
|
|
619
|
+
: action,
|
|
620
|
+
);
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
if (Array.isArray(config.pipeline)) {
|
|
624
|
+
pipeline.setPipeline(config.pipeline);
|
|
625
|
+
}
|
|
626
|
+
if (isJsonRecord(config.appendService)) {
|
|
627
|
+
pipeline.append(config.appendService);
|
|
628
|
+
}
|
|
629
|
+
if (typeof config.removeService === "string") {
|
|
630
|
+
pipeline.remove(config.removeService);
|
|
631
|
+
}
|
|
632
|
+
if (isJsonRecord(config.configureService)) {
|
|
633
|
+
const payload = config.configureService;
|
|
634
|
+
if (typeof payload.instanceId === "string" && isJsonRecord(payload.state)) {
|
|
635
|
+
pipeline.configureService(payload.instanceId, payload.state);
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
if (branch === DECIDE) {
|
|
640
|
+
this.publishSchema();
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
private fail(
|
|
645
|
+
notify: (payload: unknown, instanceId?: string) => void,
|
|
646
|
+
message: string,
|
|
647
|
+
): null {
|
|
648
|
+
this.lastError = message;
|
|
649
|
+
notify({ error: message });
|
|
650
|
+
this.host?.log("warn", "service.degraded", { message });
|
|
651
|
+
return null;
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
private failNull(
|
|
655
|
+
notify: (payload: unknown, instanceId?: string) => void,
|
|
656
|
+
message: string,
|
|
657
|
+
): null {
|
|
658
|
+
this.fail(notify, message);
|
|
659
|
+
return null;
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
/** A value as text, short enough to put in a message. */
|
|
664
|
+
function preview(value: unknown, max: number): string {
|
|
665
|
+
let text: string;
|
|
666
|
+
try {
|
|
667
|
+
text = typeof value === "string" ? value : (JSON.stringify(value) ?? String(value));
|
|
668
|
+
} catch {
|
|
669
|
+
text = String(value);
|
|
670
|
+
}
|
|
671
|
+
return max > 0 && text.length > max ? `${text.slice(0, max)}…` : text;
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
/**
|
|
675
|
+
* Why an answer was not a decision, in the terms of the thing that produced it.
|
|
676
|
+
*
|
|
677
|
+
* "Not the required shape" says a pipeline whose services are all fine, whose
|
|
678
|
+
* model answered, and whose board is one setting away from working — which of
|
|
679
|
+
* those it is decides where to look, and only what came back can say.
|
|
680
|
+
*/
|
|
681
|
+
function describeAnswer(answer: unknown): string {
|
|
682
|
+
if (!isJsonRecord(answer)) {
|
|
683
|
+
return `it produced a ${typeof answer}: ${preview(answer, 200)}`;
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
const keys = Object.keys(answer);
|
|
687
|
+
if (keys.length === 1 && keys[0] === "prompt") {
|
|
688
|
+
return (
|
|
689
|
+
"the question came back unchanged, so nothing in the pipeline answered " +
|
|
690
|
+
"it — every service in it is bypassed, or it passes its input through"
|
|
691
|
+
);
|
|
692
|
+
}
|
|
693
|
+
if (typeof answer.text === "string" && answer.json === undefined) {
|
|
694
|
+
return (
|
|
695
|
+
"it answered with text but no `json`, so the answer was not JSON " +
|
|
696
|
+
"matching the schema — the model wrote prose or was cut off, or the " +
|
|
697
|
+
"server ignored the schema it was sent. It said: " +
|
|
698
|
+
preview(answer.text, 300)
|
|
699
|
+
);
|
|
700
|
+
}
|
|
701
|
+
return `it produced [${keys.join(", ")}], with no \`json\` object: ${preview(answer, 300)}`;
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
function declaredStates(value: unknown): DeclaredState[] {
|
|
705
|
+
if (!Array.isArray(value)) {
|
|
706
|
+
return [];
|
|
707
|
+
}
|
|
708
|
+
const states: DeclaredState[] = [];
|
|
709
|
+
for (const entry of value) {
|
|
710
|
+
if (typeof entry === "string" && entry) {
|
|
711
|
+
states.push({ name: entry, describe: "" });
|
|
712
|
+
} else if (isJsonRecord(entry) && typeof entry.name === "string" && entry.name) {
|
|
713
|
+
states.push({
|
|
714
|
+
name: entry.name,
|
|
715
|
+
describe: typeof entry.describe === "string" ? entry.describe : "",
|
|
716
|
+
});
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
return states;
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
/** Reads a dotted path out of a value. */
|
|
723
|
+
function valueAt(input: unknown, path: string): unknown {
|
|
724
|
+
if (!path) {
|
|
725
|
+
return undefined;
|
|
726
|
+
}
|
|
727
|
+
let current: unknown = input;
|
|
728
|
+
for (const part of path.split(".")) {
|
|
729
|
+
if (!isJsonRecord(current)) {
|
|
730
|
+
return undefined;
|
|
731
|
+
}
|
|
732
|
+
current = current[part];
|
|
733
|
+
}
|
|
734
|
+
return current;
|
|
735
|
+
}
|