Skip to content

SDK 类型与机器协议 ​

当前 SDK 0.1.0,hostApiMajor=1、protocolVersion=1。以下内容从宿主唯一来源同步。可下载类型声明和机器协议用于编辑器和工具;它们不能进入组件包。

本页完整列出调用形状;权限、失败、所有权和取消边界仍以宿主协议及关联专题为准。不要根据 TypeScript 通过推定操作已授权或设备已可用。

ts
/** WidgetWorkshop SDK 0.1.2; manifest requiredFeatures declares mandatory host features independently of SDK releases. */
/** 组件清单中的标准标签;小写英文标识以 protocol.json.contentTags 为准,未知清单值不展示或上传。 */
type WidgetTag = 'information' | 'productivity' | 'system' | 'files' | 'media' | 'decoration' | 'entertainment' | 'education' | 'lifestyle' | 'development';
type JsonValue = null | boolean | number | string | JsonValue[] | {[key: string]: JsonValue};
type WidgetCapability = 'external.open' | 'location' | 'notifications' | 'clipboard' | 'directory.write' | 'screen.capture';
interface WidgetContext {
  apiMajor: 1; features: string[]; limits: Record<string, number>;
  view: {kind:'main'|'panel';panelId?:string};
  instanceId: string; displayId: string; visible: boolean;
  /** 宿主实际显示语言,无需权限;与 Windows 区域格式 system.locale 分开。 */
  language: 'zh-CN' | 'en-US';
  /** 宿主实际昼夜主题,包含宿主覆盖;无需权限,与 system.theme 分开。 */
  theme: 'light' | 'dark';
  i18n: {defaultLanguage?: string; translations?: Record<string, Record<string, string>>};
  configuration: Record<string, JsonValue>; capabilities: Partial<Record<WidgetCapability, boolean>>;
  environment: WidgetEnvironment;
  system: SystemContext;
  audio: HostAudioPolicy;
  runtime: RuntimeInfo;
}
interface SystemContext {
  theme: 'light' | 'dark' | 'unknown'; locale: string | null;
  /** Windows 强调色 #RRGGBB;未采样或不可用为 null。 */
  accentColor: string | null;
  /** 系统文字大小倍率 1–2.25,与显示器 DPI 分开;不可用为 null。 */
  textScaleFactor: number | null;
  reducedMotion: boolean | null; highContrast: boolean | null; sessionLocked: boolean | null;
  power: {source: 'ac' | 'battery' | 'unknown'; energySaver: boolean | null};
}
/** muted 为实际原生状态,包含全局覆盖和实例静音。 */
interface HostAudioPolicy {muted: boolean;}
interface RuntimeInfo {engine: 'webview2'; version: string; platform: 'windows'; architecture: 'x64';}
interface CompatibilityReport {
  host: {features: string[]; limits: Record<string, number>; runtime: RuntimeInfo};
  apis: {dedicatedWorker: boolean; offscreenCanvas: boolean; webAssembly: boolean; audioContext: boolean; gamepad: boolean};
  devices: {webgl2: 'available' | 'unavailable'; audioPlayback: 'not-tested'; gamepadInput: 'not-tested'};
}
type InputRegion = {x:number; y:number; width:number; height:number; points?:never} |
  {points:{x:number; y:number}[]; x?:never; y?:never; width?:never; height?:never};
interface WidgetEnvironment {
  scale: number; editing: boolean; workArea: {width: number; height: number};
  bounds: {x: number; y: number; width: number; height: number};
}
interface HostError extends Error { code: string; }
interface SaveSummary {slot: string; revision: string; savedAt: number;}
interface SaveSnapshot extends SaveSummary {value: JsonValue;}
interface DirectoryEntry { name: string; relativePath: string; kind: 'directory' | 'file'; sizeBytes: number; modifiedAt: string; }
type Header = {name: string; value: string; secretBindingId?: never; prefix?: never} |
  {name: string; secretBindingId: string; prefix?: string; value?: never};
