@undefineds.co/linx 0.3.5 → 0.3.8

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 (172) hide show
  1. package/README.md +58 -23
  2. package/dist/generated/version.js +1 -1
  3. package/dist/generated/version.js.map +1 -1
  4. package/dist/index.js +336 -162
  5. package/dist/index.js.map +1 -1
  6. package/dist/lib/account-session.js +4 -8
  7. package/dist/lib/account-session.js.map +1 -1
  8. package/dist/lib/ai-command.js +228 -178
  9. package/dist/lib/ai-command.js.map +1 -1
  10. package/dist/lib/auto-mode/archive.js +38 -7
  11. package/dist/lib/auto-mode/archive.js.map +1 -1
  12. package/dist/lib/auto-mode/auth.js.map +1 -1
  13. package/dist/lib/auto-mode/display.js +71 -45
  14. package/dist/lib/auto-mode/display.js.map +1 -1
  15. package/dist/lib/auto-mode/format.js +9 -7
  16. package/dist/lib/auto-mode/format.js.map +1 -1
  17. package/dist/lib/auto-mode/hooks/claude.js +12 -2
  18. package/dist/lib/auto-mode/hooks/claude.js.map +1 -1
  19. package/dist/lib/auto-mode/hooks/codex.js +17 -7
  20. package/dist/lib/auto-mode/hooks/codex.js.map +1 -1
  21. package/dist/lib/auto-mode/hooks/index.js +28 -8
  22. package/dist/lib/auto-mode/hooks/index.js.map +1 -1
  23. package/dist/lib/auto-mode/pod-ai.js +20 -37
  24. package/dist/lib/auto-mode/pod-ai.js.map +1 -1
  25. package/dist/lib/auto-mode/pod-approval.js +124 -195
  26. package/dist/lib/auto-mode/pod-approval.js.map +1 -1
  27. package/dist/lib/auto-mode/pod-persistence.js +169 -90
  28. package/dist/lib/auto-mode/pod-persistence.js.map +1 -1
  29. package/dist/lib/auto-mode/runner.js +683 -81
  30. package/dist/lib/auto-mode/runner.js.map +1 -1
  31. package/dist/lib/auto-mode/secretary.js +186 -41
  32. package/dist/lib/auto-mode/secretary.js.map +1 -1
  33. package/dist/lib/auto-mode-command.js +32 -32
  34. package/dist/lib/auto-mode-command.js.map +1 -1
  35. package/dist/lib/chat-api.js +242 -50
  36. package/dist/lib/chat-api.js.map +1 -1
  37. package/dist/lib/codex-plugin/bridge.js +164 -17
  38. package/dist/lib/codex-plugin/bridge.js.map +1 -1
  39. package/dist/lib/codex-plugin/codex-native-proxy.js +370 -34
  40. package/dist/lib/codex-plugin/codex-native-proxy.js.map +1 -1
  41. package/dist/lib/credentials-store.js +33 -42
  42. package/dist/lib/credentials-store.js.map +1 -1
  43. package/dist/lib/linx-cloud-errors.js +61 -0
  44. package/dist/lib/linx-cloud-errors.js.map +1 -0
  45. package/dist/lib/linx-tui-contract.js +8 -5
  46. package/dist/lib/linx-tui-contract.js.map +1 -1
  47. package/dist/lib/login-command.js +9 -2
  48. package/dist/lib/login-command.js.map +1 -1
  49. package/dist/lib/models.js +3 -20
  50. package/dist/lib/models.js.map +1 -1
  51. package/dist/lib/oidc-auth.js +143 -17
  52. package/dist/lib/oidc-auth.js.map +1 -1
  53. package/dist/lib/oidc-session-storage.js +2 -6
  54. package/dist/lib/oidc-session-storage.js.map +1 -1
  55. package/dist/lib/pi-adapter/auto-input-controller.js +988 -0
  56. package/dist/lib/pi-adapter/auto-input-controller.js.map +1 -0
  57. package/dist/lib/pi-adapter/backend-command.js +2 -0
  58. package/dist/lib/pi-adapter/backend-command.js.map +1 -0
  59. package/dist/lib/pi-adapter/backend-credentials.js +80 -0
  60. package/dist/lib/pi-adapter/backend-credentials.js.map +1 -0
  61. package/dist/lib/pi-adapter/branding.js +246 -108
  62. package/dist/lib/pi-adapter/branding.js.map +1 -1
  63. package/dist/lib/pi-adapter/control-state.js +72 -0
  64. package/dist/lib/pi-adapter/control-state.js.map +1 -0
  65. package/dist/lib/pi-adapter/interactive.js +2634 -30
  66. package/dist/lib/pi-adapter/interactive.js.map +1 -1
  67. package/dist/lib/pi-adapter/pod-approval.js +382 -210
  68. package/dist/lib/pi-adapter/pod-approval.js.map +1 -1
  69. package/dist/lib/pi-adapter/pod-mirror-mapping.js +71 -17
  70. package/dist/lib/pi-adapter/pod-mirror-mapping.js.map +1 -1
  71. package/dist/lib/pi-adapter/pod-mirror.js +531 -64
  72. package/dist/lib/pi-adapter/pod-mirror.js.map +1 -1
  73. package/dist/lib/pi-adapter/pod-native.js +81 -85
  74. package/dist/lib/pi-adapter/pod-native.js.map +1 -1
  75. package/dist/lib/pi-adapter/pod-status-output.js +54 -0
  76. package/dist/lib/pi-adapter/pod-status-output.js.map +1 -0
  77. package/dist/lib/pi-adapter/runtime.js +458 -228
  78. package/dist/lib/pi-adapter/runtime.js.map +1 -1
  79. package/dist/lib/pi-adapter/session-control.js +509 -0
  80. package/dist/lib/pi-adapter/session-control.js.map +1 -0
  81. package/dist/lib/pi-adapter/session.js +35 -22
  82. package/dist/lib/pi-adapter/session.js.map +1 -1
  83. package/dist/lib/pi-adapter/stream.js +89 -32
  84. package/dist/lib/pi-adapter/stream.js.map +1 -1
  85. package/dist/lib/pi-adapter/sync-recovery.js +89 -0
  86. package/dist/lib/pi-adapter/sync-recovery.js.map +1 -0
  87. package/dist/lib/pi-adapter/web-fetch.js +13 -14
  88. package/dist/lib/pi-adapter/web-fetch.js.map +1 -1
  89. package/dist/lib/pod-chat-store.js +254 -78
  90. package/dist/lib/pod-chat-store.js.map +1 -1
  91. package/dist/lib/pod-data-session.js +156 -35
  92. package/dist/lib/pod-data-session.js.map +1 -1
  93. package/dist/lib/solid-auth-store.js +27 -0
  94. package/dist/lib/solid-auth-store.js.map +1 -0
  95. package/dist/lib/solid-auth.js +2 -4
  96. package/dist/lib/solid-auth.js.map +1 -1
  97. package/dist/lib/solid-client-credentials-login.js +100 -0
  98. package/dist/lib/solid-client-credentials-login.js.map +1 -0
  99. package/dist/lib/solid-local-store.js +31 -0
  100. package/dist/lib/solid-local-store.js.map +1 -0
  101. package/dist/lib/symphony/archive.js +328 -18
  102. package/dist/lib/symphony/archive.js.map +1 -1
  103. package/dist/lib/symphony/pod-projection.js +2222 -0
  104. package/dist/lib/symphony/pod-projection.js.map +1 -0
  105. package/dist/lib/symphony-command.js +602 -178
  106. package/dist/lib/symphony-command.js.map +1 -1
  107. package/dist/lib/sync-checkpoint-store.js +74 -0
  108. package/dist/lib/sync-checkpoint-store.js.map +1 -0
  109. package/dist/skills/symphony/SKILL.md +665 -0
  110. package/package.json +15 -9
  111. package/vendor/agent-runtime/dist/agent-runtime.d.ts +137 -0
  112. package/vendor/agent-runtime/dist/agent-runtime.js +211 -0
  113. package/vendor/agent-runtime/dist/auto-mode.d.ts +78 -13
  114. package/vendor/agent-runtime/dist/auto-mode.js +288 -31
  115. package/vendor/agent-runtime/dist/control-plane.d.ts +28 -0
  116. package/vendor/agent-runtime/dist/control-plane.js +79 -0
  117. package/vendor/agent-runtime/dist/file-sync.d.ts +157 -0
  118. package/vendor/agent-runtime/dist/file-sync.js +314 -0
  119. package/vendor/agent-runtime/dist/index.d.ts +7 -0
  120. package/vendor/agent-runtime/dist/index.js +7 -0
  121. package/vendor/agent-runtime/dist/reconciler.d.ts +117 -0
  122. package/vendor/agent-runtime/dist/reconciler.js +361 -0
  123. package/vendor/agent-runtime/dist/symphony.d.ts +128 -8
  124. package/vendor/agent-runtime/dist/symphony.js +362 -57
  125. package/vendor/agent-runtime/dist/sync.d.ts +271 -0
  126. package/vendor/agent-runtime/dist/sync.js +550 -0
  127. package/vendor/agent-runtime/dist/thread-reconciler-controller.d.ts +58 -0
  128. package/vendor/agent-runtime/dist/thread-reconciler-controller.js +137 -0
  129. package/vendor/agent-runtime/dist/turn-controller.js +2 -2
  130. package/vendor/agent-runtime/dist/wake-scheduler.d.ts +67 -0
  131. package/vendor/agent-runtime/dist/wake-scheduler.js +194 -0
  132. package/vendor/agent-runtime/package.json +8 -1
  133. package/vendor/pi-web-access/CHANGELOG.md +387 -0
  134. package/vendor/pi-web-access/LICENSE +21 -0
  135. package/vendor/pi-web-access/README.md +352 -0
  136. package/vendor/pi-web-access/activity.ts +101 -0
  137. package/vendor/pi-web-access/banner.png +0 -0
  138. package/vendor/pi-web-access/chrome-cookies.ts +322 -0
  139. package/vendor/pi-web-access/code-search.ts +107 -0
  140. package/vendor/pi-web-access/curator-page.ts +3359 -0
  141. package/vendor/pi-web-access/curator-server.ts +605 -0
  142. package/vendor/pi-web-access/exa.ts +520 -0
  143. package/vendor/pi-web-access/extract.ts +641 -0
  144. package/vendor/pi-web-access/gemini-api.ts +112 -0
  145. package/vendor/pi-web-access/gemini-search.ts +361 -0
  146. package/vendor/pi-web-access/gemini-url-context.ts +126 -0
  147. package/vendor/pi-web-access/gemini-web-config.ts +52 -0
  148. package/vendor/pi-web-access/gemini-web.ts +396 -0
  149. package/vendor/pi-web-access/github-api.ts +196 -0
  150. package/vendor/pi-web-access/github-extract.ts +634 -0
  151. package/vendor/pi-web-access/index.ts +2346 -0
  152. package/vendor/pi-web-access/package.json +45 -0
  153. package/vendor/pi-web-access/pdf-extract.ts +192 -0
  154. package/vendor/pi-web-access/perplexity.ts +195 -0
  155. package/vendor/pi-web-access/pi-web-fetch-demo.mp4 +0 -0
  156. package/vendor/pi-web-access/rsc-extract.ts +338 -0
  157. package/vendor/pi-web-access/skills/librarian/SKILL.md +195 -0
  158. package/vendor/pi-web-access/storage.ts +72 -0
  159. package/vendor/pi-web-access/summary-review.ts +276 -0
  160. package/vendor/pi-web-access/test/gemini-web-cookie-opt-in.test.mjs +41 -0
  161. package/vendor/pi-web-access/test/pdf-extract.test.mjs +95 -0
  162. package/vendor/pi-web-access/utils.ts +44 -0
  163. package/vendor/pi-web-access/video-extract.ts +378 -0
  164. package/vendor/pi-web-access/youtube-extract.ts +310 -0
  165. package/dist/lib/pi-adapter/auth.js +0 -68
  166. package/dist/lib/pi-adapter/auth.js.map +0 -1
  167. package/dist/lib/pi-adapter/pod-tools.js +0 -140
  168. package/dist/lib/pi-adapter/pod-tools.js.map +0 -1
  169. package/dist/skills/drizzle-solid/SKILL.md +0 -340
  170. package/dist/skills/pod-storage/SKILL.md +0 -100
  171. package/dist/skills/solid-modeling/SKILL.md +0 -274
  172. package/dist/skills/xpod-componentsjs/SKILL.md +0 -284
