From 8f1e91c350849194dc0d442d63e4f312e7c276f8 Mon Sep 17 00:00:00 2001 From: Onur Solmaz <2453968+osolmaz@users.noreply.github.com> Date: Fri, 20 Mar 2026 09:30:16 +0100 Subject: [PATCH] Plugins: rename extensions to native plugins --- .../skills/openclaw-parallels-smoke/SKILL.md | 2 +- .github/labeler.yml | 174 ++++----- .github/workflows/ci.yml | 64 ++-- .github/workflows/install-smoke.yml | 6 +- .github/workflows/plugin-npm-release.yml | 2 +- .oxlintrc.json | 2 +- .secrets.baseline | 220 +++++------ AGENTS.md | 10 +- CHANGELOG.md | 20 +- Dockerfile | 8 +- docs/.generated/config-baseline.json | 2 +- docs/.generated/config-baseline.jsonl | 2 +- docs/channels/line.md | 2 +- docs/channels/matrix.md | 2 +- docs/channels/mattermost.md | 2 +- docs/channels/msteams.md | 4 +- docs/channels/nextcloud-talk.md | 2 +- docs/channels/nostr.md | 2 +- docs/channels/synology-chat.md | 2 +- docs/channels/tlon.md | 2 +- docs/channels/twitch.md | 2 +- docs/channels/zalo.md | 2 +- docs/channels/zalouser.md | 2 +- docs/cli/plugins.md | 4 +- docs/docs.json | 2 +- docs/gateway/configuration-reference.md | 2 +- docs/gateway/security/index.md | 4 +- docs/help/testing.md | 4 +- docs/help/troubleshooting.md | 6 +- docs/install/migrating-matrix.md | 4 +- docs/pi.md | 8 +- docs/plugins/architecture.md | 24 +- ...tensions.md => building-native-plugins.md} | 24 +- docs/plugins/bundles.md | 2 +- docs/plugins/voice-call.md | 4 +- docs/plugins/zalouser.md | 4 +- docs/prose.md | 2 +- docs/providers/minimax.md | 2 +- docs/start/hubs.md | 2 +- docs/tools/acp-agents.md | 4 +- docs/tools/capability-cookbook.md | 2 +- docs/tools/plugin.md | 26 +- knip.config.ts | 18 +- {extensions => native-plugins}/.npmignore | 0 {extensions => native-plugins}/acpx/index.ts | 0 .../acpx/openclaw.plugin.json | 0 .../acpx/package.json | 2 +- .../acpx/runtime-api.ts | 0 .../acpx/skills/acp-router/SKILL.md | 14 +- .../acpx/src/config.test.ts | 2 +- .../acpx/src/config.ts | 0 .../acpx/src/ensure.test.ts | 0 .../acpx/src/ensure.ts | 0 .../runtime-internals/control-errors.test.ts | 0 .../src/runtime-internals/control-errors.ts | 0 .../acpx/src/runtime-internals/events.test.ts | 0 .../acpx/src/runtime-internals/events.ts | 0 .../src/runtime-internals/jsonrpc.test.ts | 0 .../acpx/src/runtime-internals/jsonrpc.ts | 0 .../mcp-agent-command.test.ts | 0 .../runtime-internals/mcp-agent-command.ts | 0 .../acpx/src/runtime-internals/mcp-proxy.mjs | 0 .../src/runtime-internals/mcp-proxy.test.ts | 2 +- .../src/runtime-internals/process.test.ts | 0 .../acpx/src/runtime-internals/process.ts | 0 .../acpx/src/runtime-internals/shared.ts | 0 .../acpx/src/runtime.test.ts | 0 .../acpx/src/runtime.ts | 0 .../acpx/src/service.test.ts | 0 .../acpx/src/service.ts | 0 .../acpx/src/test-utils/runtime-fixtures.ts | 0 .../amazon-bedrock/index.test.ts | 2 +- .../amazon-bedrock/index.ts | 0 .../amazon-bedrock/openclaw.plugin.json | 0 .../amazon-bedrock/package.json | 2 +- .../anthropic/index.ts | 0 .../anthropic/media-understanding-provider.ts | 0 .../anthropic/openclaw.plugin.json | 0 .../anthropic/package.json | 2 +- .../bluebubbles/README.md | 24 +- .../bluebubbles/api.ts | 0 .../bluebubbles/index.ts | 0 .../bluebubbles/openclaw.plugin.json | 0 .../bluebubbles/package.json | 4 +- .../bluebubbles/runtime-api.ts | 0 .../bluebubbles/setup-entry.ts | 0 .../bluebubbles/src/account-resolve.ts | 0 .../bluebubbles/src/accounts.test.ts | 0 .../bluebubbles/src/accounts.ts | 0 .../bluebubbles/src/actions.runtime.ts | 0 .../bluebubbles/src/actions.test.ts | 0 .../bluebubbles/src/actions.ts | 0 .../bluebubbles/src/attachments.test.ts | 0 .../bluebubbles/src/attachments.ts | 0 .../bluebubbles/src/channel.runtime.ts | 0 .../bluebubbles/src/channel.setup.ts | 0 .../bluebubbles/src/channel.ts | 0 .../bluebubbles/src/chat.test.ts | 0 .../bluebubbles/src/chat.ts | 0 .../bluebubbles/src/config-apply.ts | 0 .../bluebubbles/src/config-schema.test.ts | 0 .../bluebubbles/src/config-schema.ts | 0 .../bluebubbles/src/group-policy.test.ts | 0 .../bluebubbles/src/group-policy.ts | 0 .../bluebubbles/src/history.ts | 0 .../bluebubbles/src/media-send.test.ts | 0 .../bluebubbles/src/media-send.ts | 0 .../bluebubbles/src/monitor-debounce.ts | 0 .../bluebubbles/src/monitor-normalize.test.ts | 0 .../bluebubbles/src/monitor-normalize.ts | 0 .../bluebubbles/src/monitor-processing.ts | 0 .../bluebubbles/src/monitor-reply-cache.ts | 0 .../src/monitor-self-chat-cache.test.ts | 0 .../src/monitor-self-chat-cache.ts | 0 .../bluebubbles/src/monitor-shared.ts | 0 .../bluebubbles/src/monitor.test.ts | 2 +- .../bluebubbles/src/monitor.ts | 0 .../src/monitor.webhook-auth.test.ts | 2 +- .../src/monitor.webhook-route.test.ts | 0 .../bluebubbles/src/multipart.ts | 0 .../bluebubbles/src/probe.ts | 0 .../bluebubbles/src/reactions.test.ts | 0 .../bluebubbles/src/reactions.ts | 0 .../bluebubbles/src/request-url.ts | 0 .../bluebubbles/src/runtime-api.ts | 0 .../bluebubbles/src/runtime.ts | 0 .../bluebubbles/src/secret-input.ts | 0 .../bluebubbles/src/send-helpers.ts | 0 .../bluebubbles/src/send.test.ts | 0 .../bluebubbles/src/send.ts | 0 .../bluebubbles/src/session-route.ts | 0 .../bluebubbles/src/setup-core.ts | 0 .../bluebubbles/src/setup-surface.test.ts | 0 .../bluebubbles/src/setup-surface.ts | 0 .../bluebubbles/src/targets.test.ts | 0 .../bluebubbles/src/targets.ts | 0 .../bluebubbles/src/test-harness.ts | 0 .../bluebubbles/src/test-mocks.ts | 0 .../bluebubbles/src/types.ts | 0 .../bluebubbles/src/webhook-shared.ts | 0 {extensions => native-plugins}/brave/index.ts | 0 .../brave/openclaw.plugin.json | 0 .../brave/package.json | 2 +- .../brave/src/brave-web-search-provider.ts | 0 .../byteplus/index.ts | 0 .../byteplus/openclaw.plugin.json | 0 .../byteplus/package.json | 2 +- .../byteplus/provider-catalog.ts | 0 .../chutes/index.ts | 0 .../chutes/onboard.ts | 0 .../chutes/openclaw.plugin.json | 0 .../chutes/package.json | 2 +- .../chutes/provider-catalog.ts | 0 .../cloudflare-ai-gateway/index.ts | 0 .../cloudflare-ai-gateway/onboard.ts | 0 .../openclaw.plugin.json | 0 .../cloudflare-ai-gateway/package.json | 2 +- .../copilot-proxy/README.md | 0 .../copilot-proxy/index.ts | 0 .../copilot-proxy/openclaw.plugin.json | 0 .../copilot-proxy/package.json | 2 +- .../copilot-proxy/runtime-api.ts | 0 .../device-pair/api.ts | 0 .../device-pair/index.ts | 0 .../device-pair/notify.test.ts | 0 .../device-pair/notify.ts | 0 .../device-pair/openclaw.plugin.json | 0 .../diagnostics-otel/api.ts | 0 .../diagnostics-otel/index.ts | 0 .../diagnostics-otel/openclaw.plugin.json | 0 .../diagnostics-otel/package.json | 2 +- .../diagnostics-otel/src/service.test.ts | 0 .../diagnostics-otel/src/service.ts | 0 .../diffs/README.md | 0 {extensions => native-plugins}/diffs/api.ts | 0 .../diffs/assets/viewer-runtime.js | 0 .../diffs/index.test.ts | 4 +- {extensions => native-plugins}/diffs/index.ts | 0 .../diffs/openclaw.plugin.json | 0 .../diffs/package.json | 2 +- .../diffs/skills/diffs/SKILL.md | 0 .../diffs/src/browser.test.ts | 0 .../diffs/src/browser.ts | 0 .../diffs/src/config.test.ts | 0 .../diffs/src/config.ts | 0 .../diffs/src/http.test.ts | 2 +- .../diffs/src/http.ts | 0 .../diffs/src/prompt-guidance.ts | 0 .../diffs/src/render.test.ts | 0 .../diffs/src/render.ts | 0 .../diffs/src/store.test.ts | 0 .../diffs/src/store.ts | 0 .../diffs/src/test-helpers.ts | 0 .../diffs/src/tool.test.ts | 2 +- .../diffs/src/tool.ts | 0 .../diffs/src/types.ts | 0 .../diffs/src/url.test.ts | 0 .../diffs/src/url.ts | 0 .../diffs/src/viewer-assets.test.ts | 0 .../diffs/src/viewer-assets.ts | 0 .../diffs/src/viewer-client.ts | 0 .../diffs/src/viewer-payload.test.ts | 0 .../diffs/src/viewer-payload.ts | 0 {extensions => native-plugins}/discord/api.ts | 0 .../discord/index.ts | 0 .../discord/openclaw.plugin.json | 0 .../discord/package.json | 4 +- .../discord/runtime-api.ts | 0 .../discord/session-key-api.ts | 0 .../discord/setup-entry.ts | 0 .../discord/src/account-inspect.test.ts | 0 .../discord/src/account-inspect.ts | 0 .../discord/src/accounts.test.ts | 0 .../discord/src/accounts.ts | 0 .../src/actions/handle-action.guild-admin.ts | 0 .../discord/src/actions/handle-action.ts | 0 .../discord/src/actions/runtime.guild.ts | 0 .../discord/src/actions/runtime.messaging.ts | 0 .../src/actions/runtime.moderation-shared.ts | 0 .../actions/runtime.moderation.authz.test.ts | 0 .../discord/src/actions/runtime.moderation.ts | 0 .../src/actions/runtime.presence.test.ts | 0 .../discord/src/actions/runtime.presence.ts | 0 .../discord/src/actions/runtime.shared.ts | 0 .../discord/src/actions/runtime.test.ts | 0 .../discord/src/actions/runtime.ts | 0 .../discord/src/api.test.ts | 2 +- .../discord/src/api.ts | 0 .../discord/src/audit.test.ts | 0 .../discord/src/audit.ts | 0 .../discord/src/channel-actions.ts | 0 .../discord/src/channel.runtime.ts | 0 .../discord/src/channel.setup.ts | 0 .../discord/src/channel.test.ts | 2 +- .../discord/src/channel.ts | 0 .../discord/src/chunk.test.ts | 2 +- .../discord/src/chunk.ts | 0 .../discord/src/client.test.ts | 0 .../discord/src/client.ts | 0 .../discord/src/components-registry.ts | 0 .../discord/src/components.test.ts | 0 .../discord/src/components.ts | 0 .../discord/src/config-schema.ts | 0 .../discord/src/directory-cache.ts | 0 .../discord/src/directory-config.ts | 0 .../discord/src/directory-live.test.ts | 0 .../discord/src/directory-live.ts | 0 .../discord/src/draft-chunking.ts | 0 .../discord/src/draft-stream.ts | 0 .../discord/src/exec-approvals.ts | 0 .../discord/src/gateway-logging.test.ts | 0 .../discord/src/gateway-logging.ts | 0 .../discord/src/group-policy.test.ts | 0 .../discord/src/group-policy.ts | 0 .../discord/src/guilds.ts | 0 .../discord/src/mentions.test.ts | 0 .../discord/src/mentions.ts | 0 .../discord/src/message-tool-schema.ts | 0 .../discord/src/monitor.gateway.test.ts | 0 .../discord/src/monitor.gateway.ts | 0 .../discord/src/monitor.test.ts | 2 +- ...messages-mentionpatterns-match.e2e.test.ts | 0 ...ends-status-replies-responseprefix.test.ts | 0 .../src/monitor.tool-result.test-harness.ts | 0 .../discord/src/monitor.ts | 0 .../src/monitor/agent-components-helpers.ts | 0 .../discord/src/monitor/agent-components.ts | 0 .../monitor/agent-components.wildcard.test.ts | 0 .../discord/src/monitor/allow-list.ts | 0 .../discord/src/monitor/auto-presence.test.ts | 0 .../discord/src/monitor/auto-presence.ts | 0 .../discord/src/monitor/commands.test.ts | 0 .../discord/src/monitor/commands.ts | 0 .../src/monitor/dm-command-auth.test.ts | 0 .../discord/src/monitor/dm-command-auth.ts | 0 .../src/monitor/dm-command-decision.test.ts | 0 .../src/monitor/dm-command-decision.ts | 0 .../src/monitor/exec-approvals.test.ts | 0 .../discord/src/monitor/exec-approvals.ts | 0 .../discord/src/monitor/format.ts | 0 .../src/monitor/gateway-error-guard.test.ts | 0 .../src/monitor/gateway-error-guard.ts | 0 .../discord/src/monitor/gateway-plugin.ts | 0 .../discord/src/monitor/gateway-registry.ts | 0 .../src/monitor/inbound-context.test.ts | 0 .../discord/src/monitor/inbound-context.ts | 0 .../discord/src/monitor/inbound-job.test.ts | 0 .../discord/src/monitor/inbound-job.ts | 0 .../discord/src/monitor/inbound-worker.ts | 0 .../discord/src/monitor/listeners.test.ts | 0 .../discord/src/monitor/listeners.ts | 0 .../message-handler.bot-self-filter.test.ts | 0 .../message-handler.inbound-context.test.ts | 0 .../message-handler.module-test-helpers.ts | 0 ...age-handler.preflight.acp-bindings.test.ts | 0 .../message-handler.preflight.test-helpers.ts | 0 .../monitor/message-handler.preflight.test.ts | 0 .../src/monitor/message-handler.preflight.ts | 0 .../message-handler.preflight.types.ts | 0 .../monitor/message-handler.process.test.ts | 0 .../src/monitor/message-handler.process.ts | 0 .../src/monitor/message-handler.queue.test.ts | 0 .../monitor/message-handler.test-harness.ts | 0 .../monitor/message-handler.test-helpers.ts | 0 .../discord/src/monitor/message-handler.ts | 0 .../discord/src/monitor/message-utils.test.ts | 0 .../discord/src/monitor/message-utils.ts | 0 .../monitor/model-picker-preferences.test.ts | 0 .../src/monitor/model-picker-preferences.ts | 0 .../src/monitor/model-picker.test-utils.ts | 0 .../discord/src/monitor/model-picker.test.ts | 0 .../discord/src/monitor/model-picker.ts | 0 .../discord/src/monitor/monitor.test.ts | 0 .../monitor/native-command-context.test.ts | 0 .../src/monitor/native-command-context.ts | 0 .../discord/src/monitor/native-command-ui.ts | 0 .../native-command.commands-allowfrom.test.ts | 0 .../native-command.model-picker.test.ts | 0 .../monitor/native-command.options.test.ts | 0 .../native-command.plugin-dispatch.test.ts | 0 .../monitor/native-command.test-helpers.ts | 0 .../discord/src/monitor/native-command.ts | 0 .../src/monitor/preflight-audio.runtime.ts | 0 .../discord/src/monitor/preflight-audio.ts | 0 .../discord/src/monitor/presence-cache.ts | 0 .../discord/src/monitor/presence.test.ts | 0 .../discord/src/monitor/presence.ts | 0 .../src/monitor/provider.allowlist.test.ts | 0 .../discord/src/monitor/provider.allowlist.ts | 0 .../src/monitor/provider.lifecycle.test.ts | 0 .../discord/src/monitor/provider.lifecycle.ts | 0 .../src/monitor/provider.proxy.test.ts | 0 .../src/monitor/provider.rest-proxy.test.ts | 0 .../src/monitor/provider.skill-dedupe.test.ts | 0 .../discord/src/monitor/provider.test.ts | 2 +- .../discord/src/monitor/provider.ts | 0 .../discord/src/monitor/reply-context.ts | 0 .../src/monitor/reply-delivery.test.ts | 0 .../discord/src/monitor/reply-delivery.ts | 0 .../discord/src/monitor/rest-fetch.ts | 0 .../src/monitor/route-resolution.test.ts | 0 .../discord/src/monitor/route-resolution.ts | 0 .../discord/src/monitor/sender-identity.ts | 0 .../discord/src/monitor/status.ts | 0 .../discord/src/monitor/system-events.ts | 0 .../src/monitor/thread-bindings.config.ts | 0 .../thread-bindings.discord-api.test.ts | 0 .../monitor/thread-bindings.discord-api.ts | 0 .../monitor/thread-bindings.lifecycle.test.ts | 0 .../src/monitor/thread-bindings.lifecycle.ts | 0 .../src/monitor/thread-bindings.manager.ts | 0 .../src/monitor/thread-bindings.messages.ts | 0 .../monitor/thread-bindings.persona.test.ts | 0 .../src/monitor/thread-bindings.persona.ts | 0 .../thread-bindings.shared-state.test.ts | 0 .../src/monitor/thread-bindings.state.ts | 0 .../discord/src/monitor/thread-bindings.ts | 0 .../src/monitor/thread-bindings.types.ts | 0 .../src/monitor/thread-session-close.test.ts | 0 .../src/monitor/thread-session-close.ts | 0 .../src/monitor/threading.auto-thread.test.ts | 0 .../src/monitor/threading.parent-info.test.ts | 0 .../src/monitor/threading.starter.test.ts | 0 .../discord/src/monitor/threading.ts | 0 .../discord/src/monitor/timeouts.ts | 0 .../discord/src/monitor/typing.ts | 0 .../discord/src/normalize.ts | 0 ...outbound-adapter.interactive-order.test.ts | 0 .../discord/src/outbound-adapter.test.ts | 0 .../discord/src/outbound-adapter.ts | 0 .../discord/src/pluralkit.test.ts | 0 .../discord/src/pluralkit.ts | 0 .../discord/src/probe.intents.test.ts | 0 .../discord/src/probe.parse-token.test.ts | 0 .../discord/src/probe.ts | 0 .../src/resolve-allowlist-common.test.ts | 0 .../discord/src/resolve-allowlist-common.ts | 0 .../discord/src/resolve-channels.test.ts | 2 +- .../discord/src/resolve-channels.ts | 0 .../discord/src/resolve-users.test.ts | 2 +- .../discord/src/resolve-users.ts | 0 .../discord/src/retry.ts | 0 .../discord/src/runtime-api.ts | 0 .../discord/src/runtime.ts | 0 .../discord/src/send.channels.ts | 0 .../discord/src/send.components.test.ts | 0 .../discord/src/send.components.ts | 0 .../discord/src/send.creates-thread.test.ts | 0 .../discord/src/send.emojis-stickers.ts | 0 .../discord/src/send.guild.ts | 0 .../discord/src/send.messages.ts | 0 .../discord/src/send.outbound.ts | 0 .../src/send.permissions.authz.test.ts | 0 .../discord/src/send.permissions.ts | 0 .../discord/src/send.reactions.ts | 0 .../send.sends-basic-channel-messages.test.ts | 0 .../discord/src/send.shared.ts | 0 .../discord/src/send.test-harness.ts | 0 .../discord/src/send.ts | 0 .../discord/src/send.types.ts | 0 .../discord/src/send.typing.ts | 0 .../discord/src/send.webhook-activity.test.ts | 0 .../src/session-key-normalization.test.ts | 0 .../discord/src/session-key-normalization.ts | 0 .../discord/src/setup-account-state.ts | 0 .../discord/src/setup-core.ts | 0 .../discord/src/setup-runtime-helpers.ts | 0 .../discord/src/setup-surface.ts | 0 .../discord/src/shared-interactive.test.ts | 0 .../discord/src/shared-interactive.ts | 0 .../discord/src/shared.ts | 0 .../discord/src/status-issues.ts | 0 .../discord/src/subagent-hooks.test.ts | 2 +- .../discord/src/subagent-hooks.ts | 0 .../discord/src/targets.test.ts | 0 .../discord/src/targets.ts | 0 .../discord/src/test-http-helpers.ts | 0 .../discord/src/token.test.ts | 0 .../discord/src/token.ts | 0 .../discord/src/ui.ts | 0 .../discord/src/voice-message.test.ts | 0 .../discord/src/voice-message.ts | 0 .../discord/src/voice/command.test.ts | 0 .../discord/src/voice/command.ts | 0 .../discord/src/voice/manager.e2e.test.ts | 0 .../discord/src/voice/manager.runtime.ts | 0 .../discord/src/voice/manager.ts | 0 .../discord/src/voice/sdk-runtime.ts | 0 .../elevenlabs/index.ts | 0 .../elevenlabs/openclaw.plugin.json | 0 .../elevenlabs/package.json | 2 +- {extensions => native-plugins}/fal/index.ts | 0 {extensions => native-plugins}/fal/onboard.ts | 0 .../fal/openclaw.plugin.json | 0 .../fal/package.json | 2 +- {extensions => native-plugins}/feishu/api.ts | 0 .../feishu/index.test.ts | 0 .../feishu/index.ts | 0 .../feishu/openclaw.plugin.json | 0 .../feishu/package.json | 4 +- .../feishu/runtime-api.ts | 0 .../feishu/setup-api.ts | 0 .../feishu/setup-entry.ts | 0 .../feishu/skills/feishu-doc/SKILL.md | 0 .../feishu-doc/references/block-types.md | 0 .../feishu/skills/feishu-drive/SKILL.md | 0 .../feishu/skills/feishu-perm/SKILL.md | 0 .../feishu/skills/feishu-wiki/SKILL.md | 0 .../feishu/src/accounts.test.ts | 0 .../feishu/src/accounts.ts | 0 .../feishu/src/async.ts | 0 .../feishu/src/bitable.ts | 0 .../feishu/src/bot-content.ts | 0 .../feishu/src/bot-sender-name.ts | 0 .../feishu/src/bot.card-action.test.ts | 0 .../feishu/src/bot.checkBotMentioned.test.ts | 0 .../feishu/src/bot.stripBotMention.test.ts | 0 .../feishu/src/bot.test.ts | 2 +- .../feishu/src/bot.ts | 0 .../feishu/src/card-action.ts | 0 .../feishu/src/card-interaction.test.ts | 0 .../feishu/src/card-interaction.ts | 0 .../feishu/src/card-ux-approval.ts | 0 .../feishu/src/card-ux-launcher.test.ts | 0 .../feishu/src/card-ux-launcher.ts | 0 .../feishu/src/card-ux-shared.ts | 0 .../feishu/src/channel.runtime.ts | 0 .../feishu/src/channel.test.ts | 0 .../feishu/src/channel.ts | 0 .../feishu/src/chat-schema.ts | 0 .../feishu/src/chat.test.ts | 0 .../feishu/src/chat.ts | 0 .../feishu/src/client.test.ts | 0 .../feishu/src/client.ts | 0 .../feishu/src/config-schema.test.ts | 0 .../feishu/src/config-schema.ts | 0 .../feishu/src/conversation-id.ts | 0 .../feishu/src/dedup.ts | 0 .../feishu/src/directory.static.ts | 0 .../feishu/src/directory.test.ts | 0 .../feishu/src/directory.ts | 0 .../feishu/src/doc-schema.ts | 0 .../feishu/src/docx-batch-insert.test.ts | 0 .../feishu/src/docx-batch-insert.ts | 0 .../feishu/src/docx-color-text.ts | 0 .../feishu/src/docx-table-ops.ts | 0 .../feishu/src/docx.account-selection.test.ts | 0 .../feishu/src/docx.test.ts | 0 .../feishu/src/docx.ts | 0 .../feishu/src/drive-schema.ts | 0 .../feishu/src/drive.ts | 0 .../feishu/src/dynamic-agent.ts | 0 .../feishu/src/external-keys.test.ts | 0 .../feishu/src/external-keys.ts | 0 .../feishu/src/feishu-command-handler.ts | 0 .../feishu/src/media.test.ts | 0 .../feishu/src/media.ts | 0 .../feishu/src/mention.ts | 0 .../feishu/src/monitor.account.ts | 0 ...monitor.acp-init-failure.lifecycle.test.ts | 2 +- .../src/monitor.bot-menu.lifecycle.test.ts | 2 +- .../feishu/src/monitor.bot-menu.test.ts | 2 +- ...tor.broadcast.reply-once.lifecycle.test.ts | 2 +- .../src/monitor.card-action.lifecycle.test.ts | 2 +- .../src/monitor.reaction.lifecycle.test.ts | 0 .../feishu/src/monitor.reaction.test.ts | 2 +- .../src/monitor.reply-once.lifecycle.test.ts | 2 +- .../feishu/src/monitor.startup.test.ts | 0 .../feishu/src/monitor.startup.ts | 0 .../feishu/src/monitor.state.defaults.test.ts | 0 .../feishu/src/monitor.state.ts | 0 .../feishu/src/monitor.test-mocks.ts | 0 .../feishu/src/monitor.transport.ts | 0 .../feishu/src/monitor.ts | 0 .../feishu/src/monitor.webhook-e2e.test.ts | 0 .../src/monitor.webhook-security.test.ts | 0 .../src/monitor.webhook.test-helpers.ts | 0 .../feishu/src/outbound.test.ts | 0 .../feishu/src/outbound.ts | 0 .../feishu/src/perm-schema.ts | 0 .../feishu/src/perm.ts | 0 .../feishu/src/pins.ts | 0 .../feishu/src/policy.test.ts | 0 .../feishu/src/policy.ts | 0 .../feishu/src/post.test.ts | 0 .../feishu/src/post.ts | 0 .../feishu/src/probe.test.ts | 0 .../feishu/src/probe.ts | 0 .../feishu/src/reactions.ts | 0 .../feishu/src/reply-dispatcher.test.ts | 0 .../feishu/src/reply-dispatcher.ts | 0 .../feishu/src/runtime.ts | 0 .../feishu/src/secret-input.ts | 0 .../feishu/src/send-message.ts | 0 .../feishu/src/send-result.ts | 0 .../feishu/src/send-target.test.ts | 0 .../feishu/src/send-target.ts | 0 .../feishu/src/send.reply-fallback.test.ts | 0 .../feishu/src/send.test.ts | 0 .../feishu/src/send.ts | 0 .../feishu/src/session-route.ts | 0 .../feishu/src/setup-core.ts | 0 .../feishu/src/setup-status.test.ts | 0 .../feishu/src/setup-surface.test.ts | 0 .../feishu/src/setup-surface.ts | 0 .../feishu/src/streaming-card.test.ts | 0 .../feishu/src/streaming-card.ts | 0 .../feishu/src/subagent-hooks.test.ts | 2 +- .../feishu/src/subagent-hooks.ts | 0 .../feishu/src/targets.test.ts | 0 .../feishu/src/targets.ts | 0 .../feishu/src/thread-bindings.test.ts | 0 .../feishu/src/thread-bindings.ts | 0 .../feishu/src/tool-account-routing.test.ts | 0 .../feishu/src/tool-account.ts | 0 .../feishu/src/tool-factory-test-harness.ts | 0 .../feishu/src/tool-result.test.ts | 0 .../feishu/src/tool-result.ts | 0 .../feishu/src/tools-config.test.ts | 0 .../feishu/src/tools-config.ts | 0 .../feishu/src/types.ts | 0 .../feishu/src/typing.test.ts | 0 .../feishu/src/typing.ts | 0 .../feishu/src/wiki-schema.ts | 0 .../feishu/src/wiki.ts | 0 .../firecrawl/index.test.ts | 0 .../firecrawl/index.ts | 0 .../firecrawl/openclaw.plugin.json | 0 .../firecrawl/package.json | 2 +- .../firecrawl/src/config.ts | 0 .../firecrawl/src/firecrawl-client.ts | 0 .../firecrawl/src/firecrawl-scrape-tool.ts | 0 .../src/firecrawl-search-provider.ts | 0 .../firecrawl/src/firecrawl-search-tool.ts | 0 .../github-copilot/index.ts | 0 .../github-copilot/openclaw.plugin.json | 0 .../github-copilot/package.json | 2 +- .../github-copilot/token.test.ts | 0 .../github-copilot/token.ts | 0 .../github-copilot/usage.test.ts | 2 +- .../github-copilot/usage.ts | 0 .../google/gemini-cli-provider.ts | 0 .../google/index.ts | 0 .../google/media-understanding-provider.ts | 0 .../google/oauth.credentials.ts | 0 .../google/oauth.flow.ts | 0 .../google/oauth.http.ts | 0 .../google/oauth.project.ts | 0 .../google/oauth.runtime.ts | 0 .../google/oauth.shared.ts | 0 .../google/oauth.test.ts | 0 .../google/oauth.token.ts | 0 .../google/oauth.ts | 0 .../google/openclaw.plugin.json | 0 .../google/package.json | 2 +- .../google/provider-models.ts | 0 .../google/runtime-api.ts | 0 .../google/src/gemini-web-search-provider.ts | 0 .../googlechat/api.ts | 0 .../googlechat/index.ts | 0 .../googlechat/openclaw.plugin.json | 0 .../googlechat/package.json | 4 +- .../googlechat/runtime-api.ts | 0 .../googlechat/setup-entry.ts | 0 .../googlechat/src/accounts.test.ts | 0 .../googlechat/src/accounts.ts | 0 .../googlechat/src/actions.ts | 0 .../googlechat/src/api.test.ts | 0 .../googlechat/src/api.ts | 0 .../googlechat/src/auth.test.ts | 0 .../googlechat/src/auth.ts | 0 .../googlechat/src/channel.directory.test.ts | 2 +- .../googlechat/src/channel.outbound.test.ts | 0 .../googlechat/src/channel.runtime.ts | 0 .../googlechat/src/channel.startup.test.ts | 2 +- .../googlechat/src/channel.ts | 2 +- .../googlechat/src/config-schema.ts | 0 .../googlechat/src/group-policy.test.ts | 0 .../googlechat/src/group-policy.ts | 0 .../googlechat/src/monitor-access.ts | 0 .../googlechat/src/monitor-types.ts | 0 .../googlechat/src/monitor-webhook.ts | 0 .../googlechat/src/monitor.test.ts | 0 .../googlechat/src/monitor.ts | 0 .../src/monitor.webhook-routing.test.ts | 2 +- .../googlechat/src/resolve-target.test.ts | 0 .../googlechat/src/runtime.ts | 0 .../googlechat/src/setup-core.ts | 0 .../googlechat/src/setup-surface.test.ts | 4 +- .../googlechat/src/setup-surface.ts | 0 .../googlechat/src/targets.test.ts | 0 .../googlechat/src/targets.ts | 0 .../googlechat/src/types.config.ts | 0 .../googlechat/src/types.ts | 0 .../huggingface/index.ts | 0 .../huggingface/onboard.ts | 0 .../huggingface/openclaw.plugin.json | 0 .../huggingface/package.json | 2 +- .../huggingface/provider-catalog.ts | 0 .../imessage/api.ts | 0 .../imessage/index.ts | 0 .../imessage/openclaw.plugin.json | 0 .../imessage/package.json | 2 +- .../imessage/runtime-api.ts | 0 .../imessage/setup-entry.ts | 0 .../imessage/src/accounts.ts | 0 .../imessage/src/channel.outbound.test.ts | 0 .../imessage/src/channel.runtime.ts | 0 .../imessage/src/channel.setup.ts | 0 .../imessage/src/channel.ts | 2 +- .../imessage/src/client.ts | 0 .../imessage/src/config-schema.ts | 0 .../imessage/src/constants.ts | 0 .../imessage/src/group-policy.test.ts | 0 .../imessage/src/group-policy.ts | 0 .../imessage/src/monitor.gating.test.ts | 0 ...nitor.shutdown.unhandled-rejection.test.ts | 0 .../imessage/src/monitor.ts | 0 .../imessage/src/monitor/abort-handler.ts | 0 .../imessage/src/monitor/deliver.test.ts | 0 .../imessage/src/monitor/deliver.ts | 0 .../imessage/src/monitor/echo-cache.ts | 0 .../src/monitor/inbound-processing.test.ts | 0 .../src/monitor/inbound-processing.ts | 0 .../src/monitor/loop-rate-limiter.test.ts | 0 .../imessage/src/monitor/loop-rate-limiter.ts | 0 .../monitor-provider.echo-cache.test.ts | 0 .../imessage/src/monitor/monitor-provider.ts | 0 .../src/monitor/parse-notification.ts | 0 .../src/monitor/reflection-guard.test.ts | 0 .../imessage/src/monitor/reflection-guard.ts | 0 .../imessage/src/monitor/runtime.ts | 0 .../src/monitor/sanitize-outbound.test.ts | 0 .../imessage/src/monitor/sanitize-outbound.ts | 0 .../src/monitor/self-chat-cache.test.ts | 0 .../imessage/src/monitor/self-chat-cache.ts | 0 .../imessage/src/monitor/types.ts | 0 .../imessage/src/outbound-adapter.ts | 0 .../imessage/src/plugin-shared.ts | 0 .../imessage/src/probe.test.ts | 0 .../imessage/src/probe.ts | 0 .../imessage/src/runtime.ts | 0 .../imessage/src/send.test.ts | 0 .../imessage/src/send.ts | 0 .../imessage/src/setup-allow-from.test.ts | 0 .../imessage/src/setup-core.ts | 0 .../imessage/src/setup-surface.ts | 0 .../imessage/src/shared.ts | 0 .../imessage/src/target-parsing-helpers.ts | 0 .../imessage/src/targets.test.ts | 0 .../imessage/src/targets.ts | 0 {extensions => native-plugins}/irc/api.ts | 0 {extensions => native-plugins}/irc/index.ts | 0 .../irc/openclaw.plugin.json | 0 .../irc/package.json | 2 +- .../irc/setup-entry.ts | 0 .../irc/src/accounts.test.ts | 0 .../irc/src/accounts.ts | 0 .../irc/src/channel.startup.test.ts | 2 +- .../irc/src/channel.ts | 2 +- .../irc/src/client.test.ts | 0 .../irc/src/client.ts | 0 .../irc/src/config-schema.test.ts | 0 .../irc/src/config-schema.ts | 2 +- .../irc/src/connect-options.ts | 0 .../irc/src/control-chars.ts | 0 .../irc/src/inbound.policy.test.ts | 0 .../irc/src/inbound.ts | 0 .../irc/src/monitor.test.ts | 0 .../irc/src/monitor.ts | 2 +- .../irc/src/normalize.test.ts | 0 .../irc/src/normalize.ts | 0 .../irc/src/policy.test.ts | 0 .../irc/src/policy.ts | 0 .../irc/src/probe.ts | 0 .../irc/src/protocol.test.ts | 0 .../irc/src/protocol.ts | 0 .../irc/src/runtime-api.ts | 0 .../irc/src/runtime.ts | 0 .../irc/src/send.test.ts | 2 +- .../irc/src/send.ts | 0 .../irc/src/setup-core.ts | 0 .../irc/src/setup-surface.test.ts | 4 +- .../irc/src/setup-surface.ts | 0 .../irc/src/types.ts | 0 .../kilocode/index.ts | 0 .../kilocode/onboard.ts | 0 .../kilocode/openclaw.plugin.json | 0 .../kilocode/package.json | 2 +- .../kilocode/provider-catalog.ts | 0 .../kimi-coding/index.ts | 0 .../kimi-coding/onboard.ts | 0 .../kimi-coding/openclaw.plugin.json | 0 .../kimi-coding/package.json | 2 +- .../kimi-coding/provider-catalog.ts | 0 {extensions => native-plugins}/line/api.ts | 0 {extensions => native-plugins}/line/index.ts | 0 .../line/openclaw.plugin.json | 0 .../line/package.json | 4 +- .../line/runtime-api.ts | 0 .../line/setup-api.ts | 0 .../line/setup-entry.ts | 0 .../line/src/card-command.ts | 0 .../line/src/channel.logout.test.ts | 2 +- .../line/src/channel.sendPayload.test.ts | 0 .../line/src/channel.setup.ts | 0 .../line/src/channel.startup.test.ts | 2 +- .../line/src/channel.ts | 0 .../line/src/config-adapter.ts | 0 .../line/src/config-schema.ts | 0 .../line/src/group-policy.test.ts | 0 .../line/src/group-policy.ts | 0 .../line/src/runtime.ts | 0 .../line/src/setup-core.ts | 0 .../line/src/setup-surface.test.ts | 4 +- .../line/src/setup-surface.ts | 0 .../llm-task/README.md | 2 +- .../llm-task/api.ts | 0 .../llm-task/index.ts | 0 .../llm-task/openclaw.plugin.json | 0 .../llm-task/package.json | 2 +- .../llm-task/src/llm-task-tool.test.ts | 0 .../llm-task/src/llm-task-tool.ts | 0 .../lobster/README.md | 0 .../lobster/SKILL.md | 0 .../lobster/index.ts | 0 .../lobster/openclaw.plugin.json | 0 .../lobster/package.json | 2 +- .../lobster/runtime-api.ts | 0 .../lobster/src/lobster-tool.test.ts | 0 .../lobster/src/lobster-tool.ts | 0 .../lobster/src/test-helpers.ts | 0 .../lobster/src/windows-spawn.test.ts | 0 .../lobster/src/windows-spawn.ts | 0 .../matrix/CHANGELOG.md | 0 {extensions => native-plugins}/matrix/api.ts | 0 .../matrix/helper-api.ts | 0 .../matrix/index.test.ts | 0 .../matrix/index.ts | 0 .../matrix/legacy-crypto-inspector.ts | 0 .../matrix/openclaw.plugin.json | 0 .../matrix/package.json | 4 +- .../matrix/runtime-api.ts | 0 .../matrix/setup-entry.ts | 0 .../matrix/src/account-selection.ts | 0 .../src/actions.account-propagation.test.ts | 0 .../matrix/src/actions.test.ts | 0 .../matrix/src/actions.ts | 0 .../matrix/src/auth-precedence.ts | 0 .../matrix/src/channel.account-paths.test.ts | 0 .../matrix/src/channel.directory.test.ts | 0 .../matrix/src/channel.resolve.test.ts | 0 .../matrix/src/channel.runtime.ts | 0 .../matrix/src/channel.setup.test.ts | 0 .../matrix/src/channel.ts | 2 +- .../matrix/src/cli.test.ts | 0 .../matrix/src/cli.ts | 0 .../matrix/src/config-schema.test.ts | 0 .../matrix/src/config-schema.ts | 0 .../matrix/src/directory-live.test.ts | 0 .../matrix/src/directory-live.ts | 0 .../matrix/src/env-vars.ts | 0 .../matrix/src/group-mentions.ts | 0 .../matrix/src/matrix/account-config.ts | 0 .../matrix/src/matrix/accounts.test.ts | 0 .../matrix/src/matrix/accounts.ts | 0 .../matrix/src/matrix/actions.ts | 0 .../matrix/src/matrix/actions/client.test.ts | 0 .../matrix/src/matrix/actions/client.ts | 0 .../matrix/src/matrix/actions/devices.test.ts | 0 .../matrix/src/matrix/actions/devices.ts | 0 .../matrix/src/matrix/actions/limits.test.ts | 0 .../matrix/src/matrix/actions/limits.ts | 0 .../src/matrix/actions/messages.test.ts | 0 .../matrix/src/matrix/actions/messages.ts | 0 .../matrix/src/matrix/actions/pins.test.ts | 0 .../matrix/src/matrix/actions/pins.ts | 0 .../matrix/src/matrix/actions/polls.test.ts | 0 .../matrix/src/matrix/actions/polls.ts | 0 .../matrix/src/matrix/actions/profile.test.ts | 0 .../matrix/src/matrix/actions/profile.ts | 0 .../src/matrix/actions/reactions.test.ts | 0 .../matrix/src/matrix/actions/reactions.ts | 0 .../matrix/src/matrix/actions/room.test.ts | 0 .../matrix/src/matrix/actions/room.ts | 0 .../matrix/src/matrix/actions/summary.test.ts | 0 .../matrix/src/matrix/actions/summary.ts | 0 .../matrix/src/matrix/actions/types.ts | 0 .../src/matrix/actions/verification.test.ts | 0 .../matrix/src/matrix/actions/verification.ts | 0 .../matrix/src/matrix/active-client.ts | 0 .../matrix/src/matrix/backup-health.ts | 0 .../src/matrix/client-bootstrap.test.ts | 0 .../matrix/src/matrix/client-bootstrap.ts | 0 .../matrix/client-resolver.test-helpers.ts | 0 .../matrix/src/matrix/client.test.ts | 0 .../matrix/src/matrix/client.ts | 0 .../matrix/src/matrix/client/config.ts | 0 .../matrix/src/matrix/client/create-client.ts | 0 .../src/matrix/client/file-sync-store.test.ts | 0 .../src/matrix/client/file-sync-store.ts | 0 .../matrix/src/matrix/client/logging.ts | 0 .../matrix/src/matrix/client/runtime.ts | 0 .../matrix/src/matrix/client/shared.test.ts | 0 .../matrix/src/matrix/client/shared.ts | 0 .../matrix/src/matrix/client/storage.test.ts | 0 .../matrix/src/matrix/client/storage.ts | 0 .../matrix/src/matrix/client/types.ts | 0 .../matrix/src/matrix/config-update.test.ts | 0 .../matrix/src/matrix/config-update.ts | 0 .../matrix/src/matrix/credentials-read.ts | 0 .../src/matrix/credentials-write.runtime.ts | 0 .../matrix/src/matrix/credentials.test.ts | 0 .../matrix/src/matrix/credentials.ts | 0 .../matrix/src/matrix/deps.test.ts | 0 .../matrix/src/matrix/deps.ts | 0 .../matrix/src/matrix/device-health.test.ts | 0 .../matrix/src/matrix/device-health.ts | 0 .../src/matrix/direct-management.test.ts | 0 .../matrix/src/matrix/direct-management.ts | 0 .../matrix/src/matrix/direct-room.ts | 0 .../matrix/src/matrix/encryption-guidance.ts | 0 .../matrix/src/matrix/format.test.ts | 0 .../matrix/src/matrix/format.ts | 0 .../matrix/src/matrix/index.ts | 0 .../src/matrix/legacy-crypto-inspector.ts | 0 .../matrix/src/matrix/media-text.ts | 0 .../src/matrix/monitor/access-state.test.ts | 0 .../matrix/src/matrix/monitor/access-state.ts | 0 .../src/matrix/monitor/ack-config.test.ts | 0 .../matrix/src/matrix/monitor/ack-config.ts | 0 .../src/matrix/monitor/allowlist.test.ts | 0 .../matrix/src/matrix/monitor/allowlist.ts | 0 .../src/matrix/monitor/auto-join.test.ts | 0 .../matrix/src/matrix/monitor/auto-join.ts | 0 .../matrix/src/matrix/monitor/config.test.ts | 0 .../matrix/src/matrix/monitor/config.ts | 0 .../matrix/src/matrix/monitor/direct.test.ts | 0 .../matrix/src/matrix/monitor/direct.ts | 0 .../matrix/src/matrix/monitor/events.test.ts | 0 .../matrix/src/matrix/monitor/events.ts | 0 .../monitor/handler.body-for-agent.test.ts | 0 .../monitor/handler.media-failure.test.ts | 0 .../matrix/monitor/handler.test-helpers.ts | 0 .../matrix/src/matrix/monitor/handler.test.ts | 0 .../monitor/handler.thread-root-media.test.ts | 0 .../matrix/src/matrix/monitor/handler.ts | 0 .../matrix/src/matrix/monitor/index.test.ts | 0 .../matrix/src/matrix/monitor/index.ts | 0 .../monitor/legacy-crypto-restore.test.ts | 0 .../matrix/monitor/legacy-crypto-restore.ts | 0 .../matrix/src/matrix/monitor/location.ts | 0 .../matrix/src/matrix/monitor/media.test.ts | 0 .../matrix/src/matrix/monitor/media.ts | 0 .../src/matrix/monitor/mentions.test.ts | 0 .../matrix/src/matrix/monitor/mentions.ts | 0 .../src/matrix/monitor/reaction-events.ts | 0 .../matrix/src/matrix/monitor/replies.test.ts | 0 .../matrix/src/matrix/monitor/replies.ts | 0 .../src/matrix/monitor/room-info.test.ts | 0 .../matrix/src/matrix/monitor/room-info.ts | 0 .../matrix/src/matrix/monitor/rooms.test.ts | 0 .../matrix/src/matrix/monitor/rooms.ts | 0 .../matrix/src/matrix/monitor/route.test.ts | 2 +- .../matrix/src/matrix/monitor/route.ts | 0 .../monitor/startup-verification.test.ts | 0 .../matrix/monitor/startup-verification.ts | 0 .../matrix/src/matrix/monitor/startup.test.ts | 0 .../matrix/src/matrix/monitor/startup.ts | 0 .../src/matrix/monitor/thread-context.test.ts | 0 .../src/matrix/monitor/thread-context.ts | 0 .../matrix/src/matrix/monitor/threads.ts | 0 .../matrix/src/matrix/monitor/types.ts | 0 .../src/matrix/monitor/verification-events.ts | 0 .../matrix/monitor/verification-utils.test.ts | 0 .../src/matrix/monitor/verification-utils.ts | 0 .../matrix/src/matrix/poll-summary.ts | 0 .../matrix/src/matrix/poll-types.test.ts | 0 .../matrix/src/matrix/poll-types.ts | 0 .../matrix/src/matrix/probe.test.ts | 0 .../matrix/src/matrix/probe.ts | 0 .../matrix/src/matrix/profile.test.ts | 0 .../matrix/src/matrix/profile.ts | 0 .../matrix/src/matrix/reaction-common.test.ts | 0 .../matrix/src/matrix/reaction-common.ts | 0 .../matrix/src/matrix/sdk.test.ts | 0 .../matrix/src/matrix/sdk.ts | 0 .../src/matrix/sdk/crypto-bootstrap.test.ts | 0 .../matrix/src/matrix/sdk/crypto-bootstrap.ts | 0 .../src/matrix/sdk/crypto-facade.test.ts | 0 .../matrix/src/matrix/sdk/crypto-facade.ts | 0 .../src/matrix/sdk/crypto-node.runtime.ts | 0 .../matrix/src/matrix/sdk/decrypt-bridge.ts | 0 .../src/matrix/sdk/event-helpers.test.ts | 0 .../matrix/src/matrix/sdk/event-helpers.ts | 0 .../matrix/src/matrix/sdk/http-client.test.ts | 0 .../matrix/src/matrix/sdk/http-client.ts | 0 .../src/matrix/sdk/idb-persistence.test.ts | 0 .../matrix/src/matrix/sdk/idb-persistence.ts | 0 .../matrix/src/matrix/sdk/logger.test.ts | 0 .../matrix/src/matrix/sdk/logger.ts | 0 .../matrix/sdk/read-response-with-limit.ts | 0 .../src/matrix/sdk/recovery-key-store.test.ts | 0 .../src/matrix/sdk/recovery-key-store.ts | 0 .../matrix/src/matrix/sdk/transport.test.ts | 0 .../matrix/src/matrix/sdk/transport.ts | 0 .../matrix/src/matrix/sdk/types.ts | 0 .../matrix/sdk/verification-manager.test.ts | 0 .../src/matrix/sdk/verification-manager.ts | 0 .../src/matrix/sdk/verification-status.ts | 0 .../matrix/src/matrix/send.test.ts | 0 .../matrix/src/matrix/send.ts | 0 .../matrix/src/matrix/send/client.test.ts | 0 .../matrix/src/matrix/send/client.ts | 0 .../matrix/src/matrix/send/formatting.ts | 0 .../matrix/src/matrix/send/media.ts | 0 .../matrix/src/matrix/send/targets.test.ts | 0 .../matrix/src/matrix/send/targets.ts | 0 .../matrix/src/matrix/send/types.ts | 0 .../matrix/src/matrix/target-ids.ts | 0 .../src/matrix/thread-bindings-shared.ts | 0 .../matrix/src/matrix/thread-bindings.test.ts | 0 .../matrix/src/matrix/thread-bindings.ts | 0 .../matrix/src/onboarding.resolve.test.ts | 0 .../matrix/src/onboarding.test.ts | 0 .../matrix/src/onboarding.ts | 0 .../matrix/src/outbound.test.ts | 0 .../matrix/src/outbound.ts | 0 .../matrix/src/plugin-entry.runtime.ts | 0 .../matrix/src/profile-update.ts | 0 .../matrix/src/resolve-targets.test.ts | 0 .../matrix/src/resolve-targets.ts | 0 .../matrix/src/runtime-api.ts | 0 .../matrix/src/runtime.ts | 0 .../matrix/src/session-route.ts | 0 .../matrix/src/setup-bootstrap.ts | 0 .../matrix/src/setup-config.ts | 0 .../matrix/src/setup-core.test.ts | 0 .../matrix/src/setup-core.ts | 0 .../matrix/src/setup-surface.ts | 0 .../matrix/src/storage-paths.ts | 0 .../matrix/src/test-mocks.ts | 0 .../matrix/src/tool-actions.runtime.ts | 0 .../matrix/src/tool-actions.test.ts | 0 .../matrix/src/tool-actions.ts | 0 .../matrix/src/types.ts | 0 .../matrix/thread-bindings-runtime.ts | 0 .../mattermost/api.ts | 0 .../mattermost/index.test.ts | 2 +- .../mattermost/index.ts | 0 .../mattermost/openclaw.plugin.json | 0 .../mattermost/package.json | 4 +- .../mattermost/runtime-api.ts | 0 .../mattermost/setup-entry.ts | 0 .../mattermost/src/channel.test.ts | 0 .../mattermost/src/channel.ts | 2 +- .../mattermost/src/config-schema.test.ts | 0 .../mattermost/src/config-schema.ts | 2 +- .../mattermost/src/group-mentions.test.ts | 0 .../mattermost/src/group-mentions.ts | 0 .../src/mattermost/accounts.test.ts | 0 .../mattermost/src/mattermost/accounts.ts | 0 .../src/mattermost/client.retry.test.ts | 0 .../mattermost/src/mattermost/client.test.ts | 0 .../mattermost/src/mattermost/client.ts | 0 .../mattermost/src/mattermost/directory.ts | 0 .../mattermost/src/mattermost/index.ts | 0 .../src/mattermost/interactions.test.ts | 0 .../mattermost/src/mattermost/interactions.ts | 0 .../src/mattermost/model-picker.test.ts | 0 .../mattermost/src/mattermost/model-picker.ts | 0 .../mattermost/src/mattermost/monitor-auth.ts | 0 .../src/mattermost/monitor-gating.ts | 0 .../src/mattermost/monitor-helpers.test.ts | 0 .../src/mattermost/monitor-helpers.ts | 0 .../src/mattermost/monitor-onchar.ts | 0 .../src/mattermost/monitor-resources.ts | 0 .../src/mattermost/monitor-slash.ts | 0 .../src/mattermost/monitor-websocket.test.ts | 0 .../src/mattermost/monitor-websocket.ts | 0 .../src/mattermost/monitor.authz.test.ts | 0 .../mattermost/monitor.channel-kind.test.ts | 0 .../mattermost/src/mattermost/monitor.test.ts | 0 .../mattermost/src/mattermost/monitor.ts | 0 .../mattermost/src/mattermost/probe.test.ts | 0 .../mattermost/src/mattermost/probe.ts | 0 .../src/mattermost/reactions.test-helpers.ts | 0 .../src/mattermost/reactions.test.ts | 0 .../mattermost/src/mattermost/reactions.ts | 0 .../src/mattermost/reconnect.test.ts | 0 .../mattermost/src/mattermost/reconnect.ts | 0 .../src/mattermost/reply-delivery.test.ts | 0 .../src/mattermost/reply-delivery.ts | 0 .../mattermost/src/mattermost/runtime-api.ts | 0 .../mattermost/src/mattermost/send.test.ts | 2 +- .../mattermost/src/mattermost/send.ts | 0 .../src/mattermost/slash-commands.test.ts | 0 .../src/mattermost/slash-commands.ts | 0 .../src/mattermost/slash-http.test.ts | 0 .../mattermost/src/mattermost/slash-http.ts | 0 .../src/mattermost/slash-state.test.ts | 0 .../mattermost/src/mattermost/slash-state.ts | 0 .../src/mattermost/target-resolution.ts | 0 .../mattermost/src/normalize.test.ts | 0 .../mattermost/src/normalize.ts | 0 .../mattermost/src/runtime-api.ts | 0 .../mattermost/src/runtime.ts | 0 .../mattermost/src/secret-input.ts | 0 .../mattermost/src/session-route.ts | 0 .../mattermost/src/setup-core.ts | 0 .../mattermost/src/setup-status.test.ts | 0 .../mattermost/src/setup-surface.ts | 0 .../mattermost/src/types.ts | 0 .../memory-core/index.ts | 0 .../memory-core/openclaw.plugin.json | 0 .../memory-core/package.json | 2 +- .../memory-lancedb/api.ts | 0 .../memory-lancedb/config.ts | 0 .../memory-lancedb/index.test.ts | 0 .../memory-lancedb/index.ts | 0 .../memory-lancedb/openclaw.plugin.json | 0 .../memory-lancedb/package.json | 4 +- .../microsoft/index.ts | 0 .../microsoft/openclaw.plugin.json | 0 .../microsoft/package.json | 2 +- .../minimax/README.md | 0 .../minimax/index.ts | 0 .../minimax/media-understanding-provider.ts | 0 .../minimax/model-definitions.test.ts | 0 .../minimax/model-definitions.ts | 0 .../minimax/oauth.runtime.ts | 0 .../minimax/oauth.ts | 0 .../minimax/onboard.ts | 0 .../minimax/openclaw.plugin.json | 0 .../minimax/package.json | 2 +- .../minimax/provider-catalog.ts | 0 .../mistral/index.ts | 0 .../mistral/media-understanding-provider.ts | 0 .../mistral/model-definitions.ts | 0 .../mistral/onboard.ts | 0 .../mistral/openclaw.plugin.json | 0 .../mistral/package.json | 2 +- .../modelstudio/index.ts | 0 .../modelstudio/model-definitions.ts | 0 .../modelstudio/onboard.ts | 0 .../modelstudio/openclaw.plugin.json | 0 .../modelstudio/package.json | 2 +- .../modelstudio/provider-catalog.ts | 0 .../moonshot/index.ts | 0 .../moonshot/media-understanding-provider.ts | 0 .../moonshot/onboard.ts | 0 .../moonshot/openclaw.plugin.json | 0 .../moonshot/package.json | 2 +- .../moonshot/provider-catalog.ts | 0 .../moonshot/src/kimi-web-search-provider.ts | 0 .../msteams/CHANGELOG.md | 0 {extensions => native-plugins}/msteams/api.ts | 0 .../msteams/index.ts | 0 .../msteams/openclaw.plugin.json | 0 .../msteams/package.json | 4 +- .../msteams/runtime-api.ts | 0 .../msteams/setup-entry.ts | 0 .../msteams/src/attachments.test.ts | 2 +- .../msteams/src/attachments.ts | 0 .../msteams/src/attachments/download.ts | 0 .../msteams/src/attachments/graph.ts | 0 .../msteams/src/attachments/html.ts | 0 .../msteams/src/attachments/payload.ts | 0 .../msteams/src/attachments/remote-media.ts | 0 .../msteams/src/attachments/shared.test.ts | 0 .../msteams/src/attachments/shared.ts | 0 .../msteams/src/attachments/types.ts | 0 .../msteams/src/channel.directory.test.ts | 2 +- .../msteams/src/channel.runtime.ts | 0 .../msteams/src/channel.ts | 0 .../msteams/src/config-schema.ts | 0 .../msteams/src/conversation-store-fs.test.ts | 0 .../msteams/src/conversation-store-fs.ts | 0 .../msteams/src/conversation-store-memory.ts | 0 .../msteams/src/conversation-store.ts | 0 .../msteams/src/directory-live.ts | 0 .../msteams/src/errors.test.ts | 0 .../msteams/src/errors.ts | 0 .../msteams/src/file-consent-helpers.test.ts | 0 .../msteams/src/file-consent-helpers.ts | 0 .../msteams/src/file-consent.ts | 0 .../msteams/src/file-lock.ts | 0 .../msteams/src/graph-chat.ts | 0 .../msteams/src/graph-upload.test.ts | 2 +- .../msteams/src/graph-upload.ts | 0 .../msteams/src/graph-users.test.ts | 0 .../msteams/src/graph-users.ts | 0 .../msteams/src/graph.ts | 0 .../msteams/src/inbound.test.ts | 0 .../msteams/src/inbound.ts | 0 .../msteams/src/index.ts | 0 .../msteams/src/media-helpers.test.ts | 0 .../msteams/src/media-helpers.ts | 0 .../msteams/src/mentions.test.ts | 0 .../msteams/src/mentions.ts | 0 .../msteams/src/messenger.test.ts | 2 +- .../msteams/src/messenger.ts | 0 .../src/monitor-handler.file-consent.test.ts | 0 .../msteams/src/monitor-handler.ts | 0 .../src/monitor-handler/inbound-media.ts | 0 .../message-handler.authz.test.ts | 0 .../src/monitor-handler/message-handler.ts | 0 .../msteams/src/monitor-types.ts | 0 .../msteams/src/monitor.lifecycle.test.ts | 0 .../msteams/src/monitor.test.ts | 0 .../msteams/src/monitor.ts | 0 .../msteams/src/outbound.test.ts | 0 .../msteams/src/outbound.ts | 0 .../msteams/src/pending-uploads.ts | 0 .../msteams/src/policy.test.ts | 0 .../msteams/src/policy.ts | 0 .../msteams/src/polls-store-memory.ts | 0 .../msteams/src/polls-store.test.ts | 0 .../msteams/src/polls.test.ts | 0 .../msteams/src/polls.ts | 0 .../msteams/src/probe.test.ts | 0 .../msteams/src/probe.ts | 0 .../msteams/src/reply-dispatcher.ts | 0 .../msteams/src/resolve-allowlist.test.ts | 0 .../msteams/src/resolve-allowlist.ts | 0 .../msteams/src/revoked-context.test.ts | 0 .../msteams/src/revoked-context.ts | 0 .../msteams/src/runtime.ts | 0 .../msteams/src/sdk-types.ts | 0 .../msteams/src/sdk.ts | 0 .../msteams/src/secret-input.ts | 0 .../msteams/src/send-context.ts | 0 .../msteams/src/send.test.ts | 0 .../msteams/src/send.ts | 0 .../msteams/src/sent-message-cache.test.ts | 0 .../msteams/src/sent-message-cache.ts | 0 .../msteams/src/session-route.ts | 0 .../msteams/src/setup-core.ts | 0 .../msteams/src/setup-surface.ts | 0 .../msteams/src/storage.ts | 0 .../msteams/src/store-fs.ts | 0 .../msteams/src/test-runtime.ts | 0 .../msteams/src/token-response.test.ts | 0 .../msteams/src/token-response.ts | 0 .../msteams/src/token.test.ts | 0 .../msteams/src/token.ts | 0 .../nextcloud-talk/api.ts | 0 .../nextcloud-talk/index.ts | 0 .../nextcloud-talk/openclaw.plugin.json | 0 .../nextcloud-talk/package.json | 4 +- .../nextcloud-talk/runtime-api.ts | 0 .../nextcloud-talk/setup-entry.ts | 0 .../nextcloud-talk/src/accounts.test.ts | 0 .../nextcloud-talk/src/accounts.ts | 0 .../src/channel.startup.test.ts | 4 +- .../nextcloud-talk/src/channel.ts | 2 +- .../nextcloud-talk/src/config-schema.test.ts | 0 .../nextcloud-talk/src/config-schema.ts | 2 +- .../nextcloud-talk/src/format.ts | 0 .../nextcloud-talk/src/inbound.authz.test.ts | 0 .../nextcloud-talk/src/inbound.ts | 0 .../src/monitor.auth-order.test.ts | 0 .../src/monitor.backend.test.ts | 0 .../src/monitor.read-body.test.ts | 0 .../nextcloud-talk/src/monitor.replay.test.ts | 0 .../src/monitor.test-fixtures.ts | 0 .../src/monitor.test-harness.ts | 0 .../nextcloud-talk/src/monitor.ts | 2 +- .../nextcloud-talk/src/normalize.test.ts | 0 .../nextcloud-talk/src/normalize.ts | 0 .../nextcloud-talk/src/policy.test.ts | 0 .../nextcloud-talk/src/policy.ts | 0 .../nextcloud-talk/src/replay-guard.test.ts | 0 .../nextcloud-talk/src/replay-guard.ts | 0 .../nextcloud-talk/src/room-info.ts | 0 .../nextcloud-talk/src/runtime.ts | 0 .../nextcloud-talk/src/secret-input.ts | 0 .../nextcloud-talk/src/send.test.ts | 2 +- .../nextcloud-talk/src/send.ts | 0 .../nextcloud-talk/src/session-route.ts | 0 .../nextcloud-talk/src/setup-core.ts | 0 .../nextcloud-talk/src/setup-surface.test.ts | 0 .../nextcloud-talk/src/setup-surface.ts | 0 .../nextcloud-talk/src/signature.ts | 0 .../nextcloud-talk/src/types.ts | 0 .../nostr/CHANGELOG.md | 0 .../nostr/README.md | 0 {extensions => native-plugins}/nostr/api.ts | 0 {extensions => native-plugins}/nostr/index.ts | 0 .../nostr/openclaw.plugin.json | 0 .../nostr/package.json | 4 +- .../nostr/runtime-api.ts | 0 .../nostr/setup-api.ts | 0 .../nostr/setup-entry.ts | 0 .../nostr/src/channel.outbound.test.ts | 2 +- .../nostr/src/channel.test.ts | 0 .../nostr/src/channel.ts | 2 +- .../nostr/src/config-schema.ts | 0 .../nostr/src/default-relays.ts | 0 .../nostr/src/metrics.ts | 0 .../nostr/src/nostr-bus.fuzz.test.ts | 0 .../nostr/src/nostr-bus.integration.test.ts | 0 .../nostr/src/nostr-bus.test.ts | 0 .../nostr/src/nostr-bus.ts | 0 .../nostr/src/nostr-profile-http.test.ts | 0 .../nostr/src/nostr-profile-http.ts | 0 .../nostr/src/nostr-profile-import.test.ts | 0 .../nostr/src/nostr-profile-import.ts | 0 .../nostr/src/nostr-profile.fuzz.test.ts | 0 .../nostr/src/nostr-profile.test.ts | 0 .../nostr/src/nostr-profile.ts | 0 .../nostr/src/nostr-state-store.test.ts | 0 .../nostr/src/nostr-state-store.ts | 0 .../nostr/src/runtime.ts | 0 .../nostr/src/seen-tracker.ts | 0 .../nostr/src/session-route.ts | 0 .../nostr/src/setup-surface.test.ts | 4 +- .../nostr/src/setup-surface.ts | 0 .../nostr/src/types.test.ts | 0 .../nostr/src/types.ts | 0 .../nostr/test/setup.ts | 0 .../nvidia/index.ts | 0 .../nvidia/openclaw.plugin.json | 0 .../nvidia/package.json | 2 +- .../nvidia/provider-catalog.ts | 0 .../ollama/README.md | 0 .../ollama/index.test.ts | 2 +- .../ollama/index.ts | 0 .../ollama/openclaw.plugin.json | 0 .../ollama/package.json | 2 +- .../open-prose/README.md | 0 .../open-prose/index.ts | 0 .../open-prose/openclaw.plugin.json | 0 .../open-prose/package.json | 2 +- .../open-prose/runtime-api.ts | 0 .../open-prose/skills/prose/LICENSE | 0 .../open-prose/skills/prose/SKILL.md | 0 .../open-prose/skills/prose/alt-borges.md | 0 .../skills/prose/alts/arabian-nights.md | 0 .../open-prose/skills/prose/alts/borges.md | 0 .../open-prose/skills/prose/alts/folk.md | 0 .../open-prose/skills/prose/alts/homer.md | 0 .../open-prose/skills/prose/alts/kafka.md | 0 .../skills/prose/alts/shared-appendix.md | 0 .../open-prose/skills/prose/compiler.md | 0 .../prose/examples/01-hello-world.prose | 0 .../examples/02-research-and-summarize.prose | 0 .../prose/examples/03-code-review.prose | 0 .../prose/examples/04-write-and-refine.prose | 0 .../prose/examples/05-debug-issue.prose | 0 .../prose/examples/06-explain-codebase.prose | 0 .../skills/prose/examples/07-refactor.prose | 0 .../skills/prose/examples/08-blog-post.prose | 0 .../examples/09-research-with-agents.prose | 0 .../examples/10-code-review-agents.prose | 0 .../examples/11-skills-and-imports.prose | 0 .../12-secure-agent-permissions.prose | 0 .../examples/13-variables-and-context.prose | 0 .../examples/14-composition-blocks.prose | 0 .../prose/examples/15-inline-sequences.prose | 0 .../prose/examples/16-parallel-reviews.prose | 0 .../prose/examples/17-parallel-research.prose | 0 .../18-mixed-parallel-sequential.prose | 0 .../prose/examples/19-advanced-parallel.prose | 0 .../prose/examples/20-fixed-loops.prose | 0 .../examples/21-pipeline-operations.prose | 0 .../prose/examples/22-error-handling.prose | 0 .../examples/23-retry-with-backoff.prose | 0 .../prose/examples/24-choice-blocks.prose | 0 .../prose/examples/25-conditionals.prose | 0 .../examples/26-parameterized-blocks.prose | 0 .../examples/27-string-interpolation.prose | 0 .../examples/28-automated-pr-review.prose | 0 .../skills/prose/examples/28-gas-town.prose | 0 .../prose/examples/29-captains-chair.prose | 0 .../examples/30-captains-chair-simple.prose | 0 .../31-captains-chair-with-memory.prose | 0 .../prose/examples/33-pr-review-autofix.prose | 0 .../prose/examples/34-content-pipeline.prose | 0 .../prose/examples/35-feature-factory.prose | 0 .../skills/prose/examples/36-bug-hunter.prose | 0 .../skills/prose/examples/37-the-forge.prose | 0 .../skills/prose/examples/38-skill-scan.prose | 0 .../examples/39-architect-by-simulation.prose | 0 .../prose/examples/40-rlm-self-refine.prose | 0 .../examples/41-rlm-divide-conquer.prose | 0 .../examples/42-rlm-filter-recurse.prose | 0 .../prose/examples/43-rlm-pairwise.prose | 0 .../examples/44-run-endpoint-ux-test.prose | 0 .../prose/examples/45-plugin-release.prose | 0 ...un-endpoint-ux-test-with-remediation.prose | 0 .../46-run-endpoint-ux-test-fast.prose | 0 .../examples/46-workflow-crystallizer.prose | 0 .../47-language-self-improvement.prose | 0 .../prose/examples/48-habit-miner.prose | 0 .../examples/49-prose-run-retrospective.prose | 0 .../skills/prose/examples/README.md | 0 .../skills/prose/examples/roadmap/README.md | 0 .../roadmap/iterative-refinement.prose | 0 .../examples/roadmap/parallel-review.prose | 0 .../examples/roadmap/simple-pipeline.prose | 0 .../roadmap/syntax/open-prose-syntax.prose | 0 .../skills/prose/guidance/antipatterns.md | 0 .../skills/prose/guidance/patterns.md | 0 .../skills/prose/guidance/system-prompt.md | 0 .../open-prose/skills/prose/help.md | 0 .../open-prose/skills/prose/lib/README.md | 0 .../skills/prose/lib/calibrator.prose | 0 .../skills/prose/lib/cost-analyzer.prose | 0 .../skills/prose/lib/error-forensics.prose | 0 .../skills/prose/lib/inspector.prose | 0 .../skills/prose/lib/profiler.prose | 0 .../skills/prose/lib/program-improver.prose | 0 .../skills/prose/lib/project-memory.prose | 0 .../skills/prose/lib/user-memory.prose | 0 .../skills/prose/lib/vm-improver.prose | 0 .../skills/prose/primitives/session.md | 0 .../open-prose/skills/prose/prose.md | 0 .../skills/prose/state/filesystem.md | 0 .../skills/prose/state/in-context.md | 0 .../open-prose/skills/prose/state/postgres.md | 0 .../open-prose/skills/prose/state/sqlite.md | 0 .../openai/index.ts | 0 .../openai/media-understanding-provider.ts | 0 .../openai/openai-codex-catalog.ts | 0 .../openai/openai-codex-provider.runtime.ts | 0 .../openai/openai-codex-provider.ts | 0 .../openai/openai-provider.test.ts | 0 .../openai/openai-provider.ts | 0 .../openai/openclaw.plugin.json | 0 .../openai/package.json | 2 +- .../openai/shared.ts | 0 .../opencode-go/index.ts | 0 .../opencode-go/onboard.ts | 0 .../opencode-go/openclaw.plugin.json | 0 .../opencode-go/package.json | 2 +- .../opencode/index.ts | 0 .../opencode/onboard.ts | 0 .../opencode/openclaw.plugin.json | 0 .../opencode/package.json | 2 +- .../openrouter/index.ts | 0 .../openrouter/onboard.ts | 0 .../openrouter/openclaw.plugin.json | 0 .../openrouter/package.json | 2 +- .../openrouter/provider-catalog.ts | 0 .../openshell/index.ts | 0 .../openshell/openclaw.plugin.json | 0 .../openshell/package.json | 2 +- .../openshell/src/backend.test.ts | 0 .../openshell/src/backend.ts | 0 .../openshell/src/cli.test.ts | 0 .../openshell/src/cli.ts | 0 .../openshell/src/config.test.ts | 0 .../openshell/src/config.ts | 0 .../openshell/src/fs-bridge.test.ts | 0 .../openshell/src/fs-bridge.ts | 0 .../openshell/src/mirror.ts | 0 .../openshell/src/remote-fs-bridge.test.ts | 0 .../openshell/src/remote-fs-bridge.ts | 0 .../perplexity/index.ts | 0 .../perplexity/openclaw.plugin.json | 0 .../perplexity/package.json | 2 +- .../src/perplexity-web-search-provider.ts | 0 .../perplexity/web-search-provider.ts | 0 .../phone-control/index.test.ts | 2 +- .../phone-control/index.ts | 0 .../phone-control/openclaw.plugin.json | 0 .../phone-control/runtime-api.ts | 0 .../qianfan/index.ts | 0 .../qianfan/onboard.ts | 0 .../qianfan/openclaw.plugin.json | 0 .../qianfan/package.json | 2 +- .../qianfan/provider-catalog.ts | 0 .../qwen-portal-auth/README.md | 0 .../qwen-portal-auth/index.ts | 0 .../qwen-portal-auth/oauth.runtime.ts | 0 .../qwen-portal-auth/oauth.ts | 0 .../qwen-portal-auth/openclaw.plugin.json | 0 .../qwen-portal-auth/provider-catalog.ts | 0 .../qwen-portal-auth/runtime-api.ts | 0 .../sglang/README.md | 0 .../sglang/index.ts | 0 .../sglang/openclaw.plugin.json | 0 .../sglang/package.json | 2 +- .../shared/channel-status-summary.ts | 0 .../shared/config-schema-helpers.ts | 0 .../shared/deferred.ts | 0 .../shared/passive-monitor.ts | 0 .../shared/resolve-target-test-helpers.ts | 0 .../shared/runtime.ts | 0 .../shared/status-issues.ts | 0 .../shared/windows-cmd-shim-test-fixtures.ts | 0 {extensions => native-plugins}/signal/api.ts | 0 .../signal/index.ts | 0 .../signal/openclaw.plugin.json | 0 .../signal/package.json | 2 +- .../signal/runtime-api.ts | 0 .../signal/setup-entry.ts | 0 .../signal/src/accounts.ts | 0 .../signal/src/channel.outbound.test.ts | 0 .../signal/src/channel.runtime.ts | 0 .../signal/src/channel.setup.ts | 0 .../signal/src/channel.test.ts | 0 .../signal/src/channel.ts | 0 .../signal/src/client.test.ts | 0 .../signal/src/client.ts | 0 .../signal/src/config-schema.ts | 0 .../signal/src/daemon.ts | 0 .../signal/src/format.chunking.test.ts | 0 .../signal/src/format.links.test.ts | 0 .../signal/src/format.test.ts | 0 .../signal/src/format.ts | 0 .../signal/src/format.visual.test.ts | 0 .../signal/src/identity.test.ts | 0 .../signal/src/identity.ts | 0 .../signal/src/index.ts | 0 .../signal/src/message-actions.ts | 0 .../signal/src/monitor.test.ts | 0 ...-only-senders-uuid-allowlist-entry.test.ts | 0 ...ends-tool-summaries-responseprefix.test.ts | 0 .../src/monitor.tool-result.test-harness.ts | 0 .../signal/src/monitor.ts | 0 .../signal/src/monitor/access-policy.test.ts | 0 .../signal/src/monitor/access-policy.ts | 0 .../event-handler.inbound-context.test.ts | 0 .../event-handler.mention-gating.test.ts | 0 .../src/monitor/event-handler.test-harness.ts | 0 .../signal/src/monitor/event-handler.ts | 0 .../signal/src/monitor/event-handler.types.ts | 0 .../signal/src/monitor/mentions.ts | 0 .../signal/src/outbound-adapter.ts | 0 .../signal/src/plugin-shared.ts | 0 .../signal/src/probe.test.ts | 0 .../signal/src/probe.ts | 0 .../signal/src/reaction-level.ts | 0 .../signal/src/rpc-context.ts | 0 .../signal/src/runtime-api.ts | 0 .../signal/src/runtime.ts | 0 .../signal/src/send-reactions.test.ts | 0 .../signal/src/send-reactions.ts | 0 .../signal/src/send.ts | 0 .../signal/src/setup-allow-from.test.ts | 0 .../signal/src/setup-core.ts | 0 .../signal/src/setup-surface.ts | 0 .../signal/src/shared.ts | 0 .../signal/src/sse-reconnect.ts | 0 {extensions => native-plugins}/slack/api.ts | 0 {extensions => native-plugins}/slack/index.ts | 0 .../slack/openclaw.plugin.json | 0 .../slack/package.json | 2 +- .../slack/runtime-api.ts | 0 .../slack/setup-entry.ts | 0 .../slack/src/account-inspect.ts | 0 .../slack/src/account-surface-fields.ts | 0 .../slack/src/accounts.test.ts | 0 .../slack/src/accounts.ts | 0 .../slack/src/action-runtime.test.ts | 0 .../slack/src/action-runtime.ts | 0 .../slack/src/actions.blocks.test.ts | 0 .../slack/src/actions.download-file.test.ts | 0 .../slack/src/actions.read.test.ts | 0 .../slack/src/actions.ts | 0 .../slack/src/blocks-fallback.test.ts | 0 .../slack/src/blocks-fallback.ts | 0 .../slack/src/blocks-input.test.ts | 0 .../slack/src/blocks-input.ts | 0 .../slack/src/blocks-render.ts | 0 .../slack/src/blocks.test-helpers.ts | 0 .../slack/src/channel-actions.ts | 0 .../slack/src/channel-migration.test.ts | 0 .../slack/src/channel-migration.ts | 0 .../slack/src/channel.runtime.ts | 0 .../slack/src/channel.setup.ts | 0 .../slack/src/channel.test.ts | 2 +- .../slack/src/channel.ts | 2 +- .../slack/src/client.test.ts | 0 .../slack/src/client.ts | 0 .../slack/src/config-schema.ts | 0 .../slack/src/directory-config.ts | 0 .../slack/src/directory-live.ts | 0 .../slack/src/draft-stream.test.ts | 0 .../slack/src/draft-stream.ts | 0 .../slack/src/format.test.ts | 0 .../slack/src/format.ts | 0 .../slack/src/group-policy.test.ts | 0 .../slack/src/group-policy.ts | 0 .../slack/src/http/index.ts | 0 .../slack/src/http/registry.test.ts | 0 .../slack/src/http/registry.ts | 0 .../slack/src/index.ts | 0 .../slack/src/interactive-replies.test.ts | 0 .../slack/src/interactive-replies.ts | 0 .../slack/src/message-action-dispatch.test.ts | 0 .../slack/src/message-action-dispatch.ts | 0 .../slack/src/message-actions.test.ts | 0 .../slack/src/message-actions.ts | 0 .../slack/src/message-tool-schema.ts | 0 .../slack/src/modal-metadata.test.ts | 0 .../slack/src/modal-metadata.ts | 0 .../slack/src/monitor.test-helpers.ts | 0 .../slack/src/monitor.test.ts | 0 ...onitor.threading.missing-thread-ts.test.ts | 0 .../slack/src/monitor.tool-result.test.ts | 0 .../slack/src/monitor.ts | 0 .../slack/src/monitor/allow-list.test.ts | 0 .../slack/src/monitor/allow-list.ts | 0 .../slack/src/monitor/auth.test.ts | 0 .../slack/src/monitor/auth.ts | 0 .../slack/src/monitor/channel-config.ts | 0 .../slack/src/monitor/channel-type.ts | 0 .../slack/src/monitor/commands.ts | 0 .../slack/src/monitor/context.test.ts | 0 .../slack/src/monitor/context.ts | 0 .../slack/src/monitor/dm-auth.ts | 0 .../slack/src/monitor/events.ts | 0 .../slack/src/monitor/events/channels.test.ts | 0 .../slack/src/monitor/events/channels.ts | 0 .../events/interactions.block-actions.ts | 0 .../src/monitor/events/interactions.modal.ts | 0 .../src/monitor/events/interactions.test.ts | 0 .../slack/src/monitor/events/interactions.ts | 0 .../slack/src/monitor/events/members.test.ts | 0 .../slack/src/monitor/events/members.ts | 0 .../events/message-subtype-handlers.test.ts | 0 .../events/message-subtype-handlers.ts | 0 .../slack/src/monitor/events/messages.test.ts | 0 .../slack/src/monitor/events/messages.ts | 0 .../slack/src/monitor/events/pins.test.ts | 0 .../slack/src/monitor/events/pins.ts | 0 .../src/monitor/events/reactions.test.ts | 0 .../slack/src/monitor/events/reactions.ts | 0 .../monitor/events/system-event-context.ts | 0 .../events/system-event-test-harness.ts | 0 .../src/monitor/external-arg-menu-store.ts | 0 .../slack/src/monitor/media.test.ts | 2 +- .../slack/src/monitor/media.ts | 0 .../message-handler.app-mention-race.test.ts | 0 .../message-handler.debounce-key.test.ts | 0 .../slack/src/monitor/message-handler.test.ts | 0 .../slack/src/monitor/message-handler.ts | 0 .../dispatch.streaming.test.ts | 0 .../src/monitor/message-handler/dispatch.ts | 0 .../message-handler/prepare-content.ts | 0 .../message-handler/prepare-thread-context.ts | 0 .../message-handler/prepare.test-helpers.ts | 0 .../monitor/message-handler/prepare.test.ts | 0 .../prepare.thread-session-key.test.ts | 0 .../src/monitor/message-handler/prepare.ts | 0 .../src/monitor/message-handler/types.ts | 0 .../slack/src/monitor/monitor.test.ts | 0 .../slack/src/monitor/mrkdwn.ts | 0 .../slack/src/monitor/policy.ts | 0 .../src/monitor/provider.auth-errors.test.ts | 0 .../src/monitor/provider.interop.test.ts | 0 .../src/monitor/provider.reconnect.test.ts | 0 .../slack/src/monitor/provider.ts | 0 .../slack/src/monitor/reconnect-policy.ts | 0 .../slack/src/monitor/replies.test.ts | 0 .../slack/src/monitor/replies.ts | 0 .../slack/src/monitor/room-context.ts | 0 .../src/monitor/slash-commands.runtime.ts | 0 .../src/monitor/slash-dispatch.runtime.ts | 0 .../monitor/slash-skill-commands.runtime.ts | 0 .../slack/src/monitor/slash.test-harness.ts | 0 .../slack/src/monitor/slash.test.ts | 0 .../slack/src/monitor/slash.ts | 0 .../slack/src/monitor/thread-resolution.ts | 0 .../slack/src/monitor/types.ts | 0 .../slack/src/outbound-adapter.ts | 0 .../slack/src/plugin-shared.ts | 0 .../slack/src/probe.test.ts | 0 .../slack/src/probe.ts | 0 .../src/resolve-allowlist-common.test.ts | 0 .../slack/src/resolve-allowlist-common.ts | 0 .../slack/src/resolve-channels.test.ts | 0 .../slack/src/resolve-channels.ts | 0 .../slack/src/resolve-users.test.ts | 0 .../slack/src/resolve-users.ts | 0 .../slack/src/runtime-api.ts | 0 .../slack/src/runtime.ts | 0 .../slack/src/scopes.ts | 0 .../slack/src/send.blocks.test.ts | 0 .../slack/src/send.ts | 0 .../slack/src/send.upload.test.ts | 0 .../slack/src/sent-thread-cache.test.ts | 0 .../slack/src/sent-thread-cache.ts | 0 .../slack/src/setup-core.ts | 0 .../slack/src/setup-surface.ts | 0 .../slack/src/shared-interactive.test.ts | 0 .../slack/src/shared.ts | 0 .../slack/src/stream-mode.test.ts | 0 .../slack/src/stream-mode.ts | 0 .../slack/src/streaming.ts | 0 .../slack/src/targets.test.ts | 0 .../slack/src/targets.ts | 0 .../slack/src/threading-tool-context.test.ts | 0 .../slack/src/threading-tool-context.ts | 0 .../slack/src/threading.test.ts | 0 .../slack/src/threading.ts | 0 .../slack/src/token.ts | 0 .../slack/src/truncate.ts | 0 .../slack/src/types.ts | 0 .../synology-chat/api.ts | 0 .../synology-chat/index.ts | 0 .../synology-chat/openclaw.plugin.json | 0 .../synology-chat/package.json | 4 +- .../synology-chat/setup-api.ts | 0 .../synology-chat/setup-entry.ts | 0 .../synology-chat/src/accounts.test.ts | 0 .../synology-chat/src/accounts.ts | 0 .../src/channel.integration.test.ts | 0 .../synology-chat/src/channel.test-mocks.ts | 0 .../synology-chat/src/channel.test.ts | 0 .../synology-chat/src/channel.ts | 0 .../synology-chat/src/client.test.ts | 0 .../synology-chat/src/client.ts | 0 .../synology-chat/src/config-schema.ts | 0 .../synology-chat/src/runtime.ts | 0 .../synology-chat/src/security.test.ts | 0 .../synology-chat/src/security.ts | 0 .../synology-chat/src/setup-surface.test.ts | 4 +- .../synology-chat/src/setup-surface.ts | 0 .../synology-chat/src/test-http-utils.ts | 0 .../synology-chat/src/types.ts | 0 .../synology-chat/src/webhook-handler.test.ts | 0 .../synology-chat/src/webhook-handler.ts | 0 .../synthetic/index.ts | 0 .../synthetic/onboard.ts | 0 .../synthetic/openclaw.plugin.json | 0 .../synthetic/package.json | 2 +- .../synthetic/provider-catalog.ts | 0 .../talk-voice/api.ts | 0 .../talk-voice/index.test.ts | 4 +- .../talk-voice/index.ts | 0 .../talk-voice/openclaw.plugin.json | 0 .../tavily/index.test.ts | 0 .../tavily/index.ts | 0 .../tavily/openclaw.plugin.json | 0 .../tavily/package.json | 2 +- .../tavily/skills/tavily/SKILL.md | 0 .../tavily/src/config.ts | 0 .../tavily/src/tavily-client.ts | 0 .../tavily/src/tavily-extract-tool.test.ts | 0 .../tavily/src/tavily-extract-tool.ts | 0 .../tavily/src/tavily-search-provider.ts | 0 .../tavily/src/tavily-search-tool.ts | 0 .../telegram/api.ts | 0 .../telegram/index.ts | 0 .../telegram/openclaw.plugin.json | 0 .../telegram/package.json | 2 +- .../telegram/runtime-api.ts | 0 .../telegram/setup-entry.ts | 0 .../telegram/src/account-inspect.test.ts | 2 +- .../telegram/src/account-inspect.ts | 0 .../telegram/src/accounts.test.ts | 2 +- .../telegram/src/accounts.ts | 0 .../telegram/src/action-runtime.test.ts | 2 +- .../telegram/src/action-runtime.ts | 0 .../telegram/src/allow-from.test.ts | 0 .../telegram/src/allow-from.ts | 0 .../telegram/src/allowed-updates.ts | 0 .../telegram/src/api-fetch.test.ts | 0 .../telegram/src/api-fetch.ts | 0 .../telegram/src/api-logging.ts | 0 .../telegram/src/approval-buttons.test.ts | 0 .../telegram/src/approval-buttons.ts | 0 .../telegram/src/audit-membership-runtime.ts | 0 .../telegram/src/audit.test.ts | 0 .../telegram/src/audit.ts | 0 .../telegram/src/bot-access.test.ts | 0 .../telegram/src/bot-access.ts | 0 .../telegram/src/bot-deps.ts | 0 .../telegram/src/bot-handlers.buffers.ts | 0 .../telegram/src/bot-handlers.media.ts | 0 .../telegram/src/bot-handlers.runtime.ts | 0 .../telegram/src/bot-handlers.ts | 0 .../bot-message-context.acp-bindings.test.ts | 0 ...t-message-context.audio-transcript.test.ts | 0 .../telegram/src/bot-message-context.body.ts | 0 .../bot-message-context.dm-threads.test.ts | 0 ...-message-context.dm-topic-threadid.test.ts | 0 ...t-message-context.implicit-mention.test.ts | 0 ...t-message-context.named-account-dm.test.ts | 0 .../bot-message-context.sender-prefix.test.ts | 0 .../src/bot-message-context.session.ts | 0 .../src/bot-message-context.test-harness.ts | 0 ...bot-message-context.thread-binding.test.ts | 0 .../bot-message-context.topic-agentid.test.ts | 0 .../telegram/src/bot-message-context.ts | 0 .../telegram/src/bot-message-context.types.ts | 0 ...bot-message-dispatch.sticker-media.test.ts | 0 .../telegram/src/bot-message-dispatch.test.ts | 0 .../telegram/src/bot-message-dispatch.ts | 0 .../telegram/src/bot-message.test.ts | 0 .../telegram/src/bot-message.ts | 0 .../src/bot-native-command-menu.test.ts | 0 .../telegram/src/bot-native-command-menu.ts | 0 ...ot-native-commands.fixture-test-support.ts | 0 .../bot-native-commands.group-auth.test.ts | 0 .../bot-native-commands.menu-test-support.ts | 0 .../bot-native-commands.plugin-auth.test.ts | 0 .../src/bot-native-commands.registry.test.ts | 0 .../bot-native-commands.session-meta.test.ts | 0 ...t-native-commands.skills-allowlist.test.ts | 2 +- .../src/bot-native-commands.test-helpers.ts | 0 .../telegram/src/bot-native-commands.test.ts | 2 +- .../telegram/src/bot-native-commands.ts | 0 .../telegram/src/bot-updates.ts | 0 .../bot.create-telegram-bot.test-harness.ts | 0 .../src/bot.create-telegram-bot.test.ts | 4 +- .../telegram/src/bot.fetch-abort.test.ts | 0 .../telegram/src/bot.helpers.test.ts | 0 ...dia-file-path-no-file-download.e2e.test.ts | 0 .../telegram/src/bot.media.e2e-harness.ts | 0 ...t.media.stickers-and-fragments.e2e.test.ts | 0 .../telegram/src/bot.media.test-utils.ts | 0 .../telegram/src/bot.runtime.ts | 0 .../telegram/src/bot.test.ts | 0 .../telegram/src/bot.ts | 0 .../telegram/src/bot/delivery.replies.ts | 0 .../bot/delivery.resolve-media-retry.test.ts | 0 .../src/bot/delivery.resolve-media.ts | 0 .../telegram/src/bot/delivery.send.ts | 0 .../telegram/src/bot/delivery.test.ts | 0 .../telegram/src/bot/delivery.ts | 0 .../telegram/src/bot/helpers.test.ts | 0 .../telegram/src/bot/helpers.ts | 0 .../telegram/src/bot/reply-threading.ts | 0 .../telegram/src/bot/types.ts | 0 .../telegram/src/button-types.test.ts | 0 .../telegram/src/button-types.ts | 0 .../telegram/src/caption.ts | 0 .../telegram/src/channel-actions.test.ts | 0 .../telegram/src/channel-actions.ts | 0 .../telegram/src/channel.setup.ts | 0 .../telegram/src/channel.test.ts | 2 +- .../telegram/src/channel.ts | 0 .../telegram/src/config-schema.ts | 0 ...onversation-route.base-session-key.test.ts | 0 .../telegram/src/conversation-route.ts | 0 .../telegram/src/directory-config.ts | 0 .../telegram/src/dm-access.ts | 0 .../telegram/src/draft-chunking.test.ts | 0 .../telegram/src/draft-chunking.ts | 0 .../telegram/src/draft-stream.test-helpers.ts | 0 .../telegram/src/draft-stream.test.ts | 0 .../telegram/src/draft-stream.ts | 0 .../src/exec-approvals-handler.test.ts | 0 .../telegram/src/exec-approvals-handler.ts | 0 .../telegram/src/exec-approvals.test.ts | 0 .../telegram/src/exec-approvals.ts | 0 .../src/fetch.env-proxy-runtime.test.ts | 0 .../telegram/src/fetch.test.ts | 0 .../telegram/src/fetch.ts | 0 .../telegram/src/format.test.ts | 0 .../telegram/src/format.ts | 0 .../telegram/src/format.wrap-md.test.ts | 0 .../telegram/src/forum-service-message.ts | 0 .../src/group-access.base-access.test.ts | 0 .../src/group-access.policy-access.test.ts | 0 .../telegram/src/group-access.ts | 0 .../telegram/src/group-config-helpers.ts | 0 .../telegram/src/group-migration.test.ts | 0 .../telegram/src/group-migration.ts | 0 .../telegram/src/group-policy.test.ts | 0 .../telegram/src/group-policy.ts | 0 .../telegram/src/inline-buttons.test.ts | 0 .../telegram/src/inline-buttons.ts | 0 .../telegram/src/lane-delivery-state.ts | 0 .../src/lane-delivery-text-deliverer.ts | 0 .../telegram/src/lane-delivery.test.ts | 0 .../telegram/src/lane-delivery.ts | 0 .../src/media-understanding.runtime.ts | 0 .../telegram/src/message-tool-schema.ts | 0 .../telegram/src/model-buttons.test.ts | 0 .../telegram/src/model-buttons.ts | 0 .../telegram/src/monitor.test.ts | 0 .../telegram/src/monitor.ts | 0 .../telegram/src/network-config.test.ts | 0 .../telegram/src/network-config.ts | 0 .../telegram/src/network-errors.test.ts | 0 .../telegram/src/network-errors.ts | 0 .../telegram/src/normalize.ts | 0 .../telegram/src/outbound-adapter.ts | 0 .../telegram/src/outbound-params.ts | 0 .../telegram/src/polling-session.test.ts | 0 .../telegram/src/polling-session.ts | 0 .../telegram/src/probe.test.ts | 2 +- .../telegram/src/probe.ts | 0 .../telegram/src/proxy.test.ts | 0 .../telegram/src/proxy.ts | 0 .../telegram/src/reaction-level.test.ts | 0 .../telegram/src/reaction-level.ts | 0 .../src/reasoning-lane-coordinator.test.ts | 0 .../src/reasoning-lane-coordinator.ts | 0 .../telegram/src/runtime.ts | 0 .../telegram/src/send.proxy.test.ts | 0 .../telegram/src/send.test-harness.ts | 0 .../telegram/src/send.test.ts | 0 .../telegram/src/send.ts | 0 .../src/sendchataction-401-backoff.test.ts | 0 .../src/sendchataction-401-backoff.ts | 0 .../telegram/src/sent-message-cache.ts | 0 .../telegram/src/sequential-key.test.ts | 0 .../telegram/src/sequential-key.ts | 0 .../telegram/src/setup-core.ts | 0 .../telegram/src/setup-surface.test.ts | 0 .../telegram/src/setup-surface.ts | 0 .../telegram/src/shared.ts | 0 .../telegram/src/status-issues.ts | 0 .../src/status-reaction-variants.test.ts | 0 .../telegram/src/status-reaction-variants.ts | 0 .../telegram/src/sticker-cache.test.ts | 0 .../telegram/src/sticker-cache.ts | 0 .../telegram/src/target-writeback.test.ts | 0 .../telegram/src/target-writeback.ts | 0 .../telegram/src/targets.test.ts | 0 .../telegram/src/targets.ts | 0 .../telegram/src/thread-bindings.test.ts | 0 .../telegram/src/thread-bindings.ts | 0 .../telegram/src/token.test.ts | 0 .../telegram/src/token.ts | 0 .../telegram/src/update-offset-store.test.ts | 0 .../telegram/src/update-offset-store.ts | 0 .../telegram/src/voice.test.ts | 0 .../telegram/src/voice.ts | 0 .../telegram/src/webhook.test.ts | 0 .../telegram/src/webhook.ts | 0 .../thread-ownership/api.ts | 0 .../thread-ownership/index.test.ts | 0 .../thread-ownership/index.ts | 0 .../thread-ownership/openclaw.plugin.json | 0 {extensions => native-plugins}/tlon/README.md | 0 {extensions => native-plugins}/tlon/api.ts | 0 {extensions => native-plugins}/tlon/index.ts | 0 .../tlon/openclaw.plugin.json | 0 .../tlon/package.json | 4 +- .../tlon/setup-api.ts | 0 .../tlon/setup-entry.ts | 0 .../tlon/src/account-fields.ts | 0 .../tlon/src/channel.runtime.ts | 0 .../tlon/src/channel.test.ts | 0 .../tlon/src/channel.ts | 0 .../tlon/src/config-schema.test.ts | 0 .../tlon/src/config-schema.ts | 0 .../tlon/src/monitor/approval-runtime.ts | 0 .../tlon/src/monitor/approval.ts | 0 .../tlon/src/monitor/authorization.ts | 0 .../tlon/src/monitor/cites.ts | 0 .../tlon/src/monitor/discovery.ts | 0 .../tlon/src/monitor/history.ts | 0 .../tlon/src/monitor/index.ts | 0 .../tlon/src/monitor/media.ts | 0 .../src/monitor/processed-messages.test.ts | 0 .../tlon/src/monitor/processed-messages.ts | 0 .../tlon/src/monitor/settings-helpers.ts | 0 .../tlon/src/monitor/utils.ts | 0 .../tlon/src/runtime.ts | 0 .../tlon/src/security.test.ts | 0 .../tlon/src/session-route.ts | 0 .../tlon/src/settings.ts | 0 .../tlon/src/setup-core.ts | 0 .../tlon/src/setup-surface.test.ts | 4 +- .../tlon/src/setup-surface.ts | 0 .../tlon/src/targets.test.ts | 0 .../tlon/src/targets.ts | 0 .../tlon/src/tlon-api.ts | 0 .../tlon/src/types.ts | 0 .../tlon/src/urbit/auth.ssrf.test.ts | 0 .../tlon/src/urbit/auth.ts | 0 .../tlon/src/urbit/base-url.test.ts | 0 .../tlon/src/urbit/base-url.ts | 0 .../tlon/src/urbit/channel-ops.ts | 0 .../tlon/src/urbit/context.ts | 0 .../tlon/src/urbit/errors.ts | 0 .../tlon/src/urbit/fetch.ts | 0 .../tlon/src/urbit/foreigns.ts | 0 .../tlon/src/urbit/send.test.ts | 0 .../tlon/src/urbit/send.ts | 0 .../tlon/src/urbit/sse-client.test.ts | 0 .../tlon/src/urbit/sse-client.ts | 0 .../tlon/src/urbit/story.ts | 0 .../tlon/src/urbit/upload.test.ts | 0 .../tlon/src/urbit/upload.ts | 0 .../together/index.ts | 0 .../together/onboard.ts | 0 .../together/openclaw.plugin.json | 0 .../together/package.json | 2 +- .../together/provider-catalog.ts | 0 .../twitch/CHANGELOG.md | 0 .../twitch/README.md | 2 +- {extensions => native-plugins}/twitch/api.ts | 0 .../twitch/index.ts | 0 .../twitch/openclaw.plugin.json | 0 .../twitch/package.json | 2 +- .../twitch/runtime-api.ts | 0 .../twitch/src/access-control.test.ts | 0 .../twitch/src/access-control.ts | 0 .../twitch/src/actions.ts | 0 .../twitch/src/client-manager-registry.ts | 0 .../twitch/src/config-schema.ts | 0 .../twitch/src/config.test.ts | 0 .../twitch/src/config.ts | 0 .../twitch/src/monitor.ts | 0 .../twitch/src/outbound.test.ts | 0 .../twitch/src/outbound.ts | 0 .../twitch/src/plugin.test.ts | 0 .../twitch/src/plugin.ts | 2 +- .../twitch/src/probe.test.ts | 0 .../twitch/src/probe.ts | 0 .../twitch/src/resolver.ts | 0 .../twitch/src/runtime.ts | 0 .../twitch/src/send.test.ts | 0 .../twitch/src/send.ts | 0 .../twitch/src/setup-surface.test.ts | 0 .../twitch/src/setup-surface.ts | 0 .../twitch/src/status.test.ts | 0 .../twitch/src/status.ts | 0 .../twitch/src/test-fixtures.ts | 0 .../twitch/src/token.test.ts | 0 .../twitch/src/token.ts | 0 .../twitch/src/twitch-client.test.ts | 0 .../twitch/src/twitch-client.ts | 0 .../twitch/src/types.ts | 0 .../twitch/src/utils/markdown.ts | 0 .../twitch/src/utils/twitch.ts | 0 .../twitch/test/setup.ts | 0 .../venice/index.ts | 0 .../venice/onboard.ts | 0 .../venice/openclaw.plugin.json | 0 .../venice/package.json | 2 +- .../venice/provider-catalog.ts | 0 .../vercel-ai-gateway/index.ts | 0 .../vercel-ai-gateway/onboard.ts | 0 .../vercel-ai-gateway/openclaw.plugin.json | 0 .../vercel-ai-gateway/package.json | 2 +- .../vercel-ai-gateway/provider-catalog.ts | 0 {extensions => native-plugins}/vllm/README.md | 0 {extensions => native-plugins}/vllm/index.ts | 0 .../vllm/openclaw.plugin.json | 0 .../vllm/package.json | 2 +- .../voice-call/CHANGELOG.md | 0 .../voice-call/README.md | 6 +- .../voice-call/api.ts | 0 .../voice-call/index.ts | 0 .../voice-call/openclaw.plugin.json | 0 .../voice-call/package.json | 2 +- .../voice-call/src/allowlist.ts | 0 .../voice-call/src/cli.ts | 0 .../voice-call/src/config.test.ts | 0 .../voice-call/src/config.ts | 0 .../voice-call/src/core-bridge.ts | 0 .../voice-call/src/deep-merge.ts | 0 .../voice-call/src/http-headers.test.ts | 0 .../voice-call/src/http-headers.ts | 0 .../src/manager.closed-loop.test.ts | 0 .../src/manager.inbound-allowlist.test.ts | 0 .../voice-call/src/manager.notify.test.ts | 0 .../voice-call/src/manager.restore.test.ts | 0 .../voice-call/src/manager.test-harness.ts | 0 .../voice-call/src/manager.ts | 0 .../voice-call/src/manager/context.ts | 0 .../voice-call/src/manager/events.test.ts | 0 .../voice-call/src/manager/events.ts | 0 .../voice-call/src/manager/lookup.ts | 0 .../voice-call/src/manager/outbound.ts | 0 .../voice-call/src/manager/state.ts | 0 .../voice-call/src/manager/store.ts | 0 .../voice-call/src/manager/timers.ts | 0 .../voice-call/src/manager/twiml.ts | 0 .../voice-call/src/media-stream.test.ts | 0 .../voice-call/src/media-stream.ts | 0 .../voice-call/src/providers/base.ts | 0 .../voice-call/src/providers/index.ts | 0 .../voice-call/src/providers/mock.test.ts | 0 .../voice-call/src/providers/mock.ts | 0 .../voice-call/src/providers/plivo.test.ts | 0 .../voice-call/src/providers/plivo.ts | 0 .../src/providers/shared/call-status.test.ts | 0 .../src/providers/shared/call-status.ts | 0 .../src/providers/shared/guarded-json-api.ts | 0 .../src/providers/stt-openai-realtime.test.ts | 0 .../src/providers/stt-openai-realtime.ts | 0 .../voice-call/src/providers/telnyx.test.ts | 0 .../voice-call/src/providers/telnyx.ts | 0 .../src/providers/tts-openai.test.ts | 0 .../voice-call/src/providers/tts-openai.ts | 0 .../voice-call/src/providers/twilio.test.ts | 0 .../voice-call/src/providers/twilio.ts | 0 .../voice-call/src/providers/twilio/api.ts | 0 .../src/providers/twilio/twiml-policy.test.ts | 0 .../src/providers/twilio/twiml-policy.ts | 0 .../src/providers/twilio/webhook.ts | 0 .../voice-call/src/response-generator.ts | 0 .../voice-call/src/runtime.test.ts | 0 .../voice-call/src/runtime.ts | 0 .../voice-call/src/telephony-audio.ts | 0 .../voice-call/src/telephony-tts.test.ts | 0 .../voice-call/src/telephony-tts.ts | 0 .../voice-call/src/test-fixtures.ts | 0 .../voice-call/src/tunnel.ts | 0 .../voice-call/src/types.ts | 0 .../voice-call/src/utils.ts | 0 .../voice-call/src/voice-mapping.ts | 0 .../voice-call/src/webhook-security.test.ts | 0 .../voice-call/src/webhook-security.ts | 0 .../src/webhook.hangup-once.lifecycle.test.ts | 0 .../voice-call/src/webhook.test.ts | 0 .../voice-call/src/webhook.ts | 0 .../src/webhook/stale-call-reaper.ts | 0 .../voice-call/src/webhook/tailscale.ts | 0 .../volcengine/index.ts | 0 .../volcengine/openclaw.plugin.json | 0 .../volcengine/package.json | 2 +- .../volcengine/provider-catalog.ts | 0 .../whatsapp/action-runtime-api.ts | 0 .../whatsapp/action-runtime.runtime.ts | 0 .../whatsapp/api.ts | 0 .../whatsapp/index.ts | 0 .../whatsapp/light-runtime-api.ts | 0 .../whatsapp/login-qr-api.ts | 0 .../whatsapp/openclaw.plugin.json | 0 .../whatsapp/package.json | 4 +- .../whatsapp/runtime-api.ts | 0 .../whatsapp/setup-entry.ts | 0 .../whatsapp/src/accounts.test.ts | 0 .../whatsapp/src/accounts.ts | 0 .../src/accounts.whatsapp-auth.test.ts | 2 +- .../src/action-runtime-target-auth.ts | 0 .../whatsapp/src/action-runtime.test.ts | 0 .../whatsapp/src/action-runtime.ts | 0 .../whatsapp/src/active-listener.test.ts | 0 .../whatsapp/src/active-listener.ts | 0 .../whatsapp/src/agent-tools-login.ts | 0 .../whatsapp/src/auth-store.ts | 0 ...to-reply.broadcast-groups.combined.test.ts | 0 ...uto-reply.broadcast-groups.test-harness.ts | 0 .../whatsapp/src/auto-reply.impl.ts | 0 .../whatsapp/src/auto-reply.test-harness.ts | 0 .../whatsapp/src/auto-reply.ts | 0 ...compresses-common-formats-jpeg-cap.test.ts | 0 ...o-reply.connection-and-logging.e2e.test.ts | 2 +- ...to-reply.web-auto-reply.last-route.test.ts | 0 .../whatsapp/src/auto-reply/constants.ts | 0 .../src/auto-reply/deliver-reply.test.ts | 0 .../whatsapp/src/auto-reply/deliver-reply.ts | 0 .../src/auto-reply/heartbeat-runner.test.ts | 0 .../src/auto-reply/heartbeat-runner.ts | 0 .../whatsapp/src/auto-reply/loggers.ts | 0 .../whatsapp/src/auto-reply/mentions.ts | 0 .../whatsapp/src/auto-reply/monitor.ts | 0 .../src/auto-reply/monitor/ack-reaction.ts | 0 .../src/auto-reply/monitor/broadcast.ts | 0 .../src/auto-reply/monitor/commands.ts | 0 .../whatsapp/src/auto-reply/monitor/echo.ts | 0 .../auto-reply/monitor/group-activation.ts | 0 .../src/auto-reply/monitor/group-gating.ts | 0 .../auto-reply/monitor/group-members.test.ts | 0 .../src/auto-reply/monitor/group-members.ts | 0 .../src/auto-reply/monitor/last-route.ts | 0 .../src/auto-reply/monitor/message-line.ts | 0 .../src/auto-reply/monitor/on-message.ts | 0 .../whatsapp/src/auto-reply/monitor/peer.ts | 0 .../process-message.inbound-context.test.ts | 0 .../src/auto-reply/monitor/process-message.ts | 0 .../src/auto-reply/session-snapshot.ts | 0 .../whatsapp/src/auto-reply/types.ts | 0 .../whatsapp/src/auto-reply/util.ts | 0 .../auto-reply/web-auto-reply-monitor.test.ts | 0 .../auto-reply/web-auto-reply-utils.test.ts | 2 +- .../whatsapp/src/channel.directory.test.ts | 2 +- .../whatsapp/src/channel.outbound.test.ts | 0 .../whatsapp/src/channel.runtime.ts | 0 .../whatsapp/src/channel.setup.ts | 0 .../whatsapp/src/channel.test.ts | 0 .../whatsapp/src/channel.ts | 0 .../whatsapp/src/config-schema.ts | 0 .../whatsapp/src/directory-config.ts | 0 .../whatsapp/src/group-policy.test.ts | 0 .../whatsapp/src/group-policy.ts | 0 .../whatsapp/src/inbound.media.test.ts | 0 .../whatsapp/src/inbound.test.ts | 0 .../whatsapp/src/inbound.ts | 0 .../inbound/access-control.test-harness.ts | 0 .../src/inbound/access-control.test.ts | 0 .../whatsapp/src/inbound/access-control.ts | 0 .../whatsapp/src/inbound/dedupe.ts | 0 .../whatsapp/src/inbound/extract.ts | 0 .../whatsapp/src/inbound/media.node.test.ts | 0 .../whatsapp/src/inbound/media.ts | 0 .../whatsapp/src/inbound/monitor.ts | 0 .../whatsapp/src/inbound/send-api.test.ts | 0 .../whatsapp/src/inbound/send-api.ts | 0 .../whatsapp/src/inbound/types.ts | 0 .../whatsapp/src/login-qr.test.ts | 0 .../whatsapp/src/login-qr.ts | 0 .../whatsapp/src/login.coverage.test.ts | 0 .../whatsapp/src/login.test.ts | 2 +- .../whatsapp/src/login.ts | 0 .../whatsapp/src/logout.test.ts | 0 .../whatsapp/src/media.test.ts | 2 +- .../whatsapp/src/media.ts | 0 ...ssages-from-senders-allowfrom-list.test.ts | 0 .../src/monitor-inbox.append-upsert.test.ts | 0 ...unauthorized-senders-not-allowfrom.test.ts | 0 ...captures-media-path-image-messages.test.ts | 0 ...tor-inbox.streams-inbound-messages.test.ts | 0 .../src/monitor-inbox.test-harness.ts | 0 .../whatsapp/src/normalize.ts | 0 .../src/outbound-adapter.poll.test.ts | 0 .../src/outbound-adapter.sendpayload.test.ts | 0 .../whatsapp/src/outbound-adapter.ts | 0 .../whatsapp/src/qr-image.ts | 0 .../whatsapp/src/reconnect.test.ts | 0 .../whatsapp/src/reconnect.ts | 0 .../whatsapp/src/resolve-target.test.ts | 0 .../whatsapp/src/runtime-api.ts | 0 .../whatsapp/src/runtime.ts | 0 .../whatsapp/src/send.test.ts | 0 .../whatsapp/src/send.ts | 0 .../whatsapp/src/session-errors.ts | 0 .../whatsapp/src/session-route.ts | 0 .../whatsapp/src/session.test.ts | 0 .../whatsapp/src/session.ts | 0 .../whatsapp/src/setup-core.ts | 0 .../whatsapp/src/setup-surface.test.ts | 0 .../whatsapp/src/setup-surface.ts | 0 .../whatsapp/src/shared.ts | 0 .../whatsapp/src/status-issues.test.ts | 0 .../whatsapp/src/status-issues.ts | 0 .../whatsapp/src/test-helpers.ts | 0 .../whatsapp/src/vcard.ts | 0 {extensions => native-plugins}/xai/index.ts | 0 .../xai/model-definitions.ts | 0 {extensions => native-plugins}/xai/onboard.ts | 0 .../xai/openclaw.plugin.json | 0 .../xai/package.json | 2 +- .../xai/provider-catalog.ts | 0 .../xai/provider-models.test.ts | 0 .../xai/provider-models.ts | 0 .../xai/src/grok-web-search-provider.ts | 0 {extensions => native-plugins}/xai/stream.ts | 0 .../xai/web-search.test.ts | 2 +- .../xai/web-search.ts | 0 .../xiaomi/index.ts | 0 .../xiaomi/onboard.ts | 0 .../xiaomi/openclaw.plugin.json | 0 .../xiaomi/package.json | 2 +- .../xiaomi/provider-catalog.ts | 0 {extensions => native-plugins}/zai/detect.ts | 0 {extensions => native-plugins}/zai/index.ts | 0 .../zai/media-understanding-provider.ts | 0 .../zai/model-definitions.ts | 0 {extensions => native-plugins}/zai/onboard.ts | 0 .../zai/openclaw.plugin.json | 0 .../zai/package.json | 2 +- .../zai/runtime-api.ts | 0 .../zalo/CHANGELOG.md | 0 {extensions => native-plugins}/zalo/README.md | 2 +- {extensions => native-plugins}/zalo/api.ts | 0 {extensions => native-plugins}/zalo/index.ts | 0 .../zalo/openclaw.plugin.json | 0 .../zalo/package.json | 4 +- .../zalo/runtime-api.ts | 0 .../zalo/setup-entry.ts | 0 .../zalo/src/accounts.ts | 0 .../zalo/src/actions.runtime.ts | 0 .../zalo/src/actions.ts | 0 .../zalo/src/api.test.ts | 0 .../zalo/src/api.ts | 0 .../zalo/src/channel.directory.test.ts | 2 +- .../zalo/src/channel.runtime.ts | 0 .../zalo/src/channel.startup.test.ts | 2 +- .../zalo/src/channel.ts | 0 .../zalo/src/config-schema.test.ts | 0 .../zalo/src/config-schema.ts | 0 .../zalo/src/group-access.ts | 0 .../zalo/src/monitor.group-policy.test.ts | 0 .../zalo/src/monitor.lifecycle.test.ts | 0 .../src/monitor.pairing.lifecycle.test.ts | 2 +- .../src/monitor.reply-once.lifecycle.test.ts | 2 +- .../zalo/src/monitor.ts | 0 .../zalo/src/monitor.webhook.test.ts | 0 .../zalo/src/monitor.webhook.ts | 0 .../zalo/src/probe.ts | 0 .../zalo/src/proxy.ts | 0 .../zalo/src/runtime-api.ts | 0 .../zalo/src/runtime.ts | 0 .../zalo/src/secret-input.ts | 0 .../zalo/src/send.ts | 0 .../zalo/src/session-route.ts | 0 .../zalo/src/setup-core.ts | 0 .../zalo/src/setup-status.test.ts | 0 .../zalo/src/setup-surface.test.ts | 4 +- .../zalo/src/setup-surface.ts | 0 .../zalo/src/status-issues.test.ts | 2 +- .../zalo/src/status-issues.ts | 2 +- .../zalo/src/token.test.ts | 0 .../zalo/src/token.ts | 0 .../zalo/src/types.ts | 0 .../zalouser/CHANGELOG.md | 0 .../zalouser/README.md | 4 +- .../zalouser/api.ts | 0 .../zalouser/index.ts | 0 .../zalouser/openclaw.plugin.json | 0 .../zalouser/package.json | 4 +- .../zalouser/runtime-api.ts | 0 .../zalouser/setup-entry.ts | 0 .../zalouser/src/accounts.test-mocks.ts | 0 .../zalouser/src/accounts.test.ts | 0 .../zalouser/src/accounts.ts | 0 .../zalouser/src/channel.directory.test.ts | 0 .../zalouser/src/channel.sendpayload.test.ts | 0 .../zalouser/src/channel.setup.test.ts | 2 +- .../zalouser/src/channel.setup.ts | 0 .../zalouser/src/channel.test.ts | 0 .../zalouser/src/channel.ts | 2 +- .../zalouser/src/config-schema.ts | 0 .../zalouser/src/group-policy.test.ts | 0 .../zalouser/src/group-policy.ts | 0 .../zalouser/src/message-sid.test.ts | 0 .../zalouser/src/message-sid.ts | 0 .../src/monitor.account-scope.test.ts | 0 .../zalouser/src/monitor.group-gating.test.ts | 0 .../zalouser/src/monitor.send-mocks.ts | 0 .../zalouser/src/monitor.ts | 2 +- .../zalouser/src/probe.test.ts | 0 .../zalouser/src/probe.ts | 0 .../zalouser/src/qr-temp-file.ts | 0 .../zalouser/src/reaction.test.ts | 0 .../zalouser/src/reaction.ts | 0 .../zalouser/src/runtime.ts | 0 .../zalouser/src/send.test.ts | 0 .../zalouser/src/send.ts | 0 .../zalouser/src/session-route.ts | 0 .../zalouser/src/setup-core.ts | 0 .../zalouser/src/setup-surface.test.ts | 4 +- .../zalouser/src/setup-surface.ts | 0 .../zalouser/src/shared.ts | 0 .../zalouser/src/status-issues.test.ts | 2 +- .../zalouser/src/status-issues.ts | 2 +- .../zalouser/src/test-helpers.ts | 0 .../zalouser/src/text-styles.test.ts | 0 .../zalouser/src/text-styles.ts | 0 .../zalouser/src/tool.test.ts | 0 .../zalouser/src/tool.ts | 0 .../zalouser/src/types.ts | 0 .../zalouser/src/zalo-js.test-mocks.ts | 0 .../zalouser/src/zalo-js.ts | 0 .../zalouser/src/zca-client.ts | 0 .../zalouser/src/zca-constants.ts | 0 .../zalouser/src/zca-js-exports.d.ts | 0 package.json | 41 +- pnpm-lock.yaml | 140 +++---- pnpm-workspace.yaml | 2 +- scripts/audit-plugin-sdk-seams.mjs | 14 +- scripts/check-architecture-smells.mjs | 2 +- .../check-extension-plugin-sdk-boundary.mjs | 326 +--------------- scripts/check-ingress-agent-owner-context.mjs | 4 +- ...heck-native-plugin-plugin-sdk-boundary.mjs | 330 ++++++++++++++++ ...-no-monolithic-plugin-sdk-entry-imports.ts | 18 +- ... => check-no-native-plugin-src-imports.ts} | 16 +- ...eck-no-native-plugin-test-core-imports.ts} | 22 +- scripts/check-no-random-messaging-tmp.mjs | 2 +- scripts/check-no-raw-channel-fetch.mjs | 74 ++-- scripts/check-no-register-http-handler.mjs | 2 +- ...check-plugin-extension-import-boundary.mjs | 303 +-------------- ...k-plugin-native-plugin-import-boundary.mjs | 305 +++++++++++++++ scripts/check-plugin-sdk-subpath-exports.mjs | 2 +- scripts/check-webhook-auth-body-order.mjs | 6 +- scripts/ci-changed-scope.mjs | 4 +- scripts/copy-bundled-plugin-metadata.mjs | 8 +- scripts/dev/test-device-pair-telegram.ts | 2 +- scripts/e2e/Dockerfile | 4 +- scripts/e2e/plugins-docker.sh | 14 +- ...enerate-bundled-provider-auth-env-vars.mjs | 8 +- scripts/lib/bundled-extension-manifest.ts | 31 -- scripts/lib/bundled-native-plugin-manifest.ts | 37 ++ scripts/lib/pairing-guard-context.mjs | 2 +- scripts/lib/plugin-npm-release.ts | 23 +- scripts/lib/plugin-sdk-entrypoints.json | 1 + scripts/profile-extension-memory.mjs | 360 +---------------- scripts/profile-native-plugin-memory.mjs | 361 ++++++++++++++++++ scripts/release-check.ts | 35 +- scripts/run-node.mjs | 20 +- scripts/stage-bundled-plugin-runtime.mjs | 4 +- scripts/sync-plugin-versions.ts | 8 +- scripts/test-extension.mjs | 330 +--------------- scripts/test-native-plugin.mjs | 349 +++++++++++++++++ scripts/test-parallel-memory.mjs | 4 +- scripts/test-parallel.mjs | 42 +- scripts/tsdown-build.mjs | 14 +- scripts/write-cli-startup-metadata.ts | 12 +- skills/bluebubbles/SKILL.md | 2 +- src/acp/persistent-bindings.test.ts | 6 +- ...fault-baseurl-token-exchange-fails.test.ts | 2 +- .../models-config.providers.discovery.ts | 8 +- src/agents/models-config.providers.static.ts | 30 +- src/agents/models-config.providers.ts | 16 +- ...pi-agent.auth-profile-rotation.e2e.test.ts | 2 +- ...i-embedded-subscribe.tools.extract.test.ts | 2 +- src/agents/pi-tools.safe-bins.test.ts | 2 +- .../subagent-announce.format.e2e.test.ts | 4 +- src/agents/tools/web-search.test.ts | 8 +- src/auto-reply/reply.heartbeat-typing.test.ts | 2 +- src/auto-reply/reply.raw-body.test.ts | 2 +- ....triggers.trigger-handling.test-harness.ts | 2 +- src/auto-reply/reply/commands-acp.test.ts | 2 +- .../reply/commands-acp/context.test.ts | 2 +- .../reply/commands-acp/install-hints.ts | 2 +- .../reply/commands-session-lifecycle.test.ts | 6 +- .../reply/commands-subagents.test-mocks.ts | 2 +- src/auto-reply/reply/route-reply.test.ts | 22 +- src/auto-reply/reply/telegram-context.test.ts | 2 +- src/channels/plugins/actions/actions.test.ts | 26 +- .../discord/handle-action.guild-admin.ts | 2 +- .../plugins/actions/discord/handle-action.ts | 2 +- src/channels/plugins/bundled.ts | 38 +- .../contracts/group-policy.contract.test.ts | 12 +- .../contracts/inbound.contract.test.ts | 18 +- .../outbound-payload.contract.test.ts | 22 +- src/channels/plugins/contracts/registry.ts | 16 +- .../session-binding.contract.test.ts | 14 +- .../plugins/message-capability-matrix.test.ts | 18 +- src/channels/plugins/outbound/slack.test.ts | 4 +- src/channels/plugins/plugins-channel.test.ts | 2 +- src/channels/plugins/plugins-core.test.ts | 32 +- src/channels/plugins/target-parsing.ts | 4 +- src/channels/plugins/types.core.ts | 2 +- src/cli/npm-resolution.test.ts | 12 +- src/cli/plugin-install-plan.test.ts | 10 +- src/cli/plugins-cli.test.ts | 12 +- src/cli/plugins-cli.ts | 8 +- src/cli/program/register.subclis.ts | 2 +- src/cli/program/subcli-descriptors.ts | 2 +- .../agents.bind.matrix.integration.test.ts | 2 +- src/commands/auth-choice.test.ts | 48 +-- .../channel-setup/plugin-install.test.ts | 8 +- src/commands/channel-test-helpers.ts | 8 +- src/commands/channels.mock-harness.ts | 4 +- ...time-errors-channels-status-output.test.ts | 2 +- src/commands/doctor-config-flow.test.ts | 2 +- src/commands/doctor-config-flow.ts | 2 +- src/commands/doctor.e2e-harness.ts | 2 +- src/commands/health.command.coverage.test.ts | 2 +- src/commands/health.snapshot.test.ts | 13 +- src/commands/message.test.ts | 10 +- .../onboard-auth.config-core.kilocode.test.ts | 2 +- src/commands/onboard-auth.config-gateways.ts | 4 +- src/commands/onboard-auth.test.ts | 21 +- src/commands/status.test.ts | 2 +- src/config/schema.help.ts | 2 +- .../explicit-session-key-normalization.ts | 2 +- ...ent.delivery-target-thread-session.test.ts | 2 +- src/cron/isolated-agent.test-setup.ts | 2 +- .../isolated-agent/delivery-target.test.ts | 4 +- src/dockerfile.test.ts | 4 +- src/gateway/client-callsites.guard.test.ts | 2 +- ...erver.agent.gateway-server-agent-b.test.ts | 2 +- src/gateway/server.impl.ts | 2 +- src/gateway/test-helpers.mocks.ts | 2 +- src/gateway/test-helpers.server.ts | 4 +- src/infra/exec-approval-forwarder.test.ts | 4 +- src/infra/exec-approval-surface.test.ts | 24 +- .../heartbeat-runner.model-override.test.ts | 8 +- ...tbeat-runner.returns-default-unset.test.ts | 2 +- src/infra/heartbeat-runner.test-harness.ts | 6 +- src/infra/heartbeat-runner.test-utils.ts | 2 +- src/infra/matrix-account-selection.test.ts | 2 +- src/infra/matrix-legacy-crypto.test.ts | 2 +- src/infra/matrix-legacy-crypto.ts | 2 +- src/infra/matrix-legacy-state.ts | 2 +- src/infra/matrix-migration-config.ts | 2 +- src/infra/matrix-migration-snapshot.test.ts | 2 +- .../outbound/cfg-threading.guard.test.ts | 16 +- src/infra/outbound/channel-adapters.test.ts | 4 +- src/infra/outbound/deliver.test.ts | 2 +- .../outbound/message-action-params.test.ts | 4 +- .../message-action-runner.media.test.ts | 8 +- .../message-action-runner.test-helpers.ts | 4 +- src/infra/outbound/outbound-policy.test.ts | 2 +- src/infra/outbound/outbound-session.ts | 13 +- src/infra/outbound/outbound.test.ts | 2 +- src/infra/outbound/targets.shared-test.ts | 4 +- src/infra/outbound/targets.test.ts | 2 +- .../plugin-install-path-warnings.test.ts | 8 +- src/infra/run-node.test.ts | 76 ++-- src/infra/tsdown-config.test.ts | 4 +- src/infra/watch-node.test.ts | 18 +- .../providers/google/video.test.ts | 2 +- .../providers/mistral/index.test.ts | 2 +- .../providers/moonshot/video.test.ts | 2 +- .../providers/openai/audio.test.ts | 2 +- src/media/fetch.telegram-network.test.ts | 8 +- src/plugin-sdk/account-resolution.ts | 11 +- src/plugin-sdk/bluebubbles.ts | 8 +- .../channel-import-guardrails.test.ts | 38 +- src/plugin-sdk/compat.ts | 2 +- src/plugin-sdk/copilot-proxy.ts | 2 +- src/plugin-sdk/device-pair.ts | 2 +- src/plugin-sdk/diagnostics-otel.ts | 2 +- src/plugin-sdk/diffs.ts | 2 +- src/plugin-sdk/discord-send.ts | 2 +- src/plugin-sdk/discord.ts | 40 +- src/plugin-sdk/extension-shared.ts | 136 +------ src/plugin-sdk/feishu.ts | 6 +- src/plugin-sdk/googlechat.ts | 2 +- src/plugin-sdk/imessage-core.ts | 4 +- src/plugin-sdk/imessage-targets.ts | 2 +- src/plugin-sdk/imessage.ts | 4 +- src/plugin-sdk/irc.ts | 6 +- src/plugin-sdk/line.ts | 2 +- src/plugin-sdk/llm-task.ts | 2 +- src/plugin-sdk/matrix.ts | 10 +- src/plugin-sdk/mattermost.ts | 2 +- src/plugin-sdk/memory-core.ts | 2 +- src/plugin-sdk/memory-lancedb.ts | 2 +- src/plugin-sdk/msteams.ts | 2 +- src/plugin-sdk/native-plugin-shared.ts | 135 +++++++ src/plugin-sdk/nextcloud-talk.ts | 2 +- src/plugin-sdk/nostr.ts | 2 +- src/plugin-sdk/open-prose.ts | 2 +- src/plugin-sdk/phone-control.ts | 2 +- src/plugin-sdk/qwen-portal-auth.ts | 2 +- src/plugin-sdk/runtime-api-guardrails.test.ts | 18 +- src/plugin-sdk/signal.ts | 16 +- src/plugin-sdk/slack-targets.ts | 2 +- src/plugin-sdk/slack.ts | 30 +- src/plugin-sdk/synology-chat.ts | 4 +- src/plugin-sdk/talk-voice.ts | 2 +- src/plugin-sdk/telegram.ts | 51 +-- src/plugin-sdk/thread-ownership.ts | 2 +- src/plugin-sdk/tlon.ts | 2 +- src/plugin-sdk/twitch.ts | 2 +- src/plugin-sdk/whatsapp-core.ts | 2 +- src/plugin-sdk/whatsapp.ts | 15 +- src/plugin-sdk/zalo.ts | 6 +- src/plugin-sdk/zalouser.ts | 2 +- src/plugins/bundled-dir.ts | 60 ++- src/plugins/bundled-runtime-deps.test.ts | 14 +- src/plugins/bundled-sources.test.ts | 24 +- src/plugins/commands.test.ts | 2 +- .../contracts/auth-choice.contract.test.ts | 4 +- src/plugins/contracts/auth.contract.test.ts | 10 +- .../contracts/discovery.contract.test.ts | 22 +- src/plugins/contracts/registry.ts | 80 ++-- .../contracts/runtime.contract.test.ts | 4 +- src/plugins/discovery.ts | 45 ++- src/plugins/install.test.ts | 12 +- src/plugins/install.ts | 107 ++++-- src/plugins/loader.test.ts | 2 +- src/plugins/loader.ts | 18 +- src/plugins/manifest-registry.ts | 10 +- src/plugins/manifest.ts | 14 +- src/plugins/roots.ts | 35 +- .../runtime/runtime-whatsapp-boundary.ts | 4 +- src/plugins/runtime/types-channel.ts | 116 +++--- .../stage-bundled-plugin-runtime.test.ts | 58 +-- src/plugins/uninstall.ts | 17 +- src/plugins/update.test.ts | 20 +- src/plugins/voice-call.plugin.test.ts | 4 +- src/security/audit-extra.async.ts | 2 +- src/security/dm-policy-channel-smoke.test.ts | 9 +- src/test-utils/imessage-test-plugin.ts | 2 +- src/test-utils/repo-scan.ts | 4 +- .../runtime-source-guardrail-scan.ts | 14 +- test/channel-outbounds.ts | 12 +- ...n-relative-outside-package-inventory.json} | 0 ...ive-plugin-import-boundary-inventory.json} | 0 test/fixtures/test-parallel.behavior.json | 2 +- test/fixtures/test-timings.unit.json | 14 +- .../chunk-test-helpers.ts | 0 .../directory.ts | 0 .../discord-provider.test-support.ts | 34 +- .../{extensions => native-plugins}/env.ts | 0 .../fetch-mock.ts | 0 .../frozen-time.ts | 0 .../matrix-monitor-route.ts | 0 .../matrix-route-test.ts | 0 .../mock-http-response.ts | 0 .../plugin-api.ts | 0 .../plugin-command.ts | 0 .../plugin-registration.ts | 0 .../plugin-routing.ts | 0 .../plugin-runtime-mock.ts | 0 .../provider-usage-fetch.ts | 0 .../runtime-env.ts | 0 .../send-config.ts | 0 .../setup-wizard.ts | 0 .../start-account-context.ts | 0 .../start-account-lifecycle.ts | 0 .../status-issues.ts | 0 .../subagent-hooks.ts | 0 .../telegram-plugin-command.ts | 0 .../temp-dir.ts | 0 .../typed-cases.ts | 0 ....ts => native-plugin-sdk-boundary.test.ts} | 24 +- test/openshell-sandbox.e2e.test.ts | 4 +- ...gin-native-plugin-import-boundary.test.ts} | 20 +- test/plugin-npm-release.test.ts | 20 +- test/release-check.test.ts | 10 +- test/scripts/test-extension.test.ts | 96 ----- test/scripts/test-native-plugin.test.ts | 96 +++++ test/vitest-unit-paths.test.ts | 4 +- test/web-search-provider-boundary.test.ts | 2 +- tsconfig.json | 2 +- tsdown.config.ts | 23 +- vitest.channel-paths.mjs | 12 +- vitest.config.ts | 4 +- vitest.e2e.config.ts | 2 +- vitest.extensions.config.ts | 10 +- vitest.native-plugins.config.ts | 9 + vitest.unit-paths.mjs | 2 +- 2553 files changed, 3590 insertions(+), 3308 deletions(-) rename docs/plugins/{building-extensions.md => building-native-plugins.md} (92%) rename {extensions => native-plugins}/.npmignore (100%) rename {extensions => native-plugins}/acpx/index.ts (100%) rename {extensions => native-plugins}/acpx/openclaw.plugin.json (100%) rename {extensions => native-plugins}/acpx/package.json (91%) rename {extensions => native-plugins}/acpx/runtime-api.ts (100%) rename {extensions => native-plugins}/acpx/skills/acp-router/SKILL.md (94%) rename {extensions => native-plugins}/acpx/src/config.test.ts (98%) rename {extensions => native-plugins}/acpx/src/config.ts (100%) rename {extensions => native-plugins}/acpx/src/ensure.test.ts (100%) rename {extensions => native-plugins}/acpx/src/ensure.ts (100%) rename {extensions => native-plugins}/acpx/src/runtime-internals/control-errors.test.ts (100%) rename {extensions => native-plugins}/acpx/src/runtime-internals/control-errors.ts (100%) rename {extensions => native-plugins}/acpx/src/runtime-internals/events.test.ts (100%) rename {extensions => native-plugins}/acpx/src/runtime-internals/events.ts (100%) rename {extensions => native-plugins}/acpx/src/runtime-internals/jsonrpc.test.ts (100%) rename {extensions => native-plugins}/acpx/src/runtime-internals/jsonrpc.ts (100%) rename {extensions => native-plugins}/acpx/src/runtime-internals/mcp-agent-command.test.ts (100%) rename {extensions => native-plugins}/acpx/src/runtime-internals/mcp-agent-command.ts (100%) rename {extensions => native-plugins}/acpx/src/runtime-internals/mcp-proxy.mjs (100%) rename {extensions => native-plugins}/acpx/src/runtime-internals/mcp-proxy.test.ts (97%) rename {extensions => native-plugins}/acpx/src/runtime-internals/process.test.ts (100%) rename {extensions => native-plugins}/acpx/src/runtime-internals/process.ts (100%) rename {extensions => native-plugins}/acpx/src/runtime-internals/shared.ts (100%) rename {extensions => native-plugins}/acpx/src/runtime.test.ts (100%) rename {extensions => native-plugins}/acpx/src/runtime.ts (100%) rename {extensions => native-plugins}/acpx/src/service.test.ts (100%) rename {extensions => native-plugins}/acpx/src/service.ts (100%) rename {extensions => native-plugins}/acpx/src/test-utils/runtime-fixtures.ts (100%) rename {extensions => native-plugins}/amazon-bedrock/index.test.ts (97%) rename {extensions => native-plugins}/amazon-bedrock/index.ts (100%) rename {extensions => native-plugins}/amazon-bedrock/openclaw.plugin.json (100%) rename {extensions => native-plugins}/amazon-bedrock/package.json (91%) rename {extensions => native-plugins}/anthropic/index.ts (100%) rename {extensions => native-plugins}/anthropic/media-understanding-provider.ts (100%) rename {extensions => native-plugins}/anthropic/openclaw.plugin.json (100%) rename {extensions => native-plugins}/anthropic/package.json (91%) rename {extensions => native-plugins}/bluebubbles/README.md (51%) rename {extensions => native-plugins}/bluebubbles/api.ts (100%) rename {extensions => native-plugins}/bluebubbles/index.ts (100%) rename {extensions => native-plugins}/bluebubbles/openclaw.plugin.json (100%) rename {extensions => native-plugins}/bluebubbles/package.json (93%) rename {extensions => native-plugins}/bluebubbles/runtime-api.ts (100%) rename {extensions => native-plugins}/bluebubbles/setup-entry.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/account-resolve.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/accounts.test.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/accounts.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/actions.runtime.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/actions.test.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/actions.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/attachments.test.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/attachments.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/channel.runtime.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/channel.setup.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/channel.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/chat.test.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/chat.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/config-apply.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/config-schema.test.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/config-schema.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/group-policy.test.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/group-policy.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/history.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/media-send.test.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/media-send.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/monitor-debounce.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/monitor-normalize.test.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/monitor-normalize.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/monitor-processing.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/monitor-reply-cache.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/monitor-self-chat-cache.test.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/monitor-self-chat-cache.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/monitor-shared.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/monitor.test.ts (99%) rename {extensions => native-plugins}/bluebubbles/src/monitor.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/monitor.webhook-auth.test.ts (99%) rename {extensions => native-plugins}/bluebubbles/src/monitor.webhook-route.test.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/multipart.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/probe.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/reactions.test.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/reactions.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/request-url.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/runtime-api.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/runtime.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/secret-input.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/send-helpers.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/send.test.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/send.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/session-route.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/setup-core.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/setup-surface.test.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/setup-surface.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/targets.test.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/targets.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/test-harness.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/test-mocks.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/types.ts (100%) rename {extensions => native-plugins}/bluebubbles/src/webhook-shared.ts (100%) rename {extensions => native-plugins}/brave/index.ts (100%) rename {extensions => native-plugins}/brave/openclaw.plugin.json (100%) rename {extensions => native-plugins}/brave/package.json (90%) rename {extensions => native-plugins}/brave/src/brave-web-search-provider.ts (100%) rename {extensions => native-plugins}/byteplus/index.ts (100%) rename {extensions => native-plugins}/byteplus/openclaw.plugin.json (100%) rename {extensions => native-plugins}/byteplus/package.json (91%) rename {extensions => native-plugins}/byteplus/provider-catalog.ts (100%) rename {extensions => native-plugins}/chutes/index.ts (100%) rename {extensions => native-plugins}/chutes/onboard.ts (100%) rename {extensions => native-plugins}/chutes/openclaw.plugin.json (100%) rename {extensions => native-plugins}/chutes/package.json (91%) rename {extensions => native-plugins}/chutes/provider-catalog.ts (100%) rename {extensions => native-plugins}/cloudflare-ai-gateway/index.ts (100%) rename {extensions => native-plugins}/cloudflare-ai-gateway/onboard.ts (100%) rename {extensions => native-plugins}/cloudflare-ai-gateway/openclaw.plugin.json (100%) rename {extensions => native-plugins}/cloudflare-ai-gateway/package.json (92%) rename {extensions => native-plugins}/copilot-proxy/README.md (100%) rename {extensions => native-plugins}/copilot-proxy/index.ts (100%) rename {extensions => native-plugins}/copilot-proxy/openclaw.plugin.json (100%) rename {extensions => native-plugins}/copilot-proxy/package.json (91%) rename {extensions => native-plugins}/copilot-proxy/runtime-api.ts (100%) rename {extensions => native-plugins}/device-pair/api.ts (100%) rename {extensions => native-plugins}/device-pair/index.ts (100%) rename {extensions => native-plugins}/device-pair/notify.test.ts (100%) rename {extensions => native-plugins}/device-pair/notify.ts (100%) rename {extensions => native-plugins}/device-pair/openclaw.plugin.json (100%) rename {extensions => native-plugins}/diagnostics-otel/api.ts (100%) rename {extensions => native-plugins}/diagnostics-otel/index.ts (100%) rename {extensions => native-plugins}/diagnostics-otel/openclaw.plugin.json (100%) rename {extensions => native-plugins}/diagnostics-otel/package.json (97%) rename {extensions => native-plugins}/diagnostics-otel/src/service.test.ts (100%) rename {extensions => native-plugins}/diagnostics-otel/src/service.ts (100%) rename {extensions => native-plugins}/diffs/README.md (100%) rename {extensions => native-plugins}/diffs/api.ts (100%) rename {extensions => native-plugins}/diffs/assets/viewer-runtime.js (100%) rename {extensions => native-plugins}/diffs/index.test.ts (95%) rename {extensions => native-plugins}/diffs/index.ts (100%) rename {extensions => native-plugins}/diffs/openclaw.plugin.json (100%) rename {extensions => native-plugins}/diffs/package.json (95%) rename {extensions => native-plugins}/diffs/skills/diffs/SKILL.md (100%) rename {extensions => native-plugins}/diffs/src/browser.test.ts (100%) rename {extensions => native-plugins}/diffs/src/browser.ts (100%) rename {extensions => native-plugins}/diffs/src/config.test.ts (100%) rename {extensions => native-plugins}/diffs/src/config.ts (100%) rename {extensions => native-plugins}/diffs/src/http.test.ts (99%) rename {extensions => native-plugins}/diffs/src/http.ts (100%) rename {extensions => native-plugins}/diffs/src/prompt-guidance.ts (100%) rename {extensions => native-plugins}/diffs/src/render.test.ts (100%) rename {extensions => native-plugins}/diffs/src/render.ts (100%) rename {extensions => native-plugins}/diffs/src/store.test.ts (100%) rename {extensions => native-plugins}/diffs/src/store.ts (100%) rename {extensions => native-plugins}/diffs/src/test-helpers.ts (100%) rename {extensions => native-plugins}/diffs/src/tool.test.ts (99%) rename {extensions => native-plugins}/diffs/src/tool.ts (100%) rename {extensions => native-plugins}/diffs/src/types.ts (100%) rename {extensions => native-plugins}/diffs/src/url.test.ts (100%) rename {extensions => native-plugins}/diffs/src/url.ts (100%) rename {extensions => native-plugins}/diffs/src/viewer-assets.test.ts (100%) rename {extensions => native-plugins}/diffs/src/viewer-assets.ts (100%) rename {extensions => native-plugins}/diffs/src/viewer-client.ts (100%) rename {extensions => native-plugins}/diffs/src/viewer-payload.test.ts (100%) rename {extensions => native-plugins}/diffs/src/viewer-payload.ts (100%) rename {extensions => native-plugins}/discord/api.ts (100%) rename {extensions => native-plugins}/discord/index.ts (100%) rename {extensions => native-plugins}/discord/openclaw.plugin.json (100%) rename {extensions => native-plugins}/discord/package.json (93%) rename {extensions => native-plugins}/discord/runtime-api.ts (100%) rename {extensions => native-plugins}/discord/session-key-api.ts (100%) rename {extensions => native-plugins}/discord/setup-entry.ts (100%) rename {extensions => native-plugins}/discord/src/account-inspect.test.ts (100%) rename {extensions => native-plugins}/discord/src/account-inspect.ts (100%) rename {extensions => native-plugins}/discord/src/accounts.test.ts (100%) rename {extensions => native-plugins}/discord/src/accounts.ts (100%) rename {extensions => native-plugins}/discord/src/actions/handle-action.guild-admin.ts (100%) rename {extensions => native-plugins}/discord/src/actions/handle-action.ts (100%) rename {extensions => native-plugins}/discord/src/actions/runtime.guild.ts (100%) rename {extensions => native-plugins}/discord/src/actions/runtime.messaging.ts (100%) rename {extensions => native-plugins}/discord/src/actions/runtime.moderation-shared.ts (100%) rename {extensions => native-plugins}/discord/src/actions/runtime.moderation.authz.test.ts (100%) rename {extensions => native-plugins}/discord/src/actions/runtime.moderation.ts (100%) rename {extensions => native-plugins}/discord/src/actions/runtime.presence.test.ts (100%) rename {extensions => native-plugins}/discord/src/actions/runtime.presence.ts (100%) rename {extensions => native-plugins}/discord/src/actions/runtime.shared.ts (100%) rename {extensions => native-plugins}/discord/src/actions/runtime.test.ts (100%) rename {extensions => native-plugins}/discord/src/actions/runtime.ts (100%) rename {extensions => native-plugins}/discord/src/api.test.ts (95%) rename {extensions => native-plugins}/discord/src/api.ts (100%) rename {extensions => native-plugins}/discord/src/audit.test.ts (100%) rename {extensions => native-plugins}/discord/src/audit.ts (100%) rename {extensions => native-plugins}/discord/src/channel-actions.ts (100%) rename {extensions => native-plugins}/discord/src/channel.runtime.ts (100%) rename {extensions => native-plugins}/discord/src/channel.setup.ts (100%) rename {extensions => native-plugins}/discord/src/channel.test.ts (98%) rename {extensions => native-plugins}/discord/src/channel.ts (100%) rename {extensions => native-plugins}/discord/src/chunk.test.ts (98%) rename {extensions => native-plugins}/discord/src/chunk.ts (100%) rename {extensions => native-plugins}/discord/src/client.test.ts (100%) rename {extensions => native-plugins}/discord/src/client.ts (100%) rename {extensions => native-plugins}/discord/src/components-registry.ts (100%) rename {extensions => native-plugins}/discord/src/components.test.ts (100%) rename {extensions => native-plugins}/discord/src/components.ts (100%) rename {extensions => native-plugins}/discord/src/config-schema.ts (100%) rename {extensions => native-plugins}/discord/src/directory-cache.ts (100%) rename {extensions => native-plugins}/discord/src/directory-config.ts (100%) rename {extensions => native-plugins}/discord/src/directory-live.test.ts (100%) rename {extensions => native-plugins}/discord/src/directory-live.ts (100%) rename {extensions => native-plugins}/discord/src/draft-chunking.ts (100%) rename {extensions => native-plugins}/discord/src/draft-stream.ts (100%) rename {extensions => native-plugins}/discord/src/exec-approvals.ts (100%) rename {extensions => native-plugins}/discord/src/gateway-logging.test.ts (100%) rename {extensions => native-plugins}/discord/src/gateway-logging.ts (100%) rename {extensions => native-plugins}/discord/src/group-policy.test.ts (100%) rename {extensions => native-plugins}/discord/src/group-policy.ts (100%) rename {extensions => native-plugins}/discord/src/guilds.ts (100%) rename {extensions => native-plugins}/discord/src/mentions.test.ts (100%) rename {extensions => native-plugins}/discord/src/mentions.ts (100%) rename {extensions => native-plugins}/discord/src/message-tool-schema.ts (100%) rename {extensions => native-plugins}/discord/src/monitor.gateway.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor.gateway.ts (100%) rename {extensions => native-plugins}/discord/src/monitor.test.ts (99%) rename {extensions => native-plugins}/discord/src/monitor.tool-result.accepts-guild-messages-mentionpatterns-match.e2e.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor.tool-result.sends-status-replies-responseprefix.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor.tool-result.test-harness.ts (100%) rename {extensions => native-plugins}/discord/src/monitor.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/agent-components-helpers.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/agent-components.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/agent-components.wildcard.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/allow-list.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/auto-presence.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/auto-presence.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/commands.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/commands.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/dm-command-auth.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/dm-command-auth.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/dm-command-decision.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/dm-command-decision.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/exec-approvals.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/exec-approvals.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/format.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/gateway-error-guard.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/gateway-error-guard.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/gateway-plugin.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/gateway-registry.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/inbound-context.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/inbound-context.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/inbound-job.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/inbound-job.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/inbound-worker.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/listeners.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/listeners.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/message-handler.bot-self-filter.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/message-handler.inbound-context.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/message-handler.module-test-helpers.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/message-handler.preflight.acp-bindings.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/message-handler.preflight.test-helpers.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/message-handler.preflight.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/message-handler.preflight.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/message-handler.preflight.types.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/message-handler.process.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/message-handler.process.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/message-handler.queue.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/message-handler.test-harness.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/message-handler.test-helpers.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/message-handler.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/message-utils.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/message-utils.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/model-picker-preferences.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/model-picker-preferences.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/model-picker.test-utils.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/model-picker.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/model-picker.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/monitor.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/native-command-context.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/native-command-context.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/native-command-ui.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/native-command.commands-allowfrom.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/native-command.model-picker.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/native-command.options.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/native-command.plugin-dispatch.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/native-command.test-helpers.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/native-command.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/preflight-audio.runtime.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/preflight-audio.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/presence-cache.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/presence.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/presence.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/provider.allowlist.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/provider.allowlist.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/provider.lifecycle.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/provider.lifecycle.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/provider.proxy.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/provider.rest-proxy.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/provider.skill-dedupe.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/provider.test.ts (99%) rename {extensions => native-plugins}/discord/src/monitor/provider.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/reply-context.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/reply-delivery.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/reply-delivery.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/rest-fetch.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/route-resolution.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/route-resolution.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/sender-identity.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/status.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/system-events.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/thread-bindings.config.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/thread-bindings.discord-api.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/thread-bindings.discord-api.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/thread-bindings.lifecycle.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/thread-bindings.lifecycle.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/thread-bindings.manager.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/thread-bindings.messages.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/thread-bindings.persona.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/thread-bindings.persona.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/thread-bindings.shared-state.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/thread-bindings.state.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/thread-bindings.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/thread-bindings.types.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/thread-session-close.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/thread-session-close.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/threading.auto-thread.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/threading.parent-info.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/threading.starter.test.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/threading.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/timeouts.ts (100%) rename {extensions => native-plugins}/discord/src/monitor/typing.ts (100%) rename {extensions => native-plugins}/discord/src/normalize.ts (100%) rename {extensions => native-plugins}/discord/src/outbound-adapter.interactive-order.test.ts (100%) rename {extensions => native-plugins}/discord/src/outbound-adapter.test.ts (100%) rename {extensions => native-plugins}/discord/src/outbound-adapter.ts (100%) rename {extensions => native-plugins}/discord/src/pluralkit.test.ts (100%) rename {extensions => native-plugins}/discord/src/pluralkit.ts (100%) rename {extensions => native-plugins}/discord/src/probe.intents.test.ts (100%) rename {extensions => native-plugins}/discord/src/probe.parse-token.test.ts (100%) rename {extensions => native-plugins}/discord/src/probe.ts (100%) rename {extensions => native-plugins}/discord/src/resolve-allowlist-common.test.ts (100%) rename {extensions => native-plugins}/discord/src/resolve-allowlist-common.ts (100%) rename {extensions => native-plugins}/discord/src/resolve-channels.test.ts (99%) rename {extensions => native-plugins}/discord/src/resolve-channels.ts (100%) rename {extensions => native-plugins}/discord/src/resolve-users.test.ts (98%) rename {extensions => native-plugins}/discord/src/resolve-users.ts (100%) rename {extensions => native-plugins}/discord/src/retry.ts (100%) rename {extensions => native-plugins}/discord/src/runtime-api.ts (100%) rename {extensions => native-plugins}/discord/src/runtime.ts (100%) rename {extensions => native-plugins}/discord/src/send.channels.ts (100%) rename {extensions => native-plugins}/discord/src/send.components.test.ts (100%) rename {extensions => native-plugins}/discord/src/send.components.ts (100%) rename {extensions => native-plugins}/discord/src/send.creates-thread.test.ts (100%) rename {extensions => native-plugins}/discord/src/send.emojis-stickers.ts (100%) rename {extensions => native-plugins}/discord/src/send.guild.ts (100%) rename {extensions => native-plugins}/discord/src/send.messages.ts (100%) rename {extensions => native-plugins}/discord/src/send.outbound.ts (100%) rename {extensions => native-plugins}/discord/src/send.permissions.authz.test.ts (100%) rename {extensions => native-plugins}/discord/src/send.permissions.ts (100%) rename {extensions => native-plugins}/discord/src/send.reactions.ts (100%) rename {extensions => native-plugins}/discord/src/send.sends-basic-channel-messages.test.ts (100%) rename {extensions => native-plugins}/discord/src/send.shared.ts (100%) rename {extensions => native-plugins}/discord/src/send.test-harness.ts (100%) rename {extensions => native-plugins}/discord/src/send.ts (100%) rename {extensions => native-plugins}/discord/src/send.types.ts (100%) rename {extensions => native-plugins}/discord/src/send.typing.ts (100%) rename {extensions => native-plugins}/discord/src/send.webhook-activity.test.ts (100%) rename {extensions => native-plugins}/discord/src/session-key-normalization.test.ts (100%) rename {extensions => native-plugins}/discord/src/session-key-normalization.ts (100%) rename {extensions => native-plugins}/discord/src/setup-account-state.ts (100%) rename {extensions => native-plugins}/discord/src/setup-core.ts (100%) rename {extensions => native-plugins}/discord/src/setup-runtime-helpers.ts (100%) rename {extensions => native-plugins}/discord/src/setup-surface.ts (100%) rename {extensions => native-plugins}/discord/src/shared-interactive.test.ts (100%) rename {extensions => native-plugins}/discord/src/shared-interactive.ts (100%) rename {extensions => native-plugins}/discord/src/shared.ts (100%) rename {extensions => native-plugins}/discord/src/status-issues.ts (100%) rename {extensions => native-plugins}/discord/src/subagent-hooks.test.ts (99%) rename {extensions => native-plugins}/discord/src/subagent-hooks.ts (100%) rename {extensions => native-plugins}/discord/src/targets.test.ts (100%) rename {extensions => native-plugins}/discord/src/targets.ts (100%) rename {extensions => native-plugins}/discord/src/test-http-helpers.ts (100%) rename {extensions => native-plugins}/discord/src/token.test.ts (100%) rename {extensions => native-plugins}/discord/src/token.ts (100%) rename {extensions => native-plugins}/discord/src/ui.ts (100%) rename {extensions => native-plugins}/discord/src/voice-message.test.ts (100%) rename {extensions => native-plugins}/discord/src/voice-message.ts (100%) rename {extensions => native-plugins}/discord/src/voice/command.test.ts (100%) rename {extensions => native-plugins}/discord/src/voice/command.ts (100%) rename {extensions => native-plugins}/discord/src/voice/manager.e2e.test.ts (100%) rename {extensions => native-plugins}/discord/src/voice/manager.runtime.ts (100%) rename {extensions => native-plugins}/discord/src/voice/manager.ts (100%) rename {extensions => native-plugins}/discord/src/voice/sdk-runtime.ts (100%) rename {extensions => native-plugins}/elevenlabs/index.ts (100%) rename {extensions => native-plugins}/elevenlabs/openclaw.plugin.json (100%) rename {extensions => native-plugins}/elevenlabs/package.json (91%) rename {extensions => native-plugins}/fal/index.ts (100%) rename {extensions => native-plugins}/fal/onboard.ts (100%) rename {extensions => native-plugins}/fal/openclaw.plugin.json (100%) rename {extensions => native-plugins}/fal/package.json (90%) rename {extensions => native-plugins}/feishu/api.ts (100%) rename {extensions => native-plugins}/feishu/index.test.ts (100%) rename {extensions => native-plugins}/feishu/index.ts (100%) rename {extensions => native-plugins}/feishu/openclaw.plugin.json (100%) rename {extensions => native-plugins}/feishu/package.json (94%) rename {extensions => native-plugins}/feishu/runtime-api.ts (100%) rename {extensions => native-plugins}/feishu/setup-api.ts (100%) rename {extensions => native-plugins}/feishu/setup-entry.ts (100%) rename {extensions => native-plugins}/feishu/skills/feishu-doc/SKILL.md (100%) rename {extensions => native-plugins}/feishu/skills/feishu-doc/references/block-types.md (100%) rename {extensions => native-plugins}/feishu/skills/feishu-drive/SKILL.md (100%) rename {extensions => native-plugins}/feishu/skills/feishu-perm/SKILL.md (100%) rename {extensions => native-plugins}/feishu/skills/feishu-wiki/SKILL.md (100%) rename {extensions => native-plugins}/feishu/src/accounts.test.ts (100%) rename {extensions => native-plugins}/feishu/src/accounts.ts (100%) rename {extensions => native-plugins}/feishu/src/async.ts (100%) rename {extensions => native-plugins}/feishu/src/bitable.ts (100%) rename {extensions => native-plugins}/feishu/src/bot-content.ts (100%) rename {extensions => native-plugins}/feishu/src/bot-sender-name.ts (100%) rename {extensions => native-plugins}/feishu/src/bot.card-action.test.ts (100%) rename {extensions => native-plugins}/feishu/src/bot.checkBotMentioned.test.ts (100%) rename {extensions => native-plugins}/feishu/src/bot.stripBotMention.test.ts (100%) rename {extensions => native-plugins}/feishu/src/bot.test.ts (99%) rename {extensions => native-plugins}/feishu/src/bot.ts (100%) rename {extensions => native-plugins}/feishu/src/card-action.ts (100%) rename {extensions => native-plugins}/feishu/src/card-interaction.test.ts (100%) rename {extensions => native-plugins}/feishu/src/card-interaction.ts (100%) rename {extensions => native-plugins}/feishu/src/card-ux-approval.ts (100%) rename {extensions => native-plugins}/feishu/src/card-ux-launcher.test.ts (100%) rename {extensions => native-plugins}/feishu/src/card-ux-launcher.ts (100%) rename {extensions => native-plugins}/feishu/src/card-ux-shared.ts (100%) rename {extensions => native-plugins}/feishu/src/channel.runtime.ts (100%) rename {extensions => native-plugins}/feishu/src/channel.test.ts (100%) rename {extensions => native-plugins}/feishu/src/channel.ts (100%) rename {extensions => native-plugins}/feishu/src/chat-schema.ts (100%) rename {extensions => native-plugins}/feishu/src/chat.test.ts (100%) rename {extensions => native-plugins}/feishu/src/chat.ts (100%) rename {extensions => native-plugins}/feishu/src/client.test.ts (100%) rename {extensions => native-plugins}/feishu/src/client.ts (100%) rename {extensions => native-plugins}/feishu/src/config-schema.test.ts (100%) rename {extensions => native-plugins}/feishu/src/config-schema.ts (100%) rename {extensions => native-plugins}/feishu/src/conversation-id.ts (100%) rename {extensions => native-plugins}/feishu/src/dedup.ts (100%) rename {extensions => native-plugins}/feishu/src/directory.static.ts (100%) rename {extensions => native-plugins}/feishu/src/directory.test.ts (100%) rename {extensions => native-plugins}/feishu/src/directory.ts (100%) rename {extensions => native-plugins}/feishu/src/doc-schema.ts (100%) rename {extensions => native-plugins}/feishu/src/docx-batch-insert.test.ts (100%) rename {extensions => native-plugins}/feishu/src/docx-batch-insert.ts (100%) rename {extensions => native-plugins}/feishu/src/docx-color-text.ts (100%) rename {extensions => native-plugins}/feishu/src/docx-table-ops.ts (100%) rename {extensions => native-plugins}/feishu/src/docx.account-selection.test.ts (100%) rename {extensions => native-plugins}/feishu/src/docx.test.ts (100%) rename {extensions => native-plugins}/feishu/src/docx.ts (100%) rename {extensions => native-plugins}/feishu/src/drive-schema.ts (100%) rename {extensions => native-plugins}/feishu/src/drive.ts (100%) rename {extensions => native-plugins}/feishu/src/dynamic-agent.ts (100%) rename {extensions => native-plugins}/feishu/src/external-keys.test.ts (100%) rename {extensions => native-plugins}/feishu/src/external-keys.ts (100%) rename {extensions => native-plugins}/feishu/src/feishu-command-handler.ts (100%) rename {extensions => native-plugins}/feishu/src/media.test.ts (100%) rename {extensions => native-plugins}/feishu/src/media.ts (100%) rename {extensions => native-plugins}/feishu/src/mention.ts (100%) rename {extensions => native-plugins}/feishu/src/monitor.account.ts (100%) rename {extensions => native-plugins}/feishu/src/monitor.acp-init-failure.lifecycle.test.ts (99%) rename {extensions => native-plugins}/feishu/src/monitor.bot-menu.lifecycle.test.ts (99%) rename {extensions => native-plugins}/feishu/src/monitor.bot-menu.test.ts (98%) rename {extensions => native-plugins}/feishu/src/monitor.broadcast.reply-once.lifecycle.test.ts (99%) rename {extensions => native-plugins}/feishu/src/monitor.card-action.lifecycle.test.ts (99%) rename {extensions => native-plugins}/feishu/src/monitor.reaction.lifecycle.test.ts (100%) rename {extensions => native-plugins}/feishu/src/monitor.reaction.test.ts (99%) rename {extensions => native-plugins}/feishu/src/monitor.reply-once.lifecycle.test.ts (99%) rename {extensions => native-plugins}/feishu/src/monitor.startup.test.ts (100%) rename {extensions => native-plugins}/feishu/src/monitor.startup.ts (100%) rename {extensions => native-plugins}/feishu/src/monitor.state.defaults.test.ts (100%) rename {extensions => native-plugins}/feishu/src/monitor.state.ts (100%) rename {extensions => native-plugins}/feishu/src/monitor.test-mocks.ts (100%) rename {extensions => native-plugins}/feishu/src/monitor.transport.ts (100%) rename {extensions => native-plugins}/feishu/src/monitor.ts (100%) rename {extensions => native-plugins}/feishu/src/monitor.webhook-e2e.test.ts (100%) rename {extensions => native-plugins}/feishu/src/monitor.webhook-security.test.ts (100%) rename {extensions => native-plugins}/feishu/src/monitor.webhook.test-helpers.ts (100%) rename {extensions => native-plugins}/feishu/src/outbound.test.ts (100%) rename {extensions => native-plugins}/feishu/src/outbound.ts (100%) rename {extensions => native-plugins}/feishu/src/perm-schema.ts (100%) rename {extensions => native-plugins}/feishu/src/perm.ts (100%) rename {extensions => native-plugins}/feishu/src/pins.ts (100%) rename {extensions => native-plugins}/feishu/src/policy.test.ts (100%) rename {extensions => native-plugins}/feishu/src/policy.ts (100%) rename {extensions => native-plugins}/feishu/src/post.test.ts (100%) rename {extensions => native-plugins}/feishu/src/post.ts (100%) rename {extensions => native-plugins}/feishu/src/probe.test.ts (100%) rename {extensions => native-plugins}/feishu/src/probe.ts (100%) rename {extensions => native-plugins}/feishu/src/reactions.ts (100%) rename {extensions => native-plugins}/feishu/src/reply-dispatcher.test.ts (100%) rename {extensions => native-plugins}/feishu/src/reply-dispatcher.ts (100%) rename {extensions => native-plugins}/feishu/src/runtime.ts (100%) rename {extensions => native-plugins}/feishu/src/secret-input.ts (100%) rename {extensions => native-plugins}/feishu/src/send-message.ts (100%) rename {extensions => native-plugins}/feishu/src/send-result.ts (100%) rename {extensions => native-plugins}/feishu/src/send-target.test.ts (100%) rename {extensions => native-plugins}/feishu/src/send-target.ts (100%) rename {extensions => native-plugins}/feishu/src/send.reply-fallback.test.ts (100%) rename {extensions => native-plugins}/feishu/src/send.test.ts (100%) rename {extensions => native-plugins}/feishu/src/send.ts (100%) rename {extensions => native-plugins}/feishu/src/session-route.ts (100%) rename {extensions => native-plugins}/feishu/src/setup-core.ts (100%) rename {extensions => native-plugins}/feishu/src/setup-status.test.ts (100%) rename {extensions => native-plugins}/feishu/src/setup-surface.test.ts (100%) rename {extensions => native-plugins}/feishu/src/setup-surface.ts (100%) rename {extensions => native-plugins}/feishu/src/streaming-card.test.ts (100%) rename {extensions => native-plugins}/feishu/src/streaming-card.ts (100%) rename {extensions => native-plugins}/feishu/src/subagent-hooks.test.ts (99%) rename {extensions => native-plugins}/feishu/src/subagent-hooks.ts (100%) rename {extensions => native-plugins}/feishu/src/targets.test.ts (100%) rename {extensions => native-plugins}/feishu/src/targets.ts (100%) rename {extensions => native-plugins}/feishu/src/thread-bindings.test.ts (100%) rename {extensions => native-plugins}/feishu/src/thread-bindings.ts (100%) rename {extensions => native-plugins}/feishu/src/tool-account-routing.test.ts (100%) rename {extensions => native-plugins}/feishu/src/tool-account.ts (100%) rename {extensions => native-plugins}/feishu/src/tool-factory-test-harness.ts (100%) rename {extensions => native-plugins}/feishu/src/tool-result.test.ts (100%) rename {extensions => native-plugins}/feishu/src/tool-result.ts (100%) rename {extensions => native-plugins}/feishu/src/tools-config.test.ts (100%) rename {extensions => native-plugins}/feishu/src/tools-config.ts (100%) rename {extensions => native-plugins}/feishu/src/types.ts (100%) rename {extensions => native-plugins}/feishu/src/typing.test.ts (100%) rename {extensions => native-plugins}/feishu/src/typing.ts (100%) rename {extensions => native-plugins}/feishu/src/wiki-schema.ts (100%) rename {extensions => native-plugins}/feishu/src/wiki.ts (100%) rename {extensions => native-plugins}/firecrawl/index.test.ts (100%) rename {extensions => native-plugins}/firecrawl/index.ts (100%) rename {extensions => native-plugins}/firecrawl/openclaw.plugin.json (100%) rename {extensions => native-plugins}/firecrawl/package.json (90%) rename {extensions => native-plugins}/firecrawl/src/config.ts (100%) rename {extensions => native-plugins}/firecrawl/src/firecrawl-client.ts (100%) rename {extensions => native-plugins}/firecrawl/src/firecrawl-scrape-tool.ts (100%) rename {extensions => native-plugins}/firecrawl/src/firecrawl-search-provider.ts (100%) rename {extensions => native-plugins}/firecrawl/src/firecrawl-search-tool.ts (100%) rename {extensions => native-plugins}/github-copilot/index.ts (100%) rename {extensions => native-plugins}/github-copilot/openclaw.plugin.json (100%) rename {extensions => native-plugins}/github-copilot/package.json (91%) rename {extensions => native-plugins}/github-copilot/token.test.ts (100%) rename {extensions => native-plugins}/github-copilot/token.ts (100%) rename {extensions => native-plugins}/github-copilot/usage.test.ts (97%) rename {extensions => native-plugins}/github-copilot/usage.ts (100%) rename {extensions => native-plugins}/google/gemini-cli-provider.ts (100%) rename {extensions => native-plugins}/google/index.ts (100%) rename {extensions => native-plugins}/google/media-understanding-provider.ts (100%) rename {extensions => native-plugins}/google/oauth.credentials.ts (100%) rename {extensions => native-plugins}/google/oauth.flow.ts (100%) rename {extensions => native-plugins}/google/oauth.http.ts (100%) rename {extensions => native-plugins}/google/oauth.project.ts (100%) rename {extensions => native-plugins}/google/oauth.runtime.ts (100%) rename {extensions => native-plugins}/google/oauth.shared.ts (100%) rename {extensions => native-plugins}/google/oauth.test.ts (100%) rename {extensions => native-plugins}/google/oauth.token.ts (100%) rename {extensions => native-plugins}/google/oauth.ts (100%) rename {extensions => native-plugins}/google/openclaw.plugin.json (100%) rename {extensions => native-plugins}/google/package.json (90%) rename {extensions => native-plugins}/google/provider-models.ts (100%) rename {extensions => native-plugins}/google/runtime-api.ts (100%) rename {extensions => native-plugins}/google/src/gemini-web-search-provider.ts (100%) rename {extensions => native-plugins}/googlechat/api.ts (100%) rename {extensions => native-plugins}/googlechat/index.ts (100%) rename {extensions => native-plugins}/googlechat/openclaw.plugin.json (100%) rename {extensions => native-plugins}/googlechat/package.json (93%) rename {extensions => native-plugins}/googlechat/runtime-api.ts (100%) rename {extensions => native-plugins}/googlechat/setup-entry.ts (100%) rename {extensions => native-plugins}/googlechat/src/accounts.test.ts (100%) rename {extensions => native-plugins}/googlechat/src/accounts.ts (100%) rename {extensions => native-plugins}/googlechat/src/actions.ts (100%) rename {extensions => native-plugins}/googlechat/src/api.test.ts (100%) rename {extensions => native-plugins}/googlechat/src/api.ts (100%) rename {extensions => native-plugins}/googlechat/src/auth.test.ts (100%) rename {extensions => native-plugins}/googlechat/src/auth.ts (100%) rename {extensions => native-plugins}/googlechat/src/channel.directory.test.ts (96%) rename {extensions => native-plugins}/googlechat/src/channel.outbound.test.ts (100%) rename {extensions => native-plugins}/googlechat/src/channel.runtime.ts (100%) rename {extensions => native-plugins}/googlechat/src/channel.startup.test.ts (96%) rename {extensions => native-plugins}/googlechat/src/channel.ts (99%) rename {extensions => native-plugins}/googlechat/src/config-schema.ts (100%) rename {extensions => native-plugins}/googlechat/src/group-policy.test.ts (100%) rename {extensions => native-plugins}/googlechat/src/group-policy.ts (100%) rename {extensions => native-plugins}/googlechat/src/monitor-access.ts (100%) rename {extensions => native-plugins}/googlechat/src/monitor-types.ts (100%) rename {extensions => native-plugins}/googlechat/src/monitor-webhook.ts (100%) rename {extensions => native-plugins}/googlechat/src/monitor.test.ts (100%) rename {extensions => native-plugins}/googlechat/src/monitor.ts (100%) rename {extensions => native-plugins}/googlechat/src/monitor.webhook-routing.test.ts (99%) rename {extensions => native-plugins}/googlechat/src/resolve-target.test.ts (100%) rename {extensions => native-plugins}/googlechat/src/runtime.ts (100%) rename {extensions => native-plugins}/googlechat/src/setup-core.ts (100%) rename {extensions => native-plugins}/googlechat/src/setup-surface.test.ts (92%) rename {extensions => native-plugins}/googlechat/src/setup-surface.ts (100%) rename {extensions => native-plugins}/googlechat/src/targets.test.ts (100%) rename {extensions => native-plugins}/googlechat/src/targets.ts (100%) rename {extensions => native-plugins}/googlechat/src/types.config.ts (100%) rename {extensions => native-plugins}/googlechat/src/types.ts (100%) rename {extensions => native-plugins}/huggingface/index.ts (100%) rename {extensions => native-plugins}/huggingface/onboard.ts (100%) rename {extensions => native-plugins}/huggingface/openclaw.plugin.json (100%) rename {extensions => native-plugins}/huggingface/package.json (91%) rename {extensions => native-plugins}/huggingface/provider-catalog.ts (100%) rename {extensions => native-plugins}/imessage/api.ts (100%) rename {extensions => native-plugins}/imessage/index.ts (100%) rename {extensions => native-plugins}/imessage/openclaw.plugin.json (100%) rename {extensions => native-plugins}/imessage/package.json (96%) rename {extensions => native-plugins}/imessage/runtime-api.ts (100%) rename {extensions => native-plugins}/imessage/setup-entry.ts (100%) rename {extensions => native-plugins}/imessage/src/accounts.ts (100%) rename {extensions => native-plugins}/imessage/src/channel.outbound.test.ts (100%) rename {extensions => native-plugins}/imessage/src/channel.runtime.ts (100%) rename {extensions => native-plugins}/imessage/src/channel.setup.ts (100%) rename {extensions => native-plugins}/imessage/src/channel.ts (99%) rename {extensions => native-plugins}/imessage/src/client.ts (100%) rename {extensions => native-plugins}/imessage/src/config-schema.ts (100%) rename {extensions => native-plugins}/imessage/src/constants.ts (100%) rename {extensions => native-plugins}/imessage/src/group-policy.test.ts (100%) rename {extensions => native-plugins}/imessage/src/group-policy.ts (100%) rename {extensions => native-plugins}/imessage/src/monitor.gating.test.ts (100%) rename {extensions => native-plugins}/imessage/src/monitor.shutdown.unhandled-rejection.test.ts (100%) rename {extensions => native-plugins}/imessage/src/monitor.ts (100%) rename {extensions => native-plugins}/imessage/src/monitor/abort-handler.ts (100%) rename {extensions => native-plugins}/imessage/src/monitor/deliver.test.ts (100%) rename {extensions => native-plugins}/imessage/src/monitor/deliver.ts (100%) rename {extensions => native-plugins}/imessage/src/monitor/echo-cache.ts (100%) rename {extensions => native-plugins}/imessage/src/monitor/inbound-processing.test.ts (100%) rename {extensions => native-plugins}/imessage/src/monitor/inbound-processing.ts (100%) rename {extensions => native-plugins}/imessage/src/monitor/loop-rate-limiter.test.ts (100%) rename {extensions => native-plugins}/imessage/src/monitor/loop-rate-limiter.ts (100%) rename {extensions => native-plugins}/imessage/src/monitor/monitor-provider.echo-cache.test.ts (100%) rename {extensions => native-plugins}/imessage/src/monitor/monitor-provider.ts (100%) rename {extensions => native-plugins}/imessage/src/monitor/parse-notification.ts (100%) rename {extensions => native-plugins}/imessage/src/monitor/reflection-guard.test.ts (100%) rename {extensions => native-plugins}/imessage/src/monitor/reflection-guard.ts (100%) rename {extensions => native-plugins}/imessage/src/monitor/runtime.ts (100%) rename {extensions => native-plugins}/imessage/src/monitor/sanitize-outbound.test.ts (100%) rename {extensions => native-plugins}/imessage/src/monitor/sanitize-outbound.ts (100%) rename {extensions => native-plugins}/imessage/src/monitor/self-chat-cache.test.ts (100%) rename {extensions => native-plugins}/imessage/src/monitor/self-chat-cache.ts (100%) rename {extensions => native-plugins}/imessage/src/monitor/types.ts (100%) rename {extensions => native-plugins}/imessage/src/outbound-adapter.ts (100%) rename {extensions => native-plugins}/imessage/src/plugin-shared.ts (100%) rename {extensions => native-plugins}/imessage/src/probe.test.ts (100%) rename {extensions => native-plugins}/imessage/src/probe.ts (100%) rename {extensions => native-plugins}/imessage/src/runtime.ts (100%) rename {extensions => native-plugins}/imessage/src/send.test.ts (100%) rename {extensions => native-plugins}/imessage/src/send.ts (100%) rename {extensions => native-plugins}/imessage/src/setup-allow-from.test.ts (100%) rename {extensions => native-plugins}/imessage/src/setup-core.ts (100%) rename {extensions => native-plugins}/imessage/src/setup-surface.ts (100%) rename {extensions => native-plugins}/imessage/src/shared.ts (100%) rename {extensions => native-plugins}/imessage/src/target-parsing-helpers.ts (100%) rename {extensions => native-plugins}/imessage/src/targets.test.ts (100%) rename {extensions => native-plugins}/imessage/src/targets.ts (100%) rename {extensions => native-plugins}/irc/api.ts (100%) rename {extensions => native-plugins}/irc/index.ts (100%) rename {extensions => native-plugins}/irc/openclaw.plugin.json (100%) rename {extensions => native-plugins}/irc/package.json (96%) rename {extensions => native-plugins}/irc/setup-entry.ts (100%) rename {extensions => native-plugins}/irc/src/accounts.test.ts (100%) rename {extensions => native-plugins}/irc/src/accounts.ts (100%) rename {extensions => native-plugins}/irc/src/channel.startup.test.ts (95%) rename {extensions => native-plugins}/irc/src/channel.ts (99%) rename {extensions => native-plugins}/irc/src/client.test.ts (100%) rename {extensions => native-plugins}/irc/src/client.ts (100%) rename {extensions => native-plugins}/irc/src/config-schema.test.ts (100%) rename {extensions => native-plugins}/irc/src/config-schema.ts (99%) rename {extensions => native-plugins}/irc/src/connect-options.ts (100%) rename {extensions => native-plugins}/irc/src/control-chars.ts (100%) rename {extensions => native-plugins}/irc/src/inbound.policy.test.ts (100%) rename {extensions => native-plugins}/irc/src/inbound.ts (100%) rename {extensions => native-plugins}/irc/src/monitor.test.ts (100%) rename {extensions => native-plugins}/irc/src/monitor.ts (99%) rename {extensions => native-plugins}/irc/src/normalize.test.ts (100%) rename {extensions => native-plugins}/irc/src/normalize.ts (100%) rename {extensions => native-plugins}/irc/src/policy.test.ts (100%) rename {extensions => native-plugins}/irc/src/policy.ts (100%) rename {extensions => native-plugins}/irc/src/probe.ts (100%) rename {extensions => native-plugins}/irc/src/protocol.test.ts (100%) rename {extensions => native-plugins}/irc/src/protocol.ts (100%) rename {extensions => native-plugins}/irc/src/runtime-api.ts (100%) rename {extensions => native-plugins}/irc/src/runtime.ts (100%) rename {extensions => native-plugins}/irc/src/send.test.ts (98%) rename {extensions => native-plugins}/irc/src/send.ts (100%) rename {extensions => native-plugins}/irc/src/setup-core.ts (100%) rename {extensions => native-plugins}/irc/src/setup-surface.test.ts (96%) rename {extensions => native-plugins}/irc/src/setup-surface.ts (100%) rename {extensions => native-plugins}/irc/src/types.ts (100%) rename {extensions => native-plugins}/kilocode/index.ts (100%) rename {extensions => native-plugins}/kilocode/onboard.ts (100%) rename {extensions => native-plugins}/kilocode/openclaw.plugin.json (100%) rename {extensions => native-plugins}/kilocode/package.json (91%) rename {extensions => native-plugins}/kilocode/provider-catalog.ts (100%) rename {extensions => native-plugins}/kimi-coding/index.ts (100%) rename {extensions => native-plugins}/kimi-coding/onboard.ts (100%) rename {extensions => native-plugins}/kimi-coding/openclaw.plugin.json (100%) rename {extensions => native-plugins}/kimi-coding/package.json (90%) rename {extensions => native-plugins}/kimi-coding/provider-catalog.ts (100%) rename {extensions => native-plugins}/line/api.ts (100%) rename {extensions => native-plugins}/line/index.ts (100%) rename {extensions => native-plugins}/line/openclaw.plugin.json (100%) rename {extensions => native-plugins}/line/package.json (91%) rename {extensions => native-plugins}/line/runtime-api.ts (100%) rename {extensions => native-plugins}/line/setup-api.ts (100%) rename {extensions => native-plugins}/line/setup-entry.ts (100%) rename {extensions => native-plugins}/line/src/card-command.ts (100%) rename {extensions => native-plugins}/line/src/channel.logout.test.ts (98%) rename {extensions => native-plugins}/line/src/channel.sendPayload.test.ts (100%) rename {extensions => native-plugins}/line/src/channel.setup.ts (100%) rename {extensions => native-plugins}/line/src/channel.startup.test.ts (97%) rename {extensions => native-plugins}/line/src/channel.ts (100%) rename {extensions => native-plugins}/line/src/config-adapter.ts (100%) rename {extensions => native-plugins}/line/src/config-schema.ts (100%) rename {extensions => native-plugins}/line/src/group-policy.test.ts (100%) rename {extensions => native-plugins}/line/src/group-policy.ts (100%) rename {extensions => native-plugins}/line/src/runtime.ts (100%) rename {extensions => native-plugins}/line/src/setup-core.ts (100%) rename {extensions => native-plugins}/line/src/setup-surface.test.ts (93%) rename {extensions => native-plugins}/line/src/setup-surface.ts (100%) rename {extensions => native-plugins}/llm-task/README.md (97%) rename {extensions => native-plugins}/llm-task/api.ts (100%) rename {extensions => native-plugins}/llm-task/index.ts (100%) rename {extensions => native-plugins}/llm-task/openclaw.plugin.json (100%) rename {extensions => native-plugins}/llm-task/package.json (93%) rename {extensions => native-plugins}/llm-task/src/llm-task-tool.test.ts (100%) rename {extensions => native-plugins}/llm-task/src/llm-task-tool.ts (100%) rename {extensions => native-plugins}/lobster/README.md (100%) rename {extensions => native-plugins}/lobster/SKILL.md (100%) rename {extensions => native-plugins}/lobster/index.ts (100%) rename {extensions => native-plugins}/lobster/openclaw.plugin.json (100%) rename {extensions => native-plugins}/lobster/package.json (94%) rename {extensions => native-plugins}/lobster/runtime-api.ts (100%) rename {extensions => native-plugins}/lobster/src/lobster-tool.test.ts (100%) rename {extensions => native-plugins}/lobster/src/lobster-tool.ts (100%) rename {extensions => native-plugins}/lobster/src/test-helpers.ts (100%) rename {extensions => native-plugins}/lobster/src/windows-spawn.test.ts (100%) rename {extensions => native-plugins}/lobster/src/windows-spawn.ts (100%) rename {extensions => native-plugins}/matrix/CHANGELOG.md (100%) rename {extensions => native-plugins}/matrix/api.ts (100%) rename {extensions => native-plugins}/matrix/helper-api.ts (100%) rename {extensions => native-plugins}/matrix/index.test.ts (100%) rename {extensions => native-plugins}/matrix/index.ts (100%) rename {extensions => native-plugins}/matrix/legacy-crypto-inspector.ts (100%) rename {extensions => native-plugins}/matrix/openclaw.plugin.json (100%) rename {extensions => native-plugins}/matrix/package.json (94%) rename {extensions => native-plugins}/matrix/runtime-api.ts (100%) rename {extensions => native-plugins}/matrix/setup-entry.ts (100%) rename {extensions => native-plugins}/matrix/src/account-selection.ts (100%) rename {extensions => native-plugins}/matrix/src/actions.account-propagation.test.ts (100%) rename {extensions => native-plugins}/matrix/src/actions.test.ts (100%) rename {extensions => native-plugins}/matrix/src/actions.ts (100%) rename {extensions => native-plugins}/matrix/src/auth-precedence.ts (100%) rename {extensions => native-plugins}/matrix/src/channel.account-paths.test.ts (100%) rename {extensions => native-plugins}/matrix/src/channel.directory.test.ts (100%) rename {extensions => native-plugins}/matrix/src/channel.resolve.test.ts (100%) rename {extensions => native-plugins}/matrix/src/channel.runtime.ts (100%) rename {extensions => native-plugins}/matrix/src/channel.setup.test.ts (100%) rename {extensions => native-plugins}/matrix/src/channel.ts (99%) rename {extensions => native-plugins}/matrix/src/cli.test.ts (100%) rename {extensions => native-plugins}/matrix/src/cli.ts (100%) rename {extensions => native-plugins}/matrix/src/config-schema.test.ts (100%) rename {extensions => native-plugins}/matrix/src/config-schema.ts (100%) rename {extensions => native-plugins}/matrix/src/directory-live.test.ts (100%) rename {extensions => native-plugins}/matrix/src/directory-live.ts (100%) rename {extensions => native-plugins}/matrix/src/env-vars.ts (100%) rename {extensions => native-plugins}/matrix/src/group-mentions.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/account-config.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/accounts.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/accounts.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/actions.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/actions/client.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/actions/client.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/actions/devices.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/actions/devices.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/actions/limits.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/actions/limits.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/actions/messages.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/actions/messages.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/actions/pins.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/actions/pins.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/actions/polls.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/actions/polls.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/actions/profile.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/actions/profile.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/actions/reactions.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/actions/reactions.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/actions/room.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/actions/room.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/actions/summary.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/actions/summary.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/actions/types.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/actions/verification.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/actions/verification.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/active-client.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/backup-health.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/client-bootstrap.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/client-bootstrap.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/client-resolver.test-helpers.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/client.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/client.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/client/config.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/client/create-client.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/client/file-sync-store.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/client/file-sync-store.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/client/logging.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/client/runtime.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/client/shared.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/client/shared.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/client/storage.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/client/storage.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/client/types.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/config-update.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/config-update.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/credentials-read.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/credentials-write.runtime.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/credentials.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/credentials.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/deps.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/deps.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/device-health.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/device-health.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/direct-management.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/direct-management.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/direct-room.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/encryption-guidance.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/format.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/format.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/index.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/legacy-crypto-inspector.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/media-text.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/access-state.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/access-state.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/ack-config.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/ack-config.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/allowlist.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/allowlist.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/auto-join.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/auto-join.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/config.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/config.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/direct.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/direct.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/events.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/events.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/handler.body-for-agent.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/handler.media-failure.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/handler.test-helpers.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/handler.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/handler.thread-root-media.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/handler.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/index.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/index.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/legacy-crypto-restore.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/legacy-crypto-restore.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/location.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/media.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/media.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/mentions.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/mentions.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/reaction-events.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/replies.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/replies.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/room-info.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/room-info.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/rooms.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/rooms.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/route.test.ts (98%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/route.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/startup-verification.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/startup-verification.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/startup.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/startup.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/thread-context.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/thread-context.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/threads.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/types.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/verification-events.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/verification-utils.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/monitor/verification-utils.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/poll-summary.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/poll-types.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/poll-types.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/probe.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/probe.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/profile.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/profile.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/reaction-common.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/reaction-common.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/sdk.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/sdk.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/sdk/crypto-bootstrap.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/sdk/crypto-bootstrap.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/sdk/crypto-facade.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/sdk/crypto-facade.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/sdk/crypto-node.runtime.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/sdk/decrypt-bridge.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/sdk/event-helpers.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/sdk/event-helpers.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/sdk/http-client.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/sdk/http-client.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/sdk/idb-persistence.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/sdk/idb-persistence.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/sdk/logger.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/sdk/logger.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/sdk/read-response-with-limit.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/sdk/recovery-key-store.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/sdk/recovery-key-store.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/sdk/transport.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/sdk/transport.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/sdk/types.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/sdk/verification-manager.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/sdk/verification-manager.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/sdk/verification-status.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/send.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/send.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/send/client.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/send/client.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/send/formatting.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/send/media.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/send/targets.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/send/targets.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/send/types.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/target-ids.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/thread-bindings-shared.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/thread-bindings.test.ts (100%) rename {extensions => native-plugins}/matrix/src/matrix/thread-bindings.ts (100%) rename {extensions => native-plugins}/matrix/src/onboarding.resolve.test.ts (100%) rename {extensions => native-plugins}/matrix/src/onboarding.test.ts (100%) rename {extensions => native-plugins}/matrix/src/onboarding.ts (100%) rename {extensions => native-plugins}/matrix/src/outbound.test.ts (100%) rename {extensions => native-plugins}/matrix/src/outbound.ts (100%) rename {extensions => native-plugins}/matrix/src/plugin-entry.runtime.ts (100%) rename {extensions => native-plugins}/matrix/src/profile-update.ts (100%) rename {extensions => native-plugins}/matrix/src/resolve-targets.test.ts (100%) rename {extensions => native-plugins}/matrix/src/resolve-targets.ts (100%) rename {extensions => native-plugins}/matrix/src/runtime-api.ts (100%) rename {extensions => native-plugins}/matrix/src/runtime.ts (100%) rename {extensions => native-plugins}/matrix/src/session-route.ts (100%) rename {extensions => native-plugins}/matrix/src/setup-bootstrap.ts (100%) rename {extensions => native-plugins}/matrix/src/setup-config.ts (100%) rename {extensions => native-plugins}/matrix/src/setup-core.test.ts (100%) rename {extensions => native-plugins}/matrix/src/setup-core.ts (100%) rename {extensions => native-plugins}/matrix/src/setup-surface.ts (100%) rename {extensions => native-plugins}/matrix/src/storage-paths.ts (100%) rename {extensions => native-plugins}/matrix/src/test-mocks.ts (100%) rename {extensions => native-plugins}/matrix/src/tool-actions.runtime.ts (100%) rename {extensions => native-plugins}/matrix/src/tool-actions.test.ts (100%) rename {extensions => native-plugins}/matrix/src/tool-actions.ts (100%) rename {extensions => native-plugins}/matrix/src/types.ts (100%) rename {extensions => native-plugins}/matrix/thread-bindings-runtime.ts (100%) rename {extensions => native-plugins}/mattermost/api.ts (100%) rename {extensions => native-plugins}/mattermost/index.test.ts (93%) rename {extensions => native-plugins}/mattermost/index.ts (100%) rename {extensions => native-plugins}/mattermost/openclaw.plugin.json (100%) rename {extensions => native-plugins}/mattermost/package.json (91%) rename {extensions => native-plugins}/mattermost/runtime-api.ts (100%) rename {extensions => native-plugins}/mattermost/setup-entry.ts (100%) rename {extensions => native-plugins}/mattermost/src/channel.test.ts (100%) rename {extensions => native-plugins}/mattermost/src/channel.ts (99%) rename {extensions => native-plugins}/mattermost/src/config-schema.test.ts (100%) rename {extensions => native-plugins}/mattermost/src/config-schema.ts (99%) rename {extensions => native-plugins}/mattermost/src/group-mentions.test.ts (100%) rename {extensions => native-plugins}/mattermost/src/group-mentions.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/accounts.test.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/accounts.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/client.retry.test.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/client.test.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/client.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/directory.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/index.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/interactions.test.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/interactions.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/model-picker.test.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/model-picker.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/monitor-auth.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/monitor-gating.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/monitor-helpers.test.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/monitor-helpers.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/monitor-onchar.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/monitor-resources.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/monitor-slash.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/monitor-websocket.test.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/monitor-websocket.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/monitor.authz.test.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/monitor.channel-kind.test.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/monitor.test.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/monitor.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/probe.test.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/probe.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/reactions.test-helpers.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/reactions.test.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/reactions.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/reconnect.test.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/reconnect.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/reply-delivery.test.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/reply-delivery.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/runtime-api.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/send.test.ts (99%) rename {extensions => native-plugins}/mattermost/src/mattermost/send.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/slash-commands.test.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/slash-commands.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/slash-http.test.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/slash-http.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/slash-state.test.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/slash-state.ts (100%) rename {extensions => native-plugins}/mattermost/src/mattermost/target-resolution.ts (100%) rename {extensions => native-plugins}/mattermost/src/normalize.test.ts (100%) rename {extensions => native-plugins}/mattermost/src/normalize.ts (100%) rename {extensions => native-plugins}/mattermost/src/runtime-api.ts (100%) rename {extensions => native-plugins}/mattermost/src/runtime.ts (100%) rename {extensions => native-plugins}/mattermost/src/secret-input.ts (100%) rename {extensions => native-plugins}/mattermost/src/session-route.ts (100%) rename {extensions => native-plugins}/mattermost/src/setup-core.ts (100%) rename {extensions => native-plugins}/mattermost/src/setup-status.test.ts (100%) rename {extensions => native-plugins}/mattermost/src/setup-surface.ts (100%) rename {extensions => native-plugins}/mattermost/src/types.ts (100%) rename {extensions => native-plugins}/memory-core/index.ts (100%) rename {extensions => native-plugins}/memory-core/openclaw.plugin.json (100%) rename {extensions => native-plugins}/memory-core/package.json (94%) rename {extensions => native-plugins}/memory-lancedb/api.ts (100%) rename {extensions => native-plugins}/memory-lancedb/config.ts (100%) rename {extensions => native-plugins}/memory-lancedb/index.test.ts (100%) rename {extensions => native-plugins}/memory-lancedb/index.ts (100%) rename {extensions => native-plugins}/memory-lancedb/openclaw.plugin.json (100%) rename {extensions => native-plugins}/memory-lancedb/package.json (87%) rename {extensions => native-plugins}/microsoft/index.ts (100%) rename {extensions => native-plugins}/microsoft/openclaw.plugin.json (100%) rename {extensions => native-plugins}/microsoft/package.json (91%) rename {extensions => native-plugins}/minimax/README.md (100%) rename {extensions => native-plugins}/minimax/index.ts (100%) rename {extensions => native-plugins}/minimax/media-understanding-provider.ts (100%) rename {extensions => native-plugins}/minimax/model-definitions.test.ts (100%) rename {extensions => native-plugins}/minimax/model-definitions.ts (100%) rename {extensions => native-plugins}/minimax/oauth.runtime.ts (100%) rename {extensions => native-plugins}/minimax/oauth.ts (100%) rename {extensions => native-plugins}/minimax/onboard.ts (100%) rename {extensions => native-plugins}/minimax/openclaw.plugin.json (100%) rename {extensions => native-plugins}/minimax/package.json (91%) rename {extensions => native-plugins}/minimax/provider-catalog.ts (100%) rename {extensions => native-plugins}/mistral/index.ts (100%) rename {extensions => native-plugins}/mistral/media-understanding-provider.ts (100%) rename {extensions => native-plugins}/mistral/model-definitions.ts (100%) rename {extensions => native-plugins}/mistral/onboard.ts (100%) rename {extensions => native-plugins}/mistral/openclaw.plugin.json (100%) rename {extensions => native-plugins}/mistral/package.json (91%) rename {extensions => native-plugins}/modelstudio/index.ts (100%) rename {extensions => native-plugins}/modelstudio/model-definitions.ts (100%) rename {extensions => native-plugins}/modelstudio/onboard.ts (100%) rename {extensions => native-plugins}/modelstudio/openclaw.plugin.json (100%) rename {extensions => native-plugins}/modelstudio/package.json (91%) rename {extensions => native-plugins}/modelstudio/provider-catalog.ts (100%) rename {extensions => native-plugins}/moonshot/index.ts (100%) rename {extensions => native-plugins}/moonshot/media-understanding-provider.ts (100%) rename {extensions => native-plugins}/moonshot/onboard.ts (100%) rename {extensions => native-plugins}/moonshot/openclaw.plugin.json (100%) rename {extensions => native-plugins}/moonshot/package.json (91%) rename {extensions => native-plugins}/moonshot/provider-catalog.ts (100%) rename {extensions => native-plugins}/moonshot/src/kimi-web-search-provider.ts (100%) rename {extensions => native-plugins}/msteams/CHANGELOG.md (100%) rename {extensions => native-plugins}/msteams/api.ts (100%) rename {extensions => native-plugins}/msteams/index.ts (100%) rename {extensions => native-plugins}/msteams/openclaw.plugin.json (100%) rename {extensions => native-plugins}/msteams/package.json (92%) rename {extensions => native-plugins}/msteams/runtime-api.ts (100%) rename {extensions => native-plugins}/msteams/setup-entry.ts (100%) rename {extensions => native-plugins}/msteams/src/attachments.test.ts (99%) rename {extensions => native-plugins}/msteams/src/attachments.ts (100%) rename {extensions => native-plugins}/msteams/src/attachments/download.ts (100%) rename {extensions => native-plugins}/msteams/src/attachments/graph.ts (100%) rename {extensions => native-plugins}/msteams/src/attachments/html.ts (100%) rename {extensions => native-plugins}/msteams/src/attachments/payload.ts (100%) rename {extensions => native-plugins}/msteams/src/attachments/remote-media.ts (100%) rename {extensions => native-plugins}/msteams/src/attachments/shared.test.ts (100%) rename {extensions => native-plugins}/msteams/src/attachments/shared.ts (100%) rename {extensions => native-plugins}/msteams/src/attachments/types.ts (100%) rename {extensions => native-plugins}/msteams/src/channel.directory.test.ts (96%) rename {extensions => native-plugins}/msteams/src/channel.runtime.ts (100%) rename {extensions => native-plugins}/msteams/src/channel.ts (100%) rename {extensions => native-plugins}/msteams/src/config-schema.ts (100%) rename {extensions => native-plugins}/msteams/src/conversation-store-fs.test.ts (100%) rename {extensions => native-plugins}/msteams/src/conversation-store-fs.ts (100%) rename {extensions => native-plugins}/msteams/src/conversation-store-memory.ts (100%) rename {extensions => native-plugins}/msteams/src/conversation-store.ts (100%) rename {extensions => native-plugins}/msteams/src/directory-live.ts (100%) rename {extensions => native-plugins}/msteams/src/errors.test.ts (100%) rename {extensions => native-plugins}/msteams/src/errors.ts (100%) rename {extensions => native-plugins}/msteams/src/file-consent-helpers.test.ts (100%) rename {extensions => native-plugins}/msteams/src/file-consent-helpers.ts (100%) rename {extensions => native-plugins}/msteams/src/file-consent.ts (100%) rename {extensions => native-plugins}/msteams/src/file-lock.ts (100%) rename {extensions => native-plugins}/msteams/src/graph-chat.ts (100%) rename {extensions => native-plugins}/msteams/src/graph-upload.test.ts (97%) rename {extensions => native-plugins}/msteams/src/graph-upload.ts (100%) rename {extensions => native-plugins}/msteams/src/graph-users.test.ts (100%) rename {extensions => native-plugins}/msteams/src/graph-users.ts (100%) rename {extensions => native-plugins}/msteams/src/graph.ts (100%) rename {extensions => native-plugins}/msteams/src/inbound.test.ts (100%) rename {extensions => native-plugins}/msteams/src/inbound.ts (100%) rename {extensions => native-plugins}/msteams/src/index.ts (100%) rename {extensions => native-plugins}/msteams/src/media-helpers.test.ts (100%) rename {extensions => native-plugins}/msteams/src/media-helpers.ts (100%) rename {extensions => native-plugins}/msteams/src/mentions.test.ts (100%) rename {extensions => native-plugins}/msteams/src/mentions.ts (100%) rename {extensions => native-plugins}/msteams/src/messenger.test.ts (99%) rename {extensions => native-plugins}/msteams/src/messenger.ts (100%) rename {extensions => native-plugins}/msteams/src/monitor-handler.file-consent.test.ts (100%) rename {extensions => native-plugins}/msteams/src/monitor-handler.ts (100%) rename {extensions => native-plugins}/msteams/src/monitor-handler/inbound-media.ts (100%) rename {extensions => native-plugins}/msteams/src/monitor-handler/message-handler.authz.test.ts (100%) rename {extensions => native-plugins}/msteams/src/monitor-handler/message-handler.ts (100%) rename {extensions => native-plugins}/msteams/src/monitor-types.ts (100%) rename {extensions => native-plugins}/msteams/src/monitor.lifecycle.test.ts (100%) rename {extensions => native-plugins}/msteams/src/monitor.test.ts (100%) rename {extensions => native-plugins}/msteams/src/monitor.ts (100%) rename {extensions => native-plugins}/msteams/src/outbound.test.ts (100%) rename {extensions => native-plugins}/msteams/src/outbound.ts (100%) rename {extensions => native-plugins}/msteams/src/pending-uploads.ts (100%) rename {extensions => native-plugins}/msteams/src/policy.test.ts (100%) rename {extensions => native-plugins}/msteams/src/policy.ts (100%) rename {extensions => native-plugins}/msteams/src/polls-store-memory.ts (100%) rename {extensions => native-plugins}/msteams/src/polls-store.test.ts (100%) rename {extensions => native-plugins}/msteams/src/polls.test.ts (100%) rename {extensions => native-plugins}/msteams/src/polls.ts (100%) rename {extensions => native-plugins}/msteams/src/probe.test.ts (100%) rename {extensions => native-plugins}/msteams/src/probe.ts (100%) rename {extensions => native-plugins}/msteams/src/reply-dispatcher.ts (100%) rename {extensions => native-plugins}/msteams/src/resolve-allowlist.test.ts (100%) rename {extensions => native-plugins}/msteams/src/resolve-allowlist.ts (100%) rename {extensions => native-plugins}/msteams/src/revoked-context.test.ts (100%) rename {extensions => native-plugins}/msteams/src/revoked-context.ts (100%) rename {extensions => native-plugins}/msteams/src/runtime.ts (100%) rename {extensions => native-plugins}/msteams/src/sdk-types.ts (100%) rename {extensions => native-plugins}/msteams/src/sdk.ts (100%) rename {extensions => native-plugins}/msteams/src/secret-input.ts (100%) rename {extensions => native-plugins}/msteams/src/send-context.ts (100%) rename {extensions => native-plugins}/msteams/src/send.test.ts (100%) rename {extensions => native-plugins}/msteams/src/send.ts (100%) rename {extensions => native-plugins}/msteams/src/sent-message-cache.test.ts (100%) rename {extensions => native-plugins}/msteams/src/sent-message-cache.ts (100%) rename {extensions => native-plugins}/msteams/src/session-route.ts (100%) rename {extensions => native-plugins}/msteams/src/setup-core.ts (100%) rename {extensions => native-plugins}/msteams/src/setup-surface.ts (100%) rename {extensions => native-plugins}/msteams/src/storage.ts (100%) rename {extensions => native-plugins}/msteams/src/store-fs.ts (100%) rename {extensions => native-plugins}/msteams/src/test-runtime.ts (100%) rename {extensions => native-plugins}/msteams/src/token-response.test.ts (100%) rename {extensions => native-plugins}/msteams/src/token-response.ts (100%) rename {extensions => native-plugins}/msteams/src/token.test.ts (100%) rename {extensions => native-plugins}/msteams/src/token.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/api.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/index.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/openclaw.plugin.json (100%) rename {extensions => native-plugins}/nextcloud-talk/package.json (92%) rename {extensions => native-plugins}/nextcloud-talk/runtime-api.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/setup-entry.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/accounts.test.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/accounts.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/channel.startup.test.ts (95%) rename {extensions => native-plugins}/nextcloud-talk/src/channel.ts (99%) rename {extensions => native-plugins}/nextcloud-talk/src/config-schema.test.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/config-schema.ts (98%) rename {extensions => native-plugins}/nextcloud-talk/src/format.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/inbound.authz.test.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/inbound.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/monitor.auth-order.test.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/monitor.backend.test.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/monitor.read-body.test.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/monitor.replay.test.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/monitor.test-fixtures.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/monitor.test-harness.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/monitor.ts (99%) rename {extensions => native-plugins}/nextcloud-talk/src/normalize.test.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/normalize.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/policy.test.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/policy.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/replay-guard.test.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/replay-guard.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/room-info.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/runtime.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/secret-input.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/send.test.ts (97%) rename {extensions => native-plugins}/nextcloud-talk/src/send.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/session-route.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/setup-core.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/setup-surface.test.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/setup-surface.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/signature.ts (100%) rename {extensions => native-plugins}/nextcloud-talk/src/types.ts (100%) rename {extensions => native-plugins}/nostr/CHANGELOG.md (100%) rename {extensions => native-plugins}/nostr/README.md (100%) rename {extensions => native-plugins}/nostr/api.ts (100%) rename {extensions => native-plugins}/nostr/index.ts (100%) rename {extensions => native-plugins}/nostr/openclaw.plugin.json (100%) rename {extensions => native-plugins}/nostr/package.json (92%) rename {extensions => native-plugins}/nostr/runtime-api.ts (100%) rename {extensions => native-plugins}/nostr/setup-api.ts (100%) rename {extensions => native-plugins}/nostr/setup-entry.ts (100%) rename {extensions => native-plugins}/nostr/src/channel.outbound.test.ts (98%) rename {extensions => native-plugins}/nostr/src/channel.test.ts (100%) rename {extensions => native-plugins}/nostr/src/channel.ts (99%) rename {extensions => native-plugins}/nostr/src/config-schema.ts (100%) rename {extensions => native-plugins}/nostr/src/default-relays.ts (100%) rename {extensions => native-plugins}/nostr/src/metrics.ts (100%) rename {extensions => native-plugins}/nostr/src/nostr-bus.fuzz.test.ts (100%) rename {extensions => native-plugins}/nostr/src/nostr-bus.integration.test.ts (100%) rename {extensions => native-plugins}/nostr/src/nostr-bus.test.ts (100%) rename {extensions => native-plugins}/nostr/src/nostr-bus.ts (100%) rename {extensions => native-plugins}/nostr/src/nostr-profile-http.test.ts (100%) rename {extensions => native-plugins}/nostr/src/nostr-profile-http.ts (100%) rename {extensions => native-plugins}/nostr/src/nostr-profile-import.test.ts (100%) rename {extensions => native-plugins}/nostr/src/nostr-profile-import.ts (100%) rename {extensions => native-plugins}/nostr/src/nostr-profile.fuzz.test.ts (100%) rename {extensions => native-plugins}/nostr/src/nostr-profile.test.ts (100%) rename {extensions => native-plugins}/nostr/src/nostr-profile.ts (100%) rename {extensions => native-plugins}/nostr/src/nostr-state-store.test.ts (100%) rename {extensions => native-plugins}/nostr/src/nostr-state-store.ts (100%) rename {extensions => native-plugins}/nostr/src/runtime.ts (100%) rename {extensions => native-plugins}/nostr/src/seen-tracker.ts (100%) rename {extensions => native-plugins}/nostr/src/session-route.ts (100%) rename {extensions => native-plugins}/nostr/src/setup-surface.test.ts (91%) rename {extensions => native-plugins}/nostr/src/setup-surface.ts (100%) rename {extensions => native-plugins}/nostr/src/types.test.ts (100%) rename {extensions => native-plugins}/nostr/src/types.ts (100%) rename {extensions => native-plugins}/nostr/test/setup.ts (100%) rename {extensions => native-plugins}/nvidia/index.ts (100%) rename {extensions => native-plugins}/nvidia/openclaw.plugin.json (100%) rename {extensions => native-plugins}/nvidia/package.json (91%) rename {extensions => native-plugins}/nvidia/provider-catalog.ts (100%) rename {extensions => native-plugins}/ollama/README.md (100%) rename {extensions => native-plugins}/ollama/index.test.ts (96%) rename {extensions => native-plugins}/ollama/index.ts (100%) rename {extensions => native-plugins}/ollama/openclaw.plugin.json (100%) rename {extensions => native-plugins}/ollama/package.json (91%) rename {extensions => native-plugins}/open-prose/README.md (100%) rename {extensions => native-plugins}/open-prose/index.ts (100%) rename {extensions => native-plugins}/open-prose/openclaw.plugin.json (100%) rename {extensions => native-plugins}/open-prose/package.json (91%) rename {extensions => native-plugins}/open-prose/runtime-api.ts (100%) rename {extensions => native-plugins}/open-prose/skills/prose/LICENSE (100%) rename {extensions => native-plugins}/open-prose/skills/prose/SKILL.md (100%) rename {extensions => native-plugins}/open-prose/skills/prose/alt-borges.md (100%) rename {extensions => native-plugins}/open-prose/skills/prose/alts/arabian-nights.md (100%) rename {extensions => native-plugins}/open-prose/skills/prose/alts/borges.md (100%) rename {extensions => native-plugins}/open-prose/skills/prose/alts/folk.md (100%) rename {extensions => native-plugins}/open-prose/skills/prose/alts/homer.md (100%) rename {extensions => native-plugins}/open-prose/skills/prose/alts/kafka.md (100%) rename {extensions => native-plugins}/open-prose/skills/prose/alts/shared-appendix.md (100%) rename {extensions => native-plugins}/open-prose/skills/prose/compiler.md (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/01-hello-world.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/02-research-and-summarize.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/03-code-review.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/04-write-and-refine.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/05-debug-issue.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/06-explain-codebase.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/07-refactor.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/08-blog-post.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/09-research-with-agents.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/10-code-review-agents.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/11-skills-and-imports.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/12-secure-agent-permissions.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/13-variables-and-context.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/14-composition-blocks.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/15-inline-sequences.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/16-parallel-reviews.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/17-parallel-research.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/18-mixed-parallel-sequential.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/19-advanced-parallel.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/20-fixed-loops.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/21-pipeline-operations.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/22-error-handling.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/23-retry-with-backoff.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/24-choice-blocks.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/25-conditionals.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/26-parameterized-blocks.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/27-string-interpolation.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/28-automated-pr-review.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/28-gas-town.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/29-captains-chair.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/30-captains-chair-simple.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/31-captains-chair-with-memory.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/33-pr-review-autofix.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/34-content-pipeline.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/35-feature-factory.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/36-bug-hunter.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/37-the-forge.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/38-skill-scan.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/39-architect-by-simulation.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/40-rlm-self-refine.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/41-rlm-divide-conquer.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/42-rlm-filter-recurse.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/43-rlm-pairwise.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/44-run-endpoint-ux-test.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/45-plugin-release.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/45-run-endpoint-ux-test-with-remediation.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/46-run-endpoint-ux-test-fast.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/46-workflow-crystallizer.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/47-language-self-improvement.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/48-habit-miner.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/49-prose-run-retrospective.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/README.md (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/roadmap/README.md (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/roadmap/iterative-refinement.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/roadmap/parallel-review.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/roadmap/simple-pipeline.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/examples/roadmap/syntax/open-prose-syntax.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/guidance/antipatterns.md (100%) rename {extensions => native-plugins}/open-prose/skills/prose/guidance/patterns.md (100%) rename {extensions => native-plugins}/open-prose/skills/prose/guidance/system-prompt.md (100%) rename {extensions => native-plugins}/open-prose/skills/prose/help.md (100%) rename {extensions => native-plugins}/open-prose/skills/prose/lib/README.md (100%) rename {extensions => native-plugins}/open-prose/skills/prose/lib/calibrator.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/lib/cost-analyzer.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/lib/error-forensics.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/lib/inspector.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/lib/profiler.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/lib/program-improver.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/lib/project-memory.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/lib/user-memory.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/lib/vm-improver.prose (100%) rename {extensions => native-plugins}/open-prose/skills/prose/primitives/session.md (100%) rename {extensions => native-plugins}/open-prose/skills/prose/prose.md (100%) rename {extensions => native-plugins}/open-prose/skills/prose/state/filesystem.md (100%) rename {extensions => native-plugins}/open-prose/skills/prose/state/in-context.md (100%) rename {extensions => native-plugins}/open-prose/skills/prose/state/postgres.md (100%) rename {extensions => native-plugins}/open-prose/skills/prose/state/sqlite.md (100%) rename {extensions => native-plugins}/openai/index.ts (100%) rename {extensions => native-plugins}/openai/media-understanding-provider.ts (100%) rename {extensions => native-plugins}/openai/openai-codex-catalog.ts (100%) rename {extensions => native-plugins}/openai/openai-codex-provider.runtime.ts (100%) rename {extensions => native-plugins}/openai/openai-codex-provider.ts (100%) rename {extensions => native-plugins}/openai/openai-provider.test.ts (100%) rename {extensions => native-plugins}/openai/openai-provider.ts (100%) rename {extensions => native-plugins}/openai/openclaw.plugin.json (100%) rename {extensions => native-plugins}/openai/package.json (91%) rename {extensions => native-plugins}/openai/shared.ts (100%) rename {extensions => native-plugins}/opencode-go/index.ts (100%) rename {extensions => native-plugins}/opencode-go/onboard.ts (100%) rename {extensions => native-plugins}/opencode-go/openclaw.plugin.json (100%) rename {extensions => native-plugins}/opencode-go/package.json (91%) rename {extensions => native-plugins}/opencode/index.ts (100%) rename {extensions => native-plugins}/opencode/onboard.ts (100%) rename {extensions => native-plugins}/opencode/openclaw.plugin.json (100%) rename {extensions => native-plugins}/opencode/package.json (91%) rename {extensions => native-plugins}/openrouter/index.ts (100%) rename {extensions => native-plugins}/openrouter/onboard.ts (100%) rename {extensions => native-plugins}/openrouter/openclaw.plugin.json (100%) rename {extensions => native-plugins}/openrouter/package.json (91%) rename {extensions => native-plugins}/openrouter/provider-catalog.ts (100%) rename {extensions => native-plugins}/openshell/index.ts (100%) rename {extensions => native-plugins}/openshell/openclaw.plugin.json (100%) rename {extensions => native-plugins}/openshell/package.json (91%) rename {extensions => native-plugins}/openshell/src/backend.test.ts (100%) rename {extensions => native-plugins}/openshell/src/backend.ts (100%) rename {extensions => native-plugins}/openshell/src/cli.test.ts (100%) rename {extensions => native-plugins}/openshell/src/cli.ts (100%) rename {extensions => native-plugins}/openshell/src/config.test.ts (100%) rename {extensions => native-plugins}/openshell/src/config.ts (100%) rename {extensions => native-plugins}/openshell/src/fs-bridge.test.ts (100%) rename {extensions => native-plugins}/openshell/src/fs-bridge.ts (100%) rename {extensions => native-plugins}/openshell/src/mirror.ts (100%) rename {extensions => native-plugins}/openshell/src/remote-fs-bridge.test.ts (100%) rename {extensions => native-plugins}/openshell/src/remote-fs-bridge.ts (100%) rename {extensions => native-plugins}/perplexity/index.ts (100%) rename {extensions => native-plugins}/perplexity/openclaw.plugin.json (100%) rename {extensions => native-plugins}/perplexity/package.json (90%) rename {extensions => native-plugins}/perplexity/src/perplexity-web-search-provider.ts (100%) rename {extensions => native-plugins}/perplexity/web-search-provider.ts (100%) rename {extensions => native-plugins}/phone-control/index.test.ts (97%) rename {extensions => native-plugins}/phone-control/index.ts (100%) rename {extensions => native-plugins}/phone-control/openclaw.plugin.json (100%) rename {extensions => native-plugins}/phone-control/runtime-api.ts (100%) rename {extensions => native-plugins}/qianfan/index.ts (100%) rename {extensions => native-plugins}/qianfan/onboard.ts (100%) rename {extensions => native-plugins}/qianfan/openclaw.plugin.json (100%) rename {extensions => native-plugins}/qianfan/package.json (91%) rename {extensions => native-plugins}/qianfan/provider-catalog.ts (100%) rename {extensions => native-plugins}/qwen-portal-auth/README.md (100%) rename {extensions => native-plugins}/qwen-portal-auth/index.ts (100%) rename {extensions => native-plugins}/qwen-portal-auth/oauth.runtime.ts (100%) rename {extensions => native-plugins}/qwen-portal-auth/oauth.ts (100%) rename {extensions => native-plugins}/qwen-portal-auth/openclaw.plugin.json (100%) rename {extensions => native-plugins}/qwen-portal-auth/provider-catalog.ts (100%) rename {extensions => native-plugins}/qwen-portal-auth/runtime-api.ts (100%) rename {extensions => native-plugins}/sglang/README.md (100%) rename {extensions => native-plugins}/sglang/index.ts (100%) rename {extensions => native-plugins}/sglang/openclaw.plugin.json (100%) rename {extensions => native-plugins}/sglang/package.json (91%) rename {extensions => native-plugins}/shared/channel-status-summary.ts (100%) rename {extensions => native-plugins}/shared/config-schema-helpers.ts (100%) rename {extensions => native-plugins}/shared/deferred.ts (100%) rename {extensions => native-plugins}/shared/passive-monitor.ts (100%) rename {extensions => native-plugins}/shared/resolve-target-test-helpers.ts (100%) rename {extensions => native-plugins}/shared/runtime.ts (100%) rename {extensions => native-plugins}/shared/status-issues.ts (100%) rename {extensions => native-plugins}/shared/windows-cmd-shim-test-fixtures.ts (100%) rename {extensions => native-plugins}/signal/api.ts (100%) rename {extensions => native-plugins}/signal/index.ts (100%) rename {extensions => native-plugins}/signal/openclaw.plugin.json (100%) rename {extensions => native-plugins}/signal/package.json (96%) rename {extensions => native-plugins}/signal/runtime-api.ts (100%) rename {extensions => native-plugins}/signal/setup-entry.ts (100%) rename {extensions => native-plugins}/signal/src/accounts.ts (100%) rename {extensions => native-plugins}/signal/src/channel.outbound.test.ts (100%) rename {extensions => native-plugins}/signal/src/channel.runtime.ts (100%) rename {extensions => native-plugins}/signal/src/channel.setup.ts (100%) rename {extensions => native-plugins}/signal/src/channel.test.ts (100%) rename {extensions => native-plugins}/signal/src/channel.ts (100%) rename {extensions => native-plugins}/signal/src/client.test.ts (100%) rename {extensions => native-plugins}/signal/src/client.ts (100%) rename {extensions => native-plugins}/signal/src/config-schema.ts (100%) rename {extensions => native-plugins}/signal/src/daemon.ts (100%) rename {extensions => native-plugins}/signal/src/format.chunking.test.ts (100%) rename {extensions => native-plugins}/signal/src/format.links.test.ts (100%) rename {extensions => native-plugins}/signal/src/format.test.ts (100%) rename {extensions => native-plugins}/signal/src/format.ts (100%) rename {extensions => native-plugins}/signal/src/format.visual.test.ts (100%) rename {extensions => native-plugins}/signal/src/identity.test.ts (100%) rename {extensions => native-plugins}/signal/src/identity.ts (100%) rename {extensions => native-plugins}/signal/src/index.ts (100%) rename {extensions => native-plugins}/signal/src/message-actions.ts (100%) rename {extensions => native-plugins}/signal/src/monitor.test.ts (100%) rename {extensions => native-plugins}/signal/src/monitor.tool-result.pairs-uuid-only-senders-uuid-allowlist-entry.test.ts (100%) rename {extensions => native-plugins}/signal/src/monitor.tool-result.sends-tool-summaries-responseprefix.test.ts (100%) rename {extensions => native-plugins}/signal/src/monitor.tool-result.test-harness.ts (100%) rename {extensions => native-plugins}/signal/src/monitor.ts (100%) rename {extensions => native-plugins}/signal/src/monitor/access-policy.test.ts (100%) rename {extensions => native-plugins}/signal/src/monitor/access-policy.ts (100%) rename {extensions => native-plugins}/signal/src/monitor/event-handler.inbound-context.test.ts (100%) rename {extensions => native-plugins}/signal/src/monitor/event-handler.mention-gating.test.ts (100%) rename {extensions => native-plugins}/signal/src/monitor/event-handler.test-harness.ts (100%) rename {extensions => native-plugins}/signal/src/monitor/event-handler.ts (100%) rename {extensions => native-plugins}/signal/src/monitor/event-handler.types.ts (100%) rename {extensions => native-plugins}/signal/src/monitor/mentions.ts (100%) rename {extensions => native-plugins}/signal/src/outbound-adapter.ts (100%) rename {extensions => native-plugins}/signal/src/plugin-shared.ts (100%) rename {extensions => native-plugins}/signal/src/probe.test.ts (100%) rename {extensions => native-plugins}/signal/src/probe.ts (100%) rename {extensions => native-plugins}/signal/src/reaction-level.ts (100%) rename {extensions => native-plugins}/signal/src/rpc-context.ts (100%) rename {extensions => native-plugins}/signal/src/runtime-api.ts (100%) rename {extensions => native-plugins}/signal/src/runtime.ts (100%) rename {extensions => native-plugins}/signal/src/send-reactions.test.ts (100%) rename {extensions => native-plugins}/signal/src/send-reactions.ts (100%) rename {extensions => native-plugins}/signal/src/send.ts (100%) rename {extensions => native-plugins}/signal/src/setup-allow-from.test.ts (100%) rename {extensions => native-plugins}/signal/src/setup-core.ts (100%) rename {extensions => native-plugins}/signal/src/setup-surface.ts (100%) rename {extensions => native-plugins}/signal/src/shared.ts (100%) rename {extensions => native-plugins}/signal/src/sse-reconnect.ts (100%) rename {extensions => native-plugins}/slack/api.ts (100%) rename {extensions => native-plugins}/slack/index.ts (100%) rename {extensions => native-plugins}/slack/openclaw.plugin.json (100%) rename {extensions => native-plugins}/slack/package.json (97%) rename {extensions => native-plugins}/slack/runtime-api.ts (100%) rename {extensions => native-plugins}/slack/setup-entry.ts (100%) rename {extensions => native-plugins}/slack/src/account-inspect.ts (100%) rename {extensions => native-plugins}/slack/src/account-surface-fields.ts (100%) rename {extensions => native-plugins}/slack/src/accounts.test.ts (100%) rename {extensions => native-plugins}/slack/src/accounts.ts (100%) rename {extensions => native-plugins}/slack/src/action-runtime.test.ts (100%) rename {extensions => native-plugins}/slack/src/action-runtime.ts (100%) rename {extensions => native-plugins}/slack/src/actions.blocks.test.ts (100%) rename {extensions => native-plugins}/slack/src/actions.download-file.test.ts (100%) rename {extensions => native-plugins}/slack/src/actions.read.test.ts (100%) rename {extensions => native-plugins}/slack/src/actions.ts (100%) rename {extensions => native-plugins}/slack/src/blocks-fallback.test.ts (100%) rename {extensions => native-plugins}/slack/src/blocks-fallback.ts (100%) rename {extensions => native-plugins}/slack/src/blocks-input.test.ts (100%) rename {extensions => native-plugins}/slack/src/blocks-input.ts (100%) rename {extensions => native-plugins}/slack/src/blocks-render.ts (100%) rename {extensions => native-plugins}/slack/src/blocks.test-helpers.ts (100%) rename {extensions => native-plugins}/slack/src/channel-actions.ts (100%) rename {extensions => native-plugins}/slack/src/channel-migration.test.ts (100%) rename {extensions => native-plugins}/slack/src/channel-migration.ts (100%) rename {extensions => native-plugins}/slack/src/channel.runtime.ts (100%) rename {extensions => native-plugins}/slack/src/channel.setup.ts (100%) rename {extensions => native-plugins}/slack/src/channel.test.ts (99%) rename {extensions => native-plugins}/slack/src/channel.ts (99%) rename {extensions => native-plugins}/slack/src/client.test.ts (100%) rename {extensions => native-plugins}/slack/src/client.ts (100%) rename {extensions => native-plugins}/slack/src/config-schema.ts (100%) rename {extensions => native-plugins}/slack/src/directory-config.ts (100%) rename {extensions => native-plugins}/slack/src/directory-live.ts (100%) rename {extensions => native-plugins}/slack/src/draft-stream.test.ts (100%) rename {extensions => native-plugins}/slack/src/draft-stream.ts (100%) rename {extensions => native-plugins}/slack/src/format.test.ts (100%) rename {extensions => native-plugins}/slack/src/format.ts (100%) rename {extensions => native-plugins}/slack/src/group-policy.test.ts (100%) rename {extensions => native-plugins}/slack/src/group-policy.ts (100%) rename {extensions => native-plugins}/slack/src/http/index.ts (100%) rename {extensions => native-plugins}/slack/src/http/registry.test.ts (100%) rename {extensions => native-plugins}/slack/src/http/registry.ts (100%) rename {extensions => native-plugins}/slack/src/index.ts (100%) rename {extensions => native-plugins}/slack/src/interactive-replies.test.ts (100%) rename {extensions => native-plugins}/slack/src/interactive-replies.ts (100%) rename {extensions => native-plugins}/slack/src/message-action-dispatch.test.ts (100%) rename {extensions => native-plugins}/slack/src/message-action-dispatch.ts (100%) rename {extensions => native-plugins}/slack/src/message-actions.test.ts (100%) rename {extensions => native-plugins}/slack/src/message-actions.ts (100%) rename {extensions => native-plugins}/slack/src/message-tool-schema.ts (100%) rename {extensions => native-plugins}/slack/src/modal-metadata.test.ts (100%) rename {extensions => native-plugins}/slack/src/modal-metadata.ts (100%) rename {extensions => native-plugins}/slack/src/monitor.test-helpers.ts (100%) rename {extensions => native-plugins}/slack/src/monitor.test.ts (100%) rename {extensions => native-plugins}/slack/src/monitor.threading.missing-thread-ts.test.ts (100%) rename {extensions => native-plugins}/slack/src/monitor.tool-result.test.ts (100%) rename {extensions => native-plugins}/slack/src/monitor.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/allow-list.test.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/allow-list.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/auth.test.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/auth.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/channel-config.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/channel-type.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/commands.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/context.test.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/context.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/dm-auth.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/events.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/events/channels.test.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/events/channels.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/events/interactions.block-actions.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/events/interactions.modal.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/events/interactions.test.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/events/interactions.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/events/members.test.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/events/members.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/events/message-subtype-handlers.test.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/events/message-subtype-handlers.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/events/messages.test.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/events/messages.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/events/pins.test.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/events/pins.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/events/reactions.test.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/events/reactions.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/events/system-event-context.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/events/system-event-test-harness.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/external-arg-menu-store.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/media.test.ts (99%) rename {extensions => native-plugins}/slack/src/monitor/media.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/message-handler.app-mention-race.test.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/message-handler.debounce-key.test.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/message-handler.test.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/message-handler.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/message-handler/dispatch.streaming.test.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/message-handler/dispatch.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/message-handler/prepare-content.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/message-handler/prepare-thread-context.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/message-handler/prepare.test-helpers.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/message-handler/prepare.test.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/message-handler/prepare.thread-session-key.test.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/message-handler/prepare.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/message-handler/types.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/monitor.test.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/mrkdwn.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/policy.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/provider.auth-errors.test.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/provider.interop.test.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/provider.reconnect.test.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/provider.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/reconnect-policy.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/replies.test.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/replies.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/room-context.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/slash-commands.runtime.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/slash-dispatch.runtime.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/slash-skill-commands.runtime.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/slash.test-harness.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/slash.test.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/slash.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/thread-resolution.ts (100%) rename {extensions => native-plugins}/slack/src/monitor/types.ts (100%) rename {extensions => native-plugins}/slack/src/outbound-adapter.ts (100%) rename {extensions => native-plugins}/slack/src/plugin-shared.ts (100%) rename {extensions => native-plugins}/slack/src/probe.test.ts (100%) rename {extensions => native-plugins}/slack/src/probe.ts (100%) rename {extensions => native-plugins}/slack/src/resolve-allowlist-common.test.ts (100%) rename {extensions => native-plugins}/slack/src/resolve-allowlist-common.ts (100%) rename {extensions => native-plugins}/slack/src/resolve-channels.test.ts (100%) rename {extensions => native-plugins}/slack/src/resolve-channels.ts (100%) rename {extensions => native-plugins}/slack/src/resolve-users.test.ts (100%) rename {extensions => native-plugins}/slack/src/resolve-users.ts (100%) rename {extensions => native-plugins}/slack/src/runtime-api.ts (100%) rename {extensions => native-plugins}/slack/src/runtime.ts (100%) rename {extensions => native-plugins}/slack/src/scopes.ts (100%) rename {extensions => native-plugins}/slack/src/send.blocks.test.ts (100%) rename {extensions => native-plugins}/slack/src/send.ts (100%) rename {extensions => native-plugins}/slack/src/send.upload.test.ts (100%) rename {extensions => native-plugins}/slack/src/sent-thread-cache.test.ts (100%) rename {extensions => native-plugins}/slack/src/sent-thread-cache.ts (100%) rename {extensions => native-plugins}/slack/src/setup-core.ts (100%) rename {extensions => native-plugins}/slack/src/setup-surface.ts (100%) rename {extensions => native-plugins}/slack/src/shared-interactive.test.ts (100%) rename {extensions => native-plugins}/slack/src/shared.ts (100%) rename {extensions => native-plugins}/slack/src/stream-mode.test.ts (100%) rename {extensions => native-plugins}/slack/src/stream-mode.ts (100%) rename {extensions => native-plugins}/slack/src/streaming.ts (100%) rename {extensions => native-plugins}/slack/src/targets.test.ts (100%) rename {extensions => native-plugins}/slack/src/targets.ts (100%) rename {extensions => native-plugins}/slack/src/threading-tool-context.test.ts (100%) rename {extensions => native-plugins}/slack/src/threading-tool-context.ts (100%) rename {extensions => native-plugins}/slack/src/threading.test.ts (100%) rename {extensions => native-plugins}/slack/src/threading.ts (100%) rename {extensions => native-plugins}/slack/src/token.ts (100%) rename {extensions => native-plugins}/slack/src/truncate.ts (100%) rename {extensions => native-plugins}/slack/src/types.ts (100%) rename {extensions => native-plugins}/synology-chat/api.ts (100%) rename {extensions => native-plugins}/synology-chat/index.ts (100%) rename {extensions => native-plugins}/synology-chat/openclaw.plugin.json (100%) rename {extensions => native-plugins}/synology-chat/package.json (91%) rename {extensions => native-plugins}/synology-chat/setup-api.ts (100%) rename {extensions => native-plugins}/synology-chat/setup-entry.ts (100%) rename {extensions => native-plugins}/synology-chat/src/accounts.test.ts (100%) rename {extensions => native-plugins}/synology-chat/src/accounts.ts (100%) rename {extensions => native-plugins}/synology-chat/src/channel.integration.test.ts (100%) rename {extensions => native-plugins}/synology-chat/src/channel.test-mocks.ts (100%) rename {extensions => native-plugins}/synology-chat/src/channel.test.ts (100%) rename {extensions => native-plugins}/synology-chat/src/channel.ts (100%) rename {extensions => native-plugins}/synology-chat/src/client.test.ts (100%) rename {extensions => native-plugins}/synology-chat/src/client.ts (100%) rename {extensions => native-plugins}/synology-chat/src/config-schema.ts (100%) rename {extensions => native-plugins}/synology-chat/src/runtime.ts (100%) rename {extensions => native-plugins}/synology-chat/src/security.test.ts (100%) rename {extensions => native-plugins}/synology-chat/src/security.ts (100%) rename {extensions => native-plugins}/synology-chat/src/setup-surface.test.ts (95%) rename {extensions => native-plugins}/synology-chat/src/setup-surface.ts (100%) rename {extensions => native-plugins}/synology-chat/src/test-http-utils.ts (100%) rename {extensions => native-plugins}/synology-chat/src/types.ts (100%) rename {extensions => native-plugins}/synology-chat/src/webhook-handler.test.ts (100%) rename {extensions => native-plugins}/synology-chat/src/webhook-handler.ts (100%) rename {extensions => native-plugins}/synthetic/index.ts (100%) rename {extensions => native-plugins}/synthetic/onboard.ts (100%) rename {extensions => native-plugins}/synthetic/openclaw.plugin.json (100%) rename {extensions => native-plugins}/synthetic/package.json (91%) rename {extensions => native-plugins}/synthetic/provider-catalog.ts (100%) rename {extensions => native-plugins}/talk-voice/api.ts (100%) rename {extensions => native-plugins}/talk-voice/index.test.ts (97%) rename {extensions => native-plugins}/talk-voice/index.ts (100%) rename {extensions => native-plugins}/talk-voice/openclaw.plugin.json (100%) rename {extensions => native-plugins}/tavily/index.test.ts (100%) rename {extensions => native-plugins}/tavily/index.ts (100%) rename {extensions => native-plugins}/tavily/openclaw.plugin.json (100%) rename {extensions => native-plugins}/tavily/package.json (90%) rename {extensions => native-plugins}/tavily/skills/tavily/SKILL.md (100%) rename {extensions => native-plugins}/tavily/src/config.ts (100%) rename {extensions => native-plugins}/tavily/src/tavily-client.ts (100%) rename {extensions => native-plugins}/tavily/src/tavily-extract-tool.test.ts (100%) rename {extensions => native-plugins}/tavily/src/tavily-extract-tool.ts (100%) rename {extensions => native-plugins}/tavily/src/tavily-search-provider.ts (100%) rename {extensions => native-plugins}/tavily/src/tavily-search-tool.ts (100%) rename {extensions => native-plugins}/telegram/api.ts (100%) rename {extensions => native-plugins}/telegram/index.ts (100%) rename {extensions => native-plugins}/telegram/openclaw.plugin.json (100%) rename {extensions => native-plugins}/telegram/package.json (97%) rename {extensions => native-plugins}/telegram/runtime-api.ts (100%) rename {extensions => native-plugins}/telegram/setup-entry.ts (100%) rename {extensions => native-plugins}/telegram/src/account-inspect.test.ts (97%) rename {extensions => native-plugins}/telegram/src/account-inspect.ts (100%) rename {extensions => native-plugins}/telegram/src/accounts.test.ts (99%) rename {extensions => native-plugins}/telegram/src/accounts.ts (100%) rename {extensions => native-plugins}/telegram/src/action-runtime.test.ts (99%) rename {extensions => native-plugins}/telegram/src/action-runtime.ts (100%) rename {extensions => native-plugins}/telegram/src/allow-from.test.ts (100%) rename {extensions => native-plugins}/telegram/src/allow-from.ts (100%) rename {extensions => native-plugins}/telegram/src/allowed-updates.ts (100%) rename {extensions => native-plugins}/telegram/src/api-fetch.test.ts (100%) rename {extensions => native-plugins}/telegram/src/api-fetch.ts (100%) rename {extensions => native-plugins}/telegram/src/api-logging.ts (100%) rename {extensions => native-plugins}/telegram/src/approval-buttons.test.ts (100%) rename {extensions => native-plugins}/telegram/src/approval-buttons.ts (100%) rename {extensions => native-plugins}/telegram/src/audit-membership-runtime.ts (100%) rename {extensions => native-plugins}/telegram/src/audit.test.ts (100%) rename {extensions => native-plugins}/telegram/src/audit.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-access.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-access.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-deps.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-handlers.buffers.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-handlers.media.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-handlers.runtime.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-handlers.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-message-context.acp-bindings.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-message-context.audio-transcript.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-message-context.body.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-message-context.dm-threads.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-message-context.dm-topic-threadid.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-message-context.implicit-mention.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-message-context.named-account-dm.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-message-context.sender-prefix.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-message-context.session.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-message-context.test-harness.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-message-context.thread-binding.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-message-context.topic-agentid.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-message-context.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-message-context.types.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-message-dispatch.sticker-media.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-message-dispatch.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-message-dispatch.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-message.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-message.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-native-command-menu.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-native-command-menu.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-native-commands.fixture-test-support.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-native-commands.group-auth.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-native-commands.menu-test-support.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-native-commands.plugin-auth.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-native-commands.registry.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-native-commands.session-meta.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-native-commands.skills-allowlist.test.ts (97%) rename {extensions => native-plugins}/telegram/src/bot-native-commands.test-helpers.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-native-commands.test.ts (99%) rename {extensions => native-plugins}/telegram/src/bot-native-commands.ts (100%) rename {extensions => native-plugins}/telegram/src/bot-updates.ts (100%) rename {extensions => native-plugins}/telegram/src/bot.create-telegram-bot.test-harness.ts (100%) rename {extensions => native-plugins}/telegram/src/bot.create-telegram-bot.test.ts (99%) rename {extensions => native-plugins}/telegram/src/bot.fetch-abort.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot.helpers.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot.media.downloads-media-file-path-no-file-download.e2e.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot.media.e2e-harness.ts (100%) rename {extensions => native-plugins}/telegram/src/bot.media.stickers-and-fragments.e2e.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot.media.test-utils.ts (100%) rename {extensions => native-plugins}/telegram/src/bot.runtime.ts (100%) rename {extensions => native-plugins}/telegram/src/bot.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot.ts (100%) rename {extensions => native-plugins}/telegram/src/bot/delivery.replies.ts (100%) rename {extensions => native-plugins}/telegram/src/bot/delivery.resolve-media-retry.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot/delivery.resolve-media.ts (100%) rename {extensions => native-plugins}/telegram/src/bot/delivery.send.ts (100%) rename {extensions => native-plugins}/telegram/src/bot/delivery.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot/delivery.ts (100%) rename {extensions => native-plugins}/telegram/src/bot/helpers.test.ts (100%) rename {extensions => native-plugins}/telegram/src/bot/helpers.ts (100%) rename {extensions => native-plugins}/telegram/src/bot/reply-threading.ts (100%) rename {extensions => native-plugins}/telegram/src/bot/types.ts (100%) rename {extensions => native-plugins}/telegram/src/button-types.test.ts (100%) rename {extensions => native-plugins}/telegram/src/button-types.ts (100%) rename {extensions => native-plugins}/telegram/src/caption.ts (100%) rename {extensions => native-plugins}/telegram/src/channel-actions.test.ts (100%) rename {extensions => native-plugins}/telegram/src/channel-actions.ts (100%) rename {extensions => native-plugins}/telegram/src/channel.setup.ts (100%) rename {extensions => native-plugins}/telegram/src/channel.test.ts (99%) rename {extensions => native-plugins}/telegram/src/channel.ts (100%) rename {extensions => native-plugins}/telegram/src/config-schema.ts (100%) rename {extensions => native-plugins}/telegram/src/conversation-route.base-session-key.test.ts (100%) rename {extensions => native-plugins}/telegram/src/conversation-route.ts (100%) rename {extensions => native-plugins}/telegram/src/directory-config.ts (100%) rename {extensions => native-plugins}/telegram/src/dm-access.ts (100%) rename {extensions => native-plugins}/telegram/src/draft-chunking.test.ts (100%) rename {extensions => native-plugins}/telegram/src/draft-chunking.ts (100%) rename {extensions => native-plugins}/telegram/src/draft-stream.test-helpers.ts (100%) rename {extensions => native-plugins}/telegram/src/draft-stream.test.ts (100%) rename {extensions => native-plugins}/telegram/src/draft-stream.ts (100%) rename {extensions => native-plugins}/telegram/src/exec-approvals-handler.test.ts (100%) rename {extensions => native-plugins}/telegram/src/exec-approvals-handler.ts (100%) rename {extensions => native-plugins}/telegram/src/exec-approvals.test.ts (100%) rename {extensions => native-plugins}/telegram/src/exec-approvals.ts (100%) rename {extensions => native-plugins}/telegram/src/fetch.env-proxy-runtime.test.ts (100%) rename {extensions => native-plugins}/telegram/src/fetch.test.ts (100%) rename {extensions => native-plugins}/telegram/src/fetch.ts (100%) rename {extensions => native-plugins}/telegram/src/format.test.ts (100%) rename {extensions => native-plugins}/telegram/src/format.ts (100%) rename {extensions => native-plugins}/telegram/src/format.wrap-md.test.ts (100%) rename {extensions => native-plugins}/telegram/src/forum-service-message.ts (100%) rename {extensions => native-plugins}/telegram/src/group-access.base-access.test.ts (100%) rename {extensions => native-plugins}/telegram/src/group-access.policy-access.test.ts (100%) rename {extensions => native-plugins}/telegram/src/group-access.ts (100%) rename {extensions => native-plugins}/telegram/src/group-config-helpers.ts (100%) rename {extensions => native-plugins}/telegram/src/group-migration.test.ts (100%) rename {extensions => native-plugins}/telegram/src/group-migration.ts (100%) rename {extensions => native-plugins}/telegram/src/group-policy.test.ts (100%) rename {extensions => native-plugins}/telegram/src/group-policy.ts (100%) rename {extensions => native-plugins}/telegram/src/inline-buttons.test.ts (100%) rename {extensions => native-plugins}/telegram/src/inline-buttons.ts (100%) rename {extensions => native-plugins}/telegram/src/lane-delivery-state.ts (100%) rename {extensions => native-plugins}/telegram/src/lane-delivery-text-deliverer.ts (100%) rename {extensions => native-plugins}/telegram/src/lane-delivery.test.ts (100%) rename {extensions => native-plugins}/telegram/src/lane-delivery.ts (100%) rename {extensions => native-plugins}/telegram/src/media-understanding.runtime.ts (100%) rename {extensions => native-plugins}/telegram/src/message-tool-schema.ts (100%) rename {extensions => native-plugins}/telegram/src/model-buttons.test.ts (100%) rename {extensions => native-plugins}/telegram/src/model-buttons.ts (100%) rename {extensions => native-plugins}/telegram/src/monitor.test.ts (100%) rename {extensions => native-plugins}/telegram/src/monitor.ts (100%) rename {extensions => native-plugins}/telegram/src/network-config.test.ts (100%) rename {extensions => native-plugins}/telegram/src/network-config.ts (100%) rename {extensions => native-plugins}/telegram/src/network-errors.test.ts (100%) rename {extensions => native-plugins}/telegram/src/network-errors.ts (100%) rename {extensions => native-plugins}/telegram/src/normalize.ts (100%) rename {extensions => native-plugins}/telegram/src/outbound-adapter.ts (100%) rename {extensions => native-plugins}/telegram/src/outbound-params.ts (100%) rename {extensions => native-plugins}/telegram/src/polling-session.test.ts (100%) rename {extensions => native-plugins}/telegram/src/polling-session.ts (100%) rename {extensions => native-plugins}/telegram/src/probe.test.ts (98%) rename {extensions => native-plugins}/telegram/src/probe.ts (100%) rename {extensions => native-plugins}/telegram/src/proxy.test.ts (100%) rename {extensions => native-plugins}/telegram/src/proxy.ts (100%) rename {extensions => native-plugins}/telegram/src/reaction-level.test.ts (100%) rename {extensions => native-plugins}/telegram/src/reaction-level.ts (100%) rename {extensions => native-plugins}/telegram/src/reasoning-lane-coordinator.test.ts (100%) rename {extensions => native-plugins}/telegram/src/reasoning-lane-coordinator.ts (100%) rename {extensions => native-plugins}/telegram/src/runtime.ts (100%) rename {extensions => native-plugins}/telegram/src/send.proxy.test.ts (100%) rename {extensions => native-plugins}/telegram/src/send.test-harness.ts (100%) rename {extensions => native-plugins}/telegram/src/send.test.ts (100%) rename {extensions => native-plugins}/telegram/src/send.ts (100%) rename {extensions => native-plugins}/telegram/src/sendchataction-401-backoff.test.ts (100%) rename {extensions => native-plugins}/telegram/src/sendchataction-401-backoff.ts (100%) rename {extensions => native-plugins}/telegram/src/sent-message-cache.ts (100%) rename {extensions => native-plugins}/telegram/src/sequential-key.test.ts (100%) rename {extensions => native-plugins}/telegram/src/sequential-key.ts (100%) rename {extensions => native-plugins}/telegram/src/setup-core.ts (100%) rename {extensions => native-plugins}/telegram/src/setup-surface.test.ts (100%) rename {extensions => native-plugins}/telegram/src/setup-surface.ts (100%) rename {extensions => native-plugins}/telegram/src/shared.ts (100%) rename {extensions => native-plugins}/telegram/src/status-issues.ts (100%) rename {extensions => native-plugins}/telegram/src/status-reaction-variants.test.ts (100%) rename {extensions => native-plugins}/telegram/src/status-reaction-variants.ts (100%) rename {extensions => native-plugins}/telegram/src/sticker-cache.test.ts (100%) rename {extensions => native-plugins}/telegram/src/sticker-cache.ts (100%) rename {extensions => native-plugins}/telegram/src/target-writeback.test.ts (100%) rename {extensions => native-plugins}/telegram/src/target-writeback.ts (100%) rename {extensions => native-plugins}/telegram/src/targets.test.ts (100%) rename {extensions => native-plugins}/telegram/src/targets.ts (100%) rename {extensions => native-plugins}/telegram/src/thread-bindings.test.ts (100%) rename {extensions => native-plugins}/telegram/src/thread-bindings.ts (100%) rename {extensions => native-plugins}/telegram/src/token.test.ts (100%) rename {extensions => native-plugins}/telegram/src/token.ts (100%) rename {extensions => native-plugins}/telegram/src/update-offset-store.test.ts (100%) rename {extensions => native-plugins}/telegram/src/update-offset-store.ts (100%) rename {extensions => native-plugins}/telegram/src/voice.test.ts (100%) rename {extensions => native-plugins}/telegram/src/voice.ts (100%) rename {extensions => native-plugins}/telegram/src/webhook.test.ts (100%) rename {extensions => native-plugins}/telegram/src/webhook.ts (100%) rename {extensions => native-plugins}/thread-ownership/api.ts (100%) rename {extensions => native-plugins}/thread-ownership/index.test.ts (100%) rename {extensions => native-plugins}/thread-ownership/index.ts (100%) rename {extensions => native-plugins}/thread-ownership/openclaw.plugin.json (100%) rename {extensions => native-plugins}/tlon/README.md (100%) rename {extensions => native-plugins}/tlon/api.ts (100%) rename {extensions => native-plugins}/tlon/index.ts (100%) rename {extensions => native-plugins}/tlon/openclaw.plugin.json (100%) rename {extensions => native-plugins}/tlon/package.json (93%) rename {extensions => native-plugins}/tlon/setup-api.ts (100%) rename {extensions => native-plugins}/tlon/setup-entry.ts (100%) rename {extensions => native-plugins}/tlon/src/account-fields.ts (100%) rename {extensions => native-plugins}/tlon/src/channel.runtime.ts (100%) rename {extensions => native-plugins}/tlon/src/channel.test.ts (100%) rename {extensions => native-plugins}/tlon/src/channel.ts (100%) rename {extensions => native-plugins}/tlon/src/config-schema.test.ts (100%) rename {extensions => native-plugins}/tlon/src/config-schema.ts (100%) rename {extensions => native-plugins}/tlon/src/monitor/approval-runtime.ts (100%) rename {extensions => native-plugins}/tlon/src/monitor/approval.ts (100%) rename {extensions => native-plugins}/tlon/src/monitor/authorization.ts (100%) rename {extensions => native-plugins}/tlon/src/monitor/cites.ts (100%) rename {extensions => native-plugins}/tlon/src/monitor/discovery.ts (100%) rename {extensions => native-plugins}/tlon/src/monitor/history.ts (100%) rename {extensions => native-plugins}/tlon/src/monitor/index.ts (100%) rename {extensions => native-plugins}/tlon/src/monitor/media.ts (100%) rename {extensions => native-plugins}/tlon/src/monitor/processed-messages.test.ts (100%) rename {extensions => native-plugins}/tlon/src/monitor/processed-messages.ts (100%) rename {extensions => native-plugins}/tlon/src/monitor/settings-helpers.ts (100%) rename {extensions => native-plugins}/tlon/src/monitor/utils.ts (100%) rename {extensions => native-plugins}/tlon/src/runtime.ts (100%) rename {extensions => native-plugins}/tlon/src/security.test.ts (100%) rename {extensions => native-plugins}/tlon/src/session-route.ts (100%) rename {extensions => native-plugins}/tlon/src/settings.ts (100%) rename {extensions => native-plugins}/tlon/src/setup-core.ts (100%) rename {extensions => native-plugins}/tlon/src/setup-surface.test.ts (94%) rename {extensions => native-plugins}/tlon/src/setup-surface.ts (100%) rename {extensions => native-plugins}/tlon/src/targets.test.ts (100%) rename {extensions => native-plugins}/tlon/src/targets.ts (100%) rename {extensions => native-plugins}/tlon/src/tlon-api.ts (100%) rename {extensions => native-plugins}/tlon/src/types.ts (100%) rename {extensions => native-plugins}/tlon/src/urbit/auth.ssrf.test.ts (100%) rename {extensions => native-plugins}/tlon/src/urbit/auth.ts (100%) rename {extensions => native-plugins}/tlon/src/urbit/base-url.test.ts (100%) rename {extensions => native-plugins}/tlon/src/urbit/base-url.ts (100%) rename {extensions => native-plugins}/tlon/src/urbit/channel-ops.ts (100%) rename {extensions => native-plugins}/tlon/src/urbit/context.ts (100%) rename {extensions => native-plugins}/tlon/src/urbit/errors.ts (100%) rename {extensions => native-plugins}/tlon/src/urbit/fetch.ts (100%) rename {extensions => native-plugins}/tlon/src/urbit/foreigns.ts (100%) rename {extensions => native-plugins}/tlon/src/urbit/send.test.ts (100%) rename {extensions => native-plugins}/tlon/src/urbit/send.ts (100%) rename {extensions => native-plugins}/tlon/src/urbit/sse-client.test.ts (100%) rename {extensions => native-plugins}/tlon/src/urbit/sse-client.ts (100%) rename {extensions => native-plugins}/tlon/src/urbit/story.ts (100%) rename {extensions => native-plugins}/tlon/src/urbit/upload.test.ts (100%) rename {extensions => native-plugins}/tlon/src/urbit/upload.ts (100%) rename {extensions => native-plugins}/together/index.ts (100%) rename {extensions => native-plugins}/together/onboard.ts (100%) rename {extensions => native-plugins}/together/openclaw.plugin.json (100%) rename {extensions => native-plugins}/together/package.json (91%) rename {extensions => native-plugins}/together/provider-catalog.ts (100%) rename {extensions => native-plugins}/twitch/CHANGELOG.md (100%) rename {extensions => native-plugins}/twitch/README.md (97%) rename {extensions => native-plugins}/twitch/api.ts (100%) rename {extensions => native-plugins}/twitch/index.ts (100%) rename {extensions => native-plugins}/twitch/openclaw.plugin.json (100%) rename {extensions => native-plugins}/twitch/package.json (96%) rename {extensions => native-plugins}/twitch/runtime-api.ts (100%) rename {extensions => native-plugins}/twitch/src/access-control.test.ts (100%) rename {extensions => native-plugins}/twitch/src/access-control.ts (100%) rename {extensions => native-plugins}/twitch/src/actions.ts (100%) rename {extensions => native-plugins}/twitch/src/client-manager-registry.ts (100%) rename {extensions => native-plugins}/twitch/src/config-schema.ts (100%) rename {extensions => native-plugins}/twitch/src/config.test.ts (100%) rename {extensions => native-plugins}/twitch/src/config.ts (100%) rename {extensions => native-plugins}/twitch/src/monitor.ts (100%) rename {extensions => native-plugins}/twitch/src/outbound.test.ts (100%) rename {extensions => native-plugins}/twitch/src/outbound.ts (100%) rename {extensions => native-plugins}/twitch/src/plugin.test.ts (100%) rename {extensions => native-plugins}/twitch/src/plugin.ts (99%) rename {extensions => native-plugins}/twitch/src/probe.test.ts (100%) rename {extensions => native-plugins}/twitch/src/probe.ts (100%) rename {extensions => native-plugins}/twitch/src/resolver.ts (100%) rename {extensions => native-plugins}/twitch/src/runtime.ts (100%) rename {extensions => native-plugins}/twitch/src/send.test.ts (100%) rename {extensions => native-plugins}/twitch/src/send.ts (100%) rename {extensions => native-plugins}/twitch/src/setup-surface.test.ts (100%) rename {extensions => native-plugins}/twitch/src/setup-surface.ts (100%) rename {extensions => native-plugins}/twitch/src/status.test.ts (100%) rename {extensions => native-plugins}/twitch/src/status.ts (100%) rename {extensions => native-plugins}/twitch/src/test-fixtures.ts (100%) rename {extensions => native-plugins}/twitch/src/token.test.ts (100%) rename {extensions => native-plugins}/twitch/src/token.ts (100%) rename {extensions => native-plugins}/twitch/src/twitch-client.test.ts (100%) rename {extensions => native-plugins}/twitch/src/twitch-client.ts (100%) rename {extensions => native-plugins}/twitch/src/types.ts (100%) rename {extensions => native-plugins}/twitch/src/utils/markdown.ts (100%) rename {extensions => native-plugins}/twitch/src/utils/twitch.ts (100%) rename {extensions => native-plugins}/twitch/test/setup.ts (100%) rename {extensions => native-plugins}/venice/index.ts (100%) rename {extensions => native-plugins}/venice/onboard.ts (100%) rename {extensions => native-plugins}/venice/openclaw.plugin.json (100%) rename {extensions => native-plugins}/venice/package.json (91%) rename {extensions => native-plugins}/venice/provider-catalog.ts (100%) rename {extensions => native-plugins}/vercel-ai-gateway/index.ts (100%) rename {extensions => native-plugins}/vercel-ai-gateway/onboard.ts (100%) rename {extensions => native-plugins}/vercel-ai-gateway/openclaw.plugin.json (100%) rename {extensions => native-plugins}/vercel-ai-gateway/package.json (91%) rename {extensions => native-plugins}/vercel-ai-gateway/provider-catalog.ts (100%) rename {extensions => native-plugins}/vllm/README.md (100%) rename {extensions => native-plugins}/vllm/index.ts (100%) rename {extensions => native-plugins}/vllm/openclaw.plugin.json (100%) rename {extensions => native-plugins}/vllm/package.json (90%) rename {extensions => native-plugins}/voice-call/CHANGELOG.md (100%) rename {extensions => native-plugins}/voice-call/README.md (96%) rename {extensions => native-plugins}/voice-call/api.ts (100%) rename {extensions => native-plugins}/voice-call/index.ts (100%) rename {extensions => native-plugins}/voice-call/openclaw.plugin.json (100%) rename {extensions => native-plugins}/voice-call/package.json (94%) rename {extensions => native-plugins}/voice-call/src/allowlist.ts (100%) rename {extensions => native-plugins}/voice-call/src/cli.ts (100%) rename {extensions => native-plugins}/voice-call/src/config.test.ts (100%) rename {extensions => native-plugins}/voice-call/src/config.ts (100%) rename {extensions => native-plugins}/voice-call/src/core-bridge.ts (100%) rename {extensions => native-plugins}/voice-call/src/deep-merge.ts (100%) rename {extensions => native-plugins}/voice-call/src/http-headers.test.ts (100%) rename {extensions => native-plugins}/voice-call/src/http-headers.ts (100%) rename {extensions => native-plugins}/voice-call/src/manager.closed-loop.test.ts (100%) rename {extensions => native-plugins}/voice-call/src/manager.inbound-allowlist.test.ts (100%) rename {extensions => native-plugins}/voice-call/src/manager.notify.test.ts (100%) rename {extensions => native-plugins}/voice-call/src/manager.restore.test.ts (100%) rename {extensions => native-plugins}/voice-call/src/manager.test-harness.ts (100%) rename {extensions => native-plugins}/voice-call/src/manager.ts (100%) rename {extensions => native-plugins}/voice-call/src/manager/context.ts (100%) rename {extensions => native-plugins}/voice-call/src/manager/events.test.ts (100%) rename {extensions => native-plugins}/voice-call/src/manager/events.ts (100%) rename {extensions => native-plugins}/voice-call/src/manager/lookup.ts (100%) rename {extensions => native-plugins}/voice-call/src/manager/outbound.ts (100%) rename {extensions => native-plugins}/voice-call/src/manager/state.ts (100%) rename {extensions => native-plugins}/voice-call/src/manager/store.ts (100%) rename {extensions => native-plugins}/voice-call/src/manager/timers.ts (100%) rename {extensions => native-plugins}/voice-call/src/manager/twiml.ts (100%) rename {extensions => native-plugins}/voice-call/src/media-stream.test.ts (100%) rename {extensions => native-plugins}/voice-call/src/media-stream.ts (100%) rename {extensions => native-plugins}/voice-call/src/providers/base.ts (100%) rename {extensions => native-plugins}/voice-call/src/providers/index.ts (100%) rename {extensions => native-plugins}/voice-call/src/providers/mock.test.ts (100%) rename {extensions => native-plugins}/voice-call/src/providers/mock.ts (100%) rename {extensions => native-plugins}/voice-call/src/providers/plivo.test.ts (100%) rename {extensions => native-plugins}/voice-call/src/providers/plivo.ts (100%) rename {extensions => native-plugins}/voice-call/src/providers/shared/call-status.test.ts (100%) rename {extensions => native-plugins}/voice-call/src/providers/shared/call-status.ts (100%) rename {extensions => native-plugins}/voice-call/src/providers/shared/guarded-json-api.ts (100%) rename {extensions => native-plugins}/voice-call/src/providers/stt-openai-realtime.test.ts (100%) rename {extensions => native-plugins}/voice-call/src/providers/stt-openai-realtime.ts (100%) rename {extensions => native-plugins}/voice-call/src/providers/telnyx.test.ts (100%) rename {extensions => native-plugins}/voice-call/src/providers/telnyx.ts (100%) rename {extensions => native-plugins}/voice-call/src/providers/tts-openai.test.ts (100%) rename {extensions => native-plugins}/voice-call/src/providers/tts-openai.ts (100%) rename {extensions => native-plugins}/voice-call/src/providers/twilio.test.ts (100%) rename {extensions => native-plugins}/voice-call/src/providers/twilio.ts (100%) rename {extensions => native-plugins}/voice-call/src/providers/twilio/api.ts (100%) rename {extensions => native-plugins}/voice-call/src/providers/twilio/twiml-policy.test.ts (100%) rename {extensions => native-plugins}/voice-call/src/providers/twilio/twiml-policy.ts (100%) rename {extensions => native-plugins}/voice-call/src/providers/twilio/webhook.ts (100%) rename {extensions => native-plugins}/voice-call/src/response-generator.ts (100%) rename {extensions => native-plugins}/voice-call/src/runtime.test.ts (100%) rename {extensions => native-plugins}/voice-call/src/runtime.ts (100%) rename {extensions => native-plugins}/voice-call/src/telephony-audio.ts (100%) rename {extensions => native-plugins}/voice-call/src/telephony-tts.test.ts (100%) rename {extensions => native-plugins}/voice-call/src/telephony-tts.ts (100%) rename {extensions => native-plugins}/voice-call/src/test-fixtures.ts (100%) rename {extensions => native-plugins}/voice-call/src/tunnel.ts (100%) rename {extensions => native-plugins}/voice-call/src/types.ts (100%) rename {extensions => native-plugins}/voice-call/src/utils.ts (100%) rename {extensions => native-plugins}/voice-call/src/voice-mapping.ts (100%) rename {extensions => native-plugins}/voice-call/src/webhook-security.test.ts (100%) rename {extensions => native-plugins}/voice-call/src/webhook-security.ts (100%) rename {extensions => native-plugins}/voice-call/src/webhook.hangup-once.lifecycle.test.ts (100%) rename {extensions => native-plugins}/voice-call/src/webhook.test.ts (100%) rename {extensions => native-plugins}/voice-call/src/webhook.ts (100%) rename {extensions => native-plugins}/voice-call/src/webhook/stale-call-reaper.ts (100%) rename {extensions => native-plugins}/voice-call/src/webhook/tailscale.ts (100%) rename {extensions => native-plugins}/volcengine/index.ts (100%) rename {extensions => native-plugins}/volcengine/openclaw.plugin.json (100%) rename {extensions => native-plugins}/volcengine/package.json (91%) rename {extensions => native-plugins}/volcengine/provider-catalog.ts (100%) rename {extensions => native-plugins}/whatsapp/action-runtime-api.ts (100%) rename {extensions => native-plugins}/whatsapp/action-runtime.runtime.ts (100%) rename {extensions => native-plugins}/whatsapp/api.ts (100%) rename {extensions => native-plugins}/whatsapp/index.ts (100%) rename {extensions => native-plugins}/whatsapp/light-runtime-api.ts (100%) rename {extensions => native-plugins}/whatsapp/login-qr-api.ts (100%) rename {extensions => native-plugins}/whatsapp/openclaw.plugin.json (100%) rename {extensions => native-plugins}/whatsapp/package.json (92%) rename {extensions => native-plugins}/whatsapp/runtime-api.ts (100%) rename {extensions => native-plugins}/whatsapp/setup-entry.ts (100%) rename {extensions => native-plugins}/whatsapp/src/accounts.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/accounts.ts (100%) rename {extensions => native-plugins}/whatsapp/src/accounts.whatsapp-auth.test.ts (96%) rename {extensions => native-plugins}/whatsapp/src/action-runtime-target-auth.ts (100%) rename {extensions => native-plugins}/whatsapp/src/action-runtime.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/action-runtime.ts (100%) rename {extensions => native-plugins}/whatsapp/src/active-listener.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/active-listener.ts (100%) rename {extensions => native-plugins}/whatsapp/src/agent-tools-login.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auth-store.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply.broadcast-groups.combined.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply.broadcast-groups.test-harness.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply.impl.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply.test-harness.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply.web-auto-reply.compresses-common-formats-jpeg-cap.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply.web-auto-reply.connection-and-logging.e2e.test.ts (99%) rename {extensions => native-plugins}/whatsapp/src/auto-reply.web-auto-reply.last-route.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/constants.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/deliver-reply.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/deliver-reply.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/heartbeat-runner.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/heartbeat-runner.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/loggers.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/mentions.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/monitor.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/monitor/ack-reaction.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/monitor/broadcast.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/monitor/commands.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/monitor/echo.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/monitor/group-activation.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/monitor/group-gating.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/monitor/group-members.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/monitor/group-members.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/monitor/last-route.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/monitor/message-line.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/monitor/on-message.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/monitor/peer.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/monitor/process-message.inbound-context.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/monitor/process-message.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/session-snapshot.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/types.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/util.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/web-auto-reply-monitor.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/auto-reply/web-auto-reply-utils.test.ts (99%) rename {extensions => native-plugins}/whatsapp/src/channel.directory.test.ts (96%) rename {extensions => native-plugins}/whatsapp/src/channel.outbound.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/channel.runtime.ts (100%) rename {extensions => native-plugins}/whatsapp/src/channel.setup.ts (100%) rename {extensions => native-plugins}/whatsapp/src/channel.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/channel.ts (100%) rename {extensions => native-plugins}/whatsapp/src/config-schema.ts (100%) rename {extensions => native-plugins}/whatsapp/src/directory-config.ts (100%) rename {extensions => native-plugins}/whatsapp/src/group-policy.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/group-policy.ts (100%) rename {extensions => native-plugins}/whatsapp/src/inbound.media.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/inbound.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/inbound.ts (100%) rename {extensions => native-plugins}/whatsapp/src/inbound/access-control.test-harness.ts (100%) rename {extensions => native-plugins}/whatsapp/src/inbound/access-control.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/inbound/access-control.ts (100%) rename {extensions => native-plugins}/whatsapp/src/inbound/dedupe.ts (100%) rename {extensions => native-plugins}/whatsapp/src/inbound/extract.ts (100%) rename {extensions => native-plugins}/whatsapp/src/inbound/media.node.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/inbound/media.ts (100%) rename {extensions => native-plugins}/whatsapp/src/inbound/monitor.ts (100%) rename {extensions => native-plugins}/whatsapp/src/inbound/send-api.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/inbound/send-api.ts (100%) rename {extensions => native-plugins}/whatsapp/src/inbound/types.ts (100%) rename {extensions => native-plugins}/whatsapp/src/login-qr.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/login-qr.ts (100%) rename {extensions => native-plugins}/whatsapp/src/login.coverage.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/login.test.ts (96%) rename {extensions => native-plugins}/whatsapp/src/login.ts (100%) rename {extensions => native-plugins}/whatsapp/src/logout.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/media.test.ts (99%) rename {extensions => native-plugins}/whatsapp/src/media.ts (100%) rename {extensions => native-plugins}/whatsapp/src/monitor-inbox.allows-messages-from-senders-allowfrom-list.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/monitor-inbox.append-upsert.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/monitor-inbox.blocks-messages-from-unauthorized-senders-not-allowfrom.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/monitor-inbox.captures-media-path-image-messages.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/monitor-inbox.streams-inbound-messages.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/monitor-inbox.test-harness.ts (100%) rename {extensions => native-plugins}/whatsapp/src/normalize.ts (100%) rename {extensions => native-plugins}/whatsapp/src/outbound-adapter.poll.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/outbound-adapter.sendpayload.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/outbound-adapter.ts (100%) rename {extensions => native-plugins}/whatsapp/src/qr-image.ts (100%) rename {extensions => native-plugins}/whatsapp/src/reconnect.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/reconnect.ts (100%) rename {extensions => native-plugins}/whatsapp/src/resolve-target.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/runtime-api.ts (100%) rename {extensions => native-plugins}/whatsapp/src/runtime.ts (100%) rename {extensions => native-plugins}/whatsapp/src/send.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/send.ts (100%) rename {extensions => native-plugins}/whatsapp/src/session-errors.ts (100%) rename {extensions => native-plugins}/whatsapp/src/session-route.ts (100%) rename {extensions => native-plugins}/whatsapp/src/session.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/session.ts (100%) rename {extensions => native-plugins}/whatsapp/src/setup-core.ts (100%) rename {extensions => native-plugins}/whatsapp/src/setup-surface.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/setup-surface.ts (100%) rename {extensions => native-plugins}/whatsapp/src/shared.ts (100%) rename {extensions => native-plugins}/whatsapp/src/status-issues.test.ts (100%) rename {extensions => native-plugins}/whatsapp/src/status-issues.ts (100%) rename {extensions => native-plugins}/whatsapp/src/test-helpers.ts (100%) rename {extensions => native-plugins}/whatsapp/src/vcard.ts (100%) rename {extensions => native-plugins}/xai/index.ts (100%) rename {extensions => native-plugins}/xai/model-definitions.ts (100%) rename {extensions => native-plugins}/xai/onboard.ts (100%) rename {extensions => native-plugins}/xai/openclaw.plugin.json (100%) rename {extensions => native-plugins}/xai/package.json (90%) rename {extensions => native-plugins}/xai/provider-catalog.ts (100%) rename {extensions => native-plugins}/xai/provider-models.test.ts (100%) rename {extensions => native-plugins}/xai/provider-models.ts (100%) rename {extensions => native-plugins}/xai/src/grok-web-search-provider.ts (100%) rename {extensions => native-plugins}/xai/stream.ts (100%) rename {extensions => native-plugins}/xai/web-search.test.ts (98%) rename {extensions => native-plugins}/xai/web-search.ts (100%) rename {extensions => native-plugins}/xiaomi/index.ts (100%) rename {extensions => native-plugins}/xiaomi/onboard.ts (100%) rename {extensions => native-plugins}/xiaomi/openclaw.plugin.json (100%) rename {extensions => native-plugins}/xiaomi/package.json (91%) rename {extensions => native-plugins}/xiaomi/provider-catalog.ts (100%) rename {extensions => native-plugins}/zai/detect.ts (100%) rename {extensions => native-plugins}/zai/index.ts (100%) rename {extensions => native-plugins}/zai/media-understanding-provider.ts (100%) rename {extensions => native-plugins}/zai/model-definitions.ts (100%) rename {extensions => native-plugins}/zai/onboard.ts (100%) rename {extensions => native-plugins}/zai/openclaw.plugin.json (100%) rename {extensions => native-plugins}/zai/package.json (90%) rename {extensions => native-plugins}/zai/runtime-api.ts (100%) rename {extensions => native-plugins}/zalo/CHANGELOG.md (100%) rename {extensions => native-plugins}/zalo/README.md (94%) rename {extensions => native-plugins}/zalo/api.ts (100%) rename {extensions => native-plugins}/zalo/index.ts (100%) rename {extensions => native-plugins}/zalo/openclaw.plugin.json (100%) rename {extensions => native-plugins}/zalo/package.json (92%) rename {extensions => native-plugins}/zalo/runtime-api.ts (100%) rename {extensions => native-plugins}/zalo/setup-entry.ts (100%) rename {extensions => native-plugins}/zalo/src/accounts.ts (100%) rename {extensions => native-plugins}/zalo/src/actions.runtime.ts (100%) rename {extensions => native-plugins}/zalo/src/actions.ts (100%) rename {extensions => native-plugins}/zalo/src/api.test.ts (100%) rename {extensions => native-plugins}/zalo/src/api.ts (100%) rename {extensions => native-plugins}/zalo/src/channel.directory.test.ts (95%) rename {extensions => native-plugins}/zalo/src/channel.runtime.ts (100%) rename {extensions => native-plugins}/zalo/src/channel.startup.test.ts (97%) rename {extensions => native-plugins}/zalo/src/channel.ts (100%) rename {extensions => native-plugins}/zalo/src/config-schema.test.ts (100%) rename {extensions => native-plugins}/zalo/src/config-schema.ts (100%) rename {extensions => native-plugins}/zalo/src/group-access.ts (100%) rename {extensions => native-plugins}/zalo/src/monitor.group-policy.test.ts (100%) rename {extensions => native-plugins}/zalo/src/monitor.lifecycle.test.ts (100%) rename {extensions => native-plugins}/zalo/src/monitor.pairing.lifecycle.test.ts (98%) rename {extensions => native-plugins}/zalo/src/monitor.reply-once.lifecycle.test.ts (99%) rename {extensions => native-plugins}/zalo/src/monitor.ts (100%) rename {extensions => native-plugins}/zalo/src/monitor.webhook.test.ts (100%) rename {extensions => native-plugins}/zalo/src/monitor.webhook.ts (100%) rename {extensions => native-plugins}/zalo/src/probe.ts (100%) rename {extensions => native-plugins}/zalo/src/proxy.ts (100%) rename {extensions => native-plugins}/zalo/src/runtime-api.ts (100%) rename {extensions => native-plugins}/zalo/src/runtime.ts (100%) rename {extensions => native-plugins}/zalo/src/secret-input.ts (100%) rename {extensions => native-plugins}/zalo/src/send.ts (100%) rename {extensions => native-plugins}/zalo/src/session-route.ts (100%) rename {extensions => native-plugins}/zalo/src/setup-core.ts (100%) rename {extensions => native-plugins}/zalo/src/setup-status.test.ts (100%) rename {extensions => native-plugins}/zalo/src/setup-surface.test.ts (91%) rename {extensions => native-plugins}/zalo/src/setup-surface.ts (100%) rename {extensions => native-plugins}/zalo/src/status-issues.test.ts (95%) rename {extensions => native-plugins}/zalo/src/status-issues.ts (95%) rename {extensions => native-plugins}/zalo/src/token.test.ts (100%) rename {extensions => native-plugins}/zalo/src/token.ts (100%) rename {extensions => native-plugins}/zalo/src/types.ts (100%) rename {extensions => native-plugins}/zalouser/CHANGELOG.md (100%) rename {extensions => native-plugins}/zalouser/README.md (96%) rename {extensions => native-plugins}/zalouser/api.ts (100%) rename {extensions => native-plugins}/zalouser/index.ts (100%) rename {extensions => native-plugins}/zalouser/openclaw.plugin.json (100%) rename {extensions => native-plugins}/zalouser/package.json (93%) rename {extensions => native-plugins}/zalouser/runtime-api.ts (100%) rename {extensions => native-plugins}/zalouser/setup-entry.ts (100%) rename {extensions => native-plugins}/zalouser/src/accounts.test-mocks.ts (100%) rename {extensions => native-plugins}/zalouser/src/accounts.test.ts (100%) rename {extensions => native-plugins}/zalouser/src/accounts.ts (100%) rename {extensions => native-plugins}/zalouser/src/channel.directory.test.ts (100%) rename {extensions => native-plugins}/zalouser/src/channel.sendpayload.test.ts (100%) rename {extensions => native-plugins}/zalouser/src/channel.setup.test.ts (94%) rename {extensions => native-plugins}/zalouser/src/channel.setup.ts (100%) rename {extensions => native-plugins}/zalouser/src/channel.test.ts (100%) rename {extensions => native-plugins}/zalouser/src/channel.ts (99%) rename {extensions => native-plugins}/zalouser/src/config-schema.ts (100%) rename {extensions => native-plugins}/zalouser/src/group-policy.test.ts (100%) rename {extensions => native-plugins}/zalouser/src/group-policy.ts (100%) rename {extensions => native-plugins}/zalouser/src/message-sid.test.ts (100%) rename {extensions => native-plugins}/zalouser/src/message-sid.ts (100%) rename {extensions => native-plugins}/zalouser/src/monitor.account-scope.test.ts (100%) rename {extensions => native-plugins}/zalouser/src/monitor.group-gating.test.ts (100%) rename {extensions => native-plugins}/zalouser/src/monitor.send-mocks.ts (100%) rename {extensions => native-plugins}/zalouser/src/monitor.ts (99%) rename {extensions => native-plugins}/zalouser/src/probe.test.ts (100%) rename {extensions => native-plugins}/zalouser/src/probe.ts (100%) rename {extensions => native-plugins}/zalouser/src/qr-temp-file.ts (100%) rename {extensions => native-plugins}/zalouser/src/reaction.test.ts (100%) rename {extensions => native-plugins}/zalouser/src/reaction.ts (100%) rename {extensions => native-plugins}/zalouser/src/runtime.ts (100%) rename {extensions => native-plugins}/zalouser/src/send.test.ts (100%) rename {extensions => native-plugins}/zalouser/src/send.ts (100%) rename {extensions => native-plugins}/zalouser/src/session-route.ts (100%) rename {extensions => native-plugins}/zalouser/src/setup-core.ts (100%) rename {extensions => native-plugins}/zalouser/src/setup-surface.test.ts (98%) rename {extensions => native-plugins}/zalouser/src/setup-surface.ts (100%) rename {extensions => native-plugins}/zalouser/src/shared.ts (100%) rename {extensions => native-plugins}/zalouser/src/status-issues.test.ts (96%) rename {extensions => native-plugins}/zalouser/src/status-issues.ts (96%) rename {extensions => native-plugins}/zalouser/src/test-helpers.ts (100%) rename {extensions => native-plugins}/zalouser/src/text-styles.test.ts (100%) rename {extensions => native-plugins}/zalouser/src/text-styles.ts (100%) rename {extensions => native-plugins}/zalouser/src/tool.test.ts (100%) rename {extensions => native-plugins}/zalouser/src/tool.ts (100%) rename {extensions => native-plugins}/zalouser/src/types.ts (100%) rename {extensions => native-plugins}/zalouser/src/zalo-js.test-mocks.ts (100%) rename {extensions => native-plugins}/zalouser/src/zalo-js.ts (100%) rename {extensions => native-plugins}/zalouser/src/zca-client.ts (100%) rename {extensions => native-plugins}/zalouser/src/zca-constants.ts (100%) rename {extensions => native-plugins}/zalouser/src/zca-js-exports.d.ts (100%) create mode 100644 scripts/check-native-plugin-plugin-sdk-boundary.mjs rename scripts/{check-no-extension-src-imports.ts => check-no-native-plugin-src-imports.ts} (79%) rename scripts/{check-no-extension-test-core-imports.ts => check-no-native-plugin-test-core-imports.ts} (69%) create mode 100644 scripts/check-plugin-native-plugin-import-boundary.mjs delete mode 100644 scripts/lib/bundled-extension-manifest.ts create mode 100644 scripts/lib/bundled-native-plugin-manifest.ts create mode 100644 scripts/profile-native-plugin-memory.mjs create mode 100644 scripts/test-native-plugin.mjs create mode 100644 src/plugin-sdk/native-plugin-shared.ts rename test/fixtures/{extension-relative-outside-package-inventory.json => native-plugin-relative-outside-package-inventory.json} (100%) rename test/fixtures/{plugin-extension-import-boundary-inventory.json => plugin-native-plugin-import-boundary-inventory.json} (100%) rename test/helpers/{extensions => native-plugins}/chunk-test-helpers.ts (100%) rename test/helpers/{extensions => native-plugins}/directory.ts (100%) rename test/helpers/{extensions => native-plugins}/discord-provider.test-support.ts (92%) rename test/helpers/{extensions => native-plugins}/env.ts (100%) rename test/helpers/{extensions => native-plugins}/fetch-mock.ts (100%) rename test/helpers/{extensions => native-plugins}/frozen-time.ts (100%) rename test/helpers/{extensions => native-plugins}/matrix-monitor-route.ts (100%) rename test/helpers/{extensions => native-plugins}/matrix-route-test.ts (100%) rename test/helpers/{extensions => native-plugins}/mock-http-response.ts (100%) rename test/helpers/{extensions => native-plugins}/plugin-api.ts (100%) rename test/helpers/{extensions => native-plugins}/plugin-command.ts (100%) rename test/helpers/{extensions => native-plugins}/plugin-registration.ts (100%) rename test/helpers/{extensions => native-plugins}/plugin-routing.ts (100%) rename test/helpers/{extensions => native-plugins}/plugin-runtime-mock.ts (100%) rename test/helpers/{extensions => native-plugins}/provider-usage-fetch.ts (100%) rename test/helpers/{extensions => native-plugins}/runtime-env.ts (100%) rename test/helpers/{extensions => native-plugins}/send-config.ts (100%) rename test/helpers/{extensions => native-plugins}/setup-wizard.ts (100%) rename test/helpers/{extensions => native-plugins}/start-account-context.ts (100%) rename test/helpers/{extensions => native-plugins}/start-account-lifecycle.ts (100%) rename test/helpers/{extensions => native-plugins}/status-issues.ts (100%) rename test/helpers/{extensions => native-plugins}/subagent-hooks.ts (100%) rename test/helpers/{extensions => native-plugins}/telegram-plugin-command.ts (100%) rename test/helpers/{extensions => native-plugins}/temp-dir.ts (100%) rename test/helpers/{extensions => native-plugins}/typed-cases.ts (100%) rename test/{extension-plugin-sdk-boundary.test.ts => native-plugin-sdk-boundary.test.ts} (68%) rename test/{plugin-extension-import-boundary.test.ts => plugin-native-plugin-import-boundary.test.ts} (74%) delete mode 100644 test/scripts/test-extension.test.ts create mode 100644 test/scripts/test-native-plugin.test.ts create mode 100644 vitest.native-plugins.config.ts diff --git a/.agents/skills/openclaw-parallels-smoke/SKILL.md b/.agents/skills/openclaw-parallels-smoke/SKILL.md index db12afa48aa..8410a8a79bb 100644 --- a/.agents/skills/openclaw-parallels-smoke/SKILL.md +++ b/.agents/skills/openclaw-parallels-smoke/SKILL.md @@ -24,7 +24,7 @@ Use this skill for Parallels guest workflows and smoke interpretation. Do not lo - `prlctl exec` is fine for deterministic repo commands, but use the guest Terminal or `prlctl enter` when installer parity or shell-sensitive behavior matters. - On the fresh Tahoe snapshot, `brew` exists but `node` may be missing from PATH in noninteractive exec. Use `/opt/homebrew/bin/node` when needed. - Fresh host-served tgz installs should install as guest root with `HOME=/var/root`, then run onboarding as the desktop user via `prlctl exec --current-user`. -- Root-installed tgz smoke can log plugin blocks for world-writable `extensions/*`; do not treat that as an onboarding or gateway failure unless plugin loading is the task. +- Root-installed tgz smoke can log plugin blocks for world-writable `native-plugins/*`; do not treat that as an onboarding or gateway failure unless plugin loading is the task. ## Windows flow diff --git a/.github/labeler.yml b/.github/labeler.yml index 67a74985465..b4ce652509a 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -1,107 +1,107 @@ "channel: bluebubbles": - changed-files: - any-glob-to-any-file: - - "extensions/bluebubbles/**" + - "native-plugins/bluebubbles/**" - "docs/channels/bluebubbles.md" "channel: discord": - changed-files: - any-glob-to-any-file: - - "extensions/discord/**" + - "native-plugins/discord/**" - "docs/channels/discord.md" "channel: irc": - changed-files: - any-glob-to-any-file: - - "extensions/irc/**" + - "native-plugins/irc/**" - "docs/channels/irc.md" "channel: feishu": - changed-files: - any-glob-to-any-file: - "src/feishu/**" - - "extensions/feishu/**" + - "native-plugins/feishu/**" - "docs/channels/feishu.md" "channel: googlechat": - changed-files: - any-glob-to-any-file: - - "extensions/googlechat/**" + - "native-plugins/googlechat/**" - "docs/channels/googlechat.md" "channel: imessage": - changed-files: - any-glob-to-any-file: - - "extensions/imessage/**" + - "native-plugins/imessage/**" - "docs/channels/imessage.md" "channel: line": - changed-files: - any-glob-to-any-file: - - "extensions/line/**" + - "native-plugins/line/**" - "docs/channels/line.md" "channel: matrix": - changed-files: - any-glob-to-any-file: - - "extensions/matrix/**" + - "native-plugins/matrix/**" - "docs/channels/matrix.md" "channel: mattermost": - changed-files: - any-glob-to-any-file: - - "extensions/mattermost/**" + - "native-plugins/mattermost/**" - "docs/channels/mattermost.md" "channel: msteams": - changed-files: - any-glob-to-any-file: - - "extensions/msteams/**" + - "native-plugins/msteams/**" - "docs/channels/msteams.md" "channel: nextcloud-talk": - changed-files: - any-glob-to-any-file: - - "extensions/nextcloud-talk/**" + - "native-plugins/nextcloud-talk/**" - "docs/channels/nextcloud-talk.md" "channel: nostr": - changed-files: - any-glob-to-any-file: - - "extensions/nostr/**" + - "native-plugins/nostr/**" - "docs/channels/nostr.md" "channel: signal": - changed-files: - any-glob-to-any-file: - - "extensions/signal/**" + - "native-plugins/signal/**" - "docs/channels/signal.md" "channel: slack": - changed-files: - any-glob-to-any-file: - - "extensions/slack/**" + - "native-plugins/slack/**" - "docs/channels/slack.md" "channel: telegram": - changed-files: - any-glob-to-any-file: - - "extensions/telegram/**" + - "native-plugins/telegram/**" - "docs/channels/telegram.md" "channel: tlon": - changed-files: - any-glob-to-any-file: - - "extensions/tlon/**" + - "native-plugins/tlon/**" - "docs/channels/tlon.md" "channel: twitch": - changed-files: - any-glob-to-any-file: - - "extensions/twitch/**" + - "native-plugins/twitch/**" - "docs/channels/twitch.md" "channel: voice-call": - changed-files: - any-glob-to-any-file: - - "extensions/voice-call/**" + - "native-plugins/voice-call/**" "channel: whatsapp-web": - changed-files: - any-glob-to-any-file: - - "extensions/whatsapp/**" + - "native-plugins/whatsapp/**" - "docs/channels/whatsapp.md" "channel: zalo": - changed-files: - any-glob-to-any-file: - - "extensions/zalo/**" + - "native-plugins/zalo/**" - "docs/channels/zalo.md" "channel: zalouser": - changed-files: - any-glob-to-any-file: - - "extensions/zalouser/**" + - "native-plugins/zalouser/**" - "docs/channels/zalouser.md" "app: android": @@ -193,135 +193,135 @@ - "docs/cli/security.md" - "docs/gateway/security.md" -"extensions: copilot-proxy": +"native plugins: copilot-proxy": - changed-files: - any-glob-to-any-file: - - "extensions/copilot-proxy/**" -"extensions: diagnostics-otel": + - "native-plugins/copilot-proxy/**" +"native plugins: diagnostics-otel": - changed-files: - any-glob-to-any-file: - - "extensions/diagnostics-otel/**" -"extensions: llm-task": + - "native-plugins/diagnostics-otel/**" +"native plugins: llm-task": - changed-files: - any-glob-to-any-file: - - "extensions/llm-task/**" -"extensions: lobster": + - "native-plugins/llm-task/**" +"native plugins: lobster": - changed-files: - any-glob-to-any-file: - - "extensions/lobster/**" -"extensions: memory-core": + - "native-plugins/lobster/**" +"native plugins: memory-core": - changed-files: - any-glob-to-any-file: - - "extensions/memory-core/**" -"extensions: memory-lancedb": + - "native-plugins/memory-core/**" +"native plugins: memory-lancedb": - changed-files: - any-glob-to-any-file: - - "extensions/memory-lancedb/**" -"extensions: open-prose": + - "native-plugins/memory-lancedb/**" +"native plugins: open-prose": - changed-files: - any-glob-to-any-file: - - "extensions/open-prose/**" -"extensions: qwen-portal-auth": + - "native-plugins/open-prose/**" +"native plugins: qwen-portal-auth": - changed-files: - any-glob-to-any-file: - - "extensions/qwen-portal-auth/**" -"extensions: device-pair": + - "native-plugins/qwen-portal-auth/**" +"native plugins: device-pair": - changed-files: - any-glob-to-any-file: - - "extensions/device-pair/**" -"extensions: acpx": + - "native-plugins/device-pair/**" +"native plugins: acpx": - changed-files: - any-glob-to-any-file: - - "extensions/acpx/**" -"extensions: byteplus": + - "native-plugins/acpx/**" +"native plugins: byteplus": - changed-files: - any-glob-to-any-file: - - "extensions/byteplus/**" -"extensions: anthropic": + - "native-plugins/byteplus/**" +"native plugins: anthropic": - changed-files: - any-glob-to-any-file: - - "extensions/anthropic/**" -"extensions: cloudflare-ai-gateway": + - "native-plugins/anthropic/**" +"native plugins: cloudflare-ai-gateway": - changed-files: - any-glob-to-any-file: - - "extensions/cloudflare-ai-gateway/**" -"extensions: minimax-portal-auth": + - "native-plugins/cloudflare-ai-gateway/**" +"native plugins: minimax-portal-auth": - changed-files: - any-glob-to-any-file: - - "extensions/minimax-portal-auth/**" -"extensions: huggingface": + - "native-plugins/minimax-portal-auth/**" +"native plugins: huggingface": - changed-files: - any-glob-to-any-file: - - "extensions/huggingface/**" -"extensions: kilocode": + - "native-plugins/huggingface/**" +"native plugins: kilocode": - changed-files: - any-glob-to-any-file: - - "extensions/kilocode/**" -"extensions: openai": + - "native-plugins/kilocode/**" +"native plugins: openai": - changed-files: - any-glob-to-any-file: - - "extensions/openai/**" -"extensions: kimi-coding": + - "native-plugins/openai/**" +"native plugins: kimi-coding": - changed-files: - any-glob-to-any-file: - - "extensions/kimi-coding/**" -"extensions: minimax": + - "native-plugins/kimi-coding/**" +"native plugins: minimax": - changed-files: - any-glob-to-any-file: - - "extensions/minimax/**" -"extensions: modelstudio": + - "native-plugins/minimax/**" +"native plugins: modelstudio": - changed-files: - any-glob-to-any-file: - - "extensions/modelstudio/**" -"extensions: moonshot": + - "native-plugins/modelstudio/**" +"native plugins: moonshot": - changed-files: - any-glob-to-any-file: - - "extensions/moonshot/**" -"extensions: nvidia": + - "native-plugins/moonshot/**" +"native plugins: nvidia": - changed-files: - any-glob-to-any-file: - - "extensions/nvidia/**" -"extensions: phone-control": + - "native-plugins/nvidia/**" +"native plugins: phone-control": - changed-files: - any-glob-to-any-file: - - "extensions/phone-control/**" -"extensions: qianfan": + - "native-plugins/phone-control/**" +"native plugins: qianfan": - changed-files: - any-glob-to-any-file: - - "extensions/qianfan/**" -"extensions: synthetic": + - "native-plugins/qianfan/**" +"native plugins: synthetic": - changed-files: - any-glob-to-any-file: - - "extensions/synthetic/**" -"extensions: tavily": + - "native-plugins/synthetic/**" +"native plugins: tavily": - changed-files: - any-glob-to-any-file: - - "extensions/tavily/**" -"extensions: talk-voice": + - "native-plugins/tavily/**" +"native plugins: talk-voice": - changed-files: - any-glob-to-any-file: - - "extensions/talk-voice/**" -"extensions: together": + - "native-plugins/talk-voice/**" +"native plugins: together": - changed-files: - any-glob-to-any-file: - - "extensions/together/**" -"extensions: venice": + - "native-plugins/together/**" +"native plugins: venice": - changed-files: - any-glob-to-any-file: - - "extensions/venice/**" -"extensions: vercel-ai-gateway": + - "native-plugins/venice/**" +"native plugins: vercel-ai-gateway": - changed-files: - any-glob-to-any-file: - - "extensions/vercel-ai-gateway/**" -"extensions: volcengine": + - "native-plugins/vercel-ai-gateway/**" +"native plugins: volcengine": - changed-files: - any-glob-to-any-file: - - "extensions/volcengine/**" -"extensions: xiaomi": + - "native-plugins/volcengine/**" +"native plugins: xiaomi": - changed-files: - any-glob-to-any-file: - - "extensions/xiaomi/**" -"extensions: fal": + - "native-plugins/xiaomi/**" +"native plugins: fal": - changed-files: - any-glob-to-any-file: - - "extensions/fal/**" + - "native-plugins/fal/**" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d892d3f30df..8043967ed33 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -78,13 +78,13 @@ jobs: node scripts/ci-changed-scope.mjs --base "$BASE" --head HEAD - changed-extensions: + changed-native-plugins: needs: [docs-scope, changed-scope] if: needs.docs-scope.outputs.docs_only != 'true' && needs.changed-scope.outputs.run_node == 'true' runs-on: blacksmith-16vcpu-ubuntu-2404 outputs: - has_changed_extensions: ${{ steps.changed.outputs.has_changed_extensions }} - changed_extensions_matrix: ${{ steps.changed.outputs.changed_extensions_matrix }} + has_changed_native_plugins: ${{ steps.changed.outputs.has_changed_native_plugins }} + changed_native_plugins_matrix: ${{ steps.changed.outputs.changed_native_plugins_matrix }} steps: - name: Checkout uses: actions/checkout@v6 @@ -93,7 +93,7 @@ jobs: fetch-tags: false submodules: false - - name: Ensure changed-extensions base commit + - name: Ensure changed-native-plugins base commit uses: ./.github/actions/ensure-base-commit with: base-sha: ${{ github.event_name == 'push' && github.event.before || github.event.pull_request.base.sha }} @@ -106,20 +106,20 @@ jobs: install-deps: "false" use-sticky-disk: "false" - - name: Detect changed extensions + - name: Detect changed native plugins id: changed env: BASE_SHA: ${{ github.event_name == 'push' && github.event.before || github.event.pull_request.base.sha }} run: | node --input-type=module <<'EOF' import { appendFileSync } from "node:fs"; - import { listChangedExtensionIds } from "./scripts/test-extension.mjs"; + import { listChangedNativePluginIds } from "./scripts/test-native-plugin.mjs"; - const extensionIds = listChangedExtensionIds({ base: process.env.BASE_SHA, head: "HEAD" }); - const matrix = JSON.stringify({ include: extensionIds.map((extension) => ({ extension })) }); + const nativePluginIds = listChangedNativePluginIds({ base: process.env.BASE_SHA, head: "HEAD" }); + const matrix = JSON.stringify({ include: nativePluginIds.map((nativePlugin) => ({ nativePlugin })) }); - appendFileSync(process.env.GITHUB_OUTPUT, `has_changed_extensions=${extensionIds.length > 0}\n`, "utf8"); - appendFileSync(process.env.GITHUB_OUTPUT, `changed_extensions_matrix=${matrix}\n`, "utf8"); + appendFileSync(process.env.GITHUB_OUTPUT, `has_changed_native_plugins=${nativePluginIds.length > 0}\n`, "utf8"); + appendFileSync(process.env.GITHUB_OUTPUT, `changed_native_plugins_matrix=${matrix}\n`, "utf8"); EOF # Build dist once for Node-relevant changes and share it with downstream jobs. @@ -201,8 +201,8 @@ jobs: shard_count: 2 command: pnpm canvas:a2ui:bundle && pnpm test - runtime: node - task: extensions - command: pnpm test:extensions + task: native-plugins + command: pnpm test:native-plugins - runtime: node task: channels command: pnpm test:channels @@ -263,14 +263,14 @@ jobs: if: github.event_name != 'pull_request' || (matrix.runtime != 'bun' && matrix.task != 'compat-node22') run: ${{ matrix.command }} - extension-fast: - name: "extension-fast" - needs: [docs-scope, changed-scope, changed-extensions] - if: needs.docs-scope.outputs.docs_only != 'true' && needs.changed-scope.outputs.run_node == 'true' && needs.changed-extensions.outputs.has_changed_extensions == 'true' + native-plugin-fast: + name: "native-plugin-fast" + needs: [docs-scope, changed-scope, changed-native-plugins] + if: needs.docs-scope.outputs.docs_only != 'true' && needs.changed-scope.outputs.run_node == 'true' && needs.changed-native-plugins.outputs.has_changed_native_plugins == 'true' runs-on: blacksmith-16vcpu-ubuntu-2404 strategy: fail-fast: false - matrix: ${{ fromJson(needs.changed-extensions.outputs.changed_extensions_matrix) }} + matrix: ${{ fromJson(needs.changed-native-plugins.outputs.changed_native_plugins_matrix) }} steps: - name: Checkout uses: actions/checkout@v6 @@ -283,10 +283,10 @@ jobs: install-bun: "false" use-sticky-disk: "false" - - name: Run changed extension tests + - name: Run changed native plugin tests env: - OPENCLAW_CHANGED_EXTENSION: ${{ matrix.extension }} - run: pnpm test:extension "$OPENCLAW_CHANGED_EXTENSION" + OPENCLAW_CHANGED_NATIVE_PLUGIN: ${{ matrix.nativePlugin }} + run: pnpm test:native-plugin "$OPENCLAW_CHANGED_NATIVE_PLUGIN" # Types, lint, and format check. check: @@ -315,8 +315,8 @@ jobs: - name: Enforce safe external URL opening policy run: pnpm lint:ui:no-raw-window-open - plugin-extension-boundary: - name: "plugin-extension-boundary" + plugin-native-plugin-boundary: + name: "plugin-native-plugin-boundary" needs: [docs-scope, changed-scope] if: needs.docs-scope.outputs.docs_only != 'true' && needs.changed-scope.outputs.run_node == 'true' runs-on: blacksmith-16vcpu-ubuntu-2404 @@ -332,8 +332,8 @@ jobs: install-bun: "false" use-sticky-disk: "false" - - name: Run plugin extension boundary guard - run: pnpm run lint:plugins:no-extension-imports + - name: Run plugin native plugin boundary guard + run: pnpm run lint:plugins:no-native-plugin-imports web-search-provider-boundary: name: "web-search-provider-boundary" @@ -355,8 +355,8 @@ jobs: - name: Run web search provider boundary guard run: pnpm run lint:web-search-provider-boundaries - extension-src-outside-plugin-sdk-boundary: - name: "extension-src-outside-plugin-sdk-boundary" + native-plugin-src-outside-plugin-sdk-boundary: + name: "native-plugin-src-outside-plugin-sdk-boundary" needs: [docs-scope, changed-scope] if: needs.docs-scope.outputs.docs_only != 'true' && needs.changed-scope.outputs.run_node == 'true' runs-on: blacksmith-16vcpu-ubuntu-2404 @@ -372,11 +372,11 @@ jobs: install-bun: "false" use-sticky-disk: "false" - - name: Run extension src boundary guard - run: pnpm run lint:extensions:no-src-outside-plugin-sdk + - name: Run native plugin src boundary guard + run: pnpm run lint:native-plugins:no-src-outside-plugin-sdk - extension-plugin-sdk-internal-boundary: - name: "extension-plugin-sdk-internal-boundary" + native-plugin-plugin-sdk-internal-boundary: + name: "native-plugin-plugin-sdk-internal-boundary" needs: [docs-scope, changed-scope] if: needs.docs-scope.outputs.docs_only != 'true' && needs.changed-scope.outputs.run_node == 'true' runs-on: blacksmith-16vcpu-ubuntu-2404 @@ -392,8 +392,8 @@ jobs: install-bun: "false" use-sticky-disk: "false" - - name: Run extension plugin-sdk-internal guard - run: pnpm run lint:extensions:no-plugin-sdk-internal + - name: Run native plugin plugin-sdk-internal guard + run: pnpm run lint:native-plugins:no-plugin-sdk-internal build-smoke: name: "build-smoke" diff --git a/.github/workflows/install-smoke.yml b/.github/workflows/install-smoke.yml index 8baa84ca67b..2cfbd9f653a 100644 --- a/.github/workflows/install-smoke.yml +++ b/.github/workflows/install-smoke.yml @@ -84,8 +84,8 @@ jobs: openclaw --version && node -e " const Module = require(\"node:module\"); - const matrixPackage = require(\"/app/extensions/matrix/package.json\"); - const requireFromMatrix = Module.createRequire(\"/app/extensions/matrix/package.json\"); + const matrixPackage = require(\"/app/native-plugins/matrix/package.json\"); + const requireFromMatrix = Module.createRequire(\"/app/native-plugins/matrix/package.json\"); const runtimeDeps = Object.keys(matrixPackage.dependencies ?? {}); if (runtimeDeps.length === 0) { throw new Error( @@ -109,7 +109,7 @@ jobs: const matrixDiag = (parsed.diagnostics || []).filter( (diag) => typeof diag.source === \"string\" && - diag.source.includes(\"/extensions/matrix\") && + diag.source.includes(\"/native-plugins/matrix\") && typeof diag.message === \"string\" && diag.message.includes(\"extension entry escapes package directory\"), ); diff --git a/.github/workflows/plugin-npm-release.yml b/.github/workflows/plugin-npm-release.yml index 3507a0b68a1..1267ed00104 100644 --- a/.github/workflows/plugin-npm-release.yml +++ b/.github/workflows/plugin-npm-release.yml @@ -6,7 +6,7 @@ on: - main paths: - ".github/workflows/plugin-npm-release.yml" - - "extensions/**" + - "native-plugins/**" - "package.json" - "scripts/lib/plugin-npm-release.ts" - "scripts/plugin-npm-publish.sh" diff --git a/.oxlintrc.json b/.oxlintrc.json index 687b5bb5eb5..fff47655d9a 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -26,7 +26,7 @@ "assets/", "dist/", "docs/_layouts/", - "extensions/", + "native-plugins/", "node_modules/", "patches/", "pnpm-lock.yaml", diff --git a/.secrets.baseline b/.secrets.baseline index 07641fb920b..e525dafd2c1 100644 --- a/.secrets.baseline +++ b/.secrets.baseline @@ -10780,561 +10780,561 @@ "line_number": 94 } ], - "extensions/bluebubbles/src/actions.test.ts": [ + "native-plugins/bluebubbles/src/actions.test.ts": [ { "type": "Secret Keyword", - "filename": "extensions/bluebubbles/src/actions.test.ts", + "filename": "native-plugins/bluebubbles/src/actions.test.ts", "hashed_secret": "789cbe0407840b1c2041cb33452ff60f19bf58cc", "is_verified": false, "line_number": 54 } ], - "extensions/bluebubbles/src/attachments.test.ts": [ + "native-plugins/bluebubbles/src/attachments.test.ts": [ { "type": "Secret Keyword", - "filename": "extensions/bluebubbles/src/attachments.test.ts", + "filename": "native-plugins/bluebubbles/src/attachments.test.ts", "hashed_secret": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3", "is_verified": false, "line_number": 79 }, { "type": "Secret Keyword", - "filename": "extensions/bluebubbles/src/attachments.test.ts", + "filename": "native-plugins/bluebubbles/src/attachments.test.ts", "hashed_secret": "789cbe0407840b1c2041cb33452ff60f19bf58cc", "is_verified": false, "line_number": 90 }, { "type": "Secret Keyword", - "filename": "extensions/bluebubbles/src/attachments.test.ts", + "filename": "native-plugins/bluebubbles/src/attachments.test.ts", "hashed_secret": "db1530e1ea43af094d3d75b8dbaf19a4a182a318", "is_verified": false, "line_number": 154 }, { "type": "Secret Keyword", - "filename": "extensions/bluebubbles/src/attachments.test.ts", + "filename": "native-plugins/bluebubbles/src/attachments.test.ts", "hashed_secret": "052f076c732648ab32d2fcde9fe255319bfa0c7b", "is_verified": false, "line_number": 260 } ], - "extensions/bluebubbles/src/chat.test.ts": [ + "native-plugins/bluebubbles/src/chat.test.ts": [ { "type": "Secret Keyword", - "filename": "extensions/bluebubbles/src/chat.test.ts", + "filename": "native-plugins/bluebubbles/src/chat.test.ts", "hashed_secret": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3", "is_verified": false, "line_number": 68 }, { "type": "Secret Keyword", - "filename": "extensions/bluebubbles/src/chat.test.ts", + "filename": "native-plugins/bluebubbles/src/chat.test.ts", "hashed_secret": "789cbe0407840b1c2041cb33452ff60f19bf58cc", "is_verified": false, "line_number": 93 }, { "type": "Secret Keyword", - "filename": "extensions/bluebubbles/src/chat.test.ts", + "filename": "native-plugins/bluebubbles/src/chat.test.ts", "hashed_secret": "5c5a15a8b0b3e154d77746945e563ba40100681b", "is_verified": false, "line_number": 115 }, { "type": "Secret Keyword", - "filename": "extensions/bluebubbles/src/chat.test.ts", + "filename": "native-plugins/bluebubbles/src/chat.test.ts", "hashed_secret": "faacad0ce4ea1c19b46e128fd79679d37d3d331d", "is_verified": false, "line_number": 158 }, { "type": "Secret Keyword", - "filename": "extensions/bluebubbles/src/chat.test.ts", + "filename": "native-plugins/bluebubbles/src/chat.test.ts", "hashed_secret": "4dcc26a1d99532846fedf1265df4f40f4e0005b8", "is_verified": false, "line_number": 239 }, { "type": "Secret Keyword", - "filename": "extensions/bluebubbles/src/chat.test.ts", + "filename": "native-plugins/bluebubbles/src/chat.test.ts", "hashed_secret": "fd2a721f7be1ee3d691a011affcdb11d0ca365a8", "is_verified": false, "line_number": 302 } ], - "extensions/bluebubbles/src/monitor.test.ts": [ + "native-plugins/bluebubbles/src/monitor.test.ts": [ { "type": "Secret Keyword", - "filename": "extensions/bluebubbles/src/monitor.test.ts", + "filename": "native-plugins/bluebubbles/src/monitor.test.ts", "hashed_secret": "789cbe0407840b1c2041cb33452ff60f19bf58cc", "is_verified": false, "line_number": 169 } ], - "extensions/bluebubbles/src/reactions.test.ts": [ + "native-plugins/bluebubbles/src/reactions.test.ts": [ { "type": "Secret Keyword", - "filename": "extensions/bluebubbles/src/reactions.test.ts", + "filename": "native-plugins/bluebubbles/src/reactions.test.ts", "hashed_secret": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3", "is_verified": false, "line_number": 35 }, { "type": "Secret Keyword", - "filename": "extensions/bluebubbles/src/reactions.test.ts", + "filename": "native-plugins/bluebubbles/src/reactions.test.ts", "hashed_secret": "789cbe0407840b1c2041cb33452ff60f19bf58cc", "is_verified": false, "line_number": 192 }, { "type": "Secret Keyword", - "filename": "extensions/bluebubbles/src/reactions.test.ts", + "filename": "native-plugins/bluebubbles/src/reactions.test.ts", "hashed_secret": "a4a05c9a6449eb9d6cdac81dd7edc49230e327e6", "is_verified": false, "line_number": 223 }, { "type": "Secret Keyword", - "filename": "extensions/bluebubbles/src/reactions.test.ts", + "filename": "native-plugins/bluebubbles/src/reactions.test.ts", "hashed_secret": "a2833da9f0a16f09994754d0a31749cecf8c8c77", "is_verified": false, "line_number": 295 } ], - "extensions/bluebubbles/src/send.test.ts": [ + "native-plugins/bluebubbles/src/send.test.ts": [ { "type": "Secret Keyword", - "filename": "extensions/bluebubbles/src/send.test.ts", + "filename": "native-plugins/bluebubbles/src/send.test.ts", "hashed_secret": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3", "is_verified": false, "line_number": 79 }, { "type": "Secret Keyword", - "filename": "extensions/bluebubbles/src/send.test.ts", + "filename": "native-plugins/bluebubbles/src/send.test.ts", "hashed_secret": "faacad0ce4ea1c19b46e128fd79679d37d3d331d", "is_verified": false, "line_number": 757 } ], - "extensions/bluebubbles/src/targets.test.ts": [ + "native-plugins/bluebubbles/src/targets.test.ts": [ { "type": "Hex High Entropy String", - "filename": "extensions/bluebubbles/src/targets.test.ts", + "filename": "native-plugins/bluebubbles/src/targets.test.ts", "hashed_secret": "a3af2fb0c1e2a30bb038049e1e4b401593af6225", "is_verified": false, "line_number": 62 } ], - "extensions/copilot-proxy/index.ts": [ + "native-plugins/copilot-proxy/index.ts": [ { "type": "Secret Keyword", - "filename": "extensions/copilot-proxy/index.ts", + "filename": "native-plugins/copilot-proxy/index.ts", "hashed_secret": "50f013532a9770a2c2cfdc38b7581dd01df69b70", "is_verified": false, "line_number": 9 } ], - "extensions/feishu/skills/feishu-doc/SKILL.md": [ + "native-plugins/feishu/skills/feishu-doc/SKILL.md": [ { "type": "Hex High Entropy String", - "filename": "extensions/feishu/skills/feishu-doc/SKILL.md", + "filename": "native-plugins/feishu/skills/feishu-doc/SKILL.md", "hashed_secret": "8a2256bca273bb01a4e09ae6555b1e6652d9ff8c", "is_verified": false, "line_number": 20 } ], - "extensions/feishu/skills/feishu-wiki/SKILL.md": [ + "native-plugins/feishu/skills/feishu-wiki/SKILL.md": [ { "type": "Hex High Entropy String", - "filename": "extensions/feishu/skills/feishu-wiki/SKILL.md", + "filename": "native-plugins/feishu/skills/feishu-wiki/SKILL.md", "hashed_secret": "8a2256bca273bb01a4e09ae6555b1e6652d9ff8c", "is_verified": false, "line_number": 40 } ], - "extensions/feishu/src/channel.test.ts": [ + "native-plugins/feishu/src/channel.test.ts": [ { "type": "Secret Keyword", - "filename": "extensions/feishu/src/channel.test.ts", + "filename": "native-plugins/feishu/src/channel.test.ts", "hashed_secret": "8437d84cae482d10a2b9fd3f555d45006979e4be", "is_verified": false, "line_number": 21 } ], - "extensions/feishu/src/docx.test.ts": [ + "native-plugins/feishu/src/docx.test.ts": [ { "type": "Secret Keyword", - "filename": "extensions/feishu/src/docx.test.ts", + "filename": "native-plugins/feishu/src/docx.test.ts", "hashed_secret": "f49922d511d666848f250663c4fca84074b856a8", "is_verified": false, "line_number": 124 } ], - "extensions/feishu/src/media.test.ts": [ + "native-plugins/feishu/src/media.test.ts": [ { "type": "Secret Keyword", - "filename": "extensions/feishu/src/media.test.ts", + "filename": "native-plugins/feishu/src/media.test.ts", "hashed_secret": "f49922d511d666848f250663c4fca84074b856a8", "is_verified": false, "line_number": 76 } ], - "extensions/feishu/src/reply-dispatcher.test.ts": [ + "native-plugins/feishu/src/reply-dispatcher.test.ts": [ { "type": "Secret Keyword", - "filename": "extensions/feishu/src/reply-dispatcher.test.ts", + "filename": "native-plugins/feishu/src/reply-dispatcher.test.ts", "hashed_secret": "f49922d511d666848f250663c4fca84074b856a8", "is_verified": false, "line_number": 74 } ], - "extensions/google-antigravity-auth/index.ts": [ + "native-plugins/google-antigravity-auth/index.ts": [ { "type": "Base64 High Entropy String", - "filename": "extensions/google-antigravity-auth/index.ts", + "filename": "native-plugins/google-antigravity-auth/index.ts", "hashed_secret": "709d0f232b6ac4f8d24dec3e4fabfdb14257174f", "is_verified": false, "line_number": 14 } ], - "extensions/google-gemini-cli-auth/oauth.test.ts": [ + "native-plugins/google-gemini-cli-auth/oauth.test.ts": [ { "type": "Secret Keyword", - "filename": "extensions/google-gemini-cli-auth/oauth.test.ts", + "filename": "native-plugins/google-gemini-cli-auth/oauth.test.ts", "hashed_secret": "021343c1f561d7bcbc3b513df45cc3a6baf67b43", "is_verified": false, "line_number": 43 } ], - "extensions/irc/src/accounts.ts": [ + "native-plugins/irc/src/accounts.ts": [ { "type": "Secret Keyword", - "filename": "extensions/irc/src/accounts.ts", + "filename": "native-plugins/irc/src/accounts.ts", "hashed_secret": "920f8f5815b381ea692e9e7c2f7119f2b1aa620a", "is_verified": false, "line_number": 23 } ], - "extensions/irc/src/client.test.ts": [ + "native-plugins/irc/src/client.test.ts": [ { "type": "Secret Keyword", - "filename": "extensions/irc/src/client.test.ts", + "filename": "native-plugins/irc/src/client.test.ts", "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", "is_verified": false, "line_number": 8 }, { "type": "Secret Keyword", - "filename": "extensions/irc/src/client.test.ts", + "filename": "native-plugins/irc/src/client.test.ts", "hashed_secret": "b1cc3814a07fc3d7094f4cc181df7b57b51d165b", "is_verified": false, "line_number": 39 } ], - "extensions/line/src/channel.startup.test.ts": [ + "native-plugins/line/src/channel.startup.test.ts": [ { "type": "Secret Keyword", - "filename": "extensions/line/src/channel.startup.test.ts", + "filename": "native-plugins/line/src/channel.startup.test.ts", "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", "is_verified": false, "line_number": 94 } ], - "extensions/matrix/src/matrix/accounts.test.ts": [ + "native-plugins/matrix/src/matrix/accounts.test.ts": [ { "type": "Secret Keyword", - "filename": "extensions/matrix/src/matrix/accounts.test.ts", + "filename": "native-plugins/matrix/src/matrix/accounts.test.ts", "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", "is_verified": false, "line_number": 74 } ], - "extensions/matrix/src/matrix/client.test.ts": [ + "native-plugins/matrix/src/matrix/client.test.ts": [ { "type": "Secret Keyword", - "filename": "extensions/matrix/src/matrix/client.test.ts", + "filename": "native-plugins/matrix/src/matrix/client.test.ts", "hashed_secret": "fe7fcdaea49ece14677acd32374d2f1225819d5c", "is_verified": false, "line_number": 13 }, { "type": "Secret Keyword", - "filename": "extensions/matrix/src/matrix/client.test.ts", + "filename": "native-plugins/matrix/src/matrix/client.test.ts", "hashed_secret": "3dc927d80543dc0f643940b70d066bd4b4c4b78e", "is_verified": false, "line_number": 23 } ], - "extensions/matrix/src/matrix/client/storage.ts": [ + "native-plugins/matrix/src/matrix/client/storage.ts": [ { "type": "Secret Keyword", - "filename": "extensions/matrix/src/matrix/client/storage.ts", + "filename": "native-plugins/matrix/src/matrix/client/storage.ts", "hashed_secret": "7505d64a54e061b7acd54ccd58b49dc43500b635", "is_verified": false, "line_number": 8 } ], - "extensions/memory-lancedb/config.ts": [ + "native-plugins/memory-lancedb/config.ts": [ { "type": "Secret Keyword", - "filename": "extensions/memory-lancedb/config.ts", + "filename": "native-plugins/memory-lancedb/config.ts", "hashed_secret": "ecb252044b5ea0f679ee78ec1a12904739e2904d", "is_verified": false, "line_number": 105 } ], - "extensions/memory-lancedb/index.test.ts": [ + "native-plugins/memory-lancedb/index.test.ts": [ { "type": "Secret Keyword", - "filename": "extensions/memory-lancedb/index.test.ts", + "filename": "native-plugins/memory-lancedb/index.test.ts", "hashed_secret": "ed65c049bb2f78ee4f703b2158ba9cc6ea31fb7e", "is_verified": false, "line_number": 71 } ], - "extensions/msteams/src/probe.test.ts": [ + "native-plugins/msteams/src/probe.test.ts": [ { "type": "Secret Keyword", - "filename": "extensions/msteams/src/probe.test.ts", + "filename": "native-plugins/msteams/src/probe.test.ts", "hashed_secret": "1a91d62f7ca67399625a4368a6ab5d4a3baa6073", "is_verified": false, "line_number": 35 } ], - "extensions/nextcloud-talk/src/accounts.ts": [ + "native-plugins/nextcloud-talk/src/accounts.ts": [ { "type": "Secret Keyword", - "filename": "extensions/nextcloud-talk/src/accounts.ts", + "filename": "native-plugins/nextcloud-talk/src/accounts.ts", "hashed_secret": "920f8f5815b381ea692e9e7c2f7119f2b1aa620a", "is_verified": false, "line_number": 28 }, { "type": "Secret Keyword", - "filename": "extensions/nextcloud-talk/src/accounts.ts", + "filename": "native-plugins/nextcloud-talk/src/accounts.ts", "hashed_secret": "71f8e7976e4cbc4561c9d62fb283e7f788202acb", "is_verified": false, "line_number": 147 } ], - "extensions/nextcloud-talk/src/channel.ts": [ + "native-plugins/nextcloud-talk/src/channel.ts": [ { "type": "Secret Keyword", - "filename": "extensions/nextcloud-talk/src/channel.ts", + "filename": "native-plugins/nextcloud-talk/src/channel.ts", "hashed_secret": "71f8e7976e4cbc4561c9d62fb283e7f788202acb", "is_verified": false, "line_number": 403 } ], - "extensions/nostr/README.md": [ + "native-plugins/nostr/README.md": [ { "type": "Secret Keyword", - "filename": "extensions/nostr/README.md", + "filename": "native-plugins/nostr/README.md", "hashed_secret": "edeb23e25a619c434d22bb7f1c3ca4841166b4e8", "is_verified": false, "line_number": 46 } ], - "extensions/nostr/src/channel.test.ts": [ + "native-plugins/nostr/src/channel.test.ts": [ { "type": "Hex High Entropy String", - "filename": "extensions/nostr/src/channel.test.ts", + "filename": "native-plugins/nostr/src/channel.test.ts", "hashed_secret": "ce4303f6b22257d9c9cf314ef1dee4707c6e1c13", "is_verified": false, "line_number": 48 }, { "type": "Secret Keyword", - "filename": "extensions/nostr/src/channel.test.ts", + "filename": "native-plugins/nostr/src/channel.test.ts", "hashed_secret": "ce4303f6b22257d9c9cf314ef1dee4707c6e1c13", "is_verified": false, "line_number": 48 } ], - "extensions/nostr/src/nostr-bus.fuzz.test.ts": [ + "native-plugins/nostr/src/nostr-bus.fuzz.test.ts": [ { "type": "Hex High Entropy String", - "filename": "extensions/nostr/src/nostr-bus.fuzz.test.ts", + "filename": "native-plugins/nostr/src/nostr-bus.fuzz.test.ts", "hashed_secret": "2b4489606a23fb31fcdc849fa7e577ba90f6d39a", "is_verified": false, "line_number": 193 }, { "type": "Hex High Entropy String", - "filename": "extensions/nostr/src/nostr-bus.fuzz.test.ts", + "filename": "native-plugins/nostr/src/nostr-bus.fuzz.test.ts", "hashed_secret": "ce4303f6b22257d9c9cf314ef1dee4707c6e1c13", "is_verified": false, "line_number": 194 }, { "type": "Hex High Entropy String", - "filename": "extensions/nostr/src/nostr-bus.fuzz.test.ts", + "filename": "native-plugins/nostr/src/nostr-bus.fuzz.test.ts", "hashed_secret": "b84cb0c3925d34496e6c8b0e55b8c1664a438035", "is_verified": false, "line_number": 199 } ], - "extensions/nostr/src/nostr-bus.test.ts": [ + "native-plugins/nostr/src/nostr-bus.test.ts": [ { "type": "Hex High Entropy String", - "filename": "extensions/nostr/src/nostr-bus.test.ts", + "filename": "native-plugins/nostr/src/nostr-bus.test.ts", "hashed_secret": "ce4303f6b22257d9c9cf314ef1dee4707c6e1c13", "is_verified": false, "line_number": 11 }, { "type": "Hex High Entropy String", - "filename": "extensions/nostr/src/nostr-bus.test.ts", + "filename": "native-plugins/nostr/src/nostr-bus.test.ts", "hashed_secret": "7258e28563f03fb4c5994e8402e6f610d1f0f110", "is_verified": false, "line_number": 33 }, { "type": "Hex High Entropy String", - "filename": "extensions/nostr/src/nostr-bus.test.ts", + "filename": "native-plugins/nostr/src/nostr-bus.test.ts", "hashed_secret": "2b4489606a23fb31fcdc849fa7e577ba90f6d39a", "is_verified": false, "line_number": 101 }, { "type": "Hex High Entropy String", - "filename": "extensions/nostr/src/nostr-bus.test.ts", + "filename": "native-plugins/nostr/src/nostr-bus.test.ts", "hashed_secret": "ef717286343f6da3f4e6f68c6de02a5148a801c4", "is_verified": false, "line_number": 106 }, { "type": "Hex High Entropy String", - "filename": "extensions/nostr/src/nostr-bus.test.ts", + "filename": "native-plugins/nostr/src/nostr-bus.test.ts", "hashed_secret": "98b35fe4c45011220f509ebb5546d3889b55a891", "is_verified": false, "line_number": 111 } ], - "extensions/nostr/src/nostr-profile.fuzz.test.ts": [ + "native-plugins/nostr/src/nostr-profile.fuzz.test.ts": [ { "type": "Hex High Entropy String", - "filename": "extensions/nostr/src/nostr-profile.fuzz.test.ts", + "filename": "native-plugins/nostr/src/nostr-profile.fuzz.test.ts", "hashed_secret": "ce4303f6b22257d9c9cf314ef1dee4707c6e1c13", "is_verified": false, "line_number": 11 } ], - "extensions/nostr/src/nostr-profile.test.ts": [ + "native-plugins/nostr/src/nostr-profile.test.ts": [ { "type": "Hex High Entropy String", - "filename": "extensions/nostr/src/nostr-profile.test.ts", + "filename": "native-plugins/nostr/src/nostr-profile.test.ts", "hashed_secret": "ce4303f6b22257d9c9cf314ef1dee4707c6e1c13", "is_verified": false, "line_number": 14 } ], - "extensions/nostr/src/types.test.ts": [ + "native-plugins/nostr/src/types.test.ts": [ { "type": "Hex High Entropy String", - "filename": "extensions/nostr/src/types.test.ts", + "filename": "native-plugins/nostr/src/types.test.ts", "hashed_secret": "ce4303f6b22257d9c9cf314ef1dee4707c6e1c13", "is_verified": false, "line_number": 4 }, { "type": "Secret Keyword", - "filename": "extensions/nostr/src/types.test.ts", + "filename": "native-plugins/nostr/src/types.test.ts", "hashed_secret": "ce4303f6b22257d9c9cf314ef1dee4707c6e1c13", "is_verified": false, "line_number": 4 }, { "type": "Secret Keyword", - "filename": "extensions/nostr/src/types.test.ts", + "filename": "native-plugins/nostr/src/types.test.ts", "hashed_secret": "3bee216ebc256d692260fc3adc765050508fef5e", "is_verified": false, "line_number": 141 } ], - "extensions/open-prose/skills/prose/SKILL.md": [ + "native-plugins/open-prose/skills/prose/SKILL.md": [ { "type": "Basic Auth Credentials", - "filename": "extensions/open-prose/skills/prose/SKILL.md", + "filename": "native-plugins/open-prose/skills/prose/SKILL.md", "hashed_secret": "9d4e1e23bd5b727046a9e3b4b7db57bd8d6ee684", "is_verified": false, "line_number": 204 } ], - "extensions/open-prose/skills/prose/state/postgres.md": [ + "native-plugins/open-prose/skills/prose/state/postgres.md": [ { "type": "Secret Keyword", - "filename": "extensions/open-prose/skills/prose/state/postgres.md", + "filename": "native-plugins/open-prose/skills/prose/state/postgres.md", "hashed_secret": "fa9beb99e4029ad5a6615399e7bbae21356086b3", "is_verified": false, "line_number": 77 }, { "type": "Basic Auth Credentials", - "filename": "extensions/open-prose/skills/prose/state/postgres.md", + "filename": "native-plugins/open-prose/skills/prose/state/postgres.md", "hashed_secret": "9d4e1e23bd5b727046a9e3b4b7db57bd8d6ee684", "is_verified": false, "line_number": 200 } ], - "extensions/twitch/src/onboarding.test.ts": [ + "native-plugins/twitch/src/onboarding.test.ts": [ { "type": "Secret Keyword", - "filename": "extensions/twitch/src/onboarding.test.ts", + "filename": "native-plugins/twitch/src/onboarding.test.ts", "hashed_secret": "f2b14f68eb995facb3a1c35287b778d5bd785511", "is_verified": false, "line_number": 239 }, { "type": "Secret Keyword", - "filename": "extensions/twitch/src/onboarding.test.ts", + "filename": "native-plugins/twitch/src/onboarding.test.ts", "hashed_secret": "c8d8f8140951794fa875ea2c2d010c4382f36566", "is_verified": false, "line_number": 249 } ], - "extensions/twitch/src/status.test.ts": [ + "native-plugins/twitch/src/status.test.ts": [ { "type": "Secret Keyword", - "filename": "extensions/twitch/src/status.test.ts", + "filename": "native-plugins/twitch/src/status.test.ts", "hashed_secret": "f2b14f68eb995facb3a1c35287b778d5bd785511", "is_verified": false, "line_number": 92 } ], - "extensions/voice-call/README.md": [ + "native-plugins/voice-call/README.md": [ { "type": "Secret Keyword", - "filename": "extensions/voice-call/README.md", + "filename": "native-plugins/voice-call/README.md", "hashed_secret": "48004f85d79e636cfd408c3baddcb1f0bbdd611a", "is_verified": false, "line_number": 49 } ], - "extensions/voice-call/src/config.test.ts": [ + "native-plugins/voice-call/src/config.test.ts": [ { "type": "Secret Keyword", - "filename": "extensions/voice-call/src/config.test.ts", + "filename": "native-plugins/voice-call/src/config.test.ts", "hashed_secret": "62207a469ec2fdcfc7d66b04c2980ac1501acbf0", "is_verified": false, "line_number": 44 } ], - "extensions/voice-call/src/providers/telnyx.test.ts": [ + "native-plugins/voice-call/src/providers/telnyx.test.ts": [ { "type": "Secret Keyword", - "filename": "extensions/voice-call/src/providers/telnyx.test.ts", + "filename": "native-plugins/voice-call/src/providers/telnyx.test.ts", "hashed_secret": "62207a469ec2fdcfc7d66b04c2980ac1501acbf0", "is_verified": false, "line_number": 30 } ], - "extensions/zalo/README.md": [ + "native-plugins/zalo/README.md": [ { "type": "Secret Keyword", - "filename": "extensions/zalo/README.md", + "filename": "native-plugins/zalo/README.md", "hashed_secret": "f51aaee16a4a756d287f126b99c081b73cba7f15", "is_verified": false, "line_number": 41 diff --git a/AGENTS.md b/AGENTS.md index e6c5b1a5e92..648b7b69de0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,7 +1,7 @@ # Repository Guidelines - Repo: https://github.com/openclaw/openclaw -- In chat replies, file references must be repo-root relative only (example: `extensions/bluebubbles/src/channel.ts:80`); never absolute paths or `~/...`. +- In chat replies, file references must be repo-root relative only (example: `native-plugins/bluebubbles/src/channel.ts:80`); never absolute paths or `~/...`. - Do not edit files covered by security-focused `CODEOWNERS` rules unless a listed owner explicitly asked for the change or is already reviewing it with you. Treat those paths as restricted surfaces, not drive-by cleanup. ## Project Structure & Module Organization @@ -9,15 +9,15 @@ - Source code: `src/` (CLI wiring in `src/cli`, commands in `src/commands`, web provider in `src/provider-web.ts`, infra in `src/infra`, media pipeline in `src/media`). - Tests: colocated `*.test.ts`. - Docs: `docs/` (images, queue, Pi config). Built output lives in `dist/`. -- Plugins/extensions: live under `extensions/*` (workspace packages). Keep plugin-only deps in the extension `package.json`; do not add them to the root `package.json` unless core uses them. +- Plugins/extensions: live under `native-plugins/*` (workspace packages). Keep plugin-only deps in the extension `package.json`; do not add them to the root `package.json` unless core uses them. - Plugins: install runs `npm install --omit=dev` in plugin dir; runtime deps must live in `dependencies`. Avoid `workspace:*` in `dependencies` (npm install breaks); put `openclaw` in `devDependencies` or `peerDependencies` instead (runtime resolves `openclaw/plugin-sdk` via jiti alias). - Import boundaries: extension production code should treat `openclaw/plugin-sdk/*` plus local `api.ts` / `runtime-api.ts` barrels as the public surface. Do not import core `src/**`, `src/plugin-sdk-internal/**`, or another extension's `src/**` directly. - Installers served from `https://openclaw.ai/*`: live in the sibling repo `../openclaw.ai` (`public/install.sh`, `public/install-cli.sh`, `public/install.ps1`). - Messaging channels: always consider **all** built-in + extension channels when refactoring shared logic (routing, allowlists, pairing, command gating, onboarding, docs). - Core channel docs: `docs/channels/` - Core channel code: `src/telegram`, `src/discord`, `src/slack`, `src/signal`, `src/imessage`, `src/web` (WhatsApp web), `src/channels`, `src/routing` - - Extensions (channel plugins): `extensions/*` (e.g. `extensions/msteams`, `extensions/matrix`, `extensions/zalo`, `extensions/zalouser`, `extensions/voice-call`) -- When adding channels/extensions/apps/docs, update `.github/labeler.yml` and create matching GitHub labels (use existing channel/extension label colors). + - Extensions (channel plugins): `native-plugins/*` (e.g. `native-plugins/msteams`, `native-plugins/matrix`, `native-plugins/zalo`, `native-plugins/zalouser`, `native-plugins/voice-call`) +- When adding channels/native-plugins/apps/docs, update `.github/labeler.yml` and create matching GitHub labels (use existing channel/extension label colors). ## Docs Linking (Mintlify) @@ -86,7 +86,7 @@ - Dynamic import guardrail: do not mix `await import("x")` and static `import ... from "x"` for the same module in production code paths. If you need lazy loading, create a dedicated `*.runtime.ts` boundary (that re-exports from `x`) and dynamically import that boundary from lazy callers only. - Dynamic import verification: after refactors that touch lazy-loading/module boundaries, run `pnpm build` and check for `[INEFFECTIVE_DYNAMIC_IMPORT]` warnings before submitting. - Extension SDK self-import guardrail: inside an extension package, do not import that same extension via `openclaw/plugin-sdk/` from production files. Route internal imports through a local barrel such as `./api.ts` or `./runtime-api.ts`, and keep the `plugin-sdk/` path as the external contract only. -- Extension package boundary guardrail: inside `extensions//**`, do not use relative imports/exports that resolve outside that same `extensions/` package root. If shared code belongs in the plugin SDK, import `openclaw/plugin-sdk/` instead of reaching into `src/plugin-sdk/**` or other repo paths via `../`. +- Extension package boundary guardrail: inside `native-plugins//**`, do not use relative imports/exports that resolve outside that same `native-plugins/` package root. If shared code belongs in the plugin SDK, import `openclaw/plugin-sdk/` instead of reaching into `src/plugin-sdk/**` or other repo paths via `../`. - Extension API surface rule: `openclaw/plugin-sdk/` is the only public cross-package contract for extension-facing SDK code. If an extension needs a new seam, add a public subpath first; do not reach into `src/plugin-sdk/**` by relative path. - Never share class behavior via prototype mutation (`applyPrototypeMixins`, `Object.defineProperty` on `.prototype`, or exporting `Class.prototype` for merges). Use explicit inheritance/composition (`A extends B extends C`) or helper composition so TypeScript can typecheck. - If this pattern is needed, stop and get explicit approval before shipping; default behavior is to split/refactor into an explicit class hierarchy and keep members strongly typed. diff --git a/CHANGELOG.md b/CHANGELOG.md index 553fab9d3a8..cebd6ffb85c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,7 +36,7 @@ Docs: https://docs.openclaw.ai - Models/OpenAI: add native forward-compat support for `gpt-5.4-mini` and `gpt-5.4-nano` in the OpenAI provider catalog, runtime resolution, and reasoning capability gates. Thanks @vincentkoc. - Plugins/bundles: make enabled bundle MCP servers expose runnable tools in embedded Pi, and default relative bundle MCP launches to the bundle root so marketplace bundles like Context7 work through Pi instead of stopping at config import. - Scope message SecretRef resolution and harden doctor/status paths. (#48728) Thanks @joshavant. -- Plugins/testing: add a public `openclaw/plugin-sdk/testing` surface for plugin-author test helpers, and move bundled-extension-only test bridges out of `extensions/` into private repo test helpers. +- Plugins/testing: add a public `openclaw/plugin-sdk/testing` surface for plugin-author test helpers, and move bundled-native-plugin-only test bridges out of `native-plugins/` into private repo test helpers. - Plugins/Chutes: add a bundled Chutes provider with plugin-owned OAuth/API-key auth, dynamic model discovery, and default-on extension wiring. (#41416) Thanks @Veightor. - Plugins/binding: add `onConversationBindingResolved(...)` so plugins can react immediately after bind approvals or denies without blocking channel interaction acknowledgements. (#48678) Thanks @huntharo. - CLI/config: expand `config set` with SecretRef and provider builder modes, JSON/batch assignment support, and `--dry-run` validation with structured JSON output. (#49296) Thanks @joshavant. @@ -104,7 +104,7 @@ Docs: https://docs.openclaw.ai - Control UI/logging: make browser-safe logger imports avoid eager temp-dir resolution so the bundled Control UI no longer crashes to a blank screen when logging reaches `tmp-openclaw-dir`. (#48469) Fixes #48062. Thanks @7inspire. - Plugins/scoped ids: preserve scoped plugin ids during install and config keying, and keep bundled plugins ahead of discovered duplicate ids by default so `@scope/name` plugins no longer collide with unscoped installs. (#47413) Thanks @vincentkoc. - Gateway/watch mode: restart on bundled-plugin package and manifest metadata changes, rebuild `dist` for extension source and `tsdown.config.ts` changes, and still ignore extension docs. (#47571) Thanks @gumadeiras. -- Gateway/watch mode: recreate bundled plugin runtime metadata after clean or stale `dist` states, so `pnpm gateway:watch` no longer fails on missing `dist/extensions/*/openclaw.plugin.json` manifests after a rebuild. Thanks @gumadeiras. +- Gateway/watch mode: recreate bundled plugin runtime metadata after clean or stale `dist` states, so `pnpm gateway:watch` no longer fails on missing `dist/native-plugins/*/openclaw.plugin.json` manifests after a rebuild. Thanks @gumadeiras. - Control UI/chat sessions: show human-readable labels in the grouped session dropdown again, keep unique scoped fallbacks when metadata is missing, and disambiguate duplicate labels only when needed. (#45130) Thanks @luzhidong. - Control UI: scope persisted session selection per gateway, prevent stale session bleed across tokenized gateway opens, and cap stored gateway session history. (#47453) Thanks @sallyom. - Control UI/dashboard: preserve structured gateway shutdown reasons across restart disconnects so config-triggered restarts no longer fall back to `disconnected (1006): no reason`. (#46580) Fixes #46532. Thanks @vincentkoc. @@ -123,13 +123,13 @@ Docs: https://docs.openclaw.ai - CLI/completion: reduce recursive completion-script string churn and fix nested PowerShell command-path matching so generated nested completions resolve on PowerShell too. (#45537) Thanks @yiShanXin and @vincentkoc. - Slack/startup: harden `@slack/bolt` import interop across current bundled runtime shapes so Slack monitors no longer crash with `App is not a constructor` after plugin-sdk bundling changes. (#45953) Thanks @merc1305. - Windows/gateway status: accept `schtasks` `Last Result` output as an alias for `Last Run Result`, so running scheduled-task installs no longer show `Runtime: unknown`. (#47844) Thanks @MoerAI. -- ACP/acpx: resolve the bundled plugin root from the actual plugin directory so plugin-local installs stay under `dist/extensions/acpx` instead of escaping to `dist/extensions` and failing runtime setup. (#47601) Thanks @ngutman. +- ACP/acpx: resolve the bundled plugin root from the actual plugin directory so plugin-local installs stay under `dist/native-plugins/acpx` instead of escaping to `dist/extensions` and failing runtime setup. (#47601) Thanks @ngutman. - Gateway/WS handshake: raise the default pre-auth handshake timeout to 10 seconds and add `OPENCLAW_HANDSHAKE_TIMEOUT_MS` as a runtime override so busy local gateways stop dropping healthy CLI connections at 3 seconds. (#49262) Thanks @fuller-stack-dev. - Gateway/websocket pairing bypass for disabled auth: skip device-pairing enforcement for Control UI operator sessions when `gateway.auth.mode=none`, so reverse-proxied dashboards no longer get stuck on `pairing required` despite auth being explicitly disabled. (#47148) Thanks @ademczuk. - Control UI/model switching: preserve the selected provider prefix when switching models from the chat dropdown, so multi-provider setups no longer send `anthropic/gpt-5.2`-style mismatches when the user picked `openai/gpt-5.2`. (#47581) Thanks @chrishham. - Control UI/storage: scope persisted settings keys by gateway base path, with migration from the legacy shared key, so multiple gateways under one domain stop overwriting each other's dashboard preferences. (#47932) Thanks @bobBot-claw. - Agents/usage tracking: stop forcing `supportsUsageInStreaming: false` on non-native OpenAI-completions providers so compatible backends report token usage and cost again instead of showing all zeros. (#46500) Fixes #46142. Thanks @ademczuk. -- ACP/acpx: keep plugin-local backend installs under `extensions/acpx` in live repo checkouts so rebuilds no longer delete the runtime binary, and avoid package-lock churn during runtime repair. +- ACP/acpx: keep plugin-local backend installs under `native-plugins/acpx` in live repo checkouts so rebuilds no longer delete the runtime binary, and avoid package-lock churn during runtime repair. - Plugins/subagents: preserve gateway-owned plugin subagent access across runtime, tool, and embedded-runner load paths so gateway plugin tools and context engines can still spawn and manage subagents after the loader cache split. (#46648) Thanks @jalehman. - Control UI/overview: keep the language dropdown aligned with the persisted locale during dashboard startup so refreshing the page does not fall back to English before locale hydration completes. (#48019) Thanks @git-jxj. - Agents/compaction: rerun transcript repair after `session.compact()` so orphaned `tool_result` blocks cannot survive compaction and break later Anthropic requests. (#16095) thanks @claw-sylphx. @@ -876,7 +876,7 @@ Docs: https://docs.openclaw.ai - Gateway/loopback announce URLs: treat `http://` and `https://` aliases with the same loopback/private-network policy as websocket URLs so loopback cron announce delivery no longer fails secure URL validation. (#39064) Thanks @Narcooo. - Models/default provider fallback: when the hardcoded default provider is removed from `models.providers`, resolve defaults from configured providers instead of reporting stale removed-provider defaults in status output. (#38947) Thanks @davidemanuelDEV. - Agents/cache-trace stability: guard stable stringify against circular references in trace payloads so near-limit payloads no longer crash with `Maximum call stack size exceeded`; adds regression coverage. (#38935) Thanks @MumuTW. -- Extensions/diffs CI stability: add `headers` to the `localReq` test helper in `extensions/diffs/index.test.ts` so forwarding-hint checks no longer crash with `req.headers` undefined. (supersedes #39063) Thanks @Shennng. +- Extensions/diffs CI stability: add `headers` to the `localReq` test helper in `native-plugins/diffs/index.test.ts` so forwarding-hint checks no longer crash with `req.headers` undefined. (supersedes #39063) Thanks @Shennng. - Agents/compaction thresholding: apply `agents.defaults.contextTokens` cap to the model passed into embedded run and `/compact` session creation so auto-compaction thresholds use the effective context window, not native model max context. (#39099) Thanks @MumuTW. - Models/merge mode provider precedence: when `models.mode: "merge"` is active and config explicitly sets a provider `baseUrl`, keep config as source of truth instead of preserving stale runtime `models.json` `baseUrl` values; includes normalized provider-key coverage. (#39103) Thanks @BigUncle. - UI/Control chat tool streaming: render tool events live in webchat without requiring refresh by enabling `tool-events` capability, fixing stream/event correlation, and resetting/reloading stream state around tool results and terminal events. (#39104) Thanks @jakepresent. @@ -1145,7 +1145,7 @@ Docs: https://docs.openclaw.ai - Hooks/runtime stability: keep the internal hook handler registry on a `globalThis` singleton so hook registration/dispatch remains consistent when bundling emits duplicate module copies. (#32292) Thanks @Drickon. - Hooks/after_tool_call: include embedded session context (`sessionKey`, `agentId`) and fire the hook exactly once per tool execution by removing duplicate adapter-path dispatch in embedded runs. (#32201) Thanks @jbeno, @scoootscooob, @vincentkoc. - Hooks/tool-call correlation: include `runId` and `toolCallId` in plugin tool hook payloads/context and scope tool start/adjusted-param tracking by run to prevent cross-run collisions in `before_tool_call` and `after_tool_call`. (#32360) Thanks @vincentkoc. -- Plugins/install diagnostics: reject legacy plugin package shapes without `openclaw.extensions` and return an explicit upgrade hint with troubleshooting docs for repackaging. (#32055) Thanks @liuxiaopai-ai. +- Plugins/install diagnostics: reject legacy plugin package shapes without `openclaw.plugins` and return an explicit upgrade hint with troubleshooting docs for repackaging. (#32055) Thanks @liuxiaopai-ai. - Hooks/plugin context parity: ensure `llm_input` hooks in embedded attempts receive the same `trigger` and `channelId`-aware `hookCtx` used by the other hook phases, preserving channel/trigger-scoped plugin behavior. (#28623) Thanks @davidrudduck and @vincentkoc. - Plugins/hardlink install compatibility: allow bundled plugin manifests and entry files to load when installed via hardlink-based package managers (`pnpm`, `bun`) while keeping hardlink rejection enabled for non-bundled plugin sources. (#32119) Fixes #28175, #28404, #29455. Thanks @markfietje. - Cron/session reaper reliability: move cron session reaper sweeps into `onTimer` `finally` and keep pruning active even when timer ticks fail early (for example cron store parse failures), preventing stale isolated run sessions from accumulating indefinitely. (#31996) Fixes #31946. Thanks @scoootscooob. @@ -2083,7 +2083,7 @@ Docs: https://docs.openclaw.ai - Security/Agents: make owner-ID obfuscation use a dedicated HMAC secret from configuration (`ownerDisplaySecret`) and update hashing behavior so obfuscation is decoupled from gateway token handling for improved control. (#7343) Thanks @vincentkoc. - Security/Infra: switch gateway lock and tool-call synthetic IDs from SHA-1 to SHA-256 with unchanged truncation length to strengthen hash basis while keeping deterministic behavior and lock key format. (#7343) Thanks @vincentkoc. - Dependencies/Tooling: add non-blocking dead-code scans in CI via Knip/ts-prune/ts-unused-exports to surface unused dependencies and exports earlier. (#22468) Thanks @vincentkoc. -- Dependencies/Unused Dependencies: remove or scope unused root and extension deps (`@larksuiteoapi/node-sdk`, `signal-utils`, `ollama`, `lit`, `@lit/context`, `@lit-labs/signals`, `@microsoft/agents-hosting-express`, `@microsoft/agents-hosting-extensions-teams`, and plugin-local `openclaw` devDeps in `extensions/open-prose`, `extensions/lobster`, and `extensions/llm-task`). (#22471, #22495) Thanks @vincentkoc. +- Dependencies/Unused Dependencies: remove or scope unused root and extension deps (`@larksuiteoapi/node-sdk`, `signal-utils`, `ollama`, `lit`, `@lit/context`, `@lit-labs/signals`, `@microsoft/agents-hosting-express`, `@microsoft/agents-hosting-extensions-teams`, and plugin-local `openclaw` devDeps in `native-plugins/open-prose`, `native-plugins/lobster`, and `native-plugins/llm-task`). (#22471, #22495) Thanks @vincentkoc. - Dependencies/A2UI: harden dependency resolution after root cleanup (resolve `lit`, `@lit/context`, `@lit-labs/signals`, and `signal-utils` from workspace/root) and simplify bundling fallback behavior, including `pnpm dlx rolldown` compatibility. (#22481, #22507) Thanks @vincentkoc. ### Fixes @@ -2263,7 +2263,7 @@ Docs: https://docs.openclaw.ai - Security/Net: enforce strict dotted-decimal IPv4 literals in SSRF checks and fail closed on unsupported legacy forms (octal/hex/short/packed, for example `0177.0.0.1`, `127.1`, `2130706433`) before DNS lookup. - Security/Discord: enforce trusted-sender guild permission checks for moderation actions (`timeout`, `kick`, `ban`) and ignore untrusted `senderUserId` params to prevent privilege escalation in tool-driven flows. Thanks @aether-ai-agent for reporting. - Security/ACP+Exec: add `openclaw acp --token-file/--password-file` secret-file support (with inline secret flag warnings), redact ACP working-directory prefixes to `~` home-relative paths, constrain exec script preflight file inspection to the effective `workdir` boundary, and add security-audit warnings when `tools.exec.host="sandbox"` is configured while sandbox mode is off. -- Security/Plugins/Hooks: enforce runtime/package path containment with realpath checks so `openclaw.extensions`, `openclaw.hooks`, and hook handler modules cannot escape their trusted roots via traversal or symlinks. +- Security/Plugins/Hooks: enforce runtime/package path containment with realpath checks so `openclaw.plugins`, `openclaw.hooks`, and hook handler modules cannot escape their trusted roots via traversal or symlinks. - Security/Discord: centralize trusted sender checks for moderation actions in message-action dispatch, share moderation command parsing across handlers, and clarify permission helpers with explicit any/all semantics. - Security/ACP: harden ACP bridge session management with duplicate-session refresh, idle-session reaping, oldest-idle soft-cap eviction, and burst rate limiting on session creation to reduce local DoS risk without disrupting normal IDE usage. - Security/ACP: bound ACP prompt text payloads to 2 MiB before gateway forwarding, account for join separator bytes during pre-concatenation size checks, and avoid stale active-run session state when oversized prompts are rejected. Thanks @aether-ai-agent for reporting. @@ -2886,7 +2886,7 @@ Docs: https://docs.openclaw.ai - Feishu: probe status uses the resolved account context for multi-account credential checks. (#11233) Thanks @onevcat. - Feishu: add streaming card replies via Card Kit API and preserve `renderMode=auto` fallback behavior for plain-text responses. (#10379) Thanks @xzq-xu. - Feishu DocX: preserve top-level converted block order using `firstLevelBlockIds` when writing/appending documents. (#13994) Thanks @Cynosure159. -- Feishu plugin packaging: remove `workspace:*` `openclaw` dependency from `extensions/feishu` and sync lockfile for install compatibility. (#14423) Thanks @jackcooper2015. +- Feishu plugin packaging: remove `workspace:*` `openclaw` dependency from `native-plugins/feishu` and sync lockfile for install compatibility. (#14423) Thanks @jackcooper2015. - CLI/Wizard: exit with code 1 when `configure`, `agents add`, or interactive `onboard` wizards are canceled, so `set -e` automation stops correctly. (#14156) Thanks @0xRaini. - Media: strip `MEDIA:` lines with local paths instead of leaking as visible text. (#14399) Thanks @0xRaini. - Config/Cron: exclude `maxTokens` from config redaction and honor `deleteAfterRun` on skipped cron jobs. (#13342) Thanks @niceysam. @@ -4246,7 +4246,7 @@ Thanks @AlexMikhalev, @CoreyH, @John-Rood, @KrauseFx, @MaudeBot, @Nachx639, @Nic - Auth: read Codex keychain credentials and make the lookup platform-aware. - macOS/Release: avoid bundling dist artifacts in relay builds and generate appcasts from zip-only sources. - Doctor: surface plugin diagnostics in the report. -- Plugins: treat `plugins.load.paths` directory entries as package roots when they contain `package.json` + `openclaw.extensions`; load plugin packages from config dirs; extract archives without system tar. +- Plugins: treat `plugins.load.paths` directory entries as package roots when they contain `package.json` + `openclaw.plugins`; load plugin packages from config dirs; extract archives without system tar. - Config: expand `~` in `CLAWDBOT_CONFIG_PATH` and common path-like config fields (including `plugins.load.paths`); guard invalid `$include` paths. (#731) — thanks @pasogott. - Agents: stop pre-creating session transcripts so first user messages persist in JSONL history. - Agents: skip pre-compaction memory flush when the session workspace is read-only. diff --git a/Dockerfile b/Dockerfile index fa97f83323a..3d05e05bd65 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ # Multi-stage build produces a minimal runtime image without build tools, # source code, or Bun. Works with Docker, Buildx, and Podman. # The ext-deps stage extracts only the package.json files we need from -# extensions/, so the main build layer is not invalidated by unrelated +# native-plugins/, so the main build layer is not invalidated by unrelated # extension source changes. # # Two runtime variants: @@ -30,9 +30,9 @@ COPY extensions /tmp/extensions # Copy package.json for opted-in extensions so pnpm resolves their deps. RUN mkdir -p /out && \ for ext in $OPENCLAW_EXTENSIONS; do \ - if [ -f "/tmp/extensions/$ext/package.json" ]; then \ + if [ -f "/tmp/native-plugins/$ext/package.json" ]; then \ mkdir -p "/out/$ext" && \ - cp "/tmp/extensions/$ext/package.json" "/out/$ext/package.json"; \ + cp "/tmp/native-plugins/$ext/package.json" "/out/$ext/package.json"; \ fi; \ done @@ -61,7 +61,7 @@ COPY package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc ./ COPY ui/package.json ./ui/package.json COPY patches ./patches -COPY --from=ext-deps /out/ ./extensions/ +COPY --from=ext-deps /out/ ./native-plugins/ # Reduce OOM risk on low-memory hosts during dependency installation. # Docker builds on small VMs may otherwise fail with "Killed" (exit 137). diff --git a/docs/.generated/config-baseline.json b/docs/.generated/config-baseline.json index f4715f11ea3..8c46e1c3a2c 100644 --- a/docs/.generated/config-baseline.json +++ b/docs/.generated/config-baseline.json @@ -57471,7 +57471,7 @@ "storage" ], "label": "Plugin Install Path", - "help": "Resolved install directory (usually ~/.openclaw/extensions/).", + "help": "Resolved install directory (usually ~/.openclaw/native-plugins/).", "hasChildren": false }, { diff --git a/docs/.generated/config-baseline.jsonl b/docs/.generated/config-baseline.jsonl index 819422ac9aa..f34459c768f 100644 --- a/docs/.generated/config-baseline.jsonl +++ b/docs/.generated/config-baseline.jsonl @@ -4943,7 +4943,7 @@ {"recordType":"path","path":"plugins.installs","kind":"core","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":["advanced"],"label":"Plugin Install Records","help":"CLI-managed install metadata (used by `openclaw plugins update` to locate install sources).","hasChildren":true} {"recordType":"path","path":"plugins.installs.*","kind":"core","type":"object","required":false,"deprecated":false,"sensitive":false,"tags":[],"hasChildren":true} {"recordType":"path","path":"plugins.installs.*.installedAt","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":["advanced"],"label":"Plugin Install Time","help":"ISO timestamp of last install/update.","hasChildren":false} -{"recordType":"path","path":"plugins.installs.*.installPath","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":["storage"],"label":"Plugin Install Path","help":"Resolved install directory (usually ~/.openclaw/extensions/).","hasChildren":false} +{"recordType":"path","path":"plugins.installs.*.installPath","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":["storage"],"label":"Plugin Install Path","help":"Resolved install directory (usually ~/.openclaw/native-plugins/).","hasChildren":false} {"recordType":"path","path":"plugins.installs.*.integrity","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":["advanced"],"label":"Plugin Resolved Integrity","help":"Resolved npm dist integrity hash for the fetched artifact (if reported by npm).","hasChildren":false} {"recordType":"path","path":"plugins.installs.*.marketplaceName","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":["advanced"],"label":"Plugin Marketplace Name","help":"Marketplace display name recorded for marketplace-backed plugin installs (if available).","hasChildren":false} {"recordType":"path","path":"plugins.installs.*.marketplacePlugin","kind":"core","type":"string","required":false,"deprecated":false,"sensitive":false,"tags":["advanced"],"label":"Plugin Marketplace Plugin","help":"Plugin entry name inside the source marketplace, used for later updates.","hasChildren":false} diff --git a/docs/channels/line.md b/docs/channels/line.md index a965dc6e991..1bc30dca4ce 100644 --- a/docs/channels/line.md +++ b/docs/channels/line.md @@ -28,7 +28,7 @@ openclaw plugins install @openclaw/line Local checkout (when running from a git repo): ```bash -openclaw plugins install ./extensions/line +openclaw plugins install ./native-plugins/line ``` ## Setup diff --git a/docs/channels/matrix.md b/docs/channels/matrix.md index 89486237776..9cdac5b91ad 100644 --- a/docs/channels/matrix.md +++ b/docs/channels/matrix.md @@ -24,7 +24,7 @@ openclaw plugins install @openclaw/matrix Install from a local checkout: ```bash -openclaw plugins install ./extensions/matrix +openclaw plugins install ./native-plugins/matrix ``` See [Plugins](/tools/plugin) for plugin behavior and install rules. diff --git a/docs/channels/mattermost.md b/docs/channels/mattermost.md index 41f6ffa19a0..5d2785b9a8c 100644 --- a/docs/channels/mattermost.md +++ b/docs/channels/mattermost.md @@ -25,7 +25,7 @@ openclaw plugins install @openclaw/mattermost Local checkout (when running from a git repo): ```bash -openclaw plugins install ./extensions/mattermost +openclaw plugins install ./native-plugins/mattermost ``` If you choose Mattermost during setup and a git checkout is detected, diff --git a/docs/channels/msteams.md b/docs/channels/msteams.md index d5e7e1bbc66..e725fef1946 100644 --- a/docs/channels/msteams.md +++ b/docs/channels/msteams.md @@ -30,7 +30,7 @@ openclaw plugins install @openclaw/msteams Local checkout (when running from a git repo): ```bash -openclaw plugins install ./extensions/msteams +openclaw plugins install ./native-plugins/msteams ``` If you choose Teams during setup and a git checkout is detected, @@ -242,7 +242,7 @@ This is often easier than hand-editing JSON manifests. 1. **Install the Microsoft Teams plugin** - From npm: `openclaw plugins install @openclaw/msteams` - - From a local checkout: `openclaw plugins install ./extensions/msteams` + - From a local checkout: `openclaw plugins install ./native-plugins/msteams` 2. **Bot registration** - Create an Azure Bot (see above) and note: diff --git a/docs/channels/nextcloud-talk.md b/docs/channels/nextcloud-talk.md index f8be8d74f0c..bef8dacdeb0 100644 --- a/docs/channels/nextcloud-talk.md +++ b/docs/channels/nextcloud-talk.md @@ -22,7 +22,7 @@ openclaw plugins install @openclaw/nextcloud-talk Local checkout (when running from a git repo): ```bash -openclaw plugins install ./extensions/nextcloud-talk +openclaw plugins install ./native-plugins/nextcloud-talk ``` If you choose Nextcloud Talk during setup and a git checkout is detected, diff --git a/docs/channels/nostr.md b/docs/channels/nostr.md index d453d9f653c..88a46abf156 100644 --- a/docs/channels/nostr.md +++ b/docs/channels/nostr.md @@ -35,7 +35,7 @@ openclaw plugins install @openclaw/nostr Use a local checkout (dev workflows): ```bash -openclaw plugins install --link /extensions/nostr +openclaw plugins install --link /native-plugins/nostr ``` Restart the Gateway after installing or enabling plugins. diff --git a/docs/channels/synology-chat.md b/docs/channels/synology-chat.md index aae655f27b7..fce2cdbfac9 100644 --- a/docs/channels/synology-chat.md +++ b/docs/channels/synology-chat.md @@ -19,7 +19,7 @@ Synology Chat is plugin-based and not part of the default core channel install. Install from a local checkout: ```bash -openclaw plugins install ./extensions/synology-chat +openclaw plugins install ./native-plugins/synology-chat ``` Details: [Plugins](/tools/plugin) diff --git a/docs/channels/tlon.md b/docs/channels/tlon.md index f3e70c7152a..c70306b97a2 100644 --- a/docs/channels/tlon.md +++ b/docs/channels/tlon.md @@ -27,7 +27,7 @@ openclaw plugins install @openclaw/tlon Local checkout (when running from a git repo): ```bash -openclaw plugins install ./extensions/tlon +openclaw plugins install ./native-plugins/tlon ``` Details: [Plugins](/tools/plugin) diff --git a/docs/channels/twitch.md b/docs/channels/twitch.md index 98174fdcc7b..2676cf36579 100644 --- a/docs/channels/twitch.md +++ b/docs/channels/twitch.md @@ -22,7 +22,7 @@ openclaw plugins install @openclaw/twitch Local checkout (when running from a git repo): ```bash -openclaw plugins install ./extensions/twitch +openclaw plugins install ./native-plugins/twitch ``` Details: [Plugins](/tools/plugin) diff --git a/docs/channels/zalo.md b/docs/channels/zalo.md index b327f596f74..485ec033b1c 100644 --- a/docs/channels/zalo.md +++ b/docs/channels/zalo.md @@ -20,7 +20,7 @@ Zalo ships as a plugin and is not bundled with the core install. ## Quick setup (beginner) 1. Install the Zalo plugin: - - From a source checkout: `openclaw plugins install ./extensions/zalo` + - From a source checkout: `openclaw plugins install ./native-plugins/zalo` - From npm (if published): `openclaw plugins install @openclaw/zalo` - Or pick **Zalo** in setup and confirm the install prompt 2. Set the token: diff --git a/docs/channels/zalouser.md b/docs/channels/zalouser.md index 4847430c8ac..75afb18f584 100644 --- a/docs/channels/zalouser.md +++ b/docs/channels/zalouser.md @@ -17,7 +17,7 @@ Status: experimental. This integration automates a **personal Zalo account** via Zalo Personal ships as a plugin and is not bundled with the core install. - Install via CLI: `openclaw plugins install @openclaw/zalouser` -- Or from a source checkout: `openclaw plugins install ./extensions/zalouser` +- Or from a source checkout: `openclaw plugins install ./native-plugins/zalouser` - Details: [Plugins](/tools/plugin) No external `zca`/`openzca` CLI binary is required. diff --git a/docs/cli/plugins.md b/docs/cli/plugins.md index 3d4c482707f..9f6a32455c2 100644 --- a/docs/cli/plugins.md +++ b/docs/cli/plugins.md @@ -102,7 +102,7 @@ For local paths and archives, OpenClaw auto-detects: component layout) - Cursor-compatible bundles (`.cursor-plugin/plugin.json`) -Compatible bundles install into the normal extensions root and participate in +Compatible bundles install into the normal plugins root and participate in the same list/info/enable/disable flow. Today, bundle skills, Claude command-skills, Claude `settings.json` defaults, Cursor command-skills, and compatible Codex hook directories are supported; other detected bundle capabilities are shown in @@ -130,7 +130,7 @@ the plugin allowlist, and linked `plugins.load.paths` entries when applicable. For active memory plugins, the memory slot resets to `memory-core`. By default, uninstall also removes the plugin install directory under the active -state dir extensions root (`$OPENCLAW_STATE_DIR/extensions/`). Use +state dir plugins root (`$OPENCLAW_STATE_DIR/plugins/`). Use `--keep-files` to keep files on disk. `--keep-config` is supported as a deprecated alias for `--keep-files`. diff --git a/docs/docs.json b/docs/docs.json index a941bec2601..65cb6ed4b4d 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -1075,7 +1075,7 @@ { "group": "Extensions", "pages": [ - "plugins/building-extensions", + "plugins/building-native-plugins", "plugins/architecture", "plugins/community", "plugins/bundles", diff --git a/docs/gateway/configuration-reference.md b/docs/gateway/configuration-reference.md index 11ea717513a..02697a8cfd4 100644 --- a/docs/gateway/configuration-reference.md +++ b/docs/gateway/configuration-reference.md @@ -2415,7 +2415,7 @@ See [Local Models](/gateway/local-models). TL;DR: run MiniMax M2.5 via LM Studio } ``` -- Loaded from `~/.openclaw/extensions`, `/.openclaw/extensions`, plus `plugins.load.paths`. +- Loaded from `~/.openclaw/plugins`, `/.openclaw/plugins`, plus `plugins.load.paths`. - Discovery accepts native OpenClaw plugins plus compatible Codex bundles and Claude bundles, including manifestless Claude default-layout bundles. - **Config changes require a gateway restart.** - `allow`: optional allowlist (only listed plugins load). `deny` wins. diff --git a/docs/gateway/security/index.md b/docs/gateway/security/index.md index 26cfbc4d6df..bbb63320737 100644 --- a/docs/gateway/security/index.md +++ b/docs/gateway/security/index.md @@ -451,7 +451,7 @@ Plugins run **in-process** with the Gateway. Treat them as trusted code: - Review plugin config before enabling. - Restart the Gateway after plugin changes. - If you install plugins from npm (`openclaw plugins install `), treat it like running untrusted code: - - The install path is `~/.openclaw/extensions//` (or `$OPENCLAW_STATE_DIR/extensions//`). + - The install path is `~/.openclaw/plugins//` (or `$OPENCLAW_STATE_DIR/plugins//`). - OpenClaw uses `npm pack` and then runs `npm install --omit=dev` in that directory (npm lifecycle scripts can execute code during install). - Prefer pinned, exact versions (`@scope/pkg@1.2.3`), and inspect the unpacked code on disk before enabling. @@ -850,7 +850,7 @@ Assume anything under `~/.openclaw/` (or `$OPENCLAW_STATE_DIR/`) may contain sec - `secrets.json` (optional): file-backed secret payload used by `file` SecretRef providers (`secrets.providers`). - `agents//agent/auth.json`: legacy compatibility file. Static `api_key` entries are scrubbed when discovered. - `agents//sessions/**`: session transcripts (`*.jsonl`) + routing metadata (`sessions.json`) that can contain private messages and tool output. -- `extensions/**`: installed plugins (plus their `node_modules/`). +- `native-plugins/**`: installed plugins (plus their `node_modules/`). - `sandboxes/**`: tool sandbox workspaces; can accumulate copies of files you read/write inside the sandbox. Hardening tips: diff --git a/docs/help/testing.md b/docs/help/testing.md index 06cc31b185f..810d61df1de 100644 --- a/docs/help/testing.md +++ b/docs/help/testing.md @@ -42,8 +42,8 @@ Think of the suites as “increasing realism” (and increasing flakiness/cost): ### Unit / integration (default) - Command: `pnpm test` -- Config: `scripts/test-parallel.mjs` (runs `vitest.unit.config.ts`, `vitest.extensions.config.ts`, `vitest.gateway.config.ts`) -- Files: `src/**/*.test.ts`, `extensions/**/*.test.ts` +- Config: `scripts/test-parallel.mjs` (runs `vitest.unit.config.ts`, `vitest.native-plugins.config.ts`, `vitest.gateway.config.ts`) +- Files: `src/**/*.test.ts`, `native-plugins/**/*.test.ts` - Scope: - Pure unit tests - In-process integration tests (gateway auth, routing, tooling, parsing, config) diff --git a/docs/help/troubleshooting.md b/docs/help/troubleshooting.md index 42991a83c48..724f1439988 100644 --- a/docs/help/troubleshooting.md +++ b/docs/help/troubleshooting.md @@ -42,12 +42,12 @@ go to [/gateway/troubleshooting#anthropic-429-extra-usage-required-for-long-cont ## Plugin install fails with missing openclaw extensions -If install fails with `package.json missing openclaw.extensions`, the plugin package +If install fails with `package.json missing openclaw.plugins`, the plugin package is using an old shape that OpenClaw no longer accepts. Fix in the plugin package: -1. Add `openclaw.extensions` to `package.json`. +1. Add `openclaw.plugins` to `package.json`. 2. Point entries at built runtime files (usually `./dist/index.js`). 3. Republish the plugin and run `openclaw plugins install ` again. @@ -58,7 +58,7 @@ Example: "name": "@openclaw/my-plugin", "version": "1.2.3", "openclaw": { - "extensions": ["./dist/index.js"] + "plugins": ["./dist/index.js"] } } ``` diff --git a/docs/install/migrating-matrix.md b/docs/install/migrating-matrix.md index bd8772e29f6..6d6fb1da587 100644 --- a/docs/install/migrating-matrix.md +++ b/docs/install/migrating-matrix.md @@ -197,7 +197,7 @@ If the old store reports room keys that were never backed up, OpenClaw warns ins `Legacy Matrix encrypted state was detected, but the Matrix plugin helper is unavailable. Install or repair @openclaw/matrix so OpenClaw can inspect the old rust crypto store before upgrading.` - Meaning: OpenClaw found old encrypted Matrix state, but it could not load the helper entrypoint from the Matrix plugin that normally inspects that store. -- What to do: reinstall or repair the Matrix plugin (`openclaw plugins install @openclaw/matrix`, or `openclaw plugins install ./extensions/matrix` for a repo checkout), then rerun `openclaw doctor --fix` or restart the gateway. +- What to do: reinstall or repair the Matrix plugin (`openclaw plugins install @openclaw/matrix`, or `openclaw plugins install ./native-plugins/matrix` for a repo checkout), then rerun `openclaw doctor --fix` or restart the gateway. `Matrix plugin helper path is unsafe: ... Reinstall @openclaw/matrix and try again.` @@ -312,7 +312,7 @@ If you accept losing unrecoverable old encrypted history, you can instead reset `Matrix is installed from a custom path that no longer exists: ...` - Meaning: your plugin install record points at a local path that is gone. -- What to do: reinstall with `openclaw plugins install @openclaw/matrix`, or if you are running from a repo checkout, `openclaw plugins install ./extensions/matrix`. +- What to do: reinstall with `openclaw plugins install @openclaw/matrix`, or if you are running from a repo checkout, `openclaw plugins install ./native-plugins/matrix`. ## If encrypted history still does not come back diff --git a/docs/pi.md b/docs/pi.md index f12c687906c..31c497cae8c 100644 --- a/docs/pi.md +++ b/docs/pi.md @@ -132,10 +132,10 @@ src/agents/ Channel-specific message action runtimes now live in the plugin-owned extension directories instead of under `src/agents/tools`, for example: -- `extensions/discord/src/actions/runtime*.ts` -- `extensions/slack/src/action-runtime.ts` -- `extensions/telegram/src/action-runtime.ts` -- `extensions/whatsapp/src/action-runtime.ts` +- `native-plugins/discord/src/actions/runtime*.ts` +- `native-plugins/slack/src/action-runtime.ts` +- `native-plugins/telegram/src/action-runtime.ts` +- `native-plugins/whatsapp/src/action-runtime.ts` ## Core Integration Flow diff --git a/docs/plugins/architecture.md b/docs/plugins/architecture.md index 19783028721..81c710bbad9 100644 --- a/docs/plugins/architecture.md +++ b/docs/plugins/architecture.md @@ -948,14 +948,14 @@ authoring plugins: channel helper barrels. - Bundled extension internals remain private. External plugins should use only `openclaw/plugin-sdk/*` subpaths. OpenClaw core/test code may use the repo - public entry points under `extensions//index.js`, `api.js`, `runtime-api.js`, + public entry points under `native-plugins//index.js`, `api.js`, `runtime-api.js`, `setup-entry.js`, and narrowly scoped files such as `login-qr-api.js`. Never - import `extensions//src/*` from core or from another extension. + import `native-plugins//src/*` from core or from another extension. - Repo entry point split: - `extensions//api.js` is the helper/types barrel, - `extensions//runtime-api.js` is the runtime-only barrel, - `extensions//index.js` is the bundled plugin entry, - and `extensions//setup-entry.js` is the setup plugin entry. + `native-plugins//api.js` is the helper/types barrel, + `native-plugins//runtime-api.js` is the runtime-only barrel, + `native-plugins//index.js` is the bundled plugin entry, + and `native-plugins//setup-entry.js` is the setup plugin entry. - `openclaw/plugin-sdk/telegram` for Telegram channel plugin types and shared channel-facing helpers. Built-in Telegram implementation internals stay private to the bundled extension. - `openclaw/plugin-sdk/discord` for Discord channel plugin types and shared channel-facing helpers. Built-in Discord implementation internals stay private to the bundled extension. - `openclaw/plugin-sdk/slack` for Slack channel plugin types and shared channel-facing helpers. Built-in Slack implementation internals stay private to the bundled extension. @@ -1105,13 +1105,13 @@ path" instead of crashing or misreporting the account as not configured. ## Package packs -A plugin directory may include a `package.json` with `openclaw.extensions`: +A plugin directory may include a `package.json` with `openclaw.plugins`: ```json { "name": "my-pack", "openclaw": { - "extensions": ["./src/safety.ts", "./src/tools.ts"], + "plugins": ["./src/safety.ts", "./src/tools.ts"], "setupEntry": "./src/setup-entry.ts" } } @@ -1123,7 +1123,7 @@ becomes `name/`. If your plugin imports npm deps, install them in that directory so `node_modules` is available (`npm install` / `pnpm install`). -Security guardrail: every `openclaw.extensions` entry must stay inside the plugin +Security guardrail: every `openclaw.plugins` entry must stay inside the plugin directory after symlink resolution. Entries that escape the package directory are rejected. @@ -1160,7 +1160,7 @@ Example: { "name": "@scope/my-channel", "openclaw": { - "extensions": ["./index.ts"], + "plugins": ["./index.ts"], "setupEntry": "./setup-entry.ts", "startup": { "deferConfiguredChannelFullLoadUntilAfterListen": true @@ -1180,7 +1180,7 @@ Example: { "name": "@openclaw/nextcloud-talk", "openclaw": { - "extensions": ["./index.ts"], + "plugins": ["./index.ts"], "channel": { "id": "nextcloud-talk", "label": "Nextcloud Talk", @@ -1193,7 +1193,7 @@ Example: }, "install": { "npmSpec": "@openclaw/nextcloud-talk", - "localPath": "extensions/nextcloud-talk", + "localPath": "native-plugins/nextcloud-talk", "defaultChoice": "npm" } } diff --git a/docs/plugins/building-extensions.md b/docs/plugins/building-native-plugins.md similarity index 92% rename from docs/plugins/building-extensions.md rename to docs/plugins/building-native-plugins.md index 259accaa3f0..215d1ed48c1 100644 --- a/docs/plugins/building-extensions.md +++ b/docs/plugins/building-native-plugins.md @@ -1,15 +1,15 @@ --- -title: "Building Extensions" -summary: "Step-by-step guide for creating OpenClaw channel and provider extensions" +title: "Building Native Plugins" +summary: "Step-by-step guide for creating OpenClaw channel and provider native plugins" read_when: - - You want to create a new OpenClaw plugin or extension + - You want to create a new OpenClaw native plugin - You need to understand the plugin SDK import patterns - You are adding a new channel or provider to OpenClaw --- -# Building Extensions +# Building Native Plugins -This guide walks through creating an OpenClaw extension from scratch. Extensions +This guide walks through creating an OpenClaw native plugin from scratch. Native plugins can add channels, model providers, tools, or other capabilities. ## Prerequisites @@ -17,12 +17,12 @@ can add channels, model providers, tools, or other capabilities. - OpenClaw repository cloned and dependencies installed (`pnpm install`) - Familiarity with TypeScript (ESM) -## Extension structure +## Native plugin structure -Every extension lives under `extensions//` and follows this layout: +Every native plugin lives under `native-plugins//` and follows this layout: ``` -extensions/my-channel/ +native-plugins/my-channel/ ├── package.json # npm metadata + openclaw config ├── index.ts # Entry point (defineChannelPluginEntry) ├── setup-entry.ts # Setup wizard (optional) @@ -36,7 +36,7 @@ extensions/my-channel/ ## Step 1: Create the package -Create `extensions/my-channel/package.json`: +Create `native-plugins/my-channel/package.json`: ```json { @@ -46,7 +46,7 @@ Create `extensions/my-channel/package.json`: "type": "module", "dependencies": {}, "openclaw": { - "extensions": ["./index.ts"], + "plugins": ["./index.ts"], "setupEntry": "./setup-entry.ts", "channel": { "id": "my-channel", @@ -59,7 +59,7 @@ Create `extensions/my-channel/package.json`: }, "install": { "npmSpec": "@openclaw/my-channel", - "localPath": "extensions/my-channel" + "localPath": "native-plugins/my-channel" } } } @@ -70,7 +70,7 @@ For provider plugins, use `providers` instead of `channel`. ## Step 2: Define the entry point -Create `extensions/my-channel/index.ts`: +Create `native-plugins/my-channel/index.ts`: ```typescript import { defineChannelPluginEntry } from "openclaw/plugin-sdk/core"; diff --git a/docs/plugins/bundles.md b/docs/plugins/bundles.md index 82a5605e099..c7cac9d62bd 100644 --- a/docs/plugins/bundles.md +++ b/docs/plugins/bundles.md @@ -73,7 +73,7 @@ OpenClaw prefers native OpenClaw plugin/package layouts before bundle handling. Practical effect: - `openclaw.plugin.json` wins over bundle detection -- package installs with valid `package.json` + `openclaw.extensions` use the +- package installs with valid `package.json` + `openclaw.plugins` use the native install path - if a directory contains both native and bundle metadata, OpenClaw treats it as native first diff --git a/docs/plugins/voice-call.md b/docs/plugins/voice-call.md index 51c0f1efccd..6a77dd3393b 100644 --- a/docs/plugins/voice-call.md +++ b/docs/plugins/voice-call.md @@ -44,8 +44,8 @@ Restart the Gateway afterwards. ### Option B: install from a local folder (dev, no copying) ```bash -openclaw plugins install ./extensions/voice-call -cd ./extensions/voice-call && pnpm install +openclaw plugins install ./native-plugins/voice-call +cd ./native-plugins/voice-call && pnpm install ``` Restart the Gateway afterwards. diff --git a/docs/plugins/zalouser.md b/docs/plugins/zalouser.md index 9d84ae8e6da..39e37e23b73 100644 --- a/docs/plugins/zalouser.md +++ b/docs/plugins/zalouser.md @@ -37,8 +37,8 @@ Restart the Gateway afterwards. ### Option B: install from a local folder (dev) ```bash -openclaw plugins install ./extensions/zalouser -cd ./extensions/zalouser && pnpm install +openclaw plugins install ./native-plugins/zalouser +cd ./native-plugins/zalouser && pnpm install ``` Restart the Gateway afterwards. diff --git a/docs/prose.md b/docs/prose.md index a3d22f14c48..05e3b5c9939 100644 --- a/docs/prose.md +++ b/docs/prose.md @@ -29,7 +29,7 @@ openclaw plugins enable open-prose Restart the Gateway after enabling the plugin. -Dev/local checkout: `openclaw plugins install ./extensions/open-prose` +Dev/local checkout: `openclaw plugins install ./native-plugins/open-prose` Related docs: [Plugins](/tools/plugin), [Plugin manifest](/plugins/manifest), [Skills](/tools/skills). diff --git a/docs/providers/minimax.md b/docs/providers/minimax.md index 722d4f7c6c7..90b3e0a81ad 100644 --- a/docs/providers/minimax.md +++ b/docs/providers/minimax.md @@ -38,7 +38,7 @@ You will be prompted to select an endpoint: - **Global** - International users (`api.minimax.io`) - **CN** - Users in China (`api.minimaxi.com`) -See [MiniMax plugin README](https://github.com/openclaw/openclaw/tree/main/extensions/minimax) for details. +See [MiniMax plugin README](https://github.com/openclaw/openclaw/tree/main/native-plugins/minimax) for details. ### MiniMax M2.7 (API key) diff --git a/docs/start/hubs.md b/docs/start/hubs.md index 7e530f769b5..cc1cd9a244c 100644 --- a/docs/start/hubs.md +++ b/docs/start/hubs.md @@ -164,7 +164,7 @@ Use these hubs to discover every page, including deep dives and reference docs t ## Extensions + plugins - [Plugins overview](/tools/plugin) -- [Building extensions](/plugins/building-extensions) +- [Building native plugins](/plugins/building-native-plugins) - [Plugin manifest](/plugins/manifest) - [Agent tools](/plugins/agent-tools) - [Plugin bundles](/plugins/bundles) diff --git a/docs/tools/acp-agents.md b/docs/tools/acp-agents.md index 76c7847a8cc..ae627f96bb5 100644 --- a/docs/tools/acp-agents.md +++ b/docs/tools/acp-agents.md @@ -517,7 +517,7 @@ openclaw config set plugins.entries.acpx.enabled true Local workspace install during development: ```bash -openclaw plugins install ./extensions/acpx +openclaw plugins install ./native-plugins/acpx ``` Then verify backend health: @@ -530,7 +530,7 @@ Then verify backend health: By default, the acpx plugin (published as `@openclaw/acpx`) uses the plugin-local pinned binary: -1. Command defaults to `extensions/acpx/node_modules/.bin/acpx`. +1. Command defaults to `native-plugins/acpx/node_modules/.bin/acpx`. 2. Expected version defaults to the extension pin. 3. Startup registers ACP backend immediately as not-ready. 4. A background ensure job verifies `acpx --version`. diff --git a/docs/tools/capability-cookbook.md b/docs/tools/capability-cookbook.md index f439c362e89..f06d3647090 100644 --- a/docs/tools/capability-cookbook.md +++ b/docs/tools/capability-cookbook.md @@ -78,7 +78,7 @@ For a new capability, expect to touch these areas: - `src/plugins/runtime/index.ts` - `src/plugin-sdk/.ts` - `src/plugin-sdk/-runtime.ts` -- one or more `extensions//...` +- one or more `native-plugins//...` - config/docs/tests ## Example: image generation diff --git a/docs/tools/plugin.md b/docs/tools/plugin.md index 7f1ba0fade4..f2de215375a 100644 --- a/docs/tools/plugin.md +++ b/docs/tools/plugin.md @@ -177,19 +177,19 @@ OpenClaw scans, in order: 2. Workspace extensions -- `/.openclaw/extensions/*.ts` -- `/.openclaw/extensions/*/index.ts` +- `/.openclaw/plugins/*.ts` +- `/.openclaw/plugins/*/index.ts` 3. Global extensions -- `~/.openclaw/extensions/*.ts` -- `~/.openclaw/extensions/*/index.ts` +- `~/.openclaw/plugins/*.ts` +- `~/.openclaw/plugins/*/index.ts` 4. Bundled extensions (shipped with OpenClaw; mixed default-on/default-off) -- `/dist/extensions/*` in packaged installs -- `/dist-runtime/extensions/*` in local built checkouts -- `/extensions/*` in source/Vitest workflows +- `/dist/native-plugins/*` in packaged installs +- `/dist-runtime/native-plugins/*` in local built checkouts +- `/native-plugins/*` in source/Vitest workflows Many bundled provider plugins are enabled by default so model catalogs/runtime hooks stay available without extra setup. Others still require explicit @@ -198,10 +198,10 @@ enablement via `plugins.entries..enabled` or Bundled plugin runtime dependencies are owned by each plugin package. Packaged builds stage opted-in bundled dependencies under -`dist/extensions//node_modules` instead of requiring mirrored copies in the +`dist/native-plugins//node_modules` instead of requiring mirrored copies in the root package. Very large official plugins can ship as metadata-only bundled entries and install their runtime package on demand. npm artifacts ship the -built `dist/extensions/*` tree; source `extensions/*` directories stay in source +built `dist/native-plugins/*` tree; source `native-plugins/*` directories stay in source checkouts only. Installed plugins are enabled by default, but can be disabled the same way. @@ -279,11 +279,11 @@ openclaw plugins doctor # issue-focused diagnostics ```bash openclaw plugins list openclaw plugins inspect -openclaw plugins install # copy a local file/dir into ~/.openclaw/extensions/ -openclaw plugins install ./extensions/voice-call # relative path ok +openclaw plugins install # copy a local file/dir into ~/.openclaw/plugins/ +openclaw plugins install ./native-plugins/voice-call # relative path ok openclaw plugins install ./plugin.tgz # install from a local tarball openclaw plugins install ./plugin.zip # install from a local zip -openclaw plugins install -l ./extensions/voice-call # link (no copy) for dev +openclaw plugins install -l ./native-plugins/voice-call # link (no copy) for dev openclaw plugins install @openclaw/voice-call # install from npm openclaw plugins install @openclaw/voice-call --pin # store exact resolved name@version openclaw plugins update @@ -329,7 +329,7 @@ See [Plugin manifest](/plugins/manifest) for the manifest file format. - [Plugin architecture and internals](/plugins/architecture) -- capability model, ownership model, contracts, load pipeline, runtime helpers, and developer API reference -- [Building extensions](/plugins/building-extensions) +- [Building native plugins](/plugins/building-native-plugins) - [Plugin bundles](/plugins/bundles) - [Plugin manifest](/plugins/manifest) - [Plugin agent tools](/plugins/agent-tools) diff --git a/knip.config.ts b/knip.config.ts index 0df45bd6e87..5c72a8d3964 100644 --- a/knip.config.ts +++ b/knip.config.ts @@ -4,8 +4,8 @@ const rootEntries = [ "src/entry.ts!", "src/cli/daemon-cli.ts!", "src/infra/warning-filter.ts!", - "extensions/telegram/src/audit.ts!", - "extensions/telegram/src/token.ts!", + "native-plugins/telegram/src/audit.ts!", + "native-plugins/telegram/src/token.ts!", "src/line/accounts.ts!", "src/line/send.ts!", "src/line/template-messages.ts!", @@ -64,12 +64,12 @@ const config = { "src/gateway/live-tool-probe-utils.ts", "src/gateway/server.auth.shared.ts", "src/shared/text/assistant-visible-text.ts", - "extensions/telegram/src/bot/reply-threading.ts", - "extensions/telegram/src/draft-chunking.ts", - "extensions/msteams/src/conversation-store-memory.ts", - "extensions/msteams/src/polls-store-memory.ts", - "extensions/voice-call/src/providers/index.ts", - "extensions/voice-call/src/providers/tts-openai.ts", + "native-plugins/telegram/src/bot/reply-threading.ts", + "native-plugins/telegram/src/draft-chunking.ts", + "native-plugins/msteams/src/conversation-store-memory.ts", + "native-plugins/msteams/src/polls-store-memory.ts", + "native-plugins/voice-call/src/providers/index.ts", + "native-plugins/voice-call/src/providers/tts-openai.ts", ], workspaces: { ".": { @@ -89,7 +89,7 @@ const config = { entry: ["index.js!", "scripts/postinstall.js!"], project: ["index.js!", "scripts/**/*.js!"], }, - "extensions/*": { + "native-plugins/*": { entry: ["index.ts!"], project: ["index.ts!", "src/**/*.ts!"], ignoreDependencies: ["openclaw"], diff --git a/extensions/.npmignore b/native-plugins/.npmignore similarity index 100% rename from extensions/.npmignore rename to native-plugins/.npmignore diff --git a/extensions/acpx/index.ts b/native-plugins/acpx/index.ts similarity index 100% rename from extensions/acpx/index.ts rename to native-plugins/acpx/index.ts diff --git a/extensions/acpx/openclaw.plugin.json b/native-plugins/acpx/openclaw.plugin.json similarity index 100% rename from extensions/acpx/openclaw.plugin.json rename to native-plugins/acpx/openclaw.plugin.json diff --git a/extensions/acpx/package.json b/native-plugins/acpx/package.json similarity index 91% rename from extensions/acpx/package.json rename to native-plugins/acpx/package.json index d3947cc7552..a1403a0607d 100644 --- a/extensions/acpx/package.json +++ b/native-plugins/acpx/package.json @@ -7,7 +7,7 @@ "acpx": "0.3.0" }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/acpx/runtime-api.ts b/native-plugins/acpx/runtime-api.ts similarity index 100% rename from extensions/acpx/runtime-api.ts rename to native-plugins/acpx/runtime-api.ts diff --git a/extensions/acpx/skills/acp-router/SKILL.md b/native-plugins/acpx/skills/acp-router/SKILL.md similarity index 94% rename from extensions/acpx/skills/acp-router/SKILL.md rename to native-plugins/acpx/skills/acp-router/SKILL.md index 1b7944820b1..e65f2d6620a 100644 --- a/extensions/acpx/skills/acp-router/SKILL.md +++ b/native-plugins/acpx/skills/acp-router/SKILL.md @@ -94,7 +94,7 @@ Required behavior when ACP backend is unavailable: 1. Do not immediately ask the user to pick an alternate path. 2. First attempt automatic local repair: - - ensure plugin-local pinned acpx is installed in `extensions/acpx` + - ensure plugin-local pinned acpx is installed in `native-plugins/acpx` - verify `${ACPX_CMD} --version` 3. After reinstall/repair, restart the gateway and explicitly offer to run that restart for the user. 4. Retry ACP thread spawn once after repair. @@ -112,20 +112,20 @@ Do not default to subagent runtime for these requests. For this repo, direct `acpx` calls must follow the same pinned policy as the `@openclaw/acpx` extension. 1. Prefer plugin-local binary, not global PATH: - - `./extensions/acpx/node_modules/.bin/acpx` + - `./native-plugins/acpx/node_modules/.bin/acpx` 2. Resolve pinned version from extension dependency: - - `node -e "console.log(require('./extensions/acpx/package.json').dependencies.acpx)"` + - `node -e "console.log(require('./native-plugins/acpx/package.json').dependencies.acpx)"` 3. If binary is missing or version mismatched, install plugin-local pinned version: - - `cd extensions/acpx && npm install --omit=dev --no-save acpx@` + - `cd native-plugins/acpx && npm install --omit=dev --no-save acpx@` 4. Verify before use: - - `./extensions/acpx/node_modules/.bin/acpx --version` + - `./native-plugins/acpx/node_modules/.bin/acpx --version` 5. If install/repair changed ACPX artifacts, restart the gateway and offer to run the restart. 6. Do not run `npm install -g acpx` unless the user explicitly asks for global install. Set and reuse: ```bash -ACPX_CMD="./extensions/acpx/node_modules/.bin/acpx" +ACPX_CMD="./native-plugins/acpx/node_modules/.bin/acpx" ``` ## Direct acpx path ("telephone game") @@ -202,7 +202,7 @@ If `~/.acpx/config.json` overrides `agents`, those overrides replace defaults. ### Failure handling - `acpx: command not found`: - - for thread-spawn ACP requests, install plugin-local pinned acpx in `extensions/acpx` immediately + - for thread-spawn ACP requests, install plugin-local pinned acpx in `native-plugins/acpx` immediately - restart gateway after install and offer to run the restart automatically - then retry once - do not ask for install permission first unless policy explicitly requires it diff --git a/extensions/acpx/src/config.test.ts b/native-plugins/acpx/src/config.test.ts similarity index 98% rename from extensions/acpx/src/config.test.ts rename to native-plugins/acpx/src/config.test.ts index bd75ee1198d..ca262328f05 100644 --- a/extensions/acpx/src/config.test.ts +++ b/native-plugins/acpx/src/config.test.ts @@ -39,7 +39,7 @@ describe("acpx plugin config parsing", () => { } }); - it("prefers the workspace plugin root for dist/extensions/acpx bundles", () => { + it("prefers the workspace plugin root for dist/native-plugins/acpx bundles", () => { const repoRoot = fs.mkdtempSync(path.join(os.tmpdir(), "acpx-root-workspace-")); const workspacePluginRoot = path.join(repoRoot, "extensions", "acpx"); const bundledPluginRoot = path.join(repoRoot, "dist", "extensions", "acpx"); diff --git a/extensions/acpx/src/config.ts b/native-plugins/acpx/src/config.ts similarity index 100% rename from extensions/acpx/src/config.ts rename to native-plugins/acpx/src/config.ts diff --git a/extensions/acpx/src/ensure.test.ts b/native-plugins/acpx/src/ensure.test.ts similarity index 100% rename from extensions/acpx/src/ensure.test.ts rename to native-plugins/acpx/src/ensure.test.ts diff --git a/extensions/acpx/src/ensure.ts b/native-plugins/acpx/src/ensure.ts similarity index 100% rename from extensions/acpx/src/ensure.ts rename to native-plugins/acpx/src/ensure.ts diff --git a/extensions/acpx/src/runtime-internals/control-errors.test.ts b/native-plugins/acpx/src/runtime-internals/control-errors.test.ts similarity index 100% rename from extensions/acpx/src/runtime-internals/control-errors.test.ts rename to native-plugins/acpx/src/runtime-internals/control-errors.test.ts diff --git a/extensions/acpx/src/runtime-internals/control-errors.ts b/native-plugins/acpx/src/runtime-internals/control-errors.ts similarity index 100% rename from extensions/acpx/src/runtime-internals/control-errors.ts rename to native-plugins/acpx/src/runtime-internals/control-errors.ts diff --git a/extensions/acpx/src/runtime-internals/events.test.ts b/native-plugins/acpx/src/runtime-internals/events.test.ts similarity index 100% rename from extensions/acpx/src/runtime-internals/events.test.ts rename to native-plugins/acpx/src/runtime-internals/events.test.ts diff --git a/extensions/acpx/src/runtime-internals/events.ts b/native-plugins/acpx/src/runtime-internals/events.ts similarity index 100% rename from extensions/acpx/src/runtime-internals/events.ts rename to native-plugins/acpx/src/runtime-internals/events.ts diff --git a/extensions/acpx/src/runtime-internals/jsonrpc.test.ts b/native-plugins/acpx/src/runtime-internals/jsonrpc.test.ts similarity index 100% rename from extensions/acpx/src/runtime-internals/jsonrpc.test.ts rename to native-plugins/acpx/src/runtime-internals/jsonrpc.test.ts diff --git a/extensions/acpx/src/runtime-internals/jsonrpc.ts b/native-plugins/acpx/src/runtime-internals/jsonrpc.ts similarity index 100% rename from extensions/acpx/src/runtime-internals/jsonrpc.ts rename to native-plugins/acpx/src/runtime-internals/jsonrpc.ts diff --git a/extensions/acpx/src/runtime-internals/mcp-agent-command.test.ts b/native-plugins/acpx/src/runtime-internals/mcp-agent-command.test.ts similarity index 100% rename from extensions/acpx/src/runtime-internals/mcp-agent-command.test.ts rename to native-plugins/acpx/src/runtime-internals/mcp-agent-command.test.ts diff --git a/extensions/acpx/src/runtime-internals/mcp-agent-command.ts b/native-plugins/acpx/src/runtime-internals/mcp-agent-command.ts similarity index 100% rename from extensions/acpx/src/runtime-internals/mcp-agent-command.ts rename to native-plugins/acpx/src/runtime-internals/mcp-agent-command.ts diff --git a/extensions/acpx/src/runtime-internals/mcp-proxy.mjs b/native-plugins/acpx/src/runtime-internals/mcp-proxy.mjs similarity index 100% rename from extensions/acpx/src/runtime-internals/mcp-proxy.mjs rename to native-plugins/acpx/src/runtime-internals/mcp-proxy.mjs diff --git a/extensions/acpx/src/runtime-internals/mcp-proxy.test.ts b/native-plugins/acpx/src/runtime-internals/mcp-proxy.test.ts similarity index 97% rename from extensions/acpx/src/runtime-internals/mcp-proxy.test.ts rename to native-plugins/acpx/src/runtime-internals/mcp-proxy.test.ts index cb0357a3581..058c662d267 100644 --- a/extensions/acpx/src/runtime-internals/mcp-proxy.test.ts +++ b/native-plugins/acpx/src/runtime-internals/mcp-proxy.test.ts @@ -5,7 +5,7 @@ import path from "node:path"; import { afterEach, describe, expect, it } from "vitest"; const tempDirs: string[] = []; -const proxyPath = path.resolve("extensions/acpx/src/runtime-internals/mcp-proxy.mjs"); +const proxyPath = path.resolve("native-plugins/acpx/src/runtime-internals/mcp-proxy.mjs"); async function makeTempScript(name: string, content: string): Promise { const dir = await mkdtemp(path.join(os.tmpdir(), "openclaw-acpx-mcp-proxy-")); diff --git a/extensions/acpx/src/runtime-internals/process.test.ts b/native-plugins/acpx/src/runtime-internals/process.test.ts similarity index 100% rename from extensions/acpx/src/runtime-internals/process.test.ts rename to native-plugins/acpx/src/runtime-internals/process.test.ts diff --git a/extensions/acpx/src/runtime-internals/process.ts b/native-plugins/acpx/src/runtime-internals/process.ts similarity index 100% rename from extensions/acpx/src/runtime-internals/process.ts rename to native-plugins/acpx/src/runtime-internals/process.ts diff --git a/extensions/acpx/src/runtime-internals/shared.ts b/native-plugins/acpx/src/runtime-internals/shared.ts similarity index 100% rename from extensions/acpx/src/runtime-internals/shared.ts rename to native-plugins/acpx/src/runtime-internals/shared.ts diff --git a/extensions/acpx/src/runtime.test.ts b/native-plugins/acpx/src/runtime.test.ts similarity index 100% rename from extensions/acpx/src/runtime.test.ts rename to native-plugins/acpx/src/runtime.test.ts diff --git a/extensions/acpx/src/runtime.ts b/native-plugins/acpx/src/runtime.ts similarity index 100% rename from extensions/acpx/src/runtime.ts rename to native-plugins/acpx/src/runtime.ts diff --git a/extensions/acpx/src/service.test.ts b/native-plugins/acpx/src/service.test.ts similarity index 100% rename from extensions/acpx/src/service.test.ts rename to native-plugins/acpx/src/service.test.ts diff --git a/extensions/acpx/src/service.ts b/native-plugins/acpx/src/service.ts similarity index 100% rename from extensions/acpx/src/service.ts rename to native-plugins/acpx/src/service.ts diff --git a/extensions/acpx/src/test-utils/runtime-fixtures.ts b/native-plugins/acpx/src/test-utils/runtime-fixtures.ts similarity index 100% rename from extensions/acpx/src/test-utils/runtime-fixtures.ts rename to native-plugins/acpx/src/test-utils/runtime-fixtures.ts diff --git a/extensions/amazon-bedrock/index.test.ts b/native-plugins/amazon-bedrock/index.test.ts similarity index 97% rename from extensions/amazon-bedrock/index.test.ts rename to native-plugins/amazon-bedrock/index.test.ts index 049ebc45810..ff79c315946 100644 --- a/extensions/amazon-bedrock/index.test.ts +++ b/native-plugins/amazon-bedrock/index.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { registerSingleProviderPlugin } from "../../test/helpers/extensions/plugin-registration.js"; +import { registerSingleProviderPlugin } from "../../test/helpers/native-plugins/plugin-registration.js"; import amazonBedrockPlugin from "./index.js"; describe("amazon-bedrock provider plugin", () => { diff --git a/extensions/amazon-bedrock/index.ts b/native-plugins/amazon-bedrock/index.ts similarity index 100% rename from extensions/amazon-bedrock/index.ts rename to native-plugins/amazon-bedrock/index.ts diff --git a/extensions/amazon-bedrock/openclaw.plugin.json b/native-plugins/amazon-bedrock/openclaw.plugin.json similarity index 100% rename from extensions/amazon-bedrock/openclaw.plugin.json rename to native-plugins/amazon-bedrock/openclaw.plugin.json diff --git a/extensions/amazon-bedrock/package.json b/native-plugins/amazon-bedrock/package.json similarity index 91% rename from extensions/amazon-bedrock/package.json rename to native-plugins/amazon-bedrock/package.json index 6c1471c92c3..00d5541af32 100644 --- a/extensions/amazon-bedrock/package.json +++ b/native-plugins/amazon-bedrock/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Amazon Bedrock provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/anthropic/index.ts b/native-plugins/anthropic/index.ts similarity index 100% rename from extensions/anthropic/index.ts rename to native-plugins/anthropic/index.ts diff --git a/extensions/anthropic/media-understanding-provider.ts b/native-plugins/anthropic/media-understanding-provider.ts similarity index 100% rename from extensions/anthropic/media-understanding-provider.ts rename to native-plugins/anthropic/media-understanding-provider.ts diff --git a/extensions/anthropic/openclaw.plugin.json b/native-plugins/anthropic/openclaw.plugin.json similarity index 100% rename from extensions/anthropic/openclaw.plugin.json rename to native-plugins/anthropic/openclaw.plugin.json diff --git a/extensions/anthropic/package.json b/native-plugins/anthropic/package.json similarity index 91% rename from extensions/anthropic/package.json rename to native-plugins/anthropic/package.json index 7d06af1c26d..125ea0854f1 100644 --- a/extensions/anthropic/package.json +++ b/native-plugins/anthropic/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Anthropic provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/bluebubbles/README.md b/native-plugins/bluebubbles/README.md similarity index 51% rename from extensions/bluebubbles/README.md rename to native-plugins/bluebubbles/README.md index dbd16b95cfe..29c621f8c57 100644 --- a/extensions/bluebubbles/README.md +++ b/native-plugins/bluebubbles/README.md @@ -8,22 +8,22 @@ If you’re looking for **how to use BlueBubbles as an agent/tool user**, see: ## Layout -- Extension package: `extensions/bluebubbles/` (entry: `index.ts`). -- Channel implementation: `extensions/bluebubbles/src/channel.ts`. -- Webhook handling: `extensions/bluebubbles/src/monitor.ts` (register per-account route via `registerPluginHttpRoute`). -- REST helpers: `extensions/bluebubbles/src/send.ts` + `extensions/bluebubbles/src/probe.ts`. -- Runtime bridge: `extensions/bluebubbles/src/runtime.ts` (set via `api.runtime`). +- Extension package: `native-plugins/bluebubbles/` (entry: `index.ts`). +- Channel implementation: `native-plugins/bluebubbles/src/channel.ts`. +- Webhook handling: `native-plugins/bluebubbles/src/monitor.ts` (register per-account route via `registerPluginHttpRoute`). +- REST helpers: `native-plugins/bluebubbles/src/send.ts` + `native-plugins/bluebubbles/src/probe.ts`. +- Runtime bridge: `native-plugins/bluebubbles/src/runtime.ts` (set via `api.runtime`). - Catalog entry for setup selection: `src/channels/plugins/catalog.ts`. ## Internal helpers (use these, not raw API calls) -- `probeBlueBubbles` in `extensions/bluebubbles/src/probe.ts` for health checks. -- `sendMessageBlueBubbles` in `extensions/bluebubbles/src/send.ts` for text delivery. -- `resolveChatGuidForTarget` in `extensions/bluebubbles/src/send.ts` for chat lookup. -- `sendBlueBubblesReaction` in `extensions/bluebubbles/src/reactions.ts` for tapbacks. -- `sendBlueBubblesTyping` + `markBlueBubblesChatRead` in `extensions/bluebubbles/src/chat.ts`. -- `downloadBlueBubblesAttachment` in `extensions/bluebubbles/src/attachments.ts` for inbound media. -- `buildBlueBubblesApiUrl` + `blueBubblesFetchWithTimeout` in `extensions/bluebubbles/src/types.ts` for shared REST plumbing. +- `probeBlueBubbles` in `native-plugins/bluebubbles/src/probe.ts` for health checks. +- `sendMessageBlueBubbles` in `native-plugins/bluebubbles/src/send.ts` for text delivery. +- `resolveChatGuidForTarget` in `native-plugins/bluebubbles/src/send.ts` for chat lookup. +- `sendBlueBubblesReaction` in `native-plugins/bluebubbles/src/reactions.ts` for tapbacks. +- `sendBlueBubblesTyping` + `markBlueBubblesChatRead` in `native-plugins/bluebubbles/src/chat.ts`. +- `downloadBlueBubblesAttachment` in `native-plugins/bluebubbles/src/attachments.ts` for inbound media. +- `buildBlueBubblesApiUrl` + `blueBubblesFetchWithTimeout` in `native-plugins/bluebubbles/src/types.ts` for shared REST plumbing. ## Webhooks diff --git a/extensions/bluebubbles/api.ts b/native-plugins/bluebubbles/api.ts similarity index 100% rename from extensions/bluebubbles/api.ts rename to native-plugins/bluebubbles/api.ts diff --git a/extensions/bluebubbles/index.ts b/native-plugins/bluebubbles/index.ts similarity index 100% rename from extensions/bluebubbles/index.ts rename to native-plugins/bluebubbles/index.ts diff --git a/extensions/bluebubbles/openclaw.plugin.json b/native-plugins/bluebubbles/openclaw.plugin.json similarity index 100% rename from extensions/bluebubbles/openclaw.plugin.json rename to native-plugins/bluebubbles/openclaw.plugin.json diff --git a/extensions/bluebubbles/package.json b/native-plugins/bluebubbles/package.json similarity index 93% rename from extensions/bluebubbles/package.json rename to native-plugins/bluebubbles/package.json index d89701af44b..59e8d14596d 100644 --- a/extensions/bluebubbles/package.json +++ b/native-plugins/bluebubbles/package.json @@ -7,7 +7,7 @@ "zod": "^4.3.6" }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ], "setupEntry": "./setup-entry.ts", @@ -30,7 +30,7 @@ }, "install": { "npmSpec": "@openclaw/bluebubbles", - "localPath": "extensions/bluebubbles", + "localPath": "native-plugins/bluebubbles", "defaultChoice": "npm" }, "release": { diff --git a/extensions/bluebubbles/runtime-api.ts b/native-plugins/bluebubbles/runtime-api.ts similarity index 100% rename from extensions/bluebubbles/runtime-api.ts rename to native-plugins/bluebubbles/runtime-api.ts diff --git a/extensions/bluebubbles/setup-entry.ts b/native-plugins/bluebubbles/setup-entry.ts similarity index 100% rename from extensions/bluebubbles/setup-entry.ts rename to native-plugins/bluebubbles/setup-entry.ts diff --git a/extensions/bluebubbles/src/account-resolve.ts b/native-plugins/bluebubbles/src/account-resolve.ts similarity index 100% rename from extensions/bluebubbles/src/account-resolve.ts rename to native-plugins/bluebubbles/src/account-resolve.ts diff --git a/extensions/bluebubbles/src/accounts.test.ts b/native-plugins/bluebubbles/src/accounts.test.ts similarity index 100% rename from extensions/bluebubbles/src/accounts.test.ts rename to native-plugins/bluebubbles/src/accounts.test.ts diff --git a/extensions/bluebubbles/src/accounts.ts b/native-plugins/bluebubbles/src/accounts.ts similarity index 100% rename from extensions/bluebubbles/src/accounts.ts rename to native-plugins/bluebubbles/src/accounts.ts diff --git a/extensions/bluebubbles/src/actions.runtime.ts b/native-plugins/bluebubbles/src/actions.runtime.ts similarity index 100% rename from extensions/bluebubbles/src/actions.runtime.ts rename to native-plugins/bluebubbles/src/actions.runtime.ts diff --git a/extensions/bluebubbles/src/actions.test.ts b/native-plugins/bluebubbles/src/actions.test.ts similarity index 100% rename from extensions/bluebubbles/src/actions.test.ts rename to native-plugins/bluebubbles/src/actions.test.ts diff --git a/extensions/bluebubbles/src/actions.ts b/native-plugins/bluebubbles/src/actions.ts similarity index 100% rename from extensions/bluebubbles/src/actions.ts rename to native-plugins/bluebubbles/src/actions.ts diff --git a/extensions/bluebubbles/src/attachments.test.ts b/native-plugins/bluebubbles/src/attachments.test.ts similarity index 100% rename from extensions/bluebubbles/src/attachments.test.ts rename to native-plugins/bluebubbles/src/attachments.test.ts diff --git a/extensions/bluebubbles/src/attachments.ts b/native-plugins/bluebubbles/src/attachments.ts similarity index 100% rename from extensions/bluebubbles/src/attachments.ts rename to native-plugins/bluebubbles/src/attachments.ts diff --git a/extensions/bluebubbles/src/channel.runtime.ts b/native-plugins/bluebubbles/src/channel.runtime.ts similarity index 100% rename from extensions/bluebubbles/src/channel.runtime.ts rename to native-plugins/bluebubbles/src/channel.runtime.ts diff --git a/extensions/bluebubbles/src/channel.setup.ts b/native-plugins/bluebubbles/src/channel.setup.ts similarity index 100% rename from extensions/bluebubbles/src/channel.setup.ts rename to native-plugins/bluebubbles/src/channel.setup.ts diff --git a/extensions/bluebubbles/src/channel.ts b/native-plugins/bluebubbles/src/channel.ts similarity index 100% rename from extensions/bluebubbles/src/channel.ts rename to native-plugins/bluebubbles/src/channel.ts diff --git a/extensions/bluebubbles/src/chat.test.ts b/native-plugins/bluebubbles/src/chat.test.ts similarity index 100% rename from extensions/bluebubbles/src/chat.test.ts rename to native-plugins/bluebubbles/src/chat.test.ts diff --git a/extensions/bluebubbles/src/chat.ts b/native-plugins/bluebubbles/src/chat.ts similarity index 100% rename from extensions/bluebubbles/src/chat.ts rename to native-plugins/bluebubbles/src/chat.ts diff --git a/extensions/bluebubbles/src/config-apply.ts b/native-plugins/bluebubbles/src/config-apply.ts similarity index 100% rename from extensions/bluebubbles/src/config-apply.ts rename to native-plugins/bluebubbles/src/config-apply.ts diff --git a/extensions/bluebubbles/src/config-schema.test.ts b/native-plugins/bluebubbles/src/config-schema.test.ts similarity index 100% rename from extensions/bluebubbles/src/config-schema.test.ts rename to native-plugins/bluebubbles/src/config-schema.test.ts diff --git a/extensions/bluebubbles/src/config-schema.ts b/native-plugins/bluebubbles/src/config-schema.ts similarity index 100% rename from extensions/bluebubbles/src/config-schema.ts rename to native-plugins/bluebubbles/src/config-schema.ts diff --git a/extensions/bluebubbles/src/group-policy.test.ts b/native-plugins/bluebubbles/src/group-policy.test.ts similarity index 100% rename from extensions/bluebubbles/src/group-policy.test.ts rename to native-plugins/bluebubbles/src/group-policy.test.ts diff --git a/extensions/bluebubbles/src/group-policy.ts b/native-plugins/bluebubbles/src/group-policy.ts similarity index 100% rename from extensions/bluebubbles/src/group-policy.ts rename to native-plugins/bluebubbles/src/group-policy.ts diff --git a/extensions/bluebubbles/src/history.ts b/native-plugins/bluebubbles/src/history.ts similarity index 100% rename from extensions/bluebubbles/src/history.ts rename to native-plugins/bluebubbles/src/history.ts diff --git a/extensions/bluebubbles/src/media-send.test.ts b/native-plugins/bluebubbles/src/media-send.test.ts similarity index 100% rename from extensions/bluebubbles/src/media-send.test.ts rename to native-plugins/bluebubbles/src/media-send.test.ts diff --git a/extensions/bluebubbles/src/media-send.ts b/native-plugins/bluebubbles/src/media-send.ts similarity index 100% rename from extensions/bluebubbles/src/media-send.ts rename to native-plugins/bluebubbles/src/media-send.ts diff --git a/extensions/bluebubbles/src/monitor-debounce.ts b/native-plugins/bluebubbles/src/monitor-debounce.ts similarity index 100% rename from extensions/bluebubbles/src/monitor-debounce.ts rename to native-plugins/bluebubbles/src/monitor-debounce.ts diff --git a/extensions/bluebubbles/src/monitor-normalize.test.ts b/native-plugins/bluebubbles/src/monitor-normalize.test.ts similarity index 100% rename from extensions/bluebubbles/src/monitor-normalize.test.ts rename to native-plugins/bluebubbles/src/monitor-normalize.test.ts diff --git a/extensions/bluebubbles/src/monitor-normalize.ts b/native-plugins/bluebubbles/src/monitor-normalize.ts similarity index 100% rename from extensions/bluebubbles/src/monitor-normalize.ts rename to native-plugins/bluebubbles/src/monitor-normalize.ts diff --git a/extensions/bluebubbles/src/monitor-processing.ts b/native-plugins/bluebubbles/src/monitor-processing.ts similarity index 100% rename from extensions/bluebubbles/src/monitor-processing.ts rename to native-plugins/bluebubbles/src/monitor-processing.ts diff --git a/extensions/bluebubbles/src/monitor-reply-cache.ts b/native-plugins/bluebubbles/src/monitor-reply-cache.ts similarity index 100% rename from extensions/bluebubbles/src/monitor-reply-cache.ts rename to native-plugins/bluebubbles/src/monitor-reply-cache.ts diff --git a/extensions/bluebubbles/src/monitor-self-chat-cache.test.ts b/native-plugins/bluebubbles/src/monitor-self-chat-cache.test.ts similarity index 100% rename from extensions/bluebubbles/src/monitor-self-chat-cache.test.ts rename to native-plugins/bluebubbles/src/monitor-self-chat-cache.test.ts diff --git a/extensions/bluebubbles/src/monitor-self-chat-cache.ts b/native-plugins/bluebubbles/src/monitor-self-chat-cache.ts similarity index 100% rename from extensions/bluebubbles/src/monitor-self-chat-cache.ts rename to native-plugins/bluebubbles/src/monitor-self-chat-cache.ts diff --git a/extensions/bluebubbles/src/monitor-shared.ts b/native-plugins/bluebubbles/src/monitor-shared.ts similarity index 100% rename from extensions/bluebubbles/src/monitor-shared.ts rename to native-plugins/bluebubbles/src/monitor-shared.ts diff --git a/extensions/bluebubbles/src/monitor.test.ts b/native-plugins/bluebubbles/src/monitor.test.ts similarity index 99% rename from extensions/bluebubbles/src/monitor.test.ts rename to native-plugins/bluebubbles/src/monitor.test.ts index 17467465d82..7c01c867e42 100644 --- a/extensions/bluebubbles/src/monitor.test.ts +++ b/native-plugins/bluebubbles/src/monitor.test.ts @@ -2,7 +2,7 @@ import { EventEmitter } from "node:events"; import type { IncomingMessage, ServerResponse } from "node:http"; import type { OpenClawConfig, PluginRuntime } from "openclaw/plugin-sdk/bluebubbles"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { createPluginRuntimeMock } from "../../../test/helpers/extensions/plugin-runtime-mock.js"; +import { createPluginRuntimeMock } from "../../../test/helpers/native-plugins/plugin-runtime-mock.js"; import type { ResolvedBlueBubblesAccount } from "./accounts.js"; import { fetchBlueBubblesHistory } from "./history.js"; import { resetBlueBubblesSelfChatCache } from "./monitor-self-chat-cache.js"; diff --git a/extensions/bluebubbles/src/monitor.ts b/native-plugins/bluebubbles/src/monitor.ts similarity index 100% rename from extensions/bluebubbles/src/monitor.ts rename to native-plugins/bluebubbles/src/monitor.ts diff --git a/extensions/bluebubbles/src/monitor.webhook-auth.test.ts b/native-plugins/bluebubbles/src/monitor.webhook-auth.test.ts similarity index 99% rename from extensions/bluebubbles/src/monitor.webhook-auth.test.ts rename to native-plugins/bluebubbles/src/monitor.webhook-auth.test.ts index 8d98b0c45eb..624560ca576 100644 --- a/extensions/bluebubbles/src/monitor.webhook-auth.test.ts +++ b/native-plugins/bluebubbles/src/monitor.webhook-auth.test.ts @@ -2,7 +2,7 @@ import { EventEmitter } from "node:events"; import type { IncomingMessage, ServerResponse } from "node:http"; import type { OpenClawConfig, PluginRuntime } from "openclaw/plugin-sdk/bluebubbles"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { createPluginRuntimeMock } from "../../../test/helpers/extensions/plugin-runtime-mock.js"; +import { createPluginRuntimeMock } from "../../../test/helpers/native-plugins/plugin-runtime-mock.js"; import type { ResolvedBlueBubblesAccount } from "./accounts.js"; import { fetchBlueBubblesHistory } from "./history.js"; import { diff --git a/extensions/bluebubbles/src/monitor.webhook-route.test.ts b/native-plugins/bluebubbles/src/monitor.webhook-route.test.ts similarity index 100% rename from extensions/bluebubbles/src/monitor.webhook-route.test.ts rename to native-plugins/bluebubbles/src/monitor.webhook-route.test.ts diff --git a/extensions/bluebubbles/src/multipart.ts b/native-plugins/bluebubbles/src/multipart.ts similarity index 100% rename from extensions/bluebubbles/src/multipart.ts rename to native-plugins/bluebubbles/src/multipart.ts diff --git a/extensions/bluebubbles/src/probe.ts b/native-plugins/bluebubbles/src/probe.ts similarity index 100% rename from extensions/bluebubbles/src/probe.ts rename to native-plugins/bluebubbles/src/probe.ts diff --git a/extensions/bluebubbles/src/reactions.test.ts b/native-plugins/bluebubbles/src/reactions.test.ts similarity index 100% rename from extensions/bluebubbles/src/reactions.test.ts rename to native-plugins/bluebubbles/src/reactions.test.ts diff --git a/extensions/bluebubbles/src/reactions.ts b/native-plugins/bluebubbles/src/reactions.ts similarity index 100% rename from extensions/bluebubbles/src/reactions.ts rename to native-plugins/bluebubbles/src/reactions.ts diff --git a/extensions/bluebubbles/src/request-url.ts b/native-plugins/bluebubbles/src/request-url.ts similarity index 100% rename from extensions/bluebubbles/src/request-url.ts rename to native-plugins/bluebubbles/src/request-url.ts diff --git a/extensions/bluebubbles/src/runtime-api.ts b/native-plugins/bluebubbles/src/runtime-api.ts similarity index 100% rename from extensions/bluebubbles/src/runtime-api.ts rename to native-plugins/bluebubbles/src/runtime-api.ts diff --git a/extensions/bluebubbles/src/runtime.ts b/native-plugins/bluebubbles/src/runtime.ts similarity index 100% rename from extensions/bluebubbles/src/runtime.ts rename to native-plugins/bluebubbles/src/runtime.ts diff --git a/extensions/bluebubbles/src/secret-input.ts b/native-plugins/bluebubbles/src/secret-input.ts similarity index 100% rename from extensions/bluebubbles/src/secret-input.ts rename to native-plugins/bluebubbles/src/secret-input.ts diff --git a/extensions/bluebubbles/src/send-helpers.ts b/native-plugins/bluebubbles/src/send-helpers.ts similarity index 100% rename from extensions/bluebubbles/src/send-helpers.ts rename to native-plugins/bluebubbles/src/send-helpers.ts diff --git a/extensions/bluebubbles/src/send.test.ts b/native-plugins/bluebubbles/src/send.test.ts similarity index 100% rename from extensions/bluebubbles/src/send.test.ts rename to native-plugins/bluebubbles/src/send.test.ts diff --git a/extensions/bluebubbles/src/send.ts b/native-plugins/bluebubbles/src/send.ts similarity index 100% rename from extensions/bluebubbles/src/send.ts rename to native-plugins/bluebubbles/src/send.ts diff --git a/extensions/bluebubbles/src/session-route.ts b/native-plugins/bluebubbles/src/session-route.ts similarity index 100% rename from extensions/bluebubbles/src/session-route.ts rename to native-plugins/bluebubbles/src/session-route.ts diff --git a/extensions/bluebubbles/src/setup-core.ts b/native-plugins/bluebubbles/src/setup-core.ts similarity index 100% rename from extensions/bluebubbles/src/setup-core.ts rename to native-plugins/bluebubbles/src/setup-core.ts diff --git a/extensions/bluebubbles/src/setup-surface.test.ts b/native-plugins/bluebubbles/src/setup-surface.test.ts similarity index 100% rename from extensions/bluebubbles/src/setup-surface.test.ts rename to native-plugins/bluebubbles/src/setup-surface.test.ts diff --git a/extensions/bluebubbles/src/setup-surface.ts b/native-plugins/bluebubbles/src/setup-surface.ts similarity index 100% rename from extensions/bluebubbles/src/setup-surface.ts rename to native-plugins/bluebubbles/src/setup-surface.ts diff --git a/extensions/bluebubbles/src/targets.test.ts b/native-plugins/bluebubbles/src/targets.test.ts similarity index 100% rename from extensions/bluebubbles/src/targets.test.ts rename to native-plugins/bluebubbles/src/targets.test.ts diff --git a/extensions/bluebubbles/src/targets.ts b/native-plugins/bluebubbles/src/targets.ts similarity index 100% rename from extensions/bluebubbles/src/targets.ts rename to native-plugins/bluebubbles/src/targets.ts diff --git a/extensions/bluebubbles/src/test-harness.ts b/native-plugins/bluebubbles/src/test-harness.ts similarity index 100% rename from extensions/bluebubbles/src/test-harness.ts rename to native-plugins/bluebubbles/src/test-harness.ts diff --git a/extensions/bluebubbles/src/test-mocks.ts b/native-plugins/bluebubbles/src/test-mocks.ts similarity index 100% rename from extensions/bluebubbles/src/test-mocks.ts rename to native-plugins/bluebubbles/src/test-mocks.ts diff --git a/extensions/bluebubbles/src/types.ts b/native-plugins/bluebubbles/src/types.ts similarity index 100% rename from extensions/bluebubbles/src/types.ts rename to native-plugins/bluebubbles/src/types.ts diff --git a/extensions/bluebubbles/src/webhook-shared.ts b/native-plugins/bluebubbles/src/webhook-shared.ts similarity index 100% rename from extensions/bluebubbles/src/webhook-shared.ts rename to native-plugins/bluebubbles/src/webhook-shared.ts diff --git a/extensions/brave/index.ts b/native-plugins/brave/index.ts similarity index 100% rename from extensions/brave/index.ts rename to native-plugins/brave/index.ts diff --git a/extensions/brave/openclaw.plugin.json b/native-plugins/brave/openclaw.plugin.json similarity index 100% rename from extensions/brave/openclaw.plugin.json rename to native-plugins/brave/openclaw.plugin.json diff --git a/extensions/brave/package.json b/native-plugins/brave/package.json similarity index 90% rename from extensions/brave/package.json rename to native-plugins/brave/package.json index 6756c616e9a..1745d75b356 100644 --- a/extensions/brave/package.json +++ b/native-plugins/brave/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Brave plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/brave/src/brave-web-search-provider.ts b/native-plugins/brave/src/brave-web-search-provider.ts similarity index 100% rename from extensions/brave/src/brave-web-search-provider.ts rename to native-plugins/brave/src/brave-web-search-provider.ts diff --git a/extensions/byteplus/index.ts b/native-plugins/byteplus/index.ts similarity index 100% rename from extensions/byteplus/index.ts rename to native-plugins/byteplus/index.ts diff --git a/extensions/byteplus/openclaw.plugin.json b/native-plugins/byteplus/openclaw.plugin.json similarity index 100% rename from extensions/byteplus/openclaw.plugin.json rename to native-plugins/byteplus/openclaw.plugin.json diff --git a/extensions/byteplus/package.json b/native-plugins/byteplus/package.json similarity index 91% rename from extensions/byteplus/package.json rename to native-plugins/byteplus/package.json index 8eda5930c69..558a2b17445 100644 --- a/extensions/byteplus/package.json +++ b/native-plugins/byteplus/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw BytePlus provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/byteplus/provider-catalog.ts b/native-plugins/byteplus/provider-catalog.ts similarity index 100% rename from extensions/byteplus/provider-catalog.ts rename to native-plugins/byteplus/provider-catalog.ts diff --git a/extensions/chutes/index.ts b/native-plugins/chutes/index.ts similarity index 100% rename from extensions/chutes/index.ts rename to native-plugins/chutes/index.ts diff --git a/extensions/chutes/onboard.ts b/native-plugins/chutes/onboard.ts similarity index 100% rename from extensions/chutes/onboard.ts rename to native-plugins/chutes/onboard.ts diff --git a/extensions/chutes/openclaw.plugin.json b/native-plugins/chutes/openclaw.plugin.json similarity index 100% rename from extensions/chutes/openclaw.plugin.json rename to native-plugins/chutes/openclaw.plugin.json diff --git a/extensions/chutes/package.json b/native-plugins/chutes/package.json similarity index 91% rename from extensions/chutes/package.json rename to native-plugins/chutes/package.json index 38f45fe3e54..d98d17fe11a 100644 --- a/extensions/chutes/package.json +++ b/native-plugins/chutes/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Chutes.ai provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/chutes/provider-catalog.ts b/native-plugins/chutes/provider-catalog.ts similarity index 100% rename from extensions/chutes/provider-catalog.ts rename to native-plugins/chutes/provider-catalog.ts diff --git a/extensions/cloudflare-ai-gateway/index.ts b/native-plugins/cloudflare-ai-gateway/index.ts similarity index 100% rename from extensions/cloudflare-ai-gateway/index.ts rename to native-plugins/cloudflare-ai-gateway/index.ts diff --git a/extensions/cloudflare-ai-gateway/onboard.ts b/native-plugins/cloudflare-ai-gateway/onboard.ts similarity index 100% rename from extensions/cloudflare-ai-gateway/onboard.ts rename to native-plugins/cloudflare-ai-gateway/onboard.ts diff --git a/extensions/cloudflare-ai-gateway/openclaw.plugin.json b/native-plugins/cloudflare-ai-gateway/openclaw.plugin.json similarity index 100% rename from extensions/cloudflare-ai-gateway/openclaw.plugin.json rename to native-plugins/cloudflare-ai-gateway/openclaw.plugin.json diff --git a/extensions/cloudflare-ai-gateway/package.json b/native-plugins/cloudflare-ai-gateway/package.json similarity index 92% rename from extensions/cloudflare-ai-gateway/package.json rename to native-plugins/cloudflare-ai-gateway/package.json index 288bc1c7203..bed9dd6dd57 100644 --- a/extensions/cloudflare-ai-gateway/package.json +++ b/native-plugins/cloudflare-ai-gateway/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Cloudflare AI Gateway provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/copilot-proxy/README.md b/native-plugins/copilot-proxy/README.md similarity index 100% rename from extensions/copilot-proxy/README.md rename to native-plugins/copilot-proxy/README.md diff --git a/extensions/copilot-proxy/index.ts b/native-plugins/copilot-proxy/index.ts similarity index 100% rename from extensions/copilot-proxy/index.ts rename to native-plugins/copilot-proxy/index.ts diff --git a/extensions/copilot-proxy/openclaw.plugin.json b/native-plugins/copilot-proxy/openclaw.plugin.json similarity index 100% rename from extensions/copilot-proxy/openclaw.plugin.json rename to native-plugins/copilot-proxy/openclaw.plugin.json diff --git a/extensions/copilot-proxy/package.json b/native-plugins/copilot-proxy/package.json similarity index 91% rename from extensions/copilot-proxy/package.json rename to native-plugins/copilot-proxy/package.json index fdab55b3da8..3008b1467c4 100644 --- a/extensions/copilot-proxy/package.json +++ b/native-plugins/copilot-proxy/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Copilot Proxy provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/copilot-proxy/runtime-api.ts b/native-plugins/copilot-proxy/runtime-api.ts similarity index 100% rename from extensions/copilot-proxy/runtime-api.ts rename to native-plugins/copilot-proxy/runtime-api.ts diff --git a/extensions/device-pair/api.ts b/native-plugins/device-pair/api.ts similarity index 100% rename from extensions/device-pair/api.ts rename to native-plugins/device-pair/api.ts diff --git a/extensions/device-pair/index.ts b/native-plugins/device-pair/index.ts similarity index 100% rename from extensions/device-pair/index.ts rename to native-plugins/device-pair/index.ts diff --git a/extensions/device-pair/notify.test.ts b/native-plugins/device-pair/notify.test.ts similarity index 100% rename from extensions/device-pair/notify.test.ts rename to native-plugins/device-pair/notify.test.ts diff --git a/extensions/device-pair/notify.ts b/native-plugins/device-pair/notify.ts similarity index 100% rename from extensions/device-pair/notify.ts rename to native-plugins/device-pair/notify.ts diff --git a/extensions/device-pair/openclaw.plugin.json b/native-plugins/device-pair/openclaw.plugin.json similarity index 100% rename from extensions/device-pair/openclaw.plugin.json rename to native-plugins/device-pair/openclaw.plugin.json diff --git a/extensions/diagnostics-otel/api.ts b/native-plugins/diagnostics-otel/api.ts similarity index 100% rename from extensions/diagnostics-otel/api.ts rename to native-plugins/diagnostics-otel/api.ts diff --git a/extensions/diagnostics-otel/index.ts b/native-plugins/diagnostics-otel/index.ts similarity index 100% rename from extensions/diagnostics-otel/index.ts rename to native-plugins/diagnostics-otel/index.ts diff --git a/extensions/diagnostics-otel/openclaw.plugin.json b/native-plugins/diagnostics-otel/openclaw.plugin.json similarity index 100% rename from extensions/diagnostics-otel/openclaw.plugin.json rename to native-plugins/diagnostics-otel/openclaw.plugin.json diff --git a/extensions/diagnostics-otel/package.json b/native-plugins/diagnostics-otel/package.json similarity index 97% rename from extensions/diagnostics-otel/package.json rename to native-plugins/diagnostics-otel/package.json index 2e31d211360..a75bf8bbd2e 100644 --- a/extensions/diagnostics-otel/package.json +++ b/native-plugins/diagnostics-otel/package.json @@ -17,7 +17,7 @@ "@opentelemetry/semantic-conventions": "^1.40.0" }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ], "release": { diff --git a/extensions/diagnostics-otel/src/service.test.ts b/native-plugins/diagnostics-otel/src/service.test.ts similarity index 100% rename from extensions/diagnostics-otel/src/service.test.ts rename to native-plugins/diagnostics-otel/src/service.test.ts diff --git a/extensions/diagnostics-otel/src/service.ts b/native-plugins/diagnostics-otel/src/service.ts similarity index 100% rename from extensions/diagnostics-otel/src/service.ts rename to native-plugins/diagnostics-otel/src/service.ts diff --git a/extensions/diffs/README.md b/native-plugins/diffs/README.md similarity index 100% rename from extensions/diffs/README.md rename to native-plugins/diffs/README.md diff --git a/extensions/diffs/api.ts b/native-plugins/diffs/api.ts similarity index 100% rename from extensions/diffs/api.ts rename to native-plugins/diffs/api.ts diff --git a/extensions/diffs/assets/viewer-runtime.js b/native-plugins/diffs/assets/viewer-runtime.js similarity index 100% rename from extensions/diffs/assets/viewer-runtime.js rename to native-plugins/diffs/assets/viewer-runtime.js diff --git a/extensions/diffs/index.test.ts b/native-plugins/diffs/index.test.ts similarity index 95% rename from extensions/diffs/index.test.ts rename to native-plugins/diffs/index.test.ts index 4a73905f0c0..66fd7b2692d 100644 --- a/extensions/diffs/index.test.ts +++ b/native-plugins/diffs/index.test.ts @@ -1,7 +1,7 @@ import type { IncomingMessage } from "node:http"; import { describe, expect, it, vi } from "vitest"; -import { createMockServerResponse } from "../../test/helpers/extensions/mock-http-response.js"; -import { createTestPluginApi } from "../../test/helpers/extensions/plugin-api.js"; +import { createMockServerResponse } from "../../test/helpers/native-plugins/mock-http-response.js"; +import { createTestPluginApi } from "../../test/helpers/native-plugins/plugin-api.js"; import type { OpenClawPluginApi, OpenClawPluginToolContext } from "./api.js"; import plugin from "./index.js"; diff --git a/extensions/diffs/index.ts b/native-plugins/diffs/index.ts similarity index 100% rename from extensions/diffs/index.ts rename to native-plugins/diffs/index.ts diff --git a/extensions/diffs/openclaw.plugin.json b/native-plugins/diffs/openclaw.plugin.json similarity index 100% rename from extensions/diffs/openclaw.plugin.json rename to native-plugins/diffs/openclaw.plugin.json diff --git a/extensions/diffs/package.json b/native-plugins/diffs/package.json similarity index 95% rename from extensions/diffs/package.json rename to native-plugins/diffs/package.json index ac666b0c987..aa7f56c6a1c 100644 --- a/extensions/diffs/package.json +++ b/native-plugins/diffs/package.json @@ -13,7 +13,7 @@ "playwright-core": "1.58.2" }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/diffs/skills/diffs/SKILL.md b/native-plugins/diffs/skills/diffs/SKILL.md similarity index 100% rename from extensions/diffs/skills/diffs/SKILL.md rename to native-plugins/diffs/skills/diffs/SKILL.md diff --git a/extensions/diffs/src/browser.test.ts b/native-plugins/diffs/src/browser.test.ts similarity index 100% rename from extensions/diffs/src/browser.test.ts rename to native-plugins/diffs/src/browser.test.ts diff --git a/extensions/diffs/src/browser.ts b/native-plugins/diffs/src/browser.ts similarity index 100% rename from extensions/diffs/src/browser.ts rename to native-plugins/diffs/src/browser.ts diff --git a/extensions/diffs/src/config.test.ts b/native-plugins/diffs/src/config.test.ts similarity index 100% rename from extensions/diffs/src/config.test.ts rename to native-plugins/diffs/src/config.test.ts diff --git a/extensions/diffs/src/config.ts b/native-plugins/diffs/src/config.ts similarity index 100% rename from extensions/diffs/src/config.ts rename to native-plugins/diffs/src/config.ts diff --git a/extensions/diffs/src/http.test.ts b/native-plugins/diffs/src/http.test.ts similarity index 99% rename from extensions/diffs/src/http.test.ts rename to native-plugins/diffs/src/http.test.ts index e35d847597b..fae0eeb90cb 100644 --- a/extensions/diffs/src/http.test.ts +++ b/native-plugins/diffs/src/http.test.ts @@ -1,6 +1,6 @@ import type { IncomingMessage } from "node:http"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; -import { createMockServerResponse } from "../../../test/helpers/extensions/mock-http-response.js"; +import { createMockServerResponse } from "../../../test/helpers/native-plugins/mock-http-response.js"; import { createDiffsHttpHandler } from "./http.js"; import { DiffArtifactStore } from "./store.js"; import { createDiffStoreHarness } from "./test-helpers.js"; diff --git a/extensions/diffs/src/http.ts b/native-plugins/diffs/src/http.ts similarity index 100% rename from extensions/diffs/src/http.ts rename to native-plugins/diffs/src/http.ts diff --git a/extensions/diffs/src/prompt-guidance.ts b/native-plugins/diffs/src/prompt-guidance.ts similarity index 100% rename from extensions/diffs/src/prompt-guidance.ts rename to native-plugins/diffs/src/prompt-guidance.ts diff --git a/extensions/diffs/src/render.test.ts b/native-plugins/diffs/src/render.test.ts similarity index 100% rename from extensions/diffs/src/render.test.ts rename to native-plugins/diffs/src/render.test.ts diff --git a/extensions/diffs/src/render.ts b/native-plugins/diffs/src/render.ts similarity index 100% rename from extensions/diffs/src/render.ts rename to native-plugins/diffs/src/render.ts diff --git a/extensions/diffs/src/store.test.ts b/native-plugins/diffs/src/store.test.ts similarity index 100% rename from extensions/diffs/src/store.test.ts rename to native-plugins/diffs/src/store.test.ts diff --git a/extensions/diffs/src/store.ts b/native-plugins/diffs/src/store.ts similarity index 100% rename from extensions/diffs/src/store.ts rename to native-plugins/diffs/src/store.ts diff --git a/extensions/diffs/src/test-helpers.ts b/native-plugins/diffs/src/test-helpers.ts similarity index 100% rename from extensions/diffs/src/test-helpers.ts rename to native-plugins/diffs/src/test-helpers.ts diff --git a/extensions/diffs/src/tool.test.ts b/native-plugins/diffs/src/tool.test.ts similarity index 99% rename from extensions/diffs/src/tool.test.ts rename to native-plugins/diffs/src/tool.test.ts index 949113b9be5..8bb8b66d20e 100644 --- a/extensions/diffs/src/tool.test.ts +++ b/native-plugins/diffs/src/tool.test.ts @@ -1,7 +1,7 @@ import fs from "node:fs/promises"; import path from "node:path"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { createTestPluginApi } from "../../../test/helpers/extensions/plugin-api.js"; +import { createTestPluginApi } from "../../../test/helpers/native-plugins/plugin-api.js"; import type { OpenClawPluginApi, OpenClawPluginToolContext } from "../api.js"; import type { DiffScreenshotter } from "./browser.js"; import { DEFAULT_DIFFS_TOOL_DEFAULTS } from "./config.js"; diff --git a/extensions/diffs/src/tool.ts b/native-plugins/diffs/src/tool.ts similarity index 100% rename from extensions/diffs/src/tool.ts rename to native-plugins/diffs/src/tool.ts diff --git a/extensions/diffs/src/types.ts b/native-plugins/diffs/src/types.ts similarity index 100% rename from extensions/diffs/src/types.ts rename to native-plugins/diffs/src/types.ts diff --git a/extensions/diffs/src/url.test.ts b/native-plugins/diffs/src/url.test.ts similarity index 100% rename from extensions/diffs/src/url.test.ts rename to native-plugins/diffs/src/url.test.ts diff --git a/extensions/diffs/src/url.ts b/native-plugins/diffs/src/url.ts similarity index 100% rename from extensions/diffs/src/url.ts rename to native-plugins/diffs/src/url.ts diff --git a/extensions/diffs/src/viewer-assets.test.ts b/native-plugins/diffs/src/viewer-assets.test.ts similarity index 100% rename from extensions/diffs/src/viewer-assets.test.ts rename to native-plugins/diffs/src/viewer-assets.test.ts diff --git a/extensions/diffs/src/viewer-assets.ts b/native-plugins/diffs/src/viewer-assets.ts similarity index 100% rename from extensions/diffs/src/viewer-assets.ts rename to native-plugins/diffs/src/viewer-assets.ts diff --git a/extensions/diffs/src/viewer-client.ts b/native-plugins/diffs/src/viewer-client.ts similarity index 100% rename from extensions/diffs/src/viewer-client.ts rename to native-plugins/diffs/src/viewer-client.ts diff --git a/extensions/diffs/src/viewer-payload.test.ts b/native-plugins/diffs/src/viewer-payload.test.ts similarity index 100% rename from extensions/diffs/src/viewer-payload.test.ts rename to native-plugins/diffs/src/viewer-payload.test.ts diff --git a/extensions/diffs/src/viewer-payload.ts b/native-plugins/diffs/src/viewer-payload.ts similarity index 100% rename from extensions/diffs/src/viewer-payload.ts rename to native-plugins/diffs/src/viewer-payload.ts diff --git a/extensions/discord/api.ts b/native-plugins/discord/api.ts similarity index 100% rename from extensions/discord/api.ts rename to native-plugins/discord/api.ts diff --git a/extensions/discord/index.ts b/native-plugins/discord/index.ts similarity index 100% rename from extensions/discord/index.ts rename to native-plugins/discord/index.ts diff --git a/extensions/discord/openclaw.plugin.json b/native-plugins/discord/openclaw.plugin.json similarity index 100% rename from extensions/discord/openclaw.plugin.json rename to native-plugins/discord/openclaw.plugin.json diff --git a/extensions/discord/package.json b/native-plugins/discord/package.json similarity index 93% rename from extensions/discord/package.json rename to native-plugins/discord/package.json index 589ceed8d21..d0c246565d8 100644 --- a/extensions/discord/package.json +++ b/native-plugins/discord/package.json @@ -11,7 +11,7 @@ "opusscript": "^0.1.1" }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ], "setupEntry": "./setup-entry.ts", @@ -27,7 +27,7 @@ }, "install": { "npmSpec": "@openclaw/discord", - "localPath": "extensions/discord", + "localPath": "native-plugins/discord", "defaultChoice": "npm" }, "bundle": { diff --git a/extensions/discord/runtime-api.ts b/native-plugins/discord/runtime-api.ts similarity index 100% rename from extensions/discord/runtime-api.ts rename to native-plugins/discord/runtime-api.ts diff --git a/extensions/discord/session-key-api.ts b/native-plugins/discord/session-key-api.ts similarity index 100% rename from extensions/discord/session-key-api.ts rename to native-plugins/discord/session-key-api.ts diff --git a/extensions/discord/setup-entry.ts b/native-plugins/discord/setup-entry.ts similarity index 100% rename from extensions/discord/setup-entry.ts rename to native-plugins/discord/setup-entry.ts diff --git a/extensions/discord/src/account-inspect.test.ts b/native-plugins/discord/src/account-inspect.test.ts similarity index 100% rename from extensions/discord/src/account-inspect.test.ts rename to native-plugins/discord/src/account-inspect.test.ts diff --git a/extensions/discord/src/account-inspect.ts b/native-plugins/discord/src/account-inspect.ts similarity index 100% rename from extensions/discord/src/account-inspect.ts rename to native-plugins/discord/src/account-inspect.ts diff --git a/extensions/discord/src/accounts.test.ts b/native-plugins/discord/src/accounts.test.ts similarity index 100% rename from extensions/discord/src/accounts.test.ts rename to native-plugins/discord/src/accounts.test.ts diff --git a/extensions/discord/src/accounts.ts b/native-plugins/discord/src/accounts.ts similarity index 100% rename from extensions/discord/src/accounts.ts rename to native-plugins/discord/src/accounts.ts diff --git a/extensions/discord/src/actions/handle-action.guild-admin.ts b/native-plugins/discord/src/actions/handle-action.guild-admin.ts similarity index 100% rename from extensions/discord/src/actions/handle-action.guild-admin.ts rename to native-plugins/discord/src/actions/handle-action.guild-admin.ts diff --git a/extensions/discord/src/actions/handle-action.ts b/native-plugins/discord/src/actions/handle-action.ts similarity index 100% rename from extensions/discord/src/actions/handle-action.ts rename to native-plugins/discord/src/actions/handle-action.ts diff --git a/extensions/discord/src/actions/runtime.guild.ts b/native-plugins/discord/src/actions/runtime.guild.ts similarity index 100% rename from extensions/discord/src/actions/runtime.guild.ts rename to native-plugins/discord/src/actions/runtime.guild.ts diff --git a/extensions/discord/src/actions/runtime.messaging.ts b/native-plugins/discord/src/actions/runtime.messaging.ts similarity index 100% rename from extensions/discord/src/actions/runtime.messaging.ts rename to native-plugins/discord/src/actions/runtime.messaging.ts diff --git a/extensions/discord/src/actions/runtime.moderation-shared.ts b/native-plugins/discord/src/actions/runtime.moderation-shared.ts similarity index 100% rename from extensions/discord/src/actions/runtime.moderation-shared.ts rename to native-plugins/discord/src/actions/runtime.moderation-shared.ts diff --git a/extensions/discord/src/actions/runtime.moderation.authz.test.ts b/native-plugins/discord/src/actions/runtime.moderation.authz.test.ts similarity index 100% rename from extensions/discord/src/actions/runtime.moderation.authz.test.ts rename to native-plugins/discord/src/actions/runtime.moderation.authz.test.ts diff --git a/extensions/discord/src/actions/runtime.moderation.ts b/native-plugins/discord/src/actions/runtime.moderation.ts similarity index 100% rename from extensions/discord/src/actions/runtime.moderation.ts rename to native-plugins/discord/src/actions/runtime.moderation.ts diff --git a/extensions/discord/src/actions/runtime.presence.test.ts b/native-plugins/discord/src/actions/runtime.presence.test.ts similarity index 100% rename from extensions/discord/src/actions/runtime.presence.test.ts rename to native-plugins/discord/src/actions/runtime.presence.test.ts diff --git a/extensions/discord/src/actions/runtime.presence.ts b/native-plugins/discord/src/actions/runtime.presence.ts similarity index 100% rename from extensions/discord/src/actions/runtime.presence.ts rename to native-plugins/discord/src/actions/runtime.presence.ts diff --git a/extensions/discord/src/actions/runtime.shared.ts b/native-plugins/discord/src/actions/runtime.shared.ts similarity index 100% rename from extensions/discord/src/actions/runtime.shared.ts rename to native-plugins/discord/src/actions/runtime.shared.ts diff --git a/extensions/discord/src/actions/runtime.test.ts b/native-plugins/discord/src/actions/runtime.test.ts similarity index 100% rename from extensions/discord/src/actions/runtime.test.ts rename to native-plugins/discord/src/actions/runtime.test.ts diff --git a/extensions/discord/src/actions/runtime.ts b/native-plugins/discord/src/actions/runtime.ts similarity index 100% rename from extensions/discord/src/actions/runtime.ts rename to native-plugins/discord/src/actions/runtime.ts diff --git a/extensions/discord/src/api.test.ts b/native-plugins/discord/src/api.test.ts similarity index 95% rename from extensions/discord/src/api.test.ts rename to native-plugins/discord/src/api.test.ts index 11d15d5f59f..67e02064e1b 100644 --- a/extensions/discord/src/api.test.ts +++ b/native-plugins/discord/src/api.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { withFetchPreconnect } from "../../../test/helpers/extensions/fetch-mock.js"; +import { withFetchPreconnect } from "../../../test/helpers/native-plugins/fetch-mock.js"; import { fetchDiscord } from "./api.js"; import { jsonResponse } from "./test-http-helpers.js"; diff --git a/extensions/discord/src/api.ts b/native-plugins/discord/src/api.ts similarity index 100% rename from extensions/discord/src/api.ts rename to native-plugins/discord/src/api.ts diff --git a/extensions/discord/src/audit.test.ts b/native-plugins/discord/src/audit.test.ts similarity index 100% rename from extensions/discord/src/audit.test.ts rename to native-plugins/discord/src/audit.test.ts diff --git a/extensions/discord/src/audit.ts b/native-plugins/discord/src/audit.ts similarity index 100% rename from extensions/discord/src/audit.ts rename to native-plugins/discord/src/audit.ts diff --git a/extensions/discord/src/channel-actions.ts b/native-plugins/discord/src/channel-actions.ts similarity index 100% rename from extensions/discord/src/channel-actions.ts rename to native-plugins/discord/src/channel-actions.ts diff --git a/extensions/discord/src/channel.runtime.ts b/native-plugins/discord/src/channel.runtime.ts similarity index 100% rename from extensions/discord/src/channel.runtime.ts rename to native-plugins/discord/src/channel.runtime.ts diff --git a/extensions/discord/src/channel.setup.ts b/native-plugins/discord/src/channel.setup.ts similarity index 100% rename from extensions/discord/src/channel.setup.ts rename to native-plugins/discord/src/channel.setup.ts diff --git a/extensions/discord/src/channel.test.ts b/native-plugins/discord/src/channel.test.ts similarity index 98% rename from extensions/discord/src/channel.test.ts rename to native-plugins/discord/src/channel.test.ts index b5f2224b1dd..f5cf87df676 100644 --- a/extensions/discord/src/channel.test.ts +++ b/native-plugins/discord/src/channel.test.ts @@ -5,7 +5,7 @@ import type { PluginRuntime, } from "openclaw/plugin-sdk/discord"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { createRuntimeEnv } from "../../../test/helpers/extensions/runtime-env.js"; +import { createRuntimeEnv } from "../../../test/helpers/native-plugins/runtime-env.js"; import type { ResolvedDiscordAccount } from "./accounts.js"; import { discordPlugin } from "./channel.js"; import { setDiscordRuntime } from "./runtime.js"; diff --git a/extensions/discord/src/channel.ts b/native-plugins/discord/src/channel.ts similarity index 100% rename from extensions/discord/src/channel.ts rename to native-plugins/discord/src/channel.ts diff --git a/extensions/discord/src/chunk.test.ts b/native-plugins/discord/src/chunk.test.ts similarity index 98% rename from extensions/discord/src/chunk.test.ts rename to native-plugins/discord/src/chunk.test.ts index 228871fe5d6..fbbcd2d8da6 100644 --- a/extensions/discord/src/chunk.test.ts +++ b/native-plugins/discord/src/chunk.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from "vitest"; import { countLines, hasBalancedFences, -} from "../../../test/helpers/extensions/chunk-test-helpers.js"; +} from "../../../test/helpers/native-plugins/chunk-test-helpers.js"; import { chunkDiscordText, chunkDiscordTextWithMode } from "./chunk.js"; describe("chunkDiscordText", () => { diff --git a/extensions/discord/src/chunk.ts b/native-plugins/discord/src/chunk.ts similarity index 100% rename from extensions/discord/src/chunk.ts rename to native-plugins/discord/src/chunk.ts diff --git a/extensions/discord/src/client.test.ts b/native-plugins/discord/src/client.test.ts similarity index 100% rename from extensions/discord/src/client.test.ts rename to native-plugins/discord/src/client.test.ts diff --git a/extensions/discord/src/client.ts b/native-plugins/discord/src/client.ts similarity index 100% rename from extensions/discord/src/client.ts rename to native-plugins/discord/src/client.ts diff --git a/extensions/discord/src/components-registry.ts b/native-plugins/discord/src/components-registry.ts similarity index 100% rename from extensions/discord/src/components-registry.ts rename to native-plugins/discord/src/components-registry.ts diff --git a/extensions/discord/src/components.test.ts b/native-plugins/discord/src/components.test.ts similarity index 100% rename from extensions/discord/src/components.test.ts rename to native-plugins/discord/src/components.test.ts diff --git a/extensions/discord/src/components.ts b/native-plugins/discord/src/components.ts similarity index 100% rename from extensions/discord/src/components.ts rename to native-plugins/discord/src/components.ts diff --git a/extensions/discord/src/config-schema.ts b/native-plugins/discord/src/config-schema.ts similarity index 100% rename from extensions/discord/src/config-schema.ts rename to native-plugins/discord/src/config-schema.ts diff --git a/extensions/discord/src/directory-cache.ts b/native-plugins/discord/src/directory-cache.ts similarity index 100% rename from extensions/discord/src/directory-cache.ts rename to native-plugins/discord/src/directory-cache.ts diff --git a/extensions/discord/src/directory-config.ts b/native-plugins/discord/src/directory-config.ts similarity index 100% rename from extensions/discord/src/directory-config.ts rename to native-plugins/discord/src/directory-config.ts diff --git a/extensions/discord/src/directory-live.test.ts b/native-plugins/discord/src/directory-live.test.ts similarity index 100% rename from extensions/discord/src/directory-live.test.ts rename to native-plugins/discord/src/directory-live.test.ts diff --git a/extensions/discord/src/directory-live.ts b/native-plugins/discord/src/directory-live.ts similarity index 100% rename from extensions/discord/src/directory-live.ts rename to native-plugins/discord/src/directory-live.ts diff --git a/extensions/discord/src/draft-chunking.ts b/native-plugins/discord/src/draft-chunking.ts similarity index 100% rename from extensions/discord/src/draft-chunking.ts rename to native-plugins/discord/src/draft-chunking.ts diff --git a/extensions/discord/src/draft-stream.ts b/native-plugins/discord/src/draft-stream.ts similarity index 100% rename from extensions/discord/src/draft-stream.ts rename to native-plugins/discord/src/draft-stream.ts diff --git a/extensions/discord/src/exec-approvals.ts b/native-plugins/discord/src/exec-approvals.ts similarity index 100% rename from extensions/discord/src/exec-approvals.ts rename to native-plugins/discord/src/exec-approvals.ts diff --git a/extensions/discord/src/gateway-logging.test.ts b/native-plugins/discord/src/gateway-logging.test.ts similarity index 100% rename from extensions/discord/src/gateway-logging.test.ts rename to native-plugins/discord/src/gateway-logging.test.ts diff --git a/extensions/discord/src/gateway-logging.ts b/native-plugins/discord/src/gateway-logging.ts similarity index 100% rename from extensions/discord/src/gateway-logging.ts rename to native-plugins/discord/src/gateway-logging.ts diff --git a/extensions/discord/src/group-policy.test.ts b/native-plugins/discord/src/group-policy.test.ts similarity index 100% rename from extensions/discord/src/group-policy.test.ts rename to native-plugins/discord/src/group-policy.test.ts diff --git a/extensions/discord/src/group-policy.ts b/native-plugins/discord/src/group-policy.ts similarity index 100% rename from extensions/discord/src/group-policy.ts rename to native-plugins/discord/src/group-policy.ts diff --git a/extensions/discord/src/guilds.ts b/native-plugins/discord/src/guilds.ts similarity index 100% rename from extensions/discord/src/guilds.ts rename to native-plugins/discord/src/guilds.ts diff --git a/extensions/discord/src/mentions.test.ts b/native-plugins/discord/src/mentions.test.ts similarity index 100% rename from extensions/discord/src/mentions.test.ts rename to native-plugins/discord/src/mentions.test.ts diff --git a/extensions/discord/src/mentions.ts b/native-plugins/discord/src/mentions.ts similarity index 100% rename from extensions/discord/src/mentions.ts rename to native-plugins/discord/src/mentions.ts diff --git a/extensions/discord/src/message-tool-schema.ts b/native-plugins/discord/src/message-tool-schema.ts similarity index 100% rename from extensions/discord/src/message-tool-schema.ts rename to native-plugins/discord/src/message-tool-schema.ts diff --git a/extensions/discord/src/monitor.gateway.test.ts b/native-plugins/discord/src/monitor.gateway.test.ts similarity index 100% rename from extensions/discord/src/monitor.gateway.test.ts rename to native-plugins/discord/src/monitor.gateway.test.ts diff --git a/extensions/discord/src/monitor.gateway.ts b/native-plugins/discord/src/monitor.gateway.ts similarity index 100% rename from extensions/discord/src/monitor.gateway.ts rename to native-plugins/discord/src/monitor.gateway.ts diff --git a/extensions/discord/src/monitor.test.ts b/native-plugins/discord/src/monitor.test.ts similarity index 99% rename from extensions/discord/src/monitor.test.ts rename to native-plugins/discord/src/monitor.test.ts index 9836984d555..f70d2ad4ff1 100644 --- a/extensions/discord/src/monitor.test.ts +++ b/native-plugins/discord/src/monitor.test.ts @@ -1,6 +1,6 @@ import { ChannelType, type Guild } from "@buape/carbon"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import { typedCases } from "../../../test/helpers/extensions/typed-cases.js"; +import { typedCases } from "../../../test/helpers/native-plugins/typed-cases.js"; import { allowListMatches, buildDiscordMediaPayload, diff --git a/extensions/discord/src/monitor.tool-result.accepts-guild-messages-mentionpatterns-match.e2e.test.ts b/native-plugins/discord/src/monitor.tool-result.accepts-guild-messages-mentionpatterns-match.e2e.test.ts similarity index 100% rename from extensions/discord/src/monitor.tool-result.accepts-guild-messages-mentionpatterns-match.e2e.test.ts rename to native-plugins/discord/src/monitor.tool-result.accepts-guild-messages-mentionpatterns-match.e2e.test.ts diff --git a/extensions/discord/src/monitor.tool-result.sends-status-replies-responseprefix.test.ts b/native-plugins/discord/src/monitor.tool-result.sends-status-replies-responseprefix.test.ts similarity index 100% rename from extensions/discord/src/monitor.tool-result.sends-status-replies-responseprefix.test.ts rename to native-plugins/discord/src/monitor.tool-result.sends-status-replies-responseprefix.test.ts diff --git a/extensions/discord/src/monitor.tool-result.test-harness.ts b/native-plugins/discord/src/monitor.tool-result.test-harness.ts similarity index 100% rename from extensions/discord/src/monitor.tool-result.test-harness.ts rename to native-plugins/discord/src/monitor.tool-result.test-harness.ts diff --git a/extensions/discord/src/monitor.ts b/native-plugins/discord/src/monitor.ts similarity index 100% rename from extensions/discord/src/monitor.ts rename to native-plugins/discord/src/monitor.ts diff --git a/extensions/discord/src/monitor/agent-components-helpers.ts b/native-plugins/discord/src/monitor/agent-components-helpers.ts similarity index 100% rename from extensions/discord/src/monitor/agent-components-helpers.ts rename to native-plugins/discord/src/monitor/agent-components-helpers.ts diff --git a/extensions/discord/src/monitor/agent-components.ts b/native-plugins/discord/src/monitor/agent-components.ts similarity index 100% rename from extensions/discord/src/monitor/agent-components.ts rename to native-plugins/discord/src/monitor/agent-components.ts diff --git a/extensions/discord/src/monitor/agent-components.wildcard.test.ts b/native-plugins/discord/src/monitor/agent-components.wildcard.test.ts similarity index 100% rename from extensions/discord/src/monitor/agent-components.wildcard.test.ts rename to native-plugins/discord/src/monitor/agent-components.wildcard.test.ts diff --git a/extensions/discord/src/monitor/allow-list.ts b/native-plugins/discord/src/monitor/allow-list.ts similarity index 100% rename from extensions/discord/src/monitor/allow-list.ts rename to native-plugins/discord/src/monitor/allow-list.ts diff --git a/extensions/discord/src/monitor/auto-presence.test.ts b/native-plugins/discord/src/monitor/auto-presence.test.ts similarity index 100% rename from extensions/discord/src/monitor/auto-presence.test.ts rename to native-plugins/discord/src/monitor/auto-presence.test.ts diff --git a/extensions/discord/src/monitor/auto-presence.ts b/native-plugins/discord/src/monitor/auto-presence.ts similarity index 100% rename from extensions/discord/src/monitor/auto-presence.ts rename to native-plugins/discord/src/monitor/auto-presence.ts diff --git a/extensions/discord/src/monitor/commands.test.ts b/native-plugins/discord/src/monitor/commands.test.ts similarity index 100% rename from extensions/discord/src/monitor/commands.test.ts rename to native-plugins/discord/src/monitor/commands.test.ts diff --git a/extensions/discord/src/monitor/commands.ts b/native-plugins/discord/src/monitor/commands.ts similarity index 100% rename from extensions/discord/src/monitor/commands.ts rename to native-plugins/discord/src/monitor/commands.ts diff --git a/extensions/discord/src/monitor/dm-command-auth.test.ts b/native-plugins/discord/src/monitor/dm-command-auth.test.ts similarity index 100% rename from extensions/discord/src/monitor/dm-command-auth.test.ts rename to native-plugins/discord/src/monitor/dm-command-auth.test.ts diff --git a/extensions/discord/src/monitor/dm-command-auth.ts b/native-plugins/discord/src/monitor/dm-command-auth.ts similarity index 100% rename from extensions/discord/src/monitor/dm-command-auth.ts rename to native-plugins/discord/src/monitor/dm-command-auth.ts diff --git a/extensions/discord/src/monitor/dm-command-decision.test.ts b/native-plugins/discord/src/monitor/dm-command-decision.test.ts similarity index 100% rename from extensions/discord/src/monitor/dm-command-decision.test.ts rename to native-plugins/discord/src/monitor/dm-command-decision.test.ts diff --git a/extensions/discord/src/monitor/dm-command-decision.ts b/native-plugins/discord/src/monitor/dm-command-decision.ts similarity index 100% rename from extensions/discord/src/monitor/dm-command-decision.ts rename to native-plugins/discord/src/monitor/dm-command-decision.ts diff --git a/extensions/discord/src/monitor/exec-approvals.test.ts b/native-plugins/discord/src/monitor/exec-approvals.test.ts similarity index 100% rename from extensions/discord/src/monitor/exec-approvals.test.ts rename to native-plugins/discord/src/monitor/exec-approvals.test.ts diff --git a/extensions/discord/src/monitor/exec-approvals.ts b/native-plugins/discord/src/monitor/exec-approvals.ts similarity index 100% rename from extensions/discord/src/monitor/exec-approvals.ts rename to native-plugins/discord/src/monitor/exec-approvals.ts diff --git a/extensions/discord/src/monitor/format.ts b/native-plugins/discord/src/monitor/format.ts similarity index 100% rename from extensions/discord/src/monitor/format.ts rename to native-plugins/discord/src/monitor/format.ts diff --git a/extensions/discord/src/monitor/gateway-error-guard.test.ts b/native-plugins/discord/src/monitor/gateway-error-guard.test.ts similarity index 100% rename from extensions/discord/src/monitor/gateway-error-guard.test.ts rename to native-plugins/discord/src/monitor/gateway-error-guard.test.ts diff --git a/extensions/discord/src/monitor/gateway-error-guard.ts b/native-plugins/discord/src/monitor/gateway-error-guard.ts similarity index 100% rename from extensions/discord/src/monitor/gateway-error-guard.ts rename to native-plugins/discord/src/monitor/gateway-error-guard.ts diff --git a/extensions/discord/src/monitor/gateway-plugin.ts b/native-plugins/discord/src/monitor/gateway-plugin.ts similarity index 100% rename from extensions/discord/src/monitor/gateway-plugin.ts rename to native-plugins/discord/src/monitor/gateway-plugin.ts diff --git a/extensions/discord/src/monitor/gateway-registry.ts b/native-plugins/discord/src/monitor/gateway-registry.ts similarity index 100% rename from extensions/discord/src/monitor/gateway-registry.ts rename to native-plugins/discord/src/monitor/gateway-registry.ts diff --git a/extensions/discord/src/monitor/inbound-context.test.ts b/native-plugins/discord/src/monitor/inbound-context.test.ts similarity index 100% rename from extensions/discord/src/monitor/inbound-context.test.ts rename to native-plugins/discord/src/monitor/inbound-context.test.ts diff --git a/extensions/discord/src/monitor/inbound-context.ts b/native-plugins/discord/src/monitor/inbound-context.ts similarity index 100% rename from extensions/discord/src/monitor/inbound-context.ts rename to native-plugins/discord/src/monitor/inbound-context.ts diff --git a/extensions/discord/src/monitor/inbound-job.test.ts b/native-plugins/discord/src/monitor/inbound-job.test.ts similarity index 100% rename from extensions/discord/src/monitor/inbound-job.test.ts rename to native-plugins/discord/src/monitor/inbound-job.test.ts diff --git a/extensions/discord/src/monitor/inbound-job.ts b/native-plugins/discord/src/monitor/inbound-job.ts similarity index 100% rename from extensions/discord/src/monitor/inbound-job.ts rename to native-plugins/discord/src/monitor/inbound-job.ts diff --git a/extensions/discord/src/monitor/inbound-worker.ts b/native-plugins/discord/src/monitor/inbound-worker.ts similarity index 100% rename from extensions/discord/src/monitor/inbound-worker.ts rename to native-plugins/discord/src/monitor/inbound-worker.ts diff --git a/extensions/discord/src/monitor/listeners.test.ts b/native-plugins/discord/src/monitor/listeners.test.ts similarity index 100% rename from extensions/discord/src/monitor/listeners.test.ts rename to native-plugins/discord/src/monitor/listeners.test.ts diff --git a/extensions/discord/src/monitor/listeners.ts b/native-plugins/discord/src/monitor/listeners.ts similarity index 100% rename from extensions/discord/src/monitor/listeners.ts rename to native-plugins/discord/src/monitor/listeners.ts diff --git a/extensions/discord/src/monitor/message-handler.bot-self-filter.test.ts b/native-plugins/discord/src/monitor/message-handler.bot-self-filter.test.ts similarity index 100% rename from extensions/discord/src/monitor/message-handler.bot-self-filter.test.ts rename to native-plugins/discord/src/monitor/message-handler.bot-self-filter.test.ts diff --git a/extensions/discord/src/monitor/message-handler.inbound-context.test.ts b/native-plugins/discord/src/monitor/message-handler.inbound-context.test.ts similarity index 100% rename from extensions/discord/src/monitor/message-handler.inbound-context.test.ts rename to native-plugins/discord/src/monitor/message-handler.inbound-context.test.ts diff --git a/extensions/discord/src/monitor/message-handler.module-test-helpers.ts b/native-plugins/discord/src/monitor/message-handler.module-test-helpers.ts similarity index 100% rename from extensions/discord/src/monitor/message-handler.module-test-helpers.ts rename to native-plugins/discord/src/monitor/message-handler.module-test-helpers.ts diff --git a/extensions/discord/src/monitor/message-handler.preflight.acp-bindings.test.ts b/native-plugins/discord/src/monitor/message-handler.preflight.acp-bindings.test.ts similarity index 100% rename from extensions/discord/src/monitor/message-handler.preflight.acp-bindings.test.ts rename to native-plugins/discord/src/monitor/message-handler.preflight.acp-bindings.test.ts diff --git a/extensions/discord/src/monitor/message-handler.preflight.test-helpers.ts b/native-plugins/discord/src/monitor/message-handler.preflight.test-helpers.ts similarity index 100% rename from extensions/discord/src/monitor/message-handler.preflight.test-helpers.ts rename to native-plugins/discord/src/monitor/message-handler.preflight.test-helpers.ts diff --git a/extensions/discord/src/monitor/message-handler.preflight.test.ts b/native-plugins/discord/src/monitor/message-handler.preflight.test.ts similarity index 100% rename from extensions/discord/src/monitor/message-handler.preflight.test.ts rename to native-plugins/discord/src/monitor/message-handler.preflight.test.ts diff --git a/extensions/discord/src/monitor/message-handler.preflight.ts b/native-plugins/discord/src/monitor/message-handler.preflight.ts similarity index 100% rename from extensions/discord/src/monitor/message-handler.preflight.ts rename to native-plugins/discord/src/monitor/message-handler.preflight.ts diff --git a/extensions/discord/src/monitor/message-handler.preflight.types.ts b/native-plugins/discord/src/monitor/message-handler.preflight.types.ts similarity index 100% rename from extensions/discord/src/monitor/message-handler.preflight.types.ts rename to native-plugins/discord/src/monitor/message-handler.preflight.types.ts diff --git a/extensions/discord/src/monitor/message-handler.process.test.ts b/native-plugins/discord/src/monitor/message-handler.process.test.ts similarity index 100% rename from extensions/discord/src/monitor/message-handler.process.test.ts rename to native-plugins/discord/src/monitor/message-handler.process.test.ts diff --git a/extensions/discord/src/monitor/message-handler.process.ts b/native-plugins/discord/src/monitor/message-handler.process.ts similarity index 100% rename from extensions/discord/src/monitor/message-handler.process.ts rename to native-plugins/discord/src/monitor/message-handler.process.ts diff --git a/extensions/discord/src/monitor/message-handler.queue.test.ts b/native-plugins/discord/src/monitor/message-handler.queue.test.ts similarity index 100% rename from extensions/discord/src/monitor/message-handler.queue.test.ts rename to native-plugins/discord/src/monitor/message-handler.queue.test.ts diff --git a/extensions/discord/src/monitor/message-handler.test-harness.ts b/native-plugins/discord/src/monitor/message-handler.test-harness.ts similarity index 100% rename from extensions/discord/src/monitor/message-handler.test-harness.ts rename to native-plugins/discord/src/monitor/message-handler.test-harness.ts diff --git a/extensions/discord/src/monitor/message-handler.test-helpers.ts b/native-plugins/discord/src/monitor/message-handler.test-helpers.ts similarity index 100% rename from extensions/discord/src/monitor/message-handler.test-helpers.ts rename to native-plugins/discord/src/monitor/message-handler.test-helpers.ts diff --git a/extensions/discord/src/monitor/message-handler.ts b/native-plugins/discord/src/monitor/message-handler.ts similarity index 100% rename from extensions/discord/src/monitor/message-handler.ts rename to native-plugins/discord/src/monitor/message-handler.ts diff --git a/extensions/discord/src/monitor/message-utils.test.ts b/native-plugins/discord/src/monitor/message-utils.test.ts similarity index 100% rename from extensions/discord/src/monitor/message-utils.test.ts rename to native-plugins/discord/src/monitor/message-utils.test.ts diff --git a/extensions/discord/src/monitor/message-utils.ts b/native-plugins/discord/src/monitor/message-utils.ts similarity index 100% rename from extensions/discord/src/monitor/message-utils.ts rename to native-plugins/discord/src/monitor/message-utils.ts diff --git a/extensions/discord/src/monitor/model-picker-preferences.test.ts b/native-plugins/discord/src/monitor/model-picker-preferences.test.ts similarity index 100% rename from extensions/discord/src/monitor/model-picker-preferences.test.ts rename to native-plugins/discord/src/monitor/model-picker-preferences.test.ts diff --git a/extensions/discord/src/monitor/model-picker-preferences.ts b/native-plugins/discord/src/monitor/model-picker-preferences.ts similarity index 100% rename from extensions/discord/src/monitor/model-picker-preferences.ts rename to native-plugins/discord/src/monitor/model-picker-preferences.ts diff --git a/extensions/discord/src/monitor/model-picker.test-utils.ts b/native-plugins/discord/src/monitor/model-picker.test-utils.ts similarity index 100% rename from extensions/discord/src/monitor/model-picker.test-utils.ts rename to native-plugins/discord/src/monitor/model-picker.test-utils.ts diff --git a/extensions/discord/src/monitor/model-picker.test.ts b/native-plugins/discord/src/monitor/model-picker.test.ts similarity index 100% rename from extensions/discord/src/monitor/model-picker.test.ts rename to native-plugins/discord/src/monitor/model-picker.test.ts diff --git a/extensions/discord/src/monitor/model-picker.ts b/native-plugins/discord/src/monitor/model-picker.ts similarity index 100% rename from extensions/discord/src/monitor/model-picker.ts rename to native-plugins/discord/src/monitor/model-picker.ts diff --git a/extensions/discord/src/monitor/monitor.test.ts b/native-plugins/discord/src/monitor/monitor.test.ts similarity index 100% rename from extensions/discord/src/monitor/monitor.test.ts rename to native-plugins/discord/src/monitor/monitor.test.ts diff --git a/extensions/discord/src/monitor/native-command-context.test.ts b/native-plugins/discord/src/monitor/native-command-context.test.ts similarity index 100% rename from extensions/discord/src/monitor/native-command-context.test.ts rename to native-plugins/discord/src/monitor/native-command-context.test.ts diff --git a/extensions/discord/src/monitor/native-command-context.ts b/native-plugins/discord/src/monitor/native-command-context.ts similarity index 100% rename from extensions/discord/src/monitor/native-command-context.ts rename to native-plugins/discord/src/monitor/native-command-context.ts diff --git a/extensions/discord/src/monitor/native-command-ui.ts b/native-plugins/discord/src/monitor/native-command-ui.ts similarity index 100% rename from extensions/discord/src/monitor/native-command-ui.ts rename to native-plugins/discord/src/monitor/native-command-ui.ts diff --git a/extensions/discord/src/monitor/native-command.commands-allowfrom.test.ts b/native-plugins/discord/src/monitor/native-command.commands-allowfrom.test.ts similarity index 100% rename from extensions/discord/src/monitor/native-command.commands-allowfrom.test.ts rename to native-plugins/discord/src/monitor/native-command.commands-allowfrom.test.ts diff --git a/extensions/discord/src/monitor/native-command.model-picker.test.ts b/native-plugins/discord/src/monitor/native-command.model-picker.test.ts similarity index 100% rename from extensions/discord/src/monitor/native-command.model-picker.test.ts rename to native-plugins/discord/src/monitor/native-command.model-picker.test.ts diff --git a/extensions/discord/src/monitor/native-command.options.test.ts b/native-plugins/discord/src/monitor/native-command.options.test.ts similarity index 100% rename from extensions/discord/src/monitor/native-command.options.test.ts rename to native-plugins/discord/src/monitor/native-command.options.test.ts diff --git a/extensions/discord/src/monitor/native-command.plugin-dispatch.test.ts b/native-plugins/discord/src/monitor/native-command.plugin-dispatch.test.ts similarity index 100% rename from extensions/discord/src/monitor/native-command.plugin-dispatch.test.ts rename to native-plugins/discord/src/monitor/native-command.plugin-dispatch.test.ts diff --git a/extensions/discord/src/monitor/native-command.test-helpers.ts b/native-plugins/discord/src/monitor/native-command.test-helpers.ts similarity index 100% rename from extensions/discord/src/monitor/native-command.test-helpers.ts rename to native-plugins/discord/src/monitor/native-command.test-helpers.ts diff --git a/extensions/discord/src/monitor/native-command.ts b/native-plugins/discord/src/monitor/native-command.ts similarity index 100% rename from extensions/discord/src/monitor/native-command.ts rename to native-plugins/discord/src/monitor/native-command.ts diff --git a/extensions/discord/src/monitor/preflight-audio.runtime.ts b/native-plugins/discord/src/monitor/preflight-audio.runtime.ts similarity index 100% rename from extensions/discord/src/monitor/preflight-audio.runtime.ts rename to native-plugins/discord/src/monitor/preflight-audio.runtime.ts diff --git a/extensions/discord/src/monitor/preflight-audio.ts b/native-plugins/discord/src/monitor/preflight-audio.ts similarity index 100% rename from extensions/discord/src/monitor/preflight-audio.ts rename to native-plugins/discord/src/monitor/preflight-audio.ts diff --git a/extensions/discord/src/monitor/presence-cache.ts b/native-plugins/discord/src/monitor/presence-cache.ts similarity index 100% rename from extensions/discord/src/monitor/presence-cache.ts rename to native-plugins/discord/src/monitor/presence-cache.ts diff --git a/extensions/discord/src/monitor/presence.test.ts b/native-plugins/discord/src/monitor/presence.test.ts similarity index 100% rename from extensions/discord/src/monitor/presence.test.ts rename to native-plugins/discord/src/monitor/presence.test.ts diff --git a/extensions/discord/src/monitor/presence.ts b/native-plugins/discord/src/monitor/presence.ts similarity index 100% rename from extensions/discord/src/monitor/presence.ts rename to native-plugins/discord/src/monitor/presence.ts diff --git a/extensions/discord/src/monitor/provider.allowlist.test.ts b/native-plugins/discord/src/monitor/provider.allowlist.test.ts similarity index 100% rename from extensions/discord/src/monitor/provider.allowlist.test.ts rename to native-plugins/discord/src/monitor/provider.allowlist.test.ts diff --git a/extensions/discord/src/monitor/provider.allowlist.ts b/native-plugins/discord/src/monitor/provider.allowlist.ts similarity index 100% rename from extensions/discord/src/monitor/provider.allowlist.ts rename to native-plugins/discord/src/monitor/provider.allowlist.ts diff --git a/extensions/discord/src/monitor/provider.lifecycle.test.ts b/native-plugins/discord/src/monitor/provider.lifecycle.test.ts similarity index 100% rename from extensions/discord/src/monitor/provider.lifecycle.test.ts rename to native-plugins/discord/src/monitor/provider.lifecycle.test.ts diff --git a/extensions/discord/src/monitor/provider.lifecycle.ts b/native-plugins/discord/src/monitor/provider.lifecycle.ts similarity index 100% rename from extensions/discord/src/monitor/provider.lifecycle.ts rename to native-plugins/discord/src/monitor/provider.lifecycle.ts diff --git a/extensions/discord/src/monitor/provider.proxy.test.ts b/native-plugins/discord/src/monitor/provider.proxy.test.ts similarity index 100% rename from extensions/discord/src/monitor/provider.proxy.test.ts rename to native-plugins/discord/src/monitor/provider.proxy.test.ts diff --git a/extensions/discord/src/monitor/provider.rest-proxy.test.ts b/native-plugins/discord/src/monitor/provider.rest-proxy.test.ts similarity index 100% rename from extensions/discord/src/monitor/provider.rest-proxy.test.ts rename to native-plugins/discord/src/monitor/provider.rest-proxy.test.ts diff --git a/extensions/discord/src/monitor/provider.skill-dedupe.test.ts b/native-plugins/discord/src/monitor/provider.skill-dedupe.test.ts similarity index 100% rename from extensions/discord/src/monitor/provider.skill-dedupe.test.ts rename to native-plugins/discord/src/monitor/provider.skill-dedupe.test.ts diff --git a/extensions/discord/src/monitor/provider.test.ts b/native-plugins/discord/src/monitor/provider.test.ts similarity index 99% rename from extensions/discord/src/monitor/provider.test.ts rename to native-plugins/discord/src/monitor/provider.test.ts index ff6fb310464..997f99edb4c 100644 --- a/extensions/discord/src/monitor/provider.test.ts +++ b/native-plugins/discord/src/monitor/provider.test.ts @@ -8,7 +8,7 @@ import { getFirstDiscordMessageHandlerParams, getProviderMonitorTestMocks, resetDiscordProviderMonitorMocks, -} from "../../../../test/helpers/extensions/discord-provider.test-support.js"; +} from "../../../../test/helpers/native-plugins/discord-provider.test-support.js"; const { clientConstructorOptionsMock, diff --git a/extensions/discord/src/monitor/provider.ts b/native-plugins/discord/src/monitor/provider.ts similarity index 100% rename from extensions/discord/src/monitor/provider.ts rename to native-plugins/discord/src/monitor/provider.ts diff --git a/extensions/discord/src/monitor/reply-context.ts b/native-plugins/discord/src/monitor/reply-context.ts similarity index 100% rename from extensions/discord/src/monitor/reply-context.ts rename to native-plugins/discord/src/monitor/reply-context.ts diff --git a/extensions/discord/src/monitor/reply-delivery.test.ts b/native-plugins/discord/src/monitor/reply-delivery.test.ts similarity index 100% rename from extensions/discord/src/monitor/reply-delivery.test.ts rename to native-plugins/discord/src/monitor/reply-delivery.test.ts diff --git a/extensions/discord/src/monitor/reply-delivery.ts b/native-plugins/discord/src/monitor/reply-delivery.ts similarity index 100% rename from extensions/discord/src/monitor/reply-delivery.ts rename to native-plugins/discord/src/monitor/reply-delivery.ts diff --git a/extensions/discord/src/monitor/rest-fetch.ts b/native-plugins/discord/src/monitor/rest-fetch.ts similarity index 100% rename from extensions/discord/src/monitor/rest-fetch.ts rename to native-plugins/discord/src/monitor/rest-fetch.ts diff --git a/extensions/discord/src/monitor/route-resolution.test.ts b/native-plugins/discord/src/monitor/route-resolution.test.ts similarity index 100% rename from extensions/discord/src/monitor/route-resolution.test.ts rename to native-plugins/discord/src/monitor/route-resolution.test.ts diff --git a/extensions/discord/src/monitor/route-resolution.ts b/native-plugins/discord/src/monitor/route-resolution.ts similarity index 100% rename from extensions/discord/src/monitor/route-resolution.ts rename to native-plugins/discord/src/monitor/route-resolution.ts diff --git a/extensions/discord/src/monitor/sender-identity.ts b/native-plugins/discord/src/monitor/sender-identity.ts similarity index 100% rename from extensions/discord/src/monitor/sender-identity.ts rename to native-plugins/discord/src/monitor/sender-identity.ts diff --git a/extensions/discord/src/monitor/status.ts b/native-plugins/discord/src/monitor/status.ts similarity index 100% rename from extensions/discord/src/monitor/status.ts rename to native-plugins/discord/src/monitor/status.ts diff --git a/extensions/discord/src/monitor/system-events.ts b/native-plugins/discord/src/monitor/system-events.ts similarity index 100% rename from extensions/discord/src/monitor/system-events.ts rename to native-plugins/discord/src/monitor/system-events.ts diff --git a/extensions/discord/src/monitor/thread-bindings.config.ts b/native-plugins/discord/src/monitor/thread-bindings.config.ts similarity index 100% rename from extensions/discord/src/monitor/thread-bindings.config.ts rename to native-plugins/discord/src/monitor/thread-bindings.config.ts diff --git a/extensions/discord/src/monitor/thread-bindings.discord-api.test.ts b/native-plugins/discord/src/monitor/thread-bindings.discord-api.test.ts similarity index 100% rename from extensions/discord/src/monitor/thread-bindings.discord-api.test.ts rename to native-plugins/discord/src/monitor/thread-bindings.discord-api.test.ts diff --git a/extensions/discord/src/monitor/thread-bindings.discord-api.ts b/native-plugins/discord/src/monitor/thread-bindings.discord-api.ts similarity index 100% rename from extensions/discord/src/monitor/thread-bindings.discord-api.ts rename to native-plugins/discord/src/monitor/thread-bindings.discord-api.ts diff --git a/extensions/discord/src/monitor/thread-bindings.lifecycle.test.ts b/native-plugins/discord/src/monitor/thread-bindings.lifecycle.test.ts similarity index 100% rename from extensions/discord/src/monitor/thread-bindings.lifecycle.test.ts rename to native-plugins/discord/src/monitor/thread-bindings.lifecycle.test.ts diff --git a/extensions/discord/src/monitor/thread-bindings.lifecycle.ts b/native-plugins/discord/src/monitor/thread-bindings.lifecycle.ts similarity index 100% rename from extensions/discord/src/monitor/thread-bindings.lifecycle.ts rename to native-plugins/discord/src/monitor/thread-bindings.lifecycle.ts diff --git a/extensions/discord/src/monitor/thread-bindings.manager.ts b/native-plugins/discord/src/monitor/thread-bindings.manager.ts similarity index 100% rename from extensions/discord/src/monitor/thread-bindings.manager.ts rename to native-plugins/discord/src/monitor/thread-bindings.manager.ts diff --git a/extensions/discord/src/monitor/thread-bindings.messages.ts b/native-plugins/discord/src/monitor/thread-bindings.messages.ts similarity index 100% rename from extensions/discord/src/monitor/thread-bindings.messages.ts rename to native-plugins/discord/src/monitor/thread-bindings.messages.ts diff --git a/extensions/discord/src/monitor/thread-bindings.persona.test.ts b/native-plugins/discord/src/monitor/thread-bindings.persona.test.ts similarity index 100% rename from extensions/discord/src/monitor/thread-bindings.persona.test.ts rename to native-plugins/discord/src/monitor/thread-bindings.persona.test.ts diff --git a/extensions/discord/src/monitor/thread-bindings.persona.ts b/native-plugins/discord/src/monitor/thread-bindings.persona.ts similarity index 100% rename from extensions/discord/src/monitor/thread-bindings.persona.ts rename to native-plugins/discord/src/monitor/thread-bindings.persona.ts diff --git a/extensions/discord/src/monitor/thread-bindings.shared-state.test.ts b/native-plugins/discord/src/monitor/thread-bindings.shared-state.test.ts similarity index 100% rename from extensions/discord/src/monitor/thread-bindings.shared-state.test.ts rename to native-plugins/discord/src/monitor/thread-bindings.shared-state.test.ts diff --git a/extensions/discord/src/monitor/thread-bindings.state.ts b/native-plugins/discord/src/monitor/thread-bindings.state.ts similarity index 100% rename from extensions/discord/src/monitor/thread-bindings.state.ts rename to native-plugins/discord/src/monitor/thread-bindings.state.ts diff --git a/extensions/discord/src/monitor/thread-bindings.ts b/native-plugins/discord/src/monitor/thread-bindings.ts similarity index 100% rename from extensions/discord/src/monitor/thread-bindings.ts rename to native-plugins/discord/src/monitor/thread-bindings.ts diff --git a/extensions/discord/src/monitor/thread-bindings.types.ts b/native-plugins/discord/src/monitor/thread-bindings.types.ts similarity index 100% rename from extensions/discord/src/monitor/thread-bindings.types.ts rename to native-plugins/discord/src/monitor/thread-bindings.types.ts diff --git a/extensions/discord/src/monitor/thread-session-close.test.ts b/native-plugins/discord/src/monitor/thread-session-close.test.ts similarity index 100% rename from extensions/discord/src/monitor/thread-session-close.test.ts rename to native-plugins/discord/src/monitor/thread-session-close.test.ts diff --git a/extensions/discord/src/monitor/thread-session-close.ts b/native-plugins/discord/src/monitor/thread-session-close.ts similarity index 100% rename from extensions/discord/src/monitor/thread-session-close.ts rename to native-plugins/discord/src/monitor/thread-session-close.ts diff --git a/extensions/discord/src/monitor/threading.auto-thread.test.ts b/native-plugins/discord/src/monitor/threading.auto-thread.test.ts similarity index 100% rename from extensions/discord/src/monitor/threading.auto-thread.test.ts rename to native-plugins/discord/src/monitor/threading.auto-thread.test.ts diff --git a/extensions/discord/src/monitor/threading.parent-info.test.ts b/native-plugins/discord/src/monitor/threading.parent-info.test.ts similarity index 100% rename from extensions/discord/src/monitor/threading.parent-info.test.ts rename to native-plugins/discord/src/monitor/threading.parent-info.test.ts diff --git a/extensions/discord/src/monitor/threading.starter.test.ts b/native-plugins/discord/src/monitor/threading.starter.test.ts similarity index 100% rename from extensions/discord/src/monitor/threading.starter.test.ts rename to native-plugins/discord/src/monitor/threading.starter.test.ts diff --git a/extensions/discord/src/monitor/threading.ts b/native-plugins/discord/src/monitor/threading.ts similarity index 100% rename from extensions/discord/src/monitor/threading.ts rename to native-plugins/discord/src/monitor/threading.ts diff --git a/extensions/discord/src/monitor/timeouts.ts b/native-plugins/discord/src/monitor/timeouts.ts similarity index 100% rename from extensions/discord/src/monitor/timeouts.ts rename to native-plugins/discord/src/monitor/timeouts.ts diff --git a/extensions/discord/src/monitor/typing.ts b/native-plugins/discord/src/monitor/typing.ts similarity index 100% rename from extensions/discord/src/monitor/typing.ts rename to native-plugins/discord/src/monitor/typing.ts diff --git a/extensions/discord/src/normalize.ts b/native-plugins/discord/src/normalize.ts similarity index 100% rename from extensions/discord/src/normalize.ts rename to native-plugins/discord/src/normalize.ts diff --git a/extensions/discord/src/outbound-adapter.interactive-order.test.ts b/native-plugins/discord/src/outbound-adapter.interactive-order.test.ts similarity index 100% rename from extensions/discord/src/outbound-adapter.interactive-order.test.ts rename to native-plugins/discord/src/outbound-adapter.interactive-order.test.ts diff --git a/extensions/discord/src/outbound-adapter.test.ts b/native-plugins/discord/src/outbound-adapter.test.ts similarity index 100% rename from extensions/discord/src/outbound-adapter.test.ts rename to native-plugins/discord/src/outbound-adapter.test.ts diff --git a/extensions/discord/src/outbound-adapter.ts b/native-plugins/discord/src/outbound-adapter.ts similarity index 100% rename from extensions/discord/src/outbound-adapter.ts rename to native-plugins/discord/src/outbound-adapter.ts diff --git a/extensions/discord/src/pluralkit.test.ts b/native-plugins/discord/src/pluralkit.test.ts similarity index 100% rename from extensions/discord/src/pluralkit.test.ts rename to native-plugins/discord/src/pluralkit.test.ts diff --git a/extensions/discord/src/pluralkit.ts b/native-plugins/discord/src/pluralkit.ts similarity index 100% rename from extensions/discord/src/pluralkit.ts rename to native-plugins/discord/src/pluralkit.ts diff --git a/extensions/discord/src/probe.intents.test.ts b/native-plugins/discord/src/probe.intents.test.ts similarity index 100% rename from extensions/discord/src/probe.intents.test.ts rename to native-plugins/discord/src/probe.intents.test.ts diff --git a/extensions/discord/src/probe.parse-token.test.ts b/native-plugins/discord/src/probe.parse-token.test.ts similarity index 100% rename from extensions/discord/src/probe.parse-token.test.ts rename to native-plugins/discord/src/probe.parse-token.test.ts diff --git a/extensions/discord/src/probe.ts b/native-plugins/discord/src/probe.ts similarity index 100% rename from extensions/discord/src/probe.ts rename to native-plugins/discord/src/probe.ts diff --git a/extensions/discord/src/resolve-allowlist-common.test.ts b/native-plugins/discord/src/resolve-allowlist-common.test.ts similarity index 100% rename from extensions/discord/src/resolve-allowlist-common.test.ts rename to native-plugins/discord/src/resolve-allowlist-common.test.ts diff --git a/extensions/discord/src/resolve-allowlist-common.ts b/native-plugins/discord/src/resolve-allowlist-common.ts similarity index 100% rename from extensions/discord/src/resolve-allowlist-common.ts rename to native-plugins/discord/src/resolve-allowlist-common.ts diff --git a/extensions/discord/src/resolve-channels.test.ts b/native-plugins/discord/src/resolve-channels.test.ts similarity index 99% rename from extensions/discord/src/resolve-channels.test.ts rename to native-plugins/discord/src/resolve-channels.test.ts index 8fd06593923..bf07d1f2c0f 100644 --- a/extensions/discord/src/resolve-channels.test.ts +++ b/native-plugins/discord/src/resolve-channels.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { withFetchPreconnect } from "../../../test/helpers/extensions/fetch-mock.js"; +import { withFetchPreconnect } from "../../../test/helpers/native-plugins/fetch-mock.js"; import { resolveDiscordChannelAllowlist } from "./resolve-channels.js"; import { jsonResponse, urlToString } from "./test-http-helpers.js"; diff --git a/extensions/discord/src/resolve-channels.ts b/native-plugins/discord/src/resolve-channels.ts similarity index 100% rename from extensions/discord/src/resolve-channels.ts rename to native-plugins/discord/src/resolve-channels.ts diff --git a/extensions/discord/src/resolve-users.test.ts b/native-plugins/discord/src/resolve-users.test.ts similarity index 98% rename from extensions/discord/src/resolve-users.test.ts rename to native-plugins/discord/src/resolve-users.test.ts index 080c312b856..2354aee7a15 100644 --- a/extensions/discord/src/resolve-users.test.ts +++ b/native-plugins/discord/src/resolve-users.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { withFetchPreconnect } from "../../../test/helpers/extensions/fetch-mock.js"; +import { withFetchPreconnect } from "../../../test/helpers/native-plugins/fetch-mock.js"; import { resolveDiscordUserAllowlist } from "./resolve-users.js"; import { jsonResponse, urlToString } from "./test-http-helpers.js"; diff --git a/extensions/discord/src/resolve-users.ts b/native-plugins/discord/src/resolve-users.ts similarity index 100% rename from extensions/discord/src/resolve-users.ts rename to native-plugins/discord/src/resolve-users.ts diff --git a/extensions/discord/src/retry.ts b/native-plugins/discord/src/retry.ts similarity index 100% rename from extensions/discord/src/retry.ts rename to native-plugins/discord/src/retry.ts diff --git a/extensions/discord/src/runtime-api.ts b/native-plugins/discord/src/runtime-api.ts similarity index 100% rename from extensions/discord/src/runtime-api.ts rename to native-plugins/discord/src/runtime-api.ts diff --git a/extensions/discord/src/runtime.ts b/native-plugins/discord/src/runtime.ts similarity index 100% rename from extensions/discord/src/runtime.ts rename to native-plugins/discord/src/runtime.ts diff --git a/extensions/discord/src/send.channels.ts b/native-plugins/discord/src/send.channels.ts similarity index 100% rename from extensions/discord/src/send.channels.ts rename to native-plugins/discord/src/send.channels.ts diff --git a/extensions/discord/src/send.components.test.ts b/native-plugins/discord/src/send.components.test.ts similarity index 100% rename from extensions/discord/src/send.components.test.ts rename to native-plugins/discord/src/send.components.test.ts diff --git a/extensions/discord/src/send.components.ts b/native-plugins/discord/src/send.components.ts similarity index 100% rename from extensions/discord/src/send.components.ts rename to native-plugins/discord/src/send.components.ts diff --git a/extensions/discord/src/send.creates-thread.test.ts b/native-plugins/discord/src/send.creates-thread.test.ts similarity index 100% rename from extensions/discord/src/send.creates-thread.test.ts rename to native-plugins/discord/src/send.creates-thread.test.ts diff --git a/extensions/discord/src/send.emojis-stickers.ts b/native-plugins/discord/src/send.emojis-stickers.ts similarity index 100% rename from extensions/discord/src/send.emojis-stickers.ts rename to native-plugins/discord/src/send.emojis-stickers.ts diff --git a/extensions/discord/src/send.guild.ts b/native-plugins/discord/src/send.guild.ts similarity index 100% rename from extensions/discord/src/send.guild.ts rename to native-plugins/discord/src/send.guild.ts diff --git a/extensions/discord/src/send.messages.ts b/native-plugins/discord/src/send.messages.ts similarity index 100% rename from extensions/discord/src/send.messages.ts rename to native-plugins/discord/src/send.messages.ts diff --git a/extensions/discord/src/send.outbound.ts b/native-plugins/discord/src/send.outbound.ts similarity index 100% rename from extensions/discord/src/send.outbound.ts rename to native-plugins/discord/src/send.outbound.ts diff --git a/extensions/discord/src/send.permissions.authz.test.ts b/native-plugins/discord/src/send.permissions.authz.test.ts similarity index 100% rename from extensions/discord/src/send.permissions.authz.test.ts rename to native-plugins/discord/src/send.permissions.authz.test.ts diff --git a/extensions/discord/src/send.permissions.ts b/native-plugins/discord/src/send.permissions.ts similarity index 100% rename from extensions/discord/src/send.permissions.ts rename to native-plugins/discord/src/send.permissions.ts diff --git a/extensions/discord/src/send.reactions.ts b/native-plugins/discord/src/send.reactions.ts similarity index 100% rename from extensions/discord/src/send.reactions.ts rename to native-plugins/discord/src/send.reactions.ts diff --git a/extensions/discord/src/send.sends-basic-channel-messages.test.ts b/native-plugins/discord/src/send.sends-basic-channel-messages.test.ts similarity index 100% rename from extensions/discord/src/send.sends-basic-channel-messages.test.ts rename to native-plugins/discord/src/send.sends-basic-channel-messages.test.ts diff --git a/extensions/discord/src/send.shared.ts b/native-plugins/discord/src/send.shared.ts similarity index 100% rename from extensions/discord/src/send.shared.ts rename to native-plugins/discord/src/send.shared.ts diff --git a/extensions/discord/src/send.test-harness.ts b/native-plugins/discord/src/send.test-harness.ts similarity index 100% rename from extensions/discord/src/send.test-harness.ts rename to native-plugins/discord/src/send.test-harness.ts diff --git a/extensions/discord/src/send.ts b/native-plugins/discord/src/send.ts similarity index 100% rename from extensions/discord/src/send.ts rename to native-plugins/discord/src/send.ts diff --git a/extensions/discord/src/send.types.ts b/native-plugins/discord/src/send.types.ts similarity index 100% rename from extensions/discord/src/send.types.ts rename to native-plugins/discord/src/send.types.ts diff --git a/extensions/discord/src/send.typing.ts b/native-plugins/discord/src/send.typing.ts similarity index 100% rename from extensions/discord/src/send.typing.ts rename to native-plugins/discord/src/send.typing.ts diff --git a/extensions/discord/src/send.webhook-activity.test.ts b/native-plugins/discord/src/send.webhook-activity.test.ts similarity index 100% rename from extensions/discord/src/send.webhook-activity.test.ts rename to native-plugins/discord/src/send.webhook-activity.test.ts diff --git a/extensions/discord/src/session-key-normalization.test.ts b/native-plugins/discord/src/session-key-normalization.test.ts similarity index 100% rename from extensions/discord/src/session-key-normalization.test.ts rename to native-plugins/discord/src/session-key-normalization.test.ts diff --git a/extensions/discord/src/session-key-normalization.ts b/native-plugins/discord/src/session-key-normalization.ts similarity index 100% rename from extensions/discord/src/session-key-normalization.ts rename to native-plugins/discord/src/session-key-normalization.ts diff --git a/extensions/discord/src/setup-account-state.ts b/native-plugins/discord/src/setup-account-state.ts similarity index 100% rename from extensions/discord/src/setup-account-state.ts rename to native-plugins/discord/src/setup-account-state.ts diff --git a/extensions/discord/src/setup-core.ts b/native-plugins/discord/src/setup-core.ts similarity index 100% rename from extensions/discord/src/setup-core.ts rename to native-plugins/discord/src/setup-core.ts diff --git a/extensions/discord/src/setup-runtime-helpers.ts b/native-plugins/discord/src/setup-runtime-helpers.ts similarity index 100% rename from extensions/discord/src/setup-runtime-helpers.ts rename to native-plugins/discord/src/setup-runtime-helpers.ts diff --git a/extensions/discord/src/setup-surface.ts b/native-plugins/discord/src/setup-surface.ts similarity index 100% rename from extensions/discord/src/setup-surface.ts rename to native-plugins/discord/src/setup-surface.ts diff --git a/extensions/discord/src/shared-interactive.test.ts b/native-plugins/discord/src/shared-interactive.test.ts similarity index 100% rename from extensions/discord/src/shared-interactive.test.ts rename to native-plugins/discord/src/shared-interactive.test.ts diff --git a/extensions/discord/src/shared-interactive.ts b/native-plugins/discord/src/shared-interactive.ts similarity index 100% rename from extensions/discord/src/shared-interactive.ts rename to native-plugins/discord/src/shared-interactive.ts diff --git a/extensions/discord/src/shared.ts b/native-plugins/discord/src/shared.ts similarity index 100% rename from extensions/discord/src/shared.ts rename to native-plugins/discord/src/shared.ts diff --git a/extensions/discord/src/status-issues.ts b/native-plugins/discord/src/status-issues.ts similarity index 100% rename from extensions/discord/src/status-issues.ts rename to native-plugins/discord/src/status-issues.ts diff --git a/extensions/discord/src/subagent-hooks.test.ts b/native-plugins/discord/src/subagent-hooks.test.ts similarity index 99% rename from extensions/discord/src/subagent-hooks.test.ts rename to native-plugins/discord/src/subagent-hooks.test.ts index a05db63043a..7ff9f0a18a1 100644 --- a/extensions/discord/src/subagent-hooks.test.ts +++ b/native-plugins/discord/src/subagent-hooks.test.ts @@ -3,7 +3,7 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; import { getRequiredHookHandler, registerHookHandlersForTest, -} from "../../../test/helpers/extensions/subagent-hooks.js"; +} from "../../../test/helpers/native-plugins/subagent-hooks.js"; import { registerDiscordSubagentHooks } from "./subagent-hooks.js"; type ThreadBindingRecord = { diff --git a/extensions/discord/src/subagent-hooks.ts b/native-plugins/discord/src/subagent-hooks.ts similarity index 100% rename from extensions/discord/src/subagent-hooks.ts rename to native-plugins/discord/src/subagent-hooks.ts diff --git a/extensions/discord/src/targets.test.ts b/native-plugins/discord/src/targets.test.ts similarity index 100% rename from extensions/discord/src/targets.test.ts rename to native-plugins/discord/src/targets.test.ts diff --git a/extensions/discord/src/targets.ts b/native-plugins/discord/src/targets.ts similarity index 100% rename from extensions/discord/src/targets.ts rename to native-plugins/discord/src/targets.ts diff --git a/extensions/discord/src/test-http-helpers.ts b/native-plugins/discord/src/test-http-helpers.ts similarity index 100% rename from extensions/discord/src/test-http-helpers.ts rename to native-plugins/discord/src/test-http-helpers.ts diff --git a/extensions/discord/src/token.test.ts b/native-plugins/discord/src/token.test.ts similarity index 100% rename from extensions/discord/src/token.test.ts rename to native-plugins/discord/src/token.test.ts diff --git a/extensions/discord/src/token.ts b/native-plugins/discord/src/token.ts similarity index 100% rename from extensions/discord/src/token.ts rename to native-plugins/discord/src/token.ts diff --git a/extensions/discord/src/ui.ts b/native-plugins/discord/src/ui.ts similarity index 100% rename from extensions/discord/src/ui.ts rename to native-plugins/discord/src/ui.ts diff --git a/extensions/discord/src/voice-message.test.ts b/native-plugins/discord/src/voice-message.test.ts similarity index 100% rename from extensions/discord/src/voice-message.test.ts rename to native-plugins/discord/src/voice-message.test.ts diff --git a/extensions/discord/src/voice-message.ts b/native-plugins/discord/src/voice-message.ts similarity index 100% rename from extensions/discord/src/voice-message.ts rename to native-plugins/discord/src/voice-message.ts diff --git a/extensions/discord/src/voice/command.test.ts b/native-plugins/discord/src/voice/command.test.ts similarity index 100% rename from extensions/discord/src/voice/command.test.ts rename to native-plugins/discord/src/voice/command.test.ts diff --git a/extensions/discord/src/voice/command.ts b/native-plugins/discord/src/voice/command.ts similarity index 100% rename from extensions/discord/src/voice/command.ts rename to native-plugins/discord/src/voice/command.ts diff --git a/extensions/discord/src/voice/manager.e2e.test.ts b/native-plugins/discord/src/voice/manager.e2e.test.ts similarity index 100% rename from extensions/discord/src/voice/manager.e2e.test.ts rename to native-plugins/discord/src/voice/manager.e2e.test.ts diff --git a/extensions/discord/src/voice/manager.runtime.ts b/native-plugins/discord/src/voice/manager.runtime.ts similarity index 100% rename from extensions/discord/src/voice/manager.runtime.ts rename to native-plugins/discord/src/voice/manager.runtime.ts diff --git a/extensions/discord/src/voice/manager.ts b/native-plugins/discord/src/voice/manager.ts similarity index 100% rename from extensions/discord/src/voice/manager.ts rename to native-plugins/discord/src/voice/manager.ts diff --git a/extensions/discord/src/voice/sdk-runtime.ts b/native-plugins/discord/src/voice/sdk-runtime.ts similarity index 100% rename from extensions/discord/src/voice/sdk-runtime.ts rename to native-plugins/discord/src/voice/sdk-runtime.ts diff --git a/extensions/elevenlabs/index.ts b/native-plugins/elevenlabs/index.ts similarity index 100% rename from extensions/elevenlabs/index.ts rename to native-plugins/elevenlabs/index.ts diff --git a/extensions/elevenlabs/openclaw.plugin.json b/native-plugins/elevenlabs/openclaw.plugin.json similarity index 100% rename from extensions/elevenlabs/openclaw.plugin.json rename to native-plugins/elevenlabs/openclaw.plugin.json diff --git a/extensions/elevenlabs/package.json b/native-plugins/elevenlabs/package.json similarity index 91% rename from extensions/elevenlabs/package.json rename to native-plugins/elevenlabs/package.json index d4b5d32f16c..a952b4d3406 100644 --- a/extensions/elevenlabs/package.json +++ b/native-plugins/elevenlabs/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw ElevenLabs speech plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/fal/index.ts b/native-plugins/fal/index.ts similarity index 100% rename from extensions/fal/index.ts rename to native-plugins/fal/index.ts diff --git a/extensions/fal/onboard.ts b/native-plugins/fal/onboard.ts similarity index 100% rename from extensions/fal/onboard.ts rename to native-plugins/fal/onboard.ts diff --git a/extensions/fal/openclaw.plugin.json b/native-plugins/fal/openclaw.plugin.json similarity index 100% rename from extensions/fal/openclaw.plugin.json rename to native-plugins/fal/openclaw.plugin.json diff --git a/extensions/fal/package.json b/native-plugins/fal/package.json similarity index 90% rename from extensions/fal/package.json rename to native-plugins/fal/package.json index ebe51568a10..1c2769005ef 100644 --- a/extensions/fal/package.json +++ b/native-plugins/fal/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw fal provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/feishu/api.ts b/native-plugins/feishu/api.ts similarity index 100% rename from extensions/feishu/api.ts rename to native-plugins/feishu/api.ts diff --git a/extensions/feishu/index.test.ts b/native-plugins/feishu/index.test.ts similarity index 100% rename from extensions/feishu/index.test.ts rename to native-plugins/feishu/index.test.ts diff --git a/extensions/feishu/index.ts b/native-plugins/feishu/index.ts similarity index 100% rename from extensions/feishu/index.ts rename to native-plugins/feishu/index.ts diff --git a/extensions/feishu/openclaw.plugin.json b/native-plugins/feishu/openclaw.plugin.json similarity index 100% rename from extensions/feishu/openclaw.plugin.json rename to native-plugins/feishu/openclaw.plugin.json diff --git a/extensions/feishu/package.json b/native-plugins/feishu/package.json similarity index 94% rename from extensions/feishu/package.json rename to native-plugins/feishu/package.json index a610473f445..8c36910874c 100644 --- a/extensions/feishu/package.json +++ b/native-plugins/feishu/package.json @@ -10,7 +10,7 @@ "zod": "^4.3.6" }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ], "setupEntry": "./setup-entry.ts", @@ -29,7 +29,7 @@ }, "install": { "npmSpec": "@openclaw/feishu", - "localPath": "extensions/feishu", + "localPath": "native-plugins/feishu", "defaultChoice": "npm" }, "bundle": { diff --git a/extensions/feishu/runtime-api.ts b/native-plugins/feishu/runtime-api.ts similarity index 100% rename from extensions/feishu/runtime-api.ts rename to native-plugins/feishu/runtime-api.ts diff --git a/extensions/feishu/setup-api.ts b/native-plugins/feishu/setup-api.ts similarity index 100% rename from extensions/feishu/setup-api.ts rename to native-plugins/feishu/setup-api.ts diff --git a/extensions/feishu/setup-entry.ts b/native-plugins/feishu/setup-entry.ts similarity index 100% rename from extensions/feishu/setup-entry.ts rename to native-plugins/feishu/setup-entry.ts diff --git a/extensions/feishu/skills/feishu-doc/SKILL.md b/native-plugins/feishu/skills/feishu-doc/SKILL.md similarity index 100% rename from extensions/feishu/skills/feishu-doc/SKILL.md rename to native-plugins/feishu/skills/feishu-doc/SKILL.md diff --git a/extensions/feishu/skills/feishu-doc/references/block-types.md b/native-plugins/feishu/skills/feishu-doc/references/block-types.md similarity index 100% rename from extensions/feishu/skills/feishu-doc/references/block-types.md rename to native-plugins/feishu/skills/feishu-doc/references/block-types.md diff --git a/extensions/feishu/skills/feishu-drive/SKILL.md b/native-plugins/feishu/skills/feishu-drive/SKILL.md similarity index 100% rename from extensions/feishu/skills/feishu-drive/SKILL.md rename to native-plugins/feishu/skills/feishu-drive/SKILL.md diff --git a/extensions/feishu/skills/feishu-perm/SKILL.md b/native-plugins/feishu/skills/feishu-perm/SKILL.md similarity index 100% rename from extensions/feishu/skills/feishu-perm/SKILL.md rename to native-plugins/feishu/skills/feishu-perm/SKILL.md diff --git a/extensions/feishu/skills/feishu-wiki/SKILL.md b/native-plugins/feishu/skills/feishu-wiki/SKILL.md similarity index 100% rename from extensions/feishu/skills/feishu-wiki/SKILL.md rename to native-plugins/feishu/skills/feishu-wiki/SKILL.md diff --git a/extensions/feishu/src/accounts.test.ts b/native-plugins/feishu/src/accounts.test.ts similarity index 100% rename from extensions/feishu/src/accounts.test.ts rename to native-plugins/feishu/src/accounts.test.ts diff --git a/extensions/feishu/src/accounts.ts b/native-plugins/feishu/src/accounts.ts similarity index 100% rename from extensions/feishu/src/accounts.ts rename to native-plugins/feishu/src/accounts.ts diff --git a/extensions/feishu/src/async.ts b/native-plugins/feishu/src/async.ts similarity index 100% rename from extensions/feishu/src/async.ts rename to native-plugins/feishu/src/async.ts diff --git a/extensions/feishu/src/bitable.ts b/native-plugins/feishu/src/bitable.ts similarity index 100% rename from extensions/feishu/src/bitable.ts rename to native-plugins/feishu/src/bitable.ts diff --git a/extensions/feishu/src/bot-content.ts b/native-plugins/feishu/src/bot-content.ts similarity index 100% rename from extensions/feishu/src/bot-content.ts rename to native-plugins/feishu/src/bot-content.ts diff --git a/extensions/feishu/src/bot-sender-name.ts b/native-plugins/feishu/src/bot-sender-name.ts similarity index 100% rename from extensions/feishu/src/bot-sender-name.ts rename to native-plugins/feishu/src/bot-sender-name.ts diff --git a/extensions/feishu/src/bot.card-action.test.ts b/native-plugins/feishu/src/bot.card-action.test.ts similarity index 100% rename from extensions/feishu/src/bot.card-action.test.ts rename to native-plugins/feishu/src/bot.card-action.test.ts diff --git a/extensions/feishu/src/bot.checkBotMentioned.test.ts b/native-plugins/feishu/src/bot.checkBotMentioned.test.ts similarity index 100% rename from extensions/feishu/src/bot.checkBotMentioned.test.ts rename to native-plugins/feishu/src/bot.checkBotMentioned.test.ts diff --git a/extensions/feishu/src/bot.stripBotMention.test.ts b/native-plugins/feishu/src/bot.stripBotMention.test.ts similarity index 100% rename from extensions/feishu/src/bot.stripBotMention.test.ts rename to native-plugins/feishu/src/bot.stripBotMention.test.ts diff --git a/extensions/feishu/src/bot.test.ts b/native-plugins/feishu/src/bot.test.ts similarity index 99% rename from extensions/feishu/src/bot.test.ts rename to native-plugins/feishu/src/bot.test.ts index 0d6ae54e05d..b4fa1c9c899 100644 --- a/extensions/feishu/src/bot.test.ts +++ b/native-plugins/feishu/src/bot.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; -import { createPluginRuntimeMock } from "../../../test/helpers/extensions/plugin-runtime-mock.js"; +import { createPluginRuntimeMock } from "../../../test/helpers/native-plugins/plugin-runtime-mock.js"; import type { ClawdbotConfig, PluginRuntime, RuntimeEnv } from "../runtime-api.js"; import type { FeishuMessageEvent } from "./bot.js"; import { diff --git a/extensions/feishu/src/bot.ts b/native-plugins/feishu/src/bot.ts similarity index 100% rename from extensions/feishu/src/bot.ts rename to native-plugins/feishu/src/bot.ts diff --git a/extensions/feishu/src/card-action.ts b/native-plugins/feishu/src/card-action.ts similarity index 100% rename from extensions/feishu/src/card-action.ts rename to native-plugins/feishu/src/card-action.ts diff --git a/extensions/feishu/src/card-interaction.test.ts b/native-plugins/feishu/src/card-interaction.test.ts similarity index 100% rename from extensions/feishu/src/card-interaction.test.ts rename to native-plugins/feishu/src/card-interaction.test.ts diff --git a/extensions/feishu/src/card-interaction.ts b/native-plugins/feishu/src/card-interaction.ts similarity index 100% rename from extensions/feishu/src/card-interaction.ts rename to native-plugins/feishu/src/card-interaction.ts diff --git a/extensions/feishu/src/card-ux-approval.ts b/native-plugins/feishu/src/card-ux-approval.ts similarity index 100% rename from extensions/feishu/src/card-ux-approval.ts rename to native-plugins/feishu/src/card-ux-approval.ts diff --git a/extensions/feishu/src/card-ux-launcher.test.ts b/native-plugins/feishu/src/card-ux-launcher.test.ts similarity index 100% rename from extensions/feishu/src/card-ux-launcher.test.ts rename to native-plugins/feishu/src/card-ux-launcher.test.ts diff --git a/extensions/feishu/src/card-ux-launcher.ts b/native-plugins/feishu/src/card-ux-launcher.ts similarity index 100% rename from extensions/feishu/src/card-ux-launcher.ts rename to native-plugins/feishu/src/card-ux-launcher.ts diff --git a/extensions/feishu/src/card-ux-shared.ts b/native-plugins/feishu/src/card-ux-shared.ts similarity index 100% rename from extensions/feishu/src/card-ux-shared.ts rename to native-plugins/feishu/src/card-ux-shared.ts diff --git a/extensions/feishu/src/channel.runtime.ts b/native-plugins/feishu/src/channel.runtime.ts similarity index 100% rename from extensions/feishu/src/channel.runtime.ts rename to native-plugins/feishu/src/channel.runtime.ts diff --git a/extensions/feishu/src/channel.test.ts b/native-plugins/feishu/src/channel.test.ts similarity index 100% rename from extensions/feishu/src/channel.test.ts rename to native-plugins/feishu/src/channel.test.ts diff --git a/extensions/feishu/src/channel.ts b/native-plugins/feishu/src/channel.ts similarity index 100% rename from extensions/feishu/src/channel.ts rename to native-plugins/feishu/src/channel.ts diff --git a/extensions/feishu/src/chat-schema.ts b/native-plugins/feishu/src/chat-schema.ts similarity index 100% rename from extensions/feishu/src/chat-schema.ts rename to native-plugins/feishu/src/chat-schema.ts diff --git a/extensions/feishu/src/chat.test.ts b/native-plugins/feishu/src/chat.test.ts similarity index 100% rename from extensions/feishu/src/chat.test.ts rename to native-plugins/feishu/src/chat.test.ts diff --git a/extensions/feishu/src/chat.ts b/native-plugins/feishu/src/chat.ts similarity index 100% rename from extensions/feishu/src/chat.ts rename to native-plugins/feishu/src/chat.ts diff --git a/extensions/feishu/src/client.test.ts b/native-plugins/feishu/src/client.test.ts similarity index 100% rename from extensions/feishu/src/client.test.ts rename to native-plugins/feishu/src/client.test.ts diff --git a/extensions/feishu/src/client.ts b/native-plugins/feishu/src/client.ts similarity index 100% rename from extensions/feishu/src/client.ts rename to native-plugins/feishu/src/client.ts diff --git a/extensions/feishu/src/config-schema.test.ts b/native-plugins/feishu/src/config-schema.test.ts similarity index 100% rename from extensions/feishu/src/config-schema.test.ts rename to native-plugins/feishu/src/config-schema.test.ts diff --git a/extensions/feishu/src/config-schema.ts b/native-plugins/feishu/src/config-schema.ts similarity index 100% rename from extensions/feishu/src/config-schema.ts rename to native-plugins/feishu/src/config-schema.ts diff --git a/extensions/feishu/src/conversation-id.ts b/native-plugins/feishu/src/conversation-id.ts similarity index 100% rename from extensions/feishu/src/conversation-id.ts rename to native-plugins/feishu/src/conversation-id.ts diff --git a/extensions/feishu/src/dedup.ts b/native-plugins/feishu/src/dedup.ts similarity index 100% rename from extensions/feishu/src/dedup.ts rename to native-plugins/feishu/src/dedup.ts diff --git a/extensions/feishu/src/directory.static.ts b/native-plugins/feishu/src/directory.static.ts similarity index 100% rename from extensions/feishu/src/directory.static.ts rename to native-plugins/feishu/src/directory.static.ts diff --git a/extensions/feishu/src/directory.test.ts b/native-plugins/feishu/src/directory.test.ts similarity index 100% rename from extensions/feishu/src/directory.test.ts rename to native-plugins/feishu/src/directory.test.ts diff --git a/extensions/feishu/src/directory.ts b/native-plugins/feishu/src/directory.ts similarity index 100% rename from extensions/feishu/src/directory.ts rename to native-plugins/feishu/src/directory.ts diff --git a/extensions/feishu/src/doc-schema.ts b/native-plugins/feishu/src/doc-schema.ts similarity index 100% rename from extensions/feishu/src/doc-schema.ts rename to native-plugins/feishu/src/doc-schema.ts diff --git a/extensions/feishu/src/docx-batch-insert.test.ts b/native-plugins/feishu/src/docx-batch-insert.test.ts similarity index 100% rename from extensions/feishu/src/docx-batch-insert.test.ts rename to native-plugins/feishu/src/docx-batch-insert.test.ts diff --git a/extensions/feishu/src/docx-batch-insert.ts b/native-plugins/feishu/src/docx-batch-insert.ts similarity index 100% rename from extensions/feishu/src/docx-batch-insert.ts rename to native-plugins/feishu/src/docx-batch-insert.ts diff --git a/extensions/feishu/src/docx-color-text.ts b/native-plugins/feishu/src/docx-color-text.ts similarity index 100% rename from extensions/feishu/src/docx-color-text.ts rename to native-plugins/feishu/src/docx-color-text.ts diff --git a/extensions/feishu/src/docx-table-ops.ts b/native-plugins/feishu/src/docx-table-ops.ts similarity index 100% rename from extensions/feishu/src/docx-table-ops.ts rename to native-plugins/feishu/src/docx-table-ops.ts diff --git a/extensions/feishu/src/docx.account-selection.test.ts b/native-plugins/feishu/src/docx.account-selection.test.ts similarity index 100% rename from extensions/feishu/src/docx.account-selection.test.ts rename to native-plugins/feishu/src/docx.account-selection.test.ts diff --git a/extensions/feishu/src/docx.test.ts b/native-plugins/feishu/src/docx.test.ts similarity index 100% rename from extensions/feishu/src/docx.test.ts rename to native-plugins/feishu/src/docx.test.ts diff --git a/extensions/feishu/src/docx.ts b/native-plugins/feishu/src/docx.ts similarity index 100% rename from extensions/feishu/src/docx.ts rename to native-plugins/feishu/src/docx.ts diff --git a/extensions/feishu/src/drive-schema.ts b/native-plugins/feishu/src/drive-schema.ts similarity index 100% rename from extensions/feishu/src/drive-schema.ts rename to native-plugins/feishu/src/drive-schema.ts diff --git a/extensions/feishu/src/drive.ts b/native-plugins/feishu/src/drive.ts similarity index 100% rename from extensions/feishu/src/drive.ts rename to native-plugins/feishu/src/drive.ts diff --git a/extensions/feishu/src/dynamic-agent.ts b/native-plugins/feishu/src/dynamic-agent.ts similarity index 100% rename from extensions/feishu/src/dynamic-agent.ts rename to native-plugins/feishu/src/dynamic-agent.ts diff --git a/extensions/feishu/src/external-keys.test.ts b/native-plugins/feishu/src/external-keys.test.ts similarity index 100% rename from extensions/feishu/src/external-keys.test.ts rename to native-plugins/feishu/src/external-keys.test.ts diff --git a/extensions/feishu/src/external-keys.ts b/native-plugins/feishu/src/external-keys.ts similarity index 100% rename from extensions/feishu/src/external-keys.ts rename to native-plugins/feishu/src/external-keys.ts diff --git a/extensions/feishu/src/feishu-command-handler.ts b/native-plugins/feishu/src/feishu-command-handler.ts similarity index 100% rename from extensions/feishu/src/feishu-command-handler.ts rename to native-plugins/feishu/src/feishu-command-handler.ts diff --git a/extensions/feishu/src/media.test.ts b/native-plugins/feishu/src/media.test.ts similarity index 100% rename from extensions/feishu/src/media.test.ts rename to native-plugins/feishu/src/media.test.ts diff --git a/extensions/feishu/src/media.ts b/native-plugins/feishu/src/media.ts similarity index 100% rename from extensions/feishu/src/media.ts rename to native-plugins/feishu/src/media.ts diff --git a/extensions/feishu/src/mention.ts b/native-plugins/feishu/src/mention.ts similarity index 100% rename from extensions/feishu/src/mention.ts rename to native-plugins/feishu/src/mention.ts diff --git a/extensions/feishu/src/monitor.account.ts b/native-plugins/feishu/src/monitor.account.ts similarity index 100% rename from extensions/feishu/src/monitor.account.ts rename to native-plugins/feishu/src/monitor.account.ts diff --git a/extensions/feishu/src/monitor.acp-init-failure.lifecycle.test.ts b/native-plugins/feishu/src/monitor.acp-init-failure.lifecycle.test.ts similarity index 99% rename from extensions/feishu/src/monitor.acp-init-failure.lifecycle.test.ts rename to native-plugins/feishu/src/monitor.acp-init-failure.lifecycle.test.ts index d98bbec9e7c..096a19fab24 100644 --- a/extensions/feishu/src/monitor.acp-init-failure.lifecycle.test.ts +++ b/native-plugins/feishu/src/monitor.acp-init-failure.lifecycle.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { createPluginRuntimeMock } from "../../../test/helpers/extensions/plugin-runtime-mock.js"; +import { createPluginRuntimeMock } from "../../../test/helpers/native-plugins/plugin-runtime-mock.js"; import type { ClawdbotConfig, PluginRuntime, RuntimeEnv } from "../runtime-api.js"; import { monitorSingleAccount } from "./monitor.account.js"; import { setFeishuRuntime } from "./runtime.js"; diff --git a/extensions/feishu/src/monitor.bot-menu.lifecycle.test.ts b/native-plugins/feishu/src/monitor.bot-menu.lifecycle.test.ts similarity index 99% rename from extensions/feishu/src/monitor.bot-menu.lifecycle.test.ts rename to native-plugins/feishu/src/monitor.bot-menu.lifecycle.test.ts index e235af4d8ec..2a0b8d44954 100644 --- a/extensions/feishu/src/monitor.bot-menu.lifecycle.test.ts +++ b/native-plugins/feishu/src/monitor.bot-menu.lifecycle.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { createPluginRuntimeMock } from "../../../test/helpers/extensions/plugin-runtime-mock.js"; +import { createPluginRuntimeMock } from "../../../test/helpers/native-plugins/plugin-runtime-mock.js"; import type { ClawdbotConfig, PluginRuntime, RuntimeEnv } from "../runtime-api.js"; import { monitorSingleAccount } from "./monitor.account.js"; import { setFeishuRuntime } from "./runtime.js"; diff --git a/extensions/feishu/src/monitor.bot-menu.test.ts b/native-plugins/feishu/src/monitor.bot-menu.test.ts similarity index 98% rename from extensions/feishu/src/monitor.bot-menu.test.ts rename to native-plugins/feishu/src/monitor.bot-menu.test.ts index d3170757647..7235e2e7fa2 100644 --- a/extensions/feishu/src/monitor.bot-menu.test.ts +++ b/native-plugins/feishu/src/monitor.bot-menu.test.ts @@ -4,7 +4,7 @@ import { createInboundDebouncer, resolveInboundDebounceMs, } from "../../../src/auto-reply/inbound-debounce.js"; -import { createPluginRuntimeMock } from "../../../test/helpers/extensions/plugin-runtime-mock.js"; +import { createPluginRuntimeMock } from "../../../test/helpers/native-plugins/plugin-runtime-mock.js"; import type { ClawdbotConfig, RuntimeEnv } from "../runtime-api.js"; import { monitorSingleAccount } from "./monitor.account.js"; import { setFeishuRuntime } from "./runtime.js"; diff --git a/extensions/feishu/src/monitor.broadcast.reply-once.lifecycle.test.ts b/native-plugins/feishu/src/monitor.broadcast.reply-once.lifecycle.test.ts similarity index 99% rename from extensions/feishu/src/monitor.broadcast.reply-once.lifecycle.test.ts rename to native-plugins/feishu/src/monitor.broadcast.reply-once.lifecycle.test.ts index 839ea934454..c15e2a36a22 100644 --- a/extensions/feishu/src/monitor.broadcast.reply-once.lifecycle.test.ts +++ b/native-plugins/feishu/src/monitor.broadcast.reply-once.lifecycle.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { createPluginRuntimeMock } from "../../../test/helpers/extensions/plugin-runtime-mock.js"; +import { createPluginRuntimeMock } from "../../../test/helpers/native-plugins/plugin-runtime-mock.js"; import type { ClawdbotConfig, PluginRuntime, RuntimeEnv } from "../runtime-api.js"; import { monitorSingleAccount } from "./monitor.account.js"; import { setFeishuRuntime } from "./runtime.js"; diff --git a/extensions/feishu/src/monitor.card-action.lifecycle.test.ts b/native-plugins/feishu/src/monitor.card-action.lifecycle.test.ts similarity index 99% rename from extensions/feishu/src/monitor.card-action.lifecycle.test.ts rename to native-plugins/feishu/src/monitor.card-action.lifecycle.test.ts index c5908b29487..0192a6044e2 100644 --- a/extensions/feishu/src/monitor.card-action.lifecycle.test.ts +++ b/native-plugins/feishu/src/monitor.card-action.lifecycle.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { createPluginRuntimeMock } from "../../../test/helpers/extensions/plugin-runtime-mock.js"; +import { createPluginRuntimeMock } from "../../../test/helpers/native-plugins/plugin-runtime-mock.js"; import type { ClawdbotConfig, PluginRuntime, RuntimeEnv } from "../runtime-api.js"; import { resetProcessedFeishuCardActionTokensForTests } from "./card-action.js"; import { createFeishuCardInteractionEnvelope } from "./card-interaction.js"; diff --git a/extensions/feishu/src/monitor.reaction.lifecycle.test.ts b/native-plugins/feishu/src/monitor.reaction.lifecycle.test.ts similarity index 100% rename from extensions/feishu/src/monitor.reaction.lifecycle.test.ts rename to native-plugins/feishu/src/monitor.reaction.lifecycle.test.ts diff --git a/extensions/feishu/src/monitor.reaction.test.ts b/native-plugins/feishu/src/monitor.reaction.test.ts similarity index 99% rename from extensions/feishu/src/monitor.reaction.test.ts rename to native-plugins/feishu/src/monitor.reaction.test.ts index 5765577441f..ad9b64c7769 100644 --- a/extensions/feishu/src/monitor.reaction.test.ts +++ b/native-plugins/feishu/src/monitor.reaction.test.ts @@ -4,7 +4,7 @@ import { createInboundDebouncer, resolveInboundDebounceMs, } from "../../../src/auto-reply/inbound-debounce.js"; -import { createPluginRuntimeMock } from "../../../test/helpers/extensions/plugin-runtime-mock.js"; +import { createPluginRuntimeMock } from "../../../test/helpers/native-plugins/plugin-runtime-mock.js"; import type { ClawdbotConfig, RuntimeEnv } from "../runtime-api.js"; import { parseFeishuMessageEvent, type FeishuMessageEvent } from "./bot.js"; import * as dedup from "./dedup.js"; diff --git a/extensions/feishu/src/monitor.reply-once.lifecycle.test.ts b/native-plugins/feishu/src/monitor.reply-once.lifecycle.test.ts similarity index 99% rename from extensions/feishu/src/monitor.reply-once.lifecycle.test.ts rename to native-plugins/feishu/src/monitor.reply-once.lifecycle.test.ts index 4a965110613..7c9f2935708 100644 --- a/extensions/feishu/src/monitor.reply-once.lifecycle.test.ts +++ b/native-plugins/feishu/src/monitor.reply-once.lifecycle.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { createPluginRuntimeMock } from "../../../test/helpers/extensions/plugin-runtime-mock.js"; +import { createPluginRuntimeMock } from "../../../test/helpers/native-plugins/plugin-runtime-mock.js"; import type { ClawdbotConfig, PluginRuntime, RuntimeEnv } from "../runtime-api.js"; import { monitorSingleAccount } from "./monitor.account.js"; import { setFeishuRuntime } from "./runtime.js"; diff --git a/extensions/feishu/src/monitor.startup.test.ts b/native-plugins/feishu/src/monitor.startup.test.ts similarity index 100% rename from extensions/feishu/src/monitor.startup.test.ts rename to native-plugins/feishu/src/monitor.startup.test.ts diff --git a/extensions/feishu/src/monitor.startup.ts b/native-plugins/feishu/src/monitor.startup.ts similarity index 100% rename from extensions/feishu/src/monitor.startup.ts rename to native-plugins/feishu/src/monitor.startup.ts diff --git a/extensions/feishu/src/monitor.state.defaults.test.ts b/native-plugins/feishu/src/monitor.state.defaults.test.ts similarity index 100% rename from extensions/feishu/src/monitor.state.defaults.test.ts rename to native-plugins/feishu/src/monitor.state.defaults.test.ts diff --git a/extensions/feishu/src/monitor.state.ts b/native-plugins/feishu/src/monitor.state.ts similarity index 100% rename from extensions/feishu/src/monitor.state.ts rename to native-plugins/feishu/src/monitor.state.ts diff --git a/extensions/feishu/src/monitor.test-mocks.ts b/native-plugins/feishu/src/monitor.test-mocks.ts similarity index 100% rename from extensions/feishu/src/monitor.test-mocks.ts rename to native-plugins/feishu/src/monitor.test-mocks.ts diff --git a/extensions/feishu/src/monitor.transport.ts b/native-plugins/feishu/src/monitor.transport.ts similarity index 100% rename from extensions/feishu/src/monitor.transport.ts rename to native-plugins/feishu/src/monitor.transport.ts diff --git a/extensions/feishu/src/monitor.ts b/native-plugins/feishu/src/monitor.ts similarity index 100% rename from extensions/feishu/src/monitor.ts rename to native-plugins/feishu/src/monitor.ts diff --git a/extensions/feishu/src/monitor.webhook-e2e.test.ts b/native-plugins/feishu/src/monitor.webhook-e2e.test.ts similarity index 100% rename from extensions/feishu/src/monitor.webhook-e2e.test.ts rename to native-plugins/feishu/src/monitor.webhook-e2e.test.ts diff --git a/extensions/feishu/src/monitor.webhook-security.test.ts b/native-plugins/feishu/src/monitor.webhook-security.test.ts similarity index 100% rename from extensions/feishu/src/monitor.webhook-security.test.ts rename to native-plugins/feishu/src/monitor.webhook-security.test.ts diff --git a/extensions/feishu/src/monitor.webhook.test-helpers.ts b/native-plugins/feishu/src/monitor.webhook.test-helpers.ts similarity index 100% rename from extensions/feishu/src/monitor.webhook.test-helpers.ts rename to native-plugins/feishu/src/monitor.webhook.test-helpers.ts diff --git a/extensions/feishu/src/outbound.test.ts b/native-plugins/feishu/src/outbound.test.ts similarity index 100% rename from extensions/feishu/src/outbound.test.ts rename to native-plugins/feishu/src/outbound.test.ts diff --git a/extensions/feishu/src/outbound.ts b/native-plugins/feishu/src/outbound.ts similarity index 100% rename from extensions/feishu/src/outbound.ts rename to native-plugins/feishu/src/outbound.ts diff --git a/extensions/feishu/src/perm-schema.ts b/native-plugins/feishu/src/perm-schema.ts similarity index 100% rename from extensions/feishu/src/perm-schema.ts rename to native-plugins/feishu/src/perm-schema.ts diff --git a/extensions/feishu/src/perm.ts b/native-plugins/feishu/src/perm.ts similarity index 100% rename from extensions/feishu/src/perm.ts rename to native-plugins/feishu/src/perm.ts diff --git a/extensions/feishu/src/pins.ts b/native-plugins/feishu/src/pins.ts similarity index 100% rename from extensions/feishu/src/pins.ts rename to native-plugins/feishu/src/pins.ts diff --git a/extensions/feishu/src/policy.test.ts b/native-plugins/feishu/src/policy.test.ts similarity index 100% rename from extensions/feishu/src/policy.test.ts rename to native-plugins/feishu/src/policy.test.ts diff --git a/extensions/feishu/src/policy.ts b/native-plugins/feishu/src/policy.ts similarity index 100% rename from extensions/feishu/src/policy.ts rename to native-plugins/feishu/src/policy.ts diff --git a/extensions/feishu/src/post.test.ts b/native-plugins/feishu/src/post.test.ts similarity index 100% rename from extensions/feishu/src/post.test.ts rename to native-plugins/feishu/src/post.test.ts diff --git a/extensions/feishu/src/post.ts b/native-plugins/feishu/src/post.ts similarity index 100% rename from extensions/feishu/src/post.ts rename to native-plugins/feishu/src/post.ts diff --git a/extensions/feishu/src/probe.test.ts b/native-plugins/feishu/src/probe.test.ts similarity index 100% rename from extensions/feishu/src/probe.test.ts rename to native-plugins/feishu/src/probe.test.ts diff --git a/extensions/feishu/src/probe.ts b/native-plugins/feishu/src/probe.ts similarity index 100% rename from extensions/feishu/src/probe.ts rename to native-plugins/feishu/src/probe.ts diff --git a/extensions/feishu/src/reactions.ts b/native-plugins/feishu/src/reactions.ts similarity index 100% rename from extensions/feishu/src/reactions.ts rename to native-plugins/feishu/src/reactions.ts diff --git a/extensions/feishu/src/reply-dispatcher.test.ts b/native-plugins/feishu/src/reply-dispatcher.test.ts similarity index 100% rename from extensions/feishu/src/reply-dispatcher.test.ts rename to native-plugins/feishu/src/reply-dispatcher.test.ts diff --git a/extensions/feishu/src/reply-dispatcher.ts b/native-plugins/feishu/src/reply-dispatcher.ts similarity index 100% rename from extensions/feishu/src/reply-dispatcher.ts rename to native-plugins/feishu/src/reply-dispatcher.ts diff --git a/extensions/feishu/src/runtime.ts b/native-plugins/feishu/src/runtime.ts similarity index 100% rename from extensions/feishu/src/runtime.ts rename to native-plugins/feishu/src/runtime.ts diff --git a/extensions/feishu/src/secret-input.ts b/native-plugins/feishu/src/secret-input.ts similarity index 100% rename from extensions/feishu/src/secret-input.ts rename to native-plugins/feishu/src/secret-input.ts diff --git a/extensions/feishu/src/send-message.ts b/native-plugins/feishu/src/send-message.ts similarity index 100% rename from extensions/feishu/src/send-message.ts rename to native-plugins/feishu/src/send-message.ts diff --git a/extensions/feishu/src/send-result.ts b/native-plugins/feishu/src/send-result.ts similarity index 100% rename from extensions/feishu/src/send-result.ts rename to native-plugins/feishu/src/send-result.ts diff --git a/extensions/feishu/src/send-target.test.ts b/native-plugins/feishu/src/send-target.test.ts similarity index 100% rename from extensions/feishu/src/send-target.test.ts rename to native-plugins/feishu/src/send-target.test.ts diff --git a/extensions/feishu/src/send-target.ts b/native-plugins/feishu/src/send-target.ts similarity index 100% rename from extensions/feishu/src/send-target.ts rename to native-plugins/feishu/src/send-target.ts diff --git a/extensions/feishu/src/send.reply-fallback.test.ts b/native-plugins/feishu/src/send.reply-fallback.test.ts similarity index 100% rename from extensions/feishu/src/send.reply-fallback.test.ts rename to native-plugins/feishu/src/send.reply-fallback.test.ts diff --git a/extensions/feishu/src/send.test.ts b/native-plugins/feishu/src/send.test.ts similarity index 100% rename from extensions/feishu/src/send.test.ts rename to native-plugins/feishu/src/send.test.ts diff --git a/extensions/feishu/src/send.ts b/native-plugins/feishu/src/send.ts similarity index 100% rename from extensions/feishu/src/send.ts rename to native-plugins/feishu/src/send.ts diff --git a/extensions/feishu/src/session-route.ts b/native-plugins/feishu/src/session-route.ts similarity index 100% rename from extensions/feishu/src/session-route.ts rename to native-plugins/feishu/src/session-route.ts diff --git a/extensions/feishu/src/setup-core.ts b/native-plugins/feishu/src/setup-core.ts similarity index 100% rename from extensions/feishu/src/setup-core.ts rename to native-plugins/feishu/src/setup-core.ts diff --git a/extensions/feishu/src/setup-status.test.ts b/native-plugins/feishu/src/setup-status.test.ts similarity index 100% rename from extensions/feishu/src/setup-status.test.ts rename to native-plugins/feishu/src/setup-status.test.ts diff --git a/extensions/feishu/src/setup-surface.test.ts b/native-plugins/feishu/src/setup-surface.test.ts similarity index 100% rename from extensions/feishu/src/setup-surface.test.ts rename to native-plugins/feishu/src/setup-surface.test.ts diff --git a/extensions/feishu/src/setup-surface.ts b/native-plugins/feishu/src/setup-surface.ts similarity index 100% rename from extensions/feishu/src/setup-surface.ts rename to native-plugins/feishu/src/setup-surface.ts diff --git a/extensions/feishu/src/streaming-card.test.ts b/native-plugins/feishu/src/streaming-card.test.ts similarity index 100% rename from extensions/feishu/src/streaming-card.test.ts rename to native-plugins/feishu/src/streaming-card.test.ts diff --git a/extensions/feishu/src/streaming-card.ts b/native-plugins/feishu/src/streaming-card.ts similarity index 100% rename from extensions/feishu/src/streaming-card.ts rename to native-plugins/feishu/src/streaming-card.ts diff --git a/extensions/feishu/src/subagent-hooks.test.ts b/native-plugins/feishu/src/subagent-hooks.test.ts similarity index 99% rename from extensions/feishu/src/subagent-hooks.test.ts rename to native-plugins/feishu/src/subagent-hooks.test.ts index f46b8073488..05ca6670e1a 100644 --- a/extensions/feishu/src/subagent-hooks.test.ts +++ b/native-plugins/feishu/src/subagent-hooks.test.ts @@ -2,7 +2,7 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; import { getRequiredHookHandler, registerHookHandlersForTest, -} from "../../../test/helpers/extensions/subagent-hooks.js"; +} from "../../../test/helpers/native-plugins/subagent-hooks.js"; import type { OpenClawPluginApi } from "../runtime-api.js"; import { registerFeishuSubagentHooks } from "./subagent-hooks.js"; import { diff --git a/extensions/feishu/src/subagent-hooks.ts b/native-plugins/feishu/src/subagent-hooks.ts similarity index 100% rename from extensions/feishu/src/subagent-hooks.ts rename to native-plugins/feishu/src/subagent-hooks.ts diff --git a/extensions/feishu/src/targets.test.ts b/native-plugins/feishu/src/targets.test.ts similarity index 100% rename from extensions/feishu/src/targets.test.ts rename to native-plugins/feishu/src/targets.test.ts diff --git a/extensions/feishu/src/targets.ts b/native-plugins/feishu/src/targets.ts similarity index 100% rename from extensions/feishu/src/targets.ts rename to native-plugins/feishu/src/targets.ts diff --git a/extensions/feishu/src/thread-bindings.test.ts b/native-plugins/feishu/src/thread-bindings.test.ts similarity index 100% rename from extensions/feishu/src/thread-bindings.test.ts rename to native-plugins/feishu/src/thread-bindings.test.ts diff --git a/extensions/feishu/src/thread-bindings.ts b/native-plugins/feishu/src/thread-bindings.ts similarity index 100% rename from extensions/feishu/src/thread-bindings.ts rename to native-plugins/feishu/src/thread-bindings.ts diff --git a/extensions/feishu/src/tool-account-routing.test.ts b/native-plugins/feishu/src/tool-account-routing.test.ts similarity index 100% rename from extensions/feishu/src/tool-account-routing.test.ts rename to native-plugins/feishu/src/tool-account-routing.test.ts diff --git a/extensions/feishu/src/tool-account.ts b/native-plugins/feishu/src/tool-account.ts similarity index 100% rename from extensions/feishu/src/tool-account.ts rename to native-plugins/feishu/src/tool-account.ts diff --git a/extensions/feishu/src/tool-factory-test-harness.ts b/native-plugins/feishu/src/tool-factory-test-harness.ts similarity index 100% rename from extensions/feishu/src/tool-factory-test-harness.ts rename to native-plugins/feishu/src/tool-factory-test-harness.ts diff --git a/extensions/feishu/src/tool-result.test.ts b/native-plugins/feishu/src/tool-result.test.ts similarity index 100% rename from extensions/feishu/src/tool-result.test.ts rename to native-plugins/feishu/src/tool-result.test.ts diff --git a/extensions/feishu/src/tool-result.ts b/native-plugins/feishu/src/tool-result.ts similarity index 100% rename from extensions/feishu/src/tool-result.ts rename to native-plugins/feishu/src/tool-result.ts diff --git a/extensions/feishu/src/tools-config.test.ts b/native-plugins/feishu/src/tools-config.test.ts similarity index 100% rename from extensions/feishu/src/tools-config.test.ts rename to native-plugins/feishu/src/tools-config.test.ts diff --git a/extensions/feishu/src/tools-config.ts b/native-plugins/feishu/src/tools-config.ts similarity index 100% rename from extensions/feishu/src/tools-config.ts rename to native-plugins/feishu/src/tools-config.ts diff --git a/extensions/feishu/src/types.ts b/native-plugins/feishu/src/types.ts similarity index 100% rename from extensions/feishu/src/types.ts rename to native-plugins/feishu/src/types.ts diff --git a/extensions/feishu/src/typing.test.ts b/native-plugins/feishu/src/typing.test.ts similarity index 100% rename from extensions/feishu/src/typing.test.ts rename to native-plugins/feishu/src/typing.test.ts diff --git a/extensions/feishu/src/typing.ts b/native-plugins/feishu/src/typing.ts similarity index 100% rename from extensions/feishu/src/typing.ts rename to native-plugins/feishu/src/typing.ts diff --git a/extensions/feishu/src/wiki-schema.ts b/native-plugins/feishu/src/wiki-schema.ts similarity index 100% rename from extensions/feishu/src/wiki-schema.ts rename to native-plugins/feishu/src/wiki-schema.ts diff --git a/extensions/feishu/src/wiki.ts b/native-plugins/feishu/src/wiki.ts similarity index 100% rename from extensions/feishu/src/wiki.ts rename to native-plugins/feishu/src/wiki.ts diff --git a/extensions/firecrawl/index.test.ts b/native-plugins/firecrawl/index.test.ts similarity index 100% rename from extensions/firecrawl/index.test.ts rename to native-plugins/firecrawl/index.test.ts diff --git a/extensions/firecrawl/index.ts b/native-plugins/firecrawl/index.ts similarity index 100% rename from extensions/firecrawl/index.ts rename to native-plugins/firecrawl/index.ts diff --git a/extensions/firecrawl/openclaw.plugin.json b/native-plugins/firecrawl/openclaw.plugin.json similarity index 100% rename from extensions/firecrawl/openclaw.plugin.json rename to native-plugins/firecrawl/openclaw.plugin.json diff --git a/extensions/firecrawl/package.json b/native-plugins/firecrawl/package.json similarity index 90% rename from extensions/firecrawl/package.json rename to native-plugins/firecrawl/package.json index e891b8293ba..cc327e421b5 100644 --- a/extensions/firecrawl/package.json +++ b/native-plugins/firecrawl/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Firecrawl plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/firecrawl/src/config.ts b/native-plugins/firecrawl/src/config.ts similarity index 100% rename from extensions/firecrawl/src/config.ts rename to native-plugins/firecrawl/src/config.ts diff --git a/extensions/firecrawl/src/firecrawl-client.ts b/native-plugins/firecrawl/src/firecrawl-client.ts similarity index 100% rename from extensions/firecrawl/src/firecrawl-client.ts rename to native-plugins/firecrawl/src/firecrawl-client.ts diff --git a/extensions/firecrawl/src/firecrawl-scrape-tool.ts b/native-plugins/firecrawl/src/firecrawl-scrape-tool.ts similarity index 100% rename from extensions/firecrawl/src/firecrawl-scrape-tool.ts rename to native-plugins/firecrawl/src/firecrawl-scrape-tool.ts diff --git a/extensions/firecrawl/src/firecrawl-search-provider.ts b/native-plugins/firecrawl/src/firecrawl-search-provider.ts similarity index 100% rename from extensions/firecrawl/src/firecrawl-search-provider.ts rename to native-plugins/firecrawl/src/firecrawl-search-provider.ts diff --git a/extensions/firecrawl/src/firecrawl-search-tool.ts b/native-plugins/firecrawl/src/firecrawl-search-tool.ts similarity index 100% rename from extensions/firecrawl/src/firecrawl-search-tool.ts rename to native-plugins/firecrawl/src/firecrawl-search-tool.ts diff --git a/extensions/github-copilot/index.ts b/native-plugins/github-copilot/index.ts similarity index 100% rename from extensions/github-copilot/index.ts rename to native-plugins/github-copilot/index.ts diff --git a/extensions/github-copilot/openclaw.plugin.json b/native-plugins/github-copilot/openclaw.plugin.json similarity index 100% rename from extensions/github-copilot/openclaw.plugin.json rename to native-plugins/github-copilot/openclaw.plugin.json diff --git a/extensions/github-copilot/package.json b/native-plugins/github-copilot/package.json similarity index 91% rename from extensions/github-copilot/package.json rename to native-plugins/github-copilot/package.json index 45140022168..9d6c1221ba0 100644 --- a/extensions/github-copilot/package.json +++ b/native-plugins/github-copilot/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw GitHub Copilot provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/github-copilot/token.test.ts b/native-plugins/github-copilot/token.test.ts similarity index 100% rename from extensions/github-copilot/token.test.ts rename to native-plugins/github-copilot/token.test.ts diff --git a/extensions/github-copilot/token.ts b/native-plugins/github-copilot/token.ts similarity index 100% rename from extensions/github-copilot/token.ts rename to native-plugins/github-copilot/token.ts diff --git a/extensions/github-copilot/usage.test.ts b/native-plugins/github-copilot/usage.test.ts similarity index 97% rename from extensions/github-copilot/usage.test.ts rename to native-plugins/github-copilot/usage.test.ts index f0687c33b0a..77aec0676f3 100644 --- a/extensions/github-copilot/usage.test.ts +++ b/native-plugins/github-copilot/usage.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from "vitest"; import { createProviderUsageFetch, makeResponse, -} from "../../test/helpers/extensions/provider-usage-fetch.js"; +} from "../../test/helpers/native-plugins/provider-usage-fetch.js"; import { fetchCopilotUsage } from "./usage.js"; describe("fetchCopilotUsage", () => { diff --git a/extensions/github-copilot/usage.ts b/native-plugins/github-copilot/usage.ts similarity index 100% rename from extensions/github-copilot/usage.ts rename to native-plugins/github-copilot/usage.ts diff --git a/extensions/google/gemini-cli-provider.ts b/native-plugins/google/gemini-cli-provider.ts similarity index 100% rename from extensions/google/gemini-cli-provider.ts rename to native-plugins/google/gemini-cli-provider.ts diff --git a/extensions/google/index.ts b/native-plugins/google/index.ts similarity index 100% rename from extensions/google/index.ts rename to native-plugins/google/index.ts diff --git a/extensions/google/media-understanding-provider.ts b/native-plugins/google/media-understanding-provider.ts similarity index 100% rename from extensions/google/media-understanding-provider.ts rename to native-plugins/google/media-understanding-provider.ts diff --git a/extensions/google/oauth.credentials.ts b/native-plugins/google/oauth.credentials.ts similarity index 100% rename from extensions/google/oauth.credentials.ts rename to native-plugins/google/oauth.credentials.ts diff --git a/extensions/google/oauth.flow.ts b/native-plugins/google/oauth.flow.ts similarity index 100% rename from extensions/google/oauth.flow.ts rename to native-plugins/google/oauth.flow.ts diff --git a/extensions/google/oauth.http.ts b/native-plugins/google/oauth.http.ts similarity index 100% rename from extensions/google/oauth.http.ts rename to native-plugins/google/oauth.http.ts diff --git a/extensions/google/oauth.project.ts b/native-plugins/google/oauth.project.ts similarity index 100% rename from extensions/google/oauth.project.ts rename to native-plugins/google/oauth.project.ts diff --git a/extensions/google/oauth.runtime.ts b/native-plugins/google/oauth.runtime.ts similarity index 100% rename from extensions/google/oauth.runtime.ts rename to native-plugins/google/oauth.runtime.ts diff --git a/extensions/google/oauth.shared.ts b/native-plugins/google/oauth.shared.ts similarity index 100% rename from extensions/google/oauth.shared.ts rename to native-plugins/google/oauth.shared.ts diff --git a/extensions/google/oauth.test.ts b/native-plugins/google/oauth.test.ts similarity index 100% rename from extensions/google/oauth.test.ts rename to native-plugins/google/oauth.test.ts diff --git a/extensions/google/oauth.token.ts b/native-plugins/google/oauth.token.ts similarity index 100% rename from extensions/google/oauth.token.ts rename to native-plugins/google/oauth.token.ts diff --git a/extensions/google/oauth.ts b/native-plugins/google/oauth.ts similarity index 100% rename from extensions/google/oauth.ts rename to native-plugins/google/oauth.ts diff --git a/extensions/google/openclaw.plugin.json b/native-plugins/google/openclaw.plugin.json similarity index 100% rename from extensions/google/openclaw.plugin.json rename to native-plugins/google/openclaw.plugin.json diff --git a/extensions/google/package.json b/native-plugins/google/package.json similarity index 90% rename from extensions/google/package.json rename to native-plugins/google/package.json index 64c04bc67da..1ee976ac084 100644 --- a/extensions/google/package.json +++ b/native-plugins/google/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Google plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/google/provider-models.ts b/native-plugins/google/provider-models.ts similarity index 100% rename from extensions/google/provider-models.ts rename to native-plugins/google/provider-models.ts diff --git a/extensions/google/runtime-api.ts b/native-plugins/google/runtime-api.ts similarity index 100% rename from extensions/google/runtime-api.ts rename to native-plugins/google/runtime-api.ts diff --git a/extensions/google/src/gemini-web-search-provider.ts b/native-plugins/google/src/gemini-web-search-provider.ts similarity index 100% rename from extensions/google/src/gemini-web-search-provider.ts rename to native-plugins/google/src/gemini-web-search-provider.ts diff --git a/extensions/googlechat/api.ts b/native-plugins/googlechat/api.ts similarity index 100% rename from extensions/googlechat/api.ts rename to native-plugins/googlechat/api.ts diff --git a/extensions/googlechat/index.ts b/native-plugins/googlechat/index.ts similarity index 100% rename from extensions/googlechat/index.ts rename to native-plugins/googlechat/index.ts diff --git a/extensions/googlechat/openclaw.plugin.json b/native-plugins/googlechat/openclaw.plugin.json similarity index 100% rename from extensions/googlechat/openclaw.plugin.json rename to native-plugins/googlechat/openclaw.plugin.json diff --git a/extensions/googlechat/package.json b/native-plugins/googlechat/package.json similarity index 93% rename from extensions/googlechat/package.json rename to native-plugins/googlechat/package.json index b38a23273f7..bcd9368ad6b 100644 --- a/extensions/googlechat/package.json +++ b/native-plugins/googlechat/package.json @@ -16,7 +16,7 @@ } }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ], "setupEntry": "./setup-entry.ts", @@ -36,7 +36,7 @@ }, "install": { "npmSpec": "@openclaw/googlechat", - "localPath": "extensions/googlechat", + "localPath": "native-plugins/googlechat", "defaultChoice": "npm" } } diff --git a/extensions/googlechat/runtime-api.ts b/native-plugins/googlechat/runtime-api.ts similarity index 100% rename from extensions/googlechat/runtime-api.ts rename to native-plugins/googlechat/runtime-api.ts diff --git a/extensions/googlechat/setup-entry.ts b/native-plugins/googlechat/setup-entry.ts similarity index 100% rename from extensions/googlechat/setup-entry.ts rename to native-plugins/googlechat/setup-entry.ts diff --git a/extensions/googlechat/src/accounts.test.ts b/native-plugins/googlechat/src/accounts.test.ts similarity index 100% rename from extensions/googlechat/src/accounts.test.ts rename to native-plugins/googlechat/src/accounts.test.ts diff --git a/extensions/googlechat/src/accounts.ts b/native-plugins/googlechat/src/accounts.ts similarity index 100% rename from extensions/googlechat/src/accounts.ts rename to native-plugins/googlechat/src/accounts.ts diff --git a/extensions/googlechat/src/actions.ts b/native-plugins/googlechat/src/actions.ts similarity index 100% rename from extensions/googlechat/src/actions.ts rename to native-plugins/googlechat/src/actions.ts diff --git a/extensions/googlechat/src/api.test.ts b/native-plugins/googlechat/src/api.test.ts similarity index 100% rename from extensions/googlechat/src/api.test.ts rename to native-plugins/googlechat/src/api.test.ts diff --git a/extensions/googlechat/src/api.ts b/native-plugins/googlechat/src/api.ts similarity index 100% rename from extensions/googlechat/src/api.ts rename to native-plugins/googlechat/src/api.ts diff --git a/extensions/googlechat/src/auth.test.ts b/native-plugins/googlechat/src/auth.test.ts similarity index 100% rename from extensions/googlechat/src/auth.test.ts rename to native-plugins/googlechat/src/auth.test.ts diff --git a/extensions/googlechat/src/auth.ts b/native-plugins/googlechat/src/auth.ts similarity index 100% rename from extensions/googlechat/src/auth.ts rename to native-plugins/googlechat/src/auth.ts diff --git a/extensions/googlechat/src/channel.directory.test.ts b/native-plugins/googlechat/src/channel.directory.test.ts similarity index 96% rename from extensions/googlechat/src/channel.directory.test.ts rename to native-plugins/googlechat/src/channel.directory.test.ts index d7b78059dfe..d4cac4d3442 100644 --- a/extensions/googlechat/src/channel.directory.test.ts +++ b/native-plugins/googlechat/src/channel.directory.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from "vitest"; import { createDirectoryTestRuntime, expectDirectorySurface, -} from "../../../test/helpers/extensions/directory.ts"; +} from "../../../test/helpers/native-plugins/directory.ts"; import type { OpenClawConfig } from "../runtime-api.js"; import { googlechatPlugin } from "./channel.js"; diff --git a/extensions/googlechat/src/channel.outbound.test.ts b/native-plugins/googlechat/src/channel.outbound.test.ts similarity index 100% rename from extensions/googlechat/src/channel.outbound.test.ts rename to native-plugins/googlechat/src/channel.outbound.test.ts diff --git a/extensions/googlechat/src/channel.runtime.ts b/native-plugins/googlechat/src/channel.runtime.ts similarity index 100% rename from extensions/googlechat/src/channel.runtime.ts rename to native-plugins/googlechat/src/channel.runtime.ts diff --git a/extensions/googlechat/src/channel.startup.test.ts b/native-plugins/googlechat/src/channel.startup.test.ts similarity index 96% rename from extensions/googlechat/src/channel.startup.test.ts rename to native-plugins/googlechat/src/channel.startup.test.ts index 76700e543ad..8979e352e3e 100644 --- a/extensions/googlechat/src/channel.startup.test.ts +++ b/native-plugins/googlechat/src/channel.startup.test.ts @@ -3,7 +3,7 @@ import { abortStartedAccount, expectPendingUntilAbort, startAccountAndTrackLifecycle, -} from "../../../test/helpers/extensions/start-account-lifecycle.js"; +} from "../../../test/helpers/native-plugins/start-account-lifecycle.js"; import type { ChannelAccountSnapshot } from "../runtime-api.js"; import type { ResolvedGoogleChatAccount } from "./accounts.js"; diff --git a/extensions/googlechat/src/channel.ts b/native-plugins/googlechat/src/channel.ts similarity index 99% rename from extensions/googlechat/src/channel.ts rename to native-plugins/googlechat/src/channel.ts index fc4cf489928..f7451324960 100644 --- a/extensions/googlechat/src/channel.ts +++ b/native-plugins/googlechat/src/channel.ts @@ -19,8 +19,8 @@ import { listResolvedDirectoryGroupEntriesFromMapKeys, listResolvedDirectoryUserEntriesFromAllowFrom, } from "openclaw/plugin-sdk/directory-runtime"; -import { buildPassiveProbedChannelStatusSummary } from "openclaw/plugin-sdk/extension-shared"; import { createLazyRuntimeNamedExport } from "openclaw/plugin-sdk/lazy-runtime"; +import { buildPassiveProbedChannelStatusSummary } from "openclaw/plugin-sdk/native-plugin-shared"; import { buildComputedAccountStatusSnapshot, buildChannelConfigSchema, diff --git a/extensions/googlechat/src/config-schema.ts b/native-plugins/googlechat/src/config-schema.ts similarity index 100% rename from extensions/googlechat/src/config-schema.ts rename to native-plugins/googlechat/src/config-schema.ts diff --git a/extensions/googlechat/src/group-policy.test.ts b/native-plugins/googlechat/src/group-policy.test.ts similarity index 100% rename from extensions/googlechat/src/group-policy.test.ts rename to native-plugins/googlechat/src/group-policy.test.ts diff --git a/extensions/googlechat/src/group-policy.ts b/native-plugins/googlechat/src/group-policy.ts similarity index 100% rename from extensions/googlechat/src/group-policy.ts rename to native-plugins/googlechat/src/group-policy.ts diff --git a/extensions/googlechat/src/monitor-access.ts b/native-plugins/googlechat/src/monitor-access.ts similarity index 100% rename from extensions/googlechat/src/monitor-access.ts rename to native-plugins/googlechat/src/monitor-access.ts diff --git a/extensions/googlechat/src/monitor-types.ts b/native-plugins/googlechat/src/monitor-types.ts similarity index 100% rename from extensions/googlechat/src/monitor-types.ts rename to native-plugins/googlechat/src/monitor-types.ts diff --git a/extensions/googlechat/src/monitor-webhook.ts b/native-plugins/googlechat/src/monitor-webhook.ts similarity index 100% rename from extensions/googlechat/src/monitor-webhook.ts rename to native-plugins/googlechat/src/monitor-webhook.ts diff --git a/extensions/googlechat/src/monitor.test.ts b/native-plugins/googlechat/src/monitor.test.ts similarity index 100% rename from extensions/googlechat/src/monitor.test.ts rename to native-plugins/googlechat/src/monitor.test.ts diff --git a/extensions/googlechat/src/monitor.ts b/native-plugins/googlechat/src/monitor.ts similarity index 100% rename from extensions/googlechat/src/monitor.ts rename to native-plugins/googlechat/src/monitor.ts diff --git a/extensions/googlechat/src/monitor.webhook-routing.test.ts b/native-plugins/googlechat/src/monitor.webhook-routing.test.ts similarity index 99% rename from extensions/googlechat/src/monitor.webhook-routing.test.ts rename to native-plugins/googlechat/src/monitor.webhook-routing.test.ts index 3f1800919a7..a4d0ea1afd0 100644 --- a/extensions/googlechat/src/monitor.webhook-routing.test.ts +++ b/native-plugins/googlechat/src/monitor.webhook-routing.test.ts @@ -3,7 +3,7 @@ import type { IncomingMessage } from "node:http"; import { afterEach, describe, expect, it, vi } from "vitest"; import { createEmptyPluginRegistry } from "../../../src/plugins/registry.js"; import { setActivePluginRegistry } from "../../../src/plugins/runtime.js"; -import { createMockServerResponse } from "../../../test/helpers/extensions/mock-http-response.js"; +import { createMockServerResponse } from "../../../test/helpers/native-plugins/mock-http-response.js"; import type { OpenClawConfig, PluginRuntime } from "../runtime-api.js"; import type { ResolvedGoogleChatAccount } from "./accounts.js"; import { verifyGoogleChatRequest } from "./auth.js"; diff --git a/extensions/googlechat/src/resolve-target.test.ts b/native-plugins/googlechat/src/resolve-target.test.ts similarity index 100% rename from extensions/googlechat/src/resolve-target.test.ts rename to native-plugins/googlechat/src/resolve-target.test.ts diff --git a/extensions/googlechat/src/runtime.ts b/native-plugins/googlechat/src/runtime.ts similarity index 100% rename from extensions/googlechat/src/runtime.ts rename to native-plugins/googlechat/src/runtime.ts diff --git a/extensions/googlechat/src/setup-core.ts b/native-plugins/googlechat/src/setup-core.ts similarity index 100% rename from extensions/googlechat/src/setup-core.ts rename to native-plugins/googlechat/src/setup-core.ts diff --git a/extensions/googlechat/src/setup-surface.test.ts b/native-plugins/googlechat/src/setup-surface.test.ts similarity index 92% rename from extensions/googlechat/src/setup-surface.test.ts rename to native-plugins/googlechat/src/setup-surface.test.ts index 9570bb1848b..a9ad9554b95 100644 --- a/extensions/googlechat/src/setup-surface.test.ts +++ b/native-plugins/googlechat/src/setup-surface.test.ts @@ -1,10 +1,10 @@ import { describe, expect, it, vi } from "vitest"; import { buildChannelSetupWizardAdapterFromSetupWizard } from "../../../src/channels/plugins/setup-wizard.js"; -import { createRuntimeEnv } from "../../../test/helpers/extensions/runtime-env.js"; +import { createRuntimeEnv } from "../../../test/helpers/native-plugins/runtime-env.js"; import { createTestWizardPrompter, type WizardPrompter, -} from "../../../test/helpers/extensions/setup-wizard.js"; +} from "../../../test/helpers/native-plugins/setup-wizard.js"; import type { OpenClawConfig } from "../runtime-api.js"; import { googlechatPlugin } from "./channel.js"; diff --git a/extensions/googlechat/src/setup-surface.ts b/native-plugins/googlechat/src/setup-surface.ts similarity index 100% rename from extensions/googlechat/src/setup-surface.ts rename to native-plugins/googlechat/src/setup-surface.ts diff --git a/extensions/googlechat/src/targets.test.ts b/native-plugins/googlechat/src/targets.test.ts similarity index 100% rename from extensions/googlechat/src/targets.test.ts rename to native-plugins/googlechat/src/targets.test.ts diff --git a/extensions/googlechat/src/targets.ts b/native-plugins/googlechat/src/targets.ts similarity index 100% rename from extensions/googlechat/src/targets.ts rename to native-plugins/googlechat/src/targets.ts diff --git a/extensions/googlechat/src/types.config.ts b/native-plugins/googlechat/src/types.config.ts similarity index 100% rename from extensions/googlechat/src/types.config.ts rename to native-plugins/googlechat/src/types.config.ts diff --git a/extensions/googlechat/src/types.ts b/native-plugins/googlechat/src/types.ts similarity index 100% rename from extensions/googlechat/src/types.ts rename to native-plugins/googlechat/src/types.ts diff --git a/extensions/huggingface/index.ts b/native-plugins/huggingface/index.ts similarity index 100% rename from extensions/huggingface/index.ts rename to native-plugins/huggingface/index.ts diff --git a/extensions/huggingface/onboard.ts b/native-plugins/huggingface/onboard.ts similarity index 100% rename from extensions/huggingface/onboard.ts rename to native-plugins/huggingface/onboard.ts diff --git a/extensions/huggingface/openclaw.plugin.json b/native-plugins/huggingface/openclaw.plugin.json similarity index 100% rename from extensions/huggingface/openclaw.plugin.json rename to native-plugins/huggingface/openclaw.plugin.json diff --git a/extensions/huggingface/package.json b/native-plugins/huggingface/package.json similarity index 91% rename from extensions/huggingface/package.json rename to native-plugins/huggingface/package.json index 7e58582f4f9..744a4f79c1a 100644 --- a/extensions/huggingface/package.json +++ b/native-plugins/huggingface/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Hugging Face provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/huggingface/provider-catalog.ts b/native-plugins/huggingface/provider-catalog.ts similarity index 100% rename from extensions/huggingface/provider-catalog.ts rename to native-plugins/huggingface/provider-catalog.ts diff --git a/extensions/imessage/api.ts b/native-plugins/imessage/api.ts similarity index 100% rename from extensions/imessage/api.ts rename to native-plugins/imessage/api.ts diff --git a/extensions/imessage/index.ts b/native-plugins/imessage/index.ts similarity index 100% rename from extensions/imessage/index.ts rename to native-plugins/imessage/index.ts diff --git a/extensions/imessage/openclaw.plugin.json b/native-plugins/imessage/openclaw.plugin.json similarity index 100% rename from extensions/imessage/openclaw.plugin.json rename to native-plugins/imessage/openclaw.plugin.json diff --git a/extensions/imessage/package.json b/native-plugins/imessage/package.json similarity index 96% rename from extensions/imessage/package.json rename to native-plugins/imessage/package.json index fa0c2b12787..898d31f9f38 100644 --- a/extensions/imessage/package.json +++ b/native-plugins/imessage/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw iMessage channel plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ], "setupEntry": "./setup-entry.ts", diff --git a/extensions/imessage/runtime-api.ts b/native-plugins/imessage/runtime-api.ts similarity index 100% rename from extensions/imessage/runtime-api.ts rename to native-plugins/imessage/runtime-api.ts diff --git a/extensions/imessage/setup-entry.ts b/native-plugins/imessage/setup-entry.ts similarity index 100% rename from extensions/imessage/setup-entry.ts rename to native-plugins/imessage/setup-entry.ts diff --git a/extensions/imessage/src/accounts.ts b/native-plugins/imessage/src/accounts.ts similarity index 100% rename from extensions/imessage/src/accounts.ts rename to native-plugins/imessage/src/accounts.ts diff --git a/extensions/imessage/src/channel.outbound.test.ts b/native-plugins/imessage/src/channel.outbound.test.ts similarity index 100% rename from extensions/imessage/src/channel.outbound.test.ts rename to native-plugins/imessage/src/channel.outbound.test.ts diff --git a/extensions/imessage/src/channel.runtime.ts b/native-plugins/imessage/src/channel.runtime.ts similarity index 100% rename from extensions/imessage/src/channel.runtime.ts rename to native-plugins/imessage/src/channel.runtime.ts diff --git a/extensions/imessage/src/channel.setup.ts b/native-plugins/imessage/src/channel.setup.ts similarity index 100% rename from extensions/imessage/src/channel.setup.ts rename to native-plugins/imessage/src/channel.setup.ts diff --git a/extensions/imessage/src/channel.ts b/native-plugins/imessage/src/channel.ts similarity index 99% rename from extensions/imessage/src/channel.ts rename to native-plugins/imessage/src/channel.ts index d084ee92a15..462e68e0db9 100644 --- a/extensions/imessage/src/channel.ts +++ b/native-plugins/imessage/src/channel.ts @@ -4,8 +4,8 @@ import { resolveOutboundSendDep, } from "openclaw/plugin-sdk/channel-runtime"; import { buildOutboundBaseSessionKey } from "openclaw/plugin-sdk/core"; -import { buildPassiveProbedChannelStatusSummary } from "openclaw/plugin-sdk/extension-shared"; import { createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime"; +import { buildPassiveProbedChannelStatusSummary } from "openclaw/plugin-sdk/native-plugin-shared"; import { type RoutePeer } from "openclaw/plugin-sdk/routing"; import { collectStatusIssuesFromLastError, diff --git a/extensions/imessage/src/client.ts b/native-plugins/imessage/src/client.ts similarity index 100% rename from extensions/imessage/src/client.ts rename to native-plugins/imessage/src/client.ts diff --git a/extensions/imessage/src/config-schema.ts b/native-plugins/imessage/src/config-schema.ts similarity index 100% rename from extensions/imessage/src/config-schema.ts rename to native-plugins/imessage/src/config-schema.ts diff --git a/extensions/imessage/src/constants.ts b/native-plugins/imessage/src/constants.ts similarity index 100% rename from extensions/imessage/src/constants.ts rename to native-plugins/imessage/src/constants.ts diff --git a/extensions/imessage/src/group-policy.test.ts b/native-plugins/imessage/src/group-policy.test.ts similarity index 100% rename from extensions/imessage/src/group-policy.test.ts rename to native-plugins/imessage/src/group-policy.test.ts diff --git a/extensions/imessage/src/group-policy.ts b/native-plugins/imessage/src/group-policy.ts similarity index 100% rename from extensions/imessage/src/group-policy.ts rename to native-plugins/imessage/src/group-policy.ts diff --git a/extensions/imessage/src/monitor.gating.test.ts b/native-plugins/imessage/src/monitor.gating.test.ts similarity index 100% rename from extensions/imessage/src/monitor.gating.test.ts rename to native-plugins/imessage/src/monitor.gating.test.ts diff --git a/extensions/imessage/src/monitor.shutdown.unhandled-rejection.test.ts b/native-plugins/imessage/src/monitor.shutdown.unhandled-rejection.test.ts similarity index 100% rename from extensions/imessage/src/monitor.shutdown.unhandled-rejection.test.ts rename to native-plugins/imessage/src/monitor.shutdown.unhandled-rejection.test.ts diff --git a/extensions/imessage/src/monitor.ts b/native-plugins/imessage/src/monitor.ts similarity index 100% rename from extensions/imessage/src/monitor.ts rename to native-plugins/imessage/src/monitor.ts diff --git a/extensions/imessage/src/monitor/abort-handler.ts b/native-plugins/imessage/src/monitor/abort-handler.ts similarity index 100% rename from extensions/imessage/src/monitor/abort-handler.ts rename to native-plugins/imessage/src/monitor/abort-handler.ts diff --git a/extensions/imessage/src/monitor/deliver.test.ts b/native-plugins/imessage/src/monitor/deliver.test.ts similarity index 100% rename from extensions/imessage/src/monitor/deliver.test.ts rename to native-plugins/imessage/src/monitor/deliver.test.ts diff --git a/extensions/imessage/src/monitor/deliver.ts b/native-plugins/imessage/src/monitor/deliver.ts similarity index 100% rename from extensions/imessage/src/monitor/deliver.ts rename to native-plugins/imessage/src/monitor/deliver.ts diff --git a/extensions/imessage/src/monitor/echo-cache.ts b/native-plugins/imessage/src/monitor/echo-cache.ts similarity index 100% rename from extensions/imessage/src/monitor/echo-cache.ts rename to native-plugins/imessage/src/monitor/echo-cache.ts diff --git a/extensions/imessage/src/monitor/inbound-processing.test.ts b/native-plugins/imessage/src/monitor/inbound-processing.test.ts similarity index 100% rename from extensions/imessage/src/monitor/inbound-processing.test.ts rename to native-plugins/imessage/src/monitor/inbound-processing.test.ts diff --git a/extensions/imessage/src/monitor/inbound-processing.ts b/native-plugins/imessage/src/monitor/inbound-processing.ts similarity index 100% rename from extensions/imessage/src/monitor/inbound-processing.ts rename to native-plugins/imessage/src/monitor/inbound-processing.ts diff --git a/extensions/imessage/src/monitor/loop-rate-limiter.test.ts b/native-plugins/imessage/src/monitor/loop-rate-limiter.test.ts similarity index 100% rename from extensions/imessage/src/monitor/loop-rate-limiter.test.ts rename to native-plugins/imessage/src/monitor/loop-rate-limiter.test.ts diff --git a/extensions/imessage/src/monitor/loop-rate-limiter.ts b/native-plugins/imessage/src/monitor/loop-rate-limiter.ts similarity index 100% rename from extensions/imessage/src/monitor/loop-rate-limiter.ts rename to native-plugins/imessage/src/monitor/loop-rate-limiter.ts diff --git a/extensions/imessage/src/monitor/monitor-provider.echo-cache.test.ts b/native-plugins/imessage/src/monitor/monitor-provider.echo-cache.test.ts similarity index 100% rename from extensions/imessage/src/monitor/monitor-provider.echo-cache.test.ts rename to native-plugins/imessage/src/monitor/monitor-provider.echo-cache.test.ts diff --git a/extensions/imessage/src/monitor/monitor-provider.ts b/native-plugins/imessage/src/monitor/monitor-provider.ts similarity index 100% rename from extensions/imessage/src/monitor/monitor-provider.ts rename to native-plugins/imessage/src/monitor/monitor-provider.ts diff --git a/extensions/imessage/src/monitor/parse-notification.ts b/native-plugins/imessage/src/monitor/parse-notification.ts similarity index 100% rename from extensions/imessage/src/monitor/parse-notification.ts rename to native-plugins/imessage/src/monitor/parse-notification.ts diff --git a/extensions/imessage/src/monitor/reflection-guard.test.ts b/native-plugins/imessage/src/monitor/reflection-guard.test.ts similarity index 100% rename from extensions/imessage/src/monitor/reflection-guard.test.ts rename to native-plugins/imessage/src/monitor/reflection-guard.test.ts diff --git a/extensions/imessage/src/monitor/reflection-guard.ts b/native-plugins/imessage/src/monitor/reflection-guard.ts similarity index 100% rename from extensions/imessage/src/monitor/reflection-guard.ts rename to native-plugins/imessage/src/monitor/reflection-guard.ts diff --git a/extensions/imessage/src/monitor/runtime.ts b/native-plugins/imessage/src/monitor/runtime.ts similarity index 100% rename from extensions/imessage/src/monitor/runtime.ts rename to native-plugins/imessage/src/monitor/runtime.ts diff --git a/extensions/imessage/src/monitor/sanitize-outbound.test.ts b/native-plugins/imessage/src/monitor/sanitize-outbound.test.ts similarity index 100% rename from extensions/imessage/src/monitor/sanitize-outbound.test.ts rename to native-plugins/imessage/src/monitor/sanitize-outbound.test.ts diff --git a/extensions/imessage/src/monitor/sanitize-outbound.ts b/native-plugins/imessage/src/monitor/sanitize-outbound.ts similarity index 100% rename from extensions/imessage/src/monitor/sanitize-outbound.ts rename to native-plugins/imessage/src/monitor/sanitize-outbound.ts diff --git a/extensions/imessage/src/monitor/self-chat-cache.test.ts b/native-plugins/imessage/src/monitor/self-chat-cache.test.ts similarity index 100% rename from extensions/imessage/src/monitor/self-chat-cache.test.ts rename to native-plugins/imessage/src/monitor/self-chat-cache.test.ts diff --git a/extensions/imessage/src/monitor/self-chat-cache.ts b/native-plugins/imessage/src/monitor/self-chat-cache.ts similarity index 100% rename from extensions/imessage/src/monitor/self-chat-cache.ts rename to native-plugins/imessage/src/monitor/self-chat-cache.ts diff --git a/extensions/imessage/src/monitor/types.ts b/native-plugins/imessage/src/monitor/types.ts similarity index 100% rename from extensions/imessage/src/monitor/types.ts rename to native-plugins/imessage/src/monitor/types.ts diff --git a/extensions/imessage/src/outbound-adapter.ts b/native-plugins/imessage/src/outbound-adapter.ts similarity index 100% rename from extensions/imessage/src/outbound-adapter.ts rename to native-plugins/imessage/src/outbound-adapter.ts diff --git a/extensions/imessage/src/plugin-shared.ts b/native-plugins/imessage/src/plugin-shared.ts similarity index 100% rename from extensions/imessage/src/plugin-shared.ts rename to native-plugins/imessage/src/plugin-shared.ts diff --git a/extensions/imessage/src/probe.test.ts b/native-plugins/imessage/src/probe.test.ts similarity index 100% rename from extensions/imessage/src/probe.test.ts rename to native-plugins/imessage/src/probe.test.ts diff --git a/extensions/imessage/src/probe.ts b/native-plugins/imessage/src/probe.ts similarity index 100% rename from extensions/imessage/src/probe.ts rename to native-plugins/imessage/src/probe.ts diff --git a/extensions/imessage/src/runtime.ts b/native-plugins/imessage/src/runtime.ts similarity index 100% rename from extensions/imessage/src/runtime.ts rename to native-plugins/imessage/src/runtime.ts diff --git a/extensions/imessage/src/send.test.ts b/native-plugins/imessage/src/send.test.ts similarity index 100% rename from extensions/imessage/src/send.test.ts rename to native-plugins/imessage/src/send.test.ts diff --git a/extensions/imessage/src/send.ts b/native-plugins/imessage/src/send.ts similarity index 100% rename from extensions/imessage/src/send.ts rename to native-plugins/imessage/src/send.ts diff --git a/extensions/imessage/src/setup-allow-from.test.ts b/native-plugins/imessage/src/setup-allow-from.test.ts similarity index 100% rename from extensions/imessage/src/setup-allow-from.test.ts rename to native-plugins/imessage/src/setup-allow-from.test.ts diff --git a/extensions/imessage/src/setup-core.ts b/native-plugins/imessage/src/setup-core.ts similarity index 100% rename from extensions/imessage/src/setup-core.ts rename to native-plugins/imessage/src/setup-core.ts diff --git a/extensions/imessage/src/setup-surface.ts b/native-plugins/imessage/src/setup-surface.ts similarity index 100% rename from extensions/imessage/src/setup-surface.ts rename to native-plugins/imessage/src/setup-surface.ts diff --git a/extensions/imessage/src/shared.ts b/native-plugins/imessage/src/shared.ts similarity index 100% rename from extensions/imessage/src/shared.ts rename to native-plugins/imessage/src/shared.ts diff --git a/extensions/imessage/src/target-parsing-helpers.ts b/native-plugins/imessage/src/target-parsing-helpers.ts similarity index 100% rename from extensions/imessage/src/target-parsing-helpers.ts rename to native-plugins/imessage/src/target-parsing-helpers.ts diff --git a/extensions/imessage/src/targets.test.ts b/native-plugins/imessage/src/targets.test.ts similarity index 100% rename from extensions/imessage/src/targets.test.ts rename to native-plugins/imessage/src/targets.test.ts diff --git a/extensions/imessage/src/targets.ts b/native-plugins/imessage/src/targets.ts similarity index 100% rename from extensions/imessage/src/targets.ts rename to native-plugins/imessage/src/targets.ts diff --git a/extensions/irc/api.ts b/native-plugins/irc/api.ts similarity index 100% rename from extensions/irc/api.ts rename to native-plugins/irc/api.ts diff --git a/extensions/irc/index.ts b/native-plugins/irc/index.ts similarity index 100% rename from extensions/irc/index.ts rename to native-plugins/irc/index.ts diff --git a/extensions/irc/openclaw.plugin.json b/native-plugins/irc/openclaw.plugin.json similarity index 100% rename from extensions/irc/openclaw.plugin.json rename to native-plugins/irc/openclaw.plugin.json diff --git a/extensions/irc/package.json b/native-plugins/irc/package.json similarity index 96% rename from extensions/irc/package.json rename to native-plugins/irc/package.json index ac861d0a90f..0e405569e8c 100644 --- a/extensions/irc/package.json +++ b/native-plugins/irc/package.json @@ -7,7 +7,7 @@ "zod": "^4.3.6" }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ], "setupEntry": "./setup-entry.ts", diff --git a/extensions/irc/setup-entry.ts b/native-plugins/irc/setup-entry.ts similarity index 100% rename from extensions/irc/setup-entry.ts rename to native-plugins/irc/setup-entry.ts diff --git a/extensions/irc/src/accounts.test.ts b/native-plugins/irc/src/accounts.test.ts similarity index 100% rename from extensions/irc/src/accounts.test.ts rename to native-plugins/irc/src/accounts.test.ts diff --git a/extensions/irc/src/accounts.ts b/native-plugins/irc/src/accounts.ts similarity index 100% rename from extensions/irc/src/accounts.ts rename to native-plugins/irc/src/accounts.ts diff --git a/extensions/irc/src/channel.startup.test.ts b/native-plugins/irc/src/channel.startup.test.ts similarity index 95% rename from extensions/irc/src/channel.startup.test.ts rename to native-plugins/irc/src/channel.startup.test.ts index de3526a32d2..090884e4b85 100644 --- a/extensions/irc/src/channel.startup.test.ts +++ b/native-plugins/irc/src/channel.startup.test.ts @@ -2,7 +2,7 @@ import { afterEach, describe, expect, it, vi } from "vitest"; import { expectStopPendingUntilAbort, startAccountAndTrackLifecycle, -} from "../../../test/helpers/extensions/start-account-lifecycle.js"; +} from "../../../test/helpers/native-plugins/start-account-lifecycle.js"; import type { ResolvedIrcAccount } from "./accounts.js"; const hoisted = vi.hoisted(() => ({ diff --git a/extensions/irc/src/channel.ts b/native-plugins/irc/src/channel.ts similarity index 99% rename from extensions/irc/src/channel.ts rename to native-plugins/irc/src/channel.ts index 27571c92d35..400d981cac8 100644 --- a/extensions/irc/src/channel.ts +++ b/native-plugins/irc/src/channel.ts @@ -14,7 +14,7 @@ import { createTextPairingAdapter, listResolvedDirectoryEntriesFromSources, } from "openclaw/plugin-sdk/channel-runtime"; -import { runStoppablePassiveMonitor } from "openclaw/plugin-sdk/extension-shared"; +import { runStoppablePassiveMonitor } from "openclaw/plugin-sdk/native-plugin-shared"; import { listIrcAccountIds, resolveDefaultIrcAccountId, diff --git a/extensions/irc/src/client.test.ts b/native-plugins/irc/src/client.test.ts similarity index 100% rename from extensions/irc/src/client.test.ts rename to native-plugins/irc/src/client.test.ts diff --git a/extensions/irc/src/client.ts b/native-plugins/irc/src/client.ts similarity index 100% rename from extensions/irc/src/client.ts rename to native-plugins/irc/src/client.ts diff --git a/extensions/irc/src/config-schema.test.ts b/native-plugins/irc/src/config-schema.test.ts similarity index 100% rename from extensions/irc/src/config-schema.test.ts rename to native-plugins/irc/src/config-schema.test.ts diff --git a/extensions/irc/src/config-schema.ts b/native-plugins/irc/src/config-schema.ts similarity index 99% rename from extensions/irc/src/config-schema.ts rename to native-plugins/irc/src/config-schema.ts index 5534e0098c5..21d42887595 100644 --- a/extensions/irc/src/config-schema.ts +++ b/native-plugins/irc/src/config-schema.ts @@ -1,4 +1,4 @@ -import { requireChannelOpenAllowFrom } from "openclaw/plugin-sdk/extension-shared"; +import { requireChannelOpenAllowFrom } from "openclaw/plugin-sdk/native-plugin-shared"; import { z } from "zod"; import { BlockStreamingCoalesceSchema, diff --git a/extensions/irc/src/connect-options.ts b/native-plugins/irc/src/connect-options.ts similarity index 100% rename from extensions/irc/src/connect-options.ts rename to native-plugins/irc/src/connect-options.ts diff --git a/extensions/irc/src/control-chars.ts b/native-plugins/irc/src/control-chars.ts similarity index 100% rename from extensions/irc/src/control-chars.ts rename to native-plugins/irc/src/control-chars.ts diff --git a/extensions/irc/src/inbound.policy.test.ts b/native-plugins/irc/src/inbound.policy.test.ts similarity index 100% rename from extensions/irc/src/inbound.policy.test.ts rename to native-plugins/irc/src/inbound.policy.test.ts diff --git a/extensions/irc/src/inbound.ts b/native-plugins/irc/src/inbound.ts similarity index 100% rename from extensions/irc/src/inbound.ts rename to native-plugins/irc/src/inbound.ts diff --git a/extensions/irc/src/monitor.test.ts b/native-plugins/irc/src/monitor.test.ts similarity index 100% rename from extensions/irc/src/monitor.test.ts rename to native-plugins/irc/src/monitor.test.ts diff --git a/extensions/irc/src/monitor.ts b/native-plugins/irc/src/monitor.ts similarity index 99% rename from extensions/irc/src/monitor.ts rename to native-plugins/irc/src/monitor.ts index 2a75b76ee08..f5cc5f7ab41 100644 --- a/extensions/irc/src/monitor.ts +++ b/native-plugins/irc/src/monitor.ts @@ -1,4 +1,4 @@ -import { resolveLoggerBackedRuntime } from "openclaw/plugin-sdk/extension-shared"; +import { resolveLoggerBackedRuntime } from "openclaw/plugin-sdk/native-plugin-shared"; import { resolveIrcAccount } from "./accounts.js"; import { connectIrcClient, type IrcClient } from "./client.js"; import { buildIrcConnectOptions } from "./connect-options.js"; diff --git a/extensions/irc/src/normalize.test.ts b/native-plugins/irc/src/normalize.test.ts similarity index 100% rename from extensions/irc/src/normalize.test.ts rename to native-plugins/irc/src/normalize.test.ts diff --git a/extensions/irc/src/normalize.ts b/native-plugins/irc/src/normalize.ts similarity index 100% rename from extensions/irc/src/normalize.ts rename to native-plugins/irc/src/normalize.ts diff --git a/extensions/irc/src/policy.test.ts b/native-plugins/irc/src/policy.test.ts similarity index 100% rename from extensions/irc/src/policy.test.ts rename to native-plugins/irc/src/policy.test.ts diff --git a/extensions/irc/src/policy.ts b/native-plugins/irc/src/policy.ts similarity index 100% rename from extensions/irc/src/policy.ts rename to native-plugins/irc/src/policy.ts diff --git a/extensions/irc/src/probe.ts b/native-plugins/irc/src/probe.ts similarity index 100% rename from extensions/irc/src/probe.ts rename to native-plugins/irc/src/probe.ts diff --git a/extensions/irc/src/protocol.test.ts b/native-plugins/irc/src/protocol.test.ts similarity index 100% rename from extensions/irc/src/protocol.test.ts rename to native-plugins/irc/src/protocol.test.ts diff --git a/extensions/irc/src/protocol.ts b/native-plugins/irc/src/protocol.ts similarity index 100% rename from extensions/irc/src/protocol.ts rename to native-plugins/irc/src/protocol.ts diff --git a/extensions/irc/src/runtime-api.ts b/native-plugins/irc/src/runtime-api.ts similarity index 100% rename from extensions/irc/src/runtime-api.ts rename to native-plugins/irc/src/runtime-api.ts diff --git a/extensions/irc/src/runtime.ts b/native-plugins/irc/src/runtime.ts similarity index 100% rename from extensions/irc/src/runtime.ts rename to native-plugins/irc/src/runtime.ts diff --git a/extensions/irc/src/send.test.ts b/native-plugins/irc/src/send.test.ts similarity index 98% rename from extensions/irc/src/send.test.ts rename to native-plugins/irc/src/send.test.ts index 7dc064930be..37f59da7412 100644 --- a/extensions/irc/src/send.test.ts +++ b/native-plugins/irc/src/send.test.ts @@ -3,7 +3,7 @@ import { createSendCfgThreadingRuntime, expectProvidedCfgSkipsRuntimeLoad, expectRuntimeCfgFallback, -} from "../../../test/helpers/extensions/send-config.js"; +} from "../../../test/helpers/native-plugins/send-config.js"; import type { IrcClient } from "./client.js"; import type { CoreConfig } from "./types.js"; diff --git a/extensions/irc/src/send.ts b/native-plugins/irc/src/send.ts similarity index 100% rename from extensions/irc/src/send.ts rename to native-plugins/irc/src/send.ts diff --git a/extensions/irc/src/setup-core.ts b/native-plugins/irc/src/setup-core.ts similarity index 100% rename from extensions/irc/src/setup-core.ts rename to native-plugins/irc/src/setup-core.ts diff --git a/extensions/irc/src/setup-surface.test.ts b/native-plugins/irc/src/setup-surface.test.ts similarity index 96% rename from extensions/irc/src/setup-surface.test.ts rename to native-plugins/irc/src/setup-surface.test.ts index 56b9687f593..9f982a0a40d 100644 --- a/extensions/irc/src/setup-surface.test.ts +++ b/native-plugins/irc/src/setup-surface.test.ts @@ -1,10 +1,10 @@ import { describe, expect, it, vi } from "vitest"; import { buildChannelSetupWizardAdapterFromSetupWizard } from "../../../src/channels/plugins/setup-wizard.js"; -import { createRuntimeEnv } from "../../../test/helpers/extensions/runtime-env.js"; +import { createRuntimeEnv } from "../../../test/helpers/native-plugins/runtime-env.js"; import { createTestWizardPrompter, type WizardPrompter, -} from "../../../test/helpers/extensions/setup-wizard.js"; +} from "../../../test/helpers/native-plugins/setup-wizard.js"; import { ircPlugin } from "./channel.js"; import type { RuntimeEnv } from "./runtime-api.js"; import type { CoreConfig } from "./types.js"; diff --git a/extensions/irc/src/setup-surface.ts b/native-plugins/irc/src/setup-surface.ts similarity index 100% rename from extensions/irc/src/setup-surface.ts rename to native-plugins/irc/src/setup-surface.ts diff --git a/extensions/irc/src/types.ts b/native-plugins/irc/src/types.ts similarity index 100% rename from extensions/irc/src/types.ts rename to native-plugins/irc/src/types.ts diff --git a/extensions/kilocode/index.ts b/native-plugins/kilocode/index.ts similarity index 100% rename from extensions/kilocode/index.ts rename to native-plugins/kilocode/index.ts diff --git a/extensions/kilocode/onboard.ts b/native-plugins/kilocode/onboard.ts similarity index 100% rename from extensions/kilocode/onboard.ts rename to native-plugins/kilocode/onboard.ts diff --git a/extensions/kilocode/openclaw.plugin.json b/native-plugins/kilocode/openclaw.plugin.json similarity index 100% rename from extensions/kilocode/openclaw.plugin.json rename to native-plugins/kilocode/openclaw.plugin.json diff --git a/extensions/kilocode/package.json b/native-plugins/kilocode/package.json similarity index 91% rename from extensions/kilocode/package.json rename to native-plugins/kilocode/package.json index 9ef4b7fe0c5..4071aed2375 100644 --- a/extensions/kilocode/package.json +++ b/native-plugins/kilocode/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Kilo Gateway provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/kilocode/provider-catalog.ts b/native-plugins/kilocode/provider-catalog.ts similarity index 100% rename from extensions/kilocode/provider-catalog.ts rename to native-plugins/kilocode/provider-catalog.ts diff --git a/extensions/kimi-coding/index.ts b/native-plugins/kimi-coding/index.ts similarity index 100% rename from extensions/kimi-coding/index.ts rename to native-plugins/kimi-coding/index.ts diff --git a/extensions/kimi-coding/onboard.ts b/native-plugins/kimi-coding/onboard.ts similarity index 100% rename from extensions/kimi-coding/onboard.ts rename to native-plugins/kimi-coding/onboard.ts diff --git a/extensions/kimi-coding/openclaw.plugin.json b/native-plugins/kimi-coding/openclaw.plugin.json similarity index 100% rename from extensions/kimi-coding/openclaw.plugin.json rename to native-plugins/kimi-coding/openclaw.plugin.json diff --git a/extensions/kimi-coding/package.json b/native-plugins/kimi-coding/package.json similarity index 90% rename from extensions/kimi-coding/package.json rename to native-plugins/kimi-coding/package.json index 9568afa64b4..c4731435093 100644 --- a/extensions/kimi-coding/package.json +++ b/native-plugins/kimi-coding/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Kimi provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/kimi-coding/provider-catalog.ts b/native-plugins/kimi-coding/provider-catalog.ts similarity index 100% rename from extensions/kimi-coding/provider-catalog.ts rename to native-plugins/kimi-coding/provider-catalog.ts diff --git a/extensions/line/api.ts b/native-plugins/line/api.ts similarity index 100% rename from extensions/line/api.ts rename to native-plugins/line/api.ts diff --git a/extensions/line/index.ts b/native-plugins/line/index.ts similarity index 100% rename from extensions/line/index.ts rename to native-plugins/line/index.ts diff --git a/extensions/line/openclaw.plugin.json b/native-plugins/line/openclaw.plugin.json similarity index 100% rename from extensions/line/openclaw.plugin.json rename to native-plugins/line/openclaw.plugin.json diff --git a/extensions/line/package.json b/native-plugins/line/package.json similarity index 91% rename from extensions/line/package.json rename to native-plugins/line/package.json index 3fa098460d6..731d6f3492d 100644 --- a/extensions/line/package.json +++ b/native-plugins/line/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw LINE channel plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ], "setupEntry": "./setup-entry.ts", @@ -21,7 +21,7 @@ }, "install": { "npmSpec": "@openclaw/line", - "localPath": "extensions/line", + "localPath": "native-plugins/line", "defaultChoice": "npm" } } diff --git a/extensions/line/runtime-api.ts b/native-plugins/line/runtime-api.ts similarity index 100% rename from extensions/line/runtime-api.ts rename to native-plugins/line/runtime-api.ts diff --git a/extensions/line/setup-api.ts b/native-plugins/line/setup-api.ts similarity index 100% rename from extensions/line/setup-api.ts rename to native-plugins/line/setup-api.ts diff --git a/extensions/line/setup-entry.ts b/native-plugins/line/setup-entry.ts similarity index 100% rename from extensions/line/setup-entry.ts rename to native-plugins/line/setup-entry.ts diff --git a/extensions/line/src/card-command.ts b/native-plugins/line/src/card-command.ts similarity index 100% rename from extensions/line/src/card-command.ts rename to native-plugins/line/src/card-command.ts diff --git a/extensions/line/src/channel.logout.test.ts b/native-plugins/line/src/channel.logout.test.ts similarity index 98% rename from extensions/line/src/channel.logout.test.ts rename to native-plugins/line/src/channel.logout.test.ts index 0b3dd9a9517..bf628429a6f 100644 --- a/extensions/line/src/channel.logout.test.ts +++ b/native-plugins/line/src/channel.logout.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; -import { createRuntimeEnv } from "../../../test/helpers/extensions/runtime-env.js"; +import { createRuntimeEnv } from "../../../test/helpers/native-plugins/runtime-env.js"; import type { OpenClawConfig, PluginRuntime, ResolvedLineAccount } from "../api.js"; import { linePlugin } from "./channel.js"; import { setLineRuntime } from "./runtime.js"; diff --git a/extensions/line/src/channel.sendPayload.test.ts b/native-plugins/line/src/channel.sendPayload.test.ts similarity index 100% rename from extensions/line/src/channel.sendPayload.test.ts rename to native-plugins/line/src/channel.sendPayload.test.ts diff --git a/extensions/line/src/channel.setup.ts b/native-plugins/line/src/channel.setup.ts similarity index 100% rename from extensions/line/src/channel.setup.ts rename to native-plugins/line/src/channel.setup.ts diff --git a/extensions/line/src/channel.startup.test.ts b/native-plugins/line/src/channel.startup.test.ts similarity index 97% rename from extensions/line/src/channel.startup.test.ts rename to native-plugins/line/src/channel.startup.test.ts index 000b94ee471..0aa5bede4f2 100644 --- a/extensions/line/src/channel.startup.test.ts +++ b/native-plugins/line/src/channel.startup.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from "vitest"; -import { createRuntimeEnv } from "../../../test/helpers/extensions/runtime-env.js"; +import { createRuntimeEnv } from "../../../test/helpers/native-plugins/runtime-env.js"; import type { ChannelGatewayContext, ChannelAccountSnapshot, diff --git a/extensions/line/src/channel.ts b/native-plugins/line/src/channel.ts similarity index 100% rename from extensions/line/src/channel.ts rename to native-plugins/line/src/channel.ts diff --git a/extensions/line/src/config-adapter.ts b/native-plugins/line/src/config-adapter.ts similarity index 100% rename from extensions/line/src/config-adapter.ts rename to native-plugins/line/src/config-adapter.ts diff --git a/extensions/line/src/config-schema.ts b/native-plugins/line/src/config-schema.ts similarity index 100% rename from extensions/line/src/config-schema.ts rename to native-plugins/line/src/config-schema.ts diff --git a/extensions/line/src/group-policy.test.ts b/native-plugins/line/src/group-policy.test.ts similarity index 100% rename from extensions/line/src/group-policy.test.ts rename to native-plugins/line/src/group-policy.test.ts diff --git a/extensions/line/src/group-policy.ts b/native-plugins/line/src/group-policy.ts similarity index 100% rename from extensions/line/src/group-policy.ts rename to native-plugins/line/src/group-policy.ts diff --git a/extensions/line/src/runtime.ts b/native-plugins/line/src/runtime.ts similarity index 100% rename from extensions/line/src/runtime.ts rename to native-plugins/line/src/runtime.ts diff --git a/extensions/line/src/setup-core.ts b/native-plugins/line/src/setup-core.ts similarity index 100% rename from extensions/line/src/setup-core.ts rename to native-plugins/line/src/setup-core.ts diff --git a/extensions/line/src/setup-surface.test.ts b/native-plugins/line/src/setup-surface.test.ts similarity index 93% rename from extensions/line/src/setup-surface.test.ts rename to native-plugins/line/src/setup-surface.test.ts index b613a16bba4..e2e11c931b7 100644 --- a/extensions/line/src/setup-surface.test.ts +++ b/native-plugins/line/src/setup-surface.test.ts @@ -5,11 +5,11 @@ import { resolveDefaultLineAccountId, resolveLineAccount, } from "../../../src/line/accounts.js"; -import { createRuntimeEnv } from "../../../test/helpers/extensions/runtime-env.js"; +import { createRuntimeEnv } from "../../../test/helpers/native-plugins/runtime-env.js"; import { createTestWizardPrompter, type WizardPrompter, -} from "../../../test/helpers/extensions/setup-wizard.js"; +} from "../../../test/helpers/native-plugins/setup-wizard.js"; import type { OpenClawConfig } from "../api.js"; import { lineSetupAdapter, lineSetupWizard } from "./setup-surface.js"; diff --git a/extensions/line/src/setup-surface.ts b/native-plugins/line/src/setup-surface.ts similarity index 100% rename from extensions/line/src/setup-surface.ts rename to native-plugins/line/src/setup-surface.ts diff --git a/extensions/llm-task/README.md b/native-plugins/llm-task/README.md similarity index 97% rename from extensions/llm-task/README.md rename to native-plugins/llm-task/README.md index 738208f3d60..bfe97888aeb 100644 --- a/extensions/llm-task/README.md +++ b/native-plugins/llm-task/README.md @@ -95,4 +95,4 @@ It is intended to ship as a **bundled** OpenClaw extension (like `lobster`) and be enabled via `plugins.entries` + tool allowlists. It is **not** currently designed to be copied into -`~/.openclaw/extensions` as a standalone plugin directory. +`~/.openclaw/plugins` as a standalone plugin directory. diff --git a/extensions/llm-task/api.ts b/native-plugins/llm-task/api.ts similarity index 100% rename from extensions/llm-task/api.ts rename to native-plugins/llm-task/api.ts diff --git a/extensions/llm-task/index.ts b/native-plugins/llm-task/index.ts similarity index 100% rename from extensions/llm-task/index.ts rename to native-plugins/llm-task/index.ts diff --git a/extensions/llm-task/openclaw.plugin.json b/native-plugins/llm-task/openclaw.plugin.json similarity index 100% rename from extensions/llm-task/openclaw.plugin.json rename to native-plugins/llm-task/openclaw.plugin.json diff --git a/extensions/llm-task/package.json b/native-plugins/llm-task/package.json similarity index 93% rename from extensions/llm-task/package.json rename to native-plugins/llm-task/package.json index 6b19e5cb4b2..f7f7ca5c1d8 100644 --- a/extensions/llm-task/package.json +++ b/native-plugins/llm-task/package.json @@ -9,7 +9,7 @@ "ajv": "^8.18.0" }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/llm-task/src/llm-task-tool.test.ts b/native-plugins/llm-task/src/llm-task-tool.test.ts similarity index 100% rename from extensions/llm-task/src/llm-task-tool.test.ts rename to native-plugins/llm-task/src/llm-task-tool.test.ts diff --git a/extensions/llm-task/src/llm-task-tool.ts b/native-plugins/llm-task/src/llm-task-tool.ts similarity index 100% rename from extensions/llm-task/src/llm-task-tool.ts rename to native-plugins/llm-task/src/llm-task-tool.ts diff --git a/extensions/lobster/README.md b/native-plugins/lobster/README.md similarity index 100% rename from extensions/lobster/README.md rename to native-plugins/lobster/README.md diff --git a/extensions/lobster/SKILL.md b/native-plugins/lobster/SKILL.md similarity index 100% rename from extensions/lobster/SKILL.md rename to native-plugins/lobster/SKILL.md diff --git a/extensions/lobster/index.ts b/native-plugins/lobster/index.ts similarity index 100% rename from extensions/lobster/index.ts rename to native-plugins/lobster/index.ts diff --git a/extensions/lobster/openclaw.plugin.json b/native-plugins/lobster/openclaw.plugin.json similarity index 100% rename from extensions/lobster/openclaw.plugin.json rename to native-plugins/lobster/openclaw.plugin.json diff --git a/extensions/lobster/package.json b/native-plugins/lobster/package.json similarity index 94% rename from extensions/lobster/package.json rename to native-plugins/lobster/package.json index 9280c21b51e..2de5a28560c 100644 --- a/extensions/lobster/package.json +++ b/native-plugins/lobster/package.json @@ -7,7 +7,7 @@ "@sinclair/typebox": "0.34.48" }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ], "release": { diff --git a/extensions/lobster/runtime-api.ts b/native-plugins/lobster/runtime-api.ts similarity index 100% rename from extensions/lobster/runtime-api.ts rename to native-plugins/lobster/runtime-api.ts diff --git a/extensions/lobster/src/lobster-tool.test.ts b/native-plugins/lobster/src/lobster-tool.test.ts similarity index 100% rename from extensions/lobster/src/lobster-tool.test.ts rename to native-plugins/lobster/src/lobster-tool.test.ts diff --git a/extensions/lobster/src/lobster-tool.ts b/native-plugins/lobster/src/lobster-tool.ts similarity index 100% rename from extensions/lobster/src/lobster-tool.ts rename to native-plugins/lobster/src/lobster-tool.ts diff --git a/extensions/lobster/src/test-helpers.ts b/native-plugins/lobster/src/test-helpers.ts similarity index 100% rename from extensions/lobster/src/test-helpers.ts rename to native-plugins/lobster/src/test-helpers.ts diff --git a/extensions/lobster/src/windows-spawn.test.ts b/native-plugins/lobster/src/windows-spawn.test.ts similarity index 100% rename from extensions/lobster/src/windows-spawn.test.ts rename to native-plugins/lobster/src/windows-spawn.test.ts diff --git a/extensions/lobster/src/windows-spawn.ts b/native-plugins/lobster/src/windows-spawn.ts similarity index 100% rename from extensions/lobster/src/windows-spawn.ts rename to native-plugins/lobster/src/windows-spawn.ts diff --git a/extensions/matrix/CHANGELOG.md b/native-plugins/matrix/CHANGELOG.md similarity index 100% rename from extensions/matrix/CHANGELOG.md rename to native-plugins/matrix/CHANGELOG.md diff --git a/extensions/matrix/api.ts b/native-plugins/matrix/api.ts similarity index 100% rename from extensions/matrix/api.ts rename to native-plugins/matrix/api.ts diff --git a/extensions/matrix/helper-api.ts b/native-plugins/matrix/helper-api.ts similarity index 100% rename from extensions/matrix/helper-api.ts rename to native-plugins/matrix/helper-api.ts diff --git a/extensions/matrix/index.test.ts b/native-plugins/matrix/index.test.ts similarity index 100% rename from extensions/matrix/index.test.ts rename to native-plugins/matrix/index.test.ts diff --git a/extensions/matrix/index.ts b/native-plugins/matrix/index.ts similarity index 100% rename from extensions/matrix/index.ts rename to native-plugins/matrix/index.ts diff --git a/extensions/matrix/legacy-crypto-inspector.ts b/native-plugins/matrix/legacy-crypto-inspector.ts similarity index 100% rename from extensions/matrix/legacy-crypto-inspector.ts rename to native-plugins/matrix/legacy-crypto-inspector.ts diff --git a/extensions/matrix/openclaw.plugin.json b/native-plugins/matrix/openclaw.plugin.json similarity index 100% rename from extensions/matrix/openclaw.plugin.json rename to native-plugins/matrix/openclaw.plugin.json diff --git a/extensions/matrix/package.json b/native-plugins/matrix/package.json similarity index 94% rename from extensions/matrix/package.json rename to native-plugins/matrix/package.json index 605751f6ccd..d2e400236b7 100644 --- a/extensions/matrix/package.json +++ b/native-plugins/matrix/package.json @@ -15,7 +15,7 @@ "openclaw": "workspace:*" }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ], "setupEntry": "./setup-entry.ts", @@ -31,7 +31,7 @@ }, "install": { "npmSpec": "@openclaw/matrix", - "localPath": "extensions/matrix", + "localPath": "native-plugins/matrix", "defaultChoice": "npm" }, "releaseChecks": { diff --git a/extensions/matrix/runtime-api.ts b/native-plugins/matrix/runtime-api.ts similarity index 100% rename from extensions/matrix/runtime-api.ts rename to native-plugins/matrix/runtime-api.ts diff --git a/extensions/matrix/setup-entry.ts b/native-plugins/matrix/setup-entry.ts similarity index 100% rename from extensions/matrix/setup-entry.ts rename to native-plugins/matrix/setup-entry.ts diff --git a/extensions/matrix/src/account-selection.ts b/native-plugins/matrix/src/account-selection.ts similarity index 100% rename from extensions/matrix/src/account-selection.ts rename to native-plugins/matrix/src/account-selection.ts diff --git a/extensions/matrix/src/actions.account-propagation.test.ts b/native-plugins/matrix/src/actions.account-propagation.test.ts similarity index 100% rename from extensions/matrix/src/actions.account-propagation.test.ts rename to native-plugins/matrix/src/actions.account-propagation.test.ts diff --git a/extensions/matrix/src/actions.test.ts b/native-plugins/matrix/src/actions.test.ts similarity index 100% rename from extensions/matrix/src/actions.test.ts rename to native-plugins/matrix/src/actions.test.ts diff --git a/extensions/matrix/src/actions.ts b/native-plugins/matrix/src/actions.ts similarity index 100% rename from extensions/matrix/src/actions.ts rename to native-plugins/matrix/src/actions.ts diff --git a/extensions/matrix/src/auth-precedence.ts b/native-plugins/matrix/src/auth-precedence.ts similarity index 100% rename from extensions/matrix/src/auth-precedence.ts rename to native-plugins/matrix/src/auth-precedence.ts diff --git a/extensions/matrix/src/channel.account-paths.test.ts b/native-plugins/matrix/src/channel.account-paths.test.ts similarity index 100% rename from extensions/matrix/src/channel.account-paths.test.ts rename to native-plugins/matrix/src/channel.account-paths.test.ts diff --git a/extensions/matrix/src/channel.directory.test.ts b/native-plugins/matrix/src/channel.directory.test.ts similarity index 100% rename from extensions/matrix/src/channel.directory.test.ts rename to native-plugins/matrix/src/channel.directory.test.ts diff --git a/extensions/matrix/src/channel.resolve.test.ts b/native-plugins/matrix/src/channel.resolve.test.ts similarity index 100% rename from extensions/matrix/src/channel.resolve.test.ts rename to native-plugins/matrix/src/channel.resolve.test.ts diff --git a/extensions/matrix/src/channel.runtime.ts b/native-plugins/matrix/src/channel.runtime.ts similarity index 100% rename from extensions/matrix/src/channel.runtime.ts rename to native-plugins/matrix/src/channel.runtime.ts diff --git a/extensions/matrix/src/channel.setup.test.ts b/native-plugins/matrix/src/channel.setup.test.ts similarity index 100% rename from extensions/matrix/src/channel.setup.test.ts rename to native-plugins/matrix/src/channel.setup.test.ts diff --git a/extensions/matrix/src/channel.ts b/native-plugins/matrix/src/channel.ts similarity index 99% rename from extensions/matrix/src/channel.ts rename to native-plugins/matrix/src/channel.ts index ca028d8d99d..c181cbd0336 100644 --- a/extensions/matrix/src/channel.ts +++ b/native-plugins/matrix/src/channel.ts @@ -15,8 +15,8 @@ import { createTextPairingAdapter, listResolvedDirectoryEntriesFromSources, } from "openclaw/plugin-sdk/channel-runtime"; -import { buildTrafficStatusSummary } from "openclaw/plugin-sdk/extension-shared"; import { createLazyRuntimeNamedExport } from "openclaw/plugin-sdk/lazy-runtime"; +import { buildTrafficStatusSummary } from "openclaw/plugin-sdk/native-plugin-shared"; import { matrixMessageActions } from "./actions.js"; import { MatrixConfigSchema } from "./config-schema.js"; import { diff --git a/extensions/matrix/src/cli.test.ts b/native-plugins/matrix/src/cli.test.ts similarity index 100% rename from extensions/matrix/src/cli.test.ts rename to native-plugins/matrix/src/cli.test.ts diff --git a/extensions/matrix/src/cli.ts b/native-plugins/matrix/src/cli.ts similarity index 100% rename from extensions/matrix/src/cli.ts rename to native-plugins/matrix/src/cli.ts diff --git a/extensions/matrix/src/config-schema.test.ts b/native-plugins/matrix/src/config-schema.test.ts similarity index 100% rename from extensions/matrix/src/config-schema.test.ts rename to native-plugins/matrix/src/config-schema.test.ts diff --git a/extensions/matrix/src/config-schema.ts b/native-plugins/matrix/src/config-schema.ts similarity index 100% rename from extensions/matrix/src/config-schema.ts rename to native-plugins/matrix/src/config-schema.ts diff --git a/extensions/matrix/src/directory-live.test.ts b/native-plugins/matrix/src/directory-live.test.ts similarity index 100% rename from extensions/matrix/src/directory-live.test.ts rename to native-plugins/matrix/src/directory-live.test.ts diff --git a/extensions/matrix/src/directory-live.ts b/native-plugins/matrix/src/directory-live.ts similarity index 100% rename from extensions/matrix/src/directory-live.ts rename to native-plugins/matrix/src/directory-live.ts diff --git a/extensions/matrix/src/env-vars.ts b/native-plugins/matrix/src/env-vars.ts similarity index 100% rename from extensions/matrix/src/env-vars.ts rename to native-plugins/matrix/src/env-vars.ts diff --git a/extensions/matrix/src/group-mentions.ts b/native-plugins/matrix/src/group-mentions.ts similarity index 100% rename from extensions/matrix/src/group-mentions.ts rename to native-plugins/matrix/src/group-mentions.ts diff --git a/extensions/matrix/src/matrix/account-config.ts b/native-plugins/matrix/src/matrix/account-config.ts similarity index 100% rename from extensions/matrix/src/matrix/account-config.ts rename to native-plugins/matrix/src/matrix/account-config.ts diff --git a/extensions/matrix/src/matrix/accounts.test.ts b/native-plugins/matrix/src/matrix/accounts.test.ts similarity index 100% rename from extensions/matrix/src/matrix/accounts.test.ts rename to native-plugins/matrix/src/matrix/accounts.test.ts diff --git a/extensions/matrix/src/matrix/accounts.ts b/native-plugins/matrix/src/matrix/accounts.ts similarity index 100% rename from extensions/matrix/src/matrix/accounts.ts rename to native-plugins/matrix/src/matrix/accounts.ts diff --git a/extensions/matrix/src/matrix/actions.ts b/native-plugins/matrix/src/matrix/actions.ts similarity index 100% rename from extensions/matrix/src/matrix/actions.ts rename to native-plugins/matrix/src/matrix/actions.ts diff --git a/extensions/matrix/src/matrix/actions/client.test.ts b/native-plugins/matrix/src/matrix/actions/client.test.ts similarity index 100% rename from extensions/matrix/src/matrix/actions/client.test.ts rename to native-plugins/matrix/src/matrix/actions/client.test.ts diff --git a/extensions/matrix/src/matrix/actions/client.ts b/native-plugins/matrix/src/matrix/actions/client.ts similarity index 100% rename from extensions/matrix/src/matrix/actions/client.ts rename to native-plugins/matrix/src/matrix/actions/client.ts diff --git a/extensions/matrix/src/matrix/actions/devices.test.ts b/native-plugins/matrix/src/matrix/actions/devices.test.ts similarity index 100% rename from extensions/matrix/src/matrix/actions/devices.test.ts rename to native-plugins/matrix/src/matrix/actions/devices.test.ts diff --git a/extensions/matrix/src/matrix/actions/devices.ts b/native-plugins/matrix/src/matrix/actions/devices.ts similarity index 100% rename from extensions/matrix/src/matrix/actions/devices.ts rename to native-plugins/matrix/src/matrix/actions/devices.ts diff --git a/extensions/matrix/src/matrix/actions/limits.test.ts b/native-plugins/matrix/src/matrix/actions/limits.test.ts similarity index 100% rename from extensions/matrix/src/matrix/actions/limits.test.ts rename to native-plugins/matrix/src/matrix/actions/limits.test.ts diff --git a/extensions/matrix/src/matrix/actions/limits.ts b/native-plugins/matrix/src/matrix/actions/limits.ts similarity index 100% rename from extensions/matrix/src/matrix/actions/limits.ts rename to native-plugins/matrix/src/matrix/actions/limits.ts diff --git a/extensions/matrix/src/matrix/actions/messages.test.ts b/native-plugins/matrix/src/matrix/actions/messages.test.ts similarity index 100% rename from extensions/matrix/src/matrix/actions/messages.test.ts rename to native-plugins/matrix/src/matrix/actions/messages.test.ts diff --git a/extensions/matrix/src/matrix/actions/messages.ts b/native-plugins/matrix/src/matrix/actions/messages.ts similarity index 100% rename from extensions/matrix/src/matrix/actions/messages.ts rename to native-plugins/matrix/src/matrix/actions/messages.ts diff --git a/extensions/matrix/src/matrix/actions/pins.test.ts b/native-plugins/matrix/src/matrix/actions/pins.test.ts similarity index 100% rename from extensions/matrix/src/matrix/actions/pins.test.ts rename to native-plugins/matrix/src/matrix/actions/pins.test.ts diff --git a/extensions/matrix/src/matrix/actions/pins.ts b/native-plugins/matrix/src/matrix/actions/pins.ts similarity index 100% rename from extensions/matrix/src/matrix/actions/pins.ts rename to native-plugins/matrix/src/matrix/actions/pins.ts diff --git a/extensions/matrix/src/matrix/actions/polls.test.ts b/native-plugins/matrix/src/matrix/actions/polls.test.ts similarity index 100% rename from extensions/matrix/src/matrix/actions/polls.test.ts rename to native-plugins/matrix/src/matrix/actions/polls.test.ts diff --git a/extensions/matrix/src/matrix/actions/polls.ts b/native-plugins/matrix/src/matrix/actions/polls.ts similarity index 100% rename from extensions/matrix/src/matrix/actions/polls.ts rename to native-plugins/matrix/src/matrix/actions/polls.ts diff --git a/extensions/matrix/src/matrix/actions/profile.test.ts b/native-plugins/matrix/src/matrix/actions/profile.test.ts similarity index 100% rename from extensions/matrix/src/matrix/actions/profile.test.ts rename to native-plugins/matrix/src/matrix/actions/profile.test.ts diff --git a/extensions/matrix/src/matrix/actions/profile.ts b/native-plugins/matrix/src/matrix/actions/profile.ts similarity index 100% rename from extensions/matrix/src/matrix/actions/profile.ts rename to native-plugins/matrix/src/matrix/actions/profile.ts diff --git a/extensions/matrix/src/matrix/actions/reactions.test.ts b/native-plugins/matrix/src/matrix/actions/reactions.test.ts similarity index 100% rename from extensions/matrix/src/matrix/actions/reactions.test.ts rename to native-plugins/matrix/src/matrix/actions/reactions.test.ts diff --git a/extensions/matrix/src/matrix/actions/reactions.ts b/native-plugins/matrix/src/matrix/actions/reactions.ts similarity index 100% rename from extensions/matrix/src/matrix/actions/reactions.ts rename to native-plugins/matrix/src/matrix/actions/reactions.ts diff --git a/extensions/matrix/src/matrix/actions/room.test.ts b/native-plugins/matrix/src/matrix/actions/room.test.ts similarity index 100% rename from extensions/matrix/src/matrix/actions/room.test.ts rename to native-plugins/matrix/src/matrix/actions/room.test.ts diff --git a/extensions/matrix/src/matrix/actions/room.ts b/native-plugins/matrix/src/matrix/actions/room.ts similarity index 100% rename from extensions/matrix/src/matrix/actions/room.ts rename to native-plugins/matrix/src/matrix/actions/room.ts diff --git a/extensions/matrix/src/matrix/actions/summary.test.ts b/native-plugins/matrix/src/matrix/actions/summary.test.ts similarity index 100% rename from extensions/matrix/src/matrix/actions/summary.test.ts rename to native-plugins/matrix/src/matrix/actions/summary.test.ts diff --git a/extensions/matrix/src/matrix/actions/summary.ts b/native-plugins/matrix/src/matrix/actions/summary.ts similarity index 100% rename from extensions/matrix/src/matrix/actions/summary.ts rename to native-plugins/matrix/src/matrix/actions/summary.ts diff --git a/extensions/matrix/src/matrix/actions/types.ts b/native-plugins/matrix/src/matrix/actions/types.ts similarity index 100% rename from extensions/matrix/src/matrix/actions/types.ts rename to native-plugins/matrix/src/matrix/actions/types.ts diff --git a/extensions/matrix/src/matrix/actions/verification.test.ts b/native-plugins/matrix/src/matrix/actions/verification.test.ts similarity index 100% rename from extensions/matrix/src/matrix/actions/verification.test.ts rename to native-plugins/matrix/src/matrix/actions/verification.test.ts diff --git a/extensions/matrix/src/matrix/actions/verification.ts b/native-plugins/matrix/src/matrix/actions/verification.ts similarity index 100% rename from extensions/matrix/src/matrix/actions/verification.ts rename to native-plugins/matrix/src/matrix/actions/verification.ts diff --git a/extensions/matrix/src/matrix/active-client.ts b/native-plugins/matrix/src/matrix/active-client.ts similarity index 100% rename from extensions/matrix/src/matrix/active-client.ts rename to native-plugins/matrix/src/matrix/active-client.ts diff --git a/extensions/matrix/src/matrix/backup-health.ts b/native-plugins/matrix/src/matrix/backup-health.ts similarity index 100% rename from extensions/matrix/src/matrix/backup-health.ts rename to native-plugins/matrix/src/matrix/backup-health.ts diff --git a/extensions/matrix/src/matrix/client-bootstrap.test.ts b/native-plugins/matrix/src/matrix/client-bootstrap.test.ts similarity index 100% rename from extensions/matrix/src/matrix/client-bootstrap.test.ts rename to native-plugins/matrix/src/matrix/client-bootstrap.test.ts diff --git a/extensions/matrix/src/matrix/client-bootstrap.ts b/native-plugins/matrix/src/matrix/client-bootstrap.ts similarity index 100% rename from extensions/matrix/src/matrix/client-bootstrap.ts rename to native-plugins/matrix/src/matrix/client-bootstrap.ts diff --git a/extensions/matrix/src/matrix/client-resolver.test-helpers.ts b/native-plugins/matrix/src/matrix/client-resolver.test-helpers.ts similarity index 100% rename from extensions/matrix/src/matrix/client-resolver.test-helpers.ts rename to native-plugins/matrix/src/matrix/client-resolver.test-helpers.ts diff --git a/extensions/matrix/src/matrix/client.test.ts b/native-plugins/matrix/src/matrix/client.test.ts similarity index 100% rename from extensions/matrix/src/matrix/client.test.ts rename to native-plugins/matrix/src/matrix/client.test.ts diff --git a/extensions/matrix/src/matrix/client.ts b/native-plugins/matrix/src/matrix/client.ts similarity index 100% rename from extensions/matrix/src/matrix/client.ts rename to native-plugins/matrix/src/matrix/client.ts diff --git a/extensions/matrix/src/matrix/client/config.ts b/native-plugins/matrix/src/matrix/client/config.ts similarity index 100% rename from extensions/matrix/src/matrix/client/config.ts rename to native-plugins/matrix/src/matrix/client/config.ts diff --git a/extensions/matrix/src/matrix/client/create-client.ts b/native-plugins/matrix/src/matrix/client/create-client.ts similarity index 100% rename from extensions/matrix/src/matrix/client/create-client.ts rename to native-plugins/matrix/src/matrix/client/create-client.ts diff --git a/extensions/matrix/src/matrix/client/file-sync-store.test.ts b/native-plugins/matrix/src/matrix/client/file-sync-store.test.ts similarity index 100% rename from extensions/matrix/src/matrix/client/file-sync-store.test.ts rename to native-plugins/matrix/src/matrix/client/file-sync-store.test.ts diff --git a/extensions/matrix/src/matrix/client/file-sync-store.ts b/native-plugins/matrix/src/matrix/client/file-sync-store.ts similarity index 100% rename from extensions/matrix/src/matrix/client/file-sync-store.ts rename to native-plugins/matrix/src/matrix/client/file-sync-store.ts diff --git a/extensions/matrix/src/matrix/client/logging.ts b/native-plugins/matrix/src/matrix/client/logging.ts similarity index 100% rename from extensions/matrix/src/matrix/client/logging.ts rename to native-plugins/matrix/src/matrix/client/logging.ts diff --git a/extensions/matrix/src/matrix/client/runtime.ts b/native-plugins/matrix/src/matrix/client/runtime.ts similarity index 100% rename from extensions/matrix/src/matrix/client/runtime.ts rename to native-plugins/matrix/src/matrix/client/runtime.ts diff --git a/extensions/matrix/src/matrix/client/shared.test.ts b/native-plugins/matrix/src/matrix/client/shared.test.ts similarity index 100% rename from extensions/matrix/src/matrix/client/shared.test.ts rename to native-plugins/matrix/src/matrix/client/shared.test.ts diff --git a/extensions/matrix/src/matrix/client/shared.ts b/native-plugins/matrix/src/matrix/client/shared.ts similarity index 100% rename from extensions/matrix/src/matrix/client/shared.ts rename to native-plugins/matrix/src/matrix/client/shared.ts diff --git a/extensions/matrix/src/matrix/client/storage.test.ts b/native-plugins/matrix/src/matrix/client/storage.test.ts similarity index 100% rename from extensions/matrix/src/matrix/client/storage.test.ts rename to native-plugins/matrix/src/matrix/client/storage.test.ts diff --git a/extensions/matrix/src/matrix/client/storage.ts b/native-plugins/matrix/src/matrix/client/storage.ts similarity index 100% rename from extensions/matrix/src/matrix/client/storage.ts rename to native-plugins/matrix/src/matrix/client/storage.ts diff --git a/extensions/matrix/src/matrix/client/types.ts b/native-plugins/matrix/src/matrix/client/types.ts similarity index 100% rename from extensions/matrix/src/matrix/client/types.ts rename to native-plugins/matrix/src/matrix/client/types.ts diff --git a/extensions/matrix/src/matrix/config-update.test.ts b/native-plugins/matrix/src/matrix/config-update.test.ts similarity index 100% rename from extensions/matrix/src/matrix/config-update.test.ts rename to native-plugins/matrix/src/matrix/config-update.test.ts diff --git a/extensions/matrix/src/matrix/config-update.ts b/native-plugins/matrix/src/matrix/config-update.ts similarity index 100% rename from extensions/matrix/src/matrix/config-update.ts rename to native-plugins/matrix/src/matrix/config-update.ts diff --git a/extensions/matrix/src/matrix/credentials-read.ts b/native-plugins/matrix/src/matrix/credentials-read.ts similarity index 100% rename from extensions/matrix/src/matrix/credentials-read.ts rename to native-plugins/matrix/src/matrix/credentials-read.ts diff --git a/extensions/matrix/src/matrix/credentials-write.runtime.ts b/native-plugins/matrix/src/matrix/credentials-write.runtime.ts similarity index 100% rename from extensions/matrix/src/matrix/credentials-write.runtime.ts rename to native-plugins/matrix/src/matrix/credentials-write.runtime.ts diff --git a/extensions/matrix/src/matrix/credentials.test.ts b/native-plugins/matrix/src/matrix/credentials.test.ts similarity index 100% rename from extensions/matrix/src/matrix/credentials.test.ts rename to native-plugins/matrix/src/matrix/credentials.test.ts diff --git a/extensions/matrix/src/matrix/credentials.ts b/native-plugins/matrix/src/matrix/credentials.ts similarity index 100% rename from extensions/matrix/src/matrix/credentials.ts rename to native-plugins/matrix/src/matrix/credentials.ts diff --git a/extensions/matrix/src/matrix/deps.test.ts b/native-plugins/matrix/src/matrix/deps.test.ts similarity index 100% rename from extensions/matrix/src/matrix/deps.test.ts rename to native-plugins/matrix/src/matrix/deps.test.ts diff --git a/extensions/matrix/src/matrix/deps.ts b/native-plugins/matrix/src/matrix/deps.ts similarity index 100% rename from extensions/matrix/src/matrix/deps.ts rename to native-plugins/matrix/src/matrix/deps.ts diff --git a/extensions/matrix/src/matrix/device-health.test.ts b/native-plugins/matrix/src/matrix/device-health.test.ts similarity index 100% rename from extensions/matrix/src/matrix/device-health.test.ts rename to native-plugins/matrix/src/matrix/device-health.test.ts diff --git a/extensions/matrix/src/matrix/device-health.ts b/native-plugins/matrix/src/matrix/device-health.ts similarity index 100% rename from extensions/matrix/src/matrix/device-health.ts rename to native-plugins/matrix/src/matrix/device-health.ts diff --git a/extensions/matrix/src/matrix/direct-management.test.ts b/native-plugins/matrix/src/matrix/direct-management.test.ts similarity index 100% rename from extensions/matrix/src/matrix/direct-management.test.ts rename to native-plugins/matrix/src/matrix/direct-management.test.ts diff --git a/extensions/matrix/src/matrix/direct-management.ts b/native-plugins/matrix/src/matrix/direct-management.ts similarity index 100% rename from extensions/matrix/src/matrix/direct-management.ts rename to native-plugins/matrix/src/matrix/direct-management.ts diff --git a/extensions/matrix/src/matrix/direct-room.ts b/native-plugins/matrix/src/matrix/direct-room.ts similarity index 100% rename from extensions/matrix/src/matrix/direct-room.ts rename to native-plugins/matrix/src/matrix/direct-room.ts diff --git a/extensions/matrix/src/matrix/encryption-guidance.ts b/native-plugins/matrix/src/matrix/encryption-guidance.ts similarity index 100% rename from extensions/matrix/src/matrix/encryption-guidance.ts rename to native-plugins/matrix/src/matrix/encryption-guidance.ts diff --git a/extensions/matrix/src/matrix/format.test.ts b/native-plugins/matrix/src/matrix/format.test.ts similarity index 100% rename from extensions/matrix/src/matrix/format.test.ts rename to native-plugins/matrix/src/matrix/format.test.ts diff --git a/extensions/matrix/src/matrix/format.ts b/native-plugins/matrix/src/matrix/format.ts similarity index 100% rename from extensions/matrix/src/matrix/format.ts rename to native-plugins/matrix/src/matrix/format.ts diff --git a/extensions/matrix/src/matrix/index.ts b/native-plugins/matrix/src/matrix/index.ts similarity index 100% rename from extensions/matrix/src/matrix/index.ts rename to native-plugins/matrix/src/matrix/index.ts diff --git a/extensions/matrix/src/matrix/legacy-crypto-inspector.ts b/native-plugins/matrix/src/matrix/legacy-crypto-inspector.ts similarity index 100% rename from extensions/matrix/src/matrix/legacy-crypto-inspector.ts rename to native-plugins/matrix/src/matrix/legacy-crypto-inspector.ts diff --git a/extensions/matrix/src/matrix/media-text.ts b/native-plugins/matrix/src/matrix/media-text.ts similarity index 100% rename from extensions/matrix/src/matrix/media-text.ts rename to native-plugins/matrix/src/matrix/media-text.ts diff --git a/extensions/matrix/src/matrix/monitor/access-state.test.ts b/native-plugins/matrix/src/matrix/monitor/access-state.test.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/access-state.test.ts rename to native-plugins/matrix/src/matrix/monitor/access-state.test.ts diff --git a/extensions/matrix/src/matrix/monitor/access-state.ts b/native-plugins/matrix/src/matrix/monitor/access-state.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/access-state.ts rename to native-plugins/matrix/src/matrix/monitor/access-state.ts diff --git a/extensions/matrix/src/matrix/monitor/ack-config.test.ts b/native-plugins/matrix/src/matrix/monitor/ack-config.test.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/ack-config.test.ts rename to native-plugins/matrix/src/matrix/monitor/ack-config.test.ts diff --git a/extensions/matrix/src/matrix/monitor/ack-config.ts b/native-plugins/matrix/src/matrix/monitor/ack-config.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/ack-config.ts rename to native-plugins/matrix/src/matrix/monitor/ack-config.ts diff --git a/extensions/matrix/src/matrix/monitor/allowlist.test.ts b/native-plugins/matrix/src/matrix/monitor/allowlist.test.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/allowlist.test.ts rename to native-plugins/matrix/src/matrix/monitor/allowlist.test.ts diff --git a/extensions/matrix/src/matrix/monitor/allowlist.ts b/native-plugins/matrix/src/matrix/monitor/allowlist.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/allowlist.ts rename to native-plugins/matrix/src/matrix/monitor/allowlist.ts diff --git a/extensions/matrix/src/matrix/monitor/auto-join.test.ts b/native-plugins/matrix/src/matrix/monitor/auto-join.test.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/auto-join.test.ts rename to native-plugins/matrix/src/matrix/monitor/auto-join.test.ts diff --git a/extensions/matrix/src/matrix/monitor/auto-join.ts b/native-plugins/matrix/src/matrix/monitor/auto-join.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/auto-join.ts rename to native-plugins/matrix/src/matrix/monitor/auto-join.ts diff --git a/extensions/matrix/src/matrix/monitor/config.test.ts b/native-plugins/matrix/src/matrix/monitor/config.test.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/config.test.ts rename to native-plugins/matrix/src/matrix/monitor/config.test.ts diff --git a/extensions/matrix/src/matrix/monitor/config.ts b/native-plugins/matrix/src/matrix/monitor/config.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/config.ts rename to native-plugins/matrix/src/matrix/monitor/config.ts diff --git a/extensions/matrix/src/matrix/monitor/direct.test.ts b/native-plugins/matrix/src/matrix/monitor/direct.test.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/direct.test.ts rename to native-plugins/matrix/src/matrix/monitor/direct.test.ts diff --git a/extensions/matrix/src/matrix/monitor/direct.ts b/native-plugins/matrix/src/matrix/monitor/direct.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/direct.ts rename to native-plugins/matrix/src/matrix/monitor/direct.ts diff --git a/extensions/matrix/src/matrix/monitor/events.test.ts b/native-plugins/matrix/src/matrix/monitor/events.test.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/events.test.ts rename to native-plugins/matrix/src/matrix/monitor/events.test.ts diff --git a/extensions/matrix/src/matrix/monitor/events.ts b/native-plugins/matrix/src/matrix/monitor/events.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/events.ts rename to native-plugins/matrix/src/matrix/monitor/events.ts diff --git a/extensions/matrix/src/matrix/monitor/handler.body-for-agent.test.ts b/native-plugins/matrix/src/matrix/monitor/handler.body-for-agent.test.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/handler.body-for-agent.test.ts rename to native-plugins/matrix/src/matrix/monitor/handler.body-for-agent.test.ts diff --git a/extensions/matrix/src/matrix/monitor/handler.media-failure.test.ts b/native-plugins/matrix/src/matrix/monitor/handler.media-failure.test.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/handler.media-failure.test.ts rename to native-plugins/matrix/src/matrix/monitor/handler.media-failure.test.ts diff --git a/extensions/matrix/src/matrix/monitor/handler.test-helpers.ts b/native-plugins/matrix/src/matrix/monitor/handler.test-helpers.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/handler.test-helpers.ts rename to native-plugins/matrix/src/matrix/monitor/handler.test-helpers.ts diff --git a/extensions/matrix/src/matrix/monitor/handler.test.ts b/native-plugins/matrix/src/matrix/monitor/handler.test.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/handler.test.ts rename to native-plugins/matrix/src/matrix/monitor/handler.test.ts diff --git a/extensions/matrix/src/matrix/monitor/handler.thread-root-media.test.ts b/native-plugins/matrix/src/matrix/monitor/handler.thread-root-media.test.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/handler.thread-root-media.test.ts rename to native-plugins/matrix/src/matrix/monitor/handler.thread-root-media.test.ts diff --git a/extensions/matrix/src/matrix/monitor/handler.ts b/native-plugins/matrix/src/matrix/monitor/handler.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/handler.ts rename to native-plugins/matrix/src/matrix/monitor/handler.ts diff --git a/extensions/matrix/src/matrix/monitor/index.test.ts b/native-plugins/matrix/src/matrix/monitor/index.test.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/index.test.ts rename to native-plugins/matrix/src/matrix/monitor/index.test.ts diff --git a/extensions/matrix/src/matrix/monitor/index.ts b/native-plugins/matrix/src/matrix/monitor/index.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/index.ts rename to native-plugins/matrix/src/matrix/monitor/index.ts diff --git a/extensions/matrix/src/matrix/monitor/legacy-crypto-restore.test.ts b/native-plugins/matrix/src/matrix/monitor/legacy-crypto-restore.test.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/legacy-crypto-restore.test.ts rename to native-plugins/matrix/src/matrix/monitor/legacy-crypto-restore.test.ts diff --git a/extensions/matrix/src/matrix/monitor/legacy-crypto-restore.ts b/native-plugins/matrix/src/matrix/monitor/legacy-crypto-restore.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/legacy-crypto-restore.ts rename to native-plugins/matrix/src/matrix/monitor/legacy-crypto-restore.ts diff --git a/extensions/matrix/src/matrix/monitor/location.ts b/native-plugins/matrix/src/matrix/monitor/location.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/location.ts rename to native-plugins/matrix/src/matrix/monitor/location.ts diff --git a/extensions/matrix/src/matrix/monitor/media.test.ts b/native-plugins/matrix/src/matrix/monitor/media.test.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/media.test.ts rename to native-plugins/matrix/src/matrix/monitor/media.test.ts diff --git a/extensions/matrix/src/matrix/monitor/media.ts b/native-plugins/matrix/src/matrix/monitor/media.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/media.ts rename to native-plugins/matrix/src/matrix/monitor/media.ts diff --git a/extensions/matrix/src/matrix/monitor/mentions.test.ts b/native-plugins/matrix/src/matrix/monitor/mentions.test.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/mentions.test.ts rename to native-plugins/matrix/src/matrix/monitor/mentions.test.ts diff --git a/extensions/matrix/src/matrix/monitor/mentions.ts b/native-plugins/matrix/src/matrix/monitor/mentions.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/mentions.ts rename to native-plugins/matrix/src/matrix/monitor/mentions.ts diff --git a/extensions/matrix/src/matrix/monitor/reaction-events.ts b/native-plugins/matrix/src/matrix/monitor/reaction-events.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/reaction-events.ts rename to native-plugins/matrix/src/matrix/monitor/reaction-events.ts diff --git a/extensions/matrix/src/matrix/monitor/replies.test.ts b/native-plugins/matrix/src/matrix/monitor/replies.test.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/replies.test.ts rename to native-plugins/matrix/src/matrix/monitor/replies.test.ts diff --git a/extensions/matrix/src/matrix/monitor/replies.ts b/native-plugins/matrix/src/matrix/monitor/replies.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/replies.ts rename to native-plugins/matrix/src/matrix/monitor/replies.ts diff --git a/extensions/matrix/src/matrix/monitor/room-info.test.ts b/native-plugins/matrix/src/matrix/monitor/room-info.test.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/room-info.test.ts rename to native-plugins/matrix/src/matrix/monitor/room-info.test.ts diff --git a/extensions/matrix/src/matrix/monitor/room-info.ts b/native-plugins/matrix/src/matrix/monitor/room-info.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/room-info.ts rename to native-plugins/matrix/src/matrix/monitor/room-info.ts diff --git a/extensions/matrix/src/matrix/monitor/rooms.test.ts b/native-plugins/matrix/src/matrix/monitor/rooms.test.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/rooms.test.ts rename to native-plugins/matrix/src/matrix/monitor/rooms.test.ts diff --git a/extensions/matrix/src/matrix/monitor/rooms.ts b/native-plugins/matrix/src/matrix/monitor/rooms.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/rooms.ts rename to native-plugins/matrix/src/matrix/monitor/rooms.ts diff --git a/extensions/matrix/src/matrix/monitor/route.test.ts b/native-plugins/matrix/src/matrix/monitor/route.test.ts similarity index 98% rename from extensions/matrix/src/matrix/monitor/route.test.ts rename to native-plugins/matrix/src/matrix/monitor/route.test.ts index f170db9080b..9f0abcbfdf3 100644 --- a/extensions/matrix/src/matrix/monitor/route.test.ts +++ b/native-plugins/matrix/src/matrix/monitor/route.test.ts @@ -6,7 +6,7 @@ import { resolveAgentRoute, setActivePluginRegistry, type OpenClawConfig, -} from "../../../../../test/helpers/extensions/matrix-monitor-route.js"; +} from "../../../../../test/helpers/native-plugins/matrix-monitor-route.js"; import { matrixPlugin } from "../../channel.js"; import { resolveMatrixInboundRoute } from "./route.js"; diff --git a/extensions/matrix/src/matrix/monitor/route.ts b/native-plugins/matrix/src/matrix/monitor/route.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/route.ts rename to native-plugins/matrix/src/matrix/monitor/route.ts diff --git a/extensions/matrix/src/matrix/monitor/startup-verification.test.ts b/native-plugins/matrix/src/matrix/monitor/startup-verification.test.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/startup-verification.test.ts rename to native-plugins/matrix/src/matrix/monitor/startup-verification.test.ts diff --git a/extensions/matrix/src/matrix/monitor/startup-verification.ts b/native-plugins/matrix/src/matrix/monitor/startup-verification.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/startup-verification.ts rename to native-plugins/matrix/src/matrix/monitor/startup-verification.ts diff --git a/extensions/matrix/src/matrix/monitor/startup.test.ts b/native-plugins/matrix/src/matrix/monitor/startup.test.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/startup.test.ts rename to native-plugins/matrix/src/matrix/monitor/startup.test.ts diff --git a/extensions/matrix/src/matrix/monitor/startup.ts b/native-plugins/matrix/src/matrix/monitor/startup.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/startup.ts rename to native-plugins/matrix/src/matrix/monitor/startup.ts diff --git a/extensions/matrix/src/matrix/monitor/thread-context.test.ts b/native-plugins/matrix/src/matrix/monitor/thread-context.test.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/thread-context.test.ts rename to native-plugins/matrix/src/matrix/monitor/thread-context.test.ts diff --git a/extensions/matrix/src/matrix/monitor/thread-context.ts b/native-plugins/matrix/src/matrix/monitor/thread-context.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/thread-context.ts rename to native-plugins/matrix/src/matrix/monitor/thread-context.ts diff --git a/extensions/matrix/src/matrix/monitor/threads.ts b/native-plugins/matrix/src/matrix/monitor/threads.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/threads.ts rename to native-plugins/matrix/src/matrix/monitor/threads.ts diff --git a/extensions/matrix/src/matrix/monitor/types.ts b/native-plugins/matrix/src/matrix/monitor/types.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/types.ts rename to native-plugins/matrix/src/matrix/monitor/types.ts diff --git a/extensions/matrix/src/matrix/monitor/verification-events.ts b/native-plugins/matrix/src/matrix/monitor/verification-events.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/verification-events.ts rename to native-plugins/matrix/src/matrix/monitor/verification-events.ts diff --git a/extensions/matrix/src/matrix/monitor/verification-utils.test.ts b/native-plugins/matrix/src/matrix/monitor/verification-utils.test.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/verification-utils.test.ts rename to native-plugins/matrix/src/matrix/monitor/verification-utils.test.ts diff --git a/extensions/matrix/src/matrix/monitor/verification-utils.ts b/native-plugins/matrix/src/matrix/monitor/verification-utils.ts similarity index 100% rename from extensions/matrix/src/matrix/monitor/verification-utils.ts rename to native-plugins/matrix/src/matrix/monitor/verification-utils.ts diff --git a/extensions/matrix/src/matrix/poll-summary.ts b/native-plugins/matrix/src/matrix/poll-summary.ts similarity index 100% rename from extensions/matrix/src/matrix/poll-summary.ts rename to native-plugins/matrix/src/matrix/poll-summary.ts diff --git a/extensions/matrix/src/matrix/poll-types.test.ts b/native-plugins/matrix/src/matrix/poll-types.test.ts similarity index 100% rename from extensions/matrix/src/matrix/poll-types.test.ts rename to native-plugins/matrix/src/matrix/poll-types.test.ts diff --git a/extensions/matrix/src/matrix/poll-types.ts b/native-plugins/matrix/src/matrix/poll-types.ts similarity index 100% rename from extensions/matrix/src/matrix/poll-types.ts rename to native-plugins/matrix/src/matrix/poll-types.ts diff --git a/extensions/matrix/src/matrix/probe.test.ts b/native-plugins/matrix/src/matrix/probe.test.ts similarity index 100% rename from extensions/matrix/src/matrix/probe.test.ts rename to native-plugins/matrix/src/matrix/probe.test.ts diff --git a/extensions/matrix/src/matrix/probe.ts b/native-plugins/matrix/src/matrix/probe.ts similarity index 100% rename from extensions/matrix/src/matrix/probe.ts rename to native-plugins/matrix/src/matrix/probe.ts diff --git a/extensions/matrix/src/matrix/profile.test.ts b/native-plugins/matrix/src/matrix/profile.test.ts similarity index 100% rename from extensions/matrix/src/matrix/profile.test.ts rename to native-plugins/matrix/src/matrix/profile.test.ts diff --git a/extensions/matrix/src/matrix/profile.ts b/native-plugins/matrix/src/matrix/profile.ts similarity index 100% rename from extensions/matrix/src/matrix/profile.ts rename to native-plugins/matrix/src/matrix/profile.ts diff --git a/extensions/matrix/src/matrix/reaction-common.test.ts b/native-plugins/matrix/src/matrix/reaction-common.test.ts similarity index 100% rename from extensions/matrix/src/matrix/reaction-common.test.ts rename to native-plugins/matrix/src/matrix/reaction-common.test.ts diff --git a/extensions/matrix/src/matrix/reaction-common.ts b/native-plugins/matrix/src/matrix/reaction-common.ts similarity index 100% rename from extensions/matrix/src/matrix/reaction-common.ts rename to native-plugins/matrix/src/matrix/reaction-common.ts diff --git a/extensions/matrix/src/matrix/sdk.test.ts b/native-plugins/matrix/src/matrix/sdk.test.ts similarity index 100% rename from extensions/matrix/src/matrix/sdk.test.ts rename to native-plugins/matrix/src/matrix/sdk.test.ts diff --git a/extensions/matrix/src/matrix/sdk.ts b/native-plugins/matrix/src/matrix/sdk.ts similarity index 100% rename from extensions/matrix/src/matrix/sdk.ts rename to native-plugins/matrix/src/matrix/sdk.ts diff --git a/extensions/matrix/src/matrix/sdk/crypto-bootstrap.test.ts b/native-plugins/matrix/src/matrix/sdk/crypto-bootstrap.test.ts similarity index 100% rename from extensions/matrix/src/matrix/sdk/crypto-bootstrap.test.ts rename to native-plugins/matrix/src/matrix/sdk/crypto-bootstrap.test.ts diff --git a/extensions/matrix/src/matrix/sdk/crypto-bootstrap.ts b/native-plugins/matrix/src/matrix/sdk/crypto-bootstrap.ts similarity index 100% rename from extensions/matrix/src/matrix/sdk/crypto-bootstrap.ts rename to native-plugins/matrix/src/matrix/sdk/crypto-bootstrap.ts diff --git a/extensions/matrix/src/matrix/sdk/crypto-facade.test.ts b/native-plugins/matrix/src/matrix/sdk/crypto-facade.test.ts similarity index 100% rename from extensions/matrix/src/matrix/sdk/crypto-facade.test.ts rename to native-plugins/matrix/src/matrix/sdk/crypto-facade.test.ts diff --git a/extensions/matrix/src/matrix/sdk/crypto-facade.ts b/native-plugins/matrix/src/matrix/sdk/crypto-facade.ts similarity index 100% rename from extensions/matrix/src/matrix/sdk/crypto-facade.ts rename to native-plugins/matrix/src/matrix/sdk/crypto-facade.ts diff --git a/extensions/matrix/src/matrix/sdk/crypto-node.runtime.ts b/native-plugins/matrix/src/matrix/sdk/crypto-node.runtime.ts similarity index 100% rename from extensions/matrix/src/matrix/sdk/crypto-node.runtime.ts rename to native-plugins/matrix/src/matrix/sdk/crypto-node.runtime.ts diff --git a/extensions/matrix/src/matrix/sdk/decrypt-bridge.ts b/native-plugins/matrix/src/matrix/sdk/decrypt-bridge.ts similarity index 100% rename from extensions/matrix/src/matrix/sdk/decrypt-bridge.ts rename to native-plugins/matrix/src/matrix/sdk/decrypt-bridge.ts diff --git a/extensions/matrix/src/matrix/sdk/event-helpers.test.ts b/native-plugins/matrix/src/matrix/sdk/event-helpers.test.ts similarity index 100% rename from extensions/matrix/src/matrix/sdk/event-helpers.test.ts rename to native-plugins/matrix/src/matrix/sdk/event-helpers.test.ts diff --git a/extensions/matrix/src/matrix/sdk/event-helpers.ts b/native-plugins/matrix/src/matrix/sdk/event-helpers.ts similarity index 100% rename from extensions/matrix/src/matrix/sdk/event-helpers.ts rename to native-plugins/matrix/src/matrix/sdk/event-helpers.ts diff --git a/extensions/matrix/src/matrix/sdk/http-client.test.ts b/native-plugins/matrix/src/matrix/sdk/http-client.test.ts similarity index 100% rename from extensions/matrix/src/matrix/sdk/http-client.test.ts rename to native-plugins/matrix/src/matrix/sdk/http-client.test.ts diff --git a/extensions/matrix/src/matrix/sdk/http-client.ts b/native-plugins/matrix/src/matrix/sdk/http-client.ts similarity index 100% rename from extensions/matrix/src/matrix/sdk/http-client.ts rename to native-plugins/matrix/src/matrix/sdk/http-client.ts diff --git a/extensions/matrix/src/matrix/sdk/idb-persistence.test.ts b/native-plugins/matrix/src/matrix/sdk/idb-persistence.test.ts similarity index 100% rename from extensions/matrix/src/matrix/sdk/idb-persistence.test.ts rename to native-plugins/matrix/src/matrix/sdk/idb-persistence.test.ts diff --git a/extensions/matrix/src/matrix/sdk/idb-persistence.ts b/native-plugins/matrix/src/matrix/sdk/idb-persistence.ts similarity index 100% rename from extensions/matrix/src/matrix/sdk/idb-persistence.ts rename to native-plugins/matrix/src/matrix/sdk/idb-persistence.ts diff --git a/extensions/matrix/src/matrix/sdk/logger.test.ts b/native-plugins/matrix/src/matrix/sdk/logger.test.ts similarity index 100% rename from extensions/matrix/src/matrix/sdk/logger.test.ts rename to native-plugins/matrix/src/matrix/sdk/logger.test.ts diff --git a/extensions/matrix/src/matrix/sdk/logger.ts b/native-plugins/matrix/src/matrix/sdk/logger.ts similarity index 100% rename from extensions/matrix/src/matrix/sdk/logger.ts rename to native-plugins/matrix/src/matrix/sdk/logger.ts diff --git a/extensions/matrix/src/matrix/sdk/read-response-with-limit.ts b/native-plugins/matrix/src/matrix/sdk/read-response-with-limit.ts similarity index 100% rename from extensions/matrix/src/matrix/sdk/read-response-with-limit.ts rename to native-plugins/matrix/src/matrix/sdk/read-response-with-limit.ts diff --git a/extensions/matrix/src/matrix/sdk/recovery-key-store.test.ts b/native-plugins/matrix/src/matrix/sdk/recovery-key-store.test.ts similarity index 100% rename from extensions/matrix/src/matrix/sdk/recovery-key-store.test.ts rename to native-plugins/matrix/src/matrix/sdk/recovery-key-store.test.ts diff --git a/extensions/matrix/src/matrix/sdk/recovery-key-store.ts b/native-plugins/matrix/src/matrix/sdk/recovery-key-store.ts similarity index 100% rename from extensions/matrix/src/matrix/sdk/recovery-key-store.ts rename to native-plugins/matrix/src/matrix/sdk/recovery-key-store.ts diff --git a/extensions/matrix/src/matrix/sdk/transport.test.ts b/native-plugins/matrix/src/matrix/sdk/transport.test.ts similarity index 100% rename from extensions/matrix/src/matrix/sdk/transport.test.ts rename to native-plugins/matrix/src/matrix/sdk/transport.test.ts diff --git a/extensions/matrix/src/matrix/sdk/transport.ts b/native-plugins/matrix/src/matrix/sdk/transport.ts similarity index 100% rename from extensions/matrix/src/matrix/sdk/transport.ts rename to native-plugins/matrix/src/matrix/sdk/transport.ts diff --git a/extensions/matrix/src/matrix/sdk/types.ts b/native-plugins/matrix/src/matrix/sdk/types.ts similarity index 100% rename from extensions/matrix/src/matrix/sdk/types.ts rename to native-plugins/matrix/src/matrix/sdk/types.ts diff --git a/extensions/matrix/src/matrix/sdk/verification-manager.test.ts b/native-plugins/matrix/src/matrix/sdk/verification-manager.test.ts similarity index 100% rename from extensions/matrix/src/matrix/sdk/verification-manager.test.ts rename to native-plugins/matrix/src/matrix/sdk/verification-manager.test.ts diff --git a/extensions/matrix/src/matrix/sdk/verification-manager.ts b/native-plugins/matrix/src/matrix/sdk/verification-manager.ts similarity index 100% rename from extensions/matrix/src/matrix/sdk/verification-manager.ts rename to native-plugins/matrix/src/matrix/sdk/verification-manager.ts diff --git a/extensions/matrix/src/matrix/sdk/verification-status.ts b/native-plugins/matrix/src/matrix/sdk/verification-status.ts similarity index 100% rename from extensions/matrix/src/matrix/sdk/verification-status.ts rename to native-plugins/matrix/src/matrix/sdk/verification-status.ts diff --git a/extensions/matrix/src/matrix/send.test.ts b/native-plugins/matrix/src/matrix/send.test.ts similarity index 100% rename from extensions/matrix/src/matrix/send.test.ts rename to native-plugins/matrix/src/matrix/send.test.ts diff --git a/extensions/matrix/src/matrix/send.ts b/native-plugins/matrix/src/matrix/send.ts similarity index 100% rename from extensions/matrix/src/matrix/send.ts rename to native-plugins/matrix/src/matrix/send.ts diff --git a/extensions/matrix/src/matrix/send/client.test.ts b/native-plugins/matrix/src/matrix/send/client.test.ts similarity index 100% rename from extensions/matrix/src/matrix/send/client.test.ts rename to native-plugins/matrix/src/matrix/send/client.test.ts diff --git a/extensions/matrix/src/matrix/send/client.ts b/native-plugins/matrix/src/matrix/send/client.ts similarity index 100% rename from extensions/matrix/src/matrix/send/client.ts rename to native-plugins/matrix/src/matrix/send/client.ts diff --git a/extensions/matrix/src/matrix/send/formatting.ts b/native-plugins/matrix/src/matrix/send/formatting.ts similarity index 100% rename from extensions/matrix/src/matrix/send/formatting.ts rename to native-plugins/matrix/src/matrix/send/formatting.ts diff --git a/extensions/matrix/src/matrix/send/media.ts b/native-plugins/matrix/src/matrix/send/media.ts similarity index 100% rename from extensions/matrix/src/matrix/send/media.ts rename to native-plugins/matrix/src/matrix/send/media.ts diff --git a/extensions/matrix/src/matrix/send/targets.test.ts b/native-plugins/matrix/src/matrix/send/targets.test.ts similarity index 100% rename from extensions/matrix/src/matrix/send/targets.test.ts rename to native-plugins/matrix/src/matrix/send/targets.test.ts diff --git a/extensions/matrix/src/matrix/send/targets.ts b/native-plugins/matrix/src/matrix/send/targets.ts similarity index 100% rename from extensions/matrix/src/matrix/send/targets.ts rename to native-plugins/matrix/src/matrix/send/targets.ts diff --git a/extensions/matrix/src/matrix/send/types.ts b/native-plugins/matrix/src/matrix/send/types.ts similarity index 100% rename from extensions/matrix/src/matrix/send/types.ts rename to native-plugins/matrix/src/matrix/send/types.ts diff --git a/extensions/matrix/src/matrix/target-ids.ts b/native-plugins/matrix/src/matrix/target-ids.ts similarity index 100% rename from extensions/matrix/src/matrix/target-ids.ts rename to native-plugins/matrix/src/matrix/target-ids.ts diff --git a/extensions/matrix/src/matrix/thread-bindings-shared.ts b/native-plugins/matrix/src/matrix/thread-bindings-shared.ts similarity index 100% rename from extensions/matrix/src/matrix/thread-bindings-shared.ts rename to native-plugins/matrix/src/matrix/thread-bindings-shared.ts diff --git a/extensions/matrix/src/matrix/thread-bindings.test.ts b/native-plugins/matrix/src/matrix/thread-bindings.test.ts similarity index 100% rename from extensions/matrix/src/matrix/thread-bindings.test.ts rename to native-plugins/matrix/src/matrix/thread-bindings.test.ts diff --git a/extensions/matrix/src/matrix/thread-bindings.ts b/native-plugins/matrix/src/matrix/thread-bindings.ts similarity index 100% rename from extensions/matrix/src/matrix/thread-bindings.ts rename to native-plugins/matrix/src/matrix/thread-bindings.ts diff --git a/extensions/matrix/src/onboarding.resolve.test.ts b/native-plugins/matrix/src/onboarding.resolve.test.ts similarity index 100% rename from extensions/matrix/src/onboarding.resolve.test.ts rename to native-plugins/matrix/src/onboarding.resolve.test.ts diff --git a/extensions/matrix/src/onboarding.test.ts b/native-plugins/matrix/src/onboarding.test.ts similarity index 100% rename from extensions/matrix/src/onboarding.test.ts rename to native-plugins/matrix/src/onboarding.test.ts diff --git a/extensions/matrix/src/onboarding.ts b/native-plugins/matrix/src/onboarding.ts similarity index 100% rename from extensions/matrix/src/onboarding.ts rename to native-plugins/matrix/src/onboarding.ts diff --git a/extensions/matrix/src/outbound.test.ts b/native-plugins/matrix/src/outbound.test.ts similarity index 100% rename from extensions/matrix/src/outbound.test.ts rename to native-plugins/matrix/src/outbound.test.ts diff --git a/extensions/matrix/src/outbound.ts b/native-plugins/matrix/src/outbound.ts similarity index 100% rename from extensions/matrix/src/outbound.ts rename to native-plugins/matrix/src/outbound.ts diff --git a/extensions/matrix/src/plugin-entry.runtime.ts b/native-plugins/matrix/src/plugin-entry.runtime.ts similarity index 100% rename from extensions/matrix/src/plugin-entry.runtime.ts rename to native-plugins/matrix/src/plugin-entry.runtime.ts diff --git a/extensions/matrix/src/profile-update.ts b/native-plugins/matrix/src/profile-update.ts similarity index 100% rename from extensions/matrix/src/profile-update.ts rename to native-plugins/matrix/src/profile-update.ts diff --git a/extensions/matrix/src/resolve-targets.test.ts b/native-plugins/matrix/src/resolve-targets.test.ts similarity index 100% rename from extensions/matrix/src/resolve-targets.test.ts rename to native-plugins/matrix/src/resolve-targets.test.ts diff --git a/extensions/matrix/src/resolve-targets.ts b/native-plugins/matrix/src/resolve-targets.ts similarity index 100% rename from extensions/matrix/src/resolve-targets.ts rename to native-plugins/matrix/src/resolve-targets.ts diff --git a/extensions/matrix/src/runtime-api.ts b/native-plugins/matrix/src/runtime-api.ts similarity index 100% rename from extensions/matrix/src/runtime-api.ts rename to native-plugins/matrix/src/runtime-api.ts diff --git a/extensions/matrix/src/runtime.ts b/native-plugins/matrix/src/runtime.ts similarity index 100% rename from extensions/matrix/src/runtime.ts rename to native-plugins/matrix/src/runtime.ts diff --git a/extensions/matrix/src/session-route.ts b/native-plugins/matrix/src/session-route.ts similarity index 100% rename from extensions/matrix/src/session-route.ts rename to native-plugins/matrix/src/session-route.ts diff --git a/extensions/matrix/src/setup-bootstrap.ts b/native-plugins/matrix/src/setup-bootstrap.ts similarity index 100% rename from extensions/matrix/src/setup-bootstrap.ts rename to native-plugins/matrix/src/setup-bootstrap.ts diff --git a/extensions/matrix/src/setup-config.ts b/native-plugins/matrix/src/setup-config.ts similarity index 100% rename from extensions/matrix/src/setup-config.ts rename to native-plugins/matrix/src/setup-config.ts diff --git a/extensions/matrix/src/setup-core.test.ts b/native-plugins/matrix/src/setup-core.test.ts similarity index 100% rename from extensions/matrix/src/setup-core.test.ts rename to native-plugins/matrix/src/setup-core.test.ts diff --git a/extensions/matrix/src/setup-core.ts b/native-plugins/matrix/src/setup-core.ts similarity index 100% rename from extensions/matrix/src/setup-core.ts rename to native-plugins/matrix/src/setup-core.ts diff --git a/extensions/matrix/src/setup-surface.ts b/native-plugins/matrix/src/setup-surface.ts similarity index 100% rename from extensions/matrix/src/setup-surface.ts rename to native-plugins/matrix/src/setup-surface.ts diff --git a/extensions/matrix/src/storage-paths.ts b/native-plugins/matrix/src/storage-paths.ts similarity index 100% rename from extensions/matrix/src/storage-paths.ts rename to native-plugins/matrix/src/storage-paths.ts diff --git a/extensions/matrix/src/test-mocks.ts b/native-plugins/matrix/src/test-mocks.ts similarity index 100% rename from extensions/matrix/src/test-mocks.ts rename to native-plugins/matrix/src/test-mocks.ts diff --git a/extensions/matrix/src/tool-actions.runtime.ts b/native-plugins/matrix/src/tool-actions.runtime.ts similarity index 100% rename from extensions/matrix/src/tool-actions.runtime.ts rename to native-plugins/matrix/src/tool-actions.runtime.ts diff --git a/extensions/matrix/src/tool-actions.test.ts b/native-plugins/matrix/src/tool-actions.test.ts similarity index 100% rename from extensions/matrix/src/tool-actions.test.ts rename to native-plugins/matrix/src/tool-actions.test.ts diff --git a/extensions/matrix/src/tool-actions.ts b/native-plugins/matrix/src/tool-actions.ts similarity index 100% rename from extensions/matrix/src/tool-actions.ts rename to native-plugins/matrix/src/tool-actions.ts diff --git a/extensions/matrix/src/types.ts b/native-plugins/matrix/src/types.ts similarity index 100% rename from extensions/matrix/src/types.ts rename to native-plugins/matrix/src/types.ts diff --git a/extensions/matrix/thread-bindings-runtime.ts b/native-plugins/matrix/thread-bindings-runtime.ts similarity index 100% rename from extensions/matrix/thread-bindings-runtime.ts rename to native-plugins/matrix/thread-bindings-runtime.ts diff --git a/extensions/mattermost/api.ts b/native-plugins/mattermost/api.ts similarity index 100% rename from extensions/mattermost/api.ts rename to native-plugins/mattermost/api.ts diff --git a/extensions/mattermost/index.test.ts b/native-plugins/mattermost/index.test.ts similarity index 93% rename from extensions/mattermost/index.test.ts rename to native-plugins/mattermost/index.test.ts index 7ab3d87778a..22b291a4503 100644 --- a/extensions/mattermost/index.test.ts +++ b/native-plugins/mattermost/index.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from "vitest"; -import { createTestPluginApi } from "../../test/helpers/extensions/plugin-api.js"; +import { createTestPluginApi } from "../../test/helpers/native-plugins/plugin-api.js"; import plugin from "./index.js"; import type { OpenClawPluginApi } from "./runtime-api.js"; diff --git a/extensions/mattermost/index.ts b/native-plugins/mattermost/index.ts similarity index 100% rename from extensions/mattermost/index.ts rename to native-plugins/mattermost/index.ts diff --git a/extensions/mattermost/openclaw.plugin.json b/native-plugins/mattermost/openclaw.plugin.json similarity index 100% rename from extensions/mattermost/openclaw.plugin.json rename to native-plugins/mattermost/openclaw.plugin.json diff --git a/extensions/mattermost/package.json b/native-plugins/mattermost/package.json similarity index 91% rename from extensions/mattermost/package.json rename to native-plugins/mattermost/package.json index 3c414f52f29..cfade981401 100644 --- a/extensions/mattermost/package.json +++ b/native-plugins/mattermost/package.json @@ -8,7 +8,7 @@ "zod": "^4.3.6" }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ], "setupEntry": "./setup-entry.ts", @@ -23,7 +23,7 @@ }, "install": { "npmSpec": "@openclaw/mattermost", - "localPath": "extensions/mattermost", + "localPath": "native-plugins/mattermost", "defaultChoice": "npm" } } diff --git a/extensions/mattermost/runtime-api.ts b/native-plugins/mattermost/runtime-api.ts similarity index 100% rename from extensions/mattermost/runtime-api.ts rename to native-plugins/mattermost/runtime-api.ts diff --git a/extensions/mattermost/setup-entry.ts b/native-plugins/mattermost/setup-entry.ts similarity index 100% rename from extensions/mattermost/setup-entry.ts rename to native-plugins/mattermost/setup-entry.ts diff --git a/extensions/mattermost/src/channel.test.ts b/native-plugins/mattermost/src/channel.test.ts similarity index 100% rename from extensions/mattermost/src/channel.test.ts rename to native-plugins/mattermost/src/channel.test.ts diff --git a/extensions/mattermost/src/channel.ts b/native-plugins/mattermost/src/channel.ts similarity index 99% rename from extensions/mattermost/src/channel.ts rename to native-plugins/mattermost/src/channel.ts index 94c5bbff092..6948a1acc3c 100644 --- a/extensions/mattermost/src/channel.ts +++ b/native-plugins/mattermost/src/channel.ts @@ -12,7 +12,7 @@ import { createScopedAccountReplyToModeResolver, type ChannelMessageToolDiscovery, } from "openclaw/plugin-sdk/channel-runtime"; -import { buildPassiveProbedChannelStatusSummary } from "openclaw/plugin-sdk/extension-shared"; +import { buildPassiveProbedChannelStatusSummary } from "openclaw/plugin-sdk/native-plugin-shared"; import { MattermostConfigSchema } from "./config-schema.js"; import { resolveMattermostGroupRequireMention } from "./group-mentions.js"; import { diff --git a/extensions/mattermost/src/config-schema.test.ts b/native-plugins/mattermost/src/config-schema.test.ts similarity index 100% rename from extensions/mattermost/src/config-schema.test.ts rename to native-plugins/mattermost/src/config-schema.test.ts diff --git a/extensions/mattermost/src/config-schema.ts b/native-plugins/mattermost/src/config-schema.ts similarity index 99% rename from extensions/mattermost/src/config-schema.ts rename to native-plugins/mattermost/src/config-schema.ts index 1c2f48ed405..b2c3c288678 100644 --- a/extensions/mattermost/src/config-schema.ts +++ b/native-plugins/mattermost/src/config-schema.ts @@ -1,4 +1,4 @@ -import { requireChannelOpenAllowFrom } from "openclaw/plugin-sdk/extension-shared"; +import { requireChannelOpenAllowFrom } from "openclaw/plugin-sdk/native-plugin-shared"; import { z } from "zod"; import { BlockStreamingCoalesceSchema, diff --git a/extensions/mattermost/src/group-mentions.test.ts b/native-plugins/mattermost/src/group-mentions.test.ts similarity index 100% rename from extensions/mattermost/src/group-mentions.test.ts rename to native-plugins/mattermost/src/group-mentions.test.ts diff --git a/extensions/mattermost/src/group-mentions.ts b/native-plugins/mattermost/src/group-mentions.ts similarity index 100% rename from extensions/mattermost/src/group-mentions.ts rename to native-plugins/mattermost/src/group-mentions.ts diff --git a/extensions/mattermost/src/mattermost/accounts.test.ts b/native-plugins/mattermost/src/mattermost/accounts.test.ts similarity index 100% rename from extensions/mattermost/src/mattermost/accounts.test.ts rename to native-plugins/mattermost/src/mattermost/accounts.test.ts diff --git a/extensions/mattermost/src/mattermost/accounts.ts b/native-plugins/mattermost/src/mattermost/accounts.ts similarity index 100% rename from extensions/mattermost/src/mattermost/accounts.ts rename to native-plugins/mattermost/src/mattermost/accounts.ts diff --git a/extensions/mattermost/src/mattermost/client.retry.test.ts b/native-plugins/mattermost/src/mattermost/client.retry.test.ts similarity index 100% rename from extensions/mattermost/src/mattermost/client.retry.test.ts rename to native-plugins/mattermost/src/mattermost/client.retry.test.ts diff --git a/extensions/mattermost/src/mattermost/client.test.ts b/native-plugins/mattermost/src/mattermost/client.test.ts similarity index 100% rename from extensions/mattermost/src/mattermost/client.test.ts rename to native-plugins/mattermost/src/mattermost/client.test.ts diff --git a/extensions/mattermost/src/mattermost/client.ts b/native-plugins/mattermost/src/mattermost/client.ts similarity index 100% rename from extensions/mattermost/src/mattermost/client.ts rename to native-plugins/mattermost/src/mattermost/client.ts diff --git a/extensions/mattermost/src/mattermost/directory.ts b/native-plugins/mattermost/src/mattermost/directory.ts similarity index 100% rename from extensions/mattermost/src/mattermost/directory.ts rename to native-plugins/mattermost/src/mattermost/directory.ts diff --git a/extensions/mattermost/src/mattermost/index.ts b/native-plugins/mattermost/src/mattermost/index.ts similarity index 100% rename from extensions/mattermost/src/mattermost/index.ts rename to native-plugins/mattermost/src/mattermost/index.ts diff --git a/extensions/mattermost/src/mattermost/interactions.test.ts b/native-plugins/mattermost/src/mattermost/interactions.test.ts similarity index 100% rename from extensions/mattermost/src/mattermost/interactions.test.ts rename to native-plugins/mattermost/src/mattermost/interactions.test.ts diff --git a/extensions/mattermost/src/mattermost/interactions.ts b/native-plugins/mattermost/src/mattermost/interactions.ts similarity index 100% rename from extensions/mattermost/src/mattermost/interactions.ts rename to native-plugins/mattermost/src/mattermost/interactions.ts diff --git a/extensions/mattermost/src/mattermost/model-picker.test.ts b/native-plugins/mattermost/src/mattermost/model-picker.test.ts similarity index 100% rename from extensions/mattermost/src/mattermost/model-picker.test.ts rename to native-plugins/mattermost/src/mattermost/model-picker.test.ts diff --git a/extensions/mattermost/src/mattermost/model-picker.ts b/native-plugins/mattermost/src/mattermost/model-picker.ts similarity index 100% rename from extensions/mattermost/src/mattermost/model-picker.ts rename to native-plugins/mattermost/src/mattermost/model-picker.ts diff --git a/extensions/mattermost/src/mattermost/monitor-auth.ts b/native-plugins/mattermost/src/mattermost/monitor-auth.ts similarity index 100% rename from extensions/mattermost/src/mattermost/monitor-auth.ts rename to native-plugins/mattermost/src/mattermost/monitor-auth.ts diff --git a/extensions/mattermost/src/mattermost/monitor-gating.ts b/native-plugins/mattermost/src/mattermost/monitor-gating.ts similarity index 100% rename from extensions/mattermost/src/mattermost/monitor-gating.ts rename to native-plugins/mattermost/src/mattermost/monitor-gating.ts diff --git a/extensions/mattermost/src/mattermost/monitor-helpers.test.ts b/native-plugins/mattermost/src/mattermost/monitor-helpers.test.ts similarity index 100% rename from extensions/mattermost/src/mattermost/monitor-helpers.test.ts rename to native-plugins/mattermost/src/mattermost/monitor-helpers.test.ts diff --git a/extensions/mattermost/src/mattermost/monitor-helpers.ts b/native-plugins/mattermost/src/mattermost/monitor-helpers.ts similarity index 100% rename from extensions/mattermost/src/mattermost/monitor-helpers.ts rename to native-plugins/mattermost/src/mattermost/monitor-helpers.ts diff --git a/extensions/mattermost/src/mattermost/monitor-onchar.ts b/native-plugins/mattermost/src/mattermost/monitor-onchar.ts similarity index 100% rename from extensions/mattermost/src/mattermost/monitor-onchar.ts rename to native-plugins/mattermost/src/mattermost/monitor-onchar.ts diff --git a/extensions/mattermost/src/mattermost/monitor-resources.ts b/native-plugins/mattermost/src/mattermost/monitor-resources.ts similarity index 100% rename from extensions/mattermost/src/mattermost/monitor-resources.ts rename to native-plugins/mattermost/src/mattermost/monitor-resources.ts diff --git a/extensions/mattermost/src/mattermost/monitor-slash.ts b/native-plugins/mattermost/src/mattermost/monitor-slash.ts similarity index 100% rename from extensions/mattermost/src/mattermost/monitor-slash.ts rename to native-plugins/mattermost/src/mattermost/monitor-slash.ts diff --git a/extensions/mattermost/src/mattermost/monitor-websocket.test.ts b/native-plugins/mattermost/src/mattermost/monitor-websocket.test.ts similarity index 100% rename from extensions/mattermost/src/mattermost/monitor-websocket.test.ts rename to native-plugins/mattermost/src/mattermost/monitor-websocket.test.ts diff --git a/extensions/mattermost/src/mattermost/monitor-websocket.ts b/native-plugins/mattermost/src/mattermost/monitor-websocket.ts similarity index 100% rename from extensions/mattermost/src/mattermost/monitor-websocket.ts rename to native-plugins/mattermost/src/mattermost/monitor-websocket.ts diff --git a/extensions/mattermost/src/mattermost/monitor.authz.test.ts b/native-plugins/mattermost/src/mattermost/monitor.authz.test.ts similarity index 100% rename from extensions/mattermost/src/mattermost/monitor.authz.test.ts rename to native-plugins/mattermost/src/mattermost/monitor.authz.test.ts diff --git a/extensions/mattermost/src/mattermost/monitor.channel-kind.test.ts b/native-plugins/mattermost/src/mattermost/monitor.channel-kind.test.ts similarity index 100% rename from extensions/mattermost/src/mattermost/monitor.channel-kind.test.ts rename to native-plugins/mattermost/src/mattermost/monitor.channel-kind.test.ts diff --git a/extensions/mattermost/src/mattermost/monitor.test.ts b/native-plugins/mattermost/src/mattermost/monitor.test.ts similarity index 100% rename from extensions/mattermost/src/mattermost/monitor.test.ts rename to native-plugins/mattermost/src/mattermost/monitor.test.ts diff --git a/extensions/mattermost/src/mattermost/monitor.ts b/native-plugins/mattermost/src/mattermost/monitor.ts similarity index 100% rename from extensions/mattermost/src/mattermost/monitor.ts rename to native-plugins/mattermost/src/mattermost/monitor.ts diff --git a/extensions/mattermost/src/mattermost/probe.test.ts b/native-plugins/mattermost/src/mattermost/probe.test.ts similarity index 100% rename from extensions/mattermost/src/mattermost/probe.test.ts rename to native-plugins/mattermost/src/mattermost/probe.test.ts diff --git a/extensions/mattermost/src/mattermost/probe.ts b/native-plugins/mattermost/src/mattermost/probe.ts similarity index 100% rename from extensions/mattermost/src/mattermost/probe.ts rename to native-plugins/mattermost/src/mattermost/probe.ts diff --git a/extensions/mattermost/src/mattermost/reactions.test-helpers.ts b/native-plugins/mattermost/src/mattermost/reactions.test-helpers.ts similarity index 100% rename from extensions/mattermost/src/mattermost/reactions.test-helpers.ts rename to native-plugins/mattermost/src/mattermost/reactions.test-helpers.ts diff --git a/extensions/mattermost/src/mattermost/reactions.test.ts b/native-plugins/mattermost/src/mattermost/reactions.test.ts similarity index 100% rename from extensions/mattermost/src/mattermost/reactions.test.ts rename to native-plugins/mattermost/src/mattermost/reactions.test.ts diff --git a/extensions/mattermost/src/mattermost/reactions.ts b/native-plugins/mattermost/src/mattermost/reactions.ts similarity index 100% rename from extensions/mattermost/src/mattermost/reactions.ts rename to native-plugins/mattermost/src/mattermost/reactions.ts diff --git a/extensions/mattermost/src/mattermost/reconnect.test.ts b/native-plugins/mattermost/src/mattermost/reconnect.test.ts similarity index 100% rename from extensions/mattermost/src/mattermost/reconnect.test.ts rename to native-plugins/mattermost/src/mattermost/reconnect.test.ts diff --git a/extensions/mattermost/src/mattermost/reconnect.ts b/native-plugins/mattermost/src/mattermost/reconnect.ts similarity index 100% rename from extensions/mattermost/src/mattermost/reconnect.ts rename to native-plugins/mattermost/src/mattermost/reconnect.ts diff --git a/extensions/mattermost/src/mattermost/reply-delivery.test.ts b/native-plugins/mattermost/src/mattermost/reply-delivery.test.ts similarity index 100% rename from extensions/mattermost/src/mattermost/reply-delivery.test.ts rename to native-plugins/mattermost/src/mattermost/reply-delivery.test.ts diff --git a/extensions/mattermost/src/mattermost/reply-delivery.ts b/native-plugins/mattermost/src/mattermost/reply-delivery.ts similarity index 100% rename from extensions/mattermost/src/mattermost/reply-delivery.ts rename to native-plugins/mattermost/src/mattermost/reply-delivery.ts diff --git a/extensions/mattermost/src/mattermost/runtime-api.ts b/native-plugins/mattermost/src/mattermost/runtime-api.ts similarity index 100% rename from extensions/mattermost/src/mattermost/runtime-api.ts rename to native-plugins/mattermost/src/mattermost/runtime-api.ts diff --git a/extensions/mattermost/src/mattermost/send.test.ts b/native-plugins/mattermost/src/mattermost/send.test.ts similarity index 99% rename from extensions/mattermost/src/mattermost/send.test.ts rename to native-plugins/mattermost/src/mattermost/send.test.ts index da06a07e3cb..412d7a4e4ab 100644 --- a/extensions/mattermost/src/mattermost/send.test.ts +++ b/native-plugins/mattermost/src/mattermost/send.test.ts @@ -2,7 +2,7 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; import { expectProvidedCfgSkipsRuntimeLoad, expectRuntimeCfgFallback, -} from "../../../../test/helpers/extensions/send-config.js"; +} from "../../../../test/helpers/native-plugins/send-config.js"; import { parseMattermostTarget, sendMessageMattermost } from "./send.js"; import { resetMattermostOpaqueTargetCacheForTests } from "./target-resolution.js"; diff --git a/extensions/mattermost/src/mattermost/send.ts b/native-plugins/mattermost/src/mattermost/send.ts similarity index 100% rename from extensions/mattermost/src/mattermost/send.ts rename to native-plugins/mattermost/src/mattermost/send.ts diff --git a/extensions/mattermost/src/mattermost/slash-commands.test.ts b/native-plugins/mattermost/src/mattermost/slash-commands.test.ts similarity index 100% rename from extensions/mattermost/src/mattermost/slash-commands.test.ts rename to native-plugins/mattermost/src/mattermost/slash-commands.test.ts diff --git a/extensions/mattermost/src/mattermost/slash-commands.ts b/native-plugins/mattermost/src/mattermost/slash-commands.ts similarity index 100% rename from extensions/mattermost/src/mattermost/slash-commands.ts rename to native-plugins/mattermost/src/mattermost/slash-commands.ts diff --git a/extensions/mattermost/src/mattermost/slash-http.test.ts b/native-plugins/mattermost/src/mattermost/slash-http.test.ts similarity index 100% rename from extensions/mattermost/src/mattermost/slash-http.test.ts rename to native-plugins/mattermost/src/mattermost/slash-http.test.ts diff --git a/extensions/mattermost/src/mattermost/slash-http.ts b/native-plugins/mattermost/src/mattermost/slash-http.ts similarity index 100% rename from extensions/mattermost/src/mattermost/slash-http.ts rename to native-plugins/mattermost/src/mattermost/slash-http.ts diff --git a/extensions/mattermost/src/mattermost/slash-state.test.ts b/native-plugins/mattermost/src/mattermost/slash-state.test.ts similarity index 100% rename from extensions/mattermost/src/mattermost/slash-state.test.ts rename to native-plugins/mattermost/src/mattermost/slash-state.test.ts diff --git a/extensions/mattermost/src/mattermost/slash-state.ts b/native-plugins/mattermost/src/mattermost/slash-state.ts similarity index 100% rename from extensions/mattermost/src/mattermost/slash-state.ts rename to native-plugins/mattermost/src/mattermost/slash-state.ts diff --git a/extensions/mattermost/src/mattermost/target-resolution.ts b/native-plugins/mattermost/src/mattermost/target-resolution.ts similarity index 100% rename from extensions/mattermost/src/mattermost/target-resolution.ts rename to native-plugins/mattermost/src/mattermost/target-resolution.ts diff --git a/extensions/mattermost/src/normalize.test.ts b/native-plugins/mattermost/src/normalize.test.ts similarity index 100% rename from extensions/mattermost/src/normalize.test.ts rename to native-plugins/mattermost/src/normalize.test.ts diff --git a/extensions/mattermost/src/normalize.ts b/native-plugins/mattermost/src/normalize.ts similarity index 100% rename from extensions/mattermost/src/normalize.ts rename to native-plugins/mattermost/src/normalize.ts diff --git a/extensions/mattermost/src/runtime-api.ts b/native-plugins/mattermost/src/runtime-api.ts similarity index 100% rename from extensions/mattermost/src/runtime-api.ts rename to native-plugins/mattermost/src/runtime-api.ts diff --git a/extensions/mattermost/src/runtime.ts b/native-plugins/mattermost/src/runtime.ts similarity index 100% rename from extensions/mattermost/src/runtime.ts rename to native-plugins/mattermost/src/runtime.ts diff --git a/extensions/mattermost/src/secret-input.ts b/native-plugins/mattermost/src/secret-input.ts similarity index 100% rename from extensions/mattermost/src/secret-input.ts rename to native-plugins/mattermost/src/secret-input.ts diff --git a/extensions/mattermost/src/session-route.ts b/native-plugins/mattermost/src/session-route.ts similarity index 100% rename from extensions/mattermost/src/session-route.ts rename to native-plugins/mattermost/src/session-route.ts diff --git a/extensions/mattermost/src/setup-core.ts b/native-plugins/mattermost/src/setup-core.ts similarity index 100% rename from extensions/mattermost/src/setup-core.ts rename to native-plugins/mattermost/src/setup-core.ts diff --git a/extensions/mattermost/src/setup-status.test.ts b/native-plugins/mattermost/src/setup-status.test.ts similarity index 100% rename from extensions/mattermost/src/setup-status.test.ts rename to native-plugins/mattermost/src/setup-status.test.ts diff --git a/extensions/mattermost/src/setup-surface.ts b/native-plugins/mattermost/src/setup-surface.ts similarity index 100% rename from extensions/mattermost/src/setup-surface.ts rename to native-plugins/mattermost/src/setup-surface.ts diff --git a/extensions/mattermost/src/types.ts b/native-plugins/mattermost/src/types.ts similarity index 100% rename from extensions/mattermost/src/types.ts rename to native-plugins/mattermost/src/types.ts diff --git a/extensions/memory-core/index.ts b/native-plugins/memory-core/index.ts similarity index 100% rename from extensions/memory-core/index.ts rename to native-plugins/memory-core/index.ts diff --git a/extensions/memory-core/openclaw.plugin.json b/native-plugins/memory-core/openclaw.plugin.json similarity index 100% rename from extensions/memory-core/openclaw.plugin.json rename to native-plugins/memory-core/openclaw.plugin.json diff --git a/extensions/memory-core/package.json b/native-plugins/memory-core/package.json similarity index 94% rename from extensions/memory-core/package.json rename to native-plugins/memory-core/package.json index a6a8d1dbca8..59cfa639c59 100644 --- a/extensions/memory-core/package.json +++ b/native-plugins/memory-core/package.json @@ -13,7 +13,7 @@ } }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/memory-lancedb/api.ts b/native-plugins/memory-lancedb/api.ts similarity index 100% rename from extensions/memory-lancedb/api.ts rename to native-plugins/memory-lancedb/api.ts diff --git a/extensions/memory-lancedb/config.ts b/native-plugins/memory-lancedb/config.ts similarity index 100% rename from extensions/memory-lancedb/config.ts rename to native-plugins/memory-lancedb/config.ts diff --git a/extensions/memory-lancedb/index.test.ts b/native-plugins/memory-lancedb/index.test.ts similarity index 100% rename from extensions/memory-lancedb/index.test.ts rename to native-plugins/memory-lancedb/index.test.ts diff --git a/extensions/memory-lancedb/index.ts b/native-plugins/memory-lancedb/index.ts similarity index 100% rename from extensions/memory-lancedb/index.ts rename to native-plugins/memory-lancedb/index.ts diff --git a/extensions/memory-lancedb/openclaw.plugin.json b/native-plugins/memory-lancedb/openclaw.plugin.json similarity index 100% rename from extensions/memory-lancedb/openclaw.plugin.json rename to native-plugins/memory-lancedb/openclaw.plugin.json diff --git a/extensions/memory-lancedb/package.json b/native-plugins/memory-lancedb/package.json similarity index 87% rename from extensions/memory-lancedb/package.json rename to native-plugins/memory-lancedb/package.json index 9dc32062286..0d05696162c 100644 --- a/extensions/memory-lancedb/package.json +++ b/native-plugins/memory-lancedb/package.json @@ -9,12 +9,12 @@ "openai": "^6.32.0" }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ], "install": { "npmSpec": "@openclaw/memory-lancedb", - "localPath": "extensions/memory-lancedb", + "localPath": "native-plugins/memory-lancedb", "defaultChoice": "npm" }, "release": { diff --git a/extensions/microsoft/index.ts b/native-plugins/microsoft/index.ts similarity index 100% rename from extensions/microsoft/index.ts rename to native-plugins/microsoft/index.ts diff --git a/extensions/microsoft/openclaw.plugin.json b/native-plugins/microsoft/openclaw.plugin.json similarity index 100% rename from extensions/microsoft/openclaw.plugin.json rename to native-plugins/microsoft/openclaw.plugin.json diff --git a/extensions/microsoft/package.json b/native-plugins/microsoft/package.json similarity index 91% rename from extensions/microsoft/package.json rename to native-plugins/microsoft/package.json index 400095cc1f0..7eeebf8752c 100644 --- a/extensions/microsoft/package.json +++ b/native-plugins/microsoft/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Microsoft speech plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/minimax/README.md b/native-plugins/minimax/README.md similarity index 100% rename from extensions/minimax/README.md rename to native-plugins/minimax/README.md diff --git a/extensions/minimax/index.ts b/native-plugins/minimax/index.ts similarity index 100% rename from extensions/minimax/index.ts rename to native-plugins/minimax/index.ts diff --git a/extensions/minimax/media-understanding-provider.ts b/native-plugins/minimax/media-understanding-provider.ts similarity index 100% rename from extensions/minimax/media-understanding-provider.ts rename to native-plugins/minimax/media-understanding-provider.ts diff --git a/extensions/minimax/model-definitions.test.ts b/native-plugins/minimax/model-definitions.test.ts similarity index 100% rename from extensions/minimax/model-definitions.test.ts rename to native-plugins/minimax/model-definitions.test.ts diff --git a/extensions/minimax/model-definitions.ts b/native-plugins/minimax/model-definitions.ts similarity index 100% rename from extensions/minimax/model-definitions.ts rename to native-plugins/minimax/model-definitions.ts diff --git a/extensions/minimax/oauth.runtime.ts b/native-plugins/minimax/oauth.runtime.ts similarity index 100% rename from extensions/minimax/oauth.runtime.ts rename to native-plugins/minimax/oauth.runtime.ts diff --git a/extensions/minimax/oauth.ts b/native-plugins/minimax/oauth.ts similarity index 100% rename from extensions/minimax/oauth.ts rename to native-plugins/minimax/oauth.ts diff --git a/extensions/minimax/onboard.ts b/native-plugins/minimax/onboard.ts similarity index 100% rename from extensions/minimax/onboard.ts rename to native-plugins/minimax/onboard.ts diff --git a/extensions/minimax/openclaw.plugin.json b/native-plugins/minimax/openclaw.plugin.json similarity index 100% rename from extensions/minimax/openclaw.plugin.json rename to native-plugins/minimax/openclaw.plugin.json diff --git a/extensions/minimax/package.json b/native-plugins/minimax/package.json similarity index 91% rename from extensions/minimax/package.json rename to native-plugins/minimax/package.json index f6c99e0e756..42361ac6dab 100644 --- a/extensions/minimax/package.json +++ b/native-plugins/minimax/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw MiniMax provider and OAuth plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/minimax/provider-catalog.ts b/native-plugins/minimax/provider-catalog.ts similarity index 100% rename from extensions/minimax/provider-catalog.ts rename to native-plugins/minimax/provider-catalog.ts diff --git a/extensions/mistral/index.ts b/native-plugins/mistral/index.ts similarity index 100% rename from extensions/mistral/index.ts rename to native-plugins/mistral/index.ts diff --git a/extensions/mistral/media-understanding-provider.ts b/native-plugins/mistral/media-understanding-provider.ts similarity index 100% rename from extensions/mistral/media-understanding-provider.ts rename to native-plugins/mistral/media-understanding-provider.ts diff --git a/extensions/mistral/model-definitions.ts b/native-plugins/mistral/model-definitions.ts similarity index 100% rename from extensions/mistral/model-definitions.ts rename to native-plugins/mistral/model-definitions.ts diff --git a/extensions/mistral/onboard.ts b/native-plugins/mistral/onboard.ts similarity index 100% rename from extensions/mistral/onboard.ts rename to native-plugins/mistral/onboard.ts diff --git a/extensions/mistral/openclaw.plugin.json b/native-plugins/mistral/openclaw.plugin.json similarity index 100% rename from extensions/mistral/openclaw.plugin.json rename to native-plugins/mistral/openclaw.plugin.json diff --git a/extensions/mistral/package.json b/native-plugins/mistral/package.json similarity index 91% rename from extensions/mistral/package.json rename to native-plugins/mistral/package.json index 29649db38f5..d484ea152d7 100644 --- a/extensions/mistral/package.json +++ b/native-plugins/mistral/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Mistral provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/modelstudio/index.ts b/native-plugins/modelstudio/index.ts similarity index 100% rename from extensions/modelstudio/index.ts rename to native-plugins/modelstudio/index.ts diff --git a/extensions/modelstudio/model-definitions.ts b/native-plugins/modelstudio/model-definitions.ts similarity index 100% rename from extensions/modelstudio/model-definitions.ts rename to native-plugins/modelstudio/model-definitions.ts diff --git a/extensions/modelstudio/onboard.ts b/native-plugins/modelstudio/onboard.ts similarity index 100% rename from extensions/modelstudio/onboard.ts rename to native-plugins/modelstudio/onboard.ts diff --git a/extensions/modelstudio/openclaw.plugin.json b/native-plugins/modelstudio/openclaw.plugin.json similarity index 100% rename from extensions/modelstudio/openclaw.plugin.json rename to native-plugins/modelstudio/openclaw.plugin.json diff --git a/extensions/modelstudio/package.json b/native-plugins/modelstudio/package.json similarity index 91% rename from extensions/modelstudio/package.json rename to native-plugins/modelstudio/package.json index 631c87d53ca..92f19ecb1f9 100644 --- a/extensions/modelstudio/package.json +++ b/native-plugins/modelstudio/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Model Studio provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/modelstudio/provider-catalog.ts b/native-plugins/modelstudio/provider-catalog.ts similarity index 100% rename from extensions/modelstudio/provider-catalog.ts rename to native-plugins/modelstudio/provider-catalog.ts diff --git a/extensions/moonshot/index.ts b/native-plugins/moonshot/index.ts similarity index 100% rename from extensions/moonshot/index.ts rename to native-plugins/moonshot/index.ts diff --git a/extensions/moonshot/media-understanding-provider.ts b/native-plugins/moonshot/media-understanding-provider.ts similarity index 100% rename from extensions/moonshot/media-understanding-provider.ts rename to native-plugins/moonshot/media-understanding-provider.ts diff --git a/extensions/moonshot/onboard.ts b/native-plugins/moonshot/onboard.ts similarity index 100% rename from extensions/moonshot/onboard.ts rename to native-plugins/moonshot/onboard.ts diff --git a/extensions/moonshot/openclaw.plugin.json b/native-plugins/moonshot/openclaw.plugin.json similarity index 100% rename from extensions/moonshot/openclaw.plugin.json rename to native-plugins/moonshot/openclaw.plugin.json diff --git a/extensions/moonshot/package.json b/native-plugins/moonshot/package.json similarity index 91% rename from extensions/moonshot/package.json rename to native-plugins/moonshot/package.json index a9dab300c74..9b4e8e86483 100644 --- a/extensions/moonshot/package.json +++ b/native-plugins/moonshot/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Moonshot provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/moonshot/provider-catalog.ts b/native-plugins/moonshot/provider-catalog.ts similarity index 100% rename from extensions/moonshot/provider-catalog.ts rename to native-plugins/moonshot/provider-catalog.ts diff --git a/extensions/moonshot/src/kimi-web-search-provider.ts b/native-plugins/moonshot/src/kimi-web-search-provider.ts similarity index 100% rename from extensions/moonshot/src/kimi-web-search-provider.ts rename to native-plugins/moonshot/src/kimi-web-search-provider.ts diff --git a/extensions/msteams/CHANGELOG.md b/native-plugins/msteams/CHANGELOG.md similarity index 100% rename from extensions/msteams/CHANGELOG.md rename to native-plugins/msteams/CHANGELOG.md diff --git a/extensions/msteams/api.ts b/native-plugins/msteams/api.ts similarity index 100% rename from extensions/msteams/api.ts rename to native-plugins/msteams/api.ts diff --git a/extensions/msteams/index.ts b/native-plugins/msteams/index.ts similarity index 100% rename from extensions/msteams/index.ts rename to native-plugins/msteams/index.ts diff --git a/extensions/msteams/openclaw.plugin.json b/native-plugins/msteams/openclaw.plugin.json similarity index 100% rename from extensions/msteams/openclaw.plugin.json rename to native-plugins/msteams/openclaw.plugin.json diff --git a/extensions/msteams/package.json b/native-plugins/msteams/package.json similarity index 92% rename from extensions/msteams/package.json rename to native-plugins/msteams/package.json index 5a989be1cc2..1eb76289245 100644 --- a/extensions/msteams/package.json +++ b/native-plugins/msteams/package.json @@ -9,7 +9,7 @@ "uuid": "^11.1.0" }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ], "setupEntry": "./setup-entry.ts", @@ -27,7 +27,7 @@ }, "install": { "npmSpec": "@openclaw/msteams", - "localPath": "extensions/msteams", + "localPath": "native-plugins/msteams", "defaultChoice": "npm" }, "release": { diff --git a/extensions/msteams/runtime-api.ts b/native-plugins/msteams/runtime-api.ts similarity index 100% rename from extensions/msteams/runtime-api.ts rename to native-plugins/msteams/runtime-api.ts diff --git a/extensions/msteams/setup-entry.ts b/native-plugins/msteams/setup-entry.ts similarity index 100% rename from extensions/msteams/setup-entry.ts rename to native-plugins/msteams/setup-entry.ts diff --git a/extensions/msteams/src/attachments.test.ts b/native-plugins/msteams/src/attachments.test.ts similarity index 99% rename from extensions/msteams/src/attachments.test.ts rename to native-plugins/msteams/src/attachments.test.ts index e0d673def03..d4536dc5115 100644 --- a/extensions/msteams/src/attachments.test.ts +++ b/native-plugins/msteams/src/attachments.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; -import { createPluginRuntimeMock } from "../../../test/helpers/extensions/plugin-runtime-mock.js"; +import { createPluginRuntimeMock } from "../../../test/helpers/native-plugins/plugin-runtime-mock.js"; import type { PluginRuntime, SsrFPolicy } from "../runtime-api.js"; import { buildMSTeamsAttachmentPlaceholder, diff --git a/extensions/msteams/src/attachments.ts b/native-plugins/msteams/src/attachments.ts similarity index 100% rename from extensions/msteams/src/attachments.ts rename to native-plugins/msteams/src/attachments.ts diff --git a/extensions/msteams/src/attachments/download.ts b/native-plugins/msteams/src/attachments/download.ts similarity index 100% rename from extensions/msteams/src/attachments/download.ts rename to native-plugins/msteams/src/attachments/download.ts diff --git a/extensions/msteams/src/attachments/graph.ts b/native-plugins/msteams/src/attachments/graph.ts similarity index 100% rename from extensions/msteams/src/attachments/graph.ts rename to native-plugins/msteams/src/attachments/graph.ts diff --git a/extensions/msteams/src/attachments/html.ts b/native-plugins/msteams/src/attachments/html.ts similarity index 100% rename from extensions/msteams/src/attachments/html.ts rename to native-plugins/msteams/src/attachments/html.ts diff --git a/extensions/msteams/src/attachments/payload.ts b/native-plugins/msteams/src/attachments/payload.ts similarity index 100% rename from extensions/msteams/src/attachments/payload.ts rename to native-plugins/msteams/src/attachments/payload.ts diff --git a/extensions/msteams/src/attachments/remote-media.ts b/native-plugins/msteams/src/attachments/remote-media.ts similarity index 100% rename from extensions/msteams/src/attachments/remote-media.ts rename to native-plugins/msteams/src/attachments/remote-media.ts diff --git a/extensions/msteams/src/attachments/shared.test.ts b/native-plugins/msteams/src/attachments/shared.test.ts similarity index 100% rename from extensions/msteams/src/attachments/shared.test.ts rename to native-plugins/msteams/src/attachments/shared.test.ts diff --git a/extensions/msteams/src/attachments/shared.ts b/native-plugins/msteams/src/attachments/shared.ts similarity index 100% rename from extensions/msteams/src/attachments/shared.ts rename to native-plugins/msteams/src/attachments/shared.ts diff --git a/extensions/msteams/src/attachments/types.ts b/native-plugins/msteams/src/attachments/types.ts similarity index 100% rename from extensions/msteams/src/attachments/types.ts rename to native-plugins/msteams/src/attachments/types.ts diff --git a/extensions/msteams/src/channel.directory.test.ts b/native-plugins/msteams/src/channel.directory.test.ts similarity index 96% rename from extensions/msteams/src/channel.directory.test.ts rename to native-plugins/msteams/src/channel.directory.test.ts index 955fdb334c4..34503f1014f 100644 --- a/extensions/msteams/src/channel.directory.test.ts +++ b/native-plugins/msteams/src/channel.directory.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from "vitest"; import { createDirectoryTestRuntime, expectDirectorySurface, -} from "../../../test/helpers/extensions/directory.js"; +} from "../../../test/helpers/native-plugins/directory.js"; import type { OpenClawConfig, RuntimeEnv } from "../runtime-api.js"; import { msteamsPlugin } from "./channel.js"; diff --git a/extensions/msteams/src/channel.runtime.ts b/native-plugins/msteams/src/channel.runtime.ts similarity index 100% rename from extensions/msteams/src/channel.runtime.ts rename to native-plugins/msteams/src/channel.runtime.ts diff --git a/extensions/msteams/src/channel.ts b/native-plugins/msteams/src/channel.ts similarity index 100% rename from extensions/msteams/src/channel.ts rename to native-plugins/msteams/src/channel.ts diff --git a/extensions/msteams/src/config-schema.ts b/native-plugins/msteams/src/config-schema.ts similarity index 100% rename from extensions/msteams/src/config-schema.ts rename to native-plugins/msteams/src/config-schema.ts diff --git a/extensions/msteams/src/conversation-store-fs.test.ts b/native-plugins/msteams/src/conversation-store-fs.test.ts similarity index 100% rename from extensions/msteams/src/conversation-store-fs.test.ts rename to native-plugins/msteams/src/conversation-store-fs.test.ts diff --git a/extensions/msteams/src/conversation-store-fs.ts b/native-plugins/msteams/src/conversation-store-fs.ts similarity index 100% rename from extensions/msteams/src/conversation-store-fs.ts rename to native-plugins/msteams/src/conversation-store-fs.ts diff --git a/extensions/msteams/src/conversation-store-memory.ts b/native-plugins/msteams/src/conversation-store-memory.ts similarity index 100% rename from extensions/msteams/src/conversation-store-memory.ts rename to native-plugins/msteams/src/conversation-store-memory.ts diff --git a/extensions/msteams/src/conversation-store.ts b/native-plugins/msteams/src/conversation-store.ts similarity index 100% rename from extensions/msteams/src/conversation-store.ts rename to native-plugins/msteams/src/conversation-store.ts diff --git a/extensions/msteams/src/directory-live.ts b/native-plugins/msteams/src/directory-live.ts similarity index 100% rename from extensions/msteams/src/directory-live.ts rename to native-plugins/msteams/src/directory-live.ts diff --git a/extensions/msteams/src/errors.test.ts b/native-plugins/msteams/src/errors.test.ts similarity index 100% rename from extensions/msteams/src/errors.test.ts rename to native-plugins/msteams/src/errors.test.ts diff --git a/extensions/msteams/src/errors.ts b/native-plugins/msteams/src/errors.ts similarity index 100% rename from extensions/msteams/src/errors.ts rename to native-plugins/msteams/src/errors.ts diff --git a/extensions/msteams/src/file-consent-helpers.test.ts b/native-plugins/msteams/src/file-consent-helpers.test.ts similarity index 100% rename from extensions/msteams/src/file-consent-helpers.test.ts rename to native-plugins/msteams/src/file-consent-helpers.test.ts diff --git a/extensions/msteams/src/file-consent-helpers.ts b/native-plugins/msteams/src/file-consent-helpers.ts similarity index 100% rename from extensions/msteams/src/file-consent-helpers.ts rename to native-plugins/msteams/src/file-consent-helpers.ts diff --git a/extensions/msteams/src/file-consent.ts b/native-plugins/msteams/src/file-consent.ts similarity index 100% rename from extensions/msteams/src/file-consent.ts rename to native-plugins/msteams/src/file-consent.ts diff --git a/extensions/msteams/src/file-lock.ts b/native-plugins/msteams/src/file-lock.ts similarity index 100% rename from extensions/msteams/src/file-lock.ts rename to native-plugins/msteams/src/file-lock.ts diff --git a/extensions/msteams/src/graph-chat.ts b/native-plugins/msteams/src/graph-chat.ts similarity index 100% rename from extensions/msteams/src/graph-chat.ts rename to native-plugins/msteams/src/graph-chat.ts diff --git a/extensions/msteams/src/graph-upload.test.ts b/native-plugins/msteams/src/graph-upload.test.ts similarity index 97% rename from extensions/msteams/src/graph-upload.test.ts rename to native-plugins/msteams/src/graph-upload.test.ts index a41147840ec..e56ed13bb72 100644 --- a/extensions/msteams/src/graph-upload.test.ts +++ b/native-plugins/msteams/src/graph-upload.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from "vitest"; -import { withFetchPreconnect } from "../../../test/helpers/extensions/fetch-mock.js"; +import { withFetchPreconnect } from "../../../test/helpers/native-plugins/fetch-mock.js"; import { uploadToOneDrive, uploadToSharePoint } from "./graph-upload.js"; describe("graph upload helpers", () => { diff --git a/extensions/msteams/src/graph-upload.ts b/native-plugins/msteams/src/graph-upload.ts similarity index 100% rename from extensions/msteams/src/graph-upload.ts rename to native-plugins/msteams/src/graph-upload.ts diff --git a/extensions/msteams/src/graph-users.test.ts b/native-plugins/msteams/src/graph-users.test.ts similarity index 100% rename from extensions/msteams/src/graph-users.test.ts rename to native-plugins/msteams/src/graph-users.test.ts diff --git a/extensions/msteams/src/graph-users.ts b/native-plugins/msteams/src/graph-users.ts similarity index 100% rename from extensions/msteams/src/graph-users.ts rename to native-plugins/msteams/src/graph-users.ts diff --git a/extensions/msteams/src/graph.ts b/native-plugins/msteams/src/graph.ts similarity index 100% rename from extensions/msteams/src/graph.ts rename to native-plugins/msteams/src/graph.ts diff --git a/extensions/msteams/src/inbound.test.ts b/native-plugins/msteams/src/inbound.test.ts similarity index 100% rename from extensions/msteams/src/inbound.test.ts rename to native-plugins/msteams/src/inbound.test.ts diff --git a/extensions/msteams/src/inbound.ts b/native-plugins/msteams/src/inbound.ts similarity index 100% rename from extensions/msteams/src/inbound.ts rename to native-plugins/msteams/src/inbound.ts diff --git a/extensions/msteams/src/index.ts b/native-plugins/msteams/src/index.ts similarity index 100% rename from extensions/msteams/src/index.ts rename to native-plugins/msteams/src/index.ts diff --git a/extensions/msteams/src/media-helpers.test.ts b/native-plugins/msteams/src/media-helpers.test.ts similarity index 100% rename from extensions/msteams/src/media-helpers.test.ts rename to native-plugins/msteams/src/media-helpers.test.ts diff --git a/extensions/msteams/src/media-helpers.ts b/native-plugins/msteams/src/media-helpers.ts similarity index 100% rename from extensions/msteams/src/media-helpers.ts rename to native-plugins/msteams/src/media-helpers.ts diff --git a/extensions/msteams/src/mentions.test.ts b/native-plugins/msteams/src/mentions.test.ts similarity index 100% rename from extensions/msteams/src/mentions.test.ts rename to native-plugins/msteams/src/mentions.test.ts diff --git a/extensions/msteams/src/mentions.ts b/native-plugins/msteams/src/mentions.ts similarity index 100% rename from extensions/msteams/src/mentions.ts rename to native-plugins/msteams/src/mentions.ts diff --git a/extensions/msteams/src/messenger.test.ts b/native-plugins/msteams/src/messenger.test.ts similarity index 99% rename from extensions/msteams/src/messenger.test.ts rename to native-plugins/msteams/src/messenger.test.ts index 2644092f127..bd6e8c46820 100644 --- a/extensions/msteams/src/messenger.test.ts +++ b/native-plugins/msteams/src/messenger.test.ts @@ -2,7 +2,7 @@ import { mkdtemp, rm, writeFile } from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import { createPluginRuntimeMock } from "../../../test/helpers/extensions/plugin-runtime-mock.js"; +import { createPluginRuntimeMock } from "../../../test/helpers/native-plugins/plugin-runtime-mock.js"; import { SILENT_REPLY_TOKEN, type PluginRuntime } from "../runtime-api.js"; import type { StoredConversationReference } from "./conversation-store.js"; const graphUploadMockState = vi.hoisted(() => ({ diff --git a/extensions/msteams/src/messenger.ts b/native-plugins/msteams/src/messenger.ts similarity index 100% rename from extensions/msteams/src/messenger.ts rename to native-plugins/msteams/src/messenger.ts diff --git a/extensions/msteams/src/monitor-handler.file-consent.test.ts b/native-plugins/msteams/src/monitor-handler.file-consent.test.ts similarity index 100% rename from extensions/msteams/src/monitor-handler.file-consent.test.ts rename to native-plugins/msteams/src/monitor-handler.file-consent.test.ts diff --git a/extensions/msteams/src/monitor-handler.ts b/native-plugins/msteams/src/monitor-handler.ts similarity index 100% rename from extensions/msteams/src/monitor-handler.ts rename to native-plugins/msteams/src/monitor-handler.ts diff --git a/extensions/msteams/src/monitor-handler/inbound-media.ts b/native-plugins/msteams/src/monitor-handler/inbound-media.ts similarity index 100% rename from extensions/msteams/src/monitor-handler/inbound-media.ts rename to native-plugins/msteams/src/monitor-handler/inbound-media.ts diff --git a/extensions/msteams/src/monitor-handler/message-handler.authz.test.ts b/native-plugins/msteams/src/monitor-handler/message-handler.authz.test.ts similarity index 100% rename from extensions/msteams/src/monitor-handler/message-handler.authz.test.ts rename to native-plugins/msteams/src/monitor-handler/message-handler.authz.test.ts diff --git a/extensions/msteams/src/monitor-handler/message-handler.ts b/native-plugins/msteams/src/monitor-handler/message-handler.ts similarity index 100% rename from extensions/msteams/src/monitor-handler/message-handler.ts rename to native-plugins/msteams/src/monitor-handler/message-handler.ts diff --git a/extensions/msteams/src/monitor-types.ts b/native-plugins/msteams/src/monitor-types.ts similarity index 100% rename from extensions/msteams/src/monitor-types.ts rename to native-plugins/msteams/src/monitor-types.ts diff --git a/extensions/msteams/src/monitor.lifecycle.test.ts b/native-plugins/msteams/src/monitor.lifecycle.test.ts similarity index 100% rename from extensions/msteams/src/monitor.lifecycle.test.ts rename to native-plugins/msteams/src/monitor.lifecycle.test.ts diff --git a/extensions/msteams/src/monitor.test.ts b/native-plugins/msteams/src/monitor.test.ts similarity index 100% rename from extensions/msteams/src/monitor.test.ts rename to native-plugins/msteams/src/monitor.test.ts diff --git a/extensions/msteams/src/monitor.ts b/native-plugins/msteams/src/monitor.ts similarity index 100% rename from extensions/msteams/src/monitor.ts rename to native-plugins/msteams/src/monitor.ts diff --git a/extensions/msteams/src/outbound.test.ts b/native-plugins/msteams/src/outbound.test.ts similarity index 100% rename from extensions/msteams/src/outbound.test.ts rename to native-plugins/msteams/src/outbound.test.ts diff --git a/extensions/msteams/src/outbound.ts b/native-plugins/msteams/src/outbound.ts similarity index 100% rename from extensions/msteams/src/outbound.ts rename to native-plugins/msteams/src/outbound.ts diff --git a/extensions/msteams/src/pending-uploads.ts b/native-plugins/msteams/src/pending-uploads.ts similarity index 100% rename from extensions/msteams/src/pending-uploads.ts rename to native-plugins/msteams/src/pending-uploads.ts diff --git a/extensions/msteams/src/policy.test.ts b/native-plugins/msteams/src/policy.test.ts similarity index 100% rename from extensions/msteams/src/policy.test.ts rename to native-plugins/msteams/src/policy.test.ts diff --git a/extensions/msteams/src/policy.ts b/native-plugins/msteams/src/policy.ts similarity index 100% rename from extensions/msteams/src/policy.ts rename to native-plugins/msteams/src/policy.ts diff --git a/extensions/msteams/src/polls-store-memory.ts b/native-plugins/msteams/src/polls-store-memory.ts similarity index 100% rename from extensions/msteams/src/polls-store-memory.ts rename to native-plugins/msteams/src/polls-store-memory.ts diff --git a/extensions/msteams/src/polls-store.test.ts b/native-plugins/msteams/src/polls-store.test.ts similarity index 100% rename from extensions/msteams/src/polls-store.test.ts rename to native-plugins/msteams/src/polls-store.test.ts diff --git a/extensions/msteams/src/polls.test.ts b/native-plugins/msteams/src/polls.test.ts similarity index 100% rename from extensions/msteams/src/polls.test.ts rename to native-plugins/msteams/src/polls.test.ts diff --git a/extensions/msteams/src/polls.ts b/native-plugins/msteams/src/polls.ts similarity index 100% rename from extensions/msteams/src/polls.ts rename to native-plugins/msteams/src/polls.ts diff --git a/extensions/msteams/src/probe.test.ts b/native-plugins/msteams/src/probe.test.ts similarity index 100% rename from extensions/msteams/src/probe.test.ts rename to native-plugins/msteams/src/probe.test.ts diff --git a/extensions/msteams/src/probe.ts b/native-plugins/msteams/src/probe.ts similarity index 100% rename from extensions/msteams/src/probe.ts rename to native-plugins/msteams/src/probe.ts diff --git a/extensions/msteams/src/reply-dispatcher.ts b/native-plugins/msteams/src/reply-dispatcher.ts similarity index 100% rename from extensions/msteams/src/reply-dispatcher.ts rename to native-plugins/msteams/src/reply-dispatcher.ts diff --git a/extensions/msteams/src/resolve-allowlist.test.ts b/native-plugins/msteams/src/resolve-allowlist.test.ts similarity index 100% rename from extensions/msteams/src/resolve-allowlist.test.ts rename to native-plugins/msteams/src/resolve-allowlist.test.ts diff --git a/extensions/msteams/src/resolve-allowlist.ts b/native-plugins/msteams/src/resolve-allowlist.ts similarity index 100% rename from extensions/msteams/src/resolve-allowlist.ts rename to native-plugins/msteams/src/resolve-allowlist.ts diff --git a/extensions/msteams/src/revoked-context.test.ts b/native-plugins/msteams/src/revoked-context.test.ts similarity index 100% rename from extensions/msteams/src/revoked-context.test.ts rename to native-plugins/msteams/src/revoked-context.test.ts diff --git a/extensions/msteams/src/revoked-context.ts b/native-plugins/msteams/src/revoked-context.ts similarity index 100% rename from extensions/msteams/src/revoked-context.ts rename to native-plugins/msteams/src/revoked-context.ts diff --git a/extensions/msteams/src/runtime.ts b/native-plugins/msteams/src/runtime.ts similarity index 100% rename from extensions/msteams/src/runtime.ts rename to native-plugins/msteams/src/runtime.ts diff --git a/extensions/msteams/src/sdk-types.ts b/native-plugins/msteams/src/sdk-types.ts similarity index 100% rename from extensions/msteams/src/sdk-types.ts rename to native-plugins/msteams/src/sdk-types.ts diff --git a/extensions/msteams/src/sdk.ts b/native-plugins/msteams/src/sdk.ts similarity index 100% rename from extensions/msteams/src/sdk.ts rename to native-plugins/msteams/src/sdk.ts diff --git a/extensions/msteams/src/secret-input.ts b/native-plugins/msteams/src/secret-input.ts similarity index 100% rename from extensions/msteams/src/secret-input.ts rename to native-plugins/msteams/src/secret-input.ts diff --git a/extensions/msteams/src/send-context.ts b/native-plugins/msteams/src/send-context.ts similarity index 100% rename from extensions/msteams/src/send-context.ts rename to native-plugins/msteams/src/send-context.ts diff --git a/extensions/msteams/src/send.test.ts b/native-plugins/msteams/src/send.test.ts similarity index 100% rename from extensions/msteams/src/send.test.ts rename to native-plugins/msteams/src/send.test.ts diff --git a/extensions/msteams/src/send.ts b/native-plugins/msteams/src/send.ts similarity index 100% rename from extensions/msteams/src/send.ts rename to native-plugins/msteams/src/send.ts diff --git a/extensions/msteams/src/sent-message-cache.test.ts b/native-plugins/msteams/src/sent-message-cache.test.ts similarity index 100% rename from extensions/msteams/src/sent-message-cache.test.ts rename to native-plugins/msteams/src/sent-message-cache.test.ts diff --git a/extensions/msteams/src/sent-message-cache.ts b/native-plugins/msteams/src/sent-message-cache.ts similarity index 100% rename from extensions/msteams/src/sent-message-cache.ts rename to native-plugins/msteams/src/sent-message-cache.ts diff --git a/extensions/msteams/src/session-route.ts b/native-plugins/msteams/src/session-route.ts similarity index 100% rename from extensions/msteams/src/session-route.ts rename to native-plugins/msteams/src/session-route.ts diff --git a/extensions/msteams/src/setup-core.ts b/native-plugins/msteams/src/setup-core.ts similarity index 100% rename from extensions/msteams/src/setup-core.ts rename to native-plugins/msteams/src/setup-core.ts diff --git a/extensions/msteams/src/setup-surface.ts b/native-plugins/msteams/src/setup-surface.ts similarity index 100% rename from extensions/msteams/src/setup-surface.ts rename to native-plugins/msteams/src/setup-surface.ts diff --git a/extensions/msteams/src/storage.ts b/native-plugins/msteams/src/storage.ts similarity index 100% rename from extensions/msteams/src/storage.ts rename to native-plugins/msteams/src/storage.ts diff --git a/extensions/msteams/src/store-fs.ts b/native-plugins/msteams/src/store-fs.ts similarity index 100% rename from extensions/msteams/src/store-fs.ts rename to native-plugins/msteams/src/store-fs.ts diff --git a/extensions/msteams/src/test-runtime.ts b/native-plugins/msteams/src/test-runtime.ts similarity index 100% rename from extensions/msteams/src/test-runtime.ts rename to native-plugins/msteams/src/test-runtime.ts diff --git a/extensions/msteams/src/token-response.test.ts b/native-plugins/msteams/src/token-response.test.ts similarity index 100% rename from extensions/msteams/src/token-response.test.ts rename to native-plugins/msteams/src/token-response.test.ts diff --git a/extensions/msteams/src/token-response.ts b/native-plugins/msteams/src/token-response.ts similarity index 100% rename from extensions/msteams/src/token-response.ts rename to native-plugins/msteams/src/token-response.ts diff --git a/extensions/msteams/src/token.test.ts b/native-plugins/msteams/src/token.test.ts similarity index 100% rename from extensions/msteams/src/token.test.ts rename to native-plugins/msteams/src/token.test.ts diff --git a/extensions/msteams/src/token.ts b/native-plugins/msteams/src/token.ts similarity index 100% rename from extensions/msteams/src/token.ts rename to native-plugins/msteams/src/token.ts diff --git a/extensions/nextcloud-talk/api.ts b/native-plugins/nextcloud-talk/api.ts similarity index 100% rename from extensions/nextcloud-talk/api.ts rename to native-plugins/nextcloud-talk/api.ts diff --git a/extensions/nextcloud-talk/index.ts b/native-plugins/nextcloud-talk/index.ts similarity index 100% rename from extensions/nextcloud-talk/index.ts rename to native-plugins/nextcloud-talk/index.ts diff --git a/extensions/nextcloud-talk/openclaw.plugin.json b/native-plugins/nextcloud-talk/openclaw.plugin.json similarity index 100% rename from extensions/nextcloud-talk/openclaw.plugin.json rename to native-plugins/nextcloud-talk/openclaw.plugin.json diff --git a/extensions/nextcloud-talk/package.json b/native-plugins/nextcloud-talk/package.json similarity index 92% rename from extensions/nextcloud-talk/package.json rename to native-plugins/nextcloud-talk/package.json index 83010363da2..d75064073fa 100644 --- a/extensions/nextcloud-talk/package.json +++ b/native-plugins/nextcloud-talk/package.json @@ -7,7 +7,7 @@ "zod": "^4.3.6" }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ], "setupEntry": "./setup-entry.ts", @@ -27,7 +27,7 @@ }, "install": { "npmSpec": "@openclaw/nextcloud-talk", - "localPath": "extensions/nextcloud-talk", + "localPath": "native-plugins/nextcloud-talk", "defaultChoice": "npm" }, "release": { diff --git a/extensions/nextcloud-talk/runtime-api.ts b/native-plugins/nextcloud-talk/runtime-api.ts similarity index 100% rename from extensions/nextcloud-talk/runtime-api.ts rename to native-plugins/nextcloud-talk/runtime-api.ts diff --git a/extensions/nextcloud-talk/setup-entry.ts b/native-plugins/nextcloud-talk/setup-entry.ts similarity index 100% rename from extensions/nextcloud-talk/setup-entry.ts rename to native-plugins/nextcloud-talk/setup-entry.ts diff --git a/extensions/nextcloud-talk/src/accounts.test.ts b/native-plugins/nextcloud-talk/src/accounts.test.ts similarity index 100% rename from extensions/nextcloud-talk/src/accounts.test.ts rename to native-plugins/nextcloud-talk/src/accounts.test.ts diff --git a/extensions/nextcloud-talk/src/accounts.ts b/native-plugins/nextcloud-talk/src/accounts.ts similarity index 100% rename from extensions/nextcloud-talk/src/accounts.ts rename to native-plugins/nextcloud-talk/src/accounts.ts diff --git a/extensions/nextcloud-talk/src/channel.startup.test.ts b/native-plugins/nextcloud-talk/src/channel.startup.test.ts similarity index 95% rename from extensions/nextcloud-talk/src/channel.startup.test.ts rename to native-plugins/nextcloud-talk/src/channel.startup.test.ts index e0117936f51..626440a0c24 100644 --- a/extensions/nextcloud-talk/src/channel.startup.test.ts +++ b/native-plugins/nextcloud-talk/src/channel.startup.test.ts @@ -1,9 +1,9 @@ import { afterEach, describe, expect, it, vi } from "vitest"; -import { createStartAccountContext } from "../../../test/helpers/extensions/start-account-context.js"; +import { createStartAccountContext } from "../../../test/helpers/native-plugins/start-account-context.js"; import { expectStopPendingUntilAbort, startAccountAndTrackLifecycle, -} from "../../../test/helpers/extensions/start-account-lifecycle.js"; +} from "../../../test/helpers/native-plugins/start-account-lifecycle.js"; import type { ResolvedNextcloudTalkAccount } from "./accounts.js"; const hoisted = vi.hoisted(() => ({ diff --git a/extensions/nextcloud-talk/src/channel.ts b/native-plugins/nextcloud-talk/src/channel.ts similarity index 99% rename from extensions/nextcloud-talk/src/channel.ts rename to native-plugins/nextcloud-talk/src/channel.ts index ff316e3a533..40460cb6f54 100644 --- a/extensions/nextcloud-talk/src/channel.ts +++ b/native-plugins/nextcloud-talk/src/channel.ts @@ -10,7 +10,7 @@ import { createLoggedPairingApprovalNotifier, createPairingPrefixStripper, } from "openclaw/plugin-sdk/channel-runtime"; -import { runStoppablePassiveMonitor } from "openclaw/plugin-sdk/extension-shared"; +import { runStoppablePassiveMonitor } from "openclaw/plugin-sdk/native-plugin-shared"; import { buildBaseChannelStatusSummary, buildChannelConfigSchema, diff --git a/extensions/nextcloud-talk/src/config-schema.test.ts b/native-plugins/nextcloud-talk/src/config-schema.test.ts similarity index 100% rename from extensions/nextcloud-talk/src/config-schema.test.ts rename to native-plugins/nextcloud-talk/src/config-schema.test.ts diff --git a/extensions/nextcloud-talk/src/config-schema.ts b/native-plugins/nextcloud-talk/src/config-schema.ts similarity index 98% rename from extensions/nextcloud-talk/src/config-schema.ts rename to native-plugins/nextcloud-talk/src/config-schema.ts index 685ac0fe525..2de4d1588c2 100644 --- a/extensions/nextcloud-talk/src/config-schema.ts +++ b/native-plugins/nextcloud-talk/src/config-schema.ts @@ -1,4 +1,4 @@ -import { requireChannelOpenAllowFrom } from "openclaw/plugin-sdk/extension-shared"; +import { requireChannelOpenAllowFrom } from "openclaw/plugin-sdk/native-plugin-shared"; import { z } from "zod"; import { BlockStreamingCoalesceSchema, diff --git a/extensions/nextcloud-talk/src/format.ts b/native-plugins/nextcloud-talk/src/format.ts similarity index 100% rename from extensions/nextcloud-talk/src/format.ts rename to native-plugins/nextcloud-talk/src/format.ts diff --git a/extensions/nextcloud-talk/src/inbound.authz.test.ts b/native-plugins/nextcloud-talk/src/inbound.authz.test.ts similarity index 100% rename from extensions/nextcloud-talk/src/inbound.authz.test.ts rename to native-plugins/nextcloud-talk/src/inbound.authz.test.ts diff --git a/extensions/nextcloud-talk/src/inbound.ts b/native-plugins/nextcloud-talk/src/inbound.ts similarity index 100% rename from extensions/nextcloud-talk/src/inbound.ts rename to native-plugins/nextcloud-talk/src/inbound.ts diff --git a/extensions/nextcloud-talk/src/monitor.auth-order.test.ts b/native-plugins/nextcloud-talk/src/monitor.auth-order.test.ts similarity index 100% rename from extensions/nextcloud-talk/src/monitor.auth-order.test.ts rename to native-plugins/nextcloud-talk/src/monitor.auth-order.test.ts diff --git a/extensions/nextcloud-talk/src/monitor.backend.test.ts b/native-plugins/nextcloud-talk/src/monitor.backend.test.ts similarity index 100% rename from extensions/nextcloud-talk/src/monitor.backend.test.ts rename to native-plugins/nextcloud-talk/src/monitor.backend.test.ts diff --git a/extensions/nextcloud-talk/src/monitor.read-body.test.ts b/native-plugins/nextcloud-talk/src/monitor.read-body.test.ts similarity index 100% rename from extensions/nextcloud-talk/src/monitor.read-body.test.ts rename to native-plugins/nextcloud-talk/src/monitor.read-body.test.ts diff --git a/extensions/nextcloud-talk/src/monitor.replay.test.ts b/native-plugins/nextcloud-talk/src/monitor.replay.test.ts similarity index 100% rename from extensions/nextcloud-talk/src/monitor.replay.test.ts rename to native-plugins/nextcloud-talk/src/monitor.replay.test.ts diff --git a/extensions/nextcloud-talk/src/monitor.test-fixtures.ts b/native-plugins/nextcloud-talk/src/monitor.test-fixtures.ts similarity index 100% rename from extensions/nextcloud-talk/src/monitor.test-fixtures.ts rename to native-plugins/nextcloud-talk/src/monitor.test-fixtures.ts diff --git a/extensions/nextcloud-talk/src/monitor.test-harness.ts b/native-plugins/nextcloud-talk/src/monitor.test-harness.ts similarity index 100% rename from extensions/nextcloud-talk/src/monitor.test-harness.ts rename to native-plugins/nextcloud-talk/src/monitor.test-harness.ts diff --git a/extensions/nextcloud-talk/src/monitor.ts b/native-plugins/nextcloud-talk/src/monitor.ts similarity index 99% rename from extensions/nextcloud-talk/src/monitor.ts rename to native-plugins/nextcloud-talk/src/monitor.ts index b40024e5eb0..f82416abc6b 100644 --- a/extensions/nextcloud-talk/src/monitor.ts +++ b/native-plugins/nextcloud-talk/src/monitor.ts @@ -1,6 +1,6 @@ import { createServer, type IncomingMessage, type Server, type ServerResponse } from "node:http"; import os from "node:os"; -import { resolveLoggerBackedRuntime } from "openclaw/plugin-sdk/extension-shared"; +import { resolveLoggerBackedRuntime } from "openclaw/plugin-sdk/native-plugin-shared"; import { type RuntimeEnv, isRequestBodyLimitError, diff --git a/extensions/nextcloud-talk/src/normalize.test.ts b/native-plugins/nextcloud-talk/src/normalize.test.ts similarity index 100% rename from extensions/nextcloud-talk/src/normalize.test.ts rename to native-plugins/nextcloud-talk/src/normalize.test.ts diff --git a/extensions/nextcloud-talk/src/normalize.ts b/native-plugins/nextcloud-talk/src/normalize.ts similarity index 100% rename from extensions/nextcloud-talk/src/normalize.ts rename to native-plugins/nextcloud-talk/src/normalize.ts diff --git a/extensions/nextcloud-talk/src/policy.test.ts b/native-plugins/nextcloud-talk/src/policy.test.ts similarity index 100% rename from extensions/nextcloud-talk/src/policy.test.ts rename to native-plugins/nextcloud-talk/src/policy.test.ts diff --git a/extensions/nextcloud-talk/src/policy.ts b/native-plugins/nextcloud-talk/src/policy.ts similarity index 100% rename from extensions/nextcloud-talk/src/policy.ts rename to native-plugins/nextcloud-talk/src/policy.ts diff --git a/extensions/nextcloud-talk/src/replay-guard.test.ts b/native-plugins/nextcloud-talk/src/replay-guard.test.ts similarity index 100% rename from extensions/nextcloud-talk/src/replay-guard.test.ts rename to native-plugins/nextcloud-talk/src/replay-guard.test.ts diff --git a/extensions/nextcloud-talk/src/replay-guard.ts b/native-plugins/nextcloud-talk/src/replay-guard.ts similarity index 100% rename from extensions/nextcloud-talk/src/replay-guard.ts rename to native-plugins/nextcloud-talk/src/replay-guard.ts diff --git a/extensions/nextcloud-talk/src/room-info.ts b/native-plugins/nextcloud-talk/src/room-info.ts similarity index 100% rename from extensions/nextcloud-talk/src/room-info.ts rename to native-plugins/nextcloud-talk/src/room-info.ts diff --git a/extensions/nextcloud-talk/src/runtime.ts b/native-plugins/nextcloud-talk/src/runtime.ts similarity index 100% rename from extensions/nextcloud-talk/src/runtime.ts rename to native-plugins/nextcloud-talk/src/runtime.ts diff --git a/extensions/nextcloud-talk/src/secret-input.ts b/native-plugins/nextcloud-talk/src/secret-input.ts similarity index 100% rename from extensions/nextcloud-talk/src/secret-input.ts rename to native-plugins/nextcloud-talk/src/secret-input.ts diff --git a/extensions/nextcloud-talk/src/send.test.ts b/native-plugins/nextcloud-talk/src/send.test.ts similarity index 97% rename from extensions/nextcloud-talk/src/send.test.ts rename to native-plugins/nextcloud-talk/src/send.test.ts index b82ac1c4309..cc4d54d3c3e 100644 --- a/extensions/nextcloud-talk/src/send.test.ts +++ b/native-plugins/nextcloud-talk/src/send.test.ts @@ -3,7 +3,7 @@ import { createSendCfgThreadingRuntime, expectProvidedCfgSkipsRuntimeLoad, expectRuntimeCfgFallback, -} from "../../../test/helpers/extensions/send-config.js"; +} from "../../../test/helpers/native-plugins/send-config.js"; const hoisted = vi.hoisted(() => ({ loadConfig: vi.fn(), diff --git a/extensions/nextcloud-talk/src/send.ts b/native-plugins/nextcloud-talk/src/send.ts similarity index 100% rename from extensions/nextcloud-talk/src/send.ts rename to native-plugins/nextcloud-talk/src/send.ts diff --git a/extensions/nextcloud-talk/src/session-route.ts b/native-plugins/nextcloud-talk/src/session-route.ts similarity index 100% rename from extensions/nextcloud-talk/src/session-route.ts rename to native-plugins/nextcloud-talk/src/session-route.ts diff --git a/extensions/nextcloud-talk/src/setup-core.ts b/native-plugins/nextcloud-talk/src/setup-core.ts similarity index 100% rename from extensions/nextcloud-talk/src/setup-core.ts rename to native-plugins/nextcloud-talk/src/setup-core.ts diff --git a/extensions/nextcloud-talk/src/setup-surface.test.ts b/native-plugins/nextcloud-talk/src/setup-surface.test.ts similarity index 100% rename from extensions/nextcloud-talk/src/setup-surface.test.ts rename to native-plugins/nextcloud-talk/src/setup-surface.test.ts diff --git a/extensions/nextcloud-talk/src/setup-surface.ts b/native-plugins/nextcloud-talk/src/setup-surface.ts similarity index 100% rename from extensions/nextcloud-talk/src/setup-surface.ts rename to native-plugins/nextcloud-talk/src/setup-surface.ts diff --git a/extensions/nextcloud-talk/src/signature.ts b/native-plugins/nextcloud-talk/src/signature.ts similarity index 100% rename from extensions/nextcloud-talk/src/signature.ts rename to native-plugins/nextcloud-talk/src/signature.ts diff --git a/extensions/nextcloud-talk/src/types.ts b/native-plugins/nextcloud-talk/src/types.ts similarity index 100% rename from extensions/nextcloud-talk/src/types.ts rename to native-plugins/nextcloud-talk/src/types.ts diff --git a/extensions/nostr/CHANGELOG.md b/native-plugins/nostr/CHANGELOG.md similarity index 100% rename from extensions/nostr/CHANGELOG.md rename to native-plugins/nostr/CHANGELOG.md diff --git a/extensions/nostr/README.md b/native-plugins/nostr/README.md similarity index 100% rename from extensions/nostr/README.md rename to native-plugins/nostr/README.md diff --git a/extensions/nostr/api.ts b/native-plugins/nostr/api.ts similarity index 100% rename from extensions/nostr/api.ts rename to native-plugins/nostr/api.ts diff --git a/extensions/nostr/index.ts b/native-plugins/nostr/index.ts similarity index 100% rename from extensions/nostr/index.ts rename to native-plugins/nostr/index.ts diff --git a/extensions/nostr/openclaw.plugin.json b/native-plugins/nostr/openclaw.plugin.json similarity index 100% rename from extensions/nostr/openclaw.plugin.json rename to native-plugins/nostr/openclaw.plugin.json diff --git a/extensions/nostr/package.json b/native-plugins/nostr/package.json similarity index 92% rename from extensions/nostr/package.json rename to native-plugins/nostr/package.json index 2335eae85c7..bee8f698e24 100644 --- a/extensions/nostr/package.json +++ b/native-plugins/nostr/package.json @@ -8,7 +8,7 @@ "zod": "^4.3.6" }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ], "setupEntry": "./setup-entry.ts", @@ -24,7 +24,7 @@ }, "install": { "npmSpec": "@openclaw/nostr", - "localPath": "extensions/nostr", + "localPath": "native-plugins/nostr", "defaultChoice": "npm" }, "release": { diff --git a/extensions/nostr/runtime-api.ts b/native-plugins/nostr/runtime-api.ts similarity index 100% rename from extensions/nostr/runtime-api.ts rename to native-plugins/nostr/runtime-api.ts diff --git a/extensions/nostr/setup-api.ts b/native-plugins/nostr/setup-api.ts similarity index 100% rename from extensions/nostr/setup-api.ts rename to native-plugins/nostr/setup-api.ts diff --git a/extensions/nostr/setup-entry.ts b/native-plugins/nostr/setup-entry.ts similarity index 100% rename from extensions/nostr/setup-entry.ts rename to native-plugins/nostr/setup-entry.ts diff --git a/extensions/nostr/src/channel.outbound.test.ts b/native-plugins/nostr/src/channel.outbound.test.ts similarity index 98% rename from extensions/nostr/src/channel.outbound.test.ts rename to native-plugins/nostr/src/channel.outbound.test.ts index dbbeb544708..d248db013eb 100644 --- a/extensions/nostr/src/channel.outbound.test.ts +++ b/native-plugins/nostr/src/channel.outbound.test.ts @@ -1,5 +1,5 @@ import { afterEach, describe, expect, it, vi } from "vitest"; -import { createStartAccountContext } from "../../../test/helpers/extensions/start-account-context.js"; +import { createStartAccountContext } from "../../../test/helpers/native-plugins/start-account-context.js"; import type { PluginRuntime } from "../runtime-api.js"; import { nostrPlugin } from "./channel.js"; import { setNostrRuntime } from "./runtime.js"; diff --git a/extensions/nostr/src/channel.test.ts b/native-plugins/nostr/src/channel.test.ts similarity index 100% rename from extensions/nostr/src/channel.test.ts rename to native-plugins/nostr/src/channel.test.ts diff --git a/extensions/nostr/src/channel.ts b/native-plugins/nostr/src/channel.ts similarity index 99% rename from extensions/nostr/src/channel.ts rename to native-plugins/nostr/src/channel.ts index a047cbd2a97..30be11fee5a 100644 --- a/extensions/nostr/src/channel.ts +++ b/native-plugins/nostr/src/channel.ts @@ -6,7 +6,7 @@ import { attachChannelToResult } from "openclaw/plugin-sdk/channel-send-result"; import { buildPassiveChannelStatusSummary, buildTrafficStatusSummary, -} from "openclaw/plugin-sdk/extension-shared"; +} from "openclaw/plugin-sdk/native-plugin-shared"; import { buildChannelConfigSchema, collectStatusIssuesFromLastError, diff --git a/extensions/nostr/src/config-schema.ts b/native-plugins/nostr/src/config-schema.ts similarity index 100% rename from extensions/nostr/src/config-schema.ts rename to native-plugins/nostr/src/config-schema.ts diff --git a/extensions/nostr/src/default-relays.ts b/native-plugins/nostr/src/default-relays.ts similarity index 100% rename from extensions/nostr/src/default-relays.ts rename to native-plugins/nostr/src/default-relays.ts diff --git a/extensions/nostr/src/metrics.ts b/native-plugins/nostr/src/metrics.ts similarity index 100% rename from extensions/nostr/src/metrics.ts rename to native-plugins/nostr/src/metrics.ts diff --git a/extensions/nostr/src/nostr-bus.fuzz.test.ts b/native-plugins/nostr/src/nostr-bus.fuzz.test.ts similarity index 100% rename from extensions/nostr/src/nostr-bus.fuzz.test.ts rename to native-plugins/nostr/src/nostr-bus.fuzz.test.ts diff --git a/extensions/nostr/src/nostr-bus.integration.test.ts b/native-plugins/nostr/src/nostr-bus.integration.test.ts similarity index 100% rename from extensions/nostr/src/nostr-bus.integration.test.ts rename to native-plugins/nostr/src/nostr-bus.integration.test.ts diff --git a/extensions/nostr/src/nostr-bus.test.ts b/native-plugins/nostr/src/nostr-bus.test.ts similarity index 100% rename from extensions/nostr/src/nostr-bus.test.ts rename to native-plugins/nostr/src/nostr-bus.test.ts diff --git a/extensions/nostr/src/nostr-bus.ts b/native-plugins/nostr/src/nostr-bus.ts similarity index 100% rename from extensions/nostr/src/nostr-bus.ts rename to native-plugins/nostr/src/nostr-bus.ts diff --git a/extensions/nostr/src/nostr-profile-http.test.ts b/native-plugins/nostr/src/nostr-profile-http.test.ts similarity index 100% rename from extensions/nostr/src/nostr-profile-http.test.ts rename to native-plugins/nostr/src/nostr-profile-http.test.ts diff --git a/extensions/nostr/src/nostr-profile-http.ts b/native-plugins/nostr/src/nostr-profile-http.ts similarity index 100% rename from extensions/nostr/src/nostr-profile-http.ts rename to native-plugins/nostr/src/nostr-profile-http.ts diff --git a/extensions/nostr/src/nostr-profile-import.test.ts b/native-plugins/nostr/src/nostr-profile-import.test.ts similarity index 100% rename from extensions/nostr/src/nostr-profile-import.test.ts rename to native-plugins/nostr/src/nostr-profile-import.test.ts diff --git a/extensions/nostr/src/nostr-profile-import.ts b/native-plugins/nostr/src/nostr-profile-import.ts similarity index 100% rename from extensions/nostr/src/nostr-profile-import.ts rename to native-plugins/nostr/src/nostr-profile-import.ts diff --git a/extensions/nostr/src/nostr-profile.fuzz.test.ts b/native-plugins/nostr/src/nostr-profile.fuzz.test.ts similarity index 100% rename from extensions/nostr/src/nostr-profile.fuzz.test.ts rename to native-plugins/nostr/src/nostr-profile.fuzz.test.ts diff --git a/extensions/nostr/src/nostr-profile.test.ts b/native-plugins/nostr/src/nostr-profile.test.ts similarity index 100% rename from extensions/nostr/src/nostr-profile.test.ts rename to native-plugins/nostr/src/nostr-profile.test.ts diff --git a/extensions/nostr/src/nostr-profile.ts b/native-plugins/nostr/src/nostr-profile.ts similarity index 100% rename from extensions/nostr/src/nostr-profile.ts rename to native-plugins/nostr/src/nostr-profile.ts diff --git a/extensions/nostr/src/nostr-state-store.test.ts b/native-plugins/nostr/src/nostr-state-store.test.ts similarity index 100% rename from extensions/nostr/src/nostr-state-store.test.ts rename to native-plugins/nostr/src/nostr-state-store.test.ts diff --git a/extensions/nostr/src/nostr-state-store.ts b/native-plugins/nostr/src/nostr-state-store.ts similarity index 100% rename from extensions/nostr/src/nostr-state-store.ts rename to native-plugins/nostr/src/nostr-state-store.ts diff --git a/extensions/nostr/src/runtime.ts b/native-plugins/nostr/src/runtime.ts similarity index 100% rename from extensions/nostr/src/runtime.ts rename to native-plugins/nostr/src/runtime.ts diff --git a/extensions/nostr/src/seen-tracker.ts b/native-plugins/nostr/src/seen-tracker.ts similarity index 100% rename from extensions/nostr/src/seen-tracker.ts rename to native-plugins/nostr/src/seen-tracker.ts diff --git a/extensions/nostr/src/session-route.ts b/native-plugins/nostr/src/session-route.ts similarity index 100% rename from extensions/nostr/src/session-route.ts rename to native-plugins/nostr/src/session-route.ts diff --git a/extensions/nostr/src/setup-surface.test.ts b/native-plugins/nostr/src/setup-surface.test.ts similarity index 91% rename from extensions/nostr/src/setup-surface.test.ts rename to native-plugins/nostr/src/setup-surface.test.ts index c1cd3802c5e..fbeadd2349a 100644 --- a/extensions/nostr/src/setup-surface.test.ts +++ b/native-plugins/nostr/src/setup-surface.test.ts @@ -1,10 +1,10 @@ import { describe, expect, it, vi } from "vitest"; import { buildChannelSetupWizardAdapterFromSetupWizard } from "../../../src/channels/plugins/setup-wizard.js"; -import { createRuntimeEnv } from "../../../test/helpers/extensions/runtime-env.js"; +import { createRuntimeEnv } from "../../../test/helpers/native-plugins/runtime-env.js"; import { createTestWizardPrompter, type WizardPrompter, -} from "../../../test/helpers/extensions/setup-wizard.js"; +} from "../../../test/helpers/native-plugins/setup-wizard.js"; import type { OpenClawConfig } from "../runtime-api.js"; import { nostrPlugin } from "./channel.js"; diff --git a/extensions/nostr/src/setup-surface.ts b/native-plugins/nostr/src/setup-surface.ts similarity index 100% rename from extensions/nostr/src/setup-surface.ts rename to native-plugins/nostr/src/setup-surface.ts diff --git a/extensions/nostr/src/types.test.ts b/native-plugins/nostr/src/types.test.ts similarity index 100% rename from extensions/nostr/src/types.test.ts rename to native-plugins/nostr/src/types.test.ts diff --git a/extensions/nostr/src/types.ts b/native-plugins/nostr/src/types.ts similarity index 100% rename from extensions/nostr/src/types.ts rename to native-plugins/nostr/src/types.ts diff --git a/extensions/nostr/test/setup.ts b/native-plugins/nostr/test/setup.ts similarity index 100% rename from extensions/nostr/test/setup.ts rename to native-plugins/nostr/test/setup.ts diff --git a/extensions/nvidia/index.ts b/native-plugins/nvidia/index.ts similarity index 100% rename from extensions/nvidia/index.ts rename to native-plugins/nvidia/index.ts diff --git a/extensions/nvidia/openclaw.plugin.json b/native-plugins/nvidia/openclaw.plugin.json similarity index 100% rename from extensions/nvidia/openclaw.plugin.json rename to native-plugins/nvidia/openclaw.plugin.json diff --git a/extensions/nvidia/package.json b/native-plugins/nvidia/package.json similarity index 91% rename from extensions/nvidia/package.json rename to native-plugins/nvidia/package.json index 2caee766789..5443bf7f010 100644 --- a/extensions/nvidia/package.json +++ b/native-plugins/nvidia/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw NVIDIA provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/nvidia/provider-catalog.ts b/native-plugins/nvidia/provider-catalog.ts similarity index 100% rename from extensions/nvidia/provider-catalog.ts rename to native-plugins/nvidia/provider-catalog.ts diff --git a/extensions/ollama/README.md b/native-plugins/ollama/README.md similarity index 100% rename from extensions/ollama/README.md rename to native-plugins/ollama/README.md diff --git a/extensions/ollama/index.test.ts b/native-plugins/ollama/index.test.ts similarity index 96% rename from extensions/ollama/index.test.ts rename to native-plugins/ollama/index.test.ts index b47ba72efa1..5a0a0188c1b 100644 --- a/extensions/ollama/index.test.ts +++ b/native-plugins/ollama/index.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from "vitest"; -import { createTestPluginApi } from "../../test/helpers/extensions/plugin-api.js"; +import { createTestPluginApi } from "../../test/helpers/native-plugins/plugin-api.js"; import plugin from "./index.js"; const promptAndConfigureOllamaMock = vi.hoisted(() => diff --git a/extensions/ollama/index.ts b/native-plugins/ollama/index.ts similarity index 100% rename from extensions/ollama/index.ts rename to native-plugins/ollama/index.ts diff --git a/extensions/ollama/openclaw.plugin.json b/native-plugins/ollama/openclaw.plugin.json similarity index 100% rename from extensions/ollama/openclaw.plugin.json rename to native-plugins/ollama/openclaw.plugin.json diff --git a/extensions/ollama/package.json b/native-plugins/ollama/package.json similarity index 91% rename from extensions/ollama/package.json rename to native-plugins/ollama/package.json index 61a8227c3ed..b7ca0b08cf9 100644 --- a/extensions/ollama/package.json +++ b/native-plugins/ollama/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Ollama provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/open-prose/README.md b/native-plugins/open-prose/README.md similarity index 100% rename from extensions/open-prose/README.md rename to native-plugins/open-prose/README.md diff --git a/extensions/open-prose/index.ts b/native-plugins/open-prose/index.ts similarity index 100% rename from extensions/open-prose/index.ts rename to native-plugins/open-prose/index.ts diff --git a/extensions/open-prose/openclaw.plugin.json b/native-plugins/open-prose/openclaw.plugin.json similarity index 100% rename from extensions/open-prose/openclaw.plugin.json rename to native-plugins/open-prose/openclaw.plugin.json diff --git a/extensions/open-prose/package.json b/native-plugins/open-prose/package.json similarity index 91% rename from extensions/open-prose/package.json rename to native-plugins/open-prose/package.json index 69272781198..8d4b5c221f6 100644 --- a/extensions/open-prose/package.json +++ b/native-plugins/open-prose/package.json @@ -5,7 +5,7 @@ "description": "OpenProse VM skill pack plugin (slash command + telemetry).", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/open-prose/runtime-api.ts b/native-plugins/open-prose/runtime-api.ts similarity index 100% rename from extensions/open-prose/runtime-api.ts rename to native-plugins/open-prose/runtime-api.ts diff --git a/extensions/open-prose/skills/prose/LICENSE b/native-plugins/open-prose/skills/prose/LICENSE similarity index 100% rename from extensions/open-prose/skills/prose/LICENSE rename to native-plugins/open-prose/skills/prose/LICENSE diff --git a/extensions/open-prose/skills/prose/SKILL.md b/native-plugins/open-prose/skills/prose/SKILL.md similarity index 100% rename from extensions/open-prose/skills/prose/SKILL.md rename to native-plugins/open-prose/skills/prose/SKILL.md diff --git a/extensions/open-prose/skills/prose/alt-borges.md b/native-plugins/open-prose/skills/prose/alt-borges.md similarity index 100% rename from extensions/open-prose/skills/prose/alt-borges.md rename to native-plugins/open-prose/skills/prose/alt-borges.md diff --git a/extensions/open-prose/skills/prose/alts/arabian-nights.md b/native-plugins/open-prose/skills/prose/alts/arabian-nights.md similarity index 100% rename from extensions/open-prose/skills/prose/alts/arabian-nights.md rename to native-plugins/open-prose/skills/prose/alts/arabian-nights.md diff --git a/extensions/open-prose/skills/prose/alts/borges.md b/native-plugins/open-prose/skills/prose/alts/borges.md similarity index 100% rename from extensions/open-prose/skills/prose/alts/borges.md rename to native-plugins/open-prose/skills/prose/alts/borges.md diff --git a/extensions/open-prose/skills/prose/alts/folk.md b/native-plugins/open-prose/skills/prose/alts/folk.md similarity index 100% rename from extensions/open-prose/skills/prose/alts/folk.md rename to native-plugins/open-prose/skills/prose/alts/folk.md diff --git a/extensions/open-prose/skills/prose/alts/homer.md b/native-plugins/open-prose/skills/prose/alts/homer.md similarity index 100% rename from extensions/open-prose/skills/prose/alts/homer.md rename to native-plugins/open-prose/skills/prose/alts/homer.md diff --git a/extensions/open-prose/skills/prose/alts/kafka.md b/native-plugins/open-prose/skills/prose/alts/kafka.md similarity index 100% rename from extensions/open-prose/skills/prose/alts/kafka.md rename to native-plugins/open-prose/skills/prose/alts/kafka.md diff --git a/extensions/open-prose/skills/prose/alts/shared-appendix.md b/native-plugins/open-prose/skills/prose/alts/shared-appendix.md similarity index 100% rename from extensions/open-prose/skills/prose/alts/shared-appendix.md rename to native-plugins/open-prose/skills/prose/alts/shared-appendix.md diff --git a/extensions/open-prose/skills/prose/compiler.md b/native-plugins/open-prose/skills/prose/compiler.md similarity index 100% rename from extensions/open-prose/skills/prose/compiler.md rename to native-plugins/open-prose/skills/prose/compiler.md diff --git a/extensions/open-prose/skills/prose/examples/01-hello-world.prose b/native-plugins/open-prose/skills/prose/examples/01-hello-world.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/01-hello-world.prose rename to native-plugins/open-prose/skills/prose/examples/01-hello-world.prose diff --git a/extensions/open-prose/skills/prose/examples/02-research-and-summarize.prose b/native-plugins/open-prose/skills/prose/examples/02-research-and-summarize.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/02-research-and-summarize.prose rename to native-plugins/open-prose/skills/prose/examples/02-research-and-summarize.prose diff --git a/extensions/open-prose/skills/prose/examples/03-code-review.prose b/native-plugins/open-prose/skills/prose/examples/03-code-review.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/03-code-review.prose rename to native-plugins/open-prose/skills/prose/examples/03-code-review.prose diff --git a/extensions/open-prose/skills/prose/examples/04-write-and-refine.prose b/native-plugins/open-prose/skills/prose/examples/04-write-and-refine.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/04-write-and-refine.prose rename to native-plugins/open-prose/skills/prose/examples/04-write-and-refine.prose diff --git a/extensions/open-prose/skills/prose/examples/05-debug-issue.prose b/native-plugins/open-prose/skills/prose/examples/05-debug-issue.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/05-debug-issue.prose rename to native-plugins/open-prose/skills/prose/examples/05-debug-issue.prose diff --git a/extensions/open-prose/skills/prose/examples/06-explain-codebase.prose b/native-plugins/open-prose/skills/prose/examples/06-explain-codebase.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/06-explain-codebase.prose rename to native-plugins/open-prose/skills/prose/examples/06-explain-codebase.prose diff --git a/extensions/open-prose/skills/prose/examples/07-refactor.prose b/native-plugins/open-prose/skills/prose/examples/07-refactor.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/07-refactor.prose rename to native-plugins/open-prose/skills/prose/examples/07-refactor.prose diff --git a/extensions/open-prose/skills/prose/examples/08-blog-post.prose b/native-plugins/open-prose/skills/prose/examples/08-blog-post.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/08-blog-post.prose rename to native-plugins/open-prose/skills/prose/examples/08-blog-post.prose diff --git a/extensions/open-prose/skills/prose/examples/09-research-with-agents.prose b/native-plugins/open-prose/skills/prose/examples/09-research-with-agents.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/09-research-with-agents.prose rename to native-plugins/open-prose/skills/prose/examples/09-research-with-agents.prose diff --git a/extensions/open-prose/skills/prose/examples/10-code-review-agents.prose b/native-plugins/open-prose/skills/prose/examples/10-code-review-agents.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/10-code-review-agents.prose rename to native-plugins/open-prose/skills/prose/examples/10-code-review-agents.prose diff --git a/extensions/open-prose/skills/prose/examples/11-skills-and-imports.prose b/native-plugins/open-prose/skills/prose/examples/11-skills-and-imports.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/11-skills-and-imports.prose rename to native-plugins/open-prose/skills/prose/examples/11-skills-and-imports.prose diff --git a/extensions/open-prose/skills/prose/examples/12-secure-agent-permissions.prose b/native-plugins/open-prose/skills/prose/examples/12-secure-agent-permissions.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/12-secure-agent-permissions.prose rename to native-plugins/open-prose/skills/prose/examples/12-secure-agent-permissions.prose diff --git a/extensions/open-prose/skills/prose/examples/13-variables-and-context.prose b/native-plugins/open-prose/skills/prose/examples/13-variables-and-context.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/13-variables-and-context.prose rename to native-plugins/open-prose/skills/prose/examples/13-variables-and-context.prose diff --git a/extensions/open-prose/skills/prose/examples/14-composition-blocks.prose b/native-plugins/open-prose/skills/prose/examples/14-composition-blocks.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/14-composition-blocks.prose rename to native-plugins/open-prose/skills/prose/examples/14-composition-blocks.prose diff --git a/extensions/open-prose/skills/prose/examples/15-inline-sequences.prose b/native-plugins/open-prose/skills/prose/examples/15-inline-sequences.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/15-inline-sequences.prose rename to native-plugins/open-prose/skills/prose/examples/15-inline-sequences.prose diff --git a/extensions/open-prose/skills/prose/examples/16-parallel-reviews.prose b/native-plugins/open-prose/skills/prose/examples/16-parallel-reviews.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/16-parallel-reviews.prose rename to native-plugins/open-prose/skills/prose/examples/16-parallel-reviews.prose diff --git a/extensions/open-prose/skills/prose/examples/17-parallel-research.prose b/native-plugins/open-prose/skills/prose/examples/17-parallel-research.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/17-parallel-research.prose rename to native-plugins/open-prose/skills/prose/examples/17-parallel-research.prose diff --git a/extensions/open-prose/skills/prose/examples/18-mixed-parallel-sequential.prose b/native-plugins/open-prose/skills/prose/examples/18-mixed-parallel-sequential.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/18-mixed-parallel-sequential.prose rename to native-plugins/open-prose/skills/prose/examples/18-mixed-parallel-sequential.prose diff --git a/extensions/open-prose/skills/prose/examples/19-advanced-parallel.prose b/native-plugins/open-prose/skills/prose/examples/19-advanced-parallel.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/19-advanced-parallel.prose rename to native-plugins/open-prose/skills/prose/examples/19-advanced-parallel.prose diff --git a/extensions/open-prose/skills/prose/examples/20-fixed-loops.prose b/native-plugins/open-prose/skills/prose/examples/20-fixed-loops.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/20-fixed-loops.prose rename to native-plugins/open-prose/skills/prose/examples/20-fixed-loops.prose diff --git a/extensions/open-prose/skills/prose/examples/21-pipeline-operations.prose b/native-plugins/open-prose/skills/prose/examples/21-pipeline-operations.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/21-pipeline-operations.prose rename to native-plugins/open-prose/skills/prose/examples/21-pipeline-operations.prose diff --git a/extensions/open-prose/skills/prose/examples/22-error-handling.prose b/native-plugins/open-prose/skills/prose/examples/22-error-handling.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/22-error-handling.prose rename to native-plugins/open-prose/skills/prose/examples/22-error-handling.prose diff --git a/extensions/open-prose/skills/prose/examples/23-retry-with-backoff.prose b/native-plugins/open-prose/skills/prose/examples/23-retry-with-backoff.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/23-retry-with-backoff.prose rename to native-plugins/open-prose/skills/prose/examples/23-retry-with-backoff.prose diff --git a/extensions/open-prose/skills/prose/examples/24-choice-blocks.prose b/native-plugins/open-prose/skills/prose/examples/24-choice-blocks.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/24-choice-blocks.prose rename to native-plugins/open-prose/skills/prose/examples/24-choice-blocks.prose diff --git a/extensions/open-prose/skills/prose/examples/25-conditionals.prose b/native-plugins/open-prose/skills/prose/examples/25-conditionals.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/25-conditionals.prose rename to native-plugins/open-prose/skills/prose/examples/25-conditionals.prose diff --git a/extensions/open-prose/skills/prose/examples/26-parameterized-blocks.prose b/native-plugins/open-prose/skills/prose/examples/26-parameterized-blocks.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/26-parameterized-blocks.prose rename to native-plugins/open-prose/skills/prose/examples/26-parameterized-blocks.prose diff --git a/extensions/open-prose/skills/prose/examples/27-string-interpolation.prose b/native-plugins/open-prose/skills/prose/examples/27-string-interpolation.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/27-string-interpolation.prose rename to native-plugins/open-prose/skills/prose/examples/27-string-interpolation.prose diff --git a/extensions/open-prose/skills/prose/examples/28-automated-pr-review.prose b/native-plugins/open-prose/skills/prose/examples/28-automated-pr-review.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/28-automated-pr-review.prose rename to native-plugins/open-prose/skills/prose/examples/28-automated-pr-review.prose diff --git a/extensions/open-prose/skills/prose/examples/28-gas-town.prose b/native-plugins/open-prose/skills/prose/examples/28-gas-town.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/28-gas-town.prose rename to native-plugins/open-prose/skills/prose/examples/28-gas-town.prose diff --git a/extensions/open-prose/skills/prose/examples/29-captains-chair.prose b/native-plugins/open-prose/skills/prose/examples/29-captains-chair.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/29-captains-chair.prose rename to native-plugins/open-prose/skills/prose/examples/29-captains-chair.prose diff --git a/extensions/open-prose/skills/prose/examples/30-captains-chair-simple.prose b/native-plugins/open-prose/skills/prose/examples/30-captains-chair-simple.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/30-captains-chair-simple.prose rename to native-plugins/open-prose/skills/prose/examples/30-captains-chair-simple.prose diff --git a/extensions/open-prose/skills/prose/examples/31-captains-chair-with-memory.prose b/native-plugins/open-prose/skills/prose/examples/31-captains-chair-with-memory.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/31-captains-chair-with-memory.prose rename to native-plugins/open-prose/skills/prose/examples/31-captains-chair-with-memory.prose diff --git a/extensions/open-prose/skills/prose/examples/33-pr-review-autofix.prose b/native-plugins/open-prose/skills/prose/examples/33-pr-review-autofix.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/33-pr-review-autofix.prose rename to native-plugins/open-prose/skills/prose/examples/33-pr-review-autofix.prose diff --git a/extensions/open-prose/skills/prose/examples/34-content-pipeline.prose b/native-plugins/open-prose/skills/prose/examples/34-content-pipeline.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/34-content-pipeline.prose rename to native-plugins/open-prose/skills/prose/examples/34-content-pipeline.prose diff --git a/extensions/open-prose/skills/prose/examples/35-feature-factory.prose b/native-plugins/open-prose/skills/prose/examples/35-feature-factory.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/35-feature-factory.prose rename to native-plugins/open-prose/skills/prose/examples/35-feature-factory.prose diff --git a/extensions/open-prose/skills/prose/examples/36-bug-hunter.prose b/native-plugins/open-prose/skills/prose/examples/36-bug-hunter.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/36-bug-hunter.prose rename to native-plugins/open-prose/skills/prose/examples/36-bug-hunter.prose diff --git a/extensions/open-prose/skills/prose/examples/37-the-forge.prose b/native-plugins/open-prose/skills/prose/examples/37-the-forge.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/37-the-forge.prose rename to native-plugins/open-prose/skills/prose/examples/37-the-forge.prose diff --git a/extensions/open-prose/skills/prose/examples/38-skill-scan.prose b/native-plugins/open-prose/skills/prose/examples/38-skill-scan.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/38-skill-scan.prose rename to native-plugins/open-prose/skills/prose/examples/38-skill-scan.prose diff --git a/extensions/open-prose/skills/prose/examples/39-architect-by-simulation.prose b/native-plugins/open-prose/skills/prose/examples/39-architect-by-simulation.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/39-architect-by-simulation.prose rename to native-plugins/open-prose/skills/prose/examples/39-architect-by-simulation.prose diff --git a/extensions/open-prose/skills/prose/examples/40-rlm-self-refine.prose b/native-plugins/open-prose/skills/prose/examples/40-rlm-self-refine.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/40-rlm-self-refine.prose rename to native-plugins/open-prose/skills/prose/examples/40-rlm-self-refine.prose diff --git a/extensions/open-prose/skills/prose/examples/41-rlm-divide-conquer.prose b/native-plugins/open-prose/skills/prose/examples/41-rlm-divide-conquer.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/41-rlm-divide-conquer.prose rename to native-plugins/open-prose/skills/prose/examples/41-rlm-divide-conquer.prose diff --git a/extensions/open-prose/skills/prose/examples/42-rlm-filter-recurse.prose b/native-plugins/open-prose/skills/prose/examples/42-rlm-filter-recurse.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/42-rlm-filter-recurse.prose rename to native-plugins/open-prose/skills/prose/examples/42-rlm-filter-recurse.prose diff --git a/extensions/open-prose/skills/prose/examples/43-rlm-pairwise.prose b/native-plugins/open-prose/skills/prose/examples/43-rlm-pairwise.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/43-rlm-pairwise.prose rename to native-plugins/open-prose/skills/prose/examples/43-rlm-pairwise.prose diff --git a/extensions/open-prose/skills/prose/examples/44-run-endpoint-ux-test.prose b/native-plugins/open-prose/skills/prose/examples/44-run-endpoint-ux-test.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/44-run-endpoint-ux-test.prose rename to native-plugins/open-prose/skills/prose/examples/44-run-endpoint-ux-test.prose diff --git a/extensions/open-prose/skills/prose/examples/45-plugin-release.prose b/native-plugins/open-prose/skills/prose/examples/45-plugin-release.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/45-plugin-release.prose rename to native-plugins/open-prose/skills/prose/examples/45-plugin-release.prose diff --git a/extensions/open-prose/skills/prose/examples/45-run-endpoint-ux-test-with-remediation.prose b/native-plugins/open-prose/skills/prose/examples/45-run-endpoint-ux-test-with-remediation.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/45-run-endpoint-ux-test-with-remediation.prose rename to native-plugins/open-prose/skills/prose/examples/45-run-endpoint-ux-test-with-remediation.prose diff --git a/extensions/open-prose/skills/prose/examples/46-run-endpoint-ux-test-fast.prose b/native-plugins/open-prose/skills/prose/examples/46-run-endpoint-ux-test-fast.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/46-run-endpoint-ux-test-fast.prose rename to native-plugins/open-prose/skills/prose/examples/46-run-endpoint-ux-test-fast.prose diff --git a/extensions/open-prose/skills/prose/examples/46-workflow-crystallizer.prose b/native-plugins/open-prose/skills/prose/examples/46-workflow-crystallizer.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/46-workflow-crystallizer.prose rename to native-plugins/open-prose/skills/prose/examples/46-workflow-crystallizer.prose diff --git a/extensions/open-prose/skills/prose/examples/47-language-self-improvement.prose b/native-plugins/open-prose/skills/prose/examples/47-language-self-improvement.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/47-language-self-improvement.prose rename to native-plugins/open-prose/skills/prose/examples/47-language-self-improvement.prose diff --git a/extensions/open-prose/skills/prose/examples/48-habit-miner.prose b/native-plugins/open-prose/skills/prose/examples/48-habit-miner.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/48-habit-miner.prose rename to native-plugins/open-prose/skills/prose/examples/48-habit-miner.prose diff --git a/extensions/open-prose/skills/prose/examples/49-prose-run-retrospective.prose b/native-plugins/open-prose/skills/prose/examples/49-prose-run-retrospective.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/49-prose-run-retrospective.prose rename to native-plugins/open-prose/skills/prose/examples/49-prose-run-retrospective.prose diff --git a/extensions/open-prose/skills/prose/examples/README.md b/native-plugins/open-prose/skills/prose/examples/README.md similarity index 100% rename from extensions/open-prose/skills/prose/examples/README.md rename to native-plugins/open-prose/skills/prose/examples/README.md diff --git a/extensions/open-prose/skills/prose/examples/roadmap/README.md b/native-plugins/open-prose/skills/prose/examples/roadmap/README.md similarity index 100% rename from extensions/open-prose/skills/prose/examples/roadmap/README.md rename to native-plugins/open-prose/skills/prose/examples/roadmap/README.md diff --git a/extensions/open-prose/skills/prose/examples/roadmap/iterative-refinement.prose b/native-plugins/open-prose/skills/prose/examples/roadmap/iterative-refinement.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/roadmap/iterative-refinement.prose rename to native-plugins/open-prose/skills/prose/examples/roadmap/iterative-refinement.prose diff --git a/extensions/open-prose/skills/prose/examples/roadmap/parallel-review.prose b/native-plugins/open-prose/skills/prose/examples/roadmap/parallel-review.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/roadmap/parallel-review.prose rename to native-plugins/open-prose/skills/prose/examples/roadmap/parallel-review.prose diff --git a/extensions/open-prose/skills/prose/examples/roadmap/simple-pipeline.prose b/native-plugins/open-prose/skills/prose/examples/roadmap/simple-pipeline.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/roadmap/simple-pipeline.prose rename to native-plugins/open-prose/skills/prose/examples/roadmap/simple-pipeline.prose diff --git a/extensions/open-prose/skills/prose/examples/roadmap/syntax/open-prose-syntax.prose b/native-plugins/open-prose/skills/prose/examples/roadmap/syntax/open-prose-syntax.prose similarity index 100% rename from extensions/open-prose/skills/prose/examples/roadmap/syntax/open-prose-syntax.prose rename to native-plugins/open-prose/skills/prose/examples/roadmap/syntax/open-prose-syntax.prose diff --git a/extensions/open-prose/skills/prose/guidance/antipatterns.md b/native-plugins/open-prose/skills/prose/guidance/antipatterns.md similarity index 100% rename from extensions/open-prose/skills/prose/guidance/antipatterns.md rename to native-plugins/open-prose/skills/prose/guidance/antipatterns.md diff --git a/extensions/open-prose/skills/prose/guidance/patterns.md b/native-plugins/open-prose/skills/prose/guidance/patterns.md similarity index 100% rename from extensions/open-prose/skills/prose/guidance/patterns.md rename to native-plugins/open-prose/skills/prose/guidance/patterns.md diff --git a/extensions/open-prose/skills/prose/guidance/system-prompt.md b/native-plugins/open-prose/skills/prose/guidance/system-prompt.md similarity index 100% rename from extensions/open-prose/skills/prose/guidance/system-prompt.md rename to native-plugins/open-prose/skills/prose/guidance/system-prompt.md diff --git a/extensions/open-prose/skills/prose/help.md b/native-plugins/open-prose/skills/prose/help.md similarity index 100% rename from extensions/open-prose/skills/prose/help.md rename to native-plugins/open-prose/skills/prose/help.md diff --git a/extensions/open-prose/skills/prose/lib/README.md b/native-plugins/open-prose/skills/prose/lib/README.md similarity index 100% rename from extensions/open-prose/skills/prose/lib/README.md rename to native-plugins/open-prose/skills/prose/lib/README.md diff --git a/extensions/open-prose/skills/prose/lib/calibrator.prose b/native-plugins/open-prose/skills/prose/lib/calibrator.prose similarity index 100% rename from extensions/open-prose/skills/prose/lib/calibrator.prose rename to native-plugins/open-prose/skills/prose/lib/calibrator.prose diff --git a/extensions/open-prose/skills/prose/lib/cost-analyzer.prose b/native-plugins/open-prose/skills/prose/lib/cost-analyzer.prose similarity index 100% rename from extensions/open-prose/skills/prose/lib/cost-analyzer.prose rename to native-plugins/open-prose/skills/prose/lib/cost-analyzer.prose diff --git a/extensions/open-prose/skills/prose/lib/error-forensics.prose b/native-plugins/open-prose/skills/prose/lib/error-forensics.prose similarity index 100% rename from extensions/open-prose/skills/prose/lib/error-forensics.prose rename to native-plugins/open-prose/skills/prose/lib/error-forensics.prose diff --git a/extensions/open-prose/skills/prose/lib/inspector.prose b/native-plugins/open-prose/skills/prose/lib/inspector.prose similarity index 100% rename from extensions/open-prose/skills/prose/lib/inspector.prose rename to native-plugins/open-prose/skills/prose/lib/inspector.prose diff --git a/extensions/open-prose/skills/prose/lib/profiler.prose b/native-plugins/open-prose/skills/prose/lib/profiler.prose similarity index 100% rename from extensions/open-prose/skills/prose/lib/profiler.prose rename to native-plugins/open-prose/skills/prose/lib/profiler.prose diff --git a/extensions/open-prose/skills/prose/lib/program-improver.prose b/native-plugins/open-prose/skills/prose/lib/program-improver.prose similarity index 100% rename from extensions/open-prose/skills/prose/lib/program-improver.prose rename to native-plugins/open-prose/skills/prose/lib/program-improver.prose diff --git a/extensions/open-prose/skills/prose/lib/project-memory.prose b/native-plugins/open-prose/skills/prose/lib/project-memory.prose similarity index 100% rename from extensions/open-prose/skills/prose/lib/project-memory.prose rename to native-plugins/open-prose/skills/prose/lib/project-memory.prose diff --git a/extensions/open-prose/skills/prose/lib/user-memory.prose b/native-plugins/open-prose/skills/prose/lib/user-memory.prose similarity index 100% rename from extensions/open-prose/skills/prose/lib/user-memory.prose rename to native-plugins/open-prose/skills/prose/lib/user-memory.prose diff --git a/extensions/open-prose/skills/prose/lib/vm-improver.prose b/native-plugins/open-prose/skills/prose/lib/vm-improver.prose similarity index 100% rename from extensions/open-prose/skills/prose/lib/vm-improver.prose rename to native-plugins/open-prose/skills/prose/lib/vm-improver.prose diff --git a/extensions/open-prose/skills/prose/primitives/session.md b/native-plugins/open-prose/skills/prose/primitives/session.md similarity index 100% rename from extensions/open-prose/skills/prose/primitives/session.md rename to native-plugins/open-prose/skills/prose/primitives/session.md diff --git a/extensions/open-prose/skills/prose/prose.md b/native-plugins/open-prose/skills/prose/prose.md similarity index 100% rename from extensions/open-prose/skills/prose/prose.md rename to native-plugins/open-prose/skills/prose/prose.md diff --git a/extensions/open-prose/skills/prose/state/filesystem.md b/native-plugins/open-prose/skills/prose/state/filesystem.md similarity index 100% rename from extensions/open-prose/skills/prose/state/filesystem.md rename to native-plugins/open-prose/skills/prose/state/filesystem.md diff --git a/extensions/open-prose/skills/prose/state/in-context.md b/native-plugins/open-prose/skills/prose/state/in-context.md similarity index 100% rename from extensions/open-prose/skills/prose/state/in-context.md rename to native-plugins/open-prose/skills/prose/state/in-context.md diff --git a/extensions/open-prose/skills/prose/state/postgres.md b/native-plugins/open-prose/skills/prose/state/postgres.md similarity index 100% rename from extensions/open-prose/skills/prose/state/postgres.md rename to native-plugins/open-prose/skills/prose/state/postgres.md diff --git a/extensions/open-prose/skills/prose/state/sqlite.md b/native-plugins/open-prose/skills/prose/state/sqlite.md similarity index 100% rename from extensions/open-prose/skills/prose/state/sqlite.md rename to native-plugins/open-prose/skills/prose/state/sqlite.md diff --git a/extensions/openai/index.ts b/native-plugins/openai/index.ts similarity index 100% rename from extensions/openai/index.ts rename to native-plugins/openai/index.ts diff --git a/extensions/openai/media-understanding-provider.ts b/native-plugins/openai/media-understanding-provider.ts similarity index 100% rename from extensions/openai/media-understanding-provider.ts rename to native-plugins/openai/media-understanding-provider.ts diff --git a/extensions/openai/openai-codex-catalog.ts b/native-plugins/openai/openai-codex-catalog.ts similarity index 100% rename from extensions/openai/openai-codex-catalog.ts rename to native-plugins/openai/openai-codex-catalog.ts diff --git a/extensions/openai/openai-codex-provider.runtime.ts b/native-plugins/openai/openai-codex-provider.runtime.ts similarity index 100% rename from extensions/openai/openai-codex-provider.runtime.ts rename to native-plugins/openai/openai-codex-provider.runtime.ts diff --git a/extensions/openai/openai-codex-provider.ts b/native-plugins/openai/openai-codex-provider.ts similarity index 100% rename from extensions/openai/openai-codex-provider.ts rename to native-plugins/openai/openai-codex-provider.ts diff --git a/extensions/openai/openai-provider.test.ts b/native-plugins/openai/openai-provider.test.ts similarity index 100% rename from extensions/openai/openai-provider.test.ts rename to native-plugins/openai/openai-provider.test.ts diff --git a/extensions/openai/openai-provider.ts b/native-plugins/openai/openai-provider.ts similarity index 100% rename from extensions/openai/openai-provider.ts rename to native-plugins/openai/openai-provider.ts diff --git a/extensions/openai/openclaw.plugin.json b/native-plugins/openai/openclaw.plugin.json similarity index 100% rename from extensions/openai/openclaw.plugin.json rename to native-plugins/openai/openclaw.plugin.json diff --git a/extensions/openai/package.json b/native-plugins/openai/package.json similarity index 91% rename from extensions/openai/package.json rename to native-plugins/openai/package.json index 1e4599dc157..50f444e36e6 100644 --- a/extensions/openai/package.json +++ b/native-plugins/openai/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw OpenAI provider plugins", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/openai/shared.ts b/native-plugins/openai/shared.ts similarity index 100% rename from extensions/openai/shared.ts rename to native-plugins/openai/shared.ts diff --git a/extensions/opencode-go/index.ts b/native-plugins/opencode-go/index.ts similarity index 100% rename from extensions/opencode-go/index.ts rename to native-plugins/opencode-go/index.ts diff --git a/extensions/opencode-go/onboard.ts b/native-plugins/opencode-go/onboard.ts similarity index 100% rename from extensions/opencode-go/onboard.ts rename to native-plugins/opencode-go/onboard.ts diff --git a/extensions/opencode-go/openclaw.plugin.json b/native-plugins/opencode-go/openclaw.plugin.json similarity index 100% rename from extensions/opencode-go/openclaw.plugin.json rename to native-plugins/opencode-go/openclaw.plugin.json diff --git a/extensions/opencode-go/package.json b/native-plugins/opencode-go/package.json similarity index 91% rename from extensions/opencode-go/package.json rename to native-plugins/opencode-go/package.json index ab32e55d7dc..d32a04023c9 100644 --- a/extensions/opencode-go/package.json +++ b/native-plugins/opencode-go/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw OpenCode Go provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/opencode/index.ts b/native-plugins/opencode/index.ts similarity index 100% rename from extensions/opencode/index.ts rename to native-plugins/opencode/index.ts diff --git a/extensions/opencode/onboard.ts b/native-plugins/opencode/onboard.ts similarity index 100% rename from extensions/opencode/onboard.ts rename to native-plugins/opencode/onboard.ts diff --git a/extensions/opencode/openclaw.plugin.json b/native-plugins/opencode/openclaw.plugin.json similarity index 100% rename from extensions/opencode/openclaw.plugin.json rename to native-plugins/opencode/openclaw.plugin.json diff --git a/extensions/opencode/package.json b/native-plugins/opencode/package.json similarity index 91% rename from extensions/opencode/package.json rename to native-plugins/opencode/package.json index a8c185cd94b..63fcbe584e4 100644 --- a/extensions/opencode/package.json +++ b/native-plugins/opencode/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw OpenCode Zen provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/openrouter/index.ts b/native-plugins/openrouter/index.ts similarity index 100% rename from extensions/openrouter/index.ts rename to native-plugins/openrouter/index.ts diff --git a/extensions/openrouter/onboard.ts b/native-plugins/openrouter/onboard.ts similarity index 100% rename from extensions/openrouter/onboard.ts rename to native-plugins/openrouter/onboard.ts diff --git a/extensions/openrouter/openclaw.plugin.json b/native-plugins/openrouter/openclaw.plugin.json similarity index 100% rename from extensions/openrouter/openclaw.plugin.json rename to native-plugins/openrouter/openclaw.plugin.json diff --git a/extensions/openrouter/package.json b/native-plugins/openrouter/package.json similarity index 91% rename from extensions/openrouter/package.json rename to native-plugins/openrouter/package.json index 243569356f5..9da34e6ebda 100644 --- a/extensions/openrouter/package.json +++ b/native-plugins/openrouter/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw OpenRouter provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/openrouter/provider-catalog.ts b/native-plugins/openrouter/provider-catalog.ts similarity index 100% rename from extensions/openrouter/provider-catalog.ts rename to native-plugins/openrouter/provider-catalog.ts diff --git a/extensions/openshell/index.ts b/native-plugins/openshell/index.ts similarity index 100% rename from extensions/openshell/index.ts rename to native-plugins/openshell/index.ts diff --git a/extensions/openshell/openclaw.plugin.json b/native-plugins/openshell/openclaw.plugin.json similarity index 100% rename from extensions/openshell/openclaw.plugin.json rename to native-plugins/openshell/openclaw.plugin.json diff --git a/extensions/openshell/package.json b/native-plugins/openshell/package.json similarity index 91% rename from extensions/openshell/package.json rename to native-plugins/openshell/package.json index 464c749ea34..73c45a749f9 100644 --- a/extensions/openshell/package.json +++ b/native-plugins/openshell/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw OpenShell sandbox backend", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/openshell/src/backend.test.ts b/native-plugins/openshell/src/backend.test.ts similarity index 100% rename from extensions/openshell/src/backend.test.ts rename to native-plugins/openshell/src/backend.test.ts diff --git a/extensions/openshell/src/backend.ts b/native-plugins/openshell/src/backend.ts similarity index 100% rename from extensions/openshell/src/backend.ts rename to native-plugins/openshell/src/backend.ts diff --git a/extensions/openshell/src/cli.test.ts b/native-plugins/openshell/src/cli.test.ts similarity index 100% rename from extensions/openshell/src/cli.test.ts rename to native-plugins/openshell/src/cli.test.ts diff --git a/extensions/openshell/src/cli.ts b/native-plugins/openshell/src/cli.ts similarity index 100% rename from extensions/openshell/src/cli.ts rename to native-plugins/openshell/src/cli.ts diff --git a/extensions/openshell/src/config.test.ts b/native-plugins/openshell/src/config.test.ts similarity index 100% rename from extensions/openshell/src/config.test.ts rename to native-plugins/openshell/src/config.test.ts diff --git a/extensions/openshell/src/config.ts b/native-plugins/openshell/src/config.ts similarity index 100% rename from extensions/openshell/src/config.ts rename to native-plugins/openshell/src/config.ts diff --git a/extensions/openshell/src/fs-bridge.test.ts b/native-plugins/openshell/src/fs-bridge.test.ts similarity index 100% rename from extensions/openshell/src/fs-bridge.test.ts rename to native-plugins/openshell/src/fs-bridge.test.ts diff --git a/extensions/openshell/src/fs-bridge.ts b/native-plugins/openshell/src/fs-bridge.ts similarity index 100% rename from extensions/openshell/src/fs-bridge.ts rename to native-plugins/openshell/src/fs-bridge.ts diff --git a/extensions/openshell/src/mirror.ts b/native-plugins/openshell/src/mirror.ts similarity index 100% rename from extensions/openshell/src/mirror.ts rename to native-plugins/openshell/src/mirror.ts diff --git a/extensions/openshell/src/remote-fs-bridge.test.ts b/native-plugins/openshell/src/remote-fs-bridge.test.ts similarity index 100% rename from extensions/openshell/src/remote-fs-bridge.test.ts rename to native-plugins/openshell/src/remote-fs-bridge.test.ts diff --git a/extensions/openshell/src/remote-fs-bridge.ts b/native-plugins/openshell/src/remote-fs-bridge.ts similarity index 100% rename from extensions/openshell/src/remote-fs-bridge.ts rename to native-plugins/openshell/src/remote-fs-bridge.ts diff --git a/extensions/perplexity/index.ts b/native-plugins/perplexity/index.ts similarity index 100% rename from extensions/perplexity/index.ts rename to native-plugins/perplexity/index.ts diff --git a/extensions/perplexity/openclaw.plugin.json b/native-plugins/perplexity/openclaw.plugin.json similarity index 100% rename from extensions/perplexity/openclaw.plugin.json rename to native-plugins/perplexity/openclaw.plugin.json diff --git a/extensions/perplexity/package.json b/native-plugins/perplexity/package.json similarity index 90% rename from extensions/perplexity/package.json rename to native-plugins/perplexity/package.json index 2a6321ba56c..c1ebae4d25a 100644 --- a/extensions/perplexity/package.json +++ b/native-plugins/perplexity/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Perplexity plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/perplexity/src/perplexity-web-search-provider.ts b/native-plugins/perplexity/src/perplexity-web-search-provider.ts similarity index 100% rename from extensions/perplexity/src/perplexity-web-search-provider.ts rename to native-plugins/perplexity/src/perplexity-web-search-provider.ts diff --git a/extensions/perplexity/web-search-provider.ts b/native-plugins/perplexity/web-search-provider.ts similarity index 100% rename from extensions/perplexity/web-search-provider.ts rename to native-plugins/perplexity/web-search-provider.ts diff --git a/extensions/phone-control/index.test.ts b/native-plugins/phone-control/index.test.ts similarity index 97% rename from extensions/phone-control/index.test.ts rename to native-plugins/phone-control/index.test.ts index 21494a11a38..f7c714d5263 100644 --- a/extensions/phone-control/index.test.ts +++ b/native-plugins/phone-control/index.test.ts @@ -2,7 +2,7 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { describe, expect, it, vi } from "vitest"; -import { createTestPluginApi } from "../../test/helpers/extensions/plugin-api.js"; +import { createTestPluginApi } from "../../test/helpers/native-plugins/plugin-api.js"; import registerPhoneControl from "./index.js"; import type { OpenClawPluginApi, diff --git a/extensions/phone-control/index.ts b/native-plugins/phone-control/index.ts similarity index 100% rename from extensions/phone-control/index.ts rename to native-plugins/phone-control/index.ts diff --git a/extensions/phone-control/openclaw.plugin.json b/native-plugins/phone-control/openclaw.plugin.json similarity index 100% rename from extensions/phone-control/openclaw.plugin.json rename to native-plugins/phone-control/openclaw.plugin.json diff --git a/extensions/phone-control/runtime-api.ts b/native-plugins/phone-control/runtime-api.ts similarity index 100% rename from extensions/phone-control/runtime-api.ts rename to native-plugins/phone-control/runtime-api.ts diff --git a/extensions/qianfan/index.ts b/native-plugins/qianfan/index.ts similarity index 100% rename from extensions/qianfan/index.ts rename to native-plugins/qianfan/index.ts diff --git a/extensions/qianfan/onboard.ts b/native-plugins/qianfan/onboard.ts similarity index 100% rename from extensions/qianfan/onboard.ts rename to native-plugins/qianfan/onboard.ts diff --git a/extensions/qianfan/openclaw.plugin.json b/native-plugins/qianfan/openclaw.plugin.json similarity index 100% rename from extensions/qianfan/openclaw.plugin.json rename to native-plugins/qianfan/openclaw.plugin.json diff --git a/extensions/qianfan/package.json b/native-plugins/qianfan/package.json similarity index 91% rename from extensions/qianfan/package.json rename to native-plugins/qianfan/package.json index 57b2177e6d8..7922e45717f 100644 --- a/extensions/qianfan/package.json +++ b/native-plugins/qianfan/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Qianfan provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/qianfan/provider-catalog.ts b/native-plugins/qianfan/provider-catalog.ts similarity index 100% rename from extensions/qianfan/provider-catalog.ts rename to native-plugins/qianfan/provider-catalog.ts diff --git a/extensions/qwen-portal-auth/README.md b/native-plugins/qwen-portal-auth/README.md similarity index 100% rename from extensions/qwen-portal-auth/README.md rename to native-plugins/qwen-portal-auth/README.md diff --git a/extensions/qwen-portal-auth/index.ts b/native-plugins/qwen-portal-auth/index.ts similarity index 100% rename from extensions/qwen-portal-auth/index.ts rename to native-plugins/qwen-portal-auth/index.ts diff --git a/extensions/qwen-portal-auth/oauth.runtime.ts b/native-plugins/qwen-portal-auth/oauth.runtime.ts similarity index 100% rename from extensions/qwen-portal-auth/oauth.runtime.ts rename to native-plugins/qwen-portal-auth/oauth.runtime.ts diff --git a/extensions/qwen-portal-auth/oauth.ts b/native-plugins/qwen-portal-auth/oauth.ts similarity index 100% rename from extensions/qwen-portal-auth/oauth.ts rename to native-plugins/qwen-portal-auth/oauth.ts diff --git a/extensions/qwen-portal-auth/openclaw.plugin.json b/native-plugins/qwen-portal-auth/openclaw.plugin.json similarity index 100% rename from extensions/qwen-portal-auth/openclaw.plugin.json rename to native-plugins/qwen-portal-auth/openclaw.plugin.json diff --git a/extensions/qwen-portal-auth/provider-catalog.ts b/native-plugins/qwen-portal-auth/provider-catalog.ts similarity index 100% rename from extensions/qwen-portal-auth/provider-catalog.ts rename to native-plugins/qwen-portal-auth/provider-catalog.ts diff --git a/extensions/qwen-portal-auth/runtime-api.ts b/native-plugins/qwen-portal-auth/runtime-api.ts similarity index 100% rename from extensions/qwen-portal-auth/runtime-api.ts rename to native-plugins/qwen-portal-auth/runtime-api.ts diff --git a/extensions/sglang/README.md b/native-plugins/sglang/README.md similarity index 100% rename from extensions/sglang/README.md rename to native-plugins/sglang/README.md diff --git a/extensions/sglang/index.ts b/native-plugins/sglang/index.ts similarity index 100% rename from extensions/sglang/index.ts rename to native-plugins/sglang/index.ts diff --git a/extensions/sglang/openclaw.plugin.json b/native-plugins/sglang/openclaw.plugin.json similarity index 100% rename from extensions/sglang/openclaw.plugin.json rename to native-plugins/sglang/openclaw.plugin.json diff --git a/extensions/sglang/package.json b/native-plugins/sglang/package.json similarity index 91% rename from extensions/sglang/package.json rename to native-plugins/sglang/package.json index d64495bd110..86fceea9fd5 100644 --- a/extensions/sglang/package.json +++ b/native-plugins/sglang/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw SGLang provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/shared/channel-status-summary.ts b/native-plugins/shared/channel-status-summary.ts similarity index 100% rename from extensions/shared/channel-status-summary.ts rename to native-plugins/shared/channel-status-summary.ts diff --git a/extensions/shared/config-schema-helpers.ts b/native-plugins/shared/config-schema-helpers.ts similarity index 100% rename from extensions/shared/config-schema-helpers.ts rename to native-plugins/shared/config-schema-helpers.ts diff --git a/extensions/shared/deferred.ts b/native-plugins/shared/deferred.ts similarity index 100% rename from extensions/shared/deferred.ts rename to native-plugins/shared/deferred.ts diff --git a/extensions/shared/passive-monitor.ts b/native-plugins/shared/passive-monitor.ts similarity index 100% rename from extensions/shared/passive-monitor.ts rename to native-plugins/shared/passive-monitor.ts diff --git a/extensions/shared/resolve-target-test-helpers.ts b/native-plugins/shared/resolve-target-test-helpers.ts similarity index 100% rename from extensions/shared/resolve-target-test-helpers.ts rename to native-plugins/shared/resolve-target-test-helpers.ts diff --git a/extensions/shared/runtime.ts b/native-plugins/shared/runtime.ts similarity index 100% rename from extensions/shared/runtime.ts rename to native-plugins/shared/runtime.ts diff --git a/extensions/shared/status-issues.ts b/native-plugins/shared/status-issues.ts similarity index 100% rename from extensions/shared/status-issues.ts rename to native-plugins/shared/status-issues.ts diff --git a/extensions/shared/windows-cmd-shim-test-fixtures.ts b/native-plugins/shared/windows-cmd-shim-test-fixtures.ts similarity index 100% rename from extensions/shared/windows-cmd-shim-test-fixtures.ts rename to native-plugins/shared/windows-cmd-shim-test-fixtures.ts diff --git a/extensions/signal/api.ts b/native-plugins/signal/api.ts similarity index 100% rename from extensions/signal/api.ts rename to native-plugins/signal/api.ts diff --git a/extensions/signal/index.ts b/native-plugins/signal/index.ts similarity index 100% rename from extensions/signal/index.ts rename to native-plugins/signal/index.ts diff --git a/extensions/signal/openclaw.plugin.json b/native-plugins/signal/openclaw.plugin.json similarity index 100% rename from extensions/signal/openclaw.plugin.json rename to native-plugins/signal/openclaw.plugin.json diff --git a/extensions/signal/package.json b/native-plugins/signal/package.json similarity index 96% rename from extensions/signal/package.json rename to native-plugins/signal/package.json index f6d4d6c9a1d..f9b7ec82f05 100644 --- a/extensions/signal/package.json +++ b/native-plugins/signal/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Signal channel plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ], "setupEntry": "./setup-entry.ts", diff --git a/extensions/signal/runtime-api.ts b/native-plugins/signal/runtime-api.ts similarity index 100% rename from extensions/signal/runtime-api.ts rename to native-plugins/signal/runtime-api.ts diff --git a/extensions/signal/setup-entry.ts b/native-plugins/signal/setup-entry.ts similarity index 100% rename from extensions/signal/setup-entry.ts rename to native-plugins/signal/setup-entry.ts diff --git a/extensions/signal/src/accounts.ts b/native-plugins/signal/src/accounts.ts similarity index 100% rename from extensions/signal/src/accounts.ts rename to native-plugins/signal/src/accounts.ts diff --git a/extensions/signal/src/channel.outbound.test.ts b/native-plugins/signal/src/channel.outbound.test.ts similarity index 100% rename from extensions/signal/src/channel.outbound.test.ts rename to native-plugins/signal/src/channel.outbound.test.ts diff --git a/extensions/signal/src/channel.runtime.ts b/native-plugins/signal/src/channel.runtime.ts similarity index 100% rename from extensions/signal/src/channel.runtime.ts rename to native-plugins/signal/src/channel.runtime.ts diff --git a/extensions/signal/src/channel.setup.ts b/native-plugins/signal/src/channel.setup.ts similarity index 100% rename from extensions/signal/src/channel.setup.ts rename to native-plugins/signal/src/channel.setup.ts diff --git a/extensions/signal/src/channel.test.ts b/native-plugins/signal/src/channel.test.ts similarity index 100% rename from extensions/signal/src/channel.test.ts rename to native-plugins/signal/src/channel.test.ts diff --git a/extensions/signal/src/channel.ts b/native-plugins/signal/src/channel.ts similarity index 100% rename from extensions/signal/src/channel.ts rename to native-plugins/signal/src/channel.ts diff --git a/extensions/signal/src/client.test.ts b/native-plugins/signal/src/client.test.ts similarity index 100% rename from extensions/signal/src/client.test.ts rename to native-plugins/signal/src/client.test.ts diff --git a/extensions/signal/src/client.ts b/native-plugins/signal/src/client.ts similarity index 100% rename from extensions/signal/src/client.ts rename to native-plugins/signal/src/client.ts diff --git a/extensions/signal/src/config-schema.ts b/native-plugins/signal/src/config-schema.ts similarity index 100% rename from extensions/signal/src/config-schema.ts rename to native-plugins/signal/src/config-schema.ts diff --git a/extensions/signal/src/daemon.ts b/native-plugins/signal/src/daemon.ts similarity index 100% rename from extensions/signal/src/daemon.ts rename to native-plugins/signal/src/daemon.ts diff --git a/extensions/signal/src/format.chunking.test.ts b/native-plugins/signal/src/format.chunking.test.ts similarity index 100% rename from extensions/signal/src/format.chunking.test.ts rename to native-plugins/signal/src/format.chunking.test.ts diff --git a/extensions/signal/src/format.links.test.ts b/native-plugins/signal/src/format.links.test.ts similarity index 100% rename from extensions/signal/src/format.links.test.ts rename to native-plugins/signal/src/format.links.test.ts diff --git a/extensions/signal/src/format.test.ts b/native-plugins/signal/src/format.test.ts similarity index 100% rename from extensions/signal/src/format.test.ts rename to native-plugins/signal/src/format.test.ts diff --git a/extensions/signal/src/format.ts b/native-plugins/signal/src/format.ts similarity index 100% rename from extensions/signal/src/format.ts rename to native-plugins/signal/src/format.ts diff --git a/extensions/signal/src/format.visual.test.ts b/native-plugins/signal/src/format.visual.test.ts similarity index 100% rename from extensions/signal/src/format.visual.test.ts rename to native-plugins/signal/src/format.visual.test.ts diff --git a/extensions/signal/src/identity.test.ts b/native-plugins/signal/src/identity.test.ts similarity index 100% rename from extensions/signal/src/identity.test.ts rename to native-plugins/signal/src/identity.test.ts diff --git a/extensions/signal/src/identity.ts b/native-plugins/signal/src/identity.ts similarity index 100% rename from extensions/signal/src/identity.ts rename to native-plugins/signal/src/identity.ts diff --git a/extensions/signal/src/index.ts b/native-plugins/signal/src/index.ts similarity index 100% rename from extensions/signal/src/index.ts rename to native-plugins/signal/src/index.ts diff --git a/extensions/signal/src/message-actions.ts b/native-plugins/signal/src/message-actions.ts similarity index 100% rename from extensions/signal/src/message-actions.ts rename to native-plugins/signal/src/message-actions.ts diff --git a/extensions/signal/src/monitor.test.ts b/native-plugins/signal/src/monitor.test.ts similarity index 100% rename from extensions/signal/src/monitor.test.ts rename to native-plugins/signal/src/monitor.test.ts diff --git a/extensions/signal/src/monitor.tool-result.pairs-uuid-only-senders-uuid-allowlist-entry.test.ts b/native-plugins/signal/src/monitor.tool-result.pairs-uuid-only-senders-uuid-allowlist-entry.test.ts similarity index 100% rename from extensions/signal/src/monitor.tool-result.pairs-uuid-only-senders-uuid-allowlist-entry.test.ts rename to native-plugins/signal/src/monitor.tool-result.pairs-uuid-only-senders-uuid-allowlist-entry.test.ts diff --git a/extensions/signal/src/monitor.tool-result.sends-tool-summaries-responseprefix.test.ts b/native-plugins/signal/src/monitor.tool-result.sends-tool-summaries-responseprefix.test.ts similarity index 100% rename from extensions/signal/src/monitor.tool-result.sends-tool-summaries-responseprefix.test.ts rename to native-plugins/signal/src/monitor.tool-result.sends-tool-summaries-responseprefix.test.ts diff --git a/extensions/signal/src/monitor.tool-result.test-harness.ts b/native-plugins/signal/src/monitor.tool-result.test-harness.ts similarity index 100% rename from extensions/signal/src/monitor.tool-result.test-harness.ts rename to native-plugins/signal/src/monitor.tool-result.test-harness.ts diff --git a/extensions/signal/src/monitor.ts b/native-plugins/signal/src/monitor.ts similarity index 100% rename from extensions/signal/src/monitor.ts rename to native-plugins/signal/src/monitor.ts diff --git a/extensions/signal/src/monitor/access-policy.test.ts b/native-plugins/signal/src/monitor/access-policy.test.ts similarity index 100% rename from extensions/signal/src/monitor/access-policy.test.ts rename to native-plugins/signal/src/monitor/access-policy.test.ts diff --git a/extensions/signal/src/monitor/access-policy.ts b/native-plugins/signal/src/monitor/access-policy.ts similarity index 100% rename from extensions/signal/src/monitor/access-policy.ts rename to native-plugins/signal/src/monitor/access-policy.ts diff --git a/extensions/signal/src/monitor/event-handler.inbound-context.test.ts b/native-plugins/signal/src/monitor/event-handler.inbound-context.test.ts similarity index 100% rename from extensions/signal/src/monitor/event-handler.inbound-context.test.ts rename to native-plugins/signal/src/monitor/event-handler.inbound-context.test.ts diff --git a/extensions/signal/src/monitor/event-handler.mention-gating.test.ts b/native-plugins/signal/src/monitor/event-handler.mention-gating.test.ts similarity index 100% rename from extensions/signal/src/monitor/event-handler.mention-gating.test.ts rename to native-plugins/signal/src/monitor/event-handler.mention-gating.test.ts diff --git a/extensions/signal/src/monitor/event-handler.test-harness.ts b/native-plugins/signal/src/monitor/event-handler.test-harness.ts similarity index 100% rename from extensions/signal/src/monitor/event-handler.test-harness.ts rename to native-plugins/signal/src/monitor/event-handler.test-harness.ts diff --git a/extensions/signal/src/monitor/event-handler.ts b/native-plugins/signal/src/monitor/event-handler.ts similarity index 100% rename from extensions/signal/src/monitor/event-handler.ts rename to native-plugins/signal/src/monitor/event-handler.ts diff --git a/extensions/signal/src/monitor/event-handler.types.ts b/native-plugins/signal/src/monitor/event-handler.types.ts similarity index 100% rename from extensions/signal/src/monitor/event-handler.types.ts rename to native-plugins/signal/src/monitor/event-handler.types.ts diff --git a/extensions/signal/src/monitor/mentions.ts b/native-plugins/signal/src/monitor/mentions.ts similarity index 100% rename from extensions/signal/src/monitor/mentions.ts rename to native-plugins/signal/src/monitor/mentions.ts diff --git a/extensions/signal/src/outbound-adapter.ts b/native-plugins/signal/src/outbound-adapter.ts similarity index 100% rename from extensions/signal/src/outbound-adapter.ts rename to native-plugins/signal/src/outbound-adapter.ts diff --git a/extensions/signal/src/plugin-shared.ts b/native-plugins/signal/src/plugin-shared.ts similarity index 100% rename from extensions/signal/src/plugin-shared.ts rename to native-plugins/signal/src/plugin-shared.ts diff --git a/extensions/signal/src/probe.test.ts b/native-plugins/signal/src/probe.test.ts similarity index 100% rename from extensions/signal/src/probe.test.ts rename to native-plugins/signal/src/probe.test.ts diff --git a/extensions/signal/src/probe.ts b/native-plugins/signal/src/probe.ts similarity index 100% rename from extensions/signal/src/probe.ts rename to native-plugins/signal/src/probe.ts diff --git a/extensions/signal/src/reaction-level.ts b/native-plugins/signal/src/reaction-level.ts similarity index 100% rename from extensions/signal/src/reaction-level.ts rename to native-plugins/signal/src/reaction-level.ts diff --git a/extensions/signal/src/rpc-context.ts b/native-plugins/signal/src/rpc-context.ts similarity index 100% rename from extensions/signal/src/rpc-context.ts rename to native-plugins/signal/src/rpc-context.ts diff --git a/extensions/signal/src/runtime-api.ts b/native-plugins/signal/src/runtime-api.ts similarity index 100% rename from extensions/signal/src/runtime-api.ts rename to native-plugins/signal/src/runtime-api.ts diff --git a/extensions/signal/src/runtime.ts b/native-plugins/signal/src/runtime.ts similarity index 100% rename from extensions/signal/src/runtime.ts rename to native-plugins/signal/src/runtime.ts diff --git a/extensions/signal/src/send-reactions.test.ts b/native-plugins/signal/src/send-reactions.test.ts similarity index 100% rename from extensions/signal/src/send-reactions.test.ts rename to native-plugins/signal/src/send-reactions.test.ts diff --git a/extensions/signal/src/send-reactions.ts b/native-plugins/signal/src/send-reactions.ts similarity index 100% rename from extensions/signal/src/send-reactions.ts rename to native-plugins/signal/src/send-reactions.ts diff --git a/extensions/signal/src/send.ts b/native-plugins/signal/src/send.ts similarity index 100% rename from extensions/signal/src/send.ts rename to native-plugins/signal/src/send.ts diff --git a/extensions/signal/src/setup-allow-from.test.ts b/native-plugins/signal/src/setup-allow-from.test.ts similarity index 100% rename from extensions/signal/src/setup-allow-from.test.ts rename to native-plugins/signal/src/setup-allow-from.test.ts diff --git a/extensions/signal/src/setup-core.ts b/native-plugins/signal/src/setup-core.ts similarity index 100% rename from extensions/signal/src/setup-core.ts rename to native-plugins/signal/src/setup-core.ts diff --git a/extensions/signal/src/setup-surface.ts b/native-plugins/signal/src/setup-surface.ts similarity index 100% rename from extensions/signal/src/setup-surface.ts rename to native-plugins/signal/src/setup-surface.ts diff --git a/extensions/signal/src/shared.ts b/native-plugins/signal/src/shared.ts similarity index 100% rename from extensions/signal/src/shared.ts rename to native-plugins/signal/src/shared.ts diff --git a/extensions/signal/src/sse-reconnect.ts b/native-plugins/signal/src/sse-reconnect.ts similarity index 100% rename from extensions/signal/src/sse-reconnect.ts rename to native-plugins/signal/src/sse-reconnect.ts diff --git a/extensions/slack/api.ts b/native-plugins/slack/api.ts similarity index 100% rename from extensions/slack/api.ts rename to native-plugins/slack/api.ts diff --git a/extensions/slack/index.ts b/native-plugins/slack/index.ts similarity index 100% rename from extensions/slack/index.ts rename to native-plugins/slack/index.ts diff --git a/extensions/slack/openclaw.plugin.json b/native-plugins/slack/openclaw.plugin.json similarity index 100% rename from extensions/slack/openclaw.plugin.json rename to native-plugins/slack/openclaw.plugin.json diff --git a/extensions/slack/package.json b/native-plugins/slack/package.json similarity index 97% rename from extensions/slack/package.json rename to native-plugins/slack/package.json index 6e98b54b7c7..0cea1edcee1 100644 --- a/extensions/slack/package.json +++ b/native-plugins/slack/package.json @@ -9,7 +9,7 @@ "@slack/web-api": "^7.15.0" }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ], "setupEntry": "./setup-entry.ts", diff --git a/extensions/slack/runtime-api.ts b/native-plugins/slack/runtime-api.ts similarity index 100% rename from extensions/slack/runtime-api.ts rename to native-plugins/slack/runtime-api.ts diff --git a/extensions/slack/setup-entry.ts b/native-plugins/slack/setup-entry.ts similarity index 100% rename from extensions/slack/setup-entry.ts rename to native-plugins/slack/setup-entry.ts diff --git a/extensions/slack/src/account-inspect.ts b/native-plugins/slack/src/account-inspect.ts similarity index 100% rename from extensions/slack/src/account-inspect.ts rename to native-plugins/slack/src/account-inspect.ts diff --git a/extensions/slack/src/account-surface-fields.ts b/native-plugins/slack/src/account-surface-fields.ts similarity index 100% rename from extensions/slack/src/account-surface-fields.ts rename to native-plugins/slack/src/account-surface-fields.ts diff --git a/extensions/slack/src/accounts.test.ts b/native-plugins/slack/src/accounts.test.ts similarity index 100% rename from extensions/slack/src/accounts.test.ts rename to native-plugins/slack/src/accounts.test.ts diff --git a/extensions/slack/src/accounts.ts b/native-plugins/slack/src/accounts.ts similarity index 100% rename from extensions/slack/src/accounts.ts rename to native-plugins/slack/src/accounts.ts diff --git a/extensions/slack/src/action-runtime.test.ts b/native-plugins/slack/src/action-runtime.test.ts similarity index 100% rename from extensions/slack/src/action-runtime.test.ts rename to native-plugins/slack/src/action-runtime.test.ts diff --git a/extensions/slack/src/action-runtime.ts b/native-plugins/slack/src/action-runtime.ts similarity index 100% rename from extensions/slack/src/action-runtime.ts rename to native-plugins/slack/src/action-runtime.ts diff --git a/extensions/slack/src/actions.blocks.test.ts b/native-plugins/slack/src/actions.blocks.test.ts similarity index 100% rename from extensions/slack/src/actions.blocks.test.ts rename to native-plugins/slack/src/actions.blocks.test.ts diff --git a/extensions/slack/src/actions.download-file.test.ts b/native-plugins/slack/src/actions.download-file.test.ts similarity index 100% rename from extensions/slack/src/actions.download-file.test.ts rename to native-plugins/slack/src/actions.download-file.test.ts diff --git a/extensions/slack/src/actions.read.test.ts b/native-plugins/slack/src/actions.read.test.ts similarity index 100% rename from extensions/slack/src/actions.read.test.ts rename to native-plugins/slack/src/actions.read.test.ts diff --git a/extensions/slack/src/actions.ts b/native-plugins/slack/src/actions.ts similarity index 100% rename from extensions/slack/src/actions.ts rename to native-plugins/slack/src/actions.ts diff --git a/extensions/slack/src/blocks-fallback.test.ts b/native-plugins/slack/src/blocks-fallback.test.ts similarity index 100% rename from extensions/slack/src/blocks-fallback.test.ts rename to native-plugins/slack/src/blocks-fallback.test.ts diff --git a/extensions/slack/src/blocks-fallback.ts b/native-plugins/slack/src/blocks-fallback.ts similarity index 100% rename from extensions/slack/src/blocks-fallback.ts rename to native-plugins/slack/src/blocks-fallback.ts diff --git a/extensions/slack/src/blocks-input.test.ts b/native-plugins/slack/src/blocks-input.test.ts similarity index 100% rename from extensions/slack/src/blocks-input.test.ts rename to native-plugins/slack/src/blocks-input.test.ts diff --git a/extensions/slack/src/blocks-input.ts b/native-plugins/slack/src/blocks-input.ts similarity index 100% rename from extensions/slack/src/blocks-input.ts rename to native-plugins/slack/src/blocks-input.ts diff --git a/extensions/slack/src/blocks-render.ts b/native-plugins/slack/src/blocks-render.ts similarity index 100% rename from extensions/slack/src/blocks-render.ts rename to native-plugins/slack/src/blocks-render.ts diff --git a/extensions/slack/src/blocks.test-helpers.ts b/native-plugins/slack/src/blocks.test-helpers.ts similarity index 100% rename from extensions/slack/src/blocks.test-helpers.ts rename to native-plugins/slack/src/blocks.test-helpers.ts diff --git a/extensions/slack/src/channel-actions.ts b/native-plugins/slack/src/channel-actions.ts similarity index 100% rename from extensions/slack/src/channel-actions.ts rename to native-plugins/slack/src/channel-actions.ts diff --git a/extensions/slack/src/channel-migration.test.ts b/native-plugins/slack/src/channel-migration.test.ts similarity index 100% rename from extensions/slack/src/channel-migration.test.ts rename to native-plugins/slack/src/channel-migration.test.ts diff --git a/extensions/slack/src/channel-migration.ts b/native-plugins/slack/src/channel-migration.ts similarity index 100% rename from extensions/slack/src/channel-migration.ts rename to native-plugins/slack/src/channel-migration.ts diff --git a/extensions/slack/src/channel.runtime.ts b/native-plugins/slack/src/channel.runtime.ts similarity index 100% rename from extensions/slack/src/channel.runtime.ts rename to native-plugins/slack/src/channel.runtime.ts diff --git a/extensions/slack/src/channel.setup.ts b/native-plugins/slack/src/channel.setup.ts similarity index 100% rename from extensions/slack/src/channel.setup.ts rename to native-plugins/slack/src/channel.setup.ts diff --git a/extensions/slack/src/channel.test.ts b/native-plugins/slack/src/channel.test.ts similarity index 99% rename from extensions/slack/src/channel.test.ts rename to native-plugins/slack/src/channel.test.ts index 691b6126557..2b13e766f6c 100644 --- a/extensions/slack/src/channel.test.ts +++ b/native-plugins/slack/src/channel.test.ts @@ -1,6 +1,6 @@ import type { OpenClawConfig } from "openclaw/plugin-sdk/slack"; import { describe, expect, it, vi } from "vitest"; -import { createRuntimeEnv } from "../../../test/helpers/extensions/runtime-env.js"; +import { createRuntimeEnv } from "../../../test/helpers/native-plugins/runtime-env.js"; import { slackOutbound } from "./outbound-adapter.js"; const handleSlackActionMock = vi.fn(); diff --git a/extensions/slack/src/channel.ts b/native-plugins/slack/src/channel.ts similarity index 99% rename from extensions/slack/src/channel.ts rename to native-plugins/slack/src/channel.ts index 7a27e73aa8d..2088e416c34 100644 --- a/extensions/slack/src/channel.ts +++ b/native-plugins/slack/src/channel.ts @@ -16,7 +16,7 @@ import { resolveTargetsWithOptionalToken, } from "openclaw/plugin-sdk/channel-runtime"; import { buildOutboundBaseSessionKey, normalizeOutboundThreadId } from "openclaw/plugin-sdk/core"; -import { buildPassiveProbedChannelStatusSummary } from "openclaw/plugin-sdk/extension-shared"; +import { buildPassiveProbedChannelStatusSummary } from "openclaw/plugin-sdk/native-plugin-shared"; import { resolveThreadSessionKeys, type RoutePeer } from "openclaw/plugin-sdk/routing"; import { listEnabledSlackAccounts, diff --git a/extensions/slack/src/client.test.ts b/native-plugins/slack/src/client.test.ts similarity index 100% rename from extensions/slack/src/client.test.ts rename to native-plugins/slack/src/client.test.ts diff --git a/extensions/slack/src/client.ts b/native-plugins/slack/src/client.ts similarity index 100% rename from extensions/slack/src/client.ts rename to native-plugins/slack/src/client.ts diff --git a/extensions/slack/src/config-schema.ts b/native-plugins/slack/src/config-schema.ts similarity index 100% rename from extensions/slack/src/config-schema.ts rename to native-plugins/slack/src/config-schema.ts diff --git a/extensions/slack/src/directory-config.ts b/native-plugins/slack/src/directory-config.ts similarity index 100% rename from extensions/slack/src/directory-config.ts rename to native-plugins/slack/src/directory-config.ts diff --git a/extensions/slack/src/directory-live.ts b/native-plugins/slack/src/directory-live.ts similarity index 100% rename from extensions/slack/src/directory-live.ts rename to native-plugins/slack/src/directory-live.ts diff --git a/extensions/slack/src/draft-stream.test.ts b/native-plugins/slack/src/draft-stream.test.ts similarity index 100% rename from extensions/slack/src/draft-stream.test.ts rename to native-plugins/slack/src/draft-stream.test.ts diff --git a/extensions/slack/src/draft-stream.ts b/native-plugins/slack/src/draft-stream.ts similarity index 100% rename from extensions/slack/src/draft-stream.ts rename to native-plugins/slack/src/draft-stream.ts diff --git a/extensions/slack/src/format.test.ts b/native-plugins/slack/src/format.test.ts similarity index 100% rename from extensions/slack/src/format.test.ts rename to native-plugins/slack/src/format.test.ts diff --git a/extensions/slack/src/format.ts b/native-plugins/slack/src/format.ts similarity index 100% rename from extensions/slack/src/format.ts rename to native-plugins/slack/src/format.ts diff --git a/extensions/slack/src/group-policy.test.ts b/native-plugins/slack/src/group-policy.test.ts similarity index 100% rename from extensions/slack/src/group-policy.test.ts rename to native-plugins/slack/src/group-policy.test.ts diff --git a/extensions/slack/src/group-policy.ts b/native-plugins/slack/src/group-policy.ts similarity index 100% rename from extensions/slack/src/group-policy.ts rename to native-plugins/slack/src/group-policy.ts diff --git a/extensions/slack/src/http/index.ts b/native-plugins/slack/src/http/index.ts similarity index 100% rename from extensions/slack/src/http/index.ts rename to native-plugins/slack/src/http/index.ts diff --git a/extensions/slack/src/http/registry.test.ts b/native-plugins/slack/src/http/registry.test.ts similarity index 100% rename from extensions/slack/src/http/registry.test.ts rename to native-plugins/slack/src/http/registry.test.ts diff --git a/extensions/slack/src/http/registry.ts b/native-plugins/slack/src/http/registry.ts similarity index 100% rename from extensions/slack/src/http/registry.ts rename to native-plugins/slack/src/http/registry.ts diff --git a/extensions/slack/src/index.ts b/native-plugins/slack/src/index.ts similarity index 100% rename from extensions/slack/src/index.ts rename to native-plugins/slack/src/index.ts diff --git a/extensions/slack/src/interactive-replies.test.ts b/native-plugins/slack/src/interactive-replies.test.ts similarity index 100% rename from extensions/slack/src/interactive-replies.test.ts rename to native-plugins/slack/src/interactive-replies.test.ts diff --git a/extensions/slack/src/interactive-replies.ts b/native-plugins/slack/src/interactive-replies.ts similarity index 100% rename from extensions/slack/src/interactive-replies.ts rename to native-plugins/slack/src/interactive-replies.ts diff --git a/extensions/slack/src/message-action-dispatch.test.ts b/native-plugins/slack/src/message-action-dispatch.test.ts similarity index 100% rename from extensions/slack/src/message-action-dispatch.test.ts rename to native-plugins/slack/src/message-action-dispatch.test.ts diff --git a/extensions/slack/src/message-action-dispatch.ts b/native-plugins/slack/src/message-action-dispatch.ts similarity index 100% rename from extensions/slack/src/message-action-dispatch.ts rename to native-plugins/slack/src/message-action-dispatch.ts diff --git a/extensions/slack/src/message-actions.test.ts b/native-plugins/slack/src/message-actions.test.ts similarity index 100% rename from extensions/slack/src/message-actions.test.ts rename to native-plugins/slack/src/message-actions.test.ts diff --git a/extensions/slack/src/message-actions.ts b/native-plugins/slack/src/message-actions.ts similarity index 100% rename from extensions/slack/src/message-actions.ts rename to native-plugins/slack/src/message-actions.ts diff --git a/extensions/slack/src/message-tool-schema.ts b/native-plugins/slack/src/message-tool-schema.ts similarity index 100% rename from extensions/slack/src/message-tool-schema.ts rename to native-plugins/slack/src/message-tool-schema.ts diff --git a/extensions/slack/src/modal-metadata.test.ts b/native-plugins/slack/src/modal-metadata.test.ts similarity index 100% rename from extensions/slack/src/modal-metadata.test.ts rename to native-plugins/slack/src/modal-metadata.test.ts diff --git a/extensions/slack/src/modal-metadata.ts b/native-plugins/slack/src/modal-metadata.ts similarity index 100% rename from extensions/slack/src/modal-metadata.ts rename to native-plugins/slack/src/modal-metadata.ts diff --git a/extensions/slack/src/monitor.test-helpers.ts b/native-plugins/slack/src/monitor.test-helpers.ts similarity index 100% rename from extensions/slack/src/monitor.test-helpers.ts rename to native-plugins/slack/src/monitor.test-helpers.ts diff --git a/extensions/slack/src/monitor.test.ts b/native-plugins/slack/src/monitor.test.ts similarity index 100% rename from extensions/slack/src/monitor.test.ts rename to native-plugins/slack/src/monitor.test.ts diff --git a/extensions/slack/src/monitor.threading.missing-thread-ts.test.ts b/native-plugins/slack/src/monitor.threading.missing-thread-ts.test.ts similarity index 100% rename from extensions/slack/src/monitor.threading.missing-thread-ts.test.ts rename to native-plugins/slack/src/monitor.threading.missing-thread-ts.test.ts diff --git a/extensions/slack/src/monitor.tool-result.test.ts b/native-plugins/slack/src/monitor.tool-result.test.ts similarity index 100% rename from extensions/slack/src/monitor.tool-result.test.ts rename to native-plugins/slack/src/monitor.tool-result.test.ts diff --git a/extensions/slack/src/monitor.ts b/native-plugins/slack/src/monitor.ts similarity index 100% rename from extensions/slack/src/monitor.ts rename to native-plugins/slack/src/monitor.ts diff --git a/extensions/slack/src/monitor/allow-list.test.ts b/native-plugins/slack/src/monitor/allow-list.test.ts similarity index 100% rename from extensions/slack/src/monitor/allow-list.test.ts rename to native-plugins/slack/src/monitor/allow-list.test.ts diff --git a/extensions/slack/src/monitor/allow-list.ts b/native-plugins/slack/src/monitor/allow-list.ts similarity index 100% rename from extensions/slack/src/monitor/allow-list.ts rename to native-plugins/slack/src/monitor/allow-list.ts diff --git a/extensions/slack/src/monitor/auth.test.ts b/native-plugins/slack/src/monitor/auth.test.ts similarity index 100% rename from extensions/slack/src/monitor/auth.test.ts rename to native-plugins/slack/src/monitor/auth.test.ts diff --git a/extensions/slack/src/monitor/auth.ts b/native-plugins/slack/src/monitor/auth.ts similarity index 100% rename from extensions/slack/src/monitor/auth.ts rename to native-plugins/slack/src/monitor/auth.ts diff --git a/extensions/slack/src/monitor/channel-config.ts b/native-plugins/slack/src/monitor/channel-config.ts similarity index 100% rename from extensions/slack/src/monitor/channel-config.ts rename to native-plugins/slack/src/monitor/channel-config.ts diff --git a/extensions/slack/src/monitor/channel-type.ts b/native-plugins/slack/src/monitor/channel-type.ts similarity index 100% rename from extensions/slack/src/monitor/channel-type.ts rename to native-plugins/slack/src/monitor/channel-type.ts diff --git a/extensions/slack/src/monitor/commands.ts b/native-plugins/slack/src/monitor/commands.ts similarity index 100% rename from extensions/slack/src/monitor/commands.ts rename to native-plugins/slack/src/monitor/commands.ts diff --git a/extensions/slack/src/monitor/context.test.ts b/native-plugins/slack/src/monitor/context.test.ts similarity index 100% rename from extensions/slack/src/monitor/context.test.ts rename to native-plugins/slack/src/monitor/context.test.ts diff --git a/extensions/slack/src/monitor/context.ts b/native-plugins/slack/src/monitor/context.ts similarity index 100% rename from extensions/slack/src/monitor/context.ts rename to native-plugins/slack/src/monitor/context.ts diff --git a/extensions/slack/src/monitor/dm-auth.ts b/native-plugins/slack/src/monitor/dm-auth.ts similarity index 100% rename from extensions/slack/src/monitor/dm-auth.ts rename to native-plugins/slack/src/monitor/dm-auth.ts diff --git a/extensions/slack/src/monitor/events.ts b/native-plugins/slack/src/monitor/events.ts similarity index 100% rename from extensions/slack/src/monitor/events.ts rename to native-plugins/slack/src/monitor/events.ts diff --git a/extensions/slack/src/monitor/events/channels.test.ts b/native-plugins/slack/src/monitor/events/channels.test.ts similarity index 100% rename from extensions/slack/src/monitor/events/channels.test.ts rename to native-plugins/slack/src/monitor/events/channels.test.ts diff --git a/extensions/slack/src/monitor/events/channels.ts b/native-plugins/slack/src/monitor/events/channels.ts similarity index 100% rename from extensions/slack/src/monitor/events/channels.ts rename to native-plugins/slack/src/monitor/events/channels.ts diff --git a/extensions/slack/src/monitor/events/interactions.block-actions.ts b/native-plugins/slack/src/monitor/events/interactions.block-actions.ts similarity index 100% rename from extensions/slack/src/monitor/events/interactions.block-actions.ts rename to native-plugins/slack/src/monitor/events/interactions.block-actions.ts diff --git a/extensions/slack/src/monitor/events/interactions.modal.ts b/native-plugins/slack/src/monitor/events/interactions.modal.ts similarity index 100% rename from extensions/slack/src/monitor/events/interactions.modal.ts rename to native-plugins/slack/src/monitor/events/interactions.modal.ts diff --git a/extensions/slack/src/monitor/events/interactions.test.ts b/native-plugins/slack/src/monitor/events/interactions.test.ts similarity index 100% rename from extensions/slack/src/monitor/events/interactions.test.ts rename to native-plugins/slack/src/monitor/events/interactions.test.ts diff --git a/extensions/slack/src/monitor/events/interactions.ts b/native-plugins/slack/src/monitor/events/interactions.ts similarity index 100% rename from extensions/slack/src/monitor/events/interactions.ts rename to native-plugins/slack/src/monitor/events/interactions.ts diff --git a/extensions/slack/src/monitor/events/members.test.ts b/native-plugins/slack/src/monitor/events/members.test.ts similarity index 100% rename from extensions/slack/src/monitor/events/members.test.ts rename to native-plugins/slack/src/monitor/events/members.test.ts diff --git a/extensions/slack/src/monitor/events/members.ts b/native-plugins/slack/src/monitor/events/members.ts similarity index 100% rename from extensions/slack/src/monitor/events/members.ts rename to native-plugins/slack/src/monitor/events/members.ts diff --git a/extensions/slack/src/monitor/events/message-subtype-handlers.test.ts b/native-plugins/slack/src/monitor/events/message-subtype-handlers.test.ts similarity index 100% rename from extensions/slack/src/monitor/events/message-subtype-handlers.test.ts rename to native-plugins/slack/src/monitor/events/message-subtype-handlers.test.ts diff --git a/extensions/slack/src/monitor/events/message-subtype-handlers.ts b/native-plugins/slack/src/monitor/events/message-subtype-handlers.ts similarity index 100% rename from extensions/slack/src/monitor/events/message-subtype-handlers.ts rename to native-plugins/slack/src/monitor/events/message-subtype-handlers.ts diff --git a/extensions/slack/src/monitor/events/messages.test.ts b/native-plugins/slack/src/monitor/events/messages.test.ts similarity index 100% rename from extensions/slack/src/monitor/events/messages.test.ts rename to native-plugins/slack/src/monitor/events/messages.test.ts diff --git a/extensions/slack/src/monitor/events/messages.ts b/native-plugins/slack/src/monitor/events/messages.ts similarity index 100% rename from extensions/slack/src/monitor/events/messages.ts rename to native-plugins/slack/src/monitor/events/messages.ts diff --git a/extensions/slack/src/monitor/events/pins.test.ts b/native-plugins/slack/src/monitor/events/pins.test.ts similarity index 100% rename from extensions/slack/src/monitor/events/pins.test.ts rename to native-plugins/slack/src/monitor/events/pins.test.ts diff --git a/extensions/slack/src/monitor/events/pins.ts b/native-plugins/slack/src/monitor/events/pins.ts similarity index 100% rename from extensions/slack/src/monitor/events/pins.ts rename to native-plugins/slack/src/monitor/events/pins.ts diff --git a/extensions/slack/src/monitor/events/reactions.test.ts b/native-plugins/slack/src/monitor/events/reactions.test.ts similarity index 100% rename from extensions/slack/src/monitor/events/reactions.test.ts rename to native-plugins/slack/src/monitor/events/reactions.test.ts diff --git a/extensions/slack/src/monitor/events/reactions.ts b/native-plugins/slack/src/monitor/events/reactions.ts similarity index 100% rename from extensions/slack/src/monitor/events/reactions.ts rename to native-plugins/slack/src/monitor/events/reactions.ts diff --git a/extensions/slack/src/monitor/events/system-event-context.ts b/native-plugins/slack/src/monitor/events/system-event-context.ts similarity index 100% rename from extensions/slack/src/monitor/events/system-event-context.ts rename to native-plugins/slack/src/monitor/events/system-event-context.ts diff --git a/extensions/slack/src/monitor/events/system-event-test-harness.ts b/native-plugins/slack/src/monitor/events/system-event-test-harness.ts similarity index 100% rename from extensions/slack/src/monitor/events/system-event-test-harness.ts rename to native-plugins/slack/src/monitor/events/system-event-test-harness.ts diff --git a/extensions/slack/src/monitor/external-arg-menu-store.ts b/native-plugins/slack/src/monitor/external-arg-menu-store.ts similarity index 100% rename from extensions/slack/src/monitor/external-arg-menu-store.ts rename to native-plugins/slack/src/monitor/external-arg-menu-store.ts diff --git a/extensions/slack/src/monitor/media.test.ts b/native-plugins/slack/src/monitor/media.test.ts similarity index 99% rename from extensions/slack/src/monitor/media.test.ts rename to native-plugins/slack/src/monitor/media.test.ts index 9ac0bc0eeb1..eb40fb36ca6 100644 --- a/extensions/slack/src/monitor/media.test.ts +++ b/native-plugins/slack/src/monitor/media.test.ts @@ -7,7 +7,7 @@ import { mockPinnedHostnameResolution } from "../../../../src/test-helpers/ssrf. import { type FetchMock, withFetchPreconnect, -} from "../../../../test/helpers/extensions/fetch-mock.js"; +} from "../../../../test/helpers/native-plugins/fetch-mock.js"; import { fetchWithSlackAuth, resolveSlackAttachmentContent, diff --git a/extensions/slack/src/monitor/media.ts b/native-plugins/slack/src/monitor/media.ts similarity index 100% rename from extensions/slack/src/monitor/media.ts rename to native-plugins/slack/src/monitor/media.ts diff --git a/extensions/slack/src/monitor/message-handler.app-mention-race.test.ts b/native-plugins/slack/src/monitor/message-handler.app-mention-race.test.ts similarity index 100% rename from extensions/slack/src/monitor/message-handler.app-mention-race.test.ts rename to native-plugins/slack/src/monitor/message-handler.app-mention-race.test.ts diff --git a/extensions/slack/src/monitor/message-handler.debounce-key.test.ts b/native-plugins/slack/src/monitor/message-handler.debounce-key.test.ts similarity index 100% rename from extensions/slack/src/monitor/message-handler.debounce-key.test.ts rename to native-plugins/slack/src/monitor/message-handler.debounce-key.test.ts diff --git a/extensions/slack/src/monitor/message-handler.test.ts b/native-plugins/slack/src/monitor/message-handler.test.ts similarity index 100% rename from extensions/slack/src/monitor/message-handler.test.ts rename to native-plugins/slack/src/monitor/message-handler.test.ts diff --git a/extensions/slack/src/monitor/message-handler.ts b/native-plugins/slack/src/monitor/message-handler.ts similarity index 100% rename from extensions/slack/src/monitor/message-handler.ts rename to native-plugins/slack/src/monitor/message-handler.ts diff --git a/extensions/slack/src/monitor/message-handler/dispatch.streaming.test.ts b/native-plugins/slack/src/monitor/message-handler/dispatch.streaming.test.ts similarity index 100% rename from extensions/slack/src/monitor/message-handler/dispatch.streaming.test.ts rename to native-plugins/slack/src/monitor/message-handler/dispatch.streaming.test.ts diff --git a/extensions/slack/src/monitor/message-handler/dispatch.ts b/native-plugins/slack/src/monitor/message-handler/dispatch.ts similarity index 100% rename from extensions/slack/src/monitor/message-handler/dispatch.ts rename to native-plugins/slack/src/monitor/message-handler/dispatch.ts diff --git a/extensions/slack/src/monitor/message-handler/prepare-content.ts b/native-plugins/slack/src/monitor/message-handler/prepare-content.ts similarity index 100% rename from extensions/slack/src/monitor/message-handler/prepare-content.ts rename to native-plugins/slack/src/monitor/message-handler/prepare-content.ts diff --git a/extensions/slack/src/monitor/message-handler/prepare-thread-context.ts b/native-plugins/slack/src/monitor/message-handler/prepare-thread-context.ts similarity index 100% rename from extensions/slack/src/monitor/message-handler/prepare-thread-context.ts rename to native-plugins/slack/src/monitor/message-handler/prepare-thread-context.ts diff --git a/extensions/slack/src/monitor/message-handler/prepare.test-helpers.ts b/native-plugins/slack/src/monitor/message-handler/prepare.test-helpers.ts similarity index 100% rename from extensions/slack/src/monitor/message-handler/prepare.test-helpers.ts rename to native-plugins/slack/src/monitor/message-handler/prepare.test-helpers.ts diff --git a/extensions/slack/src/monitor/message-handler/prepare.test.ts b/native-plugins/slack/src/monitor/message-handler/prepare.test.ts similarity index 100% rename from extensions/slack/src/monitor/message-handler/prepare.test.ts rename to native-plugins/slack/src/monitor/message-handler/prepare.test.ts diff --git a/extensions/slack/src/monitor/message-handler/prepare.thread-session-key.test.ts b/native-plugins/slack/src/monitor/message-handler/prepare.thread-session-key.test.ts similarity index 100% rename from extensions/slack/src/monitor/message-handler/prepare.thread-session-key.test.ts rename to native-plugins/slack/src/monitor/message-handler/prepare.thread-session-key.test.ts diff --git a/extensions/slack/src/monitor/message-handler/prepare.ts b/native-plugins/slack/src/monitor/message-handler/prepare.ts similarity index 100% rename from extensions/slack/src/monitor/message-handler/prepare.ts rename to native-plugins/slack/src/monitor/message-handler/prepare.ts diff --git a/extensions/slack/src/monitor/message-handler/types.ts b/native-plugins/slack/src/monitor/message-handler/types.ts similarity index 100% rename from extensions/slack/src/monitor/message-handler/types.ts rename to native-plugins/slack/src/monitor/message-handler/types.ts diff --git a/extensions/slack/src/monitor/monitor.test.ts b/native-plugins/slack/src/monitor/monitor.test.ts similarity index 100% rename from extensions/slack/src/monitor/monitor.test.ts rename to native-plugins/slack/src/monitor/monitor.test.ts diff --git a/extensions/slack/src/monitor/mrkdwn.ts b/native-plugins/slack/src/monitor/mrkdwn.ts similarity index 100% rename from extensions/slack/src/monitor/mrkdwn.ts rename to native-plugins/slack/src/monitor/mrkdwn.ts diff --git a/extensions/slack/src/monitor/policy.ts b/native-plugins/slack/src/monitor/policy.ts similarity index 100% rename from extensions/slack/src/monitor/policy.ts rename to native-plugins/slack/src/monitor/policy.ts diff --git a/extensions/slack/src/monitor/provider.auth-errors.test.ts b/native-plugins/slack/src/monitor/provider.auth-errors.test.ts similarity index 100% rename from extensions/slack/src/monitor/provider.auth-errors.test.ts rename to native-plugins/slack/src/monitor/provider.auth-errors.test.ts diff --git a/extensions/slack/src/monitor/provider.interop.test.ts b/native-plugins/slack/src/monitor/provider.interop.test.ts similarity index 100% rename from extensions/slack/src/monitor/provider.interop.test.ts rename to native-plugins/slack/src/monitor/provider.interop.test.ts diff --git a/extensions/slack/src/monitor/provider.reconnect.test.ts b/native-plugins/slack/src/monitor/provider.reconnect.test.ts similarity index 100% rename from extensions/slack/src/monitor/provider.reconnect.test.ts rename to native-plugins/slack/src/monitor/provider.reconnect.test.ts diff --git a/extensions/slack/src/monitor/provider.ts b/native-plugins/slack/src/monitor/provider.ts similarity index 100% rename from extensions/slack/src/monitor/provider.ts rename to native-plugins/slack/src/monitor/provider.ts diff --git a/extensions/slack/src/monitor/reconnect-policy.ts b/native-plugins/slack/src/monitor/reconnect-policy.ts similarity index 100% rename from extensions/slack/src/monitor/reconnect-policy.ts rename to native-plugins/slack/src/monitor/reconnect-policy.ts diff --git a/extensions/slack/src/monitor/replies.test.ts b/native-plugins/slack/src/monitor/replies.test.ts similarity index 100% rename from extensions/slack/src/monitor/replies.test.ts rename to native-plugins/slack/src/monitor/replies.test.ts diff --git a/extensions/slack/src/monitor/replies.ts b/native-plugins/slack/src/monitor/replies.ts similarity index 100% rename from extensions/slack/src/monitor/replies.ts rename to native-plugins/slack/src/monitor/replies.ts diff --git a/extensions/slack/src/monitor/room-context.ts b/native-plugins/slack/src/monitor/room-context.ts similarity index 100% rename from extensions/slack/src/monitor/room-context.ts rename to native-plugins/slack/src/monitor/room-context.ts diff --git a/extensions/slack/src/monitor/slash-commands.runtime.ts b/native-plugins/slack/src/monitor/slash-commands.runtime.ts similarity index 100% rename from extensions/slack/src/monitor/slash-commands.runtime.ts rename to native-plugins/slack/src/monitor/slash-commands.runtime.ts diff --git a/extensions/slack/src/monitor/slash-dispatch.runtime.ts b/native-plugins/slack/src/monitor/slash-dispatch.runtime.ts similarity index 100% rename from extensions/slack/src/monitor/slash-dispatch.runtime.ts rename to native-plugins/slack/src/monitor/slash-dispatch.runtime.ts diff --git a/extensions/slack/src/monitor/slash-skill-commands.runtime.ts b/native-plugins/slack/src/monitor/slash-skill-commands.runtime.ts similarity index 100% rename from extensions/slack/src/monitor/slash-skill-commands.runtime.ts rename to native-plugins/slack/src/monitor/slash-skill-commands.runtime.ts diff --git a/extensions/slack/src/monitor/slash.test-harness.ts b/native-plugins/slack/src/monitor/slash.test-harness.ts similarity index 100% rename from extensions/slack/src/monitor/slash.test-harness.ts rename to native-plugins/slack/src/monitor/slash.test-harness.ts diff --git a/extensions/slack/src/monitor/slash.test.ts b/native-plugins/slack/src/monitor/slash.test.ts similarity index 100% rename from extensions/slack/src/monitor/slash.test.ts rename to native-plugins/slack/src/monitor/slash.test.ts diff --git a/extensions/slack/src/monitor/slash.ts b/native-plugins/slack/src/monitor/slash.ts similarity index 100% rename from extensions/slack/src/monitor/slash.ts rename to native-plugins/slack/src/monitor/slash.ts diff --git a/extensions/slack/src/monitor/thread-resolution.ts b/native-plugins/slack/src/monitor/thread-resolution.ts similarity index 100% rename from extensions/slack/src/monitor/thread-resolution.ts rename to native-plugins/slack/src/monitor/thread-resolution.ts diff --git a/extensions/slack/src/monitor/types.ts b/native-plugins/slack/src/monitor/types.ts similarity index 100% rename from extensions/slack/src/monitor/types.ts rename to native-plugins/slack/src/monitor/types.ts diff --git a/extensions/slack/src/outbound-adapter.ts b/native-plugins/slack/src/outbound-adapter.ts similarity index 100% rename from extensions/slack/src/outbound-adapter.ts rename to native-plugins/slack/src/outbound-adapter.ts diff --git a/extensions/slack/src/plugin-shared.ts b/native-plugins/slack/src/plugin-shared.ts similarity index 100% rename from extensions/slack/src/plugin-shared.ts rename to native-plugins/slack/src/plugin-shared.ts diff --git a/extensions/slack/src/probe.test.ts b/native-plugins/slack/src/probe.test.ts similarity index 100% rename from extensions/slack/src/probe.test.ts rename to native-plugins/slack/src/probe.test.ts diff --git a/extensions/slack/src/probe.ts b/native-plugins/slack/src/probe.ts similarity index 100% rename from extensions/slack/src/probe.ts rename to native-plugins/slack/src/probe.ts diff --git a/extensions/slack/src/resolve-allowlist-common.test.ts b/native-plugins/slack/src/resolve-allowlist-common.test.ts similarity index 100% rename from extensions/slack/src/resolve-allowlist-common.test.ts rename to native-plugins/slack/src/resolve-allowlist-common.test.ts diff --git a/extensions/slack/src/resolve-allowlist-common.ts b/native-plugins/slack/src/resolve-allowlist-common.ts similarity index 100% rename from extensions/slack/src/resolve-allowlist-common.ts rename to native-plugins/slack/src/resolve-allowlist-common.ts diff --git a/extensions/slack/src/resolve-channels.test.ts b/native-plugins/slack/src/resolve-channels.test.ts similarity index 100% rename from extensions/slack/src/resolve-channels.test.ts rename to native-plugins/slack/src/resolve-channels.test.ts diff --git a/extensions/slack/src/resolve-channels.ts b/native-plugins/slack/src/resolve-channels.ts similarity index 100% rename from extensions/slack/src/resolve-channels.ts rename to native-plugins/slack/src/resolve-channels.ts diff --git a/extensions/slack/src/resolve-users.test.ts b/native-plugins/slack/src/resolve-users.test.ts similarity index 100% rename from extensions/slack/src/resolve-users.test.ts rename to native-plugins/slack/src/resolve-users.test.ts diff --git a/extensions/slack/src/resolve-users.ts b/native-plugins/slack/src/resolve-users.ts similarity index 100% rename from extensions/slack/src/resolve-users.ts rename to native-plugins/slack/src/resolve-users.ts diff --git a/extensions/slack/src/runtime-api.ts b/native-plugins/slack/src/runtime-api.ts similarity index 100% rename from extensions/slack/src/runtime-api.ts rename to native-plugins/slack/src/runtime-api.ts diff --git a/extensions/slack/src/runtime.ts b/native-plugins/slack/src/runtime.ts similarity index 100% rename from extensions/slack/src/runtime.ts rename to native-plugins/slack/src/runtime.ts diff --git a/extensions/slack/src/scopes.ts b/native-plugins/slack/src/scopes.ts similarity index 100% rename from extensions/slack/src/scopes.ts rename to native-plugins/slack/src/scopes.ts diff --git a/extensions/slack/src/send.blocks.test.ts b/native-plugins/slack/src/send.blocks.test.ts similarity index 100% rename from extensions/slack/src/send.blocks.test.ts rename to native-plugins/slack/src/send.blocks.test.ts diff --git a/extensions/slack/src/send.ts b/native-plugins/slack/src/send.ts similarity index 100% rename from extensions/slack/src/send.ts rename to native-plugins/slack/src/send.ts diff --git a/extensions/slack/src/send.upload.test.ts b/native-plugins/slack/src/send.upload.test.ts similarity index 100% rename from extensions/slack/src/send.upload.test.ts rename to native-plugins/slack/src/send.upload.test.ts diff --git a/extensions/slack/src/sent-thread-cache.test.ts b/native-plugins/slack/src/sent-thread-cache.test.ts similarity index 100% rename from extensions/slack/src/sent-thread-cache.test.ts rename to native-plugins/slack/src/sent-thread-cache.test.ts diff --git a/extensions/slack/src/sent-thread-cache.ts b/native-plugins/slack/src/sent-thread-cache.ts similarity index 100% rename from extensions/slack/src/sent-thread-cache.ts rename to native-plugins/slack/src/sent-thread-cache.ts diff --git a/extensions/slack/src/setup-core.ts b/native-plugins/slack/src/setup-core.ts similarity index 100% rename from extensions/slack/src/setup-core.ts rename to native-plugins/slack/src/setup-core.ts diff --git a/extensions/slack/src/setup-surface.ts b/native-plugins/slack/src/setup-surface.ts similarity index 100% rename from extensions/slack/src/setup-surface.ts rename to native-plugins/slack/src/setup-surface.ts diff --git a/extensions/slack/src/shared-interactive.test.ts b/native-plugins/slack/src/shared-interactive.test.ts similarity index 100% rename from extensions/slack/src/shared-interactive.test.ts rename to native-plugins/slack/src/shared-interactive.test.ts diff --git a/extensions/slack/src/shared.ts b/native-plugins/slack/src/shared.ts similarity index 100% rename from extensions/slack/src/shared.ts rename to native-plugins/slack/src/shared.ts diff --git a/extensions/slack/src/stream-mode.test.ts b/native-plugins/slack/src/stream-mode.test.ts similarity index 100% rename from extensions/slack/src/stream-mode.test.ts rename to native-plugins/slack/src/stream-mode.test.ts diff --git a/extensions/slack/src/stream-mode.ts b/native-plugins/slack/src/stream-mode.ts similarity index 100% rename from extensions/slack/src/stream-mode.ts rename to native-plugins/slack/src/stream-mode.ts diff --git a/extensions/slack/src/streaming.ts b/native-plugins/slack/src/streaming.ts similarity index 100% rename from extensions/slack/src/streaming.ts rename to native-plugins/slack/src/streaming.ts diff --git a/extensions/slack/src/targets.test.ts b/native-plugins/slack/src/targets.test.ts similarity index 100% rename from extensions/slack/src/targets.test.ts rename to native-plugins/slack/src/targets.test.ts diff --git a/extensions/slack/src/targets.ts b/native-plugins/slack/src/targets.ts similarity index 100% rename from extensions/slack/src/targets.ts rename to native-plugins/slack/src/targets.ts diff --git a/extensions/slack/src/threading-tool-context.test.ts b/native-plugins/slack/src/threading-tool-context.test.ts similarity index 100% rename from extensions/slack/src/threading-tool-context.test.ts rename to native-plugins/slack/src/threading-tool-context.test.ts diff --git a/extensions/slack/src/threading-tool-context.ts b/native-plugins/slack/src/threading-tool-context.ts similarity index 100% rename from extensions/slack/src/threading-tool-context.ts rename to native-plugins/slack/src/threading-tool-context.ts diff --git a/extensions/slack/src/threading.test.ts b/native-plugins/slack/src/threading.test.ts similarity index 100% rename from extensions/slack/src/threading.test.ts rename to native-plugins/slack/src/threading.test.ts diff --git a/extensions/slack/src/threading.ts b/native-plugins/slack/src/threading.ts similarity index 100% rename from extensions/slack/src/threading.ts rename to native-plugins/slack/src/threading.ts diff --git a/extensions/slack/src/token.ts b/native-plugins/slack/src/token.ts similarity index 100% rename from extensions/slack/src/token.ts rename to native-plugins/slack/src/token.ts diff --git a/extensions/slack/src/truncate.ts b/native-plugins/slack/src/truncate.ts similarity index 100% rename from extensions/slack/src/truncate.ts rename to native-plugins/slack/src/truncate.ts diff --git a/extensions/slack/src/types.ts b/native-plugins/slack/src/types.ts similarity index 100% rename from extensions/slack/src/types.ts rename to native-plugins/slack/src/types.ts diff --git a/extensions/synology-chat/api.ts b/native-plugins/synology-chat/api.ts similarity index 100% rename from extensions/synology-chat/api.ts rename to native-plugins/synology-chat/api.ts diff --git a/extensions/synology-chat/index.ts b/native-plugins/synology-chat/index.ts similarity index 100% rename from extensions/synology-chat/index.ts rename to native-plugins/synology-chat/index.ts diff --git a/extensions/synology-chat/openclaw.plugin.json b/native-plugins/synology-chat/openclaw.plugin.json similarity index 100% rename from extensions/synology-chat/openclaw.plugin.json rename to native-plugins/synology-chat/openclaw.plugin.json diff --git a/extensions/synology-chat/package.json b/native-plugins/synology-chat/package.json similarity index 91% rename from extensions/synology-chat/package.json rename to native-plugins/synology-chat/package.json index d8ff22d6361..3407fc64915 100644 --- a/extensions/synology-chat/package.json +++ b/native-plugins/synology-chat/package.json @@ -7,7 +7,7 @@ "zod": "^4.3.6" }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ], "setupEntry": "./setup-entry.ts", @@ -22,7 +22,7 @@ }, "install": { "npmSpec": "@openclaw/synology-chat", - "localPath": "extensions/synology-chat", + "localPath": "native-plugins/synology-chat", "defaultChoice": "npm" } } diff --git a/extensions/synology-chat/setup-api.ts b/native-plugins/synology-chat/setup-api.ts similarity index 100% rename from extensions/synology-chat/setup-api.ts rename to native-plugins/synology-chat/setup-api.ts diff --git a/extensions/synology-chat/setup-entry.ts b/native-plugins/synology-chat/setup-entry.ts similarity index 100% rename from extensions/synology-chat/setup-entry.ts rename to native-plugins/synology-chat/setup-entry.ts diff --git a/extensions/synology-chat/src/accounts.test.ts b/native-plugins/synology-chat/src/accounts.test.ts similarity index 100% rename from extensions/synology-chat/src/accounts.test.ts rename to native-plugins/synology-chat/src/accounts.test.ts diff --git a/extensions/synology-chat/src/accounts.ts b/native-plugins/synology-chat/src/accounts.ts similarity index 100% rename from extensions/synology-chat/src/accounts.ts rename to native-plugins/synology-chat/src/accounts.ts diff --git a/extensions/synology-chat/src/channel.integration.test.ts b/native-plugins/synology-chat/src/channel.integration.test.ts similarity index 100% rename from extensions/synology-chat/src/channel.integration.test.ts rename to native-plugins/synology-chat/src/channel.integration.test.ts diff --git a/extensions/synology-chat/src/channel.test-mocks.ts b/native-plugins/synology-chat/src/channel.test-mocks.ts similarity index 100% rename from extensions/synology-chat/src/channel.test-mocks.ts rename to native-plugins/synology-chat/src/channel.test-mocks.ts diff --git a/extensions/synology-chat/src/channel.test.ts b/native-plugins/synology-chat/src/channel.test.ts similarity index 100% rename from extensions/synology-chat/src/channel.test.ts rename to native-plugins/synology-chat/src/channel.test.ts diff --git a/extensions/synology-chat/src/channel.ts b/native-plugins/synology-chat/src/channel.ts similarity index 100% rename from extensions/synology-chat/src/channel.ts rename to native-plugins/synology-chat/src/channel.ts diff --git a/extensions/synology-chat/src/client.test.ts b/native-plugins/synology-chat/src/client.test.ts similarity index 100% rename from extensions/synology-chat/src/client.test.ts rename to native-plugins/synology-chat/src/client.test.ts diff --git a/extensions/synology-chat/src/client.ts b/native-plugins/synology-chat/src/client.ts similarity index 100% rename from extensions/synology-chat/src/client.ts rename to native-plugins/synology-chat/src/client.ts diff --git a/extensions/synology-chat/src/config-schema.ts b/native-plugins/synology-chat/src/config-schema.ts similarity index 100% rename from extensions/synology-chat/src/config-schema.ts rename to native-plugins/synology-chat/src/config-schema.ts diff --git a/extensions/synology-chat/src/runtime.ts b/native-plugins/synology-chat/src/runtime.ts similarity index 100% rename from extensions/synology-chat/src/runtime.ts rename to native-plugins/synology-chat/src/runtime.ts diff --git a/extensions/synology-chat/src/security.test.ts b/native-plugins/synology-chat/src/security.test.ts similarity index 100% rename from extensions/synology-chat/src/security.test.ts rename to native-plugins/synology-chat/src/security.test.ts diff --git a/extensions/synology-chat/src/security.ts b/native-plugins/synology-chat/src/security.ts similarity index 100% rename from extensions/synology-chat/src/security.ts rename to native-plugins/synology-chat/src/security.ts diff --git a/extensions/synology-chat/src/setup-surface.test.ts b/native-plugins/synology-chat/src/setup-surface.test.ts similarity index 95% rename from extensions/synology-chat/src/setup-surface.test.ts rename to native-plugins/synology-chat/src/setup-surface.test.ts index 5b30c747813..dec85b2c49f 100644 --- a/extensions/synology-chat/src/setup-surface.test.ts +++ b/native-plugins/synology-chat/src/setup-surface.test.ts @@ -1,11 +1,11 @@ import { describe, expect, it, vi } from "vitest"; import { buildChannelSetupWizardAdapterFromSetupWizard } from "../../../src/channels/plugins/setup-wizard.js"; import type { OpenClawConfig } from "../../../src/config/config.js"; -import { createRuntimeEnv } from "../../../test/helpers/extensions/runtime-env.js"; +import { createRuntimeEnv } from "../../../test/helpers/native-plugins/runtime-env.js"; import { createTestWizardPrompter, type WizardPrompter, -} from "../../../test/helpers/extensions/setup-wizard.js"; +} from "../../../test/helpers/native-plugins/setup-wizard.js"; import { synologyChatPlugin } from "./channel.js"; import { synologyChatSetupWizard } from "./setup-surface.js"; diff --git a/extensions/synology-chat/src/setup-surface.ts b/native-plugins/synology-chat/src/setup-surface.ts similarity index 100% rename from extensions/synology-chat/src/setup-surface.ts rename to native-plugins/synology-chat/src/setup-surface.ts diff --git a/extensions/synology-chat/src/test-http-utils.ts b/native-plugins/synology-chat/src/test-http-utils.ts similarity index 100% rename from extensions/synology-chat/src/test-http-utils.ts rename to native-plugins/synology-chat/src/test-http-utils.ts diff --git a/extensions/synology-chat/src/types.ts b/native-plugins/synology-chat/src/types.ts similarity index 100% rename from extensions/synology-chat/src/types.ts rename to native-plugins/synology-chat/src/types.ts diff --git a/extensions/synology-chat/src/webhook-handler.test.ts b/native-plugins/synology-chat/src/webhook-handler.test.ts similarity index 100% rename from extensions/synology-chat/src/webhook-handler.test.ts rename to native-plugins/synology-chat/src/webhook-handler.test.ts diff --git a/extensions/synology-chat/src/webhook-handler.ts b/native-plugins/synology-chat/src/webhook-handler.ts similarity index 100% rename from extensions/synology-chat/src/webhook-handler.ts rename to native-plugins/synology-chat/src/webhook-handler.ts diff --git a/extensions/synthetic/index.ts b/native-plugins/synthetic/index.ts similarity index 100% rename from extensions/synthetic/index.ts rename to native-plugins/synthetic/index.ts diff --git a/extensions/synthetic/onboard.ts b/native-plugins/synthetic/onboard.ts similarity index 100% rename from extensions/synthetic/onboard.ts rename to native-plugins/synthetic/onboard.ts diff --git a/extensions/synthetic/openclaw.plugin.json b/native-plugins/synthetic/openclaw.plugin.json similarity index 100% rename from extensions/synthetic/openclaw.plugin.json rename to native-plugins/synthetic/openclaw.plugin.json diff --git a/extensions/synthetic/package.json b/native-plugins/synthetic/package.json similarity index 91% rename from extensions/synthetic/package.json rename to native-plugins/synthetic/package.json index ec471f1eadf..d2c4cd92ed3 100644 --- a/extensions/synthetic/package.json +++ b/native-plugins/synthetic/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Synthetic provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/synthetic/provider-catalog.ts b/native-plugins/synthetic/provider-catalog.ts similarity index 100% rename from extensions/synthetic/provider-catalog.ts rename to native-plugins/synthetic/provider-catalog.ts diff --git a/extensions/talk-voice/api.ts b/native-plugins/talk-voice/api.ts similarity index 100% rename from extensions/talk-voice/api.ts rename to native-plugins/talk-voice/api.ts diff --git a/extensions/talk-voice/index.test.ts b/native-plugins/talk-voice/index.test.ts similarity index 97% rename from extensions/talk-voice/index.test.ts rename to native-plugins/talk-voice/index.test.ts index 487df4a2d7a..aaf6befb73a 100644 --- a/extensions/talk-voice/index.test.ts +++ b/native-plugins/talk-voice/index.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it, vi } from "vitest"; -import type { OpenClawPluginCommandDefinition } from "../../test/helpers/extensions/plugin-command.js"; -import { createPluginRuntimeMock } from "../../test/helpers/extensions/plugin-runtime-mock.js"; +import type { OpenClawPluginCommandDefinition } from "../../test/helpers/native-plugins/plugin-command.js"; +import { createPluginRuntimeMock } from "../../test/helpers/native-plugins/plugin-runtime-mock.js"; import register from "./index.js"; function createHarness(config: Record) { diff --git a/extensions/talk-voice/index.ts b/native-plugins/talk-voice/index.ts similarity index 100% rename from extensions/talk-voice/index.ts rename to native-plugins/talk-voice/index.ts diff --git a/extensions/talk-voice/openclaw.plugin.json b/native-plugins/talk-voice/openclaw.plugin.json similarity index 100% rename from extensions/talk-voice/openclaw.plugin.json rename to native-plugins/talk-voice/openclaw.plugin.json diff --git a/extensions/tavily/index.test.ts b/native-plugins/tavily/index.test.ts similarity index 100% rename from extensions/tavily/index.test.ts rename to native-plugins/tavily/index.test.ts diff --git a/extensions/tavily/index.ts b/native-plugins/tavily/index.ts similarity index 100% rename from extensions/tavily/index.ts rename to native-plugins/tavily/index.ts diff --git a/extensions/tavily/openclaw.plugin.json b/native-plugins/tavily/openclaw.plugin.json similarity index 100% rename from extensions/tavily/openclaw.plugin.json rename to native-plugins/tavily/openclaw.plugin.json diff --git a/extensions/tavily/package.json b/native-plugins/tavily/package.json similarity index 90% rename from extensions/tavily/package.json rename to native-plugins/tavily/package.json index 3d693a6ca38..ddd7e8b98ec 100644 --- a/extensions/tavily/package.json +++ b/native-plugins/tavily/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Tavily plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/tavily/skills/tavily/SKILL.md b/native-plugins/tavily/skills/tavily/SKILL.md similarity index 100% rename from extensions/tavily/skills/tavily/SKILL.md rename to native-plugins/tavily/skills/tavily/SKILL.md diff --git a/extensions/tavily/src/config.ts b/native-plugins/tavily/src/config.ts similarity index 100% rename from extensions/tavily/src/config.ts rename to native-plugins/tavily/src/config.ts diff --git a/extensions/tavily/src/tavily-client.ts b/native-plugins/tavily/src/tavily-client.ts similarity index 100% rename from extensions/tavily/src/tavily-client.ts rename to native-plugins/tavily/src/tavily-client.ts diff --git a/extensions/tavily/src/tavily-extract-tool.test.ts b/native-plugins/tavily/src/tavily-extract-tool.test.ts similarity index 100% rename from extensions/tavily/src/tavily-extract-tool.test.ts rename to native-plugins/tavily/src/tavily-extract-tool.test.ts diff --git a/extensions/tavily/src/tavily-extract-tool.ts b/native-plugins/tavily/src/tavily-extract-tool.ts similarity index 100% rename from extensions/tavily/src/tavily-extract-tool.ts rename to native-plugins/tavily/src/tavily-extract-tool.ts diff --git a/extensions/tavily/src/tavily-search-provider.ts b/native-plugins/tavily/src/tavily-search-provider.ts similarity index 100% rename from extensions/tavily/src/tavily-search-provider.ts rename to native-plugins/tavily/src/tavily-search-provider.ts diff --git a/extensions/tavily/src/tavily-search-tool.ts b/native-plugins/tavily/src/tavily-search-tool.ts similarity index 100% rename from extensions/tavily/src/tavily-search-tool.ts rename to native-plugins/tavily/src/tavily-search-tool.ts diff --git a/extensions/telegram/api.ts b/native-plugins/telegram/api.ts similarity index 100% rename from extensions/telegram/api.ts rename to native-plugins/telegram/api.ts diff --git a/extensions/telegram/index.ts b/native-plugins/telegram/index.ts similarity index 100% rename from extensions/telegram/index.ts rename to native-plugins/telegram/index.ts diff --git a/extensions/telegram/openclaw.plugin.json b/native-plugins/telegram/openclaw.plugin.json similarity index 100% rename from extensions/telegram/openclaw.plugin.json rename to native-plugins/telegram/openclaw.plugin.json diff --git a/extensions/telegram/package.json b/native-plugins/telegram/package.json similarity index 97% rename from extensions/telegram/package.json rename to native-plugins/telegram/package.json index 01b1b5d9906..e9c6908fef7 100644 --- a/extensions/telegram/package.json +++ b/native-plugins/telegram/package.json @@ -10,7 +10,7 @@ "grammy": "^1.41.1" }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ], "setupEntry": "./setup-entry.ts", diff --git a/extensions/telegram/runtime-api.ts b/native-plugins/telegram/runtime-api.ts similarity index 100% rename from extensions/telegram/runtime-api.ts rename to native-plugins/telegram/runtime-api.ts diff --git a/extensions/telegram/setup-entry.ts b/native-plugins/telegram/setup-entry.ts similarity index 100% rename from extensions/telegram/setup-entry.ts rename to native-plugins/telegram/setup-entry.ts diff --git a/extensions/telegram/src/account-inspect.test.ts b/native-plugins/telegram/src/account-inspect.test.ts similarity index 97% rename from extensions/telegram/src/account-inspect.test.ts rename to native-plugins/telegram/src/account-inspect.test.ts index 735cf4e53bb..4574cfae261 100644 --- a/extensions/telegram/src/account-inspect.test.ts +++ b/native-plugins/telegram/src/account-inspect.test.ts @@ -3,7 +3,7 @@ import os from "node:os"; import path from "node:path"; import { describe, expect, it } from "vitest"; import type { OpenClawConfig } from "../../../src/config/config.js"; -import { withEnv } from "../../../test/helpers/extensions/env.js"; +import { withEnv } from "../../../test/helpers/native-plugins/env.js"; import { inspectTelegramAccount } from "./account-inspect.js"; describe("inspectTelegramAccount SecretRef resolution", () => { diff --git a/extensions/telegram/src/account-inspect.ts b/native-plugins/telegram/src/account-inspect.ts similarity index 100% rename from extensions/telegram/src/account-inspect.ts rename to native-plugins/telegram/src/account-inspect.ts diff --git a/extensions/telegram/src/accounts.test.ts b/native-plugins/telegram/src/accounts.test.ts similarity index 99% rename from extensions/telegram/src/accounts.test.ts rename to native-plugins/telegram/src/accounts.test.ts index ae8a56c66cf..7197480819e 100644 --- a/extensions/telegram/src/accounts.test.ts +++ b/native-plugins/telegram/src/accounts.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import type { OpenClawConfig } from "../../../src/config/config.js"; import * as subsystemModule from "../../../src/logging/subsystem.js"; -import { withEnv } from "../../../test/helpers/extensions/env.js"; +import { withEnv } from "../../../test/helpers/native-plugins/env.js"; import { listTelegramAccountIds, resetMissingDefaultWarnFlag, diff --git a/extensions/telegram/src/accounts.ts b/native-plugins/telegram/src/accounts.ts similarity index 100% rename from extensions/telegram/src/accounts.ts rename to native-plugins/telegram/src/accounts.ts diff --git a/extensions/telegram/src/action-runtime.test.ts b/native-plugins/telegram/src/action-runtime.test.ts similarity index 99% rename from extensions/telegram/src/action-runtime.test.ts rename to native-plugins/telegram/src/action-runtime.test.ts index ddcf7c2854a..5c60d6da766 100644 --- a/extensions/telegram/src/action-runtime.test.ts +++ b/native-plugins/telegram/src/action-runtime.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import type { OpenClawConfig } from "../../../src/config/config.js"; -import { captureEnv } from "../../../test/helpers/extensions/env.js"; +import { captureEnv } from "../../../test/helpers/native-plugins/env.js"; import { handleTelegramAction, readTelegramButtons, diff --git a/extensions/telegram/src/action-runtime.ts b/native-plugins/telegram/src/action-runtime.ts similarity index 100% rename from extensions/telegram/src/action-runtime.ts rename to native-plugins/telegram/src/action-runtime.ts diff --git a/extensions/telegram/src/allow-from.test.ts b/native-plugins/telegram/src/allow-from.test.ts similarity index 100% rename from extensions/telegram/src/allow-from.test.ts rename to native-plugins/telegram/src/allow-from.test.ts diff --git a/extensions/telegram/src/allow-from.ts b/native-plugins/telegram/src/allow-from.ts similarity index 100% rename from extensions/telegram/src/allow-from.ts rename to native-plugins/telegram/src/allow-from.ts diff --git a/extensions/telegram/src/allowed-updates.ts b/native-plugins/telegram/src/allowed-updates.ts similarity index 100% rename from extensions/telegram/src/allowed-updates.ts rename to native-plugins/telegram/src/allowed-updates.ts diff --git a/extensions/telegram/src/api-fetch.test.ts b/native-plugins/telegram/src/api-fetch.test.ts similarity index 100% rename from extensions/telegram/src/api-fetch.test.ts rename to native-plugins/telegram/src/api-fetch.test.ts diff --git a/extensions/telegram/src/api-fetch.ts b/native-plugins/telegram/src/api-fetch.ts similarity index 100% rename from extensions/telegram/src/api-fetch.ts rename to native-plugins/telegram/src/api-fetch.ts diff --git a/extensions/telegram/src/api-logging.ts b/native-plugins/telegram/src/api-logging.ts similarity index 100% rename from extensions/telegram/src/api-logging.ts rename to native-plugins/telegram/src/api-logging.ts diff --git a/extensions/telegram/src/approval-buttons.test.ts b/native-plugins/telegram/src/approval-buttons.test.ts similarity index 100% rename from extensions/telegram/src/approval-buttons.test.ts rename to native-plugins/telegram/src/approval-buttons.test.ts diff --git a/extensions/telegram/src/approval-buttons.ts b/native-plugins/telegram/src/approval-buttons.ts similarity index 100% rename from extensions/telegram/src/approval-buttons.ts rename to native-plugins/telegram/src/approval-buttons.ts diff --git a/extensions/telegram/src/audit-membership-runtime.ts b/native-plugins/telegram/src/audit-membership-runtime.ts similarity index 100% rename from extensions/telegram/src/audit-membership-runtime.ts rename to native-plugins/telegram/src/audit-membership-runtime.ts diff --git a/extensions/telegram/src/audit.test.ts b/native-plugins/telegram/src/audit.test.ts similarity index 100% rename from extensions/telegram/src/audit.test.ts rename to native-plugins/telegram/src/audit.test.ts diff --git a/extensions/telegram/src/audit.ts b/native-plugins/telegram/src/audit.ts similarity index 100% rename from extensions/telegram/src/audit.ts rename to native-plugins/telegram/src/audit.ts diff --git a/extensions/telegram/src/bot-access.test.ts b/native-plugins/telegram/src/bot-access.test.ts similarity index 100% rename from extensions/telegram/src/bot-access.test.ts rename to native-plugins/telegram/src/bot-access.test.ts diff --git a/extensions/telegram/src/bot-access.ts b/native-plugins/telegram/src/bot-access.ts similarity index 100% rename from extensions/telegram/src/bot-access.ts rename to native-plugins/telegram/src/bot-access.ts diff --git a/extensions/telegram/src/bot-deps.ts b/native-plugins/telegram/src/bot-deps.ts similarity index 100% rename from extensions/telegram/src/bot-deps.ts rename to native-plugins/telegram/src/bot-deps.ts diff --git a/extensions/telegram/src/bot-handlers.buffers.ts b/native-plugins/telegram/src/bot-handlers.buffers.ts similarity index 100% rename from extensions/telegram/src/bot-handlers.buffers.ts rename to native-plugins/telegram/src/bot-handlers.buffers.ts diff --git a/extensions/telegram/src/bot-handlers.media.ts b/native-plugins/telegram/src/bot-handlers.media.ts similarity index 100% rename from extensions/telegram/src/bot-handlers.media.ts rename to native-plugins/telegram/src/bot-handlers.media.ts diff --git a/extensions/telegram/src/bot-handlers.runtime.ts b/native-plugins/telegram/src/bot-handlers.runtime.ts similarity index 100% rename from extensions/telegram/src/bot-handlers.runtime.ts rename to native-plugins/telegram/src/bot-handlers.runtime.ts diff --git a/extensions/telegram/src/bot-handlers.ts b/native-plugins/telegram/src/bot-handlers.ts similarity index 100% rename from extensions/telegram/src/bot-handlers.ts rename to native-plugins/telegram/src/bot-handlers.ts diff --git a/extensions/telegram/src/bot-message-context.acp-bindings.test.ts b/native-plugins/telegram/src/bot-message-context.acp-bindings.test.ts similarity index 100% rename from extensions/telegram/src/bot-message-context.acp-bindings.test.ts rename to native-plugins/telegram/src/bot-message-context.acp-bindings.test.ts diff --git a/extensions/telegram/src/bot-message-context.audio-transcript.test.ts b/native-plugins/telegram/src/bot-message-context.audio-transcript.test.ts similarity index 100% rename from extensions/telegram/src/bot-message-context.audio-transcript.test.ts rename to native-plugins/telegram/src/bot-message-context.audio-transcript.test.ts diff --git a/extensions/telegram/src/bot-message-context.body.ts b/native-plugins/telegram/src/bot-message-context.body.ts similarity index 100% rename from extensions/telegram/src/bot-message-context.body.ts rename to native-plugins/telegram/src/bot-message-context.body.ts diff --git a/extensions/telegram/src/bot-message-context.dm-threads.test.ts b/native-plugins/telegram/src/bot-message-context.dm-threads.test.ts similarity index 100% rename from extensions/telegram/src/bot-message-context.dm-threads.test.ts rename to native-plugins/telegram/src/bot-message-context.dm-threads.test.ts diff --git a/extensions/telegram/src/bot-message-context.dm-topic-threadid.test.ts b/native-plugins/telegram/src/bot-message-context.dm-topic-threadid.test.ts similarity index 100% rename from extensions/telegram/src/bot-message-context.dm-topic-threadid.test.ts rename to native-plugins/telegram/src/bot-message-context.dm-topic-threadid.test.ts diff --git a/extensions/telegram/src/bot-message-context.implicit-mention.test.ts b/native-plugins/telegram/src/bot-message-context.implicit-mention.test.ts similarity index 100% rename from extensions/telegram/src/bot-message-context.implicit-mention.test.ts rename to native-plugins/telegram/src/bot-message-context.implicit-mention.test.ts diff --git a/extensions/telegram/src/bot-message-context.named-account-dm.test.ts b/native-plugins/telegram/src/bot-message-context.named-account-dm.test.ts similarity index 100% rename from extensions/telegram/src/bot-message-context.named-account-dm.test.ts rename to native-plugins/telegram/src/bot-message-context.named-account-dm.test.ts diff --git a/extensions/telegram/src/bot-message-context.sender-prefix.test.ts b/native-plugins/telegram/src/bot-message-context.sender-prefix.test.ts similarity index 100% rename from extensions/telegram/src/bot-message-context.sender-prefix.test.ts rename to native-plugins/telegram/src/bot-message-context.sender-prefix.test.ts diff --git a/extensions/telegram/src/bot-message-context.session.ts b/native-plugins/telegram/src/bot-message-context.session.ts similarity index 100% rename from extensions/telegram/src/bot-message-context.session.ts rename to native-plugins/telegram/src/bot-message-context.session.ts diff --git a/extensions/telegram/src/bot-message-context.test-harness.ts b/native-plugins/telegram/src/bot-message-context.test-harness.ts similarity index 100% rename from extensions/telegram/src/bot-message-context.test-harness.ts rename to native-plugins/telegram/src/bot-message-context.test-harness.ts diff --git a/extensions/telegram/src/bot-message-context.thread-binding.test.ts b/native-plugins/telegram/src/bot-message-context.thread-binding.test.ts similarity index 100% rename from extensions/telegram/src/bot-message-context.thread-binding.test.ts rename to native-plugins/telegram/src/bot-message-context.thread-binding.test.ts diff --git a/extensions/telegram/src/bot-message-context.topic-agentid.test.ts b/native-plugins/telegram/src/bot-message-context.topic-agentid.test.ts similarity index 100% rename from extensions/telegram/src/bot-message-context.topic-agentid.test.ts rename to native-plugins/telegram/src/bot-message-context.topic-agentid.test.ts diff --git a/extensions/telegram/src/bot-message-context.ts b/native-plugins/telegram/src/bot-message-context.ts similarity index 100% rename from extensions/telegram/src/bot-message-context.ts rename to native-plugins/telegram/src/bot-message-context.ts diff --git a/extensions/telegram/src/bot-message-context.types.ts b/native-plugins/telegram/src/bot-message-context.types.ts similarity index 100% rename from extensions/telegram/src/bot-message-context.types.ts rename to native-plugins/telegram/src/bot-message-context.types.ts diff --git a/extensions/telegram/src/bot-message-dispatch.sticker-media.test.ts b/native-plugins/telegram/src/bot-message-dispatch.sticker-media.test.ts similarity index 100% rename from extensions/telegram/src/bot-message-dispatch.sticker-media.test.ts rename to native-plugins/telegram/src/bot-message-dispatch.sticker-media.test.ts diff --git a/extensions/telegram/src/bot-message-dispatch.test.ts b/native-plugins/telegram/src/bot-message-dispatch.test.ts similarity index 100% rename from extensions/telegram/src/bot-message-dispatch.test.ts rename to native-plugins/telegram/src/bot-message-dispatch.test.ts diff --git a/extensions/telegram/src/bot-message-dispatch.ts b/native-plugins/telegram/src/bot-message-dispatch.ts similarity index 100% rename from extensions/telegram/src/bot-message-dispatch.ts rename to native-plugins/telegram/src/bot-message-dispatch.ts diff --git a/extensions/telegram/src/bot-message.test.ts b/native-plugins/telegram/src/bot-message.test.ts similarity index 100% rename from extensions/telegram/src/bot-message.test.ts rename to native-plugins/telegram/src/bot-message.test.ts diff --git a/extensions/telegram/src/bot-message.ts b/native-plugins/telegram/src/bot-message.ts similarity index 100% rename from extensions/telegram/src/bot-message.ts rename to native-plugins/telegram/src/bot-message.ts diff --git a/extensions/telegram/src/bot-native-command-menu.test.ts b/native-plugins/telegram/src/bot-native-command-menu.test.ts similarity index 100% rename from extensions/telegram/src/bot-native-command-menu.test.ts rename to native-plugins/telegram/src/bot-native-command-menu.test.ts diff --git a/extensions/telegram/src/bot-native-command-menu.ts b/native-plugins/telegram/src/bot-native-command-menu.ts similarity index 100% rename from extensions/telegram/src/bot-native-command-menu.ts rename to native-plugins/telegram/src/bot-native-command-menu.ts diff --git a/extensions/telegram/src/bot-native-commands.fixture-test-support.ts b/native-plugins/telegram/src/bot-native-commands.fixture-test-support.ts similarity index 100% rename from extensions/telegram/src/bot-native-commands.fixture-test-support.ts rename to native-plugins/telegram/src/bot-native-commands.fixture-test-support.ts diff --git a/extensions/telegram/src/bot-native-commands.group-auth.test.ts b/native-plugins/telegram/src/bot-native-commands.group-auth.test.ts similarity index 100% rename from extensions/telegram/src/bot-native-commands.group-auth.test.ts rename to native-plugins/telegram/src/bot-native-commands.group-auth.test.ts diff --git a/extensions/telegram/src/bot-native-commands.menu-test-support.ts b/native-plugins/telegram/src/bot-native-commands.menu-test-support.ts similarity index 100% rename from extensions/telegram/src/bot-native-commands.menu-test-support.ts rename to native-plugins/telegram/src/bot-native-commands.menu-test-support.ts diff --git a/extensions/telegram/src/bot-native-commands.plugin-auth.test.ts b/native-plugins/telegram/src/bot-native-commands.plugin-auth.test.ts similarity index 100% rename from extensions/telegram/src/bot-native-commands.plugin-auth.test.ts rename to native-plugins/telegram/src/bot-native-commands.plugin-auth.test.ts diff --git a/extensions/telegram/src/bot-native-commands.registry.test.ts b/native-plugins/telegram/src/bot-native-commands.registry.test.ts similarity index 100% rename from extensions/telegram/src/bot-native-commands.registry.test.ts rename to native-plugins/telegram/src/bot-native-commands.registry.test.ts diff --git a/extensions/telegram/src/bot-native-commands.session-meta.test.ts b/native-plugins/telegram/src/bot-native-commands.session-meta.test.ts similarity index 100% rename from extensions/telegram/src/bot-native-commands.session-meta.test.ts rename to native-plugins/telegram/src/bot-native-commands.session-meta.test.ts diff --git a/extensions/telegram/src/bot-native-commands.skills-allowlist.test.ts b/native-plugins/telegram/src/bot-native-commands.skills-allowlist.test.ts similarity index 97% rename from extensions/telegram/src/bot-native-commands.skills-allowlist.test.ts rename to native-plugins/telegram/src/bot-native-commands.skills-allowlist.test.ts index 10f0e95bdb8..7c6171f7cce 100644 --- a/extensions/telegram/src/bot-native-commands.skills-allowlist.test.ts +++ b/native-plugins/telegram/src/bot-native-commands.skills-allowlist.test.ts @@ -7,7 +7,7 @@ import type { OpenClawConfig } from "../../../src/config/config.js"; import { pluginCommandMocks, resetPluginCommandMocks, -} from "../../../test/helpers/extensions/telegram-plugin-command.js"; +} from "../../../test/helpers/native-plugins/telegram-plugin-command.js"; import { registerTelegramNativeCommands } from "./bot-native-commands.js"; import { createNativeCommandTestParams, diff --git a/extensions/telegram/src/bot-native-commands.test-helpers.ts b/native-plugins/telegram/src/bot-native-commands.test-helpers.ts similarity index 100% rename from extensions/telegram/src/bot-native-commands.test-helpers.ts rename to native-plugins/telegram/src/bot-native-commands.test-helpers.ts diff --git a/extensions/telegram/src/bot-native-commands.test.ts b/native-plugins/telegram/src/bot-native-commands.test.ts similarity index 99% rename from extensions/telegram/src/bot-native-commands.test.ts rename to native-plugins/telegram/src/bot-native-commands.test.ts index e85a444369b..62b0caa94a4 100644 --- a/extensions/telegram/src/bot-native-commands.test.ts +++ b/native-plugins/telegram/src/bot-native-commands.test.ts @@ -8,7 +8,7 @@ import type { RuntimeEnv } from "../../../src/runtime.js"; import { pluginCommandMocks, resetPluginCommandMocks, -} from "../../../test/helpers/extensions/telegram-plugin-command.js"; +} from "../../../test/helpers/native-plugins/telegram-plugin-command.js"; import type { TelegramBotDeps } from "./bot-deps.js"; const skillCommandMocks = vi.hoisted(() => ({ listSkillCommandsForAgents: vi.fn(() => []), diff --git a/extensions/telegram/src/bot-native-commands.ts b/native-plugins/telegram/src/bot-native-commands.ts similarity index 100% rename from extensions/telegram/src/bot-native-commands.ts rename to native-plugins/telegram/src/bot-native-commands.ts diff --git a/extensions/telegram/src/bot-updates.ts b/native-plugins/telegram/src/bot-updates.ts similarity index 100% rename from extensions/telegram/src/bot-updates.ts rename to native-plugins/telegram/src/bot-updates.ts diff --git a/extensions/telegram/src/bot.create-telegram-bot.test-harness.ts b/native-plugins/telegram/src/bot.create-telegram-bot.test-harness.ts similarity index 100% rename from extensions/telegram/src/bot.create-telegram-bot.test-harness.ts rename to native-plugins/telegram/src/bot.create-telegram-bot.test-harness.ts diff --git a/extensions/telegram/src/bot.create-telegram-bot.test.ts b/native-plugins/telegram/src/bot.create-telegram-bot.test.ts similarity index 99% rename from extensions/telegram/src/bot.create-telegram-bot.test.ts rename to native-plugins/telegram/src/bot.create-telegram-bot.test.ts index 5384c93a54f..82156fe8ff3 100644 --- a/extensions/telegram/src/bot.create-telegram-bot.test.ts +++ b/native-plugins/telegram/src/bot.create-telegram-bot.test.ts @@ -4,8 +4,8 @@ import path from "node:path"; import type { GetReplyOptions, MsgContext } from "openclaw/plugin-sdk/reply-runtime"; import { afterAll, beforeAll, describe, expect, it, vi } from "vitest"; import { escapeRegExp, formatEnvelopeTimestamp } from "../../../test/helpers/envelope-timestamp.js"; -import { withEnvAsync } from "../../../test/helpers/extensions/env.js"; -import { useFrozenTime, useRealTime } from "../../../test/helpers/extensions/frozen-time.js"; +import { withEnvAsync } from "../../../test/helpers/native-plugins/env.js"; +import { useFrozenTime, useRealTime } from "../../../test/helpers/native-plugins/frozen-time.js"; const harness = await import("./bot.create-telegram-bot.test-harness.js"); const { answerCallbackQuerySpy, diff --git a/extensions/telegram/src/bot.fetch-abort.test.ts b/native-plugins/telegram/src/bot.fetch-abort.test.ts similarity index 100% rename from extensions/telegram/src/bot.fetch-abort.test.ts rename to native-plugins/telegram/src/bot.fetch-abort.test.ts diff --git a/extensions/telegram/src/bot.helpers.test.ts b/native-plugins/telegram/src/bot.helpers.test.ts similarity index 100% rename from extensions/telegram/src/bot.helpers.test.ts rename to native-plugins/telegram/src/bot.helpers.test.ts diff --git a/extensions/telegram/src/bot.media.downloads-media-file-path-no-file-download.e2e.test.ts b/native-plugins/telegram/src/bot.media.downloads-media-file-path-no-file-download.e2e.test.ts similarity index 100% rename from extensions/telegram/src/bot.media.downloads-media-file-path-no-file-download.e2e.test.ts rename to native-plugins/telegram/src/bot.media.downloads-media-file-path-no-file-download.e2e.test.ts diff --git a/extensions/telegram/src/bot.media.e2e-harness.ts b/native-plugins/telegram/src/bot.media.e2e-harness.ts similarity index 100% rename from extensions/telegram/src/bot.media.e2e-harness.ts rename to native-plugins/telegram/src/bot.media.e2e-harness.ts diff --git a/extensions/telegram/src/bot.media.stickers-and-fragments.e2e.test.ts b/native-plugins/telegram/src/bot.media.stickers-and-fragments.e2e.test.ts similarity index 100% rename from extensions/telegram/src/bot.media.stickers-and-fragments.e2e.test.ts rename to native-plugins/telegram/src/bot.media.stickers-and-fragments.e2e.test.ts diff --git a/extensions/telegram/src/bot.media.test-utils.ts b/native-plugins/telegram/src/bot.media.test-utils.ts similarity index 100% rename from extensions/telegram/src/bot.media.test-utils.ts rename to native-plugins/telegram/src/bot.media.test-utils.ts diff --git a/extensions/telegram/src/bot.runtime.ts b/native-plugins/telegram/src/bot.runtime.ts similarity index 100% rename from extensions/telegram/src/bot.runtime.ts rename to native-plugins/telegram/src/bot.runtime.ts diff --git a/extensions/telegram/src/bot.test.ts b/native-plugins/telegram/src/bot.test.ts similarity index 100% rename from extensions/telegram/src/bot.test.ts rename to native-plugins/telegram/src/bot.test.ts diff --git a/extensions/telegram/src/bot.ts b/native-plugins/telegram/src/bot.ts similarity index 100% rename from extensions/telegram/src/bot.ts rename to native-plugins/telegram/src/bot.ts diff --git a/extensions/telegram/src/bot/delivery.replies.ts b/native-plugins/telegram/src/bot/delivery.replies.ts similarity index 100% rename from extensions/telegram/src/bot/delivery.replies.ts rename to native-plugins/telegram/src/bot/delivery.replies.ts diff --git a/extensions/telegram/src/bot/delivery.resolve-media-retry.test.ts b/native-plugins/telegram/src/bot/delivery.resolve-media-retry.test.ts similarity index 100% rename from extensions/telegram/src/bot/delivery.resolve-media-retry.test.ts rename to native-plugins/telegram/src/bot/delivery.resolve-media-retry.test.ts diff --git a/extensions/telegram/src/bot/delivery.resolve-media.ts b/native-plugins/telegram/src/bot/delivery.resolve-media.ts similarity index 100% rename from extensions/telegram/src/bot/delivery.resolve-media.ts rename to native-plugins/telegram/src/bot/delivery.resolve-media.ts diff --git a/extensions/telegram/src/bot/delivery.send.ts b/native-plugins/telegram/src/bot/delivery.send.ts similarity index 100% rename from extensions/telegram/src/bot/delivery.send.ts rename to native-plugins/telegram/src/bot/delivery.send.ts diff --git a/extensions/telegram/src/bot/delivery.test.ts b/native-plugins/telegram/src/bot/delivery.test.ts similarity index 100% rename from extensions/telegram/src/bot/delivery.test.ts rename to native-plugins/telegram/src/bot/delivery.test.ts diff --git a/extensions/telegram/src/bot/delivery.ts b/native-plugins/telegram/src/bot/delivery.ts similarity index 100% rename from extensions/telegram/src/bot/delivery.ts rename to native-plugins/telegram/src/bot/delivery.ts diff --git a/extensions/telegram/src/bot/helpers.test.ts b/native-plugins/telegram/src/bot/helpers.test.ts similarity index 100% rename from extensions/telegram/src/bot/helpers.test.ts rename to native-plugins/telegram/src/bot/helpers.test.ts diff --git a/extensions/telegram/src/bot/helpers.ts b/native-plugins/telegram/src/bot/helpers.ts similarity index 100% rename from extensions/telegram/src/bot/helpers.ts rename to native-plugins/telegram/src/bot/helpers.ts diff --git a/extensions/telegram/src/bot/reply-threading.ts b/native-plugins/telegram/src/bot/reply-threading.ts similarity index 100% rename from extensions/telegram/src/bot/reply-threading.ts rename to native-plugins/telegram/src/bot/reply-threading.ts diff --git a/extensions/telegram/src/bot/types.ts b/native-plugins/telegram/src/bot/types.ts similarity index 100% rename from extensions/telegram/src/bot/types.ts rename to native-plugins/telegram/src/bot/types.ts diff --git a/extensions/telegram/src/button-types.test.ts b/native-plugins/telegram/src/button-types.test.ts similarity index 100% rename from extensions/telegram/src/button-types.test.ts rename to native-plugins/telegram/src/button-types.test.ts diff --git a/extensions/telegram/src/button-types.ts b/native-plugins/telegram/src/button-types.ts similarity index 100% rename from extensions/telegram/src/button-types.ts rename to native-plugins/telegram/src/button-types.ts diff --git a/extensions/telegram/src/caption.ts b/native-plugins/telegram/src/caption.ts similarity index 100% rename from extensions/telegram/src/caption.ts rename to native-plugins/telegram/src/caption.ts diff --git a/extensions/telegram/src/channel-actions.test.ts b/native-plugins/telegram/src/channel-actions.test.ts similarity index 100% rename from extensions/telegram/src/channel-actions.test.ts rename to native-plugins/telegram/src/channel-actions.test.ts diff --git a/extensions/telegram/src/channel-actions.ts b/native-plugins/telegram/src/channel-actions.ts similarity index 100% rename from extensions/telegram/src/channel-actions.ts rename to native-plugins/telegram/src/channel-actions.ts diff --git a/extensions/telegram/src/channel.setup.ts b/native-plugins/telegram/src/channel.setup.ts similarity index 100% rename from extensions/telegram/src/channel.setup.ts rename to native-plugins/telegram/src/channel.setup.ts diff --git a/extensions/telegram/src/channel.test.ts b/native-plugins/telegram/src/channel.test.ts similarity index 99% rename from extensions/telegram/src/channel.test.ts rename to native-plugins/telegram/src/channel.test.ts index c9e8df40be0..394511899ff 100644 --- a/extensions/telegram/src/channel.test.ts +++ b/native-plugins/telegram/src/channel.test.ts @@ -5,7 +5,7 @@ import type { PluginRuntime, } from "openclaw/plugin-sdk/telegram"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { createRuntimeEnv } from "../../../test/helpers/extensions/runtime-env.js"; +import { createRuntimeEnv } from "../../../test/helpers/native-plugins/runtime-env.js"; import type { ResolvedTelegramAccount } from "./accounts.js"; import * as auditModule from "./audit.js"; import { telegramPlugin } from "./channel.js"; diff --git a/extensions/telegram/src/channel.ts b/native-plugins/telegram/src/channel.ts similarity index 100% rename from extensions/telegram/src/channel.ts rename to native-plugins/telegram/src/channel.ts diff --git a/extensions/telegram/src/config-schema.ts b/native-plugins/telegram/src/config-schema.ts similarity index 100% rename from extensions/telegram/src/config-schema.ts rename to native-plugins/telegram/src/config-schema.ts diff --git a/extensions/telegram/src/conversation-route.base-session-key.test.ts b/native-plugins/telegram/src/conversation-route.base-session-key.test.ts similarity index 100% rename from extensions/telegram/src/conversation-route.base-session-key.test.ts rename to native-plugins/telegram/src/conversation-route.base-session-key.test.ts diff --git a/extensions/telegram/src/conversation-route.ts b/native-plugins/telegram/src/conversation-route.ts similarity index 100% rename from extensions/telegram/src/conversation-route.ts rename to native-plugins/telegram/src/conversation-route.ts diff --git a/extensions/telegram/src/directory-config.ts b/native-plugins/telegram/src/directory-config.ts similarity index 100% rename from extensions/telegram/src/directory-config.ts rename to native-plugins/telegram/src/directory-config.ts diff --git a/extensions/telegram/src/dm-access.ts b/native-plugins/telegram/src/dm-access.ts similarity index 100% rename from extensions/telegram/src/dm-access.ts rename to native-plugins/telegram/src/dm-access.ts diff --git a/extensions/telegram/src/draft-chunking.test.ts b/native-plugins/telegram/src/draft-chunking.test.ts similarity index 100% rename from extensions/telegram/src/draft-chunking.test.ts rename to native-plugins/telegram/src/draft-chunking.test.ts diff --git a/extensions/telegram/src/draft-chunking.ts b/native-plugins/telegram/src/draft-chunking.ts similarity index 100% rename from extensions/telegram/src/draft-chunking.ts rename to native-plugins/telegram/src/draft-chunking.ts diff --git a/extensions/telegram/src/draft-stream.test-helpers.ts b/native-plugins/telegram/src/draft-stream.test-helpers.ts similarity index 100% rename from extensions/telegram/src/draft-stream.test-helpers.ts rename to native-plugins/telegram/src/draft-stream.test-helpers.ts diff --git a/extensions/telegram/src/draft-stream.test.ts b/native-plugins/telegram/src/draft-stream.test.ts similarity index 100% rename from extensions/telegram/src/draft-stream.test.ts rename to native-plugins/telegram/src/draft-stream.test.ts diff --git a/extensions/telegram/src/draft-stream.ts b/native-plugins/telegram/src/draft-stream.ts similarity index 100% rename from extensions/telegram/src/draft-stream.ts rename to native-plugins/telegram/src/draft-stream.ts diff --git a/extensions/telegram/src/exec-approvals-handler.test.ts b/native-plugins/telegram/src/exec-approvals-handler.test.ts similarity index 100% rename from extensions/telegram/src/exec-approvals-handler.test.ts rename to native-plugins/telegram/src/exec-approvals-handler.test.ts diff --git a/extensions/telegram/src/exec-approvals-handler.ts b/native-plugins/telegram/src/exec-approvals-handler.ts similarity index 100% rename from extensions/telegram/src/exec-approvals-handler.ts rename to native-plugins/telegram/src/exec-approvals-handler.ts diff --git a/extensions/telegram/src/exec-approvals.test.ts b/native-plugins/telegram/src/exec-approvals.test.ts similarity index 100% rename from extensions/telegram/src/exec-approvals.test.ts rename to native-plugins/telegram/src/exec-approvals.test.ts diff --git a/extensions/telegram/src/exec-approvals.ts b/native-plugins/telegram/src/exec-approvals.ts similarity index 100% rename from extensions/telegram/src/exec-approvals.ts rename to native-plugins/telegram/src/exec-approvals.ts diff --git a/extensions/telegram/src/fetch.env-proxy-runtime.test.ts b/native-plugins/telegram/src/fetch.env-proxy-runtime.test.ts similarity index 100% rename from extensions/telegram/src/fetch.env-proxy-runtime.test.ts rename to native-plugins/telegram/src/fetch.env-proxy-runtime.test.ts diff --git a/extensions/telegram/src/fetch.test.ts b/native-plugins/telegram/src/fetch.test.ts similarity index 100% rename from extensions/telegram/src/fetch.test.ts rename to native-plugins/telegram/src/fetch.test.ts diff --git a/extensions/telegram/src/fetch.ts b/native-plugins/telegram/src/fetch.ts similarity index 100% rename from extensions/telegram/src/fetch.ts rename to native-plugins/telegram/src/fetch.ts diff --git a/extensions/telegram/src/format.test.ts b/native-plugins/telegram/src/format.test.ts similarity index 100% rename from extensions/telegram/src/format.test.ts rename to native-plugins/telegram/src/format.test.ts diff --git a/extensions/telegram/src/format.ts b/native-plugins/telegram/src/format.ts similarity index 100% rename from extensions/telegram/src/format.ts rename to native-plugins/telegram/src/format.ts diff --git a/extensions/telegram/src/format.wrap-md.test.ts b/native-plugins/telegram/src/format.wrap-md.test.ts similarity index 100% rename from extensions/telegram/src/format.wrap-md.test.ts rename to native-plugins/telegram/src/format.wrap-md.test.ts diff --git a/extensions/telegram/src/forum-service-message.ts b/native-plugins/telegram/src/forum-service-message.ts similarity index 100% rename from extensions/telegram/src/forum-service-message.ts rename to native-plugins/telegram/src/forum-service-message.ts diff --git a/extensions/telegram/src/group-access.base-access.test.ts b/native-plugins/telegram/src/group-access.base-access.test.ts similarity index 100% rename from extensions/telegram/src/group-access.base-access.test.ts rename to native-plugins/telegram/src/group-access.base-access.test.ts diff --git a/extensions/telegram/src/group-access.policy-access.test.ts b/native-plugins/telegram/src/group-access.policy-access.test.ts similarity index 100% rename from extensions/telegram/src/group-access.policy-access.test.ts rename to native-plugins/telegram/src/group-access.policy-access.test.ts diff --git a/extensions/telegram/src/group-access.ts b/native-plugins/telegram/src/group-access.ts similarity index 100% rename from extensions/telegram/src/group-access.ts rename to native-plugins/telegram/src/group-access.ts diff --git a/extensions/telegram/src/group-config-helpers.ts b/native-plugins/telegram/src/group-config-helpers.ts similarity index 100% rename from extensions/telegram/src/group-config-helpers.ts rename to native-plugins/telegram/src/group-config-helpers.ts diff --git a/extensions/telegram/src/group-migration.test.ts b/native-plugins/telegram/src/group-migration.test.ts similarity index 100% rename from extensions/telegram/src/group-migration.test.ts rename to native-plugins/telegram/src/group-migration.test.ts diff --git a/extensions/telegram/src/group-migration.ts b/native-plugins/telegram/src/group-migration.ts similarity index 100% rename from extensions/telegram/src/group-migration.ts rename to native-plugins/telegram/src/group-migration.ts diff --git a/extensions/telegram/src/group-policy.test.ts b/native-plugins/telegram/src/group-policy.test.ts similarity index 100% rename from extensions/telegram/src/group-policy.test.ts rename to native-plugins/telegram/src/group-policy.test.ts diff --git a/extensions/telegram/src/group-policy.ts b/native-plugins/telegram/src/group-policy.ts similarity index 100% rename from extensions/telegram/src/group-policy.ts rename to native-plugins/telegram/src/group-policy.ts diff --git a/extensions/telegram/src/inline-buttons.test.ts b/native-plugins/telegram/src/inline-buttons.test.ts similarity index 100% rename from extensions/telegram/src/inline-buttons.test.ts rename to native-plugins/telegram/src/inline-buttons.test.ts diff --git a/extensions/telegram/src/inline-buttons.ts b/native-plugins/telegram/src/inline-buttons.ts similarity index 100% rename from extensions/telegram/src/inline-buttons.ts rename to native-plugins/telegram/src/inline-buttons.ts diff --git a/extensions/telegram/src/lane-delivery-state.ts b/native-plugins/telegram/src/lane-delivery-state.ts similarity index 100% rename from extensions/telegram/src/lane-delivery-state.ts rename to native-plugins/telegram/src/lane-delivery-state.ts diff --git a/extensions/telegram/src/lane-delivery-text-deliverer.ts b/native-plugins/telegram/src/lane-delivery-text-deliverer.ts similarity index 100% rename from extensions/telegram/src/lane-delivery-text-deliverer.ts rename to native-plugins/telegram/src/lane-delivery-text-deliverer.ts diff --git a/extensions/telegram/src/lane-delivery.test.ts b/native-plugins/telegram/src/lane-delivery.test.ts similarity index 100% rename from extensions/telegram/src/lane-delivery.test.ts rename to native-plugins/telegram/src/lane-delivery.test.ts diff --git a/extensions/telegram/src/lane-delivery.ts b/native-plugins/telegram/src/lane-delivery.ts similarity index 100% rename from extensions/telegram/src/lane-delivery.ts rename to native-plugins/telegram/src/lane-delivery.ts diff --git a/extensions/telegram/src/media-understanding.runtime.ts b/native-plugins/telegram/src/media-understanding.runtime.ts similarity index 100% rename from extensions/telegram/src/media-understanding.runtime.ts rename to native-plugins/telegram/src/media-understanding.runtime.ts diff --git a/extensions/telegram/src/message-tool-schema.ts b/native-plugins/telegram/src/message-tool-schema.ts similarity index 100% rename from extensions/telegram/src/message-tool-schema.ts rename to native-plugins/telegram/src/message-tool-schema.ts diff --git a/extensions/telegram/src/model-buttons.test.ts b/native-plugins/telegram/src/model-buttons.test.ts similarity index 100% rename from extensions/telegram/src/model-buttons.test.ts rename to native-plugins/telegram/src/model-buttons.test.ts diff --git a/extensions/telegram/src/model-buttons.ts b/native-plugins/telegram/src/model-buttons.ts similarity index 100% rename from extensions/telegram/src/model-buttons.ts rename to native-plugins/telegram/src/model-buttons.ts diff --git a/extensions/telegram/src/monitor.test.ts b/native-plugins/telegram/src/monitor.test.ts similarity index 100% rename from extensions/telegram/src/monitor.test.ts rename to native-plugins/telegram/src/monitor.test.ts diff --git a/extensions/telegram/src/monitor.ts b/native-plugins/telegram/src/monitor.ts similarity index 100% rename from extensions/telegram/src/monitor.ts rename to native-plugins/telegram/src/monitor.ts diff --git a/extensions/telegram/src/network-config.test.ts b/native-plugins/telegram/src/network-config.test.ts similarity index 100% rename from extensions/telegram/src/network-config.test.ts rename to native-plugins/telegram/src/network-config.test.ts diff --git a/extensions/telegram/src/network-config.ts b/native-plugins/telegram/src/network-config.ts similarity index 100% rename from extensions/telegram/src/network-config.ts rename to native-plugins/telegram/src/network-config.ts diff --git a/extensions/telegram/src/network-errors.test.ts b/native-plugins/telegram/src/network-errors.test.ts similarity index 100% rename from extensions/telegram/src/network-errors.test.ts rename to native-plugins/telegram/src/network-errors.test.ts diff --git a/extensions/telegram/src/network-errors.ts b/native-plugins/telegram/src/network-errors.ts similarity index 100% rename from extensions/telegram/src/network-errors.ts rename to native-plugins/telegram/src/network-errors.ts diff --git a/extensions/telegram/src/normalize.ts b/native-plugins/telegram/src/normalize.ts similarity index 100% rename from extensions/telegram/src/normalize.ts rename to native-plugins/telegram/src/normalize.ts diff --git a/extensions/telegram/src/outbound-adapter.ts b/native-plugins/telegram/src/outbound-adapter.ts similarity index 100% rename from extensions/telegram/src/outbound-adapter.ts rename to native-plugins/telegram/src/outbound-adapter.ts diff --git a/extensions/telegram/src/outbound-params.ts b/native-plugins/telegram/src/outbound-params.ts similarity index 100% rename from extensions/telegram/src/outbound-params.ts rename to native-plugins/telegram/src/outbound-params.ts diff --git a/extensions/telegram/src/polling-session.test.ts b/native-plugins/telegram/src/polling-session.test.ts similarity index 100% rename from extensions/telegram/src/polling-session.test.ts rename to native-plugins/telegram/src/polling-session.test.ts diff --git a/extensions/telegram/src/polling-session.ts b/native-plugins/telegram/src/polling-session.ts similarity index 100% rename from extensions/telegram/src/polling-session.ts rename to native-plugins/telegram/src/polling-session.ts diff --git a/extensions/telegram/src/probe.test.ts b/native-plugins/telegram/src/probe.test.ts similarity index 98% rename from extensions/telegram/src/probe.test.ts rename to native-plugins/telegram/src/probe.test.ts index da6f86f9b80..f673d9f436d 100644 --- a/extensions/telegram/src/probe.test.ts +++ b/native-plugins/telegram/src/probe.test.ts @@ -1,5 +1,5 @@ import { afterEach, type Mock, describe, expect, it, vi } from "vitest"; -import { withFetchPreconnect } from "../../../test/helpers/extensions/fetch-mock.js"; +import { withFetchPreconnect } from "../../../test/helpers/native-plugins/fetch-mock.js"; import { probeTelegram, resetTelegramProbeFetcherCacheForTests } from "./probe.js"; const resolveTelegramFetch = vi.hoisted(() => vi.fn()); diff --git a/extensions/telegram/src/probe.ts b/native-plugins/telegram/src/probe.ts similarity index 100% rename from extensions/telegram/src/probe.ts rename to native-plugins/telegram/src/probe.ts diff --git a/extensions/telegram/src/proxy.test.ts b/native-plugins/telegram/src/proxy.test.ts similarity index 100% rename from extensions/telegram/src/proxy.test.ts rename to native-plugins/telegram/src/proxy.test.ts diff --git a/extensions/telegram/src/proxy.ts b/native-plugins/telegram/src/proxy.ts similarity index 100% rename from extensions/telegram/src/proxy.ts rename to native-plugins/telegram/src/proxy.ts diff --git a/extensions/telegram/src/reaction-level.test.ts b/native-plugins/telegram/src/reaction-level.test.ts similarity index 100% rename from extensions/telegram/src/reaction-level.test.ts rename to native-plugins/telegram/src/reaction-level.test.ts diff --git a/extensions/telegram/src/reaction-level.ts b/native-plugins/telegram/src/reaction-level.ts similarity index 100% rename from extensions/telegram/src/reaction-level.ts rename to native-plugins/telegram/src/reaction-level.ts diff --git a/extensions/telegram/src/reasoning-lane-coordinator.test.ts b/native-plugins/telegram/src/reasoning-lane-coordinator.test.ts similarity index 100% rename from extensions/telegram/src/reasoning-lane-coordinator.test.ts rename to native-plugins/telegram/src/reasoning-lane-coordinator.test.ts diff --git a/extensions/telegram/src/reasoning-lane-coordinator.ts b/native-plugins/telegram/src/reasoning-lane-coordinator.ts similarity index 100% rename from extensions/telegram/src/reasoning-lane-coordinator.ts rename to native-plugins/telegram/src/reasoning-lane-coordinator.ts diff --git a/extensions/telegram/src/runtime.ts b/native-plugins/telegram/src/runtime.ts similarity index 100% rename from extensions/telegram/src/runtime.ts rename to native-plugins/telegram/src/runtime.ts diff --git a/extensions/telegram/src/send.proxy.test.ts b/native-plugins/telegram/src/send.proxy.test.ts similarity index 100% rename from extensions/telegram/src/send.proxy.test.ts rename to native-plugins/telegram/src/send.proxy.test.ts diff --git a/extensions/telegram/src/send.test-harness.ts b/native-plugins/telegram/src/send.test-harness.ts similarity index 100% rename from extensions/telegram/src/send.test-harness.ts rename to native-plugins/telegram/src/send.test-harness.ts diff --git a/extensions/telegram/src/send.test.ts b/native-plugins/telegram/src/send.test.ts similarity index 100% rename from extensions/telegram/src/send.test.ts rename to native-plugins/telegram/src/send.test.ts diff --git a/extensions/telegram/src/send.ts b/native-plugins/telegram/src/send.ts similarity index 100% rename from extensions/telegram/src/send.ts rename to native-plugins/telegram/src/send.ts diff --git a/extensions/telegram/src/sendchataction-401-backoff.test.ts b/native-plugins/telegram/src/sendchataction-401-backoff.test.ts similarity index 100% rename from extensions/telegram/src/sendchataction-401-backoff.test.ts rename to native-plugins/telegram/src/sendchataction-401-backoff.test.ts diff --git a/extensions/telegram/src/sendchataction-401-backoff.ts b/native-plugins/telegram/src/sendchataction-401-backoff.ts similarity index 100% rename from extensions/telegram/src/sendchataction-401-backoff.ts rename to native-plugins/telegram/src/sendchataction-401-backoff.ts diff --git a/extensions/telegram/src/sent-message-cache.ts b/native-plugins/telegram/src/sent-message-cache.ts similarity index 100% rename from extensions/telegram/src/sent-message-cache.ts rename to native-plugins/telegram/src/sent-message-cache.ts diff --git a/extensions/telegram/src/sequential-key.test.ts b/native-plugins/telegram/src/sequential-key.test.ts similarity index 100% rename from extensions/telegram/src/sequential-key.test.ts rename to native-plugins/telegram/src/sequential-key.test.ts diff --git a/extensions/telegram/src/sequential-key.ts b/native-plugins/telegram/src/sequential-key.ts similarity index 100% rename from extensions/telegram/src/sequential-key.ts rename to native-plugins/telegram/src/sequential-key.ts diff --git a/extensions/telegram/src/setup-core.ts b/native-plugins/telegram/src/setup-core.ts similarity index 100% rename from extensions/telegram/src/setup-core.ts rename to native-plugins/telegram/src/setup-core.ts diff --git a/extensions/telegram/src/setup-surface.test.ts b/native-plugins/telegram/src/setup-surface.test.ts similarity index 100% rename from extensions/telegram/src/setup-surface.test.ts rename to native-plugins/telegram/src/setup-surface.test.ts diff --git a/extensions/telegram/src/setup-surface.ts b/native-plugins/telegram/src/setup-surface.ts similarity index 100% rename from extensions/telegram/src/setup-surface.ts rename to native-plugins/telegram/src/setup-surface.ts diff --git a/extensions/telegram/src/shared.ts b/native-plugins/telegram/src/shared.ts similarity index 100% rename from extensions/telegram/src/shared.ts rename to native-plugins/telegram/src/shared.ts diff --git a/extensions/telegram/src/status-issues.ts b/native-plugins/telegram/src/status-issues.ts similarity index 100% rename from extensions/telegram/src/status-issues.ts rename to native-plugins/telegram/src/status-issues.ts diff --git a/extensions/telegram/src/status-reaction-variants.test.ts b/native-plugins/telegram/src/status-reaction-variants.test.ts similarity index 100% rename from extensions/telegram/src/status-reaction-variants.test.ts rename to native-plugins/telegram/src/status-reaction-variants.test.ts diff --git a/extensions/telegram/src/status-reaction-variants.ts b/native-plugins/telegram/src/status-reaction-variants.ts similarity index 100% rename from extensions/telegram/src/status-reaction-variants.ts rename to native-plugins/telegram/src/status-reaction-variants.ts diff --git a/extensions/telegram/src/sticker-cache.test.ts b/native-plugins/telegram/src/sticker-cache.test.ts similarity index 100% rename from extensions/telegram/src/sticker-cache.test.ts rename to native-plugins/telegram/src/sticker-cache.test.ts diff --git a/extensions/telegram/src/sticker-cache.ts b/native-plugins/telegram/src/sticker-cache.ts similarity index 100% rename from extensions/telegram/src/sticker-cache.ts rename to native-plugins/telegram/src/sticker-cache.ts diff --git a/extensions/telegram/src/target-writeback.test.ts b/native-plugins/telegram/src/target-writeback.test.ts similarity index 100% rename from extensions/telegram/src/target-writeback.test.ts rename to native-plugins/telegram/src/target-writeback.test.ts diff --git a/extensions/telegram/src/target-writeback.ts b/native-plugins/telegram/src/target-writeback.ts similarity index 100% rename from extensions/telegram/src/target-writeback.ts rename to native-plugins/telegram/src/target-writeback.ts diff --git a/extensions/telegram/src/targets.test.ts b/native-plugins/telegram/src/targets.test.ts similarity index 100% rename from extensions/telegram/src/targets.test.ts rename to native-plugins/telegram/src/targets.test.ts diff --git a/extensions/telegram/src/targets.ts b/native-plugins/telegram/src/targets.ts similarity index 100% rename from extensions/telegram/src/targets.ts rename to native-plugins/telegram/src/targets.ts diff --git a/extensions/telegram/src/thread-bindings.test.ts b/native-plugins/telegram/src/thread-bindings.test.ts similarity index 100% rename from extensions/telegram/src/thread-bindings.test.ts rename to native-plugins/telegram/src/thread-bindings.test.ts diff --git a/extensions/telegram/src/thread-bindings.ts b/native-plugins/telegram/src/thread-bindings.ts similarity index 100% rename from extensions/telegram/src/thread-bindings.ts rename to native-plugins/telegram/src/thread-bindings.ts diff --git a/extensions/telegram/src/token.test.ts b/native-plugins/telegram/src/token.test.ts similarity index 100% rename from extensions/telegram/src/token.test.ts rename to native-plugins/telegram/src/token.test.ts diff --git a/extensions/telegram/src/token.ts b/native-plugins/telegram/src/token.ts similarity index 100% rename from extensions/telegram/src/token.ts rename to native-plugins/telegram/src/token.ts diff --git a/extensions/telegram/src/update-offset-store.test.ts b/native-plugins/telegram/src/update-offset-store.test.ts similarity index 100% rename from extensions/telegram/src/update-offset-store.test.ts rename to native-plugins/telegram/src/update-offset-store.test.ts diff --git a/extensions/telegram/src/update-offset-store.ts b/native-plugins/telegram/src/update-offset-store.ts similarity index 100% rename from extensions/telegram/src/update-offset-store.ts rename to native-plugins/telegram/src/update-offset-store.ts diff --git a/extensions/telegram/src/voice.test.ts b/native-plugins/telegram/src/voice.test.ts similarity index 100% rename from extensions/telegram/src/voice.test.ts rename to native-plugins/telegram/src/voice.test.ts diff --git a/extensions/telegram/src/voice.ts b/native-plugins/telegram/src/voice.ts similarity index 100% rename from extensions/telegram/src/voice.ts rename to native-plugins/telegram/src/voice.ts diff --git a/extensions/telegram/src/webhook.test.ts b/native-plugins/telegram/src/webhook.test.ts similarity index 100% rename from extensions/telegram/src/webhook.test.ts rename to native-plugins/telegram/src/webhook.test.ts diff --git a/extensions/telegram/src/webhook.ts b/native-plugins/telegram/src/webhook.ts similarity index 100% rename from extensions/telegram/src/webhook.ts rename to native-plugins/telegram/src/webhook.ts diff --git a/extensions/thread-ownership/api.ts b/native-plugins/thread-ownership/api.ts similarity index 100% rename from extensions/thread-ownership/api.ts rename to native-plugins/thread-ownership/api.ts diff --git a/extensions/thread-ownership/index.test.ts b/native-plugins/thread-ownership/index.test.ts similarity index 100% rename from extensions/thread-ownership/index.test.ts rename to native-plugins/thread-ownership/index.test.ts diff --git a/extensions/thread-ownership/index.ts b/native-plugins/thread-ownership/index.ts similarity index 100% rename from extensions/thread-ownership/index.ts rename to native-plugins/thread-ownership/index.ts diff --git a/extensions/thread-ownership/openclaw.plugin.json b/native-plugins/thread-ownership/openclaw.plugin.json similarity index 100% rename from extensions/thread-ownership/openclaw.plugin.json rename to native-plugins/thread-ownership/openclaw.plugin.json diff --git a/extensions/tlon/README.md b/native-plugins/tlon/README.md similarity index 100% rename from extensions/tlon/README.md rename to native-plugins/tlon/README.md diff --git a/extensions/tlon/api.ts b/native-plugins/tlon/api.ts similarity index 100% rename from extensions/tlon/api.ts rename to native-plugins/tlon/api.ts diff --git a/extensions/tlon/index.ts b/native-plugins/tlon/index.ts similarity index 100% rename from extensions/tlon/index.ts rename to native-plugins/tlon/index.ts diff --git a/extensions/tlon/openclaw.plugin.json b/native-plugins/tlon/openclaw.plugin.json similarity index 100% rename from extensions/tlon/openclaw.plugin.json rename to native-plugins/tlon/openclaw.plugin.json diff --git a/extensions/tlon/package.json b/native-plugins/tlon/package.json similarity index 93% rename from extensions/tlon/package.json rename to native-plugins/tlon/package.json index c1c718ed4b6..67c0ef088fa 100644 --- a/extensions/tlon/package.json +++ b/native-plugins/tlon/package.json @@ -11,7 +11,7 @@ "zod": "^4.3.6" }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ], "setupEntry": "./setup-entry.ts", @@ -27,7 +27,7 @@ }, "install": { "npmSpec": "@openclaw/tlon", - "localPath": "extensions/tlon", + "localPath": "native-plugins/tlon", "defaultChoice": "npm" } } diff --git a/extensions/tlon/setup-api.ts b/native-plugins/tlon/setup-api.ts similarity index 100% rename from extensions/tlon/setup-api.ts rename to native-plugins/tlon/setup-api.ts diff --git a/extensions/tlon/setup-entry.ts b/native-plugins/tlon/setup-entry.ts similarity index 100% rename from extensions/tlon/setup-entry.ts rename to native-plugins/tlon/setup-entry.ts diff --git a/extensions/tlon/src/account-fields.ts b/native-plugins/tlon/src/account-fields.ts similarity index 100% rename from extensions/tlon/src/account-fields.ts rename to native-plugins/tlon/src/account-fields.ts diff --git a/extensions/tlon/src/channel.runtime.ts b/native-plugins/tlon/src/channel.runtime.ts similarity index 100% rename from extensions/tlon/src/channel.runtime.ts rename to native-plugins/tlon/src/channel.runtime.ts diff --git a/extensions/tlon/src/channel.test.ts b/native-plugins/tlon/src/channel.test.ts similarity index 100% rename from extensions/tlon/src/channel.test.ts rename to native-plugins/tlon/src/channel.test.ts diff --git a/extensions/tlon/src/channel.ts b/native-plugins/tlon/src/channel.ts similarity index 100% rename from extensions/tlon/src/channel.ts rename to native-plugins/tlon/src/channel.ts diff --git a/extensions/tlon/src/config-schema.test.ts b/native-plugins/tlon/src/config-schema.test.ts similarity index 100% rename from extensions/tlon/src/config-schema.test.ts rename to native-plugins/tlon/src/config-schema.test.ts diff --git a/extensions/tlon/src/config-schema.ts b/native-plugins/tlon/src/config-schema.ts similarity index 100% rename from extensions/tlon/src/config-schema.ts rename to native-plugins/tlon/src/config-schema.ts diff --git a/extensions/tlon/src/monitor/approval-runtime.ts b/native-plugins/tlon/src/monitor/approval-runtime.ts similarity index 100% rename from extensions/tlon/src/monitor/approval-runtime.ts rename to native-plugins/tlon/src/monitor/approval-runtime.ts diff --git a/extensions/tlon/src/monitor/approval.ts b/native-plugins/tlon/src/monitor/approval.ts similarity index 100% rename from extensions/tlon/src/monitor/approval.ts rename to native-plugins/tlon/src/monitor/approval.ts diff --git a/extensions/tlon/src/monitor/authorization.ts b/native-plugins/tlon/src/monitor/authorization.ts similarity index 100% rename from extensions/tlon/src/monitor/authorization.ts rename to native-plugins/tlon/src/monitor/authorization.ts diff --git a/extensions/tlon/src/monitor/cites.ts b/native-plugins/tlon/src/monitor/cites.ts similarity index 100% rename from extensions/tlon/src/monitor/cites.ts rename to native-plugins/tlon/src/monitor/cites.ts diff --git a/extensions/tlon/src/monitor/discovery.ts b/native-plugins/tlon/src/monitor/discovery.ts similarity index 100% rename from extensions/tlon/src/monitor/discovery.ts rename to native-plugins/tlon/src/monitor/discovery.ts diff --git a/extensions/tlon/src/monitor/history.ts b/native-plugins/tlon/src/monitor/history.ts similarity index 100% rename from extensions/tlon/src/monitor/history.ts rename to native-plugins/tlon/src/monitor/history.ts diff --git a/extensions/tlon/src/monitor/index.ts b/native-plugins/tlon/src/monitor/index.ts similarity index 100% rename from extensions/tlon/src/monitor/index.ts rename to native-plugins/tlon/src/monitor/index.ts diff --git a/extensions/tlon/src/monitor/media.ts b/native-plugins/tlon/src/monitor/media.ts similarity index 100% rename from extensions/tlon/src/monitor/media.ts rename to native-plugins/tlon/src/monitor/media.ts diff --git a/extensions/tlon/src/monitor/processed-messages.test.ts b/native-plugins/tlon/src/monitor/processed-messages.test.ts similarity index 100% rename from extensions/tlon/src/monitor/processed-messages.test.ts rename to native-plugins/tlon/src/monitor/processed-messages.test.ts diff --git a/extensions/tlon/src/monitor/processed-messages.ts b/native-plugins/tlon/src/monitor/processed-messages.ts similarity index 100% rename from extensions/tlon/src/monitor/processed-messages.ts rename to native-plugins/tlon/src/monitor/processed-messages.ts diff --git a/extensions/tlon/src/monitor/settings-helpers.ts b/native-plugins/tlon/src/monitor/settings-helpers.ts similarity index 100% rename from extensions/tlon/src/monitor/settings-helpers.ts rename to native-plugins/tlon/src/monitor/settings-helpers.ts diff --git a/extensions/tlon/src/monitor/utils.ts b/native-plugins/tlon/src/monitor/utils.ts similarity index 100% rename from extensions/tlon/src/monitor/utils.ts rename to native-plugins/tlon/src/monitor/utils.ts diff --git a/extensions/tlon/src/runtime.ts b/native-plugins/tlon/src/runtime.ts similarity index 100% rename from extensions/tlon/src/runtime.ts rename to native-plugins/tlon/src/runtime.ts diff --git a/extensions/tlon/src/security.test.ts b/native-plugins/tlon/src/security.test.ts similarity index 100% rename from extensions/tlon/src/security.test.ts rename to native-plugins/tlon/src/security.test.ts diff --git a/extensions/tlon/src/session-route.ts b/native-plugins/tlon/src/session-route.ts similarity index 100% rename from extensions/tlon/src/session-route.ts rename to native-plugins/tlon/src/session-route.ts diff --git a/extensions/tlon/src/settings.ts b/native-plugins/tlon/src/settings.ts similarity index 100% rename from extensions/tlon/src/settings.ts rename to native-plugins/tlon/src/settings.ts diff --git a/extensions/tlon/src/setup-core.ts b/native-plugins/tlon/src/setup-core.ts similarity index 100% rename from extensions/tlon/src/setup-core.ts rename to native-plugins/tlon/src/setup-core.ts diff --git a/extensions/tlon/src/setup-surface.test.ts b/native-plugins/tlon/src/setup-surface.test.ts similarity index 94% rename from extensions/tlon/src/setup-surface.test.ts rename to native-plugins/tlon/src/setup-surface.test.ts index a193f9ca800..35b3b930500 100644 --- a/extensions/tlon/src/setup-surface.test.ts +++ b/native-plugins/tlon/src/setup-surface.test.ts @@ -1,10 +1,10 @@ import { describe, expect, it, vi } from "vitest"; import { buildChannelSetupWizardAdapterFromSetupWizard } from "../../../src/channels/plugins/setup-wizard.js"; -import { createRuntimeEnv } from "../../../test/helpers/extensions/runtime-env.js"; +import { createRuntimeEnv } from "../../../test/helpers/native-plugins/runtime-env.js"; import { createTestWizardPrompter, type WizardPrompter, -} from "../../../test/helpers/extensions/setup-wizard.js"; +} from "../../../test/helpers/native-plugins/setup-wizard.js"; import type { OpenClawConfig, RuntimeEnv } from "../api.js"; import { tlonPlugin } from "./channel.js"; diff --git a/extensions/tlon/src/setup-surface.ts b/native-plugins/tlon/src/setup-surface.ts similarity index 100% rename from extensions/tlon/src/setup-surface.ts rename to native-plugins/tlon/src/setup-surface.ts diff --git a/extensions/tlon/src/targets.test.ts b/native-plugins/tlon/src/targets.test.ts similarity index 100% rename from extensions/tlon/src/targets.test.ts rename to native-plugins/tlon/src/targets.test.ts diff --git a/extensions/tlon/src/targets.ts b/native-plugins/tlon/src/targets.ts similarity index 100% rename from extensions/tlon/src/targets.ts rename to native-plugins/tlon/src/targets.ts diff --git a/extensions/tlon/src/tlon-api.ts b/native-plugins/tlon/src/tlon-api.ts similarity index 100% rename from extensions/tlon/src/tlon-api.ts rename to native-plugins/tlon/src/tlon-api.ts diff --git a/extensions/tlon/src/types.ts b/native-plugins/tlon/src/types.ts similarity index 100% rename from extensions/tlon/src/types.ts rename to native-plugins/tlon/src/types.ts diff --git a/extensions/tlon/src/urbit/auth.ssrf.test.ts b/native-plugins/tlon/src/urbit/auth.ssrf.test.ts similarity index 100% rename from extensions/tlon/src/urbit/auth.ssrf.test.ts rename to native-plugins/tlon/src/urbit/auth.ssrf.test.ts diff --git a/extensions/tlon/src/urbit/auth.ts b/native-plugins/tlon/src/urbit/auth.ts similarity index 100% rename from extensions/tlon/src/urbit/auth.ts rename to native-plugins/tlon/src/urbit/auth.ts diff --git a/extensions/tlon/src/urbit/base-url.test.ts b/native-plugins/tlon/src/urbit/base-url.test.ts similarity index 100% rename from extensions/tlon/src/urbit/base-url.test.ts rename to native-plugins/tlon/src/urbit/base-url.test.ts diff --git a/extensions/tlon/src/urbit/base-url.ts b/native-plugins/tlon/src/urbit/base-url.ts similarity index 100% rename from extensions/tlon/src/urbit/base-url.ts rename to native-plugins/tlon/src/urbit/base-url.ts diff --git a/extensions/tlon/src/urbit/channel-ops.ts b/native-plugins/tlon/src/urbit/channel-ops.ts similarity index 100% rename from extensions/tlon/src/urbit/channel-ops.ts rename to native-plugins/tlon/src/urbit/channel-ops.ts diff --git a/extensions/tlon/src/urbit/context.ts b/native-plugins/tlon/src/urbit/context.ts similarity index 100% rename from extensions/tlon/src/urbit/context.ts rename to native-plugins/tlon/src/urbit/context.ts diff --git a/extensions/tlon/src/urbit/errors.ts b/native-plugins/tlon/src/urbit/errors.ts similarity index 100% rename from extensions/tlon/src/urbit/errors.ts rename to native-plugins/tlon/src/urbit/errors.ts diff --git a/extensions/tlon/src/urbit/fetch.ts b/native-plugins/tlon/src/urbit/fetch.ts similarity index 100% rename from extensions/tlon/src/urbit/fetch.ts rename to native-plugins/tlon/src/urbit/fetch.ts diff --git a/extensions/tlon/src/urbit/foreigns.ts b/native-plugins/tlon/src/urbit/foreigns.ts similarity index 100% rename from extensions/tlon/src/urbit/foreigns.ts rename to native-plugins/tlon/src/urbit/foreigns.ts diff --git a/extensions/tlon/src/urbit/send.test.ts b/native-plugins/tlon/src/urbit/send.test.ts similarity index 100% rename from extensions/tlon/src/urbit/send.test.ts rename to native-plugins/tlon/src/urbit/send.test.ts diff --git a/extensions/tlon/src/urbit/send.ts b/native-plugins/tlon/src/urbit/send.ts similarity index 100% rename from extensions/tlon/src/urbit/send.ts rename to native-plugins/tlon/src/urbit/send.ts diff --git a/extensions/tlon/src/urbit/sse-client.test.ts b/native-plugins/tlon/src/urbit/sse-client.test.ts similarity index 100% rename from extensions/tlon/src/urbit/sse-client.test.ts rename to native-plugins/tlon/src/urbit/sse-client.test.ts diff --git a/extensions/tlon/src/urbit/sse-client.ts b/native-plugins/tlon/src/urbit/sse-client.ts similarity index 100% rename from extensions/tlon/src/urbit/sse-client.ts rename to native-plugins/tlon/src/urbit/sse-client.ts diff --git a/extensions/tlon/src/urbit/story.ts b/native-plugins/tlon/src/urbit/story.ts similarity index 100% rename from extensions/tlon/src/urbit/story.ts rename to native-plugins/tlon/src/urbit/story.ts diff --git a/extensions/tlon/src/urbit/upload.test.ts b/native-plugins/tlon/src/urbit/upload.test.ts similarity index 100% rename from extensions/tlon/src/urbit/upload.test.ts rename to native-plugins/tlon/src/urbit/upload.test.ts diff --git a/extensions/tlon/src/urbit/upload.ts b/native-plugins/tlon/src/urbit/upload.ts similarity index 100% rename from extensions/tlon/src/urbit/upload.ts rename to native-plugins/tlon/src/urbit/upload.ts diff --git a/extensions/together/index.ts b/native-plugins/together/index.ts similarity index 100% rename from extensions/together/index.ts rename to native-plugins/together/index.ts diff --git a/extensions/together/onboard.ts b/native-plugins/together/onboard.ts similarity index 100% rename from extensions/together/onboard.ts rename to native-plugins/together/onboard.ts diff --git a/extensions/together/openclaw.plugin.json b/native-plugins/together/openclaw.plugin.json similarity index 100% rename from extensions/together/openclaw.plugin.json rename to native-plugins/together/openclaw.plugin.json diff --git a/extensions/together/package.json b/native-plugins/together/package.json similarity index 91% rename from extensions/together/package.json rename to native-plugins/together/package.json index 982a0a03734..a3301e94268 100644 --- a/extensions/together/package.json +++ b/native-plugins/together/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Together provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/together/provider-catalog.ts b/native-plugins/together/provider-catalog.ts similarity index 100% rename from extensions/together/provider-catalog.ts rename to native-plugins/together/provider-catalog.ts diff --git a/extensions/twitch/CHANGELOG.md b/native-plugins/twitch/CHANGELOG.md similarity index 100% rename from extensions/twitch/CHANGELOG.md rename to native-plugins/twitch/CHANGELOG.md diff --git a/extensions/twitch/README.md b/native-plugins/twitch/README.md similarity index 97% rename from extensions/twitch/README.md rename to native-plugins/twitch/README.md index 2043094f760..bb36358da7e 100644 --- a/extensions/twitch/README.md +++ b/native-plugins/twitch/README.md @@ -5,7 +5,7 @@ Twitch channel plugin for OpenClaw. ## Install (local checkout) ```bash -openclaw plugins install ./extensions/twitch +openclaw plugins install ./native-plugins/twitch ``` ## Install (npm) diff --git a/extensions/twitch/api.ts b/native-plugins/twitch/api.ts similarity index 100% rename from extensions/twitch/api.ts rename to native-plugins/twitch/api.ts diff --git a/extensions/twitch/index.ts b/native-plugins/twitch/index.ts similarity index 100% rename from extensions/twitch/index.ts rename to native-plugins/twitch/index.ts diff --git a/extensions/twitch/openclaw.plugin.json b/native-plugins/twitch/openclaw.plugin.json similarity index 100% rename from extensions/twitch/openclaw.plugin.json rename to native-plugins/twitch/openclaw.plugin.json diff --git a/extensions/twitch/package.json b/native-plugins/twitch/package.json similarity index 96% rename from extensions/twitch/package.json rename to native-plugins/twitch/package.json index 6288b6fa2bb..73e76841120 100644 --- a/extensions/twitch/package.json +++ b/native-plugins/twitch/package.json @@ -10,7 +10,7 @@ "zod": "^4.3.6" }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ], "channel": { diff --git a/extensions/twitch/runtime-api.ts b/native-plugins/twitch/runtime-api.ts similarity index 100% rename from extensions/twitch/runtime-api.ts rename to native-plugins/twitch/runtime-api.ts diff --git a/extensions/twitch/src/access-control.test.ts b/native-plugins/twitch/src/access-control.test.ts similarity index 100% rename from extensions/twitch/src/access-control.test.ts rename to native-plugins/twitch/src/access-control.test.ts diff --git a/extensions/twitch/src/access-control.ts b/native-plugins/twitch/src/access-control.ts similarity index 100% rename from extensions/twitch/src/access-control.ts rename to native-plugins/twitch/src/access-control.ts diff --git a/extensions/twitch/src/actions.ts b/native-plugins/twitch/src/actions.ts similarity index 100% rename from extensions/twitch/src/actions.ts rename to native-plugins/twitch/src/actions.ts diff --git a/extensions/twitch/src/client-manager-registry.ts b/native-plugins/twitch/src/client-manager-registry.ts similarity index 100% rename from extensions/twitch/src/client-manager-registry.ts rename to native-plugins/twitch/src/client-manager-registry.ts diff --git a/extensions/twitch/src/config-schema.ts b/native-plugins/twitch/src/config-schema.ts similarity index 100% rename from extensions/twitch/src/config-schema.ts rename to native-plugins/twitch/src/config-schema.ts diff --git a/extensions/twitch/src/config.test.ts b/native-plugins/twitch/src/config.test.ts similarity index 100% rename from extensions/twitch/src/config.test.ts rename to native-plugins/twitch/src/config.test.ts diff --git a/extensions/twitch/src/config.ts b/native-plugins/twitch/src/config.ts similarity index 100% rename from extensions/twitch/src/config.ts rename to native-plugins/twitch/src/config.ts diff --git a/extensions/twitch/src/monitor.ts b/native-plugins/twitch/src/monitor.ts similarity index 100% rename from extensions/twitch/src/monitor.ts rename to native-plugins/twitch/src/monitor.ts diff --git a/extensions/twitch/src/outbound.test.ts b/native-plugins/twitch/src/outbound.test.ts similarity index 100% rename from extensions/twitch/src/outbound.test.ts rename to native-plugins/twitch/src/outbound.test.ts diff --git a/extensions/twitch/src/outbound.ts b/native-plugins/twitch/src/outbound.ts similarity index 100% rename from extensions/twitch/src/outbound.ts rename to native-plugins/twitch/src/outbound.ts diff --git a/extensions/twitch/src/plugin.test.ts b/native-plugins/twitch/src/plugin.test.ts similarity index 100% rename from extensions/twitch/src/plugin.test.ts rename to native-plugins/twitch/src/plugin.test.ts diff --git a/extensions/twitch/src/plugin.ts b/native-plugins/twitch/src/plugin.ts similarity index 99% rename from extensions/twitch/src/plugin.ts rename to native-plugins/twitch/src/plugin.ts index eb2513ca69e..b0f883f452c 100644 --- a/extensions/twitch/src/plugin.ts +++ b/native-plugins/twitch/src/plugin.ts @@ -5,7 +5,7 @@ * This is the primary entry point for the Twitch channel integration. */ -import { buildPassiveProbedChannelStatusSummary } from "openclaw/plugin-sdk/extension-shared"; +import { buildPassiveProbedChannelStatusSummary } from "openclaw/plugin-sdk/native-plugin-shared"; import type { OpenClawConfig } from "../api.js"; import { buildChannelConfigSchema } from "../api.js"; import { twitchMessageActions } from "./actions.js"; diff --git a/extensions/twitch/src/probe.test.ts b/native-plugins/twitch/src/probe.test.ts similarity index 100% rename from extensions/twitch/src/probe.test.ts rename to native-plugins/twitch/src/probe.test.ts diff --git a/extensions/twitch/src/probe.ts b/native-plugins/twitch/src/probe.ts similarity index 100% rename from extensions/twitch/src/probe.ts rename to native-plugins/twitch/src/probe.ts diff --git a/extensions/twitch/src/resolver.ts b/native-plugins/twitch/src/resolver.ts similarity index 100% rename from extensions/twitch/src/resolver.ts rename to native-plugins/twitch/src/resolver.ts diff --git a/extensions/twitch/src/runtime.ts b/native-plugins/twitch/src/runtime.ts similarity index 100% rename from extensions/twitch/src/runtime.ts rename to native-plugins/twitch/src/runtime.ts diff --git a/extensions/twitch/src/send.test.ts b/native-plugins/twitch/src/send.test.ts similarity index 100% rename from extensions/twitch/src/send.test.ts rename to native-plugins/twitch/src/send.test.ts diff --git a/extensions/twitch/src/send.ts b/native-plugins/twitch/src/send.ts similarity index 100% rename from extensions/twitch/src/send.ts rename to native-plugins/twitch/src/send.ts diff --git a/extensions/twitch/src/setup-surface.test.ts b/native-plugins/twitch/src/setup-surface.test.ts similarity index 100% rename from extensions/twitch/src/setup-surface.test.ts rename to native-plugins/twitch/src/setup-surface.test.ts diff --git a/extensions/twitch/src/setup-surface.ts b/native-plugins/twitch/src/setup-surface.ts similarity index 100% rename from extensions/twitch/src/setup-surface.ts rename to native-plugins/twitch/src/setup-surface.ts diff --git a/extensions/twitch/src/status.test.ts b/native-plugins/twitch/src/status.test.ts similarity index 100% rename from extensions/twitch/src/status.test.ts rename to native-plugins/twitch/src/status.test.ts diff --git a/extensions/twitch/src/status.ts b/native-plugins/twitch/src/status.ts similarity index 100% rename from extensions/twitch/src/status.ts rename to native-plugins/twitch/src/status.ts diff --git a/extensions/twitch/src/test-fixtures.ts b/native-plugins/twitch/src/test-fixtures.ts similarity index 100% rename from extensions/twitch/src/test-fixtures.ts rename to native-plugins/twitch/src/test-fixtures.ts diff --git a/extensions/twitch/src/token.test.ts b/native-plugins/twitch/src/token.test.ts similarity index 100% rename from extensions/twitch/src/token.test.ts rename to native-plugins/twitch/src/token.test.ts diff --git a/extensions/twitch/src/token.ts b/native-plugins/twitch/src/token.ts similarity index 100% rename from extensions/twitch/src/token.ts rename to native-plugins/twitch/src/token.ts diff --git a/extensions/twitch/src/twitch-client.test.ts b/native-plugins/twitch/src/twitch-client.test.ts similarity index 100% rename from extensions/twitch/src/twitch-client.test.ts rename to native-plugins/twitch/src/twitch-client.test.ts diff --git a/extensions/twitch/src/twitch-client.ts b/native-plugins/twitch/src/twitch-client.ts similarity index 100% rename from extensions/twitch/src/twitch-client.ts rename to native-plugins/twitch/src/twitch-client.ts diff --git a/extensions/twitch/src/types.ts b/native-plugins/twitch/src/types.ts similarity index 100% rename from extensions/twitch/src/types.ts rename to native-plugins/twitch/src/types.ts diff --git a/extensions/twitch/src/utils/markdown.ts b/native-plugins/twitch/src/utils/markdown.ts similarity index 100% rename from extensions/twitch/src/utils/markdown.ts rename to native-plugins/twitch/src/utils/markdown.ts diff --git a/extensions/twitch/src/utils/twitch.ts b/native-plugins/twitch/src/utils/twitch.ts similarity index 100% rename from extensions/twitch/src/utils/twitch.ts rename to native-plugins/twitch/src/utils/twitch.ts diff --git a/extensions/twitch/test/setup.ts b/native-plugins/twitch/test/setup.ts similarity index 100% rename from extensions/twitch/test/setup.ts rename to native-plugins/twitch/test/setup.ts diff --git a/extensions/venice/index.ts b/native-plugins/venice/index.ts similarity index 100% rename from extensions/venice/index.ts rename to native-plugins/venice/index.ts diff --git a/extensions/venice/onboard.ts b/native-plugins/venice/onboard.ts similarity index 100% rename from extensions/venice/onboard.ts rename to native-plugins/venice/onboard.ts diff --git a/extensions/venice/openclaw.plugin.json b/native-plugins/venice/openclaw.plugin.json similarity index 100% rename from extensions/venice/openclaw.plugin.json rename to native-plugins/venice/openclaw.plugin.json diff --git a/extensions/venice/package.json b/native-plugins/venice/package.json similarity index 91% rename from extensions/venice/package.json rename to native-plugins/venice/package.json index 1fa9b083088..51c6e97edfe 100644 --- a/extensions/venice/package.json +++ b/native-plugins/venice/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Venice provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/venice/provider-catalog.ts b/native-plugins/venice/provider-catalog.ts similarity index 100% rename from extensions/venice/provider-catalog.ts rename to native-plugins/venice/provider-catalog.ts diff --git a/extensions/vercel-ai-gateway/index.ts b/native-plugins/vercel-ai-gateway/index.ts similarity index 100% rename from extensions/vercel-ai-gateway/index.ts rename to native-plugins/vercel-ai-gateway/index.ts diff --git a/extensions/vercel-ai-gateway/onboard.ts b/native-plugins/vercel-ai-gateway/onboard.ts similarity index 100% rename from extensions/vercel-ai-gateway/onboard.ts rename to native-plugins/vercel-ai-gateway/onboard.ts diff --git a/extensions/vercel-ai-gateway/openclaw.plugin.json b/native-plugins/vercel-ai-gateway/openclaw.plugin.json similarity index 100% rename from extensions/vercel-ai-gateway/openclaw.plugin.json rename to native-plugins/vercel-ai-gateway/openclaw.plugin.json diff --git a/extensions/vercel-ai-gateway/package.json b/native-plugins/vercel-ai-gateway/package.json similarity index 91% rename from extensions/vercel-ai-gateway/package.json rename to native-plugins/vercel-ai-gateway/package.json index c81a82e40c0..510316f4405 100644 --- a/extensions/vercel-ai-gateway/package.json +++ b/native-plugins/vercel-ai-gateway/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Vercel AI Gateway provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/vercel-ai-gateway/provider-catalog.ts b/native-plugins/vercel-ai-gateway/provider-catalog.ts similarity index 100% rename from extensions/vercel-ai-gateway/provider-catalog.ts rename to native-plugins/vercel-ai-gateway/provider-catalog.ts diff --git a/extensions/vllm/README.md b/native-plugins/vllm/README.md similarity index 100% rename from extensions/vllm/README.md rename to native-plugins/vllm/README.md diff --git a/extensions/vllm/index.ts b/native-plugins/vllm/index.ts similarity index 100% rename from extensions/vllm/index.ts rename to native-plugins/vllm/index.ts diff --git a/extensions/vllm/openclaw.plugin.json b/native-plugins/vllm/openclaw.plugin.json similarity index 100% rename from extensions/vllm/openclaw.plugin.json rename to native-plugins/vllm/openclaw.plugin.json diff --git a/extensions/vllm/package.json b/native-plugins/vllm/package.json similarity index 90% rename from extensions/vllm/package.json rename to native-plugins/vllm/package.json index bb293610355..6fa75b9c75c 100644 --- a/extensions/vllm/package.json +++ b/native-plugins/vllm/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw vLLM provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/voice-call/CHANGELOG.md b/native-plugins/voice-call/CHANGELOG.md similarity index 100% rename from extensions/voice-call/CHANGELOG.md rename to native-plugins/voice-call/CHANGELOG.md diff --git a/extensions/voice-call/README.md b/native-plugins/voice-call/README.md similarity index 96% rename from extensions/voice-call/README.md rename to native-plugins/voice-call/README.md index 36ab127875e..43d073208ac 100644 --- a/extensions/voice-call/README.md +++ b/native-plugins/voice-call/README.md @@ -25,9 +25,9 @@ Restart the Gateway afterwards. ### Option B: copy into your global extensions folder (dev) ```bash -mkdir -p ~/.openclaw/extensions -cp -R extensions/voice-call ~/.openclaw/extensions/voice-call -cd ~/.openclaw/extensions/voice-call && pnpm install +mkdir -p ~/.openclaw/plugins +cp -R native-plugins/voice-call ~/.openclaw/plugins/voice-call +cd ~/.openclaw/plugins/voice-call && pnpm install ``` ## Config diff --git a/extensions/voice-call/api.ts b/native-plugins/voice-call/api.ts similarity index 100% rename from extensions/voice-call/api.ts rename to native-plugins/voice-call/api.ts diff --git a/extensions/voice-call/index.ts b/native-plugins/voice-call/index.ts similarity index 100% rename from extensions/voice-call/index.ts rename to native-plugins/voice-call/index.ts diff --git a/extensions/voice-call/openclaw.plugin.json b/native-plugins/voice-call/openclaw.plugin.json similarity index 100% rename from extensions/voice-call/openclaw.plugin.json rename to native-plugins/voice-call/openclaw.plugin.json diff --git a/extensions/voice-call/package.json b/native-plugins/voice-call/package.json similarity index 94% rename from extensions/voice-call/package.json rename to native-plugins/voice-call/package.json index eac88a77d10..24cc8b734fd 100644 --- a/extensions/voice-call/package.json +++ b/native-plugins/voice-call/package.json @@ -10,7 +10,7 @@ "zod": "^4.3.6" }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ], "release": { diff --git a/extensions/voice-call/src/allowlist.ts b/native-plugins/voice-call/src/allowlist.ts similarity index 100% rename from extensions/voice-call/src/allowlist.ts rename to native-plugins/voice-call/src/allowlist.ts diff --git a/extensions/voice-call/src/cli.ts b/native-plugins/voice-call/src/cli.ts similarity index 100% rename from extensions/voice-call/src/cli.ts rename to native-plugins/voice-call/src/cli.ts diff --git a/extensions/voice-call/src/config.test.ts b/native-plugins/voice-call/src/config.test.ts similarity index 100% rename from extensions/voice-call/src/config.test.ts rename to native-plugins/voice-call/src/config.test.ts diff --git a/extensions/voice-call/src/config.ts b/native-plugins/voice-call/src/config.ts similarity index 100% rename from extensions/voice-call/src/config.ts rename to native-plugins/voice-call/src/config.ts diff --git a/extensions/voice-call/src/core-bridge.ts b/native-plugins/voice-call/src/core-bridge.ts similarity index 100% rename from extensions/voice-call/src/core-bridge.ts rename to native-plugins/voice-call/src/core-bridge.ts diff --git a/extensions/voice-call/src/deep-merge.ts b/native-plugins/voice-call/src/deep-merge.ts similarity index 100% rename from extensions/voice-call/src/deep-merge.ts rename to native-plugins/voice-call/src/deep-merge.ts diff --git a/extensions/voice-call/src/http-headers.test.ts b/native-plugins/voice-call/src/http-headers.test.ts similarity index 100% rename from extensions/voice-call/src/http-headers.test.ts rename to native-plugins/voice-call/src/http-headers.test.ts diff --git a/extensions/voice-call/src/http-headers.ts b/native-plugins/voice-call/src/http-headers.ts similarity index 100% rename from extensions/voice-call/src/http-headers.ts rename to native-plugins/voice-call/src/http-headers.ts diff --git a/extensions/voice-call/src/manager.closed-loop.test.ts b/native-plugins/voice-call/src/manager.closed-loop.test.ts similarity index 100% rename from extensions/voice-call/src/manager.closed-loop.test.ts rename to native-plugins/voice-call/src/manager.closed-loop.test.ts diff --git a/extensions/voice-call/src/manager.inbound-allowlist.test.ts b/native-plugins/voice-call/src/manager.inbound-allowlist.test.ts similarity index 100% rename from extensions/voice-call/src/manager.inbound-allowlist.test.ts rename to native-plugins/voice-call/src/manager.inbound-allowlist.test.ts diff --git a/extensions/voice-call/src/manager.notify.test.ts b/native-plugins/voice-call/src/manager.notify.test.ts similarity index 100% rename from extensions/voice-call/src/manager.notify.test.ts rename to native-plugins/voice-call/src/manager.notify.test.ts diff --git a/extensions/voice-call/src/manager.restore.test.ts b/native-plugins/voice-call/src/manager.restore.test.ts similarity index 100% rename from extensions/voice-call/src/manager.restore.test.ts rename to native-plugins/voice-call/src/manager.restore.test.ts diff --git a/extensions/voice-call/src/manager.test-harness.ts b/native-plugins/voice-call/src/manager.test-harness.ts similarity index 100% rename from extensions/voice-call/src/manager.test-harness.ts rename to native-plugins/voice-call/src/manager.test-harness.ts diff --git a/extensions/voice-call/src/manager.ts b/native-plugins/voice-call/src/manager.ts similarity index 100% rename from extensions/voice-call/src/manager.ts rename to native-plugins/voice-call/src/manager.ts diff --git a/extensions/voice-call/src/manager/context.ts b/native-plugins/voice-call/src/manager/context.ts similarity index 100% rename from extensions/voice-call/src/manager/context.ts rename to native-plugins/voice-call/src/manager/context.ts diff --git a/extensions/voice-call/src/manager/events.test.ts b/native-plugins/voice-call/src/manager/events.test.ts similarity index 100% rename from extensions/voice-call/src/manager/events.test.ts rename to native-plugins/voice-call/src/manager/events.test.ts diff --git a/extensions/voice-call/src/manager/events.ts b/native-plugins/voice-call/src/manager/events.ts similarity index 100% rename from extensions/voice-call/src/manager/events.ts rename to native-plugins/voice-call/src/manager/events.ts diff --git a/extensions/voice-call/src/manager/lookup.ts b/native-plugins/voice-call/src/manager/lookup.ts similarity index 100% rename from extensions/voice-call/src/manager/lookup.ts rename to native-plugins/voice-call/src/manager/lookup.ts diff --git a/extensions/voice-call/src/manager/outbound.ts b/native-plugins/voice-call/src/manager/outbound.ts similarity index 100% rename from extensions/voice-call/src/manager/outbound.ts rename to native-plugins/voice-call/src/manager/outbound.ts diff --git a/extensions/voice-call/src/manager/state.ts b/native-plugins/voice-call/src/manager/state.ts similarity index 100% rename from extensions/voice-call/src/manager/state.ts rename to native-plugins/voice-call/src/manager/state.ts diff --git a/extensions/voice-call/src/manager/store.ts b/native-plugins/voice-call/src/manager/store.ts similarity index 100% rename from extensions/voice-call/src/manager/store.ts rename to native-plugins/voice-call/src/manager/store.ts diff --git a/extensions/voice-call/src/manager/timers.ts b/native-plugins/voice-call/src/manager/timers.ts similarity index 100% rename from extensions/voice-call/src/manager/timers.ts rename to native-plugins/voice-call/src/manager/timers.ts diff --git a/extensions/voice-call/src/manager/twiml.ts b/native-plugins/voice-call/src/manager/twiml.ts similarity index 100% rename from extensions/voice-call/src/manager/twiml.ts rename to native-plugins/voice-call/src/manager/twiml.ts diff --git a/extensions/voice-call/src/media-stream.test.ts b/native-plugins/voice-call/src/media-stream.test.ts similarity index 100% rename from extensions/voice-call/src/media-stream.test.ts rename to native-plugins/voice-call/src/media-stream.test.ts diff --git a/extensions/voice-call/src/media-stream.ts b/native-plugins/voice-call/src/media-stream.ts similarity index 100% rename from extensions/voice-call/src/media-stream.ts rename to native-plugins/voice-call/src/media-stream.ts diff --git a/extensions/voice-call/src/providers/base.ts b/native-plugins/voice-call/src/providers/base.ts similarity index 100% rename from extensions/voice-call/src/providers/base.ts rename to native-plugins/voice-call/src/providers/base.ts diff --git a/extensions/voice-call/src/providers/index.ts b/native-plugins/voice-call/src/providers/index.ts similarity index 100% rename from extensions/voice-call/src/providers/index.ts rename to native-plugins/voice-call/src/providers/index.ts diff --git a/extensions/voice-call/src/providers/mock.test.ts b/native-plugins/voice-call/src/providers/mock.test.ts similarity index 100% rename from extensions/voice-call/src/providers/mock.test.ts rename to native-plugins/voice-call/src/providers/mock.test.ts diff --git a/extensions/voice-call/src/providers/mock.ts b/native-plugins/voice-call/src/providers/mock.ts similarity index 100% rename from extensions/voice-call/src/providers/mock.ts rename to native-plugins/voice-call/src/providers/mock.ts diff --git a/extensions/voice-call/src/providers/plivo.test.ts b/native-plugins/voice-call/src/providers/plivo.test.ts similarity index 100% rename from extensions/voice-call/src/providers/plivo.test.ts rename to native-plugins/voice-call/src/providers/plivo.test.ts diff --git a/extensions/voice-call/src/providers/plivo.ts b/native-plugins/voice-call/src/providers/plivo.ts similarity index 100% rename from extensions/voice-call/src/providers/plivo.ts rename to native-plugins/voice-call/src/providers/plivo.ts diff --git a/extensions/voice-call/src/providers/shared/call-status.test.ts b/native-plugins/voice-call/src/providers/shared/call-status.test.ts similarity index 100% rename from extensions/voice-call/src/providers/shared/call-status.test.ts rename to native-plugins/voice-call/src/providers/shared/call-status.test.ts diff --git a/extensions/voice-call/src/providers/shared/call-status.ts b/native-plugins/voice-call/src/providers/shared/call-status.ts similarity index 100% rename from extensions/voice-call/src/providers/shared/call-status.ts rename to native-plugins/voice-call/src/providers/shared/call-status.ts diff --git a/extensions/voice-call/src/providers/shared/guarded-json-api.ts b/native-plugins/voice-call/src/providers/shared/guarded-json-api.ts similarity index 100% rename from extensions/voice-call/src/providers/shared/guarded-json-api.ts rename to native-plugins/voice-call/src/providers/shared/guarded-json-api.ts diff --git a/extensions/voice-call/src/providers/stt-openai-realtime.test.ts b/native-plugins/voice-call/src/providers/stt-openai-realtime.test.ts similarity index 100% rename from extensions/voice-call/src/providers/stt-openai-realtime.test.ts rename to native-plugins/voice-call/src/providers/stt-openai-realtime.test.ts diff --git a/extensions/voice-call/src/providers/stt-openai-realtime.ts b/native-plugins/voice-call/src/providers/stt-openai-realtime.ts similarity index 100% rename from extensions/voice-call/src/providers/stt-openai-realtime.ts rename to native-plugins/voice-call/src/providers/stt-openai-realtime.ts diff --git a/extensions/voice-call/src/providers/telnyx.test.ts b/native-plugins/voice-call/src/providers/telnyx.test.ts similarity index 100% rename from extensions/voice-call/src/providers/telnyx.test.ts rename to native-plugins/voice-call/src/providers/telnyx.test.ts diff --git a/extensions/voice-call/src/providers/telnyx.ts b/native-plugins/voice-call/src/providers/telnyx.ts similarity index 100% rename from extensions/voice-call/src/providers/telnyx.ts rename to native-plugins/voice-call/src/providers/telnyx.ts diff --git a/extensions/voice-call/src/providers/tts-openai.test.ts b/native-plugins/voice-call/src/providers/tts-openai.test.ts similarity index 100% rename from extensions/voice-call/src/providers/tts-openai.test.ts rename to native-plugins/voice-call/src/providers/tts-openai.test.ts diff --git a/extensions/voice-call/src/providers/tts-openai.ts b/native-plugins/voice-call/src/providers/tts-openai.ts similarity index 100% rename from extensions/voice-call/src/providers/tts-openai.ts rename to native-plugins/voice-call/src/providers/tts-openai.ts diff --git a/extensions/voice-call/src/providers/twilio.test.ts b/native-plugins/voice-call/src/providers/twilio.test.ts similarity index 100% rename from extensions/voice-call/src/providers/twilio.test.ts rename to native-plugins/voice-call/src/providers/twilio.test.ts diff --git a/extensions/voice-call/src/providers/twilio.ts b/native-plugins/voice-call/src/providers/twilio.ts similarity index 100% rename from extensions/voice-call/src/providers/twilio.ts rename to native-plugins/voice-call/src/providers/twilio.ts diff --git a/extensions/voice-call/src/providers/twilio/api.ts b/native-plugins/voice-call/src/providers/twilio/api.ts similarity index 100% rename from extensions/voice-call/src/providers/twilio/api.ts rename to native-plugins/voice-call/src/providers/twilio/api.ts diff --git a/extensions/voice-call/src/providers/twilio/twiml-policy.test.ts b/native-plugins/voice-call/src/providers/twilio/twiml-policy.test.ts similarity index 100% rename from extensions/voice-call/src/providers/twilio/twiml-policy.test.ts rename to native-plugins/voice-call/src/providers/twilio/twiml-policy.test.ts diff --git a/extensions/voice-call/src/providers/twilio/twiml-policy.ts b/native-plugins/voice-call/src/providers/twilio/twiml-policy.ts similarity index 100% rename from extensions/voice-call/src/providers/twilio/twiml-policy.ts rename to native-plugins/voice-call/src/providers/twilio/twiml-policy.ts diff --git a/extensions/voice-call/src/providers/twilio/webhook.ts b/native-plugins/voice-call/src/providers/twilio/webhook.ts similarity index 100% rename from extensions/voice-call/src/providers/twilio/webhook.ts rename to native-plugins/voice-call/src/providers/twilio/webhook.ts diff --git a/extensions/voice-call/src/response-generator.ts b/native-plugins/voice-call/src/response-generator.ts similarity index 100% rename from extensions/voice-call/src/response-generator.ts rename to native-plugins/voice-call/src/response-generator.ts diff --git a/extensions/voice-call/src/runtime.test.ts b/native-plugins/voice-call/src/runtime.test.ts similarity index 100% rename from extensions/voice-call/src/runtime.test.ts rename to native-plugins/voice-call/src/runtime.test.ts diff --git a/extensions/voice-call/src/runtime.ts b/native-plugins/voice-call/src/runtime.ts similarity index 100% rename from extensions/voice-call/src/runtime.ts rename to native-plugins/voice-call/src/runtime.ts diff --git a/extensions/voice-call/src/telephony-audio.ts b/native-plugins/voice-call/src/telephony-audio.ts similarity index 100% rename from extensions/voice-call/src/telephony-audio.ts rename to native-plugins/voice-call/src/telephony-audio.ts diff --git a/extensions/voice-call/src/telephony-tts.test.ts b/native-plugins/voice-call/src/telephony-tts.test.ts similarity index 100% rename from extensions/voice-call/src/telephony-tts.test.ts rename to native-plugins/voice-call/src/telephony-tts.test.ts diff --git a/extensions/voice-call/src/telephony-tts.ts b/native-plugins/voice-call/src/telephony-tts.ts similarity index 100% rename from extensions/voice-call/src/telephony-tts.ts rename to native-plugins/voice-call/src/telephony-tts.ts diff --git a/extensions/voice-call/src/test-fixtures.ts b/native-plugins/voice-call/src/test-fixtures.ts similarity index 100% rename from extensions/voice-call/src/test-fixtures.ts rename to native-plugins/voice-call/src/test-fixtures.ts diff --git a/extensions/voice-call/src/tunnel.ts b/native-plugins/voice-call/src/tunnel.ts similarity index 100% rename from extensions/voice-call/src/tunnel.ts rename to native-plugins/voice-call/src/tunnel.ts diff --git a/extensions/voice-call/src/types.ts b/native-plugins/voice-call/src/types.ts similarity index 100% rename from extensions/voice-call/src/types.ts rename to native-plugins/voice-call/src/types.ts diff --git a/extensions/voice-call/src/utils.ts b/native-plugins/voice-call/src/utils.ts similarity index 100% rename from extensions/voice-call/src/utils.ts rename to native-plugins/voice-call/src/utils.ts diff --git a/extensions/voice-call/src/voice-mapping.ts b/native-plugins/voice-call/src/voice-mapping.ts similarity index 100% rename from extensions/voice-call/src/voice-mapping.ts rename to native-plugins/voice-call/src/voice-mapping.ts diff --git a/extensions/voice-call/src/webhook-security.test.ts b/native-plugins/voice-call/src/webhook-security.test.ts similarity index 100% rename from extensions/voice-call/src/webhook-security.test.ts rename to native-plugins/voice-call/src/webhook-security.test.ts diff --git a/extensions/voice-call/src/webhook-security.ts b/native-plugins/voice-call/src/webhook-security.ts similarity index 100% rename from extensions/voice-call/src/webhook-security.ts rename to native-plugins/voice-call/src/webhook-security.ts diff --git a/extensions/voice-call/src/webhook.hangup-once.lifecycle.test.ts b/native-plugins/voice-call/src/webhook.hangup-once.lifecycle.test.ts similarity index 100% rename from extensions/voice-call/src/webhook.hangup-once.lifecycle.test.ts rename to native-plugins/voice-call/src/webhook.hangup-once.lifecycle.test.ts diff --git a/extensions/voice-call/src/webhook.test.ts b/native-plugins/voice-call/src/webhook.test.ts similarity index 100% rename from extensions/voice-call/src/webhook.test.ts rename to native-plugins/voice-call/src/webhook.test.ts diff --git a/extensions/voice-call/src/webhook.ts b/native-plugins/voice-call/src/webhook.ts similarity index 100% rename from extensions/voice-call/src/webhook.ts rename to native-plugins/voice-call/src/webhook.ts diff --git a/extensions/voice-call/src/webhook/stale-call-reaper.ts b/native-plugins/voice-call/src/webhook/stale-call-reaper.ts similarity index 100% rename from extensions/voice-call/src/webhook/stale-call-reaper.ts rename to native-plugins/voice-call/src/webhook/stale-call-reaper.ts diff --git a/extensions/voice-call/src/webhook/tailscale.ts b/native-plugins/voice-call/src/webhook/tailscale.ts similarity index 100% rename from extensions/voice-call/src/webhook/tailscale.ts rename to native-plugins/voice-call/src/webhook/tailscale.ts diff --git a/extensions/volcengine/index.ts b/native-plugins/volcengine/index.ts similarity index 100% rename from extensions/volcengine/index.ts rename to native-plugins/volcengine/index.ts diff --git a/extensions/volcengine/openclaw.plugin.json b/native-plugins/volcengine/openclaw.plugin.json similarity index 100% rename from extensions/volcengine/openclaw.plugin.json rename to native-plugins/volcengine/openclaw.plugin.json diff --git a/extensions/volcengine/package.json b/native-plugins/volcengine/package.json similarity index 91% rename from extensions/volcengine/package.json rename to native-plugins/volcengine/package.json index 5e65f3522ae..bb5ddbaf356 100644 --- a/extensions/volcengine/package.json +++ b/native-plugins/volcengine/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Volcengine provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/volcengine/provider-catalog.ts b/native-plugins/volcengine/provider-catalog.ts similarity index 100% rename from extensions/volcengine/provider-catalog.ts rename to native-plugins/volcengine/provider-catalog.ts diff --git a/extensions/whatsapp/action-runtime-api.ts b/native-plugins/whatsapp/action-runtime-api.ts similarity index 100% rename from extensions/whatsapp/action-runtime-api.ts rename to native-plugins/whatsapp/action-runtime-api.ts diff --git a/extensions/whatsapp/action-runtime.runtime.ts b/native-plugins/whatsapp/action-runtime.runtime.ts similarity index 100% rename from extensions/whatsapp/action-runtime.runtime.ts rename to native-plugins/whatsapp/action-runtime.runtime.ts diff --git a/extensions/whatsapp/api.ts b/native-plugins/whatsapp/api.ts similarity index 100% rename from extensions/whatsapp/api.ts rename to native-plugins/whatsapp/api.ts diff --git a/extensions/whatsapp/index.ts b/native-plugins/whatsapp/index.ts similarity index 100% rename from extensions/whatsapp/index.ts rename to native-plugins/whatsapp/index.ts diff --git a/extensions/whatsapp/light-runtime-api.ts b/native-plugins/whatsapp/light-runtime-api.ts similarity index 100% rename from extensions/whatsapp/light-runtime-api.ts rename to native-plugins/whatsapp/light-runtime-api.ts diff --git a/extensions/whatsapp/login-qr-api.ts b/native-plugins/whatsapp/login-qr-api.ts similarity index 100% rename from extensions/whatsapp/login-qr-api.ts rename to native-plugins/whatsapp/login-qr-api.ts diff --git a/extensions/whatsapp/openclaw.plugin.json b/native-plugins/whatsapp/openclaw.plugin.json similarity index 100% rename from extensions/whatsapp/openclaw.plugin.json rename to native-plugins/whatsapp/openclaw.plugin.json diff --git a/extensions/whatsapp/package.json b/native-plugins/whatsapp/package.json similarity index 92% rename from extensions/whatsapp/package.json rename to native-plugins/whatsapp/package.json index 5067598a61f..d586ca0d82b 100644 --- a/extensions/whatsapp/package.json +++ b/native-plugins/whatsapp/package.json @@ -7,7 +7,7 @@ "@whiskeysockets/baileys": "7.0.0-rc.9" }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ], "setupEntry": "./setup-entry.ts", @@ -23,7 +23,7 @@ }, "install": { "npmSpec": "@openclaw/whatsapp", - "localPath": "extensions/whatsapp", + "localPath": "native-plugins/whatsapp", "defaultChoice": "npm" }, "release": { diff --git a/extensions/whatsapp/runtime-api.ts b/native-plugins/whatsapp/runtime-api.ts similarity index 100% rename from extensions/whatsapp/runtime-api.ts rename to native-plugins/whatsapp/runtime-api.ts diff --git a/extensions/whatsapp/setup-entry.ts b/native-plugins/whatsapp/setup-entry.ts similarity index 100% rename from extensions/whatsapp/setup-entry.ts rename to native-plugins/whatsapp/setup-entry.ts diff --git a/extensions/whatsapp/src/accounts.test.ts b/native-plugins/whatsapp/src/accounts.test.ts similarity index 100% rename from extensions/whatsapp/src/accounts.test.ts rename to native-plugins/whatsapp/src/accounts.test.ts diff --git a/extensions/whatsapp/src/accounts.ts b/native-plugins/whatsapp/src/accounts.ts similarity index 100% rename from extensions/whatsapp/src/accounts.ts rename to native-plugins/whatsapp/src/accounts.ts diff --git a/extensions/whatsapp/src/accounts.whatsapp-auth.test.ts b/native-plugins/whatsapp/src/accounts.whatsapp-auth.test.ts similarity index 96% rename from extensions/whatsapp/src/accounts.whatsapp-auth.test.ts rename to native-plugins/whatsapp/src/accounts.whatsapp-auth.test.ts index 9926b3c5324..aa6b300c6a3 100644 --- a/extensions/whatsapp/src/accounts.whatsapp-auth.test.ts +++ b/native-plugins/whatsapp/src/accounts.whatsapp-auth.test.ts @@ -2,7 +2,7 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; -import { captureEnv } from "../../../test/helpers/extensions/env.js"; +import { captureEnv } from "../../../test/helpers/native-plugins/env.js"; import { hasAnyWhatsAppAuth, listWhatsAppAuthDirs } from "./accounts.js"; describe("hasAnyWhatsAppAuth", () => { diff --git a/extensions/whatsapp/src/action-runtime-target-auth.ts b/native-plugins/whatsapp/src/action-runtime-target-auth.ts similarity index 100% rename from extensions/whatsapp/src/action-runtime-target-auth.ts rename to native-plugins/whatsapp/src/action-runtime-target-auth.ts diff --git a/extensions/whatsapp/src/action-runtime.test.ts b/native-plugins/whatsapp/src/action-runtime.test.ts similarity index 100% rename from extensions/whatsapp/src/action-runtime.test.ts rename to native-plugins/whatsapp/src/action-runtime.test.ts diff --git a/extensions/whatsapp/src/action-runtime.ts b/native-plugins/whatsapp/src/action-runtime.ts similarity index 100% rename from extensions/whatsapp/src/action-runtime.ts rename to native-plugins/whatsapp/src/action-runtime.ts diff --git a/extensions/whatsapp/src/active-listener.test.ts b/native-plugins/whatsapp/src/active-listener.test.ts similarity index 100% rename from extensions/whatsapp/src/active-listener.test.ts rename to native-plugins/whatsapp/src/active-listener.test.ts diff --git a/extensions/whatsapp/src/active-listener.ts b/native-plugins/whatsapp/src/active-listener.ts similarity index 100% rename from extensions/whatsapp/src/active-listener.ts rename to native-plugins/whatsapp/src/active-listener.ts diff --git a/extensions/whatsapp/src/agent-tools-login.ts b/native-plugins/whatsapp/src/agent-tools-login.ts similarity index 100% rename from extensions/whatsapp/src/agent-tools-login.ts rename to native-plugins/whatsapp/src/agent-tools-login.ts diff --git a/extensions/whatsapp/src/auth-store.ts b/native-plugins/whatsapp/src/auth-store.ts similarity index 100% rename from extensions/whatsapp/src/auth-store.ts rename to native-plugins/whatsapp/src/auth-store.ts diff --git a/extensions/whatsapp/src/auto-reply.broadcast-groups.combined.test.ts b/native-plugins/whatsapp/src/auto-reply.broadcast-groups.combined.test.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply.broadcast-groups.combined.test.ts rename to native-plugins/whatsapp/src/auto-reply.broadcast-groups.combined.test.ts diff --git a/extensions/whatsapp/src/auto-reply.broadcast-groups.test-harness.ts b/native-plugins/whatsapp/src/auto-reply.broadcast-groups.test-harness.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply.broadcast-groups.test-harness.ts rename to native-plugins/whatsapp/src/auto-reply.broadcast-groups.test-harness.ts diff --git a/extensions/whatsapp/src/auto-reply.impl.ts b/native-plugins/whatsapp/src/auto-reply.impl.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply.impl.ts rename to native-plugins/whatsapp/src/auto-reply.impl.ts diff --git a/extensions/whatsapp/src/auto-reply.test-harness.ts b/native-plugins/whatsapp/src/auto-reply.test-harness.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply.test-harness.ts rename to native-plugins/whatsapp/src/auto-reply.test-harness.ts diff --git a/extensions/whatsapp/src/auto-reply.ts b/native-plugins/whatsapp/src/auto-reply.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply.ts rename to native-plugins/whatsapp/src/auto-reply.ts diff --git a/extensions/whatsapp/src/auto-reply.web-auto-reply.compresses-common-formats-jpeg-cap.test.ts b/native-plugins/whatsapp/src/auto-reply.web-auto-reply.compresses-common-formats-jpeg-cap.test.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply.web-auto-reply.compresses-common-formats-jpeg-cap.test.ts rename to native-plugins/whatsapp/src/auto-reply.web-auto-reply.compresses-common-formats-jpeg-cap.test.ts diff --git a/extensions/whatsapp/src/auto-reply.web-auto-reply.connection-and-logging.e2e.test.ts b/native-plugins/whatsapp/src/auto-reply.web-auto-reply.connection-and-logging.e2e.test.ts similarity index 99% rename from extensions/whatsapp/src/auto-reply.web-auto-reply.connection-and-logging.e2e.test.ts rename to native-plugins/whatsapp/src/auto-reply.web-auto-reply.connection-and-logging.e2e.test.ts index 235942663a8..35d4d8b0135 100644 --- a/extensions/whatsapp/src/auto-reply.web-auto-reply.connection-and-logging.e2e.test.ts +++ b/native-plugins/whatsapp/src/auto-reply.web-auto-reply.connection-and-logging.e2e.test.ts @@ -5,7 +5,7 @@ import { beforeAll, describe, expect, it, vi } from "vitest"; import type { OpenClawConfig } from "../../../src/config/config.js"; import { setLoggerOverride } from "../../../src/logging.js"; import { escapeRegExp, formatEnvelopeTimestamp } from "../../../test/helpers/envelope-timestamp.js"; -import { withEnvAsync } from "../../../test/helpers/extensions/env.js"; +import { withEnvAsync } from "../../../test/helpers/native-plugins/env.js"; import { createMockWebListener, createWebListenerFactoryCapture, diff --git a/extensions/whatsapp/src/auto-reply.web-auto-reply.last-route.test.ts b/native-plugins/whatsapp/src/auto-reply.web-auto-reply.last-route.test.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply.web-auto-reply.last-route.test.ts rename to native-plugins/whatsapp/src/auto-reply.web-auto-reply.last-route.test.ts diff --git a/extensions/whatsapp/src/auto-reply/constants.ts b/native-plugins/whatsapp/src/auto-reply/constants.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/constants.ts rename to native-plugins/whatsapp/src/auto-reply/constants.ts diff --git a/extensions/whatsapp/src/auto-reply/deliver-reply.test.ts b/native-plugins/whatsapp/src/auto-reply/deliver-reply.test.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/deliver-reply.test.ts rename to native-plugins/whatsapp/src/auto-reply/deliver-reply.test.ts diff --git a/extensions/whatsapp/src/auto-reply/deliver-reply.ts b/native-plugins/whatsapp/src/auto-reply/deliver-reply.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/deliver-reply.ts rename to native-plugins/whatsapp/src/auto-reply/deliver-reply.ts diff --git a/extensions/whatsapp/src/auto-reply/heartbeat-runner.test.ts b/native-plugins/whatsapp/src/auto-reply/heartbeat-runner.test.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/heartbeat-runner.test.ts rename to native-plugins/whatsapp/src/auto-reply/heartbeat-runner.test.ts diff --git a/extensions/whatsapp/src/auto-reply/heartbeat-runner.ts b/native-plugins/whatsapp/src/auto-reply/heartbeat-runner.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/heartbeat-runner.ts rename to native-plugins/whatsapp/src/auto-reply/heartbeat-runner.ts diff --git a/extensions/whatsapp/src/auto-reply/loggers.ts b/native-plugins/whatsapp/src/auto-reply/loggers.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/loggers.ts rename to native-plugins/whatsapp/src/auto-reply/loggers.ts diff --git a/extensions/whatsapp/src/auto-reply/mentions.ts b/native-plugins/whatsapp/src/auto-reply/mentions.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/mentions.ts rename to native-plugins/whatsapp/src/auto-reply/mentions.ts diff --git a/extensions/whatsapp/src/auto-reply/monitor.ts b/native-plugins/whatsapp/src/auto-reply/monitor.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/monitor.ts rename to native-plugins/whatsapp/src/auto-reply/monitor.ts diff --git a/extensions/whatsapp/src/auto-reply/monitor/ack-reaction.ts b/native-plugins/whatsapp/src/auto-reply/monitor/ack-reaction.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/monitor/ack-reaction.ts rename to native-plugins/whatsapp/src/auto-reply/monitor/ack-reaction.ts diff --git a/extensions/whatsapp/src/auto-reply/monitor/broadcast.ts b/native-plugins/whatsapp/src/auto-reply/monitor/broadcast.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/monitor/broadcast.ts rename to native-plugins/whatsapp/src/auto-reply/monitor/broadcast.ts diff --git a/extensions/whatsapp/src/auto-reply/monitor/commands.ts b/native-plugins/whatsapp/src/auto-reply/monitor/commands.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/monitor/commands.ts rename to native-plugins/whatsapp/src/auto-reply/monitor/commands.ts diff --git a/extensions/whatsapp/src/auto-reply/monitor/echo.ts b/native-plugins/whatsapp/src/auto-reply/monitor/echo.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/monitor/echo.ts rename to native-plugins/whatsapp/src/auto-reply/monitor/echo.ts diff --git a/extensions/whatsapp/src/auto-reply/monitor/group-activation.ts b/native-plugins/whatsapp/src/auto-reply/monitor/group-activation.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/monitor/group-activation.ts rename to native-plugins/whatsapp/src/auto-reply/monitor/group-activation.ts diff --git a/extensions/whatsapp/src/auto-reply/monitor/group-gating.ts b/native-plugins/whatsapp/src/auto-reply/monitor/group-gating.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/monitor/group-gating.ts rename to native-plugins/whatsapp/src/auto-reply/monitor/group-gating.ts diff --git a/extensions/whatsapp/src/auto-reply/monitor/group-members.test.ts b/native-plugins/whatsapp/src/auto-reply/monitor/group-members.test.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/monitor/group-members.test.ts rename to native-plugins/whatsapp/src/auto-reply/monitor/group-members.test.ts diff --git a/extensions/whatsapp/src/auto-reply/monitor/group-members.ts b/native-plugins/whatsapp/src/auto-reply/monitor/group-members.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/monitor/group-members.ts rename to native-plugins/whatsapp/src/auto-reply/monitor/group-members.ts diff --git a/extensions/whatsapp/src/auto-reply/monitor/last-route.ts b/native-plugins/whatsapp/src/auto-reply/monitor/last-route.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/monitor/last-route.ts rename to native-plugins/whatsapp/src/auto-reply/monitor/last-route.ts diff --git a/extensions/whatsapp/src/auto-reply/monitor/message-line.ts b/native-plugins/whatsapp/src/auto-reply/monitor/message-line.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/monitor/message-line.ts rename to native-plugins/whatsapp/src/auto-reply/monitor/message-line.ts diff --git a/extensions/whatsapp/src/auto-reply/monitor/on-message.ts b/native-plugins/whatsapp/src/auto-reply/monitor/on-message.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/monitor/on-message.ts rename to native-plugins/whatsapp/src/auto-reply/monitor/on-message.ts diff --git a/extensions/whatsapp/src/auto-reply/monitor/peer.ts b/native-plugins/whatsapp/src/auto-reply/monitor/peer.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/monitor/peer.ts rename to native-plugins/whatsapp/src/auto-reply/monitor/peer.ts diff --git a/extensions/whatsapp/src/auto-reply/monitor/process-message.inbound-context.test.ts b/native-plugins/whatsapp/src/auto-reply/monitor/process-message.inbound-context.test.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/monitor/process-message.inbound-context.test.ts rename to native-plugins/whatsapp/src/auto-reply/monitor/process-message.inbound-context.test.ts diff --git a/extensions/whatsapp/src/auto-reply/monitor/process-message.ts b/native-plugins/whatsapp/src/auto-reply/monitor/process-message.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/monitor/process-message.ts rename to native-plugins/whatsapp/src/auto-reply/monitor/process-message.ts diff --git a/extensions/whatsapp/src/auto-reply/session-snapshot.ts b/native-plugins/whatsapp/src/auto-reply/session-snapshot.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/session-snapshot.ts rename to native-plugins/whatsapp/src/auto-reply/session-snapshot.ts diff --git a/extensions/whatsapp/src/auto-reply/types.ts b/native-plugins/whatsapp/src/auto-reply/types.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/types.ts rename to native-plugins/whatsapp/src/auto-reply/types.ts diff --git a/extensions/whatsapp/src/auto-reply/util.ts b/native-plugins/whatsapp/src/auto-reply/util.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/util.ts rename to native-plugins/whatsapp/src/auto-reply/util.ts diff --git a/extensions/whatsapp/src/auto-reply/web-auto-reply-monitor.test.ts b/native-plugins/whatsapp/src/auto-reply/web-auto-reply-monitor.test.ts similarity index 100% rename from extensions/whatsapp/src/auto-reply/web-auto-reply-monitor.test.ts rename to native-plugins/whatsapp/src/auto-reply/web-auto-reply-monitor.test.ts diff --git a/extensions/whatsapp/src/auto-reply/web-auto-reply-utils.test.ts b/native-plugins/whatsapp/src/auto-reply/web-auto-reply-utils.test.ts similarity index 99% rename from extensions/whatsapp/src/auto-reply/web-auto-reply-utils.test.ts rename to native-plugins/whatsapp/src/auto-reply/web-auto-reply-utils.test.ts index eb733d14e0e..58230bfd353 100644 --- a/extensions/whatsapp/src/auto-reply/web-auto-reply-utils.test.ts +++ b/native-plugins/whatsapp/src/auto-reply/web-auto-reply-utils.test.ts @@ -2,7 +2,7 @@ import fs from "node:fs/promises"; import path from "node:path"; import { describe, expect, it, vi } from "vitest"; import { saveSessionStore } from "../../../../src/config/sessions.js"; -import { withTempDir } from "../../../../test/helpers/extensions/temp-dir.js"; +import { withTempDir } from "../../../../test/helpers/native-plugins/temp-dir.js"; import { debugMention, isBotMentionedFromTargets, diff --git a/extensions/whatsapp/src/channel.directory.test.ts b/native-plugins/whatsapp/src/channel.directory.test.ts similarity index 96% rename from extensions/whatsapp/src/channel.directory.test.ts rename to native-plugins/whatsapp/src/channel.directory.test.ts index 3fd58b31d4d..fd7397e8cea 100644 --- a/extensions/whatsapp/src/channel.directory.test.ts +++ b/native-plugins/whatsapp/src/channel.directory.test.ts @@ -3,7 +3,7 @@ import { describe, expect, it } from "vitest"; import { createDirectoryTestRuntime, expectDirectorySurface, -} from "../../../test/helpers/extensions/directory.ts"; +} from "../../../test/helpers/native-plugins/directory.ts"; import { whatsappPlugin } from "./channel.js"; describe("whatsapp directory", () => { diff --git a/extensions/whatsapp/src/channel.outbound.test.ts b/native-plugins/whatsapp/src/channel.outbound.test.ts similarity index 100% rename from extensions/whatsapp/src/channel.outbound.test.ts rename to native-plugins/whatsapp/src/channel.outbound.test.ts diff --git a/extensions/whatsapp/src/channel.runtime.ts b/native-plugins/whatsapp/src/channel.runtime.ts similarity index 100% rename from extensions/whatsapp/src/channel.runtime.ts rename to native-plugins/whatsapp/src/channel.runtime.ts diff --git a/extensions/whatsapp/src/channel.setup.ts b/native-plugins/whatsapp/src/channel.setup.ts similarity index 100% rename from extensions/whatsapp/src/channel.setup.ts rename to native-plugins/whatsapp/src/channel.setup.ts diff --git a/extensions/whatsapp/src/channel.test.ts b/native-plugins/whatsapp/src/channel.test.ts similarity index 100% rename from extensions/whatsapp/src/channel.test.ts rename to native-plugins/whatsapp/src/channel.test.ts diff --git a/extensions/whatsapp/src/channel.ts b/native-plugins/whatsapp/src/channel.ts similarity index 100% rename from extensions/whatsapp/src/channel.ts rename to native-plugins/whatsapp/src/channel.ts diff --git a/extensions/whatsapp/src/config-schema.ts b/native-plugins/whatsapp/src/config-schema.ts similarity index 100% rename from extensions/whatsapp/src/config-schema.ts rename to native-plugins/whatsapp/src/config-schema.ts diff --git a/extensions/whatsapp/src/directory-config.ts b/native-plugins/whatsapp/src/directory-config.ts similarity index 100% rename from extensions/whatsapp/src/directory-config.ts rename to native-plugins/whatsapp/src/directory-config.ts diff --git a/extensions/whatsapp/src/group-policy.test.ts b/native-plugins/whatsapp/src/group-policy.test.ts similarity index 100% rename from extensions/whatsapp/src/group-policy.test.ts rename to native-plugins/whatsapp/src/group-policy.test.ts diff --git a/extensions/whatsapp/src/group-policy.ts b/native-plugins/whatsapp/src/group-policy.ts similarity index 100% rename from extensions/whatsapp/src/group-policy.ts rename to native-plugins/whatsapp/src/group-policy.ts diff --git a/extensions/whatsapp/src/inbound.media.test.ts b/native-plugins/whatsapp/src/inbound.media.test.ts similarity index 100% rename from extensions/whatsapp/src/inbound.media.test.ts rename to native-plugins/whatsapp/src/inbound.media.test.ts diff --git a/extensions/whatsapp/src/inbound.test.ts b/native-plugins/whatsapp/src/inbound.test.ts similarity index 100% rename from extensions/whatsapp/src/inbound.test.ts rename to native-plugins/whatsapp/src/inbound.test.ts diff --git a/extensions/whatsapp/src/inbound.ts b/native-plugins/whatsapp/src/inbound.ts similarity index 100% rename from extensions/whatsapp/src/inbound.ts rename to native-plugins/whatsapp/src/inbound.ts diff --git a/extensions/whatsapp/src/inbound/access-control.test-harness.ts b/native-plugins/whatsapp/src/inbound/access-control.test-harness.ts similarity index 100% rename from extensions/whatsapp/src/inbound/access-control.test-harness.ts rename to native-plugins/whatsapp/src/inbound/access-control.test-harness.ts diff --git a/extensions/whatsapp/src/inbound/access-control.test.ts b/native-plugins/whatsapp/src/inbound/access-control.test.ts similarity index 100% rename from extensions/whatsapp/src/inbound/access-control.test.ts rename to native-plugins/whatsapp/src/inbound/access-control.test.ts diff --git a/extensions/whatsapp/src/inbound/access-control.ts b/native-plugins/whatsapp/src/inbound/access-control.ts similarity index 100% rename from extensions/whatsapp/src/inbound/access-control.ts rename to native-plugins/whatsapp/src/inbound/access-control.ts diff --git a/extensions/whatsapp/src/inbound/dedupe.ts b/native-plugins/whatsapp/src/inbound/dedupe.ts similarity index 100% rename from extensions/whatsapp/src/inbound/dedupe.ts rename to native-plugins/whatsapp/src/inbound/dedupe.ts diff --git a/extensions/whatsapp/src/inbound/extract.ts b/native-plugins/whatsapp/src/inbound/extract.ts similarity index 100% rename from extensions/whatsapp/src/inbound/extract.ts rename to native-plugins/whatsapp/src/inbound/extract.ts diff --git a/extensions/whatsapp/src/inbound/media.node.test.ts b/native-plugins/whatsapp/src/inbound/media.node.test.ts similarity index 100% rename from extensions/whatsapp/src/inbound/media.node.test.ts rename to native-plugins/whatsapp/src/inbound/media.node.test.ts diff --git a/extensions/whatsapp/src/inbound/media.ts b/native-plugins/whatsapp/src/inbound/media.ts similarity index 100% rename from extensions/whatsapp/src/inbound/media.ts rename to native-plugins/whatsapp/src/inbound/media.ts diff --git a/extensions/whatsapp/src/inbound/monitor.ts b/native-plugins/whatsapp/src/inbound/monitor.ts similarity index 100% rename from extensions/whatsapp/src/inbound/monitor.ts rename to native-plugins/whatsapp/src/inbound/monitor.ts diff --git a/extensions/whatsapp/src/inbound/send-api.test.ts b/native-plugins/whatsapp/src/inbound/send-api.test.ts similarity index 100% rename from extensions/whatsapp/src/inbound/send-api.test.ts rename to native-plugins/whatsapp/src/inbound/send-api.test.ts diff --git a/extensions/whatsapp/src/inbound/send-api.ts b/native-plugins/whatsapp/src/inbound/send-api.ts similarity index 100% rename from extensions/whatsapp/src/inbound/send-api.ts rename to native-plugins/whatsapp/src/inbound/send-api.ts diff --git a/extensions/whatsapp/src/inbound/types.ts b/native-plugins/whatsapp/src/inbound/types.ts similarity index 100% rename from extensions/whatsapp/src/inbound/types.ts rename to native-plugins/whatsapp/src/inbound/types.ts diff --git a/extensions/whatsapp/src/login-qr.test.ts b/native-plugins/whatsapp/src/login-qr.test.ts similarity index 100% rename from extensions/whatsapp/src/login-qr.test.ts rename to native-plugins/whatsapp/src/login-qr.test.ts diff --git a/extensions/whatsapp/src/login-qr.ts b/native-plugins/whatsapp/src/login-qr.ts similarity index 100% rename from extensions/whatsapp/src/login-qr.ts rename to native-plugins/whatsapp/src/login-qr.ts diff --git a/extensions/whatsapp/src/login.coverage.test.ts b/native-plugins/whatsapp/src/login.coverage.test.ts similarity index 100% rename from extensions/whatsapp/src/login.coverage.test.ts rename to native-plugins/whatsapp/src/login.coverage.test.ts diff --git a/extensions/whatsapp/src/login.test.ts b/native-plugins/whatsapp/src/login.test.ts similarity index 96% rename from extensions/whatsapp/src/login.test.ts rename to native-plugins/whatsapp/src/login.test.ts index 96a9cff2c10..1a7598d94f3 100644 --- a/extensions/whatsapp/src/login.test.ts +++ b/native-plugins/whatsapp/src/login.test.ts @@ -61,7 +61,7 @@ describe("renderQrPngBase64", () => { }); it("avoids dynamic require of qrcode-terminal vendor modules", async () => { - const sourcePath = resolve(process.cwd(), "extensions/whatsapp/src/qr-image.ts"); + const sourcePath = resolve(process.cwd(), "native-plugins/whatsapp/src/qr-image.ts"); const source = await readFile(sourcePath, "utf-8"); expect(source).not.toContain("createRequire("); expect(source).not.toContain('require("qrcode-terminal/vendor/QRCode")'); diff --git a/extensions/whatsapp/src/login.ts b/native-plugins/whatsapp/src/login.ts similarity index 100% rename from extensions/whatsapp/src/login.ts rename to native-plugins/whatsapp/src/login.ts diff --git a/extensions/whatsapp/src/logout.test.ts b/native-plugins/whatsapp/src/logout.test.ts similarity index 100% rename from extensions/whatsapp/src/logout.test.ts rename to native-plugins/whatsapp/src/logout.test.ts diff --git a/extensions/whatsapp/src/media.test.ts b/native-plugins/whatsapp/src/media.test.ts similarity index 99% rename from extensions/whatsapp/src/media.test.ts rename to native-plugins/whatsapp/src/media.test.ts index ce3e98c549c..28ae994e1ca 100644 --- a/extensions/whatsapp/src/media.test.ts +++ b/native-plugins/whatsapp/src/media.test.ts @@ -7,7 +7,7 @@ import { resolveStateDir } from "../../../src/config/paths.js"; import { resolvePreferredOpenClawTmpDir } from "../../../src/infra/tmp-openclaw-dir.js"; import { optimizeImageToPng } from "../../../src/media/image-ops.js"; import { mockPinnedHostnameResolution } from "../../../src/test-helpers/ssrf.js"; -import { captureEnv } from "../../../test/helpers/extensions/env.js"; +import { captureEnv } from "../../../test/helpers/native-plugins/env.js"; import { sendVoiceMessageDiscord } from "../../discord/src/send.js"; import { LocalMediaAccessError, diff --git a/extensions/whatsapp/src/media.ts b/native-plugins/whatsapp/src/media.ts similarity index 100% rename from extensions/whatsapp/src/media.ts rename to native-plugins/whatsapp/src/media.ts diff --git a/extensions/whatsapp/src/monitor-inbox.allows-messages-from-senders-allowfrom-list.test.ts b/native-plugins/whatsapp/src/monitor-inbox.allows-messages-from-senders-allowfrom-list.test.ts similarity index 100% rename from extensions/whatsapp/src/monitor-inbox.allows-messages-from-senders-allowfrom-list.test.ts rename to native-plugins/whatsapp/src/monitor-inbox.allows-messages-from-senders-allowfrom-list.test.ts diff --git a/extensions/whatsapp/src/monitor-inbox.append-upsert.test.ts b/native-plugins/whatsapp/src/monitor-inbox.append-upsert.test.ts similarity index 100% rename from extensions/whatsapp/src/monitor-inbox.append-upsert.test.ts rename to native-plugins/whatsapp/src/monitor-inbox.append-upsert.test.ts diff --git a/extensions/whatsapp/src/monitor-inbox.blocks-messages-from-unauthorized-senders-not-allowfrom.test.ts b/native-plugins/whatsapp/src/monitor-inbox.blocks-messages-from-unauthorized-senders-not-allowfrom.test.ts similarity index 100% rename from extensions/whatsapp/src/monitor-inbox.blocks-messages-from-unauthorized-senders-not-allowfrom.test.ts rename to native-plugins/whatsapp/src/monitor-inbox.blocks-messages-from-unauthorized-senders-not-allowfrom.test.ts diff --git a/extensions/whatsapp/src/monitor-inbox.captures-media-path-image-messages.test.ts b/native-plugins/whatsapp/src/monitor-inbox.captures-media-path-image-messages.test.ts similarity index 100% rename from extensions/whatsapp/src/monitor-inbox.captures-media-path-image-messages.test.ts rename to native-plugins/whatsapp/src/monitor-inbox.captures-media-path-image-messages.test.ts diff --git a/extensions/whatsapp/src/monitor-inbox.streams-inbound-messages.test.ts b/native-plugins/whatsapp/src/monitor-inbox.streams-inbound-messages.test.ts similarity index 100% rename from extensions/whatsapp/src/monitor-inbox.streams-inbound-messages.test.ts rename to native-plugins/whatsapp/src/monitor-inbox.streams-inbound-messages.test.ts diff --git a/extensions/whatsapp/src/monitor-inbox.test-harness.ts b/native-plugins/whatsapp/src/monitor-inbox.test-harness.ts similarity index 100% rename from extensions/whatsapp/src/monitor-inbox.test-harness.ts rename to native-plugins/whatsapp/src/monitor-inbox.test-harness.ts diff --git a/extensions/whatsapp/src/normalize.ts b/native-plugins/whatsapp/src/normalize.ts similarity index 100% rename from extensions/whatsapp/src/normalize.ts rename to native-plugins/whatsapp/src/normalize.ts diff --git a/extensions/whatsapp/src/outbound-adapter.poll.test.ts b/native-plugins/whatsapp/src/outbound-adapter.poll.test.ts similarity index 100% rename from extensions/whatsapp/src/outbound-adapter.poll.test.ts rename to native-plugins/whatsapp/src/outbound-adapter.poll.test.ts diff --git a/extensions/whatsapp/src/outbound-adapter.sendpayload.test.ts b/native-plugins/whatsapp/src/outbound-adapter.sendpayload.test.ts similarity index 100% rename from extensions/whatsapp/src/outbound-adapter.sendpayload.test.ts rename to native-plugins/whatsapp/src/outbound-adapter.sendpayload.test.ts diff --git a/extensions/whatsapp/src/outbound-adapter.ts b/native-plugins/whatsapp/src/outbound-adapter.ts similarity index 100% rename from extensions/whatsapp/src/outbound-adapter.ts rename to native-plugins/whatsapp/src/outbound-adapter.ts diff --git a/extensions/whatsapp/src/qr-image.ts b/native-plugins/whatsapp/src/qr-image.ts similarity index 100% rename from extensions/whatsapp/src/qr-image.ts rename to native-plugins/whatsapp/src/qr-image.ts diff --git a/extensions/whatsapp/src/reconnect.test.ts b/native-plugins/whatsapp/src/reconnect.test.ts similarity index 100% rename from extensions/whatsapp/src/reconnect.test.ts rename to native-plugins/whatsapp/src/reconnect.test.ts diff --git a/extensions/whatsapp/src/reconnect.ts b/native-plugins/whatsapp/src/reconnect.ts similarity index 100% rename from extensions/whatsapp/src/reconnect.ts rename to native-plugins/whatsapp/src/reconnect.ts diff --git a/extensions/whatsapp/src/resolve-target.test.ts b/native-plugins/whatsapp/src/resolve-target.test.ts similarity index 100% rename from extensions/whatsapp/src/resolve-target.test.ts rename to native-plugins/whatsapp/src/resolve-target.test.ts diff --git a/extensions/whatsapp/src/runtime-api.ts b/native-plugins/whatsapp/src/runtime-api.ts similarity index 100% rename from extensions/whatsapp/src/runtime-api.ts rename to native-plugins/whatsapp/src/runtime-api.ts diff --git a/extensions/whatsapp/src/runtime.ts b/native-plugins/whatsapp/src/runtime.ts similarity index 100% rename from extensions/whatsapp/src/runtime.ts rename to native-plugins/whatsapp/src/runtime.ts diff --git a/extensions/whatsapp/src/send.test.ts b/native-plugins/whatsapp/src/send.test.ts similarity index 100% rename from extensions/whatsapp/src/send.test.ts rename to native-plugins/whatsapp/src/send.test.ts diff --git a/extensions/whatsapp/src/send.ts b/native-plugins/whatsapp/src/send.ts similarity index 100% rename from extensions/whatsapp/src/send.ts rename to native-plugins/whatsapp/src/send.ts diff --git a/extensions/whatsapp/src/session-errors.ts b/native-plugins/whatsapp/src/session-errors.ts similarity index 100% rename from extensions/whatsapp/src/session-errors.ts rename to native-plugins/whatsapp/src/session-errors.ts diff --git a/extensions/whatsapp/src/session-route.ts b/native-plugins/whatsapp/src/session-route.ts similarity index 100% rename from extensions/whatsapp/src/session-route.ts rename to native-plugins/whatsapp/src/session-route.ts diff --git a/extensions/whatsapp/src/session.test.ts b/native-plugins/whatsapp/src/session.test.ts similarity index 100% rename from extensions/whatsapp/src/session.test.ts rename to native-plugins/whatsapp/src/session.test.ts diff --git a/extensions/whatsapp/src/session.ts b/native-plugins/whatsapp/src/session.ts similarity index 100% rename from extensions/whatsapp/src/session.ts rename to native-plugins/whatsapp/src/session.ts diff --git a/extensions/whatsapp/src/setup-core.ts b/native-plugins/whatsapp/src/setup-core.ts similarity index 100% rename from extensions/whatsapp/src/setup-core.ts rename to native-plugins/whatsapp/src/setup-core.ts diff --git a/extensions/whatsapp/src/setup-surface.test.ts b/native-plugins/whatsapp/src/setup-surface.test.ts similarity index 100% rename from extensions/whatsapp/src/setup-surface.test.ts rename to native-plugins/whatsapp/src/setup-surface.test.ts diff --git a/extensions/whatsapp/src/setup-surface.ts b/native-plugins/whatsapp/src/setup-surface.ts similarity index 100% rename from extensions/whatsapp/src/setup-surface.ts rename to native-plugins/whatsapp/src/setup-surface.ts diff --git a/extensions/whatsapp/src/shared.ts b/native-plugins/whatsapp/src/shared.ts similarity index 100% rename from extensions/whatsapp/src/shared.ts rename to native-plugins/whatsapp/src/shared.ts diff --git a/extensions/whatsapp/src/status-issues.test.ts b/native-plugins/whatsapp/src/status-issues.test.ts similarity index 100% rename from extensions/whatsapp/src/status-issues.test.ts rename to native-plugins/whatsapp/src/status-issues.test.ts diff --git a/extensions/whatsapp/src/status-issues.ts b/native-plugins/whatsapp/src/status-issues.ts similarity index 100% rename from extensions/whatsapp/src/status-issues.ts rename to native-plugins/whatsapp/src/status-issues.ts diff --git a/extensions/whatsapp/src/test-helpers.ts b/native-plugins/whatsapp/src/test-helpers.ts similarity index 100% rename from extensions/whatsapp/src/test-helpers.ts rename to native-plugins/whatsapp/src/test-helpers.ts diff --git a/extensions/whatsapp/src/vcard.ts b/native-plugins/whatsapp/src/vcard.ts similarity index 100% rename from extensions/whatsapp/src/vcard.ts rename to native-plugins/whatsapp/src/vcard.ts diff --git a/extensions/xai/index.ts b/native-plugins/xai/index.ts similarity index 100% rename from extensions/xai/index.ts rename to native-plugins/xai/index.ts diff --git a/extensions/xai/model-definitions.ts b/native-plugins/xai/model-definitions.ts similarity index 100% rename from extensions/xai/model-definitions.ts rename to native-plugins/xai/model-definitions.ts diff --git a/extensions/xai/onboard.ts b/native-plugins/xai/onboard.ts similarity index 100% rename from extensions/xai/onboard.ts rename to native-plugins/xai/onboard.ts diff --git a/extensions/xai/openclaw.plugin.json b/native-plugins/xai/openclaw.plugin.json similarity index 100% rename from extensions/xai/openclaw.plugin.json rename to native-plugins/xai/openclaw.plugin.json diff --git a/extensions/xai/package.json b/native-plugins/xai/package.json similarity index 90% rename from extensions/xai/package.json rename to native-plugins/xai/package.json index be904ee3c89..c327dc71a25 100644 --- a/extensions/xai/package.json +++ b/native-plugins/xai/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw xAI plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/xai/provider-catalog.ts b/native-plugins/xai/provider-catalog.ts similarity index 100% rename from extensions/xai/provider-catalog.ts rename to native-plugins/xai/provider-catalog.ts diff --git a/extensions/xai/provider-models.test.ts b/native-plugins/xai/provider-models.test.ts similarity index 100% rename from extensions/xai/provider-models.test.ts rename to native-plugins/xai/provider-models.test.ts diff --git a/extensions/xai/provider-models.ts b/native-plugins/xai/provider-models.ts similarity index 100% rename from extensions/xai/provider-models.ts rename to native-plugins/xai/provider-models.ts diff --git a/extensions/xai/src/grok-web-search-provider.ts b/native-plugins/xai/src/grok-web-search-provider.ts similarity index 100% rename from extensions/xai/src/grok-web-search-provider.ts rename to native-plugins/xai/src/grok-web-search-provider.ts diff --git a/extensions/xai/stream.ts b/native-plugins/xai/stream.ts similarity index 100% rename from extensions/xai/stream.ts rename to native-plugins/xai/stream.ts diff --git a/extensions/xai/web-search.test.ts b/native-plugins/xai/web-search.test.ts similarity index 98% rename from extensions/xai/web-search.test.ts rename to native-plugins/xai/web-search.test.ts index 29433ec7efa..e481c9bf3c4 100644 --- a/extensions/xai/web-search.test.ts +++ b/native-plugins/xai/web-search.test.ts @@ -3,7 +3,7 @@ import { resolveWebSearchProviderCredential, } from "openclaw/plugin-sdk/provider-web-search"; import { describe, expect, it } from "vitest"; -import { withEnv } from "../../test/helpers/extensions/env.js"; +import { withEnv } from "../../test/helpers/native-plugins/env.js"; import { __testing } from "./web-search.js"; const { extractXaiWebSearchContent, resolveXaiInlineCitations, resolveXaiWebSearchModel } = diff --git a/extensions/xai/web-search.ts b/native-plugins/xai/web-search.ts similarity index 100% rename from extensions/xai/web-search.ts rename to native-plugins/xai/web-search.ts diff --git a/extensions/xiaomi/index.ts b/native-plugins/xiaomi/index.ts similarity index 100% rename from extensions/xiaomi/index.ts rename to native-plugins/xiaomi/index.ts diff --git a/extensions/xiaomi/onboard.ts b/native-plugins/xiaomi/onboard.ts similarity index 100% rename from extensions/xiaomi/onboard.ts rename to native-plugins/xiaomi/onboard.ts diff --git a/extensions/xiaomi/openclaw.plugin.json b/native-plugins/xiaomi/openclaw.plugin.json similarity index 100% rename from extensions/xiaomi/openclaw.plugin.json rename to native-plugins/xiaomi/openclaw.plugin.json diff --git a/extensions/xiaomi/package.json b/native-plugins/xiaomi/package.json similarity index 91% rename from extensions/xiaomi/package.json rename to native-plugins/xiaomi/package.json index dc89cc57160..e111869db5d 100644 --- a/extensions/xiaomi/package.json +++ b/native-plugins/xiaomi/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Xiaomi provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/xiaomi/provider-catalog.ts b/native-plugins/xiaomi/provider-catalog.ts similarity index 100% rename from extensions/xiaomi/provider-catalog.ts rename to native-plugins/xiaomi/provider-catalog.ts diff --git a/extensions/zai/detect.ts b/native-plugins/zai/detect.ts similarity index 100% rename from extensions/zai/detect.ts rename to native-plugins/zai/detect.ts diff --git a/extensions/zai/index.ts b/native-plugins/zai/index.ts similarity index 100% rename from extensions/zai/index.ts rename to native-plugins/zai/index.ts diff --git a/extensions/zai/media-understanding-provider.ts b/native-plugins/zai/media-understanding-provider.ts similarity index 100% rename from extensions/zai/media-understanding-provider.ts rename to native-plugins/zai/media-understanding-provider.ts diff --git a/extensions/zai/model-definitions.ts b/native-plugins/zai/model-definitions.ts similarity index 100% rename from extensions/zai/model-definitions.ts rename to native-plugins/zai/model-definitions.ts diff --git a/extensions/zai/onboard.ts b/native-plugins/zai/onboard.ts similarity index 100% rename from extensions/zai/onboard.ts rename to native-plugins/zai/onboard.ts diff --git a/extensions/zai/openclaw.plugin.json b/native-plugins/zai/openclaw.plugin.json similarity index 100% rename from extensions/zai/openclaw.plugin.json rename to native-plugins/zai/openclaw.plugin.json diff --git a/extensions/zai/package.json b/native-plugins/zai/package.json similarity index 90% rename from extensions/zai/package.json rename to native-plugins/zai/package.json index 10283bbdbdd..8e79b566a3a 100644 --- a/extensions/zai/package.json +++ b/native-plugins/zai/package.json @@ -5,7 +5,7 @@ "description": "OpenClaw Z.AI provider plugin", "type": "module", "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ] } diff --git a/extensions/zai/runtime-api.ts b/native-plugins/zai/runtime-api.ts similarity index 100% rename from extensions/zai/runtime-api.ts rename to native-plugins/zai/runtime-api.ts diff --git a/extensions/zalo/CHANGELOG.md b/native-plugins/zalo/CHANGELOG.md similarity index 100% rename from extensions/zalo/CHANGELOG.md rename to native-plugins/zalo/CHANGELOG.md diff --git a/extensions/zalo/README.md b/native-plugins/zalo/README.md similarity index 94% rename from extensions/zalo/README.md rename to native-plugins/zalo/README.md index 309569fa330..233839f703f 100644 --- a/extensions/zalo/README.md +++ b/native-plugins/zalo/README.md @@ -5,7 +5,7 @@ Zalo channel plugin for OpenClaw (Bot API). ## Install (local checkout) ```bash -openclaw plugins install ./extensions/zalo +openclaw plugins install ./native-plugins/zalo ``` ## Install (npm) diff --git a/extensions/zalo/api.ts b/native-plugins/zalo/api.ts similarity index 100% rename from extensions/zalo/api.ts rename to native-plugins/zalo/api.ts diff --git a/extensions/zalo/index.ts b/native-plugins/zalo/index.ts similarity index 100% rename from extensions/zalo/index.ts rename to native-plugins/zalo/index.ts diff --git a/extensions/zalo/openclaw.plugin.json b/native-plugins/zalo/openclaw.plugin.json similarity index 100% rename from extensions/zalo/openclaw.plugin.json rename to native-plugins/zalo/openclaw.plugin.json diff --git a/extensions/zalo/package.json b/native-plugins/zalo/package.json similarity index 92% rename from extensions/zalo/package.json rename to native-plugins/zalo/package.json index 1dd30038cea..6a3aff343d4 100644 --- a/extensions/zalo/package.json +++ b/native-plugins/zalo/package.json @@ -8,7 +8,7 @@ "zod": "^4.3.6" }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ], "setupEntry": "./setup-entry.ts", @@ -27,7 +27,7 @@ }, "install": { "npmSpec": "@openclaw/zalo", - "localPath": "extensions/zalo", + "localPath": "native-plugins/zalo", "defaultChoice": "npm" }, "release": { diff --git a/extensions/zalo/runtime-api.ts b/native-plugins/zalo/runtime-api.ts similarity index 100% rename from extensions/zalo/runtime-api.ts rename to native-plugins/zalo/runtime-api.ts diff --git a/extensions/zalo/setup-entry.ts b/native-plugins/zalo/setup-entry.ts similarity index 100% rename from extensions/zalo/setup-entry.ts rename to native-plugins/zalo/setup-entry.ts diff --git a/extensions/zalo/src/accounts.ts b/native-plugins/zalo/src/accounts.ts similarity index 100% rename from extensions/zalo/src/accounts.ts rename to native-plugins/zalo/src/accounts.ts diff --git a/extensions/zalo/src/actions.runtime.ts b/native-plugins/zalo/src/actions.runtime.ts similarity index 100% rename from extensions/zalo/src/actions.runtime.ts rename to native-plugins/zalo/src/actions.runtime.ts diff --git a/extensions/zalo/src/actions.ts b/native-plugins/zalo/src/actions.ts similarity index 100% rename from extensions/zalo/src/actions.ts rename to native-plugins/zalo/src/actions.ts diff --git a/extensions/zalo/src/api.test.ts b/native-plugins/zalo/src/api.test.ts similarity index 100% rename from extensions/zalo/src/api.test.ts rename to native-plugins/zalo/src/api.test.ts diff --git a/extensions/zalo/src/api.ts b/native-plugins/zalo/src/api.ts similarity index 100% rename from extensions/zalo/src/api.ts rename to native-plugins/zalo/src/api.ts diff --git a/extensions/zalo/src/channel.directory.test.ts b/native-plugins/zalo/src/channel.directory.test.ts similarity index 95% rename from extensions/zalo/src/channel.directory.test.ts rename to native-plugins/zalo/src/channel.directory.test.ts index efa20d3a80a..45e06ce47e3 100644 --- a/extensions/zalo/src/channel.directory.test.ts +++ b/native-plugins/zalo/src/channel.directory.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from "vitest"; import { createDirectoryTestRuntime, expectDirectorySurface, -} from "../../../test/helpers/extensions/directory.js"; +} from "../../../test/helpers/native-plugins/directory.js"; import type { OpenClawConfig, RuntimeEnv } from "../runtime-api.js"; import { zaloPlugin } from "./channel.js"; diff --git a/extensions/zalo/src/channel.runtime.ts b/native-plugins/zalo/src/channel.runtime.ts similarity index 100% rename from extensions/zalo/src/channel.runtime.ts rename to native-plugins/zalo/src/channel.runtime.ts diff --git a/extensions/zalo/src/channel.startup.test.ts b/native-plugins/zalo/src/channel.startup.test.ts similarity index 97% rename from extensions/zalo/src/channel.startup.test.ts rename to native-plugins/zalo/src/channel.startup.test.ts index a7fff0807cc..7cd6d75f664 100644 --- a/extensions/zalo/src/channel.startup.test.ts +++ b/native-plugins/zalo/src/channel.startup.test.ts @@ -2,7 +2,7 @@ import { afterEach, describe, expect, it, vi } from "vitest"; import { expectPendingUntilAbort, startAccountAndTrackLifecycle, -} from "../../../test/helpers/extensions/start-account-lifecycle.js"; +} from "../../../test/helpers/native-plugins/start-account-lifecycle.js"; import type { ChannelAccountSnapshot } from "../runtime-api.js"; import type { ResolvedZaloAccount } from "./accounts.js"; diff --git a/extensions/zalo/src/channel.ts b/native-plugins/zalo/src/channel.ts similarity index 100% rename from extensions/zalo/src/channel.ts rename to native-plugins/zalo/src/channel.ts diff --git a/extensions/zalo/src/config-schema.test.ts b/native-plugins/zalo/src/config-schema.test.ts similarity index 100% rename from extensions/zalo/src/config-schema.test.ts rename to native-plugins/zalo/src/config-schema.test.ts diff --git a/extensions/zalo/src/config-schema.ts b/native-plugins/zalo/src/config-schema.ts similarity index 100% rename from extensions/zalo/src/config-schema.ts rename to native-plugins/zalo/src/config-schema.ts diff --git a/extensions/zalo/src/group-access.ts b/native-plugins/zalo/src/group-access.ts similarity index 100% rename from extensions/zalo/src/group-access.ts rename to native-plugins/zalo/src/group-access.ts diff --git a/extensions/zalo/src/monitor.group-policy.test.ts b/native-plugins/zalo/src/monitor.group-policy.test.ts similarity index 100% rename from extensions/zalo/src/monitor.group-policy.test.ts rename to native-plugins/zalo/src/monitor.group-policy.test.ts diff --git a/extensions/zalo/src/monitor.lifecycle.test.ts b/native-plugins/zalo/src/monitor.lifecycle.test.ts similarity index 100% rename from extensions/zalo/src/monitor.lifecycle.test.ts rename to native-plugins/zalo/src/monitor.lifecycle.test.ts diff --git a/extensions/zalo/src/monitor.pairing.lifecycle.test.ts b/native-plugins/zalo/src/monitor.pairing.lifecycle.test.ts similarity index 98% rename from extensions/zalo/src/monitor.pairing.lifecycle.test.ts rename to native-plugins/zalo/src/monitor.pairing.lifecycle.test.ts index 383474114cf..8d64b25fe87 100644 --- a/extensions/zalo/src/monitor.pairing.lifecycle.test.ts +++ b/native-plugins/zalo/src/monitor.pairing.lifecycle.test.ts @@ -3,7 +3,7 @@ import type { AddressInfo } from "node:net"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { createEmptyPluginRegistry } from "../../../src/plugins/registry.js"; import { setActivePluginRegistry } from "../../../src/plugins/runtime.js"; -import { createPluginRuntimeMock } from "../../../test/helpers/extensions/plugin-runtime-mock.js"; +import { createPluginRuntimeMock } from "../../../test/helpers/native-plugins/plugin-runtime-mock.js"; import type { OpenClawConfig, PluginRuntime } from "../runtime-api.js"; import type { ResolvedZaloAccount } from "./accounts.js"; import { clearZaloWebhookSecurityStateForTest, monitorZaloProvider } from "./monitor.js"; diff --git a/extensions/zalo/src/monitor.reply-once.lifecycle.test.ts b/native-plugins/zalo/src/monitor.reply-once.lifecycle.test.ts similarity index 99% rename from extensions/zalo/src/monitor.reply-once.lifecycle.test.ts rename to native-plugins/zalo/src/monitor.reply-once.lifecycle.test.ts index 8b16869c0a2..349c38a0fdb 100644 --- a/extensions/zalo/src/monitor.reply-once.lifecycle.test.ts +++ b/native-plugins/zalo/src/monitor.reply-once.lifecycle.test.ts @@ -3,7 +3,7 @@ import type { AddressInfo } from "node:net"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { createEmptyPluginRegistry } from "../../../src/plugins/registry.js"; import { setActivePluginRegistry } from "../../../src/plugins/runtime.js"; -import { createPluginRuntimeMock } from "../../../test/helpers/extensions/plugin-runtime-mock.js"; +import { createPluginRuntimeMock } from "../../../test/helpers/native-plugins/plugin-runtime-mock.js"; import type { OpenClawConfig, PluginRuntime } from "../runtime-api.js"; import type { ResolvedZaloAccount } from "./accounts.js"; import { clearZaloWebhookSecurityStateForTest, monitorZaloProvider } from "./monitor.js"; diff --git a/extensions/zalo/src/monitor.ts b/native-plugins/zalo/src/monitor.ts similarity index 100% rename from extensions/zalo/src/monitor.ts rename to native-plugins/zalo/src/monitor.ts diff --git a/extensions/zalo/src/monitor.webhook.test.ts b/native-plugins/zalo/src/monitor.webhook.test.ts similarity index 100% rename from extensions/zalo/src/monitor.webhook.test.ts rename to native-plugins/zalo/src/monitor.webhook.test.ts diff --git a/extensions/zalo/src/monitor.webhook.ts b/native-plugins/zalo/src/monitor.webhook.ts similarity index 100% rename from extensions/zalo/src/monitor.webhook.ts rename to native-plugins/zalo/src/monitor.webhook.ts diff --git a/extensions/zalo/src/probe.ts b/native-plugins/zalo/src/probe.ts similarity index 100% rename from extensions/zalo/src/probe.ts rename to native-plugins/zalo/src/probe.ts diff --git a/extensions/zalo/src/proxy.ts b/native-plugins/zalo/src/proxy.ts similarity index 100% rename from extensions/zalo/src/proxy.ts rename to native-plugins/zalo/src/proxy.ts diff --git a/extensions/zalo/src/runtime-api.ts b/native-plugins/zalo/src/runtime-api.ts similarity index 100% rename from extensions/zalo/src/runtime-api.ts rename to native-plugins/zalo/src/runtime-api.ts diff --git a/extensions/zalo/src/runtime.ts b/native-plugins/zalo/src/runtime.ts similarity index 100% rename from extensions/zalo/src/runtime.ts rename to native-plugins/zalo/src/runtime.ts diff --git a/extensions/zalo/src/secret-input.ts b/native-plugins/zalo/src/secret-input.ts similarity index 100% rename from extensions/zalo/src/secret-input.ts rename to native-plugins/zalo/src/secret-input.ts diff --git a/extensions/zalo/src/send.ts b/native-plugins/zalo/src/send.ts similarity index 100% rename from extensions/zalo/src/send.ts rename to native-plugins/zalo/src/send.ts diff --git a/extensions/zalo/src/session-route.ts b/native-plugins/zalo/src/session-route.ts similarity index 100% rename from extensions/zalo/src/session-route.ts rename to native-plugins/zalo/src/session-route.ts diff --git a/extensions/zalo/src/setup-core.ts b/native-plugins/zalo/src/setup-core.ts similarity index 100% rename from extensions/zalo/src/setup-core.ts rename to native-plugins/zalo/src/setup-core.ts diff --git a/extensions/zalo/src/setup-status.test.ts b/native-plugins/zalo/src/setup-status.test.ts similarity index 100% rename from extensions/zalo/src/setup-status.test.ts rename to native-plugins/zalo/src/setup-status.test.ts diff --git a/extensions/zalo/src/setup-surface.test.ts b/native-plugins/zalo/src/setup-surface.test.ts similarity index 91% rename from extensions/zalo/src/setup-surface.test.ts rename to native-plugins/zalo/src/setup-surface.test.ts index 16e6e46d8b8..418b0a438eb 100644 --- a/extensions/zalo/src/setup-surface.test.ts +++ b/native-plugins/zalo/src/setup-surface.test.ts @@ -1,10 +1,10 @@ import { describe, expect, it, vi } from "vitest"; import { buildChannelSetupWizardAdapterFromSetupWizard } from "../../../src/channels/plugins/setup-wizard.js"; -import { createRuntimeEnv } from "../../../test/helpers/extensions/runtime-env.js"; +import { createRuntimeEnv } from "../../../test/helpers/native-plugins/runtime-env.js"; import { createTestWizardPrompter, type WizardPrompter, -} from "../../../test/helpers/extensions/setup-wizard.js"; +} from "../../../test/helpers/native-plugins/setup-wizard.js"; import type { OpenClawConfig, RuntimeEnv } from "../runtime-api.js"; import { zaloPlugin } from "./channel.js"; diff --git a/extensions/zalo/src/setup-surface.ts b/native-plugins/zalo/src/setup-surface.ts similarity index 100% rename from extensions/zalo/src/setup-surface.ts rename to native-plugins/zalo/src/setup-surface.ts diff --git a/extensions/zalo/src/status-issues.test.ts b/native-plugins/zalo/src/status-issues.test.ts similarity index 95% rename from extensions/zalo/src/status-issues.test.ts rename to native-plugins/zalo/src/status-issues.test.ts index 1187d45a298..41248827f65 100644 --- a/extensions/zalo/src/status-issues.test.ts +++ b/native-plugins/zalo/src/status-issues.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { expectOpenDmPolicyConfigIssue } from "../../../test/helpers/extensions/status-issues.js"; +import { expectOpenDmPolicyConfigIssue } from "../../../test/helpers/native-plugins/status-issues.js"; import { collectZaloStatusIssues } from "./status-issues.js"; describe("collectZaloStatusIssues", () => { diff --git a/extensions/zalo/src/status-issues.ts b/native-plugins/zalo/src/status-issues.ts similarity index 95% rename from extensions/zalo/src/status-issues.ts rename to native-plugins/zalo/src/status-issues.ts index ebb24ad7e18..868a82c0dbf 100644 --- a/extensions/zalo/src/status-issues.ts +++ b/native-plugins/zalo/src/status-issues.ts @@ -1,7 +1,7 @@ import { coerceStatusIssueAccountId, readStatusIssueFields, -} from "openclaw/plugin-sdk/extension-shared"; +} from "openclaw/plugin-sdk/native-plugin-shared"; import type { ChannelAccountSnapshot, ChannelStatusIssue } from "./runtime-api.js"; const ZALO_STATUS_FIELDS = ["accountId", "enabled", "configured", "dmPolicy"] as const; diff --git a/extensions/zalo/src/token.test.ts b/native-plugins/zalo/src/token.test.ts similarity index 100% rename from extensions/zalo/src/token.test.ts rename to native-plugins/zalo/src/token.test.ts diff --git a/extensions/zalo/src/token.ts b/native-plugins/zalo/src/token.ts similarity index 100% rename from extensions/zalo/src/token.ts rename to native-plugins/zalo/src/token.ts diff --git a/extensions/zalo/src/types.ts b/native-plugins/zalo/src/types.ts similarity index 100% rename from extensions/zalo/src/types.ts rename to native-plugins/zalo/src/types.ts diff --git a/extensions/zalouser/CHANGELOG.md b/native-plugins/zalouser/CHANGELOG.md similarity index 100% rename from extensions/zalouser/CHANGELOG.md rename to native-plugins/zalouser/CHANGELOG.md diff --git a/extensions/zalouser/README.md b/native-plugins/zalouser/README.md similarity index 96% rename from extensions/zalouser/README.md rename to native-plugins/zalouser/README.md index ea55c343edb..96e298b4082 100644 --- a/extensions/zalouser/README.md +++ b/native-plugins/zalouser/README.md @@ -30,8 +30,8 @@ openclaw plugins install @openclaw/zalouser ### Option B: local source checkout ```bash -openclaw plugins install ./extensions/zalouser -cd ./extensions/zalouser && pnpm install +openclaw plugins install ./native-plugins/zalouser +cd ./native-plugins/zalouser && pnpm install ``` Restart the Gateway after install. diff --git a/extensions/zalouser/api.ts b/native-plugins/zalouser/api.ts similarity index 100% rename from extensions/zalouser/api.ts rename to native-plugins/zalouser/api.ts diff --git a/extensions/zalouser/index.ts b/native-plugins/zalouser/index.ts similarity index 100% rename from extensions/zalouser/index.ts rename to native-plugins/zalouser/index.ts diff --git a/extensions/zalouser/openclaw.plugin.json b/native-plugins/zalouser/openclaw.plugin.json similarity index 100% rename from extensions/zalouser/openclaw.plugin.json rename to native-plugins/zalouser/openclaw.plugin.json diff --git a/extensions/zalouser/package.json b/native-plugins/zalouser/package.json similarity index 93% rename from extensions/zalouser/package.json rename to native-plugins/zalouser/package.json index 80c0b80b357..140ae6195ce 100644 --- a/extensions/zalouser/package.json +++ b/native-plugins/zalouser/package.json @@ -9,7 +9,7 @@ "zod": "^4.3.6" }, "openclaw": { - "extensions": [ + "plugins": [ "./index.ts" ], "setupEntry": "./setup-entry.ts", @@ -28,7 +28,7 @@ }, "install": { "npmSpec": "@openclaw/zalouser", - "localPath": "extensions/zalouser", + "localPath": "native-plugins/zalouser", "defaultChoice": "npm" }, "release": { diff --git a/extensions/zalouser/runtime-api.ts b/native-plugins/zalouser/runtime-api.ts similarity index 100% rename from extensions/zalouser/runtime-api.ts rename to native-plugins/zalouser/runtime-api.ts diff --git a/extensions/zalouser/setup-entry.ts b/native-plugins/zalouser/setup-entry.ts similarity index 100% rename from extensions/zalouser/setup-entry.ts rename to native-plugins/zalouser/setup-entry.ts diff --git a/extensions/zalouser/src/accounts.test-mocks.ts b/native-plugins/zalouser/src/accounts.test-mocks.ts similarity index 100% rename from extensions/zalouser/src/accounts.test-mocks.ts rename to native-plugins/zalouser/src/accounts.test-mocks.ts diff --git a/extensions/zalouser/src/accounts.test.ts b/native-plugins/zalouser/src/accounts.test.ts similarity index 100% rename from extensions/zalouser/src/accounts.test.ts rename to native-plugins/zalouser/src/accounts.test.ts diff --git a/extensions/zalouser/src/accounts.ts b/native-plugins/zalouser/src/accounts.ts similarity index 100% rename from extensions/zalouser/src/accounts.ts rename to native-plugins/zalouser/src/accounts.ts diff --git a/extensions/zalouser/src/channel.directory.test.ts b/native-plugins/zalouser/src/channel.directory.test.ts similarity index 100% rename from extensions/zalouser/src/channel.directory.test.ts rename to native-plugins/zalouser/src/channel.directory.test.ts diff --git a/extensions/zalouser/src/channel.sendpayload.test.ts b/native-plugins/zalouser/src/channel.sendpayload.test.ts similarity index 100% rename from extensions/zalouser/src/channel.sendpayload.test.ts rename to native-plugins/zalouser/src/channel.sendpayload.test.ts diff --git a/extensions/zalouser/src/channel.setup.test.ts b/native-plugins/zalouser/src/channel.setup.test.ts similarity index 94% rename from extensions/zalouser/src/channel.setup.test.ts rename to native-plugins/zalouser/src/channel.setup.test.ts index 75aebe5e6be..dc5b6515da0 100644 --- a/extensions/zalouser/src/channel.setup.test.ts +++ b/native-plugins/zalouser/src/channel.setup.test.ts @@ -3,7 +3,7 @@ import os from "node:os"; import path from "node:path"; import { describe, expect, it } from "vitest"; import { buildChannelSetupWizardAdapterFromSetupWizard } from "../../../src/channels/plugins/setup-wizard.js"; -import { withEnvAsync } from "../../../test/helpers/extensions/env.js"; +import { withEnvAsync } from "../../../test/helpers/native-plugins/env.js"; import "./zalo-js.test-mocks.js"; import { zalouserSetupPlugin } from "./channel.setup.js"; diff --git a/extensions/zalouser/src/channel.setup.ts b/native-plugins/zalouser/src/channel.setup.ts similarity index 100% rename from extensions/zalouser/src/channel.setup.ts rename to native-plugins/zalouser/src/channel.setup.ts diff --git a/extensions/zalouser/src/channel.test.ts b/native-plugins/zalouser/src/channel.test.ts similarity index 100% rename from extensions/zalouser/src/channel.test.ts rename to native-plugins/zalouser/src/channel.test.ts diff --git a/extensions/zalouser/src/channel.ts b/native-plugins/zalouser/src/channel.ts similarity index 99% rename from extensions/zalouser/src/channel.ts rename to native-plugins/zalouser/src/channel.ts index 24e46323a8d..a25e90c93cd 100644 --- a/extensions/zalouser/src/channel.ts +++ b/native-plugins/zalouser/src/channel.ts @@ -7,7 +7,7 @@ import { createStaticReplyToModeResolver, createTextPairingAdapter, } from "openclaw/plugin-sdk/channel-runtime"; -import { buildPassiveProbedChannelStatusSummary } from "openclaw/plugin-sdk/extension-shared"; +import { buildPassiveProbedChannelStatusSummary } from "openclaw/plugin-sdk/native-plugin-shared"; import type { ChannelAccountSnapshot, ChannelDirectoryEntry, diff --git a/extensions/zalouser/src/config-schema.ts b/native-plugins/zalouser/src/config-schema.ts similarity index 100% rename from extensions/zalouser/src/config-schema.ts rename to native-plugins/zalouser/src/config-schema.ts diff --git a/extensions/zalouser/src/group-policy.test.ts b/native-plugins/zalouser/src/group-policy.test.ts similarity index 100% rename from extensions/zalouser/src/group-policy.test.ts rename to native-plugins/zalouser/src/group-policy.test.ts diff --git a/extensions/zalouser/src/group-policy.ts b/native-plugins/zalouser/src/group-policy.ts similarity index 100% rename from extensions/zalouser/src/group-policy.ts rename to native-plugins/zalouser/src/group-policy.ts diff --git a/extensions/zalouser/src/message-sid.test.ts b/native-plugins/zalouser/src/message-sid.test.ts similarity index 100% rename from extensions/zalouser/src/message-sid.test.ts rename to native-plugins/zalouser/src/message-sid.test.ts diff --git a/extensions/zalouser/src/message-sid.ts b/native-plugins/zalouser/src/message-sid.ts similarity index 100% rename from extensions/zalouser/src/message-sid.ts rename to native-plugins/zalouser/src/message-sid.ts diff --git a/extensions/zalouser/src/monitor.account-scope.test.ts b/native-plugins/zalouser/src/monitor.account-scope.test.ts similarity index 100% rename from extensions/zalouser/src/monitor.account-scope.test.ts rename to native-plugins/zalouser/src/monitor.account-scope.test.ts diff --git a/extensions/zalouser/src/monitor.group-gating.test.ts b/native-plugins/zalouser/src/monitor.group-gating.test.ts similarity index 100% rename from extensions/zalouser/src/monitor.group-gating.test.ts rename to native-plugins/zalouser/src/monitor.group-gating.test.ts diff --git a/extensions/zalouser/src/monitor.send-mocks.ts b/native-plugins/zalouser/src/monitor.send-mocks.ts similarity index 100% rename from extensions/zalouser/src/monitor.send-mocks.ts rename to native-plugins/zalouser/src/monitor.send-mocks.ts diff --git a/extensions/zalouser/src/monitor.ts b/native-plugins/zalouser/src/monitor.ts similarity index 99% rename from extensions/zalouser/src/monitor.ts rename to native-plugins/zalouser/src/monitor.ts index 31853fb207f..7f9460595ad 100644 --- a/extensions/zalouser/src/monitor.ts +++ b/native-plugins/zalouser/src/monitor.ts @@ -2,8 +2,8 @@ import { DM_GROUP_ACCESS_REASON, resolveDmGroupAccessWithLists, } from "openclaw/plugin-sdk/channel-policy"; -import { createDeferred } from "openclaw/plugin-sdk/extension-shared"; import { KeyedAsyncQueue } from "openclaw/plugin-sdk/keyed-async-queue"; +import { createDeferred } from "openclaw/plugin-sdk/native-plugin-shared"; import { DEFAULT_GROUP_HISTORY_LIMIT, type HistoryEntry, diff --git a/extensions/zalouser/src/probe.test.ts b/native-plugins/zalouser/src/probe.test.ts similarity index 100% rename from extensions/zalouser/src/probe.test.ts rename to native-plugins/zalouser/src/probe.test.ts diff --git a/extensions/zalouser/src/probe.ts b/native-plugins/zalouser/src/probe.ts similarity index 100% rename from extensions/zalouser/src/probe.ts rename to native-plugins/zalouser/src/probe.ts diff --git a/extensions/zalouser/src/qr-temp-file.ts b/native-plugins/zalouser/src/qr-temp-file.ts similarity index 100% rename from extensions/zalouser/src/qr-temp-file.ts rename to native-plugins/zalouser/src/qr-temp-file.ts diff --git a/extensions/zalouser/src/reaction.test.ts b/native-plugins/zalouser/src/reaction.test.ts similarity index 100% rename from extensions/zalouser/src/reaction.test.ts rename to native-plugins/zalouser/src/reaction.test.ts diff --git a/extensions/zalouser/src/reaction.ts b/native-plugins/zalouser/src/reaction.ts similarity index 100% rename from extensions/zalouser/src/reaction.ts rename to native-plugins/zalouser/src/reaction.ts diff --git a/extensions/zalouser/src/runtime.ts b/native-plugins/zalouser/src/runtime.ts similarity index 100% rename from extensions/zalouser/src/runtime.ts rename to native-plugins/zalouser/src/runtime.ts diff --git a/extensions/zalouser/src/send.test.ts b/native-plugins/zalouser/src/send.test.ts similarity index 100% rename from extensions/zalouser/src/send.test.ts rename to native-plugins/zalouser/src/send.test.ts diff --git a/extensions/zalouser/src/send.ts b/native-plugins/zalouser/src/send.ts similarity index 100% rename from extensions/zalouser/src/send.ts rename to native-plugins/zalouser/src/send.ts diff --git a/extensions/zalouser/src/session-route.ts b/native-plugins/zalouser/src/session-route.ts similarity index 100% rename from extensions/zalouser/src/session-route.ts rename to native-plugins/zalouser/src/session-route.ts diff --git a/extensions/zalouser/src/setup-core.ts b/native-plugins/zalouser/src/setup-core.ts similarity index 100% rename from extensions/zalouser/src/setup-core.ts rename to native-plugins/zalouser/src/setup-core.ts diff --git a/extensions/zalouser/src/setup-surface.test.ts b/native-plugins/zalouser/src/setup-surface.test.ts similarity index 98% rename from extensions/zalouser/src/setup-surface.test.ts rename to native-plugins/zalouser/src/setup-surface.test.ts index 14030a60936..b9662cda4e7 100644 --- a/extensions/zalouser/src/setup-surface.test.ts +++ b/native-plugins/zalouser/src/setup-surface.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it, vi } from "vitest"; import { buildChannelSetupWizardAdapterFromSetupWizard } from "../../../src/channels/plugins/setup-wizard.js"; -import { createRuntimeEnv } from "../../../test/helpers/extensions/runtime-env.js"; -import { createTestWizardPrompter } from "../../../test/helpers/extensions/setup-wizard.js"; +import { createRuntimeEnv } from "../../../test/helpers/native-plugins/runtime-env.js"; +import { createTestWizardPrompter } from "../../../test/helpers/native-plugins/setup-wizard.js"; import type { OpenClawConfig } from "../runtime-api.js"; import "./zalo-js.test-mocks.js"; import { zalouserPlugin } from "./channel.js"; diff --git a/extensions/zalouser/src/setup-surface.ts b/native-plugins/zalouser/src/setup-surface.ts similarity index 100% rename from extensions/zalouser/src/setup-surface.ts rename to native-plugins/zalouser/src/setup-surface.ts diff --git a/extensions/zalouser/src/shared.ts b/native-plugins/zalouser/src/shared.ts similarity index 100% rename from extensions/zalouser/src/shared.ts rename to native-plugins/zalouser/src/shared.ts diff --git a/extensions/zalouser/src/status-issues.test.ts b/native-plugins/zalouser/src/status-issues.test.ts similarity index 96% rename from extensions/zalouser/src/status-issues.test.ts rename to native-plugins/zalouser/src/status-issues.test.ts index bd1ae4d4cd4..3e6e487eec1 100644 --- a/extensions/zalouser/src/status-issues.test.ts +++ b/native-plugins/zalouser/src/status-issues.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { expectOpenDmPolicyConfigIssue } from "../../../test/helpers/extensions/status-issues.js"; +import { expectOpenDmPolicyConfigIssue } from "../../../test/helpers/native-plugins/status-issues.js"; import { collectZalouserStatusIssues } from "./status-issues.js"; describe("collectZalouserStatusIssues", () => { diff --git a/extensions/zalouser/src/status-issues.ts b/native-plugins/zalouser/src/status-issues.ts similarity index 96% rename from extensions/zalouser/src/status-issues.ts rename to native-plugins/zalouser/src/status-issues.ts index 6e43bf0ec3d..4ab0be9b242 100644 --- a/extensions/zalouser/src/status-issues.ts +++ b/native-plugins/zalouser/src/status-issues.ts @@ -1,7 +1,7 @@ import { coerceStatusIssueAccountId, readStatusIssueFields, -} from "openclaw/plugin-sdk/extension-shared"; +} from "openclaw/plugin-sdk/native-plugin-shared"; import type { ChannelAccountSnapshot, ChannelStatusIssue } from "../runtime-api.js"; const ZALOUSER_STATUS_FIELDS = [ diff --git a/extensions/zalouser/src/test-helpers.ts b/native-plugins/zalouser/src/test-helpers.ts similarity index 100% rename from extensions/zalouser/src/test-helpers.ts rename to native-plugins/zalouser/src/test-helpers.ts diff --git a/extensions/zalouser/src/text-styles.test.ts b/native-plugins/zalouser/src/text-styles.test.ts similarity index 100% rename from extensions/zalouser/src/text-styles.test.ts rename to native-plugins/zalouser/src/text-styles.test.ts diff --git a/extensions/zalouser/src/text-styles.ts b/native-plugins/zalouser/src/text-styles.ts similarity index 100% rename from extensions/zalouser/src/text-styles.ts rename to native-plugins/zalouser/src/text-styles.ts diff --git a/extensions/zalouser/src/tool.test.ts b/native-plugins/zalouser/src/tool.test.ts similarity index 100% rename from extensions/zalouser/src/tool.test.ts rename to native-plugins/zalouser/src/tool.test.ts diff --git a/extensions/zalouser/src/tool.ts b/native-plugins/zalouser/src/tool.ts similarity index 100% rename from extensions/zalouser/src/tool.ts rename to native-plugins/zalouser/src/tool.ts diff --git a/extensions/zalouser/src/types.ts b/native-plugins/zalouser/src/types.ts similarity index 100% rename from extensions/zalouser/src/types.ts rename to native-plugins/zalouser/src/types.ts diff --git a/extensions/zalouser/src/zalo-js.test-mocks.ts b/native-plugins/zalouser/src/zalo-js.test-mocks.ts similarity index 100% rename from extensions/zalouser/src/zalo-js.test-mocks.ts rename to native-plugins/zalouser/src/zalo-js.test-mocks.ts diff --git a/extensions/zalouser/src/zalo-js.ts b/native-plugins/zalouser/src/zalo-js.ts similarity index 100% rename from extensions/zalouser/src/zalo-js.ts rename to native-plugins/zalouser/src/zalo-js.ts diff --git a/extensions/zalouser/src/zca-client.ts b/native-plugins/zalouser/src/zca-client.ts similarity index 100% rename from extensions/zalouser/src/zca-client.ts rename to native-plugins/zalouser/src/zca-client.ts diff --git a/extensions/zalouser/src/zca-constants.ts b/native-plugins/zalouser/src/zca-constants.ts similarity index 100% rename from extensions/zalouser/src/zca-constants.ts rename to native-plugins/zalouser/src/zca-constants.ts diff --git a/extensions/zalouser/src/zca-js-exports.d.ts b/native-plugins/zalouser/src/zca-js-exports.d.ts similarity index 100% rename from extensions/zalouser/src/zca-js-exports.d.ts rename to native-plugins/zalouser/src/zca-js-exports.d.ts diff --git a/package.json b/package.json index ed8cc402625..3ca3ebd9445 100644 --- a/package.json +++ b/package.json @@ -325,6 +325,10 @@ "types": "./dist/plugin-sdk/diffs.d.ts", "default": "./dist/plugin-sdk/diffs.js" }, + "./plugin-sdk/native-plugin-shared": { + "types": "./dist/plugin-sdk/native-plugin-shared.d.ts", + "default": "./dist/plugin-sdk/native-plugin-shared.js" + }, "./plugin-sdk/extension-shared": { "types": "./dist/plugin-sdk/extension-shared.d.ts", "default": "./dist/plugin-sdk/extension-shared.js" @@ -546,7 +550,7 @@ "build:plugin-sdk:dts": "tsc -p tsconfig.plugin-sdk.dts.json", "build:strict-smoke": "pnpm canvas:a2ui:bundle && node scripts/tsdown-build.mjs && node scripts/runtime-postbuild.mjs && pnpm build:plugin-sdk:dts", "canvas:a2ui:bundle": "bash scripts/bundle-a2ui.sh", - "check": "pnpm check:host-env-policy:swift && pnpm check:bundled-provider-auth-env-vars && pnpm format:check && pnpm tsgo && pnpm plugin-sdk:check-exports && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:agent:ingress-owner && pnpm lint:plugins:no-register-http-handler && pnpm lint:plugins:no-monolithic-plugin-sdk-entry-imports && pnpm lint:plugins:no-extension-src-imports && pnpm lint:plugins:no-extension-test-core-imports && pnpm lint:plugins:no-extension-imports && pnpm lint:plugins:plugin-sdk-subpaths-exported && pnpm lint:extensions:no-src-outside-plugin-sdk && pnpm lint:extensions:no-plugin-sdk-internal && pnpm lint:extensions:no-relative-outside-package && pnpm lint:web-search-provider-boundaries && pnpm lint:webhook:no-low-level-body-read && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope", + "check": "pnpm check:host-env-policy:swift && pnpm check:bundled-provider-auth-env-vars && pnpm format:check && pnpm tsgo && pnpm plugin-sdk:check-exports && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:agent:ingress-owner && pnpm lint:plugins:no-register-http-handler && pnpm lint:plugins:no-monolithic-plugin-sdk-entry-imports && pnpm lint:plugins:no-native-plugin-src-imports && pnpm lint:plugins:no-native-plugin-test-core-imports && pnpm lint:plugins:no-native-plugin-imports && pnpm lint:plugins:plugin-sdk-subpaths-exported && pnpm lint:native-plugins:no-src-outside-plugin-sdk && pnpm lint:native-plugins:no-plugin-sdk-internal && pnpm lint:native-plugins:no-relative-outside-package && pnpm lint:web-search-provider-boundaries && pnpm lint:webhook:no-low-level-body-read && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope", "check:bundled-provider-auth-env-vars": "node scripts/generate-bundled-provider-auth-env-vars.mjs --check", "check:docs": "pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-i18n-glossary && pnpm docs:check-links", "check:host-env-policy:swift": "node scripts/generate-host-env-security-policy-swift.mjs --check", @@ -559,7 +563,7 @@ "deadcode:report:ci:knip": "mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true", "deadcode:report:ci:ts-prune": "mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true", "deadcode:report:ci:ts-unused": "mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true", - "deadcode:ts-prune": "pnpm dlx ts-prune src extensions scripts", + "deadcode:ts-prune": "pnpm dlx ts-prune src native-plugins scripts", "deadcode:ts-unused": "pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount", "dev": "node scripts/run-node.mjs", "docs:bin": "node scripts/build-docs-list.mjs", @@ -569,8 +573,8 @@ "docs:list": "node scripts/docs-list.js", "docs:spellcheck": "bash scripts/docs-spellcheck.sh", "docs:spellcheck:fix": "bash scripts/docs-spellcheck.sh --write", - "dup:check": "jscpd src extensions test scripts --format typescript,javascript --pattern \"**/*.{ts,tsx,js,mjs,cjs}\" --gitignore --noSymlinks --ignore \"**/node_modules/**,**/dist/**,**/.git/**,**/coverage/**,**/build/**,**/.build/**,**/.artifacts/**\" --min-lines 12 --min-tokens 80 --reporters console", - "dup:check:json": "jscpd src extensions test scripts --format typescript,javascript --pattern \"**/*.{ts,tsx,js,mjs,cjs}\" --gitignore --noSymlinks --ignore \"**/node_modules/**,**/dist/**,**/.git/**,**/coverage/**,**/build/**,**/.build/**,**/.artifacts/**\" --min-lines 12 --min-tokens 80 --reporters json --output .artifacts/jscpd", + "dup:check": "jscpd src native-plugins test scripts --format typescript,javascript --pattern \"**/*.{ts,tsx,js,mjs,cjs}\" --gitignore --noSymlinks --ignore \"**/node_modules/**,**/dist/**,**/.git/**,**/coverage/**,**/build/**,**/.build/**,**/.artifacts/**\" --min-lines 12 --min-tokens 80 --reporters console", + "dup:check:json": "jscpd src native-plugins test scripts --format typescript,javascript --pattern \"**/*.{ts,tsx,js,mjs,cjs}\" --gitignore --noSymlinks --ignore \"**/node_modules/**,**/dist/**,**/.git/**,**/coverage/**,**/build/**,**/.build/**,**/.artifacts/**\" --min-lines 12 --min-tokens 80 --reporters json --output .artifacts/jscpd", "format": "oxfmt --write", "format:all": "pnpm format && pnpm format:swift", "format:check": "oxfmt --check", @@ -598,14 +602,20 @@ "lint:auth:pairing-account-scope": "node scripts/check-pairing-account-scope.mjs", "lint:docs": "pnpm dlx markdownlint-cli2", "lint:docs:fix": "pnpm dlx markdownlint-cli2 --fix", - "lint:extensions:no-plugin-sdk-internal": "node scripts/check-extension-plugin-sdk-boundary.mjs --mode=plugin-sdk-internal", - "lint:extensions:no-relative-outside-package": "node scripts/check-extension-plugin-sdk-boundary.mjs --mode=relative-outside-package", - "lint:extensions:no-src-outside-plugin-sdk": "node scripts/check-extension-plugin-sdk-boundary.mjs --mode=src-outside-plugin-sdk", + "lint:extensions:no-plugin-sdk-internal": "pnpm lint:native-plugins:no-plugin-sdk-internal", + "lint:extensions:no-relative-outside-package": "pnpm lint:native-plugins:no-relative-outside-package", + "lint:extensions:no-src-outside-plugin-sdk": "pnpm lint:native-plugins:no-src-outside-plugin-sdk", "lint:fix": "oxlint --type-aware --fix && pnpm format", - "lint:plugins:no-extension-imports": "node scripts/check-plugin-extension-import-boundary.mjs", - "lint:plugins:no-extension-src-imports": "node --import tsx scripts/check-no-extension-src-imports.ts", - "lint:plugins:no-extension-test-core-imports": "node --import tsx scripts/check-no-extension-test-core-imports.ts", + "lint:native-plugins:no-plugin-sdk-internal": "node scripts/check-native-plugin-plugin-sdk-boundary.mjs --mode=plugin-sdk-internal", + "lint:native-plugins:no-relative-outside-package": "node scripts/check-native-plugin-plugin-sdk-boundary.mjs --mode=relative-outside-package", + "lint:native-plugins:no-src-outside-plugin-sdk": "node scripts/check-native-plugin-plugin-sdk-boundary.mjs --mode=src-outside-plugin-sdk", + "lint:plugins:no-extension-imports": "pnpm lint:plugins:no-native-plugin-imports", + "lint:plugins:no-extension-src-imports": "pnpm lint:plugins:no-native-plugin-src-imports", + "lint:plugins:no-extension-test-core-imports": "pnpm lint:plugins:no-native-plugin-test-core-imports", "lint:plugins:no-monolithic-plugin-sdk-entry-imports": "node --import tsx scripts/check-no-monolithic-plugin-sdk-entry-imports.ts", + "lint:plugins:no-native-plugin-imports": "node scripts/check-plugin-native-plugin-import-boundary.mjs", + "lint:plugins:no-native-plugin-src-imports": "node --import tsx scripts/check-no-native-plugin-src-imports.ts", + "lint:plugins:no-native-plugin-test-core-imports": "node --import tsx scripts/check-no-native-plugin-test-core-imports.ts", "lint:plugins:no-register-http-handler": "node scripts/check-no-register-http-handler.mjs", "lint:plugins:plugin-sdk-subpaths-exported": "node scripts/check-plugin-sdk-subpath-exports.mjs", "lint:swift": "swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)", @@ -655,9 +665,9 @@ "test:docker:qr": "bash scripts/e2e/qr-import-docker.sh", "test:e2e": "vitest run --config vitest.e2e.config.ts", "test:e2e:openshell": "OPENCLAW_E2E_OPENSHELL=1 vitest run --config vitest.e2e.config.ts test/openshell-sandbox.e2e.test.ts", - "test:extension": "node scripts/test-extension.mjs", - "test:extensions": "vitest run --config vitest.extensions.config.ts", - "test:extensions:memory": "node scripts/profile-extension-memory.mjs", + "test:extension": "pnpm test:native-plugin", + "test:extensions": "pnpm test:native-plugins", + "test:extensions:memory": "pnpm test:native-plugins:memory", "test:fast": "vitest run --config vitest.unit.config.ts", "test:force": "node --import tsx scripts/test-force.ts", "test:gateway": "vitest run --config vitest.gateway.config.ts --pool=forks", @@ -668,6 +678,9 @@ "test:install:smoke": "bash scripts/test-install-sh-docker.sh", "test:live": "OPENCLAW_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts", "test:macmini": "OPENCLAW_TEST_VM_FORKS=0 OPENCLAW_TEST_PROFILE=macmini node scripts/test-parallel.mjs", + "test:native-plugin": "node scripts/test-native-plugin.mjs", + "test:native-plugins": "vitest run --config vitest.native-plugins.config.ts", + "test:native-plugins:memory": "node scripts/profile-native-plugin-memory.mjs", "test:parallels:linux": "bash scripts/e2e/parallels-linux-smoke.sh", "test:parallels:macos": "bash scripts/e2e/parallels-macos-smoke.sh", "test:parallels:windows": "bash scripts/e2e/parallels-windows-smoke.sh", @@ -678,7 +691,7 @@ "test:sectriage": "pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts", "test:startup:memory": "node scripts/check-cli-startup-memory.mjs", "test:ui": "pnpm lint:ui:no-raw-window-open && pnpm --dir ui test", - "test:voicecall:closedloop": "vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1", + "test:voicecall:closedloop": "vitest run native-plugins/voice-call/src/manager.test.ts native-plugins/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1", "test:watch": "vitest", "tui": "node scripts/run-node.mjs tui", "tui:dev": "OPENCLAW_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f821a4aa3c4..2841fe7c44e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -232,33 +232,33 @@ importers: specifier: ^4.1.0 version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(@vitest/browser-playwright@4.1.0)(jsdom@29.0.0(@noble/hashes@2.0.1))(vite@8.0.0(@types/node@25.5.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)) - extensions/acpx: + native-plugins/acpx: dependencies: acpx: specifier: 0.3.0 version: 0.3.0(zod@4.3.6) - extensions/amazon-bedrock: {} + native-plugins/amazon-bedrock: {} - extensions/anthropic: {} + native-plugins/anthropic: {} - extensions/bluebubbles: + native-plugins/bluebubbles: dependencies: zod: specifier: ^4.3.6 version: 4.3.6 - extensions/brave: {} + native-plugins/brave: {} - extensions/byteplus: {} + native-plugins/byteplus: {} - extensions/chutes: {} + native-plugins/chutes: {} - extensions/cloudflare-ai-gateway: {} + native-plugins/cloudflare-ai-gateway: {} - extensions/copilot-proxy: {} + native-plugins/copilot-proxy: {} - extensions/diagnostics-otel: + native-plugins/diagnostics-otel: dependencies: '@opentelemetry/api': specifier: ^1.9.0 @@ -294,7 +294,7 @@ importers: specifier: ^1.40.0 version: 1.40.0 - extensions/diffs: + native-plugins/diffs: dependencies: '@pierre/diffs': specifier: 1.1.1 @@ -306,7 +306,7 @@ importers: specifier: 1.58.2 version: 1.58.2 - extensions/discord: + native-plugins/discord: dependencies: '@buape/carbon': specifier: 0.0.0-beta-20260317045421 @@ -324,11 +324,11 @@ importers: specifier: ^0.1.1 version: 0.1.1 - extensions/elevenlabs: {} + native-plugins/elevenlabs: {} - extensions/fal: {} + native-plugins/fal: {} - extensions/feishu: + native-plugins/feishu: dependencies: '@larksuiteoapi/node-sdk': specifier: ^1.59.0 @@ -343,13 +343,13 @@ importers: specifier: ^4.3.6 version: 4.3.6 - extensions/firecrawl: {} + native-plugins/firecrawl: {} - extensions/github-copilot: {} + native-plugins/github-copilot: {} - extensions/google: {} + native-plugins/google: {} - extensions/googlechat: + native-plugins/googlechat: dependencies: google-auth-library: specifier: ^10.6.2 @@ -358,23 +358,23 @@ importers: specifier: '>=2026.3.11' version: 2026.3.13(@napi-rs/canvas@0.1.95)(@types/express@5.0.6)(audio-decode@2.2.3)(jimp@1.6.0)(node-llama-cpp@3.16.2(typescript@5.9.3)) - extensions/huggingface: {} + native-plugins/huggingface: {} - extensions/imessage: {} + native-plugins/imessage: {} - extensions/irc: + native-plugins/irc: dependencies: zod: specifier: ^4.3.6 version: 4.3.6 - extensions/kilocode: {} + native-plugins/kilocode: {} - extensions/kimi-coding: {} + native-plugins/kimi-coding: {} - extensions/line: {} + native-plugins/line: {} - extensions/llm-task: + native-plugins/llm-task: dependencies: '@sinclair/typebox': specifier: 0.34.48 @@ -383,13 +383,13 @@ importers: specifier: ^8.18.0 version: 8.18.0 - extensions/lobster: + native-plugins/lobster: dependencies: '@sinclair/typebox': specifier: 0.34.48 version: 0.34.48 - extensions/matrix: + native-plugins/matrix: dependencies: '@matrix-org/matrix-sdk-crypto-nodejs': specifier: ^0.4.0 @@ -414,7 +414,7 @@ importers: specifier: workspace:* version: link:../.. - extensions/mattermost: + native-plugins/mattermost: dependencies: ws: specifier: ^8.19.0 @@ -423,13 +423,13 @@ importers: specifier: ^4.3.6 version: 4.3.6 - extensions/memory-core: + native-plugins/memory-core: dependencies: openclaw: specifier: '>=2026.3.11' version: 2026.3.13(@napi-rs/canvas@0.1.95)(@types/express@5.0.6)(audio-decode@2.2.3)(jimp@1.6.0)(node-llama-cpp@3.16.2(typescript@5.9.3)) - extensions/memory-lancedb: + native-plugins/memory-lancedb: dependencies: '@lancedb/lancedb': specifier: ^0.27.0 @@ -441,17 +441,17 @@ importers: specifier: ^6.32.0 version: 6.32.0(ws@8.19.0)(zod@4.3.6) - extensions/microsoft: {} + native-plugins/microsoft: {} - extensions/minimax: {} + native-plugins/minimax: {} - extensions/mistral: {} + native-plugins/mistral: {} - extensions/modelstudio: {} + native-plugins/modelstudio: {} - extensions/moonshot: {} + native-plugins/moonshot: {} - extensions/msteams: + native-plugins/msteams: dependencies: '@microsoft/agents-hosting': specifier: ^1.3.1 @@ -463,13 +463,13 @@ importers: specifier: ^11.1.0 version: 11.1.0 - extensions/nextcloud-talk: + native-plugins/nextcloud-talk: dependencies: zod: specifier: ^4.3.6 version: 4.3.6 - extensions/nostr: + native-plugins/nostr: dependencies: nostr-tools: specifier: ^2.23.3 @@ -478,31 +478,31 @@ importers: specifier: ^4.3.6 version: 4.3.6 - extensions/nvidia: {} + native-plugins/nvidia: {} - extensions/ollama: {} + native-plugins/ollama: {} - extensions/open-prose: {} + native-plugins/open-prose: {} - extensions/openai: {} + native-plugins/openai: {} - extensions/opencode: {} + native-plugins/opencode: {} - extensions/opencode-go: {} + native-plugins/opencode-go: {} - extensions/openrouter: {} + native-plugins/openrouter: {} - extensions/openshell: {} + native-plugins/openshell: {} - extensions/perplexity: {} + native-plugins/perplexity: {} - extensions/qianfan: {} + native-plugins/qianfan: {} - extensions/sglang: {} + native-plugins/sglang: {} - extensions/signal: {} + native-plugins/signal: {} - extensions/slack: + native-plugins/slack: dependencies: '@slack/bolt': specifier: ^4.6.0 @@ -511,17 +511,17 @@ importers: specifier: ^7.15.0 version: 7.15.0 - extensions/synology-chat: + native-plugins/synology-chat: dependencies: zod: specifier: ^4.3.6 version: 4.3.6 - extensions/synthetic: {} + native-plugins/synthetic: {} - extensions/tavily: {} + native-plugins/tavily: {} - extensions/telegram: + native-plugins/telegram: dependencies: '@grammyjs/runner': specifier: ^2.0.3 @@ -533,7 +533,7 @@ importers: specifier: ^1.41.1 version: 1.41.1 - extensions/tlon: + native-plugins/tlon: dependencies: '@aws-sdk/client-s3': specifier: 3.1000.0 @@ -551,9 +551,9 @@ importers: specifier: ^4.3.6 version: 4.3.6 - extensions/together: {} + native-plugins/together: {} - extensions/twitch: + native-plugins/twitch: dependencies: '@twurple/api': specifier: ^8.0.3 @@ -568,13 +568,13 @@ importers: specifier: ^4.3.6 version: 4.3.6 - extensions/venice: {} + native-plugins/venice: {} - extensions/vercel-ai-gateway: {} + native-plugins/vercel-ai-gateway: {} - extensions/vllm: {} + native-plugins/vllm: {} - extensions/voice-call: + native-plugins/voice-call: dependencies: '@sinclair/typebox': specifier: 0.34.48 @@ -589,21 +589,21 @@ importers: specifier: ^4.3.6 version: 4.3.6 - extensions/volcengine: {} + native-plugins/volcengine: {} - extensions/whatsapp: + native-plugins/whatsapp: dependencies: '@whiskeysockets/baileys': specifier: 7.0.0-rc.9 version: 7.0.0-rc.9(audio-decode@2.2.3)(jimp@1.6.0)(sharp@0.34.5) - extensions/xai: {} + native-plugins/xai: {} - extensions/xiaomi: {} + native-plugins/xiaomi: {} - extensions/zai: {} + native-plugins/zai: {} - extensions/zalo: + native-plugins/zalo: dependencies: undici: specifier: 7.24.4 @@ -612,7 +612,7 @@ importers: specifier: ^4.3.6 version: 4.3.6 - extensions/zalouser: + native-plugins/zalouser: dependencies: '@sinclair/typebox': specifier: 0.34.48 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index b708dca4578..92649d78800 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,7 +2,7 @@ packages: - . - ui - packages/* - - extensions/* + - native-plugins/* onlyBuiltDependencies: - "@lydell/node-pty" diff --git a/scripts/audit-plugin-sdk-seams.mjs b/scripts/audit-plugin-sdk-seams.mjs index 4d34a3dd939..a8b9e1a1adf 100644 --- a/scripts/audit-plugin-sdk-seams.mjs +++ b/scripts/audit-plugin-sdk-seams.mjs @@ -12,11 +12,11 @@ const workspacePackagePaths = ["ui/package.json"]; const compareStrings = (left, right) => left.localeCompare(right); async function collectWorkspacePackagePaths() { - const extensionsRoot = path.join(repoRoot, "extensions"); - const entries = await fs.readdir(extensionsRoot, { withFileTypes: true }); + const nativePluginsRoot = path.join(repoRoot, "native-plugins"); + const entries = await fs.readdir(nativePluginsRoot, { withFileTypes: true }); for (const entry of entries) { if (entry.isDirectory()) { - workspacePackagePaths.push(path.join("extensions", entry.name, "package.json")); + workspacePackagePaths.push(path.join("native-plugins", entry.name, "package.json")); } } } @@ -80,7 +80,7 @@ function normalizePluginSdkFamily(resolvedPath) { } function resolveOptionalClusterFromPath(resolvedPath) { - if (resolvedPath.startsWith("extensions/")) { + if (resolvedPath.startsWith("native-plugins/")) { const cluster = resolvedPath.split("/")[1]; return optionalBundledClusterSet.has(cluster) ? cluster : null; } @@ -331,8 +331,8 @@ function packageClusterMeta(relativePackagePath) { cluster, packageName: null, packagePath: relativePackagePath, - reachability: relativePackagePath.startsWith("extensions/") - ? "extension-workspace" + reachability: relativePackagePath.startsWith("native-plugins/") + ? "native-plugin-workspace" : "workspace", }; } @@ -378,7 +378,7 @@ async function buildMissingPackages() { const pluginSdkReachability = new Map(); for (const filePath of pluginSdkEntrySources) { const source = await fs.readFile(filePath, "utf8"); - const matches = [...source.matchAll(/from\s+"(\.\.\/\.\.\/extensions\/([^/]+)\/[^"]+)"/g)]; + const matches = [...source.matchAll(/from\s+"(\.\.\/\.\.\/native-plugins\/([^/]+)\/[^"]+)"/g)]; for (const match of matches) { const cluster = match[2]; const bucket = pluginSdkReachability.get(cluster) ?? new Set(); diff --git a/scripts/check-architecture-smells.mjs b/scripts/check-architecture-smells.mjs index c10973355bc..9288615ec5b 100644 --- a/scripts/check-architecture-smells.mjs +++ b/scripts/check-architecture-smells.mjs @@ -59,7 +59,7 @@ function scanPluginSdkExtensionFacadeSmells(sourceFile, filePath) { ) { const specifier = node.moduleSpecifier.text; const resolvedPath = resolveSpecifier(specifier, filePath); - if (resolvedPath?.startsWith("extensions/")) { + if (resolvedPath?.startsWith("native-plugins/")) { pushEntry(entries, { category: "plugin-sdk-extension-facade", file: relativeFile, diff --git a/scripts/check-extension-plugin-sdk-boundary.mjs b/scripts/check-extension-plugin-sdk-boundary.mjs index 91ed44230fc..31e4ab2d9b0 100644 --- a/scripts/check-extension-plugin-sdk-boundary.mjs +++ b/scripts/check-extension-plugin-sdk-boundary.mjs @@ -1,327 +1,11 @@ -#!/usr/bin/env node - -import { promises as fs } from "node:fs"; import path from "node:path"; -import { fileURLToPath } from "node:url"; -import ts from "typescript"; +import { pathToFileURL } from "node:url"; +import { main } from "./check-native-plugin-plugin-sdk-boundary.mjs"; -const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); -const extensionsRoot = path.join(repoRoot, "extensions"); +export * from "./check-native-plugin-plugin-sdk-boundary.mjs"; -const MODES = new Set([ - "src-outside-plugin-sdk", - "plugin-sdk-internal", - "relative-outside-package", -]); +const entryHref = process.argv[1] ? pathToFileURL(path.resolve(process.argv[1])).href : ""; -const baselinePathByMode = { - "src-outside-plugin-sdk": path.join( - repoRoot, - "test", - "fixtures", - "extension-src-outside-plugin-sdk-inventory.json", - ), - "plugin-sdk-internal": path.join( - repoRoot, - "test", - "fixtures", - "extension-plugin-sdk-internal-inventory.json", - ), - "relative-outside-package": path.join( - repoRoot, - "test", - "fixtures", - "extension-relative-outside-package-inventory.json", - ), -}; - -const ruleTextByMode = { - "src-outside-plugin-sdk": - "Rule: production extensions/** must not import src/** outside src/plugin-sdk/**", - "plugin-sdk-internal": - "Rule: production extensions/** must not import src/plugin-sdk-internal/**", - "relative-outside-package": - "Rule: production extensions/** must not use relative imports that escape their own extension package root", -}; - -function normalizePath(filePath) { - return path.relative(repoRoot, filePath).split(path.sep).join("/"); -} - -function isCodeFile(fileName) { - return /\.(ts|tsx|mts|cts|js|jsx|mjs|cjs)$/.test(fileName); -} - -function isTestLikeFile(relativePath) { - return ( - /(^|\/)(__tests__|fixtures|test|tests)\//.test(relativePath) || - /(^|\/)[^/]*test-(support|helpers)\.(ts|tsx|mts|cts|js|jsx|mjs|cjs)$/.test(relativePath) || - /\.(test|spec)\.(ts|tsx|mts|cts|js|jsx|mjs|cjs)$/.test(relativePath) - ); -} - -async function collectExtensionSourceFiles(rootDir) { - const out = []; - async function walk(dir) { - const entries = await fs.readdir(dir, { withFileTypes: true }); - for (const entry of entries) { - if (entry.name === "dist" || entry.name === "node_modules") { - continue; - } - const fullPath = path.join(dir, entry.name); - if (entry.isDirectory()) { - await walk(fullPath); - continue; - } - if (!entry.isFile() || !isCodeFile(entry.name)) { - continue; - } - const relativePath = normalizePath(fullPath); - if (isTestLikeFile(relativePath)) { - continue; - } - out.push(fullPath); - } - } - await walk(rootDir); - return out.toSorted((left, right) => normalizePath(left).localeCompare(normalizePath(right))); -} - -function toLine(sourceFile, node) { - return sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line + 1; -} - -function resolveSpecifier(specifier, importerFile) { - if (specifier.startsWith(".")) { - return normalizePath(path.resolve(path.dirname(importerFile), specifier)); - } - if (specifier.startsWith("/")) { - return normalizePath(specifier); - } - return null; -} - -function resolveExtensionRoot(filePath) { - const relativePath = normalizePath(filePath); - const segments = relativePath.split("/"); - if (segments[0] !== "extensions" || !segments[1]) { - return null; - } - return `${segments[0]}/${segments[1]}`; -} - -function classifyReason(mode, kind, resolvedPath, specifier) { - const verb = - kind === "export" - ? "re-exports" - : kind === "dynamic-import" - ? "dynamically imports" - : "imports"; - if (mode === "relative-outside-package") { - if (resolvedPath?.startsWith("src/plugin-sdk/")) { - return `${verb} plugin-sdk via relative path; use openclaw/plugin-sdk/`; - } - if (resolvedPath?.startsWith("src/")) { - return `${verb} core src path via relative path outside the extension package`; - } - if (resolvedPath?.startsWith("extensions/")) { - return `${verb} another extension via relative path outside the extension package`; - } - return `${verb} relative path ${specifier} outside the extension package`; - } - if (mode === "plugin-sdk-internal") { - return `${verb} src/plugin-sdk-internal from an extension`; - } - if (resolvedPath.startsWith("src/plugin-sdk/")) { - return `${verb} allowed plugin-sdk path`; - } - return `${verb} core src path outside plugin-sdk from an extension`; -} - -function compareEntries(left, right) { - return ( - left.file.localeCompare(right.file) || - left.line - right.line || - left.kind.localeCompare(right.kind) || - left.specifier.localeCompare(right.specifier) || - left.resolvedPath.localeCompare(right.resolvedPath) || - left.reason.localeCompare(right.reason) - ); -} - -function shouldReport(mode, resolvedPath) { - if (mode === "relative-outside-package") { - return false; - } - if (!resolvedPath?.startsWith("src/")) { - return false; - } - if (mode === "plugin-sdk-internal") { - return resolvedPath.startsWith("src/plugin-sdk-internal/"); - } - return !resolvedPath.startsWith("src/plugin-sdk/"); -} - -function collectFromSourceFile(mode, sourceFile, filePath) { - const entries = []; - const extensionRoot = resolveExtensionRoot(filePath); - - function push(kind, specifierNode, specifier) { - const resolvedPath = resolveSpecifier(specifier, filePath); - if (mode === "relative-outside-package") { - if (!specifier.startsWith(".") || !resolvedPath || !extensionRoot) { - return; - } - if (resolvedPath === extensionRoot || resolvedPath.startsWith(`${extensionRoot}/`)) { - return; - } - } else if (!shouldReport(mode, resolvedPath)) { - return; - } - entries.push({ - file: normalizePath(filePath), - line: toLine(sourceFile, specifierNode), - kind, - specifier, - resolvedPath, - reason: classifyReason(mode, kind, resolvedPath, specifier), - }); - } - - function visit(node) { - if (ts.isImportDeclaration(node) && ts.isStringLiteral(node.moduleSpecifier)) { - push("import", node.moduleSpecifier, node.moduleSpecifier.text); - } else if ( - ts.isExportDeclaration(node) && - node.moduleSpecifier && - ts.isStringLiteral(node.moduleSpecifier) - ) { - push("export", node.moduleSpecifier, node.moduleSpecifier.text); - } else if ( - ts.isCallExpression(node) && - node.expression.kind === ts.SyntaxKind.ImportKeyword && - node.arguments.length === 1 && - ts.isStringLiteral(node.arguments[0]) - ) { - push("dynamic-import", node.arguments[0], node.arguments[0].text); - } - ts.forEachChild(node, visit); - } - - visit(sourceFile); - return entries; -} - -export async function collectExtensionPluginSdkBoundaryInventory(mode) { - if (!MODES.has(mode)) { - throw new Error(`Unknown mode: ${mode}`); - } - const files = await collectExtensionSourceFiles(extensionsRoot); - const inventory = []; - for (const filePath of files) { - const source = await fs.readFile(filePath, "utf8"); - const scriptKind = - filePath.endsWith(".tsx") || filePath.endsWith(".jsx") ? ts.ScriptKind.TSX : ts.ScriptKind.TS; - const sourceFile = ts.createSourceFile( - filePath, - source, - ts.ScriptTarget.Latest, - true, - scriptKind, - ); - inventory.push(...collectFromSourceFile(mode, sourceFile, filePath)); - } - return inventory.toSorted(compareEntries); -} - -export async function readExpectedInventory(mode) { - try { - return JSON.parse(await fs.readFile(baselinePathByMode[mode], "utf8")); - } catch (error) { - if ( - (mode === "plugin-sdk-internal" || - mode === "src-outside-plugin-sdk" || - mode === "relative-outside-package") && - error && - typeof error === "object" && - "code" in error && - error.code === "ENOENT" - ) { - return []; - } - throw error; - } -} - -export function diffInventory(expected, actual) { - const expectedKeys = new Set(expected.map((entry) => JSON.stringify(entry))); - const actualKeys = new Set(actual.map((entry) => JSON.stringify(entry))); - return { - missing: expected - .filter((entry) => !actualKeys.has(JSON.stringify(entry))) - .toSorted(compareEntries), - unexpected: actual - .filter((entry) => !expectedKeys.has(JSON.stringify(entry))) - .toSorted(compareEntries), - }; -} - -function formatInventoryHuman(mode, inventory) { - const lines = [ruleTextByMode[mode]]; - if (inventory.length === 0) { - lines.push("No extension plugin-sdk boundary violations found."); - return lines.join("\n"); - } - lines.push("Extension boundary inventory:"); - let activeFile = ""; - for (const entry of inventory) { - if (entry.file !== activeFile) { - activeFile = entry.file; - lines.push(activeFile); - } - lines.push(` - line ${entry.line} [${entry.kind}] ${entry.reason}`); - lines.push(` specifier: ${entry.specifier}`); - lines.push(` resolved: ${entry.resolvedPath}`); - } - return lines.join("\n"); -} - -export async function main(argv = process.argv.slice(2)) { - const json = argv.includes("--json"); - const modeArg = argv.find((arg) => arg.startsWith("--mode=")); - const mode = modeArg?.slice("--mode=".length) ?? "src-outside-plugin-sdk"; - if (!MODES.has(mode)) { - throw new Error(`Unknown mode: ${mode}`); - } - - const actual = await collectExtensionPluginSdkBoundaryInventory(mode); - if (json) { - process.stdout.write(`${JSON.stringify(actual, null, 2)}\n`); - return; - } - - const expected = await readExpectedInventory(mode); - const diff = diffInventory(expected, actual); - console.log(formatInventoryHuman(mode, actual)); - if (diff.missing.length === 0 && diff.unexpected.length === 0) { - console.log(`Baseline matches (${actual.length} entries).`); - return; - } - if (diff.missing.length > 0) { - console.error(`Missing baseline entries (${diff.missing.length}):`); - for (const entry of diff.missing) { - console.error(` - ${entry.file}:${entry.line} ${entry.reason}`); - } - } - if (diff.unexpected.length > 0) { - console.error(`Unexpected inventory entries (${diff.unexpected.length}):`); - for (const entry of diff.unexpected) { - console.error(` - ${entry.file}:${entry.line} ${entry.reason}`); - } - } - process.exitCode = 1; -} - -if (path.resolve(process.argv[1] ?? "") === fileURLToPath(import.meta.url)) { +if (import.meta.url === entryHref) { await main(); } diff --git a/scripts/check-ingress-agent-owner-context.mjs b/scripts/check-ingress-agent-owner-context.mjs index da9da112c6b..147dcb4311e 100644 --- a/scripts/check-ingress-agent-owner-context.mjs +++ b/scripts/check-ingress-agent-owner-context.mjs @@ -5,9 +5,9 @@ import ts from "typescript"; import { runCallsiteGuard } from "./lib/callsite-guard.mjs"; import { runAsScript, toLine, unwrapExpression } from "./lib/ts-guard-utils.mjs"; -const sourceRoots = ["src/gateway", "extensions/discord/src/voice"]; +const sourceRoots = ["src/gateway", "native-plugins/discord/src/voice"]; const enforcedFiles = new Set([ - "extensions/discord/src/voice/manager.ts", + "native-plugins/discord/src/voice/manager.ts", "src/gateway/openai-http.ts", "src/gateway/openresponses-http.ts", "src/gateway/server-methods/agent.ts", diff --git a/scripts/check-native-plugin-plugin-sdk-boundary.mjs b/scripts/check-native-plugin-plugin-sdk-boundary.mjs new file mode 100644 index 00000000000..53e29232103 --- /dev/null +++ b/scripts/check-native-plugin-plugin-sdk-boundary.mjs @@ -0,0 +1,330 @@ +#!/usr/bin/env node + +import { promises as fs } from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import ts from "typescript"; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); +const nativePluginsRoot = path.join(repoRoot, "native-plugins"); + +const MODES = new Set([ + "src-outside-plugin-sdk", + "plugin-sdk-internal", + "relative-outside-package", +]); + +const baselinePathByMode = { + "src-outside-plugin-sdk": path.join( + repoRoot, + "test", + "fixtures", + "native-plugin-src-outside-plugin-sdk-inventory.json", + ), + "plugin-sdk-internal": path.join( + repoRoot, + "test", + "fixtures", + "native-plugin-plugin-sdk-internal-inventory.json", + ), + "relative-outside-package": path.join( + repoRoot, + "test", + "fixtures", + "native-plugin-relative-outside-package-inventory.json", + ), +}; + +const ruleTextByMode = { + "src-outside-plugin-sdk": + "Rule: production native-plugins/** must not import src/** outside src/plugin-sdk/**", + "plugin-sdk-internal": + "Rule: production native-plugins/** must not import src/plugin-sdk-internal/**", + "relative-outside-package": + "Rule: production native-plugins/** must not use relative imports that escape their own native plugin package root", +}; + +function normalizePath(filePath) { + return path.relative(repoRoot, filePath).split(path.sep).join("/"); +} + +function isCodeFile(fileName) { + return /\.(ts|tsx|mts|cts|js|jsx|mjs|cjs)$/.test(fileName); +} + +function isTestLikeFile(relativePath) { + return ( + /(^|\/)(__tests__|fixtures|test|tests)\//.test(relativePath) || + /(^|\/)[^/]*test-(support|helpers)\.(ts|tsx|mts|cts|js|jsx|mjs|cjs)$/.test(relativePath) || + /\.(test|spec)\.(ts|tsx|mts|cts|js|jsx|mjs|cjs)$/.test(relativePath) + ); +} + +async function collectNativePluginSourceFiles(rootDir) { + const out = []; + async function walk(dir) { + const entries = await fs.readdir(dir, { withFileTypes: true }); + for (const entry of entries) { + if (entry.name === "dist" || entry.name === "node_modules") { + continue; + } + const fullPath = path.join(dir, entry.name); + if (entry.isDirectory()) { + await walk(fullPath); + continue; + } + if (!entry.isFile() || !isCodeFile(entry.name)) { + continue; + } + const relativePath = normalizePath(fullPath); + if (isTestLikeFile(relativePath)) { + continue; + } + out.push(fullPath); + } + } + await walk(rootDir); + return out.toSorted((left, right) => normalizePath(left).localeCompare(normalizePath(right))); +} + +function toLine(sourceFile, node) { + return sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line + 1; +} + +function resolveSpecifier(specifier, importerFile) { + if (specifier.startsWith(".")) { + return normalizePath(path.resolve(path.dirname(importerFile), specifier)); + } + if (specifier.startsWith("/")) { + return normalizePath(specifier); + } + return null; +} + +function resolveNativePluginRoot(filePath) { + const relativePath = normalizePath(filePath); + const segments = relativePath.split("/"); + if (segments[0] !== "native-plugins" || !segments[1]) { + return null; + } + return `${segments[0]}/${segments[1]}`; +} + +function classifyReason(mode, kind, resolvedPath, specifier) { + const verb = + kind === "export" + ? "re-exports" + : kind === "dynamic-import" + ? "dynamically imports" + : "imports"; + if (mode === "relative-outside-package") { + if (resolvedPath?.startsWith("src/plugin-sdk/")) { + return `${verb} plugin-sdk via relative path; use openclaw/plugin-sdk/`; + } + if (resolvedPath?.startsWith("src/")) { + return `${verb} core src path via relative path outside the native plugin package`; + } + if (resolvedPath?.startsWith("native-plugins/")) { + return `${verb} another native plugin via relative path outside the native plugin package`; + } + return `${verb} relative path ${specifier} outside the native plugin package`; + } + if (mode === "plugin-sdk-internal") { + return `${verb} src/plugin-sdk-internal from a native plugin`; + } + if (resolvedPath.startsWith("src/plugin-sdk/")) { + return `${verb} allowed plugin-sdk path`; + } + return `${verb} core src path outside plugin-sdk from a native plugin`; +} + +function compareEntries(left, right) { + return ( + left.file.localeCompare(right.file) || + left.line - right.line || + left.kind.localeCompare(right.kind) || + left.specifier.localeCompare(right.specifier) || + left.resolvedPath.localeCompare(right.resolvedPath) || + left.reason.localeCompare(right.reason) + ); +} + +function shouldReport(mode, resolvedPath) { + if (mode === "relative-outside-package") { + return false; + } + if (!resolvedPath?.startsWith("src/")) { + return false; + } + if (mode === "plugin-sdk-internal") { + return resolvedPath.startsWith("src/plugin-sdk-internal/"); + } + return !resolvedPath.startsWith("src/plugin-sdk/"); +} + +function collectFromSourceFile(mode, sourceFile, filePath) { + const entries = []; + const nativePluginRoot = resolveNativePluginRoot(filePath); + + function push(kind, specifierNode, specifier) { + const resolvedPath = resolveSpecifier(specifier, filePath); + if (mode === "relative-outside-package") { + if (!specifier.startsWith(".") || !resolvedPath || !nativePluginRoot) { + return; + } + if (resolvedPath === nativePluginRoot || resolvedPath.startsWith(`${nativePluginRoot}/`)) { + return; + } + } else if (!shouldReport(mode, resolvedPath)) { + return; + } + entries.push({ + file: normalizePath(filePath), + line: toLine(sourceFile, specifierNode), + kind, + specifier, + resolvedPath, + reason: classifyReason(mode, kind, resolvedPath, specifier), + }); + } + + function visit(node) { + if (ts.isImportDeclaration(node) && ts.isStringLiteral(node.moduleSpecifier)) { + push("import", node.moduleSpecifier, node.moduleSpecifier.text); + } else if ( + ts.isExportDeclaration(node) && + node.moduleSpecifier && + ts.isStringLiteral(node.moduleSpecifier) + ) { + push("export", node.moduleSpecifier, node.moduleSpecifier.text); + } else if ( + ts.isCallExpression(node) && + node.expression.kind === ts.SyntaxKind.ImportKeyword && + node.arguments.length === 1 && + ts.isStringLiteral(node.arguments[0]) + ) { + push("dynamic-import", node.arguments[0], node.arguments[0].text); + } + ts.forEachChild(node, visit); + } + + visit(sourceFile); + return entries; +} + +export async function collectNativePluginPluginSdkBoundaryInventory(mode) { + if (!MODES.has(mode)) { + throw new Error(`Unknown mode: ${mode}`); + } + const files = await collectNativePluginSourceFiles(nativePluginsRoot); + const inventory = []; + for (const filePath of files) { + const source = await fs.readFile(filePath, "utf8"); + const scriptKind = + filePath.endsWith(".tsx") || filePath.endsWith(".jsx") ? ts.ScriptKind.TSX : ts.ScriptKind.TS; + const sourceFile = ts.createSourceFile( + filePath, + source, + ts.ScriptTarget.Latest, + true, + scriptKind, + ); + inventory.push(...collectFromSourceFile(mode, sourceFile, filePath)); + } + return inventory.toSorted(compareEntries); +} + +export const collectExtensionPluginSdkBoundaryInventory = + collectNativePluginPluginSdkBoundaryInventory; + +export async function readExpectedInventory(mode) { + try { + return JSON.parse(await fs.readFile(baselinePathByMode[mode], "utf8")); + } catch (error) { + if ( + (mode === "plugin-sdk-internal" || + mode === "src-outside-plugin-sdk" || + mode === "relative-outside-package") && + error && + typeof error === "object" && + "code" in error && + error.code === "ENOENT" + ) { + return []; + } + throw error; + } +} + +export function diffInventory(expected, actual) { + const expectedKeys = new Set(expected.map((entry) => JSON.stringify(entry))); + const actualKeys = new Set(actual.map((entry) => JSON.stringify(entry))); + return { + missing: expected + .filter((entry) => !actualKeys.has(JSON.stringify(entry))) + .toSorted(compareEntries), + unexpected: actual + .filter((entry) => !expectedKeys.has(JSON.stringify(entry))) + .toSorted(compareEntries), + }; +} + +function formatInventoryHuman(mode, inventory) { + const lines = [ruleTextByMode[mode]]; + if (inventory.length === 0) { + lines.push("No native plugin plugin-sdk boundary violations found."); + return lines.join("\n"); + } + lines.push("Native plugin boundary inventory:"); + let activeFile = ""; + for (const entry of inventory) { + if (entry.file !== activeFile) { + activeFile = entry.file; + lines.push(activeFile); + } + lines.push(` - line ${entry.line} [${entry.kind}] ${entry.reason}`); + lines.push(` specifier: ${entry.specifier}`); + lines.push(` resolved: ${entry.resolvedPath}`); + } + return lines.join("\n"); +} + +export async function main(argv = process.argv.slice(2)) { + const json = argv.includes("--json"); + const modeArg = argv.find((arg) => arg.startsWith("--mode=")); + const mode = modeArg?.slice("--mode=".length) ?? "src-outside-plugin-sdk"; + if (!MODES.has(mode)) { + throw new Error(`Unknown mode: ${mode}`); + } + + const actual = await collectNativePluginPluginSdkBoundaryInventory(mode); + if (json) { + process.stdout.write(`${JSON.stringify(actual, null, 2)}\n`); + return; + } + + const expected = await readExpectedInventory(mode); + const diff = diffInventory(expected, actual); + console.log(formatInventoryHuman(mode, actual)); + if (diff.missing.length === 0 && diff.unexpected.length === 0) { + console.log(`Baseline matches (${actual.length} entries).`); + return; + } + if (diff.missing.length > 0) { + console.error(`Missing baseline entries (${diff.missing.length}):`); + for (const entry of diff.missing) { + console.error(` - ${entry.file}:${entry.line} ${entry.reason}`); + } + } + if (diff.unexpected.length > 0) { + console.error(`Unexpected inventory entries (${diff.unexpected.length}):`); + for (const entry of diff.unexpected) { + console.error(` - ${entry.file}:${entry.line} ${entry.reason}`); + } + } + process.exitCode = 1; +} + +if (path.resolve(process.argv[1] ?? "") === fileURLToPath(import.meta.url)) { + await main(); +} diff --git a/scripts/check-no-monolithic-plugin-sdk-entry-imports.ts b/scripts/check-no-monolithic-plugin-sdk-entry-imports.ts index bc24087ace3..ad2f8c191bd 100644 --- a/scripts/check-no-monolithic-plugin-sdk-entry-imports.ts +++ b/scripts/check-no-monolithic-plugin-sdk-entry-imports.ts @@ -64,15 +64,15 @@ function collectPluginSourceFiles(rootDir: string): string[] { return files; } -function collectSharedExtensionSourceFiles(): string[] { - return collectPluginSourceFiles(path.join(process.cwd(), "extensions", "shared")); +function collectSharedNativePluginSourceFiles(): string[] { + return collectPluginSourceFiles(path.join(process.cwd(), "native-plugins", "shared")); } -function collectBundledExtensionSourceFiles(): string[] { - const extensionsDir = path.join(process.cwd(), "extensions"); +function collectBundledNativePluginSourceFiles(): string[] { + const nativePluginsDir = path.join(process.cwd(), "native-plugins"); let entries: fs.Dirent[] = []; try { - entries = fs.readdirSync(extensionsDir, { withFileTypes: true }); + entries = fs.readdirSync(nativePluginsDir, { withFileTypes: true }); } catch { return []; } @@ -82,7 +82,7 @@ function collectBundledExtensionSourceFiles(): string[] { if (!entry.isDirectory() || entry.name === "shared") { continue; } - for (const srcFile of collectPluginSourceFiles(path.join(extensionsDir, entry.name))) { + for (const srcFile of collectPluginSourceFiles(path.join(nativePluginsDir, entry.name))) { files.push(srcFile); } } @@ -99,11 +99,11 @@ function main() { filesToCheck.add(srcFile); } } - for (const sharedFile of collectSharedExtensionSourceFiles()) { + for (const sharedFile of collectSharedNativePluginSourceFiles()) { filesToCheck.add(sharedFile); } - for (const extensionFile of collectBundledExtensionSourceFiles()) { - filesToCheck.add(extensionFile); + for (const nativePluginFile of collectBundledNativePluginSourceFiles()) { + filesToCheck.add(nativePluginFile); } const monolithicOffenders: string[] = []; diff --git a/scripts/check-no-extension-src-imports.ts b/scripts/check-no-native-plugin-src-imports.ts similarity index 79% rename from scripts/check-no-extension-src-imports.ts rename to scripts/check-no-native-plugin-src-imports.ts index 04f4d074dcf..e6b6f22d49d 100644 --- a/scripts/check-no-extension-src-imports.ts +++ b/scripts/check-no-native-plugin-src-imports.ts @@ -10,7 +10,7 @@ function isSourceFile(filePath: string): boolean { return /\.(?:[cm]?ts|[cm]?js|tsx|jsx)$/u.test(filePath); } -function isProductionExtensionFile(filePath: string): boolean { +function isProductionNativePluginFile(filePath: string): boolean { return !( filePath.endsWith("/runtime-api.ts") || filePath.endsWith("\\runtime-api.ts") || @@ -27,7 +27,7 @@ function isProductionExtensionFile(filePath: string): boolean { ); } -function collectExtensionSourceFiles(rootDir: string): string[] { +function collectNativePluginSourceFiles(rootDir: string): string[] { const files: string[] = []; const stack = [rootDir]; while (stack.length > 0) { @@ -50,7 +50,7 @@ function collectExtensionSourceFiles(rootDir: string): string[] { stack.push(fullPath); continue; } - if (entry.isFile() && isSourceFile(fullPath) && isProductionExtensionFile(fullPath)) { + if (entry.isFile() && isSourceFile(fullPath) && isProductionNativePluginFile(fullPath)) { files.push(fullPath); } } @@ -59,8 +59,8 @@ function collectExtensionSourceFiles(rootDir: string): string[] { } function main() { - const extensionsDir = path.join(process.cwd(), "extensions"); - const files = collectExtensionSourceFiles(extensionsDir); + const nativePluginsDir = path.join(process.cwd(), "native-plugins"); + const files = collectNativePluginSourceFiles(nativePluginsDir); const offenders: string[] = []; for (const file of files) { @@ -71,19 +71,19 @@ function main() { } if (offenders.length > 0) { - console.error("Production extension files must not import the repo src/ tree directly."); + console.error("Production native plugin files must not import the repo src/ tree directly."); for (const offender of offenders.toSorted()) { const relative = path.relative(process.cwd(), offender) || offender; console.error(`- ${relative}`); } console.error( - "Publish a focused openclaw/plugin-sdk/ surface or use the extension's own public barrel instead.", + "Publish a focused openclaw/plugin-sdk/ surface or use the native plugin's own public barrel instead.", ); process.exit(1); } console.log( - `OK: production extension files avoid direct repo src/ imports (${files.length} checked).`, + `OK: production native plugin files avoid direct repo src/ imports (${files.length} checked).`, ); } diff --git a/scripts/check-no-extension-test-core-imports.ts b/scripts/check-no-native-plugin-test-core-imports.ts similarity index 69% rename from scripts/check-no-extension-test-core-imports.ts rename to scripts/check-no-native-plugin-test-core-imports.ts index af65c8387a9..626e276f1ee 100644 --- a/scripts/check-no-extension-test-core-imports.ts +++ b/scripts/check-no-native-plugin-test-core-imports.ts @@ -8,7 +8,7 @@ const FORBIDDEN_PATTERNS: Array<{ pattern: RegExp; hint: string }> = [ }, { pattern: /["']openclaw\/plugin-sdk\/test-utils["']/, - hint: "Use openclaw/plugin-sdk/testing for the public extension test surface.", + hint: "Use openclaw/plugin-sdk/testing for the public native plugin test surface.", }, { pattern: /["']openclaw\/plugin-sdk\/compat["']/, @@ -16,23 +16,23 @@ const FORBIDDEN_PATTERNS: Array<{ pattern: RegExp; hint: string }> = [ }, { pattern: /["'](?:\.\.\/)+(?:test-utils\/)[^"']+["']/, - hint: "Use test/helpers/extensions/* for repo-only bundled extension test helpers.", + hint: "Use test/helpers/native-plugins/* for repo-only bundled native plugin test helpers.", }, { pattern: /["'](?:\.\.\/)+(?:src\/test-utils\/)[^"']+["']/, - hint: "Use test/helpers/extensions/* for repo-only helpers, or openclaw/plugin-sdk/testing for public surfaces.", + hint: "Use test/helpers/native-plugins/* for repo-only helpers, or openclaw/plugin-sdk/testing for public surfaces.", }, { pattern: /["'](?:\.\.\/)+(?:src\/plugins\/types\.js)["']/, - hint: "Use public plugin-sdk/core types or test/helpers/extensions/* instead.", + hint: "Use public plugin-sdk/core types or test/helpers/native-plugins/* instead.", }, ]; -function isExtensionTestFile(filePath: string): boolean { +function isNativePluginTestFile(filePath: string): boolean { return /\.test\.[cm]?[jt]sx?$/u.test(filePath) || /\.e2e\.test\.[cm]?[jt]sx?$/u.test(filePath); } -function collectExtensionTestFiles(rootDir: string): string[] { +function collectNativePluginTestFiles(rootDir: string): string[] { const files: string[] = []; const stack = [rootDir]; while (stack.length > 0) { @@ -55,7 +55,7 @@ function collectExtensionTestFiles(rootDir: string): string[] { stack.push(fullPath); continue; } - if (entry.isFile() && isExtensionTestFile(fullPath)) { + if (entry.isFile() && isNativePluginTestFile(fullPath)) { files.push(fullPath); } } @@ -64,8 +64,8 @@ function collectExtensionTestFiles(rootDir: string): string[] { } function main() { - const extensionsDir = path.join(process.cwd(), "extensions"); - const files = collectExtensionTestFiles(extensionsDir); + const nativePluginsDir = path.join(process.cwd(), "native-plugins"); + const files = collectNativePluginTestFiles(nativePluginsDir); const offenders: Array<{ file: string; hint: string }> = []; for (const file of files) { @@ -81,7 +81,7 @@ function main() { if (offenders.length > 0) { console.error( - "Extension test files must stay on extension test bridges or public plugin-sdk surfaces.", + "Native plugin test files must stay on native plugin test bridges or public plugin-sdk surfaces.", ); for (const offender of offenders.toSorted((a, b) => a.file.localeCompare(b.file))) { const relative = path.relative(process.cwd(), offender.file) || offender.file; @@ -91,7 +91,7 @@ function main() { } console.log( - `OK: extension test files avoid direct core test/internal imports (${files.length} checked).`, + `OK: native plugin test files avoid direct core test/internal imports (${files.length} checked).`, ); } diff --git a/scripts/check-no-random-messaging-tmp.mjs b/scripts/check-no-random-messaging-tmp.mjs index ae5469d6deb..77e59511701 100644 --- a/scripts/check-no-random-messaging-tmp.mjs +++ b/scripts/check-no-random-messaging-tmp.mjs @@ -11,7 +11,7 @@ const sourceRoots = [ "src/media-understanding", "extensions", ]; -const allowedRelativePaths = new Set(["extensions/feishu/src/dedup.ts"]); +const allowedRelativePaths = new Set(["native-plugins/feishu/src/dedup.ts"]); function collectOsTmpdirImports(sourceFile) { const osModuleSpecifiers = new Set(["node:os", "os"]); diff --git a/scripts/check-no-raw-channel-fetch.mjs b/scripts/check-no-raw-channel-fetch.mjs index 57adb600c81..5486f4677b4 100644 --- a/scripts/check-no-raw-channel-fetch.mjs +++ b/scripts/check-no-raw-channel-fetch.mjs @@ -9,43 +9,43 @@ const sourceRoots = ["src/channels", "src/routing", "src/line", "extensions"]; // Temporary allowlist for legacy callsites. New raw fetch callsites in channel/plugin runtime // code should be rejected and migrated to fetchWithSsrFGuard/shared channel helpers. const allowedRawFetchCallsites = new Set([ - "extensions/bluebubbles/src/types.ts:133", - "extensions/feishu/src/streaming-card.ts:31", - "extensions/feishu/src/streaming-card.ts:101", - "extensions/feishu/src/streaming-card.ts:143", - "extensions/feishu/src/streaming-card.ts:199", - "extensions/googlechat/src/api.ts:22", - "extensions/googlechat/src/api.ts:43", - "extensions/googlechat/src/api.ts:63", - "extensions/googlechat/src/api.ts:188", - "extensions/googlechat/src/auth.ts:82", - "extensions/matrix/src/directory-live.ts:41", - "extensions/matrix/src/matrix/client/config.ts:171", - "extensions/mattermost/src/mattermost/client.ts:211", - "extensions/mattermost/src/mattermost/monitor.ts:230", - "extensions/mattermost/src/mattermost/probe.ts:27", - "extensions/minimax/oauth.ts:62", - "extensions/minimax/oauth.ts:93", - "extensions/msteams/src/graph.ts:39", - "extensions/nextcloud-talk/src/room-info.ts:92", - "extensions/nextcloud-talk/src/send.ts:107", - "extensions/nextcloud-talk/src/send.ts:198", - "extensions/qwen-portal-auth/oauth.ts:46", - "extensions/qwen-portal-auth/oauth.ts:80", - "extensions/talk-voice/index.ts:27", - "extensions/thread-ownership/index.ts:105", - "extensions/voice-call/src/providers/plivo.ts:95", - "extensions/voice-call/src/providers/telnyx.ts:61", - "extensions/voice-call/src/providers/tts-openai.ts:111", - "extensions/voice-call/src/providers/twilio/api.ts:23", - "extensions/telegram/src/api-fetch.ts:8", - "extensions/discord/src/send.outbound.ts:363", - "extensions/discord/src/voice-message.ts:268", - "extensions/discord/src/voice-message.ts:312", - "extensions/slack/src/monitor/media.ts:55", - "extensions/slack/src/monitor/media.ts:59", - "extensions/slack/src/monitor/media.ts:73", - "extensions/slack/src/monitor/media.ts:99", + "native-plugins/bluebubbles/src/types.ts:133", + "native-plugins/feishu/src/streaming-card.ts:31", + "native-plugins/feishu/src/streaming-card.ts:101", + "native-plugins/feishu/src/streaming-card.ts:143", + "native-plugins/feishu/src/streaming-card.ts:199", + "native-plugins/googlechat/src/api.ts:22", + "native-plugins/googlechat/src/api.ts:43", + "native-plugins/googlechat/src/api.ts:63", + "native-plugins/googlechat/src/api.ts:188", + "native-plugins/googlechat/src/auth.ts:82", + "native-plugins/matrix/src/directory-live.ts:41", + "native-plugins/matrix/src/matrix/client/config.ts:171", + "native-plugins/mattermost/src/mattermost/client.ts:211", + "native-plugins/mattermost/src/mattermost/monitor.ts:230", + "native-plugins/mattermost/src/mattermost/probe.ts:27", + "native-plugins/minimax/oauth.ts:62", + "native-plugins/minimax/oauth.ts:93", + "native-plugins/msteams/src/graph.ts:39", + "native-plugins/nextcloud-talk/src/room-info.ts:92", + "native-plugins/nextcloud-talk/src/send.ts:107", + "native-plugins/nextcloud-talk/src/send.ts:198", + "native-plugins/qwen-portal-auth/oauth.ts:46", + "native-plugins/qwen-portal-auth/oauth.ts:80", + "native-plugins/talk-voice/index.ts:27", + "native-plugins/thread-ownership/index.ts:105", + "native-plugins/voice-call/src/providers/plivo.ts:95", + "native-plugins/voice-call/src/providers/telnyx.ts:61", + "native-plugins/voice-call/src/providers/tts-openai.ts:111", + "native-plugins/voice-call/src/providers/twilio/api.ts:23", + "native-plugins/telegram/src/api-fetch.ts:8", + "native-plugins/discord/src/send.outbound.ts:363", + "native-plugins/discord/src/voice-message.ts:268", + "native-plugins/discord/src/voice-message.ts:312", + "native-plugins/slack/src/monitor/media.ts:55", + "native-plugins/slack/src/monitor/media.ts:59", + "native-plugins/slack/src/monitor/media.ts:73", + "native-plugins/slack/src/monitor/media.ts:99", ]); function isRawFetchCall(expression) { diff --git a/scripts/check-no-register-http-handler.mjs b/scripts/check-no-register-http-handler.mjs index 0884295be2d..763589119e9 100644 --- a/scripts/check-no-register-http-handler.mjs +++ b/scripts/check-no-register-http-handler.mjs @@ -4,7 +4,7 @@ import ts from "typescript"; import { runCallsiteGuard } from "./lib/callsite-guard.mjs"; import { runAsScript, toLine, unwrapExpression } from "./lib/ts-guard-utils.mjs"; -const sourceRoots = ["src", "extensions"]; +const sourceRoots = ["src", "native-plugins"]; function isDeprecatedRegisterHttpHandlerCall(expression) { const callee = unwrapExpression(expression); diff --git a/scripts/check-plugin-extension-import-boundary.mjs b/scripts/check-plugin-extension-import-boundary.mjs index 13c4fa596a3..4bf42048f57 100644 --- a/scripts/check-plugin-extension-import-boundary.mjs +++ b/scripts/check-plugin-extension-import-boundary.mjs @@ -1,302 +1,11 @@ -#!/usr/bin/env node - -import { promises as fs } from "node:fs"; import path from "node:path"; -import { fileURLToPath } from "node:url"; -import ts from "typescript"; -import { - collectTypeScriptFilesFromRoots, - resolveSourceRoots, - runAsScript, - toLine, -} from "./lib/ts-guard-utils.mjs"; +import { pathToFileURL } from "node:url"; +import { main } from "./check-plugin-native-plugin-import-boundary.mjs"; -const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); -const scanRoots = resolveSourceRoots(repoRoot, ["src/plugins"]); -const baselinePath = path.join( - repoRoot, - "test", - "fixtures", - "plugin-extension-import-boundary-inventory.json", -); +export * from "./check-plugin-native-plugin-import-boundary.mjs"; -const bundledWebSearchProviders = new Set([ - "brave", - "firecrawl", - "gemini", - "grok", - "kimi", - "perplexity", -]); -const bundledWebSearchPluginIds = new Set([ - "brave", - "firecrawl", - "google", - "moonshot", - "perplexity", - "xai", -]); +const entryHref = process.argv[1] ? pathToFileURL(path.resolve(process.argv[1])).href : ""; -function normalizePath(filePath) { - return path.relative(repoRoot, filePath).split(path.sep).join("/"); +if (import.meta.url === entryHref) { + await main(); } - -function compareEntries(left, right) { - return ( - left.file.localeCompare(right.file) || - left.line - right.line || - left.kind.localeCompare(right.kind) || - left.specifier.localeCompare(right.specifier) || - left.reason.localeCompare(right.reason) - ); -} - -function resolveSpecifier(specifier, importerFile) { - if (specifier.startsWith(".")) { - return normalizePath(path.resolve(path.dirname(importerFile), specifier)); - } - if (specifier.startsWith("/")) { - return normalizePath(specifier); - } - return null; -} - -function classifyResolvedExtensionReason(kind, resolvedPath) { - const verb = - kind === "export" - ? "re-exports" - : kind === "dynamic-import" - ? "dynamically imports" - : "imports"; - if (/^extensions\/[^/]+\/src\//.test(resolvedPath)) { - return `${verb} extension implementation from src/plugins`; - } - if (/^extensions\/[^/]+\/index\.[^/]+$/.test(resolvedPath)) { - return `${verb} extension entrypoint from src/plugins`; - } - return `${verb} extension-owned file from src/plugins`; -} - -function pushEntry(entries, entry) { - entries.push(entry); -} - -function scanImportBoundaryViolations(sourceFile, filePath) { - const entries = []; - - function visit(node) { - if (ts.isImportDeclaration(node) && ts.isStringLiteral(node.moduleSpecifier)) { - const specifier = node.moduleSpecifier.text; - const resolvedPath = resolveSpecifier(specifier, filePath); - if (resolvedPath?.startsWith("extensions/")) { - pushEntry(entries, { - file: normalizePath(filePath), - line: toLine(sourceFile, node.moduleSpecifier), - kind: "import", - specifier, - resolvedPath, - reason: classifyResolvedExtensionReason("import", resolvedPath), - }); - } - } else if ( - ts.isExportDeclaration(node) && - node.moduleSpecifier && - ts.isStringLiteral(node.moduleSpecifier) - ) { - const specifier = node.moduleSpecifier.text; - const resolvedPath = resolveSpecifier(specifier, filePath); - if (resolvedPath?.startsWith("extensions/")) { - pushEntry(entries, { - file: normalizePath(filePath), - line: toLine(sourceFile, node.moduleSpecifier), - kind: "export", - specifier, - resolvedPath, - reason: classifyResolvedExtensionReason("export", resolvedPath), - }); - } - } else if ( - ts.isCallExpression(node) && - node.expression.kind === ts.SyntaxKind.ImportKeyword && - node.arguments.length === 1 && - ts.isStringLiteral(node.arguments[0]) - ) { - const specifier = node.arguments[0].text; - const resolvedPath = resolveSpecifier(specifier, filePath); - if (resolvedPath?.startsWith("extensions/")) { - pushEntry(entries, { - file: normalizePath(filePath), - line: toLine(sourceFile, node.arguments[0]), - kind: "dynamic-import", - specifier, - resolvedPath, - reason: classifyResolvedExtensionReason("dynamic-import", resolvedPath), - }); - } - } - - ts.forEachChild(node, visit); - } - - visit(sourceFile); - return entries; -} - -function scanWebSearchRegistrySmells(sourceFile, filePath) { - const relativeFile = normalizePath(filePath); - if (relativeFile !== "src/plugins/web-search-providers.ts") { - return []; - } - - const entries = []; - const lines = sourceFile.text.split(/\r?\n/); - for (const [index, line] of lines.entries()) { - const lineNumber = index + 1; - - if (line.includes("web-search-plugin-factory.js")) { - pushEntry(entries, { - file: relativeFile, - line: lineNumber, - kind: "registry-smell", - specifier: "../agents/tools/web-search-plugin-factory.js", - resolvedPath: "src/agents/tools/web-search-plugin-factory.js", - reason: "imports core-owned web search provider factory into plugin registry", - }); - } - - const pluginMatch = line.match(/pluginId:\s*"([^"]+)"/); - if (pluginMatch && bundledWebSearchPluginIds.has(pluginMatch[1])) { - pushEntry(entries, { - file: relativeFile, - line: lineNumber, - kind: "registry-smell", - specifier: pluginMatch[1], - resolvedPath: relativeFile, - reason: "hardcodes bundled web search plugin ownership in core registry", - }); - } - - const providerMatch = line.match(/id:\s*"(brave|firecrawl|gemini|grok|kimi|perplexity)"/); - if (providerMatch && bundledWebSearchProviders.has(providerMatch[1])) { - pushEntry(entries, { - file: relativeFile, - line: lineNumber, - kind: "registry-smell", - specifier: providerMatch[1], - resolvedPath: relativeFile, - reason: "hardcodes bundled web search provider metadata in core registry", - }); - } - } - - return entries; -} - -function shouldSkipFile(filePath) { - const relativeFile = normalizePath(filePath); - return relativeFile.startsWith("src/plugins/contracts/"); -} - -export async function collectPluginExtensionImportBoundaryInventory() { - const files = (await collectTypeScriptFilesFromRoots(scanRoots)) - .filter((filePath) => !shouldSkipFile(filePath)) - .toSorted((left, right) => normalizePath(left).localeCompare(normalizePath(right))); - - const inventory = []; - for (const filePath of files) { - const source = await fs.readFile(filePath, "utf8"); - const sourceFile = ts.createSourceFile( - filePath, - source, - ts.ScriptTarget.Latest, - true, - ts.ScriptKind.TS, - ); - inventory.push(...scanImportBoundaryViolations(sourceFile, filePath)); - inventory.push(...scanWebSearchRegistrySmells(sourceFile, filePath)); - } - - return inventory.toSorted(compareEntries); -} - -export async function readExpectedInventory() { - return JSON.parse(await fs.readFile(baselinePath, "utf8")); -} - -export function diffInventory(expected, actual) { - const expectedKeys = new Set(expected.map((entry) => JSON.stringify(entry))); - const actualKeys = new Set(actual.map((entry) => JSON.stringify(entry))); - return { - missing: expected - .filter((entry) => !actualKeys.has(JSON.stringify(entry))) - .toSorted(compareEntries), - unexpected: actual - .filter((entry) => !expectedKeys.has(JSON.stringify(entry))) - .toSorted(compareEntries), - }; -} - -function formatInventoryHuman(inventory) { - if (inventory.length === 0) { - return "Rule: src/plugins/** must not import extensions/**\nNo plugin import boundary violations found."; - } - - const lines = [ - "Rule: src/plugins/** must not import extensions/**", - "Plugin extension import boundary inventory:", - ]; - let activeFile = ""; - for (const entry of inventory) { - if (entry.file !== activeFile) { - activeFile = entry.file; - lines.push(activeFile); - } - lines.push(` - line ${entry.line} [${entry.kind}] ${entry.reason}`); - lines.push(` specifier: ${entry.specifier}`); - lines.push(` resolved: ${entry.resolvedPath}`); - } - return lines.join("\n"); -} - -function formatEntry(entry) { - return `${entry.file}:${entry.line} [${entry.kind}] ${entry.reason} (${entry.specifier} -> ${entry.resolvedPath})`; -} - -export async function main(argv = process.argv.slice(2)) { - const json = argv.includes("--json"); - const actual = await collectPluginExtensionImportBoundaryInventory(); - const expected = await readExpectedInventory(); - const { missing, unexpected } = diffInventory(expected, actual); - const matchesBaseline = missing.length === 0 && unexpected.length === 0; - - if (json) { - process.stdout.write(`${JSON.stringify(actual, null, 2)}\n`); - } else { - console.log(formatInventoryHuman(actual)); - console.log( - matchesBaseline - ? `Baseline matches (${actual.length} entries).` - : `Baseline mismatch (${unexpected.length} unexpected, ${missing.length} missing).`, - ); - if (!matchesBaseline) { - if (unexpected.length > 0) { - console.error("Unexpected entries:"); - for (const entry of unexpected) { - console.error(`- ${formatEntry(entry)}`); - } - } - if (missing.length > 0) { - console.error("Missing baseline entries:"); - for (const entry of missing) { - console.error(`- ${formatEntry(entry)}`); - } - } - } - } - - if (!matchesBaseline) { - process.exit(1); - } -} - -runAsScript(import.meta.url, main); diff --git a/scripts/check-plugin-native-plugin-import-boundary.mjs b/scripts/check-plugin-native-plugin-import-boundary.mjs new file mode 100644 index 00000000000..ac6068c6bc5 --- /dev/null +++ b/scripts/check-plugin-native-plugin-import-boundary.mjs @@ -0,0 +1,305 @@ +#!/usr/bin/env node + +import { promises as fs } from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import ts from "typescript"; +import { + collectTypeScriptFilesFromRoots, + resolveSourceRoots, + runAsScript, + toLine, +} from "./lib/ts-guard-utils.mjs"; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); +const scanRoots = resolveSourceRoots(repoRoot, ["src/plugins"]); +const baselinePath = path.join( + repoRoot, + "test", + "fixtures", + "plugin-native-plugin-import-boundary-inventory.json", +); + +const bundledWebSearchProviders = new Set([ + "brave", + "firecrawl", + "gemini", + "grok", + "kimi", + "perplexity", +]); +const bundledWebSearchPluginIds = new Set([ + "brave", + "firecrawl", + "google", + "moonshot", + "perplexity", + "xai", +]); + +function normalizePath(filePath) { + return path.relative(repoRoot, filePath).split(path.sep).join("/"); +} + +function compareEntries(left, right) { + return ( + left.file.localeCompare(right.file) || + left.line - right.line || + left.kind.localeCompare(right.kind) || + left.specifier.localeCompare(right.specifier) || + left.reason.localeCompare(right.reason) + ); +} + +function resolveSpecifier(specifier, importerFile) { + if (specifier.startsWith(".")) { + return normalizePath(path.resolve(path.dirname(importerFile), specifier)); + } + if (specifier.startsWith("/")) { + return normalizePath(specifier); + } + return null; +} + +function classifyResolvedNativePluginReason(kind, resolvedPath) { + const verb = + kind === "export" + ? "re-exports" + : kind === "dynamic-import" + ? "dynamically imports" + : "imports"; + if (/^native-plugins\/[^/]+\/src\//.test(resolvedPath)) { + return `${verb} native plugin implementation from src/plugins`; + } + if (/^native-plugins\/[^/]+\/index\.[^/]+$/.test(resolvedPath)) { + return `${verb} native plugin entrypoint from src/plugins`; + } + return `${verb} native-plugin-owned file from src/plugins`; +} + +function pushEntry(entries, entry) { + entries.push(entry); +} + +function scanImportBoundaryViolations(sourceFile, filePath) { + const entries = []; + + function visit(node) { + if (ts.isImportDeclaration(node) && ts.isStringLiteral(node.moduleSpecifier)) { + const specifier = node.moduleSpecifier.text; + const resolvedPath = resolveSpecifier(specifier, filePath); + if (resolvedPath?.startsWith("native-plugins/")) { + pushEntry(entries, { + file: normalizePath(filePath), + line: toLine(sourceFile, node.moduleSpecifier), + kind: "import", + specifier, + resolvedPath, + reason: classifyResolvedNativePluginReason("import", resolvedPath), + }); + } + } else if ( + ts.isExportDeclaration(node) && + node.moduleSpecifier && + ts.isStringLiteral(node.moduleSpecifier) + ) { + const specifier = node.moduleSpecifier.text; + const resolvedPath = resolveSpecifier(specifier, filePath); + if (resolvedPath?.startsWith("native-plugins/")) { + pushEntry(entries, { + file: normalizePath(filePath), + line: toLine(sourceFile, node.moduleSpecifier), + kind: "export", + specifier, + resolvedPath, + reason: classifyResolvedNativePluginReason("export", resolvedPath), + }); + } + } else if ( + ts.isCallExpression(node) && + node.expression.kind === ts.SyntaxKind.ImportKeyword && + node.arguments.length === 1 && + ts.isStringLiteral(node.arguments[0]) + ) { + const specifier = node.arguments[0].text; + const resolvedPath = resolveSpecifier(specifier, filePath); + if (resolvedPath?.startsWith("native-plugins/")) { + pushEntry(entries, { + file: normalizePath(filePath), + line: toLine(sourceFile, node.arguments[0]), + kind: "dynamic-import", + specifier, + resolvedPath, + reason: classifyResolvedNativePluginReason("dynamic-import", resolvedPath), + }); + } + } + + ts.forEachChild(node, visit); + } + + visit(sourceFile); + return entries; +} + +function scanWebSearchRegistrySmells(sourceFile, filePath) { + const relativeFile = normalizePath(filePath); + if (relativeFile !== "src/plugins/web-search-providers.ts") { + return []; + } + + const entries = []; + const lines = sourceFile.text.split(/\r?\n/); + for (const [index, line] of lines.entries()) { + const lineNumber = index + 1; + + if (line.includes("web-search-plugin-factory.js")) { + pushEntry(entries, { + file: relativeFile, + line: lineNumber, + kind: "registry-smell", + specifier: "../agents/tools/web-search-plugin-factory.js", + resolvedPath: "src/agents/tools/web-search-plugin-factory.js", + reason: "imports core-owned web search provider factory into plugin registry", + }); + } + + const pluginMatch = line.match(/pluginId:\s*"([^"]+)"/); + if (pluginMatch && bundledWebSearchPluginIds.has(pluginMatch[1])) { + pushEntry(entries, { + file: relativeFile, + line: lineNumber, + kind: "registry-smell", + specifier: pluginMatch[1], + resolvedPath: relativeFile, + reason: "hardcodes bundled web search plugin ownership in core registry", + }); + } + + const providerMatch = line.match(/id:\s*"(brave|firecrawl|gemini|grok|kimi|perplexity)"/); + if (providerMatch && bundledWebSearchProviders.has(providerMatch[1])) { + pushEntry(entries, { + file: relativeFile, + line: lineNumber, + kind: "registry-smell", + specifier: providerMatch[1], + resolvedPath: relativeFile, + reason: "hardcodes bundled web search provider metadata in core registry", + }); + } + } + + return entries; +} + +function shouldSkipFile(filePath) { + const relativeFile = normalizePath(filePath); + return relativeFile.startsWith("src/plugins/contracts/"); +} + +export async function collectPluginNativePluginImportBoundaryInventory() { + const files = (await collectTypeScriptFilesFromRoots(scanRoots)) + .filter((filePath) => !shouldSkipFile(filePath)) + .toSorted((left, right) => normalizePath(left).localeCompare(normalizePath(right))); + + const inventory = []; + for (const filePath of files) { + const source = await fs.readFile(filePath, "utf8"); + const sourceFile = ts.createSourceFile( + filePath, + source, + ts.ScriptTarget.Latest, + true, + ts.ScriptKind.TS, + ); + inventory.push(...scanImportBoundaryViolations(sourceFile, filePath)); + inventory.push(...scanWebSearchRegistrySmells(sourceFile, filePath)); + } + + return inventory.toSorted(compareEntries); +} + +export const collectPluginExtensionImportBoundaryInventory = + collectPluginNativePluginImportBoundaryInventory; + +export async function readExpectedInventory() { + return JSON.parse(await fs.readFile(baselinePath, "utf8")); +} + +export function diffInventory(expected, actual) { + const expectedKeys = new Set(expected.map((entry) => JSON.stringify(entry))); + const actualKeys = new Set(actual.map((entry) => JSON.stringify(entry))); + return { + missing: expected + .filter((entry) => !actualKeys.has(JSON.stringify(entry))) + .toSorted(compareEntries), + unexpected: actual + .filter((entry) => !expectedKeys.has(JSON.stringify(entry))) + .toSorted(compareEntries), + }; +} + +function formatInventoryHuman(inventory) { + if (inventory.length === 0) { + return "Rule: src/plugins/** must not import native-plugins/**\nNo plugin import boundary violations found."; + } + + const lines = [ + "Rule: src/plugins/** must not import native-plugins/**", + "Plugin native-plugin import boundary inventory:", + ]; + let activeFile = ""; + for (const entry of inventory) { + if (entry.file !== activeFile) { + activeFile = entry.file; + lines.push(activeFile); + } + lines.push(` - line ${entry.line} [${entry.kind}] ${entry.reason}`); + lines.push(` specifier: ${entry.specifier}`); + lines.push(` resolved: ${entry.resolvedPath}`); + } + return lines.join("\n"); +} + +function formatEntry(entry) { + return `${entry.file}:${entry.line} [${entry.kind}] ${entry.reason} (${entry.specifier} -> ${entry.resolvedPath})`; +} + +export async function main(argv = process.argv.slice(2)) { + const json = argv.includes("--json"); + const actual = await collectPluginNativePluginImportBoundaryInventory(); + const expected = await readExpectedInventory(); + const { missing, unexpected } = diffInventory(expected, actual); + const matchesBaseline = missing.length === 0 && unexpected.length === 0; + + if (json) { + process.stdout.write(`${JSON.stringify(actual, null, 2)}\n`); + } else { + console.log(formatInventoryHuman(actual)); + console.log( + matchesBaseline + ? `Baseline matches (${actual.length} entries).` + : `Baseline mismatch (${unexpected.length} unexpected, ${missing.length} missing).`, + ); + if (!matchesBaseline) { + if (unexpected.length > 0) { + console.error("Unexpected entries:"); + for (const entry of unexpected) { + console.error(`- ${formatEntry(entry)}`); + } + } + if (missing.length > 0) { + console.error("Missing baseline entries:"); + for (const entry of missing) { + console.error(`- ${formatEntry(entry)}`); + } + } + } + } + + if (!matchesBaseline) { + process.exit(1); + } +} + +runAsScript(import.meta.url, main); diff --git a/scripts/check-plugin-sdk-subpath-exports.mjs b/scripts/check-plugin-sdk-subpath-exports.mjs index 07094e18a3b..5750e2e7ef6 100644 --- a/scripts/check-plugin-sdk-subpath-exports.mjs +++ b/scripts/check-plugin-sdk-subpath-exports.mjs @@ -11,7 +11,7 @@ import { } from "./lib/ts-guard-utils.mjs"; const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); -const scanRoots = resolveSourceRoots(repoRoot, ["src", "extensions", "scripts", "test"]); +const scanRoots = resolveSourceRoots(repoRoot, ["src", "native-plugins", "scripts", "test"]); function readPackageExports() { const packageJson = JSON.parse(readFileSync(path.join(repoRoot, "package.json"), "utf8")); diff --git a/scripts/check-webhook-auth-body-order.mjs b/scripts/check-webhook-auth-body-order.mjs index aa771cb8e13..c0b79450e1d 100644 --- a/scripts/check-webhook-auth-body-order.mjs +++ b/scripts/check-webhook-auth-body-order.mjs @@ -7,9 +7,9 @@ import { runAsScript, toLine, unwrapExpression } from "./lib/ts-guard-utils.mjs" const sourceRoots = ["extensions"]; const enforcedFiles = new Set([ - "extensions/bluebubbles/src/monitor.ts", - "extensions/googlechat/src/monitor.ts", - "extensions/zalo/src/monitor.webhook.ts", + "native-plugins/bluebubbles/src/monitor.ts", + "native-plugins/googlechat/src/monitor.ts", + "native-plugins/zalo/src/monitor.webhook.ts", ]); const blockedCallees = new Set(["readJsonBodyWithLimit", "readRequestBodyWithLimit"]); diff --git a/scripts/ci-changed-scope.mjs b/scripts/ci-changed-scope.mjs index bc17ea97cca..7362043416e 100644 --- a/scripts/ci-changed-scope.mjs +++ b/scripts/ci-changed-scope.mjs @@ -11,9 +11,9 @@ const MACOS_PROTOCOL_GEN_RE = const MACOS_NATIVE_RE = /^(apps\/macos\/|apps\/ios\/|apps\/shared\/|Swabble\/)/; const ANDROID_NATIVE_RE = /^(apps\/android\/|apps\/shared\/)/; const NODE_SCOPE_RE = - /^(src\/|test\/|extensions\/|packages\/|scripts\/|ui\/|\.github\/|openclaw\.mjs$|package\.json$|pnpm-lock\.yaml$|pnpm-workspace\.yaml$|tsconfig.*\.json$|vitest.*\.ts$|tsdown\.config\.ts$|\.oxlintrc\.json$|\.oxfmtrc\.jsonc$)/; + /^(src\/|test\/|native-plugins\/|packages\/|scripts\/|ui\/|\.github\/|openclaw\.mjs$|package\.json$|pnpm-lock\.yaml$|pnpm-workspace\.yaml$|tsconfig.*\.json$|vitest.*\.ts$|tsdown\.config\.ts$|\.oxlintrc\.json$|\.oxfmtrc\.jsonc$)/; const WINDOWS_SCOPE_RE = - /^(src\/|test\/|extensions\/|packages\/|scripts\/|ui\/|openclaw\.mjs$|package\.json$|pnpm-lock\.yaml$|pnpm-workspace\.yaml$|tsconfig.*\.json$|vitest.*\.ts$|tsdown\.config\.ts$|\.github\/workflows\/ci\.yml$|\.github\/actions\/setup-node-env\/action\.yml$|\.github\/actions\/setup-pnpm-store-cache\/action\.yml$)/; + /^(src\/|test\/|native-plugins\/|packages\/|scripts\/|ui\/|openclaw\.mjs$|package\.json$|pnpm-lock\.yaml$|pnpm-workspace\.yaml$|tsconfig.*\.json$|vitest.*\.ts$|tsdown\.config\.ts$|\.github\/workflows\/ci\.yml$|\.github\/actions\/setup-node-env\/action\.yml$|\.github\/actions\/setup-pnpm-store-cache\/action\.yml$)/; const NATIVE_ONLY_RE = /^(apps\/android\/|apps\/ios\/|apps\/macos\/|apps\/shared\/|Swabble\/|appcast\.xml$)/; diff --git a/scripts/copy-bundled-plugin-metadata.mjs b/scripts/copy-bundled-plugin-metadata.mjs index 12211f9b29b..ba8175d441d 100644 --- a/scripts/copy-bundled-plugin-metadata.mjs +++ b/scripts/copy-bundled-plugin-metadata.mjs @@ -165,8 +165,8 @@ function copyDeclaredPluginSkillPaths(params) { export function copyBundledPluginMetadata(params = {}) { const repoRoot = params.cwd ?? params.repoRoot ?? process.cwd(); - const extensionsRoot = path.join(repoRoot, "extensions"); - const distExtensionsRoot = path.join(repoRoot, "dist", "extensions"); + const extensionsRoot = path.join(repoRoot, "native-plugins"); + const distExtensionsRoot = path.join(repoRoot, "dist", "native-plugins"); if (!fs.existsSync(extensionsRoot)) { return; } @@ -211,10 +211,10 @@ export function copyBundledPluginMetadata(params = {}) { } const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8")); - if (packageJson.openclaw && "extensions" in packageJson.openclaw) { + if (packageJson.openclaw && "plugins" in packageJson.openclaw) { packageJson.openclaw = { ...packageJson.openclaw, - extensions: rewritePackageExtensions(packageJson.openclaw.extensions), + plugins: rewritePackageExtensions(packageJson.openclaw.plugins), ...(typeof packageJson.openclaw.setupEntry === "string" ? { setupEntry: rewritePackageEntry(packageJson.openclaw.setupEntry) } : {}), diff --git a/scripts/dev/test-device-pair-telegram.ts b/scripts/dev/test-device-pair-telegram.ts index e39e0a378cd..8e2a7d616bd 100644 --- a/scripts/dev/test-device-pair-telegram.ts +++ b/scripts/dev/test-device-pair-telegram.ts @@ -1,4 +1,4 @@ -import { sendMessageTelegram } from "../../extensions/telegram/src/send.js"; +import { sendMessageTelegram } from "../../native-plugins/telegram/src/send.js"; import { loadConfig } from "../../src/config/config.js"; import { matchPluginCommand, executePluginCommand } from "../../src/plugins/commands.js"; import { loadOpenClawPlugins } from "../../src/plugins/loader.js"; diff --git a/scripts/e2e/Dockerfile b/scripts/e2e/Dockerfile index 2c23c9ef1b8..c5bf48b6485 100644 --- a/scripts/e2e/Dockerfile +++ b/scripts/e2e/Dockerfile @@ -20,7 +20,7 @@ WORKDIR /app COPY --chown=appuser:appuser package.json pnpm-lock.yaml pnpm-workspace.yaml ./ COPY --chown=appuser:appuser ui/package.json ./ui/package.json -COPY --chown=appuser:appuser extensions ./extensions +COPY --chown=appuser:appuser native-plugins ./native-plugins COPY --chown=appuser:appuser patches ./patches RUN --mount=type=cache,id=openclaw-pnpm-store,target=/home/appuser/.local/share/pnpm/store,sharing=locked \ @@ -33,7 +33,7 @@ COPY --chown=appuser:appuser scripts ./scripts COPY --chown=appuser:appuser docs ./docs COPY --chown=appuser:appuser skills ./skills COPY --chown=appuser:appuser ui ./ui -COPY --chown=appuser:appuser extensions ./extensions +COPY --chown=appuser:appuser native-plugins ./native-plugins COPY --chown=appuser:appuser vendor/a2ui/renderers/lit ./vendor/a2ui/renderers/lit COPY --chown=appuser:appuser apps/shared/OpenClawKit/Sources/OpenClawKit/Resources ./apps/shared/OpenClawKit/Sources/OpenClawKit/Resources COPY --chown=appuser:appuser apps/shared/OpenClawKit/Tools/CanvasA2UI ./apps/shared/OpenClawKit/Tools/CanvasA2UI diff --git a/scripts/e2e/plugins-docker.sh b/scripts/e2e/plugins-docker.sh index 632d6924099..4cd21b851f4 100755 --- a/scripts/e2e/plugins-docker.sh +++ b/scripts/e2e/plugins-docker.sh @@ -37,7 +37,7 @@ write_fixture_plugin() { { "name": "@openclaw/$id", "version": "$version", - "openclaw": { "extensions": ["./index.js"] } + "openclaw": { "plugins": ["./index.js"] } } JSON cat > "$dir/index.js" < "$HOME/.openclaw/extensions/demo-plugin/index.js" <<'JS' +cat > "$HOME/.openclaw/plugins/demo-plugin/index.js" <<'JS' module.exports = { id: "demo-plugin", name: "Demo Plugin", @@ -83,7 +83,7 @@ module.exports = { }, }; JS -cat > "$HOME/.openclaw/extensions/demo-plugin/openclaw.plugin.json" <<'JSON' +cat > "$HOME/.openclaw/plugins/demo-plugin/openclaw.plugin.json" <<'JSON' { "id": "demo-plugin", "configSchema": { @@ -131,7 +131,7 @@ cat > "$pack_dir/package/package.json" <<'JSON' { "name": "@openclaw/demo-plugin-tgz", "version": "0.0.1", - "openclaw": { "extensions": ["./index.js"] } + "openclaw": { "plugins": ["./index.js"] } } JSON cat > "$pack_dir/package/index.js" <<'JS' @@ -178,7 +178,7 @@ cat > "$dir_plugin/package.json" <<'JSON' { "name": "@openclaw/demo-plugin-dir", "version": "0.0.1", - "openclaw": { "extensions": ["./index.js"] } + "openclaw": { "plugins": ["./index.js"] } } JSON cat > "$dir_plugin/index.js" <<'JS' @@ -225,7 +225,7 @@ cat > "$file_pack_dir/package/package.json" <<'JSON' { "name": "@openclaw/demo-plugin-file", "version": "0.0.1", - "openclaw": { "extensions": ["./index.js"] } + "openclaw": { "plugins": ["./index.js"] } } JSON cat > "$file_pack_dir/package/index.js" <<'JS' diff --git a/scripts/generate-bundled-provider-auth-env-vars.mjs b/scripts/generate-bundled-provider-auth-env-vars.mjs index ebcd29360e8..81d495a18d4 100644 --- a/scripts/generate-bundled-provider-auth-env-vars.mjs +++ b/scripts/generate-bundled-provider-auth-env-vars.mjs @@ -40,18 +40,18 @@ function normalizeProviderAuthEnvVars(providerAuthEnvVars) { export function collectBundledProviderAuthEnvVars(params = {}) { const repoRoot = path.resolve(params.repoRoot ?? process.cwd()); - const extensionsRoot = path.join(repoRoot, "extensions"); - if (!fs.existsSync(extensionsRoot)) { + const nativePluginsRoot = path.join(repoRoot, "native-plugins"); + if (!fs.existsSync(nativePluginsRoot)) { return {}; } const entries = new Map(); - for (const dirent of fs.readdirSync(extensionsRoot, { withFileTypes: true })) { + for (const dirent of fs.readdirSync(nativePluginsRoot, { withFileTypes: true })) { if (!dirent.isDirectory()) { continue; } - const manifestPath = path.join(extensionsRoot, dirent.name, "openclaw.plugin.json"); + const manifestPath = path.join(nativePluginsRoot, dirent.name, "openclaw.plugin.json"); if (!fs.existsSync(manifestPath)) { continue; } diff --git a/scripts/lib/bundled-extension-manifest.ts b/scripts/lib/bundled-extension-manifest.ts deleted file mode 100644 index b82ce3ff10c..00000000000 --- a/scripts/lib/bundled-extension-manifest.ts +++ /dev/null @@ -1,31 +0,0 @@ -export type ExtensionPackageJson = { - name?: string; - version?: string; - dependencies?: Record; - optionalDependencies?: Record; - openclaw?: { - install?: { - npmSpec?: string; - }; - }; -}; - -export type BundledExtension = { id: string; packageJson: ExtensionPackageJson }; - -export function collectBundledExtensionManifestErrors(extensions: BundledExtension[]): string[] { - const errors: string[] = []; - - for (const extension of extensions) { - const install = extension.packageJson.openclaw?.install; - if ( - install && - (!install.npmSpec || typeof install.npmSpec !== "string" || !install.npmSpec.trim()) - ) { - errors.push( - `bundled extension '${extension.id}' manifest invalid | openclaw.install.npmSpec must be a non-empty string`, - ); - } - } - - return errors; -} diff --git a/scripts/lib/bundled-native-plugin-manifest.ts b/scripts/lib/bundled-native-plugin-manifest.ts new file mode 100644 index 00000000000..0c69212042c --- /dev/null +++ b/scripts/lib/bundled-native-plugin-manifest.ts @@ -0,0 +1,37 @@ +export type NativePluginPackageJson = { + name?: string; + version?: string; + dependencies?: Record; + optionalDependencies?: Record; + openclaw?: { + install?: { + npmSpec?: string; + }; + }; +}; + +export type BundledNativePlugin = { id: string; packageJson: NativePluginPackageJson }; + +export function collectBundledNativePluginManifestErrors( + nativePlugins: BundledNativePlugin[], +): string[] { + const errors: string[] = []; + + for (const nativePlugin of nativePlugins) { + const install = nativePlugin.packageJson.openclaw?.install; + if ( + install && + (!install.npmSpec || typeof install.npmSpec !== "string" || !install.npmSpec.trim()) + ) { + errors.push( + `bundled native plugin '${nativePlugin.id}' manifest invalid | openclaw.install.npmSpec must be a non-empty string`, + ); + } + } + + return errors; +} + +export type ExtensionPackageJson = NativePluginPackageJson; +export type BundledExtension = BundledNativePlugin; +export const collectBundledExtensionManifestErrors = collectBundledNativePluginManifestErrors; diff --git a/scripts/lib/pairing-guard-context.mjs b/scripts/lib/pairing-guard-context.mjs index e34df00529c..e1e1baee6c2 100644 --- a/scripts/lib/pairing-guard-context.mjs +++ b/scripts/lib/pairing-guard-context.mjs @@ -3,7 +3,7 @@ import { resolveRepoRoot, resolveSourceRoots } from "./ts-guard-utils.mjs"; export function createPairingGuardContext(importMetaUrl) { const repoRoot = resolveRepoRoot(importMetaUrl); - const sourceRoots = resolveSourceRoots(repoRoot, ["src", "extensions"]); + const sourceRoots = resolveSourceRoots(repoRoot, ["src", "native-plugins"]); return { repoRoot, sourceRoots, diff --git a/scripts/lib/plugin-npm-release.ts b/scripts/lib/plugin-npm-release.ts index 34f98e86f2f..cb396239804 100644 --- a/scripts/lib/plugin-npm-release.ts +++ b/scripts/lib/plugin-npm-release.ts @@ -9,6 +9,7 @@ export type PluginPackageJson = { version?: string; private?: boolean; openclaw?: { + plugins?: string[]; extensions?: string[]; install?: { npmSpec?: string; @@ -156,7 +157,7 @@ export function collectPublishablePluginPackageErrors( const errors: string[] = []; const packageName = packageJson.name?.trim() ?? ""; const packageVersion = packageJson.version?.trim() ?? ""; - const extensions = packageJson.openclaw?.extensions ?? []; + const plugins = packageJson.openclaw?.plugins ?? packageJson.openclaw?.extensions ?? []; if (!packageName.startsWith("@openclaw/")) { errors.push( @@ -173,11 +174,11 @@ export function collectPublishablePluginPackageErrors( `package.json version must match YYYY.M.D or YYYY.M.D-beta.N; found "${packageVersion}".`, ); } - if (!Array.isArray(extensions) || extensions.length === 0) { - errors.push("openclaw.extensions must contain at least one entry."); + if (!Array.isArray(plugins) || plugins.length === 0) { + errors.push("openclaw.plugins must contain at least one entry."); } - if (extensions.some((entry) => typeof entry !== "string" || !entry.trim())) { - errors.push("openclaw.extensions must contain only non-empty strings."); + if (plugins.some((entry) => typeof entry !== "string" || !entry.trim())) { + errors.push("openclaw.plugins must contain only non-empty strings."); } return errors; @@ -186,8 +187,8 @@ export function collectPublishablePluginPackageErrors( export function collectPublishablePluginPackages( rootDir = resolve("."), ): PublishablePluginPackage[] { - const extensionsDir = join(rootDir, "extensions"); - const dirs = readdirSync(extensionsDir, { withFileTypes: true }).filter((entry) => + const nativePluginsDir = join(rootDir, "native-plugins"); + const dirs = readdirSync(nativePluginsDir, { withFileTypes: true }).filter((entry) => entry.isDirectory(), ); @@ -195,8 +196,8 @@ export function collectPublishablePluginPackages( const validationErrors: string[] = []; for (const dir of dirs) { - const packageDir = join("extensions", dir.name); - const absolutePackageDir = join(extensionsDir, dir.name); + const packageDir = join("native-plugins", dir.name); + const absolutePackageDir = join(nativePluginsDir, dir.name); const packageJsonPath = join(absolutePackageDir, "package.json"); let packageJson: PluginPackageJson; try { @@ -282,7 +283,7 @@ export function collectChangedExtensionIdsFromPaths(paths: readonly string[]): s for (const path of paths) { const normalized = path.trim().replaceAll("\\", "/"); - const match = /^extensions\/([^/]+)\//.exec(normalized); + const match = /^native-plugins\/([^/]+)\//.exec(normalized); if (match?.[1]) { extensionIds.add(match[1]); } @@ -308,7 +309,7 @@ export function collectChangedExtensionIdsFromGitRange(params: { const changedPaths = execFileSync( "git", - ["diff", "--name-only", "--diff-filter=ACMR", baseRef, headRef, "--", "extensions"], + ["diff", "--name-only", "--diff-filter=ACMR", baseRef, headRef, "--", "native-plugins"], { cwd: rootDir, encoding: "utf8", diff --git a/scripts/lib/plugin-sdk-entrypoints.json b/scripts/lib/plugin-sdk-entrypoints.json index f9c20590e4b..5fde7db7dbb 100644 --- a/scripts/lib/plugin-sdk-entrypoints.json +++ b/scripts/lib/plugin-sdk-entrypoints.json @@ -71,6 +71,7 @@ "device-pair", "diagnostics-otel", "diffs", + "native-plugin-shared", "extension-shared", "channel-config-helpers", "channel-config-schema", diff --git a/scripts/profile-extension-memory.mjs b/scripts/profile-extension-memory.mjs index 0145ed832a4..f4e212957bd 100644 --- a/scripts/profile-extension-memory.mjs +++ b/scripts/profile-extension-memory.mjs @@ -1,359 +1 @@ -#!/usr/bin/env node - -import { spawn } from "node:child_process"; -import { existsSync, mkdtempSync, readdirSync, rmSync, writeFileSync } from "node:fs"; -import os from "node:os"; -import path from "node:path"; - -const DEFAULT_CONCURRENCY = 6; -const DEFAULT_TIMEOUT_MS = 90_000; -const DEFAULT_COMBINED_TIMEOUT_MS = 180_000; -const DEFAULT_TOP = 10; -const RSS_MARKER = "__OPENCLAW_MAX_RSS_KB__="; - -function printHelp() { - console.log(`Usage: node scripts/profile-extension-memory.mjs [options] - -Profiles peak RSS for built extension entrypoints in dist/extensions/*/index.js. -Run pnpm build first if you want stats for the latest source changes. - -Options: - --extension, -e Limit profiling to one or more extension ids (repeatable) - --concurrency Number of per-extension workers (default: ${DEFAULT_CONCURRENCY}) - --timeout-ms Per-extension timeout in milliseconds (default: ${DEFAULT_TIMEOUT_MS}) - --combined-timeout-ms - Combined-import timeout in milliseconds (default: ${DEFAULT_COMBINED_TIMEOUT_MS}) - --top Show top N entries by delta from baseline (default: ${DEFAULT_TOP}) - --json Write full JSON report to this path - --skip-combined Skip the combined all-imports measurement - --help Show this help - -Examples: - pnpm test:extensions:memory - pnpm test:extensions:memory -- --extension discord - pnpm test:extensions:memory -- --extension discord --extension telegram --skip-combined -`); -} - -function parsePositiveInt(raw, flagName) { - const parsed = Number.parseInt(raw, 10); - if (!Number.isFinite(parsed) || parsed <= 0) { - throw new Error(`${flagName} must be a positive integer`); - } - return parsed; -} - -function parseArgs(argv) { - const options = { - extensions: [], - concurrency: DEFAULT_CONCURRENCY, - timeoutMs: DEFAULT_TIMEOUT_MS, - combinedTimeoutMs: DEFAULT_COMBINED_TIMEOUT_MS, - top: DEFAULT_TOP, - jsonPath: null, - skipCombined: false, - }; - - for (let index = 0; index < argv.length; index += 1) { - const arg = argv[index]; - switch (arg) { - case "--": - break; - case "--extension": - case "-e": { - const next = argv[index + 1]; - if (!next) { - throw new Error(`${arg} requires a value`); - } - options.extensions.push(next); - index += 1; - break; - } - case "--concurrency": - options.concurrency = parsePositiveInt(argv[index + 1], arg); - index += 1; - break; - case "--timeout-ms": - options.timeoutMs = parsePositiveInt(argv[index + 1], arg); - index += 1; - break; - case "--combined-timeout-ms": - options.combinedTimeoutMs = parsePositiveInt(argv[index + 1], arg); - index += 1; - break; - case "--top": - options.top = parsePositiveInt(argv[index + 1], arg); - index += 1; - break; - case "--json": { - const next = argv[index + 1]; - if (!next) { - throw new Error(`${arg} requires a value`); - } - options.jsonPath = path.resolve(next); - index += 1; - break; - } - case "--skip-combined": - options.skipCombined = true; - break; - case "--help": - case "-h": - printHelp(); - process.exit(0); - default: - throw new Error(`Unknown argument: ${arg}`); - } - } - - return options; -} - -function parseMaxRssMb(stderr) { - const matches = [...stderr.matchAll(new RegExp(`^${RSS_MARKER}(\\d+)\\s*$`, "gm"))]; - const last = matches.at(-1); - return last ? Number(last[1]) / 1024 : null; -} - -function summarizeStderr(stderr, lines = 8) { - return stderr.trim().split("\n").filter(Boolean).slice(0, lines).join("\n"); -} - -async function runCase({ repoRoot, env, hookPath, name, body, timeoutMs }) { - return await new Promise((resolve) => { - const child = spawn( - process.execPath, - ["--import", hookPath, "--input-type=module", "--eval", body], - { - cwd: repoRoot, - env, - stdio: ["ignore", "pipe", "pipe"], - }, - ); - - let stdout = ""; - let stderr = ""; - let timedOut = false; - const timer = setTimeout(() => { - timedOut = true; - child.kill("SIGKILL"); - }, timeoutMs); - - child.stdout.on("data", (chunk) => { - stdout += String(chunk); - }); - child.stderr.on("data", (chunk) => { - stderr += String(chunk); - }); - child.on("close", (code, signal) => { - clearTimeout(timer); - resolve({ - name, - code, - signal, - timedOut, - stdout, - stderr, - maxRssMb: parseMaxRssMb(stderr), - }); - }); - }); -} - -function buildImportBody(entryFiles, label) { - const imports = entryFiles - .map((filePath) => `await import(${JSON.stringify(filePath)});`) - .join("\n"); - return `${imports}\nconsole.log(${JSON.stringify(label)});\nprocess.exit(0);\n`; -} - -function findExtensionEntries(repoRoot) { - const extensionsDir = path.join(repoRoot, "dist", "extensions"); - if (!existsSync(extensionsDir)) { - throw new Error("dist/extensions not found. Run pnpm build first."); - } - - const entries = readdirSync(extensionsDir) - .map((dir) => ({ dir, file: path.join(extensionsDir, dir, "index.js") })) - .filter((entry) => existsSync(entry.file)) - .toSorted((a, b) => a.dir.localeCompare(b.dir)); - - if (entries.length === 0) { - throw new Error("No built extension entrypoints found under dist/extensions/*/index.js"); - } - return entries; -} - -async function main() { - const options = parseArgs(process.argv.slice(2)); - const repoRoot = process.cwd(); - const allEntries = findExtensionEntries(repoRoot); - const selectedEntries = - options.extensions.length === 0 - ? allEntries - : allEntries.filter((entry) => options.extensions.includes(entry.dir)); - - const missing = options.extensions.filter((id) => !allEntries.some((entry) => entry.dir === id)); - if (missing.length > 0) { - throw new Error(`Unknown built extension ids: ${missing.join(", ")}`); - } - if (selectedEntries.length === 0) { - throw new Error("No extensions selected for profiling"); - } - - const tmpHome = mkdtempSync(path.join(os.tmpdir(), "openclaw-extension-memory-")); - const hookPath = path.join(tmpHome, "measure-rss.mjs"); - const jsonPath = options.jsonPath ?? path.join(os.tmpdir(), "openclaw-extension-memory.json"); - - writeFileSync( - hookPath, - [ - "process.on('exit', () => {", - " const usage = typeof process.resourceUsage === 'function' ? process.resourceUsage() : null;", - ` if (usage && typeof usage.maxRSS === 'number') console.error('${RSS_MARKER}' + String(usage.maxRSS));`, - "});", - "", - ].join("\n"), - "utf8", - ); - - const env = { - ...process.env, - HOME: tmpHome, - USERPROFILE: tmpHome, - XDG_CONFIG_HOME: path.join(tmpHome, ".config"), - XDG_DATA_HOME: path.join(tmpHome, ".local", "share"), - XDG_CACHE_HOME: path.join(tmpHome, ".cache"), - NODE_DISABLE_COMPILE_CACHE: "1", - OPENCLAW_NO_RESPAWN: "1", - TERM: process.env.TERM ?? "dumb", - LANG: process.env.LANG ?? "C.UTF-8", - }; - - try { - const baseline = await runCase({ - repoRoot, - env, - hookPath, - name: "baseline", - body: "process.exit(0)", - timeoutMs: options.timeoutMs, - }); - - const combined = options.skipCombined - ? null - : await runCase({ - repoRoot, - env, - hookPath, - name: "combined", - body: buildImportBody( - selectedEntries.map((entry) => entry.file), - "IMPORTED_ALL", - ), - timeoutMs: options.combinedTimeoutMs, - }); - - const pending = [...selectedEntries]; - const results = []; - - async function worker() { - while (pending.length > 0) { - const next = pending.shift(); - if (next === undefined) { - return; - } - const result = await runCase({ - repoRoot, - env, - hookPath, - name: next.dir, - body: buildImportBody([next.file], "IMPORTED"), - timeoutMs: options.timeoutMs, - }); - results.push({ - dir: next.dir, - file: next.file, - status: result.timedOut ? "timeout" : result.code === 0 ? "ok" : "fail", - maxRssMb: result.maxRssMb, - deltaFromBaselineMb: - result.maxRssMb !== null && baseline.maxRssMb !== null - ? result.maxRssMb - baseline.maxRssMb - : null, - stderrPreview: summarizeStderr(result.stderr), - }); - - const status = result.timedOut ? "timeout" : result.code === 0 ? "ok" : "fail"; - const rss = result.maxRssMb === null ? "n/a" : `${result.maxRssMb.toFixed(1)} MB`; - console.log(`[extension-memory] ${next.dir}: ${status} ${rss}`); - } - } - - await Promise.all( - Array.from({ length: Math.min(options.concurrency, selectedEntries.length) }, () => worker()), - ); - - results.sort((a, b) => a.dir.localeCompare(b.dir)); - const top = results - .filter((entry) => entry.status === "ok" && typeof entry.deltaFromBaselineMb === "number") - .toSorted((a, b) => (b.deltaFromBaselineMb ?? 0) - (a.deltaFromBaselineMb ?? 0)) - .slice(0, options.top); - - const report = { - generatedAt: new Date().toISOString(), - repoRoot, - selectedExtensions: selectedEntries.map((entry) => entry.dir), - baseline: { - status: baseline.timedOut ? "timeout" : baseline.code === 0 ? "ok" : "fail", - maxRssMb: baseline.maxRssMb, - }, - combined: - combined === null - ? null - : { - status: combined.timedOut ? "timeout" : combined.code === 0 ? "ok" : "fail", - maxRssMb: combined.maxRssMb, - stderrPreview: summarizeStderr(combined.stderr, 12), - }, - counts: { - totalEntries: selectedEntries.length, - ok: results.filter((entry) => entry.status === "ok").length, - fail: results.filter((entry) => entry.status === "fail").length, - timeout: results.filter((entry) => entry.status === "timeout").length, - }, - options: { - concurrency: options.concurrency, - timeoutMs: options.timeoutMs, - combinedTimeoutMs: options.combinedTimeoutMs, - skipCombined: options.skipCombined, - }, - topByDeltaMb: top, - results, - }; - - writeFileSync(jsonPath, `${JSON.stringify(report, null, 2)}\n`, "utf8"); - - console.log(`[extension-memory] report: ${jsonPath}`); - console.log( - JSON.stringify( - { - baselineMb: report.baseline.maxRssMb, - combinedMb: report.combined?.maxRssMb ?? null, - counts: report.counts, - topByDeltaMb: report.topByDeltaMb, - }, - null, - 2, - ), - ); - } finally { - rmSync(tmpHome, { recursive: true, force: true }); - } -} - -try { - await main(); -} catch (error) { - console.error(`[extension-memory] ${error instanceof Error ? error.message : String(error)}`); - process.exit(1); -} +import "./profile-native-plugin-memory.mjs"; diff --git a/scripts/profile-native-plugin-memory.mjs b/scripts/profile-native-plugin-memory.mjs new file mode 100644 index 00000000000..7da6ef110fa --- /dev/null +++ b/scripts/profile-native-plugin-memory.mjs @@ -0,0 +1,361 @@ +#!/usr/bin/env node + +import { spawn } from "node:child_process"; +import { existsSync, mkdtempSync, readdirSync, rmSync, writeFileSync } from "node:fs"; +import os from "node:os"; +import path from "node:path"; + +const DEFAULT_CONCURRENCY = 6; +const DEFAULT_TIMEOUT_MS = 90_000; +const DEFAULT_COMBINED_TIMEOUT_MS = 180_000; +const DEFAULT_TOP = 10; +const RSS_MARKER = "__OPENCLAW_MAX_RSS_KB__="; + +function printHelp() { + console.log(`Usage: node scripts/profile-native-plugin-memory.mjs [options] + +Profiles peak RSS for built native plugin entrypoints in dist/native-plugins/*/index.js. +Run pnpm build first if you want stats for the latest source changes. + +Options: + --native-plugin, -e Limit profiling to one or more native plugin ids (repeatable) + --concurrency Number of per-native-plugin workers (default: ${DEFAULT_CONCURRENCY}) + --timeout-ms Per-extension timeout in milliseconds (default: ${DEFAULT_TIMEOUT_MS}) + --combined-timeout-ms + Combined-import timeout in milliseconds (default: ${DEFAULT_COMBINED_TIMEOUT_MS}) + --top Show top N entries by delta from baseline (default: ${DEFAULT_TOP}) + --json Write full JSON report to this path + --skip-combined Skip the combined all-imports measurement + --help Show this help + +Examples: + pnpm test:native-plugins:memory + pnpm test:native-plugins:memory -- --native-plugin discord + pnpm test:native-plugins:memory -- --native-plugin discord --native-plugin telegram --skip-combined +`); +} + +function parsePositiveInt(raw, flagName) { + const parsed = Number.parseInt(raw, 10); + if (!Number.isFinite(parsed) || parsed <= 0) { + throw new Error(`${flagName} must be a positive integer`); + } + return parsed; +} + +function parseArgs(argv) { + const options = { + extensions: [], + concurrency: DEFAULT_CONCURRENCY, + timeoutMs: DEFAULT_TIMEOUT_MS, + combinedTimeoutMs: DEFAULT_COMBINED_TIMEOUT_MS, + top: DEFAULT_TOP, + jsonPath: null, + skipCombined: false, + }; + + for (let index = 0; index < argv.length; index += 1) { + const arg = argv[index]; + switch (arg) { + case "--": + break; + case "--native-plugin": + case "-e": { + const next = argv[index + 1]; + if (!next) { + throw new Error(`${arg} requires a value`); + } + options.extensions.push(next); + index += 1; + break; + } + case "--concurrency": + options.concurrency = parsePositiveInt(argv[index + 1], arg); + index += 1; + break; + case "--timeout-ms": + options.timeoutMs = parsePositiveInt(argv[index + 1], arg); + index += 1; + break; + case "--combined-timeout-ms": + options.combinedTimeoutMs = parsePositiveInt(argv[index + 1], arg); + index += 1; + break; + case "--top": + options.top = parsePositiveInt(argv[index + 1], arg); + index += 1; + break; + case "--json": { + const next = argv[index + 1]; + if (!next) { + throw new Error(`${arg} requires a value`); + } + options.jsonPath = path.resolve(next); + index += 1; + break; + } + case "--skip-combined": + options.skipCombined = true; + break; + case "--help": + case "-h": + printHelp(); + process.exit(0); + default: + throw new Error(`Unknown argument: ${arg}`); + } + } + + return options; +} + +function parseMaxRssMb(stderr) { + const matches = [...stderr.matchAll(new RegExp(`^${RSS_MARKER}(\\d+)\\s*$`, "gm"))]; + const last = matches.at(-1); + return last ? Number(last[1]) / 1024 : null; +} + +function summarizeStderr(stderr, lines = 8) { + return stderr.trim().split("\n").filter(Boolean).slice(0, lines).join("\n"); +} + +async function runCase({ repoRoot, env, hookPath, name, body, timeoutMs }) { + return await new Promise((resolve) => { + const child = spawn( + process.execPath, + ["--import", hookPath, "--input-type=module", "--eval", body], + { + cwd: repoRoot, + env, + stdio: ["ignore", "pipe", "pipe"], + }, + ); + + let stdout = ""; + let stderr = ""; + let timedOut = false; + const timer = setTimeout(() => { + timedOut = true; + child.kill("SIGKILL"); + }, timeoutMs); + + child.stdout.on("data", (chunk) => { + stdout += String(chunk); + }); + child.stderr.on("data", (chunk) => { + stderr += String(chunk); + }); + child.on("close", (code, signal) => { + clearTimeout(timer); + resolve({ + name, + code, + signal, + timedOut, + stdout, + stderr, + maxRssMb: parseMaxRssMb(stderr), + }); + }); + }); +} + +function buildImportBody(entryFiles, label) { + const imports = entryFiles + .map((filePath) => `await import(${JSON.stringify(filePath)});`) + .join("\n"); + return `${imports}\nconsole.log(${JSON.stringify(label)});\nprocess.exit(0);\n`; +} + +function findExtensionEntries(repoRoot) { + const extensionsDir = path.join(repoRoot, "dist", "native-plugins"); + if (!existsSync(extensionsDir)) { + throw new Error("dist/native-plugins not found. Run pnpm build first."); + } + + const entries = readdirSync(extensionsDir) + .map((dir) => ({ dir, file: path.join(extensionsDir, dir, "index.js") })) + .filter((entry) => existsSync(entry.file)) + .toSorted((a, b) => a.dir.localeCompare(b.dir)); + + if (entries.length === 0) { + throw new Error( + "No built native plugin entrypoints found under dist/native-plugins/*/index.js", + ); + } + return entries; +} + +async function main() { + const options = parseArgs(process.argv.slice(2)); + const repoRoot = process.cwd(); + const allEntries = findExtensionEntries(repoRoot); + const selectedEntries = + options.extensions.length === 0 + ? allEntries + : allEntries.filter((entry) => options.extensions.includes(entry.dir)); + + const missing = options.extensions.filter((id) => !allEntries.some((entry) => entry.dir === id)); + if (missing.length > 0) { + throw new Error(`Unknown built native plugin ids: ${missing.join(", ")}`); + } + if (selectedEntries.length === 0) { + throw new Error("No native plugins selected for profiling"); + } + + const tmpHome = mkdtempSync(path.join(os.tmpdir(), "openclaw-native-plugin-memory-")); + const hookPath = path.join(tmpHome, "measure-rss.mjs"); + const jsonPath = options.jsonPath ?? path.join(os.tmpdir(), "openclaw-native-plugin-memory.json"); + + writeFileSync( + hookPath, + [ + "process.on('exit', () => {", + " const usage = typeof process.resourceUsage === 'function' ? process.resourceUsage() : null;", + ` if (usage && typeof usage.maxRSS === 'number') console.error('${RSS_MARKER}' + String(usage.maxRSS));`, + "});", + "", + ].join("\n"), + "utf8", + ); + + const env = { + ...process.env, + HOME: tmpHome, + USERPROFILE: tmpHome, + XDG_CONFIG_HOME: path.join(tmpHome, ".config"), + XDG_DATA_HOME: path.join(tmpHome, ".local", "share"), + XDG_CACHE_HOME: path.join(tmpHome, ".cache"), + NODE_DISABLE_COMPILE_CACHE: "1", + OPENCLAW_NO_RESPAWN: "1", + TERM: process.env.TERM ?? "dumb", + LANG: process.env.LANG ?? "C.UTF-8", + }; + + try { + const baseline = await runCase({ + repoRoot, + env, + hookPath, + name: "baseline", + body: "process.exit(0)", + timeoutMs: options.timeoutMs, + }); + + const combined = options.skipCombined + ? null + : await runCase({ + repoRoot, + env, + hookPath, + name: "combined", + body: buildImportBody( + selectedEntries.map((entry) => entry.file), + "IMPORTED_ALL", + ), + timeoutMs: options.combinedTimeoutMs, + }); + + const pending = [...selectedEntries]; + const results = []; + + async function worker() { + while (pending.length > 0) { + const next = pending.shift(); + if (next === undefined) { + return; + } + const result = await runCase({ + repoRoot, + env, + hookPath, + name: next.dir, + body: buildImportBody([next.file], "IMPORTED"), + timeoutMs: options.timeoutMs, + }); + results.push({ + dir: next.dir, + file: next.file, + status: result.timedOut ? "timeout" : result.code === 0 ? "ok" : "fail", + maxRssMb: result.maxRssMb, + deltaFromBaselineMb: + result.maxRssMb !== null && baseline.maxRssMb !== null + ? result.maxRssMb - baseline.maxRssMb + : null, + stderrPreview: summarizeStderr(result.stderr), + }); + + const status = result.timedOut ? "timeout" : result.code === 0 ? "ok" : "fail"; + const rss = result.maxRssMb === null ? "n/a" : `${result.maxRssMb.toFixed(1)} MB`; + console.log(`[native-plugin-memory] ${next.dir}: ${status} ${rss}`); + } + } + + await Promise.all( + Array.from({ length: Math.min(options.concurrency, selectedEntries.length) }, () => worker()), + ); + + results.sort((a, b) => a.dir.localeCompare(b.dir)); + const top = results + .filter((entry) => entry.status === "ok" && typeof entry.deltaFromBaselineMb === "number") + .toSorted((a, b) => (b.deltaFromBaselineMb ?? 0) - (a.deltaFromBaselineMb ?? 0)) + .slice(0, options.top); + + const report = { + generatedAt: new Date().toISOString(), + repoRoot, + selectedExtensions: selectedEntries.map((entry) => entry.dir), + baseline: { + status: baseline.timedOut ? "timeout" : baseline.code === 0 ? "ok" : "fail", + maxRssMb: baseline.maxRssMb, + }, + combined: + combined === null + ? null + : { + status: combined.timedOut ? "timeout" : combined.code === 0 ? "ok" : "fail", + maxRssMb: combined.maxRssMb, + stderrPreview: summarizeStderr(combined.stderr, 12), + }, + counts: { + totalEntries: selectedEntries.length, + ok: results.filter((entry) => entry.status === "ok").length, + fail: results.filter((entry) => entry.status === "fail").length, + timeout: results.filter((entry) => entry.status === "timeout").length, + }, + options: { + concurrency: options.concurrency, + timeoutMs: options.timeoutMs, + combinedTimeoutMs: options.combinedTimeoutMs, + skipCombined: options.skipCombined, + }, + topByDeltaMb: top, + results, + }; + + writeFileSync(jsonPath, `${JSON.stringify(report, null, 2)}\n`, "utf8"); + + console.log(`[native-plugin-memory] report: ${jsonPath}`); + console.log( + JSON.stringify( + { + baselineMb: report.baseline.maxRssMb, + combinedMb: report.combined?.maxRssMb ?? null, + counts: report.counts, + topByDeltaMb: report.topByDeltaMb, + }, + null, + 2, + ), + ); + } finally { + rmSync(tmpHome, { recursive: true, force: true }); + } +} + +try { + await main(); +} catch (error) { + console.error(`[native-plugin-memory] ${error instanceof Error ? error.message : String(error)}`); + process.exit(1); +} diff --git a/scripts/release-check.ts b/scripts/release-check.ts index 72d729cc1cd..e85e997ff6a 100755 --- a/scripts/release-check.ts +++ b/scripts/release-check.ts @@ -5,14 +5,17 @@ import { readdirSync, readFileSync } from "node:fs"; import { join, resolve } from "node:path"; import { pathToFileURL } from "node:url"; import { - collectBundledExtensionManifestErrors, - type BundledExtension, - type ExtensionPackageJson as PackageJson, -} from "./lib/bundled-extension-manifest.ts"; + collectBundledNativePluginManifestErrors, + type BundledNativePlugin, + type NativePluginPackageJson as PackageJson, +} from "./lib/bundled-native-plugin-manifest.ts"; import { listPluginSdkDistArtifacts } from "./lib/plugin-sdk-entries.mjs"; import { sparkleBuildFloorsFromShortVersion, type SparkleBuildFloors } from "./sparkle-build.ts"; -export { collectBundledExtensionManifestErrors } from "./lib/bundled-extension-manifest.ts"; +export { + collectBundledExtensionManifestErrors, + collectBundledNativePluginManifestErrors, +} from "./lib/bundled-native-plugin-manifest.ts"; type PackFile = { path: string }; type PackResult = { files?: PackFile[]; filename?: string; unpackedSize?: number }; @@ -33,14 +36,14 @@ const appcastPath = resolve("appcast.xml"); const laneBuildMin = 1_000_000_000; const laneFloorAdoptionDateKey = 20260227; -function collectBundledExtensions(): BundledExtension[] { - const extensionsDir = resolve("extensions"); - const entries = readdirSync(extensionsDir, { withFileTypes: true }).filter((entry) => +function collectBundledNativePlugins(): BundledNativePlugin[] { + const nativePluginsDir = resolve("native-plugins"); + const entries = readdirSync(nativePluginsDir, { withFileTypes: true }).filter((entry) => entry.isDirectory(), ); return entries.flatMap((entry) => { - const packagePath = join(extensionsDir, entry.name, "package.json"); + const packagePath = join(nativePluginsDir, entry.name, "package.json"); try { return [ { @@ -54,11 +57,11 @@ function collectBundledExtensions(): BundledExtension[] { }); } -function checkBundledExtensionMetadata() { - const extensions = collectBundledExtensions(); - const manifestErrors = collectBundledExtensionManifestErrors(extensions); +function checkBundledNativePluginMetadata() { + const nativePlugins = collectBundledNativePlugins(); + const manifestErrors = collectBundledNativePluginManifestErrors(nativePlugins); if (manifestErrors.length > 0) { - console.error("release-check: bundled extension manifest validation failed:"); + console.error("release-check: bundled native plugin manifest validation failed:"); for (const error of manifestErrors) { console.error(` - ${error}`); } @@ -77,7 +80,7 @@ function runPackDry(): PackResult[] { export function collectForbiddenPackPaths(paths: Iterable): string[] { const isAllowedBundledPluginNodeModulesPath = (path: string) => - /^dist\/extensions\/[^/]+\/node_modules\//.test(path); + /^dist\/native-plugins\/[^/]+\/node_modules\//.test(path); return [...paths] .filter( (path) => @@ -101,7 +104,7 @@ function formatPackUnpackedSizeBudgetError(params: { }): string { return [ `${params.label} unpackedSize ${params.unpackedSize} bytes (${formatMiB(params.unpackedSize)}) exceeds budget ${npmPackUnpackedSizeBudgetBytes} bytes (${formatMiB(npmPackUnpackedSizeBudgetBytes)}).`, - "Investigate duplicate channel shims, copied extension trees, or other accidental pack bloat before release.", + "Investigate duplicate channel shims, copied native plugin trees, or other accidental pack bloat before release.", ].join(" "); } @@ -288,7 +291,7 @@ async function checkPluginSdkExports() { async function main() { checkAppcastSparkleVersions(); await checkPluginSdkExports(); - checkBundledExtensionMetadata(); + checkBundledNativePluginMetadata(); const results = runPackDry(); const files = results.flatMap((entry) => entry.files ?? []); diff --git a/scripts/run-node.mjs b/scripts/run-node.mjs index 33317ae8797..1e5fedfb484 100644 --- a/scripts/run-node.mjs +++ b/scripts/run-node.mjs @@ -9,11 +9,11 @@ import { runRuntimePostBuild } from "./runtime-postbuild.mjs"; const buildScript = "scripts/tsdown-build.mjs"; const compilerArgs = [buildScript, "--no-clean"]; -const runNodeSourceRoots = ["src", "extensions"]; +const runNodeSourceRoots = ["src", "native-plugins"]; const runNodeConfigFiles = ["tsconfig.json", "package.json", "tsdown.config.ts"]; export const runNodeWatchedPaths = [...runNodeSourceRoots, ...runNodeConfigFiles]; -const extensionSourceFilePattern = /\.(?:[cm]?[jt]sx?)$/; -const extensionRestartMetadataFiles = new Set(["openclaw.plugin.json", "package.json"]); +const nativePluginSourceFilePattern = /\.(?:[cm]?[jt]sx?)$/; +const nativePluginRestartMetadataFiles = new Set(["openclaw.plugin.json", "package.json"]); const normalizePath = (filePath) => String(filePath ?? "").replaceAll("\\", "/"); @@ -28,7 +28,7 @@ const isIgnoredSourcePath = (relativePath) => { const isBuildRelevantSourcePath = (relativePath) => { const normalizedPath = normalizePath(relativePath); - return extensionSourceFilePattern.test(normalizedPath) && !isIgnoredSourcePath(normalizedPath); + return nativePluginSourceFilePattern.test(normalizedPath) && !isIgnoredSourcePath(normalizedPath); }; export const isBuildRelevantRunNodePath = (repoPath) => { @@ -39,15 +39,15 @@ export const isBuildRelevantRunNodePath = (repoPath) => { if (normalizedPath.startsWith("src/")) { return !isIgnoredSourcePath(normalizedPath.slice("src/".length)); } - if (normalizedPath.startsWith("extensions/")) { - return isBuildRelevantSourcePath(normalizedPath.slice("extensions/".length)); + if (normalizedPath.startsWith("native-plugins/")) { + return isBuildRelevantSourcePath(normalizedPath.slice("native-plugins/".length)); } return false; }; -const isRestartRelevantExtensionPath = (relativePath) => { +const isRestartRelevantNativePluginPath = (relativePath) => { const normalizedPath = normalizePath(relativePath); - if (extensionRestartMetadataFiles.has(path.posix.basename(normalizedPath))) { + if (nativePluginRestartMetadataFiles.has(path.posix.basename(normalizedPath))) { return true; } return isBuildRelevantSourcePath(normalizedPath); @@ -61,8 +61,8 @@ export const isRestartRelevantRunNodePath = (repoPath) => { if (normalizedPath.startsWith("src/")) { return !isIgnoredSourcePath(normalizedPath.slice("src/".length)); } - if (normalizedPath.startsWith("extensions/")) { - return isRestartRelevantExtensionPath(normalizedPath.slice("extensions/".length)); + if (normalizedPath.startsWith("native-plugins/")) { + return isRestartRelevantNativePluginPath(normalizedPath.slice("native-plugins/".length)); } return false; }; diff --git a/scripts/stage-bundled-plugin-runtime.mjs b/scripts/stage-bundled-plugin-runtime.mjs index f38f52aa6c5..81771e67c61 100644 --- a/scripts/stage-bundled-plugin-runtime.mjs +++ b/scripts/stage-bundled-plugin-runtime.mjs @@ -98,8 +98,8 @@ export function stageBundledPluginRuntime(params = {}) { const repoRoot = params.cwd ?? params.repoRoot ?? process.cwd(); const distRoot = path.join(repoRoot, "dist"); const runtimeRoot = path.join(repoRoot, "dist-runtime"); - const distExtensionsRoot = path.join(distRoot, "extensions"); - const runtimeExtensionsRoot = path.join(runtimeRoot, "extensions"); + const distExtensionsRoot = path.join(distRoot, "native-plugins"); + const runtimeExtensionsRoot = path.join(runtimeRoot, "native-plugins"); if (!fs.existsSync(distExtensionsRoot)) { removePathIfExists(runtimeRoot); diff --git a/scripts/sync-plugin-versions.ts b/scripts/sync-plugin-versions.ts index 651d44f1944..c2970b6b4d8 100644 --- a/scripts/sync-plugin-versions.ts +++ b/scripts/sync-plugin-versions.ts @@ -46,8 +46,8 @@ export function syncPluginVersions(rootDir = resolve(".")) { throw new Error("Root package.json missing version."); } - const extensionsDir = join(rootDir, "extensions"); - const dirs = readdirSync(extensionsDir, { withFileTypes: true }).filter((entry) => + const nativePluginsDir = join(rootDir, "native-plugins"); + const dirs = readdirSync(nativePluginsDir, { withFileTypes: true }).filter((entry) => entry.isDirectory(), ); @@ -57,7 +57,7 @@ export function syncPluginVersions(rootDir = resolve(".")) { const strippedWorkspaceDevDeps: string[] = []; for (const dir of dirs) { - const packagePath = join(extensionsDir, dir.name, "package.json"); + const packagePath = join(nativePluginsDir, dir.name, "package.json"); let pkg: PackageJson; try { pkg = JSON.parse(readFileSync(packagePath, "utf8")) as PackageJson; @@ -70,7 +70,7 @@ export function syncPluginVersions(rootDir = resolve(".")) { continue; } - const changelogPath = join(extensionsDir, dir.name, "CHANGELOG.md"); + const changelogPath = join(nativePluginsDir, dir.name, "CHANGELOG.md"); if (ensureChangelogEntry(changelogPath, targetVersion)) { changelogged.push(pkg.name); } diff --git a/scripts/test-extension.mjs b/scripts/test-extension.mjs index 4d9f7a9575e..8c8df332c79 100644 --- a/scripts/test-extension.mjs +++ b/scripts/test-extension.mjs @@ -1,333 +1,11 @@ -#!/usr/bin/env node - -import { execFileSync, spawn } from "node:child_process"; -import fs from "node:fs"; import path from "node:path"; -import { fileURLToPath, pathToFileURL } from "node:url"; -import { channelTestRoots } from "../vitest.channel-paths.mjs"; +import { pathToFileURL } from "node:url"; +import { main } from "./test-native-plugin.mjs"; -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); -const repoRoot = path.resolve(__dirname, ".."); -const pnpm = "pnpm"; - -function normalizeRelative(inputPath) { - return inputPath.split(path.sep).join("/"); -} - -function isTestFile(filePath) { - return filePath.endsWith(".test.ts") || filePath.endsWith(".test.tsx"); -} - -function collectTestFiles(rootPath) { - const results = []; - const stack = [rootPath]; - - while (stack.length > 0) { - const current = stack.pop(); - if (!current || !fs.existsSync(current)) { - continue; - } - for (const entry of fs.readdirSync(current, { withFileTypes: true })) { - const fullPath = path.join(current, entry.name); - if (entry.isDirectory()) { - if (entry.name === "node_modules" || entry.name === "dist") { - continue; - } - stack.push(fullPath); - continue; - } - if (entry.isFile() && isTestFile(fullPath)) { - results.push(fullPath); - } - } - } - - return results.toSorted((left, right) => left.localeCompare(right)); -} - -function listChangedPaths(base, head = "HEAD") { - if (!base) { - throw new Error("A git base revision is required to list changed extensions."); - } - - return execFileSync("git", ["diff", "--name-only", base, head], { - cwd: repoRoot, - stdio: ["ignore", "pipe", "pipe"], - encoding: "utf8", - }) - .split("\n") - .map((line) => line.trim()) - .filter((line) => line.length > 0); -} - -function hasExtensionPackage(extensionId) { - return fs.existsSync(path.join(repoRoot, "extensions", extensionId, "package.json")); -} - -export function listAvailableExtensionIds() { - const extensionsDir = path.join(repoRoot, "extensions"); - if (!fs.existsSync(extensionsDir)) { - return []; - } - - return fs - .readdirSync(extensionsDir, { withFileTypes: true }) - .filter((entry) => entry.isDirectory()) - .map((entry) => entry.name) - .filter((extensionId) => hasExtensionPackage(extensionId)) - .toSorted((left, right) => left.localeCompare(right)); -} - -export function detectChangedExtensionIds(changedPaths) { - const extensionIds = new Set(); - - for (const rawPath of changedPaths) { - const relativePath = normalizeRelative(String(rawPath).trim()); - if (!relativePath) { - continue; - } - - const extensionMatch = relativePath.match(/^extensions\/([^/]+)(?:\/|$)/); - if (extensionMatch) { - const extensionId = extensionMatch[1]; - if (hasExtensionPackage(extensionId)) { - extensionIds.add(extensionId); - } - continue; - } - - const pairedCoreMatch = relativePath.match(/^src\/([^/]+)(?:\/|$)/); - if (pairedCoreMatch && hasExtensionPackage(pairedCoreMatch[1])) { - extensionIds.add(pairedCoreMatch[1]); - } - } - - return [...extensionIds].toSorted((left, right) => left.localeCompare(right)); -} - -export function listChangedExtensionIds(params = {}) { - const base = params.base; - const head = params.head ?? "HEAD"; - return detectChangedExtensionIds(listChangedPaths(base, head)); -} - -function resolveExtensionDirectory(targetArg, cwd = process.cwd()) { - if (targetArg) { - const asGiven = path.resolve(cwd, targetArg); - if (fs.existsSync(path.join(asGiven, "package.json"))) { - return asGiven; - } - - const byName = path.join(repoRoot, "extensions", targetArg); - if (fs.existsSync(path.join(byName, "package.json"))) { - return byName; - } - - throw new Error( - `Unknown extension target "${targetArg}". Use an extension name like "slack" or a path under extensions/.`, - ); - } - - let current = cwd; - while (true) { - if ( - normalizeRelative(path.relative(repoRoot, current)).startsWith("extensions/") && - fs.existsSync(path.join(current, "package.json")) - ) { - return current; - } - const parent = path.dirname(current); - if (parent === current) { - break; - } - current = parent; - } - - throw new Error( - "No extension target provided, and current working directory is not inside extensions/.", - ); -} - -export function resolveExtensionTestPlan(params = {}) { - const cwd = params.cwd ?? process.cwd(); - const targetArg = params.targetArg; - const extensionDir = resolveExtensionDirectory(targetArg, cwd); - const extensionId = path.basename(extensionDir); - const relativeExtensionDir = normalizeRelative(path.relative(repoRoot, extensionDir)); - - const roots = [relativeExtensionDir]; - const pairedCoreRoot = path.join(repoRoot, "src", extensionId); - if (fs.existsSync(pairedCoreRoot)) { - const pairedRelativeRoot = normalizeRelative(path.relative(repoRoot, pairedCoreRoot)); - if (collectTestFiles(pairedCoreRoot).length > 0) { - roots.push(pairedRelativeRoot); - } - } - - const usesChannelConfig = roots.some((root) => channelTestRoots.includes(root)); - const config = usesChannelConfig ? "vitest.channels.config.ts" : "vitest.extensions.config.ts"; - const testFiles = roots.flatMap((root) => collectTestFiles(path.join(repoRoot, root))); - - return { - config, - extensionDir: relativeExtensionDir, - extensionId, - roots, - testFiles: testFiles.map((filePath) => normalizeRelative(path.relative(repoRoot, filePath))), - }; -} - -function printUsage() { - console.error("Usage: pnpm test:extension [vitest args...]"); - console.error(" node scripts/test-extension.mjs [extension-name|path] [vitest args...]"); - console.error(" node scripts/test-extension.mjs --list"); - console.error( - " node scripts/test-extension.mjs --list-changed --base [--head ]", - ); - console.error(" node scripts/test-extension.mjs --require-tests"); -} - -function printNoTestsMessage(plan, requireTests) { - const message = `No tests found for ${plan.extensionDir}. Run "pnpm test:extension ${plan.extensionId} -- --dry-run" to inspect the resolved roots.`; - if (requireTests) { - console.error(message); - return 1; - } - console.log(`[test-extension] ${message} Skipping.`); - return 0; -} - -async function run() { - const rawArgs = process.argv.slice(2); - const dryRun = rawArgs.includes("--dry-run"); - const requireTests = - rawArgs.includes("--require-tests") || - process.env.OPENCLAW_TEST_EXTENSION_REQUIRE_TESTS === "1"; - const json = rawArgs.includes("--json"); - const list = rawArgs.includes("--list"); - const listChanged = rawArgs.includes("--list-changed"); - const args = rawArgs.filter( - (arg) => - arg !== "--" && - arg !== "--dry-run" && - arg !== "--require-tests" && - arg !== "--json" && - arg !== "--list" && - arg !== "--list-changed", - ); - - let base = ""; - let head = "HEAD"; - const passthroughArgs = []; - - if (listChanged) { - for (let index = 0; index < args.length; index += 1) { - const arg = args[index]; - if (arg === "--base") { - base = args[index + 1] ?? ""; - index += 1; - continue; - } - if (arg === "--head") { - head = args[index + 1] ?? "HEAD"; - index += 1; - continue; - } - passthroughArgs.push(arg); - } - } else { - passthroughArgs.push(...args); - } - - if (list) { - const extensionIds = listAvailableExtensionIds(); - if (json) { - process.stdout.write(`${JSON.stringify({ extensionIds }, null, 2)}\n`); - } else { - for (const extensionId of extensionIds) { - console.log(extensionId); - } - } - return; - } - - if (listChanged) { - let extensionIds; - try { - extensionIds = listChangedExtensionIds({ base, head }); - } catch (error) { - printUsage(); - console.error(error instanceof Error ? error.message : String(error)); - process.exit(1); - } - - if (json) { - process.stdout.write(`${JSON.stringify({ base, head, extensionIds }, null, 2)}\n`); - } else { - for (const extensionId of extensionIds) { - console.log(extensionId); - } - } - return; - } - - let targetArg; - if (passthroughArgs[0] && !passthroughArgs[0].startsWith("-")) { - targetArg = passthroughArgs.shift(); - } - - let plan; - try { - plan = resolveExtensionTestPlan({ cwd: process.cwd(), targetArg }); - } catch (error) { - printUsage(); - console.error(error instanceof Error ? error.message : String(error)); - process.exit(1); - } - - if (dryRun) { - if (json) { - process.stdout.write(`${JSON.stringify(plan, null, 2)}\n`); - } else { - console.log(`[test-extension] ${plan.extensionId}`); - console.log(`config: ${plan.config}`); - console.log(`roots: ${plan.roots.join(", ")}`); - console.log(`tests: ${plan.testFiles.length}`); - } - return; - } - - if (plan.testFiles.length === 0) { - process.exit(printNoTestsMessage(plan, requireTests)); - } - - console.log( - `[test-extension] Running ${plan.testFiles.length} test files for ${plan.extensionId} with ${plan.config}`, - ); - - const child = spawn( - pnpm, - ["exec", "vitest", "run", "--config", plan.config, ...plan.testFiles, ...passthroughArgs], - { - cwd: repoRoot, - stdio: "inherit", - shell: process.platform === "win32", - env: process.env, - }, - ); - - child.on("exit", (code, signal) => { - if (signal) { - process.kill(process.pid, signal); - return; - } - process.exit(code ?? 1); - }); -} +export * from "./test-native-plugin.mjs"; const entryHref = process.argv[1] ? pathToFileURL(path.resolve(process.argv[1])).href : ""; if (import.meta.url === entryHref) { - await run(); + await main(); } diff --git a/scripts/test-native-plugin.mjs b/scripts/test-native-plugin.mjs new file mode 100644 index 00000000000..643d5fa293d --- /dev/null +++ b/scripts/test-native-plugin.mjs @@ -0,0 +1,349 @@ +#!/usr/bin/env node + +import { execFileSync, spawn } from "node:child_process"; +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath, pathToFileURL } from "node:url"; +import { channelTestRoots } from "../vitest.channel-paths.mjs"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const repoRoot = path.resolve(__dirname, ".."); +const pnpm = "pnpm"; + +function normalizeRelative(inputPath) { + return inputPath.split(path.sep).join("/"); +} + +function isTestFile(filePath) { + return filePath.endsWith(".test.ts") || filePath.endsWith(".test.tsx"); +} + +function collectTestFiles(rootPath) { + const results = []; + const stack = [rootPath]; + + while (stack.length > 0) { + const current = stack.pop(); + if (!current || !fs.existsSync(current)) { + continue; + } + for (const entry of fs.readdirSync(current, { withFileTypes: true })) { + const fullPath = path.join(current, entry.name); + if (entry.isDirectory()) { + if (entry.name === "node_modules" || entry.name === "dist") { + continue; + } + stack.push(fullPath); + continue; + } + if (entry.isFile() && isTestFile(fullPath)) { + results.push(fullPath); + } + } + } + + return results.toSorted((left, right) => left.localeCompare(right)); +} + +function listChangedPaths(base, head = "HEAD") { + if (!base) { + throw new Error("A git base revision is required to list changed native plugins."); + } + + return execFileSync("git", ["diff", "--name-only", base, head], { + cwd: repoRoot, + stdio: ["ignore", "pipe", "pipe"], + encoding: "utf8", + }) + .split("\n") + .map((line) => line.trim()) + .filter((line) => line.length > 0); +} + +function hasNativePluginPackage(nativePluginId) { + return fs.existsSync(path.join(repoRoot, "native-plugins", nativePluginId, "package.json")); +} + +export function listAvailableNativePluginIds() { + const nativePluginsDir = path.join(repoRoot, "native-plugins"); + if (!fs.existsSync(nativePluginsDir)) { + return []; + } + + return fs + .readdirSync(nativePluginsDir, { withFileTypes: true }) + .filter((entry) => entry.isDirectory()) + .map((entry) => entry.name) + .filter((nativePluginId) => hasNativePluginPackage(nativePluginId)) + .toSorted((left, right) => left.localeCompare(right)); +} + +export function detectChangedNativePluginIds(changedPaths) { + const nativePluginIds = new Set(); + + for (const rawPath of changedPaths) { + const relativePath = normalizeRelative(String(rawPath).trim()); + if (!relativePath) { + continue; + } + + const nativePluginMatch = relativePath.match(/^native-plugins\/([^/]+)(?:\/|$)/); + if (nativePluginMatch) { + const nativePluginId = nativePluginMatch[1]; + if (hasNativePluginPackage(nativePluginId)) { + nativePluginIds.add(nativePluginId); + } + continue; + } + + const pairedCoreMatch = relativePath.match(/^src\/([^/]+)(?:\/|$)/); + if (pairedCoreMatch && hasNativePluginPackage(pairedCoreMatch[1])) { + nativePluginIds.add(pairedCoreMatch[1]); + } + } + + return [...nativePluginIds].toSorted((left, right) => left.localeCompare(right)); +} + +export function listChangedNativePluginIds(params = {}) { + const base = params.base; + const head = params.head ?? "HEAD"; + return detectChangedNativePluginIds(listChangedPaths(base, head)); +} + +function resolveNativePluginDirectory(targetArg, cwd = process.cwd()) { + if (targetArg) { + const asGiven = path.resolve(cwd, targetArg); + if (fs.existsSync(path.join(asGiven, "package.json"))) { + return asGiven; + } + + const byName = path.join(repoRoot, "native-plugins", targetArg); + if (fs.existsSync(path.join(byName, "package.json"))) { + return byName; + } + + throw new Error( + `Unknown native plugin target "${targetArg}". Use a native plugin name like "slack" or a path under native-plugins/.`, + ); + } + + let current = cwd; + while (true) { + if ( + normalizeRelative(path.relative(repoRoot, current)).startsWith("native-plugins/") && + fs.existsSync(path.join(current, "package.json")) + ) { + return current; + } + const parent = path.dirname(current); + if (parent === current) { + break; + } + current = parent; + } + + throw new Error( + "No native plugin target provided, and current working directory is not inside native-plugins/.", + ); +} + +export function resolveNativePluginTestPlan(params = {}) { + const cwd = params.cwd ?? process.cwd(); + const targetArg = params.targetArg; + const nativePluginDir = resolveNativePluginDirectory(targetArg, cwd); + const nativePluginId = path.basename(nativePluginDir); + const relativeNativePluginDir = normalizeRelative(path.relative(repoRoot, nativePluginDir)); + + const roots = [relativeNativePluginDir]; + const pairedCoreRoot = path.join(repoRoot, "src", nativePluginId); + if (fs.existsSync(pairedCoreRoot)) { + const pairedRelativeRoot = normalizeRelative(path.relative(repoRoot, pairedCoreRoot)); + if (collectTestFiles(pairedCoreRoot).length > 0) { + roots.push(pairedRelativeRoot); + } + } + + const usesChannelConfig = roots.some((root) => channelTestRoots.includes(root)); + const config = usesChannelConfig + ? "vitest.channels.config.ts" + : "vitest.native-plugins.config.ts"; + const testFiles = roots.flatMap((root) => collectTestFiles(path.join(repoRoot, root))); + + return { + config, + nativePluginDir: relativeNativePluginDir, + nativePluginId, + extensionDir: relativeNativePluginDir, + extensionId: nativePluginId, + roots, + testFiles: testFiles.map((filePath) => normalizeRelative(path.relative(repoRoot, filePath))), + }; +} + +export const listAvailableExtensionIds = listAvailableNativePluginIds; +export const detectChangedExtensionIds = detectChangedNativePluginIds; +export const listChangedExtensionIds = listChangedNativePluginIds; +export const resolveExtensionTestPlan = resolveNativePluginTestPlan; + +function printUsage() { + console.error("Usage: pnpm test:native-plugin [vitest args...]"); + console.error( + " node scripts/test-native-plugin.mjs [native-plugin-name|path] [vitest args...]", + ); + console.error(" node scripts/test-native-plugin.mjs --list"); + console.error( + " node scripts/test-native-plugin.mjs --list-changed --base [--head ]", + ); + console.error(" node scripts/test-native-plugin.mjs --require-tests"); +} + +function printNoTestsMessage(plan, requireTests) { + const message = `No tests found for ${plan.nativePluginDir}. Run "pnpm test:native-plugin ${plan.nativePluginId} -- --dry-run" to inspect the resolved roots.`; + if (requireTests) { + console.error(message); + return 1; + } + console.log(`[test-native-plugin] ${message} Skipping.`); + return 0; +} + +export async function main(argv = process.argv.slice(2)) { + const rawArgs = argv; + const dryRun = rawArgs.includes("--dry-run"); + const requireTests = + rawArgs.includes("--require-tests") || + process.env.OPENCLAW_TEST_NATIVE_PLUGIN_REQUIRE_TESTS === "1" || + process.env.OPENCLAW_TEST_EXTENSION_REQUIRE_TESTS === "1"; + const json = rawArgs.includes("--json"); + const list = rawArgs.includes("--list"); + const listChanged = rawArgs.includes("--list-changed"); + const args = rawArgs.filter( + (arg) => + arg !== "--" && + arg !== "--dry-run" && + arg !== "--require-tests" && + arg !== "--json" && + arg !== "--list" && + arg !== "--list-changed", + ); + + let base = ""; + let head = "HEAD"; + const passthroughArgs = []; + + if (listChanged) { + for (let index = 0; index < args.length; index += 1) { + const arg = args[index]; + if (arg === "--base") { + base = args[index + 1] ?? ""; + index += 1; + continue; + } + if (arg === "--head") { + head = args[index + 1] ?? "HEAD"; + index += 1; + continue; + } + passthroughArgs.push(arg); + } + } else { + passthroughArgs.push(...args); + } + + if (list) { + const nativePluginIds = listAvailableNativePluginIds(); + if (json) { + process.stdout.write( + `${JSON.stringify({ nativePluginIds, extensionIds: nativePluginIds }, null, 2)}\n`, + ); + } else { + for (const nativePluginId of nativePluginIds) { + console.log(nativePluginId); + } + } + return; + } + + if (listChanged) { + let nativePluginIds; + try { + nativePluginIds = listChangedNativePluginIds({ base, head }); + } catch (error) { + printUsage(); + console.error(error instanceof Error ? error.message : String(error)); + process.exit(1); + } + + if (json) { + process.stdout.write( + `${JSON.stringify({ base, head, nativePluginIds, extensionIds: nativePluginIds }, null, 2)}\n`, + ); + } else { + for (const nativePluginId of nativePluginIds) { + console.log(nativePluginId); + } + } + return; + } + + let targetArg; + if (passthroughArgs[0] && !passthroughArgs[0].startsWith("-")) { + targetArg = passthroughArgs.shift(); + } + + let plan; + try { + plan = resolveNativePluginTestPlan({ cwd: process.cwd(), targetArg }); + } catch (error) { + printUsage(); + console.error(error instanceof Error ? error.message : String(error)); + process.exit(1); + } + + if (dryRun) { + if (json) { + process.stdout.write(`${JSON.stringify(plan, null, 2)}\n`); + } else { + console.log(`[test-native-plugin] ${plan.nativePluginId}`); + console.log(`config: ${plan.config}`); + console.log(`roots: ${plan.roots.join(", ")}`); + console.log(`tests: ${plan.testFiles.length}`); + } + return; + } + + if (plan.testFiles.length === 0) { + process.exit(printNoTestsMessage(plan, requireTests)); + } + + console.log( + `[test-native-plugin] Running ${plan.testFiles.length} test files for ${plan.nativePluginId} with ${plan.config}`, + ); + + const child = spawn( + pnpm, + ["exec", "vitest", "run", "--config", plan.config, ...plan.testFiles, ...passthroughArgs], + { + cwd: repoRoot, + stdio: "inherit", + shell: process.platform === "win32", + env: process.env, + }, + ); + + child.on("exit", (code, signal) => { + if (signal) { + process.kill(process.pid, signal); + return; + } + process.exit(code ?? 1); + }); +} + +const entryHref = process.argv[1] ? pathToFileURL(path.resolve(process.argv[1])).href : ""; + +if (import.meta.url === entryHref) { + await main(); +} diff --git a/scripts/test-parallel-memory.mjs b/scripts/test-parallel-memory.mjs index 3bf9eca4049..5dfb8900a65 100644 --- a/scripts/test-parallel-memory.mjs +++ b/scripts/test-parallel-memory.mjs @@ -10,11 +10,11 @@ const ANSI_ESCAPE_PATTERN = new RegExp( const GITHUB_ACTIONS_LOG_PREFIX_PATTERN = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z\s+/u; const COMPLETED_TEST_FILE_LINE_PATTERN = - /(?(?:src|extensions|test|ui)\/\S+?\.(?:live\.test|e2e\.test|test)\.ts)\s+\(.*\)\s+(?\d+(?:\.\d+)?)(?ms|s)\s*$/; + /(?(?:src|native-plugins|test|ui)\/\S+?\.(?:live\.test|e2e\.test|test)\.ts)\s+\(.*\)\s+(?\d+(?:\.\d+)?)(?ms|s)\s*$/; const MEMORY_TRACE_SUMMARY_PATTERN = /^\[test-parallel\]\[mem\] summary (?\S+) files=(?\d+) peak=(?[0-9]+(?:\.[0-9]+)?(?:GiB|MiB|KiB)) totalDelta=(?[+-]?[0-9]+(?:\.[0-9]+)?(?:GiB|MiB|KiB)) peakAt=(?\S+) top=(?.*)$/u; const MEMORY_TRACE_TOP_ENTRY_PATTERN = - /^(?(?:src|extensions|test|ui)\/\S+?\.(?:live\.test|e2e\.test|test)\.ts):(?[+-]?[0-9]+(?:\.[0-9]+)?(?:GiB|MiB|KiB))$/u; + /^(?(?:src|native-plugins|test|ui)\/\S+?\.(?:live\.test|e2e\.test|test)\.ts):(?[+-]?[0-9]+(?:\.[0-9]+)?(?:GiB|MiB|KiB))$/u; const PS_COLUMNS = ["pid=", "ppid=", "rss=", "comm="]; diff --git a/scripts/test-parallel.mjs b/scripts/test-parallel.mjs index 011211a307b..07777b717bd 100644 --- a/scripts/test-parallel.mjs +++ b/scripts/test-parallel.mjs @@ -95,7 +95,9 @@ const useVmForks = (isCI || testProfile !== "low")); const disableIsolation = process.env.OPENCLAW_TEST_NO_ISOLATE === "1"; const includeGatewaySuite = process.env.OPENCLAW_TEST_INCLUDE_GATEWAY === "1"; -const includeExtensionsSuite = process.env.OPENCLAW_TEST_INCLUDE_EXTENSIONS === "1"; +const includeNativePluginsSuite = + process.env.OPENCLAW_TEST_INCLUDE_NATIVE_PLUGINS === "1" || + process.env.OPENCLAW_TEST_INCLUDE_EXTENSIONS === "1"; // Even on low-memory hosts, keep the isolated lane split so files like // git-commit.test.ts still get the worker/process isolation they require. const shouldSplitUnitRuns = testProfile !== "serial"; @@ -251,7 +253,7 @@ const walkTestFiles = (rootDir) => { const allKnownTestFiles = [ ...new Set([ ...walkTestFiles("src"), - ...walkTestFiles("extensions"), + ...walkTestFiles("native-plugins"), ...walkTestFiles("test"), ...walkTestFiles(path.join("ui", "src", "ui")), ]), @@ -267,8 +269,8 @@ const inferTarget = (fileFilter) => { if (channelTestPrefixes.some((prefix) => fileFilter.startsWith(prefix))) { return { owner: "channels", isolated }; } - if (fileFilter.startsWith("extensions/")) { - return { owner: "extensions", isolated }; + if (fileFilter.startsWith("native-plugins/")) { + return { owner: "native-plugins", isolated }; } if (fileFilter.startsWith("src/gateway/")) { return { owner: "gateway", isolated }; @@ -465,15 +467,15 @@ const baseRuns = [ ], }, ]), - ...(includeExtensionsSuite + ...(includeNativePluginsSuite ? [ { - name: "extensions", + name: "native-plugins", args: [ "vitest", "run", "--config", - "vitest.extensions.config.ts", + "vitest.native-plugins.config.ts", ...(useVmForks ? ["--pool=vmForks"] : []), ], }, @@ -551,14 +553,14 @@ const createTargetedEntry = (owner, isolated, filters) => { args: ["vitest", "run", "--config", "vitest.unit.config.ts", "--pool=threads", ...filters], }; } - if (owner === "extensions") { + if (owner === "native-plugins") { return { name, args: [ "vitest", "run", "--config", - "vitest.extensions.config.ts", + "vitest.native-plugins.config.ts", ...(forceForks ? ["--pool=forks"] : useVmForks ? ["--pool=vmForks"] : []), ...filters, ], @@ -700,28 +702,28 @@ const defaultWorkerBudget = ? { unit: 2, unitIsolated: 1, - extensions: 4, + nativePlugins: 4, gateway: 1, } : isMacMiniProfile ? { unit: 3, unitIsolated: 1, - extensions: 1, + nativePlugins: 1, gateway: 1, } : testProfile === "serial" ? { unit: 1, unitIsolated: 1, - extensions: 1, + nativePlugins: 1, gateway: 1, } : testProfile === "max" ? { unit: localWorkers, unitIsolated: Math.min(4, localWorkers), - extensions: Math.max(1, Math.min(6, Math.floor(localWorkers / 2))), + nativePlugins: Math.max(1, Math.min(6, Math.floor(localWorkers / 2))), gateway: Math.max(1, Math.min(2, Math.floor(localWorkers / 4))), } : highMemLocalHost @@ -731,7 +733,7 @@ const defaultWorkerBudget = // worker fan-out than the old "max it out" local default. unit: Math.max(4, Math.min(10, Math.floor((localWorkers * 5) / 8))), unitIsolated: Math.max(1, Math.min(2, Math.floor(localWorkers / 6) || 1)), - extensions: Math.max(1, Math.min(4, Math.floor(localWorkers / 4))), + nativePlugins: Math.max(1, Math.min(4, Math.floor(localWorkers / 4))), gateway: Math.max(2, Math.min(6, Math.floor(localWorkers / 2))), } : lowMemLocalHost @@ -739,14 +741,14 @@ const defaultWorkerBudget = // Sub-64 GiB local hosts are prone to OOM with large vmFork runs. unit: 2, unitIsolated: 1, - extensions: 4, + nativePlugins: 4, gateway: 1, } : { // 64-95 GiB local hosts: conservative split with some parallel headroom. unit: Math.max(2, Math.min(8, Math.floor(localWorkers / 2))), unitIsolated: 1, - extensions: Math.max(1, Math.min(4, Math.floor(localWorkers / 4))), + nativePlugins: Math.max(1, Math.min(4, Math.floor(localWorkers / 4))), gateway: 1, }; @@ -771,8 +773,8 @@ const maxWorkersForRun = (name) => { if (name === "unit-isolated" || name.startsWith("unit-heavy-")) { return defaultWorkerBudget.unitIsolated; } - if (name === "extensions") { - return defaultWorkerBudget.extensions; + if (name === "native-plugins") { + return defaultWorkerBudget.nativePlugins; } if (name === "gateway") { return defaultWorkerBudget.gateway; @@ -840,10 +842,10 @@ const runOnce = (entry, extraArgs = []) => new Promise((resolve) => { const startedAt = Date.now(); const maxWorkers = maxWorkersForRun(entry.name); - // vmForks with a single worker has shown cross-file leakage in extension suites. + // vmForks with a single worker has shown cross-file leakage in native plugin suites. // Fall back to process forks when we intentionally clamp that lane to one worker. const entryArgs = - entry.name === "extensions" && maxWorkers === 1 && entry.args.includes("--pool=vmForks") + entry.name === "native-plugins" && maxWorkers === 1 && entry.args.includes("--pool=vmForks") ? entry.args.map((arg) => (arg === "--pool=vmForks" ? "--pool=forks" : arg)) : entry.args; const explicitEntryFilters = getExplicitEntryFilters(entryArgs); diff --git a/scripts/tsdown-build.mjs b/scripts/tsdown-build.mjs index 4d31d06a693..86bd14c0bbb 100644 --- a/scripts/tsdown-build.mjs +++ b/scripts/tsdown-build.mjs @@ -11,16 +11,16 @@ const UNRESOLVED_IMPORT_RE = /\[UNRESOLVED_IMPORT\]/; const ANSI_ESCAPE_RE = new RegExp(String.raw`\u001B\[[0-9;]*m`, "g"); function removeDistPluginNodeModulesSymlinks(rootDir) { - const extensionsDir = path.join(rootDir, "extensions"); - if (!fs.existsSync(extensionsDir)) { + const nativePluginsDir = path.join(rootDir, "native-plugins"); + if (!fs.existsSync(nativePluginsDir)) { return; } - for (const dirent of fs.readdirSync(extensionsDir, { withFileTypes: true })) { + for (const dirent of fs.readdirSync(nativePluginsDir, { withFileTypes: true })) { if (!dirent.isDirectory()) { continue; } - const nodeModulesPath = path.join(extensionsDir, dirent.name, "node_modules"); + const nodeModulesPath = path.join(nativePluginsDir, dirent.name, "node_modules"); try { if (fs.lstatSync(nodeModulesPath).isSymbolicLink()) { fs.rmSync(nodeModulesPath, { force: true, recursive: true }); @@ -49,7 +49,7 @@ function findFatalUnresolvedImport(lines) { } const normalizedLine = line.replace(ANSI_ESCAPE_RE, ""); - if (!normalizedLine.includes("extensions/")) { + if (!normalizedLine.includes("native-plugins/")) { return normalizedLine; } } @@ -87,7 +87,9 @@ const fatalUnresolvedImport = result.status === 0 ? findFatalUnresolvedImport(`${stdout}\n${stderr}`.split("\n")) : null; if (fatalUnresolvedImport) { - console.error(`Build emitted [UNRESOLVED_IMPORT] outside extensions: ${fatalUnresolvedImport}`); + console.error( + `Build emitted [UNRESOLVED_IMPORT] outside native-plugins: ${fatalUnresolvedImport}`, + ); process.exit(1); } diff --git a/scripts/write-cli-startup-metadata.ts b/scripts/write-cli-startup-metadata.ts index 9f52b0fced3..04b92122cf2 100644 --- a/scripts/write-cli-startup-metadata.ts +++ b/scripts/write-cli-startup-metadata.ts @@ -19,7 +19,7 @@ const scriptDir = path.dirname(fileURLToPath(import.meta.url)); const rootDir = path.resolve(scriptDir, ".."); const distDir = path.join(rootDir, "dist"); const outputPath = path.join(distDir, "cli-startup-metadata.json"); -const extensionsDir = path.join(rootDir, "extensions"); +const nativePluginsDir = path.join(rootDir, "native-plugins"); const CORE_CHANNEL_ORDER = [ "telegram", "whatsapp", @@ -31,19 +31,19 @@ const CORE_CHANNEL_ORDER = [ "imessage", ] as const; -type ExtensionChannelEntry = { +type NativePluginChannelEntry = { id: string; order: number; label: string; }; function readBundledChannelCatalogIds(): string[] { - const entries: ExtensionChannelEntry[] = []; - for (const dirEntry of readdirSync(extensionsDir, { withFileTypes: true })) { + const entries: NativePluginChannelEntry[] = []; + for (const dirEntry of readdirSync(nativePluginsDir, { withFileTypes: true })) { if (!dirEntry.isDirectory()) { continue; } - const packageJsonPath = path.join(extensionsDir, dirEntry.name, "package.json"); + const packageJsonPath = path.join(nativePluginsDir, dirEntry.name, "package.json"); try { const raw = readFileSync(packageJsonPath, "utf8"); const parsed = JSON.parse(raw) as { @@ -67,7 +67,7 @@ function readBundledChannelCatalogIds(): string[] { label: typeof labelRaw === "string" ? labelRaw : id.trim(), }); } catch { - // Ignore malformed or missing extension package manifests. + // Ignore malformed or missing native plugin package manifests. } } return entries diff --git a/skills/bluebubbles/SKILL.md b/skills/bluebubbles/SKILL.md index bc03be4710d..c38b890e3be 100644 --- a/skills/bluebubbles/SKILL.md +++ b/skills/bluebubbles/SKILL.md @@ -122,7 +122,7 @@ If the user is vague ("text my mom"), ask for the recipient handle or chat guid - Prefer `chat_guid` targets when you have them (especially for group chats). - BlueBubbles supports rich actions, but some are macOS-version dependent (for example, edit may be broken on macOS 26 Tahoe). - The gateway may expose both short and full message ids; full ids are more durable across restarts. -- Developer reference for the underlying plugin lives in `extensions/bluebubbles/README.md`. +- Developer reference for the underlying plugin lives in `native-plugins/bluebubbles/README.md`. ## Ideas to try diff --git a/src/acp/persistent-bindings.test.ts b/src/acp/persistent-bindings.test.ts index b9fc0c9e9b3..7fbdfbbdd12 100644 --- a/src/acp/persistent-bindings.test.ts +++ b/src/acp/persistent-bindings.test.ts @@ -1,7 +1,7 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; -import { discordPlugin } from "../../extensions/discord/src/channel.js"; -import { feishuPlugin } from "../../extensions/feishu/src/channel.js"; -import { telegramPlugin } from "../../extensions/telegram/src/channel.js"; +import { discordPlugin } from "../../native-plugins/discord/src/channel.js"; +import { feishuPlugin } from "../../native-plugins/feishu/src/channel.js"; +import { telegramPlugin } from "../../native-plugins/telegram/src/channel.js"; import { resolveAgentWorkspaceDir } from "../agents/agent-scope.js"; import type { OpenClawConfig } from "../config/config.js"; import { setActivePluginRegistry } from "../plugins/runtime.js"; diff --git a/src/agents/models-config.falls-back-default-baseurl-token-exchange-fails.test.ts b/src/agents/models-config.falls-back-default-baseurl-token-exchange-fails.test.ts index efcba001638..b2935db4431 100644 --- a/src/agents/models-config.falls-back-default-baseurl-token-exchange-fails.test.ts +++ b/src/agents/models-config.falls-back-default-baseurl-token-exchange-fails.test.ts @@ -1,7 +1,7 @@ import fs from "node:fs/promises"; import path from "node:path"; import { describe, expect, it, vi } from "vitest"; -import { DEFAULT_COPILOT_API_BASE_URL } from "../../extensions/github-copilot/token.js"; +import { DEFAULT_COPILOT_API_BASE_URL } from "../../native-plugins/github-copilot/token.js"; import { withEnvAsync } from "../test-utils/env.js"; import { installModelsConfigTestHooks, diff --git a/src/agents/models-config.providers.discovery.ts b/src/agents/models-config.providers.discovery.ts index b138c4853d1..65ab401074d 100644 --- a/src/agents/models-config.providers.discovery.ts +++ b/src/agents/models-config.providers.discovery.ts @@ -17,10 +17,10 @@ import { } from "./self-hosted-provider-defaults.js"; import { SGLANG_DEFAULT_BASE_URL, SGLANG_PROVIDER_LABEL } from "./sglang-defaults.js"; import { VLLM_DEFAULT_BASE_URL, VLLM_PROVIDER_LABEL } from "./vllm-defaults.js"; -export { buildHuggingfaceProvider } from "../../extensions/huggingface/provider-catalog.js"; -export { buildKilocodeProviderWithDiscovery } from "../../extensions/kilocode/provider-catalog.js"; -export { buildVeniceProvider } from "../../extensions/venice/provider-catalog.js"; -export { buildVercelAiGatewayProvider } from "../../extensions/vercel-ai-gateway/provider-catalog.js"; +export { buildHuggingfaceProvider } from "../../native-plugins/huggingface/provider-catalog.js"; +export { buildKilocodeProviderWithDiscovery } from "../../native-plugins/kilocode/provider-catalog.js"; +export { buildVeniceProvider } from "../../native-plugins/venice/provider-catalog.js"; +export { buildVercelAiGatewayProvider } from "../../native-plugins/vercel-ai-gateway/provider-catalog.js"; export { resolveOllamaApiBase } from "./ollama-models.js"; diff --git a/src/agents/models-config.providers.static.ts b/src/agents/models-config.providers.static.ts index 71184e12286..223302e572d 100644 --- a/src/agents/models-config.providers.static.ts +++ b/src/agents/models-config.providers.static.ts @@ -1,35 +1,35 @@ export { buildBytePlusCodingProvider, buildBytePlusProvider, -} from "../../extensions/byteplus/provider-catalog.js"; -export { buildKimiCodingProvider } from "../../extensions/kimi-coding/provider-catalog.js"; -export { buildKilocodeProvider } from "../../extensions/kilocode/provider-catalog.js"; +} from "../../native-plugins/byteplus/provider-catalog.js"; +export { buildKimiCodingProvider } from "../../native-plugins/kimi-coding/provider-catalog.js"; +export { buildKilocodeProvider } from "../../native-plugins/kilocode/provider-catalog.js"; export { buildMinimaxPortalProvider, buildMinimaxProvider, -} from "../../extensions/minimax/provider-catalog.js"; +} from "../../native-plugins/minimax/provider-catalog.js"; export { MODELSTUDIO_BASE_URL, MODELSTUDIO_DEFAULT_MODEL_ID, buildModelStudioProvider, -} from "../../extensions/modelstudio/provider-catalog.js"; -export { buildMoonshotProvider } from "../../extensions/moonshot/provider-catalog.js"; -export { buildNvidiaProvider } from "../../extensions/nvidia/provider-catalog.js"; -export { buildOpenAICodexProvider } from "../../extensions/openai/openai-codex-catalog.js"; -export { buildOpenrouterProvider } from "../../extensions/openrouter/provider-catalog.js"; +} from "../../native-plugins/modelstudio/provider-catalog.js"; +export { buildMoonshotProvider } from "../../native-plugins/moonshot/provider-catalog.js"; +export { buildNvidiaProvider } from "../../native-plugins/nvidia/provider-catalog.js"; +export { buildOpenAICodexProvider } from "../../native-plugins/openai/openai-codex-catalog.js"; +export { buildOpenrouterProvider } from "../../native-plugins/openrouter/provider-catalog.js"; export { QIANFAN_BASE_URL, QIANFAN_DEFAULT_MODEL_ID, buildQianfanProvider, -} from "../../extensions/qianfan/provider-catalog.js"; -export { buildQwenPortalProvider } from "../../extensions/qwen-portal-auth/provider-catalog.js"; -export { buildSyntheticProvider } from "../../extensions/synthetic/provider-catalog.js"; -export { buildTogetherProvider } from "../../extensions/together/provider-catalog.js"; +} from "../../native-plugins/qianfan/provider-catalog.js"; +export { buildQwenPortalProvider } from "../../native-plugins/qwen-portal-auth/provider-catalog.js"; +export { buildSyntheticProvider } from "../../native-plugins/synthetic/provider-catalog.js"; +export { buildTogetherProvider } from "../../native-plugins/together/provider-catalog.js"; export { buildDoubaoCodingProvider, buildDoubaoProvider, -} from "../../extensions/volcengine/provider-catalog.js"; +} from "../../native-plugins/volcengine/provider-catalog.js"; export { XIAOMI_DEFAULT_MODEL_ID, buildXiaomiProvider, -} from "../../extensions/xiaomi/provider-catalog.js"; +} from "../../native-plugins/xiaomi/provider-catalog.js"; diff --git a/src/agents/models-config.providers.ts b/src/agents/models-config.providers.ts index af9c3d6e34a..e4117b02838 100644 --- a/src/agents/models-config.providers.ts +++ b/src/agents/models-config.providers.ts @@ -1,8 +1,8 @@ import { QIANFAN_BASE_URL, QIANFAN_DEFAULT_MODEL_ID, -} from "../../extensions/qianfan/provider-catalog.js"; -import { XIAOMI_DEFAULT_MODEL_ID } from "../../extensions/xiaomi/provider-catalog.js"; +} from "../../native-plugins/qianfan/provider-catalog.js"; +import { XIAOMI_DEFAULT_MODEL_ID } from "../../native-plugins/xiaomi/provider-catalog.js"; import type { OpenClawConfig } from "../config/config.js"; import { coerceSecretRef, resolveSecretInputRef } from "../config/types.secrets.js"; import { isRecord } from "../utils.js"; @@ -11,23 +11,23 @@ import { ensureAuthProfileStore, listProfilesForProvider } from "./auth-profiles import { discoverBedrockModels } from "./bedrock-discovery.js"; import { normalizeGoogleModelId } from "./model-id-normalization.js"; import { resolveOllamaApiBase } from "./models-config.providers.discovery.js"; -export { buildKimiCodingProvider } from "../../extensions/kimi-coding/provider-catalog.js"; -export { buildKilocodeProvider } from "../../extensions/kilocode/provider-catalog.js"; +export { buildKimiCodingProvider } from "../../native-plugins/kimi-coding/provider-catalog.js"; +export { buildKilocodeProvider } from "../../native-plugins/kilocode/provider-catalog.js"; export { MODELSTUDIO_BASE_URL, MODELSTUDIO_DEFAULT_MODEL_ID, buildModelStudioProvider, -} from "../../extensions/modelstudio/provider-catalog.js"; -export { buildNvidiaProvider } from "../../extensions/nvidia/provider-catalog.js"; +} from "../../native-plugins/modelstudio/provider-catalog.js"; +export { buildNvidiaProvider } from "../../native-plugins/nvidia/provider-catalog.js"; export { QIANFAN_BASE_URL, QIANFAN_DEFAULT_MODEL_ID, buildQianfanProvider, -} from "../../extensions/qianfan/provider-catalog.js"; +} from "../../native-plugins/qianfan/provider-catalog.js"; export { XIAOMI_DEFAULT_MODEL_ID, buildXiaomiProvider, -} from "../../extensions/xiaomi/provider-catalog.js"; +} from "../../native-plugins/xiaomi/provider-catalog.js"; import { groupPluginDiscoveryProvidersByOrder, normalizePluginDiscoveryResult, diff --git a/src/agents/pi-embedded-runner.run-embedded-pi-agent.auth-profile-rotation.e2e.test.ts b/src/agents/pi-embedded-runner.run-embedded-pi-agent.auth-profile-rotation.e2e.test.ts index cbea9e5f21b..d867b64c8f0 100644 --- a/src/agents/pi-embedded-runner.run-embedded-pi-agent.auth-profile-rotation.e2e.test.ts +++ b/src/agents/pi-embedded-runner.run-embedded-pi-agent.auth-profile-rotation.e2e.test.ts @@ -33,7 +33,7 @@ vi.mock("../infra/backoff.js", () => ({ sleepWithAbort: (ms: number, abortSignal?: AbortSignal) => sleepWithAbortMock(ms, abortSignal), })); -vi.mock("../../extensions/github-copilot/token.js", () => ({ +vi.mock("../../native-plugins/github-copilot/token.js", () => ({ DEFAULT_COPILOT_API_BASE_URL: "https://api.individual.githubcopilot.com", resolveCopilotApiToken: (...args: unknown[]) => resolveCopilotApiTokenMock(...args), })); diff --git a/src/agents/pi-embedded-subscribe.tools.extract.test.ts b/src/agents/pi-embedded-subscribe.tools.extract.test.ts index cd99ee6b674..17f2de59d7d 100644 --- a/src/agents/pi-embedded-subscribe.tools.extract.test.ts +++ b/src/agents/pi-embedded-subscribe.tools.extract.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it } from "vitest"; -import { telegramPlugin } from "../../extensions/telegram/src/channel.js"; +import { telegramPlugin } from "../../native-plugins/telegram/src/channel.js"; import { setActivePluginRegistry } from "../plugins/runtime.js"; import { createTestRegistry } from "../test-utils/channel-plugins.js"; import { extractMessagingToolSend } from "./pi-embedded-subscribe.tools.js"; diff --git a/src/agents/pi-tools.safe-bins.test.ts b/src/agents/pi-tools.safe-bins.test.ts index b5585db5ec2..c0d4f3a4693 100644 --- a/src/agents/pi-tools.safe-bins.test.ts +++ b/src/agents/pi-tools.safe-bins.test.ts @@ -12,7 +12,7 @@ const bundledPluginsDirSnapshot = captureEnv(["OPENCLAW_BUNDLED_PLUGINS_DIR"]); beforeAll(() => { process.env.OPENCLAW_BUNDLED_PLUGINS_DIR = path.join( os.tmpdir(), - "openclaw-test-no-bundled-extensions", + "openclaw-test-no-bundled-native-plugins", ); }); diff --git a/src/agents/subagent-announce.format.e2e.test.ts b/src/agents/subagent-announce.format.e2e.test.ts index 1fe179a05c9..219d54faf2b 100644 --- a/src/agents/subagent-announce.format.e2e.test.ts +++ b/src/agents/subagent-announce.format.e2e.test.ts @@ -187,7 +187,7 @@ vi.mock("./subagent-registry-runtime.js", () => subagentRegistryMock); describe("subagent announce formatting", () => { let previousFastTestEnv: string | undefined; let runSubagentAnnounceFlow: (typeof import("./subagent-announce.js"))["runSubagentAnnounceFlow"]; - let matrixPlugin: (typeof import("../../extensions/matrix/src/channel.js"))["matrixPlugin"]; + let matrixPlugin: (typeof import("../../native-plugins/matrix/src/channel.js"))["matrixPlugin"]; beforeAll(async () => { // Set FAST_TEST_MODE before importing the module to ensure the module-level @@ -196,7 +196,7 @@ describe("subagent announce formatting", () => { // See: https://github.com/openclaw/openclaw/issues/31298 previousFastTestEnv = process.env.OPENCLAW_TEST_FAST; process.env.OPENCLAW_TEST_FAST = "1"; - ({ matrixPlugin } = await import("../../extensions/matrix/src/channel.js")); + ({ matrixPlugin } = await import("../../native-plugins/matrix/src/channel.js")); ({ runSubagentAnnounceFlow } = await import("./subagent-announce.js")); }); diff --git a/src/agents/tools/web-search.test.ts b/src/agents/tools/web-search.test.ts index 9f3a6fe017c..d7c0828e8bf 100644 --- a/src/agents/tools/web-search.test.ts +++ b/src/agents/tools/web-search.test.ts @@ -1,8 +1,8 @@ import { describe, expect, it } from "vitest"; -import { __testing as braveTesting } from "../../../extensions/brave/src/brave-web-search-provider.js"; -import { __testing as moonshotTesting } from "../../../extensions/moonshot/src/kimi-web-search-provider.js"; -import { __testing as perplexityTesting } from "../../../extensions/perplexity/web-search-provider.js"; -import { __testing as xaiTesting } from "../../../extensions/xai/src/grok-web-search-provider.js"; +import { __testing as braveTesting } from "../../../native-plugins/brave/src/brave-web-search-provider.js"; +import { __testing as moonshotTesting } from "../../../native-plugins/moonshot/src/kimi-web-search-provider.js"; +import { __testing as perplexityTesting } from "../../../native-plugins/perplexity/web-search-provider.js"; +import { __testing as xaiTesting } from "../../../native-plugins/xai/src/grok-web-search-provider.js"; import { buildUnsupportedSearchFilterResponse, mergeScopedSearchConfig, diff --git a/src/auto-reply/reply.heartbeat-typing.test.ts b/src/auto-reply/reply.heartbeat-typing.test.ts index 3bfc5f635b3..59c62cab3a1 100644 --- a/src/auto-reply/reply.heartbeat-typing.test.ts +++ b/src/auto-reply/reply.heartbeat-typing.test.ts @@ -14,7 +14,7 @@ const webMocks = vi.hoisted(() => ({ readWebSelfId: vi.fn().mockReturnValue({ e164: "+1999" }), })); -vi.mock("../../extensions/whatsapp/src/session.js", () => webMocks); +vi.mock("../../native-plugins/whatsapp/src/session.js", () => webMocks); import { getReplyFromConfig } from "./reply.js"; diff --git a/src/auto-reply/reply.raw-body.test.ts b/src/auto-reply/reply.raw-body.test.ts index aeb9adc8378..c6f26aa133e 100644 --- a/src/auto-reply/reply.raw-body.test.ts +++ b/src/auto-reply/reply.raw-body.test.ts @@ -14,7 +14,7 @@ vi.mock("../agents/model-catalog.js", () => ({ loadModelCatalog: agentMocks.loadModelCatalog, })); -vi.mock("../../extensions/whatsapp/src/session.js", () => ({ +vi.mock("../../native-plugins/whatsapp/src/session.js", () => ({ webAuthExists: agentMocks.webAuthExists, getWebAuthAgeMs: agentMocks.getWebAuthAgeMs, readWebSelfId: agentMocks.readWebSelfId, diff --git a/src/auto-reply/reply.triggers.trigger-handling.test-harness.ts b/src/auto-reply/reply.triggers.trigger-handling.test-harness.ts index 626683601d7..1be96c2d508 100644 --- a/src/auto-reply/reply.triggers.trigger-handling.test-harness.ts +++ b/src/auto-reply/reply.triggers.trigger-handling.test-harness.ts @@ -101,7 +101,7 @@ export function getWebSessionMocks(): AnyMocks { return webSessionMocks; } -vi.mock("../../extensions/whatsapp/runtime-api.js", () => webSessionMocks); +vi.mock("../../native-plugins/whatsapp/runtime-api.js", () => webSessionMocks); export const MAIN_SESSION_KEY = "agent:main:main"; diff --git a/src/auto-reply/reply/commands-acp.test.ts b/src/auto-reply/reply/commands-acp.test.ts index ca8ece9b3cc..d80d56ec573 100644 --- a/src/auto-reply/reply/commands-acp.test.ts +++ b/src/auto-reply/reply/commands-acp.test.ts @@ -107,7 +107,7 @@ vi.mock("../../infra/outbound/session-binding-service.js", async (importOriginal }); // Prevent transitive import chain from reaching discord/monitor which needs https-proxy-agent. -vi.mock("../../../extensions/discord/src/monitor/gateway-plugin.js", () => ({ +vi.mock("../../../native-plugins/discord/src/monitor/gateway-plugin.js", () => ({ createDiscordGatewayPlugin: () => ({}), })); diff --git a/src/auto-reply/reply/commands-acp/context.test.ts b/src/auto-reply/reply/commands-acp/context.test.ts index 721ee325b48..8130596c164 100644 --- a/src/auto-reply/reply/commands-acp/context.test.ts +++ b/src/auto-reply/reply/commands-acp/context.test.ts @@ -2,7 +2,7 @@ import { beforeEach, describe, expect, it } from "vitest"; import { __testing as feishuThreadBindingTesting, createFeishuThreadBindingManager, -} from "../../../../extensions/feishu/src/thread-bindings.js"; +} from "../../../../native-plugins/feishu/src/thread-bindings.js"; import type { OpenClawConfig } from "../../../config/config.js"; import { __testing as sessionBindingTesting, diff --git a/src/auto-reply/reply/commands-acp/install-hints.ts b/src/auto-reply/reply/commands-acp/install-hints.ts index 58b4b387c74..f8c2f481efa 100644 --- a/src/auto-reply/reply/commands-acp/install-hints.ts +++ b/src/auto-reply/reply/commands-acp/install-hints.ts @@ -13,7 +13,7 @@ export function resolveAcpInstallCommandHint(cfg: OpenClawConfig): string { } const backendId = resolveConfiguredAcpBackendId(cfg).toLowerCase(); if (backendId === "acpx") { - const localPath = path.resolve(process.cwd(), "extensions/acpx"); + const localPath = path.resolve(process.cwd(), "native-plugins/acpx"); if (existsSync(localPath)) { return `openclaw plugins install ${localPath}`; } diff --git a/src/auto-reply/reply/commands-session-lifecycle.test.ts b/src/auto-reply/reply/commands-session-lifecycle.test.ts index 8d31fbf8c0d..d9f9c5367e4 100644 --- a/src/auto-reply/reply/commands-session-lifecycle.test.ts +++ b/src/auto-reply/reply/commands-session-lifecycle.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; -import { telegramPlugin } from "../../../extensions/telegram/src/channel.js"; +import { telegramPlugin } from "../../../native-plugins/telegram/src/channel.js"; import type { OpenClawConfig } from "../../config/config.js"; import type { SessionBindingRecord } from "../../infra/outbound/session-binding-service.js"; import { setActivePluginRegistry } from "../../plugins/runtime.js"; @@ -28,8 +28,8 @@ const hoisted = vi.hoisted(() => { vi.mock("../../plugins/runtime/index.js", async () => { const discordThreadBindings = await vi.importActual< - typeof import("../../../extensions/discord/src/monitor/thread-bindings.js") - >("../../../extensions/discord/src/monitor/thread-bindings.js"); + typeof import("../../../native-plugins/discord/src/monitor/thread-bindings.js") + >("../../../native-plugins/discord/src/monitor/thread-bindings.js"); return { createPluginRuntime: () => ({ channel: { diff --git a/src/auto-reply/reply/commands-subagents.test-mocks.ts b/src/auto-reply/reply/commands-subagents.test-mocks.ts index b9934928372..9e80c1be2f7 100644 --- a/src/auto-reply/reply/commands-subagents.test-mocks.ts +++ b/src/auto-reply/reply/commands-subagents.test-mocks.ts @@ -10,7 +10,7 @@ export function installSubagentsCommandCoreMocks() { }); // Prevent transitive import chain from reaching discord/monitor which needs https-proxy-agent. - vi.mock("../../../extensions/discord/runtime-api.js", () => ({ + vi.mock("../../../native-plugins/discord/runtime-api.js", () => ({ createDiscordGatewayPlugin: () => ({}), })); } diff --git a/src/auto-reply/reply/route-reply.test.ts b/src/auto-reply/reply/route-reply.test.ts index 515d71726fb..3e304cdee21 100644 --- a/src/auto-reply/reply/route-reply.test.ts +++ b/src/auto-reply/reply/route-reply.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { mattermostPlugin } from "../../../extensions/mattermost/src/channel.js"; -import { slackPlugin } from "../../../extensions/slack/src/channel.js"; +import { mattermostPlugin } from "../../../native-plugins/mattermost/src/channel.js"; +import { slackPlugin } from "../../../native-plugins/slack/src/channel.js"; import { discordOutbound, imessageOutbound, @@ -32,34 +32,34 @@ const mocks = vi.hoisted(() => ({ deliverOutboundPayloads: vi.fn(), })); -vi.mock("../../../extensions/discord/src/send.js", () => ({ +vi.mock("../../../native-plugins/discord/src/send.js", () => ({ sendMessageDiscord: mocks.sendMessageDiscord, })); -vi.mock("../../../extensions/imessage/src/send.js", () => ({ +vi.mock("../../../native-plugins/imessage/src/send.js", () => ({ sendMessageIMessage: mocks.sendMessageIMessage, })); -vi.mock("../../../extensions/signal/src/send.js", () => ({ +vi.mock("../../../native-plugins/signal/src/send.js", () => ({ sendMessageSignal: mocks.sendMessageSignal, })); -vi.mock("../../../extensions/slack/src/send.js", () => ({ +vi.mock("../../../native-plugins/slack/src/send.js", () => ({ sendMessageSlack: mocks.sendMessageSlack, })); -vi.mock("../../../extensions/telegram/src/send.js", () => ({ +vi.mock("../../../native-plugins/telegram/src/send.js", () => ({ sendMessageTelegram: mocks.sendMessageTelegram, })); -vi.mock("../../../extensions/telegram/src/send.js", () => ({ +vi.mock("../../../native-plugins/telegram/src/send.js", () => ({ sendMessageTelegram: mocks.sendMessageTelegram, })); -vi.mock("../../../extensions/whatsapp/src/send.js", () => ({ +vi.mock("../../../native-plugins/whatsapp/src/send.js", () => ({ sendMessageWhatsApp: mocks.sendMessageWhatsApp, sendPollWhatsApp: mocks.sendMessageWhatsApp, })); -vi.mock("../../../extensions/discord/src/send.js", () => ({ +vi.mock("../../../native-plugins/discord/src/send.js", () => ({ sendMessageDiscord: mocks.sendMessageDiscord, sendPollDiscord: mocks.sendMessageDiscord, sendWebhookMessageDiscord: vi.fn(), })); -vi.mock("../../../extensions/mattermost/src/mattermost/send.js", () => ({ +vi.mock("../../../native-plugins/mattermost/src/mattermost/send.js", () => ({ sendMessageMattermost: mocks.sendMessageMattermost, })); vi.mock("../../infra/outbound/deliver-runtime.js", async () => { diff --git a/src/auto-reply/reply/telegram-context.test.ts b/src/auto-reply/reply/telegram-context.test.ts index b38397a1c01..a0d944b322f 100644 --- a/src/auto-reply/reply/telegram-context.test.ts +++ b/src/auto-reply/reply/telegram-context.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it } from "vitest"; -import { telegramPlugin } from "../../../extensions/telegram/src/channel.js"; +import { telegramPlugin } from "../../../native-plugins/telegram/src/channel.js"; import { setActivePluginRegistry } from "../../plugins/runtime.js"; import { createTestRegistry } from "../../test-utils/channel-plugins.js"; import { resolveTelegramConversationId } from "./telegram-context.js"; diff --git a/src/channels/plugins/actions/actions.test.ts b/src/channels/plugins/actions/actions.test.ts index 42d5224b93b..45e5fa8761f 100644 --- a/src/channels/plugins/actions/actions.test.ts +++ b/src/channels/plugins/actions/actions.test.ts @@ -8,28 +8,28 @@ const sendReactionSignal = vi.fn(async (..._args: unknown[]) => ({ ok: true })); const removeReactionSignal = vi.fn(async (..._args: unknown[]) => ({ ok: true })); const handleSlackAction = vi.fn(async (..._args: unknown[]) => ({ details: { ok: true } })); -vi.mock("../../../../extensions/discord/src/actions/runtime.js", () => ({ +vi.mock("../../../../native-plugins/discord/src/actions/runtime.js", () => ({ handleDiscordAction, })); -vi.mock("../../../../extensions/telegram/src/action-runtime.js", () => ({ +vi.mock("../../../../native-plugins/telegram/src/action-runtime.js", () => ({ handleTelegramAction, })); -vi.mock("../../../../extensions/signal/src/send-reactions.js", () => ({ +vi.mock("../../../../native-plugins/signal/src/send-reactions.js", () => ({ sendReactionSignal, removeReactionSignal, })); -vi.mock("../../../../extensions/slack/src/action-runtime.js", () => ({ +vi.mock("../../../../native-plugins/slack/src/action-runtime.js", () => ({ handleSlackAction, })); -let discordMessageActions: typeof import("../../../../extensions/discord/runtime-api.js").discordMessageActions; +let discordMessageActions: typeof import("../../../../native-plugins/discord/runtime-api.js").discordMessageActions; let handleDiscordMessageAction: typeof import("./discord/handle-action.js").handleDiscordMessageAction; -let telegramMessageActions: typeof import("../../../../extensions/telegram/runtime-api.js").telegramMessageActions; -let signalMessageActions: typeof import("../../../../extensions/signal/src/message-actions.js").signalMessageActions; -let createSlackActions: typeof import("../../../../extensions/slack/src/channel-actions.js").createSlackActions; +let telegramMessageActions: typeof import("../../../../native-plugins/telegram/runtime-api.js").telegramMessageActions; +let signalMessageActions: typeof import("../../../../native-plugins/signal/src/message-actions.js").signalMessageActions; +let createSlackActions: typeof import("../../../../native-plugins/slack/src/channel-actions.js").createSlackActions; function getDescribedActions(params: { describeMessageTool?: ChannelMessageActionAdapter["describeMessageTool"]; @@ -200,11 +200,13 @@ async function expectSlackSendRejected(params: Record, error: R } beforeAll(async () => { - ({ discordMessageActions } = await import("../../../../extensions/discord/runtime-api.js")); + ({ discordMessageActions } = await import("../../../../native-plugins/discord/runtime-api.js")); ({ handleDiscordMessageAction } = await import("./discord/handle-action.js")); - ({ telegramMessageActions } = await import("../../../../extensions/telegram/runtime-api.js")); - ({ signalMessageActions } = await import("../../../../extensions/signal/src/message-actions.js")); - ({ createSlackActions } = await import("../../../../extensions/slack/src/channel-actions.js")); + ({ telegramMessageActions } = await import("../../../../native-plugins/telegram/runtime-api.js")); + ({ signalMessageActions } = + await import("../../../../native-plugins/signal/src/message-actions.js")); + ({ createSlackActions } = + await import("../../../../native-plugins/slack/src/channel-actions.js")); }); beforeEach(() => { diff --git a/src/channels/plugins/actions/discord/handle-action.guild-admin.ts b/src/channels/plugins/actions/discord/handle-action.guild-admin.ts index c7375b6c1a7..f7fbacdb4be 100644 --- a/src/channels/plugins/actions/discord/handle-action.guild-admin.ts +++ b/src/channels/plugins/actions/discord/handle-action.guild-admin.ts @@ -1 +1 @@ -export * from "../../../../../extensions/discord/api.js"; +export * from "../../../../../native-plugins/discord/api.js"; diff --git a/src/channels/plugins/actions/discord/handle-action.ts b/src/channels/plugins/actions/discord/handle-action.ts index c7375b6c1a7..f7fbacdb4be 100644 --- a/src/channels/plugins/actions/discord/handle-action.ts +++ b/src/channels/plugins/actions/discord/handle-action.ts @@ -1 +1 @@ -export * from "../../../../../extensions/discord/api.js"; +export * from "../../../../../native-plugins/discord/api.js"; diff --git a/src/channels/plugins/bundled.ts b/src/channels/plugins/bundled.ts index 291a9d81e36..1131565cd27 100644 --- a/src/channels/plugins/bundled.ts +++ b/src/channels/plugins/bundled.ts @@ -1,22 +1,22 @@ -import { bluebubblesPlugin } from "../../../extensions/bluebubbles/index.js"; -import { discordPlugin, setDiscordRuntime } from "../../../extensions/discord/index.js"; -import { discordSetupPlugin } from "../../../extensions/discord/setup-entry.js"; -import { feishuPlugin } from "../../../extensions/feishu/index.js"; -import { imessagePlugin } from "../../../extensions/imessage/index.js"; -import { imessageSetupPlugin } from "../../../extensions/imessage/setup-entry.js"; -import { ircPlugin } from "../../../extensions/irc/index.js"; -import { linePlugin, setLineRuntime } from "../../../extensions/line/index.js"; -import { lineSetupPlugin } from "../../../extensions/line/setup-entry.js"; -import { mattermostPlugin } from "../../../extensions/mattermost/index.js"; -import { nextcloudTalkPlugin } from "../../../extensions/nextcloud-talk/index.js"; -import { signalPlugin } from "../../../extensions/signal/index.js"; -import { signalSetupPlugin } from "../../../extensions/signal/setup-entry.js"; -import { slackPlugin } from "../../../extensions/slack/index.js"; -import { slackSetupPlugin } from "../../../extensions/slack/setup-entry.js"; -import { synologyChatPlugin } from "../../../extensions/synology-chat/index.js"; -import { telegramPlugin, setTelegramRuntime } from "../../../extensions/telegram/index.js"; -import { telegramSetupPlugin } from "../../../extensions/telegram/setup-entry.js"; -import { zaloPlugin } from "../../../extensions/zalo/index.js"; +import { bluebubblesPlugin } from "../../../native-plugins/bluebubbles/index.js"; +import { discordPlugin, setDiscordRuntime } from "../../../native-plugins/discord/index.js"; +import { discordSetupPlugin } from "../../../native-plugins/discord/setup-entry.js"; +import { feishuPlugin } from "../../../native-plugins/feishu/index.js"; +import { imessagePlugin } from "../../../native-plugins/imessage/index.js"; +import { imessageSetupPlugin } from "../../../native-plugins/imessage/setup-entry.js"; +import { ircPlugin } from "../../../native-plugins/irc/index.js"; +import { linePlugin, setLineRuntime } from "../../../native-plugins/line/index.js"; +import { lineSetupPlugin } from "../../../native-plugins/line/setup-entry.js"; +import { mattermostPlugin } from "../../../native-plugins/mattermost/index.js"; +import { nextcloudTalkPlugin } from "../../../native-plugins/nextcloud-talk/index.js"; +import { signalPlugin } from "../../../native-plugins/signal/index.js"; +import { signalSetupPlugin } from "../../../native-plugins/signal/setup-entry.js"; +import { slackPlugin } from "../../../native-plugins/slack/index.js"; +import { slackSetupPlugin } from "../../../native-plugins/slack/setup-entry.js"; +import { synologyChatPlugin } from "../../../native-plugins/synology-chat/index.js"; +import { telegramPlugin, setTelegramRuntime } from "../../../native-plugins/telegram/index.js"; +import { telegramSetupPlugin } from "../../../native-plugins/telegram/setup-entry.js"; +import { zaloPlugin } from "../../../native-plugins/zalo/index.js"; import type { ChannelId, ChannelPlugin } from "./types.js"; export const bundledChannelPlugins = [ diff --git a/src/channels/plugins/contracts/group-policy.contract.test.ts b/src/channels/plugins/contracts/group-policy.contract.test.ts index 51a9c178170..2822f9b98ad 100644 --- a/src/channels/plugins/contracts/group-policy.contract.test.ts +++ b/src/channels/plugins/contracts/group-policy.contract.test.ts @@ -1,10 +1,10 @@ import { describe, expect, it } from "vitest"; -import { __testing as discordTesting } from "../../../../extensions/discord/src/monitor/provider.js"; -import { __testing as imessageTesting } from "../../../../extensions/imessage/src/monitor/monitor-provider.js"; -import { __testing as slackTesting } from "../../../../extensions/slack/src/monitor/provider.js"; -import { resolveTelegramRuntimeGroupPolicy } from "../../../../extensions/telegram/src/group-access.js"; -import { __testing as whatsappTesting } from "../../../../extensions/whatsapp/src/inbound/access-control.js"; -import { __testing as zaloTesting } from "../../../../extensions/zalo/src/monitor.js"; +import { __testing as discordTesting } from "../../../../native-plugins/discord/src/monitor/provider.js"; +import { __testing as imessageTesting } from "../../../../native-plugins/imessage/src/monitor/monitor-provider.js"; +import { __testing as slackTesting } from "../../../../native-plugins/slack/src/monitor/provider.js"; +import { resolveTelegramRuntimeGroupPolicy } from "../../../../native-plugins/telegram/src/group-access.js"; +import { __testing as whatsappTesting } from "../../../../native-plugins/whatsapp/src/inbound/access-control.js"; +import { __testing as zaloTesting } from "../../../../native-plugins/zalo/src/monitor.js"; import { installChannelRuntimeGroupPolicyFallbackSuite } from "./suites.js"; describe("channel runtime group policy contract", () => { diff --git a/src/channels/plugins/contracts/inbound.contract.test.ts b/src/channels/plugins/contracts/inbound.contract.test.ts index 9fa108bcb72..98d9265d203 100644 --- a/src/channels/plugins/contracts/inbound.contract.test.ts +++ b/src/channels/plugins/contracts/inbound.contract.test.ts @@ -1,7 +1,7 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; -import { buildDiscordInboundAccessContext } from "../../../../extensions/discord/src/monitor/inbound-context.js"; -import type { ResolvedSlackAccount } from "../../../../extensions/slack/src/accounts.js"; -import type { SlackMessageEvent } from "../../../../extensions/slack/src/types.js"; +import { buildDiscordInboundAccessContext } from "../../../../native-plugins/discord/src/monitor/inbound-context.js"; +import type { ResolvedSlackAccount } from "../../../../native-plugins/slack/src/accounts.js"; +import type { SlackMessageEvent } from "../../../../native-plugins/slack/src/types.js"; import type { MsgContext } from "../../../auto-reply/templating.js"; import type { OpenClawConfig } from "../../../config/config.js"; import { inboundCtxCapture } from "./inbound-testkit.js"; @@ -48,7 +48,7 @@ vi.mock("openclaw/plugin-sdk/channel-runtime", async (importOriginal) => { }; }); -vi.mock("../../../../extensions/signal/src/send.js", () => ({ +vi.mock("../../../../native-plugins/signal/src/send.js", () => ({ sendMessageSignal: vi.fn(), sendTypingSignal: vi.fn(async () => true), sendReadReceiptSignal: vi.fn(async () => true), @@ -59,7 +59,7 @@ vi.mock("../../../pairing/pairing-store.js", () => ({ upsertChannelPairingRequest: vi.fn(), })); -vi.mock("../../../../extensions/whatsapp/src/auto-reply/monitor/last-route.js", () => ({ +vi.mock("../../../../native-plugins/whatsapp/src/auto-reply/monitor/last-route.js", () => ({ trackBackgroundTask: (tasks: Set>, task: Promise) => { tasks.add(task); void task.finally(() => { @@ -69,17 +69,17 @@ vi.mock("../../../../extensions/whatsapp/src/auto-reply/monitor/last-route.js", updateLastRouteInBackground: vi.fn(), })); -vi.mock("../../../../extensions/whatsapp/src/auto-reply/deliver-reply.js", () => ({ +vi.mock("../../../../native-plugins/whatsapp/src/auto-reply/deliver-reply.js", () => ({ deliverWebReply: vi.fn(async () => {}), })); const { finalizeInboundContext } = await import("../../../auto-reply/reply/inbound-context.js"); const { prepareSlackMessage } = - await import("../../../../extensions/slack/src/monitor/message-handler/prepare.js"); + await import("../../../../native-plugins/slack/src/monitor/message-handler/prepare.js"); const { createInboundSlackTestContext } = - await import("../../../../extensions/slack/src/monitor/message-handler/prepare.test-helpers.js"); + await import("../../../../native-plugins/slack/src/monitor/message-handler/prepare.test-helpers.js"); const { buildTelegramMessageContextForTest } = - await import("../../../../extensions/telegram/src/bot-message-context.test-harness.js"); + await import("../../../../native-plugins/telegram/src/bot-message-context.test-harness.js"); function createSlackAccount(config: ResolvedSlackAccount["config"] = {}): ResolvedSlackAccount { return { diff --git a/src/channels/plugins/contracts/outbound-payload.contract.test.ts b/src/channels/plugins/contracts/outbound-payload.contract.test.ts index 761d1274091..f59b57dbcce 100644 --- a/src/channels/plugins/contracts/outbound-payload.contract.test.ts +++ b/src/channels/plugins/contracts/outbound-payload.contract.test.ts @@ -1,11 +1,11 @@ import { describe, vi } from "vitest"; -import { discordOutbound } from "../../../../extensions/discord/src/outbound-adapter.js"; -import { whatsappOutbound } from "../../../../extensions/whatsapp/src/outbound-adapter.js"; -import { zaloPlugin } from "../../../../extensions/zalo/src/channel.js"; -import { sendMessageZalo } from "../../../../extensions/zalo/src/send.js"; -import { zalouserPlugin } from "../../../../extensions/zalouser/src/channel.js"; -import { setZalouserRuntime } from "../../../../extensions/zalouser/src/runtime.js"; -import { sendMessageZalouser } from "../../../../extensions/zalouser/src/send.js"; +import { discordOutbound } from "../../../../native-plugins/discord/src/outbound-adapter.js"; +import { whatsappOutbound } from "../../../../native-plugins/whatsapp/src/outbound-adapter.js"; +import { zaloPlugin } from "../../../../native-plugins/zalo/src/channel.js"; +import { sendMessageZalo } from "../../../../native-plugins/zalo/src/send.js"; +import { zalouserPlugin } from "../../../../native-plugins/zalouser/src/channel.js"; +import { setZalouserRuntime } from "../../../../native-plugins/zalouser/src/runtime.js"; +import { sendMessageZalouser } from "../../../../native-plugins/zalouser/src/send.js"; import { slackOutbound } from "../../../../test/channel-outbounds.js"; import type { ReplyPayload } from "../../../auto-reply/types.js"; import { createDirectTextMediaOutbound } from "../outbound/direct-text-media.js"; @@ -14,14 +14,14 @@ import { primeChannelOutboundSendMock, } from "./suites.js"; -vi.mock("../../../../extensions/zalo/src/send.js", () => ({ +vi.mock("../../../../native-plugins/zalo/src/send.js", () => ({ sendMessageZalo: vi.fn().mockResolvedValue({ ok: true, messageId: "zl-1" }), })); // This suite only validates payload adaptation. Keep zalouser's runtime-only // ZCA import graph mocked so local contract runs don't depend on native socket // deps being resolved through the extension runtime seam. -vi.mock("../../../../extensions/zalouser/src/accounts.js", () => ({ +vi.mock("../../../../native-plugins/zalouser/src/accounts.js", () => ({ listZalouserAccountIds: vi.fn(() => ["default"]), resolveDefaultZalouserAccountId: vi.fn(() => "default"), resolveZalouserAccountSync: vi.fn(() => ({ @@ -36,7 +36,7 @@ vi.mock("../../../../extensions/zalouser/src/accounts.js", () => ({ checkZcaAuthenticated: vi.fn(async () => false), })); -vi.mock("../../../../extensions/zalouser/src/zalo-js.js", () => ({ +vi.mock("../../../../native-plugins/zalouser/src/zalo-js.js", () => ({ checkZaloAuthenticated: vi.fn(async () => false), getZaloUserInfo: vi.fn(async () => null), listZaloFriendsMatching: vi.fn(async () => []), @@ -59,7 +59,7 @@ vi.mock("../../../../extensions/zalouser/src/zalo-js.js", () => ({ })), })); -vi.mock("../../../../extensions/zalouser/src/send.js", () => ({ +vi.mock("../../../../native-plugins/zalouser/src/send.js", () => ({ sendMessageZalouser: vi.fn().mockResolvedValue({ ok: true, messageId: "zlu-1" }), sendReactionZalouser: vi.fn().mockResolvedValue({ ok: true }), })); diff --git a/src/channels/plugins/contracts/registry.ts b/src/channels/plugins/contracts/registry.ts index cf12d4f4355..fec56c74f91 100644 --- a/src/channels/plugins/contracts/registry.ts +++ b/src/channels/plugins/contracts/registry.ts @@ -5,14 +5,14 @@ import { expect, vi } from "vitest"; import { __testing as discordThreadBindingTesting, createThreadBindingManager as createDiscordThreadBindingManager, -} from "../../../../extensions/discord/runtime-api.js"; -import { createFeishuThreadBindingManager } from "../../../../extensions/feishu/api.js"; +} from "../../../../native-plugins/discord/runtime-api.js"; +import { createFeishuThreadBindingManager } from "../../../../native-plugins/feishu/api.js"; import { createMatrixThreadBindingManager, resetMatrixThreadBindingsForTests, -} from "../../../../extensions/matrix/api.js"; -import { setMatrixRuntime } from "../../../../extensions/matrix/index.js"; -import { createTelegramThreadBindingManager } from "../../../../extensions/telegram/runtime-api.js"; +} from "../../../../native-plugins/matrix/api.js"; +import { setMatrixRuntime } from "../../../../native-plugins/matrix/index.js"; +import { createTelegramThreadBindingManager } from "../../../../native-plugins/telegram/runtime-api.js"; import type { OpenClawConfig } from "../../../config/config.js"; import { getSessionBindingService, @@ -223,10 +223,10 @@ bundledChannelRuntimeSetters.setLineRuntime({ }, } as never); -vi.mock("../../../../extensions/matrix/runtime-api.js", async () => { +vi.mock("../../../../native-plugins/matrix/runtime-api.js", async () => { const actual = await vi.importActual< - typeof import("../../../../extensions/matrix/runtime-api.js") - >("../../../../extensions/matrix/runtime-api.js"); + typeof import("../../../../native-plugins/matrix/runtime-api.js") + >("../../../../native-plugins/matrix/runtime-api.js"); return { ...actual, sendMessageMatrix: sendMessageMatrixMock, diff --git a/src/channels/plugins/contracts/session-binding.contract.test.ts b/src/channels/plugins/contracts/session-binding.contract.test.ts index 87f7922c3e4..1e839e971fd 100644 --- a/src/channels/plugins/contracts/session-binding.contract.test.ts +++ b/src/channels/plugins/contracts/session-binding.contract.test.ts @@ -1,16 +1,16 @@ import { beforeEach, describe, vi } from "vitest"; -import { __testing as discordThreadBindingTesting } from "../../../../extensions/discord/src/monitor/thread-bindings.manager.js"; -import { __testing as feishuThreadBindingTesting } from "../../../../extensions/feishu/src/thread-bindings.js"; -import { resetMatrixThreadBindingsForTests } from "../../../../extensions/matrix/api.js"; -import { __testing as telegramThreadBindingTesting } from "../../../../extensions/telegram/src/thread-bindings.js"; +import { __testing as discordThreadBindingTesting } from "../../../../native-plugins/discord/src/monitor/thread-bindings.manager.js"; +import { __testing as feishuThreadBindingTesting } from "../../../../native-plugins/feishu/src/thread-bindings.js"; +import { resetMatrixThreadBindingsForTests } from "../../../../native-plugins/matrix/api.js"; +import { __testing as telegramThreadBindingTesting } from "../../../../native-plugins/telegram/src/thread-bindings.js"; import { __testing as sessionBindingTesting } from "../../../infra/outbound/session-binding-service.js"; import { sessionBindingContractRegistry } from "./registry.js"; import { installSessionBindingContractSuite } from "./suites.js"; -vi.mock("../../../../extensions/matrix/src/matrix/send.js", async () => { +vi.mock("../../../../native-plugins/matrix/src/matrix/send.js", async () => { const actual = await vi.importActual< - typeof import("../../../../extensions/matrix/src/matrix/send.js") - >("../../../../extensions/matrix/src/matrix/send.js"); + typeof import("../../../../native-plugins/matrix/src/matrix/send.js") + >("../../../../native-plugins/matrix/src/matrix/send.js"); return { ...actual, sendMessageMatrix: vi.fn( diff --git a/src/channels/plugins/message-capability-matrix.test.ts b/src/channels/plugins/message-capability-matrix.test.ts index 459193d0792..888e3dc305e 100644 --- a/src/channels/plugins/message-capability-matrix.test.ts +++ b/src/channels/plugins/message-capability-matrix.test.ts @@ -5,7 +5,7 @@ import type { ChannelMessageActionAdapter, ChannelPlugin } from "./types.js"; const telegramDescribeMessageToolMock = vi.fn(); const discordDescribeMessageToolMock = vi.fn(); -vi.mock("../../../extensions/telegram/src/runtime.js", () => ({ +vi.mock("../../../native-plugins/telegram/src/runtime.js", () => ({ getTelegramRuntime: () => ({ channel: { telegram: { @@ -17,7 +17,7 @@ vi.mock("../../../extensions/telegram/src/runtime.js", () => ({ }), })); -vi.mock("../../../extensions/discord/src/runtime.js", () => ({ +vi.mock("../../../native-plugins/discord/src/runtime.js", () => ({ getDiscordRuntime: () => ({ channel: { discord: { @@ -29,13 +29,13 @@ vi.mock("../../../extensions/discord/src/runtime.js", () => ({ }), })); -const { slackPlugin } = await import("../../../extensions/slack/src/channel.js"); -const { telegramPlugin } = await import("../../../extensions/telegram/src/channel.js"); -const { discordPlugin } = await import("../../../extensions/discord/src/channel.js"); -const { mattermostPlugin } = await import("../../../extensions/mattermost/src/channel.js"); -const { feishuPlugin } = await import("../../../extensions/feishu/src/channel.js"); -const { msteamsPlugin } = await import("../../../extensions/msteams/src/channel.js"); -const { zaloPlugin } = await import("../../../extensions/zalo/src/channel.js"); +const { slackPlugin } = await import("../../../native-plugins/slack/src/channel.js"); +const { telegramPlugin } = await import("../../../native-plugins/telegram/src/channel.js"); +const { discordPlugin } = await import("../../../native-plugins/discord/src/channel.js"); +const { mattermostPlugin } = await import("../../../native-plugins/mattermost/src/channel.js"); +const { feishuPlugin } = await import("../../../native-plugins/feishu/src/channel.js"); +const { msteamsPlugin } = await import("../../../native-plugins/msteams/src/channel.js"); +const { zaloPlugin } = await import("../../../native-plugins/zalo/src/channel.js"); describe("channel action capability matrix", () => { afterEach(() => { diff --git a/src/channels/plugins/outbound/slack.test.ts b/src/channels/plugins/outbound/slack.test.ts index 7a13616bfbf..5033f458b61 100644 --- a/src/channels/plugins/outbound/slack.test.ts +++ b/src/channels/plugins/outbound/slack.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import type { OpenClawConfig } from "../../../config/config.js"; -vi.mock("../../../../extensions/slack/src/send.js", () => ({ +vi.mock("../../../../native-plugins/slack/src/send.js", () => ({ sendMessageSlack: vi.fn().mockResolvedValue({ messageId: "1234.5678", channelId: "C123" }), })); @@ -10,7 +10,7 @@ vi.mock("openclaw/plugin-sdk/plugin-runtime", () => ({ })); import { getGlobalHookRunner } from "openclaw/plugin-sdk/plugin-runtime"; -import { sendMessageSlack } from "../../../../extensions/slack/src/send.js"; +import { sendMessageSlack } from "../../../../native-plugins/slack/src/send.js"; import { slackOutbound } from "../../../../test/channel-outbounds.js"; type SlackSendTextCtx = { diff --git a/src/channels/plugins/plugins-channel.test.ts b/src/channels/plugins/plugins-channel.test.ts index bfd2c4ff556..10beb835131 100644 --- a/src/channels/plugins/plugins-channel.test.ts +++ b/src/channels/plugins/plugins-channel.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from "vitest"; -import { normalizeSignalAccountInput } from "../../../extensions/signal/src/setup-surface.js"; +import { normalizeSignalAccountInput } from "../../../native-plugins/signal/src/setup-surface.js"; import { telegramOutbound, whatsappOutbound } from "../../../test/channel-outbounds.js"; import type { OpenClawConfig } from "../../config/config.js"; import { normalizeIMessageMessagingTarget } from "./normalize/imessage.js"; diff --git a/src/channels/plugins/plugins-core.test.ts b/src/channels/plugins/plugins-core.test.ts index 641527c3cbd..3359cdcdbdc 100644 --- a/src/channels/plugins/plugins-core.test.ts +++ b/src/channels/plugins/plugins-core.test.ts @@ -5,26 +5,26 @@ import { afterEach, beforeEach, describe, expect, expectTypeOf, it } from "vites import { listDiscordDirectoryGroupsFromConfig, listDiscordDirectoryPeersFromConfig, -} from "../../../extensions/discord/src/directory-config.js"; -import type { DiscordProbe } from "../../../extensions/discord/src/probe.js"; -import type { DiscordTokenResolution } from "../../../extensions/discord/src/token.js"; -import type { IMessageProbe } from "../../../extensions/imessage/src/probe.js"; -import type { SignalProbe } from "../../../extensions/signal/src/probe.js"; +} from "../../../native-plugins/discord/src/directory-config.js"; +import type { DiscordProbe } from "../../../native-plugins/discord/src/probe.js"; +import type { DiscordTokenResolution } from "../../../native-plugins/discord/src/token.js"; +import type { IMessageProbe } from "../../../native-plugins/imessage/src/probe.js"; +import type { SignalProbe } from "../../../native-plugins/signal/src/probe.js"; import { listSlackDirectoryGroupsFromConfig, listSlackDirectoryPeersFromConfig, -} from "../../../extensions/slack/src/directory-config.js"; -import type { SlackProbe } from "../../../extensions/slack/src/probe.js"; +} from "../../../native-plugins/slack/src/directory-config.js"; +import type { SlackProbe } from "../../../native-plugins/slack/src/probe.js"; import { listTelegramDirectoryGroupsFromConfig, listTelegramDirectoryPeersFromConfig, -} from "../../../extensions/telegram/src/directory-config.js"; -import type { TelegramProbe } from "../../../extensions/telegram/src/probe.js"; -import type { TelegramTokenResolution } from "../../../extensions/telegram/src/token.js"; +} from "../../../native-plugins/telegram/src/directory-config.js"; +import type { TelegramProbe } from "../../../native-plugins/telegram/src/probe.js"; +import type { TelegramTokenResolution } from "../../../native-plugins/telegram/src/token.js"; import { listWhatsAppDirectoryGroupsFromConfig, listWhatsAppDirectoryPeersFromConfig, -} from "../../../extensions/whatsapp/src/directory-config.js"; +} from "../../../native-plugins/whatsapp/src/directory-config.js"; import type { OpenClawConfig } from "../../config/config.js"; import type { LineProbeResult } from "../../line/types.js"; import { setActivePluginRegistry } from "../../plugins/runtime.js"; @@ -162,14 +162,14 @@ describe("channel plugin catalog", () => { it("preserves plugin ids when they differ from channel ids", () => { const stateDir = fs.mkdtempSync(path.join(os.tmpdir(), "openclaw-channel-catalog-state-")); - const pluginDir = path.join(stateDir, "extensions", "demo-channel-plugin"); + const pluginDir = path.join(stateDir, "plugins", "demo-channel-plugin"); fs.mkdirSync(pluginDir, { recursive: true }); fs.writeFileSync( path.join(pluginDir, "package.json"), JSON.stringify({ name: "@vendor/demo-channel-plugin", openclaw: { - extensions: ["./index.js"], + plugins: ["./index.js"], channel: { id: "demo-channel", label: "Demo Channel", @@ -282,7 +282,7 @@ describe("channel plugin catalog", () => { it("includes bundled metadata-only channel entries even when the runtime entrypoint is omitted", () => { const packageRoot = fs.mkdtempSync(path.join(os.tmpdir(), "openclaw-bundled-catalog-")); - const bundledDir = path.join(packageRoot, "dist", "extensions", "whatsapp"); + const bundledDir = path.join(packageRoot, "dist", "native-plugins", "whatsapp"); fs.mkdirSync(bundledDir, { recursive: true }); fs.writeFileSync( path.join(packageRoot, "package.json"), @@ -294,7 +294,7 @@ describe("channel plugin catalog", () => { JSON.stringify({ name: "@openclaw/whatsapp", openclaw: { - extensions: ["./index.js"], + plugins: ["./index.js"], channel: { id: "whatsapp", label: "WhatsApp", @@ -320,7 +320,7 @@ describe("channel plugin catalog", () => { const entry = listChannelPluginCatalogEntries({ env: { ...process.env, - OPENCLAW_BUNDLED_PLUGINS_DIR: path.join(packageRoot, "dist", "extensions"), + OPENCLAW_BUNDLED_PLUGINS_DIR: path.join(packageRoot, "dist", "native-plugins"), }, }).find((item) => item.id === "whatsapp"); diff --git a/src/channels/plugins/target-parsing.ts b/src/channels/plugins/target-parsing.ts index 7efa740de37..56c7bbf998b 100644 --- a/src/channels/plugins/target-parsing.ts +++ b/src/channels/plugins/target-parsing.ts @@ -1,5 +1,5 @@ -import { parseDiscordTarget } from "../../../extensions/discord/api.js"; -import { parseTelegramTarget } from "../../../extensions/telegram/api.js"; +import { parseDiscordTarget } from "../../../native-plugins/discord/api.js"; +import { parseTelegramTarget } from "../../../native-plugins/telegram/api.js"; import type { ChatType } from "../chat-type.js"; import { normalizeChatChannelId } from "../registry.js"; import { getChannelPlugin, normalizeChannelId } from "./registry.js"; diff --git a/src/channels/plugins/types.core.ts b/src/channels/plugins/types.core.ts index f7275d81ed2..91b9cc143a8 100644 --- a/src/channels/plugins/types.core.ts +++ b/src/channels/plugins/types.core.ts @@ -326,7 +326,7 @@ export type ChannelThreadingAdapter = { allowExplicitReplyTagsWhenOff?: boolean; /** * Deprecated alias for allowExplicitReplyTagsWhenOff. - * Kept for compatibility with older extensions/docks. + * Kept for compatibility with older native-plugins/docks. */ allowTagsWhenOff?: boolean; buildToolContext?: (params: { diff --git a/src/cli/npm-resolution.test.ts b/src/cli/npm-resolution.test.ts index e33e897c61b..d30b83d706e 100644 --- a/src/cli/npm-resolution.test.ts +++ b/src/cli/npm-resolution.test.ts @@ -67,7 +67,7 @@ describe("npm-resolution helpers", () => { expect( buildNpmInstallRecordFields({ spec: "@openclaw/plugin-alpha@1.2.3", - installPath: "/tmp/openclaw/extensions/alpha", + installPath: "/tmp/openclaw/native-plugins/alpha", version: "1.2.3", resolution: { name: "@openclaw/plugin-alpha", @@ -79,7 +79,7 @@ describe("npm-resolution helpers", () => { ).toEqual({ source: "npm", spec: "@openclaw/plugin-alpha@1.2.3", - installPath: "/tmp/openclaw/extensions/alpha", + installPath: "/tmp/openclaw/native-plugins/alpha", version: "1.2.3", resolvedName: "@openclaw/plugin-alpha", resolvedVersion: "1.2.3", @@ -112,7 +112,7 @@ describe("npm-resolution helpers", () => { const record = resolvePinnedNpmInstallRecord({ rawSpec: "@openclaw/plugin-alpha@latest", pin: true, - installPath: "/tmp/openclaw/extensions/alpha", + installPath: "/tmp/openclaw/native-plugins/alpha", version: "1.2.3", resolution: { name: "@openclaw/plugin-alpha", @@ -126,7 +126,7 @@ describe("npm-resolution helpers", () => { expect(record).toEqual({ source: "npm", spec: "@openclaw/plugin-alpha@1.2.3", - installPath: "/tmp/openclaw/extensions/alpha", + installPath: "/tmp/openclaw/native-plugins/alpha", version: "1.2.3", resolvedName: "@openclaw/plugin-alpha", resolvedVersion: "1.2.3", @@ -144,7 +144,7 @@ describe("npm-resolution helpers", () => { const record = resolvePinnedNpmInstallRecordForCli( "@openclaw/plugin-alpha@latest", true, - "/tmp/openclaw/extensions/alpha", + "/tmp/openclaw/native-plugins/alpha", "1.2.3", undefined, (message) => logs.push(message), @@ -154,7 +154,7 @@ describe("npm-resolution helpers", () => { expect(record).toEqual({ source: "npm", spec: "@openclaw/plugin-alpha@latest", - installPath: "/tmp/openclaw/extensions/alpha", + installPath: "/tmp/openclaw/native-plugins/alpha", version: "1.2.3", resolvedName: undefined, resolvedVersion: undefined, diff --git a/src/cli/plugin-install-plan.test.ts b/src/cli/plugin-install-plan.test.ts index 9aca36493d0..9b02ffdb7e8 100644 --- a/src/cli/plugin-install-plan.test.ts +++ b/src/cli/plugin-install-plan.test.ts @@ -10,7 +10,7 @@ describe("plugin install plan helpers", () => { it("prefers bundled plugin for bare plugin-id specs", () => { const findBundledSource = vi.fn().mockReturnValue({ pluginId: "voice-call", - localPath: "/tmp/extensions/voice-call", + localPath: "/tmp/native-plugins/voice-call", npmSpec: "@openclaw/voice-call", }); @@ -42,7 +42,7 @@ describe("plugin install plan helpers", () => { if (kind === "pluginId" && value === "voice-call") { return { pluginId: "voice-call", - localPath: "/tmp/extensions/voice-call", + localPath: "/tmp/native-plugins/voice-call", npmSpec: "@openclaw/voice-call", }; } @@ -56,7 +56,7 @@ describe("plugin install plan helpers", () => { }); expect(findBundledSource).toHaveBeenCalledWith({ kind: "pluginId", value: "voice-call" }); - expect(result?.bundledSource.localPath).toBe("/tmp/extensions/voice-call"); + expect(result?.bundledSource.localPath).toBe("/tmp/native-plugins/voice-call"); }); it("rejects npm-spec matches that resolve to a different plugin id", () => { @@ -66,7 +66,7 @@ describe("plugin install plan helpers", () => { if (kind === "npmSpec") { return { pluginId: "not-voice-call", - localPath: "/tmp/extensions/not-voice-call", + localPath: "/tmp/native-plugins/not-voice-call", npmSpec: "@openclaw/voice-call", }; } @@ -85,7 +85,7 @@ describe("plugin install plan helpers", () => { it("uses npm-spec bundled fallback only for package-not-found", () => { const findBundledSource = vi.fn().mockReturnValue({ pluginId: "voice-call", - localPath: "/tmp/extensions/voice-call", + localPath: "/tmp/native-plugins/voice-call", npmSpec: "@openclaw/voice-call", }); const result = resolveBundledInstallPlanForNpmFailure({ diff --git a/src/cli/plugins-cli.test.ts b/src/cli/plugins-cli.test.ts index 4efb1990354..054831862b6 100644 --- a/src/cli/plugins-cli.test.ts +++ b/src/cli/plugins-cli.test.ts @@ -216,7 +216,7 @@ describe("plugins cli", () => { installs: { alpha: { source: "marketplace", - installPath: "/tmp/openclaw-state/extensions/alpha", + installPath: "/tmp/openclaw-state/native-plugins/alpha", }, }, }, @@ -226,7 +226,7 @@ describe("plugins cli", () => { installPluginFromMarketplace.mockResolvedValue({ ok: true, pluginId: "alpha", - targetDir: "/tmp/openclaw-state/extensions/alpha", + targetDir: "/tmp/openclaw-state/native-plugins/alpha", version: "1.2.3", marketplaceName: "Claude", marketplaceSource: "local/repo", @@ -262,8 +262,8 @@ describe("plugins cli", () => { installs: { alpha: { source: "path", - sourcePath: "/tmp/openclaw-state/extensions/alpha", - installPath: "/tmp/openclaw-state/extensions/alpha", + sourcePath: "/tmp/openclaw-state/native-plugins/alpha", + installPath: "/tmp/openclaw-state/native-plugins/alpha", }, }, }, @@ -289,8 +289,8 @@ describe("plugins cli", () => { installs: { alpha: { source: "path", - sourcePath: "/tmp/openclaw-state/extensions/alpha", - installPath: "/tmp/openclaw-state/extensions/alpha", + sourcePath: "/tmp/openclaw-state/native-plugins/alpha", + installPath: "/tmp/openclaw-state/native-plugins/alpha", }, }, }, diff --git a/src/cli/plugins-cli.ts b/src/cli/plugins-cli.ts index 93e3d22c8d5..7b74ab41278 100644 --- a/src/cli/plugins-cli.ts +++ b/src/cli/plugins-cli.ts @@ -554,7 +554,7 @@ async function runPluginInstallCommand(params: { export function registerPluginsCli(program: Command) { const plugins = program .command("plugins") - .description("Manage OpenClaw plugins and extensions") + .description("Manage OpenClaw plugins and native plugins") .addHelpText( "after", () => @@ -933,7 +933,7 @@ export function registerPluginsCli(program: Command) { .action(async (id: string, opts: PluginUninstallOptions) => { const cfg = loadConfig(); const report = buildPluginStatusReport({ config: cfg }); - const extensionsDir = path.join(resolveStateDir(process.env, os.homedir), "extensions"); + const pluginsDir = path.join(resolveStateDir(process.env, os.homedir), "plugins"); const keepFiles = Boolean(opts.keepFiles || opts.keepConfig); if (opts.keepConfig) { @@ -988,7 +988,7 @@ export function registerPluginsCli(program: Command) { pluginId, hasInstall, installRecord: install, - extensionsDir, + extensionsDir: pluginsDir, }) : null; if (deleteTarget) { @@ -1018,7 +1018,7 @@ export function registerPluginsCli(program: Command) { config: cfg, pluginId, deleteFiles: !keepFiles, - extensionsDir, + extensionsDir: pluginsDir, }); if (!result.ok) { diff --git a/src/cli/program/register.subclis.ts b/src/cli/program/register.subclis.ts index 5ace8c10441..53a626507f0 100644 --- a/src/cli/program/register.subclis.ts +++ b/src/cli/program/register.subclis.ts @@ -236,7 +236,7 @@ const entries: SubCliEntry[] = [ }, { name: "plugins", - description: "Manage OpenClaw plugins and extensions", + description: "Manage OpenClaw plugins and native plugins", hasSubcommands: true, register: async (program) => { const mod = await import("../plugins-cli.js"); diff --git a/src/cli/program/subcli-descriptors.ts b/src/cli/program/subcli-descriptors.ts index 4011e706b2b..bb2a2873bb3 100644 --- a/src/cli/program/subcli-descriptors.ts +++ b/src/cli/program/subcli-descriptors.ts @@ -95,7 +95,7 @@ export const SUB_CLI_DESCRIPTORS = [ }, { name: "plugins", - description: "Manage OpenClaw plugins and extensions", + description: "Manage OpenClaw plugins and native plugins", hasSubcommands: true, }, { diff --git a/src/commands/agents.bind.matrix.integration.test.ts b/src/commands/agents.bind.matrix.integration.test.ts index 416d9f88250..642b4b69436 100644 --- a/src/commands/agents.bind.matrix.integration.test.ts +++ b/src/commands/agents.bind.matrix.integration.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { matrixPlugin } from "../../extensions/matrix/src/channel.js"; +import { matrixPlugin } from "../../native-plugins/matrix/src/channel.js"; import { setActivePluginRegistry } from "../plugins/runtime.js"; import { createTestRegistry } from "../test-utils/channel-plugins.js"; import { agentsBindCommand } from "./agents.js"; diff --git a/src/commands/auth-choice.test.ts b/src/commands/auth-choice.test.ts index bc15dbddf1a..75920353186 100644 --- a/src/commands/auth-choice.test.ts +++ b/src/commands/auth-choice.test.ts @@ -1,30 +1,30 @@ import fs from "node:fs/promises"; import type { OAuthCredentials } from "@mariozechner/pi-ai"; import { afterEach, describe, expect, it, vi } from "vitest"; -import anthropicPlugin from "../../extensions/anthropic/index.js"; -import chutesPlugin from "../../extensions/chutes/index.js"; -import cloudflareAiGatewayPlugin from "../../extensions/cloudflare-ai-gateway/index.js"; -import googlePlugin from "../../extensions/google/index.js"; -import huggingfacePlugin from "../../extensions/huggingface/index.js"; -import kimiCodingPlugin from "../../extensions/kimi-coding/index.js"; -import minimaxPlugin from "../../extensions/minimax/index.js"; -import mistralPlugin from "../../extensions/mistral/index.js"; -import moonshotPlugin from "../../extensions/moonshot/index.js"; -import ollamaPlugin from "../../extensions/ollama/index.js"; -import openAIPlugin from "../../extensions/openai/index.js"; -import opencodeGoPlugin from "../../extensions/opencode-go/index.js"; -import opencodePlugin from "../../extensions/opencode/index.js"; -import openrouterPlugin from "../../extensions/openrouter/index.js"; -import qianfanPlugin from "../../extensions/qianfan/index.js"; -import qwenPortalAuthPlugin from "../../extensions/qwen-portal-auth/index.js"; -import syntheticPlugin from "../../extensions/synthetic/index.js"; -import togetherPlugin from "../../extensions/together/index.js"; -import venicePlugin from "../../extensions/venice/index.js"; -import vercelAiGatewayPlugin from "../../extensions/vercel-ai-gateway/index.js"; -import xaiPlugin from "../../extensions/xai/index.js"; -import xiaomiPlugin from "../../extensions/xiaomi/index.js"; -import { setDetectZaiEndpointForTesting } from "../../extensions/zai/detect.js"; -import zaiPlugin from "../../extensions/zai/index.js"; +import anthropicPlugin from "../../native-plugins/anthropic/index.js"; +import chutesPlugin from "../../native-plugins/chutes/index.js"; +import cloudflareAiGatewayPlugin from "../../native-plugins/cloudflare-ai-gateway/index.js"; +import googlePlugin from "../../native-plugins/google/index.js"; +import huggingfacePlugin from "../../native-plugins/huggingface/index.js"; +import kimiCodingPlugin from "../../native-plugins/kimi-coding/index.js"; +import minimaxPlugin from "../../native-plugins/minimax/index.js"; +import mistralPlugin from "../../native-plugins/mistral/index.js"; +import moonshotPlugin from "../../native-plugins/moonshot/index.js"; +import ollamaPlugin from "../../native-plugins/ollama/index.js"; +import openAIPlugin from "../../native-plugins/openai/index.js"; +import opencodeGoPlugin from "../../native-plugins/opencode-go/index.js"; +import opencodePlugin from "../../native-plugins/opencode/index.js"; +import openrouterPlugin from "../../native-plugins/openrouter/index.js"; +import qianfanPlugin from "../../native-plugins/qianfan/index.js"; +import qwenPortalAuthPlugin from "../../native-plugins/qwen-portal-auth/index.js"; +import syntheticPlugin from "../../native-plugins/synthetic/index.js"; +import togetherPlugin from "../../native-plugins/together/index.js"; +import venicePlugin from "../../native-plugins/venice/index.js"; +import vercelAiGatewayPlugin from "../../native-plugins/vercel-ai-gateway/index.js"; +import xaiPlugin from "../../native-plugins/xai/index.js"; +import xiaomiPlugin from "../../native-plugins/xiaomi/index.js"; +import { setDetectZaiEndpointForTesting } from "../../native-plugins/zai/detect.js"; +import zaiPlugin from "../../native-plugins/zai/index.js"; import { resolveAgentDir } from "../agents/agent-scope.js"; import { resolveAgentModelPrimaryValue } from "../config/model-input.js"; import { diff --git a/src/commands/channel-setup/plugin-install.test.ts b/src/commands/channel-setup/plugin-install.test.ts index 88c70bc26ef..ebfcce7da18 100644 --- a/src/commands/channel-setup/plugin-install.test.ts +++ b/src/commands/channel-setup/plugin-install.test.ts @@ -82,7 +82,7 @@ const baseEntry: ChannelPluginCatalogEntry = { }, install: { npmSpec: "@openclaw/zalo", - localPath: "extensions/zalo", + localPath: "native-plugins/zalo", }, }; @@ -120,7 +120,7 @@ async function runInitialValueForChannel(channel: "dev" | "beta") { function expectPluginLoadedFromLocalPath( result: Awaited>, ) { - const expectedPath = path.resolve(process.cwd(), "extensions/zalo"); + const expectedPath = path.resolve(process.cwd(), "native-plugins/zalo"); expect(result.installed).toBe(true); expect(result.cfg.plugins?.load?.paths).toContain(expectedPath); } @@ -221,7 +221,7 @@ describe("ensureChannelSetupPluginInstalled", () => { "zalo", { pluginId: "zalo", - localPath: "/opt/openclaw/extensions/zalo", + localPath: "/opt/openclaw/native-plugins/zalo", npmSpec: "@openclaw/zalo", }, ], @@ -241,7 +241,7 @@ describe("ensureChannelSetupPluginInstalled", () => { options: expect.arrayContaining([ expect.objectContaining({ value: "local", - hint: "/opt/openclaw/extensions/zalo", + hint: "/opt/openclaw/native-plugins/zalo", }), ]), }), diff --git a/src/commands/channel-test-helpers.ts b/src/commands/channel-test-helpers.ts index 67559604100..6d79ee4e778 100644 --- a/src/commands/channel-test-helpers.ts +++ b/src/commands/channel-test-helpers.ts @@ -1,7 +1,7 @@ -import { matrixPlugin, setMatrixRuntime } from "../../extensions/matrix/index.js"; -import { msteamsPlugin } from "../../extensions/msteams/index.js"; -import { nostrPlugin } from "../../extensions/nostr/index.js"; -import { tlonPlugin } from "../../extensions/tlon/index.js"; +import { matrixPlugin, setMatrixRuntime } from "../../native-plugins/matrix/index.js"; +import { msteamsPlugin } from "../../native-plugins/msteams/index.js"; +import { nostrPlugin } from "../../native-plugins/nostr/index.js"; +import { tlonPlugin } from "../../native-plugins/tlon/index.js"; import { bundledChannelPlugins } from "../channels/plugins/bundled.js"; import { setActivePluginRegistry } from "../plugins/runtime.js"; import { createTestRegistry } from "../test-utils/channel-plugins.js"; diff --git a/src/commands/channels.mock-harness.ts b/src/commands/channels.mock-harness.ts index 6a448a9750e..a22d7712ae8 100644 --- a/src/commands/channels.mock-harness.ts +++ b/src/commands/channels.mock-harness.ts @@ -24,8 +24,8 @@ vi.mock("../config/config.js", async (importOriginal) => { }; }); -vi.mock("../../extensions/telegram/api.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("../../native-plugins/telegram/api.js", async (importOriginal) => { + const actual = await importOriginal(); return { ...actual, deleteTelegramUpdateOffset: offsetMocks.deleteTelegramUpdateOffset, diff --git a/src/commands/channels.surfaces-signal-runtime-errors-channels-status-output.test.ts b/src/commands/channels.surfaces-signal-runtime-errors-channels-status-output.test.ts index 83ef8718b0a..e269b29941e 100644 --- a/src/commands/channels.surfaces-signal-runtime-errors-channels-status-output.test.ts +++ b/src/commands/channels.surfaces-signal-runtime-errors-channels-status-output.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it } from "vitest"; -import { signalPlugin } from "../../extensions/signal/src/channel.js"; +import { signalPlugin } from "../../native-plugins/signal/src/channel.js"; import { setActivePluginRegistry } from "../plugins/runtime.js"; import { createTestRegistry } from "../test-utils/channel-plugins.js"; import { createIMessageTestPlugin } from "../test-utils/imessage-test-plugin.js"; diff --git a/src/commands/doctor-config-flow.test.ts b/src/commands/doctor-config-flow.test.ts index 4a461c58267..6c4bdea3a3a 100644 --- a/src/commands/doctor-config-flow.test.ts +++ b/src/commands/doctor-config-flow.test.ts @@ -1,7 +1,7 @@ import fs from "node:fs/promises"; import path from "node:path"; import { describe, expect, it, vi } from "vitest"; -import { resolveMatrixAccountStorageRoot } from "../../extensions/matrix/runtime-api.js"; +import { resolveMatrixAccountStorageRoot } from "../../native-plugins/matrix/runtime-api.js"; import { withTempHome } from "../../test/helpers/temp-home.js"; import * as noteModule from "../terminal/note.js"; import { loadAndMaybeMigrateDoctorConfig } from "./doctor-config-flow.js"; diff --git a/src/commands/doctor-config-flow.ts b/src/commands/doctor-config-flow.ts index e0599eca1bb..babb1f9ccee 100644 --- a/src/commands/doctor-config-flow.ts +++ b/src/commands/doctor-config-flow.ts @@ -374,7 +374,7 @@ async function collectMatrixInstallPathWarnings(cfg: OpenClawConfig): Promise `- ${entry}`); } diff --git a/src/commands/doctor.e2e-harness.ts b/src/commands/doctor.e2e-harness.ts index 32615377773..66d02be76b9 100644 --- a/src/commands/doctor.e2e-harness.ts +++ b/src/commands/doctor.e2e-harness.ts @@ -259,7 +259,7 @@ vi.mock("../pairing/pairing-store.js", () => ({ upsertChannelPairingRequest: vi.fn().mockResolvedValue({ code: "000000", created: false }), })); -vi.mock("../../extensions/telegram/api.js", () => ({ +vi.mock("../../native-plugins/telegram/api.js", () => ({ resolveTelegramToken: vi.fn(() => ({ token: "", source: "none" })), })); diff --git a/src/commands/health.command.coverage.test.ts b/src/commands/health.command.coverage.test.ts index 419aef54447..0c8952a3701 100644 --- a/src/commands/health.command.coverage.test.ts +++ b/src/commands/health.command.coverage.test.ts @@ -19,7 +19,7 @@ vi.mock("../gateway/call.js", () => ({ callGateway: (...args: unknown[]) => callGatewayMock(...args), })); -vi.mock("../../extensions/whatsapp/src/auth-store.js", () => ({ +vi.mock("../../native-plugins/whatsapp/src/auth-store.js", () => ({ webAuthExists: vi.fn(async () => true), getWebAuthAgeMs: vi.fn(() => 0), logWebSelfId: (...args: unknown[]) => logWebSelfIdMock(...args), diff --git a/src/commands/health.snapshot.test.ts b/src/commands/health.snapshot.test.ts index 03055c8eb17..0b3c71002f2 100644 --- a/src/commands/health.snapshot.test.ts +++ b/src/commands/health.snapshot.test.ts @@ -2,7 +2,7 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { telegramPlugin } from "../../extensions/telegram/src/channel.js"; +import { telegramPlugin } from "../../native-plugins/telegram/src/channel.js"; import { setActivePluginRegistry } from "../plugins/runtime.js"; import { createTestRegistry } from "../test-utils/channel-plugins.js"; import type { HealthSummary } from "./health.js"; @@ -29,15 +29,16 @@ vi.mock("../config/sessions.js", () => ({ updateLastRoute: vi.fn().mockResolvedValue(undefined), })); -vi.mock("../../extensions/telegram/src/fetch.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("../../native-plugins/telegram/src/fetch.js", async (importOriginal) => { + const actual = + await importOriginal(); return { ...actual, resolveTelegramFetch: () => fetch, }; }); -vi.mock("../../extensions/whatsapp/src/auth-store.js", () => ({ +vi.mock("../../native-plugins/whatsapp/src/auth-store.js", () => ({ webAuthExists: vi.fn(async () => true), getWebAuthAgeMs: vi.fn(() => 1234), readWebSelfId: vi.fn(() => ({ e164: null, jid: null })), @@ -110,12 +111,12 @@ async function runSuccessfulTelegramProbe( } let createPluginRuntime: typeof import("../plugins/runtime/index.js").createPluginRuntime; -let setTelegramRuntime: typeof import("../../extensions/telegram/src/runtime.js").setTelegramRuntime; +let setTelegramRuntime: typeof import("../../native-plugins/telegram/src/runtime.js").setTelegramRuntime; describe("getHealthSnapshot", () => { beforeAll(async () => { ({ createPluginRuntime } = await import("../plugins/runtime/index.js")); - ({ setTelegramRuntime } = await import("../../extensions/telegram/src/runtime.js")); + ({ setTelegramRuntime } = await import("../../native-plugins/telegram/src/runtime.js")); }); beforeEach(() => { diff --git a/src/commands/message.test.ts b/src/commands/message.test.ts index 29df194cf2d..b40f8a2d65d 100644 --- a/src/commands/message.test.ts +++ b/src/commands/message.test.ts @@ -37,35 +37,35 @@ vi.mock("../gateway/call.js", () => ({ })); const webAuthExists = vi.hoisted(() => vi.fn(async () => false)); -vi.mock("../../extensions/whatsapp/src/session.js", () => ({ +vi.mock("../../native-plugins/whatsapp/src/session.js", () => ({ webAuthExists, })); const handleDiscordAction = vi.hoisted(() => vi.fn(async (..._args: unknown[]) => ({ details: { ok: true } })), ); -vi.mock("../../extensions/discord/src/actions/runtime.js", () => ({ +vi.mock("../../native-plugins/discord/src/actions/runtime.js", () => ({ handleDiscordAction, })); const handleSlackAction = vi.hoisted(() => vi.fn(async (..._args: unknown[]) => ({ details: { ok: true } })), ); -vi.mock("../../extensions/slack/runtime-api.js", () => ({ +vi.mock("../../native-plugins/slack/runtime-api.js", () => ({ handleSlackAction, })); const handleTelegramAction = vi.hoisted(() => vi.fn(async (..._args: unknown[]) => ({ details: { ok: true } })), ); -vi.mock("../../extensions/telegram/src/action-runtime.js", () => ({ +vi.mock("../../native-plugins/telegram/src/action-runtime.js", () => ({ handleTelegramAction, })); const handleWhatsAppAction = vi.hoisted(() => vi.fn(async (..._args: unknown[]) => ({ details: { ok: true } })), ); -vi.mock("../../extensions/whatsapp/runtime-api.js", () => ({ +vi.mock("../../native-plugins/whatsapp/runtime-api.js", () => ({ handleWhatsAppAction, })); diff --git a/src/commands/onboard-auth.config-core.kilocode.test.ts b/src/commands/onboard-auth.config-core.kilocode.test.ts index b27acab133a..18a5eddfc10 100644 --- a/src/commands/onboard-auth.config-core.kilocode.test.ts +++ b/src/commands/onboard-auth.config-core.kilocode.test.ts @@ -7,7 +7,7 @@ import { applyKilocodeConfig, KILOCODE_BASE_URL, KILOCODE_DEFAULT_MODEL_REF, -} from "../../extensions/kilocode/onboard.js"; +} from "../../native-plugins/kilocode/onboard.js"; import { resolveApiKeyForProvider, resolveEnvApiKey } from "../agents/model-auth.js"; import type { OpenClawConfig } from "../config/config.js"; import { resolveAgentModelPrimaryValue } from "../config/model-input.js"; diff --git a/src/commands/onboard-auth.config-gateways.ts b/src/commands/onboard-auth.config-gateways.ts index 4699481d79a..51a2a6565ec 100644 --- a/src/commands/onboard-auth.config-gateways.ts +++ b/src/commands/onboard-auth.config-gateways.ts @@ -2,9 +2,9 @@ export { applyCloudflareAiGatewayConfig, applyCloudflareAiGatewayProviderConfig, CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF, -} from "../../extensions/cloudflare-ai-gateway/onboard.js"; +} from "../../native-plugins/cloudflare-ai-gateway/onboard.js"; export { applyVercelAiGatewayConfig, applyVercelAiGatewayProviderConfig, VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF, -} from "../../extensions/vercel-ai-gateway/onboard.js"; +} from "../../native-plugins/vercel-ai-gateway/onboard.js"; diff --git a/src/commands/onboard-auth.test.ts b/src/commands/onboard-auth.test.ts index 87a50d23fb6..1fb98646ae2 100644 --- a/src/commands/onboard-auth.test.ts +++ b/src/commands/onboard-auth.test.ts @@ -6,35 +6,38 @@ import { afterEach, describe, expect, it } from "vitest"; import { applyMinimaxApiConfig, applyMinimaxApiProviderConfig, -} from "../../extensions/minimax/onboard.js"; +} from "../../native-plugins/minimax/onboard.js"; import { applyMistralConfig, applyMistralProviderConfig, -} from "../../extensions/mistral/onboard.js"; +} from "../../native-plugins/mistral/onboard.js"; import { applyOpencodeGoConfig, applyOpencodeGoProviderConfig, -} from "../../extensions/opencode-go/onboard.js"; +} from "../../native-plugins/opencode-go/onboard.js"; import { applyOpencodeZenConfig, applyOpencodeZenProviderConfig, -} from "../../extensions/opencode/onboard.js"; +} from "../../native-plugins/opencode/onboard.js"; import { applyOpenrouterConfig, applyOpenrouterProviderConfig, -} from "../../extensions/openrouter/onboard.js"; +} from "../../native-plugins/openrouter/onboard.js"; import { applySyntheticConfig, applySyntheticProviderConfig, SYNTHETIC_DEFAULT_MODEL_REF, -} from "../../extensions/synthetic/onboard.js"; +} from "../../native-plugins/synthetic/onboard.js"; import { applyXaiConfig, applyXaiProviderConfig, XAI_DEFAULT_MODEL_REF, -} from "../../extensions/xai/onboard.js"; -import { applyXiaomiConfig, applyXiaomiProviderConfig } from "../../extensions/xiaomi/onboard.js"; -import { applyZaiConfig, applyZaiProviderConfig } from "../../extensions/zai/onboard.js"; +} from "../../native-plugins/xai/onboard.js"; +import { + applyXiaomiConfig, + applyXiaomiProviderConfig, +} from "../../native-plugins/xiaomi/onboard.js"; +import { applyZaiConfig, applyZaiProviderConfig } from "../../native-plugins/zai/onboard.js"; import { SYNTHETIC_DEFAULT_MODEL_ID } from "../agents/synthetic-models.js"; import type { OpenClawConfig } from "../config/config.js"; import { diff --git a/src/commands/status.test.ts b/src/commands/status.test.ts index f84875c02b1..f50ef9ec1d0 100644 --- a/src/commands/status.test.ts +++ b/src/commands/status.test.ts @@ -288,7 +288,7 @@ vi.mock("../channels/plugins/index.js", () => ({ }, ] as unknown, })); -vi.mock("../../extensions/whatsapp/src/session.js", () => ({ +vi.mock("../../native-plugins/whatsapp/src/session.js", () => ({ webAuthExists: mocks.webAuthExists, getWebAuthAgeMs: mocks.getWebAuthAgeMs, readWebSelfId: mocks.readWebSelfId, diff --git a/src/config/schema.help.ts b/src/config/schema.help.ts index bcaec953d57..3fb720a45e1 100644 --- a/src/config/schema.help.ts +++ b/src/config/schema.help.ts @@ -976,7 +976,7 @@ export const FIELD_HELP: Record = { "plugins.installs.*.spec": "Original npm spec used for install (if source is npm).", "plugins.installs.*.sourcePath": "Original archive/path used for install (if any).", "plugins.installs.*.installPath": - "Resolved install directory (usually ~/.openclaw/extensions/).", + "Resolved install directory (usually ~/.openclaw/plugins/).", "plugins.installs.*.version": "Version recorded at install time (if available).", "plugins.installs.*.resolvedName": "Resolved npm package name from the fetched artifact.", "plugins.installs.*.resolvedVersion": diff --git a/src/config/sessions/explicit-session-key-normalization.ts b/src/config/sessions/explicit-session-key-normalization.ts index 7b5e80c3a56..bba596ac8dc 100644 --- a/src/config/sessions/explicit-session-key-normalization.ts +++ b/src/config/sessions/explicit-session-key-normalization.ts @@ -1,4 +1,4 @@ -import { normalizeExplicitDiscordSessionKey } from "../../../extensions/discord/session-key-api.js"; +import { normalizeExplicitDiscordSessionKey } from "../../../native-plugins/discord/session-key-api.js"; import type { MsgContext } from "../../auto-reply/templating.js"; type ExplicitSessionKeyNormalizer = (sessionKey: string, ctx: MsgContext) => string; diff --git a/src/cron/isolated-agent.delivery-target-thread-session.test.ts b/src/cron/isolated-agent.delivery-target-thread-session.test.ts index 68413f386b8..9131de26eb5 100644 --- a/src/cron/isolated-agent.delivery-target-thread-session.test.ts +++ b/src/cron/isolated-agent.delivery-target-thread-session.test.ts @@ -1,5 +1,5 @@ import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { parseTelegramTarget } from "../../extensions/telegram/src/targets.js"; +import { parseTelegramTarget } from "../../native-plugins/telegram/src/targets.js"; import type { OpenClawConfig } from "../config/config.js"; // Mock session store so we can control what entries exist. diff --git a/src/cron/isolated-agent.test-setup.ts b/src/cron/isolated-agent.test-setup.ts index c677230f3a2..cdf46c5dc40 100644 --- a/src/cron/isolated-agent.test-setup.ts +++ b/src/cron/isolated-agent.test-setup.ts @@ -1,5 +1,5 @@ import { vi } from "vitest"; -import { parseTelegramTarget } from "../../extensions/telegram/api.js"; +import { parseTelegramTarget } from "../../native-plugins/telegram/api.js"; import { signalOutbound, telegramOutbound } from "../../test/channel-outbounds.js"; import { loadModelCatalog } from "../agents/model-catalog.js"; import { runEmbeddedPiAgent } from "../agents/pi-embedded.js"; diff --git a/src/cron/isolated-agent/delivery-target.test.ts b/src/cron/isolated-agent/delivery-target.test.ts index 9914043b2ff..d02e0b13c86 100644 --- a/src/cron/isolated-agent/delivery-target.test.ts +++ b/src/cron/isolated-agent/delivery-target.test.ts @@ -21,11 +21,11 @@ vi.mock("../../pairing/pairing-store.js", () => ({ readChannelAllowFromStoreSync: vi.fn(() => []), })); -vi.mock("../../../extensions/whatsapp/src/accounts.js", () => ({ +vi.mock("../../../native-plugins/whatsapp/src/accounts.js", () => ({ resolveWhatsAppAccount: vi.fn(() => ({ allowFrom: [] })), })); -import { resolveWhatsAppAccount } from "../../../extensions/whatsapp/src/accounts.js"; +import { resolveWhatsAppAccount } from "../../../native-plugins/whatsapp/src/accounts.js"; import { loadSessionStore } from "../../config/sessions.js"; import { resolveMessageChannelSelection } from "../../infra/outbound/channel-selection.js"; import { maybeResolveIdLikeTarget } from "../../infra/outbound/target-resolver.js"; diff --git a/src/dockerfile.test.ts b/src/dockerfile.test.ts index 2570a8ed9dc..ddcd24e37af 100644 --- a/src/dockerfile.test.ts +++ b/src/dockerfile.test.ts @@ -41,7 +41,9 @@ describe("Dockerfile", () => { const dockerfile = await readFile(dockerfilePath, "utf8"); expect(dockerfile).toContain("FROM build AS runtime-assets"); expect(dockerfile).toContain("CI=true pnpm prune --prod"); - expect(dockerfile).not.toContain('npm install --prefix "extensions/$ext" --omit=dev --silent'); + expect(dockerfile).not.toContain( + 'npm install --prefix "native-plugins/$ext" --omit=dev --silent', + ); expect(dockerfile).toContain( "COPY --from=runtime-assets --chown=node:node /app/node_modules ./node_modules", ); diff --git a/src/gateway/client-callsites.guard.test.ts b/src/gateway/client-callsites.guard.test.ts index c32b5e21c45..0e2844c8a58 100644 --- a/src/gateway/client-callsites.guard.test.ts +++ b/src/gateway/client-callsites.guard.test.ts @@ -6,7 +6,7 @@ const GATEWAY_CLIENT_CONSTRUCTOR_PATTERN = /new\s+GatewayClient\s*\(/; const ALLOWED_GATEWAY_CLIENT_CALLSITES = new Set([ "src/acp/server.ts", - "extensions/discord/src/monitor/exec-approvals.ts", + "native-plugins/discord/src/monitor/exec-approvals.ts", "src/gateway/call.ts", "src/gateway/probe.ts", "src/node-host/runner.ts", diff --git a/src/gateway/server.agent.gateway-server-agent-b.test.ts b/src/gateway/server.agent.gateway-server-agent-b.test.ts index 61fff855a8f..7e23c8db403 100644 --- a/src/gateway/server.agent.gateway-server-agent-b.test.ts +++ b/src/gateway/server.agent.gateway-server-agent-b.test.ts @@ -3,7 +3,7 @@ import os from "node:os"; import path from "node:path"; import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; import { WebSocket } from "ws"; -import { whatsappPlugin } from "../../extensions/whatsapp/src/channel.js"; +import { whatsappPlugin } from "../../native-plugins/whatsapp/src/channel.js"; import type { ChannelPlugin } from "../channels/plugins/types.js"; import { emitAgentEvent, registerAgentRunContext } from "../infra/agent-events.js"; import { setRegistry } from "./server.agent.gateway-server-agent.mocks.js"; diff --git a/src/gateway/server.impl.ts b/src/gateway/server.impl.ts index 7a4c18b6593..94ce4fa5af6 100644 --- a/src/gateway/server.impl.ts +++ b/src/gateway/server.impl.ts @@ -538,7 +538,7 @@ export async function startGatewayServer( issue: matrixInstallPathIssue, pluginLabel: "Matrix", defaultInstallCommand: "openclaw plugins install @openclaw/matrix", - repoInstallCommand: "openclaw plugins install ./extensions/matrix", + repoInstallCommand: "openclaw plugins install ./native-plugins/matrix", formatCommand: formatCliCommand, }); log.warn( diff --git a/src/gateway/test-helpers.mocks.ts b/src/gateway/test-helpers.mocks.ts index bfd2603bc0a..d951c2229a1 100644 --- a/src/gateway/test-helpers.mocks.ts +++ b/src/gateway/test-helpers.mocks.ts @@ -574,7 +574,7 @@ vi.mock("../commands/health.js", () => ({ vi.mock("../commands/status.js", () => ({ getStatusSummary: vi.fn().mockResolvedValue({ ok: true }), })); -vi.mock("../../extensions/whatsapp/runtime-api.js", () => ({ +vi.mock("../../native-plugins/whatsapp/runtime-api.js", () => ({ sendMessageWhatsApp: (...args: unknown[]) => (hoisted.sendWhatsAppMock as (...args: unknown[]) => unknown)(...args), sendPollWhatsApp: (...args: unknown[]) => diff --git a/src/gateway/test-helpers.server.ts b/src/gateway/test-helpers.server.ts index eca3a107e69..25fac930e41 100644 --- a/src/gateway/test-helpers.server.ts +++ b/src/gateway/test-helpers.server.ts @@ -109,8 +109,8 @@ function applyGatewaySkipEnv() { process.env.OPENCLAW_SKIP_CRON = "1"; process.env.OPENCLAW_TEST_MINIMAL_GATEWAY = "1"; process.env.OPENCLAW_BUNDLED_PLUGINS_DIR = tempHome - ? path.join(tempHome, "openclaw-test-no-bundled-extensions") - : "openclaw-test-no-bundled-extensions"; + ? path.join(tempHome, "openclaw-test-no-bundled-native-plugins") + : "openclaw-test-no-bundled-native-plugins"; } async function resetGatewayTestState(options: { uniqueConfigRoot: boolean }) { diff --git a/src/infra/exec-approval-forwarder.test.ts b/src/infra/exec-approval-forwarder.test.ts index 2dfc1c97dbd..a5aa09c9579 100644 --- a/src/infra/exec-approval-forwarder.test.ts +++ b/src/infra/exec-approval-forwarder.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { discordPlugin } from "../../extensions/discord/src/channel.js"; -import { telegramPlugin } from "../../extensions/telegram/src/channel.js"; +import { discordPlugin } from "../../native-plugins/discord/src/channel.js"; +import { telegramPlugin } from "../../native-plugins/telegram/src/channel.js"; import type { OpenClawConfig } from "../config/config.js"; import { setActivePluginRegistry } from "../plugins/runtime.js"; import { createTestRegistry } from "../test-utils/channel-plugins.js"; diff --git a/src/infra/exec-approval-surface.test.ts b/src/infra/exec-approval-surface.test.ts index 3e59d968670..fdf4815cb6e 100644 --- a/src/infra/exec-approval-surface.test.ts +++ b/src/infra/exec-approval-surface.test.ts @@ -27,22 +27,22 @@ describe("resolveExecApprovalInitiatingSurfaceState", () => { getChannelPlugin: (...args: unknown[]) => getChannelPluginMock(...args), listChannelPlugins: (...args: unknown[]) => listChannelPluginsMock(...args), })); - vi.doMock("../../extensions/discord/src/channel.js", () => ({ + vi.doMock("../../native-plugins/discord/src/channel.js", () => ({ discordPlugin: {}, })); - vi.doMock("../../extensions/telegram/src/channel.js", () => ({ + vi.doMock("../../native-plugins/telegram/src/channel.js", () => ({ telegramPlugin: {}, })); - vi.doMock("../../extensions/slack/src/channel.js", () => ({ + vi.doMock("../../native-plugins/slack/src/channel.js", () => ({ slackPlugin: {}, })); - vi.doMock("../../extensions/whatsapp/src/channel.js", () => ({ + vi.doMock("../../native-plugins/whatsapp/src/channel.js", () => ({ whatsappPlugin: {}, })); - vi.doMock("../../extensions/signal/src/channel.js", () => ({ + vi.doMock("../../native-plugins/signal/src/channel.js", () => ({ signalPlugin: {}, })); - vi.doMock("../../extensions/imessage/src/channel.js", () => ({ + vi.doMock("../../native-plugins/imessage/src/channel.js", () => ({ imessagePlugin: {}, })); vi.doMock("../utils/message-channel.js", () => ({ @@ -164,22 +164,22 @@ describe("hasConfiguredExecApprovalDmRoute", () => { getChannelPlugin: (...args: unknown[]) => getChannelPluginMock(...args), listChannelPlugins: (...args: unknown[]) => listChannelPluginsMock(...args), })); - vi.doMock("../../extensions/discord/src/channel.js", () => ({ + vi.doMock("../../native-plugins/discord/src/channel.js", () => ({ discordPlugin: {}, })); - vi.doMock("../../extensions/telegram/src/channel.js", () => ({ + vi.doMock("../../native-plugins/telegram/src/channel.js", () => ({ telegramPlugin: {}, })); - vi.doMock("../../extensions/slack/src/channel.js", () => ({ + vi.doMock("../../native-plugins/slack/src/channel.js", () => ({ slackPlugin: {}, })); - vi.doMock("../../extensions/whatsapp/src/channel.js", () => ({ + vi.doMock("../../native-plugins/whatsapp/src/channel.js", () => ({ whatsappPlugin: {}, })); - vi.doMock("../../extensions/signal/src/channel.js", () => ({ + vi.doMock("../../native-plugins/signal/src/channel.js", () => ({ signalPlugin: {}, })); - vi.doMock("../../extensions/imessage/src/channel.js", () => ({ + vi.doMock("../../native-plugins/imessage/src/channel.js", () => ({ imessagePlugin: {}, })); vi.doMock("../utils/message-channel.js", () => ({ diff --git a/src/infra/heartbeat-runner.model-override.test.ts b/src/infra/heartbeat-runner.model-override.test.ts index 92c89e0b026..68ac9371d61 100644 --- a/src/infra/heartbeat-runner.model-override.test.ts +++ b/src/infra/heartbeat-runner.model-override.test.ts @@ -1,8 +1,8 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { telegramPlugin } from "../../extensions/telegram/src/channel.js"; -import { setTelegramRuntime } from "../../extensions/telegram/src/runtime.js"; -import { whatsappPlugin } from "../../extensions/whatsapp/src/channel.js"; -import { setWhatsAppRuntime } from "../../extensions/whatsapp/src/runtime.js"; +import { telegramPlugin } from "../../native-plugins/telegram/src/channel.js"; +import { setTelegramRuntime } from "../../native-plugins/telegram/src/runtime.js"; +import { whatsappPlugin } from "../../native-plugins/whatsapp/src/channel.js"; +import { setWhatsAppRuntime } from "../../native-plugins/whatsapp/src/runtime.js"; import * as replyModule from "../auto-reply/reply.js"; import type { OpenClawConfig } from "../config/config.js"; import { resolveAgentMainSessionKey, resolveMainSessionKey } from "../config/sessions.js"; diff --git a/src/infra/heartbeat-runner.returns-default-unset.test.ts b/src/infra/heartbeat-runner.returns-default-unset.test.ts index 8bca1ca1de7..ac799f7543a 100644 --- a/src/infra/heartbeat-runner.returns-default-unset.test.ts +++ b/src/infra/heartbeat-runner.returns-default-unset.test.ts @@ -2,7 +2,7 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { parseTelegramTarget } from "../../extensions/telegram/src/targets.js"; +import { parseTelegramTarget } from "../../native-plugins/telegram/src/targets.js"; import { whatsappOutbound } from "../../test/channel-outbounds.js"; import { HEARTBEAT_PROMPT } from "../auto-reply/heartbeat.js"; import * as replyModule from "../auto-reply/reply.js"; diff --git a/src/infra/heartbeat-runner.test-harness.ts b/src/infra/heartbeat-runner.test-harness.ts index 1099fdf50ab..ed88e1d3776 100644 --- a/src/infra/heartbeat-runner.test-harness.ts +++ b/src/infra/heartbeat-runner.test-harness.ts @@ -1,7 +1,7 @@ import { beforeEach } from "vitest"; -import { slackPlugin, setSlackRuntime } from "../../extensions/slack/index.js"; -import { telegramPlugin, setTelegramRuntime } from "../../extensions/telegram/index.js"; -import { whatsappPlugin, setWhatsAppRuntime } from "../../extensions/whatsapp/index.js"; +import { slackPlugin, setSlackRuntime } from "../../native-plugins/slack/index.js"; +import { telegramPlugin, setTelegramRuntime } from "../../native-plugins/telegram/index.js"; +import { whatsappPlugin, setWhatsAppRuntime } from "../../native-plugins/whatsapp/index.js"; import type { ChannelPlugin } from "../channels/plugins/types.plugin.js"; import { setActivePluginRegistry } from "../plugins/runtime.js"; import { createPluginRuntime } from "../plugins/runtime/index.js"; diff --git a/src/infra/heartbeat-runner.test-utils.ts b/src/infra/heartbeat-runner.test-utils.ts index 3ced54d8333..cc31a48d62e 100644 --- a/src/infra/heartbeat-runner.test-utils.ts +++ b/src/infra/heartbeat-runner.test-utils.ts @@ -2,7 +2,7 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { vi } from "vitest"; -import { telegramPlugin, setTelegramRuntime } from "../../extensions/telegram/index.js"; +import { telegramPlugin, setTelegramRuntime } from "../../native-plugins/telegram/index.js"; import * as replyModule from "../auto-reply/reply.js"; import type { OpenClawConfig } from "../config/config.js"; import { resolveMainSessionKey } from "../config/sessions.js"; diff --git a/src/infra/matrix-account-selection.test.ts b/src/infra/matrix-account-selection.test.ts index d7f13a7fb9d..7798b399654 100644 --- a/src/infra/matrix-account-selection.test.ts +++ b/src/infra/matrix-account-selection.test.ts @@ -5,7 +5,7 @@ import { requiresExplicitMatrixDefaultAccount, resolveConfiguredMatrixAccountIds, resolveMatrixDefaultOrOnlyAccountId, -} from "../../extensions/matrix/runtime-api.js"; +} from "../../native-plugins/matrix/runtime-api.js"; import type { OpenClawConfig } from "../config/config.js"; describe("matrix account selection", () => { diff --git a/src/infra/matrix-legacy-crypto.test.ts b/src/infra/matrix-legacy-crypto.test.ts index 08501260943..6ba90904055 100644 --- a/src/infra/matrix-legacy-crypto.test.ts +++ b/src/infra/matrix-legacy-crypto.test.ts @@ -1,7 +1,7 @@ import fs from "node:fs"; import path from "node:path"; import { describe, expect, it, vi } from "vitest"; -import { resolveMatrixAccountStorageRoot } from "../../extensions/matrix/runtime-api.js"; +import { resolveMatrixAccountStorageRoot } from "../../native-plugins/matrix/runtime-api.js"; import { withTempHome } from "../../test/helpers/temp-home.js"; import type { OpenClawConfig } from "../config/config.js"; import { autoPrepareLegacyMatrixCrypto, detectLegacyMatrixCrypto } from "./matrix-legacy-crypto.js"; diff --git a/src/infra/matrix-legacy-crypto.ts b/src/infra/matrix-legacy-crypto.ts index 1e0d5050ab8..02d06f43b2e 100644 --- a/src/infra/matrix-legacy-crypto.ts +++ b/src/infra/matrix-legacy-crypto.ts @@ -4,7 +4,7 @@ import path from "node:path"; import { resolveConfiguredMatrixAccountIds, resolveMatrixLegacyFlatStoragePaths, -} from "../../extensions/matrix/runtime-api.js"; +} from "../../native-plugins/matrix/runtime-api.js"; import type { OpenClawConfig } from "../config/config.js"; import { resolveStateDir } from "../config/paths.js"; import { writeJsonFileAtomically as writeJsonFileAtomicallyImpl } from "../plugin-sdk/json-store.js"; diff --git a/src/infra/matrix-legacy-state.ts b/src/infra/matrix-legacy-state.ts index 050ae7dd793..7c19bfe4584 100644 --- a/src/infra/matrix-legacy-state.ts +++ b/src/infra/matrix-legacy-state.ts @@ -1,7 +1,7 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; -import { resolveMatrixLegacyFlatStoragePaths } from "../../extensions/matrix/runtime-api.js"; +import { resolveMatrixLegacyFlatStoragePaths } from "../../native-plugins/matrix/runtime-api.js"; import type { OpenClawConfig } from "../config/config.js"; import { resolveStateDir } from "../config/paths.js"; import { resolveLegacyMatrixFlatStoreTarget } from "./matrix-migration-config.js"; diff --git a/src/infra/matrix-migration-config.ts b/src/infra/matrix-migration-config.ts index e0fce130f69..96a290eb42c 100644 --- a/src/infra/matrix-migration-config.ts +++ b/src/infra/matrix-migration-config.ts @@ -10,7 +10,7 @@ import { resolveMatrixChannelConfig, resolveMatrixCredentialsPath, resolveMatrixDefaultOrOnlyAccountId, -} from "../../extensions/matrix/runtime-api.js"; +} from "../../native-plugins/matrix/runtime-api.js"; import type { OpenClawConfig } from "../config/config.js"; import { resolveStateDir } from "../config/paths.js"; import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../routing/session-key.js"; diff --git a/src/infra/matrix-migration-snapshot.test.ts b/src/infra/matrix-migration-snapshot.test.ts index 2d0fb850109..aebd9d9ebd6 100644 --- a/src/infra/matrix-migration-snapshot.test.ts +++ b/src/infra/matrix-migration-snapshot.test.ts @@ -1,7 +1,7 @@ import fs from "node:fs"; import path from "node:path"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { resolveMatrixAccountStorageRoot } from "../../extensions/matrix/runtime-api.js"; +import { resolveMatrixAccountStorageRoot } from "../../native-plugins/matrix/runtime-api.js"; import { withTempHome } from "../../test/helpers/temp-home.js"; import { detectLegacyMatrixCrypto } from "./matrix-legacy-crypto.js"; diff --git a/src/infra/outbound/cfg-threading.guard.test.ts b/src/infra/outbound/cfg-threading.guard.test.ts index cfdbc892db4..29f9759328c 100644 --- a/src/infra/outbound/cfg-threading.guard.test.ts +++ b/src/infra/outbound/cfg-threading.guard.test.ts @@ -29,7 +29,7 @@ function listExtensionFiles(): { adapterEntrypoints: string[]; inlineChannelEntrypoints: string[]; } { - const extensionsRoot = path.join(repoRoot, "extensions"); + const extensionsRoot = path.join(repoRoot, "native-plugins"); const adapterEntrypoints: string[] = []; const inlineChannelEntrypoints: string[] = []; @@ -40,7 +40,7 @@ function listExtensionFiles(): { const srcDir = path.join(extensionsRoot, entry.name, "src"); const outboundPath = path.join(srcDir, "outbound.ts"); if (existsSync(outboundPath)) { - adapterEntrypoints.push(toPosix(path.join("extensions", entry.name, "src/outbound.ts"))); + adapterEntrypoints.push(toPosix(path.join("native-plugins", entry.name, "src/outbound.ts"))); } const channelPath = path.join(srcDir, "channel.ts"); @@ -49,7 +49,9 @@ function listExtensionFiles(): { } const source = readFileSync(channelPath, "utf8"); if (source.includes("outbound:")) { - inlineChannelEntrypoints.push(toPosix(path.join("extensions", entry.name, "src/channel.ts"))); + inlineChannelEntrypoints.push( + toPosix(path.join("native-plugins", entry.name, "src/channel.ts")), + ); } } @@ -61,10 +63,10 @@ function listExtensionFiles(): { function listHighRiskRuntimeCfgFiles(): string[] { return [ - "extensions/telegram/src/action-runtime.ts", - "extensions/discord/src/monitor/reply-delivery.ts", - "extensions/discord/src/monitor/thread-bindings.discord-api.ts", - "extensions/discord/src/monitor/thread-bindings.manager.ts", + "native-plugins/telegram/src/action-runtime.ts", + "native-plugins/discord/src/monitor/reply-delivery.ts", + "native-plugins/discord/src/monitor/thread-bindings.discord-api.ts", + "native-plugins/discord/src/monitor/thread-bindings.manager.ts", ]; } diff --git a/src/infra/outbound/channel-adapters.test.ts b/src/infra/outbound/channel-adapters.test.ts index ca39b403226..dd1a3ba0a28 100644 --- a/src/infra/outbound/channel-adapters.test.ts +++ b/src/infra/outbound/channel-adapters.test.ts @@ -1,7 +1,7 @@ import { Separator, TextDisplay } from "@buape/carbon"; import { beforeEach, describe, expect, it } from "vitest"; -import { discordPlugin } from "../../../extensions/discord/src/channel.js"; -import { DiscordUiContainer } from "../../../extensions/discord/src/ui.js"; +import { discordPlugin } from "../../../native-plugins/discord/src/channel.js"; +import { DiscordUiContainer } from "../../../native-plugins/discord/src/ui.js"; import { setActivePluginRegistry } from "../../plugins/runtime.js"; import { createTestRegistry } from "../../test-utils/channel-plugins.js"; import { getChannelMessageAdapter } from "./channel-adapters.js"; diff --git a/src/infra/outbound/deliver.test.ts b/src/infra/outbound/deliver.test.ts index 6bf69a519f8..f975c63dc9d 100644 --- a/src/infra/outbound/deliver.test.ts +++ b/src/infra/outbound/deliver.test.ts @@ -1,6 +1,6 @@ import path from "node:path"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { markdownToSignalTextChunks } from "../../../extensions/signal/src/format.js"; +import { markdownToSignalTextChunks } from "../../../native-plugins/signal/src/format.js"; import { signalOutbound, telegramOutbound, diff --git a/src/infra/outbound/message-action-params.test.ts b/src/infra/outbound/message-action-params.test.ts index 3442711eab4..f330161ed78 100644 --- a/src/infra/outbound/message-action-params.test.ts +++ b/src/infra/outbound/message-action-params.test.ts @@ -2,8 +2,8 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { describe, expect, it } from "vitest"; -import { slackPlugin } from "../../../extensions/slack/src/channel.js"; -import { telegramPlugin } from "../../../extensions/telegram/src/channel.js"; +import { slackPlugin } from "../../../native-plugins/slack/src/channel.js"; +import { telegramPlugin } from "../../../native-plugins/telegram/src/channel.js"; import type { ChannelThreadingToolContext } from "../../channels/plugins/types.js"; import type { OpenClawConfig } from "../../config/config.js"; import { diff --git a/src/infra/outbound/message-action-runner.media.test.ts b/src/infra/outbound/message-action-runner.media.test.ts index 89ab0cd6c2c..0c3a57241d0 100644 --- a/src/infra/outbound/message-action-runner.media.test.ts +++ b/src/infra/outbound/message-action-runner.media.test.ts @@ -78,9 +78,9 @@ async function expectSandboxMediaRewrite(params: { type MessageActionRunnerModule = typeof import("./message-action-runner.js"); type WebMediaModule = typeof import("../../media/web-media.js"); -type SlackChannelModule = typeof import("../../../extensions/slack/src/channel.js"); +type SlackChannelModule = typeof import("../../../native-plugins/slack/src/channel.js"); type RuntimeIndexModule = typeof import("../../plugins/runtime/index.js"); -type SlackRuntimeModule = typeof import("../../../extensions/slack/src/runtime.js"); +type SlackRuntimeModule = typeof import("../../../native-plugins/slack/src/runtime.js"); let runMessageAction: MessageActionRunnerModule["runMessageAction"]; let loadWebMedia: WebMediaModule["loadWebMedia"]; @@ -97,9 +97,9 @@ describe("runMessageAction media behavior", () => { beforeAll(async () => { ({ runMessageAction } = await import("./message-action-runner.js")); ({ loadWebMedia } = await import("../../media/web-media.js")); - ({ slackPlugin } = await import("../../../extensions/slack/src/channel.js")); + ({ slackPlugin } = await import("../../../native-plugins/slack/src/channel.js")); ({ createPluginRuntime } = await import("../../plugins/runtime/index.js")); - ({ setSlackRuntime } = await import("../../../extensions/slack/src/runtime.js")); + ({ setSlackRuntime } = await import("../../../native-plugins/slack/src/runtime.js")); }); beforeEach(() => { diff --git a/src/infra/outbound/message-action-runner.test-helpers.ts b/src/infra/outbound/message-action-runner.test-helpers.ts index 78a2585cfc0..4f6918ceaad 100644 --- a/src/infra/outbound/message-action-runner.test-helpers.ts +++ b/src/infra/outbound/message-action-runner.test-helpers.ts @@ -1,5 +1,5 @@ -import { slackPlugin, setSlackRuntime } from "../../../extensions/slack/index.js"; -import { telegramPlugin, setTelegramRuntime } from "../../../extensions/telegram/index.js"; +import { slackPlugin, setSlackRuntime } from "../../../native-plugins/slack/index.js"; +import { telegramPlugin, setTelegramRuntime } from "../../../native-plugins/telegram/index.js"; import type { OpenClawConfig } from "../../config/config.js"; import { setActivePluginRegistry } from "../../plugins/runtime.js"; import { createPluginRuntime } from "../../plugins/runtime/index.js"; diff --git a/src/infra/outbound/outbound-policy.test.ts b/src/infra/outbound/outbound-policy.test.ts index 43e71afb923..1b2886829bf 100644 --- a/src/infra/outbound/outbound-policy.test.ts +++ b/src/infra/outbound/outbound-policy.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it } from "vitest"; -import { discordPlugin } from "../../../extensions/discord/src/channel.js"; +import { discordPlugin } from "../../../native-plugins/discord/src/channel.js"; import type { OpenClawConfig } from "../../config/config.js"; import { setActivePluginRegistry } from "../../plugins/runtime.js"; import { createTestRegistry } from "../../test-utils/channel-plugins.js"; diff --git a/src/infra/outbound/outbound-session.ts b/src/infra/outbound/outbound-session.ts index 33ddcb4c90e..1f29c1467cd 100644 --- a/src/infra/outbound/outbound-session.ts +++ b/src/infra/outbound/outbound-session.ts @@ -1,23 +1,26 @@ -import { parseDiscordTarget } from "../../../extensions/discord/api.js"; -import { normalizeIMessageHandle, parseIMessageTarget } from "../../../extensions/imessage/api.js"; +import { parseDiscordTarget } from "../../../native-plugins/discord/api.js"; +import { + normalizeIMessageHandle, + parseIMessageTarget, +} from "../../../native-plugins/imessage/api.js"; import { looksLikeUuid, resolveSignalPeerId, resolveSignalRecipient, resolveSignalSender, -} from "../../../extensions/signal/api.js"; +} from "../../../native-plugins/signal/api.js"; import { createSlackWebClient, normalizeAllowListLower, parseSlackTarget, resolveSlackAccount, -} from "../../../extensions/slack/api.js"; +} from "../../../native-plugins/slack/api.js"; import { buildTelegramGroupPeerId, parseTelegramTarget, parseTelegramThreadId, resolveTelegramTargetChatType, -} from "../../../extensions/telegram/api.js"; +} from "../../../native-plugins/telegram/api.js"; import type { MsgContext } from "../../auto-reply/templating.js"; import type { ChatType } from "../../channels/chat-type.js"; import { getChannelPlugin } from "../../channels/plugins/index.js"; diff --git a/src/infra/outbound/outbound.test.ts b/src/infra/outbound/outbound.test.ts index f90fc7f221e..0763a875be0 100644 --- a/src/infra/outbound/outbound.test.ts +++ b/src/infra/outbound/outbound.test.ts @@ -2,7 +2,7 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { discordPlugin } from "../../../extensions/discord/src/channel.js"; +import { discordPlugin } from "../../../native-plugins/discord/src/channel.js"; import type { ReplyPayload } from "../../auto-reply/types.js"; import { setDefaultChannelPluginRegistryForTests } from "../../commands/channel-test-helpers.js"; import type { OpenClawConfig } from "../../config/config.js"; diff --git a/src/infra/outbound/targets.shared-test.ts b/src/infra/outbound/targets.shared-test.ts index dae0ca82dd5..af4e44fc687 100644 --- a/src/infra/outbound/targets.shared-test.ts +++ b/src/infra/outbound/targets.shared-test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeEach, describe, expect, it } from "vitest"; -import { telegramPlugin } from "../../../extensions/telegram/index.js"; -import { whatsappPlugin } from "../../../extensions/whatsapp/index.js"; +import { telegramPlugin } from "../../../native-plugins/telegram/index.js"; +import { whatsappPlugin } from "../../../native-plugins/whatsapp/index.js"; import { setActivePluginRegistry } from "../../plugins/runtime.js"; import { createTestRegistry } from "../../test-utils/channel-plugins.js"; import { resolveOutboundTarget } from "./targets.js"; diff --git a/src/infra/outbound/targets.test.ts b/src/infra/outbound/targets.test.ts index 2ac707a804d..fea6fcdb9ef 100644 --- a/src/infra/outbound/targets.test.ts +++ b/src/infra/outbound/targets.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it } from "vitest"; -import { parseTelegramTarget } from "../../../extensions/telegram/src/targets.js"; +import { parseTelegramTarget } from "../../../native-plugins/telegram/src/targets.js"; import { telegramOutbound, whatsappOutbound } from "../../../test/channel-outbounds.js"; import type { ChannelOutboundAdapter } from "../../channels/plugins/types.js"; import type { OpenClawConfig } from "../../config/config.js"; diff --git a/src/infra/plugin-install-path-warnings.test.ts b/src/infra/plugin-install-path-warnings.test.ts index eb7ba108df1..eef591a3da2 100644 --- a/src/infra/plugin-install-path-warnings.test.ts +++ b/src/infra/plugin-install-path-warnings.test.ts @@ -66,12 +66,12 @@ describe("plugin install path warnings", () => { issue: issue!, pluginLabel: "Matrix", defaultInstallCommand: "openclaw plugins install @openclaw/matrix", - repoInstallCommand: "openclaw plugins install ./extensions/matrix", + repoInstallCommand: "openclaw plugins install ./native-plugins/matrix", }), ).toEqual([ "Matrix is installed from a custom path that no longer exists: /tmp/openclaw-matrix-missing", 'Reinstall with "openclaw plugins install @openclaw/matrix".', - 'If you are running from a repo checkout, you can also use "openclaw plugins install ./extensions/matrix".', + 'If you are running from a repo checkout, you can also use "openclaw plugins install ./native-plugins/matrix".', ]); }); @@ -105,14 +105,14 @@ describe("plugin install path warnings", () => { }, pluginLabel: "Matrix", defaultInstallCommand: "openclaw plugins install @openclaw/matrix", - repoInstallCommand: "openclaw plugins install ./extensions/matrix", + repoInstallCommand: "openclaw plugins install ./native-plugins/matrix", formatCommand: (command) => `<${command}>`, }), ).toEqual([ "Matrix is installed from a custom path: /tmp/matrix-plugin", "Main updates will not automatically replace that plugin with the repo's default Matrix package.", 'Reinstall with "" when you want to return to the standard Matrix plugin.', - 'If you are intentionally running from a repo checkout, reinstall that checkout explicitly with "" after updates.', + 'If you are intentionally running from a repo checkout, reinstall that checkout explicitly with "" after updates.', ]); }); }); diff --git a/src/infra/run-node.test.ts b/src/infra/run-node.test.ts index 9b6c871379b..2afafb011f3 100644 --- a/src/infra/run-node.test.ts +++ b/src/infra/run-node.test.ts @@ -28,7 +28,7 @@ function createExitedProcess(code: number | null, signal: string | null = null) async function writeRuntimePostBuildScaffold(tmp: string): Promise { const pluginSdkAliasPath = path.join(tmp, "src", "plugin-sdk", "root-alias.cjs"); await fs.mkdir(path.dirname(pluginSdkAliasPath), { recursive: true }); - await fs.mkdir(path.join(tmp, "extensions"), { recursive: true }); + await fs.mkdir(path.join(tmp, "native-plugins"), { recursive: true }); await fs.writeFile(pluginSdkAliasPath, "module.exports = {};\n", "utf-8"); const baselineTime = new Date("2026-03-13T09:00:00.000Z"); await fs.utimes(pluginSdkAliasPath, baselineTime, baselineTime); @@ -99,8 +99,13 @@ describe("run-node script", () => { it("copies bundled plugin metadata after rebuilding from a clean dist", async () => { await withTempDir(async (tmp) => { - const extensionManifestPath = path.join(tmp, "extensions", "demo", "openclaw.plugin.json"); - const extensionPackagePath = path.join(tmp, "extensions", "demo", "package.json"); + const extensionManifestPath = path.join( + tmp, + "native-plugins", + "demo", + "openclaw.plugin.json", + ); + const extensionPackagePath = path.join(tmp, "native-plugins", "demo", "package.json"); await writeRuntimePostBuildScaffold(tmp); await fs.mkdir(path.dirname(extensionManifestPath), { recursive: true }); @@ -114,9 +119,7 @@ describe("run-node script", () => { JSON.stringify( { name: "demo", - openclaw: { - extensions: ["./src/index.ts", "./nested/entry.mts"], - }, + openclaw: { plugins: ["./src/index.ts", "./nested/entry.mts"] }, }, null, 2, @@ -154,13 +157,16 @@ describe("run-node script", () => { ).resolves.toContain("module.exports = {};"); await expect( fs - .readFile(path.join(tmp, "dist", "extensions", "demo", "openclaw.plugin.json"), "utf-8") + .readFile( + path.join(tmp, "dist", "native-plugins", "demo", "openclaw.plugin.json"), + "utf-8", + ) .then((raw) => JSON.parse(raw)), ).resolves.toMatchObject({ id: "demo" }); await expect( - fs.readFile(path.join(tmp, "dist", "extensions", "demo", "package.json"), "utf-8"), + fs.readFile(path.join(tmp, "dist", "native-plugins", "demo", "package.json"), "utf-8"), ).resolves.toContain( - '"extensions": [\n "./src/index.js",\n "./nested/entry.js"\n ]', + '"plugins": [\n "./src/index.js",\n "./nested/entry.js"\n ]', ); }); }); @@ -250,7 +256,7 @@ describe("run-node script", () => { it("rebuilds when extension sources are newer than the build stamp", async () => { await withTempDir(async (tmp) => { - const extensionPath = path.join(tmp, "extensions", "demo", "src", "index.ts"); + const extensionPath = path.join(tmp, "native-plugins", "demo", "src", "index.ts"); const distEntryPath = path.join(tmp, "dist", "entry.js"); const buildStampPath = path.join(tmp, "dist", ".buildstamp"); const tsconfigPath = path.join(tmp, "tsconfig.json"); @@ -302,9 +308,9 @@ describe("run-node script", () => { it("skips rebuilding when extension package metadata is newer than the build stamp", async () => { await withTempDir(async (tmp) => { - const manifestPath = path.join(tmp, "extensions", "demo", "openclaw.plugin.json"); - const packagePath = path.join(tmp, "extensions", "demo", "package.json"); - const distPackagePath = path.join(tmp, "dist", "extensions", "demo", "package.json"); + const manifestPath = path.join(tmp, "native-plugins", "demo", "openclaw.plugin.json"); + const packagePath = path.join(tmp, "native-plugins", "demo", "package.json"); + const distPackagePath = path.join(tmp, "dist", "native-plugins", "demo", "package.json"); const distEntryPath = path.join(tmp, "dist", "entry.js"); const buildStampPath = path.join(tmp, "dist", ".buildstamp"); const tsconfigPath = path.join(tmp, "tsconfig.json"); @@ -318,7 +324,7 @@ describe("run-node script", () => { await fs.writeFile(manifestPath, '{"id":"demo","configSchema":{"type":"object"}}\n', "utf-8"); await fs.writeFile( packagePath, - '{"name":"demo","openclaw":{"extensions":["./index.ts"]}}\n', + '{"name":"demo","openclaw":{"plugins":["./index.ts"]}}\n', "utf-8", ); await fs.writeFile(tsconfigPath, "{}\n", "utf-8"); @@ -327,7 +333,7 @@ describe("run-node script", () => { await fs.writeFile(distEntryPath, "console.log('built');\n", "utf-8"); await fs.writeFile( distPackagePath, - '{"name":"demo","openclaw":{"extensions":["./stale.js"]}}\n', + '{"name":"demo","openclaw":{"plugins":["./stale.js"]}}\n', "utf-8", ); await fs.writeFile(buildStampPath, '{"head":"abc123"}\n', "utf-8"); @@ -372,7 +378,7 @@ describe("run-node script", () => { it("skips rebuilding for dirty non-source files under extensions", async () => { await withTempDir(async (tmp) => { const srcPath = path.join(tmp, "src", "index.ts"); - const readmePath = path.join(tmp, "extensions", "demo", "README.md"); + const readmePath = path.join(tmp, "native-plugins", "demo", "README.md"); const distEntryPath = path.join(tmp, "dist", "entry.js"); const buildStampPath = path.join(tmp, "dist", ".buildstamp"); const tsconfigPath = path.join(tmp, "tsconfig.json"); @@ -409,7 +415,7 @@ describe("run-node script", () => { return { status: 0, stdout: "abc123\n" }; } if (cmd === "git" && args[0] === "status") { - return { status: 0, stdout: " M extensions/demo/README.md\n" }; + return { status: 0, stdout: " M native-plugins/demo/README.md\n" }; } return { status: 1, stdout: "" }; }; @@ -435,8 +441,14 @@ describe("run-node script", () => { it("skips rebuilding for dirty extension manifests that only affect runtime reload", async () => { await withTempDir(async (tmp) => { const srcPath = path.join(tmp, "src", "index.ts"); - const manifestPath = path.join(tmp, "extensions", "demo", "openclaw.plugin.json"); - const distManifestPath = path.join(tmp, "dist", "extensions", "demo", "openclaw.plugin.json"); + const manifestPath = path.join(tmp, "native-plugins", "demo", "openclaw.plugin.json"); + const distManifestPath = path.join( + tmp, + "dist", + "native-plugins", + "demo", + "openclaw.plugin.json", + ); const distEntryPath = path.join(tmp, "dist", "entry.js"); const buildStampPath = path.join(tmp, "dist", ".buildstamp"); const tsconfigPath = path.join(tmp, "tsconfig.json"); @@ -479,7 +491,7 @@ describe("run-node script", () => { return { status: 0, stdout: "abc123\n" }; } if (cmd === "git" && args[0] === "status") { - return { status: 0, stdout: " M extensions/demo/openclaw.plugin.json\n" }; + return { status: 0, stdout: " M native-plugins/demo/openclaw.plugin.json\n" }; } return { status: 1, stdout: "" }; }; @@ -510,8 +522,14 @@ describe("run-node script", () => { it("repairs missing bundled plugin metadata without rerunning tsdown", async () => { await withTempDir(async (tmp) => { const srcPath = path.join(tmp, "src", "index.ts"); - const manifestPath = path.join(tmp, "extensions", "demo", "openclaw.plugin.json"); - const distManifestPath = path.join(tmp, "dist", "extensions", "demo", "openclaw.plugin.json"); + const manifestPath = path.join(tmp, "native-plugins", "demo", "openclaw.plugin.json"); + const distManifestPath = path.join( + tmp, + "dist", + "native-plugins", + "demo", + "openclaw.plugin.json", + ); const distEntryPath = path.join(tmp, "dist", "entry.js"); const buildStampPath = path.join(tmp, "dist", ".buildstamp"); const tsconfigPath = path.join(tmp, "tsconfig.json"); @@ -579,9 +597,15 @@ describe("run-node script", () => { it("removes stale bundled plugin metadata when the source manifest is gone", async () => { await withTempDir(async (tmp) => { const srcPath = path.join(tmp, "src", "index.ts"); - const extensionDir = path.join(tmp, "extensions", "demo"); - const distManifestPath = path.join(tmp, "dist", "extensions", "demo", "openclaw.plugin.json"); - const distPackagePath = path.join(tmp, "dist", "extensions", "demo", "package.json"); + const extensionDir = path.join(tmp, "native-plugins", "demo"); + const distManifestPath = path.join( + tmp, + "dist", + "native-plugins", + "demo", + "openclaw.plugin.json", + ); + const distPackagePath = path.join(tmp, "dist", "native-plugins", "demo", "package.json"); const distEntryPath = path.join(tmp, "dist", "entry.js"); const buildStampPath = path.join(tmp, "dist", ".buildstamp"); const tsconfigPath = path.join(tmp, "tsconfig.json"); @@ -651,7 +675,7 @@ describe("run-node script", () => { it("skips rebuilding when only non-source extension files are newer than the build stamp", async () => { await withTempDir(async (tmp) => { const srcPath = path.join(tmp, "src", "index.ts"); - const readmePath = path.join(tmp, "extensions", "demo", "README.md"); + const readmePath = path.join(tmp, "native-plugins", "demo", "README.md"); const distEntryPath = path.join(tmp, "dist", "entry.js"); const buildStampPath = path.join(tmp, "dist", ".buildstamp"); const tsconfigPath = path.join(tmp, "tsconfig.json"); diff --git a/src/infra/tsdown-config.test.ts b/src/infra/tsdown-config.test.ts index 94332c5b307..975183ed5df 100644 --- a/src/infra/tsdown-config.test.ts +++ b/src/infra/tsdown-config.test.ts @@ -26,7 +26,7 @@ describe("tsdown config", () => { keys.includes("index") || keys.includes("plugins/runtime/index") || keys.includes("plugin-sdk/index") || - keys.includes("extensions/openai/index") || + keys.includes("native-plugins/openai/index") || keys.includes("bundled/boot-md/handler") ); }); @@ -37,7 +37,7 @@ describe("tsdown config", () => { "index", "plugins/runtime/index", "plugin-sdk/index", - "extensions/openai/index", + "native-plugins/openai/index", "bundled/boot-md/handler", ]), ); diff --git a/src/infra/watch-node.test.ts b/src/infra/watch-node.test.ts index 8fa92bae1df..3105c6a48ec 100644 --- a/src/infra/watch-node.test.ts +++ b/src/infra/watch-node.test.ts @@ -44,17 +44,17 @@ describe("watch-node script", () => { { ignoreInitial: boolean; ignored: (watchPath: string) => boolean }, ]; expect(watchPaths).toEqual(runNodeWatchedPaths); - expect(watchPaths).toContain("extensions"); + expect(watchPaths).toContain("native-plugins"); expect(watchPaths).toContain("tsdown.config.ts"); expect(watchOptions.ignoreInitial).toBe(true); expect(watchOptions.ignored("src/infra/watch-node.test.ts")).toBe(true); expect(watchOptions.ignored("src/infra/watch-node.test.tsx")).toBe(true); expect(watchOptions.ignored("src/infra/watch-node-test-helpers.ts")).toBe(true); - expect(watchOptions.ignored("extensions/voice-call/README.md")).toBe(true); - expect(watchOptions.ignored("extensions/voice-call/openclaw.plugin.json")).toBe(false); - expect(watchOptions.ignored("extensions/voice-call/package.json")).toBe(false); - expect(watchOptions.ignored("extensions/voice-call/index.ts")).toBe(false); - expect(watchOptions.ignored("extensions/voice-call/src/runtime.ts")).toBe(false); + expect(watchOptions.ignored("native-plugins/voice-call/README.md")).toBe(true); + expect(watchOptions.ignored("native-plugins/voice-call/openclaw.plugin.json")).toBe(false); + expect(watchOptions.ignored("native-plugins/voice-call/package.json")).toBe(false); + expect(watchOptions.ignored("native-plugins/voice-call/index.ts")).toBe(false); + expect(watchOptions.ignored("native-plugins/voice-call/src/runtime.ts")).toBe(false); expect(watchOptions.ignored("src/infra/watch-node.ts")).toBe(false); expect(watchOptions.ignored("tsconfig.json")).toBe(false); @@ -173,17 +173,17 @@ describe("watch-node script", () => { expect(spawn).toHaveBeenCalledTimes(1); expect(childA.kill).not.toHaveBeenCalled(); - watcher.emit("change", "extensions/voice-call/README.md"); + watcher.emit("change", "native-plugins/voice-call/README.md"); await new Promise((resolve) => setImmediate(resolve)); expect(spawn).toHaveBeenCalledTimes(1); expect(childA.kill).not.toHaveBeenCalled(); - watcher.emit("change", "extensions/voice-call/openclaw.plugin.json"); + watcher.emit("change", "native-plugins/voice-call/openclaw.plugin.json"); await new Promise((resolve) => setImmediate(resolve)); expect(childA.kill).toHaveBeenCalledWith("SIGTERM"); expect(spawn).toHaveBeenCalledTimes(2); - watcher.emit("change", "extensions/voice-call/package.json"); + watcher.emit("change", "native-plugins/voice-call/package.json"); await new Promise((resolve) => setImmediate(resolve)); expect(childB.kill).toHaveBeenCalledWith("SIGTERM"); expect(spawn).toHaveBeenCalledTimes(3); diff --git a/src/media-understanding/providers/google/video.test.ts b/src/media-understanding/providers/google/video.test.ts index c4307e4caad..a1907babe17 100644 --- a/src/media-understanding/providers/google/video.test.ts +++ b/src/media-understanding/providers/google/video.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { describeGeminiVideo } from "../../../../extensions/google/media-understanding-provider.js"; +import { describeGeminiVideo } from "../../../../native-plugins/google/media-understanding-provider.js"; import * as ssrf from "../../../infra/net/ssrf.js"; import { withFetchPreconnect } from "../../../test-utils/fetch-mock.js"; import { createRequestCaptureJsonFetch } from "../audio.test-helpers.js"; diff --git a/src/media-understanding/providers/mistral/index.test.ts b/src/media-understanding/providers/mistral/index.test.ts index 1afa3bd9265..ffe3b96ef83 100644 --- a/src/media-understanding/providers/mistral/index.test.ts +++ b/src/media-understanding/providers/mistral/index.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { mistralMediaUnderstandingProvider } from "../../../../extensions/mistral/media-understanding-provider.js"; +import { mistralMediaUnderstandingProvider } from "../../../../native-plugins/mistral/media-understanding-provider.js"; import { createRequestCaptureJsonFetch, installPinnedHostnameTestHooks, diff --git a/src/media-understanding/providers/moonshot/video.test.ts b/src/media-understanding/providers/moonshot/video.test.ts index 0306e7927ca..65f8ce3843c 100644 --- a/src/media-understanding/providers/moonshot/video.test.ts +++ b/src/media-understanding/providers/moonshot/video.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { describeMoonshotVideo } from "../../../../extensions/moonshot/media-understanding-provider.js"; +import { describeMoonshotVideo } from "../../../../native-plugins/moonshot/media-understanding-provider.js"; import { createRequestCaptureJsonFetch, installPinnedHostnameTestHooks, diff --git a/src/media-understanding/providers/openai/audio.test.ts b/src/media-understanding/providers/openai/audio.test.ts index 06366a4c3cc..017bbe342f5 100644 --- a/src/media-understanding/providers/openai/audio.test.ts +++ b/src/media-understanding/providers/openai/audio.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { transcribeOpenAiAudio } from "../../../../extensions/openai/media-understanding-provider.js"; +import { transcribeOpenAiAudio } from "../../../../native-plugins/openai/media-understanding-provider.js"; import { createAuthCaptureJsonFetch, createRequestCaptureJsonFetch, diff --git a/src/media/fetch.telegram-network.test.ts b/src/media/fetch.telegram-network.test.ts index faf16314d98..f2135d4fae4 100644 --- a/src/media/fetch.telegram-network.test.ts +++ b/src/media/fetch.telegram-network.test.ts @@ -21,8 +21,8 @@ vi.mock("undici", () => ({ fetch: undiciMocks.fetch, })); -let resolveTelegramTransport: typeof import("../../extensions/telegram/src/fetch.js").resolveTelegramTransport; -let shouldRetryTelegramTransportFallback: typeof import("../../extensions/telegram/src/fetch.js").shouldRetryTelegramTransportFallback; +let resolveTelegramTransport: typeof import("../../native-plugins/telegram/src/fetch.js").resolveTelegramTransport; +let shouldRetryTelegramTransportFallback: typeof import("../../native-plugins/telegram/src/fetch.js").shouldRetryTelegramTransportFallback; let fetchRemoteMedia: typeof import("./fetch.js").fetchRemoteMedia; describe("fetchRemoteMedia telegram network policy", () => { @@ -31,7 +31,7 @@ describe("fetchRemoteMedia telegram network policy", () => { beforeEach(async () => { vi.resetModules(); ({ resolveTelegramTransport, shouldRetryTelegramTransportFallback } = - await import("../../extensions/telegram/src/fetch.js")); + await import("../../native-plugins/telegram/src/fetch.js")); ({ fetchRemoteMedia } = await import("./fetch.js")); }); @@ -99,7 +99,7 @@ describe("fetchRemoteMedia telegram network policy", () => { }); it("keeps explicit proxy routing for file downloads", async () => { - const { makeProxyFetch } = await import("../../extensions/telegram/src/proxy.js"); + const { makeProxyFetch } = await import("../../native-plugins/telegram/src/proxy.js"); const lookupFn = vi.fn(async () => [ { address: "149.154.167.220", family: 4 }, ]) as unknown as LookupFn; diff --git a/src/plugin-sdk/account-resolution.ts b/src/plugin-sdk/account-resolution.ts index f5f1229a798..a466772dca6 100644 --- a/src/plugin-sdk/account-resolution.ts +++ b/src/plugin-sdk/account-resolution.ts @@ -13,13 +13,16 @@ export { normalizeE164, pathExists, resolveUserPath } from "../utils.js"; export { resolveDiscordAccount, type ResolvedDiscordAccount, -} from "../../extensions/discord/api.js"; -export { resolveSlackAccount, type ResolvedSlackAccount } from "../../extensions/slack/api.js"; +} from "../../native-plugins/discord/api.js"; +export { resolveSlackAccount, type ResolvedSlackAccount } from "../../native-plugins/slack/api.js"; export { resolveTelegramAccount, type ResolvedTelegramAccount, -} from "../../extensions/telegram/api.js"; -export { resolveSignalAccount, type ResolvedSignalAccount } from "../../extensions/signal/api.js"; +} from "../../native-plugins/telegram/api.js"; +export { + resolveSignalAccount, + type ResolvedSignalAccount, +} from "../../native-plugins/signal/api.js"; /** Resolve an account by id, then fall back to the default account when the primary lacks credentials. */ export function resolveAccountWithDefaultFallback(params: { diff --git a/src/plugin-sdk/bluebubbles.ts b/src/plugin-sdk/bluebubbles.ts index ac76dcc29a3..e26e8a8c6ae 100644 --- a/src/plugin-sdk/bluebubbles.ts +++ b/src/plugin-sdk/bluebubbles.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled bluebubbles plugin. -// Keep this list additive and scoped to symbols used under extensions/bluebubbles. +// Keep this list additive and scoped to symbols used under native-plugins/bluebubbles. export { resolveAckReaction } from "../agents/identity.js"; export { @@ -28,7 +28,7 @@ export { buildChannelConfigSchema } from "../channels/plugins/config-schema.js"; export { resolveBlueBubblesGroupRequireMention, resolveBlueBubblesGroupToolPolicy, -} from "../../extensions/bluebubbles/runtime-api.js"; +} from "../../native-plugins/bluebubbles/runtime-api.js"; export { formatPairingApproveHint } from "../channels/plugins/helpers.js"; export { resolveChannelMediaMaxBytes } from "../channels/plugins/media-limits.js"; export { @@ -56,13 +56,13 @@ export type { OpenClawConfig } from "../config/config.js"; export type { DmPolicy, GroupPolicy } from "../config/types.js"; export { ToolPolicySchema } from "../config/zod-schema.agent-runtime.js"; export { MarkdownConfigSchema } from "../config/zod-schema.core.js"; -export type { ParsedChatTarget } from "../../extensions/imessage/api.js"; +export type { ParsedChatTarget } from "../../native-plugins/imessage/api.js"; export { parseChatAllowTargetPrefixes, parseChatTargetPrefixesOrThrow, resolveServicePrefixedAllowTarget, resolveServicePrefixedTarget, -} from "../../extensions/imessage/api.js"; +} from "../../native-plugins/imessage/api.js"; export { stripMarkdown } from "../line/markdown-to-line.js"; export { parseFiniteNumber } from "../infra/parse-finite-number.js"; export { emptyPluginConfigSchema } from "../plugins/config-schema.js"; diff --git a/src/plugin-sdk/channel-import-guardrails.test.ts b/src/plugin-sdk/channel-import-guardrails.test.ts index 9b481097ed6..e7580f59ac3 100644 --- a/src/plugin-sdk/channel-import-guardrails.test.ts +++ b/src/plugin-sdk/channel-import-guardrails.test.ts @@ -50,38 +50,38 @@ type GuardedSource = { const SAME_CHANNEL_SDK_GUARDS: GuardedSource[] = [ { - path: "extensions/discord/src/shared.ts", + path: "native-plugins/discord/src/shared.ts", forbiddenPatterns: [/["']openclaw\/plugin-sdk\/discord["']/, /plugin-sdk-internal\/discord/], }, { - path: "extensions/slack/src/shared.ts", + path: "native-plugins/slack/src/shared.ts", forbiddenPatterns: [/["']openclaw\/plugin-sdk\/slack["']/, /plugin-sdk-internal\/slack/], }, { - path: "extensions/telegram/src/shared.ts", + path: "native-plugins/telegram/src/shared.ts", forbiddenPatterns: [/["']openclaw\/plugin-sdk\/telegram["']/, /plugin-sdk-internal\/telegram/], }, { - path: "extensions/imessage/src/shared.ts", + path: "native-plugins/imessage/src/shared.ts", forbiddenPatterns: [/["']openclaw\/plugin-sdk\/imessage["']/, /plugin-sdk-internal\/imessage/], }, { - path: "extensions/whatsapp/src/shared.ts", + path: "native-plugins/whatsapp/src/shared.ts", forbiddenPatterns: [/["']openclaw\/plugin-sdk\/whatsapp["']/, /plugin-sdk-internal\/whatsapp/], }, { - path: "extensions/signal/src/shared.ts", + path: "native-plugins/signal/src/shared.ts", forbiddenPatterns: [/["']openclaw\/plugin-sdk\/signal["']/, /plugin-sdk-internal\/signal/], }, ]; const SETUP_BARREL_GUARDS: GuardedSource[] = [ { - path: "extensions/signal/src/setup-core.ts", + path: "native-plugins/signal/src/setup-core.ts", forbiddenPatterns: [/\bformatCliCommand\b/, /\bformatDocsLink\b/], }, { - path: "extensions/signal/src/setup-surface.ts", + path: "native-plugins/signal/src/setup-surface.ts", forbiddenPatterns: [ /\bdetectBinary\b/, /\binstallSignalCli\b/, @@ -90,35 +90,35 @@ const SETUP_BARREL_GUARDS: GuardedSource[] = [ ], }, { - path: "extensions/slack/src/setup-core.ts", + path: "native-plugins/slack/src/setup-core.ts", forbiddenPatterns: [/\bformatDocsLink\b/], }, { - path: "extensions/slack/src/setup-surface.ts", + path: "native-plugins/slack/src/setup-surface.ts", forbiddenPatterns: [/\bformatDocsLink\b/], }, { - path: "extensions/discord/src/setup-core.ts", + path: "native-plugins/discord/src/setup-core.ts", forbiddenPatterns: [/\bformatDocsLink\b/], }, { - path: "extensions/discord/src/setup-surface.ts", + path: "native-plugins/discord/src/setup-surface.ts", forbiddenPatterns: [/\bformatDocsLink\b/], }, { - path: "extensions/imessage/src/setup-core.ts", + path: "native-plugins/imessage/src/setup-core.ts", forbiddenPatterns: [/\bformatDocsLink\b/], }, { - path: "extensions/imessage/src/setup-surface.ts", + path: "native-plugins/imessage/src/setup-surface.ts", forbiddenPatterns: [/\bdetectBinary\b/, /\bformatDocsLink\b/], }, { - path: "extensions/telegram/src/setup-core.ts", + path: "native-plugins/telegram/src/setup-core.ts", forbiddenPatterns: [/\bformatCliCommand\b/, /\bformatDocsLink\b/], }, { - path: "extensions/whatsapp/src/setup-surface.ts", + path: "native-plugins/whatsapp/src/setup-surface.ts", forbiddenPatterns: [/\bformatCliCommand\b/, /\bformatDocsLink\b/], }, ]; @@ -162,8 +162,8 @@ const LOCAL_EXTENSION_API_BARREL_GUARDS = [ const LOCAL_EXTENSION_API_BARREL_EXCEPTIONS = [ // Direct import avoids a circular init path: - // accounts.ts -> runtime-api.ts -> src/plugin-sdk/matrix -> extensions/matrix/api.ts -> accounts.ts - "extensions/matrix/src/matrix/accounts.ts", + // accounts.ts -> runtime-api.ts -> src/plugin-sdk/matrix -> native-plugins/matrix/api.ts -> accounts.ts + "native-plugins/matrix/src/matrix/accounts.ts", ] as const; function readSource(path: string): string { @@ -413,7 +413,7 @@ describe("channel import guardrails", () => { it("keeps core production files off extension private src imports", () => { for (const file of collectCoreSourceFiles()) { const text = readFileSync(file, "utf8"); - expect(text, `${file} should not import extensions/*/src`).not.toMatch( + expect(text, `${file} should not import native-plugins/*/src`).not.toMatch( /["'][^"']*extensions\/[^/"']+\/src\//, ); } diff --git a/src/plugin-sdk/compat.ts b/src/plugin-sdk/compat.ts index 5e2bcd11f58..ed01fc71bb6 100644 --- a/src/plugin-sdk/compat.ts +++ b/src/plugin-sdk/compat.ts @@ -46,5 +46,5 @@ export { mapAllowlistResolutionInputs } from "./allowlist-resolution.js"; export { resolveBlueBubblesGroupRequireMention, resolveBlueBubblesGroupToolPolicy, -} from "../../extensions/bluebubbles/runtime-api.js"; +} from "../../native-plugins/bluebubbles/runtime-api.js"; export { collectBlueBubblesStatusIssues } from "../channels/plugins/status-issues/bluebubbles.js"; diff --git a/src/plugin-sdk/copilot-proxy.ts b/src/plugin-sdk/copilot-proxy.ts index d4a4dec92bf..f2204512510 100644 --- a/src/plugin-sdk/copilot-proxy.ts +++ b/src/plugin-sdk/copilot-proxy.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled copilot-proxy plugin. -// Keep this list additive and scoped to symbols used under extensions/copilot-proxy. +// Keep this list additive and scoped to symbols used under native-plugins/copilot-proxy. export { definePluginEntry } from "./core.js"; export type { diff --git a/src/plugin-sdk/device-pair.ts b/src/plugin-sdk/device-pair.ts index a87e1eea8f1..69b578ff6c4 100644 --- a/src/plugin-sdk/device-pair.ts +++ b/src/plugin-sdk/device-pair.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled device-pair plugin. -// Keep this list additive and scoped to symbols used under extensions/device-pair. +// Keep this list additive and scoped to symbols used under native-plugins/device-pair. export { definePluginEntry } from "./core.js"; export { approveDevicePairing, listDevicePairing } from "../infra/device-pairing.js"; diff --git a/src/plugin-sdk/diagnostics-otel.ts b/src/plugin-sdk/diagnostics-otel.ts index cb5038f4c42..d09cefa94a1 100644 --- a/src/plugin-sdk/diagnostics-otel.ts +++ b/src/plugin-sdk/diagnostics-otel.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled diagnostics-otel plugin. -// Keep this list additive and scoped to symbols used under extensions/diagnostics-otel. +// Keep this list additive and scoped to symbols used under native-plugins/diagnostics-otel. export type { DiagnosticEventPayload } from "../infra/diagnostic-events.js"; export { emitDiagnosticEvent, onDiagnosticEvent } from "../infra/diagnostic-events.js"; diff --git a/src/plugin-sdk/diffs.ts b/src/plugin-sdk/diffs.ts index 9884781be8d..917777edece 100644 --- a/src/plugin-sdk/diffs.ts +++ b/src/plugin-sdk/diffs.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled diffs plugin. -// Keep this list additive and scoped to symbols used under extensions/diffs. +// Keep this list additive and scoped to symbols used under native-plugins/diffs. export { definePluginEntry } from "./core.js"; export type { OpenClawConfig } from "../config/config.js"; diff --git a/src/plugin-sdk/discord-send.ts b/src/plugin-sdk/discord-send.ts index 7870bc2f2fa..23c5d1c9105 100644 --- a/src/plugin-sdk/discord-send.ts +++ b/src/plugin-sdk/discord-send.ts @@ -1,4 +1,4 @@ -import type { DiscordSendResult } from "../../extensions/discord/api.js"; +import type { DiscordSendResult } from "../../native-plugins/discord/api.js"; import { attachChannelToResult } from "./channel-send-result.js"; type DiscordSendOptionInput = { diff --git a/src/plugin-sdk/discord.ts b/src/plugin-sdk/discord.ts index 043e9cfa4b9..500df3ee75c 100644 --- a/src/plugin-sdk/discord.ts +++ b/src/plugin-sdk/discord.ts @@ -6,14 +6,14 @@ export type { export type { OpenClawConfig } from "../config/config.js"; export type { DiscordAccountConfig, DiscordActionConfig } from "../config/types.js"; export type { DiscordConfig, DiscordPluralKitConfig } from "../config/types.discord.js"; -export type { InspectedDiscordAccount } from "../../extensions/discord/api.js"; -export type { ResolvedDiscordAccount } from "../../extensions/discord/api.js"; -export type { DiscordSendComponents, DiscordSendEmbeds } from "../../extensions/discord/api.js"; +export type { InspectedDiscordAccount } from "../../native-plugins/discord/api.js"; +export type { ResolvedDiscordAccount } from "../../native-plugins/discord/api.js"; +export type { DiscordSendComponents, DiscordSendEmbeds } from "../../native-plugins/discord/api.js"; export type { ThreadBindingManager, ThreadBindingRecord, ThreadBindingTargetKind, -} from "../../extensions/discord/runtime-api.js"; +} from "../../native-plugins/discord/runtime-api.js"; export type { ChannelConfiguredBindingProvider, ChannelConfiguredBindingConversationRef, @@ -51,11 +51,11 @@ export { export { listDiscordDirectoryGroupsFromConfig, listDiscordDirectoryPeersFromConfig, -} from "../../extensions/discord/api.js"; +} from "../../native-plugins/discord/api.js"; export { resolveDiscordGroupRequireMention, resolveDiscordGroupToolPolicy, -} from "../../extensions/discord/api.js"; +} from "../../native-plugins/discord/api.js"; export { DiscordConfigSchema } from "../config/zod-schema.providers-core.js"; export { @@ -67,20 +67,20 @@ export { createDiscordActionGate, listDiscordAccountIds, resolveDefaultDiscordAccountId, -} from "../../extensions/discord/api.js"; -export { inspectDiscordAccount } from "../../extensions/discord/api.js"; +} from "../../native-plugins/discord/api.js"; +export { inspectDiscordAccount } from "../../native-plugins/discord/api.js"; export { looksLikeDiscordTargetId, normalizeDiscordMessagingTarget, normalizeDiscordOutboundTarget, -} from "../../extensions/discord/api.js"; -export { collectDiscordAuditChannelIds } from "../../extensions/discord/runtime-api.js"; -export { collectDiscordStatusIssues } from "../../extensions/discord/api.js"; +} from "../../native-plugins/discord/api.js"; +export { collectDiscordAuditChannelIds } from "../../native-plugins/discord/runtime-api.js"; +export { collectDiscordStatusIssues } from "../../native-plugins/discord/api.js"; export { DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS, DISCORD_DEFAULT_LISTENER_TIMEOUT_MS, -} from "../../extensions/discord/runtime-api.js"; -export { normalizeExplicitDiscordSessionKey } from "../../extensions/discord/session-key-api.js"; +} from "../../native-plugins/discord/runtime-api.js"; +export { normalizeExplicitDiscordSessionKey } from "../../native-plugins/discord/session-key-api.js"; export { autoBindSpawnedDiscordSubagent, getThreadBindingManager, @@ -92,11 +92,11 @@ export { setThreadBindingIdleTimeoutBySessionKey, setThreadBindingMaxAgeBySessionKey, unbindThreadBindingsBySessionKey, -} from "../../extensions/discord/runtime-api.js"; -export { getGateway } from "../../extensions/discord/runtime-api.js"; -export { getPresence } from "../../extensions/discord/runtime-api.js"; -export { readDiscordComponentSpec } from "../../extensions/discord/api.js"; -export { resolveDiscordChannelId } from "../../extensions/discord/api.js"; +} from "../../native-plugins/discord/runtime-api.js"; +export { getGateway } from "../../native-plugins/discord/runtime-api.js"; +export { getPresence } from "../../native-plugins/discord/runtime-api.js"; +export { readDiscordComponentSpec } from "../../native-plugins/discord/api.js"; +export { resolveDiscordChannelId } from "../../native-plugins/discord/api.js"; export { addRoleDiscord, auditDiscordChannelPermissions, @@ -148,5 +148,5 @@ export { unpinMessageDiscord, uploadEmojiDiscord, uploadStickerDiscord, -} from "../../extensions/discord/runtime-api.js"; -export { discordMessageActions } from "../../extensions/discord/runtime-api.js"; +} from "../../native-plugins/discord/runtime-api.js"; +export { discordMessageActions } from "../../native-plugins/discord/runtime-api.js"; diff --git a/src/plugin-sdk/extension-shared.ts b/src/plugin-sdk/extension-shared.ts index 43c11f7c09d..8c79d373536 100644 --- a/src/plugin-sdk/extension-shared.ts +++ b/src/plugin-sdk/extension-shared.ts @@ -1,135 +1 @@ -import type { z } from "zod"; -import { runPassiveAccountLifecycle } from "./channel-runtime.js"; -import { createLoggerBackedRuntime } from "./runtime.js"; - -type PassiveChannelStatusSnapshot = { - configured?: boolean; - running?: boolean; - lastStartAt?: number | null; - lastStopAt?: number | null; - lastError?: string | null; - probe?: unknown; - lastProbeAt?: number | null; -}; - -type TrafficStatusSnapshot = { - lastInboundAt?: number | null; - lastOutboundAt?: number | null; -}; - -type StoppableMonitor = { - stop: () => void; -}; - -type RequireOpenAllowFromFn = (params: { - policy?: string; - allowFrom?: Array; - ctx: z.RefinementCtx; - path: Array; - message: string; -}) => void; - -export function buildPassiveChannelStatusSummary( - snapshot: PassiveChannelStatusSnapshot, - extra?: TExtra, -) { - return { - configured: snapshot.configured ?? false, - ...(extra ?? ({} as TExtra)), - running: snapshot.running ?? false, - lastStartAt: snapshot.lastStartAt ?? null, - lastStopAt: snapshot.lastStopAt ?? null, - lastError: snapshot.lastError ?? null, - }; -} - -export function buildPassiveProbedChannelStatusSummary( - snapshot: PassiveChannelStatusSnapshot, - extra?: TExtra, -) { - return { - ...buildPassiveChannelStatusSummary(snapshot, extra), - probe: snapshot.probe, - lastProbeAt: snapshot.lastProbeAt ?? null, - }; -} - -export function buildTrafficStatusSummary( - snapshot?: TSnapshot | null, -) { - return { - lastInboundAt: snapshot?.lastInboundAt ?? null, - lastOutboundAt: snapshot?.lastOutboundAt ?? null, - }; -} - -export async function runStoppablePassiveMonitor(params: { - abortSignal: AbortSignal; - start: () => Promise; -}): Promise { - await runPassiveAccountLifecycle({ - abortSignal: params.abortSignal, - start: params.start, - stop: async (monitor) => { - monitor.stop(); - }, - }); -} - -export function resolveLoggerBackedRuntime( - runtime: TRuntime | undefined, - logger: Parameters[0]["logger"], -): TRuntime { - return ( - runtime ?? - (createLoggerBackedRuntime({ - logger, - exitError: () => new Error("Runtime exit not available"), - }) as TRuntime) - ); -} - -export function requireChannelOpenAllowFrom(params: { - channel: string; - policy?: string; - allowFrom?: Array; - ctx: z.RefinementCtx; - requireOpenAllowFrom: RequireOpenAllowFromFn; -}) { - params.requireOpenAllowFrom({ - policy: params.policy, - allowFrom: params.allowFrom, - ctx: params.ctx, - path: ["allowFrom"], - message: `channels.${params.channel}.dmPolicy="open" requires channels.${params.channel}.allowFrom to include "*"`, - }); -} - -export function readStatusIssueFields( - value: unknown, - fields: readonly TField[], -): Record | null { - if (!value || typeof value !== "object") { - return null; - } - const record = value as Record; - const result = {} as Record; - for (const field of fields) { - result[field] = record[field]; - } - return result; -} - -export function coerceStatusIssueAccountId(value: unknown): string | undefined { - return typeof value === "string" ? value : typeof value === "number" ? String(value) : undefined; -} - -export function createDeferred() { - let resolve!: (value: T | PromiseLike) => void; - let reject!: (reason?: unknown) => void; - const promise = new Promise((res, rej) => { - resolve = res; - reject = rej; - }); - return { promise, resolve, reject }; -} +export * from "./native-plugin-shared.js"; diff --git a/src/plugin-sdk/feishu.ts b/src/plugin-sdk/feishu.ts index 70a55d58474..45b15ca8f0e 100644 --- a/src/plugin-sdk/feishu.ts +++ b/src/plugin-sdk/feishu.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled feishu plugin. -// Keep this list additive and scoped to symbols used under extensions/feishu. +// Keep this list additive and scoped to symbols used under native-plugins/feishu. export type { HistoryEntry } from "../auto-reply/reply/history.js"; export { @@ -67,7 +67,7 @@ export type { RuntimeEnv } from "../runtime.js"; export { formatDocsLink } from "../terminal/links.js"; export { evaluateSenderGroupAccessForPolicy } from "./group-access.js"; export type { WizardPrompter } from "../wizard/prompts.js"; -export { feishuSetupWizard, feishuSetupAdapter } from "../../extensions/feishu/setup-api.js"; +export { feishuSetupWizard, feishuSetupAdapter } from "../../native-plugins/feishu/setup-api.js"; export { buildAgentMediaPayload } from "./agent-media-payload.js"; export { readJsonFileWithFallback } from "./json-store.js"; export { createChannelPairingController } from "./channel-pairing.js"; @@ -82,7 +82,7 @@ export { withTempDownloadPath } from "./temp-path.js"; export { buildFeishuConversationId, parseFeishuConversationId, -} from "../../extensions/feishu/api.js"; +} from "../../native-plugins/feishu/api.js"; export { createWebhookAnomalyTracker, createFixedWindowRateLimiter, diff --git a/src/plugin-sdk/googlechat.ts b/src/plugin-sdk/googlechat.ts index 35f07014e86..353534fca02 100644 --- a/src/plugin-sdk/googlechat.ts +++ b/src/plugin-sdk/googlechat.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled googlechat plugin. -// Keep this list additive and scoped to symbols used under extensions/googlechat. +// Keep this list additive and scoped to symbols used under native-plugins/googlechat. import { resolveChannelGroupRequireMention } from "./channel-policy.js"; import { createOptionalChannelSetupSurface } from "./channel-setup.js"; diff --git a/src/plugin-sdk/imessage-core.ts b/src/plugin-sdk/imessage-core.ts index dfc131c6266..e359b3b764e 100644 --- a/src/plugin-sdk/imessage-core.ts +++ b/src/plugin-sdk/imessage-core.ts @@ -17,5 +17,5 @@ export { parseChatTargetPrefixesOrThrow, resolveServicePrefixedAllowTarget, resolveServicePrefixedTarget, -} from "../../extensions/imessage/api.js"; -export type { ParsedChatTarget } from "../../extensions/imessage/api.js"; +} from "../../native-plugins/imessage/api.js"; +export type { ParsedChatTarget } from "../../native-plugins/imessage/api.js"; diff --git a/src/plugin-sdk/imessage-targets.ts b/src/plugin-sdk/imessage-targets.ts index 4a7f535be48..e33cc1778f4 100644 --- a/src/plugin-sdk/imessage-targets.ts +++ b/src/plugin-sdk/imessage-targets.ts @@ -1 +1 @@ -export { normalizeIMessageHandle } from "../../extensions/imessage/api.js"; +export { normalizeIMessageHandle } from "../../native-plugins/imessage/api.js"; diff --git a/src/plugin-sdk/imessage.ts b/src/plugin-sdk/imessage.ts index b6c98da97c6..c1b41e6779e 100644 --- a/src/plugin-sdk/imessage.ts +++ b/src/plugin-sdk/imessage.ts @@ -38,7 +38,7 @@ export { export { resolveIMessageGroupRequireMention, resolveIMessageGroupToolPolicy, -} from "../../extensions/imessage/api.js"; +} from "../../native-plugins/imessage/api.js"; export { IMessageConfigSchema } from "../config/zod-schema.providers-core.js"; export { resolveChannelMediaMaxBytes } from "../channels/plugins/media-limits.js"; @@ -47,4 +47,4 @@ export { monitorIMessageProvider, probeIMessage, sendMessageIMessage, -} from "../../extensions/imessage/runtime-api.js"; +} from "../../native-plugins/imessage/runtime-api.js"; diff --git a/src/plugin-sdk/irc.ts b/src/plugin-sdk/irc.ts index 29df9fb5748..cf6aa9b2f82 100644 --- a/src/plugin-sdk/irc.ts +++ b/src/plugin-sdk/irc.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled irc plugin. -// Keep this list additive and scoped to symbols used under extensions/irc. +// Keep this list additive and scoped to symbols used under native-plugins/irc. export { resolveControlCommandGate } from "../channels/command-gating.js"; export { logInboundDrop } from "../channels/logging.js"; @@ -62,7 +62,7 @@ export { listIrcAccountIds, resolveDefaultIrcAccountId, resolveIrcAccount, -} from "../../extensions/irc/api.js"; +} from "../../native-plugins/irc/api.js"; export { readStoreAllowFromForDmPolicy, resolveEffectiveAllowFromLists, @@ -71,7 +71,7 @@ export { formatDocsLink } from "../terminal/links.js"; export type { WizardPrompter } from "../wizard/prompts.js"; export { createChannelPairingController } from "./channel-pairing.js"; export { dispatchInboundReplyWithBase } from "./inbound-reply-dispatch.js"; -export { ircSetupAdapter, ircSetupWizard } from "../../extensions/irc/api.js"; +export { ircSetupAdapter, ircSetupWizard } from "../../native-plugins/irc/api.js"; export type { OutboundReplyPayload } from "./reply-payload.js"; export { createNormalizedOutboundDeliverer, diff --git a/src/plugin-sdk/line.ts b/src/plugin-sdk/line.ts index 16a6c235ac3..8c721f20e75 100644 --- a/src/plugin-sdk/line.ts +++ b/src/plugin-sdk/line.ts @@ -32,7 +32,7 @@ export { resolveDefaultLineAccountId, resolveLineAccount, } from "../line/accounts.js"; -export { lineSetupAdapter, lineSetupWizard } from "../../extensions/line/setup-api.js"; +export { lineSetupAdapter, lineSetupWizard } from "../../native-plugins/line/setup-api.js"; export { LineConfigSchema } from "../line/config-schema.js"; export type { LineChannelData, LineConfig, ResolvedLineAccount } from "../line/types.js"; export { diff --git a/src/plugin-sdk/llm-task.ts b/src/plugin-sdk/llm-task.ts index b93a3197d26..a2fbb1a5be2 100644 --- a/src/plugin-sdk/llm-task.ts +++ b/src/plugin-sdk/llm-task.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled llm-task plugin. -// Keep this list additive and scoped to symbols used under extensions/llm-task. +// Keep this list additive and scoped to symbols used under native-plugins/llm-task. export { definePluginEntry } from "./core.js"; export { resolvePreferredOpenClawTmpDir } from "../infra/tmp-openclaw-dir.js"; diff --git a/src/plugin-sdk/matrix.ts b/src/plugin-sdk/matrix.ts index 660fe7183fb..402a4aa3aa7 100644 --- a/src/plugin-sdk/matrix.ts +++ b/src/plugin-sdk/matrix.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled matrix plugin. -// Keep this list additive and scoped to symbols used under extensions/matrix. +// Keep this list additive and scoped to symbols used under native-plugins/matrix. import { createOptionalChannelSetupSurface } from "./channel-setup.js"; @@ -85,7 +85,7 @@ export { export { setMatrixThreadBindingIdleTimeoutBySessionKey, setMatrixThreadBindingMaxAgeBySessionKey, -} from "../../extensions/matrix/thread-bindings-runtime.js"; +} from "../../native-plugins/matrix/thread-bindings-runtime.js"; export { createTypingCallbacks } from "../channels/typing.js"; export { createChannelReplyPipeline } from "./channel-reply-pipeline.js"; export type { OpenClawConfig } from "../config/config.js"; @@ -160,12 +160,12 @@ export { resolveMatrixCredentialsDir, resolveMatrixCredentialsPath, resolveMatrixLegacyFlatStoragePaths, -} from "../../extensions/matrix/helper-api.js"; -export { getMatrixScopedEnvVarNames } from "../../extensions/matrix/helper-api.js"; +} from "../../native-plugins/matrix/helper-api.js"; +export { getMatrixScopedEnvVarNames } from "../../native-plugins/matrix/helper-api.js"; export { requiresExplicitMatrixDefaultAccount, resolveMatrixDefaultOrOnlyAccountId, -} from "../../extensions/matrix/helper-api.js"; +} from "../../native-plugins/matrix/helper-api.js"; const matrixSetup = createOptionalChannelSetupSurface({ channel: "matrix", diff --git a/src/plugin-sdk/mattermost.ts b/src/plugin-sdk/mattermost.ts index 8ab28d2a4ea..11d282501e7 100644 --- a/src/plugin-sdk/mattermost.ts +++ b/src/plugin-sdk/mattermost.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled mattermost plugin. -// Keep this list additive and scoped to symbols used under extensions/mattermost. +// Keep this list additive and scoped to symbols used under native-plugins/mattermost. export { formatInboundFromLabel } from "../auto-reply/envelope.js"; export type { HistoryEntry } from "../auto-reply/reply/history.js"; diff --git a/src/plugin-sdk/memory-core.ts b/src/plugin-sdk/memory-core.ts index b715c1f50ca..6a5f6c42325 100644 --- a/src/plugin-sdk/memory-core.ts +++ b/src/plugin-sdk/memory-core.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled memory-core plugin. -// Keep this list additive and scoped to symbols used under extensions/memory-core. +// Keep this list additive and scoped to symbols used under native-plugins/memory-core. export { emptyPluginConfigSchema } from "../plugins/config-schema.js"; export type { OpenClawPluginApi } from "../plugins/types.js"; diff --git a/src/plugin-sdk/memory-lancedb.ts b/src/plugin-sdk/memory-lancedb.ts index 23d3e2619c8..ebf7b5444f1 100644 --- a/src/plugin-sdk/memory-lancedb.ts +++ b/src/plugin-sdk/memory-lancedb.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled memory-lancedb plugin. -// Keep this list additive and scoped to symbols used under extensions/memory-lancedb. +// Keep this list additive and scoped to symbols used under native-plugins/memory-lancedb. export { definePluginEntry } from "./core.js"; export type { OpenClawPluginApi } from "../plugins/types.js"; diff --git a/src/plugin-sdk/msteams.ts b/src/plugin-sdk/msteams.ts index 1c72c82ea53..90d430bc4f9 100644 --- a/src/plugin-sdk/msteams.ts +++ b/src/plugin-sdk/msteams.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled msteams plugin. -// Keep this list additive and scoped to symbols used under extensions/msteams. +// Keep this list additive and scoped to symbols used under native-plugins/msteams. import { createOptionalChannelSetupSurface } from "./channel-setup.js"; diff --git a/src/plugin-sdk/native-plugin-shared.ts b/src/plugin-sdk/native-plugin-shared.ts new file mode 100644 index 00000000000..43c11f7c09d --- /dev/null +++ b/src/plugin-sdk/native-plugin-shared.ts @@ -0,0 +1,135 @@ +import type { z } from "zod"; +import { runPassiveAccountLifecycle } from "./channel-runtime.js"; +import { createLoggerBackedRuntime } from "./runtime.js"; + +type PassiveChannelStatusSnapshot = { + configured?: boolean; + running?: boolean; + lastStartAt?: number | null; + lastStopAt?: number | null; + lastError?: string | null; + probe?: unknown; + lastProbeAt?: number | null; +}; + +type TrafficStatusSnapshot = { + lastInboundAt?: number | null; + lastOutboundAt?: number | null; +}; + +type StoppableMonitor = { + stop: () => void; +}; + +type RequireOpenAllowFromFn = (params: { + policy?: string; + allowFrom?: Array; + ctx: z.RefinementCtx; + path: Array; + message: string; +}) => void; + +export function buildPassiveChannelStatusSummary( + snapshot: PassiveChannelStatusSnapshot, + extra?: TExtra, +) { + return { + configured: snapshot.configured ?? false, + ...(extra ?? ({} as TExtra)), + running: snapshot.running ?? false, + lastStartAt: snapshot.lastStartAt ?? null, + lastStopAt: snapshot.lastStopAt ?? null, + lastError: snapshot.lastError ?? null, + }; +} + +export function buildPassiveProbedChannelStatusSummary( + snapshot: PassiveChannelStatusSnapshot, + extra?: TExtra, +) { + return { + ...buildPassiveChannelStatusSummary(snapshot, extra), + probe: snapshot.probe, + lastProbeAt: snapshot.lastProbeAt ?? null, + }; +} + +export function buildTrafficStatusSummary( + snapshot?: TSnapshot | null, +) { + return { + lastInboundAt: snapshot?.lastInboundAt ?? null, + lastOutboundAt: snapshot?.lastOutboundAt ?? null, + }; +} + +export async function runStoppablePassiveMonitor(params: { + abortSignal: AbortSignal; + start: () => Promise; +}): Promise { + await runPassiveAccountLifecycle({ + abortSignal: params.abortSignal, + start: params.start, + stop: async (monitor) => { + monitor.stop(); + }, + }); +} + +export function resolveLoggerBackedRuntime( + runtime: TRuntime | undefined, + logger: Parameters[0]["logger"], +): TRuntime { + return ( + runtime ?? + (createLoggerBackedRuntime({ + logger, + exitError: () => new Error("Runtime exit not available"), + }) as TRuntime) + ); +} + +export function requireChannelOpenAllowFrom(params: { + channel: string; + policy?: string; + allowFrom?: Array; + ctx: z.RefinementCtx; + requireOpenAllowFrom: RequireOpenAllowFromFn; +}) { + params.requireOpenAllowFrom({ + policy: params.policy, + allowFrom: params.allowFrom, + ctx: params.ctx, + path: ["allowFrom"], + message: `channels.${params.channel}.dmPolicy="open" requires channels.${params.channel}.allowFrom to include "*"`, + }); +} + +export function readStatusIssueFields( + value: unknown, + fields: readonly TField[], +): Record | null { + if (!value || typeof value !== "object") { + return null; + } + const record = value as Record; + const result = {} as Record; + for (const field of fields) { + result[field] = record[field]; + } + return result; +} + +export function coerceStatusIssueAccountId(value: unknown): string | undefined { + return typeof value === "string" ? value : typeof value === "number" ? String(value) : undefined; +} + +export function createDeferred() { + let resolve!: (value: T | PromiseLike) => void; + let reject!: (reason?: unknown) => void; + const promise = new Promise((res, rej) => { + resolve = res; + reject = rej; + }); + return { promise, resolve, reject }; +} diff --git a/src/plugin-sdk/nextcloud-talk.ts b/src/plugin-sdk/nextcloud-talk.ts index 229ff806db0..1dcb885477d 100644 --- a/src/plugin-sdk/nextcloud-talk.ts +++ b/src/plugin-sdk/nextcloud-talk.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled nextcloud-talk plugin. -// Keep this list additive and scoped to symbols used under extensions/nextcloud-talk. +// Keep this list additive and scoped to symbols used under native-plugins/nextcloud-talk. export { logInboundDrop } from "../channels/logging.js"; export { resolveMentionGatingWithBypass } from "../channels/mention-gating.js"; diff --git a/src/plugin-sdk/nostr.ts b/src/plugin-sdk/nostr.ts index 640642dcd46..fdc435c019b 100644 --- a/src/plugin-sdk/nostr.ts +++ b/src/plugin-sdk/nostr.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled nostr plugin. -// Keep this list additive and scoped to symbols used under extensions/nostr. +// Keep this list additive and scoped to symbols used under native-plugins/nostr. import { createOptionalChannelSetupSurface } from "./channel-setup.js"; diff --git a/src/plugin-sdk/open-prose.ts b/src/plugin-sdk/open-prose.ts index 049370ed986..6a180fc3622 100644 --- a/src/plugin-sdk/open-prose.ts +++ b/src/plugin-sdk/open-prose.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled open-prose plugin. -// Keep this list additive and scoped to symbols used under extensions/open-prose. +// Keep this list additive and scoped to symbols used under native-plugins/open-prose. export { definePluginEntry } from "./core.js"; export type { OpenClawPluginApi } from "../plugins/types.js"; diff --git a/src/plugin-sdk/phone-control.ts b/src/plugin-sdk/phone-control.ts index c116eba1076..df3c57f5aa2 100644 --- a/src/plugin-sdk/phone-control.ts +++ b/src/plugin-sdk/phone-control.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled phone-control plugin. -// Keep this list additive and scoped to symbols used under extensions/phone-control. +// Keep this list additive and scoped to symbols used under native-plugins/phone-control. export { definePluginEntry } from "./core.js"; export type { diff --git a/src/plugin-sdk/qwen-portal-auth.ts b/src/plugin-sdk/qwen-portal-auth.ts index adc61259a09..9e8497b056b 100644 --- a/src/plugin-sdk/qwen-portal-auth.ts +++ b/src/plugin-sdk/qwen-portal-auth.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled qwen-portal-auth plugin. -// Keep this list additive and scoped to symbols used under extensions/qwen-portal-auth. +// Keep this list additive and scoped to symbols used under native-plugins/qwen-portal-auth. export { definePluginEntry } from "./core.js"; export { buildOauthProviderAuthResult } from "./provider-auth-result.js"; diff --git a/src/plugin-sdk/runtime-api-guardrails.test.ts b/src/plugin-sdk/runtime-api-guardrails.test.ts index a8a7f4cd769..380ca2e215d 100644 --- a/src/plugin-sdk/runtime-api-guardrails.test.ts +++ b/src/plugin-sdk/runtime-api-guardrails.test.ts @@ -7,7 +7,7 @@ import { describe, expect, it } from "vitest"; const ROOT_DIR = resolve(dirname(fileURLToPath(import.meta.url)), ".."); const RUNTIME_API_EXPORT_GUARDS: Record = { - "extensions/discord/runtime-api.ts": [ + "native-plugins/discord/runtime-api.ts": [ 'export * from "./src/audit.js";', 'export * from "./src/actions/runtime.js";', 'export * from "./src/actions/runtime.moderation-shared.js";', @@ -26,7 +26,7 @@ const RUNTIME_API_EXPORT_GUARDS: Record = { 'export * from "./src/resolve-users.js";', 'export * from "./src/send.js";', ], - "extensions/imessage/runtime-api.ts": [ + "native-plugins/imessage/runtime-api.ts": [ 'export { DEFAULT_ACCOUNT_ID, PAIRING_APPROVED_MESSAGE, buildChannelConfigSchema, collectStatusIssuesFromLastError, formatTrimmedAllowFromEntries, getChatChannelMeta, looksLikeIMessageTargetId, normalizeIMessageMessagingTarget, resolveChannelMediaMaxBytes, resolveIMessageConfigAllowFrom, resolveIMessageConfigDefaultTo, IMessageConfigSchema, type ChannelPlugin, type IMessageAccountConfig } from "openclaw/plugin-sdk/imessage";', 'export { resolveIMessageGroupRequireMention, resolveIMessageGroupToolPolicy } from "./src/group-policy.js";', 'export { monitorIMessageProvider } from "./src/monitor.js";', @@ -34,23 +34,23 @@ const RUNTIME_API_EXPORT_GUARDS: Record = { 'export { probeIMessage } from "./src/probe.js";', 'export { sendMessageIMessage } from "./src/send.js";', ], - "extensions/googlechat/runtime-api.ts": ['export * from "openclaw/plugin-sdk/googlechat";'], - "extensions/matrix/runtime-api.ts": [ + "native-plugins/googlechat/runtime-api.ts": ['export * from "openclaw/plugin-sdk/googlechat";'], + "native-plugins/matrix/runtime-api.ts": [ 'export * from "./src/auth-precedence.js";', 'export * from "./helper-api.js";', ], - "extensions/nextcloud-talk/runtime-api.ts": [ + "native-plugins/nextcloud-talk/runtime-api.ts": [ 'export * from "openclaw/plugin-sdk/nextcloud-talk";', ], - "extensions/signal/runtime-api.ts": ['export * from "./src/runtime-api.js";'], - "extensions/slack/runtime-api.ts": [ + "native-plugins/signal/runtime-api.ts": ['export * from "./src/runtime-api.js";'], + "native-plugins/slack/runtime-api.ts": [ 'export * from "./src/action-runtime.js";', 'export * from "./src/directory-live.js";', 'export * from "./src/index.js";', 'export * from "./src/resolve-channels.js";', 'export * from "./src/resolve-users.js";', ], - "extensions/telegram/runtime-api.ts": [ + "native-plugins/telegram/runtime-api.ts": [ 'export type { ChannelMessageActionAdapter, ChannelPlugin, OpenClawConfig, OpenClawPluginApi, PluginRuntime, TelegramAccountConfig, TelegramActionConfig, TelegramNetworkConfig } from "openclaw/plugin-sdk/telegram";', 'export type { OpenClawPluginService, OpenClawPluginServiceContext, PluginLogger } from "openclaw/plugin-sdk/core";', 'export type { AcpRuntime, AcpRuntimeCapabilities, AcpRuntimeDoctorReport, AcpRuntimeEnsureInput, AcpRuntimeEvent, AcpRuntimeHandle, AcpRuntimeStatus, AcpRuntimeTurnInput, AcpRuntimeErrorCode, AcpSessionUpdateTag } from "openclaw/plugin-sdk/acp-runtime";', @@ -66,7 +66,7 @@ const RUNTIME_API_EXPORT_GUARDS: Record = { 'export { createTelegramThreadBindingManager, getTelegramThreadBindingManager, setTelegramThreadBindingIdleTimeoutBySessionKey, setTelegramThreadBindingMaxAgeBySessionKey } from "./src/thread-bindings.js";', 'export { resolveTelegramToken } from "./src/token.js";', ], - "extensions/whatsapp/runtime-api.ts": [ + "native-plugins/whatsapp/runtime-api.ts": [ 'export * from "./src/active-listener.js";', 'export * from "./src/action-runtime.js";', 'export * from "./src/agent-tools-login.js";', diff --git a/src/plugin-sdk/signal.ts b/src/plugin-sdk/signal.ts index b3a7d0147b5..0845c844311 100644 --- a/src/plugin-sdk/signal.ts +++ b/src/plugin-sdk/signal.ts @@ -1,7 +1,7 @@ export type { ChannelMessageActionAdapter } from "../channels/plugins/types.js"; export type { OpenClawConfig } from "../config/config.js"; export type { SignalAccountConfig } from "../config/types.js"; -export type { ResolvedSignalAccount } from "../../extensions/signal/api.js"; +export type { ResolvedSignalAccount } from "../../native-plugins/signal/api.js"; export type { ChannelMessageActionContext, ChannelPlugin, @@ -51,10 +51,10 @@ export { listEnabledSignalAccounts, listSignalAccountIds, resolveDefaultSignalAccountId, -} from "../../extensions/signal/api.js"; -export { monitorSignalProvider } from "../../extensions/signal/api.js"; -export { probeSignal } from "../../extensions/signal/api.js"; -export { resolveSignalReactionLevel } from "../../extensions/signal/api.js"; -export { removeReactionSignal, sendReactionSignal } from "../../extensions/signal/api.js"; -export { sendMessageSignal } from "../../extensions/signal/api.js"; -export { signalMessageActions } from "../../extensions/signal/api.js"; +} from "../../native-plugins/signal/api.js"; +export { monitorSignalProvider } from "../../native-plugins/signal/api.js"; +export { probeSignal } from "../../native-plugins/signal/api.js"; +export { resolveSignalReactionLevel } from "../../native-plugins/signal/api.js"; +export { removeReactionSignal, sendReactionSignal } from "../../native-plugins/signal/api.js"; +export { sendMessageSignal } from "../../native-plugins/signal/api.js"; +export { signalMessageActions } from "../../native-plugins/signal/api.js"; diff --git a/src/plugin-sdk/slack-targets.ts b/src/plugin-sdk/slack-targets.ts index 20ea56e44d1..1df9400797d 100644 --- a/src/plugin-sdk/slack-targets.ts +++ b/src/plugin-sdk/slack-targets.ts @@ -3,4 +3,4 @@ export { resolveSlackChannelId, type SlackTarget, type SlackTargetKind, -} from "../../extensions/slack/api.js"; +} from "../../native-plugins/slack/api.js"; diff --git a/src/plugin-sdk/slack.ts b/src/plugin-sdk/slack.ts index f9f06f8f4e8..01e4d823d00 100644 --- a/src/plugin-sdk/slack.ts +++ b/src/plugin-sdk/slack.ts @@ -1,7 +1,7 @@ export type { OpenClawConfig } from "../config/config.js"; export type { SlackAccountConfig } from "../config/types.slack.js"; -export type { InspectedSlackAccount } from "../../extensions/slack/api.js"; -export type { ResolvedSlackAccount } from "../../extensions/slack/api.js"; +export type { InspectedSlackAccount } from "../../native-plugins/slack/api.js"; +export type { ResolvedSlackAccount } from "../../native-plugins/slack/api.js"; export type { ChannelMessageActionContext, ChannelPlugin, @@ -35,7 +35,7 @@ export { export { listSlackDirectoryGroupsFromConfig, listSlackDirectoryPeersFromConfig, -} from "../../extensions/slack/api.js"; +} from "../../native-plugins/slack/api.js"; export { resolveDefaultGroupPolicy, resolveOpenProviderRuntimeGroupPolicy, @@ -43,7 +43,7 @@ export { export { resolveSlackGroupRequireMention, resolveSlackGroupToolPolicy, -} from "../../extensions/slack/api.js"; +} from "../../native-plugins/slack/api.js"; export { SlackConfigSchema } from "../config/zod-schema.providers-core.js"; export { buildComputedAccountStatusSnapshot } from "./status-helpers.js"; @@ -52,14 +52,14 @@ export { listSlackAccountIds, resolveDefaultSlackAccountId, resolveSlackReplyToMode, -} from "../../extensions/slack/api.js"; -export { isSlackInteractiveRepliesEnabled } from "../../extensions/slack/api.js"; -export { inspectSlackAccount } from "../../extensions/slack/api.js"; +} from "../../native-plugins/slack/api.js"; +export { isSlackInteractiveRepliesEnabled } from "../../native-plugins/slack/api.js"; +export { inspectSlackAccount } from "../../native-plugins/slack/api.js"; export { parseSlackTarget, resolveSlackChannelId } from "./slack-targets.js"; -export { extractSlackToolSend, listSlackMessageActions } from "../../extensions/slack/api.js"; -export { buildSlackThreadingToolContext } from "../../extensions/slack/api.js"; -export { parseSlackBlocksInput } from "../../extensions/slack/api.js"; -export { handleSlackHttpRequest } from "../../extensions/slack/api.js"; +export { extractSlackToolSend, listSlackMessageActions } from "../../native-plugins/slack/api.js"; +export { buildSlackThreadingToolContext } from "../../native-plugins/slack/api.js"; +export { parseSlackBlocksInput } from "../../native-plugins/slack/api.js"; +export { handleSlackHttpRequest } from "../../native-plugins/slack/api.js"; export { handleSlackAction, listSlackDirectoryGroupsLive, @@ -69,7 +69,7 @@ export { resolveSlackChannelAllowlist, resolveSlackUserAllowlist, sendMessageSlack, -} from "../../extensions/slack/runtime-api.js"; +} from "../../native-plugins/slack/runtime-api.js"; export { deleteSlackMessage, downloadSlackFile, @@ -85,6 +85,6 @@ export { removeSlackReaction, sendSlackMessage, unpinSlackMessage, -} from "../../extensions/slack/api.js"; -export { recordSlackThreadParticipation } from "../../extensions/slack/api.js"; -export type { SlackActionContext } from "../../extensions/slack/runtime-api.js"; +} from "../../native-plugins/slack/api.js"; +export { recordSlackThreadParticipation } from "../../native-plugins/slack/api.js"; +export type { SlackActionContext } from "../../native-plugins/slack/runtime-api.js"; diff --git a/src/plugin-sdk/synology-chat.ts b/src/plugin-sdk/synology-chat.ts index 1b10e475f67..af0c994a6dc 100644 --- a/src/plugin-sdk/synology-chat.ts +++ b/src/plugin-sdk/synology-chat.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled synology-chat plugin. -// Keep this list additive and scoped to symbols used under extensions/synology-chat. +// Keep this list additive and scoped to symbols used under native-plugins/synology-chat. export { setAccountEnabledInConfigSection } from "../channels/plugins/config-helpers.js"; export { buildChannelConfigSchema } from "../channels/plugins/config-schema.js"; @@ -20,4 +20,4 @@ export { createFixedWindowRateLimiter } from "./webhook-memory-guards.js"; export { synologyChatSetupAdapter, synologyChatSetupWizard, -} from "../../extensions/synology-chat/setup-api.js"; +} from "../../native-plugins/synology-chat/setup-api.js"; diff --git a/src/plugin-sdk/talk-voice.ts b/src/plugin-sdk/talk-voice.ts index 10f4096da03..d3e1bd60793 100644 --- a/src/plugin-sdk/talk-voice.ts +++ b/src/plugin-sdk/talk-voice.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled talk-voice plugin. -// Keep this list additive and scoped to symbols used under extensions/talk-voice. +// Keep this list additive and scoped to symbols used under native-plugins/talk-voice. export { definePluginEntry } from "./plugin-entry.js"; export type { OpenClawPluginApi } from "../plugins/types.js"; diff --git a/src/plugin-sdk/telegram.ts b/src/plugin-sdk/telegram.ts index 4b1d41df386..fa0634a470c 100644 --- a/src/plugin-sdk/telegram.ts +++ b/src/plugin-sdk/telegram.ts @@ -17,11 +17,14 @@ export type { ChannelConfiguredBindingConversationRef, ChannelConfiguredBindingMatch, } from "../channels/plugins/types.adapters.js"; -export type { InspectedTelegramAccount } from "../../extensions/telegram/api.js"; -export type { ResolvedTelegramAccount } from "../../extensions/telegram/api.js"; -export type { TelegramProbe } from "../../extensions/telegram/runtime-api.js"; -export type { TelegramButtonStyle, TelegramInlineButtons } from "../../extensions/telegram/api.js"; -export type { StickerMetadata } from "../../extensions/telegram/api.js"; +export type { InspectedTelegramAccount } from "../../native-plugins/telegram/api.js"; +export type { ResolvedTelegramAccount } from "../../native-plugins/telegram/api.js"; +export type { TelegramProbe } from "../../native-plugins/telegram/runtime-api.js"; +export type { + TelegramButtonStyle, + TelegramInlineButtons, +} from "../../native-plugins/telegram/api.js"; +export type { StickerMetadata } from "../../native-plugins/telegram/api.js"; export { emptyPluginConfigSchema } from "../plugins/config-schema.js"; export { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../routing/session-key.js"; @@ -51,11 +54,11 @@ export { export { listTelegramDirectoryGroupsFromConfig, listTelegramDirectoryPeersFromConfig, -} from "../../extensions/telegram/api.js"; +} from "../../native-plugins/telegram/api.js"; export { resolveTelegramGroupRequireMention, resolveTelegramGroupToolPolicy, -} from "../../extensions/telegram/api.js"; +} from "../../native-plugins/telegram/api.js"; export { TelegramConfigSchema } from "../config/zod-schema.providers-core.js"; export { buildTokenChannelStatusSummary } from "./status-helpers.js"; @@ -65,26 +68,26 @@ export { listTelegramAccountIds, resolveDefaultTelegramAccountId, resolveTelegramPollActionGateState, -} from "../../extensions/telegram/api.js"; -export { inspectTelegramAccount } from "../../extensions/telegram/api.js"; +} from "../../native-plugins/telegram/api.js"; +export { inspectTelegramAccount } from "../../native-plugins/telegram/api.js"; export { looksLikeTelegramTargetId, normalizeTelegramMessagingTarget, -} from "../../extensions/telegram/api.js"; +} from "../../native-plugins/telegram/api.js"; export { parseTelegramReplyToMessageId, parseTelegramThreadId, -} from "../../extensions/telegram/api.js"; +} from "../../native-plugins/telegram/api.js"; export { isNumericTelegramUserId, normalizeTelegramAllowFromEntry, -} from "../../extensions/telegram/api.js"; -export { fetchTelegramChatId } from "../../extensions/telegram/api.js"; +} from "../../native-plugins/telegram/api.js"; +export { fetchTelegramChatId } from "../../native-plugins/telegram/api.js"; export { resolveTelegramInlineButtonsScope, resolveTelegramTargetChatType, -} from "../../extensions/telegram/api.js"; -export { resolveTelegramReactionLevel } from "../../extensions/telegram/api.js"; +} from "../../native-plugins/telegram/api.js"; +export { resolveTelegramReactionLevel } from "../../native-plugins/telegram/api.js"; export { auditTelegramGroupMembership, collectTelegramUnmentionedGroupIds, @@ -103,16 +106,16 @@ export { sendStickerTelegram, sendTypingTelegram, unpinMessageTelegram, -} from "../../extensions/telegram/runtime-api.js"; -export { getCacheStats, searchStickers } from "../../extensions/telegram/api.js"; -export { resolveTelegramToken } from "../../extensions/telegram/runtime-api.js"; -export { telegramMessageActions } from "../../extensions/telegram/runtime-api.js"; +} from "../../native-plugins/telegram/runtime-api.js"; +export { getCacheStats, searchStickers } from "../../native-plugins/telegram/api.js"; +export { resolveTelegramToken } from "../../native-plugins/telegram/runtime-api.js"; +export { telegramMessageActions } from "../../native-plugins/telegram/runtime-api.js"; export { setTelegramThreadBindingIdleTimeoutBySessionKey, setTelegramThreadBindingMaxAgeBySessionKey, -} from "../../extensions/telegram/runtime-api.js"; -export { collectTelegramStatusIssues } from "../../extensions/telegram/api.js"; -export { sendTelegramPayloadMessages } from "../../extensions/telegram/api.js"; +} from "../../native-plugins/telegram/runtime-api.js"; +export { collectTelegramStatusIssues } from "../../native-plugins/telegram/api.js"; +export { sendTelegramPayloadMessages } from "../../native-plugins/telegram/api.js"; export { buildBrowseProvidersButton, buildModelsKeyboard, @@ -120,8 +123,8 @@ export { calculateTotalPages, getModelsPageSize, type ProviderInfo, -} from "../../extensions/telegram/api.js"; +} from "../../native-plugins/telegram/api.js"; export { isTelegramExecApprovalApprover, isTelegramExecApprovalClientEnabled, -} from "../../extensions/telegram/api.js"; +} from "../../native-plugins/telegram/api.js"; diff --git a/src/plugin-sdk/thread-ownership.ts b/src/plugin-sdk/thread-ownership.ts index ea8ad079a8c..7a861bd2e89 100644 --- a/src/plugin-sdk/thread-ownership.ts +++ b/src/plugin-sdk/thread-ownership.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled thread-ownership plugin. -// Keep this list additive and scoped to symbols used under extensions/thread-ownership. +// Keep this list additive and scoped to symbols used under native-plugins/thread-ownership. export { definePluginEntry } from "./core.js"; export type { OpenClawConfig } from "../config/config.js"; diff --git a/src/plugin-sdk/tlon.ts b/src/plugin-sdk/tlon.ts index da3803e612f..cf65b64b4ab 100644 --- a/src/plugin-sdk/tlon.ts +++ b/src/plugin-sdk/tlon.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled tlon plugin. -// Keep this list additive and scoped to symbols used under extensions/tlon. +// Keep this list additive and scoped to symbols used under native-plugins/tlon. import { createOptionalChannelSetupSurface } from "./channel-setup.js"; diff --git a/src/plugin-sdk/twitch.ts b/src/plugin-sdk/twitch.ts index 1194e9c55f5..b0b83487911 100644 --- a/src/plugin-sdk/twitch.ts +++ b/src/plugin-sdk/twitch.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled twitch plugin. -// Keep this list additive and scoped to symbols used under extensions/twitch. +// Keep this list additive and scoped to symbols used under native-plugins/twitch. import { createOptionalChannelSetupSurface } from "./channel-setup.js"; diff --git a/src/plugin-sdk/whatsapp-core.ts b/src/plugin-sdk/whatsapp-core.ts index e7f7283d1aa..d0b7000e0c1 100644 --- a/src/plugin-sdk/whatsapp-core.ts +++ b/src/plugin-sdk/whatsapp-core.ts @@ -13,7 +13,7 @@ export { export { resolveWhatsAppGroupRequireMention, resolveWhatsAppGroupToolPolicy, -} from "../../extensions/whatsapp/api.js"; +} from "../../native-plugins/whatsapp/api.js"; export { resolveWhatsAppGroupIntroHint } from "../channels/plugins/whatsapp-shared.js"; export { ToolAuthorizationError, diff --git a/src/plugin-sdk/whatsapp.ts b/src/plugin-sdk/whatsapp.ts index 0c4e0a5048b..237d65b2fc5 100644 --- a/src/plugin-sdk/whatsapp.ts +++ b/src/plugin-sdk/whatsapp.ts @@ -1,8 +1,11 @@ export type { ChannelMessageActionName } from "../channels/plugins/types.js"; export type { OpenClawConfig } from "../config/config.js"; export type { DmPolicy, GroupPolicy, WhatsAppAccountConfig } from "../config/types.js"; -export type { WebChannelStatus, WebMonitorTuning } from "../../extensions/whatsapp/api.js"; -export type { WebInboundMessage, WebListenerCloseReason } from "../../extensions/whatsapp/api.js"; +export type { WebChannelStatus, WebMonitorTuning } from "../../native-plugins/whatsapp/api.js"; +export type { + WebInboundMessage, + WebListenerCloseReason, +} from "../../native-plugins/whatsapp/api.js"; export type { ChannelMessageActionContext, ChannelPlugin, @@ -33,7 +36,7 @@ export { normalizeWhatsAppAllowFromEntries } from "../channels/plugins/normalize export { listWhatsAppDirectoryGroupsFromConfig, listWhatsAppDirectoryPeersFromConfig, -} from "../../extensions/whatsapp/api.js"; +} from "../../native-plugins/whatsapp/api.js"; export { collectAllowlistProviderGroupPolicyWarnings, collectOpenGroupPolicyRouteAllowlistWarnings, @@ -49,7 +52,7 @@ export { export { resolveWhatsAppGroupRequireMention, resolveWhatsAppGroupToolPolicy, -} from "../../extensions/whatsapp/api.js"; +} from "../../native-plugins/whatsapp/api.js"; export { createWhatsAppOutboundBase, resolveWhatsAppGroupIntroHint, @@ -66,7 +69,7 @@ export { hasAnyWhatsAppAuth, listEnabledWhatsAppAccounts, resolveWhatsAppAccount, -} from "../../extensions/whatsapp/api.js"; +} from "../../native-plugins/whatsapp/api.js"; export { HEARTBEAT_PROMPT, HEARTBEAT_TOKEN, @@ -96,7 +99,7 @@ export { startWebLoginWithQr, waitForWebLogin, } from "../plugins/runtime/runtime-whatsapp-boundary.js"; -export { DEFAULT_WEB_MEDIA_BYTES } from "../../extensions/whatsapp/api.js"; +export { DEFAULT_WEB_MEDIA_BYTES } from "../../native-plugins/whatsapp/api.js"; export { getDefaultLocalRoots, loadWebMedia, diff --git a/src/plugin-sdk/zalo.ts b/src/plugin-sdk/zalo.ts index 0e1ff28cff0..73bf9a476df 100644 --- a/src/plugin-sdk/zalo.ts +++ b/src/plugin-sdk/zalo.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled zalo plugin. -// Keep this list additive and scoped to symbols used under extensions/zalo. +// Keep this list additive and scoped to symbols used under native-plugins/zalo. export { jsonResult, readStringParam } from "../agents/tools/common.js"; export type { ReplyPayload } from "../auto-reply/types.js"; @@ -61,8 +61,8 @@ export { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../routing/session-key.j export type { RuntimeEnv } from "../runtime.js"; export type { WizardPrompter } from "../wizard/prompts.js"; export { formatAllowFromLowercase, isNormalizedSenderAllowed } from "./allow-from.js"; -export { zaloSetupAdapter } from "../../extensions/zalo/api.js"; -export { zaloSetupWizard } from "../../extensions/zalo/api.js"; +export { zaloSetupAdapter } from "../../native-plugins/zalo/api.js"; +export { zaloSetupWizard } from "../../native-plugins/zalo/api.js"; export { resolveDirectDmAuthorizationOutcome, resolveSenderCommandAuthorizationWithRuntime, diff --git a/src/plugin-sdk/zalouser.ts b/src/plugin-sdk/zalouser.ts index e037c0b69ab..95556724dd7 100644 --- a/src/plugin-sdk/zalouser.ts +++ b/src/plugin-sdk/zalouser.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled zalouser plugin. -// Keep this list additive and scoped to symbols used under extensions/zalouser. +// Keep this list additive and scoped to symbols used under native-plugins/zalouser. import { createOptionalChannelSetupSurface } from "./channel-setup.js"; diff --git a/src/plugins/bundled-dir.ts b/src/plugins/bundled-dir.ts index 930ab6c9da4..bfac8f44315 100644 --- a/src/plugins/bundled-dir.ts +++ b/src/plugins/bundled-dir.ts @@ -8,7 +8,8 @@ function isSourceCheckoutRoot(packageRoot: string): boolean { return ( fs.existsSync(path.join(packageRoot, ".git")) && fs.existsSync(path.join(packageRoot, "src")) && - fs.existsSync(path.join(packageRoot, "extensions")) + (fs.existsSync(path.join(packageRoot, "native-plugins")) || + fs.existsSync(path.join(packageRoot, "extensions"))) ); } @@ -28,52 +29,79 @@ export function resolveBundledPluginsDir(env: NodeJS.ProcessEnv = process.env): (entry, index, all): entry is string => Boolean(entry) && all.indexOf(entry) === index, ); for (const packageRoot of packageRoots) { - const sourceExtensionsDir = path.join(packageRoot, "extensions"); - const builtExtensionsDir = path.join(packageRoot, "dist", "extensions"); + const sourceNativePluginsDir = path.join(packageRoot, "native-plugins"); + const legacySourceExtensionsDir = path.join(packageRoot, "extensions"); + const builtNativePluginsDir = path.join(packageRoot, "dist", "native-plugins"); + const legacyBuiltExtensionsDir = path.join(packageRoot, "dist", "extensions"); if ( (preferSourceCheckout || isSourceCheckoutRoot(packageRoot)) && - fs.existsSync(sourceExtensionsDir) + fs.existsSync(sourceNativePluginsDir) ) { - return sourceExtensionsDir; + return sourceNativePluginsDir; + } + if ( + (preferSourceCheckout || isSourceCheckoutRoot(packageRoot)) && + fs.existsSync(legacySourceExtensionsDir) + ) { + return legacySourceExtensionsDir; } // Local source checkouts stage a runtime-complete bundled plugin tree under - // dist-runtime/. Prefer that over source extensions only when the paired + // dist-runtime/. Prefer that over source native plugins only when the paired // dist/ tree exists; otherwise wrappers can drift ahead of the last build. - const runtimeExtensionsDir = path.join(packageRoot, "dist-runtime", "extensions"); - if (fs.existsSync(runtimeExtensionsDir) && fs.existsSync(builtExtensionsDir)) { - return runtimeExtensionsDir; + const runtimeNativePluginsDir = path.join(packageRoot, "dist-runtime", "native-plugins"); + const legacyRuntimeExtensionsDir = path.join(packageRoot, "dist-runtime", "extensions"); + if (fs.existsSync(runtimeNativePluginsDir) && fs.existsSync(builtNativePluginsDir)) { + return runtimeNativePluginsDir; } - if (fs.existsSync(builtExtensionsDir)) { - return builtExtensionsDir; + if (fs.existsSync(legacyRuntimeExtensionsDir) && fs.existsSync(legacyBuiltExtensionsDir)) { + return legacyRuntimeExtensionsDir; + } + if (fs.existsSync(builtNativePluginsDir)) { + return builtNativePluginsDir; + } + if (fs.existsSync(legacyBuiltExtensionsDir)) { + return legacyBuiltExtensionsDir; } } } catch { // ignore } - // bun --compile: ship a sibling `extensions/` next to the executable. + // bun --compile: ship a sibling `native-plugins/` next to the executable. try { const execDir = path.dirname(process.execPath); - const siblingBuilt = path.join(execDir, "dist", "extensions"); + const siblingBuilt = path.join(execDir, "dist", "native-plugins"); if (fs.existsSync(siblingBuilt)) { return siblingBuilt; } - const sibling = path.join(execDir, "extensions"); + const legacySiblingBuilt = path.join(execDir, "dist", "extensions"); + if (fs.existsSync(legacySiblingBuilt)) { + return legacySiblingBuilt; + } + const sibling = path.join(execDir, "native-plugins"); if (fs.existsSync(sibling)) { return sibling; } + const legacySibling = path.join(execDir, "extensions"); + if (fs.existsSync(legacySibling)) { + return legacySibling; + } } catch { // ignore } - // npm/dev: walk up from this module to find `extensions/` at the package root. + // npm/dev: walk up from this module to find `native-plugins/` at the package root. try { let cursor = path.dirname(fileURLToPath(import.meta.url)); for (let i = 0; i < 6; i += 1) { - const candidate = path.join(cursor, "extensions"); + const candidate = path.join(cursor, "native-plugins"); if (fs.existsSync(candidate)) { return candidate; } + const legacyCandidate = path.join(cursor, "extensions"); + if (fs.existsSync(legacyCandidate)) { + return legacyCandidate; + } const parent = path.dirname(cursor); if (parent === cursor) { break; diff --git a/src/plugins/bundled-runtime-deps.test.ts b/src/plugins/bundled-runtime-deps.test.ts index aed26eb6e01..bed709b91dc 100644 --- a/src/plugins/bundled-runtime-deps.test.ts +++ b/src/plugins/bundled-runtime-deps.test.ts @@ -23,30 +23,30 @@ describe("bundled plugin runtime dependencies", () => { } it("keeps bundled Feishu runtime deps plugin-local instead of mirroring them into the root package", () => { - expectPluginOwnsRuntimeDep("extensions/feishu/package.json", "@larksuiteoapi/node-sdk"); + expectPluginOwnsRuntimeDep("native-plugins/feishu/package.json", "@larksuiteoapi/node-sdk"); }); it("keeps memory-lancedb runtime deps plugin-local so packaged installs fetch them on demand", () => { - expectPluginOwnsRuntimeDep("extensions/memory-lancedb/package.json", "@lancedb/lancedb"); + expectPluginOwnsRuntimeDep("native-plugins/memory-lancedb/package.json", "@lancedb/lancedb"); }); it("keeps bundled Discord runtime deps plugin-local instead of mirroring them into the root package", () => { - expectPluginOwnsRuntimeDep("extensions/discord/package.json", "@buape/carbon"); + expectPluginOwnsRuntimeDep("native-plugins/discord/package.json", "@buape/carbon"); }); it("keeps bundled Slack runtime deps plugin-local instead of mirroring them into the root package", () => { - expectPluginOwnsRuntimeDep("extensions/slack/package.json", "@slack/bolt"); + expectPluginOwnsRuntimeDep("native-plugins/slack/package.json", "@slack/bolt"); }); it("keeps bundled Telegram runtime deps plugin-local instead of mirroring them into the root package", () => { - expectPluginOwnsRuntimeDep("extensions/telegram/package.json", "grammy"); + expectPluginOwnsRuntimeDep("native-plugins/telegram/package.json", "grammy"); }); it("keeps WhatsApp runtime deps plugin-local so packaged installs fetch them on demand", () => { - expectPluginOwnsRuntimeDep("extensions/whatsapp/package.json", "@whiskeysockets/baileys"); + expectPluginOwnsRuntimeDep("native-plugins/whatsapp/package.json", "@whiskeysockets/baileys"); }); it("keeps bundled proxy-agent deps plugin-local instead of mirroring them into the root package", () => { - expectPluginOwnsRuntimeDep("extensions/discord/package.json", "https-proxy-agent"); + expectPluginOwnsRuntimeDep("native-plugins/discord/package.json", "https-proxy-agent"); }); }); diff --git a/src/plugins/bundled-sources.test.ts b/src/plugins/bundled-sources.test.ts index e853e4c3a3c..20e85a327ea 100644 --- a/src/plugins/bundled-sources.test.ts +++ b/src/plugins/bundled-sources.test.ts @@ -33,19 +33,19 @@ describe("bundled plugin sources", () => { }, { origin: "bundled", - rootDir: "/app/extensions/feishu", + rootDir: "/app/native-plugins/feishu", packageName: "@openclaw/feishu", packageManifest: { install: { npmSpec: "@openclaw/feishu" } }, }, { origin: "bundled", - rootDir: "/app/extensions/feishu-dup", + rootDir: "/app/native-plugins/feishu-dup", packageName: "@openclaw/feishu", packageManifest: { install: { npmSpec: "@openclaw/feishu" } }, }, { origin: "bundled", - rootDir: "/app/extensions/msteams", + rootDir: "/app/native-plugins/msteams", packageName: "@openclaw/msteams", packageManifest: { install: { npmSpec: "@openclaw/msteams" } }, }, @@ -54,10 +54,10 @@ describe("bundled plugin sources", () => { }); loadPluginManifestMock.mockImplementation((rootDir: string) => { - if (rootDir === "/app/extensions/feishu") { + if (rootDir === "/app/native-plugins/feishu") { return { ok: true, manifest: { id: "feishu" } }; } - if (rootDir === "/app/extensions/msteams") { + if (rootDir === "/app/native-plugins/msteams") { return { ok: true, manifest: { id: "msteams" } }; } return { @@ -72,7 +72,7 @@ describe("bundled plugin sources", () => { expect(Array.from(map.keys())).toEqual(["feishu", "msteams"]); expect(map.get("feishu")).toEqual({ pluginId: "feishu", - localPath: "/app/extensions/feishu", + localPath: "/app/native-plugins/feishu", npmSpec: "@openclaw/feishu", }); }); @@ -82,7 +82,7 @@ describe("bundled plugin sources", () => { candidates: [ { origin: "bundled", - rootDir: "/app/extensions/feishu", + rootDir: "/app/native-plugins/feishu", packageName: "@openclaw/feishu", packageManifest: { install: { npmSpec: "@openclaw/feishu" } }, }, @@ -99,7 +99,7 @@ describe("bundled plugin sources", () => { }); expect(resolved?.pluginId).toBe("feishu"); - expect(resolved?.localPath).toBe("/app/extensions/feishu"); + expect(resolved?.localPath).toBe("/app/native-plugins/feishu"); expect(missing).toBeUndefined(); }); @@ -136,7 +136,7 @@ describe("bundled plugin sources", () => { candidates: [ { origin: "bundled", - rootDir: "/app/extensions/diffs", + rootDir: "/app/native-plugins/diffs", packageName: "@openclaw/diffs", packageManifest: { install: { npmSpec: "@openclaw/diffs" } }, }, @@ -153,7 +153,7 @@ describe("bundled plugin sources", () => { }); expect(resolved?.pluginId).toBe("diffs"); - expect(resolved?.localPath).toBe("/app/extensions/diffs"); + expect(resolved?.localPath).toBe("/app/native-plugins/diffs"); expect(missing).toBeUndefined(); }); @@ -163,7 +163,7 @@ describe("bundled plugin sources", () => { "feishu", { pluginId: "feishu", - localPath: "/app/extensions/feishu", + localPath: "/app/native-plugins/feishu", npmSpec: "@openclaw/feishu", }, ], @@ -176,7 +176,7 @@ describe("bundled plugin sources", () => { }), ).toEqual({ pluginId: "feishu", - localPath: "/app/extensions/feishu", + localPath: "/app/native-plugins/feishu", npmSpec: "@openclaw/feishu", }); expect( diff --git a/src/plugins/commands.test.ts b/src/plugins/commands.test.ts index 9f10ae7fe81..08a59600614 100644 --- a/src/plugins/commands.test.ts +++ b/src/plugins/commands.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it } from "vitest"; -import { discordPlugin } from "../../extensions/discord/src/channel.js"; +import { discordPlugin } from "../../native-plugins/discord/src/channel.js"; import { createTestRegistry } from "../test-utils/channel-plugins.js"; import { __testing, diff --git a/src/plugins/contracts/auth-choice.contract.test.ts b/src/plugins/contracts/auth-choice.contract.test.ts index 00d1894999b..e3fe36f664a 100644 --- a/src/plugins/contracts/auth-choice.contract.test.ts +++ b/src/plugins/contracts/auth-choice.contract.test.ts @@ -27,9 +27,9 @@ const resolveProviderPluginChoiceMock = vi.hoisted(() => vi.fn vi.fn(async () => {}), ); -import qwenPortalPlugin from "../../../extensions/qwen-portal-auth/index.js"; +import qwenPortalPlugin from "../../../native-plugins/qwen-portal-auth/index.js"; -vi.mock("../../../extensions/qwen-portal-auth/oauth.js", () => ({ +vi.mock("../../../native-plugins/qwen-portal-auth/oauth.js", () => ({ loginQwenPortalOAuth: loginQwenPortalOAuthMock, })); vi.mock("../../providers/github-copilot-auth.js", () => ({ diff --git a/src/plugins/contracts/auth.contract.test.ts b/src/plugins/contracts/auth.contract.test.ts index e0f19e7bac5..a39659f757e 100644 --- a/src/plugins/contracts/auth.contract.test.ts +++ b/src/plugins/contracts/auth.contract.test.ts @@ -14,7 +14,7 @@ import type { OpenClawPluginApi, ProviderPlugin } from "../types.js"; type LoginOpenAICodexOAuth = (typeof import("openclaw/plugin-sdk/provider-auth-login"))["loginOpenAICodexOAuth"]; type LoginQwenPortalOAuth = - (typeof import("../../../extensions/qwen-portal-auth/oauth.js"))["loginQwenPortalOAuth"]; + (typeof import("../../../native-plugins/qwen-portal-auth/oauth.js"))["loginQwenPortalOAuth"]; type GithubCopilotLoginCommand = (typeof import("openclaw/plugin-sdk/provider-auth-login"))["githubCopilotLoginCommand"]; type CreateVpsAwareHandlers = @@ -48,13 +48,13 @@ vi.mock("openclaw/plugin-sdk/agent-runtime", async (importOriginal) => { }; }); -vi.mock("../../../extensions/qwen-portal-auth/oauth.js", () => ({ +vi.mock("../../../native-plugins/qwen-portal-auth/oauth.js", () => ({ loginQwenPortalOAuth: loginQwenPortalOAuthMock, })); -import githubCopilotPlugin from "../../../extensions/github-copilot/index.js"; -import openAIPlugin from "../../../extensions/openai/index.js"; -import qwenPortalPlugin from "../../../extensions/qwen-portal-auth/index.js"; +import githubCopilotPlugin from "../../../native-plugins/github-copilot/index.js"; +import openAIPlugin from "../../../native-plugins/openai/index.js"; +import qwenPortalPlugin from "../../../native-plugins/qwen-portal-auth/index.js"; function registerProviders(...plugins: Array<{ register(api: OpenClawPluginApi): void }>) { const captured = createCapturedPluginRegistration(); diff --git a/src/plugins/contracts/discovery.contract.test.ts b/src/plugins/contracts/discovery.contract.test.ts index 77606c8dcf9..00444e05385 100644 --- a/src/plugins/contracts/discovery.contract.test.ts +++ b/src/plugins/contracts/discovery.contract.test.ts @@ -132,8 +132,10 @@ describe("provider discovery contract", () => { listProfilesForProvider: listProfilesForProviderMock, }; }); - vi.doMock("../../../extensions/github-copilot/token.js", async () => { - const actual = await vi.importActual("../../../extensions/github-copilot/token.js"); + vi.doMock("../../../native-plugins/github-copilot/token.js", async () => { + const actual = await vi.importActual( + "../../../native-plugins/github-copilot/token.js", + ); return { ...actual, resolveCopilotApiToken: resolveCopilotApiTokenMock, @@ -177,14 +179,14 @@ describe("provider discovery contract", () => { { default: modelStudioPlugin }, { default: cloudflareAiGatewayPlugin }, ] = await Promise.all([ - import("../../../extensions/qwen-portal-auth/index.js"), - import("../../../extensions/github-copilot/index.js"), - import("../../../extensions/ollama/index.js"), - import("../../../extensions/vllm/index.js"), - import("../../../extensions/sglang/index.js"), - import("../../../extensions/minimax/index.js"), - import("../../../extensions/modelstudio/index.js"), - import("../../../extensions/cloudflare-ai-gateway/index.js"), + import("../../../native-plugins/qwen-portal-auth/index.js"), + import("../../../native-plugins/github-copilot/index.js"), + import("../../../native-plugins/ollama/index.js"), + import("../../../native-plugins/vllm/index.js"), + import("../../../native-plugins/sglang/index.js"), + import("../../../native-plugins/minimax/index.js"), + import("../../../native-plugins/modelstudio/index.js"), + import("../../../native-plugins/cloudflare-ai-gateway/index.js"), ]); qwenPortalProvider = requireProvider(registerProviders(qwenPortalPlugin), "qwen-portal"); githubCopilotProvider = requireProvider( diff --git a/src/plugins/contracts/registry.ts b/src/plugins/contracts/registry.ts index cde5b8e8e2d..a9a1a0952fc 100644 --- a/src/plugins/contracts/registry.ts +++ b/src/plugins/contracts/registry.ts @@ -1,43 +1,43 @@ -import amazonBedrockPlugin from "../../../extensions/amazon-bedrock/index.js"; -import anthropicPlugin from "../../../extensions/anthropic/index.js"; -import bravePlugin from "../../../extensions/brave/index.js"; -import byteplusPlugin from "../../../extensions/byteplus/index.js"; -import chutesPlugin from "../../../extensions/chutes/index.js"; -import cloudflareAiGatewayPlugin from "../../../extensions/cloudflare-ai-gateway/index.js"; -import copilotProxyPlugin from "../../../extensions/copilot-proxy/index.js"; -import elevenLabsPlugin from "../../../extensions/elevenlabs/index.js"; -import falPlugin from "../../../extensions/fal/index.js"; -import firecrawlPlugin from "../../../extensions/firecrawl/index.js"; -import githubCopilotPlugin from "../../../extensions/github-copilot/index.js"; -import googlePlugin from "../../../extensions/google/index.js"; -import huggingFacePlugin from "../../../extensions/huggingface/index.js"; -import kilocodePlugin from "../../../extensions/kilocode/index.js"; -import kimiCodingPlugin from "../../../extensions/kimi-coding/index.js"; -import microsoftPlugin from "../../../extensions/microsoft/index.js"; -import minimaxPlugin from "../../../extensions/minimax/index.js"; -import mistralPlugin from "../../../extensions/mistral/index.js"; -import modelStudioPlugin from "../../../extensions/modelstudio/index.js"; -import moonshotPlugin from "../../../extensions/moonshot/index.js"; -import nvidiaPlugin from "../../../extensions/nvidia/index.js"; -import ollamaPlugin from "../../../extensions/ollama/index.js"; -import openAIPlugin from "../../../extensions/openai/index.js"; -import opencodeGoPlugin from "../../../extensions/opencode-go/index.js"; -import opencodePlugin from "../../../extensions/opencode/index.js"; -import openrouterPlugin from "../../../extensions/openrouter/index.js"; -import perplexityPlugin from "../../../extensions/perplexity/index.js"; -import qianfanPlugin from "../../../extensions/qianfan/index.js"; -import qwenPortalAuthPlugin from "../../../extensions/qwen-portal-auth/index.js"; -import sglangPlugin from "../../../extensions/sglang/index.js"; -import syntheticPlugin from "../../../extensions/synthetic/index.js"; -import tavilyPlugin from "../../../extensions/tavily/index.js"; -import togetherPlugin from "../../../extensions/together/index.js"; -import venicePlugin from "../../../extensions/venice/index.js"; -import vercelAiGatewayPlugin from "../../../extensions/vercel-ai-gateway/index.js"; -import vllmPlugin from "../../../extensions/vllm/index.js"; -import volcenginePlugin from "../../../extensions/volcengine/index.js"; -import xaiPlugin from "../../../extensions/xai/index.js"; -import xiaomiPlugin from "../../../extensions/xiaomi/index.js"; -import zaiPlugin from "../../../extensions/zai/index.js"; +import amazonBedrockPlugin from "../../../native-plugins/amazon-bedrock/index.js"; +import anthropicPlugin from "../../../native-plugins/anthropic/index.js"; +import bravePlugin from "../../../native-plugins/brave/index.js"; +import byteplusPlugin from "../../../native-plugins/byteplus/index.js"; +import chutesPlugin from "../../../native-plugins/chutes/index.js"; +import cloudflareAiGatewayPlugin from "../../../native-plugins/cloudflare-ai-gateway/index.js"; +import copilotProxyPlugin from "../../../native-plugins/copilot-proxy/index.js"; +import elevenLabsPlugin from "../../../native-plugins/elevenlabs/index.js"; +import falPlugin from "../../../native-plugins/fal/index.js"; +import firecrawlPlugin from "../../../native-plugins/firecrawl/index.js"; +import githubCopilotPlugin from "../../../native-plugins/github-copilot/index.js"; +import googlePlugin from "../../../native-plugins/google/index.js"; +import huggingFacePlugin from "../../../native-plugins/huggingface/index.js"; +import kilocodePlugin from "../../../native-plugins/kilocode/index.js"; +import kimiCodingPlugin from "../../../native-plugins/kimi-coding/index.js"; +import microsoftPlugin from "../../../native-plugins/microsoft/index.js"; +import minimaxPlugin from "../../../native-plugins/minimax/index.js"; +import mistralPlugin from "../../../native-plugins/mistral/index.js"; +import modelStudioPlugin from "../../../native-plugins/modelstudio/index.js"; +import moonshotPlugin from "../../../native-plugins/moonshot/index.js"; +import nvidiaPlugin from "../../../native-plugins/nvidia/index.js"; +import ollamaPlugin from "../../../native-plugins/ollama/index.js"; +import openAIPlugin from "../../../native-plugins/openai/index.js"; +import opencodeGoPlugin from "../../../native-plugins/opencode-go/index.js"; +import opencodePlugin from "../../../native-plugins/opencode/index.js"; +import openrouterPlugin from "../../../native-plugins/openrouter/index.js"; +import perplexityPlugin from "../../../native-plugins/perplexity/index.js"; +import qianfanPlugin from "../../../native-plugins/qianfan/index.js"; +import qwenPortalAuthPlugin from "../../../native-plugins/qwen-portal-auth/index.js"; +import sglangPlugin from "../../../native-plugins/sglang/index.js"; +import syntheticPlugin from "../../../native-plugins/synthetic/index.js"; +import tavilyPlugin from "../../../native-plugins/tavily/index.js"; +import togetherPlugin from "../../../native-plugins/together/index.js"; +import venicePlugin from "../../../native-plugins/venice/index.js"; +import vercelAiGatewayPlugin from "../../../native-plugins/vercel-ai-gateway/index.js"; +import vllmPlugin from "../../../native-plugins/vllm/index.js"; +import volcenginePlugin from "../../../native-plugins/volcengine/index.js"; +import xaiPlugin from "../../../native-plugins/xai/index.js"; +import xiaomiPlugin from "../../../native-plugins/xiaomi/index.js"; +import zaiPlugin from "../../../native-plugins/zai/index.js"; import { createCapturedPluginRegistration } from "../captured-registration.js"; import { resolvePluginProviders } from "../providers.js"; import type { diff --git a/src/plugins/contracts/runtime.contract.test.ts b/src/plugins/contracts/runtime.contract.test.ts index 1e614150cb3..60eaf878734 100644 --- a/src/plugins/contracts/runtime.contract.test.ts +++ b/src/plugins/contracts/runtime.contract.test.ts @@ -2,8 +2,8 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import openAIPlugin from "../../../extensions/openai/index.js"; -import qwenPortalPlugin from "../../../extensions/qwen-portal-auth/index.js"; +import openAIPlugin from "../../../native-plugins/openai/index.js"; +import qwenPortalPlugin from "../../../native-plugins/qwen-portal-auth/index.js"; import { createCapturedPluginRegistration } from "../../test-utils/plugin-registration.js"; import { createProviderUsageFetch, makeResponse } from "../../test-utils/provider-usage-fetch.js"; import type { OpenClawPluginApi, ProviderPlugin } from "../types.js"; diff --git a/src/plugins/discovery.ts b/src/plugins/discovery.ts index 3efe1ccc565..bab1ad45fb4 100644 --- a/src/plugins/discovery.ts +++ b/src/plugins/discovery.ts @@ -6,12 +6,16 @@ import { detectBundleManifestFormat, loadBundleManifest } from "./bundle-manifes import { DEFAULT_PLUGIN_ENTRY_CANDIDATES, getPackageManifestMetadata, - resolvePackageExtensionEntries, + resolvePackagePluginEntries, type OpenClawPackageManifest, type PackageManifest, } from "./manifest.js"; import { formatPosixMode, isPathInside, safeRealpathSync, safeStatSync } from "./path-safety.js"; -import { resolvePluginCacheInputs, resolvePluginSourceRoots } from "./roots.js"; +import { + resolvePluginCacheInputs, + resolvePluginSourceRootCandidates, + resolvePluginSourceRoots, +} from "./roots.js"; import type { PluginBundleFormat, PluginDiagnostic, PluginFormat, PluginOrigin } from "./types.js"; const EXTENSION_EXTS = new Set([".ts", ".js", ".mts", ".cts", ".mjs", ".cjs"]); @@ -88,8 +92,12 @@ function buildDiscoveryCacheKey(params: { loadPaths: params.extraPaths, env: params.env, }); - const workspaceKey = roots.workspace ?? ""; - const configExtensionsRoot = roots.global ?? ""; + const autoRoots = resolvePluginSourceRootCandidates({ + workspaceDir: params.workspaceDir, + env: params.env, + }); + const workspaceKey = JSON.stringify(autoRoots.workspace); + const configExtensionsRoot = JSON.stringify(autoRoots.global); const bundledRoot = roots.stock ?? ""; const ownershipUid = params.ownershipUid ?? currentUid(); return `${workspaceKey}::${ownershipUid ?? "none"}::${configExtensionsRoot}::${bundledRoot}::${JSON.stringify(loadPaths)}`; @@ -528,7 +536,7 @@ function discoverInDirectory(params: { const rejectHardlinks = params.origin !== "bundled"; const manifest = readPackageManifest(fullPath, rejectHardlinks); - const extensionResolution = resolvePackageExtensionEntries(manifest ?? undefined); + const extensionResolution = resolvePackagePluginEntries(manifest ?? undefined); const extensions = extensionResolution.status === "ok" ? extensionResolution.entries : []; const setupEntryPath = getPackageManifestMetadata(manifest ?? undefined)?.setupEntry; const setupSource = @@ -658,7 +666,7 @@ function discoverFromPath(params: { if (stat.isDirectory()) { const rejectHardlinks = params.origin !== "bundled"; const manifest = readPackageManifest(resolved, rejectHardlinks); - const extensionResolution = resolvePackageExtensionEntries(manifest ?? undefined); + const extensionResolution = resolvePackagePluginEntries(manifest ?? undefined); const extensions = extensionResolution.status === "ok" ? extensionResolution.entries : []; const setupEntryPath = getPackageManifestMetadata(manifest ?? undefined)?.setupEntry; const setupSource = @@ -782,6 +790,7 @@ export function discoverOpenClawPlugins(params: { const workspaceDir = params.workspaceDir?.trim(); const workspaceRoot = workspaceDir ? resolveUserPath(workspaceDir, env) : undefined; const roots = resolvePluginSourceRoots({ workspaceDir: workspaceRoot, env }); + const rootCandidates = resolvePluginSourceRootCandidates({ workspaceDir: workspaceRoot, env }); const extra = params.extraPaths ?? []; for (const extraPath of extra) { @@ -803,9 +812,9 @@ export function discoverOpenClawPlugins(params: { seen, }); } - if (roots.workspace && workspaceRoot) { + for (const workspacePluginRoot of rootCandidates.workspace) { discoverInDirectory({ - dir: roots.workspace, + dir: workspacePluginRoot, origin: "workspace", ownershipUid: params.ownershipUid, workspaceDir: workspaceRoot, @@ -826,16 +835,18 @@ export function discoverOpenClawPlugins(params: { }); } - // Keep auto-discovered global extensions behind bundled plugins. + // Keep auto-discovered global native plugins behind bundled plugins. // Users can still intentionally override via plugins.load.paths (origin=config). - discoverInDirectory({ - dir: roots.global, - origin: "global", - ownershipUid: params.ownershipUid, - candidates, - diagnostics, - seen, - }); + for (const globalPluginRoot of rootCandidates.global) { + discoverInDirectory({ + dir: globalPluginRoot, + origin: "global", + ownershipUid: params.ownershipUid, + candidates, + diagnostics, + seen, + }); + } const result = { candidates, diagnostics }; if (cacheEnabled) { diff --git a/src/plugins/install.test.ts b/src/plugins/install.test.ts index c6c09042c84..2774b06c2dd 100644 --- a/src/plugins/install.test.ts +++ b/src/plugins/install.test.ts @@ -503,7 +503,7 @@ beforeEach(() => { }); describe("installPluginFromArchive", () => { - it("installs into ~/.openclaw/extensions and preserves scoped package ids", async () => { + it("installs into ~/.openclaw/plugins and preserves scoped package ids", async () => { const { stateDir, archivePath, extensionsDir } = await setupVoiceCallArchiveInstall({ outName: "plugin.tgz", version: "0.0.1", @@ -604,7 +604,7 @@ describe("installPluginFromArchive", () => { }); }); - it("rejects packages without openclaw.extensions", async () => { + it("rejects packages without openclaw.plugins", async () => { const result = await installArchivePackageAndReturnResult({ packageJson: { name: "@openclaw/nope", version: "0.0.1" }, outName: "bad.tgz", @@ -613,11 +613,11 @@ describe("installPluginFromArchive", () => { if (result.ok) { return; } - expect(result.error).toContain("openclaw.extensions"); + expect(result.error).toContain("openclaw.plugins"); expect(result.code).toBe(PLUGIN_INSTALL_ERROR_CODE.MISSING_OPENCLAW_EXTENSIONS); }); - it("rejects legacy plugin package shape when openclaw.extensions is missing", async () => { + it("rejects legacy plugin package shape when openclaw.plugins is missing", async () => { const { pluginDir, extensionsDir } = setupPluginInstallDirs(); fs.writeFileSync( path.join(pluginDir, "package.json"), @@ -644,12 +644,12 @@ describe("installPluginFromArchive", () => { expect(result.ok).toBe(false); if (!result.ok) { - expect(result.error).toContain("package.json missing openclaw.extensions"); + expect(result.error).toContain("package.json missing openclaw.plugins"); expect(result.error).toContain("update the plugin package"); expect(result.code).toBe(PLUGIN_INSTALL_ERROR_CODE.MISSING_OPENCLAW_EXTENSIONS); return; } - expect.unreachable("expected install to fail without openclaw.extensions"); + expect.unreachable("expected install to fail without openclaw.plugins"); }); it("warns when plugin contains dangerous code patterns", async () => { diff --git a/src/plugins/install.ts b/src/plugins/install.ts index 52ae9ebf2e1..052e67e1d4e 100644 --- a/src/plugins/install.ts +++ b/src/plugins/install.ts @@ -1,3 +1,4 @@ +import { existsSync } from "node:fs"; import fs from "node:fs/promises"; import path from "node:path"; import { fileExists, readJsonFile, resolveArchiveKind } from "../infra/archive.js"; @@ -34,7 +35,7 @@ import { CONFIG_DIR, resolveUserPath } from "../utils.js"; import { detectBundleManifestFormat, loadBundleManifest } from "./bundle-manifest.js"; import { loadPluginManifest, - resolvePackageExtensionEntries, + resolvePackagePluginEntries, type PackageManifest as PluginPackageManifest, } from "./manifest.js"; @@ -48,7 +49,10 @@ type PackageManifest = PluginPackageManifest & { }; const MISSING_EXTENSIONS_ERROR = - 'package.json missing openclaw.extensions; update the plugin package to include openclaw.extensions (for example ["./dist/index.js"]). See https://docs.openclaw.ai/help/troubleshooting#plugin-install-fails-with-missing-openclaw-extensions'; + 'package.json missing openclaw.plugins; update the plugin package to include openclaw.plugins (for example ["./dist/index.js"]). OpenClaw still accepts the legacy openclaw.extensions key, but new packages should publish openclaw.plugins. See https://docs.openclaw.ai/help/troubleshooting#plugin-install-fails-with-missing-openclaw-plugins'; + +const PREFERRED_PLUGIN_INSTALL_DIRNAME = "plugins"; +const LEGACY_PLUGIN_INSTALL_DIRNAME = "extensions"; export const PLUGIN_INSTALL_ERROR_CODE = { INVALID_NPM_SPEC: "invalid_npm_spec", @@ -86,6 +90,49 @@ function safeFileName(input: string): string { return safeDirName(input); } +export function resolvePreferredPluginInstallRoot(pluginsDir?: string): string { + return pluginsDir + ? resolveUserPath(pluginsDir) + : path.join(CONFIG_DIR, PREFERRED_PLUGIN_INSTALL_DIRNAME); +} + +export function resolvePluginInstallRootCandidates(pluginsDir?: string): string[] { + if (pluginsDir) { + return [resolveUserPath(pluginsDir)]; + } + return [ + path.join(CONFIG_DIR, PREFERRED_PLUGIN_INSTALL_DIRNAME), + path.join(CONFIG_DIR, LEGACY_PLUGIN_INSTALL_DIRNAME), + ]; +} + +function resolvePluginInstallDirWithinRoot(pluginId: string, pluginsRoot: string): string { + const pluginIdError = validatePluginId(pluginId); + if (pluginIdError) { + throw new Error(pluginIdError); + } + const targetDirResult = resolveSafeInstallDir({ + baseDir: pluginsRoot, + id: pluginId, + invalidNameMessage: "invalid plugin name: path traversal detected", + nameEncoder: encodePluginInstallDirName, + }); + if (!targetDirResult.ok) { + throw new Error(targetDirResult.error); + } + return targetDirResult.path; +} + +export function resolveExistingPluginInstallDir(pluginId: string, pluginsDir?: string): string { + for (const pluginsRoot of resolvePluginInstallRootCandidates(pluginsDir)) { + const candidate = resolvePluginInstallDirWithinRoot(pluginId, pluginsRoot); + if (existsSync(candidate)) { + return candidate; + } + } + return resolvePluginInstallDirWithinRoot(pluginId, resolvePreferredPluginInstallRoot(pluginsDir)); +} + function encodePluginInstallDirName(pluginId: string): string { const trimmed = pluginId.trim(); if (!trimmed.includes("/")) { @@ -158,7 +205,7 @@ function ensureOpenClawExtensions(params: { manifest: PackageManifest }): error: string; code: PluginInstallErrorCode; } { - const resolved = resolvePackageExtensionEntries(params.manifest); + const resolved = resolvePackagePluginEntries(params.manifest); if (resolved.status === "missing") { return { ok: false, @@ -169,7 +216,7 @@ function ensureOpenClawExtensions(params: { manifest: PackageManifest }): if (resolved.status === "empty") { return { ok: false, - error: "package.json openclaw.extensions is empty", + error: "package.json openclaw.plugins is empty", code: PLUGIN_INSTALL_ERROR_CODE.EMPTY_OPENCLAW_EXTENSIONS, }; } @@ -268,14 +315,14 @@ async function installPluginDirectoryIntoExtensions(params: { afterCopy?: (installedDir: string) => Promise; nameEncoder?: (pluginId: string) => string; }): Promise { - const extensionsDir = params.extensionsDir - ? resolveUserPath(params.extensionsDir) - : path.join(CONFIG_DIR, "extensions"); + const targetPluginsRoot = path.dirname( + resolveExistingPluginInstallDir(params.pluginId, params.extensionsDir), + ); const targetDirResult = await resolveCanonicalInstallTarget({ - baseDir: extensionsDir, + baseDir: targetPluginsRoot, id: params.pluginId, invalidNameMessage: "invalid plugin name: path traversal detected", - boundaryLabel: "extensions directory", + boundaryLabel: "plugin install directory", nameEncoder: params.nameEncoder, }); if (!targetDirResult.ok) { @@ -326,23 +373,10 @@ async function installPluginDirectoryIntoExtensions(params: { } export function resolvePluginInstallDir(pluginId: string, extensionsDir?: string): string { - const extensionsBase = extensionsDir - ? resolveUserPath(extensionsDir) - : path.join(CONFIG_DIR, "extensions"); - const pluginIdError = validatePluginId(pluginId); - if (pluginIdError) { - throw new Error(pluginIdError); - } - const targetDirResult = resolveSafeInstallDir({ - baseDir: extensionsBase, - id: pluginId, - invalidNameMessage: "invalid plugin name: path traversal detected", - nameEncoder: encodePluginInstallDirName, - }); - if (!targetDirResult.ok) { - throw new Error(targetDirResult.error); - } - return targetDirResult.path; + return resolvePluginInstallDirWithinRoot( + pluginId, + resolvePreferredPluginInstallRoot(extensionsDir), + ); } async function installBundleFromSourceDir( @@ -530,12 +564,14 @@ async function installPluginFromPackageDir( for (const entry of extensions) { const resolvedEntry = path.resolve(packageDir, entry); if (!isPathInside(packageDir, resolvedEntry)) { - logger.warn?.(`extension entry escapes plugin directory and will not be scanned: ${entry}`); + logger.warn?.( + `native plugin entry escapes plugin directory and will not be scanned: ${entry}`, + ); continue; } if (extensionUsesSkippedScannerPath(entry)) { logger.warn?.( - `extension entry is in a hidden/node_modules path and will receive targeted scan coverage: ${entry}`, + `native plugin entry is in a hidden/node_modules path and will receive targeted scan coverage: ${entry}`, ); } forcedScanEntries.push(resolvedEntry); @@ -585,11 +621,11 @@ async function installPluginFromPackageDir( for (const entry of extensions) { const resolvedEntry = path.resolve(installedDir, entry); if (!isPathInside(installedDir, resolvedEntry)) { - logger.warn?.(`extension entry escapes plugin directory: ${entry}`); + logger.warn?.(`native plugin entry escapes plugin directory: ${entry}`); continue; } if (!(await fileExists(resolvedEntry))) { - logger.warn?.(`extension entry not found: ${entry}`); + logger.warn?.(`native plugin entry not found: ${entry}`); } } }, @@ -664,18 +700,15 @@ export async function installPluginFromFile(params: { return { ok: false, error: `file not found: ${filePath}` }; } - const extensionsDir = params.extensionsDir - ? resolveUserPath(params.extensionsDir) - : path.join(CONFIG_DIR, "extensions"); - await fs.mkdir(extensionsDir, { recursive: true }); - const base = path.basename(filePath, path.extname(filePath)); const pluginId = base || "plugin"; const pluginIdError = validatePluginId(pluginId); if (pluginIdError) { return { ok: false, error: pluginIdError }; } - const targetFile = path.join(extensionsDir, `${safeFileName(pluginId)}${path.extname(filePath)}`); + const pluginsRoot = path.dirname(resolveExistingPluginInstallDir(pluginId, params.extensionsDir)); + await fs.mkdir(pluginsRoot, { recursive: true }); + const targetFile = path.join(pluginsRoot, `${safeFileName(pluginId)}${path.extname(filePath)}`); const availability = await ensureInstallTargetAvailable({ mode, @@ -693,7 +726,7 @@ export async function installPluginFromFile(params: { logger.info?.(`Installing to ${targetFile}…`); try { await writeFileFromPathWithinRoot({ - rootDir: extensionsDir, + rootDir: pluginsRoot, relativePath: path.basename(targetFile), sourcePath: filePath, }); diff --git a/src/plugins/loader.test.ts b/src/plugins/loader.test.ts index 3425a1fe14f..b583515d81f 100644 --- a/src/plugins/loader.test.ts +++ b/src/plugins/loader.test.ts @@ -3556,7 +3556,7 @@ module.exports = { it("uses transpiled Jiti loads for source TypeScript plugin entries", () => { expect(__testing.shouldPreferNativeJiti("/repo/dist/plugins/runtime/index.js")).toBe(true); expect( - __testing.shouldPreferNativeJiti("/repo/extensions/discord/src/channel.runtime.ts"), + __testing.shouldPreferNativeJiti("/repo/native-plugins/discord/src/channel.runtime.ts"), ).toBe(false); }); diff --git a/src/plugins/loader.ts b/src/plugins/loader.ts index 03a1b0810ff..038f94a6ebb 100644 --- a/src/plugins/loader.ts +++ b/src/plugins/loader.ts @@ -25,7 +25,7 @@ import { clearPluginInteractiveHandlers } from "./interactive.js"; import { loadPluginManifestRegistry } from "./manifest-registry.js"; import { isPathInside, safeStatSync } from "./path-safety.js"; import { createPluginRegistry, type PluginRecord, type PluginRegistry } from "./registry.js"; -import { resolvePluginCacheInputs } from "./roots.js"; +import { resolvePluginCacheInputs, resolvePluginSourceRootCandidates } from "./roots.js"; import { setActivePluginRegistry } from "./runtime.js"; import type { CreatePluginRuntimeOptions } from "./runtime/index.js"; import type { PluginRuntime } from "./runtime/types.js"; @@ -218,6 +218,10 @@ function buildCacheKey(params: { loadPaths: params.plugins.loadPaths, env: params.env, }); + const autoRoots = resolvePluginSourceRootCandidates({ + workspaceDir: params.workspaceDir, + env: params.env, + }); const installs = Object.fromEntries( Object.entries(params.installs ?? {}).map(([pluginId, install]) => [ pluginId, @@ -238,11 +242,13 @@ function buildCacheKey(params: { const setupOnlyKey = params.includeSetupOnlyChannelPlugins === true ? "setup-only" : "runtime"; const startupChannelMode = params.preferSetupRuntimeForChannelPlugins === true ? "prefer-setup" : "full"; - return `${roots.workspace ?? ""}::${roots.global ?? ""}::${roots.stock ?? ""}::${JSON.stringify({ - ...params.plugins, - installs, - loadPaths, - })}::${scopeKey}::${setupOnlyKey}::${startupChannelMode}::${params.runtimeSubagentMode ?? "default"}`; + return `${JSON.stringify(autoRoots.workspace)}::${JSON.stringify(autoRoots.global)}::${roots.stock ?? ""}::${JSON.stringify( + { + ...params.plugins, + installs, + loadPaths, + }, + )}::${scopeKey}::${setupOnlyKey}::${startupChannelMode}::${params.runtimeSubagentMode ?? "default"}`; } function normalizeScopedPluginIds(ids?: string[]): string[] | undefined { diff --git a/src/plugins/manifest-registry.ts b/src/plugins/manifest-registry.ts index 383e6ad47cf..f09415fdfb2 100644 --- a/src/plugins/manifest-registry.ts +++ b/src/plugins/manifest-registry.ts @@ -6,7 +6,7 @@ import { normalizePluginsConfig, type NormalizedPluginsConfig } from "./config-s import { discoverOpenClawPlugins, type PluginCandidate } from "./discovery.js"; import { loadPluginManifest, type PluginManifest } from "./manifest.js"; import { isPathInside, safeRealpathSync } from "./path-safety.js"; -import { resolvePluginCacheInputs } from "./roots.js"; +import { resolvePluginCacheInputs, resolvePluginSourceRootCandidates } from "./roots.js"; import type { PluginBundleFormat, PluginConfigUiHint, @@ -106,8 +106,12 @@ function buildCacheKey(params: { loadPaths: params.plugins.loadPaths, env: params.env, }); - const workspaceKey = roots.workspace ?? ""; - const configExtensionsRoot = roots.global; + const autoRoots = resolvePluginSourceRootCandidates({ + workspaceDir: params.workspaceDir, + env: params.env, + }); + const workspaceKey = JSON.stringify(autoRoots.workspace); + const configExtensionsRoot = JSON.stringify(autoRoots.global); const bundledRoot = roots.stock ?? ""; // The manifest registry only depends on where plugins are discovered from (workspace + load paths). // It does not depend on allow/deny/entries enable-state, so exclude those for higher cache hit rates. diff --git a/src/plugins/manifest.ts b/src/plugins/manifest.ts index a75a2a9b6ab..167c5a94b1b 100644 --- a/src/plugins/manifest.ts +++ b/src/plugins/manifest.ts @@ -254,6 +254,7 @@ export type OpenClawPackageStartup = { }; export type OpenClawPackageManifest = { + plugins?: string[]; extensions?: string[]; setupEntry?: string; channel?: PluginPackageChannel; @@ -268,11 +269,13 @@ export const DEFAULT_PLUGIN_ENTRY_CANDIDATES = [ "index.cjs", ] as const; -export type PackageExtensionResolution = +export type PackagePluginResolution = | { status: "ok"; entries: string[] } | { status: "missing"; entries: [] } | { status: "empty"; entries: [] }; +export type PackageExtensionResolution = PackagePluginResolution; + export type ManifestKey = typeof MANIFEST_KEY; export type PackageManifest = { @@ -290,10 +293,11 @@ export function getPackageManifestMetadata( return manifest[MANIFEST_KEY]; } -export function resolvePackageExtensionEntries( +export function resolvePackagePluginEntries( manifest: PackageManifest | undefined, -): PackageExtensionResolution { - const raw = getPackageManifestMetadata(manifest)?.extensions; +): PackagePluginResolution { + const metadata = getPackageManifestMetadata(manifest); + const raw = Array.isArray(metadata?.plugins) ? metadata.plugins : metadata?.extensions; if (!Array.isArray(raw)) { return { status: "missing", entries: [] }; } @@ -305,3 +309,5 @@ export function resolvePackageExtensionEntries( } return { status: "ok", entries }; } + +export const resolvePackageExtensionEntries = resolvePackagePluginEntries; diff --git a/src/plugins/roots.ts b/src/plugins/roots.ts index 1b74f6c5d9b..d80a1002f10 100644 --- a/src/plugins/roots.ts +++ b/src/plugins/roots.ts @@ -2,12 +2,21 @@ import path from "node:path"; import { resolveConfigDir, resolveUserPath } from "../utils.js"; import { resolveBundledPluginsDir } from "./bundled-dir.js"; +const PREFERRED_PLUGIN_STATE_DIRNAME = "plugins"; +const LEGACY_PLUGIN_STATE_DIRNAME = "extensions"; + export type PluginSourceRoots = { stock?: string; global: string; workspace?: string; }; +export type PluginSourceRootCandidates = { + stock?: string; + global: string[]; + workspace: string[]; +}; + export type PluginCacheInputs = { roots: PluginSourceRoots; loadPaths: string[]; @@ -20,11 +29,33 @@ export function resolvePluginSourceRoots(params: { const env = params.env ?? process.env; const workspaceRoot = params.workspaceDir ? resolveUserPath(params.workspaceDir, env) : undefined; const stock = resolveBundledPluginsDir(env); - const global = path.join(resolveConfigDir(env), "extensions"); - const workspace = workspaceRoot ? path.join(workspaceRoot, ".openclaw", "extensions") : undefined; + const global = path.join(resolveConfigDir(env), PREFERRED_PLUGIN_STATE_DIRNAME); + const workspace = workspaceRoot + ? path.join(workspaceRoot, ".openclaw", PREFERRED_PLUGIN_STATE_DIRNAME) + : undefined; return { stock, global, workspace }; } +export function resolvePluginSourceRootCandidates(params: { + workspaceDir?: string; + env?: NodeJS.ProcessEnv; +}): PluginSourceRootCandidates { + const env = params.env ?? process.env; + const workspaceRoot = params.workspaceDir ? resolveUserPath(params.workspaceDir, env) : undefined; + const configDir = resolveConfigDir(env); + const global = [ + path.join(configDir, PREFERRED_PLUGIN_STATE_DIRNAME), + path.join(configDir, LEGACY_PLUGIN_STATE_DIRNAME), + ]; + const workspace = workspaceRoot + ? [ + path.join(workspaceRoot, ".openclaw", PREFERRED_PLUGIN_STATE_DIRNAME), + path.join(workspaceRoot, ".openclaw", LEGACY_PLUGIN_STATE_DIRNAME), + ] + : []; + return { stock: resolveBundledPluginsDir(env), global, workspace }; +} + // Shared env-aware cache inputs for discovery, manifest, and loader caches. export function resolvePluginCacheInputs(params: { workspaceDir?: string; diff --git a/src/plugins/runtime/runtime-whatsapp-boundary.ts b/src/plugins/runtime/runtime-whatsapp-boundary.ts index b44856b799a..4e0ab8367a3 100644 --- a/src/plugins/runtime/runtime-whatsapp-boundary.ts +++ b/src/plugins/runtime/runtime-whatsapp-boundary.ts @@ -19,8 +19,8 @@ import { const WHATSAPP_PLUGIN_ID = "whatsapp"; -type WhatsAppLightModule = typeof import("../../../extensions/whatsapp/light-runtime-api.js"); -type WhatsAppHeavyModule = typeof import("../../../extensions/whatsapp/runtime-api.js"); +type WhatsAppLightModule = typeof import("../../../native-plugins/whatsapp/light-runtime-api.js"); +type WhatsAppHeavyModule = typeof import("../../../native-plugins/whatsapp/runtime-api.js"); type WhatsAppPluginRecord = { origin: string; diff --git a/src/plugins/runtime/types-channel.ts b/src/plugins/runtime/types-channel.ts index 1a44e0e45f1..bf62b7015dd 100644 --- a/src/plugins/runtime/types-channel.ts +++ b/src/plugins/runtime/types-channel.ts @@ -94,29 +94,29 @@ export type PluginRuntimeChannel = { shouldHandleTextCommands: typeof import("../../auto-reply/commands-registry.js").shouldHandleTextCommands; }; discord: { - messageActions: typeof import("../../../extensions/discord/runtime-api.js").discordMessageActions; - auditChannelPermissions: typeof import("../../../extensions/discord/runtime-api.js").auditDiscordChannelPermissions; - listDirectoryGroupsLive: typeof import("../../../extensions/discord/runtime-api.js").listDiscordDirectoryGroupsLive; - listDirectoryPeersLive: typeof import("../../../extensions/discord/runtime-api.js").listDiscordDirectoryPeersLive; - probeDiscord: typeof import("../../../extensions/discord/runtime-api.js").probeDiscord; - resolveChannelAllowlist: typeof import("../../../extensions/discord/runtime-api.js").resolveDiscordChannelAllowlist; - resolveUserAllowlist: typeof import("../../../extensions/discord/runtime-api.js").resolveDiscordUserAllowlist; - sendComponentMessage: typeof import("../../../extensions/discord/runtime-api.js").sendDiscordComponentMessage; - sendMessageDiscord: typeof import("../../../extensions/discord/runtime-api.js").sendMessageDiscord; - sendPollDiscord: typeof import("../../../extensions/discord/runtime-api.js").sendPollDiscord; - monitorDiscordProvider: typeof import("../../../extensions/discord/runtime-api.js").monitorDiscordProvider; + messageActions: typeof import("../../../native-plugins/discord/runtime-api.js").discordMessageActions; + auditChannelPermissions: typeof import("../../../native-plugins/discord/runtime-api.js").auditDiscordChannelPermissions; + listDirectoryGroupsLive: typeof import("../../../native-plugins/discord/runtime-api.js").listDiscordDirectoryGroupsLive; + listDirectoryPeersLive: typeof import("../../../native-plugins/discord/runtime-api.js").listDiscordDirectoryPeersLive; + probeDiscord: typeof import("../../../native-plugins/discord/runtime-api.js").probeDiscord; + resolveChannelAllowlist: typeof import("../../../native-plugins/discord/runtime-api.js").resolveDiscordChannelAllowlist; + resolveUserAllowlist: typeof import("../../../native-plugins/discord/runtime-api.js").resolveDiscordUserAllowlist; + sendComponentMessage: typeof import("../../../native-plugins/discord/runtime-api.js").sendDiscordComponentMessage; + sendMessageDiscord: typeof import("../../../native-plugins/discord/runtime-api.js").sendMessageDiscord; + sendPollDiscord: typeof import("../../../native-plugins/discord/runtime-api.js").sendPollDiscord; + monitorDiscordProvider: typeof import("../../../native-plugins/discord/runtime-api.js").monitorDiscordProvider; threadBindings: { - getManager: typeof import("../../../extensions/discord/runtime-api.js").getThreadBindingManager; - resolveIdleTimeoutMs: typeof import("../../../extensions/discord/runtime-api.js").resolveThreadBindingIdleTimeoutMs; - resolveInactivityExpiresAt: typeof import("../../../extensions/discord/runtime-api.js").resolveThreadBindingInactivityExpiresAt; - resolveMaxAgeMs: typeof import("../../../extensions/discord/runtime-api.js").resolveThreadBindingMaxAgeMs; - resolveMaxAgeExpiresAt: typeof import("../../../extensions/discord/runtime-api.js").resolveThreadBindingMaxAgeExpiresAt; - setIdleTimeoutBySessionKey: typeof import("../../../extensions/discord/runtime-api.js").setThreadBindingIdleTimeoutBySessionKey; - setMaxAgeBySessionKey: typeof import("../../../extensions/discord/runtime-api.js").setThreadBindingMaxAgeBySessionKey; - unbindBySessionKey: typeof import("../../../extensions/discord/runtime-api.js").unbindThreadBindingsBySessionKey; + getManager: typeof import("../../../native-plugins/discord/runtime-api.js").getThreadBindingManager; + resolveIdleTimeoutMs: typeof import("../../../native-plugins/discord/runtime-api.js").resolveThreadBindingIdleTimeoutMs; + resolveInactivityExpiresAt: typeof import("../../../native-plugins/discord/runtime-api.js").resolveThreadBindingInactivityExpiresAt; + resolveMaxAgeMs: typeof import("../../../native-plugins/discord/runtime-api.js").resolveThreadBindingMaxAgeMs; + resolveMaxAgeExpiresAt: typeof import("../../../native-plugins/discord/runtime-api.js").resolveThreadBindingMaxAgeExpiresAt; + setIdleTimeoutBySessionKey: typeof import("../../../native-plugins/discord/runtime-api.js").setThreadBindingIdleTimeoutBySessionKey; + setMaxAgeBySessionKey: typeof import("../../../native-plugins/discord/runtime-api.js").setThreadBindingMaxAgeBySessionKey; + unbindBySessionKey: typeof import("../../../native-plugins/discord/runtime-api.js").unbindThreadBindingsBySessionKey; }; typing: { - pulse: typeof import("../../../extensions/discord/runtime-api.js").sendTypingDiscord; + pulse: typeof import("../../../native-plugins/discord/runtime-api.js").sendTypingDiscord; start: (params: { channelId: string; accountId?: string; @@ -128,39 +128,39 @@ export type PluginRuntimeChannel = { }>; }; conversationActions: { - editMessage: typeof import("../../../extensions/discord/runtime-api.js").editMessageDiscord; - deleteMessage: typeof import("../../../extensions/discord/runtime-api.js").deleteMessageDiscord; - pinMessage: typeof import("../../../extensions/discord/runtime-api.js").pinMessageDiscord; - unpinMessage: typeof import("../../../extensions/discord/runtime-api.js").unpinMessageDiscord; - createThread: typeof import("../../../extensions/discord/runtime-api.js").createThreadDiscord; - editChannel: typeof import("../../../extensions/discord/runtime-api.js").editChannelDiscord; + editMessage: typeof import("../../../native-plugins/discord/runtime-api.js").editMessageDiscord; + deleteMessage: typeof import("../../../native-plugins/discord/runtime-api.js").deleteMessageDiscord; + pinMessage: typeof import("../../../native-plugins/discord/runtime-api.js").pinMessageDiscord; + unpinMessage: typeof import("../../../native-plugins/discord/runtime-api.js").unpinMessageDiscord; + createThread: typeof import("../../../native-plugins/discord/runtime-api.js").createThreadDiscord; + editChannel: typeof import("../../../native-plugins/discord/runtime-api.js").editChannelDiscord; }; }; slack: { - listDirectoryGroupsLive: typeof import("../../../extensions/slack/runtime-api.js").listSlackDirectoryGroupsLive; - listDirectoryPeersLive: typeof import("../../../extensions/slack/runtime-api.js").listSlackDirectoryPeersLive; - probeSlack: typeof import("../../../extensions/slack/runtime-api.js").probeSlack; - resolveChannelAllowlist: typeof import("../../../extensions/slack/runtime-api.js").resolveSlackChannelAllowlist; - resolveUserAllowlist: typeof import("../../../extensions/slack/runtime-api.js").resolveSlackUserAllowlist; - sendMessageSlack: typeof import("../../../extensions/slack/runtime-api.js").sendMessageSlack; - monitorSlackProvider: typeof import("../../../extensions/slack/runtime-api.js").monitorSlackProvider; - handleSlackAction: typeof import("../../../extensions/slack/runtime-api.js").handleSlackAction; + listDirectoryGroupsLive: typeof import("../../../native-plugins/slack/runtime-api.js").listSlackDirectoryGroupsLive; + listDirectoryPeersLive: typeof import("../../../native-plugins/slack/runtime-api.js").listSlackDirectoryPeersLive; + probeSlack: typeof import("../../../native-plugins/slack/runtime-api.js").probeSlack; + resolveChannelAllowlist: typeof import("../../../native-plugins/slack/runtime-api.js").resolveSlackChannelAllowlist; + resolveUserAllowlist: typeof import("../../../native-plugins/slack/runtime-api.js").resolveSlackUserAllowlist; + sendMessageSlack: typeof import("../../../native-plugins/slack/runtime-api.js").sendMessageSlack; + monitorSlackProvider: typeof import("../../../native-plugins/slack/runtime-api.js").monitorSlackProvider; + handleSlackAction: typeof import("../../../native-plugins/slack/runtime-api.js").handleSlackAction; }; telegram: { - auditGroupMembership: typeof import("../../../extensions/telegram/runtime-api.js").auditTelegramGroupMembership; - collectUnmentionedGroupIds: typeof import("../../../extensions/telegram/runtime-api.js").collectTelegramUnmentionedGroupIds; - probeTelegram: typeof import("../../../extensions/telegram/runtime-api.js").probeTelegram; - resolveTelegramToken: typeof import("../../../extensions/telegram/runtime-api.js").resolveTelegramToken; - sendMessageTelegram: typeof import("../../../extensions/telegram/runtime-api.js").sendMessageTelegram; - sendPollTelegram: typeof import("../../../extensions/telegram/runtime-api.js").sendPollTelegram; - monitorTelegramProvider: typeof import("../../../extensions/telegram/runtime-api.js").monitorTelegramProvider; - messageActions: typeof import("../../../extensions/telegram/runtime-api.js").telegramMessageActions; + auditGroupMembership: typeof import("../../../native-plugins/telegram/runtime-api.js").auditTelegramGroupMembership; + collectUnmentionedGroupIds: typeof import("../../../native-plugins/telegram/runtime-api.js").collectTelegramUnmentionedGroupIds; + probeTelegram: typeof import("../../../native-plugins/telegram/runtime-api.js").probeTelegram; + resolveTelegramToken: typeof import("../../../native-plugins/telegram/runtime-api.js").resolveTelegramToken; + sendMessageTelegram: typeof import("../../../native-plugins/telegram/runtime-api.js").sendMessageTelegram; + sendPollTelegram: typeof import("../../../native-plugins/telegram/runtime-api.js").sendPollTelegram; + monitorTelegramProvider: typeof import("../../../native-plugins/telegram/runtime-api.js").monitorTelegramProvider; + messageActions: typeof import("../../../native-plugins/telegram/runtime-api.js").telegramMessageActions; threadBindings: { - setIdleTimeoutBySessionKey: typeof import("../../../extensions/telegram/runtime-api.js").setTelegramThreadBindingIdleTimeoutBySessionKey; - setMaxAgeBySessionKey: typeof import("../../../extensions/telegram/runtime-api.js").setTelegramThreadBindingMaxAgeBySessionKey; + setIdleTimeoutBySessionKey: typeof import("../../../native-plugins/telegram/runtime-api.js").setTelegramThreadBindingIdleTimeoutBySessionKey; + setMaxAgeBySessionKey: typeof import("../../../native-plugins/telegram/runtime-api.js").setTelegramThreadBindingMaxAgeBySessionKey; }; typing: { - pulse: typeof import("../../../extensions/telegram/runtime-api.js").sendTypingTelegram; + pulse: typeof import("../../../native-plugins/telegram/runtime-api.js").sendTypingTelegram; start: (params: { to: string; accountId?: string; @@ -173,8 +173,8 @@ export type PluginRuntimeChannel = { }>; }; conversationActions: { - editMessage: typeof import("../../../extensions/telegram/runtime-api.js").editMessageTelegram; - editReplyMarkup: typeof import("../../../extensions/telegram/runtime-api.js").editMessageReplyMarkupTelegram; + editMessage: typeof import("../../../native-plugins/telegram/runtime-api.js").editMessageTelegram; + editReplyMarkup: typeof import("../../../native-plugins/telegram/runtime-api.js").editMessageReplyMarkupTelegram; clearReplyMarkup: ( chatIdInput: string | number, messageIdInput: string | number, @@ -187,10 +187,10 @@ export type PluginRuntimeChannel = { cfg?: ReturnType; }, ) => Promise<{ ok: true; messageId: string; chatId: string }>; - deleteMessage: typeof import("../../../extensions/telegram/runtime-api.js").deleteMessageTelegram; - renameTopic: typeof import("../../../extensions/telegram/runtime-api.js").renameForumTopicTelegram; - pinMessage: typeof import("../../../extensions/telegram/runtime-api.js").pinMessageTelegram; - unpinMessage: typeof import("../../../extensions/telegram/runtime-api.js").unpinMessageTelegram; + deleteMessage: typeof import("../../../native-plugins/telegram/runtime-api.js").deleteMessageTelegram; + renameTopic: typeof import("../../../native-plugins/telegram/runtime-api.js").renameForumTopicTelegram; + pinMessage: typeof import("../../../native-plugins/telegram/runtime-api.js").pinMessageTelegram; + unpinMessage: typeof import("../../../native-plugins/telegram/runtime-api.js").unpinMessageTelegram; }; }; matrix: { @@ -200,15 +200,15 @@ export type PluginRuntimeChannel = { }; }; signal: { - probeSignal: typeof import("../../../extensions/signal/runtime-api.js").probeSignal; - sendMessageSignal: typeof import("../../../extensions/signal/runtime-api.js").sendMessageSignal; - monitorSignalProvider: typeof import("../../../extensions/signal/runtime-api.js").monitorSignalProvider; - messageActions: typeof import("../../../extensions/signal/runtime-api.js").signalMessageActions; + probeSignal: typeof import("../../../native-plugins/signal/runtime-api.js").probeSignal; + sendMessageSignal: typeof import("../../../native-plugins/signal/runtime-api.js").sendMessageSignal; + monitorSignalProvider: typeof import("../../../native-plugins/signal/runtime-api.js").monitorSignalProvider; + messageActions: typeof import("../../../native-plugins/signal/runtime-api.js").signalMessageActions; }; imessage: { - monitorIMessageProvider: typeof import("../../../extensions/imessage/runtime-api.js").monitorIMessageProvider; - probeIMessage: typeof import("../../../extensions/imessage/runtime-api.js").probeIMessage; - sendMessageIMessage: typeof import("../../../extensions/imessage/runtime-api.js").sendMessageIMessage; + monitorIMessageProvider: typeof import("../../../native-plugins/imessage/runtime-api.js").monitorIMessageProvider; + probeIMessage: typeof import("../../../native-plugins/imessage/runtime-api.js").probeIMessage; + sendMessageIMessage: typeof import("../../../native-plugins/imessage/runtime-api.js").sendMessageIMessage; }; whatsapp: { getActiveWebListener: typeof import("./runtime-whatsapp-boundary.js").getActiveWebListener; diff --git a/src/plugins/stage-bundled-plugin-runtime.test.ts b/src/plugins/stage-bundled-plugin-runtime.test.ts index 7bdb986e030..837b470a830 100644 --- a/src/plugins/stage-bundled-plugin-runtime.test.ts +++ b/src/plugins/stage-bundled-plugin-runtime.test.ts @@ -24,7 +24,7 @@ afterEach(() => { describe("stageBundledPluginRuntime", () => { it("stages bundled dist plugins as runtime wrappers and links staged dist node_modules", () => { const repoRoot = makeRepoRoot("openclaw-stage-bundled-runtime-"); - const distPluginDir = path.join(repoRoot, "dist", "extensions", "diffs"); + const distPluginDir = path.join(repoRoot, "dist", "native-plugins", "diffs"); fs.mkdirSync(path.join(repoRoot, "dist"), { recursive: true }); fs.mkdirSync(distPluginDir, { recursive: true }); fs.mkdirSync(path.join(distPluginDir, "node_modules", "@pierre", "diffs"), { @@ -39,10 +39,10 @@ describe("stageBundledPluginRuntime", () => { stageBundledPluginRuntime({ repoRoot }); - const runtimePluginDir = path.join(repoRoot, "dist-runtime", "extensions", "diffs"); + const runtimePluginDir = path.join(repoRoot, "dist-runtime", "native-plugins", "diffs"); expect(fs.existsSync(path.join(runtimePluginDir, "index.js"))).toBe(true); expect(fs.readFileSync(path.join(runtimePluginDir, "index.js"), "utf8")).toContain( - "../../../dist/extensions/diffs/index.js", + "../../../dist/native-plugins/diffs/index.js", ); expect(fs.lstatSync(path.join(runtimePluginDir, "node_modules")).isSymbolicLink()).toBe(true); expect(fs.realpathSync(path.join(runtimePluginDir, "node_modules"))).toBe( @@ -53,23 +53,29 @@ describe("stageBundledPluginRuntime", () => { it("writes wrappers that forward plugin entry imports into canonical dist files", async () => { const repoRoot = makeRepoRoot("openclaw-stage-bundled-runtime-chunks-"); - fs.mkdirSync(path.join(repoRoot, "dist", "extensions", "diffs"), { recursive: true }); + fs.mkdirSync(path.join(repoRoot, "dist", "native-plugins", "diffs"), { recursive: true }); fs.writeFileSync( path.join(repoRoot, "dist", "chunk-abc.js"), "export const value = 1;\n", "utf8", ); fs.writeFileSync( - path.join(repoRoot, "dist", "extensions", "diffs", "index.js"), + path.join(repoRoot, "dist", "native-plugins", "diffs", "index.js"), "export { value } from '../../chunk-abc.js';\n", "utf8", ); stageBundledPluginRuntime({ repoRoot }); - const runtimeEntryPath = path.join(repoRoot, "dist-runtime", "extensions", "diffs", "index.js"); + const runtimeEntryPath = path.join( + repoRoot, + "dist-runtime", + "native-plugins", + "diffs", + "index.js", + ); expect(fs.readFileSync(runtimeEntryPath, "utf8")).toContain( - "../../../dist/extensions/diffs/index.js", + "../../../dist/native-plugins/diffs/index.js", ); expect(fs.existsSync(path.join(repoRoot, "dist-runtime", "chunk-abc.js"))).toBe(false); @@ -79,7 +85,7 @@ describe("stageBundledPluginRuntime", () => { it("keeps plugin command registration on the canonical dist graph when loaded from dist-runtime", async () => { const repoRoot = makeRepoRoot("openclaw-stage-bundled-runtime-commands-"); - const distPluginDir = path.join(repoRoot, "dist", "extensions", "demo"); + const distPluginDir = path.join(repoRoot, "dist", "native-plugins", "demo"); const distCommandsDir = path.join(repoRoot, "dist", "plugins"); fs.mkdirSync(distPluginDir, { recursive: true }); fs.mkdirSync(distCommandsDir, { recursive: true }); @@ -136,7 +142,13 @@ describe("stageBundledPluginRuntime", () => { stageBundledPluginRuntime({ repoRoot }); - const runtimeEntryPath = path.join(repoRoot, "dist-runtime", "extensions", "demo", "index.js"); + const runtimeEntryPath = path.join( + repoRoot, + "dist-runtime", + "native-plugins", + "demo", + "index.js", + ); const canonicalCommandsPath = path.join(repoRoot, "dist", "plugins", "commands.js"); expect(fs.existsSync(path.join(repoRoot, "dist-runtime", "plugins", "commands.js"))).toBe( @@ -186,15 +198,11 @@ describe("stageBundledPluginRuntime", () => { it("copies package metadata files but symlinks other non-js plugin artifacts into the runtime overlay", () => { const repoRoot = makeRepoRoot("openclaw-stage-bundled-runtime-assets-"); - const distPluginDir = path.join(repoRoot, "dist", "extensions", "diffs"); + const distPluginDir = path.join(repoRoot, "dist", "native-plugins", "diffs"); fs.mkdirSync(path.join(distPluginDir, "assets"), { recursive: true }); fs.writeFileSync( path.join(distPluginDir, "package.json"), - JSON.stringify( - { name: "@openclaw/diffs", openclaw: { extensions: ["./index.js"] } }, - null, - 2, - ), + JSON.stringify({ name: "@openclaw/diffs", openclaw: { plugins: ["./index.js"] } }, null, 2), "utf8", ); fs.writeFileSync(path.join(distPluginDir, "openclaw.plugin.json"), "{}\n", "utf8"); @@ -205,28 +213,28 @@ describe("stageBundledPluginRuntime", () => { const runtimePackagePath = path.join( repoRoot, "dist-runtime", - "extensions", + "native-plugins", "diffs", "package.json", ); const runtimeManifestPath = path.join( repoRoot, "dist-runtime", - "extensions", + "native-plugins", "diffs", "openclaw.plugin.json", ); const runtimeAssetPath = path.join( repoRoot, "dist-runtime", - "extensions", + "native-plugins", "diffs", "assets", "info.txt", ); expect(fs.lstatSync(runtimePackagePath).isSymbolicLink()).toBe(false); - expect(fs.readFileSync(runtimePackagePath, "utf8")).toContain('"extensions": ['); + expect(fs.readFileSync(runtimePackagePath, "utf8")).toContain('"plugins": ['); expect(fs.lstatSync(runtimeManifestPath).isSymbolicLink()).toBe(false); expect(fs.readFileSync(runtimeManifestPath, "utf8")).toBe("{}\n"); expect(fs.lstatSync(runtimeAssetPath).isSymbolicLink()).toBe(true); @@ -235,8 +243,8 @@ describe("stageBundledPluginRuntime", () => { it("preserves package metadata needed for bundled plugin discovery from dist-runtime", () => { const repoRoot = makeRepoRoot("openclaw-stage-bundled-runtime-discovery-"); - const distPluginDir = path.join(repoRoot, "dist", "extensions", "demo"); - const runtimeExtensionsDir = path.join(repoRoot, "dist-runtime", "extensions"); + const distPluginDir = path.join(repoRoot, "dist", "native-plugins", "demo"); + const runtimeExtensionsDir = path.join(repoRoot, "dist-runtime", "native-plugins"); fs.mkdirSync(distPluginDir, { recursive: true }); fs.writeFileSync( path.join(distPluginDir, "package.json"), @@ -244,7 +252,7 @@ describe("stageBundledPluginRuntime", () => { { name: "@openclaw/demo", openclaw: { - extensions: ["./main.js"], + plugins: ["./main.js"], setupEntry: "./setup.js", startup: { deferConfiguredChannelFullLoadUntilAfterListen: true, @@ -310,10 +318,10 @@ describe("stageBundledPluginRuntime", () => { it("removes stale runtime plugin directories that are no longer in dist", () => { const repoRoot = makeRepoRoot("openclaw-stage-bundled-runtime-stale-"); - const staleRuntimeDir = path.join(repoRoot, "dist-runtime", "extensions", "stale"); + const staleRuntimeDir = path.join(repoRoot, "dist-runtime", "native-plugins", "stale"); fs.mkdirSync(staleRuntimeDir, { recursive: true }); fs.writeFileSync(path.join(staleRuntimeDir, "index.js"), "stale\n", "utf8"); - fs.mkdirSync(path.join(repoRoot, "dist", "extensions"), { recursive: true }); + fs.mkdirSync(path.join(repoRoot, "dist", "native-plugins"), { recursive: true }); stageBundledPluginRuntime({ repoRoot }); @@ -322,7 +330,7 @@ describe("stageBundledPluginRuntime", () => { it("removes dist-runtime when the built bundled plugin tree is absent", () => { const repoRoot = makeRepoRoot("openclaw-stage-bundled-runtime-missing-"); - const runtimeRoot = path.join(repoRoot, "dist-runtime", "extensions", "diffs"); + const runtimeRoot = path.join(repoRoot, "dist-runtime", "native-plugins", "diffs"); fs.mkdirSync(runtimeRoot, { recursive: true }); stageBundledPluginRuntime({ repoRoot }); diff --git a/src/plugins/uninstall.ts b/src/plugins/uninstall.ts index 40fe5b90a59..8e70ca43fc1 100644 --- a/src/plugins/uninstall.ts +++ b/src/plugins/uninstall.ts @@ -2,7 +2,7 @@ import fs from "node:fs/promises"; import path from "node:path"; import type { OpenClawConfig } from "../config/config.js"; import type { PluginInstallRecord } from "../config/types.plugins.js"; -import { resolvePluginInstallDir } from "./install.js"; +import { resolveExistingPluginInstallDir, resolvePluginInstallDir } from "./install.js"; import { defaultSlotIdForKey } from "./slots.js"; export type UninstallActions = { @@ -38,24 +38,29 @@ export function resolveUninstallDirectoryTarget(params: { return null; } - let defaultPath: string; + let preferredPath: string; + let existingPath: string; try { - defaultPath = resolvePluginInstallDir(params.pluginId, params.extensionsDir); + preferredPath = resolvePluginInstallDir(params.pluginId, params.extensionsDir); + existingPath = resolveExistingPluginInstallDir(params.pluginId, params.extensionsDir); } catch { return null; } const configuredPath = params.installRecord?.installPath; if (!configuredPath) { - return defaultPath; + return existingPath; } - if (path.resolve(configuredPath) === path.resolve(defaultPath)) { + if ( + path.resolve(configuredPath) === path.resolve(preferredPath) || + path.resolve(configuredPath) === path.resolve(existingPath) + ) { return configuredPath; } // Never trust configured installPath blindly for recursive deletes. - return defaultPath; + return existingPath; } /** diff --git a/src/plugins/update.test.ts b/src/plugins/update.test.ts index 96c15443ded..80ac67b1440 100644 --- a/src/plugins/update.test.ts +++ b/src/plugins/update.test.ts @@ -441,7 +441,7 @@ describe("syncPluginsForUpdateChannel", () => { "feishu", { pluginId: "feishu", - localPath: "/app/extensions/feishu", + localPath: "/app/native-plugins/feishu", npmSpec: "@openclaw/feishu", }, ], @@ -452,12 +452,12 @@ describe("syncPluginsForUpdateChannel", () => { channel: "beta", config: { plugins: { - load: { paths: ["/app/extensions/feishu"] }, + load: { paths: ["/app/native-plugins/feishu"] }, installs: { feishu: { source: "path", - sourcePath: "/app/extensions/feishu", - installPath: "/app/extensions/feishu", + sourcePath: "/app/native-plugins/feishu", + installPath: "/app/native-plugins/feishu", spec: "@openclaw/feishu", }, }, @@ -468,7 +468,7 @@ describe("syncPluginsForUpdateChannel", () => { expect(installPluginFromNpmSpecMock).not.toHaveBeenCalled(); expect(result.changed).toBe(false); expect(result.summary.switchedToNpm).toEqual([]); - expect(result.config.plugins?.load?.paths).toEqual(["/app/extensions/feishu"]); + expect(result.config.plugins?.load?.paths).toEqual(["/app/native-plugins/feishu"]); expect(result.config.plugins?.installs?.feishu?.source).toBe("path"); }); @@ -479,7 +479,7 @@ describe("syncPluginsForUpdateChannel", () => { "feishu", { pluginId: "feishu", - localPath: "/app/extensions/feishu", + localPath: "/app/native-plugins/feishu", npmSpec: "@openclaw/feishu", }, ], @@ -494,7 +494,7 @@ describe("syncPluginsForUpdateChannel", () => { installs: { feishu: { source: "path", - sourcePath: "/app/extensions/feishu", + sourcePath: "/app/native-plugins/feishu", installPath: "/tmp/old-feishu", spec: "@openclaw/feishu", }, @@ -504,11 +504,11 @@ describe("syncPluginsForUpdateChannel", () => { }); expect(result.changed).toBe(true); - expect(result.config.plugins?.load?.paths).toEqual(["/app/extensions/feishu"]); + expect(result.config.plugins?.load?.paths).toEqual(["/app/native-plugins/feishu"]); expect(result.config.plugins?.installs?.feishu).toMatchObject({ source: "path", - sourcePath: "/app/extensions/feishu", - installPath: "/app/extensions/feishu", + sourcePath: "/app/native-plugins/feishu", + installPath: "/app/native-plugins/feishu", spec: "@openclaw/feishu", }); expect(installPluginFromNpmSpecMock).not.toHaveBeenCalled(); diff --git a/src/plugins/voice-call.plugin.test.ts b/src/plugins/voice-call.plugin.test.ts index 6a018c27b42..ba29bae3a5b 100644 --- a/src/plugins/voice-call.plugin.test.ts +++ b/src/plugins/voice-call.plugin.test.ts @@ -17,11 +17,11 @@ let runtimeStub: { stop: ReturnType; }; -vi.mock("../../extensions/voice-call/src/runtime.js", () => ({ +vi.mock("../../native-plugins/voice-call/src/runtime.js", () => ({ createVoiceCallRuntime: vi.fn(async () => runtimeStub), })); -import plugin from "../../extensions/voice-call/index.js"; +import plugin from "../../native-plugins/voice-call/index.js"; const noopLogger = { info: vi.fn(), diff --git a/src/security/audit-extra.async.ts b/src/security/audit-extra.async.ts index 5e9c4036e09..de80c8d502a 100644 --- a/src/security/audit-extra.async.ts +++ b/src/security/audit-extra.async.ts @@ -1195,7 +1195,7 @@ export async function collectPluginsCodeSafetyFindings(params: { title: `Plugin "${pluginName}" has extension entry path traversal`, detail: `Found extension entries that escape the plugin directory:\n${escapedEntries.map((entry) => ` - ${entry}`).join("\n")}`, remediation: - "Update the plugin manifest so all openclaw.extensions entries stay inside the plugin directory.", + "Update the plugin manifest so all openclaw.plugins entries stay inside the plugin directory.", }); } diff --git a/src/security/dm-policy-channel-smoke.test.ts b/src/security/dm-policy-channel-smoke.test.ts index 189f169648c..387c16dc60a 100644 --- a/src/security/dm-policy-channel-smoke.test.ts +++ b/src/security/dm-policy-channel-smoke.test.ts @@ -1,7 +1,10 @@ import { describe, expect, it } from "vitest"; -import { isAllowedBlueBubblesSender } from "../../extensions/bluebubbles/src/targets.js"; -import { isMattermostSenderAllowed } from "../../extensions/mattermost/src/mattermost/monitor-auth.js"; -import { isSignalSenderAllowed, type SignalSender } from "../../extensions/signal/src/identity.js"; +import { isAllowedBlueBubblesSender } from "../../native-plugins/bluebubbles/src/targets.js"; +import { isMattermostSenderAllowed } from "../../native-plugins/mattermost/src/mattermost/monitor-auth.js"; +import { + isSignalSenderAllowed, + type SignalSender, +} from "../../native-plugins/signal/src/identity.js"; import { DM_GROUP_ACCESS_REASON, resolveDmGroupAccessWithLists } from "./dm-policy-shared.js"; type ChannelSmokeCase = { diff --git a/src/test-utils/imessage-test-plugin.ts b/src/test-utils/imessage-test-plugin.ts index 62362fe5712..68b01edbfc8 100644 --- a/src/test-utils/imessage-test-plugin.ts +++ b/src/test-utils/imessage-test-plugin.ts @@ -1,4 +1,4 @@ -import { normalizeIMessageHandle } from "../../extensions/imessage/api.js"; +import { normalizeIMessageHandle } from "../../native-plugins/imessage/api.js"; import { imessageOutbound } from "../../test/channel-outbounds.js"; import type { ChannelOutboundAdapter, ChannelPlugin } from "../channels/plugins/types.js"; import { collectStatusIssuesFromLastError } from "../plugin-sdk/status-helpers.js"; diff --git a/src/test-utils/repo-scan.ts b/src/test-utils/repo-scan.ts index 9dbf67fed22..80d7d3af0d5 100644 --- a/src/test-utils/repo-scan.ts +++ b/src/test-utils/repo-scan.ts @@ -2,7 +2,7 @@ import fs from "node:fs/promises"; import path from "node:path"; export const DEFAULT_REPO_SCAN_SKIP_DIR_NAMES = new Set([".git", "dist", "node_modules"]); -export const DEFAULT_RUNTIME_SOURCE_ROOTS = ["src", "extensions"] as const; +export const DEFAULT_RUNTIME_SOURCE_ROOTS = ["src", "native-plugins"] as const; export const DEFAULT_RUNTIME_SOURCE_EXTENSIONS = [".ts", ".tsx"] as const; export const RUNTIME_SOURCE_SKIP_PATTERNS = [ /\.test\.tsx?$/, @@ -73,7 +73,7 @@ export async function listRepoFiles( pending.push({ absolutePath }); } } catch { - // Skip missing roots. Useful when extensions/ is absent. + // Skip missing roots. Useful when native-plugins/ is absent. } } diff --git a/src/test-utils/runtime-source-guardrail-scan.ts b/src/test-utils/runtime-source-guardrail-scan.ts index 1e41fce3d3f..7ba2aba3b9c 100644 --- a/src/test-utils/runtime-source-guardrail-scan.ts +++ b/src/test-utils/runtime-source-guardrail-scan.ts @@ -79,10 +79,14 @@ function tryListTrackedRuntimeSourceFiles(repoRoot: string): string[] | null { } try { - const stdout = execFileSync("git", ["-C", repoRoot, "ls-files", "--", "src", "extensions"], { - encoding: "utf8", - stdio: ["ignore", "pipe", "ignore"], - }); + const stdout = execFileSync( + "git", + ["-C", repoRoot, "ls-files", "--", "src", "native-plugins"], + { + encoding: "utf8", + stdio: ["ignore", "pipe", "ignore"], + }, + ); const files = stdout .split(/\r?\n/u) .filter(Boolean) @@ -107,7 +111,7 @@ export async function loadRuntimeSourceFilesForGuardrails( trackedFiles ?? ( await listRuntimeSourceFiles(repoRoot, { - roots: ["src", "extensions"], + roots: ["src", "native-plugins"], extensions: [".ts", ".tsx"], }) ).filter((absolutePath) => { diff --git a/test/channel-outbounds.ts b/test/channel-outbounds.ts index a6da5a1c333..bc6e5dec148 100644 --- a/test/channel-outbounds.ts +++ b/test/channel-outbounds.ts @@ -1,6 +1,6 @@ -export { discordOutbound } from "../extensions/discord/src/outbound-adapter.js"; -export { imessageOutbound } from "../extensions/imessage/src/outbound-adapter.js"; -export { signalOutbound } from "../extensions/signal/src/outbound-adapter.js"; -export { slackOutbound } from "../extensions/slack/src/outbound-adapter.js"; -export { telegramOutbound } from "../extensions/telegram/src/outbound-adapter.js"; -export { whatsappOutbound } from "../extensions/whatsapp/src/outbound-adapter.js"; +export { discordOutbound } from "../native-plugins/discord/src/outbound-adapter.js"; +export { imessageOutbound } from "../native-plugins/imessage/src/outbound-adapter.js"; +export { signalOutbound } from "../native-plugins/signal/src/outbound-adapter.js"; +export { slackOutbound } from "../native-plugins/slack/src/outbound-adapter.js"; +export { telegramOutbound } from "../native-plugins/telegram/src/outbound-adapter.js"; +export { whatsappOutbound } from "../native-plugins/whatsapp/src/outbound-adapter.js"; diff --git a/test/fixtures/extension-relative-outside-package-inventory.json b/test/fixtures/native-plugin-relative-outside-package-inventory.json similarity index 100% rename from test/fixtures/extension-relative-outside-package-inventory.json rename to test/fixtures/native-plugin-relative-outside-package-inventory.json diff --git a/test/fixtures/plugin-extension-import-boundary-inventory.json b/test/fixtures/plugin-native-plugin-import-boundary-inventory.json similarity index 100% rename from test/fixtures/plugin-extension-import-boundary-inventory.json rename to test/fixtures/plugin-native-plugin-import-boundary-inventory.json diff --git a/test/fixtures/test-parallel.behavior.json b/test/fixtures/test-parallel.behavior.json index 2de992a45d5..809a3dc866a 100644 --- a/test/fixtures/test-parallel.behavior.json +++ b/test/fixtures/test-parallel.behavior.json @@ -18,7 +18,7 @@ "reason": "Rebuilds bundled config baselines through many channel schema subprocesses; keep out of the shared lane." }, { - "file": "extensions/imessage/src/monitor.shutdown.unhandled-rejection.test.ts", + "file": "native-plugins/imessage/src/monitor.shutdown.unhandled-rejection.test.ts", "reason": "Touches process-level unhandledRejection listeners." } ], diff --git a/test/fixtures/test-timings.unit.json b/test/fixtures/test-timings.unit.json index cdb2505d881..7a8377d561a 100644 --- a/test/fixtures/test-timings.unit.json +++ b/test/fixtures/test-timings.unit.json @@ -51,11 +51,11 @@ "durationMs": 3700, "testCount": 110 }, - "extensions/telegram/src/bot.create-telegram-bot.test.ts": { + "native-plugins/telegram/src/bot.create-telegram-bot.test.ts": { "durationMs": 3600, "testCount": 80 }, - "extensions/telegram/src/bot.test.ts": { + "native-plugins/telegram/src/bot.test.ts": { "durationMs": 3400, "testCount": 95 }, @@ -95,7 +95,7 @@ "durationMs": 2500, "testCount": 50 }, - "extensions/slack/src/monitor/slash.test.ts": { + "native-plugins/slack/src/monitor/slash.test.ts": { "durationMs": 2400, "testCount": 55 }, @@ -163,11 +163,11 @@ "durationMs": 1520, "testCount": 16 }, - "extensions/whatsapp/src/media.test.ts": { + "native-plugins/whatsapp/src/media.test.ts": { "durationMs": 1510, "testCount": 16 }, - "extensions/whatsapp/src/auto-reply.web-auto-reply.falls-back-text-media-send-fails.test.ts": { + "native-plugins/whatsapp/src/auto-reply.web-auto-reply.falls-back-text-media-send-fails.test.ts": { "durationMs": 1500, "testCount": 10 }, @@ -187,7 +187,7 @@ "durationMs": 1460, "testCount": 15 }, - "extensions/acpx/src/runtime.test.ts": { + "native-plugins/acpx/src/runtime.test.ts": { "durationMs": 1450, "testCount": 12 }, @@ -219,7 +219,7 @@ "durationMs": 1380, "testCount": 10 }, - "extensions/whatsapp/src/auto-reply.web-auto-reply.compresses-common-formats-jpeg-cap.test.ts": { + "native-plugins/whatsapp/src/auto-reply.web-auto-reply.compresses-common-formats-jpeg-cap.test.ts": { "durationMs": 1370, "testCount": 10 } diff --git a/test/helpers/extensions/chunk-test-helpers.ts b/test/helpers/native-plugins/chunk-test-helpers.ts similarity index 100% rename from test/helpers/extensions/chunk-test-helpers.ts rename to test/helpers/native-plugins/chunk-test-helpers.ts diff --git a/test/helpers/extensions/directory.ts b/test/helpers/native-plugins/directory.ts similarity index 100% rename from test/helpers/extensions/directory.ts rename to test/helpers/native-plugins/directory.ts diff --git a/test/helpers/extensions/discord-provider.test-support.ts b/test/helpers/native-plugins/discord-provider.test-support.ts similarity index 92% rename from test/helpers/extensions/discord-provider.test-support.ts rename to test/helpers/native-plugins/discord-provider.test-support.ts index 3c66b4d6743..0a4067e02dd 100644 --- a/test/helpers/extensions/discord-provider.test-support.ts +++ b/test/helpers/native-plugins/discord-provider.test-support.ts @@ -379,23 +379,23 @@ vi.mock("openclaw/plugin-sdk/infra-runtime", async () => { }; }); -vi.mock("../../../extensions/discord/src/accounts.js", () => ({ +vi.mock("../../../native-plugins/discord/src/accounts.js", () => ({ resolveDiscordAccount: resolveDiscordAccountMock, })); -vi.mock("../../../extensions/discord/src/probe.js", () => ({ +vi.mock("../../../native-plugins/discord/src/probe.js", () => ({ fetchDiscordApplicationId: async () => "app-1", })); -vi.mock("../../../extensions/discord/src/token.js", () => ({ +vi.mock("../../../native-plugins/discord/src/token.js", () => ({ normalizeDiscordToken: (value?: string) => value, })); -vi.mock("../../../extensions/discord/src/voice/command.js", () => ({ +vi.mock("../../../native-plugins/discord/src/voice/command.js", () => ({ createDiscordVoiceCommand: () => ({ name: "voice-command" }), })); -vi.mock("../../../extensions/discord/src/monitor/agent-components.js", () => ({ +vi.mock("../../../native-plugins/discord/src/monitor/agent-components.js", () => ({ createAgentComponentButton: () => ({ id: "btn" }), createAgentSelectMenu: () => ({ id: "menu" }), createDiscordComponentButton: () => ({ id: "btn2" }), @@ -407,15 +407,15 @@ vi.mock("../../../extensions/discord/src/monitor/agent-components.js", () => ({ createDiscordComponentUserSelect: () => ({ id: "user" }), })); -vi.mock("../../../extensions/discord/src/monitor/auto-presence.js", () => ({ +vi.mock("../../../native-plugins/discord/src/monitor/auto-presence.js", () => ({ createDiscordAutoPresenceController: createDiscordAutoPresenceControllerMock, })); -vi.mock("../../../extensions/discord/src/monitor/commands.js", () => ({ +vi.mock("../../../native-plugins/discord/src/monitor/commands.js", () => ({ resolveDiscordSlashCommandConfig: () => ({ ephemeral: false }), })); -vi.mock("../../../extensions/discord/src/monitor/exec-approvals.js", () => ({ +vi.mock("../../../native-plugins/discord/src/monitor/exec-approvals.js", () => ({ createExecApprovalButton: () => ({ id: "exec-approval" }), DiscordExecApprovalHandler: class DiscordExecApprovalHandler { async start() { @@ -427,11 +427,11 @@ vi.mock("../../../extensions/discord/src/monitor/exec-approvals.js", () => ({ }, })); -vi.mock("../../../extensions/discord/src/monitor/gateway-plugin.js", () => ({ +vi.mock("../../../native-plugins/discord/src/monitor/gateway-plugin.js", () => ({ createDiscordGatewayPlugin: () => ({ id: "gateway-plugin" }), })); -vi.mock("../../../extensions/discord/src/monitor/listeners.js", () => ({ +vi.mock("../../../native-plugins/discord/src/monitor/listeners.js", () => ({ DiscordMessageListener: class DiscordMessageListener {}, DiscordPresenceListener: class DiscordPresenceListener {}, DiscordReactionListener: class DiscordReactionListener {}, @@ -440,36 +440,36 @@ vi.mock("../../../extensions/discord/src/monitor/listeners.js", () => ({ registerDiscordListener: vi.fn(), })); -vi.mock("../../../extensions/discord/src/monitor/message-handler.js", () => ({ +vi.mock("../../../native-plugins/discord/src/monitor/message-handler.js", () => ({ createDiscordMessageHandler: createDiscordMessageHandlerMock, })); -vi.mock("../../../extensions/discord/src/monitor/native-command.js", () => ({ +vi.mock("../../../native-plugins/discord/src/monitor/native-command.js", () => ({ createDiscordCommandArgFallbackButton: () => ({ id: "arg-fallback" }), createDiscordModelPickerFallbackButton: () => ({ id: "model-fallback-btn" }), createDiscordModelPickerFallbackSelect: () => ({ id: "model-fallback-select" }), createDiscordNativeCommand: createDiscordNativeCommandMock, })); -vi.mock("../../../extensions/discord/src/monitor/presence.js", () => ({ +vi.mock("../../../native-plugins/discord/src/monitor/presence.js", () => ({ resolveDiscordPresenceUpdate: () => undefined, })); -vi.mock("../../../extensions/discord/src/monitor/provider.allowlist.js", () => ({ +vi.mock("../../../native-plugins/discord/src/monitor/provider.allowlist.js", () => ({ resolveDiscordAllowlistConfig: resolveDiscordAllowlistConfigMock, })); -vi.mock("../../../extensions/discord/src/monitor/provider.lifecycle.js", () => ({ +vi.mock("../../../native-plugins/discord/src/monitor/provider.lifecycle.js", () => ({ runDiscordGatewayLifecycle: monitorLifecycleMock, })); -vi.mock("../../../extensions/discord/src/monitor/rest-fetch.js", () => ({ +vi.mock("../../../native-plugins/discord/src/monitor/rest-fetch.js", () => ({ resolveDiscordRestFetch: () => async () => { throw new Error("offline"); }, })); -vi.mock("../../../extensions/discord/src/monitor/thread-bindings.js", () => ({ +vi.mock("../../../native-plugins/discord/src/monitor/thread-bindings.js", () => ({ createNoopThreadBindingManager: createNoopThreadBindingManagerMock, createThreadBindingManager: createThreadBindingManagerMock, reconcileAcpThreadBindingsOnStartup: reconcileAcpThreadBindingsOnStartupMock, diff --git a/test/helpers/extensions/env.ts b/test/helpers/native-plugins/env.ts similarity index 100% rename from test/helpers/extensions/env.ts rename to test/helpers/native-plugins/env.ts diff --git a/test/helpers/extensions/fetch-mock.ts b/test/helpers/native-plugins/fetch-mock.ts similarity index 100% rename from test/helpers/extensions/fetch-mock.ts rename to test/helpers/native-plugins/fetch-mock.ts diff --git a/test/helpers/extensions/frozen-time.ts b/test/helpers/native-plugins/frozen-time.ts similarity index 100% rename from test/helpers/extensions/frozen-time.ts rename to test/helpers/native-plugins/frozen-time.ts diff --git a/test/helpers/extensions/matrix-monitor-route.ts b/test/helpers/native-plugins/matrix-monitor-route.ts similarity index 100% rename from test/helpers/extensions/matrix-monitor-route.ts rename to test/helpers/native-plugins/matrix-monitor-route.ts diff --git a/test/helpers/extensions/matrix-route-test.ts b/test/helpers/native-plugins/matrix-route-test.ts similarity index 100% rename from test/helpers/extensions/matrix-route-test.ts rename to test/helpers/native-plugins/matrix-route-test.ts diff --git a/test/helpers/extensions/mock-http-response.ts b/test/helpers/native-plugins/mock-http-response.ts similarity index 100% rename from test/helpers/extensions/mock-http-response.ts rename to test/helpers/native-plugins/mock-http-response.ts diff --git a/test/helpers/extensions/plugin-api.ts b/test/helpers/native-plugins/plugin-api.ts similarity index 100% rename from test/helpers/extensions/plugin-api.ts rename to test/helpers/native-plugins/plugin-api.ts diff --git a/test/helpers/extensions/plugin-command.ts b/test/helpers/native-plugins/plugin-command.ts similarity index 100% rename from test/helpers/extensions/plugin-command.ts rename to test/helpers/native-plugins/plugin-command.ts diff --git a/test/helpers/extensions/plugin-registration.ts b/test/helpers/native-plugins/plugin-registration.ts similarity index 100% rename from test/helpers/extensions/plugin-registration.ts rename to test/helpers/native-plugins/plugin-registration.ts diff --git a/test/helpers/extensions/plugin-routing.ts b/test/helpers/native-plugins/plugin-routing.ts similarity index 100% rename from test/helpers/extensions/plugin-routing.ts rename to test/helpers/native-plugins/plugin-routing.ts diff --git a/test/helpers/extensions/plugin-runtime-mock.ts b/test/helpers/native-plugins/plugin-runtime-mock.ts similarity index 100% rename from test/helpers/extensions/plugin-runtime-mock.ts rename to test/helpers/native-plugins/plugin-runtime-mock.ts diff --git a/test/helpers/extensions/provider-usage-fetch.ts b/test/helpers/native-plugins/provider-usage-fetch.ts similarity index 100% rename from test/helpers/extensions/provider-usage-fetch.ts rename to test/helpers/native-plugins/provider-usage-fetch.ts diff --git a/test/helpers/extensions/runtime-env.ts b/test/helpers/native-plugins/runtime-env.ts similarity index 100% rename from test/helpers/extensions/runtime-env.ts rename to test/helpers/native-plugins/runtime-env.ts diff --git a/test/helpers/extensions/send-config.ts b/test/helpers/native-plugins/send-config.ts similarity index 100% rename from test/helpers/extensions/send-config.ts rename to test/helpers/native-plugins/send-config.ts diff --git a/test/helpers/extensions/setup-wizard.ts b/test/helpers/native-plugins/setup-wizard.ts similarity index 100% rename from test/helpers/extensions/setup-wizard.ts rename to test/helpers/native-plugins/setup-wizard.ts diff --git a/test/helpers/extensions/start-account-context.ts b/test/helpers/native-plugins/start-account-context.ts similarity index 100% rename from test/helpers/extensions/start-account-context.ts rename to test/helpers/native-plugins/start-account-context.ts diff --git a/test/helpers/extensions/start-account-lifecycle.ts b/test/helpers/native-plugins/start-account-lifecycle.ts similarity index 100% rename from test/helpers/extensions/start-account-lifecycle.ts rename to test/helpers/native-plugins/start-account-lifecycle.ts diff --git a/test/helpers/extensions/status-issues.ts b/test/helpers/native-plugins/status-issues.ts similarity index 100% rename from test/helpers/extensions/status-issues.ts rename to test/helpers/native-plugins/status-issues.ts diff --git a/test/helpers/extensions/subagent-hooks.ts b/test/helpers/native-plugins/subagent-hooks.ts similarity index 100% rename from test/helpers/extensions/subagent-hooks.ts rename to test/helpers/native-plugins/subagent-hooks.ts diff --git a/test/helpers/extensions/telegram-plugin-command.ts b/test/helpers/native-plugins/telegram-plugin-command.ts similarity index 100% rename from test/helpers/extensions/telegram-plugin-command.ts rename to test/helpers/native-plugins/telegram-plugin-command.ts diff --git a/test/helpers/extensions/temp-dir.ts b/test/helpers/native-plugins/temp-dir.ts similarity index 100% rename from test/helpers/extensions/temp-dir.ts rename to test/helpers/native-plugins/temp-dir.ts diff --git a/test/helpers/extensions/typed-cases.ts b/test/helpers/native-plugins/typed-cases.ts similarity index 100% rename from test/helpers/extensions/typed-cases.ts rename to test/helpers/native-plugins/typed-cases.ts diff --git a/test/extension-plugin-sdk-boundary.test.ts b/test/native-plugin-sdk-boundary.test.ts similarity index 68% rename from test/extension-plugin-sdk-boundary.test.ts rename to test/native-plugin-sdk-boundary.test.ts index 5a7325077c7..c6aab093a58 100644 --- a/test/extension-plugin-sdk-boundary.test.ts +++ b/test/native-plugin-sdk-boundary.test.ts @@ -2,27 +2,27 @@ import { execFileSync } from "node:child_process"; import fs from "node:fs"; import path from "node:path"; import { describe, expect, it } from "vitest"; -import { collectExtensionPluginSdkBoundaryInventory } from "../scripts/check-extension-plugin-sdk-boundary.mjs"; +import { collectNativePluginPluginSdkBoundaryInventory } from "../scripts/check-native-plugin-plugin-sdk-boundary.mjs"; const repoRoot = process.cwd(); -const scriptPath = path.join(repoRoot, "scripts", "check-extension-plugin-sdk-boundary.mjs"); +const scriptPath = path.join(repoRoot, "scripts", "check-native-plugin-plugin-sdk-boundary.mjs"); const relativeOutsidePackageBaselinePath = path.join( repoRoot, "test", "fixtures", - "extension-relative-outside-package-inventory.json", + "native-plugin-relative-outside-package-inventory.json", ); -describe("extension src outside plugin-sdk boundary inventory", () => { +describe("native plugin src outside plugin-sdk boundary inventory", () => { it("is currently empty", async () => { - const inventory = await collectExtensionPluginSdkBoundaryInventory("src-outside-plugin-sdk"); + const inventory = await collectNativePluginPluginSdkBoundaryInventory("src-outside-plugin-sdk"); expect(inventory).toEqual([]); }); it("produces stable sorted output", async () => { - const first = await collectExtensionPluginSdkBoundaryInventory("src-outside-plugin-sdk"); - const second = await collectExtensionPluginSdkBoundaryInventory("src-outside-plugin-sdk"); + const first = await collectNativePluginPluginSdkBoundaryInventory("src-outside-plugin-sdk"); + const second = await collectNativePluginPluginSdkBoundaryInventory("src-outside-plugin-sdk"); expect(second).toEqual(first); expect( @@ -52,9 +52,9 @@ describe("extension src outside plugin-sdk boundary inventory", () => { }); }); -describe("extension plugin-sdk-internal boundary inventory", () => { +describe("native plugin plugin-sdk-internal boundary inventory", () => { it("is currently empty", async () => { - const inventory = await collectExtensionPluginSdkBoundaryInventory("plugin-sdk-internal"); + const inventory = await collectNativePluginPluginSdkBoundaryInventory("plugin-sdk-internal"); expect(inventory).toEqual([]); }); @@ -73,9 +73,11 @@ describe("extension plugin-sdk-internal boundary inventory", () => { }); }); -describe("extension relative-outside-package boundary inventory", () => { +describe("native plugin relative-outside-package boundary inventory", () => { it("matches the checked-in baseline", async () => { - const inventory = await collectExtensionPluginSdkBoundaryInventory("relative-outside-package"); + const inventory = await collectNativePluginPluginSdkBoundaryInventory( + "relative-outside-package", + ); const expected = JSON.parse(fs.readFileSync(relativeOutsidePackageBaselinePath, "utf8")); expect(inventory).toEqual(expected); diff --git a/test/openshell-sandbox.e2e.test.ts b/test/openshell-sandbox.e2e.test.ts index 21824db38ee..8f1f8370a1e 100644 --- a/test/openshell-sandbox.e2e.test.ts +++ b/test/openshell-sandbox.e2e.test.ts @@ -4,8 +4,8 @@ import net from "node:net"; import os from "node:os"; import path from "node:path"; import { describe, expect, it } from "vitest"; -import { createOpenShellSandboxBackendFactory } from "../extensions/openshell/src/backend.js"; -import { resolveOpenShellPluginConfig } from "../extensions/openshell/src/config.js"; +import { createOpenShellSandboxBackendFactory } from "../native-plugins/openshell/src/backend.js"; +import { resolveOpenShellPluginConfig } from "../native-plugins/openshell/src/config.js"; import { createSandboxTestContext } from "../src/agents/sandbox/test-fixtures.js"; const OPENCLAW_OPENSHELL_E2E = process.env.OPENCLAW_E2E_OPENSHELL === "1"; diff --git a/test/plugin-extension-import-boundary.test.ts b/test/plugin-native-plugin-import-boundary.test.ts similarity index 74% rename from test/plugin-extension-import-boundary.test.ts rename to test/plugin-native-plugin-import-boundary.test.ts index 254b3613797..3dd1ecede5d 100644 --- a/test/plugin-extension-import-boundary.test.ts +++ b/test/plugin-native-plugin-import-boundary.test.ts @@ -3,26 +3,26 @@ import { readFileSync } from "node:fs"; import path from "node:path"; import { describe, expect, it } from "vitest"; import { - collectPluginExtensionImportBoundaryInventory, + collectPluginNativePluginImportBoundaryInventory, diffInventory, -} from "../scripts/check-plugin-extension-import-boundary.mjs"; +} from "../scripts/check-plugin-native-plugin-import-boundary.mjs"; const repoRoot = process.cwd(); -const scriptPath = path.join(repoRoot, "scripts", "check-plugin-extension-import-boundary.mjs"); +const scriptPath = path.join(repoRoot, "scripts", "check-plugin-native-plugin-import-boundary.mjs"); const baselinePath = path.join( repoRoot, "test", "fixtures", - "plugin-extension-import-boundary-inventory.json", + "plugin-native-plugin-import-boundary-inventory.json", ); function readBaseline() { return JSON.parse(readFileSync(baselinePath, "utf8")); } -describe("plugin extension import boundary inventory", () => { +describe("plugin native-plugin import boundary inventory", () => { it("keeps web-search-providers out of the remaining inventory", async () => { - const inventory = await collectPluginExtensionImportBoundaryInventory(); + const inventory = await collectPluginNativePluginImportBoundaryInventory(); expect(inventory.some((entry) => entry.file === "src/plugins/web-search-providers.ts")).toBe( false, @@ -30,7 +30,7 @@ describe("plugin extension import boundary inventory", () => { }); it("ignores plugin-sdk boundary shims by scope", async () => { - const inventory = await collectPluginExtensionImportBoundaryInventory(); + const inventory = await collectPluginNativePluginImportBoundaryInventory(); expect(inventory.some((entry) => entry.file.startsWith("src/plugin-sdk/"))).toBe(false); expect(inventory.some((entry) => entry.file.startsWith("src/plugin-sdk-internal/"))).toBe( @@ -39,8 +39,8 @@ describe("plugin extension import boundary inventory", () => { }); it("produces stable sorted output", async () => { - const first = await collectPluginExtensionImportBoundaryInventory(); - const second = await collectPluginExtensionImportBoundaryInventory(); + const first = await collectPluginNativePluginImportBoundaryInventory(); + const second = await collectPluginNativePluginImportBoundaryInventory(); expect(second).toEqual(first); expect( @@ -57,7 +57,7 @@ describe("plugin extension import boundary inventory", () => { it("matches the checked-in baseline", async () => { const expected = readBaseline(); - const actual = await collectPluginExtensionImportBoundaryInventory(); + const actual = await collectPluginNativePluginImportBoundaryInventory(); expect(diffInventory(expected, actual)).toEqual({ missing: [], unexpected: [] }); }); diff --git a/test/plugin-npm-release.test.ts b/test/plugin-npm-release.test.ts index 383d97b9ab9..a9010a1d8ab 100644 --- a/test/plugin-npm-release.test.ts +++ b/test/plugin-npm-release.test.ts @@ -75,7 +75,7 @@ describe("collectPublishablePluginPackageErrors", () => { expect( collectPublishablePluginPackageErrors({ extensionId: "zalo", - packageDir: "extensions/zalo", + packageDir: "native-plugins/zalo", packageJson: { name: "@openclaw/zalo", version: "2026.3.15", @@ -94,7 +94,7 @@ describe("collectPublishablePluginPackageErrors", () => { expect( collectPublishablePluginPackageErrors({ extensionId: "broken", - packageDir: "extensions/broken", + packageDir: "native-plugins/broken", packageJson: { name: "broken", version: "latest", @@ -111,7 +111,7 @@ describe("collectPublishablePluginPackageErrors", () => { 'package name must start with "@openclaw/"; found "broken".', "package.json private must not be true.", 'package.json version must match YYYY.M.D or YYYY.M.D-beta.N; found "latest".', - "openclaw.extensions must contain only non-empty strings.", + "openclaw.plugins must contain only non-empty strings.", ]); }); }); @@ -120,7 +120,7 @@ describe("resolveSelectedPublishablePluginPackages", () => { const publishablePlugins: PublishablePluginPackage[] = [ { extensionId: "feishu", - packageDir: "extensions/feishu", + packageDir: "native-plugins/feishu", packageName: "@openclaw/feishu", version: "2026.3.15", channel: "stable", @@ -128,7 +128,7 @@ describe("resolveSelectedPublishablePluginPackages", () => { }, { extensionId: "zalo", - packageDir: "extensions/zalo", + packageDir: "native-plugins/zalo", packageName: "@openclaw/zalo", version: "2026.3.15-beta.1", channel: "beta", @@ -168,9 +168,9 @@ describe("collectChangedExtensionIdsFromPaths", () => { it("extracts unique extension ids from changed extension paths", () => { expect( collectChangedExtensionIdsFromPaths([ - "extensions/zalo/index.ts", - "extensions/zalo/package.json", - "extensions/feishu/src/client.ts", + "native-plugins/zalo/index.ts", + "native-plugins/zalo/package.json", + "native-plugins/feishu/src/client.ts", "docs/reference/RELEASING.md", ]), ).toEqual(["feishu", "zalo"]); @@ -181,7 +181,7 @@ describe("resolveChangedPublishablePluginPackages", () => { const publishablePlugins: PublishablePluginPackage[] = [ { extensionId: "feishu", - packageDir: "extensions/feishu", + packageDir: "native-plugins/feishu", packageName: "@openclaw/feishu", version: "2026.3.15", channel: "stable", @@ -189,7 +189,7 @@ describe("resolveChangedPublishablePluginPackages", () => { }, { extensionId: "zalo", - packageDir: "extensions/zalo", + packageDir: "native-plugins/zalo", packageName: "@openclaw/zalo", version: "2026.3.15-beta.1", channel: "beta", diff --git a/test/release-check.test.ts b/test/release-check.test.ts index fb518d6afe7..dcdaa8a7bb3 100644 --- a/test/release-check.test.ts +++ b/test/release-check.test.ts @@ -50,7 +50,7 @@ describe("collectBundledExtensionManifestErrors", () => { }, ]), ).toEqual([ - "bundled extension 'broken' manifest invalid | openclaw.install.npmSpec must be a non-empty string", + "bundled native plugin 'broken' manifest invalid | openclaw.install.npmSpec must be a non-empty string", ]); }); }); @@ -60,11 +60,11 @@ describe("collectForbiddenPackPaths", () => { expect( collectForbiddenPackPaths([ "dist/index.js", - "dist/extensions/discord/node_modules/@buape/carbon/index.js", - "extensions/tlon/node_modules/.bin/tlon", + "dist/native-plugins/discord/node_modules/@buape/carbon/index.js", + "native-plugins/tlon/node_modules/.bin/tlon", "node_modules/.bin/openclaw", ]), - ).toEqual(["extensions/tlon/node_modules/.bin/tlon", "node_modules/.bin/openclaw"]); + ).toEqual(["native-plugins/tlon/node_modules/.bin/tlon", "node_modules/.bin/openclaw"]); }); }); @@ -79,7 +79,7 @@ describe("collectPackUnpackedSizeErrors", () => { expect( collectPackUnpackedSizeErrors([makePackResult("openclaw-2026.3.12.tgz", 224_002_564)]), ).toEqual([ - "openclaw-2026.3.12.tgz unpackedSize 224002564 bytes (213.6 MiB) exceeds budget 167772160 bytes (160.0 MiB). Investigate duplicate channel shims, copied extension trees, or other accidental pack bloat before release.", + "openclaw-2026.3.12.tgz unpackedSize 224002564 bytes (213.6 MiB) exceeds budget 167772160 bytes (160.0 MiB). Investigate duplicate channel shims, copied native plugin trees, or other accidental pack bloat before release.", ]); }); diff --git a/test/scripts/test-extension.test.ts b/test/scripts/test-extension.test.ts deleted file mode 100644 index 06ba5343844..00000000000 --- a/test/scripts/test-extension.test.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { execFileSync } from "node:child_process"; -import path from "node:path"; -import { describe, expect, it } from "vitest"; -import { - detectChangedExtensionIds, - listAvailableExtensionIds, - resolveExtensionTestPlan, -} from "../../scripts/test-extension.mjs"; - -const scriptPath = path.join(process.cwd(), "scripts", "test-extension.mjs"); - -function readPlan(args: string[], cwd = process.cwd()) { - const stdout = execFileSync(process.execPath, [scriptPath, ...args, "--dry-run", "--json"], { - cwd, - encoding: "utf8", - }); - return JSON.parse(stdout) as ReturnType; -} - -function runScript(args: string[], cwd = process.cwd()) { - return execFileSync(process.execPath, [scriptPath, ...args], { - cwd, - encoding: "utf8", - }); -} - -describe("scripts/test-extension.mjs", () => { - it("resolves channel-root extensions onto the channel vitest config", () => { - const plan = resolveExtensionTestPlan({ targetArg: "slack", cwd: process.cwd() }); - - expect(plan.extensionId).toBe("slack"); - expect(plan.extensionDir).toBe("extensions/slack"); - expect(plan.config).toBe("vitest.channels.config.ts"); - expect(plan.testFiles.some((file) => file.startsWith("extensions/slack/"))).toBe(true); - }); - - it("resolves provider extensions onto the extensions vitest config", () => { - const plan = resolveExtensionTestPlan({ targetArg: "firecrawl", cwd: process.cwd() }); - - expect(plan.extensionId).toBe("firecrawl"); - expect(plan.config).toBe("vitest.extensions.config.ts"); - expect(plan.testFiles.some((file) => file.startsWith("extensions/firecrawl/"))).toBe(true); - }); - - it("includes paired src roots when they contain tests", () => { - const plan = resolveExtensionTestPlan({ targetArg: "line", cwd: process.cwd() }); - - expect(plan.roots).toContain("extensions/line"); - expect(plan.roots).toContain("src/line"); - expect(plan.config).toBe("vitest.channels.config.ts"); - expect(plan.testFiles.some((file) => file.startsWith("src/line/"))).toBe(true); - }); - - it("infers the extension from the current working directory", () => { - const cwd = path.join(process.cwd(), "extensions", "slack"); - const plan = readPlan([], cwd); - - expect(plan.extensionId).toBe("slack"); - expect(plan.extensionDir).toBe("extensions/slack"); - }); - - it("maps changed paths back to extension ids", () => { - const extensionIds = detectChangedExtensionIds([ - "extensions/slack/src/channel.ts", - "src/line/message.test.ts", - "extensions/firecrawl/package.json", - "src/not-a-plugin/file.ts", - ]); - - expect(extensionIds).toEqual(["firecrawl", "line", "slack"]); - }); - - it("lists available extension ids", () => { - const extensionIds = listAvailableExtensionIds(); - - expect(extensionIds).toContain("slack"); - expect(extensionIds).toContain("firecrawl"); - expect(extensionIds).toEqual( - [...extensionIds].toSorted((left, right) => left.localeCompare(right)), - ); - }); - - it("dry-run still reports a plan for extensions without tests", () => { - const plan = readPlan(["copilot-proxy"]); - - expect(plan.extensionId).toBe("copilot-proxy"); - expect(plan.testFiles).toEqual([]); - }); - - it("treats extensions without tests as a no-op by default", () => { - const stdout = runScript(["copilot-proxy"]); - - expect(stdout).toContain("No tests found for extensions/copilot-proxy."); - expect(stdout).toContain("Skipping."); - }); -}); diff --git a/test/scripts/test-native-plugin.test.ts b/test/scripts/test-native-plugin.test.ts new file mode 100644 index 00000000000..6e89921e395 --- /dev/null +++ b/test/scripts/test-native-plugin.test.ts @@ -0,0 +1,96 @@ +import { execFileSync } from "node:child_process"; +import path from "node:path"; +import { describe, expect, it } from "vitest"; +import { + detectChangedNativePluginIds, + listAvailableNativePluginIds, + resolveNativePluginTestPlan, +} from "../../scripts/test-native-plugin.mjs"; + +const scriptPath = path.join(process.cwd(), "scripts", "test-native-plugin.mjs"); + +function readPlan(args: string[], cwd = process.cwd()) { + const stdout = execFileSync(process.execPath, [scriptPath, ...args, "--dry-run", "--json"], { + cwd, + encoding: "utf8", + }); + return JSON.parse(stdout) as ReturnType; +} + +function runScript(args: string[], cwd = process.cwd()) { + return execFileSync(process.execPath, [scriptPath, ...args], { + cwd, + encoding: "utf8", + }); +} + +describe("scripts/test-native-plugin.mjs", () => { + it("resolves channel-root native plugins onto the channel vitest config", () => { + const plan = resolveNativePluginTestPlan({ targetArg: "slack", cwd: process.cwd() }); + + expect(plan.nativePluginId).toBe("slack"); + expect(plan.nativePluginDir).toBe("native-plugins/slack"); + expect(plan.config).toBe("vitest.channels.config.ts"); + expect(plan.testFiles.some((file) => file.startsWith("native-plugins/slack/"))).toBe(true); + }); + + it("resolves provider native plugins onto the native-plugin vitest config", () => { + const plan = resolveNativePluginTestPlan({ targetArg: "firecrawl", cwd: process.cwd() }); + + expect(plan.nativePluginId).toBe("firecrawl"); + expect(plan.config).toBe("vitest.native-plugins.config.ts"); + expect(plan.testFiles.some((file) => file.startsWith("native-plugins/firecrawl/"))).toBe(true); + }); + + it("includes paired src roots when they contain tests", () => { + const plan = resolveNativePluginTestPlan({ targetArg: "line", cwd: process.cwd() }); + + expect(plan.roots).toContain("native-plugins/line"); + expect(plan.roots).toContain("src/line"); + expect(plan.config).toBe("vitest.channels.config.ts"); + expect(plan.testFiles.some((file) => file.startsWith("src/line/"))).toBe(true); + }); + + it("infers the native plugin from the current working directory", () => { + const cwd = path.join(process.cwd(), "native-plugins", "slack"); + const plan = readPlan([], cwd); + + expect(plan.nativePluginId).toBe("slack"); + expect(plan.nativePluginDir).toBe("native-plugins/slack"); + }); + + it("maps changed paths back to native plugin ids", () => { + const nativePluginIds = detectChangedNativePluginIds([ + "native-plugins/slack/src/channel.ts", + "src/line/message.test.ts", + "native-plugins/firecrawl/package.json", + "src/not-a-plugin/file.ts", + ]); + + expect(nativePluginIds).toEqual(["firecrawl", "line", "slack"]); + }); + + it("lists available native plugin ids", () => { + const nativePluginIds = listAvailableNativePluginIds(); + + expect(nativePluginIds).toContain("slack"); + expect(nativePluginIds).toContain("firecrawl"); + expect(nativePluginIds).toEqual( + [...nativePluginIds].toSorted((left, right) => left.localeCompare(right)), + ); + }); + + it("dry-run still reports a plan for native plugins without tests", () => { + const plan = readPlan(["copilot-proxy"]); + + expect(plan.nativePluginId).toBe("copilot-proxy"); + expect(plan.testFiles).toEqual([]); + }); + + it("treats native plugins without tests as a no-op by default", () => { + const stdout = runScript(["copilot-proxy"]); + + expect(stdout).toContain("No tests found for native-plugins/copilot-proxy."); + expect(stdout).toContain("Skipping."); + }); +}); diff --git a/test/vitest-unit-paths.test.ts b/test/vitest-unit-paths.test.ts index e8cbe961990..7b0d9874ca0 100644 --- a/test/vitest-unit-paths.test.ts +++ b/test/vitest-unit-paths.test.ts @@ -10,7 +10,9 @@ describe("isUnitConfigTestFile", () => { it("rejects files excluded from the unit config", () => { expect( - isUnitConfigTestFile("extensions/imessage/src/monitor.shutdown.unhandled-rejection.test.ts"), + isUnitConfigTestFile( + "native-plugins/imessage/src/monitor.shutdown.unhandled-rejection.test.ts", + ), ).toBe(false); expect(isUnitConfigTestFile("src/agents/pi-embedded-runner.test.ts")).toBe(false); expect(isUnitConfigTestFile("src/commands/onboard.test.ts")).toBe(false); diff --git a/test/web-search-provider-boundary.test.ts b/test/web-search-provider-boundary.test.ts index f211a262ca3..c462d56c74e 100644 --- a/test/web-search-provider-boundary.test.ts +++ b/test/web-search-provider-boundary.test.ts @@ -16,7 +16,7 @@ describe("web search provider boundary inventory", () => { it("ignores extension-owned registrations", async () => { const inventory = await collectWebSearchProviderBoundaryInventory(); - expect(inventory.some((entry) => entry.file.startsWith("extensions/"))).toBe(false); + expect(inventory.some((entry) => entry.file.startsWith("native-plugins/"))).toBe(false); }); it("produces stable sorted output", async () => { diff --git a/tsconfig.json b/tsconfig.json index bc6439e921f..0e07c7f8004 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -23,6 +23,6 @@ "openclaw/plugin-sdk/account-id": ["./src/plugin-sdk/account-id.ts"] } }, - "include": ["src/**/*", "ui/**/*", "extensions/**/*"], + "include": ["src/**/*", "ui/**/*", "native-plugins/**/*"], "exclude": ["node_modules", "dist"] } diff --git a/tsdown.config.ts b/tsdown.config.ts index 746c6e883bc..49d88988f4f 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -81,10 +81,10 @@ function nodeBuildConfig(config: UserConfig): UserConfig { } function listBundledPluginBuildEntries(): Record { - const extensionsRoot = path.join(process.cwd(), "extensions"); + const nativePluginsRoot = path.join(process.cwd(), "native-plugins"); const entries: Record = {}; - for (const dirent of fs.readdirSync(extensionsRoot, { withFileTypes: true })) { + for (const dirent of fs.readdirSync(nativePluginsRoot, { withFileTypes: true })) { if (!dirent.isDirectory()) { continue; } @@ -92,7 +92,7 @@ function listBundledPluginBuildEntries(): Record { continue; } - const pluginDir = path.join(extensionsRoot, dirent.name); + const pluginDir = path.join(nativePluginsRoot, dirent.name); const manifestPath = path.join(pluginDir, "openclaw.plugin.json"); if (!fs.existsSync(manifestPath)) { continue; @@ -103,10 +103,13 @@ function listBundledPluginBuildEntries(): Record { if (fs.existsSync(packageJsonPath)) { try { const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8")) as { - openclaw?: { extensions?: unknown; setupEntry?: unknown }; + openclaw?: { plugins?: unknown; extensions?: unknown; setupEntry?: unknown }; }; - packageEntries = Array.isArray(packageJson.openclaw?.extensions) - ? packageJson.openclaw.extensions.filter( + const rawEntries = Array.isArray(packageJson.openclaw?.plugins) + ? packageJson.openclaw.plugins + : packageJson.openclaw?.extensions; + packageEntries = Array.isArray(rawEntries) + ? rawEntries.filter( (entry): entry is string => typeof entry === "string" && entry.trim().length > 0, ) : []; @@ -126,8 +129,8 @@ function listBundledPluginBuildEntries(): Record { const sourceEntries = packageEntries.length > 0 ? packageEntries : ["./index.ts"]; for (const entry of sourceEntries) { const normalizedEntry = entry.replace(/^\.\//, ""); - const entryKey = `extensions/${dirent.name}/${normalizedEntry.replace(/\.[^.]+$/u, "")}`; - entries[entryKey] = path.join("extensions", dirent.name, normalizedEntry); + const entryKey = `native-plugins/${dirent.name}/${normalizedEntry.replace(/\.[^.]+$/u, "")}`; + entries[entryKey] = path.join("native-plugins", dirent.name, normalizedEntry); } } @@ -170,8 +173,8 @@ function buildCoreDistEntries(): Record { // Ensure this module is bundled as an entry so legacy CLI shims can resolve its exports. "cli/daemon-cli": "src/cli/daemon-cli.ts", "infra/warning-filter": "src/infra/warning-filter.ts", - "telegram/audit": "extensions/telegram/src/audit.ts", - "telegram/token": "extensions/telegram/src/token.ts", + "telegram/audit": "native-plugins/telegram/src/audit.ts", + "telegram/token": "native-plugins/telegram/src/token.ts", "line/accounts": "src/line/accounts.ts", "line/send": "src/line/send.ts", "line/template-messages": "src/line/template-messages.ts", diff --git a/vitest.channel-paths.mjs b/vitest.channel-paths.mjs index 06b0e9ea733..0a35fc28b7d 100644 --- a/vitest.channel-paths.mjs +++ b/vitest.channel-paths.mjs @@ -1,10 +1,10 @@ export const channelTestRoots = [ - "extensions/telegram", - "extensions/discord", - "extensions/whatsapp", - "extensions/slack", - "extensions/signal", - "extensions/imessage", + "native-plugins/telegram", + "native-plugins/discord", + "native-plugins/whatsapp", + "native-plugins/slack", + "native-plugins/signal", + "native-plugins/imessage", "src/browser", "src/line", ]; diff --git a/vitest.config.ts b/vitest.config.ts index f254bcdf0a7..8aa7145dc60 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -35,7 +35,7 @@ export default defineConfig({ maxWorkers: isCI ? ciWorkers : localWorkers, include: [ "src/**/*.test.ts", - "extensions/**/*.test.ts", + "native-plugins/**/*.test.ts", "test/**/*.test.ts", "ui/src/ui/app-chat.test.ts", "ui/src/ui/views/agents-utils.test.ts", @@ -75,7 +75,7 @@ export default defineConfig({ include: ["./src/**/*.ts"], exclude: [ // Never count workspace packages/apps toward core coverage thresholds. - "extensions/**", + "native-plugins/**", "apps/**", "ui/**", "test/**", diff --git a/vitest.e2e.config.ts b/vitest.e2e.config.ts index 67e7cada10e..79ec6e7dc96 100644 --- a/vitest.e2e.config.ts +++ b/vitest.e2e.config.ts @@ -26,7 +26,7 @@ export default defineConfig({ pool: "forks", maxWorkers: e2eWorkers, silent: !verboseE2E, - include: ["test/**/*.e2e.test.ts", "src/**/*.e2e.test.ts", "extensions/**/*.e2e.test.ts"], + include: ["test/**/*.e2e.test.ts", "src/**/*.e2e.test.ts", "native-plugins/**/*.e2e.test.ts"], exclude, }, }); diff --git a/vitest.extensions.config.ts b/vitest.extensions.config.ts index 72556e435a7..166e2591ff7 100644 --- a/vitest.extensions.config.ts +++ b/vitest.extensions.config.ts @@ -1,9 +1 @@ -import { channelTestExclude } from "./vitest.channel-paths.mjs"; -import { createScopedVitestConfig } from "./vitest.scoped-config.ts"; - -export default createScopedVitestConfig(["extensions/**/*.test.ts"], { - // Channel implementations live under extensions/ but are tested by - // vitest.channels.config.ts (pnpm test:channels) which provides - // the heavier mock scaffolding they need. - exclude: channelTestExclude.filter((pattern) => pattern.startsWith("extensions/")), -}); +export { default } from "./vitest.native-plugins.config"; diff --git a/vitest.native-plugins.config.ts b/vitest.native-plugins.config.ts new file mode 100644 index 00000000000..a22e64cb260 --- /dev/null +++ b/vitest.native-plugins.config.ts @@ -0,0 +1,9 @@ +import { channelTestExclude } from "./vitest.channel-paths.mjs"; +import { createScopedVitestConfig } from "./vitest.scoped-config.ts"; + +export default createScopedVitestConfig(["native-plugins/**/*.test.ts"], { + // Channel implementations live under native-plugins/ but are tested by + // vitest.channels.config.ts (pnpm test:channels) which provides + // the heavier mock scaffolding they need. + exclude: channelTestExclude.filter((pattern) => pattern.startsWith("native-plugins/")), +}); diff --git a/vitest.unit-paths.mjs b/vitest.unit-paths.mjs index c0becc4d048..c26a3383297 100644 --- a/vitest.unit-paths.mjs +++ b/vitest.unit-paths.mjs @@ -13,7 +13,7 @@ export const unitTestIncludePatterns = [ export const unitTestAdditionalExcludePatterns = [ "src/gateway/**", - "extensions/**", + "native-plugins/**", "src/browser/**", "src/line/**", "src/agents/**",