interface HostImage {mimeType:'image/png';bodyBase64:string;width:number;height:number;}
interface MediaSession {albumTitle:string;albumArtist:string;subtitle:string;trackNumber:number;albumTrackCount:number;genres:string[];playbackType:'music'|'video'|'image'|'unknown';timeline:{startMs:number;endMs:number;positionMs:number;minSeekMs:number;maxSeekMs:number;updatedAt:number};sessionId:string; title:string; artist:string; playback:'closed'|'opened'|'changing'|'stopped'|'playing'|'paused'|'unknown'; controls:{play:boolean; pause:boolean; next:boolean; previous:boolean; seek:boolean};}
interface Reminder {key:string; dueAt:number; expiresAt:number; title:string; body:string;}
interface WidgetContextMenuItem {id: string; label: string; enabled?: boolean; checked?: boolean;}
interface ImportedFile {fileId: string; name: string; sizeBytes: number;}
interface SelectedFiles {files: ImportedFile[];}
interface HostMethods {
  'screen.capture.open': [Record<string,never>,{captureId:string}];
  'screen.capture.read': [{captureId:string},{frame:HostImage|null}];
  'screen.capture.close': [{captureId:string},Record<string,never>];
  'desktop.pointer.get': [Record<string,never>,{position:{x:number;y:number}|null}];
  'desktop.windows.get': [Record<string,never>,{windows:{bounds:{x:number;y:number;width:number;height:number};foreground:boolean}[];truncated:boolean}];
  'system.activity.get': [Record<string,never>,{state:'active'|'idle'|'unknown'}];
  'audio.output.get': [Record<string,never>,{volume:number;muted:boolean}];
  'audio.output.set': [{volume:number;muted?:boolean}|{volume?:number;muted:boolean},{volume:number;muted:boolean}];
  'files.image': [{fileId:string;kind:'icon'|'thumbnail';size:number},HostImage];
  'directory.image': [{bindingId:string;relativePath:string;kind:'icon'|'thumbnail';size:number},HostImage];
  'clipboard.readImage': [Record<string,never>,{image:HostImage|null}];
  'clipboard.writeImage': [{bodyBase64:string},Record<string,never>];
  'clipboard.readHtml': [Record<string,never>,{html:string|null}];
  'clipboard.writeHtml': [{html:string;text:string},Record<string,never>];
  'clipboard.readFiles': [Record<string,never>,SelectedFiles];
  'media.artwork': [{sessionId:string},{image:HostImage|null}];

