cotutor 0.3.0 → 0.4.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.
Files changed (209) hide show
  1. package/LICENSE +9 -7
  2. package/NOTICE +3 -3
  3. package/README.md +65 -18
  4. package/avatars/chinese.webp +0 -0
  5. package/avatars/english.webp +0 -0
  6. package/avatars/math.webp +0 -0
  7. package/bin/cotutor.js +13 -3
  8. package/cards/photo/card.css +10 -3
  9. package/cards/photo/card.md +2 -2
  10. package/cards/tutor/card.css +13 -0
  11. package/cards/tutor/card.md +2 -1
  12. package/cards//346/235/277/344/271/246/346/200/216/344/271/210/345/206/231.md +1 -1
  13. package/dist/app/activity-eval.js +3 -2
  14. package/dist/app/cli/activities.d.ts +8 -1
  15. package/dist/app/cli/activities.js +42 -4
  16. package/dist/app/cli/cert.d.ts +11 -0
  17. package/dist/app/cli/cert.js +36 -9
  18. package/dist/app/cli/chalk/browser.d.ts +2 -2
  19. package/dist/app/cli/chalk/browser.js +22 -7
  20. package/dist/app/cli/chalk/main.js +3 -2
  21. package/dist/app/cli/doctor.d.ts +11 -5
  22. package/dist/app/cli/doctor.js +156 -181
  23. package/dist/app/cli/firewall.d.ts +24 -0
  24. package/dist/app/cli/firewall.js +79 -0
  25. package/dist/app/cli/init.js +8 -5
  26. package/dist/app/cli/main.js +379 -27
  27. package/dist/app/cli/migrate.d.ts +2 -11
  28. package/dist/app/cli/migrate.js +1 -59
  29. package/dist/app/cli/port-holder.d.ts +16 -0
  30. package/dist/app/cli/port-holder.js +34 -0
  31. package/dist/app/cli/port.d.ts +37 -0
  32. package/dist/app/cli/port.js +116 -0
  33. package/dist/app/cli/sandbox.d.ts +25 -0
  34. package/dist/app/cli/sandbox.js +166 -0
  35. package/dist/app/cli/serve-log.d.ts +13 -0
  36. package/dist/app/cli/serve-log.js +90 -0
  37. package/dist/app/cli/serve.d.ts +18 -4
  38. package/dist/app/cli/serve.js +78 -8
  39. package/dist/app/cli/service-windows.d.ts +50 -0
  40. package/dist/app/cli/service-windows.js +117 -0
  41. package/dist/app/cli/service.d.ts +152 -0
  42. package/dist/app/cli/service.js +443 -0
  43. package/dist/app/cli/skeleton.d.ts +1 -1
  44. package/dist/app/cli/skeleton.js +13 -13
  45. package/dist/app/cli/skills.d.ts +5 -1
  46. package/dist/app/cli/skills.js +14 -4
  47. package/dist/app/cli/tray-icons.d.ts +11 -0
  48. package/dist/app/cli/tray-icons.js +87 -0
  49. package/dist/app/cli/tray-ids.d.ts +6 -0
  50. package/dist/app/cli/tray-ids.js +6 -0
  51. package/dist/app/cli/tray-mac.d.ts +8 -0
  52. package/dist/app/cli/tray-mac.js +140 -0
  53. package/dist/app/cli/tray-run.d.ts +1 -0
  54. package/dist/app/cli/tray-run.js +42 -0
  55. package/dist/app/cli/tray-windows.d.ts +5 -0
  56. package/dist/app/cli/tray-windows.js +166 -0
  57. package/dist/app/cli/tray.d.ts +236 -0
  58. package/dist/app/cli/tray.js +670 -0
  59. package/dist/app/cli/usage.d.ts +1 -1
  60. package/dist/app/cli/usage.js +11 -6
  61. package/dist/app/dictation/route.js +3 -2
  62. package/dist/app/http/app.d.ts +5 -10
  63. package/dist/app/http/app.js +47 -98
  64. package/dist/app/http/avatars.d.ts +17 -0
  65. package/dist/app/http/avatars.js +35 -0
  66. package/dist/app/http/dev-tutor-files.js +1 -1
  67. package/dist/app/http/parent-home.d.ts +14 -0
  68. package/dist/app/http/parent-home.js +69 -6
  69. package/dist/app/http/parent-look.d.ts +2 -0
  70. package/dist/app/http/parent-look.js +151 -0
  71. package/dist/app/http/raw-view.js +3 -3
  72. package/dist/app/http/voice-preview.d.ts +4 -0
  73. package/dist/app/http/voice-preview.js +34 -0
  74. package/dist/app/machine/bailian.d.ts +0 -2
  75. package/dist/app/machine/bailian.js +5 -6
  76. package/dist/app/machine/update.d.ts +25 -0
  77. package/dist/app/machine/update.js +88 -0
  78. package/dist/app/mock/mock-live.js +1 -1
  79. package/dist/app/mock/mock.d.ts +4 -2
  80. package/dist/app/mock/mock.js +20 -12
  81. package/dist/app/replay.js +4 -4
  82. package/dist/app/skills/home-doc.js +1 -1
  83. package/dist/app/workspace.d.ts +9 -4
  84. package/dist/app/workspace.js +33 -10
  85. package/dist/app/ws/route.d.ts +8 -2
  86. package/dist/app/ws/route.js +7 -3
  87. package/dist/board/parse.d.ts +0 -2
  88. package/dist/board/parse.js +0 -6
  89. package/dist/board/presentation.d.ts +9 -15
  90. package/dist/board/presentation.js +8 -10
  91. package/dist/brain/api-tools.js +2 -1
  92. package/dist/brain/api.d.ts +12 -17
  93. package/dist/brain/api.js +16 -33
  94. package/dist/brain/index.d.ts +23 -71
  95. package/dist/brain/index.js +6 -69
  96. package/dist/brain/log.d.ts +5 -0
  97. package/dist/brain/log.js +22 -0
  98. package/dist/brain/runtime.d.ts +30 -0
  99. package/dist/brain/runtime.js +23 -0
  100. package/dist/brain/{cli/stream-json.d.ts → stream-json.d.ts} +2 -4
  101. package/dist/brain/{cli/stream-json.js → stream-json.js} +0 -4
  102. package/dist/brain/stream.d.ts +5 -5
  103. package/dist/brain/stream.js +7 -7
  104. package/dist/brain/transcript.d.ts +3 -3
  105. package/dist/brain/transcript.js +6 -6
  106. package/dist/brain/{cli/types.d.ts → types.d.ts} +3 -48
  107. package/dist/brain/types.js +14 -0
  108. package/dist/chalk/glyphs/skeleton.d.ts +3 -3
  109. package/dist/chalk/glyphs/skeleton.js +1 -1
  110. package/dist/lib/index.d.ts +1 -1
  111. package/dist/lib/index.js +1 -1
  112. package/dist/memory/diary.js +3 -3
  113. package/dist/realtime/bailian.d.ts +1 -1
  114. package/dist/realtime/bailian.js +3 -2
  115. package/dist/realtime/preview.js +1 -1
  116. package/dist/realtime/voices.d.ts +2 -0
  117. package/dist/realtime/voices.js +57 -57
  118. package/dist/runtime/activities.d.ts +13 -1
  119. package/dist/runtime/activities.js +28 -2
  120. package/dist/runtime/activity-state.js +2 -2
  121. package/dist/runtime/agent-file.d.ts +3 -3
  122. package/dist/runtime/agent-file.js +3 -3
  123. package/dist/runtime/context/tutor-rules.d.ts +2 -2
  124. package/dist/runtime/context/tutor-rules.js +3 -3
  125. package/dist/runtime/home/home.d.ts +12 -1
  126. package/dist/runtime/home/home.js +8 -1
  127. package/dist/runtime/home/store.d.ts +1 -1
  128. package/dist/runtime/home/store.js +36 -21
  129. package/dist/runtime/journal/mix.d.ts +15 -6
  130. package/dist/runtime/journal/mix.js +60 -19
  131. package/dist/runtime/journal/recorder.d.ts +58 -13
  132. package/dist/runtime/journal/recorder.js +106 -16
  133. package/dist/runtime/journal/store.d.ts +4 -4
  134. package/dist/runtime/journal/store.js +6 -6
  135. package/dist/runtime/kid-input.js +2 -3
  136. package/dist/runtime/live/call.d.ts +12 -0
  137. package/dist/runtime/live/call.js +51 -18
  138. package/dist/runtime/live/turns.js +1 -1
  139. package/dist/runtime/runner.d.ts +9 -55
  140. package/dist/runtime/runner.js +52 -173
  141. package/dist/scenes/paint/painter.js +4 -3
  142. package/dist/schema/config.d.ts +43 -22
  143. package/dist/schema/config.js +45 -47
  144. package/dist/schema/conversation.d.ts +6 -0
  145. package/dist/schema/home.d.ts +11 -1
  146. package/dist/schema/home.js +7 -2
  147. package/dist/schema/workspace.d.ts +27 -0
  148. package/dist/schema/workspace.js +28 -0
  149. package/dist/shared/default-port.d.ts +2 -0
  150. package/dist/shared/default-port.js +2 -0
  151. package/dist/shared/qianwen.d.ts +14 -10
  152. package/dist/shared/qianwen.js +26 -22
  153. package/dist/shared/site-url.d.ts +2 -0
  154. package/dist/shared/site-url.js +5 -0
  155. package/dist/shared/upgrade.d.ts +9 -0
  156. package/dist/shared/upgrade.js +23 -0
  157. package/dist/ui/dev/dev-page.js +25 -252
  158. package/dist/ui/dev/dev-theme.d.ts +1 -1
  159. package/dist/ui/dev/dev-theme.js +1 -1
  160. package/dist/ui/dev/voice-gallery-page.js +1 -1
  161. package/dist/ui/kid/board-mark.d.ts +2 -2
  162. package/dist/ui/kid/board-mark.js +2 -2
  163. package/dist/ui/kid/home-tiles.d.ts +14 -0
  164. package/dist/ui/kid/home-tiles.js +44 -0
  165. package/dist/ui/kid/kid-page.js +68 -103
  166. package/dist/ui/kid/voice-ui.d.ts +1 -1
  167. package/dist/ui/kid/voice-ui.js +1 -1
  168. package/dist/ui/kid/word-emoji.js +5 -3
  169. package/dist/ui/parent/parent-home-page.js +337 -7
  170. package/dist/ui/parent/parent-page.js +6 -2
  171. package/dist/ui/parent/parent-settings-page.d.ts +1 -0
  172. package/dist/ui/parent/parent-settings-page.js +133 -0
  173. package/dist/ui/{dev → parent}/qr-page.d.ts +2 -2
  174. package/dist/ui/{dev → parent}/qr-page.js +19 -14
  175. package/dist/ui/shared/brand.d.ts +3 -1
  176. package/dist/ui/shared/brand.js +3 -1
  177. package/grades/grade-2/README.md +1 -1
  178. package/grades/grade-2/VALIDATION.md +1 -1
  179. package/grades/grade-2/agents/chinese-tutor/activities//345/244/215/344/271/240.md +1 -1
  180. package/grades/grade-2/agents/chinese-tutor/activities//346/{211/271/346/224/271.md → 243/200/346/237/245/344/275/234/344/270/232.md} +4 -4
  181. package/grades/grade-2/agents/chinese-tutor/activities//346/{211/271/346/224/271. → 243/200/346/237/245/344/275/234/344/270/232.}/344/276/213/345/255/220.md +2 -2
  182. package/grades/grade-2/agents/chinese-tutor/activities//351/242/204/344/271/240.md +1 -1
  183. package/grades/grade-2/agents/english-tutor/activities//345/244/215/344/271/240.md +1 -1
  184. package/grades/grade-2/agents/english-tutor/activities//346/{211/271/346/224/271.md → 243/200/346/237/245/344/275/234/344/270/232.md} +4 -4
  185. package/grades/grade-2/agents/english-tutor/activities//346/{211/271/346/224/271. → 243/200/346/237/245/344/275/234/344/270/232.}/344/276/213/345/255/220.md +2 -2
  186. package/grades/grade-2/agents/english-tutor/activities//351/242/204/344/271/240.md +1 -1
  187. package/grades/grade-2/agents/math-tutor/activities//345/244/215/344/271/240.md +1 -1
  188. package/grades/grade-2/agents/math-tutor/activities//346/{211/271/346/224/271.md → 243/200/346/237/245/344/275/234/344/270/232.md} +4 -4
  189. package/grades/grade-2/agents/math-tutor/activities//346/{211/271/346/224/271. → 243/200/346/237/245/344/275/234/344/270/232.}/344/276/213/345/255/220.md +2 -2
  190. package/grades/grade-2/agents/math-tutor/activities//351/242/204/344/271/240.md +1 -1
  191. package/package.json +6 -2
  192. package/skills/cotutor-analyze/references//345/221/275/344/273/244/344/270/216/346/226/207/344/273/266.md +2 -2
  193. package/skills/cotutor-board/references/photo.md +2 -2
  194. package/skills/cotutor-home/SKILL.md +1 -0
  195. package/skills/cotutor-home/references/tutor.md +2 -1
  196. package/skills/cotutor-home/references//351/246/226/351/241/265/350/257/255/346/263/225.md +2 -1
  197. package/skills/cotutor-tune/references//345/255/227/346/256/265.md +6 -3
  198. package/skills/cotutor-tutor/SKILL.md +5 -13
  199. package/dist/brain/cli/adapters.d.ts +0 -60
  200. package/dist/brain/cli/adapters.js +0 -91
  201. package/dist/brain/cli/qwen.d.ts +0 -11
  202. package/dist/brain/cli/qwen.js +0 -141
  203. package/dist/brain/cli/run-plan.d.ts +0 -59
  204. package/dist/brain/cli/run-plan.js +0 -71
  205. package/dist/brain/cli/run.d.ts +0 -35
  206. package/dist/brain/cli/run.js +0 -256
  207. package/dist/brain/cli/types.js +0 -3
  208. package/dist/brain/cli/warm.d.ts +0 -53
  209. package/dist/brain/cli/warm.js +0 -103
