@solazah/solazah-runtime 0.0.156 → 0.0.158

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/types/Mail.d.ts CHANGED
@@ -29,27 +29,152 @@ export default class Mail {
29
29
  private transport;
30
30
  constructor(transport?: IpcRenderer);
31
31
  accounts: {
32
+ /**
33
+ * 列出所有已配置的邮箱账户(不含密码)。
34
+ *
35
+ * @returns 账户信息数组(MailAccountDto[]),各账户的 password 字段不返回。
36
+ */
32
37
  list: () => Promise<any>;
38
+ /**
39
+ * 按 id 取单个账户信息(不含密码)。
40
+ *
41
+ * @param id 账户唯一标识。
42
+ * @returns 账户信息(MailAccountDto);不存在返回 null。
43
+ */
33
44
  get: (id: string) => Promise<any>;
45
+ /**
46
+ * 新增邮箱账户,返回落库后的账户信息(含生成的 id)。
47
+ * 明文密码不入库,单独存本机 safeStorage 密钥库(不同步、不绑 Solazah 账号)。
48
+ *
49
+ * @param input 账户配置;email / password / imapHost / imapPort / smtpHost / smtpPort 为必填项,
50
+ * displayName 缺省取 email,imapSecure / smtpSecure 缺省 true。
51
+ * @returns 落库后的账户信息(MailAccountDto,不含密码)。
52
+ * @throws 必填项缺失报 MAIL_BAD_INPUT(400)。
53
+ */
34
54
  add: (input: MailAccountInput) => Promise<any>;
55
+ /**
56
+ * 局部更新账户;patch 只需带要改的字段,返回更新后的账户信息。
57
+ * 带 password 时同步刷新本机密钥库;任何改动都会丢弃该账户的现有 IMAP/SMTP 连接。
58
+ *
59
+ * @param id 账户唯一标识。
60
+ * @param patch 要更新的字段(Partial<MailAccountInput>),只传要改的字段即可。
61
+ * @returns 更新后的账户信息(MailAccountDto,不含密码)。
62
+ * @throws 账户不存在报 MAIL_ACCOUNT_NOT_FOUND(404)。
63
+ */
35
64
  update: (id: string, patch: Partial<MailAccountInput>) => Promise<any>;
65
+ /**
66
+ * 删除账户:断开 IMAP/SMTP 连接、清本机密钥库里的密码、删库记录。
67
+ *
68
+ * @param id 账户唯一标识;账户不存在也视为成功。
69
+ * @returns 始终返回 true。
70
+ */
36
71
  remove: (id: string) => Promise<any>;
72
+ /**
73
+ * 用入参临时建连,测试 IMAP + SMTP 是否可连可鉴权(不落库)。
74
+ *
75
+ * @param input 账户配置;必填项同 addAccount。
76
+ * @returns 通过返回 {ok:true, imap:true, smtp:true};失败返回 {ok:false, error} 供配置界面提示。
77
+ * @throws 必填项缺失报 MAIL_BAD_INPUT(400)。
78
+ */
37
79
  test: (input: MailAccountInput) => Promise<any>;
38
80
  };
39
81
  folders: {
82
+ /**
83
+ * 列出账户的邮箱文件夹(收件/已发/草稿/垃圾/归档等逻辑文件夹到真实路径的映射)。
84
+ *
85
+ * @param accountId 账户唯一标识。
86
+ * @returns 逻辑文件夹列表(MailFolderDto[]),含 id / path / name。
87
+ * @throws 账户不存在报 MAIL_ACCOUNT_NOT_FOUND(404)。
88
+ */
40
89
  list: (accountId: string) => Promise<any>;
41
90
  };
42
91
  messages: {
92
+ /**
93
+ * 拉取指定文件夹的邮件头列表(不含正文),按逻辑文件夹寻址。
94
+ * 会顺带刷新账户的 lastSyncAt。
95
+ *
96
+ * @param accountId 账户唯一标识。
97
+ * @param folder 逻辑文件夹:`inbox` / `sent` / `drafts` / `trash` / `junk` / `archive`。
98
+ * @param limit 返回条数上限,缺省 50。
99
+ * @param unseenOnly 为 true 时只返回未读邮件,缺省 false。
100
+ * @returns 邮件头列表(MailHeaderDto[]),不含正文。
101
+ * @throws 账户不存在报 MAIL_ACCOUNT_NOT_FOUND(404)。
102
+ */
43
103
  list: (accountId: string, folder: MailFolderId, limit?: number, unseenOnly?: boolean) => Promise<any>;
104
+ /**
105
+ * 读取单封邮件的完整正文(text/html、收发人、附件元信息)。
106
+ *
107
+ * @param accountId 账户唯一标识。
108
+ * @param folder 邮件所在逻辑文件夹。
109
+ * @param uid 邮件唯一标识(IMAP UID)。
110
+ * @returns 邮件完整正文(MailBodyDto),含 text / html / 收发人 / 附件元信息。
111
+ * @throws 账户不存在或 uid 无对应邮件时抛错。
112
+ */
44
113
  read: (accountId: string, folder: MailFolderId, uid: string) => Promise<any>;
114
+ /**
115
+ * 设置邮件的已读(seen)/星标(flagged)标记,只传要改的位。
116
+ *
117
+ * @param accountId 账户唯一标识。
118
+ * @param folder 邮件所在逻辑文件夹。
119
+ * @param uid 邮件唯一标识(IMAP UID)。
120
+ * @param flags 要修改的标记:`seen` 已读,`flagged` 星标;只传要改的字段即可。
121
+ * @returns 成功返回 true。
122
+ * @throws 账户不存在或 IMAP 操作失败时抛错。
123
+ */
45
124
  flag: (accountId: string, folder: MailFolderId, uid: string, flags: {
46
125
  seen?: boolean;
47
126
  flagged?: boolean;
48
127
  }) => Promise<any>;
128
+ /**
129
+ * 把邮件从当前文件夹移动到目标文件夹。
130
+ *
131
+ * @param accountId 账户唯一标识。
132
+ * @param folder 邮件当前所在的逻辑文件夹。
133
+ * @param uid 邮件唯一标识(IMAP UID)。
134
+ * @param target 目标逻辑文件夹。
135
+ * @returns 成功返回 true。
136
+ * @throws 账户不存在或 IMAP 操作失败时抛错。
137
+ */
49
138
  move: (accountId: string, folder: MailFolderId, uid: string, target: MailFolderId) => Promise<any>;
139
+ /**
140
+ * 删除指定文件夹里的一封邮件。
141
+ *
142
+ * @param accountId 账户唯一标识。
143
+ * @param folder 邮件所在逻辑文件夹。
144
+ * @param uid 邮件唯一标识(IMAP UID)。
145
+ * @returns 成功返回 true。
146
+ * @throws 账户不存在或 IMAP 操作失败时抛错。
147
+ */
50
148
  delete: (accountId: string, folder: MailFolderId, uid: string) => Promise<any>;
51
149
  };
150
+ /**
151
+ * 通过账户的 SMTP 发送一封邮件。
152
+ * 投递成功后会尽力把副本追加到「已发送」文件夹(追加失败不影响发信结果)。
153
+ *
154
+ * @param accountId 账户唯一标识。
155
+ * @param input 发信参数:to / subject 必填,cc / bcc / text / html / inReplyTo 可选。
156
+ * @returns 发送结果,含 `messageId`(SMTP 返回的 message-id)。
157
+ * @throws 账户不存在或 SMTP 投递失败时抛错。
158
+ */
52
159
  send: (accountId: string, input: SendMailInput) => Promise<any>;
160
+ /**
161
+ * 把邮件存到账户的「草稿箱」文件夹。
162
+ * 传相同 draftKey 会先清掉该 key 的旧草稿再存新的(实现同一草稿的覆盖更新)。
163
+ *
164
+ * @param accountId 账户唯一标识。
165
+ * @param input 邮件内容(SendMailInput)。
166
+ * @param draftKey 草稿标识;传相同值实现覆盖更新,省略则新建草稿。
167
+ * @returns `{ok: true, uid?: string}`,uid 为草稿邮件的 IMAP UID(新建时有值)。
168
+ * @throws 账户不存在或账户没有草稿箱时报错。
169
+ */
53
170
  saveDraft: (accountId: string, input: SendMailInput, draftKey?: string) => Promise<any>;
171
+ /**
172
+ * 按 draftKey 从草稿箱删除对应草稿。
173
+ *
174
+ * @param accountId 账户唯一标识。
175
+ * @param key 草稿标识(draftKey);草稿不存在也视为成功。
176
+ * @returns 始终返回 true。
177
+ * @throws 账户不存在报 MAIL_ACCOUNT_NOT_FOUND(404)。
178
+ */
54
179
  discardDraft: (accountId: string, key: string) => Promise<any>;
55
180
  }
