wox.plugin.nodejs/README.md
TypeScript type definitions and SDK for developing Wox plugins in TypeScript/JavaScript.
npm install wox-plugin
This example returns QueryResponse, so the plugin's plugin.json should set
MinWoxVersion to 2.0.4 or newer. Return Result[] directly if you need the
same plugin build to run on older Wox releases.
import { Plugin, Context, Query, QueryResponse, Result, NewContext, WoxImage } from "wox-plugin"
class MyPlugin implements Plugin {
private api: PublicAPI
async init(ctx: Context, initParams: PluginInitParams): Promise<void> {
this.api = initParams.API
await this.api.Log(ctx, "Info", "MyPlugin initialized")
}
async query(ctx: Context, query: Query): Promise<QueryResponse> {
const results: Result[] = []
for (const item of this.getItems(query.Search)) {
results.push({
Title: item.name,
SubTitle: item.description,
Icon: { ImageType: "emoji", ImageData: "🔍" },
Score: 100,
Actions: [
{
Name: "Open",
Icon: { ImageType: "emoji", ImageData: "🔗" },
IsDefault: true,
Action: async (ctx, actionCtx) => {
await this.openItem(item)
}
}
]
})
}
return { Results: results }
}
}
Every plugin must implement the Plugin interface:
interface Plugin {
init: (ctx: Context, initParams: PluginInitParams) => Promise<void>
query: (ctx: Context, query: Query) => Promise<QueryReturn>
}
Returning Result[] directly is deprecated. The Node.js host still accepts it
for compatibility with older Wox releases. Use QueryResponse only when
plugin.json declares MinWoxVersion >= 2.0.4 so results, refinements, and
layout hints are carried together.
When a plugin needs to control the preview width or grid layout, set
QueryResponse.Layout.ResultPreviewWidthRatio or QueryResponse.Layout.GridLayout.
The older resultPreviewWidthRatio and gridLayout metadata features are
deprecated because they can only describe static plugin or command defaults.
INPUT (typing) or SELECTION (selected content)EXECUTE (immediate) or FORM (show form)Supported image types:
absolute: Absolute file pathrelative: Path relative to plugin directorybase64: Base64 encoded image with data URI prefix (data:image/png;base64,...)svg: SVG string contenturl: HTTP/HTTPS URLemoji: Emoji characterlottie: Lottie animation JSON// Emoji icon
{ ImageType: "emoji", ImageData: "🔍" }
// Base64 image
{ ImageType: "base64", ImageData: "data:image/png;base64,iVBORw0..." }
// Relative path
{ ImageType: "relative", ImageData: "./icons/icon.png" }
Methods for interacting with Wox:
showApp(), hideApp(), isVisible(), notify()ShowToolbarMsg(), ClearToolbarMsg(), OnEnterPluginQuery(), OnLeavePluginQuery()changeQuery(), refreshQuery(), pushResults()getSetting(), saveSetting(), onSettingChanged()log()getTranslation()getUpdatableResult(), updateResult()llmStream()onMruRestore()onUnload(), onDeepLink()registerQueryCommands()copy()Actions are operations users can perform on results:
ResultAction({
name: "Copy",
icon: { ImageType: "emoji", ImageData: "📋" },
isDefault: true,
hotkey: "Ctrl+C",
action: async (ctx, actionCtx) => {
await this.copyToClipboard(actionCtx.contextData)
}
})
Define settings for your plugin:
const settings: PluginSettingDefinitionItem[] = [
{
Type: "textbox",
Value: {
Key: "apiKey",
Label: "API Key",
Suffix: "",
DefaultValue: "",
Tooltip: "Enter your API key",
MaxLines: 1,
Validators: []
} as PluginSettingValueTextBox,
DisabledInPlatforms: [],
IsPlatformSpecific: false
},
{
Type: "checkbox",
Value: {
Key: "enabled",
Label: "Enable Feature",
DefaultValue: "true",
Tooltip: ""
} as PluginSettingValueCheckBox,
DisabledInPlatforms: [],
IsPlatformSpecific: false
}
]
Style is deprecated and should not be used for new settings. Wox owns setting
spacing and control widths so plugin settings remain visually consistent.
Stream responses from AI models:
const conversations: AI.Conversation[] = [
{ Role: "system", Text: "You are a helpful assistant.", Timestamp: Date.now() },
{ Role: "user", Text: "Hello!", Timestamp: Date.now() }
]
await api.LLMStream(ctx, conversations, (data: AI.ChatStreamData) => {
if (data.Status === "streaming") {
console.log("Chunk:", data.Data)
} else if (data.Status === "finished") {
console.log("Complete:", data.Data)
}
})
Plugins must declare metadata in a plugin.json file:
{
"ID": "com.myplugin.example",
"Name": "My Plugin",
"Author": "Your Name",
"Version": "1.0.0",
"MinWoxVersion": "2.0.4",
"Runtime": "nodejs",
"Entry": "main.js",
"TriggerKeywords": ["my"],
"Description": "My awesome Wox plugin",
"Website": "https://github.com/user/myplugin",
"Icon": "https://example.com/icon.png",
"QueryRequirements": {
"AnyQuery": [
{
"SettingKey": "apiKey",
"Validators": [{ "Type": "not_empty" }],
"Message": "i18n:my_plugin_api_key_required"
}
],
"QueryWithoutCommand": [],
"QueryWithCommand": {
"download": [
{
"SettingKey": "downloadPath",
"Validators": [{ "Type": "not_empty" }]
}
]
}
}
}
plugin.query() with:
query.TriggerKeyword = "my"query.Command = ""query.Search = "query"QueryResponse when MinWoxVersion is at least 2.0.4