@undefineds.co/linx 0.3.4 → 0.3.7
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 +58 -23
- package/dist/generated/version.js +1 -1
- package/dist/generated/version.js.map +1 -1
- package/dist/index.js +334 -162
- package/dist/index.js.map +1 -1
- package/dist/lib/account-session.js +4 -8
- package/dist/lib/account-session.js.map +1 -1
- package/dist/lib/ai-command.js +228 -178
- package/dist/lib/ai-command.js.map +1 -1
- package/dist/lib/auto-mode/archive.js +38 -7
- package/dist/lib/auto-mode/archive.js.map +1 -1
- package/dist/lib/auto-mode/auth.js.map +1 -1
- package/dist/lib/auto-mode/display.js +71 -45
- package/dist/lib/auto-mode/display.js.map +1 -1
- package/dist/lib/auto-mode/format.js +9 -7
- package/dist/lib/auto-mode/format.js.map +1 -1
- package/dist/lib/auto-mode/hooks/claude.js +12 -2
- package/dist/lib/auto-mode/hooks/claude.js.map +1 -1
- package/dist/lib/auto-mode/hooks/codex.js +17 -7
- package/dist/lib/auto-mode/hooks/codex.js.map +1 -1
- package/dist/lib/auto-mode/hooks/index.js +28 -8
- package/dist/lib/auto-mode/hooks/index.js.map +1 -1
- package/dist/lib/auto-mode/pod-ai.js +20 -37
- package/dist/lib/auto-mode/pod-ai.js.map +1 -1
- package/dist/lib/auto-mode/pod-approval.js +124 -195
- package/dist/lib/auto-mode/pod-approval.js.map +1 -1
- package/dist/lib/auto-mode/pod-persistence.js +169 -90
- package/dist/lib/auto-mode/pod-persistence.js.map +1 -1
- package/dist/lib/auto-mode/runner.js +683 -81
- package/dist/lib/auto-mode/runner.js.map +1 -1
- package/dist/lib/auto-mode/secretary.js +186 -41
- package/dist/lib/auto-mode/secretary.js.map +1 -1
- package/dist/lib/auto-mode-command.js +32 -32
- package/dist/lib/auto-mode-command.js.map +1 -1
- package/dist/lib/chat-api.js +242 -50
- package/dist/lib/chat-api.js.map +1 -1
- package/dist/lib/codex-plugin/bridge.js +164 -17
- package/dist/lib/codex-plugin/bridge.js.map +1 -1
- package/dist/lib/codex-plugin/codex-native-proxy.js +370 -34
- package/dist/lib/codex-plugin/codex-native-proxy.js.map +1 -1
- package/dist/lib/credentials-store.js +33 -42
- package/dist/lib/credentials-store.js.map +1 -1
- package/dist/lib/linx-cloud-errors.js +61 -0
- package/dist/lib/linx-cloud-errors.js.map +1 -0
- package/dist/lib/linx-tui-contract.js +8 -5
- package/dist/lib/linx-tui-contract.js.map +1 -1
- package/dist/lib/login-command.js +9 -2
- package/dist/lib/login-command.js.map +1 -1
- package/dist/lib/models.js +3 -20
- package/dist/lib/models.js.map +1 -1
- package/dist/lib/oidc-auth.js +143 -17
- package/dist/lib/oidc-auth.js.map +1 -1
- package/dist/lib/oidc-session-storage.js +2 -6
- package/dist/lib/oidc-session-storage.js.map +1 -1
- package/dist/lib/pi-adapter/auto-input-controller.js +988 -0
- package/dist/lib/pi-adapter/auto-input-controller.js.map +1 -0
- package/dist/lib/pi-adapter/backend-command.js +2 -0
- package/dist/lib/pi-adapter/backend-command.js.map +1 -0
- package/dist/lib/pi-adapter/backend-credentials.js +80 -0
- package/dist/lib/pi-adapter/backend-credentials.js.map +1 -0
- package/dist/lib/pi-adapter/branding.js +246 -108
- package/dist/lib/pi-adapter/branding.js.map +1 -1
- package/dist/lib/pi-adapter/control-state.js +72 -0
- package/dist/lib/pi-adapter/control-state.js.map +1 -0
- package/dist/lib/pi-adapter/interactive.js +2634 -30
- package/dist/lib/pi-adapter/interactive.js.map +1 -1
- package/dist/lib/pi-adapter/pod-approval.js +382 -210
- package/dist/lib/pi-adapter/pod-approval.js.map +1 -1
- package/dist/lib/pi-adapter/pod-mirror-mapping.js +71 -17
- package/dist/lib/pi-adapter/pod-mirror-mapping.js.map +1 -1
- package/dist/lib/pi-adapter/pod-mirror.js +531 -64
- package/dist/lib/pi-adapter/pod-mirror.js.map +1 -1
- package/dist/lib/pi-adapter/pod-native.js +81 -85
- package/dist/lib/pi-adapter/pod-native.js.map +1 -1
- package/dist/lib/pi-adapter/pod-status-output.js +54 -0
- package/dist/lib/pi-adapter/pod-status-output.js.map +1 -0
- package/dist/lib/pi-adapter/runtime.js +458 -228
- package/dist/lib/pi-adapter/runtime.js.map +1 -1
- package/dist/lib/pi-adapter/session-control.js +509 -0
- package/dist/lib/pi-adapter/session-control.js.map +1 -0
- package/dist/lib/pi-adapter/session.js +35 -22
- package/dist/lib/pi-adapter/session.js.map +1 -1
- package/dist/lib/pi-adapter/stream.js +89 -32
- package/dist/lib/pi-adapter/stream.js.map +1 -1
- package/dist/lib/pi-adapter/sync-recovery.js +89 -0
- package/dist/lib/pi-adapter/sync-recovery.js.map +1 -0
- package/dist/lib/pi-adapter/web-fetch.js +13 -14
- package/dist/lib/pi-adapter/web-fetch.js.map +1 -1
- package/dist/lib/pod-chat-store.js +254 -78
- package/dist/lib/pod-chat-store.js.map +1 -1
- package/dist/lib/pod-data-session.js +156 -35
- package/dist/lib/pod-data-session.js.map +1 -1
- package/dist/lib/solid-auth-store.js +27 -0
- package/dist/lib/solid-auth-store.js.map +1 -0
- package/dist/lib/solid-auth.js +2 -4
- package/dist/lib/solid-auth.js.map +1 -1
- package/dist/lib/solid-client-credentials-login.js +100 -0
- package/dist/lib/solid-client-credentials-login.js.map +1 -0
- package/dist/lib/solid-local-store.js +31 -0
- package/dist/lib/solid-local-store.js.map +1 -0
- package/dist/lib/symphony/archive.js +328 -18
- package/dist/lib/symphony/archive.js.map +1 -1
- package/dist/lib/symphony/pod-projection.js +2222 -0
- package/dist/lib/symphony/pod-projection.js.map +1 -0
- package/dist/lib/symphony-command.js +602 -178
- package/dist/lib/symphony-command.js.map +1 -1
- package/dist/lib/sync-checkpoint-store.js +74 -0
- package/dist/lib/sync-checkpoint-store.js.map +1 -0
- package/dist/skills/symphony/SKILL.md +665 -0
- package/package.json +15 -9
- package/vendor/agent-runtime/dist/agent-runtime.d.ts +137 -0
- package/vendor/agent-runtime/dist/agent-runtime.js +211 -0
- package/vendor/agent-runtime/dist/auto-mode.d.ts +78 -13
- package/vendor/agent-runtime/dist/auto-mode.js +288 -31
- package/vendor/agent-runtime/dist/control-plane.d.ts +28 -0
- package/vendor/agent-runtime/dist/control-plane.js +79 -0
- package/vendor/agent-runtime/dist/file-sync.d.ts +157 -0
- package/vendor/agent-runtime/dist/file-sync.js +314 -0
- package/vendor/agent-runtime/dist/index.d.ts +7 -0
- package/vendor/agent-runtime/dist/index.js +7 -0
- package/vendor/agent-runtime/dist/reconciler.d.ts +117 -0
- package/vendor/agent-runtime/dist/reconciler.js +361 -0
- package/vendor/agent-runtime/dist/symphony.d.ts +128 -8
- package/vendor/agent-runtime/dist/symphony.js +362 -57
- package/vendor/agent-runtime/dist/sync.d.ts +271 -0
- package/vendor/agent-runtime/dist/sync.js +550 -0
- package/vendor/agent-runtime/dist/thread-reconciler-controller.d.ts +58 -0
- package/vendor/agent-runtime/dist/thread-reconciler-controller.js +137 -0
- package/vendor/agent-runtime/dist/turn-controller.js +2 -2
- package/vendor/agent-runtime/dist/wake-scheduler.d.ts +67 -0
- package/vendor/agent-runtime/dist/wake-scheduler.js +194 -0
- package/vendor/agent-runtime/package.json +8 -1
- package/vendor/pi-web-access/CHANGELOG.md +387 -0
- package/vendor/pi-web-access/LICENSE +21 -0
- package/vendor/pi-web-access/README.md +352 -0
- package/vendor/pi-web-access/activity.ts +101 -0
- package/vendor/pi-web-access/banner.png +0 -0
- package/vendor/pi-web-access/chrome-cookies.ts +322 -0
- package/vendor/pi-web-access/code-search.ts +107 -0
- package/vendor/pi-web-access/curator-page.ts +3359 -0
- package/vendor/pi-web-access/curator-server.ts +605 -0
- package/vendor/pi-web-access/exa.ts +520 -0
- package/vendor/pi-web-access/extract.ts +641 -0
- package/vendor/pi-web-access/gemini-api.ts +112 -0
- package/vendor/pi-web-access/gemini-search.ts +361 -0
- package/vendor/pi-web-access/gemini-url-context.ts +126 -0
- package/vendor/pi-web-access/gemini-web-config.ts +52 -0
- package/vendor/pi-web-access/gemini-web.ts +396 -0
- package/vendor/pi-web-access/github-api.ts +196 -0
- package/vendor/pi-web-access/github-extract.ts +634 -0
- package/vendor/pi-web-access/index.ts +2346 -0
- package/vendor/pi-web-access/package.json +45 -0
- package/vendor/pi-web-access/pdf-extract.ts +192 -0
- package/vendor/pi-web-access/perplexity.ts +195 -0
- package/vendor/pi-web-access/pi-web-fetch-demo.mp4 +0 -0
- package/vendor/pi-web-access/rsc-extract.ts +338 -0
- package/vendor/pi-web-access/skills/librarian/SKILL.md +195 -0
- package/vendor/pi-web-access/storage.ts +72 -0
- package/vendor/pi-web-access/summary-review.ts +276 -0
- package/vendor/pi-web-access/test/gemini-web-cookie-opt-in.test.mjs +41 -0
- package/vendor/pi-web-access/test/pdf-extract.test.mjs +95 -0
- package/vendor/pi-web-access/utils.ts +44 -0
- package/vendor/pi-web-access/video-extract.ts +378 -0
- package/vendor/pi-web-access/youtube-extract.ts +310 -0
- package/dist/lib/pi-adapter/auth.js +0 -68
- package/dist/lib/pi-adapter/auth.js.map +0 -1
- package/dist/lib/pi-adapter/pod-tools.js +0 -140
- package/dist/lib/pi-adapter/pod-tools.js.map +0 -1
- package/dist/skills/drizzle-solid/SKILL.md +0 -340
- package/dist/skills/pod-storage/SKILL.md +0 -100
- package/dist/skills/solid-modeling/SKILL.md +0 -274
- 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 生成
|