@infinisys/fabric 0.0.0-stage → 0.1.0

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 (3) hide show
  1. package/README.md +72 -2
  2. package/cordis.patch.yml +632 -0
  3. package/package.json +41 -4
package/README.md CHANGED
@@ -1,3 +1,73 @@
1
- # Temporary Holding Version
1
+ # @infinisys/fabric
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ 一个 bundle,把 Infinity Fabric 的全部插件按支持顺序装进同一个 profile。
4
+
5
+ 它自己不含任何 Host/Client 代码:`cordis.patch.yml` 是十二个成员包补丁的**生成结果**(`pnpm run meta` 生成,`scripts/check.mjs` 会拦住忘记重建的版本)。所以「装了什么」仍然由每个 `is-*` 包自己的补丁决定,这里只有一份顺序表和一个开关。
6
+
7
+ ## 它做了什么
8
+
9
+ 启用后,profile 里等价于同时启用了这十二个 bundle:
10
+
11
+ | 顺序 | 包 | 作用 |
12
+ | --- | --- | --- |
13
+ | 1 | `@infinisys/is-identity` | 品牌与部署身份(纯文字 Infinity System,关闭原生 `ui-brand-official`) |
14
+ | 2 | `@infinisys/is-settings` | Infinity 设置页与 `infinitySettings` 服务 |
15
+ | 3 | `@infinisys/is-devops` | GitFox 面板与 `infinity_devops` / `infinity_git` 工具 |
16
+ | 4 | `@infinisys/is-fabric-team` | 团队协作模式预设与 `infinityTeam` 服务(关闭原生 Team 工具/UI) |
17
+ | 5 | `@infinisys/is-im` | IM 网关与「IM 网关」设置卡片 |
18
+ | 6 | `@infinisys/is-team-language` | 团队语言桥与 `/infinity/translate` |
19
+ | 7 | `@infinisys/is-update` | 版本与更新卡片 |
20
+ | 8 | `@infinisys/is-offpeak` | 峰谷调度卡片 |
21
+ | 9 | `@infinisys/is-toolchain-cache` | 构建缓存与 `TMPDIR` 重定向 |
22
+ | 10 | `@infinisys/is-disk-guard` | 会话投影的写盘预算 |
23
+ | 11 | `@infinisys/is-web-access` | 抓取放行(把 profile 的 `web` 行指到 `infinity-http`) |
24
+ | 12 | `@infinisys/is-stream-guard` | SSE 帧错误重试 |
25
+
26
+ 顺序不是装饰:`is-settings` 要先于 `is-devops` 与 `is-fabric-team` 提供 `infinitySettings`,`is-identity` 要先关掉原生品牌行,`is-web-access` 要排在 `@deepseek-ai/dsh-web-app` 之后才有 `web` 行可改。
27
+
28
+ ## 为什么是一份生成文件,而不是指向兄弟包的路径清单
29
+
30
+ `dsh.bundle.patch` 也接受路径数组,但那些路径是相对**包目录**拼出来的字符串。装到 profile 后包目录是 `node_modules/@infinisys/fabric`,兄弟包在 pnpm 的严格布局里可能不在同一层——路径清单在某些安装方式下会静默指向不存在的文件。一份跟着包走的 `cordis.patch.yml` 没有这个前提。
31
+
32
+ 改成员补丁后记得重建:
33
+
34
+ ```bash
35
+ pnpm run meta # 重新生成 packages/fabric/cordis.patch.yml
36
+ pnpm run check # 生成文件过期时这里会失败
37
+ ```
38
+
39
+ ## 安装
40
+
41
+ 成员包写在这份清单的 `dependencies` 里,每条是 `^<成员版本>`,所以从 registry 装一次就全了:
42
+
43
+ ```bash
44
+ dsh plugin --profile web add @infinisys/fabric
45
+ ```
46
+
47
+ 想直接指向 checkout(发布前、或改代码即时生效):
48
+
49
+ ```bash
50
+ node scripts/link-meta.mjs --link # 把 ^<版本> 换成 link:../is-*
51
+ dsh plugin --profile web add /path/to/Fabric/packages/fabric /path/to/Fabric/packages/is-*
52
+ ```
53
+
54
+ `--link` 只在本地用,提交前跑 `node scripts/link-meta.mjs --registry` 换回来(`scripts/check.mjs` 只接受 registry 形式)。`pnpm` 对 `link:` 依赖的处理随版本而异,可能不会替你把成员包搬进 profile,所以 checkout 装法要把十三个目录一起写进同一条命令。
55
+
56
+ 成员之间必须成套的关系只有三处(`is-devops` 要 `is-settings`,`is-fabric-team` 要 `is-settings` 加 `is-devops`,`is-disk-guard` 建议配 `is-stream-guard`),单个安装时的命令见 [依赖关系](../../docs/dependencies.md)。
57
+
58
+ 装完在 Plugins 页面启用 `@infinisys/fabric`(或把 `@infinisys/fabric` 加进 `$DSH_HOME/profiles/web/package.json` 的 `dsh.profile.bundles`),重启一次 Web。
59
+
60
+ ## 只想装一部分
61
+
62
+ 不要启用这个元包。按需单独启用对应的 `is-*` 包即可,每个包的补丁是独立的。
63
+
64
+ 反过来,一旦启用了元包,就不要再单独启用任何 `is-*` 包:同一个插件会被注册两次,重复的行 id 会让 profile 加载失败。
65
+
66
+ 想关掉其中某个插件但保留其余:在 profile 的 `cordis.patch.yml` 里追加一行覆盖,例如
67
+
68
+ ```yaml
69
+ - id: is-im
70
+ disabled: true
71
+ ```
72
+
73
+ profile 补丁层永远在 bundle 层之后应用,所以这一行会生效。注意有些包除了插入自己的行,还改动了已有行(`is-identity` 关掉 `ui-brand-official`、`is-fabric-team` 关掉原生 Team 两行、`is-web-access` 改 `web` 行),只停用插入的行不会把这些改动还原,具体见 [安装与退回](../../docs/install.md)。
@@ -0,0 +1,632 @@
1
+ # GENERATED FILE — do not edit.
2
+ #
3
+ # The Infinity Fabric one-bundle install: every member patch, in dependency
4
+ # order, so one package (and one on/off switch) carries the whole stack.
5
+ # Edit packages/<member>/cordis.patch.yml instead, then run `pnpm run meta`.
6
+ # `scripts/check.mjs` fails while this file is stale.
7
+
8
+ # ---- @infinisys/is-identity -------------------------------------------------
9
+ - id: ui-brand-official
10
+ # The shipped wordmark/mark can never win the single brand seats: Infinity
11
+ # identity owns them and is text-only by design.
12
+ disabled: true
13
+ - insert:
14
+ - id: is-identity
15
+ name: '@infinisys/is-identity'
16
+ config:
17
+ # Infinity Glass (the backdrop frost and the surface alpha that lets it
18
+ # show) is on by default. Set `frost: false` in the profile's own patch
19
+ # to give every surface back to the shell.
20
+ frost: true
21
+
22
+ # ---- @infinisys/is-settings -------------------------------------------------
23
+ - insert:
24
+ - id: is-settings
25
+ name: '@infinisys/is-settings'
26
+ config: {}
27
+
28
+ # ---- @infinisys/is-devops ---------------------------------------------------
29
+ - insert:
30
+ - id: is-devops
31
+ name: '@infinisys/is-devops'
32
+ config: {}
33
+
34
+ # ---- @infinisys/is-fabric-team ----------------------------------------------
35
+ # Infinity Fabric AI Team bundle.
36
+ #
37
+ # Adds four Agent presets that together make up Team Collaboration Mode:
38
+ #
39
+ # fabric-team Assistant/Lead coordination only: no shell, no write
40
+ # fabric-team-worker dev / test / ci implementation surface (guarded paths)
41
+ # fabric-team-readonly qa / secure / hr review surface: read-only, no shell
42
+ # fabric-team-docs docs seat: writes documentation paths, no shell
43
+ #
44
+ # The tool surface is structural: a role gets the preset that mounts exactly the
45
+ # tools it may use, so an Assistant or Lead cannot do implementation work even
46
+ # when Host provisioning fails. The Host row (`is-fabric-team`) registers the
47
+ # `infinity_team` tool, the per-role git/write guards, the `/infinity/team/state`
48
+ # snapshot and the GitFox-tracked governance state.
49
+ #
50
+ # This bundle requires the official Agent Teams profile bundle for its base
51
+ # rows, but runs the Fabric team on the Subagent runtime: the native
52
+ # tool-agent-team and ui-agent-team rows are disabled below so the session has
53
+ # exactly one visible identity, the Assistant. Do NOT insert another
54
+ # tool-agent-team row here.
55
+
56
+ # The native Agent Teams root is hard-coded as the Lead. Fabric Team uses the
57
+ # Subagent runtime instead and owns the Assistant identity, so the native Team
58
+ # tools and roster UI stay off in this profile.
59
+ - id: tool-agent-team
60
+ disabled: true
61
+
62
+ - id: ui-agent-team
63
+ disabled: true
64
+
65
+ # The Assistant + Lead + eight roles are 10 members; allow enough live children
66
+ # for the auto-provisioned tree (root -> lead -> eight teammates).
67
+ - id: subagent
68
+ config:
69
+ maxActiveSubagents: 16
70
+ maxDepth: 3
71
+
72
+ - insert:
73
+ - id: is-fabric-team
74
+ name: '@infinisys/is-fabric-team'
75
+ config: {}
76
+
77
+ # ---------------------------------------------------------------- coordinator
78
+ # The session root (Assistant) and the Lead. Coordination and read-only
79
+ # inspection only: the shell and the write/edit tools are not mounted at all.
80
+ - id: preset-fabric-team
81
+ name: '@deepseek-ai/dsh-agent-preset'
82
+ config:
83
+ id: fabric-team
84
+ name: 团队协作模式
85
+ description: >-
86
+ Infinity Fabric 团队协作模式:助手先提取需求并由 Lead 带队;QA、后端、前端与安全必须一致投票;
87
+ 所有会议、决策与工作流都通过 GitFox 跟踪;HR 管理长期身份。
88
+ 助手与 Lead 只有协调与只读工具,结构上没有 shell 和写文件能力。
89
+ order: 5
90
+ plugins:
91
+ - id: persona
92
+ name: '@deepseek-ai/dsh-persona'
93
+ config:
94
+ prefix: >-
95
+ You are the coordinator of the Infinity Fabric AI Team, powered by the {{model}} model.
96
+ The session root is the Assistant: it owns user intake and the final answer. The Lead
97
+ teammate turns tracked requirements into plans, decisions and assigned tasks. You have
98
+ no shell and no file-writing tools by construction: never implement work yourself,
99
+ never decide without unanimous votes, never work untracked, and never claim a gate
100
+ passed without a successful infinity_team result.
101
+ - id: agent-instructions
102
+ name: '@deepseek-ai/dsh-agent-instructions'
103
+ config:
104
+ maxBytes: 65536
105
+ - id: time-context
106
+ name: '@deepseek-ai/dsh-time-context'
107
+ - id: fabric-team-mode
108
+ name: '@infinisys/is-fabric-team/mode'
109
+ config:
110
+ role: coordinator
111
+ # Read-only filesystem: no write, no edit tool is ever registered.
112
+ - id: tool-fs
113
+ name: '@deepseek-ai/dsh-tool-fs'
114
+ config:
115
+ read: true
116
+ readImage: true
117
+ write: false
118
+ edit: false
119
+ - id: tool-fs-search
120
+ name: '@deepseek-ai/dsh-tool-fs-search'
121
+ config:
122
+ sampleOverCapGlobResults: false
123
+ - id: tool-web
124
+ name: '@deepseek-ai/dsh-tool-web'
125
+ config:
126
+ fetch: true
127
+ searchTimeoutMs: 60000
128
+ - id: tool-ask-user
129
+ name: '@deepseek-ai/dsh-tool-ask-user'
130
+ - id: tool-todo
131
+ name: '@deepseek-ai/dsh-tool-todo'
132
+ config:
133
+ allowParallelInProgress: true
134
+ - id: command-goal
135
+ name: '@deepseek-ai/dsh-command-goal'
136
+ - id: tool-goal
137
+ name: '@deepseek-ai/dsh-tool-goal'
138
+ - id: present
139
+ name: '@deepseek-ai/dsh-tool-present'
140
+ - id: planning
141
+ name: cordis:group
142
+ group: true
143
+ isolate:
144
+ planMode: true
145
+ config:
146
+ - id: plan-mode
147
+ name: '@deepseek-ai/dsh-plan-mode'
148
+ config:
149
+ section: |
150
+ You are in plan mode. Stay in plan mode until the user approves your plan through exit_plan_mode or switches the session mode. Imperative language to implement changes means plan the implementation, not execute it. A user's conversational agreement — including an answer confirming something you asked — approves nothing and does not end plan mode; fold the confirmed decision into the plan and submit it through exit_plan_mode.
151
+
152
+ Explore first. Use non-mutating reads, searches and checks to ground the plan in the actual repository. Do not edit or write files, change configuration, run formatters or code generation that rewrites tracked files, commit, or otherwise carry out the plan.
153
+
154
+ A plan is only complete when it names the tracked requirement, the decision that needs unanimous votes, every affected boundary, the tests and the evidence each workflow gate expects. Resolve discoverable facts by inspection. Use ask_user_question only for user-owned choices that inspection cannot answer. Submit the plan through exit_plan_mode.
155
+ - id: compaction
156
+ name: cordis:group
157
+ group: true
158
+ isolate:
159
+ compaction: true
160
+ toolResultPruner: true
161
+ config:
162
+ - id: compaction-basic
163
+ name: '@deepseek-ai/dsh-compaction-basic'
164
+ - id: command-compact
165
+ name: '@deepseek-ai/dsh-command-compact'
166
+ - id: tool-result-pruner
167
+ name: '@deepseek-ai/dsh-compaction-tool-result-pruner'
168
+ config:
169
+ thresholdChars: 8192
170
+ headChars: 4096
171
+ tailChars: 1024
172
+ - id: tool-plugin-manager
173
+ name: '@deepseek-ai/dsh-plugin-manager/tools'
174
+ disabled: true
175
+ - id: tool-plugin-market
176
+ name: '@deepseek-ai/dsh-plugin-market/tools'
177
+ disabled: true
178
+
179
+ # ---------------------------------------------------------------- watchdog
180
+ # The Lead's peer. Read-only, no team tools: its only control surface is
181
+ # infinity_watchdog, registered by the Host at creation.
182
+ - id: preset-fabric-team-watchdog
183
+ name: '@deepseek-ai/dsh-agent-preset'
184
+ config:
185
+ id: fabric-team-watchdog
186
+ name: 团队监督员
187
+ description: >-
188
+ Lead 的同级监督员:读团队事件流与账本,判断是否真的在推进;可暂停/恢复团队、
189
+ 关闭陈旧条目、向 Lead 或人类升级。没有 shell、写文件、投票或实施工具。
190
+ order: 6
191
+ plugins:
192
+ - id: persona
193
+ name: '@deepseek-ai/dsh-persona'
194
+ config:
195
+ prefix: >-
196
+ You are the Watchdog of the Infinity Fabric AI Team, the Lead's peer. You judge
197
+ whether the team is making real progress, and you intervene when it is not. You
198
+ cannot implement, vote, intake, merge or write files: your only control surface is
199
+ the infinity_watchdog tool. Read the team's language; do not reduce your judgement
200
+ to a status code.
201
+ - id: agent-instructions
202
+ name: '@deepseek-ai/dsh-agent-instructions'
203
+ config:
204
+ maxBytes: 65536
205
+ - id: time-context
206
+ name: '@deepseek-ai/dsh-time-context'
207
+ - id: tool-fs
208
+ name: '@deepseek-ai/dsh-tool-fs'
209
+ config:
210
+ read: true
211
+ readImage: false
212
+ write: false
213
+ edit: false
214
+ - id: tool-fs-search
215
+ name: '@deepseek-ai/dsh-tool-fs-search'
216
+ config:
217
+ sampleOverCapGlobResults: false
218
+ - id: tool-web
219
+ name: '@deepseek-ai/dsh-tool-web'
220
+ config:
221
+ fetch: true
222
+ searchTimeoutMs: 60000
223
+ - id: tool-ask-user
224
+ name: '@deepseek-ai/dsh-tool-ask-user'
225
+ - id: tool-todo
226
+ name: '@deepseek-ai/dsh-tool-todo'
227
+ config:
228
+ allowParallelInProgress: false
229
+ - id: compaction
230
+ name: cordis:group
231
+ group: true
232
+ isolate:
233
+ compaction: true
234
+ toolResultPruner: true
235
+ config:
236
+ - id: compaction-basic
237
+ name: '@deepseek-ai/dsh-compaction-basic'
238
+ - id: command-compact
239
+ name: '@deepseek-ai/dsh-command-compact'
240
+ - id: tool-result-pruner
241
+ name: '@deepseek-ai/dsh-compaction-tool-result-pruner'
242
+ config:
243
+ thresholdChars: 8192
244
+ headChars: 4096
245
+ tailChars: 1024
246
+
247
+ # ------------------------------------------------------------------- worker
248
+ # Implementation seats: backend, frontend, delivery/CI and test. A shell is
249
+ # present, but direct git is refused and write/edit stays inside the role's
250
+ # write scopes (enforced by the Host git/write guards).
251
+ - id: preset-fabric-team-worker
252
+ name: '@deepseek-ai/dsh-agent-preset'
253
+ config:
254
+ id: fabric-team-worker
255
+ name: 团队协作模式(执行成员)
256
+ description: >-
257
+ 团队执行席位(后端、前端、交付/CI、测试)。在 Lead 分配的 claim 内实现并写测试;
258
+ 直接 git 被禁用,只能使用 infinity_git;写路径受角色白名单约束。
259
+ order: 6
260
+ plugins:
261
+ - id: persona
262
+ name: '@deepseek-ai/dsh-persona'
263
+ config:
264
+ prefix: >-
265
+ You are an implementation seat of the Infinity Fabric AI Team, powered by the {{model}}
266
+ model. Implement only inside the claim the Lead assigned and inside your role's write
267
+ scopes; write tests before production code; never approve your own work; drive git only
268
+ through infinity_git; a denied tool call is final.
269
+ - id: agent-instructions
270
+ name: '@deepseek-ai/dsh-agent-instructions'
271
+ config:
272
+ maxBytes: 65536
273
+ - id: time-context
274
+ name: '@deepseek-ai/dsh-time-context'
275
+ - id: fabric-team-mode
276
+ name: '@infinisys/is-fabric-team/mode'
277
+ config:
278
+ role: worker
279
+ - id: tool-bash
280
+ name: '@deepseek-ai/dsh-tool-bash'
281
+ disabled: !!js process.platform === 'win32'
282
+ - id: tool-pwsh
283
+ name: '@deepseek-ai/dsh-tool-pwsh'
284
+ disabled: !!js process.platform !== 'win32'
285
+ - id: tool-fs
286
+ name: '@deepseek-ai/dsh-tool-fs'
287
+ - id: tool-fs-search
288
+ name: '@deepseek-ai/dsh-tool-fs-search'
289
+ config:
290
+ sampleOverCapGlobResults: false
291
+ - id: tool-jobs
292
+ name: '@deepseek-ai/dsh-tool-jobs'
293
+ - id: skill-filesystem
294
+ name: '@deepseek-ai/dsh-skill-filesystem'
295
+ - id: tool-skill
296
+ name: '@deepseek-ai/dsh-tool-skill'
297
+ - id: tool-web
298
+ name: '@deepseek-ai/dsh-tool-web'
299
+ config:
300
+ fetch: true
301
+ searchTimeoutMs: 60000
302
+ - id: tool-ask-user
303
+ name: '@deepseek-ai/dsh-tool-ask-user'
304
+ - id: tool-todo
305
+ name: '@deepseek-ai/dsh-tool-todo'
306
+ config:
307
+ allowParallelInProgress: true
308
+ - id: present
309
+ name: '@deepseek-ai/dsh-tool-present'
310
+ - id: planning
311
+ name: cordis:group
312
+ group: true
313
+ isolate:
314
+ planMode: true
315
+ config:
316
+ - id: plan-mode
317
+ name: '@deepseek-ai/dsh-plan-mode'
318
+ config:
319
+ section: |
320
+ You are in plan mode. Plan only: no edits, no builds that rewrite tracked files, no commits. A plan names the claim, the failing test written first, and the evidence the next gate expects. Submit it through exit_plan_mode.
321
+ - id: compaction
322
+ name: cordis:group
323
+ group: true
324
+ isolate:
325
+ compaction: true
326
+ toolResultPruner: true
327
+ config:
328
+ - id: compaction-basic
329
+ name: '@deepseek-ai/dsh-compaction-basic'
330
+ - id: command-compact
331
+ name: '@deepseek-ai/dsh-command-compact'
332
+ - id: tool-result-pruner
333
+ name: '@deepseek-ai/dsh-compaction-tool-result-pruner'
334
+ config:
335
+ thresholdChars: 8192
336
+ headChars: 4096
337
+ tailChars: 1024
338
+
339
+ # ----------------------------------------------------------------- readonly
340
+ # Review seats: QA, Security and HR. No shell and no write/edit tool at all.
341
+ - id: preset-fabric-team-readonly
342
+ name: '@deepseek-ai/dsh-agent-preset'
343
+ config:
344
+ id: fabric-team-readonly
345
+ name: 团队协作模式(评审成员)
346
+ description: >-
347
+ 团队评审席位(QA、安全、HR)。结构上只有只读工具:不实现、不写文件、不起 shell,
348
+ 只验证、评审和投票,证据必须可追踪。
349
+ order: 7
350
+ plugins:
351
+ - id: persona
352
+ name: '@deepseek-ai/dsh-persona'
353
+ config:
354
+ prefix: >-
355
+ You are a review seat of the Infinity Fabric AI Team, powered by the {{model}} model.
356
+ You have read-only tools by construction: never implement or modify files, only verify,
357
+ review and vote with tracked evidence. Never approve delivery on behalf of the Lead,
358
+ and never trade a finding for schedule pressure.
359
+ - id: agent-instructions
360
+ name: '@deepseek-ai/dsh-agent-instructions'
361
+ config:
362
+ maxBytes: 65536
363
+ - id: time-context
364
+ name: '@deepseek-ai/dsh-time-context'
365
+ - id: fabric-team-mode
366
+ name: '@infinisys/is-fabric-team/mode'
367
+ config:
368
+ role: worker
369
+ - id: tool-fs
370
+ name: '@deepseek-ai/dsh-tool-fs'
371
+ config:
372
+ read: true
373
+ readImage: true
374
+ write: false
375
+ edit: false
376
+ - id: tool-fs-search
377
+ name: '@deepseek-ai/dsh-tool-fs-search'
378
+ config:
379
+ sampleOverCapGlobResults: false
380
+ - id: tool-web
381
+ name: '@deepseek-ai/dsh-tool-web'
382
+ config:
383
+ fetch: true
384
+ searchTimeoutMs: 60000
385
+ - id: tool-ask-user
386
+ name: '@deepseek-ai/dsh-tool-ask-user'
387
+ - id: tool-todo
388
+ name: '@deepseek-ai/dsh-tool-todo'
389
+ config:
390
+ allowParallelInProgress: false
391
+ - id: planning
392
+ name: cordis:group
393
+ group: true
394
+ isolate:
395
+ planMode: true
396
+ config:
397
+ - id: plan-mode
398
+ name: '@deepseek-ai/dsh-plan-mode'
399
+ config:
400
+ section: |
401
+ You are in plan mode. Plan only: no edits, no builds that rewrite tracked files, no commits. A plan names the claim, the failing test written first, and the evidence the next gate expects. Submit it through exit_plan_mode.
402
+ - id: compaction
403
+ name: cordis:group
404
+ group: true
405
+ isolate:
406
+ compaction: true
407
+ toolResultPruner: true
408
+ config:
409
+ - id: compaction-basic
410
+ name: '@deepseek-ai/dsh-compaction-basic'
411
+ - id: command-compact
412
+ name: '@deepseek-ai/dsh-command-compact'
413
+ - id: tool-result-pruner
414
+ name: '@deepseek-ai/dsh-compaction-tool-result-pruner'
415
+ config:
416
+ thresholdChars: 8192
417
+ headChars: 4096
418
+ tailChars: 1024
419
+
420
+ # --------------------------------------------------------------------- docs
421
+ # Documentation seat: may write documentation paths, never a shell.
422
+ - id: preset-fabric-team-docs
423
+ name: '@deepseek-ai/dsh-agent-preset'
424
+ config:
425
+ id: fabric-team-docs
426
+ name: 团队协作模式(文档成员)
427
+ description: >-
428
+ 团队文档席位。只能写文档路径(docs/、README、包内 README),没有 shell;
429
+ 不实现生产代码,不投票技术决策。
430
+ order: 8
431
+ plugins:
432
+ - id: persona
433
+ name: '@deepseek-ai/dsh-persona'
434
+ config:
435
+ prefix: >-
436
+ You are the Documentation seat of the Infinity Fabric AI Team, powered by the {{model}}
437
+ model. You may write documentation paths only and you have no shell: never implement
438
+ production code, never vote on technical decisions, and keep README, architecture and
439
+ user-facing copy aligned with the shipped behavior.
440
+ - id: agent-instructions
441
+ name: '@deepseek-ai/dsh-agent-instructions'
442
+ config:
443
+ maxBytes: 65536
444
+ - id: time-context
445
+ name: '@deepseek-ai/dsh-time-context'
446
+ - id: fabric-team-mode
447
+ name: '@infinisys/is-fabric-team/mode'
448
+ config:
449
+ role: worker
450
+ - id: tool-fs
451
+ name: '@deepseek-ai/dsh-tool-fs'
452
+ - id: tool-fs-search
453
+ name: '@deepseek-ai/dsh-tool-fs-search'
454
+ config:
455
+ sampleOverCapGlobResults: false
456
+ - id: tool-web
457
+ name: '@deepseek-ai/dsh-tool-web'
458
+ config:
459
+ fetch: true
460
+ searchTimeoutMs: 60000
461
+ - id: tool-ask-user
462
+ name: '@deepseek-ai/dsh-tool-ask-user'
463
+ - id: tool-todo
464
+ name: '@deepseek-ai/dsh-tool-todo'
465
+ config:
466
+ allowParallelInProgress: false
467
+ - id: present
468
+ name: '@deepseek-ai/dsh-tool-present'
469
+ - id: planning
470
+ name: cordis:group
471
+ group: true
472
+ isolate:
473
+ planMode: true
474
+ config:
475
+ - id: plan-mode
476
+ name: '@deepseek-ai/dsh-plan-mode'
477
+ config:
478
+ section: |
479
+ You are in plan mode. Plan only: no edits, no builds that rewrite tracked files, no commits. A plan names the claim, the failing test written first, and the evidence the next gate expects. Submit it through exit_plan_mode.
480
+ - id: compaction
481
+ name: cordis:group
482
+ group: true
483
+ isolate:
484
+ compaction: true
485
+ toolResultPruner: true
486
+ config:
487
+ - id: compaction-basic
488
+ name: '@deepseek-ai/dsh-compaction-basic'
489
+ - id: command-compact
490
+ name: '@deepseek-ai/dsh-command-compact'
491
+ - id: tool-result-pruner
492
+ name: '@deepseek-ai/dsh-compaction-tool-result-pruner'
493
+ config:
494
+ thresholdChars: 8192
495
+ headChars: 4096
496
+ tailChars: 1024
497
+
498
+ # ---- @infinisys/is-im -------------------------------------------------------
499
+ - insert:
500
+ - id: is-im
501
+ name: '@infinisys/is-im'
502
+ config: {}
503
+
504
+ # ---- @infinisys/is-team-language --------------------------------------------
505
+ # Team language bridge: the English record, the user-language translation,
506
+ # and the settings card that chooses the translation engine.
507
+ #
508
+ # The Fabric AI Team keeps working in English. This row adds the prompt section
509
+ # that makes every user-facing artifact carry a translation into the user's
510
+ # language, without touching the tracked English record.
511
+ - insert:
512
+ - id: is-team-language
513
+ name: '@infinisys/is-team-language'
514
+ config: {}
515
+
516
+ # ---- @infinisys/is-update ---------------------------------------------------
517
+ - insert:
518
+ - id: is-update
519
+ name: '@infinisys/is-update'
520
+ config: {}
521
+
522
+ # ---- @infinisys/is-offpeak --------------------------------------------------
523
+ - insert:
524
+ - id: is-offpeak
525
+ name: '@infinisys/is-offpeak'
526
+ config: {}
527
+
528
+ # ---- @infinisys/is-toolchain-cache ------------------------------------------
529
+ - insert:
530
+ - id: is-toolchain-cache
531
+ name: '@infinisys/is-toolchain-cache'
532
+ config: {}
533
+
534
+ # ---- @infinisys/is-disk-guard -----------------------------------------------
535
+ # Infinity disk guard.
536
+ #
537
+ # A projection checkpoint is one whole per-session document replaced atomically
538
+ # (temp + fsync + rename + directory fsync), and a team session writes one per
539
+ # agent. Measured on a live profile: 8.3 MB of whole-document rewrite per two
540
+ # minutes against 0.7 MB of genuinely new data, 93% of it this cache — a parity
541
+ # RAID turns each of those into read-modify-write of the stripes.
542
+ #
543
+ # Three things make that cache cheap, in the order they cost:
544
+ #
545
+ # 1. It stays a cache. One checkpoint per minute (or per two thousand events)
546
+ # instead of per five seconds, and a turn end flushes the session log without
547
+ # rewriting the whole document — the next throttled checkpoint carries it.
548
+ # A stale cache costs replay time on the next start, never a message.
549
+ # 2. It stops carrying history it can refold. The context timeline, the context
550
+ # headers and the turn outline grow with the conversation, so the same bytes
551
+ # were rewritten for the rest of a session's life. The cache keeps a recent
552
+ # window; the session log keeps all of it.
553
+ # 3. Session creation and disposal still checkpoint immediately: a new document
554
+ # and a session going cold have no later checkpoint to fall back on.
555
+ # 4. The same disease one process over. The context-compression proxy in front of
556
+ # the model keeps every session twice — a SQLite index it reads, plus a legacy
557
+ # JSON envelope it still rewrites whole — and on the measured machine that one
558
+ # process wrote 11 MB/s and read 107 MB/s of its own state while the disk sat
559
+ # at 96%. The guard passes it a slower save cadence, a larger journal window
560
+ # and more sessions kept in memory when the host launches it; `envelope: off`
561
+ # drops the duplicate copy and `quickCheck: off` skips the whole-index
562
+ # integrity scan every start pays for.
563
+ # 5. And it stops the save itself from carrying the whole row. One save is a
564
+ # single upsert over every column of `sessions`, the multi-megabyte state
565
+ # blobs included, so a save that only moves `updated_at` still drags them
566
+ # along. A preload attached at launch compares each save with the previous one
567
+ # and writes only the columns that moved; a save that carries nothing new
568
+ # writes nothing. It hooks the proxy's own SQLite binding at runtime — no file
569
+ # of the proxy is edited, and an unfamiliar statement shape is passed through
570
+ # unchanged.
571
+ # 6. And it stops a burst of saves from paying a burst of fsyncs. SQLite commits
572
+ # every statement on its own, so the proxy's thousands of small rows a minute
573
+ # became thousands of tiny writes a second — measured with `iostat -x`: 1,100
574
+ # to 1,400 writes/s of 4 to 24 KB, 70 to 120 ms each, the device 96 to 100 %
575
+ # busy while the CPU sat at 1 %. The hook now holds the burst in one
576
+ # transaction and commits it on a short window (200 ms), so the same saves pay
577
+ # one fsync per window instead of one per row. A crash can lose at most that
578
+ # window, which the proxy regenerates from its own journal.
579
+ - insert:
580
+ - id: is-disk-guard
581
+ name: '@infinisys/is-disk-guard'
582
+ config:
583
+ projectionCache:
584
+ writeIntervalMs: 60000
585
+ writeEveryEvents: 2000
586
+ coalesceTurnEnd: true
587
+ rows:
588
+ contextTimeline:
589
+ surface: 300
590
+ requests: 80
591
+ commands: 120
592
+ events: 200
593
+ contextHeaders:
594
+ headers: 2
595
+ turnOutline:
596
+ turns: 30
597
+ proxy:
598
+ debounceMs: 15000 # 每 15 秒才落一次盘;一次保存是整份状态重写,间隔直接决定写盘量
599
+ walJournalSizeLimitBytes: 67108864
600
+ residentMaxBytes: 2147483648
601
+ envelope: off # 索引已是唯一读取路径;旧信封文件留在盘上不动
602
+ watermark: on # 把代理的水印带回下一轮请求,命中重发快路径(换掉每回合的整段解析)
603
+ quickCheck: off # 开机全库自检要读完整索引(实测 688MB);要保留就写 on
604
+ batchMs: 200 # 一批保存合成一个事务,一次 fsync;0 关闭批提交(20 – 2000)
605
+
606
+ # ---- @infinisys/is-web-access -----------------------------------------------
607
+ # The Infinity web access bundle.
608
+ #
609
+ # `web` names which fetch provider `ctx.web.fetch` resolves, and a patch
610
+ # replaces the targeted row's whole `config` — so every key the base row owns is
611
+ # restated here, including the search provider this bundle does not change.
612
+ #
613
+ # `infinity-http` is the provider registered below. It keeps the shipped
614
+ # retrieval rules (HTTP(S) only, no credentials, same-origin redirects, size and
615
+ # character caps) and adds the one thing the shipped provider hard-codes: whether
616
+ # a destination that resolves to a non-public address is refused. That answer is
617
+ # a user setting, read per request, so flipping the switch needs no restart.
618
+ - id: web
619
+ config:
620
+ searchProvider: deepseek-official
621
+ fetchProvider: infinity-http
622
+
623
+ - insert:
624
+ - id: is-web-access
625
+ name: '@infinisys/is-web-access'
626
+ config: {}
627
+
628
+ # ---- @infinisys/is-stream-guard ---------------------------------------------
629
+ - insert:
630
+ - id: is-stream-guard
631
+ name: '@infinisys/is-stream-guard'
632
+ config: {}
package/package.json CHANGED
@@ -1,6 +1,43 @@
1
1
  {
2
2
  "name": "@infinisys/fabric",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "One bundle that applies every Infinity Fabric plugin in the supported order.",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://gitfox.studio/infinity/Fabric.git",
9
+ "directory": "packages/fabric"
10
+ },
11
+ "engines": {
12
+ "node": ">=22.13.0",
13
+ "dsh": ">=0.2.2-rc.1 <0.3.0"
14
+ },
15
+ "publishConfig": {
16
+ "access": "public"
17
+ },
18
+ "type": "module",
19
+ "dependencies": {
20
+ "@infinisys/is-identity": "^0.2.0",
21
+ "@infinisys/is-settings": "^0.1.0",
22
+ "@infinisys/is-devops": "^0.1.0",
23
+ "@infinisys/is-fabric-team": "^0.1.0",
24
+ "@infinisys/is-im": "^0.1.0",
25
+ "@infinisys/is-team-language": "^0.1.0",
26
+ "@infinisys/is-update": "^0.1.0",
27
+ "@infinisys/is-offpeak": "^0.1.0",
28
+ "@infinisys/is-toolchain-cache": "^0.1.0",
29
+ "@infinisys/is-disk-guard": "^0.7.0",
30
+ "@infinisys/is-web-access": "^0.1.0",
31
+ "@infinisys/is-stream-guard": "^0.1.0"
32
+ },
33
+ "files": [
34
+ "cordis.patch.yml",
35
+ "README.md",
36
+ "package.json"
37
+ ],
38
+ "dsh": {
39
+ "bundle": {
40
+ "patch": "./cordis.patch.yml"
41
+ }
42
+ }
43
+ }