package/types/Plugin.d.ts CHANGED
@@ -20,13 +20,74 @@ export default class Plugin {
20
20
  tool: (name: string, description: string, schema: string, cb: any) => any;
21
21
  onSearch: (commandName: string, handler: any) => Promise<void>;
22
22
  onAction: (commandName: string, action: string, handler: any) => Promise<void>;
23
+ /**
24
+ * 切换发起方插件窗口的开发者工具(DevTools)显示/隐藏。
25
+ * 操作发起方 webContents,不传任何参数;已打开则关闭,已关闭则打开。
26
+ *
27
+ * @returns 无返回。
28
+ */
23
29
  toggleDevTools: () => Promise<any>;
30
+ /**
31
+ * 把发起方插件窗口的高度设为指定像素值,宽度不变。
32
+ *
33
+ * @param height 目标高度(像素)。
34
+ * @returns 无返回。窗口不存在时静默忽略。
35
+ */
24
36
  setHeight: (height: number) => Promise<any>;
37
+ /**
38
+ * 把发起方插件的当前视图移入一个浮动窗口(floating)承载并显示到前台。
39
+ * 浮窗按插件名(带当前视图 hash)缓存复用;插件视图未加载时不做任何操作。
40
+ *
41
+ * @param options 浮动窗口配置对象,可选字段:width/height/x/y/minWidth/minHeight/aspectRatio/alwaysOnTop/resizable。
42
+ * @returns 无返回。
43
+ */
25
44
  floating: (options?: any) => Promise<any>;
45
+ /**
46
+ * 收起发起方插件窗口。发起方是主窗口时回到启动器主页;
47
+ * floating 浮窗做 cloak(不驱逐渲染表面,再唤起不白屏),普通窗口真正 hide()。
48
+ *
49
+ * @returns 无返回。
50
+ */
26
51
  hide: () => Promise<any>;
52
+ /**
53
+ * 切换发起方窗口的置顶状态(screen-saver 级),返回切换后的状态。
54
+ * 同时向发起方视图广播 plugin.alwaysOnTopChanged 事件,便于渲染层同步回显。
55
+ *
56
+ * @returns 切换后的置顶状态(boolean)。
57
+ */
27
58
  toggleAlwaysOnTop: () => Promise<any>;
59
+ /**
60
+ * 取发起方插件自身的完整信息。
61
+ * 通过 webContents 逆向定位插件,返回插件实体字段 + 其全部命令(commands 数组)+
62
+ * 键值对形式的设置(settings 对象)。
63
+ *
64
+ * @returns 包含插件字段、commands 数组和 settings 键值对的对象;无法定位发起方插件时返回 undefined。
65
+ */
28
66
  info: () => Promise<any>;
67
+ /**
68
+ * 按命令名批量注销发起方插件的运行时命令,从启动器移除。
69
+ * 按命令名(name)和插件名(pluginName)联合匹配删除;仅删运行时命令,manifest 命令不受影响。
70
+ *
71
+ * @param commands 要注销的命令名数组。
72
+ * @returns 无返回。无法定位发起方插件时静默返回 null。
73
+ */
29
74
  unregisterCommands: (commands: string[]) => Promise<any>;
75
+ /**
76
+ * 为发起方插件增量注册运行时命令。
77
+ * 按确定性主键 upsert(同名覆盖),不删除任何已有命令,不影响 manifest 命令。
78
+ * 命令先通过 PluginCommand.parseCommands 解析为 PluginCommand 实体再入库。
79
+ *
80
+ * @param commandItems 命令项数组,每项包含 name/awaken/keyword 等字段。
81
+ * @returns 无返回。无法定位发起方插件时静默返回 null。
82
+ */
30
83
  registerCommands: (commandItems: any[]) => Promise<any>;
84
+ /**
85
+ * 用传入集全量覆盖发起方插件的运行时命令。
86
+ * 不在集内的运行时命令会被删除,manifest 命令(fromManifest===true)完全不受波及。
87
+ * 命令先通过 PluginCommand.parseCommands 解析为 PluginCommand 实体再入库。
88
+ *
89
+ * @param commandItems 命令项数组,每项包含 name/awaken/keyword 等字段。
90
+ * @returns 无返回。无法定位发起方插件时静默返回 null。
91
+ */
31
92
  setCommands: (commandItems: any[]) => Promise<any>;
32
93
  }
