From f19cb738afe94a0f9fdd1fb698dd6b8b1afec85d Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Wed, 18 Mar 2026 17:38:37 -0700 Subject: [PATCH] fix(plugin-sdk): restore public runtime subpaths --- extensions/acpx/runtime-api.ts | 2 +- extensions/copilot-proxy/runtime-api.ts | 2 +- extensions/feishu/runtime-api.ts | 2 +- extensions/google/runtime-api.ts | 2 +- extensions/googlechat/runtime-api.ts | 2 +- extensions/irc/src/runtime-api.ts | 2 +- extensions/line/runtime-api.ts | 2 +- extensions/lobster/runtime-api.ts | 2 +- extensions/matrix/runtime-api.ts | 2 +- extensions/mattermost/runtime-api.ts | 2 +- extensions/msteams/runtime-api.ts | 2 +- extensions/nextcloud-talk/runtime-api.ts | 2 +- extensions/nostr/runtime-api.ts | 2 +- extensions/open-prose/runtime-api.ts | 2 +- extensions/phone-control/runtime-api.ts | 2 +- extensions/qwen-portal-auth/runtime-api.ts | 2 +- extensions/signal/src/runtime-api.ts | 2 +- extensions/twitch/runtime-api.ts | 2 +- extensions/zai/runtime-api.ts | 2 +- extensions/zalo/runtime-api.ts | 2 +- extensions/zalouser/runtime-api.ts | 2 +- package.json | 72 ++++++++ scripts/lib/plugin-sdk-entrypoints.json | 18 ++ ...on-relative-outside-package-inventory.json | 168 ------------------ 24 files changed, 111 insertions(+), 189 deletions(-) diff --git a/extensions/acpx/runtime-api.ts b/extensions/acpx/runtime-api.ts index 9a019cdd0e6..8d1d125f226 100644 --- a/extensions/acpx/runtime-api.ts +++ b/extensions/acpx/runtime-api.ts @@ -1 +1 @@ -export * from "../../src/plugin-sdk/acpx.js"; +export * from "openclaw/plugin-sdk/acpx"; diff --git a/extensions/copilot-proxy/runtime-api.ts b/extensions/copilot-proxy/runtime-api.ts index 9f59e519281..849136c6efb 100644 --- a/extensions/copilot-proxy/runtime-api.ts +++ b/extensions/copilot-proxy/runtime-api.ts @@ -1 +1 @@ -export * from "../../src/plugin-sdk/copilot-proxy.js"; +export * from "openclaw/plugin-sdk/copilot-proxy"; diff --git a/extensions/feishu/runtime-api.ts b/extensions/feishu/runtime-api.ts index 72e50339b1f..1257d4a7f00 100644 --- a/extensions/feishu/runtime-api.ts +++ b/extensions/feishu/runtime-api.ts @@ -1 +1 @@ -export * from "../../src/plugin-sdk/feishu.js"; +export * from "openclaw/plugin-sdk/feishu"; diff --git a/extensions/google/runtime-api.ts b/extensions/google/runtime-api.ts index 60e25c7303e..7deb5b38f92 100644 --- a/extensions/google/runtime-api.ts +++ b/extensions/google/runtime-api.ts @@ -1 +1 @@ -export * from "../../src/plugin-sdk/google.js"; +export * from "openclaw/plugin-sdk/google"; diff --git a/extensions/googlechat/runtime-api.ts b/extensions/googlechat/runtime-api.ts index 324abaf11c4..9eecea28139 100644 --- a/extensions/googlechat/runtime-api.ts +++ b/extensions/googlechat/runtime-api.ts @@ -1,4 +1,4 @@ // Private runtime barrel for the bundled Google Chat extension. // Keep this barrel thin and aligned with the curated plugin-sdk/googlechat surface. -export * from "../../src/plugin-sdk/googlechat.js"; +export * from "openclaw/plugin-sdk/googlechat"; diff --git a/extensions/irc/src/runtime-api.ts b/extensions/irc/src/runtime-api.ts index e5540f4fe4e..93214aeda45 100644 --- a/extensions/irc/src/runtime-api.ts +++ b/extensions/irc/src/runtime-api.ts @@ -1 +1 @@ -export * from "../../../src/plugin-sdk/irc.js"; +export * from "openclaw/plugin-sdk/irc"; diff --git a/extensions/line/runtime-api.ts b/extensions/line/runtime-api.ts index e3f5c9368b0..af6082ba155 100644 --- a/extensions/line/runtime-api.ts +++ b/extensions/line/runtime-api.ts @@ -1 +1 @@ -export * from "../../src/plugin-sdk/line-core.js"; +export * from "openclaw/plugin-sdk/line-core"; diff --git a/extensions/lobster/runtime-api.ts b/extensions/lobster/runtime-api.ts index 24898e04cf5..7ab2351b77d 100644 --- a/extensions/lobster/runtime-api.ts +++ b/extensions/lobster/runtime-api.ts @@ -1 +1 @@ -export * from "../../src/plugin-sdk/lobster.js"; +export * from "openclaw/plugin-sdk/lobster"; diff --git a/extensions/matrix/runtime-api.ts b/extensions/matrix/runtime-api.ts index 04dc8efe2cd..f9079d7430a 100644 --- a/extensions/matrix/runtime-api.ts +++ b/extensions/matrix/runtime-api.ts @@ -1 +1 @@ -export * from "../../src/plugin-sdk/matrix.js"; +export * from "openclaw/plugin-sdk/matrix"; diff --git a/extensions/mattermost/runtime-api.ts b/extensions/mattermost/runtime-api.ts index 61d44b28a2d..e13fee5ad71 100644 --- a/extensions/mattermost/runtime-api.ts +++ b/extensions/mattermost/runtime-api.ts @@ -1 +1 @@ -export * from "../../src/plugin-sdk/mattermost.js"; +export * from "openclaw/plugin-sdk/mattermost"; diff --git a/extensions/msteams/runtime-api.ts b/extensions/msteams/runtime-api.ts index 2d0d98739d1..1347e49a695 100644 --- a/extensions/msteams/runtime-api.ts +++ b/extensions/msteams/runtime-api.ts @@ -1 +1 @@ -export * from "../../src/plugin-sdk/msteams.js"; +export * from "openclaw/plugin-sdk/msteams"; diff --git a/extensions/nextcloud-talk/runtime-api.ts b/extensions/nextcloud-talk/runtime-api.ts index ba31a546cdf..fc9283930bd 100644 --- a/extensions/nextcloud-talk/runtime-api.ts +++ b/extensions/nextcloud-talk/runtime-api.ts @@ -1 +1 @@ -export * from "../../src/plugin-sdk/nextcloud-talk.js"; +export * from "openclaw/plugin-sdk/nextcloud-talk"; diff --git a/extensions/nostr/runtime-api.ts b/extensions/nostr/runtime-api.ts index 3fbe8cf14d6..3f3d64cc3bf 100644 --- a/extensions/nostr/runtime-api.ts +++ b/extensions/nostr/runtime-api.ts @@ -1 +1 @@ -export * from "../../src/plugin-sdk/nostr.js"; +export * from "openclaw/plugin-sdk/nostr"; diff --git a/extensions/open-prose/runtime-api.ts b/extensions/open-prose/runtime-api.ts index 1a7ce98ffef..1601f81be1f 100644 --- a/extensions/open-prose/runtime-api.ts +++ b/extensions/open-prose/runtime-api.ts @@ -1 +1 @@ -export * from "../../src/plugin-sdk/open-prose.js"; +export * from "openclaw/plugin-sdk/open-prose"; diff --git a/extensions/phone-control/runtime-api.ts b/extensions/phone-control/runtime-api.ts index c113b9802be..2e9e0adeba2 100644 --- a/extensions/phone-control/runtime-api.ts +++ b/extensions/phone-control/runtime-api.ts @@ -1 +1 @@ -export * from "../../src/plugin-sdk/phone-control.js"; +export * from "openclaw/plugin-sdk/phone-control"; diff --git a/extensions/qwen-portal-auth/runtime-api.ts b/extensions/qwen-portal-auth/runtime-api.ts index ccd9abae569..232a2886110 100644 --- a/extensions/qwen-portal-auth/runtime-api.ts +++ b/extensions/qwen-portal-auth/runtime-api.ts @@ -1 +1 @@ -export * from "../../src/plugin-sdk/qwen-portal-auth.js"; +export * from "openclaw/plugin-sdk/qwen-portal-auth"; diff --git a/extensions/signal/src/runtime-api.ts b/extensions/signal/src/runtime-api.ts index 35c05ddfa18..93bce482026 100644 --- a/extensions/signal/src/runtime-api.ts +++ b/extensions/signal/src/runtime-api.ts @@ -1 +1 @@ -export * from "../../../src/plugin-sdk/signal.js"; +export * from "openclaw/plugin-sdk/signal"; diff --git a/extensions/twitch/runtime-api.ts b/extensions/twitch/runtime-api.ts index dfe3fbff0cd..68033283423 100644 --- a/extensions/twitch/runtime-api.ts +++ b/extensions/twitch/runtime-api.ts @@ -1 +1 @@ -export * from "../../src/plugin-sdk/twitch.js"; +export * from "openclaw/plugin-sdk/twitch"; diff --git a/extensions/zai/runtime-api.ts b/extensions/zai/runtime-api.ts index 16d46dd4362..27c34abce5a 100644 --- a/extensions/zai/runtime-api.ts +++ b/extensions/zai/runtime-api.ts @@ -1 +1 @@ -export * from "../../src/plugin-sdk/zai.js"; +export * from "openclaw/plugin-sdk/zai"; diff --git a/extensions/zalo/runtime-api.ts b/extensions/zalo/runtime-api.ts index a8fa6c3d3d1..666b1c2a59d 100644 --- a/extensions/zalo/runtime-api.ts +++ b/extensions/zalo/runtime-api.ts @@ -1 +1 @@ -export * from "../../src/plugin-sdk/zalo.js"; +export * from "openclaw/plugin-sdk/zalo"; diff --git a/extensions/zalouser/runtime-api.ts b/extensions/zalouser/runtime-api.ts index 8954fbb39d1..ef062d07887 100644 --- a/extensions/zalouser/runtime-api.ts +++ b/extensions/zalouser/runtime-api.ts @@ -1 +1 @@ -export * from "../../src/plugin-sdk/zalouser.js"; +export * from "openclaw/plugin-sdk/zalouser"; diff --git a/package.json b/package.json index 6c1d30a51f6..2e529c8032b 100644 --- a/package.json +++ b/package.json @@ -165,6 +165,10 @@ "types": "./dist/plugin-sdk/acp-runtime.d.ts", "default": "./dist/plugin-sdk/acp-runtime.js" }, + "./plugin-sdk/acpx": { + "types": "./dist/plugin-sdk/acpx.d.ts", + "default": "./dist/plugin-sdk/acpx.js" + }, "./plugin-sdk/telegram": { "types": "./dist/plugin-sdk/telegram.d.ts", "default": "./dist/plugin-sdk/telegram.js" @@ -181,10 +185,50 @@ "types": "./dist/plugin-sdk/discord-core.d.ts", "default": "./dist/plugin-sdk/discord-core.js" }, + "./plugin-sdk/copilot-proxy": { + "types": "./dist/plugin-sdk/copilot-proxy.d.ts", + "default": "./dist/plugin-sdk/copilot-proxy.js" + }, "./plugin-sdk/feishu": { "types": "./dist/plugin-sdk/feishu.d.ts", "default": "./dist/plugin-sdk/feishu.js" }, + "./plugin-sdk/google": { + "types": "./dist/plugin-sdk/google.d.ts", + "default": "./dist/plugin-sdk/google.js" + }, + "./plugin-sdk/googlechat": { + "types": "./dist/plugin-sdk/googlechat.d.ts", + "default": "./dist/plugin-sdk/googlechat.js" + }, + "./plugin-sdk/irc": { + "types": "./dist/plugin-sdk/irc.d.ts", + "default": "./dist/plugin-sdk/irc.js" + }, + "./plugin-sdk/line-core": { + "types": "./dist/plugin-sdk/line-core.d.ts", + "default": "./dist/plugin-sdk/line-core.js" + }, + "./plugin-sdk/lobster": { + "types": "./dist/plugin-sdk/lobster.d.ts", + "default": "./dist/plugin-sdk/lobster.js" + }, + "./plugin-sdk/matrix": { + "types": "./dist/plugin-sdk/matrix.d.ts", + "default": "./dist/plugin-sdk/matrix.js" + }, + "./plugin-sdk/mattermost": { + "types": "./dist/plugin-sdk/mattermost.d.ts", + "default": "./dist/plugin-sdk/mattermost.js" + }, + "./plugin-sdk/msteams": { + "types": "./dist/plugin-sdk/msteams.d.ts", + "default": "./dist/plugin-sdk/msteams.js" + }, + "./plugin-sdk/nextcloud-talk": { + "types": "./dist/plugin-sdk/nextcloud-talk.d.ts", + "default": "./dist/plugin-sdk/nextcloud-talk.js" + }, "./plugin-sdk/slack": { "types": "./dist/plugin-sdk/slack.d.ts", "default": "./dist/plugin-sdk/slack.js" @@ -197,6 +241,22 @@ "types": "./dist/plugin-sdk/imessage.d.ts", "default": "./dist/plugin-sdk/imessage.js" }, + "./plugin-sdk/open-prose": { + "types": "./dist/plugin-sdk/open-prose.d.ts", + "default": "./dist/plugin-sdk/open-prose.js" + }, + "./plugin-sdk/phone-control": { + "types": "./dist/plugin-sdk/phone-control.d.ts", + "default": "./dist/plugin-sdk/phone-control.js" + }, + "./plugin-sdk/qwen-portal-auth": { + "types": "./dist/plugin-sdk/qwen-portal-auth.d.ts", + "default": "./dist/plugin-sdk/qwen-portal-auth.js" + }, + "./plugin-sdk/signal": { + "types": "./dist/plugin-sdk/signal.d.ts", + "default": "./dist/plugin-sdk/signal.js" + }, "./plugin-sdk/whatsapp": { "types": "./dist/plugin-sdk/whatsapp.d.ts", "default": "./dist/plugin-sdk/whatsapp.js" @@ -437,6 +497,18 @@ "types": "./dist/plugin-sdk/web-media.d.ts", "default": "./dist/plugin-sdk/web-media.js" }, + "./plugin-sdk/zai": { + "types": "./dist/plugin-sdk/zai.d.ts", + "default": "./dist/plugin-sdk/zai.js" + }, + "./plugin-sdk/zalo": { + "types": "./dist/plugin-sdk/zalo.d.ts", + "default": "./dist/plugin-sdk/zalo.js" + }, + "./plugin-sdk/zalouser": { + "types": "./dist/plugin-sdk/zalouser.d.ts", + "default": "./dist/plugin-sdk/zalouser.js" + }, "./plugin-sdk/speech": { "types": "./dist/plugin-sdk/speech.d.ts", "default": "./dist/plugin-sdk/speech.js" diff --git a/scripts/lib/plugin-sdk-entrypoints.json b/scripts/lib/plugin-sdk-entrypoints.json index 1f78aaaf735..97658712de2 100644 --- a/scripts/lib/plugin-sdk-entrypoints.json +++ b/scripts/lib/plugin-sdk-entrypoints.json @@ -31,14 +31,29 @@ "hook-runtime", "process-runtime", "acp-runtime", + "acpx", "telegram", "telegram-core", "discord", "discord-core", + "copilot-proxy", "feishu", + "google", + "googlechat", + "irc", + "line-core", + "lobster", + "matrix", + "mattermost", + "msteams", + "nextcloud-talk", "slack", "slack-core", "imessage", + "open-prose", + "phone-control", + "qwen-portal-auth", + "signal", "whatsapp", "whatsapp-action-runtime", "whatsapp-login-qr", @@ -99,6 +114,9 @@ "twitch", "voice-call", "web-media", + "zai", + "zalo", + "zalouser", "speech", "state-paths", "tool-send" diff --git a/test/fixtures/extension-relative-outside-package-inventory.json b/test/fixtures/extension-relative-outside-package-inventory.json index 4cedb17d51a..222840d1304 100644 --- a/test/fixtures/extension-relative-outside-package-inventory.json +++ b/test/fixtures/extension-relative-outside-package-inventory.json @@ -1,44 +1,4 @@ [ - { - "file": "extensions/acpx/runtime-api.ts", - "line": 1, - "kind": "export", - "specifier": "../../src/plugin-sdk/acpx.js", - "resolvedPath": "src/plugin-sdk/acpx.js", - "reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/" - }, - { - "file": "extensions/copilot-proxy/runtime-api.ts", - "line": 1, - "kind": "export", - "specifier": "../../src/plugin-sdk/copilot-proxy.js", - "resolvedPath": "src/plugin-sdk/copilot-proxy.js", - "reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/" - }, - { - "file": "extensions/feishu/runtime-api.ts", - "line": 1, - "kind": "export", - "specifier": "../../src/plugin-sdk/feishu.js", - "resolvedPath": "src/plugin-sdk/feishu.js", - "reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/" - }, - { - "file": "extensions/google/runtime-api.ts", - "line": 1, - "kind": "export", - "specifier": "../../src/plugin-sdk/google.js", - "resolvedPath": "src/plugin-sdk/google.js", - "reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/" - }, - { - "file": "extensions/googlechat/runtime-api.ts", - "line": 4, - "kind": "export", - "specifier": "../../src/plugin-sdk/googlechat.js", - "resolvedPath": "src/plugin-sdk/googlechat.js", - "reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/" - }, { "file": "extensions/googlechat/src/channel.ts", "line": 23, @@ -79,38 +39,6 @@ "resolvedPath": "extensions/shared/runtime.js", "reason": "imports another extension via relative path outside the extension package" }, - { - "file": "extensions/irc/src/runtime-api.ts", - "line": 1, - "kind": "export", - "specifier": "../../../src/plugin-sdk/irc.js", - "resolvedPath": "src/plugin-sdk/irc.js", - "reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/" - }, - { - "file": "extensions/line/runtime-api.ts", - "line": 1, - "kind": "export", - "specifier": "../../src/plugin-sdk/line-core.js", - "resolvedPath": "src/plugin-sdk/line-core.js", - "reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/" - }, - { - "file": "extensions/lobster/runtime-api.ts", - "line": 1, - "kind": "export", - "specifier": "../../src/plugin-sdk/lobster.js", - "resolvedPath": "src/plugin-sdk/lobster.js", - "reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/" - }, - { - "file": "extensions/matrix/runtime-api.ts", - "line": 1, - "kind": "export", - "specifier": "../../src/plugin-sdk/matrix.js", - "resolvedPath": "src/plugin-sdk/matrix.js", - "reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/" - }, { "file": "extensions/matrix/src/channel.ts", "line": 19, @@ -119,14 +47,6 @@ "resolvedPath": "extensions/shared/channel-status-summary.js", "reason": "imports another extension via relative path outside the extension package" }, - { - "file": "extensions/mattermost/runtime-api.ts", - "line": 1, - "kind": "export", - "specifier": "../../src/plugin-sdk/mattermost.js", - "resolvedPath": "src/plugin-sdk/mattermost.js", - "reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/" - }, { "file": "extensions/mattermost/src/channel.ts", "line": 15, @@ -143,22 +63,6 @@ "resolvedPath": "extensions/shared/config-schema-helpers.js", "reason": "imports another extension via relative path outside the extension package" }, - { - "file": "extensions/msteams/runtime-api.ts", - "line": 1, - "kind": "export", - "specifier": "../../src/plugin-sdk/msteams.js", - "resolvedPath": "src/plugin-sdk/msteams.js", - "reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/" - }, - { - "file": "extensions/nextcloud-talk/runtime-api.ts", - "line": 1, - "kind": "export", - "specifier": "../../src/plugin-sdk/nextcloud-talk.js", - "resolvedPath": "src/plugin-sdk/nextcloud-talk.js", - "reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/" - }, { "file": "extensions/nextcloud-talk/src/channel.ts", "line": 13, @@ -183,14 +87,6 @@ "resolvedPath": "extensions/shared/runtime.js", "reason": "imports another extension via relative path outside the extension package" }, - { - "file": "extensions/nostr/runtime-api.ts", - "line": 1, - "kind": "export", - "specifier": "../../src/plugin-sdk/nostr.js", - "resolvedPath": "src/plugin-sdk/nostr.js", - "reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/" - }, { "file": "extensions/nostr/src/channel.ts", "line": 9, @@ -199,38 +95,6 @@ "resolvedPath": "extensions/shared/channel-status-summary.js", "reason": "imports another extension via relative path outside the extension package" }, - { - "file": "extensions/open-prose/runtime-api.ts", - "line": 1, - "kind": "export", - "specifier": "../../src/plugin-sdk/open-prose.js", - "resolvedPath": "src/plugin-sdk/open-prose.js", - "reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/" - }, - { - "file": "extensions/phone-control/runtime-api.ts", - "line": 1, - "kind": "export", - "specifier": "../../src/plugin-sdk/phone-control.js", - "resolvedPath": "src/plugin-sdk/phone-control.js", - "reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/" - }, - { - "file": "extensions/qwen-portal-auth/runtime-api.ts", - "line": 1, - "kind": "export", - "specifier": "../../src/plugin-sdk/qwen-portal-auth.js", - "resolvedPath": "src/plugin-sdk/qwen-portal-auth.js", - "reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/" - }, - { - "file": "extensions/signal/src/runtime-api.ts", - "line": 1, - "kind": "export", - "specifier": "../../../src/plugin-sdk/signal.js", - "resolvedPath": "src/plugin-sdk/signal.js", - "reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/" - }, { "file": "extensions/slack/src/channel.ts", "line": 20, @@ -239,14 +103,6 @@ "resolvedPath": "extensions/shared/channel-status-summary.js", "reason": "imports another extension via relative path outside the extension package" }, - { - "file": "extensions/twitch/runtime-api.ts", - "line": 1, - "kind": "export", - "specifier": "../../src/plugin-sdk/twitch.js", - "resolvedPath": "src/plugin-sdk/twitch.js", - "reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/" - }, { "file": "extensions/twitch/src/plugin.ts", "line": 8, @@ -255,22 +111,6 @@ "resolvedPath": "extensions/shared/channel-status-summary.js", "reason": "imports another extension via relative path outside the extension package" }, - { - "file": "extensions/zai/runtime-api.ts", - "line": 1, - "kind": "export", - "specifier": "../../src/plugin-sdk/zai.js", - "resolvedPath": "src/plugin-sdk/zai.js", - "reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/" - }, - { - "file": "extensions/zalo/runtime-api.ts", - "line": 1, - "kind": "export", - "specifier": "../../src/plugin-sdk/zalo.js", - "resolvedPath": "src/plugin-sdk/zalo.js", - "reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/" - }, { "file": "extensions/zalo/src/status-issues.ts", "line": 1, @@ -279,14 +119,6 @@ "resolvedPath": "extensions/shared/status-issues.js", "reason": "imports another extension via relative path outside the extension package" }, - { - "file": "extensions/zalouser/runtime-api.ts", - "line": 1, - "kind": "export", - "specifier": "../../src/plugin-sdk/zalouser.js", - "resolvedPath": "src/plugin-sdk/zalouser.js", - "reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/" - }, { "file": "extensions/zalouser/src/channel.ts", "line": 10,