@@ -1,274 +0,0 @@
1
- ---
2
- name: solid-modeling
3
- description: Solid/RDF 数据建模专家,处理 Pod 数据结构设计、类继承、属性定义、命名空间等问题
4
- allowed-tools: Read, Write, Edit, Grep, Glob
5
- ---
6
-
7
- # Solid/RDF 数据建模专家
8
-
9
- 你是 XPod 项目的 Solid/RDF 数据建模专家。帮助设计符合 Solid 规范和 RDF 最佳实践的数据模型。
10
-
11
- ## 核心原则
12
-
13
- ### 数据主权
14
-
15
- 用户数据存储在用户自己的 Pod 中,服务器不存储用户数据。
16
-
17
- ### 标准词汇表优先
18
-
19
- 优先复用已有的标准词汇表,只在必要时定义自定义词汇。
20
-
21
- | 用途 | 词汇表 | 前缀 | 导入 |
22
- |------|--------|------|------|
23
- | 自定义 | Undefineds Namespace | `udfs:` | `import { UDFS } from '@/vocab'` |
24
- | RDF 基础 | RDF/RDFS | `rdf:`, `rdfs:` | `import { RDF, RDFS } from '@/vocab'` |
25
- | 时间/元数据 | Dublin Core | `dc:` | `import { DCTerms } from '@/vocab'` |
26
- | 容器/资源 | LDP | `ldp:` | `import { LDP } from '@/vocab'` |
27
- | 个人信息 | FOAF | `foaf:` | `import { FOAF } from '@/vocab'` |
28
- | 访问控制 | ACL | `acl:` | `import { ACL } from '@/vocab'` |
29
- | 数据类型 | XSD | `xsd:` | `import { XSD } from '@/vocab'` |
30
-
31
- ## 命名规范
32
-
33
- ### 词汇表命名
34
-
35
- | 类型 | 格式 | 示例 |
36
- |------|------|------|
37
- | **Class** | PascalCase (大写开头) | `Credential`, `Provider`, `Model` |
38
- | **Property** | camelCase (小写开头) | `apiKey`, `baseUrl`, `createdAt` |
39
- | **实例 ID** | kebab-case | `#my-entity`, `#instance-001` |
40
-
41
- ### 使用 Vocab 定义
42
-
43
- 项目使用 `src/vocab/` 统一管理词汇表:
44
-
45
- ```typescript
46
- // src/vocab/udfs.ts - UDFS 词汇表
47
- export const UDFS = createNamespace('udfs', 'https://undefineds.co/ns#', {
48
- // Classes (大写)
49
- Credential: 'Credential',
50
- Provider: 'Provider',
51
- Model: 'Model',
52
-
53
- // Properties (小写)
54
- apiKey: 'apiKey',
55
- baseUrl: 'baseUrl',
56
- status: 'status',
57
- });
58
- ```
59
-
60
- **使用方式**:
61
-
62
- ```typescript
63
- import { UDFS, UDFS_NAMESPACE } from '@/vocab';
64
-
65
- // 使用 Class
66
- const type = UDFS.Credential; // 'https://undefineds.co/ns#Credential'
67
-
68
- // 使用 Property
69
- const prop = UDFS.apiKey; // 'https://undefineds.co/ns#apiKey'
70
-
71
- // 动态构建 URI
72
- const custom = UDFS('CustomTerm'); // 'https://undefineds.co/ns#CustomTerm'
73
- ```
74
-
75
- ## drizzle-solid Schema 定义
76
-
77
- 项目级业务语义不要写进这个 skill 文件。
78
-
79
- - 这类定义应放在仓库的 models/schema/docs 里,由代码和 shared docs 作为单一真相。
80
- - 这个 skill 只保留通用 Solid/RDF 建模原则、drizzle-solid 约束和可复用的模式。
81
- - 如果某个产品需要定义 `chat` / `thread` / `session` 的具体含义,应写回对应 package 的 schema 注释和 shared docs,而不是放到 skill。
82
-
83
- ### 基本结构
84
-
85
- ```typescript
86
- import { podTable, string, uri, datetime, int } from 'drizzle-solid';
87
- import { UDFS, UDFS_NAMESPACE } from '../vocab';
88
-
89
- /**
90
- * Credential - 凭据
91
- *
92
- * 存储位置: /settings/credentials.ttl
93
- */
94
- export const Credential = podTable(
95
- 'Credential', // 表名用 PascalCase
96
- {
97
- id: string('id').primaryKey(),
98
- provider: uri('provider'),
99
- apiKey: string('apiKey'),
100
- status: string('status'),
101
- createdAt: datetime('createdAt'),
102
- },
103
- {
104
- base: '/settings/credentials.ttl',
105
- type: UDFS.Credential, // 使用 vocab 而不是硬编码字符串
106
- namespace: UDFS_NAMESPACE,
107
- subjectTemplate: '#{id}',
108
- },
109
- );
110
- ```
111
-
112
- ### 关系定义
113
-
114
- ```typescript
115
- import { relations } from 'drizzle-solid';
116
-
117
- export const CredentialRelations = relations(Credential, ({ one }) => ({
118
- provider: one(Provider, {
119
- fields: [Credential.provider],
120
- references: [Provider.id],
121
- }),
122
- }));
123
- ```
124
-
125
- ## 类设计
126
-
127
- ### 使用 Class 继承表达用途分类
128
-
129
- 当实体有共同特征但不同用途时,使用 `rdfs:subClassOf`:
130
-
131
- ```turtle
132
- # 基类
133
- udfs:Provider a rdfs:Class ;
134
- rdfs:label "Provider" ;
135
- rdfs:comment "服务供应商基类" .
136
-
137
- # 子类 - 按用途区分
138
- udfs:AgentProvider rdfs:subClassOf udfs:Provider ;
139
- rdfs:label "Agent Provider" .
140
- ```
141
-
142
- ### 用属性区分实现细节
143
-
144
- 具体实现方式用属性表达,不用子类:
145
-
146
- ```turtle
147
- # 正确:用属性区分实现类型
148
- <#provider-a> a udfs:Provider ;
149
- udfs:executorType "claude" .
150
-
151
- <#provider-b> a udfs:Provider ;
152
- udfs:executorType "openai" .
153
-
154
- # 错误:不要为每种实现创建子类
155
- # udfs:ClaudeProvider rdfs:subClassOf udfs:Provider . ❌
156
- ```
157
-
158
- **规则**:
159
- - Class 继承区分**用途/功能**
160
- - 属性区分**具体实现**
161
-
162
- ### 定义与实例分离
163
-
164
- 静态定义(模板)和运行时实例分开建模:
165
-
166
- ```turtle
167
- # 定义(模板) - 静态配置,描述"是什么"
168
- <#agent-config> a udfs:AgentConfig ;
169
- udfs:displayName "Indexing Agent" ;
170
- udfs:systemPrompt "..." .
171
-
172
- # 实例 - 运行时状态,描述"正在做什么"
173
- <#agent-status> a udfs:AgentStatus ;
174
- udfs:agentId "indexing" ;
175
- udfs:status "running" ;
176
- udfs:currentTaskId "task-123" .
177
- ```
178
-
179
- ## 属性设计
180
-
181
- ### 使用 URI 引用关联实体
182
-
183
- 实体间关系用 URI 引用,不用字符串:
184
-
185
- ```turtle
186
- # 正确:URI 引用
187
- <#credential> a udfs:Credential ;
188
- udfs:provider </settings/ai/providers.ttl#google> .
189
-
190
- # 错误:字符串值
191
- <#credential> a udfs:Credential ;
192
- udfs:provider "google" . ❌
193
- ```
194
-
195
- ### 时间字段统一用 datetime
196
-
197
- ```typescript
198
- // 正确
199
- createdAt: datetime('createdAt'),
200
- updatedAt: datetime('updatedAt'),
201
-
202
- // 错误 - 不要用 string 存时间
203
- startedAt: string('startedAt'), // ❌
204
- ```
205
-
206
- ### 布尔值
207
-
208
- drizzle-solid 目前用 string 存储布尔值:
209
-
210
- ```typescript
211
- enabled: string('enabled'), // 存储 "true" / "false"
212
- ```
213
-
214
- 代码中需要手动比较:`enabled === 'true'`
215
-
216
- ## 文件组织
217
-
218
- ### 按功能分文件
219
-
220
- ```
221
- pod:/settings/
222
- ├── ai/
223
- │ ├── providers.ttl # AI 供应商
224
- │ ├── models.ttl # AI 模型
225
- │ ├── agent-providers.ttl # Agent 供应商
226
- │ ├── agents.ttl # Agent 配置
227
- │ ├── agent-status.ttl # Agent 状态
228
- │ ├── config.ttl # Pod 级 AI 配置
229
- │ ├── vector-stores.ttl # 向量知识库
230
- │ └── indexed-files.ttl # 已索引文件
231
- ├── credentials.ttl # 凭据(敏感信息单独存放)
232
- └── prefs.ttl # 用户偏好设置
233
- ```
234
-
235
- ### 文件引用规则
236
-
237
- 同文件用 `#fragment`,跨文件用完整路径:
238
-
239
- ```turtle
240
- # 同文件引用
241
- <#entity-a> udfs:relatedTo <#entity-b> .
242
-
243
- # 跨文件引用
244
- <#credential> udfs:provider </settings/ai/providers.ttl#google> .
245
-
246
- # 跨 Pod 引用
247
- <#entity-a> udfs:relatedTo <https://other.pod/file.ttl#entity-b> .
248
- ```
249
-
250
- ## 检查清单
251
-
252
- 设计新数据模型时:
253
-
254
- - [ ] 是否有可复用的标准词汇表?
255
- - [ ] 新词汇是否已添加到 `src/vocab/udfs.ts`?
256
- - [ ] Class 名是否大写开头?Property 名是否小写开头?
257
- - [ ] 类继承是否按用途区分(不是按实现)?
258
- - [ ] 定义和实例是否分离?
259
- - [ ] 实体关系是否用 URI 引用(不是字符串)?
260
- - [ ] 时间字段是否用 `datetime()` 类型?
261
- - [ ] 敏感数据是否单独存放?
262
- - [ ] Schema 是否使用 `UDFS.ClassName` 而不是硬编码字符串?
263
-
264
- ## 参考文件
265
-
266
- - **Vocab 定义**: `src/vocab/udfs.ts`, `src/vocab/external.ts`
267
- - **Credential Schema**: `src/credential/schema/tables.ts`
268
- - **Embedding Schema**: `src/embedding/schema/tables.ts`
269
- - **Agent Schema**: `src/agents/schema/`
270
- - **Task Schema**: `src/task/schema.ts`
271
- - **Credential Schema**: `src/credential/schema/tables.ts`
272
- - **Embedding Schema**: `src/embedding/schema/tables.ts`
273
- - **Agent Schema**: `src/agents/schema/`
274
- - **Task Schema**: `src/task/schema.ts`
@@ -1,284 +0,0 @@
1
- ---
2
- name: xpod-componentsjs
3
- description: Xpod Components.js 变量和组件配置专家,处理 CLI 参数、变量解析、组件配置等问题
4
- allowed-tools: Read, Write, Edit, Grep, Glob, Bash
5
- ---
6
-
7
- # Xpod Components.js 配置专家
8
-
9
- 你是 Xpod 项目的 Components.js 配置专家。Xpod 基于 Community Solid Server (CSS),使用 Components.js 进行依赖注入。
10
-
11
- ## 核心知识
12
-
13
- ### 变量解析流程
14
-
15
- ```
16
- 环境变量 (CSS_XXX)
17
-
18
- YargsCliExtractor (cli.json) - 解析 CLI 参数
19
-
20
- ShorthandResolver (resolver.json) - 将参数映射到 Components.js 变量
21
-
22
- Variable (配置文件中) - 在组件配置中引用变量
23
- ```
24
-
25
- ### 关键文件
26
-
27
- | 文件 | 作用 |
28
- |------|------|
29
- | `config/cli.json` | 声明 CLI 参数(YargsParameter) |
30
- | `config/resolver.json` | 将 CLI 参数映射到 Components.js 变量(KeyExtractor) |
31
- | `config/*.json` | 使用 `"@type": "Variable"` 引用变量 |
32
- | `dist/components/context.jsonld` | 自动生成的组件 context,包含参数名映射 |
33
-
34
- ## 添加新变量的完整步骤
35
-
36
- ### 步骤 1: cli.json 声明参数
37
-
38
- ```json
39
- // config/cli.json
40
- {
41
- "@type": "YargsParameter",
42
- "name": "myNewParam",
43
- "options": {
44
- "type": "string",
45
- "hidden": true
46
- }
47
- }
48
- ```
49
-
50
- 参数名使用 camelCase,对应环境变量自动转换:`myNewParam` → `CSS_MY_NEW_PARAM`
51
-
52
- ### 步骤 2: resolver.json 添加 KeyExtractor(最容易遗漏!)
53
-
54
- ```json
55
- // config/resolver.json
56
- {
57
- "CombinedShorthandResolver:_resolvers_key": "urn:solid-server:default:variable:myNewParam",
58
- "CombinedShorthandResolver:_resolvers_value": {
59
- "@type": "KeyExtractor",
60
- "key": "myNewParam",
61
- "defaultValue": ""
62
- }
63
- }
64
- ```
65
-
66
- ### 步骤 3: 配置文件中使用变量
67
-
68
- ```json
69
- {
70
- "myConfig": {
71
- "@id": "urn:solid-server:default:variable:myNewParam",
72
- "@type": "Variable"
73
- }
74
- }
75
- ```
76
-
77
- ## 抽象类和接口的处理
78
-
79
- ### 关键规则:Generator 只处理导出的类
80
-
81
- Components.js Generator (`componentsjs-generator`) 只会为 **从 `src/index.ts` 导出的类** 生成 `.jsonld` 文件。
82
-
83
- ### 问题场景
84
-
85
- 当一个类继承抽象基类或实现接口时:
86
-
87
- ```typescript
88
- // 子类生成的 jsonld 会包含 extends 引用
89
- "extends": ["undefineds:dist/path/to/BaseClass.jsonld#BaseClass"]
90
- ```
91
-
92
- 如果 `BaseClass` 没有被导出,Generator 不会为它生成 jsonld,启动时会报错:
93
-
94
- ```
95
- Error: Resource .../BaseClass.jsonld#BaseClass is not a valid component
96
- ```
97
-
98
- ### 解决方案
99
-
100
- **1. 确保抽象类/基类从 index.ts 导出**
101
-
102
- ```typescript
103
- // src/index.ts
104
- import { MyBaseClass } from './path/to/MyBaseClass';
105
- import { MyImplClass } from './path/to/MyImplClass';
106
-
107
- export default {
108
- MyBaseClass, // ← 必须导出基类!
109
- MyImplClass,
110
- };
111
- ```
112
-
113
- **2. 使用 abstract class 而不是 interface**
114
-
115
- Generator **不会为 TypeScript interface 生成 jsonld**。如果有类 `implements` 一个 interface,必须将 interface 改为 abstract class:
116
-
117
- ```typescript
118
- // ❌ 错误 - interface 不会生成 jsonld
119
- export interface QuintStore {
120
- get(pattern: QuintPattern): Promise<Quint[]>;
121
- put(quint: Quint): Promise<void>;
122
- }
123
-
124
- export class MyStore implements QuintStore { ... }
125
- ```
126
-
127
- ```typescript
128
- // ✅ 正确 - abstract class 会生成 jsonld
129
- export abstract class QuintStore {
130
- abstract get(pattern: QuintPattern): Promise<Quint[]>;
131
- abstract put(quint: Quint): Promise<void>;
132
- }
133
-
134
- export class MyStore extends QuintStore { ... }
135
- ```
136
-
137
- **3. 子类继承时添加 super() 和 override**
138
-
139
- ```typescript
140
- export class MyStore extends QuintStore {
141
- constructor(options: Options) {
142
- super(); // ← 必须调用 super()
143
- this.options = options;
144
- }
145
-
146
- override async get(pattern: QuintPattern): Promise<Quint[]> {
147
- // 如果基类有可选方法的实现,需要 override 修饰符
148
- }
149
- }
150
- ```
151
-
152
- ### 检查清单
153
-
154
- 添加新的抽象类/基类时:
155
-
156
- - [ ] 使用 `abstract class` 而不是 `interface`
157
- - [ ] 在 `src/index.ts` 中导出该类
158
- - [ ] 子类使用 `extends` 而不是 `implements`
159
- - [ ] 子类构造函数调用 `super()`
160
- - [ ] 覆盖父类方法时添加 `override` 修饰符
161
- - [ ] 运行 `yarn build` 验证 jsonld 生成
162
-
163
- ## 常见错误诊断
164
-
165
- ### 错误: Resource is not a valid component
166
-
167
- ```
168
- Error: Resource .../types.jsonld#QuintStore is not a valid component,
169
- either it is not defined, has no type, or is incorrectly referenced
170
- ```
171
-
172
- **原因**:
173
- 1. 使用了 TypeScript interface(Generator 不处理 interface)
174
- 2. 抽象类/基类没有从 index.ts 导出
175
-
176
- **解决**:
177
- 1. 将 interface 改为 abstract class
178
- 2. 在 index.ts 中导出该类
179
- 3. 运行 `yarn build`
180
-
181
- ### 错误: Could not find (valid) component types
182
-
183
- ```
184
- ErrorResourcesContext: Could not find (valid) component types for config "urn:xxx:MyComponent" among its types, or a requireName
185
- ```
186
-
187
- **原因**: 新增或重命名了 TypeScript 类,但没有重新生成 Components.js 的 `.jsonld` 组件定义文件
188
- **解决**: 运行完整编译 `npm run build`(不是 `npm run build:ts`),让 `componentsjs-generator` 生成新的 `.jsonld` 文件
189
-
190
- ```bash
191
- # 错误 - 只编译 TypeScript,不会生成 .jsonld
192
- npm run build:ts
193
-
194
- # 正确 - 完整编译,包括 componentsjs-generator
195
- npm run build
196
- ```
197
-
198
- ### 错误: Undefined variable
199
-
200
- ```
201
- Error: Undefined variable: urn:solid-server:default:variable:xxx
202
- ```
203
-
204
- **原因**: resolver.json 中缺少对应的 KeyExtractor
205
- **解决**: 在 resolver.json 中添加变量映射
206
-
207
- ### 错误: Multiple values for parameter
208
-
209
- ```
210
- ErrorResourcesContext: Detected multiple values for parameter ... YargsCliExtractor_options
211
- ```
212
-
213
- **原因**: xpod 的 cli.json 和 CSS 的 cli.json 都定义了 `options` 块
214
- **解决**: xpod 的 cli.json 不要添加 `options` 块,CSS 已经配置了 `envVarPrefix` 和 `loadFromEnv`
215
-
216
- ### 错误: xxx.map is not a function
217
-
218
- ```
219
- TypeError: options.routes.map is not a function
220
- ```
221
-
222
- **原因**: 组件参数名格式不正确
223
- **解决**: 查看 `dist/components/context.jsonld` 中的正确参数名,使用简写形式
224
-
225
- ```json
226
- // 正确
227
- { "@type": "MyComponent", "routes": [...], "fallback": {...} }
228
-
229
- // 错误
230
- { "@type": "MyComponent", "MyComponent:_options_routes": [...] }
231
- ```
232
-
233
- ## 配置文件 @context 规范
234
-
235
- ### 正确写法
236
-
237
- ```json
238
- {
239
- "@context": [
240
- "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/components/context.jsonld",
241
- "https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/components/context.jsonld"
242
- ]
243
- }
244
- ```
245
-
246
- ### 禁止自定义覆盖
247
-
248
- 不要在 @context 中添加与 dist/components/context.jsonld 冲突的自定义映射。
249
-
250
- ## 调试命令
251
-
252
- ```bash
253
- # 验证环境变量加载
254
- node_modules/.bin/dotenv -e .env.cluster -- node -e "console.log(process.env.CSS_MY_PARAM)"
255
-
256
- # 直接传递 CLI 参数测试
257
- community-solid-server -c config/xxx.json -m . --myNewParam test-value
258
-
259
- # 查看组件参数名
260
- grep -A 10 '"MyComponent"' dist/components/context.jsonld
261
-
262
- # 检查某个类的 jsonld 是否生成
263
- ls dist/path/to/MyClass.jsonld
264
-
265
- # 检查 components.jsonld 是否包含某个类的 import
266
- grep "MyClass" dist/components/components.jsonld
267
- ```
268
-
269
- ## 检查清单
270
-
271
- 添加新变量时必须完成:
272
-
273
- - [ ] `config/cli.json` - 添加 YargsParameter
274
- - [ ] `config/resolver.json` - 添加 KeyExtractor
275
- - [ ] `.env.xxx` - 添加环境变量(如需要)
276
- - [ ] 组件配置文件 - 使用 `"@type": "Variable"` 引用
277
- - [ ] 运行 `yarn build` 重新生成 components
278
-
279
- 添加新的抽象类/基类时:
280
-
281
- - [ ] 使用 `abstract class` 而不是 `interface`
282
- - [ ] 在 `src/index.ts` 中导出该类
283
- - [ ] 子类使用 `extends` 而不是 `implements`
284
- - [ ] 运行 `yarn build` 验证 jsonld 生成