@@ -2,9 +2,47 @@ import { default as IpcRenderer } from './IpcRenderer';
2
2
  export default class PluginCommand {
3
3
  private transport;
4
4
  constructor(transport?: IpcRenderer);
5
+ /**
6
+ * 按命令名打开对应插件命令:先查找命令,记录一次使用,然后委托 PluginRunner 打开。
7
+ *
8
+ * @param commandName 命令名称。
9
+ * @param payload 进入参数,透传给 PluginRunner。
10
+ * @returns PluginRunner.open 的执行结果;命令或其所属插件不存在时返回 undefined。
11
+ */
5
12
  open: (commandName?: string, payload?: any) => Promise<any>;
13
+ /**
14
+ * 向一个已打开的命令视图再次投递 plugin.onEnter 事件,委托 PluginRunner 执行。
15
+ *
16
+ * @param commandName 命令名称。
17
+ * @param payload 进入参数,透传给 PluginRunner.onEnter。
18
+ * @returns 无返回。
19
+ */
6
20
  enter: (commandName?: string, payload?: any) => Promise<any>;
21
+ /**
22
+ * 按关键字搜索启动器可用命令。
23
+ * 仅取已启用插件下未隐藏、已启用的命令:先按 keyword 模糊匹配 keyword 类命令,
24
+ * 再加上所有 anyText 命令与正则匹配的 regexp 命令,
25
+ * 按完全匹配 → 使用频率 → 前缀匹配 → 包含匹配等综合排序后返回;
26
+ * 返回结果中缺图标的命令会回填所属插件的图标。
27
+ *
28
+ * @param keyword 搜索关键字,传入后转为小写进行模糊匹配。
29
+ * @returns 排序后的 PluginCommand 数组,含回填图标。
30
+ */
7
31
  search: (keyword: string) => Promise<any>;
32
+ /**
33
+ * 设置某条命令的别名列表,并据此重建其搜索关键字。
34
+ *
35
+ * @param name 命令名称。
36
+ * @param alias 新的别名列表,全量替换原有别名;别名会与命令名一起被 KeywordBuilder 合成为搜索关键字。
37
+ * @returns 无返回。
38
+ */
8
39
  setAlias: (name: string, alias: string[]) => Promise<any>;
40
+ /**
41
+ * 启用或停用某条命令,并广播命令变更事件。停用后该命令不再出现在搜索结果中。
42
+ *
43
+ * @param name 命令名称。
44
+ * @param enabled true 启用,false 停用。
45
+ * @returns 无返回。
46
+ */
9
47
  setEnabled: (name: string, enabled: boolean) => Promise<any>;
10
48
  }
