@fenglimg/fabric-shared 2.3.0-rc.2 → 2.3.0-rc.3

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.
@@ -192,8 +192,20 @@ var globalConfigSchema = z.object({
192
192
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
193
193
  import { homedir } from "os";
194
194
  import { join } from "path";
195
+ function isTestRuntime() {
196
+ return process.env.VITEST !== void 0 || process.env.VITEST_WORKER_ID !== void 0;
197
+ }
195
198
  function resolveGlobalRoot() {
196
- return join(process.env.FABRIC_HOME ?? homedir(), ".fabric");
199
+ const fabricHome = process.env.FABRIC_HOME;
200
+ if (fabricHome !== void 0 && fabricHome !== "") {
201
+ return join(fabricHome, ".fabric");
202
+ }
203
+ if (isTestRuntime()) {
204
+ throw new Error(
205
+ "resolveGlobalRoot(): FABRIC_HOME must be set under the test runner \u2014 refusing to fall back to the real home dir (~/.fabric). Repoint process.env.FABRIC_HOME to an isolated temp dir in beforeEach (see plan-context.test.ts for the pattern)."
206
+ );
207
+ }
208
+ return join(homedir(), ".fabric");
197
209
  }
198
210
  function globalConfigPath(globalRoot = resolveGlobalRoot()) {
199
211
  return join(globalRoot, "fabric-global.json");
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveGlobalLocale
3
- } from "./chunk-ANUDBQBK.js";
3
+ } from "./chunk-ASS2KBB7.js";
4
4
 
5
5
  // src/templates/bootstrap-canonical.ts
6
6
  var BOOTSTRAP_MARKER_BEGIN = "<!-- fabric:bootstrap:begin -->";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveGlobalLocale
3
- } from "./chunk-ANUDBQBK.js";
3
+ } from "./chunk-ASS2KBB7.js";
4
4
 
5
5
  // src/i18n/locales/en.ts
