@fenglimg/fabric-shared 2.0.0-rc.36 → 2.0.0-rc.38

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.
@@ -37,42 +37,22 @@ var _ruleDescriptionSchema = z2.object({
37
37
  maturity: _maturityEnum.optional(),
38
38
  knowledge_layer: _layerEnum.optional(),
39
39
  layer_reason: z2.string().optional(),
40
- created_at: z2.string().optional()
41
- });
42
- var _descriptionIndexItemSchema = z2.object({
43
- stable_id: z2.string(),
44
- level: z2.enum(["L0", "L1", "L2"]),
45
- required: z2.boolean(),
46
- selectable: z2.boolean(),
47
- description: _ruleDescriptionSchema,
48
- // v2.0: top-level knowledge surface for client-side filtering. Mirrors
49
- // description.* — exposed here so MCP clients can filter without reaching
50
- // into the nested payload.
51
- type: _knowledgeTypeEnum.optional(),
52
- maturity: _maturityEnum.optional(),
53
- layer: _layerEnum.optional(),
54
- layer_reason: z2.string().optional(),
55
- // v2/rc.2: tag list shipped via frontmatter (commit a85121a). Exposed at
56
- // the API surface so MCP clients can filter without re-parsing the
57
- // description payload. Absent on legacy entries; consumers should treat
58
- // missing as [].
40
+ created_at: z2.string().optional(),
41
+ // v2.0.0-rc.38 UX-3 (D-MCP fold ③): these three were previously carried ONLY
42
+ // as top-level mirrors on the index item. With the mirrors removed,
43
+ // `description` becomes their canonical (and only) home, so the schema must
44
+ // validate them here. Optional + default-safe (tags/[]/broad) so legacy
45
+ // entries without frontmatter still parse.
59
46
  tags: z2.array(z2.string()).optional(),
60
- // v2.0-rc.5 (C1): relevance scope/paths drive plan-context-hint narrowing.
61
- // Exposed at the API surface so MCP clients (and the `fabric
62
- // plan-context-hint` CLI from D1) can filter without re-parsing the
63
- // description payload. Defaults applied at the parse layer
64
- // (knowledge-meta-builder + agentsMetaNodeBaseSchema):
65
- // relevance_scope → 'broad' (always-surface, safe default)
66
- // relevance_paths → [] (no path anchors)
67
- // Consumers should treat missing fields as broad/[]. Optional on the wire
68
- // so older servers without rc.5 schemas remain wire-compatible.
69
47
  relevance_scope: z2.enum(["narrow", "broad"]).optional(),
70
48
  relevance_paths: z2.array(z2.string()).optional()
71
49
  });
