@wox-launcher/wox-plugin 0.0.98 → 0.0.102

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wox-launcher/wox-plugin",
3
- "version": "0.0.98",
3
+ "version": "0.0.102",
4
4
  "description": "All nodejs plugin for Wox should use types in this package",
5
5
  "repository": {
6
6
  "type": "git",
package/types/ai.d.ts CHANGED
@@ -1,21 +1,21 @@
1
- export namespace AI {
2
- export type ConversationRole = "user" | "system"
3
- export type ChatStreamDataType = "streaming" | "finished" | "error"
4
-
5
- export interface Conversation {
6
- Role: ConversationRole
7
- Text: string
8
- Timestamp: number
9
- }
10
-
11
- export interface ChatStreamData {
12
- /** Stream status */
13
- Status: ChatStreamDataType
14
- /** Aggregated content data */
15
- Data: string
16
- /** Reasoning content from models that support reasoning (e.g., DeepSeek, OpenAI o1). Separate from Data for clean processing. */
17
- Reasoning: string
18
- }
19
-
20
- export type ChatStreamFunc = (streamData: ChatStreamData) => void
21
- }
1
+ export namespace AI {
2
+ export type ConversationRole = "user" | "system"
3
+ export type ChatStreamDataType = "streaming" | "finished" | "error"
4
+
5
+ export interface Conversation {
6
+ Role: ConversationRole
7
+ Text: string
8
+ Timestamp: number
9
+ }
10
+
11
+ export interface ChatStreamData {
12
+ /** Stream status */
13
+ Status: ChatStreamDataType
14
+ /** Aggregated content data */
15
+ Data: string
16
+ /** Reasoning content from models that support reasoning (e.g., DeepSeek, OpenAI o1). Separate from Data for clean processing. */
17
+ Reasoning: string
18
+ }
19
+
20
+ export type ChatStreamFunc = (streamData: ChatStreamData) => void
21
+ }
package/types/index.d.ts CHANGED
@@ -1,484 +1,515 @@
1
- import { MetadataCommand, PluginSettingDefinitionItem } from "./setting.js"
2
- import { AI } from "./ai.js"
3
-
4
- export type MapString = { [key: string]: string }
5
-
6
- export type Platform = "windows" | "darwin" | "linux"
7
-
8
- export interface Plugin {
9
- init: (ctx: Context, initParams: PluginInitParams) => Promise<void>
10
- query: (ctx: Context, query: Query) => Promise<Result[]>
11
- }
12
-
13
- export interface Selection {
14
- Type: "text" | "file"
15
- // Only available when Type is text
16
- Text: string
17
- // Only available when Type is file
18
- FilePaths: string[]
19
- }
20
-
21
- export interface QueryEnv {
22
- /**
23
- * Active window title when user query
24
- */
25
- ActiveWindowTitle: string
26
-
27
- /**
28
- * Active window pid when user query, 0 if not available
29
- */
30
- ActiveWindowPid: number
31
-
32
- /**
33
- * Active window icon when user query, may be empty
34
- */
35
- ActiveWindowIcon: WoxImage
36
-
37
- // active browser url when user query
38
- // Only available when active window is browser and https://github.com/Wox-launcher/Wox.Chrome.Extension is installed
39
- ActiveBrowserUrl: string
40
- }
41
-
42
- export interface Query {
43
- /**
44
- * By default, Wox will only pass input query to plugin.
45
- * plugin author need to enable MetadataFeatureQuerySelection feature to handle selection query
46
- */
47
- Type: "input" | "selection"
48
- /**
49
- * Raw query, this includes trigger keyword if it has
50
- * We didn't recommend use this property directly. You should always use Search property.
51
- *
52
- * NOTE: Only available when query type is input
53
- */
54
- RawQuery: string
55
- /**
56
- * Trigger keyword of a query. It can be empty if user is using global trigger keyword.
57
- *
58
- * NOTE: Only available when query type is input
59
- */
60
- TriggerKeyword?: string
61
- /**
62
- * Command part of a query.
63
- *
64
- * NOTE: Only available when query type is input
65
- */
66
- Command?: string
67
- /**
68
- * Search part of a query.
69
- *
70
- * NOTE: Only available when query type is input
71
- */
72
- Search: string
73
-
74
- /**
75
- * User selected or drag-drop data, can be text or file or image etc
76
- *
77
- * NOTE: Only available when query type is selection
78
- */
79
- Selection: Selection
80
-
81
- /**
82
- * Additional query environment data
83
- * expose more context env data to plugin, E.g. plugin A only show result when active window title is "Chrome"
84
- */
85
- Env: QueryEnv
86
-
87
- /**
88
- * Whether current query is global query
89
- */
90
- IsGlobalQuery(): boolean
91
- }
92
-
93
- export interface Result {
94
- Id?: string
95
- Title: string
96
- SubTitle?: string
97
- Icon: WoxImage
98
- Preview?: WoxPreview
99
- Score?: number
100
- Group?: string
101
- GroupScore?: number
102
- Tails?: ResultTail[]
103
- ContextData?: string
104
- Actions?: ResultAction[]
105
- }
106
-
107
- export interface ResultTail {
108
- Type: "text" | "image"
109
- Text?: string
110
- Image?: WoxImage
111
- /** Tail id, should be unique. It's optional, if you don't set it, Wox will assign a random id for you */
112
- Id?: string
113
- /** Additional data associate with this tail, can be retrieved later */
114
- ContextData?: string
115
- }
116
-
117
- /**
118
- * Result that can be updated directly in the UI.
119
- *
120
- * All fields except Id are optional. Only non-undefined fields will be updated.
121
- *
122
- * Example usage:
123
- * ```typescript
124
- * // Update only the title
125
- * const success = await api.updateResult(ctx, {
126
- * Id: resultId,
127
- * Title: "Downloading... 50%"
128
- * })
129
- *
130
- * // Update title and tails
131
- * const success = await api.updateResult(ctx, {
132
- * Id: resultId,
133
- * Title: "Processing...",
134
- * Tails: [{ Type: "text", Text: "Step 1/3" }]
135
- * })
136
- * ```
137
- */
138
- export interface UpdatableResult {
139
- /** Required - identifies which result to update */
140
- Id: string
141
- /** Optional - update the title */
142
- Title?: string
143
- /** Optional - update the subtitle */
144
- SubTitle?: string
145
- /** Optional - update the tails */
146
- Tails?: ResultTail[]
147
- /** Optional - update the preview */
148
- Preview?: WoxPreview
149
- /** Optional - update the actions */
150
- Actions?: ResultAction[]
151
- }
152
-
153
- export type ResultActionType = "execute" | "form"
154
-
155
- export type ResultAction = ExecuteResultAction | FormResultAction
156
-
157
- export interface ExecuteResultAction {
158
- /**
159
- * Result id, should be unique. It's optional, if you don't set it, Wox will assign a random id for you
160
- */
161
- Id?: string
162
- Type?: "execute"
163
- Name: string
164
- Icon?: WoxImage
165
- /**
166
- * If true, Wox will use this action as default action. There can be only one default action in results
167
- * This can be omitted, if you don't set it, Wox will use the first action as default action
168
- */
169
- IsDefault?: boolean
170
- /**
171
- * If true, Wox will not hide after user select this result
172
- */
173
- PreventHideAfterAction?: boolean
174
- Action: (actionContext: ActionContext) => Promise<void>
175
- /**
176
- * Hotkey to trigger this action. E.g. "ctrl+Shift+Space", "Ctrl+1", "Command+K"
177
- * Case insensitive, space insensitive
178
- *
179
- * If IsDefault is true, Hotkey will be set to enter key by default
180
- */
181
- Hotkey?: string
182
- /**
183
- * Additional data associate with this action, can be retrieved later
184
- */
185
- ContextData?: string
186
- }
187
-
188
- export interface FormResultAction {
189
- /**
190
- * Result id, should be unique. It's optional, if you don't set it, Wox will assign a random id for you
191
- */
192
- Id?: string
193
- Type: "form"
194
- Name: string
195
- Icon?: WoxImage
196
- /**
197
- * If true, Wox will use this action as default action. There can be only one default action in results
198
- * This can be omitted, if you don't set it, Wox will use the first action as default action
199
- */
200
- IsDefault?: boolean
201
- /**
202
- * If true, Wox will not hide after user select this result
203
- */
204
- PreventHideAfterAction?: boolean
205
- Form: PluginSettingDefinitionItem[]
206
- OnSubmit: (actionContext: FormActionContext) => Promise<void>
207
- /**
208
- * Hotkey to trigger this action. E.g. "ctrl+Shift+Space", "Ctrl+1", "Command+K"
209
- * Case insensitive, space insensitive
210
- *
211
- * If IsDefault is true, Hotkey will be set to enter key by default
212
- */
213
- Hotkey?: string
214
- /**
215
- * Additional data associate with this action, can be retrieved later
216
- */
217
- ContextData?: string
218
- }
219
-
220
- export interface ActionContext {
221
- /**
222
- * The ID of the result that triggered this action
223
- * This is automatically set by Wox when the action is invoked
224
- * Useful for calling UpdateResult API to update the result's UI
225
- */
226
- ResultId: string
227
- /**
228
- * The ID of the action that was triggered
229
- * This is automatically set by Wox when the action is invoked
230
- * Useful for calling UpdateResult API to update this action's UI
231
- */
232
- ResultActionId: string
233
- /**
234
- * Additional data associated with this result
235
- */
236
- ContextData: string
237
- }
238
-
239
- export interface FormActionContext extends ActionContext {
240
- Values: Record<string, string>
241
- }
242
-
243
- export interface MRUData {
244
- PluginID: string
245
- Title: string
246
- SubTitle: string
247
- Icon: WoxImage
248
- ContextData: string
249
- }
250
-
251
- export interface PluginInitParams {
252
- API: PublicAPI
253
- PluginDirectory: string
254
- }
255
-
256
- export interface ChangeQueryParam {
257
- QueryType: "input" | "selection"
258
- QueryText?: string
259
- QuerySelection?: Selection
260
- }
261
-
262
- export interface RefreshQueryParam {
263
- /**
264
- * Controls whether to maintain the previously selected item index after refresh.
265
- * When true, the user's current selection index in the results list is preserved.
266
- * When false, the selection resets to the first item (index 0).
267
- */
268
- PreserveSelectedIndex: boolean
269
- }
270
-
271
- export interface PublicAPI {
272
- /**
273
- * Change Wox query
274
- */
275
- ChangeQuery: (ctx: Context, query: ChangeQueryParam) => Promise<void>
276
-
277
- /**
278
- * Hide Wox
279
- */
280
- HideApp: (ctx: Context) => Promise<void>
281
-
282
- /**
283
- * Show Wox
284
- */
285
- ShowApp: (ctx: Context) => Promise<void>
286
-
287
- /**
288
- * Check if Wox window is currently visible
289
- */
290
- IsVisible: (ctx: Context) => Promise<boolean>
291
-
292
- /**
293
- * Notify message
294
- */
295
- Notify: (ctx: Context, message: string) => Promise<void>
296
-
297
- /**
298
- * Write log
299
- */
300
- Log: (ctx: Context, level: "Info" | "Error" | "Debug" | "Warning", msg: string) => Promise<void>
301
-
302
- /**
303
- * Get translation of current language
304
- */
305
- GetTranslation: (ctx: Context, key: string) => Promise<string>
306
-
307
- /**
308
- * Get customized setting
309
- *
310
- * will try to get platform specific setting first, if not found, will try to get global setting
311
- */
312
- GetSetting: (ctx: Context, key: string) => Promise<string>
313
-
314
- /**
315
- * Save customized setting
316
- *
317
- * @isPlatformSpecific If true, setting will be only saved in current platform. If false, setting will be available in all platforms
318
- */
319
- SaveSetting: (ctx: Context, key: string, value: string, isPlatformSpecific: boolean) => Promise<void>
320
-
321
- /**
322
- * Register setting changed callback
323
- */
324
- OnSettingChanged: (ctx: Context, callback: (key: string, value: string) => void) => Promise<void>
325
-
326
- /**
327
- * Get dynamic setting definition
328
- */
329
- OnGetDynamicSetting: (ctx: Context, callback: (key: string) => PluginSettingDefinitionItem) => Promise<void>
330
-
331
- /**
332
- * Register deep link callback
333
- */
334
- OnDeepLink: (ctx: Context, callback: (arguments: MapString) => void) => Promise<void>
335
-
336
- /**
337
- * Register on load event
338
- */
339
- OnUnload: (ctx: Context, callback: () => Promise<void>) => Promise<void>
340
-
341
- /**
342
- * Register query commands
343
- */
344
- RegisterQueryCommands: (ctx: Context, commands: MetadataCommand[]) => Promise<void>
345
-
346
- /**
347
- * Chat using LLM
348
- */
349
- LLMStream: (ctx: Context, conversations: AI.Conversation[], callback: AI.ChatStreamFunc) => Promise<void>
350
-
351
- /**
352
- * Register MRU restore callback
353
- * @param ctx Context
354
- * @param callback Callback function that takes MRUData and returns Result or null
355
- * Return null if the MRU data is no longer valid
356
- */
357
- OnMRURestore: (ctx: Context, callback: (mruData: MRUData) => Promise<Result | null>) => Promise<void>
358
-
359
- /**
360
- * Get the current state of a result that is displayed in the UI.
361
- *
362
- * Returns UpdatableResult with current values if the result is still visible.
363
- * Returns null if the result is no longer visible.
364
- *
365
- * Note: System actions and tails (like favorite icon) are automatically filtered out.
366
- * They will be re-added by the system when you call UpdateResult().
367
- *
368
- * Example:
369
- * ```typescript
370
- * // In an action handler
371
- * Action: async (actionContext) => {
372
- * // Get current result state
373
- * const updatableResult = await api.GetUpdatableResult(ctx, actionContext.ResultId)
374
- * if (updatableResult === null) {
375
- * return // Result no longer visible
376
- * }
377
- *
378
- * // Modify the result
379
- * updatableResult.Title = "Updated title"
380
- * updatableResult.Tails?.push({ Type: "text", Text: "New tail" })
381
- *
382
- * // Update the result
383
- * await api.UpdateResult(ctx, updatableResult)
384
- * }
385
- * ```
386
- *
387
- * @param ctx Context
388
- * @param resultId ID of the result to get
389
- * @returns Promise<UpdatableResult | null> Current result state, or null if not visible
390
- */
391
- GetUpdatableResult: (ctx: Context, resultId: string) => Promise<UpdatableResult | null>
392
-
393
- /**
394
- * Update a query result that is currently displayed in the UI.
395
- *
396
- * Returns true if the result was successfully updated (still visible in UI).
397
- * Returns false if the result is no longer visible.
398
- *
399
- * This method is designed for long-running operations within Action handlers.
400
- * Best practices:
401
- * - Set PreventHideAfterAction: true in your action
402
- * - Only use during action execution or in background tasks spawned by actions
403
- * - For periodic updates, start a timer in init() and track result IDs
404
- *
405
- * Example:
406
- * ```typescript
407
- * // In an action handler
408
- * Action: async (actionContext) => {
409
- * // Update only the title
410
- * const success = await api.UpdateResult(ctx, {
411
- * Id: actionContext.ResultId,
412
- * Title: "Downloading... 50%"
413
- * })
414
- *
415
- * // Update title and tails
416
- * const success = await api.UpdateResult(ctx, {
417
- * Id: actionContext.ResultId,
418
- * Title: "Processing...",
419
- * Tails: [{ Type: "text", Text: "Step 1/3" }]
420
- * })
421
- * }
422
- * ```
423
- *
424
- * @param ctx Context
425
- * @param result UpdatableResult with Id (required) and optional fields to update
426
- * @returns Promise<boolean> True if updated successfully, false if result no longer visible
427
- */
428
- UpdateResult: (ctx: Context, result: UpdatableResult) => Promise<boolean>
429
-
430
- /**
431
- * Re-execute the current query with the existing query text.
432
- * This is useful when plugin data changes and you want to update the displayed results.
433
- *
434
- * Example - Refresh after marking item as favorite:
435
- * ```typescript
436
- * Action: async (actionContext) => {
437
- * markAsFavorite(item)
438
- * // Refresh query and preserve user's current selection
439
- * await api.RefreshQuery(ctx, { PreserveSelectedIndex: true })
440
- * }
441
- * ```
442
- *
443
- * Example - Refresh after deleting item:
444
- * ```typescript
445
- * Action: async (actionContext) => {
446
- * deleteItem(item)
447
- * // Refresh query and reset to first item
448
- * await api.RefreshQuery(ctx, { PreserveSelectedIndex: false })
449
- * }
450
- * ```
451
- *
452
- * @param ctx Context
453
- * @param param RefreshQueryParam to control refresh behavior
454
- */
455
- RefreshQuery: (ctx: Context, param: RefreshQueryParam) => Promise<void>
456
- }
457
-
458
- export type WoxImageType = "absolute" | "relative" | "base64" | "svg" | "url" | "emoji" | "lottie"
459
-
460
- export interface WoxImage {
461
- ImageType: WoxImageType
462
- ImageData: string
463
- }
464
-
465
- export type WoxPreviewType = "markdown" | "text" | "image" | "url" | "file"
466
-
467
- export interface WoxPreview {
468
- PreviewType: WoxPreviewType
469
- PreviewData: string
470
- PreviewProperties: Record<string, string>
471
- }
472
-
473
- export declare interface Context {
474
- Values: { [key: string]: string }
475
- Get: (key: string) => string | undefined
476
- Set: (key: string, value: string) => void
477
- Exists: (key: string) => boolean
478
- }
479
-
480
- export function NewContext(): Context
481
-
482
- export function NewContextWithValue(key: string, value: string): Context
483
-
484
- export function NewBase64WoxImage(imageData: string): WoxImage
1
+ import { MetadataCommand, PluginSettingDefinitionItem } from "./setting.js"
2
+ import { AI } from "./ai.js"
3
+
4
+ export type MapString = { [key: string]: string }
5
+
6
+ export type Platform = "windows" | "darwin" | "linux"
7
+
8
+ export interface Plugin {
9
+ init: (ctx: Context, initParams: PluginInitParams) => Promise<void>
10
+ query: (ctx: Context, query: Query) => Promise<Result[]>
11
+ }
12
+
13
+ export interface Selection {
14
+ Type: "text" | "file"
15
+ // Only available when Type is text
16
+ Text: string
17
+ // Only available when Type is file
18
+ FilePaths: string[]
19
+ }
20
+
21
+ export interface QueryEnv {
22
+ /**
23
+ * Active window title when user query
24
+ */
25
+ ActiveWindowTitle: string
26
+
27
+ /**
28
+ * Active window pid when user query, 0 if not available
29
+ */
30
+ ActiveWindowPid: number
31
+
32
+ /**
33
+ * Active window icon when user query, may be empty
34
+ */
35
+ ActiveWindowIcon: WoxImage
36
+
37
+ // active browser url when user query
38
+ // Only available when active window is browser and https://github.com/Wox-launcher/Wox.Chrome.Extension is installed
39
+ ActiveBrowserUrl: string
40
+ }
41
+
42
+ export interface Query {
43
+ /**
44
+ * Query id passed from UI to correlate async updates.
45
+ */
46
+ Id: string
47
+ /**
48
+ * By default, Wox will only pass input query to plugin.
49
+ * plugin author need to enable MetadataFeatureQuerySelection feature to handle selection query
50
+ */
51
+ Type: "input" | "selection"
52
+ /**
53
+ * Raw query, this includes trigger keyword if it has
54
+ * We didn't recommend use this property directly. You should always use Search property.
55
+ *
56
+ * NOTE: Only available when query type is input
57
+ */
58
+ RawQuery: string
59
+ /**
60
+ * Trigger keyword of a query. It can be empty if user is using global trigger keyword.
61
+ *
62
+ * NOTE: Only available when query type is input
63
+ */
64
+ TriggerKeyword?: string
65
+ /**
66
+ * Command part of a query.
67
+ *
68
+ * NOTE: Only available when query type is input
69
+ */
70
+ Command?: string
71
+ /**
72
+ * Search part of a query.
73
+ *
74
+ * NOTE: Only available when query type is input
75
+ */
76
+ Search: string
77
+
78
+ /**
79
+ * User selected or drag-drop data, can be text or file or image etc
80
+ *
81
+ * NOTE: Only available when query type is selection
82
+ */
83
+ Selection: Selection
84
+
85
+ /**
86
+ * Additional query environment data
87
+ * expose more context env data to plugin, E.g. plugin A only show result when active window title is "Chrome"
88
+ */
89
+ Env: QueryEnv
90
+
91
+ /**
92
+ * Whether current query is global query
93
+ */
94
+ IsGlobalQuery(): boolean
95
+ }
96
+
97
+ export interface Result {
98
+ Id?: string
99
+ Title: string
100
+ SubTitle?: string
101
+ Icon: WoxImage
102
+ Preview?: WoxPreview
103
+ Score?: number
104
+ Group?: string
105
+ GroupScore?: number
106
+ Tails?: ResultTail[]
107
+ ContextData?: string
108
+ Actions?: ResultAction[]
109
+ }
110
+
111
+ export interface ResultTail {
112
+ Type: "text" | "image"
113
+ Text?: string
114
+ Image?: WoxImage
115
+ /** Tail id, should be unique. It's optional, if you don't set it, Wox will assign a random id for you */
116
+ Id?: string
117
+ /** Additional data associate with this tail, can be retrieved later */
118
+ ContextData?: string
119
+ }
120
+
121
+ /**
122
+ * Result that can be updated directly in the UI.
123
+ *
124
+ * All fields except Id are optional. Only non-undefined fields will be updated.
125
+ *
126
+ * Example usage:
127
+ * ```typescript
128
+ * // Update only the title
129
+ * const success = await api.updateResult(ctx, {
130
+ * Id: resultId,
131
+ * Title: "Downloading... 50%"
132
+ * })
133
+ *
134
+ * // Update title and tails
135
+ * const success = await api.updateResult(ctx, {
136
+ * Id: resultId,
137
+ * Title: "Processing...",
138
+ * Tails: [{ Type: "text", Text: "Step 1/3" }]
139
+ * })
140
+ * ```
141
+ */
142
+ export interface UpdatableResult {
143
+ /** Required - identifies which result to update */
144
+ Id: string
145
+ /** Optional - update the title */
146
+ Title?: string
147
+ /** Optional - update the subtitle */
148
+ SubTitle?: string
149
+ /** Optional - update the tails */
150
+ Tails?: ResultTail[]
151
+ /** Optional - update the preview */
152
+ Preview?: WoxPreview
153
+ /** Optional - update the actions */
154
+ Actions?: ResultAction[]
155
+ }
156
+
157
+ export type ResultActionType = "execute" | "form"
158
+
159
+ export type ResultAction = ExecuteResultAction | FormResultAction
160
+
161
+ export interface ExecuteResultAction {
162
+ /**
163
+ * Result id, should be unique. It's optional, if you don't set it, Wox will assign a random id for you
164
+ */
165
+ Id?: string
166
+ Type?: "execute"
167
+ Name: string
168
+ Icon?: WoxImage
169
+ /**
170
+ * If true, Wox will use this action as default action. There can be only one default action in results
171
+ * This can be omitted, if you don't set it, Wox will use the first action as default action
172
+ */
173
+ IsDefault?: boolean
174
+ /**
175
+ * If true, Wox will not hide after user select this result
176
+ */
177
+ PreventHideAfterAction?: boolean
178
+ Action: (actionContext: ActionContext) => Promise<void>
179
+ /**
180
+ * Hotkey to trigger this action. E.g. "ctrl+Shift+Space", "Ctrl+1", "Command+K"
181
+ * Case insensitive, space insensitive
182
+ *
183
+ * If IsDefault is true, Hotkey will be set to enter key by default
184
+ */
185
+ Hotkey?: string
186
+ /**
187
+ * Additional data associate with this action, can be retrieved later
188
+ */
189
+ ContextData?: string
190
+ }
191
+
192
+ export interface FormResultAction {
193
+ /**
194
+ * Result id, should be unique. It's optional, if you don't set it, Wox will assign a random id for you
195
+ */
196
+ Id?: string
197
+ Type: "form"
198
+ Name: string
199
+ Icon?: WoxImage
200
+ /**
201
+ * If true, Wox will use this action as default action. There can be only one default action in results
202
+ * This can be omitted, if you don't set it, Wox will use the first action as default action
203
+ */
204
+ IsDefault?: boolean
205
+ /**
206
+ * If true, Wox will not hide after user select this result
207
+ */
208
+ PreventHideAfterAction?: boolean
209
+ Form: PluginSettingDefinitionItem[]
210
+ OnSubmit: (actionContext: FormActionContext) => Promise<void>
211
+ /**
212
+ * Hotkey to trigger this action. E.g. "ctrl+Shift+Space", "Ctrl+1", "Command+K"
213
+ * Case insensitive, space insensitive
214
+ *
215
+ * If IsDefault is true, Hotkey will be set to enter key by default
216
+ */
217
+ Hotkey?: string
218
+ /**
219
+ * Additional data associate with this action, can be retrieved later
220
+ */
221
+ ContextData?: string
222
+ }
223
+
224
+ export interface ActionContext {
225
+ /**
226
+ * The ID of the result that triggered this action
227
+ * This is automatically set by Wox when the action is invoked
228
+ * Useful for calling UpdateResult API to update the result's UI
229
+ */
230
+ ResultId: string
231
+ /**
232
+ * The ID of the action that was triggered
233
+ * This is automatically set by Wox when the action is invoked
234
+ * Useful for calling UpdateResult API to update this action's UI
235
+ */
236
+ ResultActionId: string
237
+ /**
238
+ * Additional data associated with this result
239
+ */
240
+ ContextData: string
241
+ }
242
+
243
+ export interface FormActionContext extends ActionContext {
244
+ Values: Record<string, string>
245
+ }
246
+
247
+ export interface MRUData {
248
+ PluginID: string
249
+ Title: string
250
+ SubTitle: string
251
+ Icon: WoxImage
252
+ ContextData: string
253
+ }
254
+
255
+ export interface PluginInitParams {
256
+ API: PublicAPI
257
+ PluginDirectory: string
258
+ }
259
+
260
+ export interface ChangeQueryParam {
261
+ QueryType: "input" | "selection"
262
+ QueryText?: string
263
+ QuerySelection?: Selection
264
+ }
265
+
266
+ export interface RefreshQueryParam {
267
+ /**
268
+ * Controls whether to maintain the previously selected item index after refresh.
269
+ * When true, the user's current selection index in the results list is preserved.
270
+ * When false, the selection resets to the first item (index 0).
271
+ */
272
+ PreserveSelectedIndex: boolean
273
+ }
274
+
275
+ export type CopyType = "text" | "image"
276
+
277
+ export interface CopyParams {
278
+ type: CopyType
279
+ text: string
280
+ woxImage?: WoxImage
281
+ }
282
+
283
+ export interface PublicAPI {
284
+ /**
285
+ * Change Wox query
286
+ */
287
+ ChangeQuery: (ctx: Context, query: ChangeQueryParam) => Promise<void>
288
+
289
+ /**
290
+ * Hide Wox
291
+ */
292
+ HideApp: (ctx: Context) => Promise<void>
293
+
294
+ /**
295
+ * Show Wox
296
+ */
297
+ ShowApp: (ctx: Context) => Promise<void>
298
+
299
+ /**
300
+ * Check if Wox window is currently visible
301
+ */
302
+ IsVisible: (ctx: Context) => Promise<boolean>
303
+
304
+ /**
305
+ * Notify message
306
+ */
307
+ Notify: (ctx: Context, message: string) => Promise<void>
308
+
309
+ /**
310
+ * Write log
311
+ */
312
+ Log: (ctx: Context, level: "Info" | "Error" | "Debug" | "Warning", msg: string) => Promise<void>
313
+
314
+ /**
315
+ * Get translation of current language
316
+ */
317
+ GetTranslation: (ctx: Context, key: string) => Promise<string>
318
+
319
+ /**
320
+ * Get customized setting
321
+ *
322
+ * will try to get platform specific setting first, if not found, will try to get global setting
323
+ */
324
+ GetSetting: (ctx: Context, key: string) => Promise<string>
325
+
326
+ /**
327
+ * Save customized setting
328
+ *
329
+ * @isPlatformSpecific If true, setting will be only saved in current platform. If false, setting will be available in all platforms
330
+ */
331
+ SaveSetting: (ctx: Context, key: string, value: string, isPlatformSpecific: boolean) => Promise<void>
332
+
333
+ /**
334
+ * Register setting changed callback
335
+ */
336
+ OnSettingChanged: (ctx: Context, callback: (key: string, value: string) => void) => Promise<void>
337
+
338
+ /**
339
+ * Get dynamic setting definition
340
+ */
341
+ OnGetDynamicSetting: (ctx: Context, callback: (key: string) => PluginSettingDefinitionItem) => Promise<void>
342
+
343
+ /**
344
+ * Register deep link callback
345
+ */
346
+ OnDeepLink: (ctx: Context, callback: (arguments: MapString) => void) => Promise<void>
347
+
348
+ /**
349
+ * Register on load event
350
+ */
351
+ OnUnload: (ctx: Context, callback: () => Promise<void>) => Promise<void>
352
+
353
+ /**
354
+ * Register query commands
355
+ */
356
+ RegisterQueryCommands: (ctx: Context, commands: MetadataCommand[]) => Promise<void>
357
+
358
+ /**
359
+ * Chat using LLM
360
+ */
361
+ LLMStream: (ctx: Context, conversations: AI.Conversation[], callback: AI.ChatStreamFunc) => Promise<void>
362
+
363
+ /**
364
+ * Register MRU restore callback
365
+ * @param ctx Context
366
+ * @param callback Callback function that takes MRUData and returns Result or null
367
+ * Return null if the MRU data is no longer valid
368
+ */
369
+ OnMRURestore: (ctx: Context, callback: (mruData: MRUData) => Promise<Result | null>) => Promise<void>
370
+
371
+ /**
372
+ * Get the current state of a result that is displayed in the UI.
373
+ *
374
+ * Returns UpdatableResult with current values if the result is still visible.
375
+ * Returns null if the result is no longer visible.
376
+ *
377
+ * Note: System actions and tails (like favorite icon) are automatically filtered out.
378
+ * They will be re-added by the system when you call UpdateResult().
379
+ *
380
+ * Example:
381
+ * ```typescript
382
+ * // In an action handler
383
+ * Action: async (actionContext) => {
384
+ * // Get current result state
385
+ * const updatableResult = await api.GetUpdatableResult(ctx, actionContext.ResultId)
386
+ * if (updatableResult === null) {
387
+ * return // Result no longer visible
388
+ * }
389
+ *
390
+ * // Modify the result
391
+ * updatableResult.Title = "Updated title"
392
+ * updatableResult.Tails?.push({ Type: "text", Text: "New tail" })
393
+ *
394
+ * // Update the result
395
+ * await api.UpdateResult(ctx, updatableResult)
396
+ * }
397
+ * ```
398
+ *
399
+ * @param ctx Context
400
+ * @param resultId ID of the result to get
401
+ * @returns Promise<UpdatableResult | null> Current result state, or null if not visible
402
+ */
403
+ GetUpdatableResult: (ctx: Context, resultId: string) => Promise<UpdatableResult | null>
404
+
405
+ /**
406
+ * Update a query result that is currently displayed in the UI.
407
+ *
408
+ * Returns true if the result was successfully updated (still visible in UI).
409
+ * Returns false if the result is no longer visible.
410
+ *
411
+ * This method is designed for long-running operations within Action handlers.
412
+ * Best practices:
413
+ * - Set PreventHideAfterAction: true in your action
414
+ * - Only use during action execution or in background tasks spawned by actions
415
+ * - For periodic updates, start a timer in init() and track result IDs
416
+ *
417
+ * Example:
418
+ * ```typescript
419
+ * // In an action handler
420
+ * Action: async (actionContext) => {
421
+ * // Update only the title
422
+ * const success = await api.UpdateResult(ctx, {
423
+ * Id: actionContext.ResultId,
424
+ * Title: "Downloading... 50%"
425
+ * })
426
+ *
427
+ * // Update title and tails
428
+ * const success = await api.UpdateResult(ctx, {
429
+ * Id: actionContext.ResultId,
430
+ * Title: "Processing...",
431
+ * Tails: [{ Type: "text", Text: "Step 1/3" }]
432
+ * })
433
+ * }
434
+ * ```
435
+ *
436
+ * @param ctx Context
437
+ * @param result UpdatableResult with Id (required) and optional fields to update
438
+ * @returns Promise<boolean> True if updated successfully, false if result no longer visible
439
+ */
440
+ UpdateResult: (ctx: Context, result: UpdatableResult) => Promise<boolean>
441
+
442
+ /**
443
+ * Push additional results for the current query.
444
+ *
445
+ * Returns true if UI accepted the results (query still active),
446
+ * false if query is no longer active.
447
+ *
448
+ * @param ctx Context
449
+ * @param query Current query
450
+ * @param results Results to append
451
+ */
452
+ PushResults: (ctx: Context, query: Query, results: Result[]) => Promise<boolean>
453
+
454
+ /**
455
+ * Re-execute the current query with the existing query text.
456
+ * This is useful when plugin data changes and you want to update the displayed results.
457
+ *
458
+ * Example - Refresh after marking item as favorite:
459
+ * ```typescript
460
+ * Action: async (actionContext) => {
461
+ * markAsFavorite(item)
462
+ * // Refresh query and preserve user's current selection
463
+ * await api.RefreshQuery(ctx, { PreserveSelectedIndex: true })
464
+ * }
465
+ * ```
466
+ *
467
+ * Example - Refresh after deleting item:
468
+ * ```typescript
469
+ * Action: async (actionContext) => {
470
+ * deleteItem(item)
471
+ * // Refresh query and reset to first item
472
+ * await api.RefreshQuery(ctx, { PreserveSelectedIndex: false })
473
+ * }
474
+ * ```
475
+ *
476
+ * @param ctx Context
477
+ * @param param RefreshQueryParam to control refresh behavior
478
+ */
479
+ RefreshQuery: (ctx: Context, param: RefreshQueryParam) => Promise<void>
480
+
481
+ /**
482
+ * Copy text or image to clipboard
483
+ * @param ctx Context
484
+ * @param params CopyParams
485
+ */
486
+ Copy: (ctx: Context, params: CopyParams) => Promise<void>
487
+ }
488
+
489
+ export type WoxImageType = "absolute" | "relative" | "base64" | "svg" | "url" | "emoji" | "lottie"
490
+
491
+ export interface WoxImage {
492
+ ImageType: WoxImageType
493
+ ImageData: string
494
+ }
495
+
496
+ export type WoxPreviewType = "markdown" | "text" | "image" | "url" | "file"
497
+
498
+ export interface WoxPreview {
499
+ PreviewType: WoxPreviewType
500
+ PreviewData: string
501
+ PreviewProperties: Record<string, string>
502
+ }
503
+
504
+ export declare interface Context {
505
+ Values: { [key: string]: string }
506
+ Get: (key: string) => string | undefined
507
+ Set: (key: string, value: string) => void
508
+ Exists: (key: string) => boolean
509
+ }
510
+
511
+ export function NewContext(): Context
512
+
513
+ export function NewContextWithValue(key: string, value: string): Context
514
+
515
+ export function NewBase64WoxImage(imageData: string): WoxImage
@@ -1,97 +1,97 @@
1
- import { Context, Platform } from "./index.js"
2
-
3
- export type PluginSettingDefinitionType = "head" | "textbox" | "checkbox" | "select" | "label" | "newline" | "table" | "dynamic"
4
-
5
-
6
- export interface PluginSettingValueStyle {
7
- PaddingLeft: number
8
- PaddingTop: number
9
- PaddingRight: number
10
- PaddingBottom: number
11
-
12
- Width: number
13
- LabelWidth: number // if has label, E.g. select, checkbox, textbox
14
- }
15
-
16
- export interface PluginSettingDefinitionValue {
17
- GetKey: () => string
18
- GetDefaultValue: () => string
19
- Translate: (translator: (ctx: Context, key: string) => string) => void
20
- }
21
-
22
- export interface PluginSettingDefinitionItem {
23
- Type: PluginSettingDefinitionType
24
- Value: PluginSettingDefinitionValue
25
- DisabledInPlatforms: Platform[]
26
- IsPlatformSpecific: boolean // if true, this setting may be different in different platforms
27
- }
28
-
29
- export interface MetadataCommand {
30
- Command: string
31
- Description: string
32
- }
33
-
34
- export interface PluginSettingValueCheckBox extends PluginSettingDefinitionValue {
35
- Key: string
36
- Label: string
37
- DefaultValue: string
38
- Tooltip: string
39
- Style: PluginSettingValueStyle
40
- }
41
-
42
- export interface PluginSettingValueDynamic extends PluginSettingDefinitionValue {
43
- Key: string
44
- }
45
-
46
- export interface PluginSettingValueHead extends PluginSettingDefinitionValue {
47
- Content: string
48
- Tooltip: string
49
- Style: PluginSettingValueStyle
50
- }
51
-
52
- export interface PluginSettingValueLabel extends PluginSettingDefinitionValue {
53
- Content: string
54
- Tooltip: string
55
- Style: PluginSettingValueStyle
56
- }
57
-
58
- export interface PluginSettingValueNewline extends PluginSettingDefinitionValue {
59
- Style: PluginSettingValueStyle
60
- }
61
-
62
- export interface PluginSettingValueSelect extends PluginSettingDefinitionValue {
63
- Key: string
64
- Label: string
65
- Suffix: string
66
- DefaultValue: string
67
- Tooltip: string
68
- Options: PluginSettingValueSelectOption[]
69
- Validators: PluginSettingValidator[] // validators for this setting, every validator should be satisfied
70
-
71
- Style: PluginSettingValueStyle
72
- }
73
-
74
- export interface PluginSettingValueSelectOption {
75
- Label: string
76
- Value: string
77
- }
78
-
79
- export type PluginSettingValidatorType = "is_number" | "not_empty"
80
-
81
- export interface PluginSettingValidator {
82
- Type: PluginSettingValidatorType
83
- Value: PluginSettingValidatorValue
84
- }
85
-
86
- export interface PluginSettingValidatorValue {
87
- GetValidatorType(): PluginSettingValidatorType
88
- }
89
-
90
- export interface PluginSettingValidatorIsNumber extends PluginSettingValidatorValue {
91
- IsInteger: boolean
92
- IsFloat: boolean
93
- }
94
-
95
- export interface PluginSettingValidatorNotEmpty extends PluginSettingValidatorValue {
96
-
97
- }
1
+ import { Context, Platform } from "./index.js"
2
+
3
+ export type PluginSettingDefinitionType = "head" | "textbox" | "checkbox" | "select" | "label" | "newline" | "table" | "dynamic"
4
+
5
+
6
+ export interface PluginSettingValueStyle {
7
+ PaddingLeft: number
8
+ PaddingTop: number
9
+ PaddingRight: number
10
+ PaddingBottom: number
11
+
12
+ Width: number
13
+ LabelWidth: number // if has label, E.g. select, checkbox, textbox
14
+ }
15
+
16
+ export interface PluginSettingDefinitionValue {
17
+ GetKey: () => string
18
+ GetDefaultValue: () => string
19
+ Translate: (translator: (ctx: Context, key: string) => string) => void
20
+ }
21
+
22
+ export interface PluginSettingDefinitionItem {
23
+ Type: PluginSettingDefinitionType
24
+ Value: PluginSettingDefinitionValue
25
+ DisabledInPlatforms: Platform[]
26
+ IsPlatformSpecific: boolean // if true, this setting may be different in different platforms
27
+ }
28
+
29
+ export interface MetadataCommand {
30
+ Command: string
31
+ Description: string
32
+ }
33
+
34
+ export interface PluginSettingValueCheckBox extends PluginSettingDefinitionValue {
35
+ Key: string
36
+ Label: string
37
+ DefaultValue: string
38
+ Tooltip: string
39
+ Style: PluginSettingValueStyle
40
+ }
41
+
42
+ export interface PluginSettingValueDynamic extends PluginSettingDefinitionValue {
43
+ Key: string
44
+ }
45
+
46
+ export interface PluginSettingValueHead extends PluginSettingDefinitionValue {
47
+ Content: string
48
+ Tooltip: string
49
+ Style: PluginSettingValueStyle
50
+ }
51
+
52
+ export interface PluginSettingValueLabel extends PluginSettingDefinitionValue {
53
+ Content: string
54
+ Tooltip: string
55
+ Style: PluginSettingValueStyle
56
+ }
57
+
58
+ export interface PluginSettingValueNewline extends PluginSettingDefinitionValue {
59
+ Style: PluginSettingValueStyle
60
+ }
61
+
62
+ export interface PluginSettingValueSelect extends PluginSettingDefinitionValue {
63
+ Key: string
64
+ Label: string
65
+ Suffix: string
66
+ DefaultValue: string
67
+ Tooltip: string
68
+ Options: PluginSettingValueSelectOption[]
69
+ Validators: PluginSettingValidator[] // validators for this setting, every validator should be satisfied
70
+
71
+ Style: PluginSettingValueStyle
72
+ }
73
+
74
+ export interface PluginSettingValueSelectOption {
75
+ Label: string
76
+ Value: string
77
+ }
78
+
79
+ export type PluginSettingValidatorType = "is_number" | "not_empty"
80
+
81
+ export interface PluginSettingValidator {
82
+ Type: PluginSettingValidatorType
83
+ Value: PluginSettingValidatorValue
84
+ }
85
+
86
+ export interface PluginSettingValidatorValue {
87
+ GetValidatorType(): PluginSettingValidatorType
88
+ }
89
+
90
+ export interface PluginSettingValidatorIsNumber extends PluginSettingValidatorValue {
91
+ IsInteger: boolean
92
+ IsFloat: boolean
93
+ }
94
+
95
+ export interface PluginSettingValidatorNotEmpty extends PluginSettingValidatorValue {
96
+
97
+ }