@elizaos/agent 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/__tests__/view-user-journeys.d.ts.map +1 -1
- package/__tests__/view-user-journeys.js +52 -41
- package/actions/context-signal.d.ts +2 -2
- package/actions/files.d.ts +9 -0
- package/actions/files.d.ts.map +1 -0
- package/actions/files.js +183 -0
- package/actions/index.d.ts +17 -17
- package/api/accounts-routes.d.ts +1 -1
- package/api/accounts-routes.js +1 -1
- package/api/agent-admin-routes.d.ts +1 -1
- package/api/agent-admin-routes.js +2 -2
- package/api/agent-model.d.ts +1 -1
- package/api/agent-status-routes.d.ts +1 -3
- package/api/agent-status-routes.d.ts.map +1 -1
- package/api/agent-status-routes.js +0 -2
- package/api/approval-routes.d.ts +38 -0
- package/api/approval-routes.d.ts.map +1 -0
- package/api/approval-routes.js +223 -0
- package/api/background-routes.d.ts +13 -0
- package/api/background-routes.d.ts.map +1 -0
- package/api/background-routes.js +91 -0
- package/api/binance-skill-helpers.d.ts +2 -2
- package/api/binance-skill-helpers.js +2 -2
- package/api/builtin-views.d.ts.map +1 -1
- package/api/builtin-views.js +44 -4
- package/api/character-routes.d.ts +1 -1
- package/api/chat-augmentation.d.ts.map +1 -1
- package/api/chat-augmentation.js +17 -0
- package/api/chat-routes.d.ts +29 -2
- package/api/chat-routes.d.ts.map +1 -1
- package/api/chat-routes.js +76 -1
- package/api/commands-routes.d.ts +10 -8
- package/api/commands-routes.d.ts.map +1 -1
- package/api/commands-routes.js +17 -59
- package/api/config-routes.d.ts +1 -1
- package/api/config-routes.d.ts.map +1 -1
- package/api/config-routes.js +0 -2
- package/api/connector-routes.d.ts +1 -1
- package/api/conversation-metadata.d.ts +1 -1
- package/api/conversation-metadata.d.ts.map +1 -1
- package/api/conversation-metadata.js +0 -1
- package/api/conversation-routes.d.ts +4 -3
- package/api/conversation-routes.d.ts.map +1 -1
- package/api/conversation-routes.js +34 -1
- package/api/documents-service-loader.d.ts +0 -4
- package/api/documents-service-loader.d.ts.map +1 -1
- package/api/documents-service-loader.js +0 -2
- package/api/files-routes.d.ts +14 -0
- package/api/files-routes.d.ts.map +1 -0
- package/api/files-routes.js +47 -0
- package/api/first-run-routes.d.ts +1 -1
- package/api/health-routes.d.ts +2 -2
- package/api/index.d.ts +40 -39
- package/api/index.d.ts.map +1 -1
- package/api/index.js +1 -0
- package/api/interactions-routes.d.ts +33 -0
- package/api/interactions-routes.d.ts.map +1 -0
- package/api/interactions-routes.js +63 -0
- package/api/media-runtime.d.ts +2 -1
- package/api/media-runtime.d.ts.map +1 -1
- package/api/media-runtime.js +64 -7
- package/api/media-store.d.ts +36 -0
- package/api/media-store.d.ts.map +1 -1
- package/api/media-store.js +141 -2
- package/api/memory-bounds.d.ts +0 -1
- package/api/memory-bounds.d.ts.map +1 -1
- package/api/memory-bounds.js +0 -1
- package/api/misc-routes.d.ts +1 -1
- package/api/model-provider-helpers.d.ts +2 -2
- package/api/model-provider-helpers.js +2 -2
- package/api/permissions-routes-extra.d.ts +1 -1
- package/api/permissions-routes.d.ts +1 -1
- package/api/permissions-routes.d.ts.map +1 -1
- package/api/permissions-routes.js +8 -7
- package/api/plugin-discovery-helpers.d.ts +5 -6
- package/api/plugin-discovery-helpers.d.ts.map +1 -1
- package/api/plugin-discovery-helpers.js +3 -4
- package/api/plugin-runtime-apply.d.ts +2 -2
- package/api/plugin-runtime-apply.d.ts.map +1 -1
- package/api/plugin-runtime-apply.js +74 -0
- package/api/provider-switch-config.d.ts +1 -1
- package/api/provider-switch-routes.d.ts +2 -2
- package/api/registry-routes.d.ts +1 -1
- package/api/registry-service.d.ts +1 -1
- package/api/remote-capability-routes.d.ts +2 -2
- package/api/remote-capability-routes.d.ts.map +1 -1
- package/api/remote-capability-routes.js +19 -0
- package/api/server-autonomy-helpers.d.ts +2 -2
- package/api/server-helpers-auth.d.ts +10 -0
- package/api/server-helpers-auth.d.ts.map +1 -1
- package/api/server-helpers-auth.js +16 -210
- package/api/server-helpers-config.d.ts +1 -1
- package/api/server-helpers-mcp.d.ts +2 -2
- package/api/server-helpers-plugin.d.ts +1 -1
- package/api/server-helpers-swarm.d.ts +3 -3
- package/api/server-helpers-swarm.d.ts.map +1 -1
- package/api/server-helpers-swarm.js +15 -5
- package/api/server-helpers-wallet.d.ts +1 -1
- package/api/server-helpers.d.ts +4 -4
- package/api/server-lazy-routes.d.ts +40 -38
- package/api/server-lazy-routes.d.ts.map +1 -1
- package/api/server-lazy-routes.js +7 -0
- package/api/server-route-dispatch.d.ts +2 -2
- package/api/server-route-dispatch.d.ts.map +1 -1
- package/api/server-route-dispatch.js +7 -0
- package/api/server-types.d.ts +9 -7
- package/api/server-types.d.ts.map +1 -1
- package/api/server.d.ts +19 -19
- package/api/server.d.ts.map +1 -1
- package/api/server.js +111 -17
- package/api/static-file-server.d.ts +2 -2
- package/api/static-file-server.js +2 -2
- package/api/subscription-routes.d.ts +4 -4
- package/api/subscription-routes.js +3 -4
- package/api/suggestions-routes.d.ts +1 -1
- package/api/suggestions-routes.d.ts.map +1 -1
- package/api/suggestions-routes.js +2 -3
- package/api/terminal-execution-routing.d.ts +1 -1
- package/api/training-service-like.d.ts +1 -1
- package/api/trajectory-fallback-routes.d.ts.map +1 -1
- package/api/trajectory-fallback-routes.js +21 -1
- package/api/update-routes.d.ts +1 -1
- package/api/view-registry-types.d.ts +1 -1
- package/api/views-registry.d.ts +14 -4
- package/api/views-registry.d.ts.map +1 -1
- package/api/views-registry.js +107 -72
- package/api/views-routes.d.ts +1 -1
- package/api/views-routes.d.ts.map +1 -1
- package/api/views-routes.js +131 -14
- package/api/views-search-index.d.ts +1 -1
- package/api/wallet-capability.d.ts +3 -3
- package/api/wallet-rpc.d.ts +1 -1
- package/api/wallet.d.ts +3 -3
- package/api/wallet.d.ts.map +1 -1
- package/api/wallet.js +4 -3
- package/api/workbench-context.d.ts +1 -1
- package/api/workbench-helpers.d.ts +3 -3
- package/api/workbench-helpers.js +3 -3
- package/api/workbench-routes.d.ts +2 -2
- package/api/workbench-vfs-routes.d.ts +1 -1
- package/api/ws-event-replay.d.ts +1 -2
- package/api/ws-event-replay.d.ts.map +1 -1
- package/api/ws-event-replay.js +1 -2
- package/api/x-relay-routes.d.ts +2 -2
- package/api/x402-route-validation.d.ts +4 -0
- package/api/x402-route-validation.d.ts.map +1 -0
- package/api/x402-route-validation.js +6 -0
- package/assets/view-heroes/background.png +0 -0
- package/auth/account-storage.d.ts +1 -1
- package/auth/anthropic.d.ts +1 -1
- package/auth/credentials.d.ts +2 -2
- package/auth/index.d.ts +7 -7
- package/auth/oauth-flow.d.ts +2 -2
- package/auth/openai-codex.d.ts +1 -1
- package/awareness/index.d.ts +1 -1
- package/config/config.js +0 -1
- package/config/env-vars.d.ts +1 -1
- package/config/env-vars.d.ts.map +1 -1
- package/config/env-vars.js +0 -1
- package/config/index.d.ts +10 -10
- package/config/model-metadata.d.ts +1 -1
- package/config/owner-contacts.d.ts +1 -1
- package/config/schema.d.ts +1 -1
- package/hooks/discovery.d.ts +1 -1
- package/hooks/eligibility.d.ts +2 -2
- package/hooks/index.d.ts +2 -2
- package/hooks/loader.d.ts +2 -2
- package/hooks/registry.d.ts +1 -1
- package/index.d.ts +87 -85
- package/index.d.ts.map +1 -1
- package/index.js +11 -3
- package/package.json +54 -44
- package/providers/media-provider.d.ts +1 -1
- package/providers/page-scoped-context.d.ts.map +1 -1
- package/providers/page-scoped-context.js +1 -70
- package/providers/relevant-conversations.d.ts.map +1 -1
- package/providers/relevant-conversations.js +8 -9
- package/providers/workspace.d.ts +1 -1
- package/runtime/actions/web-fetch.d.ts.map +1 -1
- package/runtime/actions/web-fetch.js +23 -3
- package/runtime/actions/web-search.d.ts +32 -0
- package/runtime/actions/web-search.d.ts.map +1 -0
- package/runtime/actions/web-search.js +245 -0
- package/runtime/advanced-capabilities-config.d.ts +1 -1
- package/runtime/boot-telemetry.d.ts +1 -1
- package/runtime/conversation-compactor-runtime.d.ts +1 -1
- package/runtime/conversation-compactor-runtime.js +1 -1
- package/runtime/conversation-compactor.d.ts +1 -1
- package/runtime/core-plugins.d.ts.map +1 -1
- package/runtime/core-plugins.js +9 -0
- package/runtime/custom-actions.d.ts +18 -9
- package/runtime/custom-actions.d.ts.map +1 -1
- package/runtime/custom-actions.js +85 -23
- package/runtime/eliza-plugin.d.ts.map +1 -1
- package/runtime/eliza-plugin.js +15 -1
- package/runtime/eliza.d.ts +9 -7
- package/runtime/eliza.d.ts.map +1 -1
- package/runtime/eliza.js +86 -23
- package/runtime/first-time-setup.d.ts +1 -3
- package/runtime/first-time-setup.d.ts.map +1 -1
- package/runtime/first-time-setup.js +0 -2
- package/runtime/index.d.ts +18 -18
- package/runtime/load-plugin-from-vfs.d.ts +2 -2
- package/runtime/mobile-dns.d.ts.map +1 -1
- package/runtime/mobile-dns.js +2 -5
- package/runtime/operations/classifier.d.ts +1 -1
- package/runtime/operations/cold-strategy.d.ts +1 -1
- package/runtime/operations/health-checks.d.ts +1 -1
- package/runtime/operations/health.d.ts +1 -1
- package/runtime/operations/index.d.ts +10 -10
- package/runtime/operations/manager.d.ts +3 -3
- package/runtime/operations/reload-hot.d.ts +1 -1
- package/runtime/operations/repository.d.ts +1 -1
- package/runtime/operations/vault-bridge.d.ts +1 -1
- package/runtime/plugin-collector.d.ts +6 -1
- package/runtime/plugin-collector.d.ts.map +1 -1
- package/runtime/plugin-collector.js +11 -28
- package/runtime/plugin-lifecycle.d.ts.map +1 -1
- package/runtime/plugin-lifecycle.js +1 -0
- package/runtime/plugin-resolver.d.ts +2 -2
- package/runtime/plugin-resolver.d.ts.map +1 -1
- package/runtime/plugin-resolver.js +113 -65
- package/runtime/plugin-types.d.ts +1 -1
- package/runtime/prompt-optimization.d.ts +4 -4
- package/runtime/remote-coding-runner-gate.d.ts +7 -0
- package/runtime/remote-coding-runner-gate.d.ts.map +1 -0
- package/runtime/remote-coding-runner-gate.js +36 -0
- package/runtime/roles/src/index.d.ts +4 -4
- package/runtime/roles.d.ts +2 -2
- package/runtime/sandbox-character.d.ts +1 -1
- package/runtime/tool-call-cache/cache.d.ts +1 -1
- package/runtime/tool-call-cache/disk-store.d.ts +1 -1
- package/runtime/tool-call-cache/index.d.ts +6 -6
- package/runtime/tool-call-cache/key.d.ts +1 -1
- package/runtime/tool-call-cache/redact.d.ts +1 -1
- package/runtime/tool-call-cache/registry.d.ts +1 -1
- package/runtime/tool-call-cache-wrapper.d.ts +7 -9
- package/runtime/tool-call-cache-wrapper.d.ts.map +1 -1
- package/runtime/tool-call-cache-wrapper.js +6 -11
- package/runtime/trajectory-export.d.ts +3 -3
- package/runtime/trajectory-internals.d.ts +2 -1
- package/runtime/trajectory-internals.d.ts.map +1 -1
- package/runtime/trajectory-persistence.d.ts +5 -5
- package/runtime/trajectory-steps-reader.d.ts +1 -1
- package/runtime/trajectory-steps-writer.d.ts +1 -1
- package/runtime/trajectory-storage.d.ts +4 -4
- package/runtime/view-action-affinity.d.ts +18 -15
- package/runtime/view-action-affinity.d.ts.map +1 -1
- package/runtime/view-action-affinity.js +26 -29
- package/runtime/web-search-tools.d.ts +4 -1
- package/runtime/web-search-tools.d.ts.map +1 -1
- package/runtime/web-search-tools.js +37 -9
- package/security/index.d.ts +3 -3
- package/services/approval/index.d.ts +9 -0
- package/services/approval/index.d.ts.map +1 -0
- package/services/approval/index.js +8 -0
- package/services/approval/service.d.ts +35 -0
- package/services/approval/service.d.ts.map +1 -0
- package/services/approval/service.js +40 -0
- package/services/approval/sql.d.ts +18 -0
- package/services/approval/sql.d.ts.map +1 -0
- package/services/approval/sql.js +104 -0
- package/services/approval/store.d.ts +39 -0
- package/services/approval/store.d.ts.map +1 -0
- package/services/approval/store.js +534 -0
- package/services/approval/types.d.ts +207 -0
- package/services/approval/types.d.ts.map +1 -0
- package/services/approval/types.js +34 -0
- package/services/character-persistence.d.ts +2 -2
- package/services/client-chat-sender.d.ts +1 -1
- package/services/config-plugin-manager.d.ts +2 -2
- package/services/connector-setup-service.d.ts +1 -1
- package/services/cove-quote-x509.d.ts +1 -1
- package/services/cove-quote.d.ts +2 -2
- package/services/dstack-tee-provider.d.ts +1 -1
- package/services/file-storage.d.ts +20 -0
- package/services/file-storage.d.ts.map +1 -0
- package/services/file-storage.js +70 -0
- package/services/global-pause/index.d.ts +8 -0
- package/services/global-pause/index.d.ts.map +1 -0
- package/services/global-pause/index.js +7 -0
- package/services/global-pause/service.d.ts +29 -0
- package/services/global-pause/service.d.ts.map +1 -0
- package/services/global-pause/service.js +34 -0
- package/services/global-pause/store.d.ts +31 -0
- package/services/global-pause/store.d.ts.map +1 -0
- package/services/global-pause/store.js +83 -0
- package/services/handoff/index.d.ts +8 -0
- package/services/handoff/index.d.ts.map +1 -0
- package/services/handoff/index.js +7 -0
- package/services/handoff/service.d.ts +29 -0
- package/services/handoff/service.d.ts.map +1 -0
- package/services/handoff/service.js +34 -0
- package/services/handoff/store.d.ts +76 -0
- package/services/handoff/store.d.ts.map +1 -0
- package/services/handoff/store.js +148 -0
- package/services/index.d.ts +30 -31
- package/services/index.d.ts.map +1 -1
- package/services/index.js +0 -6
- package/services/js-runtime-bridge.d.ts.map +1 -1
- package/services/js-runtime-bridge.js +8 -2
- package/services/knowledge-graph/index.d.ts +4 -4
- package/services/knowledge-graph/service.d.ts +2 -2
- package/services/pending-prompts/index.d.ts +8 -0
- package/services/pending-prompts/index.d.ts.map +1 -0
- package/services/pending-prompts/index.js +7 -0
- package/services/pending-prompts/service.d.ts +34 -0
- package/services/pending-prompts/service.d.ts.map +1 -0
- package/services/pending-prompts/service.js +68 -0
- package/services/pending-prompts/store.d.ts +70 -0
- package/services/pending-prompts/store.d.ts.map +1 -0
- package/services/pending-prompts/store.js +191 -0
- package/services/plugin-compiler.d.ts +1 -1
- package/services/plugin-installer.d.ts.map +1 -1
- package/services/plugin-installer.js +21 -11
- package/services/plugin-manager-types.d.ts +1 -1
- package/services/proactive-interaction-decider.d.ts +62 -11
- package/services/proactive-interaction-decider.d.ts.map +1 -1
- package/services/proactive-interaction-decider.js +223 -35
- package/services/push/apns-provider.d.ts +1 -1
- package/services/push/fcm-provider.d.ts +1 -1
- package/services/push/notification-push-service.d.ts +2 -2
- package/services/registry-client-app-meta.d.ts +1 -1
- package/services/registry-client-endpoints.d.ts +2 -2
- package/services/registry-client-local.d.ts +1 -1
- package/services/registry-client-network.d.ts +1 -1
- package/services/registry-client-queries.d.ts +1 -1
- package/services/registry-client.d.ts +3 -3
- package/services/relationships-graph.d.ts +1 -1
- package/services/remote-capability-cloud-sandbox.d.ts +3 -3
- package/services/remote-capability-endpoint-conformance.d.ts +1 -1
- package/services/remote-capability-endpoint-provider.d.ts +4 -4
- package/services/remote-capability-url-endpoint-providers.d.ts +1 -1
- package/services/remote-plugin-adapter.d.ts.map +1 -1
- package/services/remote-plugin-adapter.js +3 -0
- package/services/remote-plugin-bridge.d.ts.map +1 -1
- package/services/remote-plugin-bridge.js +97 -26
- package/services/remote-signing-service.d.ts +4 -4
- package/services/research-task-executor.d.ts +1 -1
- package/services/sandbox-manager.d.ts +1 -1
- package/services/self-updater.d.ts +1 -1
- package/services/self-updater.d.ts.map +1 -1
- package/services/self-updater.js +23 -9
- package/services/shell-execution-router.d.ts +1 -1
- package/services/shell-execution-router.d.ts.map +1 -1
- package/services/shell-execution-router.js +19 -2
- package/services/tee-boot-gate-state.d.ts +1 -1
- package/services/tee-boot-gate.d.ts +4 -4
- package/services/tee-confidential-inference.d.ts +3 -3
- package/services/tee-key-release.d.ts +2 -2
- package/services/tee-model-key-boot.d.ts +4 -4
- package/services/tee-policy.d.ts +1 -1
- package/services/tee-production-profile.d.ts +1 -1
- package/services/tee-release-policy.d.ts +1 -1
- package/services/tee-revocation.d.ts +2 -2
- package/services/tee-runtime-config.d.ts +1 -1
- package/services/tee-sealed-volume.d.ts +3 -3
- package/services/tee-signer-backend.d.ts +3 -3
- package/services/update-checker.d.ts +1 -1
- package/services/vault-signer-backend.d.ts +1 -1
- package/services/vfs-git.d.ts +1 -1
- package/test-support/index.d.ts +3 -3
- package/triggers/runtime.d.ts +1 -1
- package/triggers/scheduling.d.ts +3 -22
- package/triggers/scheduling.d.ts.map +1 -1
- package/triggers/scheduling.js +2 -214
- package/tui/agent-terminal-tui.d.ts.map +1 -1
- package/tui/agent-terminal-tui.js +174 -72
- package/types/index.d.ts +3 -3
- package/api/nfa-routes.d.ts +0 -6
- package/api/nfa-routes.d.ts.map +0 -1
- package/api/nfa-routes.js +0 -125
- package/api/server-auth.d.ts +0 -46
- package/api/server-auth.d.ts.map +0 -1
- package/api/server-auth.js +0 -504
- package/runtime/restart.d.ts +0 -9
- package/runtime/restart.d.ts.map +0 -1
- package/runtime/restart.js +0 -8
- package/test-utils/sqlite-compat.d.ts +0 -23
- package/test-utils/sqlite-compat.d.ts.map +0 -1
- package/test-utils/sqlite-compat.js +0 -214
|
@@ -18,15 +18,29 @@
|
|
|
18
18
|
* OpenAI, which is what makes the `openai.responses` branch fire.
|
|
19
19
|
*
|
|
20
20
|
* Controlled by:
|
|
21
|
-
* ELIZA_WEB_SEARCH=0|false|off
|
|
21
|
+
* ELIZA_WEB_SEARCH=0|false|off — disable every web-search surface
|
|
22
|
+
* ELIZA_SERVER_WEB_SEARCH=1|true|on — enable provider-native injection
|
|
22
23
|
*/
|
|
23
24
|
import { createRequire } from "node:module";
|
|
24
25
|
import { logger } from "@elizaos/core";
|
|
25
26
|
const require = createRequire(import.meta.url);
|
|
26
|
-
|
|
27
|
-
const raw = process.env.
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
function readBooleanEnv(name) {
|
|
28
|
+
const raw = process.env[name]?.trim().toLowerCase();
|
|
29
|
+
if (raw === undefined || raw.length === 0)
|
|
30
|
+
return undefined;
|
|
31
|
+
if (raw === "0" || raw === "false" || raw === "off" || raw === "no") {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
if (raw === "1" || raw === "true" || raw === "on" || raw === "yes") {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
export function isServerSideWebSearchEnabled() {
|
|
40
|
+
if (readBooleanEnv("ELIZA_WEB_SEARCH") === false)
|
|
41
|
+
return false;
|
|
42
|
+
return readBooleanEnv("ELIZA_SERVER_WEB_SEARCH") === true;
|
|
43
|
+
}
|
|
30
44
|
const PROVIDERS = [
|
|
31
45
|
{
|
|
32
46
|
label: "anthropic",
|
|
@@ -102,6 +116,9 @@ function shouldSkip(params) {
|
|
|
102
116
|
return true;
|
|
103
117
|
return false;
|
|
104
118
|
}
|
|
119
|
+
export function __shouldSkipServerSideWebSearchForTests(params) {
|
|
120
|
+
return shouldSkip(params);
|
|
121
|
+
}
|
|
105
122
|
function wrapFn(original, name) {
|
|
106
123
|
const wrapped = function patchedAiFn(...args) {
|
|
107
124
|
if (args.length > 0 && args[0] && typeof args[0] === "object") {
|
|
@@ -143,12 +160,23 @@ function patchAiSdk() {
|
|
|
143
160
|
logger.warn("[web-search] Could not require('ai') — skipping patch");
|
|
144
161
|
return;
|
|
145
162
|
}
|
|
146
|
-
|
|
163
|
+
let patchedAny = false;
|
|
147
164
|
for (const name of ["generateText", "streamText"]) {
|
|
148
165
|
if (typeof aiModule[name] === "function") {
|
|
149
|
-
|
|
166
|
+
try {
|
|
167
|
+
aiModule[name] = wrapFn(aiModule[name], name);
|
|
168
|
+
patchedAny = true;
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
logger.warn(`[web-search] Could not patch ai.${name}: ${err instanceof Error ? err.message : String(err)}`);
|
|
172
|
+
}
|
|
150
173
|
}
|
|
151
174
|
}
|
|
175
|
+
if (!patchedAny) {
|
|
176
|
+
logger.warn("[web-search] No AI SDK text functions were patched");
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
patched = true;
|
|
152
180
|
logger.info("[web-search] Patched ai.generateText/streamText for server-side web search auto-injection");
|
|
153
181
|
}
|
|
154
182
|
// ---------------------------------------------------------------------------
|
|
@@ -162,8 +190,8 @@ function patchAiSdk() {
|
|
|
162
190
|
* and every provider on the runtime. Call after plugins are registered.
|
|
163
191
|
*/
|
|
164
192
|
export function installServerSideWebSearch() {
|
|
165
|
-
if (!
|
|
166
|
-
logger.info("[web-search]
|
|
193
|
+
if (!isServerSideWebSearchEnabled()) {
|
|
194
|
+
logger.info("[web-search] Provider-native server search disabled; set ELIZA_SERVER_WEB_SEARCH=1 to enable");
|
|
167
195
|
return;
|
|
168
196
|
}
|
|
169
197
|
patchAiSdk();
|
package/security/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export * from "./access.
|
|
2
|
-
export * from "./audit-log.
|
|
3
|
-
export * from "./network-policy.
|
|
1
|
+
export * from "./access.js";
|
|
2
|
+
export * from "./audit-log.js";
|
|
3
|
+
export * from "./network-policy.js";
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime owner-approval queue: enqueue/list/resolve outbound-action approvals
|
|
3
|
+
* over the `approval_requests` table (owned by `@elizaos/plugin-sql`, public
|
|
4
|
+
* schema), surfaced through the registered {@link ApprovalService}.
|
|
5
|
+
*/
|
|
6
|
+
export { APPROVAL_SERVICE, ApprovalService, resolveApprovalService, } from "./service.js";
|
|
7
|
+
export { createApprovalQueue, PgApprovalQueue } from "./store.js";
|
|
8
|
+
export { type ApprovalAction, type ApprovalChannel, type ApprovalEnqueueInput, type ApprovalListFilter, ApprovalNotFoundError, type ApprovalPayload, type ApprovalQueue, type ApprovalQueueOptions, type ApprovalRequest, type ApprovalRequestState, type ApprovalResolution, ApprovalStateTransitionError, type ApprovalTravelCalendarSync, type ApprovalTravelPassenger, } from "./types.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/approval/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,sBAAsB,GACvB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,qBAAqB,EACrB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,4BAA4B,EAC5B,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,GAC7B,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime owner-approval queue: enqueue/list/resolve outbound-action approvals
|
|
3
|
+
* over the `approval_requests` table (owned by `@elizaos/plugin-sql`, public
|
|
4
|
+
* schema), surfaced through the registered {@link ApprovalService}.
|
|
5
|
+
*/
|
|
6
|
+
export { APPROVAL_SERVICE, ApprovalService, resolveApprovalService, } from "./service.js";
|
|
7
|
+
export { createApprovalQueue, PgApprovalQueue } from "./store.js";
|
|
8
|
+
export { ApprovalNotFoundError, ApprovalStateTransitionError, } from "./types.js";
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ApprovalService — the runtime-owned owner-approval queue, exposed as a
|
|
3
|
+
* registered runtime service.
|
|
4
|
+
*
|
|
5
|
+
* The approval queue is a runtime primitive: any plugin (LifeOps outbound
|
|
6
|
+
* sends, document signatures, travel booking, …) consumes it via
|
|
7
|
+
* `runtime.getService(...)` rather than constructing the DB-backed queue
|
|
8
|
+
* itself. The service is a thin factory over {@link PgApprovalQueue}, backed by
|
|
9
|
+
* the `approval_requests` table owned by `@elizaos/plugin-sql` (public schema);
|
|
10
|
+
* the `agentId` is the multi-tenant partition key and defaults to
|
|
11
|
+
* `runtime.agentId`.
|
|
12
|
+
*
|
|
13
|
+
* Mirrors `KnowledgeGraphService` (lifecycle + getService accessor).
|
|
14
|
+
*/
|
|
15
|
+
import { type IAgentRuntime, Service } from "@elizaos/core";
|
|
16
|
+
import type { ApprovalQueue } from "./types.js";
|
|
17
|
+
export declare const APPROVAL_SERVICE = "eliza_approval";
|
|
18
|
+
export declare class ApprovalService extends Service {
|
|
19
|
+
static serviceType: string;
|
|
20
|
+
capabilityDescription: string;
|
|
21
|
+
static start(runtime: IAgentRuntime): Promise<ApprovalService>;
|
|
22
|
+
stop(): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Per-agent approval queue. `agentId` partitions the queue; it defaults to
|
|
25
|
+
* the runtime's agent id and may be overridden for admin/multi-tenant
|
|
26
|
+
* access.
|
|
27
|
+
*/
|
|
28
|
+
getQueue(agentId?: string): ApprovalQueue;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Resolve the registered {@link ApprovalService}. Returns `null` when the
|
|
32
|
+
* runtime has not registered it (e.g. the "eliza" plugin is absent).
|
|
33
|
+
*/
|
|
34
|
+
export declare function resolveApprovalService(runtime: IAgentRuntime): ApprovalService | null;
|
|
35
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/approval/service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,KAAK,aAAa,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,eAAO,MAAM,gBAAgB,mBAAmB,CAAC;AAEjD,qBAAa,eAAgB,SAAQ,OAAO;IAC1C,OAAgB,WAAW,SAAoB;IAEtC,qBAAqB,SAC+F;WAEhH,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;IAI9D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAE3B;;;;OAIG;IACH,QAAQ,CAAC,OAAO,GAAE,MAA6B,GAAG,aAAa;CAGhE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,aAAa,GACrB,eAAe,GAAG,IAAI,CAExB"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ApprovalService — the runtime-owned owner-approval queue, exposed as a
|
|
3
|
+
* registered runtime service.
|
|
4
|
+
*
|
|
5
|
+
* The approval queue is a runtime primitive: any plugin (LifeOps outbound
|
|
6
|
+
* sends, document signatures, travel booking, …) consumes it via
|
|
7
|
+
* `runtime.getService(...)` rather than constructing the DB-backed queue
|
|
8
|
+
* itself. The service is a thin factory over {@link PgApprovalQueue}, backed by
|
|
9
|
+
* the `approval_requests` table owned by `@elizaos/plugin-sql` (public schema);
|
|
10
|
+
* the `agentId` is the multi-tenant partition key and defaults to
|
|
11
|
+
* `runtime.agentId`.
|
|
12
|
+
*
|
|
13
|
+
* Mirrors `KnowledgeGraphService` (lifecycle + getService accessor).
|
|
14
|
+
*/
|
|
15
|
+
import { Service } from "@elizaos/core";
|
|
16
|
+
import { createApprovalQueue } from "./store.js";
|
|
17
|
+
export const APPROVAL_SERVICE = "eliza_approval";
|
|
18
|
+
export class ApprovalService extends Service {
|
|
19
|
+
static serviceType = APPROVAL_SERVICE;
|
|
20
|
+
capabilityDescription = "Runtime owner-approval queue: enqueue/list/resolve outbound-action approvals over the plugin-sql approval_requests table";
|
|
21
|
+
static async start(runtime) {
|
|
22
|
+
return new ApprovalService(runtime);
|
|
23
|
+
}
|
|
24
|
+
async stop() { }
|
|
25
|
+
/**
|
|
26
|
+
* Per-agent approval queue. `agentId` partitions the queue; it defaults to
|
|
27
|
+
* the runtime's agent id and may be overridden for admin/multi-tenant
|
|
28
|
+
* access.
|
|
29
|
+
*/
|
|
30
|
+
getQueue(agentId = this.runtime.agentId) {
|
|
31
|
+
return createApprovalQueue(this.runtime, { agentId });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Resolve the registered {@link ApprovalService}. Returns `null` when the
|
|
36
|
+
* runtime has not registered it (e.g. the "eliza" plugin is absent).
|
|
37
|
+
*/
|
|
38
|
+
export function resolveApprovalService(runtime) {
|
|
39
|
+
return runtime.getService(APPROVAL_SERVICE);
|
|
40
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-contained raw-SQL helpers for the runtime approval queue.
|
|
3
|
+
*
|
|
4
|
+
* The approval store issues raw SQL against the agent's database adapter over
|
|
5
|
+
* the `approval_requests` table owned by `@elizaos/plugin-sql` (public schema).
|
|
6
|
+
* This is the minimal subset of encoders/parsers/runners the store needs; it is
|
|
7
|
+
* intentionally local to `@elizaos/agent` so the runtime approval queue carries
|
|
8
|
+
* no dependency on plugin-side SQL glue. Mirrors `knowledge-graph/sql.ts`.
|
|
9
|
+
*/
|
|
10
|
+
import type { IAgentRuntime } from "@elizaos/core";
|
|
11
|
+
export declare function toText(value: unknown, fallback?: string): string;
|
|
12
|
+
export declare function parseJsonRecord(value: unknown): Record<string, unknown>;
|
|
13
|
+
export declare function executeRawSql(runtime: IAgentRuntime, sqlText: string): Promise<Array<Record<string, unknown>>>;
|
|
14
|
+
export declare function sqlQuote(value: string): string;
|
|
15
|
+
export declare function sqlText(value: string | null | undefined): string;
|
|
16
|
+
export declare function sqlInteger(value: number | null | undefined): string;
|
|
17
|
+
export declare function sqlJson(value: unknown): string;
|
|
18
|
+
//# sourceMappingURL=sql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../../src/services/approval/sql.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAiBnD,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,SAAK,GAAG,MAAM,CAI5D;AAsBD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMvE;AAkCD,wBAAsB,aAAa,CACjC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAKzC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAGhE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAInE;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE9C"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-contained raw-SQL helpers for the runtime approval queue.
|
|
3
|
+
*
|
|
4
|
+
* The approval store issues raw SQL against the agent's database adapter over
|
|
5
|
+
* the `approval_requests` table owned by `@elizaos/plugin-sql` (public schema).
|
|
6
|
+
* This is the minimal subset of encoders/parsers/runners the store needs; it is
|
|
7
|
+
* intentionally local to `@elizaos/agent` so the runtime approval queue carries
|
|
8
|
+
* no dependency on plugin-side SQL glue. Mirrors `knowledge-graph/sql.ts`.
|
|
9
|
+
*/
|
|
10
|
+
let cachedSqlRaw = null;
|
|
11
|
+
function asObject(value) {
|
|
12
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
13
|
+
return null;
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
export function toText(value, fallback = "") {
|
|
17
|
+
if (typeof value === "string")
|
|
18
|
+
return value;
|
|
19
|
+
if (value === null || value === undefined)
|
|
20
|
+
return fallback;
|
|
21
|
+
return String(value);
|
|
22
|
+
}
|
|
23
|
+
function isMissingJsonValue(value) {
|
|
24
|
+
return value === null || value === undefined || value === "";
|
|
25
|
+
}
|
|
26
|
+
function parseJsonValue(value, fallback) {
|
|
27
|
+
if (isMissingJsonValue(value))
|
|
28
|
+
return fallback;
|
|
29
|
+
if (typeof value !== "string") {
|
|
30
|
+
if (typeof value === "object")
|
|
31
|
+
return value;
|
|
32
|
+
throw new Error(`[ApprovalSql] Expected JSON string or object, received ${typeof value}`);
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
return JSON.parse(value);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
39
|
+
throw new Error(`[ApprovalSql] Invalid JSON value: ${message}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export function parseJsonRecord(value) {
|
|
43
|
+
if (isMissingJsonValue(value))
|
|
44
|
+
return {};
|
|
45
|
+
const parsed = parseJsonValue(value, null);
|
|
46
|
+
const object = asObject(parsed);
|
|
47
|
+
if (object)
|
|
48
|
+
return object;
|
|
49
|
+
throw new Error("[ApprovalSql] Expected JSON object");
|
|
50
|
+
}
|
|
51
|
+
function extractRows(result) {
|
|
52
|
+
if (Array.isArray(result)) {
|
|
53
|
+
return result
|
|
54
|
+
.map((row) => asObject(row))
|
|
55
|
+
.filter((row) => row !== null);
|
|
56
|
+
}
|
|
57
|
+
const object = asObject(result);
|
|
58
|
+
if (!object)
|
|
59
|
+
return [];
|
|
60
|
+
const rows = object.rows;
|
|
61
|
+
if (!Array.isArray(rows))
|
|
62
|
+
return [];
|
|
63
|
+
return rows
|
|
64
|
+
.map((row) => asObject(row))
|
|
65
|
+
.filter((row) => row !== null);
|
|
66
|
+
}
|
|
67
|
+
async function getSqlRaw() {
|
|
68
|
+
if (cachedSqlRaw)
|
|
69
|
+
return cachedSqlRaw;
|
|
70
|
+
const drizzle = (await import("drizzle-orm"));
|
|
71
|
+
cachedSqlRaw = drizzle.sql.raw;
|
|
72
|
+
return cachedSqlRaw;
|
|
73
|
+
}
|
|
74
|
+
function getRuntimeDb(runtime) {
|
|
75
|
+
const db = runtime.adapter.db;
|
|
76
|
+
if (!db || typeof db.execute !== "function") {
|
|
77
|
+
throw new Error("runtime database adapter unavailable");
|
|
78
|
+
}
|
|
79
|
+
return db;
|
|
80
|
+
}
|
|
81
|
+
export async function executeRawSql(runtime, sqlText) {
|
|
82
|
+
const raw = await getSqlRaw();
|
|
83
|
+
const db = getRuntimeDb(runtime);
|
|
84
|
+
const result = await db.execute(raw(sqlText));
|
|
85
|
+
return extractRows(result);
|
|
86
|
+
}
|
|
87
|
+
export function sqlQuote(value) {
|
|
88
|
+
return `'${value.replace(/'/g, "''")}'`;
|
|
89
|
+
}
|
|
90
|
+
export function sqlText(value) {
|
|
91
|
+
if (value === null || value === undefined)
|
|
92
|
+
return "NULL";
|
|
93
|
+
return sqlQuote(value);
|
|
94
|
+
}
|
|
95
|
+
export function sqlInteger(value) {
|
|
96
|
+
if (value === null || value === undefined)
|
|
97
|
+
return "NULL";
|
|
98
|
+
if (!Number.isFinite(value))
|
|
99
|
+
throw new Error("invalid numeric SQL literal");
|
|
100
|
+
return String(Math.trunc(value));
|
|
101
|
+
}
|
|
102
|
+
export function sqlJson(value) {
|
|
103
|
+
return sqlQuote(JSON.stringify(value ?? null));
|
|
104
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `PgApprovalQueue` — concrete approval queue backed by the `approval_requests`
|
|
3
|
+
* table from `@elizaos/plugin-sql` (public schema, no schema prefix).
|
|
4
|
+
*
|
|
5
|
+
* Promoted from `@elizaos/plugin-personal-assistant`'s `lifeops/approval-queue.ts`
|
|
6
|
+
* into a first-class `@elizaos/agent` runtime store (LifeOps Slice 4). The raw
|
|
7
|
+
* SQL is unchanged — it has no schema prefix, so it targets plugin-sql's public
|
|
8
|
+
* `approval_requests` table exactly as before. There is no data migration.
|
|
9
|
+
*
|
|
10
|
+
* Design notes:
|
|
11
|
+
* - The state-transition table below is the single source of truth for
|
|
12
|
+
* legal moves. Anything not enumerated throws
|
|
13
|
+
* `ApprovalStateTransitionError` — there is no fallback, no auto-retry,
|
|
14
|
+
* no silent normalization (Commandment 8).
|
|
15
|
+
* - All logging goes through the structured logger only (Commandment 9).
|
|
16
|
+
* - Each row is scoped to an agent via `agentId`. Cross-agent access is
|
|
17
|
+
* not supported.
|
|
18
|
+
*/
|
|
19
|
+
import { type IAgentRuntime } from "@elizaos/core";
|
|
20
|
+
import { type ApprovalEnqueueInput, type ApprovalListFilter, type ApprovalQueue, type ApprovalQueueOptions, type ApprovalRequest, type ApprovalResolution } from "./types.js";
|
|
21
|
+
export declare class PgApprovalQueue implements ApprovalQueue {
|
|
22
|
+
private readonly runtime;
|
|
23
|
+
private readonly agentId;
|
|
24
|
+
constructor(runtime: IAgentRuntime, options: ApprovalQueueOptions);
|
|
25
|
+
enqueue(input: ApprovalEnqueueInput): Promise<ApprovalRequest>;
|
|
26
|
+
list(filter: ApprovalListFilter): Promise<ReadonlyArray<ApprovalRequest>>;
|
|
27
|
+
byId(id: string): Promise<ApprovalRequest | null>;
|
|
28
|
+
approve(id: string, resolution: ApprovalResolution): Promise<ApprovalRequest>;
|
|
29
|
+
reject(id: string, resolution: ApprovalResolution): Promise<ApprovalRequest>;
|
|
30
|
+
markExecuting(id: string): Promise<ApprovalRequest>;
|
|
31
|
+
markDone(id: string): Promise<ApprovalRequest>;
|
|
32
|
+
markExpired(id: string): Promise<ApprovalRequest>;
|
|
33
|
+
purgeExpired(now: Date): Promise<ReadonlyArray<string>>;
|
|
34
|
+
private fetchById;
|
|
35
|
+
private transitionWithResolution;
|
|
36
|
+
private transitionWithoutResolution;
|
|
37
|
+
}
|
|
38
|
+
export declare function createApprovalQueue(runtime: IAgentRuntime, options: ApprovalQueueOptions): ApprovalQueue;
|
|
39
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/services/approval/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAE,KAAK,aAAa,EAAuB,MAAM,eAAe,CAAC;AASxE,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EAGvB,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EAEpB,KAAK,kBAAkB,EAExB,MAAM,YAAY,CAAC;AA8gBpB,qBAAa,eAAgB,YAAW,aAAa;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,oBAAoB;IAK3D,OAAO,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC;IAqD9D,IAAI,CACR,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IAmBpC,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAKjD,OAAO,CACX,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,kBAAkB,GAC7B,OAAO,CAAC,eAAe,CAAC;IAIrB,MAAM,CACV,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,kBAAkB,GAC7B,OAAO,CAAC,eAAe,CAAC;IAIrB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAInD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAI9C,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAIjD,YAAY,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAe/C,SAAS;YAST,wBAAwB;YA2BxB,2BAA2B;CAoB1C;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,oBAAoB,GAC5B,aAAa,CAEf"}
|