  'directory.write': [{bindingId:string;relativePath:string;bodyBase64:string;overwrite?:boolean},{writtenBytes:number}];
  'directory.mkdir': [{bindingId:string;relativePath:string},Record<string,never>];
  'directory.rename': [{bindingId:string;relativePath:string;newRelativePath:string},Record<string,never>];
  'directory.remove': [{bindingId:string;relativePath:string},Record<string,never>];
  'exports.startDrag': [{exportId:string},{accepted:boolean}];
  'shortcuts.setActions': [{actions:{id:string;label:string}[]},Record<string,never>];
  'audio.capture.open': [Record<string,never>,{captureId:string;sampleRate:number;channels:number;format:'float32le'}];
  'audio.capture.read': [{captureId:string;maxFrames:number},{bodyBase64:string;frames:number;droppedFrames:number}];
  'audio.capture.close': [{captureId:string},Record<string,never>];
  'panels.open': [{key:string;path:string;title:string;width:number;height:number},{panelId:string}];
  'panels.activate': [{panelId:string},{activated:boolean}];
  'panels.close': [{panelId:string},Record<string,never>];
  'panels.post': [{panelId:string;value:JsonValue},Record<string,never>];
  'credentials.set': [{key:string;value:string},Record<string,never>];
  'credentials.get': [{key:string},{found:boolean;value:string|null}];
  'credentials.remove': [{key:string},Record<string,never>];
  'credentials.clear': [Record<string,never>,Record<string,never>];
  'files.setDropEnabled': [{enabled:boolean}, Record<string,never>];
  'contextMenu.setItems': [{items: WidgetContextMenuItem[]}, Record<string, never>];
  'cache.get': [{key:string},{found:boolean;bodyBase64:string|null}];
  'cache.put': [{key:string;bodyBase64:string},Record<string,never>];
  'cache.remove': [{key:string},Record<string,never>];
  'cache.clear': [Record<string,never>,Record<string,never>];
  'reminders.set': [Reminder,Record<string,never>];
  'reminders.list': [Record<string,never>,{items:Reminder[]}];
  'reminders.remove': [{key:string},Record<string,never>];
  'reminders.clear': [Record<string,never>,Record<string,never>];
  'media.get': [Record<string,never>,{session:MediaSession|null}];
  'media.control': [{sessionId:string;command:'play'|'pause'|'next'|'previous';positionMs?:never}|{sessionId:string;command:'seek';positionMs:number},{accepted:boolean}];
  'clipboard.readText': [Record<string, never>, {text:string|null}];
  'clipboard.writeText': [{text: string}, Record<string, never>];
  'directory.watch.open': [{bindingId: string}, {watchId: string; revision: string; rescan: true}];
  'directory.watch.poll': [{watchId: string}, {watchId: string; revision: string; rescan: true}];
  'directory.watch.close': [{watchId: string}, Record<string, never>];
  'lifecycle.finishClose': [{token: string; success: boolean}, Record<string, never>];
  'network.open': [{url: string; method: string; headers: Header[]; bodyBase64?: string}, {streamId: string; status: number; headers: {name: string; value: string}[]; finalUrl: string}];
  'network.read': [{streamId: string; offset: number; length: number}, {offset: number; bodyBase64: string; eof: boolean}];
  'network.close': [{streamId: string}, Record<string, never>];
  'collaboration.publish': [{value: JsonValue}, {id: string}];
  'collaboration.get': [{afterId: string | null}, {found: boolean; id: string | null; value: JsonValue}];
  'saves.context': [Record<string, never>, {scope: 'installation'}];
  'saves.list': [Record<string, never>, {slots: SaveSummary[]}];
  'saves.load': [{slot: string}, {found: boolean; current: SaveSnapshot | null; previous: SaveSummary | null; recovered: boolean}];
  'saves.commit': [{slot: string; expectedRevision: string | null; value: JsonValue}, SaveSummary];
  'saves.restore': [{slot: string; expectedRevision: string}, SaveSummary];
  'files.open': [{multiple?:boolean}, ImportedFile | SelectedFiles];
  'assets.open': [{path: string}, {fileId: string; name: string; sizeBytes: number}];
  'exports.begin': [{name: string; sizeBytes: number}, {exportId: string}];
  'exports.write': [{exportId: string; offset: number; bodyBase64: string}, {writtenBytes: number}];
  'exports.save': [{exportId: string}, {name: string; sizeBytes: number}];
  'exports.close': [{exportId: string}, Record<string, never>];
  'files.read': [{fileId: string; offset: number; length: number}, {offset: number; bodyBase64: string; eof: boolean}];
  'files.close': [{fileId: string}, Record<string, never>];
  'window.setInputRegions': [{regions: InputRegion[]}, Record<string, never>];
  'window.beginDrag': [Record<string, never>, Record<string, never>];
  'notifications.show': [{title:string;body:string;actions?:{id:string;label:string}[]},{notificationId:string}];
  /** 撤下当前实例原文档的即时通知;有效引用重复调用成功,不代表已读。 */
  'notifications.dismiss': [{notificationId:string},Record<string,never>];
  'config.get': [Record<string, never>, Record<string, JsonValue>];
  'config.set': [{values: Record<string, JsonValue>}, Record<string, JsonValue>];
  'storage.get': [{key: string}, {found: boolean; value: JsonValue}];
  /** 实例/取消检查后先拒绝 JSON UTF-8 超过256 KiB的新值;合法首次写入仍完整校验磁盘记录与总额度。 */
  'storage.set': [{key: string; value: JsonValue}, Record<string, never>];
  /** 冷删除仅校验目标记录,不存在也成功;目标损坏仍失败,后续合法首次 set 仍完整校验配额。 */
  'storage.remove': [{key: string}, Record<string, never>];
  'window.setSize': [{width: number; height: number}, {width: number; height: number}];
  'window.moveTo': [{x: number; y: number}, Record<string, never>];
  'network.request': [{url: string; method: string; headers: Header[]; bodyBase64?: string}, {status: number; headers: {name: string; value: string}[]; bodyBase64: string; finalUrl: string}];
  'system.metrics.get': [Record<string, never>, {sampledAt: string; cpuPercent: number | null; memoryUsedBytes: number | null; memoryTotalBytes: number | null; disks: {id: string; label: string; totalBytes: number | null; freeBytes: number | null}[]; networkReceiveBytesPerSecond: number | null; networkSendBytesPerSecond: number | null}];
  'directory.list': [{bindingId: string; relativePath: string; cursor?: string | null}, {entries: DirectoryEntry[]; nextCursor: string | null}];
  'directory.read': [{bindingId: string; relativePath: string}, {bodyBase64: string}];
  'directory.cancel': [{cursor: string}, Record<string, never>];
  'target.open': [{bindingId: string; directoryBindingId?: never; relativePath?: never} |
    {directoryBindingId: string; relativePath: string; bindingId?: never}, Record<string, never>];
  'external.open': [{url: string}, Record<string, never>];
  'request.cancel': [{requestId: string}, Record<string, never>];
}
interface HostEvents {
  'shortcuts.triggered': {id:string};
  'notifications.activated': {notificationId:string;actionId:string|null};
  'panels.message': {panelId:string;value:JsonValue};
  'panels.closed': {panelId:string};
  'files.dropped': SelectedFiles;
  'files.dropFailed': {code:string;message:string};
  'contextMenu.selected': {id: string};
  'language.changed': {language: WidgetContext['language']};
  'theme.changed': {theme: WidgetContext['theme']};
  'lifecycle.closing': {token: string; reason: 'applicationExit'; remainingMs: number};
  'audio.changed': HostAudioPolicy;
  'system.changed': SystemContext;
  'lifecycle.changed': {state: 'suspending' | 'resumed' | 'locked' | 'unlocked'};
  'environment.changed': WidgetEnvironment;
  'config.changed': Record<string, JsonValue>; 'capabilities.changed': Partial<Record<WidgetCapability, boolean>>;
  'visibility.changed': {visible: boolean}; 'display.changed': {displayId: string}; 'error': HostError;
}
interface WidgetHost {
  readonly i18n: {readonly language: 'zh-CN' | 'en-US'; t(key: string): string};
  /** 正常退出前的一次有界保存机会,无退出否决权;每文档最多一份。 */
  onClosing(callback: (event: {reason: 'applicationExit'; remainingMs: number}) => void | Promise<void>): () => void;
  elapsedSince(savedAt: number, options?: {now?: number; maxMs?: number}): {elapsedMs: number; clockMovedBack: boolean; capped: boolean};
  ready: Promise<WidgetContext>; readonly context: WidgetContext | null;
  /** 本文档的探测报告;API 存在不等于内容实测成功,音频不会自动播放。 */
  compatibility(options?: {signal?: AbortSignal}): Promise<CompatibilityReport>;
  call(method: 'files.open', params: {multiple:true}, options?: {signal?:AbortSignal}): Promise<SelectedFiles>;
  call(method: 'files.open', params: {multiple?:false}, options?: {signal?:AbortSignal}): Promise<ImportedFile>;
  call<M extends 'config.get' | 'system.metrics.get'>(method: M): Promise<HostMethods[M][1]>;
  call<M extends keyof HostMethods>(method: M, params: HostMethods[M][0], options?: {signal?: AbortSignal}): Promise<HostMethods[M][1]>;
  on<E extends keyof HostEvents>(event: E, callback: (data: HostEvents[E]) => void): () => void;
}
declare const widgetHost: WidgetHost;
interface Window { widgetHost: WidgetHost; }

