@steerable/pack-sdk 0.6.15

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/LICENSE ADDED
@@ -0,0 +1,91 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity.
18
+
19
+ "You" (or "Your") shall mean an individual or Legal Entity
20
+ exercising permissions granted by this License.
21
+
22
+ "Source" form shall mean the preferred form for making modifications.
23
+
24
+ "Object" form shall mean any form resulting from mechanical
25
+ transformation or translation of a Source form.
26
+
27
+ "Work" shall mean the work of authorship made available under the
28
+ License.
29
+
30
+ "Derivative Works" shall mean any work based on the Work.
31
+
32
+ "Contribution" shall mean any work of authorship intentionally
33
+ submitted to Licensor for inclusion in the Work.
34
+
35
+ "Contributor" shall mean Licensor and any individual or Legal Entity
36
+ on behalf of whom a Contribution has been received by Licensor.
37
+
38
+ 2. Grant of Copyright License.
39
+ Subject to the terms and conditions of this License, each Contributor
40
+ hereby grants to You a perpetual, worldwide, non-exclusive, no-charge,
41
+ royalty-free, irrevocable copyright license to reproduce, prepare
42
+ Derivative Works of, publicly display, publicly perform, sublicense,
43
+ and distribute the Work and such Derivative Works in Source or Object
44
+ form.
45
+
46
+ 3. Grant of Patent License.
47
+ Subject to the terms and conditions of this License, each Contributor
48
+ hereby grants to You a perpetual, worldwide, non-exclusive, no-charge,
49
+ royalty-free, irrevocable patent license to make, have made, use,
50
+ offer to sell, sell, import, and otherwise transfer the Work.
51
+
52
+ 4. Redistribution.
53
+ You may reproduce and distribute copies of the Work or Derivative
54
+ Works thereof in any medium, with or without modifications, and in
55
+ Source or Object form, provided that You meet the following conditions:
56
+
57
+ (a) You must give any other recipients of the Work or Derivative
58
+ Works a copy of this License; and
59
+ (b) You must cause any modified files to carry prominent notices
60
+ stating that You changed the files; and
61
+ (c) You must retain, in the Source form of any Derivative Works that
62
+ You distribute, all copyright, patent, trademark, and attribution
63
+ notices from the Source form of the Work; and
64
+ (d) If the Work includes a "NOTICE" text file as part of its
65
+ distribution, then any Derivative Works that You distribute must
66
+ include a readable copy of the attribution notices contained within
67
+ such NOTICE file.
68
+
69
+ 5. Submission of Contributions.
70
+ Unless You explicitly state otherwise, any Contribution intentionally
71
+ submitted for inclusion in the Work shall be under the terms and
72
+ conditions of this License.
73
+
74
+ 6. Trademarks.
75
+ This License does not grant permission to use the trade names,
76
+ trademarks, service marks, or product names of the Licensor.
77
+
78
+ 7. Disclaimer of Warranty.
79
+ Unless required by applicable law or agreed to in writing, Licensor
80
+ provides the Work on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
81
+ OF ANY KIND.
82
+
83
+ 8. Limitation of Liability.
84
+ In no event and under no legal theory shall any Contributor be liable
85
+ to You for damages arising as a result of this License or out of the
86
+ use or inability to use the Work.
87
+
88
+ 9. Accepting Warranty or Additional Liability.
89
+ While redistributing the Work or Derivative Works thereof, You may
90
+ choose to offer, and charge a fee for, acceptance of support, warranty,
91
+ indemnity, or other liability obligations.
package/README.md ADDED
@@ -0,0 +1,10 @@
1
+ # @steerable/pack-sdk
2
+
3
+ Scenario pack contract for `@steerable/agent-shell` — pure types, zero runtime.
4
+
5
+ A scenario pack declares every extension a vertical scenario needs (services,
6
+ tools, tables, skills, agent seeds, IPC, HTTP routes, preload bridge, renderer
7
+ slots, branding), and the host composes the selected packs at build time. This
8
+ package ships only `types/`; there is no runtime code.
9
+
10
+ License: Apache-2.0.
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@steerable/pack-sdk",
3
+ "version": "0.6.15",
4
+ "type": "module",
5
+ "description": "Scenario pack contract for @steerable/agent-shell (pure types, zero runtime). A scenario pack declares every extension a vertical scenario needs — services, tools, tables, skills, agent seeds, IPC, HTTP routes, preload bridge, renderer slots, branding — and the host composes the selected packs at build time.",
6
+ "license": "Apache-2.0",
7
+ "homepage": "https://steerableframework.com/",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/pathlyapp/steerable-framework.git",
11
+ "directory": "packages/pack-sdk/ts"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/pathlyapp/steerable-framework/issues"
15
+ },
16
+ "exports": {
17
+ ".": {
18
+ "types": "./types/index.d.ts"
19
+ },
20
+ "./web": {
21
+ "types": "./types/web.d.ts"
22
+ }
23
+ },
24
+ "files": [
25
+ "types",
26
+ "README.md"
27
+ ],
28
+ "publishConfig": {
29
+ "access": "public",
30
+ "provenance": true
31
+ },
32
+ "devDependencies": {
33
+ "@types/react": "^18.3.12",
34
+ "typescript": "^5.8.3",
35
+ "vitest": "^3.2.4"
36
+ },
37
+ "scripts": {
38
+ "gen": "echo pack-sdk-ts",
39
+ "build": "echo types-only",
40
+ "test": "vitest run --passWithNoTests",
41
+ "lint": "tsc -p tsconfig.json --noEmit",
42
+ "check:drift": "echo ok"
43
+ }
44
+ }
@@ -0,0 +1,307 @@
1
+ /**
2
+ * @steerable/pack-sdk —— 场景智能体包契约(纯类型,零运行时)。
3
+ *
4
+ * 一个「场景包」把一个垂直场景(如某行业的专业工具链……)需要的全部
5
+ * 扩展声明集中在一处:主进程服务/工具/表/技能/智能体种子/IPC/HTTP 路由、
6
+ * preload 桥、渲染层插槽、品牌与打包覆盖。宿主(CS Electron 主进程与
7
+ * BS headless server)按产品组装时选中的包集合,逐个槽位消费这些声明。
8
+ *
9
+ * 设计约束:
10
+ * - 本包是零依赖纯类型:不允许 import 宿主内部模块(tool-router、
11
+ * storage 等),否则宿主消费接口时会形成循环依赖。宿主侧类型
12
+ * (ToolMode 等)的单一真源在本包,宿主模块 re-export 兼容。
13
+ * - 槽位只开有真实场景代码论证的(既有场景包 diff 的并集),
14
+ * 不凭空膨胀。新槽位 = 新场景的真实需求驱动。
15
+ * - 组合发生在构建期:产品的 composition root 静态 import 自己的包;
16
+ * 渲染层受 Electron CSP + preload 白名单约束,不做运行时动态加载。
17
+ *
18
+ * 渲染层贡献类型在 './web' 子路径(依赖 React 类型,主进程侧勿引)。
19
+ *
20
+ * 槽位集合由真实场景包(应用仓库内)的 diff 并集论证。
21
+ */
22
+
23
+ /** 场景 id。开放字符串(不再是二值联合)。 */
24
+ export type ScenarioId = string;
25
+
26
+ /**
27
+ * 工具安全分级与曝光层。这两个枚举的单一真源在本包(0.3a 从
28
+ * tool-router.ts 迁入);tool-router re-export 兼容既有调用方。
29
+ */
30
+ export type ToolMode =
31
+ | 'read'
32
+ | 'ui'
33
+ | 'synthetic'
34
+ | 'safe_write'
35
+ | 'destructive'
36
+ | 'local'
37
+ | 'external'
38
+ | 'auto_local';
39
+
40
+ export type ToolExposure = 'direct' | 'deferred' | 'hidden';
41
+
42
+ /**
43
+ * 工具执行上下文(与宿主 ToolExecContext 结构对齐的最小声明)。
44
+ * 宿主在分发时注入;包不应假设字段以外的任何宿主状态。
45
+ */
46
+ export interface PackToolContext {
47
+ /** 项目模式沙箱根;非空时文件/shell 工具必须落在根内。 */
48
+ projectRoot?: string | null;
49
+ /** 调用发生的 chat id;任务类工具按它归组。 */
50
+ chatId?: string;
51
+ }
52
+
53
+ /** 工具 handler:接收模型 JSON 参数与调用上下文,返回可 JSON 序列化的结果。 */
54
+ export type PackToolHandler = (
55
+ args: Record<string, unknown>,
56
+ context: PackToolContext,
57
+ ) => Promise<unknown>;
58
+
59
+ /** 一个模型可见工具的贡献:schema + 执行体。 */
60
+ export interface ToolContribution {
61
+ readonly name: string;
62
+ readonly description: string;
63
+ readonly inputSchema: Record<string, unknown>;
64
+ readonly mode: ToolMode;
65
+ /** 缺省 'direct'。 */
66
+ readonly exposure?: ToolExposure;
67
+ readonly handler: PackToolHandler;
68
+ }
69
+
70
+ /**
71
+ * 主进程长驻领域服务(如 CflogService / PptEditService)。
72
+ * 宿主在装配期调用 create,把返回值交给包内工具/IPC/路由使用;
73
+ * 宿主不感知服务类型——包内部通过闭包共享。
74
+ */
75
+ export interface ServiceFactory {
76
+ readonly serviceId: string;
77
+ /** 装配上下文目前只承诺 broadcast;需要更多宿主能力时在这里加字段。 */
78
+ readonly create: (ctx: ServiceCreateContext) => unknown;
79
+ /** 可选关停钩子;宿主退出时按注册逆序调用。 */
80
+ readonly dispose?: (service: unknown) => void | Promise<void>;
81
+ }
82
+
83
+ export interface ServiceCreateContext {
84
+ /** 向用户面广播事件(CS=IPC webContents.send,BS=SSE 总线)。 */
85
+ broadcast: (channel: string, payload: unknown) => void;
86
+ }
87
+
88
+ /**
89
+ * SQLite 迁移:一串 DDL 语句(CREATE TABLE/INDEX IF NOT EXISTS …),
90
+ * 宿主在建库迁移阶段按包声明顺序执行。表名必须带包前缀(<pack>_*
91
+ * ppt_*),跨包不许共享表。
92
+ */
93
+ export interface MigrationContribution {
94
+ /** DDL 语句(CREATE TABLE/INDEX IF NOT EXISTS …),合并为一次 exec 执行。 */
95
+ readonly ddl?: readonly string[];
96
+ /** 增量列迁移(已有库的 ALTER TABLE ADD COLUMN,列已存在则跳过)。 */
97
+ readonly ensureColumns?: readonly { table: string; column: string; type: string }[];
98
+ }
99
+
100
+ /** 技能贡献:包内一个含 SKILL.md 的目录,构建期拷入产物技能根。 */
101
+ export interface SkillContribution {
102
+ /** 相对包根的目录路径(目录名即技能 id,如 '90-<pack>')。 */
103
+ readonly dir: string;
104
+ }
105
+
106
+ /**
107
+ * 内置智能体种子的历史身份:名字 + 提示词开头(+ 可选描述),用于识别
108
+ * 「从未被用户改过」的内置行——改过的行永远保留用户定制。
109
+ */
110
+ export interface AgentSeedIdentity {
111
+ readonly name: string;
112
+ /** 缺省表示「描述与当前代一致」才算未定制。 */
113
+ readonly description?: string;
114
+ /** 历史代 rolePrompt 只做前缀匹配(旧文案可能被后续版本续写)。 */
115
+ readonly rolePromptHead: string;
116
+ }
117
+
118
+ /**
119
+ * 内置智能体种子。宿主在包在场时种子/按 previousIdentities 静默升级、
120
+ * 包缺席且用户从未定制过时归档;改过的行永远保留用户定制。
121
+ */
122
+ export interface AgentSeed {
123
+ readonly id: string;
124
+ readonly slug: string;
125
+ readonly name: string;
126
+ readonly icon?: string;
127
+ readonly color?: string;
128
+ readonly description?: string;
129
+ readonly rolePrompt: string;
130
+ readonly forbiddenPrompt?: string;
131
+ readonly skillIds?: readonly string[];
132
+ readonly loadAllSkills?: boolean;
133
+ /**
134
+ * 列表位置。0 = 主打智能体:宿主默认智能体在出厂状态下让位到 1
135
+ * (双方都未脱离出厂位置才交换,用户调过序不动)。
136
+ */
137
+ readonly sortOrder?: number;
138
+ readonly previousIdentities?: readonly AgentSeedIdentity[];
139
+ }
140
+
141
+ /** IPC 贡献:channel 必须以前缀 '<packId>:' 开头(注册表强制)。 */
142
+ export interface IpcContribution {
143
+ readonly channel: string;
144
+ /** 参数为 renderer 经 preload 透传的序列化载荷。 */
145
+ readonly handler: (payload: unknown) => Promise<unknown> | unknown;
146
+ }
147
+
148
+ /** BS 模式 HTTP 路由贡献(/host/<packId>/* 命名空间,见 host/http-routes.ts)。 */
149
+ export interface HttpRouteContribution {
150
+ readonly method: 'GET' | 'POST' | 'PUT' | 'DELETE';
151
+ /** 路径模式,如 '/api/v2/ppt-edits/:id'。必须带包前缀路径段。 */
152
+ readonly path: string;
153
+ readonly handler: (req: HttpRouteRequest) => Promise<unknown>;
154
+ }
155
+
156
+ export interface HttpRouteRequest {
157
+ readonly params: Record<string, string>;
158
+ readonly query: Record<string, string>;
159
+ readonly body: unknown;
160
+ }
161
+
162
+ /** 主进程面贡献集合。 */
163
+ export interface MainContribution {
164
+ readonly services?: readonly ServiceFactory[];
165
+ readonly tools?: readonly ToolContribution[];
166
+ readonly migrations?: readonly MigrationContribution[];
167
+ readonly skills?: readonly SkillContribution[];
168
+ readonly agentSeeds?: readonly AgentSeed[];
169
+ readonly ipc?: readonly IpcContribution[];
170
+ readonly httpRoutes?: readonly HttpRouteContribution[];
171
+ }
172
+
173
+ /**
174
+ * preload 桥白名单:包在 window.electron 下挂 '<packId>' 命名空间。
175
+ * 具体桥接函数由包的 preload 模块实现;这里只声明命名空间占用,
176
+ * 宿主据此做 CSP/白名单装配。
177
+ */
178
+ export interface PreloadContribution {
179
+ readonly namespace: string;
180
+ }
181
+
182
+ /**
183
+ * 渲染层组件引用。主进程侧不依赖 React,这里用结构化最小类型;
184
+ * 渲染层注册表(apps/web)消费时收窄到具体组件类型。
185
+ */
186
+ export type ComponentRef = unknown;
187
+
188
+ export interface SettingsPanelContribution {
189
+ readonly panelId: string;
190
+ readonly title: string;
191
+ readonly component: ComponentRef;
192
+ }
193
+
194
+ export interface RouteContribution {
195
+ /** hash 路由路径,如 '/<pack>-debug-log'。 */
196
+ readonly path: string;
197
+ readonly component: ComponentRef;
198
+ /** 独立窗口(无侧栏)还是嵌进 AgentLayout。 */
199
+ readonly standalone?: boolean;
200
+ }
201
+
202
+ export interface ChatSlotContribution {
203
+ readonly slotId: string;
204
+ readonly component: ComponentRef;
205
+ }
206
+
207
+ /** 消息卡片渲染器:按工具名/块类型匹配。 */
208
+ export interface CardRendererContribution {
209
+ readonly match: string;
210
+ readonly component: ComponentRef;
211
+ }
212
+
213
+ /** 渲染层面贡献集合。 */
214
+ export interface RendererContribution {
215
+ readonly settingsPanels?: readonly SettingsPanelContribution[];
216
+ readonly routes?: readonly RouteContribution[];
217
+ readonly chatSlots?: readonly ChatSlotContribution[];
218
+ readonly cardRenderers?: readonly CardRendererContribution[];
219
+ }
220
+
221
+ /** 品牌规格:运行时文案与默认智能体。 */
222
+ export interface BrandSpec {
223
+ /** UI 显示名:窗口标题、通知标题等。 */
224
+ readonly displayName: string;
225
+ /** LLM 身份自称(系统提示词里用)。 */
226
+ readonly agentName: string;
227
+ /** 一句话定位(fallback prompt 用)。 */
228
+ readonly tagline: string;
229
+ /** 新对话未显式选智能体时绑定的内置智能体 id。 */
230
+ readonly defaultAgentId: string;
231
+ }
232
+
233
+ /** 打包覆盖:产品组装期消费,不进运行时。 */
234
+ export interface PackagingSpec {
235
+ readonly appId: string;
236
+ readonly productName: string;
237
+ /** 发布产物目录名(release-<x>)与下载通道段。 */
238
+ readonly artifactDirName: string;
239
+ readonly downloadChannel: string;
240
+ /** 包需要额外打进产物的资源(相对包根)。 */
241
+ readonly extraResources?: readonly string[];
242
+ }
243
+
244
+ /**
245
+ * 场景包契约。所有槽位可选;一个包至少要有 brand(纯品牌产品)
246
+ * 或一个实质贡献槽。
247
+ */
248
+ export interface ScenarioPack {
249
+ readonly id: ScenarioId;
250
+ readonly brand: BrandSpec;
251
+ readonly main?: MainContribution;
252
+ readonly preload?: PreloadContribution;
253
+ readonly renderer?: RendererContribution;
254
+ readonly packaging?: PackagingSpec;
255
+ }
256
+
257
+ // ─── local-backend 包路由(/api/v2/<包前缀>/*)契约 ───
258
+ // 注册表实现住在宿主 src/local-backend/pack-backend-routes.ts;这里只放类型。
259
+
260
+ /** 包路由响应:与宿主 router 的 LocalBackendResponse 结构对齐。 */
261
+ export interface PackBackendRouteResponse<T = unknown> {
262
+ status: number;
263
+ data: T;
264
+ }
265
+
266
+ /** 包路由请求:段参数 + query + 反序列化后的 body。 */
267
+ export interface PackBackendRouteRequest {
268
+ readonly params: Record<string, string>;
269
+ /** URL query(searchParams 原样透传,多值键取逗号拼接语义同 URL 规范)。 */
270
+ readonly query: URLSearchParams;
271
+ readonly body: unknown;
272
+ }
273
+
274
+ export interface PackBackendRoute {
275
+ readonly method: 'GET' | 'POST' | 'PUT' | 'DELETE';
276
+ /** 路径模式,如 '/api/v2/ppt-preview/edits/:id/cancel'。 */
277
+ readonly path: string;
278
+ readonly handler: (req: PackBackendRouteRequest) => Promise<PackBackendRouteResponse>;
279
+ }
280
+
281
+ // ─── 回合级钩子契约 ───
282
+ // 注册表实现住在宿主 src/local-backend/pack-turn-hooks.ts;这里只放类型。
283
+
284
+ /** 一条正在流式的回合的包侧观察器(beginTurn 的返回值)。 */
285
+ export interface PackTurnObserver {
286
+ /** 模型发起一次工具调用(尚未执行)。 */
287
+ onToolStart?(call: { tool: string; arguments: unknown }): void;
288
+ /** 一次工具调用执行完毕(结果已进 executedActions)。 */
289
+ onToolSettled?(): void | Promise<void>;
290
+ }
291
+
292
+ export interface PackTurnHooks {
293
+ /** 回合 exec 沙箱的额外可写根(按会话解析)。 */
294
+ execWritableRoots?(chatId: string): string[];
295
+ /** 并入 buildWorldState 的附加字段(如 ppt_workspace)。 */
296
+ worldState?(chatId: string): Record<string, unknown>;
297
+ /** 强制技能正文("/技能名" 一次性注入)的额外占位符变量。 */
298
+ forcedSkillVars?(chatId: string): Record<string, string>;
299
+ /**
300
+ * 回合开始时调用;返回 null 表示本回合不观察。broadcast 是宿主的用户面
301
+ * 事件出口(CS=窗口广播,BS=SSE),包观察器经它推自己的更新事件。
302
+ */
303
+ beginTurn?(ctx: {
304
+ chatId: string;
305
+ broadcast: ((channel: string, payload: unknown) => void) | undefined;
306
+ }): PackTurnObserver | null;
307
+ }
package/types/web.d.ts ADDED
@@ -0,0 +1,72 @@
1
+ /**
2
+ * 渲染层包贡献类型(ScenarioPack.renderer 的 web 侧契约)。
3
+ *
4
+ * 注册表实现住在宿主 apps/web/src/packs/registry.ts(re-export 本模块类型
5
+ * 兼容既有调用方);包的 web 代码只应依赖本模块,不反向 import 宿主实现。
6
+ */
7
+
8
+ import type { ComponentType } from 'react';
9
+
10
+ export interface PackRouteContribution {
11
+ /** hash 路由路径(不带前导斜杠),如 '<pack>-debug-log'。 */
12
+ readonly path: string;
13
+ readonly Component: ComponentType;
14
+ }
15
+
16
+ export interface PackSettingsPanelContribution {
17
+ readonly panelId: string;
18
+ readonly title: string;
19
+ /** 段头图标(react-icons 组件);缺省段头只显示标题文字。 */
20
+ readonly Icon?: ComponentType<{ className?: string }>;
21
+ readonly Component: ComponentType;
22
+ }
23
+
24
+ /** 聊天页右侧栏位面板的标准 props(shell 布局注入)。 */
25
+ export interface PackChatSlotProps {
26
+ /** 当前打开的会话 id(无会话时为空串)。 */
27
+ chatId: string;
28
+ /** 关闭栏位(用户点面板右上角 ×)。 */
29
+ onClose: () => void;
30
+ /**
31
+ * 把一段内容作为普通用户消息发进当前会话(包的 fallback 逃生通道,
32
+ * 如文档包的单页修改在 sidecar 未就绪时退回主聊天发送)。未注册时返回 false。
33
+ */
34
+ onSubmitToChat: (input: {
35
+ content: string;
36
+ metadata?: Record<string, unknown>;
37
+ }) => boolean | void | Promise<boolean | void>;
38
+ }
39
+
40
+ /** 自动展开钩子拿到的布局 API。 */
41
+ export interface PackChatSlotAutoRevealApi {
42
+ /** 请求把右侧栏位切到本槽位(栏位被占用时布局忽略——互斥规则在布局)。 */
43
+ reveal: () => void;
44
+ /** 当前会话 id(事件载荷据此过滤)。 */
45
+ getCurrentChatId: () => string | null;
46
+ }
47
+
48
+ export interface PackChatSlotContribution {
49
+ readonly slotId: string;
50
+ /** 侧栏分段控件上的短名(如 'PPT 预览')。 */
51
+ readonly title: string;
52
+ /** 分段控件图标(react-icons 组件)。 */
53
+ readonly Icon: ComponentType<{ className?: string }>;
54
+ /** 面板本体;shell 布局注入 {@link PackChatSlotProps}。 */
55
+ readonly Component: ComponentType<PackChatSlotProps>;
56
+ /**
57
+ * 自动展开:布局挂载时调用一次,包实现自己的事件订阅(桥接事件),
58
+ * 命中当前会话时调 reveal()。返回 cleanup(布局卸载时调用)。
59
+ */
60
+ readonly setupAutoReveal?: (api: PackChatSlotAutoRevealApi) => (() => void) | void;
61
+ }
62
+
63
+ export interface PackRendererContributions {
64
+ readonly routes?: readonly PackRouteContribution[];
65
+ readonly settingsPanels?: readonly PackSettingsPanelContribution[];
66
+ readonly chatSlots?: readonly PackChatSlotContribution[];
67
+ /**
68
+ * 包技能里由引擎自动注入、不进 "/" 菜单的技能名/目录名
69
+ * (并入 slash-sources 的隐藏集,如某包的 90-<pack>)。
70
+ */
71
+ readonly hiddenSlashSkills?: readonly string[];
72
+ }