diff --git a/CHANGELOG.md b/CHANGELOG.md index e48279137..0ee31fe23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ Docs: https://docs.clawd.bot - Plugins: add exclusive plugin slots with a dedicated memory slot selector. - Memory: ship core memory tools + CLI as the bundled `memory-core` plugin. - Docs: document plugin slots and memory plugin behavior. +- Plugins: migrate bundled messaging extensions to the plugin SDK; resolve plugin-sdk imports in loader. ## 2026.1.17-5 diff --git a/extensions/.DS_Store b/extensions/.DS_Store new file mode 100644 index 000000000..397093360 Binary files /dev/null and b/extensions/.DS_Store differ diff --git a/extensions/matrix/.DS_Store b/extensions/matrix/.DS_Store new file mode 100644 index 000000000..4aa9e09bb Binary files /dev/null and b/extensions/matrix/.DS_Store differ diff --git a/extensions/matrix/index.ts b/extensions/matrix/index.ts index 91ab6c07c..eaee15222 100644 --- a/extensions/matrix/index.ts +++ b/extensions/matrix/index.ts @@ -1,12 +1,14 @@ -import type { ClawdbotPluginApi } from "../../src/plugins/types.js"; +import type { ClawdbotPluginApi } from "clawdbot/plugin-sdk"; import { matrixPlugin } from "./src/channel.js"; +import { setMatrixRuntime } from "./src/runtime.js"; const plugin = { id: "matrix", name: "Matrix", description: "Matrix channel plugin (matrix-js-sdk)", register(api: ClawdbotPluginApi) { + setMatrixRuntime(api.runtime); api.registerChannel({ plugin: matrixPlugin }); }, }; diff --git a/extensions/matrix/node_modules/.bin/.ignored_markdown-it b/extensions/matrix/node_modules/.bin/.ignored_markdown-it new file mode 100755 index 000000000..7d14f551c --- /dev/null +++ b/extensions/matrix/node_modules/.bin/.ignored_markdown-it @@ -0,0 +1,21 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*|*MINGW*|*MSYS*) + if command -v cygpath > /dev/null 2>&1; then + basedir=`cygpath -w "$basedir"` + fi + ;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/Users/steipete/Projects/clawdbot4/node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/bin/node_modules:/Users/steipete/Projects/clawdbot4/node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/node_modules:/Users/steipete/Projects/clawdbot4/node_modules/.pnpm/markdown-it@14.1.0/node_modules:/Users/steipete/Projects/clawdbot4/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/Users/steipete/Projects/clawdbot4/node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/bin/node_modules:/Users/steipete/Projects/clawdbot4/node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/node_modules:/Users/steipete/Projects/clawdbot4/node_modules/.pnpm/markdown-it@14.1.0/node_modules:/Users/steipete/Projects/clawdbot4/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../markdown-it/bin/markdown-it.mjs" "$@" +else + exec node "$basedir/../markdown-it/bin/markdown-it.mjs" "$@" +fi diff --git a/extensions/matrix/node_modules/.bin/markdown-it b/extensions/matrix/node_modules/.bin/markdown-it new file mode 120000 index 000000000..8a641084e --- /dev/null +++ b/extensions/matrix/node_modules/.bin/markdown-it @@ -0,0 +1 @@ +../markdown-it/bin/markdown-it.mjs \ No newline at end of file diff --git a/extensions/matrix/node_modules/markdown-it b/extensions/matrix/node_modules/markdown-it new file mode 120000 index 000000000..3a37cf385 --- /dev/null +++ b/extensions/matrix/node_modules/markdown-it @@ -0,0 +1 @@ +../../../node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it \ No newline at end of file diff --git a/extensions/matrix/node_modules/matrix-js-sdk b/extensions/matrix/node_modules/matrix-js-sdk new file mode 120000 index 000000000..310204460 --- /dev/null +++ b/extensions/matrix/node_modules/matrix-js-sdk @@ -0,0 +1 @@ +../../../node_modules/.pnpm/matrix-js-sdk@40.0.0/node_modules/matrix-js-sdk \ No newline at end of file diff --git a/extensions/matrix/src/actions.ts b/extensions/matrix/src/actions.ts index 03066f9cb..221a4f72b 100644 --- a/extensions/matrix/src/actions.ts +++ b/extensions/matrix/src/actions.ts @@ -1,13 +1,15 @@ -import { createActionGate, readNumberParam, readStringParam } from "../../../src/agents/tools/common.js"; +import { + createActionGate, + readNumberParam, + readStringParam, + type ChannelMessageActionAdapter, + type ChannelMessageActionContext, + type ChannelMessageActionName, + type ChannelToolSend, +} from "clawdbot/plugin-sdk"; import { resolveMatrixAccount } from "./matrix/accounts.js"; import { handleMatrixAction } from "./tool-actions.js"; import type { CoreConfig } from "./types.js"; -import type { - ChannelMessageActionAdapter, - ChannelMessageActionContext, - ChannelMessageActionName, - ChannelToolSend, -} from "../../../src/channels/plugins/types.js"; export const matrixMessageActions: ChannelMessageActionAdapter = { listActions: ({ cfg }) => { diff --git a/extensions/matrix/src/channel.ts b/extensions/matrix/src/channel.ts index 69285ff95..3d65152ee 100644 --- a/extensions/matrix/src/channel.ts +++ b/extensions/matrix/src/channel.ts @@ -1,13 +1,14 @@ -import type { ChannelPlugin } from "../../../src/channels/plugins/types.js"; import { + applyAccountNameToChannelSection, + buildChannelConfigSchema, + DEFAULT_ACCOUNT_ID, deleteAccountFromConfigSection, + formatPairingApproveHint, + normalizeAccountId, + PAIRING_APPROVED_MESSAGE, setAccountEnabledInConfigSection, -} from "../../../src/channels/plugins/config-helpers.js"; -import { buildChannelConfigSchema } from "../../../src/channels/plugins/config-schema.js"; -import { formatPairingApproveHint } from "../../../src/channels/plugins/helpers.js"; -import { PAIRING_APPROVED_MESSAGE } from "../../../src/channels/plugins/pairing-message.js"; -import { applyAccountNameToChannelSection } from "../../../src/channels/plugins/setup-helpers.js"; -import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../../../src/routing/session-key.js"; + type ChannelPlugin, +} from "clawdbot/plugin-sdk"; import { matrixMessageActions } from "./actions.js"; import { MatrixConfigSchema } from "./config-schema.js"; diff --git a/extensions/matrix/src/directory-live.ts b/extensions/matrix/src/directory-live.ts index c4784eecd..bb42e95a0 100644 --- a/extensions/matrix/src/directory-live.ts +++ b/extensions/matrix/src/directory-live.ts @@ -1,4 +1,4 @@ -import type { ChannelDirectoryEntry } from "../../../src/channels/plugins/types.js"; +import type { ChannelDirectoryEntry } from "clawdbot/plugin-sdk"; import { resolveMatrixAuth } from "./matrix/client.js"; diff --git a/extensions/matrix/src/group-mentions.ts b/extensions/matrix/src/group-mentions.ts index e2696d3c5..ee16b713c 100644 --- a/extensions/matrix/src/group-mentions.ts +++ b/extensions/matrix/src/group-mentions.ts @@ -1,4 +1,4 @@ -import type { ChannelGroupContext } from "../../../src/channels/plugins/types.js"; +import type { ChannelGroupContext } from "clawdbot/plugin-sdk"; import { resolveMatrixRoomConfig } from "./matrix/monitor/rooms.js"; import type { CoreConfig } from "./types.js"; diff --git a/extensions/matrix/src/matrix/accounts.ts b/extensions/matrix/src/matrix/accounts.ts index fa94aec6a..d451a58d7 100644 --- a/extensions/matrix/src/matrix/accounts.ts +++ b/extensions/matrix/src/matrix/accounts.ts @@ -1,4 +1,4 @@ -import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../../../../src/routing/session-key.js"; +import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "clawdbot/plugin-sdk"; import type { CoreConfig, MatrixConfig } from "../types.js"; import { resolveMatrixConfig } from "./client.js"; import { credentialsMatchConfig, loadMatrixCredentials } from "./credentials.js"; diff --git a/extensions/matrix/src/matrix/actions.ts b/extensions/matrix/src/matrix/actions.ts index 4b463b5b5..a9921e597 100644 --- a/extensions/matrix/src/matrix/actions.ts +++ b/extensions/matrix/src/matrix/actions.ts @@ -15,7 +15,7 @@ import type { RoomTopicEventContent, } from "matrix-js-sdk/lib/@types/state_events.js"; -import { loadConfig } from "../../../../src/config/config.js"; +import { loadConfig } from "clawdbot/plugin-sdk"; import type { CoreConfig } from "../types.js"; import { getActiveMatrixClient } from "./active-client.js"; import { diff --git a/extensions/matrix/src/matrix/client.ts b/extensions/matrix/src/matrix/client.ts index a2b4be35a..3ce7bb4ca 100644 --- a/extensions/matrix/src/matrix/client.ts +++ b/extensions/matrix/src/matrix/client.ts @@ -1,6 +1,6 @@ import { ClientEvent, type MatrixClient, SyncState } from "matrix-js-sdk"; -import { loadConfig } from "../../../../src/config/config.js"; +import { loadConfig } from "clawdbot/plugin-sdk"; import type { CoreConfig } from "../types.js"; export type MatrixResolvedConfig = { diff --git a/extensions/matrix/src/matrix/credentials.ts b/extensions/matrix/src/matrix/credentials.ts index 375fb6aa6..edf0d5657 100644 --- a/extensions/matrix/src/matrix/credentials.ts +++ b/extensions/matrix/src/matrix/credentials.ts @@ -2,7 +2,7 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; -import { resolveStateDir } from "../../../../src/config/paths.js"; +import { resolveStateDir } from "clawdbot/plugin-sdk"; export type MatrixStoredCredentials = { homeserver: string; diff --git a/extensions/matrix/src/matrix/deps.ts b/extensions/matrix/src/matrix/deps.ts index 86746fb8a..7b71123d0 100644 --- a/extensions/matrix/src/matrix/deps.ts +++ b/extensions/matrix/src/matrix/deps.ts @@ -3,8 +3,7 @@ import path from "node:path"; import { createRequire } from "node:module"; import { fileURLToPath } from "node:url"; -import { runCommandWithTimeout } from "../../../../src/process/exec.js"; -import type { RuntimeEnv } from "../../../../src/runtime.js"; +import { runCommandWithTimeout, type RuntimeEnv } from "clawdbot/plugin-sdk"; const MATRIX_SDK_PACKAGE = "matrix-js-sdk"; diff --git a/extensions/matrix/src/matrix/monitor/allowlist.ts b/extensions/matrix/src/matrix/monitor/allowlist.ts index 4b4138d4c..6fe45c03a 100644 --- a/extensions/matrix/src/matrix/monitor/allowlist.ts +++ b/extensions/matrix/src/matrix/monitor/allowlist.ts @@ -1,4 +1,4 @@ -import type { AllowlistMatch } from "../../../../../src/channels/plugins/allowlist-match.js"; +import type { AllowlistMatch } from "clawdbot/plugin-sdk"; function normalizeAllowList(list?: Array) { return (list ?? []).map((entry) => String(entry).trim()).filter(Boolean); diff --git a/extensions/matrix/src/matrix/monitor/auto-join.ts b/extensions/matrix/src/matrix/monitor/auto-join.ts index c7d24ed5f..ead678948 100644 --- a/extensions/matrix/src/matrix/monitor/auto-join.ts +++ b/extensions/matrix/src/matrix/monitor/auto-join.ts @@ -1,8 +1,7 @@ import type { MatrixClient, MatrixEvent, RoomMember } from "matrix-js-sdk"; import { RoomMemberEvent } from "matrix-js-sdk"; -import { danger, logVerbose } from "../../../../../src/globals.js"; -import type { RuntimeEnv } from "../../../../../src/runtime.js"; +import { danger, logVerbose, type RuntimeEnv } from "clawdbot/plugin-sdk"; import type { CoreConfig } from "../../types.js"; export function registerMatrixAutoJoin(params: { diff --git a/extensions/matrix/src/matrix/monitor/index.ts b/extensions/matrix/src/matrix/monitor/index.ts index 35034d78d..de2e3a592 100644 --- a/extensions/matrix/src/matrix/monitor/index.ts +++ b/extensions/matrix/src/matrix/monitor/index.ts @@ -2,36 +2,38 @@ import type { MatrixEvent, Room } from "matrix-js-sdk"; import { EventType, RelationType, RoomEvent } from "matrix-js-sdk"; import type { RoomMessageEventContent } from "matrix-js-sdk/lib/@types/events.js"; -import { resolveEffectiveMessagesConfig, resolveHumanDelayConfig } from "../../../../../src/agents/identity.js"; -import { chunkMarkdownText, resolveTextChunkLimit } from "../../../../../src/auto-reply/chunk.js"; -import { hasControlCommand } from "../../../../../src/auto-reply/command-detection.js"; -import { shouldHandleTextCommands } from "../../../../../src/auto-reply/commands-registry.js"; -import { formatAgentEnvelope } from "../../../../../src/auto-reply/envelope.js"; -import { dispatchReplyFromConfig } from "../../../../../src/auto-reply/reply/dispatch-from-config.js"; -import { finalizeInboundContext } from "../../../../../src/auto-reply/reply/inbound-context.js"; import { buildMentionRegexes, + chunkMarkdownText, + createReplyDispatcherWithTyping, + danger, + dispatchReplyFromConfig, + enqueueSystemEvent, + finalizeInboundContext, + formatAgentEnvelope, + formatAllowlistMatchMeta, + getChildLogger, + hasControlCommand, + loadConfig, + logVerbose, + mergeAllowlist, matchesMentionPatterns, -} from "../../../../../src/auto-reply/reply/mentions.js"; -import { createReplyDispatcherWithTyping } from "../../../../../src/auto-reply/reply/reply-dispatcher.js"; -import type { ReplyPayload } from "../../../../../src/auto-reply/types.js"; -import { resolveCommandAuthorizedFromAuthorizers } from "../../../../../src/channels/command-gating.js"; -import { formatAllowlistMatchMeta } from "../../../../../src/channels/plugins/allowlist-match.js"; -import { loadConfig } from "../../../../../src/config/config.js"; -import { - recordSessionMetaFromInbound, - resolveStorePath, - updateLastRoute, -} from "../../../../../src/config/sessions.js"; -import { danger, logVerbose, shouldLogVerbose } from "../../../../../src/globals.js"; -import { enqueueSystemEvent } from "../../../../../src/infra/system-events.js"; -import { getChildLogger } from "../../../../../src/logging.js"; -import { readChannelAllowFromStore, + recordSessionMetaFromInbound, + resolveAgentRoute, + resolveCommandAuthorizedFromAuthorizers, + resolveEffectiveMessagesConfig, + resolveHumanDelayConfig, + resolveStorePath, + resolveTextChunkLimit, + shouldHandleTextCommands, + shouldLogVerbose, + summarizeMapping, + updateLastRoute, upsertChannelPairingRequest, -} from "../../../../../src/pairing/pairing-store.js"; -import { resolveAgentRoute } from "../../../../../src/routing/resolve-route.js"; -import type { RuntimeEnv } from "../../../../../src/runtime.js"; + type ReplyPayload, + type RuntimeEnv, +} from "clawdbot/plugin-sdk"; import type { CoreConfig, ReplyToMode } from "../../types.js"; import { setActiveMatrixClient } from "../active-client.js"; import { @@ -51,7 +53,6 @@ import { resolveMatrixAllowListMatches, normalizeAllowListLower, } from "./allowlist.js"; -import { mergeAllowlist, summarizeMapping } from "../../../../../src/channels/allowlists/resolve-utils.js"; import { registerMatrixAutoJoin } from "./auto-join.js"; import { createDirectRoomTracker } from "./direct.js"; import { downloadMatrixMedia } from "./media.js"; diff --git a/extensions/matrix/src/matrix/monitor/media.ts b/extensions/matrix/src/matrix/monitor/media.ts index 8e66755e1..cbb59f298 100644 --- a/extensions/matrix/src/matrix/monitor/media.ts +++ b/extensions/matrix/src/matrix/monitor/media.ts @@ -1,6 +1,6 @@ import type { MatrixClient } from "matrix-js-sdk"; -import { saveMediaBuffer } from "../../../../../src/media/store.js"; +import { saveMediaBuffer } from "clawdbot/plugin-sdk"; async function fetchMatrixMediaBuffer(params: { client: MatrixClient; diff --git a/extensions/matrix/src/matrix/monitor/mentions.ts b/extensions/matrix/src/matrix/monitor/mentions.ts index fee2562d1..6842c269d 100644 --- a/extensions/matrix/src/matrix/monitor/mentions.ts +++ b/extensions/matrix/src/matrix/monitor/mentions.ts @@ -1,6 +1,6 @@ import type { RoomMessageEventContent } from "matrix-js-sdk/lib/@types/events.js"; -import { matchesMentionPatterns } from "../../../../../src/auto-reply/reply/mentions.js"; +import { matchesMentionPatterns } from "clawdbot/plugin-sdk"; export function resolveMentions(params: { content: RoomMessageEventContent; diff --git a/extensions/matrix/src/matrix/monitor/replies.ts b/extensions/matrix/src/matrix/monitor/replies.ts index bb8c205ea..cc558b062 100644 --- a/extensions/matrix/src/matrix/monitor/replies.ts +++ b/extensions/matrix/src/matrix/monitor/replies.ts @@ -1,9 +1,12 @@ import type { MatrixClient } from "matrix-js-sdk"; -import { chunkMarkdownText } from "../../../../../src/auto-reply/chunk.js"; -import type { ReplyPayload } from "../../../../../src/auto-reply/types.js"; -import { danger, logVerbose } from "../../../../../src/globals.js"; -import type { RuntimeEnv } from "../../../../../src/runtime.js"; +import { + chunkMarkdownText, + danger, + logVerbose, + type ReplyPayload, + type RuntimeEnv, +} from "clawdbot/plugin-sdk"; import { sendMessageMatrix } from "../send.js"; export async function deliverMatrixReplies(params: { diff --git a/extensions/matrix/src/matrix/monitor/rooms.ts b/extensions/matrix/src/matrix/monitor/rooms.ts index fe5bbc167..fd9df6fad 100644 --- a/extensions/matrix/src/matrix/monitor/rooms.ts +++ b/extensions/matrix/src/matrix/monitor/rooms.ts @@ -1,8 +1,5 @@ import type { MatrixConfig, MatrixRoomConfig } from "../../types.js"; -import { - buildChannelKeyCandidates, - resolveChannelEntryMatch, -} from "../../../../../src/channels/plugins/channel-config.js"; +import { buildChannelKeyCandidates, resolveChannelEntryMatch } from "clawdbot/plugin-sdk"; export type MatrixRoomConfigResolved = { allowed: boolean; diff --git a/extensions/matrix/src/matrix/poll-types.ts b/extensions/matrix/src/matrix/poll-types.ts index d25c4e686..38a465cfb 100644 --- a/extensions/matrix/src/matrix/poll-types.ts +++ b/extensions/matrix/src/matrix/poll-types.ts @@ -9,7 +9,7 @@ import type { TimelineEvents } from "matrix-js-sdk/lib/@types/event.js"; import type { ExtensibleAnyMessageEventContent } from "matrix-js-sdk/lib/@types/extensible_events.js"; -import type { PollInput } from "../../../../src/polls.js"; +import type { PollInput } from "clawdbot/plugin-sdk"; export const M_POLL_START = "m.poll.start" as const; export const M_POLL_RESPONSE = "m.poll.response" as const; diff --git a/extensions/matrix/src/matrix/send.test.ts b/extensions/matrix/src/matrix/send.test.ts index 71ba3c79f..a0bdd159e 100644 --- a/extensions/matrix/src/matrix/send.test.ts +++ b/extensions/matrix/src/matrix/send.test.ts @@ -18,20 +18,18 @@ vi.mock("matrix-js-sdk", () => ({ }, })); -vi.mock("../../../../src/config/config.js", () => ({ +vi.mock("clawdbot/plugin-sdk", () => ({ loadConfig: () => ({}), -})); - -vi.mock("../../../../src/web/media.js", () => ({ + resolveTextChunkLimit: () => 4000, + chunkMarkdownText: (text: string) => (text ? [text] : []), loadWebMedia: vi.fn().mockResolvedValue({ buffer: Buffer.from("media"), fileName: "photo.png", contentType: "image/png", kind: "image", }), -})); - -vi.mock("../../../../src/media/image-ops.js", () => ({ + mediaKindFromMime: () => "image", + isVoiceCompatibleAudio: () => false, getImageMetadata: vi.fn().mockResolvedValue(null), resizeToJpeg: vi.fn(), })); diff --git a/extensions/matrix/src/matrix/send.ts b/extensions/matrix/src/matrix/send.ts index 7e1e2b2fe..972b78f50 100644 --- a/extensions/matrix/src/matrix/send.ts +++ b/extensions/matrix/src/matrix/send.ts @@ -5,13 +5,17 @@ import type { ReactionEventContent, } from "matrix-js-sdk/lib/@types/events.js"; -import { chunkMarkdownText, resolveTextChunkLimit } from "../../../../src/auto-reply/chunk.js"; -import { loadConfig } from "../../../../src/config/config.js"; -import { isVoiceCompatibleAudio } from "../../../../src/media/audio.js"; -import { mediaKindFromMime } from "../../../../src/media/constants.js"; -import { getImageMetadata, resizeToJpeg } from "../../../../src/media/image-ops.js"; -import type { PollInput } from "../../../../src/polls.js"; -import { loadWebMedia } from "../../../../src/web/media.js"; +import { + chunkMarkdownText, + getImageMetadata, + isVoiceCompatibleAudio, + loadConfig, + loadWebMedia, + mediaKindFromMime, + type PollInput, + resolveTextChunkLimit, + resizeToJpeg, +} from "clawdbot/plugin-sdk"; import { getActiveMatrixClient } from "./active-client.js"; import { createMatrixClient, diff --git a/extensions/matrix/src/onboarding.ts b/extensions/matrix/src/onboarding.ts index 4151f32c7..121e3815a 100644 --- a/extensions/matrix/src/onboarding.ts +++ b/extensions/matrix/src/onboarding.ts @@ -1,11 +1,11 @@ -import { addWildcardAllowFrom } from "../../../src/channels/plugins/onboarding/helpers.js"; -import type { - ChannelOnboardingAdapter, - ChannelOnboardingDmPolicy, -} from "../../../src/channels/plugins/onboarding-types.js"; -import { promptChannelAccessConfig } from "../../../src/channels/plugins/onboarding/channel-access.js"; -import { formatDocsLink } from "../../../src/terminal/links.js"; -import type { WizardPrompter } from "../../../src/wizard/prompts.js"; +import { + addWildcardAllowFrom, + formatDocsLink, + promptChannelAccessConfig, + type ChannelOnboardingAdapter, + type ChannelOnboardingDmPolicy, + type WizardPrompter, +} from "clawdbot/plugin-sdk"; import { listMatrixDirectoryGroupsLive } from "./directory-live.js"; import { resolveMatrixAccount } from "./matrix/accounts.js"; import { ensureMatrixSdkInstalled, isMatrixSdkAvailable } from "./matrix/deps.js"; diff --git a/extensions/matrix/src/outbound.ts b/extensions/matrix/src/outbound.ts index 954685eec..efcc337f2 100644 --- a/extensions/matrix/src/outbound.ts +++ b/extensions/matrix/src/outbound.ts @@ -1,10 +1,11 @@ -import { chunkMarkdownText } from "../../../src/auto-reply/chunk.js"; -import type { ChannelOutboundAdapter } from "../../../src/channels/plugins/types.js"; +import type { ChannelOutboundAdapter } from "clawdbot/plugin-sdk"; + +import { getMatrixRuntime } from "./runtime.js"; import { sendMessageMatrix, sendPollMatrix } from "./matrix/send.js"; export const matrixOutbound: ChannelOutboundAdapter = { deliveryMode: "direct", - chunker: chunkMarkdownText, + chunker: (text, limit) => getMatrixRuntime().channel.text.chunkMarkdownText(text, limit), textChunkLimit: 4000, sendText: async ({ to, text, deps, replyToId, threadId }) => { const send = deps?.sendMatrix ?? sendMessageMatrix; diff --git a/extensions/matrix/src/resolve-targets.ts b/extensions/matrix/src/resolve-targets.ts index 306ae0aa1..2faf68c95 100644 --- a/extensions/matrix/src/resolve-targets.ts +++ b/extensions/matrix/src/resolve-targets.ts @@ -2,8 +2,8 @@ import type { ChannelDirectoryEntry, ChannelResolveKind, ChannelResolveResult, -} from "../../../src/channels/plugins/types.js"; -import type { RuntimeEnv } from "../../../src/runtime.js"; + RuntimeEnv, +} from "clawdbot/plugin-sdk"; import { listMatrixDirectoryGroupsLive, diff --git a/extensions/matrix/src/runtime.ts b/extensions/matrix/src/runtime.ts new file mode 100644 index 000000000..dea53f66a --- /dev/null +++ b/extensions/matrix/src/runtime.ts @@ -0,0 +1,14 @@ +import type { PluginRuntime } from "clawdbot/plugin-sdk"; + +let runtime: PluginRuntime | null = null; + +export function setMatrixRuntime(next: PluginRuntime) { + runtime = next; +} + +export function getMatrixRuntime(): PluginRuntime { + if (!runtime) { + throw new Error("Matrix runtime not initialized"); + } + return runtime; +} diff --git a/extensions/matrix/src/tool-actions.ts b/extensions/matrix/src/tool-actions.ts index 947748a2c..9f1a83bdd 100644 --- a/extensions/matrix/src/tool-actions.ts +++ b/extensions/matrix/src/tool-actions.ts @@ -21,7 +21,7 @@ import { readNumberParam, readReactionParams, readStringParam, -} from "../../../src/agents/tools/common.js"; +} from "clawdbot/plugin-sdk"; const messageActions = new Set(["sendMessage", "editMessage", "deleteMessage", "readMessages"]); const reactionActions = new Set(["react", "reactions"]); diff --git a/extensions/memory-core/index.ts b/extensions/memory-core/index.ts index f6119188c..242dd0c9c 100644 --- a/extensions/memory-core/index.ts +++ b/extensions/memory-core/index.ts @@ -1,7 +1,10 @@ -import type { ClawdbotPluginApi } from "../../src/plugins/types.js"; +import type { ClawdbotPluginApi } from "clawdbot/plugin-sdk"; -import { createMemoryGetTool, createMemorySearchTool } from "../../src/agents/tools/memory-tool.js"; -import { registerMemoryCli } from "../../src/cli/memory-cli.js"; +import { + createMemoryGetTool, + createMemorySearchTool, + registerMemoryCli, +} from "clawdbot/plugin-sdk"; const memoryCorePlugin = { id: "memory-core", diff --git a/extensions/msteams/.DS_Store b/extensions/msteams/.DS_Store new file mode 100644 index 000000000..4b7317193 Binary files /dev/null and b/extensions/msteams/.DS_Store differ diff --git a/extensions/msteams/index.ts b/extensions/msteams/index.ts index 8fcb92729..1aab1fb78 100644 --- a/extensions/msteams/index.ts +++ b/extensions/msteams/index.ts @@ -1,4 +1,4 @@ -import type { ClawdbotPluginApi } from "../../src/plugins/types.js"; +import type { ClawdbotPluginApi } from "clawdbot/plugin-sdk"; import { msteamsPlugin } from "./src/channel.js"; diff --git a/extensions/msteams/node_modules/@microsoft/agents-hosting b/extensions/msteams/node_modules/@microsoft/agents-hosting new file mode 120000 index 000000000..272287799 --- /dev/null +++ b/extensions/msteams/node_modules/@microsoft/agents-hosting @@ -0,0 +1 @@ +../../../../node_modules/.pnpm/@microsoft+agents-hosting@1.1.1/node_modules/@microsoft/agents-hosting \ No newline at end of file diff --git a/extensions/msteams/node_modules/@microsoft/agents-hosting-express b/extensions/msteams/node_modules/@microsoft/agents-hosting-express new file mode 120000 index 000000000..6662786b0 --- /dev/null +++ b/extensions/msteams/node_modules/@microsoft/agents-hosting-express @@ -0,0 +1 @@ +../../../../node_modules/.pnpm/@microsoft+agents-hosting-express@1.1.1/node_modules/@microsoft/agents-hosting-express \ No newline at end of file diff --git a/extensions/msteams/node_modules/@microsoft/agents-hosting-extensions-teams b/extensions/msteams/node_modules/@microsoft/agents-hosting-extensions-teams new file mode 120000 index 000000000..7c5ea19c5 --- /dev/null +++ b/extensions/msteams/node_modules/@microsoft/agents-hosting-extensions-teams @@ -0,0 +1 @@ +../../../../node_modules/.pnpm/@microsoft+agents-hosting-extensions-teams@1.1.1/node_modules/@microsoft/agents-hosting-extensions-teams \ No newline at end of file diff --git a/extensions/msteams/node_modules/express b/extensions/msteams/node_modules/express new file mode 120000 index 000000000..b86ac69dc --- /dev/null +++ b/extensions/msteams/node_modules/express @@ -0,0 +1 @@ +../../../node_modules/.pnpm/express@5.2.1/node_modules/express \ No newline at end of file diff --git a/extensions/msteams/node_modules/proper-lockfile b/extensions/msteams/node_modules/proper-lockfile new file mode 120000 index 000000000..5dc409f1c --- /dev/null +++ b/extensions/msteams/node_modules/proper-lockfile @@ -0,0 +1 @@ +../../../node_modules/.pnpm/proper-lockfile@4.1.2/node_modules/proper-lockfile \ No newline at end of file diff --git a/extensions/msteams/src/attachments.test.ts b/extensions/msteams/src/attachments.test.ts index 87c24ce04..b99e66851 100644 --- a/extensions/msteams/src/attachments.test.ts +++ b/extensions/msteams/src/attachments.test.ts @@ -6,19 +6,8 @@ const saveMediaBufferMock = vi.fn(async () => ({ contentType: "image/png", })); -const modulePaths = vi.hoisted(() => { - const downloadModuleUrl = new URL("./attachments/download.js", import.meta.url); - return { - mimeModulePath: new URL("../../../../src/media/mime.js", downloadModuleUrl).pathname, - storeModulePath: new URL("../../../../src/media/store.js", downloadModuleUrl).pathname, - }; -}); - -vi.mock(modulePaths.mimeModulePath, () => ({ +vi.mock("clawdbot/plugin-sdk", () => ({ detectMime: (...args: unknown[]) => detectMimeMock(...args), -})); - -vi.mock(modulePaths.storeModulePath, () => ({ saveMediaBuffer: (...args: unknown[]) => saveMediaBufferMock(...args), })); diff --git a/extensions/msteams/src/attachments/download.ts b/extensions/msteams/src/attachments/download.ts index 870b23753..6ba0524a6 100644 --- a/extensions/msteams/src/attachments/download.ts +++ b/extensions/msteams/src/attachments/download.ts @@ -1,5 +1,4 @@ -import { detectMime } from "../../../../src/media/mime.js"; -import { saveMediaBuffer } from "../../../../src/media/store.js"; +import { detectMime, saveMediaBuffer } from "clawdbot/plugin-sdk"; import { extractInlineImageCandidates, inferPlaceholder, diff --git a/extensions/msteams/src/attachments/graph.ts b/extensions/msteams/src/attachments/graph.ts index e81a345eb..4b270d362 100644 --- a/extensions/msteams/src/attachments/graph.ts +++ b/extensions/msteams/src/attachments/graph.ts @@ -1,5 +1,4 @@ -import { detectMime } from "../../../../src/media/mime.js"; -import { saveMediaBuffer } from "../../../../src/media/store.js"; +import { detectMime, saveMediaBuffer } from "clawdbot/plugin-sdk"; import { downloadMSTeamsImageAttachments } from "./download.js"; import { GRAPH_ROOT, isRecord, normalizeContentType, resolveAllowedHosts } from "./shared.js"; import type { diff --git a/extensions/msteams/src/channel.directory.test.ts b/extensions/msteams/src/channel.directory.test.ts index f1bc50238..4f5a96a9a 100644 --- a/extensions/msteams/src/channel.directory.test.ts +++ b/extensions/msteams/src/channel.directory.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; -import type { ClawdbotConfig } from "../../../src/config/config.js"; +import type { ClawdbotConfig } from "clawdbot/plugin-sdk"; import { msteamsPlugin } from "./channel.js"; diff --git a/extensions/msteams/src/channel.ts b/extensions/msteams/src/channel.ts index 40e22ad79..de3e0a8df 100644 --- a/extensions/msteams/src/channel.ts +++ b/extensions/msteams/src/channel.ts @@ -1,9 +1,10 @@ -import type { ClawdbotConfig } from "../../../src/config/config.js"; -import { MSTeamsConfigSchema } from "../../../src/config/zod-schema.providers-core.js"; -import { buildChannelConfigSchema } from "../../../src/channels/plugins/config-schema.js"; -import { PAIRING_APPROVED_MESSAGE } from "../../../src/channels/plugins/pairing-message.js"; -import type { ChannelMessageActionName, ChannelPlugin } from "../../../src/channels/plugins/types.js"; -import { DEFAULT_ACCOUNT_ID } from "../../../src/routing/session-key.js"; +import type { ChannelMessageActionName, ChannelPlugin, ClawdbotConfig } from "clawdbot/plugin-sdk"; +import { + buildChannelConfigSchema, + DEFAULT_ACCOUNT_ID, + MSTeamsConfigSchema, + PAIRING_APPROVED_MESSAGE, +} from "clawdbot/plugin-sdk"; import { msteamsOnboardingAdapter } from "./onboarding.js"; import { msteamsOutbound } from "./outbound.js"; diff --git a/extensions/msteams/src/directory-live.ts b/extensions/msteams/src/directory-live.ts index 6518959ad..35715acb4 100644 --- a/extensions/msteams/src/directory-live.ts +++ b/extensions/msteams/src/directory-live.ts @@ -1,4 +1,4 @@ -import type { ChannelDirectoryEntry } from "../../../src/channels/plugins/types.js"; +import type { ChannelDirectoryEntry } from "clawdbot/plugin-sdk"; import { GRAPH_ROOT } from "./attachments/shared.js"; import { loadMSTeamsSdkWithAuth } from "./sdk.js"; diff --git a/extensions/msteams/src/messenger.test.ts b/extensions/msteams/src/messenger.test.ts index 80b49a233..143706085 100644 --- a/extensions/msteams/src/messenger.test.ts +++ b/extensions/msteams/src/messenger.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; -import { SILENT_REPLY_TOKEN } from "../../../src/auto-reply/tokens.js"; +import { SILENT_REPLY_TOKEN } from "clawdbot/plugin-sdk"; import type { StoredConversationReference } from "./conversation-store.js"; import { type MSTeamsAdapter, diff --git a/extensions/msteams/src/messenger.ts b/extensions/msteams/src/messenger.ts index 3ffcbfe4a..a2bc6f4cc 100644 --- a/extensions/msteams/src/messenger.ts +++ b/extensions/msteams/src/messenger.ts @@ -1,7 +1,10 @@ -import { chunkMarkdownText } from "../../../src/auto-reply/chunk.js"; -import { isSilentReplyText, SILENT_REPLY_TOKEN } from "../../../src/auto-reply/tokens.js"; -import type { ReplyPayload } from "../../../src/auto-reply/types.js"; -import type { MSTeamsReplyStyle } from "../../../src/config/types.js"; +import { + chunkMarkdownText, + isSilentReplyText, + type MSTeamsReplyStyle, + type ReplyPayload, + SILENT_REPLY_TOKEN, +} from "clawdbot/plugin-sdk"; import type { StoredConversationReference } from "./conversation-store.js"; import { classifyMSTeamsSendError } from "./errors.js"; diff --git a/extensions/msteams/src/monitor-handler.ts b/extensions/msteams/src/monitor-handler.ts index 41952cb82..37e8bf40c 100644 --- a/extensions/msteams/src/monitor-handler.ts +++ b/extensions/msteams/src/monitor-handler.ts @@ -1,6 +1,5 @@ -import type { ClawdbotConfig } from "../../../src/config/types.js"; -import { danger } from "../../../src/globals.js"; -import type { RuntimeEnv } from "../../../src/runtime.js"; +import type { ClawdbotConfig, RuntimeEnv } from "clawdbot/plugin-sdk"; +import { danger } from "clawdbot/plugin-sdk"; import type { MSTeamsConversationStore } from "./conversation-store.js"; import type { MSTeamsAdapter } from "./messenger.js"; import { createMSTeamsMessageHandler } from "./monitor-handler/message-handler.js"; diff --git a/extensions/msteams/src/monitor-handler/message-handler.ts b/extensions/msteams/src/monitor-handler/message-handler.ts index b4c1e6fc7..1fcc52075 100644 --- a/extensions/msteams/src/monitor-handler/message-handler.ts +++ b/extensions/msteams/src/monitor-handler/message-handler.ts @@ -1,29 +1,27 @@ -import { hasControlCommand } from "../../../../src/auto-reply/command-detection.js"; -import { formatAgentEnvelope } from "../../../../src/auto-reply/envelope.js"; -import { - createInboundDebouncer, - resolveInboundDebounceMs, -} from "../../../../src/auto-reply/inbound-debounce.js"; -import { dispatchReplyFromConfig } from "../../../../src/auto-reply/reply/dispatch-from-config.js"; -import { finalizeInboundContext } from "../../../../src/auto-reply/reply/inbound-context.js"; import { buildPendingHistoryContextFromMap, clearHistoryEntries, + createInboundDebouncer, + danger, DEFAULT_GROUP_HISTORY_LIMIT, - recordPendingHistoryEntry, - type HistoryEntry, -} from "../../../../src/auto-reply/reply/history.js"; -import { resolveMentionGating } from "../../../../src/channels/mention-gating.js"; -import { resolveCommandAuthorizedFromAuthorizers } from "../../../../src/channels/command-gating.js"; -import { formatAllowlistMatchMeta } from "../../../../src/channels/plugins/allowlist-match.js"; -import { danger, logVerbose, shouldLogVerbose } from "../../../../src/globals.js"; -import { enqueueSystemEvent } from "../../../../src/infra/system-events.js"; -import { recordSessionMetaFromInbound, resolveStorePath } from "../../../../src/config/sessions.js"; -import { readChannelAllowFromStore, + recordSessionMetaFromInbound, + recordPendingHistoryEntry, + resolveAgentRoute, + resolveCommandAuthorizedFromAuthorizers, + resolveInboundDebounceMs, + resolveMentionGating, + resolveStorePath, + dispatchReplyFromConfig, + finalizeInboundContext, + formatAgentEnvelope, + formatAllowlistMatchMeta, + hasControlCommand, + logVerbose, + shouldLogVerbose, upsertChannelPairingRequest, -} from "../../../../src/pairing/pairing-store.js"; -import { resolveAgentRoute } from "../../../../src/routing/resolve-route.js"; + type HistoryEntry, +} from "clawdbot/plugin-sdk"; import { buildMSTeamsAttachmentPlaceholder, diff --git a/extensions/msteams/src/monitor.ts b/extensions/msteams/src/monitor.ts index 70a47608f..4902ed01c 100644 --- a/extensions/msteams/src/monitor.ts +++ b/extensions/msteams/src/monitor.ts @@ -1,9 +1,12 @@ import type { Request, Response } from "express"; -import { resolveTextChunkLimit } from "../../../src/auto-reply/chunk.js"; -import { mergeAllowlist, summarizeMapping } from "../../../src/channels/allowlists/resolve-utils.js"; -import type { ClawdbotConfig } from "../../../src/config/types.js"; -import { getChildLogger } from "../../../src/logging.js"; -import type { RuntimeEnv } from "../../../src/runtime.js"; +import { + getChildLogger, + mergeAllowlist, + resolveTextChunkLimit, + summarizeMapping, + type ClawdbotConfig, + type RuntimeEnv, +} from "clawdbot/plugin-sdk"; import type { MSTeamsConversationStore } from "./conversation-store.js"; import { createMSTeamsConversationStoreFs } from "./conversation-store-fs.js"; import { formatUnknownError } from "./errors.js"; diff --git a/extensions/msteams/src/onboarding.ts b/extensions/msteams/src/onboarding.ts index 539068ddd..34aaedbf6 100644 --- a/extensions/msteams/src/onboarding.ts +++ b/extensions/msteams/src/onboarding.ts @@ -1,14 +1,16 @@ -import type { ClawdbotConfig } from "../../../src/config/config.js"; -import type { DmPolicy } from "../../../src/config/types.js"; -import { DEFAULT_ACCOUNT_ID } from "../../../src/routing/session-key.js"; -import { formatDocsLink } from "../../../src/terminal/links.js"; -import type { WizardPrompter } from "../../../src/wizard/prompts.js"; import type { ChannelOnboardingAdapter, ChannelOnboardingDmPolicy, -} from "../../../src/channels/plugins/onboarding-types.js"; -import { promptChannelAccessConfig } from "../../../src/channels/plugins/onboarding/channel-access.js"; -import { addWildcardAllowFrom } from "../../../src/channels/plugins/onboarding/helpers.js"; + ClawdbotConfig, + DmPolicy, + WizardPrompter, +} from "clawdbot/plugin-sdk"; +import { + addWildcardAllowFrom, + DEFAULT_ACCOUNT_ID, + formatDocsLink, + promptChannelAccessConfig, +} from "clawdbot/plugin-sdk"; import { resolveMSTeamsCredentials } from "./token.js"; import { diff --git a/extensions/msteams/src/outbound.ts b/extensions/msteams/src/outbound.ts index b9c7ba9fb..77704b8b5 100644 --- a/extensions/msteams/src/outbound.ts +++ b/extensions/msteams/src/outbound.ts @@ -1,5 +1,4 @@ -import { chunkMarkdownText } from "../../../src/auto-reply/chunk.js"; -import type { ChannelOutboundAdapter } from "../../../src/channels/plugins/types.js"; +import { chunkMarkdownText, type ChannelOutboundAdapter } from "clawdbot/plugin-sdk"; import { createMSTeamsPollStoreFs } from "./polls.js"; import { sendMessageMSTeams, sendPollMSTeams } from "./send.js"; diff --git a/extensions/msteams/src/policy.test.ts b/extensions/msteams/src/policy.test.ts index 0401a9a50..d9e8fcfb5 100644 --- a/extensions/msteams/src/policy.test.ts +++ b/extensions/msteams/src/policy.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; -import type { MSTeamsConfig } from "../../../src/config/types.js"; +import type { MSTeamsConfig } from "clawdbot/plugin-sdk"; import { isMSTeamsGroupAllowed, resolveMSTeamsReplyPolicy, diff --git a/extensions/msteams/src/policy.ts b/extensions/msteams/src/policy.ts index 1762cb537..b68174711 100644 --- a/extensions/msteams/src/policy.ts +++ b/extensions/msteams/src/policy.ts @@ -1,17 +1,17 @@ import type { + AllowlistMatch, GroupPolicy, MSTeamsChannelConfig, MSTeamsConfig, MSTeamsReplyStyle, MSTeamsTeamConfig, -} from "../../../src/config/types.js"; +} from "clawdbot/plugin-sdk"; import { buildChannelKeyCandidates, normalizeChannelSlug, resolveChannelEntryMatchWithFallback, resolveNestedAllowlistDecision, -} from "../../../src/channels/plugins/channel-config.js"; -import type { AllowlistMatch } from "../../../src/channels/plugins/allowlist-match.js"; +} from "clawdbot/plugin-sdk"; export type MSTeamsResolvedRouteConfig = { teamConfig?: MSTeamsTeamConfig; diff --git a/extensions/msteams/src/probe.test.ts b/extensions/msteams/src/probe.test.ts index 8233feaad..9a7bb1808 100644 --- a/extensions/msteams/src/probe.test.ts +++ b/extensions/msteams/src/probe.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it, vi } from "vitest"; -import type { MSTeamsConfig } from "../../../src/config/types.js"; +import type { MSTeamsConfig } from "clawdbot/plugin-sdk"; const hostMockState = vi.hoisted(() => ({ tokenError: null as Error | null, diff --git a/extensions/msteams/src/probe.ts b/extensions/msteams/src/probe.ts index 502f2d114..835be6587 100644 --- a/extensions/msteams/src/probe.ts +++ b/extensions/msteams/src/probe.ts @@ -1,4 +1,4 @@ -import type { MSTeamsConfig } from "../../../src/config/types.js"; +import type { MSTeamsConfig } from "clawdbot/plugin-sdk"; import { formatUnknownError } from "./errors.js"; import { loadMSTeamsSdkWithAuth } from "./sdk.js"; import { resolveMSTeamsCredentials } from "./token.js"; diff --git a/extensions/msteams/src/reply-dispatcher.ts b/extensions/msteams/src/reply-dispatcher.ts index 373e40b93..004909416 100644 --- a/extensions/msteams/src/reply-dispatcher.ts +++ b/extensions/msteams/src/reply-dispatcher.ts @@ -1,8 +1,12 @@ -import { resolveEffectiveMessagesConfig, resolveHumanDelayConfig } from "../../../src/agents/identity.js"; -import { createReplyDispatcherWithTyping } from "../../../src/auto-reply/reply/reply-dispatcher.js"; -import type { ClawdbotConfig, MSTeamsReplyStyle } from "../../../src/config/types.js"; -import { danger } from "../../../src/globals.js"; -import type { RuntimeEnv } from "../../../src/runtime.js"; +import { + createReplyDispatcherWithTyping, + danger, + resolveEffectiveMessagesConfig, + resolveHumanDelayConfig, + type ClawdbotConfig, + type MSTeamsReplyStyle, + type RuntimeEnv, +} from "clawdbot/plugin-sdk"; import type { StoredConversationReference } from "./conversation-store.js"; import { classifyMSTeamsSendError, diff --git a/extensions/msteams/src/send-context.ts b/extensions/msteams/src/send-context.ts index ab4c4e998..f246a4bf6 100644 --- a/extensions/msteams/src/send-context.ts +++ b/extensions/msteams/src/send-context.ts @@ -1,5 +1,5 @@ -import type { ClawdbotConfig } from "../../../src/config/types.js"; -import type { getChildLogger as getChildLoggerFn } from "../../../src/logging.js"; +import type { ClawdbotConfig } from "clawdbot/plugin-sdk"; +import type { getChildLogger as getChildLoggerFn } from "clawdbot/plugin-sdk"; import type { MSTeamsConversationStore, StoredConversationReference, diff --git a/extensions/msteams/src/send.ts b/extensions/msteams/src/send.ts index 52b7da66c..cffba2b6d 100644 --- a/extensions/msteams/src/send.ts +++ b/extensions/msteams/src/send.ts @@ -1,4 +1,4 @@ -import type { ClawdbotConfig } from "../../../src/config/types.js"; +import type { ClawdbotConfig } from "clawdbot/plugin-sdk"; import type { StoredConversationReference } from "./conversation-store.js"; import { createMSTeamsConversationStoreFs } from "./conversation-store-fs.js"; import { diff --git a/extensions/msteams/src/storage.ts b/extensions/msteams/src/storage.ts index 6a9b599fb..2e0bf42e2 100644 --- a/extensions/msteams/src/storage.ts +++ b/extensions/msteams/src/storage.ts @@ -1,6 +1,6 @@ import path from "node:path"; -import { resolveStateDir } from "../../../src/config/paths.js"; +import { resolveStateDir } from "clawdbot/plugin-sdk"; export type MSTeamsStorePathOptions = { env?: NodeJS.ProcessEnv; diff --git a/extensions/msteams/src/token.ts b/extensions/msteams/src/token.ts index 977edaee4..e6406b85f 100644 --- a/extensions/msteams/src/token.ts +++ b/extensions/msteams/src/token.ts @@ -1,4 +1,4 @@ -import type { MSTeamsConfig } from "../../../src/config/types.js"; +import type { MSTeamsConfig } from "clawdbot/plugin-sdk"; export type MSTeamsCredentials = { appId: string; diff --git a/extensions/voice-call/.DS_Store b/extensions/voice-call/.DS_Store new file mode 100644 index 000000000..987bfc883 Binary files /dev/null and b/extensions/voice-call/.DS_Store differ diff --git a/extensions/voice-call/node_modules/@sinclair/typebox b/extensions/voice-call/node_modules/@sinclair/typebox new file mode 120000 index 000000000..e0ac1dea2 --- /dev/null +++ b/extensions/voice-call/node_modules/@sinclair/typebox @@ -0,0 +1 @@ +../../../../node_modules/.pnpm/@sinclair+typebox@0.34.47/node_modules/@sinclair/typebox \ No newline at end of file diff --git a/extensions/voice-call/node_modules/ws b/extensions/voice-call/node_modules/ws new file mode 120000 index 000000000..95a9befe7 --- /dev/null +++ b/extensions/voice-call/node_modules/ws @@ -0,0 +1 @@ +../../../node_modules/.pnpm/ws@8.19.0/node_modules/ws \ No newline at end of file diff --git a/extensions/voice-call/node_modules/zod b/extensions/voice-call/node_modules/zod new file mode 120000 index 000000000..b41963a66 --- /dev/null +++ b/extensions/voice-call/node_modules/zod @@ -0,0 +1 @@ +../../../node_modules/.pnpm/zod@4.3.5/node_modules/zod \ No newline at end of file diff --git a/extensions/zalo/.DS_Store b/extensions/zalo/.DS_Store new file mode 100644 index 000000000..a34be6ad2 Binary files /dev/null and b/extensions/zalo/.DS_Store differ diff --git a/extensions/zalo/index.ts b/extensions/zalo/index.ts index aa85bead4..38b408f93 100644 --- a/extensions/zalo/index.ts +++ b/extensions/zalo/index.ts @@ -1,4 +1,4 @@ -import type { ClawdbotPluginApi } from "../../src/plugins/types.js"; +import type { ClawdbotPluginApi } from "clawdbot/plugin-sdk"; import { zaloDock, zaloPlugin } from "./src/channel.js"; import { handleZaloWebhookRequest } from "./src/monitor.js"; diff --git a/extensions/zalo/node_modules/undici b/extensions/zalo/node_modules/undici new file mode 120000 index 000000000..80f93c7a1 --- /dev/null +++ b/extensions/zalo/node_modules/undici @@ -0,0 +1 @@ +../../../node_modules/.pnpm/undici@7.18.2/node_modules/undici \ No newline at end of file diff --git a/extensions/zalo/src/actions.ts b/extensions/zalo/src/actions.ts index aeaece1bc..9bf33ee52 100644 --- a/extensions/zalo/src/actions.ts +++ b/extensions/zalo/src/actions.ts @@ -1,4 +1,7 @@ -import type { ChannelMessageActionAdapter, ChannelMessageActionName } from "../../src/channels/plugins/types.js"; +import type { + ChannelMessageActionAdapter, + ChannelMessageActionName, +} from "clawdbot/plugin-sdk"; import type { CoreConfig } from "./types.js"; import { listEnabledZaloAccounts } from "./accounts.js"; diff --git a/extensions/zalo/src/channel.ts b/extensions/zalo/src/channel.ts index 61048a16a..6bdf5fd92 100644 --- a/extensions/zalo/src/channel.ts +++ b/extensions/zalo/src/channel.ts @@ -1,6 +1,5 @@ -import type { ChannelAccountSnapshot } from "../../../src/channels/plugins/types.js"; -import type { ChannelDock, ChannelPlugin } from "../../../src/channels/plugins/types.js"; -import { buildChannelConfigSchema } from "../../../src/channels/plugins/config-schema.js"; +import type { ChannelAccountSnapshot, ChannelDock, ChannelPlugin } from "clawdbot/plugin-sdk"; +import { buildChannelConfigSchema } from "clawdbot/plugin-sdk"; import { listZaloAccountIds, resolveDefaultZaloAccountId, resolveZaloAccount, type ResolvedZaloAccount } from "./accounts.js"; import { zaloMessageActions } from "./actions.js"; diff --git a/extensions/zalo/src/monitor.ts b/extensions/zalo/src/monitor.ts index bd7a0e179..0aeabd1cf 100644 --- a/extensions/zalo/src/monitor.ts +++ b/extensions/zalo/src/monitor.ts @@ -2,12 +2,13 @@ import type { IncomingMessage, ServerResponse } from "node:http"; import type { ResolvedZaloAccount } from "./accounts.js"; import { + finalizeInboundContext, isControlCommandMessage, + recordSessionMetaFromInbound, + resolveCommandAuthorizedFromAuthorizers, + resolveStorePath, shouldComputeCommandAuthorized, -} from "../../../src/auto-reply/command-detection.js"; -import { finalizeInboundContext } from "../../../src/auto-reply/reply/inbound-context.js"; -import { resolveCommandAuthorizedFromAuthorizers } from "../../../src/channels/command-gating.js"; -import { recordSessionMetaFromInbound, resolveStorePath } from "../../../src/config/sessions.js"; +} from "clawdbot/plugin-sdk"; import { ZaloApiError, deleteWebhook, diff --git a/extensions/zalo/src/onboarding.ts b/extensions/zalo/src/onboarding.ts index 1f60a841b..e9cd6359e 100644 --- a/extensions/zalo/src/onboarding.ts +++ b/extensions/zalo/src/onboarding.ts @@ -1,5 +1,8 @@ -import type { ChannelOnboardingAdapter, ChannelOnboardingDmPolicy } from "../../src/channels/plugins/onboarding-types.js"; -import type { WizardPrompter } from "../../src/wizard/prompts.js"; +import type { + ChannelOnboardingAdapter, + ChannelOnboardingDmPolicy, + WizardPrompter, +} from "clawdbot/plugin-sdk"; import { addWildcardAllowFrom, promptAccountId } from "./shared/onboarding.js"; import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "./shared/account-ids.js"; diff --git a/extensions/zalo/src/shared/onboarding.ts b/extensions/zalo/src/shared/onboarding.ts index a998fb778..d9b633f18 100644 --- a/extensions/zalo/src/shared/onboarding.ts +++ b/extensions/zalo/src/shared/onboarding.ts @@ -1,4 +1,4 @@ -import type { WizardPrompter } from "../../../src/wizard/prompts.js"; +import type { WizardPrompter } from "clawdbot/plugin-sdk"; import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "./account-ids.js"; diff --git a/extensions/zalo/src/status-issues.ts b/extensions/zalo/src/status-issues.ts index c5ca219f3..8370c0aa6 100644 --- a/extensions/zalo/src/status-issues.ts +++ b/extensions/zalo/src/status-issues.ts @@ -1,4 +1,4 @@ -import type { ChannelAccountSnapshot, ChannelStatusIssue } from "../../src/channels/plugins/types.js"; +import type { ChannelAccountSnapshot, ChannelStatusIssue } from "clawdbot/plugin-sdk"; type ZaloAccountStatus = { accountId?: unknown; diff --git a/extensions/zalouser/.DS_Store b/extensions/zalouser/.DS_Store new file mode 100644 index 000000000..d1eab24e2 Binary files /dev/null and b/extensions/zalouser/.DS_Store differ diff --git a/extensions/zalouser/index.ts b/extensions/zalouser/index.ts index 5f47692ac..2271292d8 100644 --- a/extensions/zalouser/index.ts +++ b/extensions/zalouser/index.ts @@ -1,4 +1,4 @@ -import type { ClawdbotPluginApi } from "../../src/plugins/types.js"; +import type { ClawdbotPluginApi } from "clawdbot/plugin-sdk"; import { zalouserPlugin } from "./src/channel.js"; import { ZalouserToolSchema, executeZalouserTool } from "./src/tool.js"; diff --git a/extensions/zalouser/node_modules/@sinclair/typebox b/extensions/zalouser/node_modules/@sinclair/typebox new file mode 120000 index 000000000..e0ac1dea2 --- /dev/null +++ b/extensions/zalouser/node_modules/@sinclair/typebox @@ -0,0 +1 @@ +../../../../node_modules/.pnpm/@sinclair+typebox@0.34.47/node_modules/@sinclair/typebox \ No newline at end of file diff --git a/extensions/zalouser/src/channel.ts b/extensions/zalouser/src/channel.ts index 557c92447..6fd4f690e 100644 --- a/extensions/zalouser/src/channel.ts +++ b/extensions/zalouser/src/channel.ts @@ -1,10 +1,6 @@ -import type { ChannelPlugin } from "../../../src/channels/plugins/types.plugin.js"; -import type { - ChannelAccountSnapshot, - ChannelDirectoryEntry, -} from "../../../src/channels/plugins/types.core.js"; +import type { ChannelAccountSnapshot, ChannelDirectoryEntry, ChannelPlugin } from "clawdbot/plugin-sdk"; -import { formatPairingApproveHint } from "../../../src/channels/plugins/helpers.js"; +import { formatPairingApproveHint } from "clawdbot/plugin-sdk"; import { listZalouserAccountIds, resolveDefaultZalouserAccountId, diff --git a/extensions/zalouser/src/monitor.ts b/extensions/zalouser/src/monitor.ts index 5ec687c36..9d18070a0 100644 --- a/extensions/zalouser/src/monitor.ts +++ b/extensions/zalouser/src/monitor.ts @@ -1,14 +1,16 @@ import type { ChildProcess } from "node:child_process"; -import type { RuntimeEnv } from "../../../src/runtime.js"; +import type { RuntimeEnv } from "clawdbot/plugin-sdk"; import { + finalizeInboundContext, isControlCommandMessage, + mergeAllowlist, + recordSessionMetaFromInbound, + resolveCommandAuthorizedFromAuthorizers, + resolveStorePath, shouldComputeCommandAuthorized, -} from "../../../src/auto-reply/command-detection.js"; -import { mergeAllowlist, summarizeMapping } from "../../../src/channels/allowlists/resolve-utils.js"; -import { finalizeInboundContext } from "../../../src/auto-reply/reply/inbound-context.js"; -import { resolveCommandAuthorizedFromAuthorizers } from "../../../src/channels/command-gating.js"; -import { recordSessionMetaFromInbound, resolveStorePath } from "../../../src/config/sessions.js"; + summarizeMapping, +} from "clawdbot/plugin-sdk"; import { loadCoreChannelDeps, type CoreChannelDeps } from "./core-bridge.js"; import { sendMessageZalouser } from "./send.js"; import type { diff --git a/extensions/zalouser/src/onboarding.ts b/extensions/zalouser/src/onboarding.ts index 51359b5a4..e220c2765 100644 --- a/extensions/zalouser/src/onboarding.ts +++ b/extensions/zalouser/src/onboarding.ts @@ -1,6 +1,9 @@ -import type { ChannelOnboardingAdapter, ChannelOnboardingDmPolicy } from "../../../src/channels/plugins/onboarding-types.js"; -import type { WizardPrompter } from "../../../src/wizard/prompts.js"; -import { promptChannelAccessConfig } from "../../../src/channels/plugins/onboarding/channel-access.js"; +import type { + ChannelOnboardingAdapter, + ChannelOnboardingDmPolicy, + WizardPrompter, +} from "clawdbot/plugin-sdk"; +import { promptChannelAccessConfig } from "clawdbot/plugin-sdk"; import { listZalouserAccountIds, diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 000000000..10bb3ef5f Binary files /dev/null and b/src/.DS_Store differ diff --git a/src/agents/.DS_Store b/src/agents/.DS_Store new file mode 100644 index 000000000..ac59e642f Binary files /dev/null and b/src/agents/.DS_Store differ diff --git a/src/channels/.DS_Store b/src/channels/.DS_Store new file mode 100644 index 000000000..5a17d2b5e Binary files /dev/null and b/src/channels/.DS_Store differ diff --git a/src/cli/.DS_Store b/src/cli/.DS_Store new file mode 100644 index 000000000..3f3b9ddf0 Binary files /dev/null and b/src/cli/.DS_Store differ diff --git a/src/commands/.DS_Store b/src/commands/.DS_Store new file mode 100644 index 000000000..7456502cf Binary files /dev/null and b/src/commands/.DS_Store differ diff --git a/src/cron/.DS_Store b/src/cron/.DS_Store new file mode 100644 index 000000000..0aa3fb82a Binary files /dev/null and b/src/cron/.DS_Store differ diff --git a/src/gateway/.DS_Store b/src/gateway/.DS_Store new file mode 100644 index 000000000..c588dd5ce Binary files /dev/null and b/src/gateway/.DS_Store differ diff --git a/src/infra/.DS_Store b/src/infra/.DS_Store new file mode 100644 index 000000000..add77a757 Binary files /dev/null and b/src/infra/.DS_Store differ diff --git a/src/plugin-sdk/index.ts b/src/plugin-sdk/index.ts index 75d63b251..3b3f8d700 100644 --- a/src/plugin-sdk/index.ts +++ b/src/plugin-sdk/index.ts @@ -53,6 +53,76 @@ export type { ChannelToolSend, } from "../channels/plugins/types.js"; export type { ChannelConfigSchema, ChannelPlugin } from "../channels/plugins/types.plugin.js"; +export type { ClawdbotPluginApi } from "../plugins/types.js"; +export type { ClawdbotConfig } from "../config/config.js"; +export type { ChannelDock } from "../channels/dock.js"; +export type { + DmPolicy, + GroupPolicy, + MSTeamsChannelConfig, + MSTeamsConfig, + MSTeamsReplyStyle, + MSTeamsTeamConfig, +} from "../config/types.js"; +export { MSTeamsConfigSchema } from "../config/zod-schema.providers-core.js"; +export type { RuntimeEnv } from "../runtime.js"; +export type { WizardPrompter } from "../wizard/prompts.js"; +export { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../routing/session-key.js"; +export type { ReplyPayload } from "../auto-reply/types.js"; +export { SILENT_REPLY_TOKEN, isSilentReplyText } from "../auto-reply/tokens.js"; +export { chunkMarkdownText, resolveTextChunkLimit } from "../auto-reply/chunk.js"; +export { + hasControlCommand, + isControlCommandMessage, + shouldComputeCommandAuthorized, +} from "../auto-reply/command-detection.js"; +export { shouldHandleTextCommands } from "../auto-reply/commands-registry.js"; +export { formatAgentEnvelope } from "../auto-reply/envelope.js"; +export { + createInboundDebouncer, + resolveInboundDebounceMs, +} from "../auto-reply/inbound-debounce.js"; +export { dispatchReplyFromConfig } from "../auto-reply/reply/dispatch-from-config.js"; +export { finalizeInboundContext } from "../auto-reply/reply/inbound-context.js"; +export { + buildPendingHistoryContextFromMap, + clearHistoryEntries, + DEFAULT_GROUP_HISTORY_LIMIT, + recordPendingHistoryEntry, +} from "../auto-reply/reply/history.js"; +export type { HistoryEntry } from "../auto-reply/reply/history.js"; +export { buildMentionRegexes, matchesMentionPatterns } from "../auto-reply/reply/mentions.js"; +export { createReplyDispatcherWithTyping } from "../auto-reply/reply/reply-dispatcher.js"; +export { resolveEffectiveMessagesConfig, resolveHumanDelayConfig } from "../agents/identity.js"; +export { mergeAllowlist, summarizeMapping } from "../channels/allowlists/resolve-utils.js"; +export { resolveCommandAuthorizedFromAuthorizers } from "../channels/command-gating.js"; +export { resolveMentionGating } from "../channels/mention-gating.js"; +export { + buildChannelKeyCandidates, + normalizeChannelSlug, + resolveChannelEntryMatch, + resolveChannelEntryMatchWithFallback, + resolveNestedAllowlistDecision, +} from "../channels/plugins/channel-config.js"; +export type { AllowlistMatch } from "../channels/plugins/allowlist-match.js"; +export { formatAllowlistMatchMeta } from "../channels/plugins/allowlist-match.js"; +export { readChannelAllowFromStore, upsertChannelPairingRequest } from "../pairing/pairing-store.js"; +export { resolveAgentRoute } from "../routing/resolve-route.js"; +export { recordSessionMetaFromInbound, resolveStorePath, updateLastRoute } from "../config/sessions.js"; +export { resolveStateDir } from "../config/paths.js"; +export { loadConfig } from "../config/config.js"; +export { danger } from "../globals.js"; +export { logVerbose, shouldLogVerbose } from "../globals.js"; +export { getChildLogger } from "../logging.js"; +export { enqueueSystemEvent } from "../infra/system-events.js"; +export { runCommandWithTimeout } from "../process/exec.js"; +export { loadWebMedia } from "../web/media.js"; +export { isVoiceCompatibleAudio } from "../media/audio.js"; +export { mediaKindFromMime } from "../media/constants.js"; +export { detectMime } from "../media/mime.js"; +export { getImageMetadata, resizeToJpeg } from "../media/image-ops.js"; +export { saveMediaBuffer } from "../media/store.js"; +export type { PollInput } from "../polls.js"; export { buildChannelConfigSchema } from "../channels/plugins/config-schema.js"; export { @@ -63,7 +133,10 @@ export { applyAccountNameToChannelSection } from "../channels/plugins/setup-help export { formatPairingApproveHint } from "../channels/plugins/helpers.js"; export { PAIRING_APPROVED_MESSAGE } from "../channels/plugins/pairing-message.js"; -export type { ChannelOnboardingAdapter } from "../channels/plugins/onboarding-types.js"; +export type { + ChannelOnboardingAdapter, + ChannelOnboardingDmPolicy, +} from "../channels/plugins/onboarding-types.js"; export { addWildcardAllowFrom } from "../channels/plugins/onboarding/helpers.js"; export { promptChannelAccessConfig } from "../channels/plugins/onboarding/channel-access.js"; @@ -74,5 +147,7 @@ export { readReactionParams, readStringParam, } from "../agents/tools/common.js"; +export { createMemoryGetTool, createMemorySearchTool } from "../agents/tools/memory-tool.js"; +export { registerMemoryCli } from "../cli/memory-cli.js"; export { formatDocsLink } from "../terminal/links.js"; diff --git a/src/plugins/loader.ts b/src/plugins/loader.ts index 304c58c90..5011c13bf 100644 --- a/src/plugins/loader.ts +++ b/src/plugins/loader.ts @@ -1,3 +1,6 @@ +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; import { createJiti } from "jiti"; import type { ClawdbotConfig } from "../config/config.js"; @@ -92,6 +95,24 @@ const normalizePluginsConfig = (config?: ClawdbotConfig["plugins"]): NormalizedP }; }; +const resolvePluginSdkAlias = (): string | null => { + try { + let cursor = path.dirname(fileURLToPath(import.meta.url)); + for (let i = 0; i < 6; i += 1) { + const distCandidate = path.join(cursor, "dist", "plugin-sdk", "index.js"); + if (fs.existsSync(distCandidate)) return distCandidate; + const srcCandidate = path.join(cursor, "src", "plugin-sdk", "index.ts"); + if (fs.existsSync(srcCandidate)) return srcCandidate; + const parent = path.dirname(cursor); + if (parent === cursor) break; + cursor = parent; + } + } catch { + // ignore + } + return null; +}; + function buildCacheKey(params: { workspaceDir?: string; plugins: NormalizedPluginsConfig; @@ -289,8 +310,10 @@ export function loadClawdbotPlugins(options: PluginLoadOptions = {}): PluginRegi }); pushDiagnostics(registry.diagnostics, discovery.diagnostics); + const pluginSdkAlias = resolvePluginSdkAlias(); const jiti = createJiti(import.meta.url, { interopDefault: true, + ...(pluginSdkAlias ? { alias: { "clawdbot/plugin-sdk": pluginSdkAlias } } : {}), }); const seenIds = new Map(); diff --git a/src/plugins/runtime/index.ts b/src/plugins/runtime/index.ts index 8fffa415a..0ded31ea6 100644 --- a/src/plugins/runtime/index.ts +++ b/src/plugins/runtime/index.ts @@ -6,6 +6,7 @@ import { createInboundDebouncer, resolveInboundDebounceMs } from "../../auto-rep import { buildMentionRegexes, matchesMentionPatterns } from "../../auto-reply/reply/mentions.js"; import { dispatchReplyWithBufferedBlockDispatcher } from "../../auto-reply/reply/provider-dispatcher.js"; import { createReplyDispatcherWithTyping } from "../../auto-reply/reply/reply-dispatcher.js"; +import { resolveEffectiveMessagesConfig, resolveHumanDelayConfig } from "../../agents/identity.js"; import { resolveCommandAuthorizedFromAuthorizers } from "../../channels/command-gating.js"; import { resolveChannelGroupPolicy, resolveChannelGroupRequireMention } from "../../config/group-policy.js"; import { resolveStateDir } from "../../config/paths.js"; @@ -46,6 +47,8 @@ export function createPluginRuntime(): PluginRuntime { reply: { dispatchReplyWithBufferedBlockDispatcher, createReplyDispatcherWithTyping, + resolveEffectiveMessagesConfig, + resolveHumanDelayConfig, }, routing: { resolveAgentRoute, diff --git a/src/plugins/runtime/types.ts b/src/plugins/runtime/types.ts index 39ef343ac..9b3ac02e2 100644 --- a/src/plugins/runtime/types.ts +++ b/src/plugins/runtime/types.ts @@ -25,6 +25,15 @@ export type PluginRuntime = { }; }) => Promise; createReplyDispatcherWithTyping: (...args: unknown[]) => unknown; + resolveEffectiveMessagesConfig: ( + cfg: ClawdbotConfig, + agentId: string, + opts?: { hasAllowFrom?: boolean; fallbackMessagePrefix?: string }, + ) => { messagePrefix: string; responsePrefix?: string }; + resolveHumanDelayConfig: ( + cfg: ClawdbotConfig, + agentId: string, + ) => { mode?: string; minMs?: number; maxMs?: number } | undefined; }; routing: { resolveAgentRoute: (params: { diff --git a/src/tui/.DS_Store b/src/tui/.DS_Store new file mode 100644 index 000000000..bd3ae4b5e Binary files /dev/null and b/src/tui/.DS_Store differ diff --git a/src/web/.DS_Store b/src/web/.DS_Store new file mode 100644 index 000000000..597a2f3c4 Binary files /dev/null and b/src/web/.DS_Store differ