@@ -2,11 +2,58 @@ import { default as IpcRenderer } from './IpcRenderer';
2
2
  export default class Plugin {
3
3
  private transport;
4
4
  constructor(transport?: IpcRenderer);
5
+ /**
6
+ * 切换指定插件所有视图的开发者工具开关。
7
+ *
8
+ * @param pluginId 插件 ID。
9
+ * @returns 无返回
10
+ */
5
11
  toggleDevTools: (pluginId?: string) => Promise<any>;
12
+ /**
13
+ * 关闭指定插件的所有视图(卸载 WebContentsView),不销毁已创建的窗口。
14
+ *
15
+ * @param pluginId 插件 ID。
16
+ * @returns Promise<void>
17
+ */
6
18
  closePlugin: (pluginId?: string) => Promise<any>;
19
+ /**
20
+ * 获取插件完整信息:合并 DB 中的插件实体、manifest 里的 preferences(含环境变量占位符展开)、
21
+ * 命令列表、当前所有设置项键值对,以及从 manifest 磁盘文件读取的 AI 能力声明(tools / skills)。
22
+ *
23
+ * @param pluginId 插件 ID。
24
+ * @returns 包含插件基础字段、preferences、commands、settings 键值对和 aiDeclaration 的聚合对象;
25
+ * 插件不存在时返回 undefined。
26
+ */
7
27
  getPluginInfo: (pluginId?: string) => Promise<any>;
28
+ /**
29
+ * 启用或禁用指定插件:更新 DB 中的 enabled 字段,并发布 PluginUpdatedEvent 通知外部消费者。
30
+ *
31
+ * @param pluginId 插件 ID。
32
+ * @param enabled true 启用,false 禁用。
33
+ * @returns 插件不存在时返回 null;成功时返回 undefined。
34
+ */
8
35
  setEnabled: () => Promise<any>;
36
+ /**
37
+ * 获取所有已安装插件的列表。
38
+ *
39
+ * @returns Plugin[] 全部插件实体数组。
40
+ */
9
41
  getPlugins: () => Promise<any>;
42
+ /**
43
+ * 重载指定插件的所有视图和窗口:先记录当前窗口状态(可见性、位置),
44
+ * 销毁视图和窗口后重新加载启动视图,并恢复此前可见的窗口。
45
+ *
46
+ * @param pluginId 插件 ID。
47
+ * @returns Promise<void>。
48
+ */
10
49
  reloadPlugin: (pluginId: string) => Promise<any>;
50
+ /**
51
+ * 安装指定插件。先执行 npm install,再解析 manifest.json 写入 DB 并注册命令;
52
+ * 若插件已安装则仅同步最新的 manifest 字段到 DB,并发布 PluginUpdatedEvent。
53
+ *
54
+ * @param name 插件名称(npm 包名)或本地开发目录的绝对路径。
55
+ * @returns Promise<void>。
56
+ * @throws 未直接抛错;npm install 失败或 manifest.json 缺失时记录错误并静默返回。
57
+ */
11
58
  installPlugin: (name: string) => Promise<any>;
12
59
  }