6
6
  var enMessages = {
@@ -18,6 +18,12 @@ var enMessages = {
18
18
  "cli.shared.none": "none",
19
19
  "cli.shared.loading": "loading",
20
20
  "cli.shared.refresh": "Refresh",
21
+ // flat-design-system Wave4 (TASK-004): gutter-free ✓/x receipt printed after a
22
+ // clack control (select/multiselect/confirm/text) resolves. The clack control
23
+ // stays native (C-006); the receipt is a separate flat line.
24
+ "cli.prompt.receipt.selected": "Selected",
25
+ "cli.prompt.receipt.set": "Set",
26
+ "cli.prompt.receipt.cancelled": "Cancelled",
21
27
  "cli.shared.target-invalid": "Target must be an existing directory: {target}",
22
28
  "cli.shared.target-invalid.action-hint": "Choose an existing project directory, or create it before running the command again.",
23
29
  "cli.shared.template-not-found": "Template not found: {path}",
@@ -54,6 +60,9 @@ var enMessages = {
54
60
  // Keys consumed by packages/cli/src/commands/config.ts (menu loop +
55
61
  // per-field prompts) and by getPanelFields() (label_i18n_key references).
56
62
  "cli.config.intro": "Fabric Configuration",
63
+ // flat-design-system Wave5 (TASK-005): B-横线 title above the flat key/value
64
+ // panel printed before the clack edit menu.
65
+ "cli.config.panel.title": "Current configuration",
57
66
  "cli.config.outro": "Configuration saved.",
58
67
  "cli.config.outro-no-changes": "No changes made.",
59
68
  "cli.config.cancel": "Cancelled.",
@@ -96,12 +105,19 @@ var enMessages = {
96
105
  "cli.config.fields.nudge_mode.label": "Nudge level",
97
106
  "cli.config.fields.nudge_mode.description": "Preset for human-visible nudges (silent / minimal / normal / verbose). Governs only the human channel \u2014 never the knowledge injected to the AI.",
98
107
  "cli.config.fields.embed_enabled.label": "Vector semantic search",
99
- "cli.config.fields.embed_enabled.description": "Enable vector semantic recall (true / false). Note: turning this on also needs `fabric install --enable-embed` for the host-side setup (fastembed + model cache); flipping it here alone does not enable it.",
108
+ "cli.config.fields.embed_enabled.description": "Enable vector semantic recall (true / false). Note: true is just intent \u2014 it only takes effect when the running server can resolve the fastembed package AND the model is downloaded (auto-fetched to ~/.fabric/cache/embed on first recall). Check actual state with `fabric info recall`.",
109
+ "cli.config.fields.fusion.label": "Recall fusion strategy",
110
+ "cli.config.fields.fusion.description": "How the signals combine into one score: additive = weighted sum (BM25-led, small vector weight) / rrf = Reciprocal Rank Fusion (BM25 and vector on equal footing, so semantics actually count) / auto = adaptive (default: rrf when the vector channel is scoring, else additive \u2014 avoids degenerate single-channel rrf being worse).",
100
111
  "cli.doctor.description": "Run Fabric target-state diagnostics (meta sync, knowledge index, bootstrap, events ledger, human-lock drift).\n\nExamples:\n fabric doctor read-only diagnostics report\n fabric doctor --fix repair derived state (meta + indexes)\n fabric doctor --fix-knowledge apply lint mutations (counter / archive / cache)\n fabric doctor --json machine-readable output",
101
112
  "doctor.section.fixable": "Fixable errors:",
102
113
  "doctor.section.manual": "Manual errors:",
103
114
  "doctor.section.warnings": "Warnings:",
104
115
  "doctor.section.fix-knowledge-mutations": "Fix-knowledge mutations:",
116
+ // flat-design-system Wave5 (TASK-005): C-圆点 group headers for the reskinned
117
+ // doctor surface (`● Store Health` / `● Checks`), replacing the old hardcoded
118
+ // sectionBar literals so the wording is localized in both locales.
119
+ "doctor.group.store-health": "Store Health",
120
+ "doctor.group.checks": "Checks",
105
121
  // v2.0.0-rc.29 REVIEW (codex LOW-2): F2's payload-limit defaults reach the JSON
106
122
  // envelope but never surfaced in the human renderer, so operators tuning
107
123
  // `mcpPayloadLimits` had no fast `fabric doctor` confirmation that their config
@@ -617,12 +633,29 @@ var enMessages = {
617
633
  "cli.install.pipeline.title": "Fabric Install",
618
634
  "cli.install.pipeline.complete": "Fabric Install Complete",
619
635
  "cli.install.pipeline.running": "Running {count} stages...",
636
+ // TASK-002 (G1): summary-card completion + count words. Formerly hardcoded
637
+ // English in ConsoleOutputRenderer (Done! / succeeded / skipped / failed /
638
+ // "All steps completed successfully"); routed through t() + dual-locale tables
639
+ // so locale-parity.test.ts guards both en + zh-CN carry every key.
640
+ "cli.summary.done": "Done!",
641
+ "cli.summary.all-ok": "All steps completed successfully",
642
+ "cli.summary.n-failed": "{count} step(s) failed",
643
+ "cli.summary.n-of-total": "{done}/{total} steps completed",
644
+ "cli.summary.count.succeeded": "succeeded",
645
+ "cli.summary.count.skipped": "skipped",
646
+ "cli.summary.count.failed": "failed",
620
647
  // TASK-004: a first-ever install gets an onboarding-tone intro; a re-install
621
648
  // keeps the terse "Running N stages" line. {count} = total stages.
622
649
  "cli.install.pipeline.intro.firstRun": "Welcome to Fabric \u2014 this is your first install. I'll walk you through a one-time setup ({count} stages); later runs skip anything already in place.",
623
650
  // TASK-004: the single collapsed health-check card title for a fully-idempotent
624
651
  // re-install. {count} = total stages. Detail is behind --verbose.
625
652
  "cli.install.healthcheck.title": "\u2713 Fabric is up to date \xB7 {count} stages ready \xB7 no changes",
653
+ // TASK-003 (G2 root a): the per-stage summary-detail status word now branches on
654
+ // r.changed (not installed.length) — a no-change re-ensure says "up to date"
655
+ // instead of misreporting "N installed". installed-count is used only when the
656
+ // stage actually changed something.
657
+ "cli.install.stage.uptodate": "up to date",
658
+ "cli.install.stage.installed-count": "{count} installed",
626
659
  "cli.install.pipeline.label.preflight": "Preflight check",
627
660
  "cli.install.pipeline.label.env": "Environment setup",
628
661
  "cli.install.pipeline.label.store": "Store configuration",
@@ -632,6 +665,10 @@ var enMessages = {
632
665
  "cli.install.pipeline.label.guidance": "Next steps",
633
666
  "cli.install.pipeline.desc.store": "Bind the current project's read/write store; refresh the resolved-bindings snapshot.",
634
667
  "cli.install.next-step": "{label} {message}",
668
+ // TASK-002 (G6): a single golden-action anchor that closes the summary card.
669
+ // The verbose capability table is gated behind --verbose; this one line is the
670
+ // honest "what to do next" footer. {action} = the concrete next command.
671
+ "cli.install.next-step.anchor": "Next \u2192 {action}",
635
672
  "cli.install.reason-message": "{label} {message}",
636
673
  "cli.install.language.prompt": "Choose the Fabric language (used for both UI and knowledge; change later via `fabric config`):",
637
674
  "cli.install.language.option.zh-CN": "\u7B80\u4F53\u4E2D\u6587 (zh-CN)",
@@ -659,6 +696,10 @@ var enMessages = {
659
696
  "cli.install.wizard.stage.bootstrap": "Install bootstrap templates? [{defaultValue}]",
660
697
  "cli.install.wizard.stage.mcp": "Configure MCP clients? [{defaultValue}]",
661
698
  "cli.install.wizard.stage.hooks": "Install git hooks? [{defaultValue}]",
699
+ // flat-design-system Wave4 (TASK-004): short stage labels for the post-group ✓ receipt.
700
+ "cli.install.wizard.stage.bootstrap.short": "bootstrap templates",
701
+ "cli.install.wizard.stage.mcp.short": "MCP clients",
702
+ "cli.install.wizard.stage.hooks.short": "git hooks",
662
703
  "cli.install.wizard.mcp-install": "MCP server install scope (global/local) [{defaultValue}]",
663
704
  "cli.install.wizard.execute.confirm": "Execute this install plan now? [Y/n]",
664
705
  "cli.install.wizard.outro": "Install plan accepted. Running Fabric install...",
@@ -793,7 +834,14 @@ var enMessages = {
793
834
  // C3: mirror install's phase banner ("Fabric install 将按 N 个阶段执行").
794
835
  "cli.uninstall.plan.phase-banner": "Fabric uninstall runs in {total} phases",
795
836
  "cli.uninstall.plan.target": "Target: {target}",
796
- "cli.uninstall.plan.actions": "Plan: bootstrap={bootstrap} mcp={mcp} scaffold={scaffold} unbind-store={store}",
837
+ // flat-design-system Wave5 (TASK-004 G3): the plan preview speaks human action
838
+ // sentences, one per ENABLED stage, instead of the `key=yes/no` jargon line.
839
+ "cli.uninstall.plan.will-remove": "Will remove:",
840
+ "cli.uninstall.plan.will-keep": "Will keep:",
841
+ "cli.uninstall.plan.action.bootstrap": "client skills & hook scripts",
842
+ "cli.uninstall.plan.action.mcp": "MCP server registration",
843
+ "cli.uninstall.plan.action.scaffold": "project scaffold files",
844
+ "cli.uninstall.plan.action.store": "team store binding (this project)",
797
845
  "cli.uninstall.plan.detected": "Detected clients: {clients}",
798
846
  "cli.uninstall.plan.preserves": "Preserves:",
799
847
  "cli.uninstall.plan.preserves.stores": "global knowledge stores, never deleted by project uninstall",
@@ -814,6 +862,10 @@ var enMessages = {
814
862
  "cli.uninstall.stages.uptodate": "nothing to remove ({count} already absent)",
815
863
  "cli.uninstall.stages.summary": "removed={removed} skipped={skipped} errors={errors}",
816
864
  "cli.uninstall.stages.removed-count": "{count} removed",
865
+ // flat-design-system Wave5 (TASK-006 G3): human result words for the summary
866
+ // card detail rows, symmetric with install's `{count} installed` / `up to date`.
867
+ "cli.uninstall.stage.cleaned-count": "{count} cleaned",
868
+ "cli.uninstall.stage.already-clean": "already clean",
817
869
  "cli.uninstall.summary.title": "Uninstall summary",
818
870
  "cli.uninstall.summary.body": "removed={removed} skipped={skipped} errors={errors}",
819
871
  "cli.uninstall.healthcheck.title": "\u2713 Fabric already absent \xB7 nothing to remove",
@@ -1100,6 +1152,11 @@ var zhCNMessages = {
1100
1152
  "cli.shared.none": "\u65E0",
1101
1153
  "cli.shared.loading": "\u52A0\u8F7D\u4E2D",
1102
1154
  "cli.shared.refresh": "\u5237\u65B0",
1155
+ // flat-design-system Wave4 (TASK-004): clack 控件(select/multiselect/confirm/text)
1156
+ // 落定后打印的平铺无沟槽 ✓/x 回执行。控件保持原生(C-006),回执是独立的一行。
1157
+ "cli.prompt.receipt.selected": "\u5DF2\u9009",
1158
+ "cli.prompt.receipt.set": "\u5DF2\u8BBE\u7F6E",
1159
+ "cli.prompt.receipt.cancelled": "\u5DF2\u53D6\u6D88",
1103
1160
  "cli.shared.target-invalid": "\u76EE\u6807\u5FC5\u987B\u662F\u5DF2\u5B58\u5728\u7684\u76EE\u5F55\uFF1A{target}",
1104
1161
  "cli.shared.target-invalid.action-hint": "\u8BF7\u9009\u62E9\u4E00\u4E2A\u5DF2\u5B58\u5728\u7684\u9879\u76EE\u76EE\u5F55\uFF0C\u6216\u5148\u521B\u5EFA\u8BE5\u76EE\u5F55\u540E\u518D\u91CD\u65B0\u8FD0\u884C\u547D\u4EE4\u3002",
1105
1162
  "cli.shared.template-not-found": "\u672A\u627E\u5230\u6A21\u677F\uFF1A{path}",
@@ -1131,6 +1188,9 @@ var zhCNMessages = {
1131
1188
  // 由 packages/cli/src/commands/config.ts(菜单循环 + 字段编辑)以及
1132
1189
  // getPanelFields() 的 label_i18n_key 引用消费。
1133
1190
  "cli.config.intro": "Fabric \u914D\u7F6E",
1191
+ // flat-design-system Wave5 (TASK-005): clack 编辑菜单前那块平铺键值面板的
1192
+ // B-横线标题。
1193
+ "cli.config.panel.title": "\u5F53\u524D\u914D\u7F6E",
1134
1194
  "cli.config.outro": "\u914D\u7F6E\u5DF2\u4FDD\u5B58\u3002",
1135
1195
  "cli.config.outro-no-changes": "\u672A\u505A\u4EFB\u4F55\u4FEE\u6539\u3002",
1136
1196
  "cli.config.cancel": "\u5DF2\u53D6\u6D88\u3002",
@@ -1173,12 +1233,18 @@ var zhCNMessages = {
1173
1233
  "cli.config.fields.nudge_mode.label": "\u63D0\u793A\u6863\u4F4D",
1174
1234
  "cli.config.fields.nudge_mode.description": "\u4EBA\u7C7B\u53EF\u89C1 nudge \u7684\u603B\u6863\u4F4D\uFF08silent \u9759\u9ED8 / minimal \u7CBE\u7B80 / normal \u6B63\u5E38 / verbose \u8BE6\u5C3D\uFF09\uFF1B\u4EC5\u63A7\u4EBA\u7C7B\u63D0\u793A\u901A\u9053\uFF0C\u4E0D\u5F71\u54CD\u6CE8\u5165\u7ED9 AI \u7684\u77E5\u8BC6\u3002",
1175
1235
  "cli.config.fields.embed_enabled.label": "\u5411\u91CF\u8BED\u4E49\u68C0\u7D22",
1176
- "cli.config.fields.embed_enabled.description": "\u662F\u5426\u542F\u7528\u5411\u91CF\u8BED\u4E49\u68C0\u7D22\uFF08true / false\uFF09\u3002\u6CE8\u610F\uFF1A\u5F00\u542F\u8FD8\u9700 `fabric install --enable-embed` \u5B8C\u6210\u4E3B\u673A\u4FA7\u5B89\u88C5\uFF08fastembed + \u6A21\u578B\u7F13\u5B58\uFF09\uFF0C\u4EC5\u5728\u6B64\u7F6E true \u4E0D\u4F1A\u81EA\u52A8\u751F\u6548\u3002",
1236
+ "cli.config.fields.embed_enabled.description": "\u662F\u5426\u542F\u7528\u5411\u91CF\u8BED\u4E49\u68C0\u7D22\uFF08true / false\uFF09\u3002\u6CE8\u610F\uFF1Atrue \u53EA\u662F\u610F\u56FE\u5F00\u5173\u2014\u2014\u771F\u6B63\u751F\u6548\u8FD8\u9700\u8FD0\u884C\u4E2D\u7684 server \u80FD\u89E3\u6790\u5230 fastembed \u5305\u3001\u4E14\u6A21\u578B\u5DF2\u4E0B\u8F7D\uFF08\u9996\u6B21\u53EC\u56DE\u65F6\u81EA\u52A8\u4E0B\u5230 ~/.fabric/cache/embed\uFF09\u3002\u7528 `fabric info recall` \u67E5\u5B9E\u9645\u72B6\u6001\u3002",
1237
+ "cli.config.fields.fusion.label": "\u53EC\u56DE\u878D\u5408\u7B56\u7565",
1238
+ "cli.config.fields.fusion.description": "\u591A\u4FE1\u53F7\u5408\u6210\u603B\u5206\u7684\u7B97\u6CD5\uFF1Aadditive \u52A0\u6743\u6C42\u548C\uFF08BM25 \u4E3B\u5BFC\uFF0C\u5411\u91CF\u6743\u91CD\u5C0F\uFF09/ rrf \u5012\u6570\u6392\u540D\u878D\u5408\uFF08BM25 \u4E0E\u5411\u91CF\u5E73\u8D77\u5E73\u5750\uFF0C\u8BED\u4E49\u624D\u771F\u6B63\u751F\u6548\uFF09/ auto \u81EA\u9002\u5E94\uFF08\u9ED8\u8BA4\uFF1A\u5411\u91CF\u5728\u51FA\u5206\u65F6\u7528 rrf\uFF0C\u5426\u5219\u56DE\u843D additive\u2014\u2014\u907F\u514D\u65E0\u5411\u91CF\u65F6 rrf \u9000\u5316\u53CD\u800C\u66F4\u5DEE\uFF09\u3002",
1177
1239
  "cli.doctor.description": "\u8FD0\u884C Fabric \u76EE\u6807\u6001\u8BCA\u65AD\uFF08meta \u540C\u6B65\u3001\u77E5\u8BC6\u7D22\u5F15\u3001bootstrap\u3001events ledger\u3001human-lock \u6F02\u79FB\uFF09\u3002\n\n\u793A\u4F8B\uFF1A\n fabric doctor \u53EA\u8BFB\u8BCA\u65AD\u62A5\u544A\n fabric doctor --fix \u4FEE\u590D\u6D3E\u751F\u72B6\u6001\uFF08meta + \u7D22\u5F15\uFF09\n fabric doctor --fix-knowledge \u5E94\u7528\u77E5\u8BC6\u5E93 lint \u53D8\u66F4\uFF08\u8BA1\u6570\u5668 / \u5F52\u6863 / \u7F13\u5B58\uFF09\n fabric doctor --json \u673A\u5668\u53EF\u8BFB\u8F93\u51FA",
1178
1240
  "doctor.section.fixable": "\u53EF\u4FEE\u590D\u9519\u8BEF\uFF1A",
1179
1241
  "doctor.section.manual": "\u9700\u624B\u52A8\u4FEE\u590D\uFF1A",
1180
1242
  "doctor.section.warnings": "\u8B66\u544A\uFF1A",
1181
1243
  "doctor.section.fix-knowledge-mutations": "Fix-knowledge \u53D8\u66F4\uFF1A",
1244
+ // flat-design-system Wave5 (TASK-005): 重排后的 doctor C-圆点分组标题
1245
+ // (`● 存储健康` / `● 检查项`),取代原硬编码 sectionBar 字面量。
1246
+ "doctor.group.store-health": "\u5B58\u50A8\u5065\u5EB7",
1247
+ "doctor.group.checks": "\u68C0\u67E5\u9879",
1182
1248
  // v2.0.0-rc.29 REVIEW (codex LOW-2): F2 的 payload 阈值之前只出现在 JSON envelope,
1183
1249
  // 人类输出看不到,导致改了 mcpPayloadLimits 之后没法用 `fabric doctor` 快速确认是否生效。
1184
1250
  "doctor.section.payload-limits": "MCP payload \u9608\u503C\uFF1A",
@@ -1684,12 +1750,27 @@ var zhCNMessages = {
1684
1750
  "cli.install.pipeline.title": "Fabric \u5B89\u88C5",
1685
1751
  "cli.install.pipeline.complete": "Fabric \u5B89\u88C5\u5B8C\u6210",
1686
1752
  "cli.install.pipeline.running": "\u5C06\u6309 {count} \u4E2A\u9636\u6BB5\u6267\u884C",
1753
+ // TASK-002 (G1):总结卡收尾 + 计数词。原先在 ConsoleOutputRenderer 中硬编码英文
1754
+ // (Done! / succeeded / skipped / failed / "All steps completed successfully"),
1755
+ // 全部收进 t() + 双语表,locale-parity.test.ts 守护 en + zh-CN 每个 key 齐备。
1756
+ "cli.summary.done": "\u5B8C\u6210!",
1757
+ "cli.summary.all-ok": "\u5168\u90E8\u6B65\u9AA4\u5DF2\u5B8C\u6210",
1758
+ "cli.summary.n-failed": "{count} \u4E2A\u6B65\u9AA4\u5931\u8D25",
1759
+ "cli.summary.n-of-total": "{done}/{total} \u6B65\u5DF2\u5B8C\u6210",
1760
+ "cli.summary.count.succeeded": "\u6210\u529F",
1761
+ "cli.summary.count.skipped": "\u8DF3\u8FC7",
1762
+ "cli.summary.count.failed": "\u5931\u8D25",
1687
1763
  // TASK-004: 首装走 onboarding 定调(欢迎语 + 一次性设置说明);重装保持简洁的
1688
1764
  // "将按 N 阶段执行"。{count} = 阶段总数。
1689
1765
  "cli.install.pipeline.intro.firstRun": "\u6B22\u8FCE\u4F7F\u7528 Fabric \u2014\u2014 \u8FD9\u662F\u9996\u6B21\u5B89\u88C5,\u6211\u4F1A\u5F15\u5BFC\u4F60\u5B8C\u6210\u4E00\u6B21\u6027\u8BBE\u7F6E(\u5171 {count} \u4E2A\u9636\u6BB5);\u4E4B\u540E\u518D\u8DD1\u4F1A\u81EA\u52A8\u8DF3\u8FC7\u5DF2\u5C31\u7EEA\u9879\u3002",
1690
1766
  // TASK-004: 重装且全程幂等(无任何 install)时折叠成的单张体检卡片标题。
1691
1767
  // {count} = 阶段总数。明细走 --verbose。
1692
1768
  "cli.install.healthcheck.title": "\u2713 Fabric \u5DF2\u662F\u6700\u65B0 \xB7 {count} \u9636\u6BB5\u5C31\u7EEA \xB7 \u65E0\u6539\u52A8",
1769
+ // TASK-003 (G2 root a):每阶段总结明细的状态词改按 r.changed 判定(不再用
1770
+ // installed.length)—— 无改动的重装走"已最新",不再误报"N 项已安装"。
1771
+ // installed-count 仅在该阶段确有改动时使用。
1772
+ "cli.install.stage.uptodate": "\u5DF2\u6700\u65B0",
1773
+ "cli.install.stage.installed-count": "{count} \u9879\u5DF2\u5B89\u88C5",
1693
1774
  "cli.install.pipeline.label.preflight": "\u5168\u5C40\u4E0E\u9879\u76EE\u9884\u68C0",
1694
1775
  "cli.install.pipeline.label.env": "\u9879\u76EE\u73AF\u5883\u521D\u59CB\u5316",
1695
1776
  "cli.install.pipeline.label.store": "\u77E5\u8BC6\u5E93\u62D3\u6251",
@@ -1699,6 +1780,9 @@ var zhCNMessages = {
1699
1780
  "cli.install.pipeline.label.guidance": "\u540E\u7EED\u6307\u5F15",
1700
1781
  "cli.install.pipeline.desc.store": "\u7ED1\u5B9A\u5F53\u524D\u9879\u76EE\u7684 read/write store\uFF0C\u5237\u65B0 resolved-bindings snapshot\u3002",
1701
1782
  "cli.install.next-step": "{label} {message}",
1783
+ // TASK-002 (G6): 收口总结卡的单一黄金动作锚点。能力明细表收进 --verbose,
1784
+ // 这一行才是诚实的「下一步做什么」。{action} = 具体下一条命令。
1785
+ "cli.install.next-step.anchor": "\u4E0B\u4E00\u6B65 \u2192 {action}",
1702
1786
  "cli.install.reason-message": "{label} {message}",
1703
1787
  "cli.install.language.prompt": "\u9009\u62E9 Fabric \u8BED\u8A00\uFF08\u754C\u9762\u4E0E\u77E5\u8BC6\u7EDF\u4E00\u4F7F\u7528\uFF0C\u4E4B\u540E\u53EF\u7528 fabric config \u4FEE\u6539\uFF09\uFF1A",
1704
1788
  "cli.install.language.option.zh-CN": "\u7B80\u4F53\u4E2D\u6587 (zh-CN)",
@@ -1726,6 +1810,10 @@ var zhCNMessages = {
1726
1810
  "cli.install.wizard.stage.bootstrap": "\u662F\u5426\u5B89\u88C5 bootstrap \u6A21\u677F\uFF1F[{defaultValue}]",
1727
1811
  "cli.install.wizard.stage.mcp": "\u662F\u5426\u914D\u7F6E MCP \u5BA2\u6237\u7AEF\uFF1F[{defaultValue}]",
1728
1812
  "cli.install.wizard.stage.hooks": "\u662F\u5426\u5B89\u88C5 git hooks\uFF1F[{defaultValue}]",
1813
+ // flat-design-system Wave4 (TASK-004): post-group ✓ 回执用的短阶段标签。
1814
+ "cli.install.wizard.stage.bootstrap.short": "bootstrap \u6A21\u677F",
1815
+ "cli.install.wizard.stage.mcp.short": "MCP \u5BA2\u6237\u7AEF",
1816
+ "cli.install.wizard.stage.hooks.short": "git hooks",
1729
1817
  "cli.install.wizard.mcp-install": "MCP \u670D\u52A1\u7AEF\u5B89\u88C5\u8303\u56F4\uFF08global/local\uFF09[{defaultValue}]",
1730
1818
  "cli.install.wizard.execute.confirm": "\u73B0\u5728\u6267\u884C\u8BE5\u5B89\u88C5\u8BA1\u5212\uFF1F[Y/n]",
1731
1819
  "cli.install.wizard.outro": "\u5B89\u88C5\u8BA1\u5212\u5DF2\u786E\u8BA4\uFF0C\u5F00\u59CB\u6267\u884C Fabric install...",
@@ -1858,7 +1946,14 @@ var zhCNMessages = {
1858
1946
  // C3: 镜像 install 的阶段提示 (install 用 "Fabric install 将按 N 个阶段执行")。
1859
1947
  "cli.uninstall.plan.phase-banner": "Fabric uninstall \u5C06\u6309 {total} \u4E2A\u9636\u6BB5\u6267\u884C",
1860
1948
  "cli.uninstall.plan.target": "\u76EE\u6807\uFF1A{target}",
1861
- "cli.uninstall.plan.actions": "\u8BA1\u5212\uFF1Abootstrap={bootstrap} mcp={mcp} scaffold={scaffold} unbind-store={store}",
1949
+ // flat-design-system Wave5 (TASK-004 G3): 计划预览用人话动作句,按启用的阶段逐条列,
1950
+ // 不再输出 `key=是/否` 黑话行。
1951
+ "cli.uninstall.plan.will-remove": "\u5C06\u79FB\u9664\uFF1A",
1952
+ "cli.uninstall.plan.will-keep": "\u5C06\u4FDD\u7559\uFF1A",
1953
+ "cli.uninstall.plan.action.bootstrap": "\u5BA2\u6237\u7AEF\u6280\u80FD\u4E0E hook \u811A\u672C",
1954
+ "cli.uninstall.plan.action.mcp": "MCP \u670D\u52A1\u6CE8\u518C",
1955
+ "cli.uninstall.plan.action.scaffold": "\u9879\u76EE\u811A\u624B\u67B6\u6587\u4EF6",
1956
+ "cli.uninstall.plan.action.store": "\u56E2\u961F store \u7ED1\u5B9A\uFF08\u672C\u9879\u76EE\uFF09",
1862
1957
  "cli.uninstall.plan.detected": "\u68C0\u6D4B\u5230\u7684\u5BA2\u6237\u7AEF\uFF1A{clients}",
1863
1958
  "cli.uninstall.plan.preserves": "\u4FDD\u7559\u9879\uFF1A",
1864
1959
  "cli.uninstall.plan.preserves.stores": "\u5168\u5C40\u77E5\u8BC6 stores\uFF0C\u9879\u76EE\u5378\u8F7D\u6C38\u4E0D\u5220\u9664",
@@ -1879,6 +1974,10 @@ var zhCNMessages = {
1879
1974
  "cli.uninstall.stages.uptodate": "\u65E0\u53EF\u79FB\u9664\uFF08{count} \u9879\u5DF2\u4E0D\u5B58\u5728\uFF09",
1880
1975
  "cli.uninstall.stages.summary": "removed={removed} skipped={skipped} errors={errors}",
1881
1976
  "cli.uninstall.stages.removed-count": "\u5DF2\u79FB\u9664 {count} \u9879",
1977
+ // flat-design-system Wave5 (TASK-006 G3): 总结卡明细行的人话结果词,与 install 的
1978
+ // `已安装 {count} 项` / `已最新` 对称。
1979
+ "cli.uninstall.stage.cleaned-count": "\u5DF2\u6E05\u7406 {count} \u9879",
1980
+ "cli.uninstall.stage.already-clean": "\u5DF2\u662F\u5E72\u51C0",
1882
1981
  "cli.uninstall.summary.title": "\u5378\u8F7D\u6458\u8981",
1883
1982
  "cli.uninstall.summary.body": "removed={removed} skipped={skipped} errors={errors}",
1884
1983
  "cli.uninstall.healthcheck.title": "\u2713 Fabric \u5DF2\u4E0D\u5B58\u5728 \xB7 \u65E0\u53EF\u79FB\u9664",
@@ -5,12 +5,12 @@ import {
5
5
  enMessages,
6
6
  resolveFabricLocale,
7
7
  zhCNMessages
8
- } from "../chunk-ZYBWITH7.js";
8
+ } from "../chunk-UPYKUYHN.js";
9
9
  import {
10
10
  detectNodeLocale,
11
11
  normalizeLocale,
12
12
  resolveGlobalLocale
13
- } from "../chunk-ANUDBQBK.js";
13
+ } from "../chunk-ASS2KBB7.js";
14
14
  export {
15
15
  PROTECTED_TOKENS,
16
16
  createTranslator,
@@ -496,7 +496,7 @@ declare const fabricConfigSchema: z.ZodObject<{
496
496
  embed_enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
497
497
  embed_weight: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
498
498
  embed_model: z.ZodDefault<z.ZodOptional<z.ZodEnum<["fast-bge-small-zh-v1.5", "fast-multilingual-e5-large", "fast-bge-small-en-v1.5", "fast-bge-small-en", "fast-bge-base-en-v1.5", "fast-bge-base-en", "fast-all-MiniLM-L6-v2"]>>>;
499
- fusion: z.ZodDefault<z.ZodOptional<z.ZodEnum<["additive", "rrf"]>>>;
499
+ fusion: z.ZodDefault<z.ZodOptional<z.ZodEnum<["additive", "rrf", "auto"]>>>;
500
500
  }, "strip", z.ZodTypeAny, {
501
501
  default_layer_filter: "personal" | "team" | "both";
502
502
  nudge_mode: "silent" | "minimal" | "normal" | "verbose";
@@ -525,7 +525,7 @@ declare const fabricConfigSchema: z.ZodObject<{
525
525
  embed_enabled: boolean;
526
526
  embed_weight: number;
527
527
  embed_model: "fast-bge-small-zh-v1.5" | "fast-multilingual-e5-large" | "fast-bge-small-en-v1.5" | "fast-bge-small-en" | "fast-bge-base-en-v1.5" | "fast-bge-base-en" | "fast-all-MiniLM-L6-v2";
528
- fusion: "additive" | "rrf";
528
+ fusion: "additive" | "rrf" | "auto";
529
529
  clientPaths?: {
530
530
  claudeCodeCLI?: string | undefined;
531
531
  claudeCodeDesktop?: string | undefined;
@@ -632,7 +632,7 @@ declare const fabricConfigSchema: z.ZodObject<{
632
632
  embed_enabled?: boolean | undefined;
633
633
  embed_weight?: number | undefined;
634
634
  embed_model?: "fast-bge-small-zh-v1.5" | "fast-multilingual-e5-large" | "fast-bge-small-en-v1.5" | "fast-bge-small-en" | "fast-bge-base-en-v1.5" | "fast-bge-base-en" | "fast-all-MiniLM-L6-v2" | undefined;
635
- fusion?: "additive" | "rrf" | undefined;
635
+ fusion?: "additive" | "rrf" | "auto" | undefined;
636
636
  }>;
637
637
  declare const fabricConfigLoadSchema: z.ZodObject<{
638
638
  clientPaths: z.ZodOptional<z.ZodObject<{
@@ -725,7 +725,7 @@ declare const fabricConfigLoadSchema: z.ZodObject<{
725
725
  embed_enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
726
726
  embed_weight: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
727
727
  embed_model: z.ZodDefault<z.ZodOptional<z.ZodEnum<["fast-bge-small-zh-v1.5", "fast-multilingual-e5-large", "fast-bge-small-en-v1.5", "fast-bge-small-en", "fast-bge-base-en-v1.5", "fast-bge-base-en", "fast-all-MiniLM-L6-v2"]>>>;
728
- fusion: z.ZodDefault<z.ZodOptional<z.ZodEnum<["additive", "rrf"]>>>;
728
+ fusion: z.ZodDefault<z.ZodOptional<z.ZodEnum<["additive", "rrf", "auto"]>>>;
729
729
  } & {
730
730
  required_stores: z.ZodOptional<z.ZodArray<z.ZodObject<{
731
731
  id: z.ZodString;
@@ -765,7 +765,7 @@ declare const fabricConfigLoadSchema: z.ZodObject<{
765
765
  embed_enabled: boolean;
766
766
  embed_weight: number;
767
767
  embed_model: "fast-bge-small-zh-v1.5" | "fast-multilingual-e5-large" | "fast-bge-small-en-v1.5" | "fast-bge-small-en" | "fast-bge-base-en-v1.5" | "fast-bge-base-en" | "fast-all-MiniLM-L6-v2";
768
- fusion: "additive" | "rrf";
768
+ fusion: "additive" | "rrf" | "auto";
769
769
  clientPaths?: {
770
770
  claudeCodeCLI?: string | undefined;
771
771
  claudeCodeDesktop?: string | undefined;
@@ -872,7 +872,7 @@ declare const fabricConfigLoadSchema: z.ZodObject<{
872
872
  embed_enabled?: boolean | undefined;
873
873
  embed_weight?: number | undefined;
874
874
  embed_model?: "fast-bge-small-zh-v1.5" | "fast-multilingual-e5-large" | "fast-bge-small-en-v1.5" | "fast-bge-small-en" | "fast-bge-base-en-v1.5" | "fast-bge-base-en" | "fast-all-MiniLM-L6-v2" | undefined;
875
- fusion?: "additive" | "rrf" | undefined;
875
+ fusion?: "additive" | "rrf" | "auto" | undefined;
876
876
  }>;
877
877
 
878
878
  interface ClientPaths {
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { A as AgentsMetaNode, a as AgentsIdentitySource, b as AgentsTopologyType, H as HumanLockEntry, f as fabricConfigSchema, S as StoreIdentity, c as StoreProject, G as GlobalConfig, F as FabricConfig, M as MountedStore, R as RequiredStoreEntry, d as AgentsMeta, L as LedgerEntry } from './index-BO7itJ8e.js';
2
- export { e as AgentsMetaCountersEnvelope, g as AgentsMetaKnowledgeTypeCounters, h as AiLedgerEntry, i as AuditMode, C as ClientPaths, D as DefaultLayerFilter, j as FabricLanguage, k as GLOBAL_BINDINGS_DIR, l as GLOBAL_STATE_DIR, m as HumanLedgerEntry, n as McpPayloadLimits, P as PERSONAL_STORE_SENTINEL, o as RecallScore, p as RecallScoreBreakdown, q as RuleDescription, r as RuleDescriptionIndexItem, s as STORES_ROOT_DIR, t as STORE_ALIAS_PATTERN, u as STORE_KNOWLEDGE_TYPE_DIRS, v as STORE_LAYOUT, w as STORE_MOUNT_GROUPS, x as STORE_MOUNT_NAME_PATTERN, y as STORE_PROJECT_ID_PATTERN, z as STORE_UUID_PATTERN, B as StoreLayout, E as StoreMountGroup, I as StoreProjectsFile, J as auditModeSchema, K as clientPathsSchema, N as defaultLayerFilterSchema, O as deriveMountLabel, Q as fabricConfigLoadSchema, T as fabricLanguageSchema, U as globalConfigSchema, V as isNonPersonalRequiredStore, W as mcpPayloadLimitsSchema, X as migrateRequiredStores, Y as mountedStoreSchema, Z as nudgeModeSchema, _ as observeConfigSchema, $ as planContextTopKSchema, a0 as requiredStoreEntrySchema, a1 as selectionTokenTtlMsSchema, a2 as storeAliasSchema, a3 as storeIdentitySchema, a4 as storeKnowledgeTypeDir, a5 as storeMountGroup, a6 as storeMountNameSchema, a7 as storeMountSubPath, a8 as storeProjectSchema, a9 as storeProjectsFileSchema, aa as storeRelativePath, ab as storeRelativePathForMount, ac as storeUuidSchema, ad as writeRouteSchema } from './index-BO7itJ8e.js';
1
+ import { A as AgentsMetaNode, a as AgentsIdentitySource, b as AgentsTopologyType, H as HumanLockEntry, f as fabricConfigSchema, S as StoreIdentity, c as StoreProject, G as GlobalConfig, F as FabricConfig, M as MountedStore, R as RequiredStoreEntry, d as AgentsMeta, L as LedgerEntry } from './index-C0cijMSw.js';
2
+ export { e as AgentsMetaCountersEnvelope, g as AgentsMetaKnowledgeTypeCounters, h as AiLedgerEntry, i as AuditMode, C as ClientPaths, D as DefaultLayerFilter, j as FabricLanguage, k as GLOBAL_BINDINGS_DIR, l as GLOBAL_STATE_DIR, m as HumanLedgerEntry, n as McpPayloadLimits, P as PERSONAL_STORE_SENTINEL, o as RecallScore, p as RecallScoreBreakdown, q as RuleDescription, r as RuleDescriptionIndexItem, s as STORES_ROOT_DIR, t as STORE_ALIAS_PATTERN, u as STORE_KNOWLEDGE_TYPE_DIRS, v as STORE_LAYOUT, w as STORE_MOUNT_GROUPS, x as STORE_MOUNT_NAME_PATTERN, y as STORE_PROJECT_ID_PATTERN, z as STORE_UUID_PATTERN, B as StoreLayout, E as StoreMountGroup, I as StoreProjectsFile, J as auditModeSchema, K as clientPathsSchema, N as defaultLayerFilterSchema, O as deriveMountLabel, Q as fabricConfigLoadSchema, T as fabricLanguageSchema, U as globalConfigSchema, V as isNonPersonalRequiredStore, W as mcpPayloadLimitsSchema, X as migrateRequiredStores, Y as mountedStoreSchema, Z as nudgeModeSchema, _ as observeConfigSchema, $ as planContextTopKSchema, a0 as requiredStoreEntrySchema, a1 as selectionTokenTtlMsSchema, a2 as storeAliasSchema, a3 as storeIdentitySchema, a4 as storeKnowledgeTypeDir, a5 as storeMountGroup, a6 as storeMountNameSchema, a7 as storeMountSubPath, a8 as storeProjectSchema, a9 as storeProjectsFileSchema, aa as storeRelativePath, ab as storeRelativePathForMount, ac as storeUuidSchema, ad as writeRouteSchema } from './index-C0cijMSw.js';
3
3
  import { T as Translator } from './types-qg4xXVuT.js';
4
4
  export { L as Locale, M as Messages, a as TranslationKey } from './types-qg4xXVuT.js';
5
5
  export { PROTECTED_TOKENS, ProtectedToken, createTranslator, defaultMessages, detectNodeLocale, enMessages, normalizeLocale, resolveFabricLocale, resolveGlobalLocale, zhCNMessages } from './i18n/index.js';
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  BOOTSTRAP_REGEX,
8
8
  matchBootstrapCanonicalLocale,
9
9
  resolveBootstrapCanonical
10
- } from "./chunk-OAYQHN6J.js";
10
+ } from "./chunk-KFFBQRL5.js";
11
11
  import "./chunk-LXNCAKJZ.js";
12
12
  import {
13
13
  PROTECTED_TOKENS,
@@ -16,7 +16,7 @@ import {
16
16
  enMessages,
17
17
  resolveFabricLocale,
18
18
  zhCNMessages
19
- } from "./chunk-ZYBWITH7.js";
19
+ } from "./chunk-UPYKUYHN.js";
20
20
  import {
21
21
  GLOBAL_BINDINGS_DIR,
22
22
  GLOBAL_STATE_DIR,
@@ -51,7 +51,7 @@ import {
51
51
  storeRelativePath,
52
52
  storeRelativePathForMount,
53
53
  storeUuidSchema
54
- } from "./chunk-ANUDBQBK.js";
54
+ } from "./chunk-ASS2KBB7.js";
55
55
  import {
56
56
  atomicWriteJson,
57
57
  withFileLock
@@ -766,15 +766,18 @@ var fabricConfigSchema = z5.object({
766
766
  "fast-bge-base-en",
767
767
  "fast-all-MiniLM-L6-v2"
768
768
  ]).optional().default("fast-bge-small-zh-v1.5"),
769
- // P1 recall-engine-refactor (TASK-003): content-channel fusion strategy.
770
- // 'additive' (DEFAULT) = the historical weighted-sum path (BM25_WEIGHT·bm25 +
771
- // vectorWeight·vector + structural). 'rrf' = Reciprocal Rank Fusion over the
772
- // two CONTENT channels (bm25_rank, vector_rank) plus the unchanged structural
773
- // boost. RRF is gated behind this flag and ships OFF — flipping the default to
774
- // 'rrf' is a separate human decision gated on a one-off shadow run against the
775
- // developer's real bound team store. no-query ranking is byte-identical under
776
- // both values (the content channels contribute nothing without query terms).
777
- fusion: z5.enum(["additive", "rrf"]).optional().default("additive")
769
+ // P1 recall-engine-refactor (TASK-003 + follow-up): content-channel fusion
770
+ // strategy. 'additive' = the weighted-sum path (BM25_WEIGHT·bm25 + vectorWeight·
771
+ // vector + structural); the vector term is structurally minor (cosine·30 vs an
772
+ // unbounded BM25), so additive is effectively BM25-led. 'rrf' = Reciprocal Rank
773
+ // Fusion over the two CONTENT channels (bm25_rank, vector_rank, equal footing)
774
+ // + a re-scaled structural tiebreaker lets semantic recall actually matter.
775
+ // 'auto' (DEFAULT) = adaptive: use 'rrf' WHEN the vector channel is actually
776
+ // producing scores (embeddings installed + model warm), else fall back to
777
+ // 'additive'. This is the safe default — real-store shadow showed single-channel
778
+ // rrf (no vectors) is strictly worse than additive, so auto never lets that
779
+ // happen. no-query ranking is byte-identical under every value.
780
+ fusion: z5.enum(["additive", "rrf", "auto"]).optional().default("auto")
778
781
  });
779
782
  var fabricConfigLoadSchema = fabricConfigSchema.merge(
780
783
  z5.object({
@@ -949,7 +952,11 @@ var PANEL_FIELDS = [
949
952
  // when absent) — this introspection default mirrors the runtime read in
950
953
  // config-loader.ts so the panel never shows a default that contradicts behavior.
951
954
  makeEnumField("nudge_mode", "D_behavior", nudgeModeSchema.options, "normal"),
952
- makeBooleanField("embed_enabled", true)
955
+ makeBooleanField("embed_enabled", true),
956
+ // P1 recall-engine-refactor (follow-up): the content-channel fusion strategy,
957
+ // panel-editable so it sits next to embed_enabled (the two go together — rrf
958
+ // only pays off when embeddings are on). 'auto' is the safe adaptive default.
959
+ makeEnumField("fusion", "D_behavior", ["additive", "rrf", "auto"], "auto")
953
960
  ];
954
961
 
955
962
  // src/schemas/store-stable-id.ts
@@ -7,8 +7,8 @@ import {
7
7
  BOOTSTRAP_REGEX,
8
8
  matchBootstrapCanonicalLocale,
9
9
  resolveBootstrapCanonical
10
- } from "../chunk-OAYQHN6J.js";
11
- import "../chunk-ANUDBQBK.js";
10
+ } from "../chunk-KFFBQRL5.js";
11
+ import "../chunk-ASS2KBB7.js";
12
12
  export {
13
13
  BOOTSTRAP_CANONICAL_BY_LOCALE,
14
14
  BOOTSTRAP_CANONICAL_EN,
package/dist/theme.d.ts CHANGED
@@ -23,6 +23,7 @@ declare const SYMBOL_ASCII: {
23
23
  };
24
24
  declare function symbol(kind: keyof typeof SYMBOL_ASCII, colorOn?: boolean): string;
25
25
  declare function sectionBar(title: string, colorOn?: boolean): string;
26
+ declare function headerRule(title: string, colorOn?: boolean): string;
26
27
  declare const SCOPE_BADGE_TOKEN: {
27
28
  readonly team: "drift";
28
29
  readonly project: "ai";
@@ -30,4 +31,4 @@ declare const SCOPE_BADGE_TOKEN: {
30
31
  };
31
32
  declare function scopeBadge(scope: keyof typeof SCOPE_BADGE_TOKEN, colorOn?: boolean): string;
32
33
 
33
- export { ANSI, PALETTE, SYMBOL_ASCII, type ThemeToken, isColorEnabled, paint, scopeBadge, sectionBar, symbol };
34
+ export { ANSI, PALETTE, SYMBOL_ASCII, type ThemeToken, headerRule, isColorEnabled, paint, scopeBadge, sectionBar, symbol };
package/dist/theme.js CHANGED
@@ -40,6 +40,12 @@ function symbol(kind, colorOn = isColorEnabled()) {
40
40
  function sectionBar(title, colorOn = isColorEnabled()) {
41
41
  return colorOn ? `${ANSI.bold}${PALETTE.accent}\u258C ${title}${ANSI.reset}` : `# ${title}`;
42
42
  }
43
+ function headerRule(title, colorOn = isColorEnabled()) {
44
+ const head = colorOn ? `${ANSI.bold}${PALETTE.accent}${title}${ANSI.reset}` : title;
45
+ const rule = paint("muted", (colorOn ? "\u2500" : "-").repeat(40), colorOn);
46
+ return `${head}
47
+ ${rule}`;
48
+ }
43
49
  var SCOPE_BADGE_TOKEN = { team: "drift", project: "ai", personal: "human" };
44
50
  function scopeBadge(scope, colorOn = isColorEnabled()) {
45
51
  const text = `[${scope}]`;
@@ -49,6 +55,7 @@ export {
49
55
  ANSI,
50
56
  PALETTE,
51
57
  SYMBOL_ASCII,
58
+ headerRule,
52
59
  isColorEnabled,
53
60
  paint,
54
61
  scopeBadge,
@@ -1,2 +1,2 @@
1
- export { a as AgentsIdentitySource, d as AgentsMeta, e as AgentsMetaCountersEnvelope, g as AgentsMetaKnowledgeTypeCounters, A as AgentsMetaNode, b as AgentsTopologyType, h as AiLedgerEntry, i as AuditMode, C as ClientPaths, D as DefaultLayerFilter, F as FabricConfig, j as FabricLanguage, m as HumanLedgerEntry, H as HumanLockEntry, L as LedgerEntry, n as McpPayloadLimits, o as RecallScore, p as RecallScoreBreakdown, q as RuleDescription, r as RuleDescriptionIndexItem } from '../index-BO7itJ8e.js';
1
+ export { a as AgentsIdentitySource, d as AgentsMeta, e as AgentsMetaCountersEnvelope, g as AgentsMetaKnowledgeTypeCounters, A as AgentsMetaNode, b as AgentsTopologyType, h as AiLedgerEntry, i as AuditMode, C as ClientPaths, D as DefaultLayerFilter, F as FabricConfig, j as FabricLanguage, m as HumanLedgerEntry, H as HumanLockEntry, L as LedgerEntry, n as McpPayloadLimits, o as RecallScore, p as RecallScoreBreakdown, q as RuleDescription, r as RuleDescriptionIndexItem } from '../index-C0cijMSw.js';
2
2
  import 'zod';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fenglimg/fabric-shared",
3
- "version": "2.3.0-rc.2",
3
+ "version": "2.3.0-rc.3",
4
4
  "description": "Fabric shared types — Zod schemas, i18n, atomic-write helpers, MCP payload guard, error classes. Consumed by @fenglimg/fabric-server + @fenglimg/fabric-cli.",
5
5
  "license": "MIT",
6
6
  "author": "wangzhichao <fenglimg90@gmail.com>",