feat: add OpenClaw plugin skeleton / 新增 OpenClaw plugin skeleton
This commit is contained in:
33
src/adapters/openclaw-plugin-skeleton.ts
Normal file
33
src/adapters/openclaw-plugin-skeleton.ts
Normal file
@@ -0,0 +1,33 @@
|
||||
import { buildOpenClawTelegramMessageToolPayload } from "./openclaw-message-tool.js"
|
||||
import { handleOpenClawTelegramReplyEndInteraction } from "./openclaw-interactive-handler.ts"
|
||||
|
||||
export type OpenClawInteractiveRegistration = {
|
||||
namespace: string
|
||||
handler: (ctx: {
|
||||
callback: {
|
||||
data: string
|
||||
messageId: string
|
||||
chatId: string
|
||||
}
|
||||
conversationId: string
|
||||
sessionKey: string | null
|
||||
callbackId: string
|
||||
respond: {
|
||||
editButtons: (input: { buttons: { text: string; callback_data: string }[][] }) => Promise<void> | void
|
||||
reply: (input: { text: string }) => Promise<void> | void
|
||||
}
|
||||
}) => Promise<boolean>
|
||||
}
|
||||
|
||||
export function buildOpenClawReplyEndPresentation(target: string, text: string) {
|
||||
return buildOpenClawTelegramMessageToolPayload(target, text)
|
||||
}
|
||||
|
||||
export function createOpenClawReplyEndInteractiveRegistration(baseDir: string): OpenClawInteractiveRegistration {
|
||||
return {
|
||||
namespace: "rec",
|
||||
handler: async (ctx) => {
|
||||
return await handleOpenClawTelegramReplyEndInteraction(baseDir, ctx)
|
||||
},
|
||||
}
|
||||
}
|
||||
40
tests/openclaw-plugin-skeleton.test.mjs
Normal file
40
tests/openclaw-plugin-skeleton.test.mjs
Normal file
@@ -0,0 +1,40 @@
|
||||
import test from "node:test"
|
||||
import assert from "node:assert/strict"
|
||||
import fs from "node:fs"
|
||||
import os from "node:os"
|
||||
import path from "node:path"
|
||||
|
||||
import { buildOpenClawReplyEndPresentation, createOpenClawReplyEndInteractiveRegistration } from "../src/adapters/openclaw-plugin-skeleton.ts"
|
||||
|
||||
test("plugin skeleton builds OpenClaw message-tool presentation", () => {
|
||||
const payload = buildOpenClawReplyEndPresentation("864811879", "hello")
|
||||
assert.equal(payload.channel, "telegram")
|
||||
assert.equal(payload.target, "864811879")
|
||||
assert.equal(payload.presentation.blocks[1].type, "buttons")
|
||||
})
|
||||
|
||||
test("plugin skeleton interactive registration handles continue callback", async () => {
|
||||
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "reply-end-plugin-skel-"))
|
||||
const calls = []
|
||||
const registration = createOpenClawReplyEndInteractiveRegistration(tempDir)
|
||||
assert.equal(registration.namespace, "rec")
|
||||
|
||||
const handled = await registration.handler({
|
||||
callback: {
|
||||
data: "rec:continue",
|
||||
messageId: "99",
|
||||
chatId: "864811879",
|
||||
},
|
||||
conversationId: "864811879",
|
||||
sessionKey: "agent:main:main",
|
||||
callbackId: "cb-99",
|
||||
respond: {
|
||||
editButtons: async (input) => calls.push(["editButtons", input]),
|
||||
reply: async (input) => calls.push(["reply", input]),
|
||||
},
|
||||
})
|
||||
|
||||
assert.equal(handled, true)
|
||||
assert.equal(calls[0][0], "editButtons")
|
||||
assert.equal(calls[1][0], "reply")
|
||||
})
|
||||
Reference in New Issue
Block a user