@@ -2,8 +2,32 @@ import { default as IpcRenderer } from './IpcRenderer';
2
2
  export default class PluginSettings {
3
3
  private transport;
4
4
  constructor(transport?: IpcRenderer);
5
+ /**
6
+ * 获取发起方插件的全部设置项,以键值对形式返回。
7
+ *
8
+ * @returns 包含该插件所有设置 key→value 的键值对象(Record&lt;string, any&gt;);无法定位发起方插件时返回 undefined。
9
+ */
5
10
  getSettings: () => Promise<any>;
11
+ /**
12
+ * 获取发起方插件中指定 key 的设置值。
13
+ *
14
+ * @param key 设置的键名。
15
+ * @returns 该 key 对应的值;key 不存在或值为 null/undefined 时返回 null,false/0/"" 视为合法值原样返回。无法定位发起方插件时返回 undefined。
16
+ */
6
17
  getSetting: (key: string) => Promise<any>;
18
+ /**
19
+ * 写入(新增或覆盖)发起方插件中指定 key 的设置值。key 已存在则更新,不存在则新建。
20
+ *
21
+ * @param key 设置的键名;可选。
22
+ * @param value 设置值,可为任意 JSON 可序列化的值;可选。
23
+ * @returns 无返回。无法定位发起方插件时不执行任何操作。
24
+ */
7
25
  saveSetting: (key: string, value: any) => Promise<any>;
26
+ /**
27
+ * 删除发起方插件中指定 key 的设置项。
28
+ *
29
+ * @param key 要删除的设置的键名;可选。
30
+ * @returns 无返回。无法定位发起方插件或该 key 对应的设置不存在时不执行任何操作。
31
+ */
8
32
  removeSetting: (key: string) => Promise<any>;
9
33
  }
