@elizaos/app-core 2.0.3-beta.2 → 2.0.3-beta.4
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-paths.mjs +110 -0
- package/scripts/aosp/compile-libllama-zig-pin.test.mjs +147 -0
- package/scripts/aosp/compile-libllama.mjs +377 -81
- 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
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type declarations for `artifact-staleness.mjs` — generic source-vs-artifact
|
|
3
|
+
* staleness used by the iOS MTP slice, iOS agent bundle, and desktop runtime
|
|
4
|
+
* package reuse gates (issue #9309).
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export function maxMtimeUnder(
|
|
8
|
+
dir: string,
|
|
9
|
+
opts?: {
|
|
10
|
+
exclude?: Set<string>;
|
|
11
|
+
exts?: Set<string> | null;
|
|
12
|
+
maxDepth?: number;
|
|
13
|
+
},
|
|
14
|
+
): number;
|
|
15
|
+
|
|
16
|
+
export function fileMtime(filePath: string): number;
|
|
17
|
+
|
|
18
|
+
export interface ArtifactStaleness {
|
|
19
|
+
stale: boolean;
|
|
20
|
+
reason: string;
|
|
21
|
+
artifactMtime: number;
|
|
22
|
+
newestSourceMtime: number;
|
|
23
|
+
newestSource: string | null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function artifactStaleness(
|
|
27
|
+
artifactPath: string,
|
|
28
|
+
opts?: {
|
|
29
|
+
sourceDirs?: string[];
|
|
30
|
+
sourceFiles?: string[];
|
|
31
|
+
exts?: Set<string> | null;
|
|
32
|
+
},
|
|
33
|
+
): ArtifactStaleness;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic source-vs-artifact staleness check (issue #9309).
|
|
3
|
+
*
|
|
4
|
+
* Several on-device build inputs are cached and reused across builds (the iOS
|
|
5
|
+
* llama.cpp MTP slice, the iOS agent bundle, desktop runtime packages). Each had
|
|
6
|
+
* a presence-only reuse gate that could silently reuse a STALE artifact after
|
|
7
|
+
* its sources changed. This module turns "reuse when present" into "reuse only
|
|
8
|
+
* when the artifact is newer than every source it was built from", so a changed
|
|
9
|
+
* input forces a rebuild instead of shipping old code.
|
|
10
|
+
*
|
|
11
|
+
* mtime is the right granularity here: these artifacts are heavy native/bundle
|
|
12
|
+
* builds keyed off large source trees, and the build host writes both, so an
|
|
13
|
+
* artifact older than any source file is unambiguously stale.
|
|
14
|
+
*/
|
|
15
|
+
import fs from "node:fs";
|
|
16
|
+
import path from "node:path";
|
|
17
|
+
|
|
18
|
+
const DEFAULT_EXCLUDE = new Set([
|
|
19
|
+
"node_modules",
|
|
20
|
+
"dist",
|
|
21
|
+
"build",
|
|
22
|
+
".git",
|
|
23
|
+
".turbo",
|
|
24
|
+
"out",
|
|
25
|
+
]);
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Largest mtime (ms) of any file under `dir`, skipping build/dep dirs.
|
|
29
|
+
* @param {string} dir
|
|
30
|
+
* @param {{ exclude?: Set<string>, exts?: Set<string>|null, maxDepth?: number }} [opts]
|
|
31
|
+
*/
|
|
32
|
+
export function maxMtimeUnder(
|
|
33
|
+
dir,
|
|
34
|
+
{ exclude = DEFAULT_EXCLUDE, exts = null, maxDepth = 25 } = {},
|
|
35
|
+
) {
|
|
36
|
+
let max = 0;
|
|
37
|
+
const walk = (current, depth) => {
|
|
38
|
+
if (depth > maxDepth) return;
|
|
39
|
+
let entries;
|
|
40
|
+
try {
|
|
41
|
+
entries = fs.readdirSync(current, { withFileTypes: true });
|
|
42
|
+
} catch {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
for (const entry of entries) {
|
|
46
|
+
if (exclude.has(entry.name)) continue;
|
|
47
|
+
const full = path.join(current, entry.name);
|
|
48
|
+
if (entry.isDirectory()) {
|
|
49
|
+
walk(full, depth + 1);
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (exts && !exts.has(path.extname(entry.name))) continue;
|
|
53
|
+
try {
|
|
54
|
+
max = Math.max(max, fs.statSync(full).mtimeMs);
|
|
55
|
+
} catch {
|
|
56
|
+
/* ignore unreadable entries */
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
if (fs.existsSync(dir)) walk(dir, 0);
|
|
61
|
+
return max;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** mtime (ms) of a single file, or 0 if missing/unreadable. */
|
|
65
|
+
export function fileMtime(filePath) {
|
|
66
|
+
try {
|
|
67
|
+
return fs.statSync(filePath).mtimeMs;
|
|
68
|
+
} catch {
|
|
69
|
+
return 0;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Is `artifactPath` stale relative to its source dirs/files?
|
|
75
|
+
*
|
|
76
|
+
* @param {string} artifactPath the built artifact (or its marker file)
|
|
77
|
+
* @param {{ sourceDirs?: string[], sourceFiles?: string[], exts?: Set<string>|null }} [opts]
|
|
78
|
+
* @returns {{ stale: boolean, reason: string, artifactMtime: number,
|
|
79
|
+
* newestSourceMtime: number, newestSource: string|null }}
|
|
80
|
+
*/
|
|
81
|
+
export function artifactStaleness(
|
|
82
|
+
artifactPath,
|
|
83
|
+
{ sourceDirs = [], sourceFiles = [], exts = null } = {},
|
|
84
|
+
) {
|
|
85
|
+
const artifactMtime = fileMtime(artifactPath);
|
|
86
|
+
if (!artifactMtime) {
|
|
87
|
+
return {
|
|
88
|
+
stale: true,
|
|
89
|
+
reason: `artifact missing: ${artifactPath}`,
|
|
90
|
+
artifactMtime: 0,
|
|
91
|
+
newestSourceMtime: 0,
|
|
92
|
+
newestSource: null,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
let newestSourceMtime = 0;
|
|
96
|
+
let newestSource = null;
|
|
97
|
+
const consider = (mtime, label) => {
|
|
98
|
+
if (mtime > newestSourceMtime) {
|
|
99
|
+
newestSourceMtime = mtime;
|
|
100
|
+
newestSource = label;
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
for (const dir of sourceDirs) consider(maxMtimeUnder(dir, { exts }), dir);
|
|
104
|
+
for (const file of sourceFiles) consider(fileMtime(file), file);
|
|
105
|
+
|
|
106
|
+
if (newestSourceMtime > artifactMtime) {
|
|
107
|
+
return {
|
|
108
|
+
stale: true,
|
|
109
|
+
reason: `source newer than artifact (${newestSource})`,
|
|
110
|
+
artifactMtime,
|
|
111
|
+
newestSourceMtime,
|
|
112
|
+
newestSource,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
stale: false,
|
|
117
|
+
reason: "fresh",
|
|
118
|
+
artifactMtime,
|
|
119
|
+
newestSourceMtime,
|
|
120
|
+
newestSource,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
artifactStaleness,
|
|
8
|
+
fileMtime,
|
|
9
|
+
maxMtimeUnder,
|
|
10
|
+
} from "./artifact-staleness.mjs";
|
|
11
|
+
|
|
12
|
+
let tmp: string;
|
|
13
|
+
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
tmp = fs.mkdtempSync(path.join(os.tmpdir(), "artifact-staleness-"));
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
afterEach(() => {
|
|
19
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
function touch(file: string, mtimeMs: number) {
|
|
23
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
24
|
+
fs.writeFileSync(file, "x");
|
|
25
|
+
fs.utimesSync(file, mtimeMs / 1000, mtimeMs / 1000);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
describe("maxMtimeUnder", () => {
|
|
29
|
+
it("returns the newest file mtime and skips build/dep dirs", () => {
|
|
30
|
+
touch(path.join(tmp, "src", "a.ts"), 1_000_000);
|
|
31
|
+
touch(path.join(tmp, "src", "nested", "b.ts"), 3_000_000);
|
|
32
|
+
touch(path.join(tmp, "node_modules", "junk.js"), 9_000_000);
|
|
33
|
+
touch(path.join(tmp, "dist", "out.js"), 9_000_000);
|
|
34
|
+
expect(maxMtimeUnder(path.join(tmp, "src"))).toBe(3_000_000);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it("honors an extension filter", () => {
|
|
38
|
+
touch(path.join(tmp, "src", "a.ts"), 2_000_000);
|
|
39
|
+
touch(path.join(tmp, "src", "a.png"), 5_000_000);
|
|
40
|
+
expect(
|
|
41
|
+
maxMtimeUnder(path.join(tmp, "src"), { exts: new Set([".ts"]) }),
|
|
42
|
+
).toBe(2_000_000);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("returns 0 for a missing dir", () => {
|
|
46
|
+
expect(maxMtimeUnder(path.join(tmp, "nope"))).toBe(0);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
describe("fileMtime", () => {
|
|
51
|
+
it("returns the mtime of an existing file and 0 for a missing one", () => {
|
|
52
|
+
touch(path.join(tmp, "f"), 4_000_000);
|
|
53
|
+
expect(fileMtime(path.join(tmp, "f"))).toBe(4_000_000);
|
|
54
|
+
expect(fileMtime(path.join(tmp, "missing"))).toBe(0);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
describe("artifactStaleness", () => {
|
|
59
|
+
it("is stale when the artifact is missing", () => {
|
|
60
|
+
const result = artifactStaleness(path.join(tmp, "art"), {
|
|
61
|
+
sourceDirs: [tmp],
|
|
62
|
+
});
|
|
63
|
+
expect(result.stale).toBe(true);
|
|
64
|
+
expect(result.reason).toMatch(/artifact missing/);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it("is stale when a source dir is newer than the artifact", () => {
|
|
68
|
+
touch(path.join(tmp, "artifact"), 2_000_000);
|
|
69
|
+
touch(path.join(tmp, "src", "code.ts"), 5_000_000);
|
|
70
|
+
const result = artifactStaleness(path.join(tmp, "artifact"), {
|
|
71
|
+
sourceDirs: [path.join(tmp, "src")],
|
|
72
|
+
});
|
|
73
|
+
expect(result.stale).toBe(true);
|
|
74
|
+
expect(result.reason).toMatch(/source newer than artifact/);
|
|
75
|
+
expect(result.newestSource).toBe(path.join(tmp, "src"));
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it("is stale when a source FILE is newer than the artifact", () => {
|
|
79
|
+
touch(path.join(tmp, "artifact"), 2_000_000);
|
|
80
|
+
touch(path.join(tmp, "build-script.mjs"), 6_000_000);
|
|
81
|
+
const result = artifactStaleness(path.join(tmp, "artifact"), {
|
|
82
|
+
sourceFiles: [path.join(tmp, "build-script.mjs")],
|
|
83
|
+
});
|
|
84
|
+
expect(result.stale).toBe(true);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it("is fresh when the artifact is newer than all sources", () => {
|
|
88
|
+
touch(path.join(tmp, "src", "code.ts"), 2_000_000);
|
|
89
|
+
touch(path.join(tmp, "build-script.mjs"), 1_000_000);
|
|
90
|
+
touch(path.join(tmp, "artifact"), 5_000_000);
|
|
91
|
+
const result = artifactStaleness(path.join(tmp, "artifact"), {
|
|
92
|
+
sourceDirs: [path.join(tmp, "src")],
|
|
93
|
+
sourceFiles: [path.join(tmp, "build-script.mjs")],
|
|
94
|
+
});
|
|
95
|
+
expect(result.stale).toBe(false);
|
|
96
|
+
expect(result.reason).toBe("fresh");
|
|
97
|
+
});
|
|
98
|
+
});
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* A.scheduler.sink ── DuetSink(aToB) ──→ PcmRingBuffer ──→ B.micSource.push
|
|
9
9
|
* B.scheduler.sink ── DuetSink(bToA) ──→ PcmRingBuffer ──→ A.micSource.push
|
|
10
10
|
*
|
|
11
|
-
* The TTS emits 24 kHz mono; the VAD +
|
|
11
|
+
* The TTS emits 24 kHz mono; the VAD + local ASR want 16 kHz mono — one
|
|
12
12
|
* linear-interpolation resample in the `DuetSink`, zero file writes.
|
|
13
13
|
*
|
|
14
14
|
* `DuetSink` also reports the **`peer-utterance-end`** instant: when the
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
function escapeXmlText(value) {
|
|
2
|
+
return String(value)
|
|
3
|
+
.replace(/&/g, "&")
|
|
4
|
+
.replace(/</g, "<")
|
|
5
|
+
.replace(/>/g, ">")
|
|
6
|
+
.replace(/"/g, """)
|
|
7
|
+
.replace(/'/g, "'");
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function insertBeforeRootPlistDictClose(content, insertion) {
|
|
11
|
+
const rootClose = "\n</dict>\n</plist>";
|
|
12
|
+
const index = content.lastIndexOf(rootClose);
|
|
13
|
+
if (index >= 0) {
|
|
14
|
+
return `${content.slice(0, index)}\n${insertion}${content.slice(index + "\n</dict>".length)}`;
|
|
15
|
+
}
|
|
16
|
+
const fallbackIndex = content.lastIndexOf("</dict>");
|
|
17
|
+
if (fallbackIndex < 0) {
|
|
18
|
+
throw new Error("Info.plist: could not locate top-level </dict>");
|
|
19
|
+
}
|
|
20
|
+
return `${content.slice(0, fallbackIndex)}${insertion}${content.slice(fallbackIndex + "</dict>".length)}`;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function findUrlTypesArrayRange(content) {
|
|
24
|
+
const keyIndex = content.indexOf("<key>CFBundleURLTypes</key>");
|
|
25
|
+
if (keyIndex < 0) return null;
|
|
26
|
+
const openMatch = /<array\b[^>]*>/g;
|
|
27
|
+
openMatch.lastIndex = keyIndex;
|
|
28
|
+
const firstOpen = openMatch.exec(content);
|
|
29
|
+
if (!firstOpen) {
|
|
30
|
+
throw new Error("Info.plist: CFBundleURLTypes has no array value");
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const tagRe = /<\/?array\b[^>]*>/g;
|
|
34
|
+
tagRe.lastIndex = firstOpen.index;
|
|
35
|
+
let depth = 0;
|
|
36
|
+
for (let match = tagRe.exec(content); match; match = tagRe.exec(content)) {
|
|
37
|
+
if (match[0].startsWith("</")) {
|
|
38
|
+
depth -= 1;
|
|
39
|
+
if (depth === 0) return { start: firstOpen.index, close: match.index };
|
|
40
|
+
if (depth < 0) break;
|
|
41
|
+
} else {
|
|
42
|
+
depth += 1;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
throw new Error("Info.plist: CFBundleURLTypes array is not closed");
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function ensurePlistUrlScheme(content, urlScheme) {
|
|
50
|
+
const trimmedScheme = String(urlScheme).trim();
|
|
51
|
+
if (!trimmedScheme) {
|
|
52
|
+
throw new Error("Cannot patch iOS Info.plist without a URL scheme");
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const escapedScheme = escapeXmlText(trimmedScheme);
|
|
56
|
+
const entry = `
|
|
57
|
+
<dict>
|
|
58
|
+
<key>CFBundleURLName</key>
|
|
59
|
+
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
|
60
|
+
<key>CFBundleURLSchemes</key>
|
|
61
|
+
<array>
|
|
62
|
+
<string>${escapedScheme}</string>
|
|
63
|
+
</array>
|
|
64
|
+
</dict>`;
|
|
65
|
+
const urlTypesArrayRange = findUrlTypesArrayRange(content);
|
|
66
|
+
if (urlTypesArrayRange === null) {
|
|
67
|
+
return insertBeforeRootPlistDictClose(
|
|
68
|
+
content,
|
|
69
|
+
`\t<key>CFBundleURLTypes</key>\n\t<array>${entry}\n\t</array>\n</dict>`,
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
const urlTypesContent = content.slice(
|
|
73
|
+
urlTypesArrayRange.start,
|
|
74
|
+
urlTypesArrayRange.close,
|
|
75
|
+
);
|
|
76
|
+
if (urlTypesContent.includes(`<string>${escapedScheme}</string>`)) {
|
|
77
|
+
return content;
|
|
78
|
+
}
|
|
79
|
+
return `${content.slice(0, urlTypesArrayRange.close)}${entry}${content.slice(urlTypesArrayRange.close)}`;
|
|
80
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
|
|
5
|
+
import { artifactStaleness } from "./artifact-staleness.mjs";
|
|
6
|
+
|
|
7
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
const appCoreScriptsDir = path.resolve(__dirname, "..");
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Brand-separation invariant (issue #9309): the shared canonical Android tree
|
|
12
|
+
* is used only for the elizaOS app itself. Whitelabel builds use appDir/android
|
|
13
|
+
* so identity overlays cannot corrupt another brand's native project.
|
|
14
|
+
*/
|
|
15
|
+
export function androidUsesAppDirFor(appId, env = process.env) {
|
|
16
|
+
return env.ELIZA_ANDROID_USE_APP_DIR === "1" || appId !== "ai.elizaos.app";
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const MTP_BUILD_SCRIPT = path.resolve(
|
|
20
|
+
appCoreScriptsDir,
|
|
21
|
+
"build-llama-cpp-mtp.mjs",
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
// The builder derives its repo root from packages/app-core/scripts, not from
|
|
25
|
+
// run-mobile-build's configurable repoRoot. Keep this identical so the
|
|
26
|
+
// staleness gate checks the same source tree the builder compiles.
|
|
27
|
+
export const mtpBuilderRepoRoot = path.resolve(
|
|
28
|
+
appCoreScriptsDir,
|
|
29
|
+
"..",
|
|
30
|
+
"..",
|
|
31
|
+
"..",
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
export const MTP_FORK_SRC_CANDIDATES = [
|
|
35
|
+
process.env.ELIZA_MTP_LLAMA_CPP_SRC?.trim(),
|
|
36
|
+
path.join(
|
|
37
|
+
mtpBuilderRepoRoot,
|
|
38
|
+
"plugins",
|
|
39
|
+
"plugin-local-inference",
|
|
40
|
+
"native",
|
|
41
|
+
"llama.cpp",
|
|
42
|
+
),
|
|
43
|
+
path.join(
|
|
44
|
+
mtpBuilderRepoRoot,
|
|
45
|
+
"packages",
|
|
46
|
+
"native",
|
|
47
|
+
"ios-deps",
|
|
48
|
+
"llama.cpp",
|
|
49
|
+
"src",
|
|
50
|
+
),
|
|
51
|
+
].filter(Boolean);
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Decide whether a staged MTP slice can be reused or is stale relative to the
|
|
55
|
+
* fork it was built from.
|
|
56
|
+
*/
|
|
57
|
+
export function mtpSliceReuse(capabilitiesPath, forkSrc, currentRevision) {
|
|
58
|
+
if (!fs.existsSync(capabilitiesPath)) {
|
|
59
|
+
return { reusable: false, reason: "no CAPABILITIES.json" };
|
|
60
|
+
}
|
|
61
|
+
let recordedRevision = null;
|
|
62
|
+
try {
|
|
63
|
+
recordedRevision = JSON.parse(fs.readFileSync(capabilitiesPath, "utf8"))
|
|
64
|
+
?.fork?.revision;
|
|
65
|
+
} catch {
|
|
66
|
+
return { reusable: false, reason: "unreadable CAPABILITIES.json" };
|
|
67
|
+
}
|
|
68
|
+
if (recordedRevision === "unknown") recordedRevision = null;
|
|
69
|
+
if (
|
|
70
|
+
recordedRevision &&
|
|
71
|
+
currentRevision &&
|
|
72
|
+
recordedRevision !== currentRevision
|
|
73
|
+
) {
|
|
74
|
+
return {
|
|
75
|
+
reusable: false,
|
|
76
|
+
reason: `fork revision changed (${recordedRevision} -> ${currentRevision})`,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
if (forkSrc) {
|
|
80
|
+
const staleness = artifactStaleness(capabilitiesPath, {
|
|
81
|
+
sourceDirs: [
|
|
82
|
+
path.join(forkSrc, "ggml"),
|
|
83
|
+
path.join(forkSrc, "src"),
|
|
84
|
+
path.join(forkSrc, "common"),
|
|
85
|
+
],
|
|
86
|
+
sourceFiles: [path.join(forkSrc, "CMakeLists.txt"), MTP_BUILD_SCRIPT],
|
|
87
|
+
});
|
|
88
|
+
if (staleness.stale) {
|
|
89
|
+
return { reusable: false, reason: staleness.reason };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return { reusable: true, reason: "fresh" };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function mtpForceRebuildRequested(reuse, env = process.env) {
|
|
96
|
+
return env.ELIZA_IOS_REBUILD_MTP === "1" || !reuse.reusable;
|
|
97
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type declarations for `renderer-build-manifest.mjs` — the deterministic build
|
|
3
|
+
* stamp for the web/renderer bundle (issue #9309). Imported by the vite
|
|
4
|
+
* `renderer-build-manifest` plugin and the platform build orchestrators.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export const RENDERER_BUILD_MANIFEST_FILENAME: "eliza-renderer-build.json";
|
|
8
|
+
export const RENDERER_BUILD_MANIFEST_SCHEMA: "elizaos.renderer.build/v1";
|
|
9
|
+
|
|
10
|
+
export interface RendererBuildManifest {
|
|
11
|
+
schema: string;
|
|
12
|
+
buildId: string;
|
|
13
|
+
indexHtmlSha256: string;
|
|
14
|
+
assetCount: number;
|
|
15
|
+
builtAt: string;
|
|
16
|
+
commit: string | null;
|
|
17
|
+
variant: string | null;
|
|
18
|
+
capacitorTarget: string | null;
|
|
19
|
+
runtimeMode: string | null;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface RendererBuildManifestMeta {
|
|
23
|
+
builtAt?: string;
|
|
24
|
+
commit?: string | null;
|
|
25
|
+
variant?: string | null;
|
|
26
|
+
capacitorTarget?: string | null;
|
|
27
|
+
runtimeMode?: string | null;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function computeRendererFingerprint(distDir: string): {
|
|
31
|
+
buildId: string;
|
|
32
|
+
indexHtmlSha256: string;
|
|
33
|
+
assetCount: number;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export function buildRendererManifest(
|
|
37
|
+
distDir: string,
|
|
38
|
+
meta?: RendererBuildManifestMeta,
|
|
39
|
+
): RendererBuildManifest;
|
|
40
|
+
|
|
41
|
+
export function writeRendererBuildManifest(
|
|
42
|
+
distDir: string,
|
|
43
|
+
meta?: RendererBuildManifestMeta,
|
|
44
|
+
): RendererBuildManifest;
|
|
45
|
+
|
|
46
|
+
export function readRendererBuildManifest(
|
|
47
|
+
dir: string,
|
|
48
|
+
): RendererBuildManifest | null;
|
|
49
|
+
|
|
50
|
+
export function assertStagedRendererMatchesBuild(
|
|
51
|
+
freshDistDir: string,
|
|
52
|
+
stagedDir: string,
|
|
53
|
+
opts?: { label?: string },
|
|
54
|
+
): RendererBuildManifest;
|
|
55
|
+
|
|
56
|
+
export function overlayFreshRendererIntoPublic(
|
|
57
|
+
freshDistDir: string,
|
|
58
|
+
targetPublicDir: string,
|
|
59
|
+
opts?: { label?: string },
|
|
60
|
+
): RendererBuildManifest;
|
|
61
|
+
|
|
62
|
+
export function assertRendererRebuiltSince(
|
|
63
|
+
distDir: string,
|
|
64
|
+
opts: { notBefore: number; expectVariant?: string | null; label?: string },
|
|
65
|
+
): RendererBuildManifest;
|