@elizaos/app-core 2.0.3-beta.2 → 2.0.3-beta.3
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/agent-bridge.d.ts +5 -5
- package/api/auth/audit.d.ts +1 -1
- package/api/auth/auth-context.d.ts +1 -1
- package/api/auth/bootstrap-token.d.ts +1 -1
- package/api/auth/sessions.d.ts +1 -1
- package/api/auth-bootstrap-routes.d.ts +1 -1
- package/api/auth-pairing-routes.d.ts +1 -1
- package/api/auth-pairing-routes.d.ts.map +1 -1
- package/api/auth-pairing-routes.js +2 -3
- package/api/auth-session-routes.d.ts +2 -2
- package/api/auth.d.ts +1 -1
- package/api/automations-compat-routes.d.ts +1 -1
- package/api/background-tasks-routes.d.ts +1 -1
- package/api/catalog-routes.d.ts +1 -1
- package/api/cloud-voice-routes.d.ts +1 -1
- package/api/compat-route-shared.d.ts +12 -5
- package/api/compat-route-shared.d.ts.map +1 -1
- package/api/compat-route-shared.js +22 -187
- package/api/database-rows-compat-routes.d.ts +1 -1
- package/api/dev-compat-routes.d.ts +1 -1
- package/api/dev-route-catalog.d.ts.map +1 -1
- package/api/dev-route-catalog.js +20 -0
- package/api/drop-status-compat-route.d.ts +3 -0
- package/api/drop-status-compat-route.d.ts.map +1 -0
- package/api/drop-status-compat-route.js +12 -0
- package/api/first-run-routes.d.ts +1 -1
- package/api/internal-routes.d.ts +1 -1
- package/api/runtime-mode-routes.d.ts +1 -1
- package/api/secrets-manager-routes.d.ts.map +1 -1
- package/api/sensitive-request-routes.d.ts +2 -2
- package/api/server-config-filter.d.ts.map +1 -1
- package/api/server-config-filter.js +0 -1
- package/api/server-first-run-helpers.d.ts.map +1 -1
- package/api/server-first-run-helpers.js +0 -3
- package/api/server.d.ts +8 -8
- package/api/server.d.ts.map +1 -1
- package/api/server.js +13 -59
- package/api/training-benchmarks.d.ts +1 -1
- package/api/training-benchmarks.d.ts.map +1 -1
- package/api/training-benchmarks.js +31 -9
- package/api/workbench-compat-routes.d.ts +1 -1
- package/benchmark/server-utils.d.ts +2 -2
- package/browser.d.ts +4 -4
- package/cli/plugins-cli.d.ts.map +1 -1
- package/cli/plugins-cli.js +5 -0
- package/cli/program/register.auth.d.ts +27 -1
- package/cli/program/register.auth.d.ts.map +1 -1
- package/cli/program/register.auth.js +187 -0
- package/cli/program/register.dashboard.d.ts.map +1 -1
- package/cli/program/register.dashboard.js +11 -1
- package/cli/program.d.ts +1 -1
- package/first-run/first-run-config.d.ts +1 -1
- package/index.d.ts +46 -47
- package/index.d.ts.map +1 -1
- package/index.js +3 -7
- package/package.json +42 -36
- package/packaging/PUBLISHING_GUIDE.md +20 -20
- package/platform/elizaos-agent-browser-stub.d.ts +0 -1
- package/platform/elizaos-agent-browser-stub.d.ts.map +1 -1
- package/platform/elizaos-agent-browser-stub.js +0 -1
- package/platform/ios-runtime-bridge.d.ts.map +1 -1
- package/platform/ios-runtime-bridge.js +0 -1
- package/platform/native-plugin-entrypoints.d.ts +2 -2
- package/platforms/android/app/build.gradle +30 -7
- package/platforms/android/app/src/main/elizavoice-jni/elizavoice-jni.cpp +179 -35
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaAgentService.java +60 -32
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaBionicInferenceServer.java +405 -65
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaVoiceNative.java +35 -0
- package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaVoicePlugin.java +13 -6
- package/platforms/android/app/src/main/res/drawable/splash.png +0 -0
- package/platforms/android/app/src/main/res/drawable-land-hdpi/splash.png +0 -0
- package/platforms/android/app/src/main/res/drawable-land-mdpi/splash.png +0 -0
- package/platforms/android/app/src/main/res/drawable-land-xhdpi/splash.png +0 -0
- package/platforms/android/app/src/main/res/drawable-land-xxhdpi/splash.png +0 -0
- package/platforms/android/app/src/main/res/drawable-land-xxxhdpi/splash.png +0 -0
- package/platforms/android/app/src/main/res/drawable-port-hdpi/splash.png +0 -0
- package/platforms/android/app/src/main/res/drawable-port-mdpi/splash.png +0 -0
- package/platforms/android/app/src/main/res/drawable-port-xhdpi/splash.png +0 -0
- package/platforms/android/app/src/main/res/drawable-port-xxhdpi/splash.png +0 -0
- package/platforms/android/app/src/main/res/drawable-port-xxxhdpi/splash.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png +0 -0
- package/platforms/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
- package/platforms/android/app/src/main/res/values/colors.xml +5 -1
- package/platforms/android/app/src/main/res/values/ic_launcher_background.xml +1 -1
- package/platforms/android/app/src/main/res/values/styles.xml +4 -1
- package/platforms/electrobun/electrobun.config.ts +0 -1
- package/platforms/electrobun/native/macos/window-effects.mm +4 -0
- package/platforms/electrobun/package.json +11 -9
- package/platforms/electrobun/remotes/local-model/src/bun/eliza1-catalog.ts +1 -1
- package/platforms/electrobun/remotes/runtime/src/dev/phase2-smoke.ts +10 -5
- package/platforms/electrobun/remotes/runtime/src/dev/phase3-smoke.ts +11 -15
- package/platforms/electrobun/src/application-menu.ts +0 -7
- package/platforms/electrobun/src/desktop-http-request.test.ts +30 -1
- package/platforms/electrobun/src/desktop-http-request.ts +14 -2
- package/platforms/electrobun/src/desktop-test-bridge-server.ts +28 -0
- package/platforms/electrobun/src/fatal-shutdown.test.ts +3 -7
- package/platforms/electrobun/src/index.ts +64 -13
- package/platforms/electrobun/src/lifecycle/api-base-owner.test.ts +83 -0
- package/platforms/electrobun/src/lifecycle/api-base-owner.ts +37 -16
- package/platforms/electrobun/src/native/agent.ts +28 -17
- package/platforms/electrobun/src/native/credentials.ts +6 -1
- package/platforms/electrobun/src/native/desktop-window.test.ts +142 -26
- package/platforms/electrobun/src/native/desktop.ts +8 -4
- package/platforms/electrobun/src/native/index.ts +6 -0
- package/platforms/electrobun/src/native/remote-plugin-host.ts +18 -8
- package/platforms/electrobun/src/preload.js +1 -1
- package/platforms/electrobun/src/voice/voice-live-validation.test.ts +10 -5
- package/platforms/electrobun/src/voice/voice-runtime-adapter.ts +3 -2
- package/platforms/electrobun/src/voice/voice-service.test.ts +26 -0
- package/platforms/electrobun/src/voice/voice-service.ts +57 -17
- package/platforms/electrobun/tsconfig.json +17 -1
- package/platforms/ios/App/App/Base.lproj/LaunchScreen.storyboard +4 -6
- package/registry/index.d.ts +1 -6
- package/registry/index.d.ts.map +1 -1
- package/registry/index.js +9 -101
- package/runtime/android-avf-microdroid-bridge.d.ts +1 -1
- package/runtime/bundled-fused-lib.d.ts +36 -0
- package/runtime/bundled-fused-lib.d.ts.map +1 -0
- package/runtime/bundled-fused-lib.js +77 -0
- package/runtime/channel-plugin-map.d.ts +1 -5
- package/runtime/channel-plugin-map.d.ts.map +1 -1
- package/runtime/channel-plugin-map.js +11 -31
- package/runtime/desktop/index.d.ts +5 -5
- package/runtime/dev-server.js +11 -2
- package/runtime/eliza.d.ts.map +1 -1
- package/runtime/eliza.js +18 -8
- package/runtime/mode/route-mode-guard.d.ts +1 -1
- package/runtime/mode/route-mode-matrix.d.ts +1 -1
- package/runtime/voice-warmup.d.ts +4 -19
- package/runtime/voice-warmup.d.ts.map +1 -1
- package/runtime/voice-warmup.js +4 -14
- package/scripts/aosp/README.md +10 -1
- package/scripts/aosp/compile-libllama-zig-pin.test.mjs +147 -0
- package/scripts/aosp/compile-libllama.mjs +446 -59
- package/scripts/aosp/compile-libllama.test.mjs +133 -0
- package/scripts/aosp/compile-shim.mjs +21 -1
- package/scripts/aosp/deploy-pixel.mjs +1 -1
- package/scripts/aosp/stage-default-models.mjs +24 -31
- package/scripts/aosp/stage-default-models.test.mjs +23 -0
- package/scripts/assert-required-bundled-packages.test.ts +22 -1
- package/scripts/build-helpers/verify-fused-symbols.mjs +33 -0
- package/scripts/build-helpers/verify-fused-symbols.test.mjs +0 -0
- package/scripts/build-image.sh +1 -3
- package/scripts/build-llama-cpp-mtp.mjs +17 -16
- package/scripts/check-i18n.mjs +0 -1
- package/scripts/copy-runtime-node-modules.ts +147 -0
- package/scripts/desktop-build.mjs +317 -4
- package/scripts/docker-ci-smoke.sh +33 -8
- package/scripts/ensure-type-package-aliases.mjs +1 -1
- package/scripts/ios-xcframework/run-physical-device-smoke.mjs +1 -1
- package/scripts/lib/agent-source-watcher.mjs +0 -1
- package/scripts/lib/artifact-staleness.d.mts +33 -0
- package/scripts/lib/artifact-staleness.mjs +122 -0
- package/scripts/lib/artifact-staleness.test.mts +98 -0
- package/scripts/lib/duet-bridge.mjs +1 -1
- package/scripts/lib/ios-plist-url-scheme.mjs +80 -0
- package/scripts/lib/mobile-build-decisions.mjs +97 -0
- package/scripts/lib/renderer-build-manifest.d.mts +65 -0
- package/scripts/lib/renderer-build-manifest.mjs +257 -0
- package/scripts/lib/renderer-build-manifest.test.mts +277 -0
- package/scripts/lib/stage-android-agent.mjs +13 -4
- package/scripts/lib/verify-ondevice-artifact.d.mts +16 -0
- package/scripts/lib/verify-ondevice-artifact.mjs +61 -0
- package/scripts/lib/verify-ondevice-artifact.test.mts +98 -0
- package/scripts/lib/websocket-pending-queue.ts +92 -0
- package/scripts/link-docker-local-app-packages.mjs +6 -0
- package/scripts/playwright-ui-live-stack.ts +430 -144
- package/scripts/playwright-ui-smoke-api-stub.mjs +160 -168
- package/scripts/run-local-plugin-live-smoke.mjs +1 -6
- package/scripts/run-mobile-build-brand-separation.test.mts +33 -0
- package/scripts/run-mobile-build-ios-engine-gate.test.mjs +85 -0
- package/scripts/run-mobile-build-mtp-staleness.test.mts +198 -0
- package/scripts/run-mobile-build.mjs +408 -86
- package/scripts/serve-real-local-agent.ts +72 -0
- package/scripts/stage-desktop-fused-lib.mjs +43 -14
- package/scripts/verify-ondevice-artifact.mjs +111 -0
- package/scripts/voice-attribution-smoke.ts +144 -38
- package/scripts/voice-duet.mjs +6 -6
- package/scripts/voice-e2e-hardware.ts +22 -16
- package/scripts/voice-interactive.mjs +16 -45
- package/security/agent-vault-id.d.ts +1 -1
- package/security/platform-secure-store-node.d.ts +1 -1
- package/services/ambient-audio/consent.d.ts +1 -1
- package/services/ambient-audio/index.d.ts +6 -6
- package/services/ambient-audio/replay-buffer.d.ts +1 -1
- package/services/ambient-audio/response-gate.d.ts +1 -1
- package/services/ambient-audio/service.d.ts +3 -3
- package/services/connector-target-catalog.d.ts +1 -1
- package/services/sensitive-requests/index.d.ts +6 -6
- package/services/steward-sidecar/wallet-setup.d.ts +1 -1
- package/services/steward-sidecar.d.ts +3 -3
- package/services/tunnel-to-mobile/index.d.ts +1 -1
- package/services/vault-bootstrap.d.ts.map +1 -1
- package/services/vault-bootstrap.js +14 -10
- package/services/voice-profiles/diarization-pipeline.d.ts +1 -1
- package/services/voice-profiles/index.d.ts +11 -11
- package/services/voice-profiles/owner-confidence.d.ts +1 -1
- package/services/voice-profiles/private-challenge.d.ts +1 -1
- package/services/voice-profiles/store.d.ts +1 -1
- package/test/helpers/live-provider.test.ts +91 -1
- package/test/helpers/live-provider.ts +195 -51
- package/test/scripts/websocket-pending-queue.test.ts +119 -0
- package/test-support/test-helpers.d.ts +0 -33
- package/test-support/test-helpers.d.ts.map +1 -1
- package/test-support/test-helpers.js +81 -189
- package/ui-compat.d.ts +1 -0
- package/ui-compat.d.ts.map +1 -1
- package/ui-compat.js +4 -0
- package/platforms/electrobun/docs/convergence-audit.json +0 -3505
- package/platforms/electrobun/docs/convergence-audit.md +0 -694
- package/platforms/electrobun/scripts/ensure-whisper-gguf.sh +0 -55
- package/platforms/electrobun/scripts/ensure-whisper-model.sh +0 -35
- package/platforms/electrobun/scripts/generate-convergence-audit.ts +0 -1203
- package/platforms/electrobun/src/native/whisper-env.test.ts +0 -71
- package/platforms/electrobun/src/native/whisper-env.ts +0 -68
- package/registry/app-registry.d.ts +0 -14
- package/registry/app-registry.d.ts.map +0 -1
- package/registry/app-registry.js +0 -29
- package/registry/entries/apps/app-polymarket.json +0 -31
- package/registry/entries/apps/clawville.json +0 -27
- package/registry/entries/apps/companion.json +0 -28
- package/registry/entries/apps/database-viewer.json +0 -27
- package/registry/entries/apps/defense-of-the-agents.json +0 -27
- package/registry/entries/apps/documents.json +0 -30
- package/registry/entries/apps/feed.json +0 -27
- package/registry/entries/apps/hyperliquid.json +0 -31
- package/registry/entries/apps/log-viewer.json +0 -27
- package/registry/entries/apps/memory-viewer.json +0 -27
- package/registry/entries/apps/model-tester.json +0 -31
- package/registry/entries/apps/plugin-viewer.json +0 -27
- package/registry/entries/apps/relationship-viewer.json +0 -27
- package/registry/entries/apps/runtime-debugger.json +0 -27
- package/registry/entries/apps/shopify.json +0 -31
- package/registry/entries/apps/skills-viewer.json +0 -27
- package/registry/entries/apps/steward.json +0 -31
- package/registry/entries/apps/training.json +0 -54
- package/registry/entries/apps/trajectory-viewer.json +0 -27
- package/registry/entries/apps/vincent.json +0 -31
- package/registry/entries/connectors/bluebubbles.json +0 -99
- package/registry/entries/connectors/bluesky.json +0 -173
- package/registry/entries/connectors/discord.json +0 -119
- package/registry/entries/connectors/farcaster.json +0 -174
- package/registry/entries/connectors/feishu.json +0 -79
- package/registry/entries/connectors/google-chat.json +0 -120
- package/registry/entries/connectors/google.json +0 -82
- package/registry/entries/connectors/imessage.json +0 -96
- package/registry/entries/connectors/instagram.json +0 -64
- package/registry/entries/connectors/line.json +0 -86
- package/registry/entries/connectors/matrix.json +0 -94
- package/registry/entries/connectors/mattermost.json +0 -110
- package/registry/entries/connectors/msteams.json +0 -104
- package/registry/entries/connectors/nextcloud-talk.json +0 -104
- package/registry/entries/connectors/nostr.json +0 -70
- package/registry/entries/connectors/signal.json +0 -81
- package/registry/entries/connectors/slack.json +0 -102
- package/registry/entries/connectors/telegram.json +0 -71
- package/registry/entries/connectors/tlon.json +0 -94
- package/registry/entries/connectors/twitch.json +0 -110
- package/registry/entries/connectors/whatsapp.json +0 -113
- package/registry/entries/connectors/x.json +0 -231
- package/registry/entries/connectors/zalo.json +0 -112
- package/registry/entries/connectors/zalouser.json +0 -122
- package/registry/entries/plugins/agent-orchestrator.json +0 -33
- package/registry/entries/plugins/agent-skills.json +0 -72
- package/registry/entries/plugins/anthropic.json +0 -73
- package/registry/entries/plugins/app-control.json +0 -23
- package/registry/entries/plugins/auto-trader.json +0 -203
- package/registry/entries/plugins/background-runner.json +0 -26
- package/registry/entries/plugins/blooio.json +0 -102
- package/registry/entries/plugins/browser.json +0 -75
- package/registry/entries/plugins/cli.json +0 -40
- package/registry/entries/plugins/clipboard.json +0 -44
- package/registry/entries/plugins/coding-tools.json +0 -71
- package/registry/entries/plugins/commands.json +0 -63
- package/registry/entries/plugins/computeruse.json +0 -74
- package/registry/entries/plugins/copilot-proxy.json +0 -93
- package/registry/entries/plugins/directives.json +0 -63
- package/registry/entries/plugins/edge-tts.json +0 -97
- package/registry/entries/plugins/elevenlabs.json +0 -169
- package/registry/entries/plugins/elizacloud.json +0 -208
- package/registry/entries/plugins/evm.json +0 -134
- package/registry/entries/plugins/experience.json +0 -34
- package/registry/entries/plugins/facewear.json +0 -131
- package/registry/entries/plugins/form.json +0 -26
- package/registry/entries/plugins/github.json +0 -93
- package/registry/entries/plugins/gmail-watch.json +0 -25
- package/registry/entries/plugins/goals.json +0 -77
- package/registry/entries/plugins/google-genai.json +0 -106
- package/registry/entries/plugins/groq.json +0 -93
- package/registry/entries/plugins/hedera.json +0 -48
- package/registry/entries/plugins/inmemorydb.json +0 -25
- package/registry/entries/plugins/linear.json +0 -51
- package/registry/entries/plugins/local-inference.json +0 -137
- package/registry/entries/plugins/local-storage.json +0 -36
- package/registry/entries/plugins/localdb.json +0 -25
- package/registry/entries/plugins/mcp.json +0 -44
- package/registry/entries/plugins/memory.json +0 -124
- package/registry/entries/plugins/minecraft.json +0 -79
- package/registry/entries/plugins/moltbook.json +0 -83
- package/registry/entries/plugins/music.json +0 -155
- package/registry/entries/plugins/mysticism.json +0 -48
- package/registry/entries/plugins/nearai.json +0 -82
- package/registry/entries/plugins/ngrok.json +0 -69
- package/registry/entries/plugins/ollama.json +0 -96
- package/registry/entries/plugins/openai.json +0 -189
- package/registry/entries/plugins/openrouter.json +0 -188
- package/registry/entries/plugins/pdf.json +0 -26
- package/registry/entries/plugins/plugin-manager.json +0 -23
- package/registry/entries/plugins/prose.json +0 -48
- package/registry/entries/plugins/rlm.json +0 -26
- package/registry/entries/plugins/roblox.json +0 -88
- package/registry/entries/plugins/rss.json +0 -64
- package/registry/entries/plugins/s3-storage.json +0 -91
- package/registry/entries/plugins/scheduling.json +0 -35
- package/registry/entries/plugins/shell.json +0 -94
- package/registry/entries/plugins/social-alpha.json +0 -72
- package/registry/entries/plugins/tailscale.json +0 -81
- package/registry/entries/plugins/tee.json +0 -53
- package/registry/entries/plugins/todos.json +0 -26
- package/registry/entries/plugins/trajectory-logger.json +0 -33
- package/registry/entries/plugins/trust.json +0 -39
- package/registry/entries/plugins/tts.json +0 -71
- package/registry/entries/plugins/tunnel.json +0 -45
- package/registry/entries/plugins/twilio.json +0 -168
- package/registry/entries/plugins/vercel-ai-gateway.json +0 -128
- package/registry/entries/plugins/video.json +0 -23
- package/registry/entries/plugins/vision.json +0 -43
- package/registry/entries/plugins/webhooks.json +0 -23
- package/registry/entries/plugins/workflow.json +0 -25
- package/registry/entries/plugins/xai.json +0 -75
- package/registry/loader.d.ts +0 -28
- package/registry/loader.d.ts.map +0 -1
- package/registry/loader.js +0 -158
- package/registry/schema.d.ts +0 -1199
- package/registry/schema.d.ts.map +0 -1
- package/registry/schema.js +0 -300
- package/scripts/patches/llama-mobile-kokoro-tts.patch +0 -480
- package/scripts/release-workflow-drift.test.ts +0 -57
- package/test/helpers/i18n.ts +0 -5
- package/test/helpers/loopback.ts +0 -33
- package/test/helpers/react-test.ts +0 -40
- package/test/helpers/skip-without.ts +0 -53
|
@@ -1,1203 +0,0 @@
|
|
|
1
|
-
import { execFileSync } from "node:child_process";
|
|
2
|
-
import { mkdir, readdir, readFile, stat, writeFile } from "node:fs/promises";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
|
|
5
|
-
type JsonPrimitive = string | number | boolean | null;
|
|
6
|
-
type JsonValue =
|
|
7
|
-
| JsonPrimitive
|
|
8
|
-
| { readonly [key: string]: JsonValue }
|
|
9
|
-
| readonly JsonValue[];
|
|
10
|
-
type JsonObject = { readonly [key: string]: JsonValue };
|
|
11
|
-
|
|
12
|
-
type Category =
|
|
13
|
-
| "core-runtime"
|
|
14
|
-
| "desktop-shell"
|
|
15
|
-
| "production-ui"
|
|
16
|
-
| "app-plugin"
|
|
17
|
-
| "connector-plugin"
|
|
18
|
-
| "model-plugin"
|
|
19
|
-
| "voice-plugin"
|
|
20
|
-
| "native-semantic-plugin"
|
|
21
|
-
| "desktop-capability"
|
|
22
|
-
| "data-memory-plugin"
|
|
23
|
-
| "dev-tooling"
|
|
24
|
-
| "provider-plugin"
|
|
25
|
-
| "obsolete-or-duplicate"
|
|
26
|
-
| "unknown";
|
|
27
|
-
|
|
28
|
-
type KeepAs =
|
|
29
|
-
| "core"
|
|
30
|
-
| "plugin"
|
|
31
|
-
| "app-plugin"
|
|
32
|
-
| "connector"
|
|
33
|
-
| "remote"
|
|
34
|
-
| "dynamic-view-template"
|
|
35
|
-
| "trace-source"
|
|
36
|
-
| "voice-pipeline-participant"
|
|
37
|
-
| "model-pipeline-participant"
|
|
38
|
-
| "delete-candidate"
|
|
39
|
-
| "needs-review";
|
|
40
|
-
|
|
41
|
-
type RelatedRemote =
|
|
42
|
-
| "eliza.runtime"
|
|
43
|
-
| "eliza.fs"
|
|
44
|
-
| "eliza.pty"
|
|
45
|
-
| "eliza.git"
|
|
46
|
-
| "eliza.local-model";
|
|
47
|
-
|
|
48
|
-
type RelatedLayer =
|
|
49
|
-
| "dynamic-views"
|
|
50
|
-
| "trace"
|
|
51
|
-
| "voice"
|
|
52
|
-
| "local-inference"
|
|
53
|
-
| "production-app"
|
|
54
|
-
| "electrobun-shell"
|
|
55
|
-
| "agent-runtime";
|
|
56
|
-
|
|
57
|
-
type RecommendedNextAction =
|
|
58
|
-
| "leave-alone"
|
|
59
|
-
| "add-trace-hooks"
|
|
60
|
-
| "add-dynamic-view-manifest"
|
|
61
|
-
| "route-through-runtime-broker"
|
|
62
|
-
| "connect-to-voice-pipeline"
|
|
63
|
-
| "connect-to-local-model"
|
|
64
|
-
| "dedupe-with-existing-plugin"
|
|
65
|
-
| "deprecate"
|
|
66
|
-
| "delete-after-confirmation"
|
|
67
|
-
| "needs-owner-decision";
|
|
68
|
-
|
|
69
|
-
type Risk = "low" | "medium" | "high";
|
|
70
|
-
|
|
71
|
-
type ConvergenceAuditEntry = {
|
|
72
|
-
id: string;
|
|
73
|
-
path: string;
|
|
74
|
-
category: Category;
|
|
75
|
-
currentPurpose: string;
|
|
76
|
-
keepAs: KeepAs;
|
|
77
|
-
shouldBecomeRemote: boolean;
|
|
78
|
-
shouldRegisterDynamicViews: boolean;
|
|
79
|
-
shouldEmitTraceEvents: boolean;
|
|
80
|
-
shouldUseRuntimeBroker: boolean;
|
|
81
|
-
shouldStayOutOfElectrobun: boolean;
|
|
82
|
-
relatedRemotes?: RelatedRemote[];
|
|
83
|
-
relatedLayers?: RelatedLayer[];
|
|
84
|
-
recommendedNextAction: RecommendedNextAction;
|
|
85
|
-
risk: Risk;
|
|
86
|
-
ownerDecisionNeeded?: boolean;
|
|
87
|
-
notes: string;
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
type DeletionCandidate = {
|
|
91
|
-
path: string;
|
|
92
|
-
reason: string;
|
|
93
|
-
confidence: "low" | "medium" | "high";
|
|
94
|
-
safeToDeleteNow: boolean;
|
|
95
|
-
requiresOwnerDecision: boolean;
|
|
96
|
-
validationNeeded: string[];
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
type PackageJson = {
|
|
100
|
-
name?: string;
|
|
101
|
-
description?: string;
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
type AuditDocument = {
|
|
105
|
-
generatedAt: string;
|
|
106
|
-
branch: string;
|
|
107
|
-
aheadBehind: string;
|
|
108
|
-
dirtyStatus: string[];
|
|
109
|
-
entries: ConvergenceAuditEntry[];
|
|
110
|
-
deletionCandidates: DeletionCandidate[];
|
|
111
|
-
summaries: {
|
|
112
|
-
byCategory: Record<Category, number>;
|
|
113
|
-
byRecommendedNextAction: Record<RecommendedNextAction, number>;
|
|
114
|
-
hardNoMigration: string[];
|
|
115
|
-
currentRemotes: string[];
|
|
116
|
-
futureRemoteCandidates: string[];
|
|
117
|
-
traceFirstCandidates: string[];
|
|
118
|
-
dynamicViewCandidates: string[];
|
|
119
|
-
voiceLocalModelCandidates: string[];
|
|
120
|
-
runtimeBrokerCandidates: string[];
|
|
121
|
-
ownerDecisionItems: string[];
|
|
122
|
-
};
|
|
123
|
-
};
|
|
124
|
-
|
|
125
|
-
const SCRIPT_DIR = path.dirname(new URL(import.meta.url).pathname);
|
|
126
|
-
const ELECTROBUN_ROOT = path.resolve(SCRIPT_DIR, "..");
|
|
127
|
-
const REPO_ROOT = path.resolve(ELECTROBUN_ROOT, "../../../..");
|
|
128
|
-
const DOCS_DIR = path.join(ELECTROBUN_ROOT, "docs");
|
|
129
|
-
|
|
130
|
-
const CATEGORY_ORDER: readonly Category[] = [
|
|
131
|
-
"core-runtime",
|
|
132
|
-
"desktop-shell",
|
|
133
|
-
"production-ui",
|
|
134
|
-
"app-plugin",
|
|
135
|
-
"connector-plugin",
|
|
136
|
-
"model-plugin",
|
|
137
|
-
"voice-plugin",
|
|
138
|
-
"native-semantic-plugin",
|
|
139
|
-
"desktop-capability",
|
|
140
|
-
"data-memory-plugin",
|
|
141
|
-
"dev-tooling",
|
|
142
|
-
"provider-plugin",
|
|
143
|
-
"obsolete-or-duplicate",
|
|
144
|
-
"unknown",
|
|
145
|
-
];
|
|
146
|
-
|
|
147
|
-
const ACTION_ORDER: readonly RecommendedNextAction[] = [
|
|
148
|
-
"leave-alone",
|
|
149
|
-
"add-trace-hooks",
|
|
150
|
-
"add-dynamic-view-manifest",
|
|
151
|
-
"route-through-runtime-broker",
|
|
152
|
-
"connect-to-voice-pipeline",
|
|
153
|
-
"connect-to-local-model",
|
|
154
|
-
"dedupe-with-existing-plugin",
|
|
155
|
-
"deprecate",
|
|
156
|
-
"delete-after-confirmation",
|
|
157
|
-
"needs-owner-decision",
|
|
158
|
-
];
|
|
159
|
-
|
|
160
|
-
const CONNECTOR_NAMES = new Set([
|
|
161
|
-
"plugin-bluebubbles",
|
|
162
|
-
"plugin-bluesky",
|
|
163
|
-
"plugin-calendly",
|
|
164
|
-
"plugin-discord",
|
|
165
|
-
"plugin-discord-local",
|
|
166
|
-
"plugin-farcaster",
|
|
167
|
-
"plugin-feishu",
|
|
168
|
-
"plugin-github",
|
|
169
|
-
"plugin-google",
|
|
170
|
-
"plugin-google-chat",
|
|
171
|
-
"plugin-google-meet-cute",
|
|
172
|
-
"plugin-imessage",
|
|
173
|
-
"plugin-instagram",
|
|
174
|
-
"plugin-line",
|
|
175
|
-
"plugin-linear",
|
|
176
|
-
"plugin-matrix",
|
|
177
|
-
"plugin-mcp",
|
|
178
|
-
"plugin-messages",
|
|
179
|
-
"plugin-ngrok",
|
|
180
|
-
"plugin-nostr",
|
|
181
|
-
"plugin-shopify",
|
|
182
|
-
"plugin-signal",
|
|
183
|
-
"plugin-slack",
|
|
184
|
-
"plugin-social-alpha",
|
|
185
|
-
"plugin-tailscale",
|
|
186
|
-
"plugin-telegram",
|
|
187
|
-
"plugin-tunnel",
|
|
188
|
-
"plugin-twitch",
|
|
189
|
-
"plugin-vincent",
|
|
190
|
-
"plugin-web-search",
|
|
191
|
-
"plugin-wechat",
|
|
192
|
-
"plugin-whatsapp",
|
|
193
|
-
"plugin-x",
|
|
194
|
-
"plugin-x402",
|
|
195
|
-
"plugin-xmtp",
|
|
196
|
-
]);
|
|
197
|
-
|
|
198
|
-
const PROVIDER_NAMES = new Set([
|
|
199
|
-
"plugin-anthropic",
|
|
200
|
-
"plugin-anthropic-proxy",
|
|
201
|
-
"plugin-google-genai",
|
|
202
|
-
"plugin-groq",
|
|
203
|
-
"plugin-openai",
|
|
204
|
-
"plugin-openrouter",
|
|
205
|
-
"plugin-xai",
|
|
206
|
-
"plugin-zai",
|
|
207
|
-
]);
|
|
208
|
-
|
|
209
|
-
const MODEL_NAMES = new Set([
|
|
210
|
-
"plugin-aosp-local-inference",
|
|
211
|
-
"plugin-local-inference",
|
|
212
|
-
"plugin-lmstudio",
|
|
213
|
-
"plugin-native-llama",
|
|
214
|
-
"plugin-ollama",
|
|
215
|
-
"plugin-rlm",
|
|
216
|
-
]);
|
|
217
|
-
|
|
218
|
-
const VOICE_NAMES = new Set([
|
|
219
|
-
"plugin-edge-tts",
|
|
220
|
-
"plugin-elevenlabs",
|
|
221
|
-
"plugin-native-talkmode",
|
|
222
|
-
]);
|
|
223
|
-
|
|
224
|
-
const DATA_NAMES = new Set([
|
|
225
|
-
"plugin-inmemorydb",
|
|
226
|
-
"plugin-local-storage",
|
|
227
|
-
"plugin-localdb",
|
|
228
|
-
"plugin-sql",
|
|
229
|
-
]);
|
|
230
|
-
|
|
231
|
-
const APP_PLUGIN_NAMES = new Set([
|
|
232
|
-
"app-model-tester",
|
|
233
|
-
"plugin-app-control",
|
|
234
|
-
"plugin-app-manager",
|
|
235
|
-
"plugin-browser",
|
|
236
|
-
"plugin-feed",
|
|
237
|
-
"plugin-clawville",
|
|
238
|
-
"plugin-companion",
|
|
239
|
-
"plugin-defense-of-the-agents",
|
|
240
|
-
"plugin-documents",
|
|
241
|
-
"plugin-eliza-classic",
|
|
242
|
-
"plugin-elizacloud",
|
|
243
|
-
"plugin-elizamaker",
|
|
244
|
-
"plugin-form",
|
|
245
|
-
"plugin-health",
|
|
246
|
-
"plugin-hyperliquid-app",
|
|
247
|
-
"plugin-personal-assistant",
|
|
248
|
-
"plugin-minecraft",
|
|
249
|
-
"plugin-music",
|
|
250
|
-
"plugin-mysticism",
|
|
251
|
-
"plugin-pdf",
|
|
252
|
-
"plugin-phone",
|
|
253
|
-
"plugin-polymarket-app",
|
|
254
|
-
"plugin-roblox",
|
|
255
|
-
"plugin-shopify-ui",
|
|
256
|
-
"plugin-steward-app",
|
|
257
|
-
"plugin-suno",
|
|
258
|
-
"plugin-task-coordinator",
|
|
259
|
-
"plugin-todos",
|
|
260
|
-
"plugin-training",
|
|
261
|
-
"plugin-video",
|
|
262
|
-
"plugin-vision",
|
|
263
|
-
"plugin-wallet",
|
|
264
|
-
"plugin-wallet-ui",
|
|
265
|
-
"plugin-workflow",
|
|
266
|
-
]);
|
|
267
|
-
|
|
268
|
-
const DEV_TOOL_NAMES = new Set([
|
|
269
|
-
"plugin-action-bench",
|
|
270
|
-
"plugin-agent-orchestrator",
|
|
271
|
-
"plugin-agent-skills",
|
|
272
|
-
"plugin-background-runner",
|
|
273
|
-
"plugin-benchmarks",
|
|
274
|
-
"plugin-cli",
|
|
275
|
-
"plugin-codex-cli",
|
|
276
|
-
"plugin-coding-tools",
|
|
277
|
-
"plugin-commands",
|
|
278
|
-
"plugin-registry",
|
|
279
|
-
"plugin-streaming",
|
|
280
|
-
"plugin-tee",
|
|
281
|
-
"plugin-trajectory-logger",
|
|
282
|
-
]);
|
|
283
|
-
|
|
284
|
-
const DYNAMIC_VIEW_NAMES = new Set([
|
|
285
|
-
"app-model-tester",
|
|
286
|
-
"plugin-agent-orchestrator",
|
|
287
|
-
"plugin-agent-skills",
|
|
288
|
-
"plugin-browser",
|
|
289
|
-
"plugin-coding-tools",
|
|
290
|
-
"plugin-computeruse",
|
|
291
|
-
"plugin-documents",
|
|
292
|
-
"plugin-github",
|
|
293
|
-
"plugin-native-canvas",
|
|
294
|
-
"plugin-native-screencapture",
|
|
295
|
-
"plugin-task-coordinator",
|
|
296
|
-
"plugin-training",
|
|
297
|
-
"plugin-workflow",
|
|
298
|
-
]);
|
|
299
|
-
|
|
300
|
-
const RUNTIME_BROKER_NAMES = new Set([
|
|
301
|
-
"plugin-browser",
|
|
302
|
-
"plugin-codex-cli",
|
|
303
|
-
"plugin-coding-tools",
|
|
304
|
-
"plugin-computeruse",
|
|
305
|
-
"plugin-device-filesystem",
|
|
306
|
-
"plugin-device-settings",
|
|
307
|
-
"plugin-native-activity-tracker",
|
|
308
|
-
"plugin-native-appblocker",
|
|
309
|
-
"plugin-native-bun-runtime",
|
|
310
|
-
"plugin-native-calendar",
|
|
311
|
-
"plugin-native-camera",
|
|
312
|
-
"plugin-native-canvas",
|
|
313
|
-
"plugin-native-contacts",
|
|
314
|
-
"plugin-native-desktop",
|
|
315
|
-
"plugin-native-location",
|
|
316
|
-
"plugin-native-macosalarm",
|
|
317
|
-
"plugin-native-messages",
|
|
318
|
-
"plugin-native-phone",
|
|
319
|
-
"plugin-native-screencapture",
|
|
320
|
-
"plugin-native-system",
|
|
321
|
-
"plugin-native-wifi",
|
|
322
|
-
"plugin-screenshare",
|
|
323
|
-
"plugin-shell",
|
|
324
|
-
"plugin-contacts",
|
|
325
|
-
"plugin-capacitor-bridge",
|
|
326
|
-
"plugin-wifi",
|
|
327
|
-
]);
|
|
328
|
-
|
|
329
|
-
const TRACE_FIRST_NAMES = new Set([
|
|
330
|
-
"plugin-agent-orchestrator",
|
|
331
|
-
"plugin-agent-skills",
|
|
332
|
-
"plugin-browser",
|
|
333
|
-
"plugin-coding-tools",
|
|
334
|
-
"plugin-computeruse",
|
|
335
|
-
"plugin-discord",
|
|
336
|
-
"plugin-documents",
|
|
337
|
-
"plugin-github",
|
|
338
|
-
"plugin-local-inference",
|
|
339
|
-
"plugin-native-screencapture",
|
|
340
|
-
"plugin-native-talkmode",
|
|
341
|
-
"plugin-task-coordinator",
|
|
342
|
-
"plugin-training",
|
|
343
|
-
"plugin-workflow",
|
|
344
|
-
]);
|
|
345
|
-
|
|
346
|
-
const REMOTE_IDS = new Map([
|
|
347
|
-
["runtime", "eliza.runtime"],
|
|
348
|
-
["fs", "eliza.fs"],
|
|
349
|
-
["pty", "eliza.pty"],
|
|
350
|
-
["git", "eliza.git"],
|
|
351
|
-
["local-model", "eliza.local-model"],
|
|
352
|
-
["surface", "eliza.surface"],
|
|
353
|
-
]);
|
|
354
|
-
|
|
355
|
-
const REMOTE_RELATED = new Map<string, RelatedRemote[]>([
|
|
356
|
-
["runtime", ["eliza.runtime"]],
|
|
357
|
-
["fs", ["eliza.fs"]],
|
|
358
|
-
["pty", ["eliza.pty"]],
|
|
359
|
-
["git", ["eliza.git"]],
|
|
360
|
-
["local-model", ["eliza.local-model"]],
|
|
361
|
-
["surface", ["eliza.runtime"]],
|
|
362
|
-
]);
|
|
363
|
-
|
|
364
|
-
const AUDIT_OUTPUT_PATHS = new Set([
|
|
365
|
-
"packages/app-core/platforms/electrobun/docs/convergence-audit.json",
|
|
366
|
-
"packages/app-core/platforms/electrobun/docs/convergence-audit.md",
|
|
367
|
-
"packages/app-core/platforms/electrobun/scripts/generate-convergence-audit.ts",
|
|
368
|
-
]);
|
|
369
|
-
|
|
370
|
-
const AUDIT_OUTPUT_PREFIXES = ["packages/app-core/platforms/electrobun/docs/"];
|
|
371
|
-
|
|
372
|
-
function relativePath(absolutePath: string): string {
|
|
373
|
-
return path.relative(REPO_ROOT, absolutePath);
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
function isJsonObject(value: JsonValue): value is JsonObject {
|
|
377
|
-
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
async function pathExists(targetPath: string): Promise<boolean> {
|
|
381
|
-
try {
|
|
382
|
-
await stat(path.join(REPO_ROOT, targetPath));
|
|
383
|
-
return true;
|
|
384
|
-
} catch {
|
|
385
|
-
return false;
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
async function readPackageJson(directory: string): Promise<PackageJson | null> {
|
|
390
|
-
const filePath = path.join(REPO_ROOT, directory, "package.json");
|
|
391
|
-
try {
|
|
392
|
-
const raw = await readFile(filePath, "utf8");
|
|
393
|
-
const parsed = JSON.parse(raw) as JsonValue;
|
|
394
|
-
if (!isJsonObject(parsed)) return null;
|
|
395
|
-
const name = parsed.name;
|
|
396
|
-
const description = parsed.description;
|
|
397
|
-
return {
|
|
398
|
-
name: typeof name === "string" ? name : undefined,
|
|
399
|
-
description: typeof description === "string" ? description : undefined,
|
|
400
|
-
};
|
|
401
|
-
} catch {
|
|
402
|
-
return null;
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
function git(args: string[]): string {
|
|
407
|
-
try {
|
|
408
|
-
return execFileSync("git", args, {
|
|
409
|
-
cwd: REPO_ROOT,
|
|
410
|
-
encoding: "utf8",
|
|
411
|
-
stdio: ["ignore", "pipe", "ignore"],
|
|
412
|
-
}).trim();
|
|
413
|
-
} catch {
|
|
414
|
-
return "unavailable";
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
function countBy<T extends string>(
|
|
419
|
-
values: readonly T[],
|
|
420
|
-
items: readonly T[],
|
|
421
|
-
): Record<T, number> {
|
|
422
|
-
const result = Object.fromEntries(
|
|
423
|
-
values.map((value) => [value, 0]),
|
|
424
|
-
) as Record<T, number>;
|
|
425
|
-
for (const item of items) result[item] += 1;
|
|
426
|
-
return result;
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
function packagePurpose(
|
|
430
|
-
packageJson: PackageJson | null,
|
|
431
|
-
fallback: string,
|
|
432
|
-
): string {
|
|
433
|
-
return packageJson?.description?.trim() || fallback;
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
function nativeRelatedRemote(id: string): RelatedRemote[] | undefined {
|
|
437
|
-
if (id.includes("filesystem")) return ["eliza.fs"];
|
|
438
|
-
if (id.includes("shell") || id.includes("terminal")) return ["eliza.pty"];
|
|
439
|
-
if (id.includes("coding-tools") || id.includes("codex")) {
|
|
440
|
-
return ["eliza.runtime", "eliza.fs", "eliza.pty", "eliza.git"];
|
|
441
|
-
}
|
|
442
|
-
if (id.includes("local-inference") || id.includes("llama")) {
|
|
443
|
-
return ["eliza.local-model"];
|
|
444
|
-
}
|
|
445
|
-
if (id.includes("computeruse") || id.includes("browser")) {
|
|
446
|
-
return ["eliza.runtime"];
|
|
447
|
-
}
|
|
448
|
-
if (id.includes("screen") || id.includes("camera")) {
|
|
449
|
-
return ["eliza.runtime"];
|
|
450
|
-
}
|
|
451
|
-
return undefined;
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
function classifyPlugin(id: string): {
|
|
455
|
-
category: Category;
|
|
456
|
-
keepAs: KeepAs;
|
|
457
|
-
action: RecommendedNextAction;
|
|
458
|
-
risk: Risk;
|
|
459
|
-
} {
|
|
460
|
-
if (VOICE_NAMES.has(id)) {
|
|
461
|
-
return {
|
|
462
|
-
category: "voice-plugin",
|
|
463
|
-
keepAs: "voice-pipeline-participant",
|
|
464
|
-
action: "connect-to-voice-pipeline",
|
|
465
|
-
risk: "medium",
|
|
466
|
-
};
|
|
467
|
-
}
|
|
468
|
-
if (MODEL_NAMES.has(id)) {
|
|
469
|
-
return {
|
|
470
|
-
category: "model-plugin",
|
|
471
|
-
keepAs: "model-pipeline-participant",
|
|
472
|
-
action: "connect-to-local-model",
|
|
473
|
-
risk: "medium",
|
|
474
|
-
};
|
|
475
|
-
}
|
|
476
|
-
if (CONNECTOR_NAMES.has(id)) {
|
|
477
|
-
return {
|
|
478
|
-
category: "connector-plugin",
|
|
479
|
-
keepAs: "connector",
|
|
480
|
-
action: "add-trace-hooks",
|
|
481
|
-
risk: "medium",
|
|
482
|
-
};
|
|
483
|
-
}
|
|
484
|
-
if (PROVIDER_NAMES.has(id)) {
|
|
485
|
-
return {
|
|
486
|
-
category: "provider-plugin",
|
|
487
|
-
keepAs: "plugin",
|
|
488
|
-
action: "leave-alone",
|
|
489
|
-
risk: "low",
|
|
490
|
-
};
|
|
491
|
-
}
|
|
492
|
-
if (
|
|
493
|
-
id.startsWith("plugin-native-") ||
|
|
494
|
-
id.startsWith("plugin-device-") ||
|
|
495
|
-
RUNTIME_BROKER_NAMES.has(id)
|
|
496
|
-
) {
|
|
497
|
-
return {
|
|
498
|
-
category: "native-semantic-plugin",
|
|
499
|
-
keepAs: "plugin",
|
|
500
|
-
action: RUNTIME_BROKER_NAMES.has(id)
|
|
501
|
-
? "route-through-runtime-broker"
|
|
502
|
-
: "add-trace-hooks",
|
|
503
|
-
risk: "medium",
|
|
504
|
-
};
|
|
505
|
-
}
|
|
506
|
-
if (DATA_NAMES.has(id)) {
|
|
507
|
-
return {
|
|
508
|
-
category: "data-memory-plugin",
|
|
509
|
-
keepAs: "plugin",
|
|
510
|
-
action: "leave-alone",
|
|
511
|
-
risk: "low",
|
|
512
|
-
};
|
|
513
|
-
}
|
|
514
|
-
if (APP_PLUGIN_NAMES.has(id) || id.endsWith("-app")) {
|
|
515
|
-
return {
|
|
516
|
-
category: "app-plugin",
|
|
517
|
-
keepAs: "app-plugin",
|
|
518
|
-
action: DYNAMIC_VIEW_NAMES.has(id)
|
|
519
|
-
? "add-dynamic-view-manifest"
|
|
520
|
-
: "add-trace-hooks",
|
|
521
|
-
risk: "medium",
|
|
522
|
-
};
|
|
523
|
-
}
|
|
524
|
-
if (DEV_TOOL_NAMES.has(id)) {
|
|
525
|
-
return {
|
|
526
|
-
category: "dev-tooling",
|
|
527
|
-
keepAs: "plugin",
|
|
528
|
-
action: TRACE_FIRST_NAMES.has(id) ? "add-trace-hooks" : "leave-alone",
|
|
529
|
-
risk: "medium",
|
|
530
|
-
};
|
|
531
|
-
}
|
|
532
|
-
if (id === "plugin-computeruse" || id === "plugin-screenshare") {
|
|
533
|
-
return {
|
|
534
|
-
category: "native-semantic-plugin",
|
|
535
|
-
keepAs: "plugin",
|
|
536
|
-
action: "route-through-runtime-broker",
|
|
537
|
-
risk: "medium",
|
|
538
|
-
};
|
|
539
|
-
}
|
|
540
|
-
return {
|
|
541
|
-
category: "unknown",
|
|
542
|
-
keepAs: "needs-review",
|
|
543
|
-
action: "needs-owner-decision",
|
|
544
|
-
risk: "medium",
|
|
545
|
-
};
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
function pluginNotes(id: string, category: Category): string {
|
|
549
|
-
if (CONNECTOR_NAMES.has(id)) {
|
|
550
|
-
return "Keep as a connector plugin. Add trace hooks for ingress, action execution, reply, rate limit, and failure events where useful.";
|
|
551
|
-
}
|
|
552
|
-
if (DYNAMIC_VIEW_NAMES.has(id)) {
|
|
553
|
-
return "Keep existing plugin boundary. Add contextual dynamic views only for task-specific inspection, not a fixed dashboard.";
|
|
554
|
-
}
|
|
555
|
-
if (VOICE_NAMES.has(id)) {
|
|
556
|
-
return "Keep as a runtime voice participant. Wire availability, ASR/TTS/turn events, and latency into eliza.voice and trace.";
|
|
557
|
-
}
|
|
558
|
-
if (MODEL_NAMES.has(id)) {
|
|
559
|
-
return "Keep as model/local-inference integration. Use eliza.local-model and voice validation as control and observability wrappers.";
|
|
560
|
-
}
|
|
561
|
-
if (category === "native-semantic-plugin") {
|
|
562
|
-
return "Keep as the agent-facing semantic plugin. Route host/system execution through Electrobun or an existing Remote when needed.";
|
|
563
|
-
}
|
|
564
|
-
if (category === "provider-plugin") {
|
|
565
|
-
return "Keep as a provider plugin. Do not move provider routing into Electrobun or a Remote.";
|
|
566
|
-
}
|
|
567
|
-
if (category === "data-memory-plugin") {
|
|
568
|
-
return "Keep as a data or memory plugin. Do not duplicate storage semantics in Electrobun.";
|
|
569
|
-
}
|
|
570
|
-
return "Needs owner review before any migration, deletion, or dynamic-view work.";
|
|
571
|
-
}
|
|
572
|
-
|
|
573
|
-
async function pluginEntry(directory: string): Promise<ConvergenceAuditEntry> {
|
|
574
|
-
const id = path.basename(directory);
|
|
575
|
-
const packageJson = await readPackageJson(directory);
|
|
576
|
-
const classification = classifyPlugin(id);
|
|
577
|
-
const shouldRegisterDynamicViews = DYNAMIC_VIEW_NAMES.has(id);
|
|
578
|
-
const shouldEmitTraceEvents =
|
|
579
|
-
TRACE_FIRST_NAMES.has(id) ||
|
|
580
|
-
CONNECTOR_NAMES.has(id) ||
|
|
581
|
-
classification.category === "native-semantic-plugin";
|
|
582
|
-
const shouldUseRuntimeBroker = RUNTIME_BROKER_NAMES.has(id);
|
|
583
|
-
const relatedRemotes = nativeRelatedRemote(id);
|
|
584
|
-
const relatedLayers: RelatedLayer[] = [];
|
|
585
|
-
if (shouldRegisterDynamicViews) relatedLayers.push("dynamic-views");
|
|
586
|
-
if (shouldEmitTraceEvents) relatedLayers.push("trace");
|
|
587
|
-
if (VOICE_NAMES.has(id)) relatedLayers.push("voice");
|
|
588
|
-
if (MODEL_NAMES.has(id)) relatedLayers.push("local-inference");
|
|
589
|
-
return {
|
|
590
|
-
id,
|
|
591
|
-
path: directory,
|
|
592
|
-
category: classification.category,
|
|
593
|
-
currentPurpose: packagePurpose(packageJson, `Plugin package ${id}.`),
|
|
594
|
-
keepAs: classification.keepAs,
|
|
595
|
-
shouldBecomeRemote: false,
|
|
596
|
-
shouldRegisterDynamicViews,
|
|
597
|
-
shouldEmitTraceEvents,
|
|
598
|
-
shouldUseRuntimeBroker,
|
|
599
|
-
shouldStayOutOfElectrobun:
|
|
600
|
-
classification.category === "connector-plugin" ||
|
|
601
|
-
classification.category === "provider-plugin" ||
|
|
602
|
-
classification.category === "app-plugin",
|
|
603
|
-
relatedRemotes,
|
|
604
|
-
relatedLayers: relatedLayers.length > 0 ? relatedLayers : undefined,
|
|
605
|
-
recommendedNextAction: shouldRegisterDynamicViews
|
|
606
|
-
? "add-dynamic-view-manifest"
|
|
607
|
-
: classification.action,
|
|
608
|
-
risk: classification.risk,
|
|
609
|
-
ownerDecisionNeeded: classification.category === "unknown" || undefined,
|
|
610
|
-
notes: pluginNotes(id, classification.category),
|
|
611
|
-
};
|
|
612
|
-
}
|
|
613
|
-
|
|
614
|
-
async function directDirectories(parent: string): Promise<string[]> {
|
|
615
|
-
const absoluteParent = path.join(REPO_ROOT, parent);
|
|
616
|
-
const entries = await readdir(absoluteParent, { withFileTypes: true });
|
|
617
|
-
return entries
|
|
618
|
-
.filter((entry) => entry.isDirectory())
|
|
619
|
-
.map((entry) => path.join(parent, entry.name))
|
|
620
|
-
.sort();
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
async function packageEntry(params: {
|
|
624
|
-
id: string;
|
|
625
|
-
path: string;
|
|
626
|
-
category: Category;
|
|
627
|
-
keepAs: KeepAs;
|
|
628
|
-
action: RecommendedNextAction;
|
|
629
|
-
notes: string;
|
|
630
|
-
currentPurpose: string;
|
|
631
|
-
risk?: Risk;
|
|
632
|
-
shouldRegisterDynamicViews?: boolean;
|
|
633
|
-
shouldEmitTraceEvents?: boolean;
|
|
634
|
-
shouldUseRuntimeBroker?: boolean;
|
|
635
|
-
shouldStayOutOfElectrobun?: boolean;
|
|
636
|
-
relatedRemotes?: RelatedRemote[];
|
|
637
|
-
relatedLayers?: RelatedLayer[];
|
|
638
|
-
shouldBecomeRemote?: boolean;
|
|
639
|
-
ownerDecisionNeeded?: boolean;
|
|
640
|
-
}): Promise<ConvergenceAuditEntry> {
|
|
641
|
-
const packageJson = await readPackageJson(params.path);
|
|
642
|
-
return {
|
|
643
|
-
id: params.id,
|
|
644
|
-
path: params.path,
|
|
645
|
-
category: params.category,
|
|
646
|
-
currentPurpose: packagePurpose(packageJson, params.currentPurpose),
|
|
647
|
-
keepAs: params.keepAs,
|
|
648
|
-
shouldBecomeRemote: params.shouldBecomeRemote ?? false,
|
|
649
|
-
shouldRegisterDynamicViews: params.shouldRegisterDynamicViews ?? false,
|
|
650
|
-
shouldEmitTraceEvents: params.shouldEmitTraceEvents ?? false,
|
|
651
|
-
shouldUseRuntimeBroker: params.shouldUseRuntimeBroker ?? false,
|
|
652
|
-
shouldStayOutOfElectrobun: params.shouldStayOutOfElectrobun ?? false,
|
|
653
|
-
relatedRemotes: params.relatedRemotes,
|
|
654
|
-
relatedLayers: params.relatedLayers,
|
|
655
|
-
recommendedNextAction: params.action,
|
|
656
|
-
risk: params.risk ?? "low",
|
|
657
|
-
ownerDecisionNeeded: params.ownerDecisionNeeded,
|
|
658
|
-
notes: params.notes,
|
|
659
|
-
};
|
|
660
|
-
}
|
|
661
|
-
|
|
662
|
-
async function remoteEntries(): Promise<ConvergenceAuditEntry[]> {
|
|
663
|
-
const directories = await directDirectories(
|
|
664
|
-
"packages/app-core/platforms/electrobun/remotes",
|
|
665
|
-
);
|
|
666
|
-
return Promise.all(
|
|
667
|
-
directories.map(async (directory) => {
|
|
668
|
-
const basename = path.basename(directory);
|
|
669
|
-
const id = REMOTE_IDS.get(basename) ?? `eliza.${basename}`;
|
|
670
|
-
const packageJson = await readPackageJson(directory);
|
|
671
|
-
return {
|
|
672
|
-
id,
|
|
673
|
-
path: directory,
|
|
674
|
-
category: basename === "surface" ? "dev-tooling" : "desktop-capability",
|
|
675
|
-
currentPurpose: packagePurpose(
|
|
676
|
-
packageJson,
|
|
677
|
-
`${id} first-party Electrobun Remote.`,
|
|
678
|
-
),
|
|
679
|
-
keepAs: "remote",
|
|
680
|
-
shouldBecomeRemote: false,
|
|
681
|
-
shouldRegisterDynamicViews: basename === "surface",
|
|
682
|
-
shouldEmitTraceEvents: basename !== "surface",
|
|
683
|
-
shouldUseRuntimeBroker: basename !== "surface",
|
|
684
|
-
shouldStayOutOfElectrobun: false,
|
|
685
|
-
relatedRemotes: REMOTE_RELATED.get(basename),
|
|
686
|
-
relatedLayers:
|
|
687
|
-
basename === "surface"
|
|
688
|
-
? ["dynamic-views", "trace"]
|
|
689
|
-
: ["electrobun-shell", "agent-runtime"],
|
|
690
|
-
recommendedNextAction: "leave-alone",
|
|
691
|
-
risk: basename === "surface" ? "medium" : "low",
|
|
692
|
-
notes:
|
|
693
|
-
basename === "surface"
|
|
694
|
-
? "Dev/admin only. Do not turn into production UI."
|
|
695
|
-
: "Already a desktop/system capability provider. Keep scoped and brokered through host APIs.",
|
|
696
|
-
};
|
|
697
|
-
}),
|
|
698
|
-
);
|
|
699
|
-
}
|
|
700
|
-
|
|
701
|
-
async function deletionCandidates(): Promise<DeletionCandidate[]> {
|
|
702
|
-
const candidates: DeletionCandidate[] = [];
|
|
703
|
-
const generatedPaths = [
|
|
704
|
-
"packages/app-core/platforms/electrobun/build",
|
|
705
|
-
"packages/app-core/platforms/electrobun/native/.build",
|
|
706
|
-
"dist",
|
|
707
|
-
];
|
|
708
|
-
for (const candidatePath of generatedPaths) {
|
|
709
|
-
if (await pathExists(candidatePath)) {
|
|
710
|
-
candidates.push({
|
|
711
|
-
path: candidatePath,
|
|
712
|
-
reason:
|
|
713
|
-
"Generated local build output. It should not be part of architecture or PR review scope.",
|
|
714
|
-
confidence: "medium",
|
|
715
|
-
safeToDeleteNow: false,
|
|
716
|
-
requiresOwnerDecision: false,
|
|
717
|
-
validationNeeded: [
|
|
718
|
-
"confirm ignored/untracked status",
|
|
719
|
-
"rerun build if removed",
|
|
720
|
-
],
|
|
721
|
-
});
|
|
722
|
-
}
|
|
723
|
-
}
|
|
724
|
-
const pluginDirectories = await directDirectories("plugins");
|
|
725
|
-
for (const directory of pluginDirectories) {
|
|
726
|
-
if (
|
|
727
|
-
(path.basename(directory).startsWith("plugin-") ||
|
|
728
|
-
path.basename(directory).startsWith("app-")) &&
|
|
729
|
-
!(await pathExists(path.join(directory, "package.json")))
|
|
730
|
-
) {
|
|
731
|
-
candidates.push({
|
|
732
|
-
path: directory,
|
|
733
|
-
reason:
|
|
734
|
-
"Plugin-shaped directory without package.json. Needs owner review before deletion or restoration.",
|
|
735
|
-
confidence: "low",
|
|
736
|
-
safeToDeleteNow: false,
|
|
737
|
-
requiresOwnerDecision: true,
|
|
738
|
-
validationNeeded: [
|
|
739
|
-
"search imports",
|
|
740
|
-
"check package registry references",
|
|
741
|
-
],
|
|
742
|
-
});
|
|
743
|
-
}
|
|
744
|
-
}
|
|
745
|
-
return candidates;
|
|
746
|
-
}
|
|
747
|
-
|
|
748
|
-
async function buildEntries(): Promise<ConvergenceAuditEntry[]> {
|
|
749
|
-
const manualEntries = await Promise.all([
|
|
750
|
-
packageEntry({
|
|
751
|
-
id: "repo-root",
|
|
752
|
-
path: ".",
|
|
753
|
-
category: "core-runtime",
|
|
754
|
-
keepAs: "core",
|
|
755
|
-
action: "leave-alone",
|
|
756
|
-
currentPurpose: "Workspace root and monorepo coordination.",
|
|
757
|
-
notes:
|
|
758
|
-
"Keep as workspace root. Do not use Electrobun convergence to change global repo ownership.",
|
|
759
|
-
relatedLayers: ["agent-runtime"],
|
|
760
|
-
}),
|
|
761
|
-
packageEntry({
|
|
762
|
-
id: "packages/core",
|
|
763
|
-
path: "packages/core",
|
|
764
|
-
category: "core-runtime",
|
|
765
|
-
keepAs: "core",
|
|
766
|
-
action: "leave-alone",
|
|
767
|
-
currentPurpose: "Core Eliza agent runtime package.",
|
|
768
|
-
notes: "Hard no-migration item. Runtime semantics stay here.",
|
|
769
|
-
shouldStayOutOfElectrobun: true,
|
|
770
|
-
relatedLayers: ["agent-runtime"],
|
|
771
|
-
}),
|
|
772
|
-
packageEntry({
|
|
773
|
-
id: "packages/agent",
|
|
774
|
-
path: "packages/agent",
|
|
775
|
-
category: "core-runtime",
|
|
776
|
-
keepAs: "core",
|
|
777
|
-
action: "leave-alone",
|
|
778
|
-
currentPurpose: "Agent runtime/server package.",
|
|
779
|
-
notes:
|
|
780
|
-
"AgentManager/Electrobun may own lifecycle, but agent runtime code stays in runtime packages.",
|
|
781
|
-
shouldStayOutOfElectrobun: true,
|
|
782
|
-
relatedLayers: ["agent-runtime"],
|
|
783
|
-
}),
|
|
784
|
-
packageEntry({
|
|
785
|
-
id: "packages/app",
|
|
786
|
-
path: "packages/app",
|
|
787
|
-
category: "production-ui",
|
|
788
|
-
keepAs: "core",
|
|
789
|
-
action: "leave-alone",
|
|
790
|
-
currentPurpose: "Cross-platform production app UI.",
|
|
791
|
-
notes:
|
|
792
|
-
"Hard no-migration item. Do not replace with eliza.surface or fixed dynamic-view panels.",
|
|
793
|
-
shouldStayOutOfElectrobun: true,
|
|
794
|
-
relatedLayers: ["production-app"],
|
|
795
|
-
}),
|
|
796
|
-
packageEntry({
|
|
797
|
-
id: "packages/app-core",
|
|
798
|
-
path: "packages/app-core",
|
|
799
|
-
category: "core-runtime",
|
|
800
|
-
keepAs: "core",
|
|
801
|
-
action: "leave-alone",
|
|
802
|
-
currentPurpose: "Shared app shell/core package.",
|
|
803
|
-
notes:
|
|
804
|
-
"Hard no-migration item. Electrobun platform code can add host docs, not absorb app-core ownership.",
|
|
805
|
-
relatedLayers: ["production-app", "electrobun-shell"],
|
|
806
|
-
}),
|
|
807
|
-
packageEntry({
|
|
808
|
-
id: "packages/app-core/platforms/electrobun",
|
|
809
|
-
path: "packages/app-core/platforms/electrobun",
|
|
810
|
-
category: "desktop-shell",
|
|
811
|
-
keepAs: "core",
|
|
812
|
-
action: "leave-alone",
|
|
813
|
-
currentPurpose: "Electrobun native desktop shell.",
|
|
814
|
-
notes:
|
|
815
|
-
"Electrobun is the shell, not the agent runtime. Keep AgentManager as runtime lifecycle owner.",
|
|
816
|
-
relatedLayers: ["electrobun-shell", "dynamic-views", "trace"],
|
|
817
|
-
}),
|
|
818
|
-
packageEntry({
|
|
819
|
-
id: "packages/electrobun-remote-plugins",
|
|
820
|
-
path: "packages/electrobun-remote-plugins",
|
|
821
|
-
category: "desktop-shell",
|
|
822
|
-
keepAs: "core",
|
|
823
|
-
action: "leave-alone",
|
|
824
|
-
currentPurpose: "Electrobun module/Remote package substrate.",
|
|
825
|
-
notes:
|
|
826
|
-
"Keep as module runtime substrate. Do not turn into a second plugin system.",
|
|
827
|
-
relatedLayers: ["electrobun-shell"],
|
|
828
|
-
}),
|
|
829
|
-
packageEntry({
|
|
830
|
-
id: "packages/shared/src/local-inference",
|
|
831
|
-
path: "packages/shared/src/local-inference",
|
|
832
|
-
category: "model-plugin",
|
|
833
|
-
keepAs: "model-pipeline-participant",
|
|
834
|
-
action: "connect-to-local-model",
|
|
835
|
-
currentPurpose:
|
|
836
|
-
"Shared local-inference model catalog, routing, paths, and voice metadata.",
|
|
837
|
-
notes:
|
|
838
|
-
"Source of truth for Eliza-1 and voice metadata. Do not duplicate in Electrobun.",
|
|
839
|
-
shouldEmitTraceEvents: true,
|
|
840
|
-
shouldStayOutOfElectrobun: true,
|
|
841
|
-
relatedRemotes: ["eliza.local-model"],
|
|
842
|
-
relatedLayers: ["local-inference", "voice"],
|
|
843
|
-
risk: "medium",
|
|
844
|
-
}),
|
|
845
|
-
packageEntry({
|
|
846
|
-
id: "packages/app-core/platforms/electrobun/src/dynamic-views",
|
|
847
|
-
path: "packages/app-core/platforms/electrobun/src/dynamic-views",
|
|
848
|
-
category: "desktop-shell",
|
|
849
|
-
keepAs: "core",
|
|
850
|
-
action: "leave-alone",
|
|
851
|
-
currentPurpose: "Dynamic view registry/session infrastructure.",
|
|
852
|
-
notes:
|
|
853
|
-
"Contextual view substrate only. Do not convert into dashboard navigation.",
|
|
854
|
-
shouldRegisterDynamicViews: true,
|
|
855
|
-
relatedLayers: ["dynamic-views", "electrobun-shell"],
|
|
856
|
-
}),
|
|
857
|
-
packageEntry({
|
|
858
|
-
id: "packages/app-core/platforms/electrobun/src/trace",
|
|
859
|
-
path: "packages/app-core/platforms/electrobun/src/trace",
|
|
860
|
-
category: "desktop-shell",
|
|
861
|
-
keepAs: "core",
|
|
862
|
-
action: "leave-alone",
|
|
863
|
-
currentPurpose: "Trace service and dynamic trace view infrastructure.",
|
|
864
|
-
notes:
|
|
865
|
-
"Observability spine. Plugins should emit trace events; trace should not become a static dashboard.",
|
|
866
|
-
shouldRegisterDynamicViews: true,
|
|
867
|
-
shouldEmitTraceEvents: true,
|
|
868
|
-
relatedLayers: ["trace", "dynamic-views"],
|
|
869
|
-
}),
|
|
870
|
-
packageEntry({
|
|
871
|
-
id: "packages/app-core/platforms/electrobun/src/voice",
|
|
872
|
-
path: "packages/app-core/platforms/electrobun/src/voice",
|
|
873
|
-
category: "desktop-shell",
|
|
874
|
-
keepAs: "core",
|
|
875
|
-
action: "leave-alone",
|
|
876
|
-
currentPurpose:
|
|
877
|
-
"Voice pipeline instrumentation, adapter, and validation layer.",
|
|
878
|
-
notes:
|
|
879
|
-
"Voice is a pipeline. Keep live behavior gated and report through trace.",
|
|
880
|
-
shouldRegisterDynamicViews: true,
|
|
881
|
-
shouldEmitTraceEvents: true,
|
|
882
|
-
relatedLayers: ["voice", "trace", "dynamic-views", "local-inference"],
|
|
883
|
-
}),
|
|
884
|
-
packageEntry({
|
|
885
|
-
id: "future.eliza.computer",
|
|
886
|
-
path: "packages/app-core/platforms/electrobun/remotes/computer",
|
|
887
|
-
category: "desktop-capability",
|
|
888
|
-
keepAs: "needs-review",
|
|
889
|
-
action: "needs-owner-decision",
|
|
890
|
-
currentPurpose:
|
|
891
|
-
"Potential future broker for screen/browser/camera/computer context if existing host APIs need a Remote boundary.",
|
|
892
|
-
notes:
|
|
893
|
-
"Only future Remote candidate. Do not create until a concrete host capability boundary is required.",
|
|
894
|
-
shouldBecomeRemote: true,
|
|
895
|
-
shouldEmitTraceEvents: true,
|
|
896
|
-
shouldUseRuntimeBroker: true,
|
|
897
|
-
relatedLayers: ["electrobun-shell", "trace", "dynamic-views"],
|
|
898
|
-
risk: "medium",
|
|
899
|
-
ownerDecisionNeeded: true,
|
|
900
|
-
}),
|
|
901
|
-
]);
|
|
902
|
-
|
|
903
|
-
const pluginDirectories = (await directDirectories("plugins")).filter(
|
|
904
|
-
(directory) =>
|
|
905
|
-
path.basename(directory).startsWith("plugin-") ||
|
|
906
|
-
path.basename(directory).startsWith("app-"),
|
|
907
|
-
);
|
|
908
|
-
const pluginEntries = await Promise.all(pluginDirectories.map(pluginEntry));
|
|
909
|
-
return [...manualEntries, ...(await remoteEntries()), ...pluginEntries].sort(
|
|
910
|
-
(left, right) => left.id.localeCompare(right.id),
|
|
911
|
-
);
|
|
912
|
-
}
|
|
913
|
-
|
|
914
|
-
function list(
|
|
915
|
-
entries: readonly ConvergenceAuditEntry[],
|
|
916
|
-
predicate: (entry: ConvergenceAuditEntry) => boolean,
|
|
917
|
-
): string[] {
|
|
918
|
-
return entries
|
|
919
|
-
.filter(predicate)
|
|
920
|
-
.map((entry) => entry.id)
|
|
921
|
-
.sort();
|
|
922
|
-
}
|
|
923
|
-
|
|
924
|
-
function buildSummaries(
|
|
925
|
-
entries: ConvergenceAuditEntry[],
|
|
926
|
-
): AuditDocument["summaries"] {
|
|
927
|
-
return {
|
|
928
|
-
byCategory: countBy(
|
|
929
|
-
CATEGORY_ORDER,
|
|
930
|
-
entries.map((entry) => entry.category),
|
|
931
|
-
),
|
|
932
|
-
byRecommendedNextAction: countBy(
|
|
933
|
-
ACTION_ORDER,
|
|
934
|
-
entries.map((entry) => entry.recommendedNextAction),
|
|
935
|
-
),
|
|
936
|
-
hardNoMigration: [
|
|
937
|
-
"packages/app",
|
|
938
|
-
"packages/core",
|
|
939
|
-
"packages/agent",
|
|
940
|
-
"packages/app-core",
|
|
941
|
-
"packages/app-core/platforms/electrobun core shell",
|
|
942
|
-
"packages/electrobun-remote-plugins",
|
|
943
|
-
"connector plugins",
|
|
944
|
-
"provider plugins",
|
|
945
|
-
"app plugins",
|
|
946
|
-
"core runtime plugins",
|
|
947
|
-
],
|
|
948
|
-
currentRemotes: list(entries, (entry) => entry.keepAs === "remote"),
|
|
949
|
-
futureRemoteCandidates: list(entries, (entry) => entry.shouldBecomeRemote),
|
|
950
|
-
traceFirstCandidates: list(
|
|
951
|
-
entries,
|
|
952
|
-
(entry) => entry.shouldEmitTraceEvents && entry.keepAs !== "remote",
|
|
953
|
-
),
|
|
954
|
-
dynamicViewCandidates: list(
|
|
955
|
-
entries,
|
|
956
|
-
(entry) => entry.shouldRegisterDynamicViews,
|
|
957
|
-
),
|
|
958
|
-
voiceLocalModelCandidates: list(
|
|
959
|
-
entries,
|
|
960
|
-
(entry) =>
|
|
961
|
-
entry.relatedLayers?.includes("voice") === true ||
|
|
962
|
-
entry.relatedLayers?.includes("local-inference") === true,
|
|
963
|
-
),
|
|
964
|
-
runtimeBrokerCandidates: list(
|
|
965
|
-
entries,
|
|
966
|
-
(entry) => entry.shouldUseRuntimeBroker,
|
|
967
|
-
),
|
|
968
|
-
ownerDecisionItems: list(
|
|
969
|
-
entries,
|
|
970
|
-
(entry) =>
|
|
971
|
-
entry.ownerDecisionNeeded === true ||
|
|
972
|
-
entry.recommendedNextAction === "needs-owner-decision",
|
|
973
|
-
),
|
|
974
|
-
};
|
|
975
|
-
}
|
|
976
|
-
|
|
977
|
-
function markdownList(items: readonly string[]): string {
|
|
978
|
-
if (items.length === 0) return "- None";
|
|
979
|
-
return items.map((item) => `- ${item}`).join("\n");
|
|
980
|
-
}
|
|
981
|
-
|
|
982
|
-
function summaryTable(counts: Record<string, number>): string {
|
|
983
|
-
return Object.entries(counts)
|
|
984
|
-
.filter(([, count]) => count > 0)
|
|
985
|
-
.map(([key, count]) => `| ${key} | ${count} |`)
|
|
986
|
-
.join("\n");
|
|
987
|
-
}
|
|
988
|
-
|
|
989
|
-
function entriesTable(entries: readonly ConvergenceAuditEntry[]): string {
|
|
990
|
-
const rows = entries.map((entry) =>
|
|
991
|
-
[
|
|
992
|
-
entry.id,
|
|
993
|
-
entry.category,
|
|
994
|
-
entry.keepAs,
|
|
995
|
-
entry.recommendedNextAction,
|
|
996
|
-
entry.shouldRegisterDynamicViews ? "yes" : "no",
|
|
997
|
-
entry.shouldEmitTraceEvents ? "yes" : "no",
|
|
998
|
-
entry.shouldUseRuntimeBroker ? "yes" : "no",
|
|
999
|
-
entry.risk,
|
|
1000
|
-
entry.notes.replace(/\|/g, "\\|"),
|
|
1001
|
-
].join(" | "),
|
|
1002
|
-
);
|
|
1003
|
-
return [
|
|
1004
|
-
"| ID | Category | Keep As | Next Action | Dynamic View | Trace | Broker | Risk | Notes |",
|
|
1005
|
-
"| --- | --- | --- | --- | --- | --- | --- | --- | --- |",
|
|
1006
|
-
...rows.map((row) => `| ${row} |`),
|
|
1007
|
-
].join("\n");
|
|
1008
|
-
}
|
|
1009
|
-
|
|
1010
|
-
function deletionTable(candidates: readonly DeletionCandidate[]): string {
|
|
1011
|
-
if (candidates.length === 0) return "No deletion candidates were found.";
|
|
1012
|
-
return [
|
|
1013
|
-
"| Path | Reason | Confidence | Safe Now | Owner Decision | Validation |",
|
|
1014
|
-
"| --- | --- | --- | --- | --- | --- |",
|
|
1015
|
-
...candidates.map((candidate) =>
|
|
1016
|
-
[
|
|
1017
|
-
candidate.path,
|
|
1018
|
-
candidate.reason,
|
|
1019
|
-
candidate.confidence,
|
|
1020
|
-
candidate.safeToDeleteNow ? "yes" : "no",
|
|
1021
|
-
candidate.requiresOwnerDecision ? "yes" : "no",
|
|
1022
|
-
candidate.validationNeeded.join(", "),
|
|
1023
|
-
].join(" | "),
|
|
1024
|
-
),
|
|
1025
|
-
]
|
|
1026
|
-
.map((line) => line.replace(/\| undefined/g, "|"))
|
|
1027
|
-
.join("\n");
|
|
1028
|
-
}
|
|
1029
|
-
|
|
1030
|
-
function buildMarkdown(document: AuditDocument): string {
|
|
1031
|
-
const s = document.summaries;
|
|
1032
|
-
return `# Convergence, Annotation, and Deletion Audit
|
|
1033
|
-
|
|
1034
|
-
Generated: ${document.generatedAt}
|
|
1035
|
-
|
|
1036
|
-
Branch: ${document.branch}
|
|
1037
|
-
|
|
1038
|
-
Ahead/behind origin/develop: ${document.aheadBehind}
|
|
1039
|
-
|
|
1040
|
-
Dirty status at generation:
|
|
1041
|
-
|
|
1042
|
-
${markdownList(document.dirtyStatus.length > 0 ? document.dirtyStatus : ["clean"])}
|
|
1043
|
-
|
|
1044
|
-
## Executive Summary
|
|
1045
|
-
|
|
1046
|
-
This audit stops the infrastructure-building spiral. Plugins stay plugins, app plugins stay app/product bundles, connectors stay connector plugins, Electrobun remains the desktop shell, AgentManager remains the runtime owner, and Remotes remain limited to desktop/system capability providers.
|
|
1047
|
-
|
|
1048
|
-
The current local branch may still contain multiple phases, but it should not be pushed blindly as a broad mega-PR unless maintainers explicitly want that review shape. The stack recommendation below keeps the work reviewable without changing the architectural boundary decisions.
|
|
1049
|
-
|
|
1050
|
-
No Swift host/controller path is part of this architecture. The only retained boundary pattern is typed RPC/local API/SSE between layers.
|
|
1051
|
-
|
|
1052
|
-
## Summary Counts
|
|
1053
|
-
|
|
1054
|
-
### By Category
|
|
1055
|
-
|
|
1056
|
-
| Category | Count |
|
|
1057
|
-
| --- | --- |
|
|
1058
|
-
${summaryTable(s.byCategory)}
|
|
1059
|
-
|
|
1060
|
-
### By Recommended Next Action
|
|
1061
|
-
|
|
1062
|
-
| Action | Count |
|
|
1063
|
-
| --- | --- |
|
|
1064
|
-
${summaryTable(s.byRecommendedNextAction)}
|
|
1065
|
-
|
|
1066
|
-
## Hard No-Migration List
|
|
1067
|
-
|
|
1068
|
-
${markdownList(s.hardNoMigration)}
|
|
1069
|
-
|
|
1070
|
-
## Current Remotes
|
|
1071
|
-
|
|
1072
|
-
${markdownList(s.currentRemotes)}
|
|
1073
|
-
|
|
1074
|
-
eliza.surface remains dev/admin only and is not a production UI replacement.
|
|
1075
|
-
|
|
1076
|
-
## Future Remote Candidates
|
|
1077
|
-
|
|
1078
|
-
${markdownList(s.futureRemoteCandidates)}
|
|
1079
|
-
|
|
1080
|
-
This list is intentionally short. Do not turn connector, provider, or app plugins into Remotes.
|
|
1081
|
-
|
|
1082
|
-
## Trace-First Candidates
|
|
1083
|
-
|
|
1084
|
-
${markdownList(s.traceFirstCandidates)}
|
|
1085
|
-
|
|
1086
|
-
## Dynamic-View Candidates
|
|
1087
|
-
|
|
1088
|
-
${markdownList(s.dynamicViewCandidates)}
|
|
1089
|
-
|
|
1090
|
-
## Voice/Local-Model Candidates
|
|
1091
|
-
|
|
1092
|
-
${markdownList(s.voiceLocalModelCandidates)}
|
|
1093
|
-
|
|
1094
|
-
## Runtime-Broker Candidates
|
|
1095
|
-
|
|
1096
|
-
${markdownList(s.runtimeBrokerCandidates)}
|
|
1097
|
-
|
|
1098
|
-
## Delete/Deprecate Candidates
|
|
1099
|
-
|
|
1100
|
-
${deletionTable(document.deletionCandidates)}
|
|
1101
|
-
|
|
1102
|
-
## Owner-Decision Items
|
|
1103
|
-
|
|
1104
|
-
${markdownList(s.ownerDecisionItems)}
|
|
1105
|
-
|
|
1106
|
-
## Proposed Annotation Plan
|
|
1107
|
-
|
|
1108
|
-
- Add README-level role annotations to trace-first candidates before wiring behavior.
|
|
1109
|
-
- Use \`docs/trace-first-annotations.md\` as the first review-boundary map for top trace-first packages.
|
|
1110
|
-
- Add dynamic-view manifests only for contextual inspection surfaces, not fixed dashboards.
|
|
1111
|
-
- Keep connector/provider package metadata unchanged unless maintainers already have a metadata convention.
|
|
1112
|
-
- Keep Remote manifests focused on capability boundaries and trusted/full-permission status.
|
|
1113
|
-
- Do not add source comments unless a hidden constraint or security boundary would otherwise be unclear.
|
|
1114
|
-
|
|
1115
|
-
## PR Stack Recommendation
|
|
1116
|
-
|
|
1117
|
-
Do not blindly push every local phase into the platform convergence PR unless maintainers explicitly ask for a mega-PR. Recommended stack:
|
|
1118
|
-
|
|
1119
|
-
1. Platform convergence PR
|
|
1120
|
-
- first-party Remotes
|
|
1121
|
-
- AgentManager-backed eliza.runtime
|
|
1122
|
-
- worker invoke/event bridge
|
|
1123
|
-
- dynamic view registry/session infrastructure
|
|
1124
|
-
|
|
1125
|
-
2. Trace PR
|
|
1126
|
-
- TraceStore and TraceService
|
|
1127
|
-
- dynamic agent.run.trace view
|
|
1128
|
-
- runtime and capability trace hooks
|
|
1129
|
-
|
|
1130
|
-
3. Voice instrumentation PR
|
|
1131
|
-
- VoiceService
|
|
1132
|
-
- mock/text pipeline
|
|
1133
|
-
- voice trace integration
|
|
1134
|
-
|
|
1135
|
-
4. Live voice adapter PR
|
|
1136
|
-
- VoiceRuntimeAdapter
|
|
1137
|
-
- live flags
|
|
1138
|
-
- ASR/TTS runtime route wiring
|
|
1139
|
-
|
|
1140
|
-
5. Voice latency PR
|
|
1141
|
-
- latency budgets
|
|
1142
|
-
- stream coordinator
|
|
1143
|
-
- TTS chunker
|
|
1144
|
-
- barge-in semantics
|
|
1145
|
-
|
|
1146
|
-
6. Voice validation PR
|
|
1147
|
-
- voice:validate scripts
|
|
1148
|
-
- structured validation reports
|
|
1149
|
-
|
|
1150
|
-
7. Convergence audit PR
|
|
1151
|
-
- this matrix and generator
|
|
1152
|
-
- no migration or production code changes
|
|
1153
|
-
|
|
1154
|
-
## Full Matrix
|
|
1155
|
-
|
|
1156
|
-
${entriesTable(document.entries)}
|
|
1157
|
-
`;
|
|
1158
|
-
}
|
|
1159
|
-
|
|
1160
|
-
async function main(): Promise<void> {
|
|
1161
|
-
await mkdir(DOCS_DIR, { recursive: true });
|
|
1162
|
-
const entries = await buildEntries();
|
|
1163
|
-
const document: AuditDocument = {
|
|
1164
|
-
generatedAt: new Date().toISOString(),
|
|
1165
|
-
branch: git(["branch", "--show-current"]),
|
|
1166
|
-
aheadBehind: git([
|
|
1167
|
-
"rev-list",
|
|
1168
|
-
"--left-right",
|
|
1169
|
-
"--count",
|
|
1170
|
-
"HEAD...origin/develop",
|
|
1171
|
-
]),
|
|
1172
|
-
dirtyStatus: git(["status", "--short"])
|
|
1173
|
-
.split("\n")
|
|
1174
|
-
.map((line) => line.trim())
|
|
1175
|
-
.filter((line) => {
|
|
1176
|
-
const filePath = line.slice(3);
|
|
1177
|
-
return (
|
|
1178
|
-
!AUDIT_OUTPUT_PATHS.has(filePath) &&
|
|
1179
|
-
!AUDIT_OUTPUT_PREFIXES.some((prefix) => filePath.startsWith(prefix))
|
|
1180
|
-
);
|
|
1181
|
-
})
|
|
1182
|
-
.filter((line) => line.length > 0),
|
|
1183
|
-
entries,
|
|
1184
|
-
deletionCandidates: await deletionCandidates(),
|
|
1185
|
-
summaries: buildSummaries(entries),
|
|
1186
|
-
};
|
|
1187
|
-
await writeFile(
|
|
1188
|
-
path.join(DOCS_DIR, "convergence-audit.json"),
|
|
1189
|
-
`${JSON.stringify(document, null, 2)}\n`,
|
|
1190
|
-
);
|
|
1191
|
-
await writeFile(
|
|
1192
|
-
path.join(DOCS_DIR, "convergence-audit.md"),
|
|
1193
|
-
buildMarkdown(document),
|
|
1194
|
-
);
|
|
1195
|
-
process.stdout.write(
|
|
1196
|
-
`Wrote ${relativePath(path.join(DOCS_DIR, "convergence-audit.json"))}\n`,
|
|
1197
|
-
);
|
|
1198
|
-
process.stdout.write(
|
|
1199
|
-
`Wrote ${relativePath(path.join(DOCS_DIR, "convergence-audit.md"))}\n`,
|
|
1200
|
-
);
|
|
1201
|
-
}
|
|
1202
|
-
|
|
1203
|
-
await main();
|