@2en/clawly-plugins 1.32.0 → 1.33.1

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/auto-pair.ts CHANGED
@@ -37,7 +37,15 @@ export function registerAutoPair(api: PluginApi) {
37
37
 
38
38
  api.on('gateway_start', async () => {
39
39
  try {
40
- sdk = await import('openclaw/plugin-sdk')
40
+ // v2026.3.23+ moved pairing functions to device-bootstrap subpath;
41
+ // older versions export them from the main plugin-sdk index.
42
+ try {
43
+ sdk = await import('openclaw/plugin-sdk/device-bootstrap')
44
+ } catch (err: unknown) {
45
+ const code = (err as NodeJS.ErrnoException)?.code
46
+ if (code !== 'ERR_MODULE_NOT_FOUND' && code !== 'ERR_PACKAGE_PATH_NOT_EXPORTED') throw err
47
+ sdk = await import('openclaw/plugin-sdk')
48
+ }
41
49
  } catch {
42
50
  api.logger.warn('auto-pair: openclaw/plugin-sdk not available, skipping')
43
51
  return
@@ -77,6 +77,13 @@
77
77
  contextWindow: 196608,
78
78
  maxTokens: 196608,
79
79
  },
80
+ {
81
+ id: "qwen/qwen3.5-flash-02-23",
82
+ name: "qwen/qwen3.5-flash-02-23",
83
+ input: ["text", "image"],
84
+ contextWindow: 1000000,
85
+ maxTokens: 65536,
86
+ },
80
87
  {
81
88
  id: "qwen/qwen3.5-plus-02-15",
82
89
  name: "qwen/qwen3.5-plus-02-15",
package/index.ts CHANGED
@@ -55,6 +55,7 @@ import {
55
55
  registerOutboundHttpRoute,
56
56
  registerOutboundMethods,
57
57
  } from './http/file/outbound'
58
+ import {registerMediaUnderstanding} from './media-understanding'
58
59
  import {registerSkillCommandRestore} from './skill-command-restore'
59
60
  import {registerTools} from './tools'
60
61
  import type {PluginApi} from './types'
@@ -83,6 +84,7 @@ export default {
83
84
  registerGateway(api)
84
85
  registerAutoPair(api)
85
86
  registerAutoUpdate(api)
87
+ registerMediaUnderstanding(api)
86
88
 
87
89
  // Email & calendar (optional — requires API base URL + token)
88
90
  const gw = getGatewayConfig(api)
@@ -0,0 +1,44 @@
1
+ import {PROVIDER_NAME} from './model-gateway-setup'
2
+ import type {PluginApi} from './types'
3
+
4
+ type MediaSdk = {
5
+ describeImageWithModel: (...args: unknown[]) => Promise<unknown>
6
+ describeImagesWithModel: (...args: unknown[]) => Promise<unknown>
7
+ }
8
+
9
+ let sdkPromise: Promise<MediaSdk | null> | null = null
10
+
11
+ function loadSdk(logger: PluginApi['logger']): Promise<MediaSdk | null> {
12
+ if (!sdkPromise) {
13
+ sdkPromise = import('openclaw/plugin-sdk/media-understanding').catch((err: unknown) => {
14
+ const code = (err as NodeJS.ErrnoException)?.code
15
+ if (code === 'ERR_MODULE_NOT_FOUND' || code === 'ERR_PACKAGE_PATH_NOT_EXPORTED') {
16
+ logger.warn(
17
+ 'media-understanding: openclaw/plugin-sdk/media-understanding not available, skipping',
18
+ )
19
+ return null
20
+ }
21
+ throw err
22
+ })
23
+ }
24
+ return sdkPromise
25
+ }
26
+
27
+ export function registerMediaUnderstanding(api: PluginApi): void {
28
+ if (!api.registerMediaUnderstandingProvider) return
29
+
30
+ api.registerMediaUnderstandingProvider({
31
+ id: PROVIDER_NAME,
32
+ capabilities: ['image'],
33
+ describeImage: async (...args: unknown[]) => {
34
+ const sdk = await loadSdk(api.logger)
35
+ if (!sdk) return undefined
36
+ return sdk.describeImageWithModel(...args)
37
+ },
38
+ describeImages: async (...args: unknown[]) => {
39
+ const sdk = await loadSdk(api.logger)
40
+ if (!sdk) return undefined
41
+ return sdk.describeImagesWithModel(...args)
42
+ },
43
+ })
44
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@2en/clawly-plugins",
3
- "version": "1.32.0",
3
+ "version": "1.33.1",
4
4
  "module": "index.ts",
5
5
  "type": "module",
6
6
  "repository": {
@@ -34,6 +34,7 @@
34
34
  "email.ts",
35
35
  "gateway-fetch.ts",
36
36
  "http",
37
+ "media-understanding.ts",
37
38
  "model-gateway-setup.ts",
38
39
  "resolve-gateway-credentials.ts",
39
40
  "skill-command-restore.ts",
package/types.ts CHANGED
@@ -256,6 +256,14 @@ export type PluginApi = {
256
256
  stop?: (...args: unknown[]) => void | Promise<void>
257
257
  }) => void
258
258
  registerProvider: (provider: Record<string, unknown>) => void
259
+ registerMediaUnderstandingProvider?: (provider: {
260
+ id: string
261
+ capabilities?: Array<'image' | 'audio' | 'video'>
262
+ describeImage?: (...args: unknown[]) => Promise<unknown>
263
+ describeImages?: (...args: unknown[]) => Promise<unknown>
264
+ transcribeAudio?: (...args: unknown[]) => Promise<unknown>
265
+ describeVideo?: (...args: unknown[]) => Promise<unknown>
266
+ }) => void
259
267
  registerContextEngine: (id: string, factory: (...args: unknown[]) => unknown) => void
260
268
  resolvePath: (input: string) => string
261
269
  on: <K extends PluginHookName>(