/** input.pointer 转发正常触摸/笔;input.normalizedCancel 的宿主取消为 isTrusted=false。
 * 取消不能用作用户手势;两项标志均不保证物理设备可用。 */

完整功能与限额 ​

两种语言共用同一机器协议。features 只代表宿主支持,不能证明授权、设备或内容实际可用。

json
{
  "protocolVersion": 1,
  "apiMajor": 1,
  "sdkVersion": "0.1.2",
  "features": [
    "i18n",
    "config.get",
    "config.set",
    "storage.get",
    "storage.set",
    "storage.remove",
    "window.setSize",
    "window.moveTo",
    "window.setInputRegions",
    "window.beginDrag",
    "files.open",
    "files.open.multiple",
    "files.drop",
    "files.setDropEnabled",
    "assets.open",
    "exports.begin",
    "exports.write",
    "exports.save",
    "exports.close",
    "files.read",
    "files.close",
    "network.request",
    "system.metrics.get",
    "directory.list",
    "directory.read",
    "directory.cancel",
    "target.open",
    "external.open",
    "request.cancel",
    "notifications.show",
    "notifications.dismiss",
    "webassembly",
    "location",
    "events",
    "context.visibility",
    "context.environment",
    "directory.snapshot",
    "network.safeRedirect",
    "dedicatedWorker",
    "memory.media",
    "context.system",
    "context.language",
    "context.theme",
    "context.system.accentColor",
    "context.system.textScaleFactor",
    "contextMenu.setItems",
    "context.lifecycle",
    "runtime.info",
    "saves.list",
    "saves.load",
    "saves.commit",
    "saves.restore",
    "network.open",
    "network.read",
    "network.close",
    "context.audio",
    "context.closing",
    "lifecycle.finishClose",
    "directory.watch.open",
    "directory.watch.poll",
    "directory.watch.close",
    "clipboard.writeText",
    "input.pointer",
    "input.normalizedCancel",
    "input.polygons",
    "media.get",
    "media.control",
    "reminders.set",
    "reminders.list",
    "reminders.remove",
    "reminders.clear",
    "cache.get",
    "cache.put",
    "cache.remove",
    "cache.clear",
    "saves.context",
    "collaboration.publish",
    "collaboration.get",
    "clipboard.readText",
    "directory.write",
    "directory.mkdir",
    "directory.rename",
    "directory.remove",
    "exports.startDrag",
    "shortcuts.setActions",
    "audio.capture.open",
    "audio.capture.read",
    "audio.capture.close",
    "notifications.actions",
    "panels.open",
    "panels.close",
    "panels.post",
    "credentials.set",
    "credentials.get",
    "credentials.remove",
    "credentials.clear",
    "panels.activate",
    "screen.capture.open",
    "screen.capture.read",
    "screen.capture.close",
    "desktop.pointer.get",
    "desktop.windows.get",
    "system.activity.get",
    "audio.output.get",
    "audio.output.set",
    "files.image",
    "clipboard.readImage",
    "clipboard.writeImage",
    "clipboard.readHtml",
    "clipboard.writeHtml",
    "clipboard.readFiles",
    "media.artwork",
    "directory.image"
  ],
  "limits": {
    "contextMenuItems": 16,
    "contextMenuIdCharacters": 64,
    "contextMenuLabelCharacters": 80,
    "maxMessageBytes": 8388608,
    "messagesPerSecond": 60,
    "messageBurst": 16,
    "messageBytesPerSecond": 8388608,
    "messageBytesBurst": 16777216,
    "globalMessagesPerSecond": 240,
    "globalMessageBurst": 64,
    "globalMessageBytesPerSecond": 33554432,
    "globalMessageBytesBurst": 67108864,
    "maxPendingRequests": 16,
    "requestTimeoutMs": 30000,
    "requestBodyBytes": 1048576,
    "responseBodyBytes": 4194304,
    "fileBytes": 4194304,
    "storageValueBytes": 262144,
    "storageInstanceBytes": 16777216,
    "directoryPageEntries": 100,
    "directorySnapshotEntries": 10000,
    "directorySnapshotBytes": 8388608,
    "directoryCursorTtlMs": 30000,
    "directorySnapshotsPerInstance": 4,
    "directorySnapshotsGlobal": 32,
    "directorySnapshotsBytesGlobal": 33554432,
    "notificationsPerInstallationPerMinute": 3,
    "notificationsGlobalPerMinute": 10,
    "notificationTitleUnits": 48,
    "notificationBodyUnits": 200,
    "inputRegions": 64,
    "inputPolygonPoints": 32,
    "inputPolygonVertices": 512,
    "importedFileBytes": 268435456,
    "fileChunkBytes": 65536,
    "exportBytes": 67108864,
    "exportsPerInstance": 2,
    "exportsGlobal": 16,
    "exportsBytesGlobal": 268435456,
    "filesPerInstance": 16,
    "fileBatchCount": 16,
    "fileBatchBytes": 268435456,
    "filesGlobal": 16,
    "fileIdleTtlMs": 30000,
    "fileTtlMs": 300000,
    "saveSnapshotBytes": 262144,
    "saveSlotsPerInstance": 8,
    "networkStreamBytes": 268435456,
    "networkChunkBytes": 65536,
    "networkStreamsPerInstance": 2,
    "networkStreamsGlobal": 16,
    "networkStreamIdleTtlMs": 30000,
    "networkStreamTtlMs": 300000,
    "networkHeaderEntries": 64,
    "audioScopeProcesses": 64,
    "audioDevices": 16,
    "audioSessions": 512,
    "audioInstallations": 64,
    "audioScopesPerInstallation": 16,
    "closingMs": 2000,
    "closingInstances": 64,
    "closingHandlers": 1,
    "directoryWatchesPerInstance": 2,
    "directoryWatchesGlobal": 16,
    "directoryWatchBufferBytes": 65536,
    "directoryWatchDebounceMs": 200,
    "directoryWatchIdleTtlMs": 30000,
    "directoryWatchTtlMs": 300000,
    "clipboardTextUnits": 32768,
    "clipboardTextBytes": 65536,
    "clipboardNativeUnits": 65536,
    "inputPointers": 8,
    "mediaSessionsGlobal": 64,
    "mediaSessionTtlMs": 60000,
    "mediaWaitMs": 3000,
    "mediaSampleMs": 1000,
    "mediaCommandsPerInstallationPerMinute": 30,
    "mediaCommandsGlobalPerMinute": 120,
    "remindersPerInstance": 8,
    "remindersPerInstallation": 32,
    "remindersGlobal": 128,
    "reminderHorizonMs": 2592000000,
    "reminderValidityMs": 86400000,
    "reminderWritesPerInstallationPerMinute": 30,
    "reminderWritesGlobalPerMinute": 120,
    "cacheItemBytes": 1048576,
    "cacheItemsPerInstance": 16,
    "cacheBytesPerInstance": 8388608,
    "cacheItemsPerInstallation": 64,
    "cacheBytesPerInstallation": 33554432,
    "cacheItemsGlobal": 256,
    "cacheBytesGlobal": 134217728,
    "cacheLifetimeMs": 604800000,
    "cacheWritesPerInstallationPerMinute": 30,
    "cacheWritesGlobalPerMinute": 120,
    "saveProfilesPerInstallation": 8,
    "saveProfileNameCharacters": 64,
    "saveProfileSelectionsPerInstallation": 256,
    "collaborationMessageBytes": 16384,
    "collaborationMessagesGlobal": 64,
    "collaborationBytesGlobal": 1048576,
    "collaborationLifetimeMs": 30000,
    "collaborationPublishesPerSecondPerInstallation": 4,
    "collaborationPublishesPerMinutePerInstallation": 60,
    "collaborationPublishesPerMinuteGlobal": 240,
    "clipboardReadsPerInstallationPerMinute": 60,
    "clipboardReadsGlobalPerMinute": 240,
    "clipboardWritesPerInstallationPerMinute": 30,
    "clipboardWritesGlobalPerMinute": 120,
    "directoryWriteBytes": 4194304,
    "exportDragFilesGlobal": 1,
    "widgetShortcutActions": 8,
    "widgetShortcutBindings": 128,
    "audioCaptureSessionsPerInstance": 1,
    "audioCaptureSessionsGlobal": 4,
    "audioCaptureReadFrames": 4096,
    "audioCaptureBufferSeconds": 1,
    "notificationActions": 3,
    "notificationActionRecords": 128,
    "notificationActionTtlMs": 600000,
    "panelsPerInstance": 2,
    "panelsGlobal": 16,
    "panelMessageBytes": 65536,
    "credentialKeysPerInstallation": 32,
    "credentialValueBytes": 32768,
    "credentialInstallationBytes": 262144,
    "screenCapturesPerInstance": 1,
    "screenCapturesGlobal": 2,
    "screenCaptureIdleMs": 30000,
    "screenCaptureLifetimeMs": 300000,
    "screenCaptureReadIntervalMs": 100,
    "screenCaptureSourcePixels": 16777216,
    "imageBytes": 4194304,
    "imageMaxSide": 2048,
    "fileImageMaxSide": 256,
    "clipboardHtmlBytes": 1048576,
    "clipboardImagePixels": 4194304,
    "desktopWindows": 128,
    "desktopWindowScan": 2048,
    "desktopPointerIntervalMs": 50,
    "desktopWindowsIntervalMs": 250,
    "systemActivityIntervalMs": 1000,
    "systemIdleThresholdMs": 60000,
    "audioOutputIntervalMs": 100
  },
  "request": {
    "id": "canonical decimal string 1..9007199254740991, strictly increasing per document",
    "params": "JSON object"
  },
  "events": {
    "files.dropped": "{files:{fileId:string,name:string,sizeBytes:number}[]}",
    "files.dropFailed": "{code:string,message:string}",
    "config.changed": "configuration object",
    "capabilities.changed": "Record<string, boolean>",
    "visibility.changed": "{visible:boolean}",
    "display.changed": "{displayId:string}",
    "environment.changed": "{scale:number,editing:boolean,workArea:{width:number,height:number},bounds:{x:number,y:number,width:number,height:number}}",
    "system.changed": "SystemContext",
    "lifecycle.changed": "{state:suspending|resumed|locked|unlocked}",
    "audio.changed": "{muted:boolean}",
    "lifecycle.closing": "{token:string,reason:applicationExit,remainingMs:number}",
    "language.changed": "{language:zh-CN|en-US}",
    "theme.changed": "{theme:light|dark}",
    "contextMenu.selected": "{id:string}",
    "shortcuts.triggered": "{id:string}",
    "notifications.activated": "{notificationId:string,actionId:string|null}",
    "panels.message": "{panelId:string,value:JsonValue}",
    "panels.closed": "{panelId:string}"
  },
  "packageRules": {
    "reservedFileNames": [
      "widget-host.js",
      "widget-host.d.ts",
      "protocol.json"
    ],
    "version": 1,
    "maxEntries": 10000,
    "maxFileBytes": 67108864,
    "maxPackageBytes": 268435456,
    "maxRelativePathCharacters": 1024,
    "maxDepth": 64,
    "manifestBytes": 262144,
    "previewBytes": 1048576,
    "previewDimension": 4096,
    "resourceTypes": [
      {
        "extensions": [
          ".html",
          ".htm"
        ],
        "mime": "text/html; charset=utf-8",
        "kind": "html"
      },
      {
        "extensions": [
          ".js",
          ".mjs"
        ],
        "mime": "text/javascript",
        "kind": "script"
      },
      {
        "extensions": [
          ".css"
        ],
        "mime": "text/css",
        "kind": "style"
      },
      {
        "extensions": [
          ".json"
        ],
        "mime": "application/json",
        "kind": "data"
      },
      {
        "extensions": [
          ".wasm"
        ],
        "mime": "application/wasm",
        "kind": "wasm"
      },
      {
        "extensions": [
          ".svg"
        ],
        "mime": "image/svg+xml",
        "kind": "image"
      },
      {
        "extensions": [
          ".png"
        ],
        "mime": "image/png",
        "kind": "image"
      },
      {
        "extensions": [
          ".jpg",
          ".jpeg"
        ],
        "mime": "image/jpeg",
        "kind": "image"
      },
      {
        "extensions": [
          ".webp"
        ],
        "mime": "image/webp",
        "kind": "image"
      },
      {
        "extensions": [
          ".gif"
        ],
        "mime": "image/gif",
        "kind": "image"
      },
      {
        "extensions": [
          ".woff2"
        ],
        "mime": "font/woff2",
        "kind": "font"
      },
      {
        "extensions": [
          ".woff"
        ],
        "mime": "font/woff",
        "kind": "font"
      },
      {
        "extensions": [
          ".mp4"
        ],
        "mime": "video/mp4",
        "kind": "media"
      },
      {
        "extensions": [
          ".webm"
        ],
        "mime": "video/webm",
        "kind": "media"
      },
      {
        "extensions": [
          ".mp3"
        ],
        "mime": "audio/mpeg",
        "kind": "media"
      },
      {
        "extensions": [
          ".wav"
        ],
        "mime": "audio/wav",
        "kind": "media"
      },
      {
        "extensions": [
          ".ico"
        ],
        "mime": "application/octet-stream",
        "kind": "image"
      },
      {
        "extensions": [
          ".ttf",
          ".otf"
        ],
        "mime": "application/octet-stream",
        "kind": "font"
      },
      {
        "extensions": [
          ".ogg"
        ],
        "mime": "application/octet-stream",
        "kind": "media"
      },
      {
        "extensions": [
          ".txt",
          ".map",
          ".bin",
          ".d.ts"
        ],
        "mime": "application/octet-stream",
        "kind": "data"
      }
    ],
    "referenceScan": {
      "fileBytes": 2097152,
      "totalBytes": 33554432,
      "maxReferences": 4096,
      "maxIssues": 256,
      "maxTokensPerFile": 100000,
      "maxUrlCharacters": 2048
    }
  },
  "contentTags": [
    {
      "name": "information",
      "enUS": "Information",
      "zhCN": "资讯"
    },
    {
      "name": "productivity",
      "enUS": "Productivity",
      "zhCN": "效率"
    },
    {
      "name": "system",
      "enUS": "System",
      "zhCN": "系统"
    },
    {
      "name": "files",
      "enUS": "Files",
      "zhCN": "文件"
    },
    {
      "name": "media",
      "enUS": "Media",
      "zhCN": "媒体"
    },
    {
      "name": "decoration",
      "enUS": "Decoration",
      "zhCN": "装饰"
    },
    {
      "name": "entertainment",
      "enUS": "Entertainment",
      "zhCN": "娱乐"
    },
    {
      "name": "education",
      "enUS": "Education",
      "zhCN": "教育"
    },
    {
      "name": "lifestyle",
      "enUS": "Lifestyle",
      "zhCN": "生活"
    },
    {
      "name": "development",
      "enUS": "Development",
      "zhCN": "开发"
    }
  ]
}

当前宿主协议 · SDK 0.1.1 · MIT