package/types/Sync.d.ts CHANGED
@@ -41,6 +41,11 @@ export default class Sync {
41
41
  private readonly appliedCallbacks;
42
42
  private appliedBound;
43
43
  constructor(transport?: IpcRenderer);
44
+ /**
45
+ * 获取当前同步模块的完整运行状态。
46
+ *
47
+ * @returns 同步状态对象,包含 enabled(开关)、configured(传输层是否就绪)、transport(传输方式描述)、loggedIn(是否登录)、running(是否正在同步)、lastSyncAt(上次完成时间戳)、lastError(上次错误)、pushedSeq(本端已推最大版本号)、namespace(账号命名空间)等字段。
48
+ */
44
49
  getStatus: () => Promise<SyncStatusDto>;
45
50
  /** 改配置(开关 / 传输方式 / 本地目录 / 端到端口令),返回最新状态。 */
46
51
  configure: (patch: SyncConfigPatch) => Promise<SyncStatusDto>;
package/types/System.d.ts CHANGED
@@ -2,35 +2,97 @@ import { default as IpcRenderer } from './IpcRenderer';
2
2
  export default class System {
3
3
  private transport;
4
4
  constructor(transport?: IpcRenderer);
5
+ /** 返回当前运行平台标识("win32" / "darwin" / "linux" 等,同 Node process.platform)。
6
+ * @returns 平台标识字符串 */
5
7
  getPlatform: () => Promise<any>;
8
+ /** 显示并聚焦 Solazah 主窗口(搜索框);主窗口不存在时不做任何事。
9
+ * @returns 无返回 */
6
10
  openMainApp: () => Promise<any>;
11
+ /** 弹出「关于 Solazah Desktop」对话框,展示版本号、Electron/V8/Node.js 版本和操作系统信息;等待用户点确认后返回。
12
+ * @returns 无返回 */
7
13
  showAbout: () => Promise<any>;
14
+ /** 打开 Solazah 设置界面(触发内置设置插件的 Solazah Settings 命令);设置插件/命令缺失时静默不打开。
15
+ * @returns 无返回 */
8
16
  openSettings: () => Promise<any>;
17
+ /** 主动检查应用更新;此路径会向用户提示检查结果(无新版本也会告知)。
18
+ * @returns 无返回 */
9
19
  checkUpdates: () => Promise<any>;
20
+ /** 立即重启整个应用(当前进程退出后重新拉起)。
21
+ * @returns 无返回 */
10
22
  restartApp: () => Promise<any>;
23
+ /** 退出整个应用,关闭所有窗口并结束进程。
24
+ * @returns 无返回 */
11
25
  quitApp: () => Promise<any>;
12
26
  keepAwake: {
27
+ /**
28
+ * 启动系统唤醒锁定,阻止显示器关闭与系统自动锁屏。
29
+ *
30
+ * 使用 Electron powerSaveBlocker 的 prevent-display-sleep 模式,
31
+ * 在 macOS 与 Windows 上行为一致:同时阻止熄屏与系统锁屏。
32
+ * 若已处于激活状态,则仅更新锁定原因(reason)并返回当前状态,不会重复启动。
33
+ *
34
+ * @param options 可选配置对象。
35
+ * @param options.reason 锁定原因说明,用于日志记录与状态追踪。
36
+ * @returns 锁定状态对象,包含 active(是否已激活)与 reason(锁定原因)。
37
+ */
13
38
  enable: (options?: {
14
39
  reason?: string;
15
40
  }) => Promise<{
16
41
  active: boolean;
17
42
  reason: string | null;
18
43
  }>;
44
+ /**
45
+ * 停止系统唤醒锁定,恢复正常的显示器关闭与系统锁屏行为。
46
+ *
47
+ * 若当前无活跃的唤醒锁定,调用此方法也会将内部状态重置为未激活,不会抛错。
48
+ *
49
+ * @returns 状态对象,active 固定为 false 表示锁定已解除。
50
+ */
19
51
  disable: () => Promise<{
20
52
  active: boolean;
21
53
  }>;
54
+ /**
55
+ * 切换系统唤醒锁定状态:当前已激活则关闭锁定,未激活则开启锁定。
56
+ *
57
+ * 先查询当前状态再决定操作方向,两次调用之间状态可能被其他 renderer 改变,
58
+ * 因此结果以实际执行后的返回值为准。
59
+ *
60
+ * @param options 可选配置对象,仅在从未激活切换为激活时生效。
61
+ * @param options.reason 锁定原因说明。
62
+ * @returns 切换后的锁定状态对象。
63
+ */
22
64
  toggle: (options?: {
23
65
  reason?: string;
24
66
  }) => Promise<{
25
67
  active: boolean;
26
68
  reason?: string | null;
27
69
  }>;
70
+ /**
71
+ * 查询当前系统唤醒锁定的激活状态与锁定原因。
72
+ *
73
+ * @returns 状态对象,包含 active(是否已激活)与 reason(锁定原因,未激活时为 null)。
74
+ */
28
75
  status: () => Promise<{
29
76
  active: boolean;
30
77
  reason: string | null;
31
78
  }>;
32
79
  };
33
80
  scheduledTask: {
81
+ /**
82
+ * 创建一个新的定时任务并持久化;若 enabled 为 true 则立即注册到 cron 调度引擎。
83
+ *
84
+ * @param input 创建参数:
85
+ * - name 任务名称。
86
+ * - cron cron 表达式字符串;必须通过 node-cron 校验。
87
+ * - action 动作描述对象;至少包含 `type` 字段,用于在 ScheduledActionRegistry 中定位 handler;其余字段由 handler 自行解释。
88
+ * - kind `"recurring"`(默认,按 cron 周期重复) 或 `"once"`(触发一次后自动停用)。
89
+ * - enabled 是否启用;省略默认 true。
90
+ * - timezone 可选时区;传给 node-cron 的调度选项。
91
+ * - expiresAt 可选过期时间;到期后任务自动作废(停 job + 禁用 + 留痕)。
92
+ * @returns 持久化后的 ScheduledTask 实体。
93
+ * @throws cron 表达式无效时抛 `invalid cron expression: ...`。
94
+ * @throws action.type 未在 ScheduledActionRegistry 注册时抛 `unknown scheduled action type: ...`。
95
+ */
34
96
  create: (input: {
35
97
  name: string;
36
98
  cron: string;
@@ -38,13 +100,57 @@ export default class System {
38
100
  enabled?: boolean;
39
101
  timezone?: string;
40
102
  }) => Promise<any>;
103
+ /**
104
+ * 部分更新已有定时任务:先停旧 cron job,应用 patch 后再按新 enabled 状态决定是否重新调度。
105
+ *
106
+ * @param id 目标任务 id。
107
+ * @param patch 部分字段更新;可包含 cron / action / name / enabled / kind / timezone / expiresAt 等任意 ScheduledTask 字段的子集。
108
+ * 若提供 cron 则须通过 node-cron 校验;若提供 action 则其 type 须已注册。
109
+ * @returns 更新后的 ScheduledTask 实体;任务不存在时返回 null。
110
+ * @throws 提供的 cron 表达式无效时抛 `invalid cron expression: ...`。
111
+ * @throws 提供的 action.type 未注册时抛 `unknown scheduled action type: ...`。
112
+ */
41
113
  update: (id: string, patch: any) => Promise<any>;
114
+ /**
115
+ * 删除指定定时任务,同时取消其 cron job 调度。
116
+ *
117
+ * @param id 目标任务 id。
118
+ * @returns true 表示至少删除了一条记录;false 表示目标不存在。
119
+ */
42
120
  delete: (id: string) => Promise<any>;
121
+ /**
122
+ * 列出所有定时任务,按创建时间倒序排列。
123
+ *
124
+ * @returns ScheduledTask 数组;无任务时为空数组。
125
+ */
43
126
  list: (filter?: {
44
127
  pluginName?: string;
45
128
  }) => Promise<any>;
129
+ /**
130
+ * 启用或禁用指定定时任务。内部委托 update({enabled}),因此同样会停/启 cron job。
131
+ *
132
+ * @param id 目标任务 id。
133
+ * @param enabled true 启用,false 禁用。
134
+ * @returns 更新后的 ScheduledTask 实体;任务不存在时返回 null。
135
+ */
46
136
  toggle: (id: string, enabled: boolean) => Promise<any>;
137
+ /**
138
+ * 立即手动触发一次指定任务,不影响原有 cron 排期。
139
+ * 触发过程包含:过期作废检查、重叠保护(上次 run 未结束则跳过)、
140
+ * handler 路由与执行、状态回写(lastRunAt / lastStatus / lastError),
141
+ * 以及 once 类型触发后自动停调度的逻辑。
142
+ *
143
+ * @param id 目标任务 id。
144
+ * @returns `{ok: boolean; error?: string}`;ok 为 true 表示触发成功进入执行,
145
+ * ok 为 false 时 error 说明原因(如 "task not found" / "task disabled" / "expired" / "previous run still in flight")。
146
+ */
47
147
  runNow: (id: string) => Promise<any>;
148
+ /**
149
+ * 校验 cron 表达式合法性(委托 node-cron 的 validate)。
150
+ *
151
+ * @param expr cron 表达式字符串。
152
+ * @returns true 表示表达式合法可调度;false 表示无效。
153
+ */
48
154
  validateCron: (expr: string) => Promise<boolean>;
49
155
  };
50
156
  }
@@ -2,7 +2,29 @@ import { default as IpcRenderer } from './IpcRenderer';
2
2
  export default class SystemAudio {
3
3
  private transport;
4
4
  constructor(transport?: IpcRenderer);
5
+ /**
6
+ * 播放内置音效目录下的指定音频文件。
7
+ * 同一时刻只能播放一个音效,新播放会自动中断当前正在播放的音效。
8
+ * macOS 上通过系统 afplay 子进程播放,其余平台通过原生 addon 播放。
9
+ *
10
+ * @param soundName 音效文件名,不含扩展名时自动补 `.wav`。
11
+ * @returns 无返回值(播放是异步副作用)。
12
+ * @throws 文件不存在时抛错,错误消息格式为 `Sound file not found: <soundName>`。
13
+ */
5
14
  play: (soundName: string) => Promise<any>;
15
+ /**
16
+ * 停止当前正在播放的音效。
17
+ * macOS 上终止 afplay 子进程,其余平台通过原生 addon 停止。
18
+ * 若无音效在播则不执行任何操作。
19
+ *
20
+ * @returns 无返回值。
21
+ */
6
22
  stop: () => Promise<any>;
23
+ /**
24
+ * 列出内置音效目录下所有可播放的音频文件名(含扩展名)。
25
+ * 仅筛选 `.wav`、`.mp3`、`.ogg` 三种格式(不区分大小写)。
26
+ *
27
+ * @returns 音频文件名数组;音效目录不存在时返回空数组 `[]`。
28
+ */
7
29
  list: () => Promise<string[]>;
8
30
  }