@@ -0,0 +1,236 @@
1
+ /**
2
+ * 托盘图标(macOS 菜单栏、Windows 任务栏;Linux 没做,GNOME 缺省不显示托盘):家长不开终端也看得到服务好不好、点得开家长端。
3
+ * 三层:
4
+ * node 进程(cotutor tray run,tray-run.ts 是它的轻入口):隔几秒问每个后台服务的 /api/health,判断状态,决定显示什么、要不要通知;这里全是能测的 TS。
5
+ * 显示脚本(tray-mac.ts 的 JXA、tray-windows.ts 的 PowerShell,都是系统自带、不用签名):只管画和回报点击,不判断。
6
+ * 登录项:macOS 一个 LaunchAgent,Windows 一条 Run 项 + wscript 隐藏启动器;service install 时一起装(--no-tray 不装,cotutor tray off 关掉并记住)。
7
+ * 为什么不放在 serve 里:服务挂了图标也没了,就说不出「没在跑」;多个孩子时一台电脑也只该有一个图标。
8
+ * 为什么不用 npm 的托盘库、Electron:见 docs/wip;systray2 只有 x86 的 Mac 二进制且没签名,Electron 要多下一百多 MB。
9
+ * 状态:正常只有 logo(和菜单栏别的图标一样单色);有事才出状态点,橙 = 要处理,红 = 没在跑(logo 同时变淡)。正常 → 有事、→ 没在跑时通知一次,恢复不通知。
10
+ * 「退出 cotutor」= 停掉所有后台服务并退出图标,下次登录自己回来;正开着电话时先问一声。
11
+ */
12
+ import { type SpawnOptions } from 'node:child_process';
13
+ import { type Health, type InstalledService, type ServiceHost } from './service.ts';
14
+ import { HELPER_NO_SESSION, TRAY_AUMID, TRAY_LABEL, TRAY_RUN_VALUE } from './tray-ids.ts';
15
+ export { HELPER_NO_SESSION, TRAY_AUMID, TRAY_LABEL, TRAY_RUN_VALUE };
16
+ /** 多久问一次 */
17
+ export declare const TRAY_POLL_MS = 5000;
18
+ /** 连着几次问不到才算没在跑:重起一下、网络抖一下不报 */
19
+ export declare const TRAY_STRIKES = 2;
20
+ /** 图标刚起来时服务可能还没起来:这么久里问不到算「正在启动」(Windows 登录后约一分钟才跑 Run 项) */
21
+ export declare const TRAY_START_GRACE_MS = 90000;
22
+ /** 点了启动、重启以后等多久 */
23
+ export declare const TRAY_RESTART_GRACE_MS = 30000;
24
+ /** 两次问之间隔太久 = 刚睡醒:网络还没回来,先别报 */
25
+ export declare const TRAY_WAKE_GAP_MS = 30000;
26
+ export declare const TRAY_WAKE_GRACE_MS = 30000;
27
+ export type TrayLevel = 'ok' | 'warn' | 'bad';
28
+ export type RowLevel = TrayLevel | 'starting';
29
+ export type TrayFix = {
30
+ kind: 'open';
31
+ target: string;
32
+ } | {
33
+ kind: 'restart';
34
+ };
35
+ /** 一个服务这一轮问到的 */
36
+ export interface TrayProbe {
37
+ name: string;
38
+ kid: string;
39
+ root: string;
40
+ logDir: string | null;
41
+ port: number;
42
+ health: Health | null;
43
+ /** 问不到时端口被谁占着(「nginx」);不知道 → null */
44
+ holder: string | null;
45
+ }
46
+ /** 一个服务现在的样子 */
47
+ export interface TrayRow {
48
+ name: string;
49
+ kid: string;
50
+ logDir: string | null;
51
+ level: RowLevel;
52
+ /** 家长端地址;服务没答应 → null */
53
+ url: string | null;
54
+ /** 第二行小字 */
55
+ detail: string;
56
+ /** 有几件事要处理 */
57
+ issues: number;
58
+ fix: TrayFix | null;
59
+ calls: number;
60
+ /** npm 上有比装的新的版本 → 版本号;不算有事,不出状态点 */
61
+ update: string | null;
62
+ }
63
+ export type TrayEntry = {
64
+ kind: 'info';
65
+ title: string;
66
+ level?: TrayLevel;
67
+ } | {
68
+ kind: 'sub';
69
+ title: string;
70
+ } | {
71
+ kind: 'sep';
72
+ } | {
73
+ kind: 'action';
74
+ id: string;
75
+ title: string;
76
+ primary?: boolean;
77
+ };
78
+ export interface TrayShow {
79
+ type: 'show';
80
+ icon: TrayLevel;
81
+ tip: string;
82
+ menu: TrayEntry[];
83
+ }
84
+ export interface TrayNote {
85
+ type: 'notify';
86
+ title: string;
87
+ body: string;
88
+ }
89
+ /** 跑了多久,给家长看 */
90
+ export declare function uptimeText(startedMs: number, now: number): string;
91
+ /** 服务在跑,但有事要家长处理:先后就是轻重,菜单上只说第一件 */
92
+ export declare function issuesOf(p: TrayProbe, o: {
93
+ platform: NodeJS.Platform;
94
+ version: string;
95
+ }): {
96
+ text: string;
97
+ fix: TrayFix;
98
+ }[];
99
+ /** 记着每个服务上一轮的样子,算这一轮的样子和要不要通知;不碰任何系统,测试直接喂 */
100
+ export declare class TrayModel {
101
+ private readonly mem;
102
+ private last;
103
+ private readonly o;
104
+ constructor(o: {
105
+ platform: NodeJS.Platform;
106
+ version: () => string;
107
+ });
108
+ /** 刚点了启动、重启:这一阵问不到是正常的 */
109
+ expect(name: string, now: number): void;
110
+ update(probes: TrayProbe[], now: number): {
111
+ rows: TrayRow[];
112
+ notes: TrayNote[];
113
+ };
114
+ private healthy;
115
+ private placeholder;
116
+ }
117
+ /** 有新版本的通知:每个版本最多一次,记在托盘目录,重起、重新登录不再弹 */
118
+ export declare function updateNote(version: string, platform: NodeJS.Platform): TrayNote;
119
+ /** 这一轮显示什么 */
120
+ export declare function trayShow(rows: TrayRow[]): TrayShow;
121
+ export interface HelperMessage {
122
+ type: string;
123
+ id?: string;
124
+ yes?: boolean;
125
+ message?: string;
126
+ }
127
+ export interface TrayHelper {
128
+ send(m: unknown): void;
129
+ /** 关 stdin:显示脚本读到头自己退 */
130
+ close(): void;
131
+ }
132
+ export interface TrayDeps {
133
+ platform: NodeJS.Platform;
134
+ /** 现在装的是哪个版本:每轮问,程序可能刚被 npm 换了 */
135
+ version(): string;
136
+ /** 已经通知过的新版本 */
137
+ updateSeen(): string | null;
138
+ setUpdateSeen(version: string): void;
139
+ now(): number;
140
+ list(): Promise<InstalledService[]>;
141
+ /** 读 cotutor.json:孩子叫什么、哪个端口 */
142
+ inspect(s: InstalledService): Promise<{
143
+ kid: string;
144
+ port: number;
145
+ }>;
146
+ probe(port: number): Promise<Health | null>;
147
+ holder(port: number): Promise<string | null>;
148
+ control(root: string, what: 'start' | 'stop' | 'restart'): Promise<unknown>;
149
+ open(target: string): void;
150
+ spawnHelper(on: {
151
+ message(m: HelperMessage): void;
152
+ exit(code: number | null): void;
153
+ }): TrayHelper;
154
+ note(text: string): void;
155
+ pollMs?: number;
156
+ helperRestartMs?: number;
157
+ }
158
+ export declare const QUIT_CONFIRM: {
159
+ id: string;
160
+ title: string;
161
+ body: string;
162
+ yes: string;
163
+ no: string;
164
+ };
165
+ /** 主循环:问状态、发给显示脚本、接点击;都退了才返回退出码。0 = 不用再起(点了退出、没有服务了、没有桌面) */
166
+ export declare function runTray(d: TrayDeps): Promise<number>;
167
+ export declare const traySupported: (platform: NodeJS.Platform) => boolean;
168
+ type HostPaths = Pick<ServiceHost, 'platform' | 'home' | 'env'>;
169
+ /** 显示脚本、图标、日志放哪 */
170
+ export declare function trayDir(host: HostPaths): string;
171
+ /** 写显示脚本(每次起来都写,升级后马上生效)和图标(版本变了才画,画一次要几百毫秒) */
172
+ export declare function writeTrayFiles(platform: NodeJS.Platform, dir: string): Promise<string>;
173
+ /** 起显示脚本 */
174
+ export declare function spawnTrayHelper(platform: NodeJS.Platform, file: string, dir: string, note: (t: string) => void, on: {
175
+ message(m: HelperMessage): void;
176
+ exit(code: number | null): void;
177
+ }): TrayHelper;
178
+ /**
179
+ * 打开地址或目录用什么命令。windowsHide 不弹黑窗口。
180
+ * detached 不能省:Windows 上非 detached 的子进程在「父进程退出就杀」的 job 里(libuv),cotutor open、service install 起完马上退,cmd 还没把地址交给浏览器就被一起杀了。
181
+ * 退出码是 0、地址也打印了,就是没打开,也不报错(2026-11-07 真机);托盘进程一直开着,所以光点图标看不出来。
182
+ */
183
+ export declare function openCommand(platform: NodeJS.Platform, target: string): {
184
+ cmd: string;
185
+ args: string[];
186
+ options: SpawnOptions;
187
+ };
188
+ export declare function openTarget(platform: NodeJS.Platform, target: string): void;
189
+ /** 日志:一个文件,过 1 MB 换一次,只留上一份 */
190
+ export declare function trayNote(dir: string): (text: string) => void;
191
+ /** 孩子叫什么、哪个端口:只读这两样,不加载 zod(托盘进程常驻,要轻);读不了就用服务名和缺省端口 */
192
+ export declare function inspectService(s: InstalledService): Promise<{
193
+ kid: string;
194
+ port: number;
195
+ }>;
196
+ /** 真的依赖,给 runTray */
197
+ export declare function realTrayDeps(host: ServiceHost, dir: string, file: string, version: () => string): TrayDeps;
198
+ /** 登录项跑的命令 */
199
+ export declare const trayArgs: (host: HostPaths, o?: {
200
+ node?: string;
201
+ bin?: string;
202
+ }) => string[];
203
+ /** macOS 的 LaunchAgent:登录就起,崩了拉起,以 0 退(点了退出)不拉 */
204
+ export declare function trayPlist(args: string[], dir: string, path: string): string;
205
+ /** 装上并起来;已经装过就照现在的 node、bin 重写一遍再起(升级后新代码才生效)。started = false:登录项写好了,这个会话里起不来,下次登录出现 */
206
+ export declare function installTray(host: ServiceHost, o?: {
207
+ node?: string;
208
+ bin?: string;
209
+ }): Promise<{
210
+ file: string;
211
+ started: boolean;
212
+ }>;
213
+ /** 卸掉:停下、删登录项。remember = 家长说不要(以后 service install 也不再装) */
214
+ export declare function removeTray(host: ServiceHost, o?: {
215
+ remember?: boolean;
216
+ }): Promise<boolean>;
217
+ export interface TrayStatus {
218
+ supported: boolean;
219
+ installed: boolean;
220
+ running: boolean;
221
+ pid: number | null;
222
+ /** 家长关掉过(cotutor tray off) */
223
+ off: boolean;
224
+ /** Windows:下次登录还会不会起来;别的系统 null */
225
+ autostart: boolean | null;
226
+ }
227
+ export declare function trayStatus(host: ServiceHost): Promise<TrayStatus>;
228
+ /** service install 时跟着装:没做的系统、家长关掉过都跳过;返回给人看的结果 */
229
+ export declare function ensureTray(host: ServiceHost, o?: {
230
+ node?: string;
231
+ bin?: string;
232
+ }): Promise<'unsupported' | 'off' | 'started' | 'later'>;
233
+ /** service restart 时:图标进程也换上新代码(升级后跑的就是这条)。没开图标的不动,不能把 --no-tray 的装回来 */
234
+ export declare function refreshTray(host: ServiceHost): Promise<boolean>;
235
+ /** 服务卸完了:图标也撤(不算家长说不要,以后再装服务还会带上) */
236
+ export declare function dropTrayIfNoServices(host: ServiceHost): Promise<boolean>;