50
+ var _descriptionIndexItemSchema = z2.object({
51
+ stable_id: z2.string(),
52
+ description: _ruleDescriptionSchema
53
+ });
72
54
  var _requirementProfileSchema = z2.object({
73
55
  target_path: z2.string(),
74
- path_segments: z2.array(z2.string()),
75
- extension: z2.string(),
76
56
  known_tech: z2.array(z2.string()),
77
57
  user_intent: z2.string(),
78
58
  detected_entities: z2.array(z2.string())
@@ -104,6 +84,18 @@ var planContextInputSchema = z2.object({
104
84
  "Path context for narrow-scope relevance filtering. Defaults to `paths`; empty = no filter."
105
85
  )
106
86
  });
87
+ var _preflightDiagnosticSchema = z2.object({
88
+ // v2.0.0-rc.38 UX-2: `empty_shell_suppressed` surfaces draft entries whose
89
+ // description carries no selection signal (summary === stable_id + empty
90
+ // intent_clues/tech_stack/impact). They are filtered out of `candidates` to
91
+ // cut noise; this diagnostic names them so `fabric doctor` /
92
+ // --enrich-descriptions can prompt enrichment.
93
+ code: z2.enum(["missing_description", "empty_shell_suppressed"]),
94
+ severity: z2.literal("warn"),
95
+ message: z2.string(),
96
+ stable_ids: z2.array(z2.string()).optional(),
97
+ path: z2.string().optional()
98
+ });
107
99
  var planContextOutputSchema = z2.object({
108
100
  revision_hash: z2.string(),
109
101
  stale: z2.boolean(),
@@ -111,22 +103,11 @@ var planContextOutputSchema = z2.object({
111
103
  entries: z2.array(
112
104
  z2.object({
113
105
  path: z2.string(),
114
- requirement_profile: _requirementProfileSchema,
115
- description_index: z2.array(_descriptionIndexItemSchema)
106
+ requirement_profile: _requirementProfileSchema
116
107
  })
117
108
  ),
118
- shared: z2.object({
119
- description_index: z2.array(_descriptionIndexItemSchema),
120
- preflight_diagnostics: z2.array(
121
- z2.object({
122
- code: z2.literal("missing_description"),
123
- severity: z2.literal("warn"),
124
- message: z2.string(),
125
- stable_ids: z2.array(z2.string()).optional(),
126
- path: z2.string().optional()
127
- })
128
- )
129
- }),
109
+ candidates: z2.array(_descriptionIndexItemSchema),
110
+ preflight_diagnostics: z2.array(_preflightDiagnosticSchema),
130
111
  warnings: z2.array(structuredWarningSchema).optional(),
131
112
  // v2.0.0-rc.22 Scope D T-D2: optional auto-heal banner fields. Surfaced
132
113
  // ONLY when the loadActiveMetaOrStale call detected drift and rebuilt the
@@ -134,7 +115,15 @@ var planContextOutputSchema = z2.object({
134
115
  // "knowledge meta auto-healed (was <prev>, now <curr>)" notice without
135
116
  // having to query the event ledger.
136
117
  auto_healed: z2.boolean().optional(),
137
- previous_revision_hash: z2.string().optional()
118
+ previous_revision_hash: z2.string().optional(),
119
+ // v2.0.0-rc.37 NEW-24: stale-id redirect map. Populated when one or more
120
+ // recent fab_review modify-layer flips reassigned a canonical stable_id
121
+ // and the NEW id is in this response's description_index. Callers that
122
+ // cached the OLD id from a prior session look it up here and substitute
123
+ // the new id before issuing fab_get_knowledge_sections / fab_recall. Empty
124
+ // (field omitted) when no actionable redirects exist for the surfaced
125
+ // candidate set. See packages/server/src/services/id-redirect.ts.
126
+ redirects: z2.record(z2.string()).optional()
138
127
  });
139
128
  var planContextAnnotations = {
140
129
  readOnlyHint: true,
@@ -159,7 +148,7 @@ var planContextHintOutputSchema = z2.object({
159
148
  var knowledgeSectionsInputSchema = z2.object({
160
149
  selection_token: z2.string().min(1).describe("Selection token returned by fab_plan_context"),
161
150
  ai_selected_stable_ids: z2.array(z2.string()).describe(
162
- "Stable ids picked from fab_plan_context entries[].description_index[].stable_id where selectable=true; choose 1..N to fetch bodies for"
151
+ "Stable ids picked from fab_plan_context candidates[].stable_id; choose 1..N to fetch bodies for"
163
152
  ),
164
153
  ai_selection_reasons: z2.record(z2.string().min(1)).describe("Reason for each AI-selected L1 stable_id"),
165
154
  correlation_id: z2.string().optional().describe("Optional caller-provided correlation id for Event Ledger records"),
@@ -171,16 +160,10 @@ var knowledgeSectionsInputSchema = z2.object({
171
160
  });
172
161
  var knowledgeSectionsOutputSchema = z2.object({
173
162
  revision_hash: z2.string(),
174
- /**
175
- * @deprecated rc.23 TASK-002 F3 — removed in rc.24. The L0/L1/L2 selection
176
- * ceremony was fully retired in rc.5 A3 (see comment above
177
- * `planContextOutputSchema`); downstream consumers should use
178
- * `rules[].level` directly. Kept as optional for one rc to avoid breaking
179
- * pre-rc.23 clients that destructure this field.
180
- */
181
- precedence: z2.tuple([z2.literal("L2"), z2.literal("L1"), z2.literal("L0")]).optional().describe(
182
- "DEPRECATED (removed in rc.24): hardcoded L2/L1/L0 precedence tuple from the retired rc.5 selection ceremony. Use rules[].level instead."
183
- ),
163
+ // v2.0.0-rc.38 UX-13 (D-MCP step-2 audit): the deprecated `precedence`
164
+ // L2/L1/L0 tuple (flagged "removed in rc.24" but still emitted) is gone — it
165
+ // was a constant 3-string field on every response read by no production
166
+ // consumer. Use rules[].level for ordering.
184
167
  selected_stable_ids: z2.array(z2.string()),
185
168
  rules: z2.array(
186
169
  z2.object({
@@ -208,11 +191,18 @@ var knowledgeSectionsOutputSchema = z2.object({
208
191
  message: z2.string()
209
192
  })
210
193
  ),
211
- // v2/rc.3 (Q6): present iff a layer-flip in fab_review/modify changed the
212
- // canonical stable_id since the caller's selection_token was minted.
213
- // Clients should retry against `redirect_to.stable_id`.
214
- redirect_to: z2.object({ stable_id: z2.string() }).optional().describe(
215
- "Post-layer-flip redirect. Populated when stable_id changed after token mint (rc.3 fab_review/modify)."
194
+ // v2/rc.3 (Q6) + v2.0.0-rc.37 NEW-24: present iff at least one stable_id in
195
+ // the caller-supplied ai_selected_stable_ids was rewritten by the layer-flip
196
+ // redirect resolver. Pre-rc.37: this was a single { stable_id } object set
197
+ // only on the rare token-mint-vs-flip race. rc.37+: also accepts a map of
198
+ // (old_id new_id) when multiple rewrites fire in one fetch. Both shapes
199
+ // are accepted for forward-compat; readers should branch on shape and
200
+ // refresh their cached ids accordingly.
201
+ redirect_to: z2.union([
202
+ z2.object({ stable_id: z2.string() }),
203
+ z2.record(z2.string())
204
+ ]).optional().describe(
205
+ "Post-layer-flip redirect. Pre-rc.37: { stable_id } shape from rc.3 fab_review/modify. rc.37+: also accepts a (old_id \u2192 new_id) map for fab_get_knowledge_sections / fab_recall transparent rewrite."
216
206
  ),
217
207
  warnings: z2.array(structuredWarningSchema).optional()
218
208
  });
@@ -223,6 +213,116 @@ var knowledgeSectionsAnnotations = {
223
213
  openWorldHint: false,
224
214
  title: "Filter rule sections"
225
215
  };
216
+ var recallInputSchema = z2.object({
217
+ paths: z2.array(z2.string()).min(1).describe(
218
+ "Candidate file paths to recall Fabric rules for. Same semantics as fab_plan_context.paths."
219
+ ),
220
+ intent: z2.string().optional().describe("User-stated requirement or implementation intent; used to build a neutral requirement profile."),
221
+ known_tech: z2.array(z2.string()).optional().describe("Known technologies involved."),
222
+ detected_entities: z2.record(z2.array(z2.string())).optional().describe("Optional path-keyed detected entities."),
223
+ client_hash: z2.string().optional().describe("Revision hash from a prior call; enables stale detection."),
224
+ correlation_id: z2.string().optional().describe("Optional caller-provided correlation id for Event Ledger records."),
225
+ session_id: z2.string().optional().describe(
226
+ "Current client session id (Claude Code: $session_id; Codex: corresponding identifier). Enables cross-session debt tracking. Falls back gracefully if omitted."
227
+ ),
228
+ layer_filter: z2.enum(["team", "personal", "both"]).optional().describe(
229
+ "Restrict recall to the named layer. Default: fabric-config.default_layer_filter."
230
+ ),
231
+ target_paths: z2.array(z2.string()).optional().describe(
232
+ "Path context for narrow-scope relevance filtering. Defaults to `paths`; empty = no filter."
233
+ ),
234
+ ids: z2.array(z2.string()).optional().describe(
235
+ "Optional explicit stable_ids to fetch. When omitted, fab_recall returns ALL entries plan-context surfaces (the common case after rc.37 selectable-filter removal). When provided, filters fetched bodies to this set."
236
+ )
237
+ });
238
+ var recallOutputSchema = z2.object({
239
+ revision_hash: z2.string(),
240
+ stale: z2.boolean(),
241
+ // Selection token surfaced for callers who want to continue the conversation
242
+ // with fab_get_knowledge_sections (e.g. fetch additional ids later) — every
243
+ // recall response is still token-backed internally.
244
+ selection_token: z2.string(),
245
+ // v2.0.0-rc.38 UX-1/UX-4: mirrors planContextOutputSchema fold ① — per-path
246
+ // description_index collapsed into a single top-level `candidates`, and
247
+ // `preflight_diagnostics` lifted out of the removed `shared` wrapper.
248
+ entries: z2.array(
249
+ z2.object({
250
+ path: z2.string(),
251
+ requirement_profile: _requirementProfileSchema
252
+ })
253
+ ),
254
+ candidates: z2.array(_descriptionIndexItemSchema),
255
+ preflight_diagnostics: z2.array(_preflightDiagnosticSchema),
256
+ // Same shape as knowledgeSectionsOutputSchema.rules — full body keyed by stable_id.
257
+ rules: z2.array(
258
+ z2.object({
259
+ stable_id: z2.string(),
260
+ level: z2.enum(["L0", "L1", "L2"]),
261
+ path: z2.string(),
262
+ body: z2.string()
263
+ })
264
+ ),
265
+ selected_stable_ids: z2.array(z2.string()),
266
+ diagnostics: z2.array(
267
+ z2.object({
268
+ code: z2.literal("missing_knowledge_metadata"),
269
+ severity: z2.literal("warn"),
270
+ stable_id: z2.string(),
271
+ message: z2.string()
272
+ })
273
+ ),
274
+ warnings: z2.array(structuredWarningSchema).optional(),
275
+ auto_healed: z2.boolean().optional(),
276
+ previous_revision_hash: z2.string().optional(),
277
+ // v2.0.0-rc.37 NEW-24: parallel to planContextOutputSchema.redirects — see
278
+ // that field for semantics. fab_recall transparently rewrites any old ids
279
+ // passed via `ids` before fetching bodies; the surfaced map still exposes
280
+ // the substitution to callers that want to refresh their cached state.
281
+ redirects: z2.record(z2.string()).optional()
282
+ });
283
+ var recallAnnotations = {
284
+ readOnlyHint: true,
285
+ idempotentHint: true,
286
+ destructiveHint: false,
287
+ openWorldHint: false,
288
+ title: "Recall Fabric knowledge (one-call)"
289
+ };
290
+ var archiveScanInputSchema = z2.object({
291
+ range: z2.union([z2.array(z2.string()).min(1), z2.literal("all")]).optional().describe(
292
+ "Phase 0 scope: explicit session_id[] to constrain the scan, or the 'all' sentinel. Omitted = scan everything since the last knowledge_proposed anchor."
293
+ ),
294
+ now_ms: z2.number().int().nonnegative().optional().describe("Override for the anti-loop cooldown clock (testing). Defaults to Date.now()."),
295
+ correlation_id: z2.string().optional().describe("Optional caller-provided correlation id for Event Ledger records."),
296
+ session_id: z2.string().optional().describe("Current client session id; recorded for cross-session debt tracking.")
297
+ });
298
+ var archiveScanOutputSchema = z2.object({
299
+ // ts of the most recent knowledge_proposed event (the lower bound), or null
300
+ // when the workspace has never archived (scan everything).
301
+ anchor_ts: z2.number().nullable(),
302
+ // Distinct session_ids since the anchor that survived the outcome filter,
303
+ // in first-seen order — ready for the Skill to load digests + stitch.
304
+ session_ids: z2.array(z2.string()),
305
+ // Sessions dropped by the filter, with the rule that fired (audit/debug).
306
+ dropped: z2.array(
307
+ z2.object({
308
+ session_id: z2.string(),
309
+ reason: z2.enum(["user_dismissed", "cooldown", "no_new_signal"])
310
+ })
311
+ ),
312
+ // max ts examined across the scan — becomes the next covered_through_ts.
313
+ covered_through_ts: z2.number().nullable(),
314
+ // Idempotency keys already proposed by prior archive runs but not yet
315
+ // reviewed (Phase 4.5 cross-session pending dedupe). Drop matching candidates.
316
+ already_proposed_keys: z2.array(z2.string()),
317
+ warnings: z2.array(structuredWarningSchema).optional()
318
+ });
319
+ var archiveScanAnnotations = {
320
+ readOnlyHint: true,
321
+ idempotentHint: true,
322
+ destructiveHint: false,
323
+ openWorldHint: false,
324
+ title: "Scan event ledger for archive candidates (deterministic)"
325
+ };
226
326
  var ProposedReasonSchema = z2.enum([
227
327
  "explicit-user-mark",
228
328
  "diagnostic-then-fix",
@@ -311,6 +411,17 @@ var _FabExtractKnowledgeInputBaseSchema = z2.object({
311
411
  must_read_if: z2.string().optional().describe(
312
412
  "One-line strong trigger; when this condition holds the entry is considered required reading. Single line \u2264160 chars (e.g. 'touching anything under packages/cli/src/commands/hooks.ts'). Optional \u2014 omit when no single strong trigger fits."
313
413
  ),
414
+ // v2.0.0-rc.37 NEW-37 (werewolf dogfood remediation): optional tags array.
415
+ // Werewolf实测发现 100% canonical entries 的 `tags: []` 为空,主题聚类与
416
+ // 跨条目检索退化。Skills (fabric-archive / fabric-import) 应每个 entry 产
417
+ // 2-4 个 kebab-case 主题词。Server 写入时直接落 frontmatter `tags: [...]`;
418
+ // empty array 仍然合法(skill 无法 confident 推断时显式空)。
419
+ // IDEMPOTENCY: tags MUST NOT 参与 idempotency_key hash(同 relevance_*
420
+ // / intent_clues 等可变字段一致),re-extract 时 tags 调整不应产生重复
421
+ // pending file。
422
+ tags: z2.array(z2.string()).optional().describe(
423
+ "Optional topic tags (2-4 kebab-case strings recommended). Drives cross-entry retrieval + topic clustering. Skill-inferred from session content; omit when not confidently inferable. Empty array allowed but discouraged (degrades narrow hint topic signal)."
424
+ ),
314
425
  // v2.0.0-rc.23 TASK-014 (F8c): optional onboard-slot tag. The S5 slot
315
426
  // mechanism reintroduces a Skill-orchestrated "project tone" capture
316
427
  // surface after F8a deleted the auto-`fabric scan` baseline pipeline.
@@ -331,6 +442,20 @@ var _FabExtractKnowledgeInputBaseSchema = z2.object({
331
442
  // duplicate entries.
332
443
  onboard_slot: onboardSlotSchema.optional().describe(
333
444
  "Optional slot tag from the S5 onboarding set (tech-stack-decision / architecture-pattern / code-style-tone / build-system-idiom / domain-vocabulary); lets fabric-archive's first-run phase claim a project-tone slot. Skill propose-time only; never required."
445
+ ),
446
+ // v2.0.0-rc.37 NEW-7: read-only evidence paths lifted from the legacy
447
+ // body `## Evidence` markdown block into structured frontmatter. These are
448
+ // paths the agent CONSULTED while building this knowledge but never
449
+ // modified — they document context without participating in the
450
+ // activation gate (relevance_paths does that). Splitting evidence into a
451
+ // first-class frontmatter array lets future plan-context retrieval read
452
+ // it as data (intersect with current paths to surface high-recall hits)
453
+ // instead of re-parsing markdown. Optional; omit when no read-only
454
+ // signal was captured. Like relevance_paths it MUST NOT participate in
455
+ // the idempotency_key hash (an idempotent re-extract may surface a
456
+ // slightly different read set without spawning a duplicate pending).
457
+ evidence_paths: z2.array(z2.string()).optional().describe(
458
+ "Workspace-relative paths the agent CONSULTED (read but never modified) while building this knowledge. Documents context without affecting activation. Lifted from the legacy body ## Evidence markdown block into structured frontmatter so plan-context retrieval can read it as data."
334
459
  )
335
460
  });
336
461
  var FabExtractKnowledgeInputSchema = _FabExtractKnowledgeInputBaseSchema.superRefine(
@@ -421,6 +546,24 @@ var FabReviewInputSchema = z2.discriminatedUnion("action", [
421
546
  pending_path: z2.string().min(1),
422
547
  changes: _fabReviewModifyChangesSchema
423
548
  }),
549
+ // v2.0.0-rc.37 NEW-12: explicit modify split. `modify-content` edits scalar
550
+ // frontmatter/body fields (title/summary/maturity/tags/relevance_*) and MUST
551
+ // NOT carry a layer change. `modify-layer` is the dedicated layer-flip path
552
+ // (changes.layer REQUIRED) which may reallocate the stable_id + emit an
553
+ // id-redirect (rc.37 NEW-24). Legacy `modify` stays for back-compat and
554
+ // routes by whether changes.layer is present.
555
+ z2.object({
556
+ action: z2.literal("modify-content"),
557
+ pending_path: z2.string().min(1),
558
+ changes: _fabReviewModifyChangesSchema
559
+ }),
560
+ z2.object({
561
+ action: z2.literal("modify-layer"),
562
+ pending_path: z2.string().min(1),
563
+ changes: _fabReviewModifyChangesSchema.extend({
564
+ layer: z2.enum(["team", "personal"])
565
+ })
566
+ }),
424
567
  z2.object({
425
568
  action: z2.literal("search"),
426
569
  query: z2.string().min(1),
@@ -434,8 +577,8 @@ var FabReviewInputSchema = z2.discriminatedUnion("action", [
434
577
  })
435
578
  ]);
436
579
  var FabReviewInputShape = {
437
- action: z2.enum(["list", "approve", "reject", "modify", "search", "defer"]).describe(
438
- "Action selector. Discriminates the per-action fields below; required."
580
+ action: z2.enum(["list", "approve", "reject", "modify", "modify-content", "modify-layer", "search", "defer"]).describe(
581
+ "Action selector. Discriminates the per-action fields below; required. modify-content edits scalars (no layer); modify-layer is the layer-flip path (changes.layer required); modify is the legacy combined alias."
439
582
  ),
440
583
  filters: _fabReviewFiltersSchema.describe(
441
584
  "Optional filters (type/layer/maturity/tags/created_after). Used by action=list and action=search."
@@ -616,7 +759,23 @@ var citeCoverageReportSchema = z2.object({
616
759
  qualifying_cites: z2.number().int().nonnegative(),
617
760
  recalled_unverified: z2.number().int().nonnegative(),
618
761
  expected_but_missed: z2.number().int().nonnegative(),
619
- total_turns: z2.number().int().nonnegative()
762
+ total_turns: z2.number().int().nonnegative(),
763
+ // v2.0.0-rc.38 UX-8 (C, user-authorized): cite-policy COMPLIANCE rate —
764
+ // the corrected G-CITE semantic. The legacy qualifying_cites/edits ratio
765
+ // measured "how often an applicable KB id existed" (a function of corpus
766
+ // density / soak), NOT "did the AI follow the cite policy". Compliance
767
+ // credits every valid cite line — `KB: <id> [applied|dismissed]` AND
768
+ // `KB: none [reason]` (the policy explicitly allows the none sentinel) —
769
+ // over the turns where a cite was expected. null when no cite-expected
770
+ // turns observed (avoids a misleading 0/0 → 0). Range [0,1].
771
+ cite_compliance_rate: z2.number().min(0).max(1).nullable().optional(),
772
+ compliant_cites: z2.number().int().nonnegative().optional(),
773
+ noncompliant_cites: z2.number().int().nonnegative().optional(),
774
+ // Edit signals lacking session_id → uncorrelatable, silently excluded from
775
+ // expected_but_missed. >0 typically means a stale pre-session_id hook is
776
+ // installed (run `fabric install`). Surfaced so the denominator gap is
777
+ // visible rather than a silent 100% confound.
778
+ uncorrelatable_edits: z2.number().int().nonnegative().optional()
620
779
  }),
621
780
  per_client: z2.record(
622
781
  z2.string(),
@@ -756,6 +915,12 @@ export {
756
915
  knowledgeSectionsInputSchema,
757
916
  knowledgeSectionsOutputSchema,
758
917
  knowledgeSectionsAnnotations,
918
+ recallInputSchema,
919
+ recallOutputSchema,
920
+ recallAnnotations,
921
+ archiveScanInputSchema,
922
+ archiveScanOutputSchema,
923
+ archiveScanAnnotations,
759
924
  ProposedReasonSchema,
760
925
  PROPOSED_REASON_DESCRIPTIONS,
761
926
  FabExtractKnowledgeInputSchema,
@@ -7,7 +7,7 @@ import {
7
7
  normalizeLocale,
8
8
  resolveFabricLocale,
9
9
  zhCNMessages
10
- } from "../chunk-P4RNLXTM.js";
10
+ } from "../chunk-7CX32MYL.js";
11
11
  export {
12
12
  PROTECTED_TOKENS,
13
13
  createTranslator,
@@ -23,16 +23,7 @@ interface RuleDescription {
23
23
  }
24
24
  interface RuleDescriptionIndexItem {
25
25
  stable_id: string;
26
- level: AgentsLayer;
27
- required: boolean;
28
- selectable: boolean;
29
26
  description: RuleDescription;
30
- type?: "models" | "decisions" | "guidelines" | "pitfalls" | "processes";
31
- maturity?: "draft" | "verified" | "proven";
32
- layer?: "personal" | "team";
33
- layer_reason?: string;
34
- relevance_scope?: "narrow" | "broad";
35
- relevance_paths?: string[];
36
27
  }
37
28
  interface AgentsMetaNodeActivation {
38
29
  tier: AgentsActivationTier;
@@ -182,6 +173,7 @@ declare const fabricConfigSchema: z.ZodObject<{
182
173
  fabric_event_retention_days: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<7>, z.ZodLiteral<30>, z.ZodLiteral<90>]>>;
183
174
  onboard_slots_opted_out: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
184
175
  hint_broad_top_k: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
176
+ hint_dismiss_signals: z.ZodOptional<z.ZodArray<z.ZodEnum<["archive", "review", "import", "maintenance"]>, "many">>;
185
177
  hint_narrow_top_k: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
186
178
  hint_narrow_dedup_window_turns: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
187
179
  hint_broad_cooldown_hours: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
@@ -237,6 +229,7 @@ declare const fabricConfigSchema: z.ZodObject<{
237
229
  hardBytes?: number | undefined;
238
230
  } | undefined;
239
231
  fabric_event_retention_days?: 7 | 30 | 90 | undefined;
232
+ hint_dismiss_signals?: ("archive" | "review" | "import" | "maintenance")[] | undefined;
240
233
  orphan_demote_stable_days?: number | undefined;
241
234
  orphan_demote_endorsed_days?: number | undefined;
242
235
  orphan_demote_draft_days?: number | undefined;
@@ -280,6 +273,7 @@ declare const fabricConfigSchema: z.ZodObject<{
280
273
  fabric_event_retention_days?: 7 | 30 | 90 | undefined;
281
274
  onboard_slots_opted_out?: string[] | undefined;
282
275
  hint_broad_top_k?: number | undefined;
276
+ hint_dismiss_signals?: ("archive" | "review" | "import" | "maintenance")[] | undefined;
283
277
  hint_narrow_top_k?: number | undefined;
284
278
  hint_narrow_dedup_window_turns?: number | undefined;
285
279
  hint_broad_cooldown_hours?: number | undefined;