@leeoohoo/ui-apps-devkit 0.1.0 → 0.1.2
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/README.md +75 -60
- package/bin/chatos-uiapp.js +4 -4
- package/package.json +26 -20
- package/src/cli.js +53 -53
- package/src/commands/dev.js +14 -14
- package/src/commands/init.js +131 -129
- package/src/commands/install.js +47 -46
- package/src/commands/pack.js +72 -72
- package/src/commands/validate.js +138 -80
- package/src/lib/args.js +49 -49
- package/src/lib/config.js +29 -29
- package/src/lib/fs.js +78 -78
- package/src/lib/path-boundary.js +16 -16
- package/src/lib/plugin.js +45 -45
- package/src/lib/state-constants.js +2 -0
- package/src/lib/template.js +172 -168
- package/src/sandbox/server.js +1957 -692
- package/templates/basic/README.md +78 -54
- package/templates/basic/chatos.config.json +5 -5
- package/templates/basic/docs/CHATOS_UI_APPS_AI_CONTRIBUTIONS.md +214 -181
- package/templates/basic/docs/CHATOS_UI_APPS_BACKEND_PROTOCOL.md +75 -74
- package/templates/basic/docs/CHATOS_UI_APPS_HOST_API.md +136 -123
- package/templates/basic/docs/CHATOS_UI_APPS_OVERVIEW.md +112 -107
- package/templates/basic/docs/CHATOS_UI_APPS_PLUGIN_MANIFEST.md +242 -227
- package/templates/basic/docs/CHATOS_UI_APPS_STYLE_GUIDE.md +95 -0
- package/templates/basic/docs/CHATOS_UI_APPS_TROUBLESHOOTING.md +45 -0
- package/templates/basic/docs/CHATOS_UI_PROMPTS_PROTOCOL.md +392 -392
- package/templates/basic/plugin/apps/app/compact.mjs +41 -0
- package/templates/basic/plugin/apps/app/index.mjs +287 -263
- package/templates/basic/plugin/apps/app/mcp-prompt.en.md +7 -7
- package/templates/basic/plugin/apps/app/mcp-prompt.zh.md +7 -7
- package/templates/basic/plugin/apps/app/mcp-server.mjs +15 -15
- package/templates/basic/plugin/backend/index.mjs +37 -37
- package/templates/basic/template.json +7 -7
- package/templates/notepad/README.md +55 -24
- package/templates/notepad/chatos.config.json +4 -4
- package/templates/notepad/docs/CHATOS_UI_APPS_AI_CONTRIBUTIONS.md +214 -181
- package/templates/notepad/docs/CHATOS_UI_APPS_BACKEND_PROTOCOL.md +75 -74
- package/templates/notepad/docs/CHATOS_UI_APPS_HOST_API.md +136 -123
- package/templates/notepad/docs/CHATOS_UI_APPS_OVERVIEW.md +112 -107
- package/templates/notepad/docs/CHATOS_UI_APPS_PLUGIN_MANIFEST.md +242 -227
- package/templates/notepad/docs/CHATOS_UI_APPS_STYLE_GUIDE.md +95 -0
- package/templates/notepad/docs/CHATOS_UI_APPS_TROUBLESHOOTING.md +45 -0
- package/templates/notepad/docs/CHATOS_UI_PROMPTS_PROTOCOL.md +392 -392
- package/templates/notepad/plugin/apps/app/api.mjs +30 -30
- package/templates/notepad/plugin/apps/app/compact.mjs +41 -0
- package/templates/notepad/plugin/apps/app/dom.mjs +14 -14
- package/templates/notepad/plugin/apps/app/ds-tree.mjs +35 -35
- package/templates/notepad/plugin/apps/app/index.mjs +1056 -1056
- package/templates/notepad/plugin/apps/app/layers.mjs +338 -338
- package/templates/notepad/plugin/apps/app/markdown.mjs +120 -120
- package/templates/notepad/plugin/apps/app/mcp-prompt.en.md +22 -22
- package/templates/notepad/plugin/apps/app/mcp-prompt.zh.md +22 -22
- package/templates/notepad/plugin/apps/app/mcp-server.mjs +206 -199
- package/templates/notepad/plugin/apps/app/styles.mjs +355 -355
- package/templates/notepad/plugin/apps/app/tags.mjs +21 -21
- package/templates/notepad/plugin/apps/app/ui.mjs +280 -280
- package/templates/notepad/plugin/backend/index.mjs +99 -99
- package/templates/notepad/plugin/plugin.json +23 -23
- package/templates/notepad/plugin/shared/notepad-paths.mjs +59 -41
- package/templates/notepad/plugin/shared/notepad-store.mjs +765 -765
- package/templates/notepad/template.json +8 -8
|
@@ -1,227 +1,242 @@
|
|
|
1
|
-
# ChatOS UI Apps:`plugin.json` 清单规范(协议)
|
|
2
|
-
|
|
3
|
-
本文件定义 UI Apps 插件清单 `plugin.json` 的字段与约束,目标是让第三方/内置应用都能按统一契约被 ChatOS 扫描、加载与运行。
|
|
4
|
-
|
|
5
|
-
实现对照(以代码为准):
|
|
6
|
-
|
|
7
|
-
- schema:`
|
|
8
|
-
- 扫描/校验:`
|
|
9
|
-
- 导入/安装:`
|
|
10
|
-
|
|
11
|
-
另见:
|
|
12
|
-
|
|
13
|
-
- [`CHATOS_UI_APPS_HOST_API.md`](./CHATOS_UI_APPS_HOST_API.md)(`module` 应用与宿主交互)
|
|
14
|
-
- [`CHATOS_UI_APPS_BACKEND_PROTOCOL.md`](./CHATOS_UI_APPS_BACKEND_PROTOCOL.md)(插件后端)
|
|
15
|
-
- [`CHATOS_UI_APPS_AI_CONTRIBUTIONS.md`](./CHATOS_UI_APPS_AI_CONTRIBUTIONS.md)(MCP/Prompt 暴露)
|
|
16
|
-
|
|
17
|
-
## 1. 文件与安装位置
|
|
18
|
-
|
|
19
|
-
- 每个插件一个目录,目录根部必须包含 `plugin.json`。
|
|
20
|
-
- 插件目录可放在:
|
|
21
|
-
- `
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
| `
|
|
33
|
-
| `
|
|
34
|
-
| `
|
|
35
|
-
| `
|
|
36
|
-
| `
|
|
37
|
-
| `
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
| `
|
|
53
|
-
| `
|
|
54
|
-
| `
|
|
55
|
-
| `
|
|
56
|
-
| `
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
`ai
|
|
117
|
-
|
|
118
|
-
| 字段 | 类型 |
|
|
119
|
-
|
|
120
|
-
| `
|
|
121
|
-
| `
|
|
122
|
-
| `
|
|
123
|
-
| `
|
|
124
|
-
| `
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
`
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
"
|
|
220
|
-
"
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
1
|
+
# ChatOS UI Apps:`plugin.json` 清单规范(协议)
|
|
2
|
+
|
|
3
|
+
本文件定义 UI Apps 插件清单 `plugin.json` 的字段与约束,目标是让第三方/内置应用都能按统一契约被 ChatOS 扫描、加载与运行。
|
|
4
|
+
|
|
5
|
+
实现对照(以代码为准):
|
|
6
|
+
|
|
7
|
+
- schema:`chatos/electron/ui-apps/schemas.js`
|
|
8
|
+
- 扫描/校验:`chatos/electron/ui-apps/index.js`
|
|
9
|
+
- 导入/安装:`chatos/electron/ui-apps/plugin-installer.js`
|
|
10
|
+
|
|
11
|
+
另见:
|
|
12
|
+
|
|
13
|
+
- [`CHATOS_UI_APPS_HOST_API.md`](./CHATOS_UI_APPS_HOST_API.md)(`module` 应用与宿主交互)
|
|
14
|
+
- [`CHATOS_UI_APPS_BACKEND_PROTOCOL.md`](./CHATOS_UI_APPS_BACKEND_PROTOCOL.md)(插件后端)
|
|
15
|
+
- [`CHATOS_UI_APPS_AI_CONTRIBUTIONS.md`](./CHATOS_UI_APPS_AI_CONTRIBUTIONS.md)(MCP/Prompt 暴露)
|
|
16
|
+
|
|
17
|
+
## 1. 文件与安装位置
|
|
18
|
+
|
|
19
|
+
- 每个插件一个目录,目录根部必须包含 `plugin.json`。
|
|
20
|
+
- 插件目录可放在:
|
|
21
|
+
- `chatos/ui_apps/plugins`(内置/开发)
|
|
22
|
+
- `<stateDir>/ui_apps/plugins`(用户插件目录;`stateDir = <stateRoot>/<hostApp>`)
|
|
23
|
+
- 兼容旧路径:若存在 `legacyStateRoot/<hostApp>/ui_apps/plugins`,启动时会自动迁移到 `stateDir`
|
|
24
|
+
- 也可通过桌面端 UI:`应用` → `导入应用包`(目录或 `.zip`)安装到用户插件目录。
|
|
25
|
+
|
|
26
|
+
## 2. 顶层 schema(`uiAppsPluginSchema`)
|
|
27
|
+
|
|
28
|
+
`plugin.json`(Top-level)字段:
|
|
29
|
+
|
|
30
|
+
| 字段 | 类型 | 必填 | 默认 | 说明 |
|
|
31
|
+
|---|---:|---:|---|---|
|
|
32
|
+
| `manifestVersion` | `number` | 否 | `1` | 目前仅支持 `1` |
|
|
33
|
+
| `id` | `string` | 是 | - | 插件 ID(使用反向域名;稳定且全局唯一) |
|
|
34
|
+
| `name` | `string` | 是 | - | 插件显示名称 |
|
|
35
|
+
| `version` | `string` | 否 | `"0.0.0"` | 版本号(展示用途) |
|
|
36
|
+
| `description` | `string` | 否 | `""` | 插件描述 |
|
|
37
|
+
| `backend` | `object` | 否 | - | 插件后端(Electron main 进程) |
|
|
38
|
+
| `apps` | `array` | 否 | `[]` | 插件内的应用列表 |
|
|
39
|
+
|
|
40
|
+
`backend`:
|
|
41
|
+
|
|
42
|
+
| 字段 | 类型 | 必填 | 说明 |
|
|
43
|
+
|---|---:|---:|---|
|
|
44
|
+
| `backend.entry` | `string` | 是 | 后端入口模块路径(相对插件目录;必须在插件目录内且是文件) |
|
|
45
|
+
|
|
46
|
+
## 3. apps schema(`uiAppSchema`)
|
|
47
|
+
|
|
48
|
+
`apps[i]` 字段:
|
|
49
|
+
|
|
50
|
+
| 字段 | 类型 | 必填 | 默认 | 说明 |
|
|
51
|
+
|---|---:|---:|---|---|
|
|
52
|
+
| `id` | `string` | 是 | - | 应用 ID(同一插件内唯一) |
|
|
53
|
+
| `name` | `string` | 是 | - | 应用显示名称 |
|
|
54
|
+
| `description` | `string` | 否 | `""` | 描述 |
|
|
55
|
+
| `icon` | `string` | 否 | `""` | 图标(当前实现以字符串透传为主) |
|
|
56
|
+
| `entry` | `object` | 是 | - | 入口(仅支持 `module`) |
|
|
57
|
+
| `ai` | `object|string` | 否 | - | AI 声明(MCP/Prompt/暴露列表等;详见下文) |
|
|
58
|
+
|
|
59
|
+
### 3.1 `apps[i].entry`(仅支持 `module`)
|
|
60
|
+
|
|
61
|
+
```json
|
|
62
|
+
{ "type": "module", "path": "my-app/index.mjs" }
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
可选:为“侧边抽屉/分栏/非全屏”等 **compact surface** 提供专门入口:
|
|
66
|
+
|
|
67
|
+
```json
|
|
68
|
+
{
|
|
69
|
+
"type": "module",
|
|
70
|
+
"path": "my-app/index.mjs",
|
|
71
|
+
"compact": { "type": "module", "path": "my-app/compact.mjs" }
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
硬约束:
|
|
76
|
+
|
|
77
|
+
- `entry.type` 必须为 `"module"`(ChatOS 不支持 `iframe/url`)。
|
|
78
|
+
- `entry.path` 必须在插件目录内(宿主做路径边界校验),且必须是文件。
|
|
79
|
+
- `entry.compact` 为可选;若提供,`entry.compact.path` 同样必须在插件目录内且必须是文件。
|
|
80
|
+
|
|
81
|
+
## 4. `apps[i].ai` schema(`uiAppAiSchema`)
|
|
82
|
+
|
|
83
|
+
`ai` 可以写成两种形式:
|
|
84
|
+
|
|
85
|
+
1) **对象**(inline):
|
|
86
|
+
|
|
87
|
+
```json
|
|
88
|
+
{
|
|
89
|
+
"ai": {
|
|
90
|
+
"mcpServers": true,
|
|
91
|
+
"prompts": true
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
2) **字符串路径**(等价于 `{ "config": "<path>" }`):
|
|
97
|
+
|
|
98
|
+
```json
|
|
99
|
+
{ "ai": "my-app/ai.yaml" }
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
对象形式还支持额外带一个 `config` 字段,用于从文件读取并与 inline 合并:
|
|
103
|
+
|
|
104
|
+
```json
|
|
105
|
+
{
|
|
106
|
+
"ai": {
|
|
107
|
+
"config": "my-app/ai.yaml",
|
|
108
|
+
"mcpServers": true,
|
|
109
|
+
"prompts": true
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
所有 `ai` 的 path(`ai.config`、`ai.mcp.entry`、`ai.mcpPrompt.*.path`)都必须在插件目录内,且文件大小受限(默认最大 `128 KiB`)。
|
|
115
|
+
|
|
116
|
+
### 4.1 `ai` 字段一览(`uiAppAiConfigSchema`)
|
|
117
|
+
|
|
118
|
+
| 字段 | 类型 | 说明 |
|
|
119
|
+
|---|---:|---|
|
|
120
|
+
| `ai.mcp` | `object` | 声明并同步一个 MCP Server(`serverName` 固定派生为 `${pluginId}.${appId}`) |
|
|
121
|
+
| `ai.mcpPrompt` | `string|object` | 声明并同步一个 system prompt(名称固定派生) |
|
|
122
|
+
| `ai.mcpServers` | `true|false|string[]` | 暴露给 Agent 的 MCP servers 范围(聚合“已有的”资源) |
|
|
123
|
+
| `ai.prompts` | `true|false|string[]` | 暴露给 Agent 的 prompts 范围(聚合“已有的”资源) |
|
|
124
|
+
| `ai.agent` | `object` | 可选:应用提供的 Agent 模板(当前实现主要做透传/保留字段) |
|
|
125
|
+
|
|
126
|
+
## 5. `ai.mcp`:MCP Server 声明
|
|
127
|
+
|
|
128
|
+
`ai.mcp` 字段(当前 schema):
|
|
129
|
+
|
|
130
|
+
| 字段 | 类型 | 必填 | 默认 | 说明 |
|
|
131
|
+
|---|---:|---:|---|---|
|
|
132
|
+
| `url` | `string` | 二选一 | - | 远程 MCP Server 地址(`http(s)://` / `ws(s)://` 等) |
|
|
133
|
+
| `entry` | `string` | 二选一 | - | 本地脚本入口(相对插件目录);宿主会转换为 `cmd://...` |
|
|
134
|
+
| `command` | `string` | 否 | `"node"` | 拉起本地 `entry` 时使用的命令 |
|
|
135
|
+
| `args` | `string[]` | 否 | `[]` | 拉起时追加参数 |
|
|
136
|
+
| `callMeta` | `object` | 否 | - | 调用 MCP 工具时注入到 `_meta` 的附加字段(不会暴露给 AI);支持 `$pluginId/$appId/$pluginDir/$dataDir/$stateDir/$sessionRoot/$projectRoot` 变量 |
|
|
137
|
+
| `description` | `string` | 否 | `""` | 描述 |
|
|
138
|
+
| `tags` | `string[]` | 否 | `[]` | 标签(宿主还会自动附加 `uiapp*` 标签) |
|
|
139
|
+
| `enabled` | `boolean` | 否 | - | 是否启用(未填则宿主同步时默认 `true`) |
|
|
140
|
+
| `allowMain` | `boolean` | 否 | - | 是否允许主流程使用(未填则宿主同步时默认 `true`) |
|
|
141
|
+
| `allowSub` | `boolean` | 否 | - | 是否允许子代理使用(未填则宿主同步时默认 `true`) |
|
|
142
|
+
| `auth` | `object` | 否 | - | 认证信息(token/basic/headers) |
|
|
143
|
+
|
|
144
|
+
强约束:
|
|
145
|
+
|
|
146
|
+
- 必须提供 `url` 或 `entry` 其中之一(只写 `command` 不算有效配置)。
|
|
147
|
+
|
|
148
|
+
`auth` 结构(均为可选,且支持 partial):
|
|
149
|
+
|
|
150
|
+
```json
|
|
151
|
+
{
|
|
152
|
+
"auth": {
|
|
153
|
+
"token": "…",
|
|
154
|
+
"basic": { "username": "u", "password": "p" },
|
|
155
|
+
"headers": { "X-Foo": "bar" }
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
当使用 `entry` 时,宿主会把它转换为可运行的 `cmd://`:
|
|
161
|
+
|
|
162
|
+
- `command` 默认为 `node`
|
|
163
|
+
- `args` 会追加到命令行末尾
|
|
164
|
+
- 宿主会把空格/引号等做安全引用,以避免路径包含空格时解析失败
|
|
165
|
+
|
|
166
|
+
`callMeta` 会随每次 `tools/call` 请求发送给 MCP server(位于 `request.params._meta`),默认会合并宿主注入的 `_meta.chatos.uiApp`(含 `pluginId/appId/pluginDir/dataDir/stateDir/sessionRoot/projectRoot`)与 `_meta.workdir`(默认等于 `dataDir`,可被 `callMeta.workdir` 覆盖)。
|
|
167
|
+
|
|
168
|
+
## 6. `ai.mcpPrompt`:应用默认 Prompt 声明
|
|
169
|
+
|
|
170
|
+
`ai.mcpPrompt` 支持两种写法:
|
|
171
|
+
|
|
172
|
+
1) **字符串**:等价于中文 prompt 从该路径读取:
|
|
173
|
+
|
|
174
|
+
```json
|
|
175
|
+
{ "mcpPrompt": "my-app/mcp-prompt.zh.md" }
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
2) **对象**:可分别提供 `zh`/`en`,并支持 path 或 inline content:
|
|
179
|
+
|
|
180
|
+
```json
|
|
181
|
+
{
|
|
182
|
+
"mcpPrompt": {
|
|
183
|
+
"title": "My App · MCP Prompt",
|
|
184
|
+
"zh": "my-app/mcp-prompt.zh.md",
|
|
185
|
+
"en": { "path": "my-app/mcp-prompt.en.md" }
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
`zh/en` 的“source”结构为:
|
|
191
|
+
|
|
192
|
+
```json
|
|
193
|
+
{ "path": "relative.md", "content": "inline markdown…" }
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
约束:
|
|
197
|
+
|
|
198
|
+
- `mcpPrompt` 必须至少提供 `zh` 或 `en` 其一;
|
|
199
|
+
- 若提供 `path`,必须在插件目录内且是文件;
|
|
200
|
+
- 内容大小受限(默认最大 `128 KiB`)。
|
|
201
|
+
|
|
202
|
+
## 7. `ai.mcpServers` / `ai.prompts`:聚合暴露范围
|
|
203
|
+
|
|
204
|
+
- `true`:开启暴露(“具体暴露哪些”由 `ai.config` / 内置默认清单决定;否则表示全部)
|
|
205
|
+
- `false`:禁用暴露
|
|
206
|
+
- `string[]`:精确列出允许暴露的 `serverName` / `prompt name`
|
|
207
|
+
|
|
208
|
+
注意:这里定义的是“在 Agent UI 中可选/可见的范围”,最终是否启用、启用哪些仍由 Agent 编辑页勾选决定。
|
|
209
|
+
|
|
210
|
+
## 8. 最小示例
|
|
211
|
+
|
|
212
|
+
### 8.1 最小可运行插件(仅 module)
|
|
213
|
+
|
|
214
|
+
```json
|
|
215
|
+
{
|
|
216
|
+
"manifestVersion": 1,
|
|
217
|
+
"id": "com.example.tools",
|
|
218
|
+
"name": "Example Tools",
|
|
219
|
+
"version": "0.1.0",
|
|
220
|
+
"apps": [
|
|
221
|
+
{
|
|
222
|
+
"id": "hello",
|
|
223
|
+
"name": "Hello App(Module)",
|
|
224
|
+
"entry": { "type": "module", "path": "hello/index.mjs" }
|
|
225
|
+
}
|
|
226
|
+
]
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### 8.2 带后端 + MCP/Prompt 的应用(节选)
|
|
231
|
+
|
|
232
|
+
```json
|
|
233
|
+
{
|
|
234
|
+
"id": "db-client",
|
|
235
|
+
"name": "数据库客户端",
|
|
236
|
+
"entry": { "type": "module", "path": "db-client/index.mjs" },
|
|
237
|
+
"ai": {
|
|
238
|
+
"mcp": { "entry": "db-client/mcp-server.mjs", "command": "node", "allowMain": true, "allowSub": true },
|
|
239
|
+
"mcpPrompt": { "zh": "db-client/mcp-prompt.zh.md", "en": "db-client/mcp-prompt.en.md" }
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
```
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# ChatOS UI Apps: Theme and Styles Guide
|
|
2
|
+
|
|
3
|
+
本文件说明 UI Apps 的主题与样式约定, 以宿主实现为准.
|
|
4
|
+
|
|
5
|
+
## 1. 主题来源
|
|
6
|
+
|
|
7
|
+
- 宿主通过 `document.documentElement.dataset.theme` 下发主题, 取值 `light` / `dark`.
|
|
8
|
+
- 读取: `host.context.get().theme` / `host.theme.get()`.
|
|
9
|
+
- 监听: `host.theme.onChange(listener)`.
|
|
10
|
+
|
|
11
|
+
## 2. 沙箱测试
|
|
12
|
+
|
|
13
|
+
- DevKit sandbox 右上角提供 Theme 切换 (light/dark/system).
|
|
14
|
+
- `system` 模式跟随 `prefers-color-scheme`.
|
|
15
|
+
- sandbox 同时写入 `document.documentElement.dataset.theme` 和 `dataset.themeMode`.
|
|
16
|
+
- Inspect 面板可查看 `host.context` 与 `--ds-*` tokens, tokens 列表会尝试从 `common/aide-ui/components/GlobalStyles.jsx` 自动读取.
|
|
17
|
+
|
|
18
|
+
## 3. 常用 CSS Tokens (subset)
|
|
19
|
+
|
|
20
|
+
以下为宿主常用 token 的子集, 具体以实现为准. 推荐在非 ChatOS 环境下保留 fallback.
|
|
21
|
+
|
|
22
|
+
基础:
|
|
23
|
+
- `--ds-accent`
|
|
24
|
+
- `--ds-accent-2`
|
|
25
|
+
- `--ds-accent-app`
|
|
26
|
+
|
|
27
|
+
容器与面板:
|
|
28
|
+
- `--ds-page-bg`
|
|
29
|
+
- `--ds-header-bg`
|
|
30
|
+
- `--ds-header-border`
|
|
31
|
+
- `--ds-panel-bg`
|
|
32
|
+
- `--ds-panel-border`
|
|
33
|
+
- `--ds-panel-shadow`
|
|
34
|
+
- `--ds-subtle-bg`
|
|
35
|
+
- `--ds-selected-bg`
|
|
36
|
+
- `--ds-floating-bg`
|
|
37
|
+
- `--ds-floating-border`
|
|
38
|
+
- `--ds-floating-shadow`
|
|
39
|
+
- `--ds-focus-ring`
|
|
40
|
+
|
|
41
|
+
导航:
|
|
42
|
+
- `--ds-nav-bg`
|
|
43
|
+
- `--ds-nav-border`
|
|
44
|
+
- `--ds-nav-shadow`
|
|
45
|
+
- `--ds-nav-hover-bg`
|
|
46
|
+
|
|
47
|
+
状态:
|
|
48
|
+
- `--ds-change-bg-error`
|
|
49
|
+
- `--ds-change-bg-warning`
|
|
50
|
+
- `--ds-change-bg-success`
|
|
51
|
+
|
|
52
|
+
代码:
|
|
53
|
+
- `--ds-code-bg`
|
|
54
|
+
- `--ds-code-border`
|
|
55
|
+
- `--ds-code-inline-bg`
|
|
56
|
+
- `--ds-code-inline-border`
|
|
57
|
+
- `--ds-code-line-number`
|
|
58
|
+
- `--ds-blockquote-border`
|
|
59
|
+
- `--ds-blockquote-text`
|
|
60
|
+
- `--ds-code-text`
|
|
61
|
+
- `--ds-code-comment`
|
|
62
|
+
- `--ds-code-keyword`
|
|
63
|
+
- `--ds-code-string`
|
|
64
|
+
- `--ds-code-number`
|
|
65
|
+
- `--ds-code-built-in`
|
|
66
|
+
- `--ds-code-attr`
|
|
67
|
+
- `--ds-code-title`
|
|
68
|
+
- `--ds-code-meta`
|
|
69
|
+
|
|
70
|
+
Token 来源: `common/aide-ui/components/GlobalStyles.jsx`.
|
|
71
|
+
|
|
72
|
+
## 4. 推荐写法
|
|
73
|
+
|
|
74
|
+
CSS:
|
|
75
|
+
|
|
76
|
+
```css
|
|
77
|
+
.card {
|
|
78
|
+
background: var(--ds-panel-bg);
|
|
79
|
+
border: 1px solid var(--ds-panel-border);
|
|
80
|
+
box-shadow: var(--ds-panel-shadow, none);
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
JS inline style:
|
|
85
|
+
|
|
86
|
+
```js
|
|
87
|
+
el.style.border = '1px solid var(--ds-panel-border, rgba(0,0,0,0.12))';
|
|
88
|
+
el.style.background = 'var(--ds-subtle-bg, rgba(0,0,0,0.04))';
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## 5. 注意事项
|
|
92
|
+
|
|
93
|
+
- 避免硬编码颜色, 用 token 统一主题适配.
|
|
94
|
+
- 仅在必要时使用 `prefers-color-scheme`, 优先跟随宿主 theme.
|
|
95
|
+
- 避免污染全局 `html/body` 样式, 样式尽量限定在容器内.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# ChatOS UI Apps: Troubleshooting
|
|
2
|
+
|
|
3
|
+
本文件汇总常见问题与排查思路, 以宿主实现为准.
|
|
4
|
+
|
|
5
|
+
## 1. host 不可用或 bridge disabled
|
|
6
|
+
|
|
7
|
+
- 现象: `host` 为空, 或 `host.bridge.enabled === false`.
|
|
8
|
+
- 原因: 未在 ChatOS 宿主环境运行, 或 preload bridge 未加载.
|
|
9
|
+
- 处理: 在沙箱中调试, 生产环境用 `host.bridge.enabled` 做降级判断.
|
|
10
|
+
|
|
11
|
+
## 2. module entry 报错或 mount 缺失
|
|
12
|
+
|
|
13
|
+
- 现象: sandbox 报 "module entry must export mount()".
|
|
14
|
+
- 原因: 入口没有导出 `mount`, 或 `plugin.json` 的 `apps[i].entry.path` 指向错误.
|
|
15
|
+
- 处理: 确认 `apps[i].entry.type === "module"` 且路径在插件目录内.
|
|
16
|
+
|
|
17
|
+
## 3. backend.invoke 失败
|
|
18
|
+
|
|
19
|
+
- 现象: `host.backend.invoke()` 抛错或返回失败.
|
|
20
|
+
- 原因: `plugin/backend/index.mjs` 缺失或未导出 `createUiAppsBackend(ctx)`.
|
|
21
|
+
- 处理: 补齐后端入口, 在沙箱里重新加载, 并检查路径边界.
|
|
22
|
+
|
|
23
|
+
## 4. 主题不更新
|
|
24
|
+
|
|
25
|
+
- 现象: 切换主题后样式不变.
|
|
26
|
+
- 原因: 未监听 `host.theme.onChange`, 或样式硬编码颜色.
|
|
27
|
+
- 处理: 使用 `host.theme.*` 监听, 样式用 `--ds-*` tokens.
|
|
28
|
+
|
|
29
|
+
## 5. 资源加载 404
|
|
30
|
+
|
|
31
|
+
- 现象: 图片/资源在沙箱中 404.
|
|
32
|
+
- 原因: 路径不在插件目录内, 或未通过相对路径引用.
|
|
33
|
+
- 处理: 用 `new URL('./asset.png', import.meta.url)` 或打包生成产物.
|
|
34
|
+
|
|
35
|
+
## 6. UI Prompts 不显示
|
|
36
|
+
|
|
37
|
+
- 现象: `host.uiPrompts.request()` 后无面板.
|
|
38
|
+
- 原因: 未调用 `host.uiPrompts.open()`, 或 `prompt.kind` 填写错误.
|
|
39
|
+
- 处理: 先调用 `open()` 打开面板, 并按协议填写 `prompt`.
|
|
40
|
+
|
|
41
|
+
## 7. MCP 不生效
|
|
42
|
+
|
|
43
|
+
- 现象: MCP tools / prompts 未出现.
|
|
44
|
+
- 原因: 未在 `plugin.json` 启用 `ai.mcp`, 或 MCP 依赖未 bundle(ChatOS 导入会剔除 `node_modules`).
|
|
45
|
+
- 处理: 将 MCP server bundle 成单文件(或 vendor 依赖), 并检查 `ai.mcp.entry` / `ai.mcpPrompt` 配置.
|