@fenglimg/fabric-server 1.6.0 → 1.7.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.
- package/dist/chunk-PTFSYO4Y.js +2083 -0
- package/dist/{http-DJCTLGF4.js → http-6LFZLHCN.js} +269 -198
- package/dist/index.d.ts +42 -60
- package/dist/index.js +125 -666
- package/dist/static/assets/index-DEc8gkD_.js +10 -0
- package/dist/static/assets/index-FoBU5Kta.css +1 -0
- package/dist/static/index.html +9 -7
- package/package.json +3 -3
- package/dist/chunk-TZCE2K4D.js +0 -1447
- package/dist/static/assets/index-B5hhHHl2.css +0 -1
- package/dist/static/assets/index-LJh6IezM.js +0 -14
|
@@ -1 +0,0 @@
|
|
|
1
|
-
:root{--color-surface-canvas: #0b1016;--color-surface-panel: #0f172a;--color-surface-raised: #1e293b;--color-surface-overlay: #334155;--color-surface-code: #020617;--color-border-subtle: #1e293b;--color-border-default: #334155;--color-border-strong: #475569;--color-text-primary: #f8fafc;--color-text-secondary: #cbd5e1;--color-text-muted: #94a3b8;--color-text-dim: #64748b;--color-text-mono: #e2e8f0;--color-state-locked-bg: rgba(245, 158, 11, .08);--color-state-locked-border: #b45309;--color-state-locked-text: #fbbf24;--color-state-locked-accent: #f59e0b;--color-state-stale-bg: rgba(220, 38, 38, .1);--color-state-stale-border: #991b1b;--color-state-stale-text: #f87171;--color-state-stale-accent: #ef4444;--color-state-drift-bg: rgba(234, 88, 12, .1);--color-state-drift-border: #c2410c;--color-state-drift-text: #fb923c;--color-state-drift-accent: #ea580c;--color-state-approved-bg: rgba(34, 197, 94, .1);--color-state-approved-border: #166534;--color-state-approved-text: #4ade80;--color-state-approved-accent: #22c55e;--color-state-pending-bg: rgba(100, 116, 139, .1);--color-state-pending-border: #475569;--color-state-pending-text: #94a3b8;--color-state-pending-accent: #64748b;--color-source-ai-bg: rgba(99, 102, 241, .12);--color-source-ai-border: #4338ca;--color-source-ai-text: #a5b4fc;--color-source-ai-accent: #6366f1;--color-source-human-bg: rgba(20, 184, 166, .12);--color-source-human-border: #0f766e;--color-source-human-text: #5eead4;--color-source-human-accent: #14b8a6;--color-action-primary: #22c55e;--color-action-primary-hover: #16a34a;--color-action-primary-text: #052e16;--color-action-neutral: #334155;--color-action-neutral-hover: #475569;--color-action-danger: #dc2626;--font-family-mono: "Space Mono", "JetBrains Mono", "SF Mono", "Monaco", "Consolas", ui-monospace, monospace;--font-family-sans: "Inter", -apple-system, "Segoe UI", system-ui, sans-serif;--font-size-xs: 11px;--font-size-sm: 12px;--font-size-base: 13px;--font-size-md: 14px;--font-size-lg: 16px;--font-size-xl: 20px;--font-size-2xl: 24px;--font-weight-regular: 400;--font-weight-medium: 500;--font-weight-bold: 700;--line-height-tight: 1.25;--line-height-base: 1.5;--line-height-loose: 1.65;--letter-spacing-mono: 0;--letter-spacing-sans: -.01em;--letter-spacing-chip: .04em;--space-0: 0;--space-0-5: 2px;--space-1: 4px;--space-2: 8px;--space-3: 12px;--space-4: 16px;--space-5: 20px;--space-6: 24px;--space-8: 32px;--space-10: 40px;--space-12: 48px;--space-16: 64px;--radius-none: 0;--radius-sm: 3px;--radius-md: 6px;--radius-lg: 8px;--radius-pill: 999px;--shadow-card: 0 1px 2px rgba(0, 0, 0, .3), 0 1px 1px rgba(0, 0, 0, .15);--shadow-raised: 0 4px 12px rgba(0, 0, 0, .4);--shadow-focus-ring: 0 0 0 2px #0f172a, 0 0 0 4px #a5b4fc;--motion-duration-fast: .12s;--motion-duration-base: .18s;--motion-duration-slow: .28s;--motion-easing-standard: cubic-bezier(.4, 0, .2, 1);--motion-easing-decel: cubic-bezier(0, 0, .2, 1);--z-base: 0;--z-sticky: 10;--z-dropdown: 20;--z-popover: 30;--z-modal: 50;--z-toast: 100;--layout-sidebar-width: 240px;--layout-sidebar-width-collapsed: 64px;--layout-header-height: 48px;--layout-container-max-width: 1440px;--layout-container-padding: 24px}*{box-sizing:border-box}html,body{height:100%;margin:0}body{background:radial-gradient(circle at top left,rgba(99,102,241,.12),transparent 32rem),linear-gradient(135deg,rgba(15,23,42,.9),var(--color-surface-canvas) 52%);color:var(--color-text-secondary);font-family:var(--font-family-sans);font-size:var(--font-size-base);line-height:var(--line-height-base);-webkit-font-smoothing:antialiased}button,input{font:inherit}button:focus-visible,a:focus-visible,input:focus-visible,[tabindex]:focus-visible{box-shadow:var(--shadow-focus-ring);outline:0}.app-shell{display:grid;grid-template-columns:var(--layout-sidebar-width) minmax(0,1fr);min-height:100vh}.sidebar{background:color-mix(in srgb,var(--color-surface-panel) 92%,black);border-right:1px solid var(--color-border-subtle);padding:var(--space-4)}.brand{align-items:center;color:var(--color-text-primary);display:flex;font-family:var(--font-family-mono);font-size:var(--font-size-md);font-weight:var(--font-weight-bold);gap:var(--space-2);margin-bottom:var(--space-4);padding:var(--space-2)}.brand-logo{align-items:center;border:1px solid var(--color-text-mono);border-radius:var(--radius-sm);color:var(--color-text-mono);display:inline-flex;font-size:10px;height:18px;justify-content:center;width:18px}.brand-version{color:var(--color-text-dim);font-size:10px;font-weight:var(--font-weight-regular);margin-left:auto}.nav-item{align-items:center;border-radius:var(--radius-md);color:var(--color-text-muted);display:grid;font-size:var(--font-size-sm);gap:var(--space-2);grid-template-columns:8px 1fr;margin-bottom:2px;min-height:44px;padding:var(--space-2) var(--space-3);text-decoration:none;transition:background var(--motion-duration-base),color var(--motion-duration-base)}.nav-item:hover,.nav-item.active{background:var(--color-surface-raised);color:var(--color-text-primary)}.nav-item small{color:var(--color-text-dim);font-family:var(--font-family-mono);font-size:10px;grid-column:2;margin-top:-6px}.nav-item .dot{background:var(--color-text-dim);border-radius:50%;height:6px;width:6px}.nav-item.active .dot{background:var(--color-action-primary)}.muted-nav{opacity:.7}.nav-section{color:var(--color-text-dim);font-size:10px;letter-spacing:.08em;padding:var(--space-4) var(--space-3) var(--space-2);text-transform:uppercase}.main{display:flex;flex-direction:column;min-width:0}.header{align-items:center;background:#0f172adb;border-bottom:1px solid var(--color-border-subtle);display:flex;height:var(--layout-header-height);justify-content:space-between;padding:0 var(--space-6)}.breadcrumb,.port-label{color:var(--color-text-muted);font-family:var(--font-family-mono);font-size:var(--font-size-sm)}.breadcrumb .sep{color:var(--color-text-dim);margin:0 var(--space-1)}.breadcrumb strong{color:var(--color-text-primary);font-weight:var(--font-weight-regular)}.header-actions{align-items:center;display:flex;gap:var(--space-3)}.badge-live{align-items:center;border:1px solid rgba(34,197,94,.3);border-radius:var(--radius-pill);color:var(--color-state-approved-text);display:inline-flex;font-family:var(--font-family-mono);font-size:10px;gap:var(--space-1);padding:2px var(--space-2)}.badge-live.disconnected{border-color:var(--color-state-pending-border);color:var(--color-state-pending-text)}.pulse{background:currentColor;border-radius:50%;height:6px;width:6px}.view{flex:1;overflow:auto;padding:var(--space-6)}.view-header{align-items:flex-end;display:flex;justify-content:space-between;margin-bottom:var(--space-5);position:sticky;top:0;z-index:var(--z-sticky)}.view-title{color:var(--color-text-primary);font-size:var(--font-size-xl);margin:0}.view-subtitle,.muted{color:var(--color-text-muted);font-size:var(--font-size-sm);margin:var(--space-1) 0 0}.view-split{align-items:start;display:grid;gap:var(--space-5);grid-template-columns:minmax(0,2fr) minmax(280px,1fr)}.tree-panel,.detail-panel,.empty-card,.filter-bar{background:var(--color-surface-panel);border:1px solid var(--color-border-subtle);border-radius:var(--radius-lg);box-shadow:var(--shadow-card)}.tree-filter{border-bottom:1px solid var(--color-border-subtle);display:flex;gap:var(--space-3);padding:var(--space-4)}.tree-filter input,.annotate-input{background:var(--color-surface-code);border:1px solid var(--color-border-default);border-radius:var(--radius-md);color:var(--color-text-primary);font-family:var(--font-family-mono);min-height:44px;padding:var(--space-2) var(--space-3);width:100%}.status-line{color:var(--color-text-dim);display:flex;font-family:var(--font-family-mono);font-size:var(--font-size-xs);justify-content:space-between;padding:var(--space-3) var(--space-4)}.tree{font-family:var(--font-family-mono);padding:var(--space-2)}.tree-node{align-items:center;border-radius:var(--radius-md);color:var(--color-text-secondary);cursor:pointer;display:flex;gap:var(--space-2);min-height:40px;padding:var(--space-2) var(--space-3);position:relative;transition:background var(--motion-duration-fast),transform var(--motion-duration-fast)}.tree-node.is-readonly{cursor:default}.tree-node:hover:not(.is-readonly),.tree-node.is-selected{background:var(--color-surface-raised)}.tree-node.is-selected{box-shadow:inset 2px 0 0 var(--color-source-ai-accent)}.tree-node.is-locked{background:var(--color-state-locked-bg);box-shadow:inset 3px 0 0 var(--color-state-locked-border)}.tree-node.is-stale:before{background:var(--color-state-stale-text);border-radius:50%;content:"";height:6px;left:-2px;position:absolute;top:50%;transform:translateY(-50%);width:6px}.tree-caret{color:var(--color-text-dim);display:inline-flex;justify-content:center;transition:transform var(--motion-duration-base);width:14px}.tree-node.is-expanded .tree-caret{transform:rotate(90deg)}.tree-label{color:var(--color-text-primary);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tree-level-1 .tree-label{color:var(--color-text-mono)}.tree-level-2 .tree-label{color:var(--color-text-secondary);font-weight:var(--font-weight-regular)}.tree-meta{align-items:center;display:flex;gap:var(--space-2);margin-left:auto}.tree-hash{color:var(--color-text-dim);font-size:var(--font-size-xs)}.tree-children{border-left:1px dashed var(--color-border-subtle);margin-left:18px;padding-left:var(--space-2)}.badge,.drift-pill,.source-badge,.filter-chip{align-items:center;border:1px solid transparent;border-radius:var(--radius-pill);display:inline-flex;font-family:var(--font-family-mono);font-size:10px;gap:var(--space-1);letter-spacing:var(--letter-spacing-chip);line-height:1;padding:3px 7px;text-transform:uppercase}.badge-level{background:var(--color-surface-overlay);color:var(--color-text-muted)}.badge-locked{background:var(--color-state-locked-bg);border-color:var(--color-state-locked-border);color:var(--color-state-locked-text)}.drift-dot{border-radius:50%;display:inline-block;height:6px;width:6px}.drift-pill,.drift-banner{background:var(--color-state-pending-bg);border-color:var(--color-state-pending-border);color:var(--color-state-pending-text)}.drift-drift{background:var(--color-state-drift-bg);border-color:var(--color-state-drift-border);color:var(--color-state-drift-text)}.drift-stale{background:var(--color-state-stale-bg);border-color:var(--color-state-stale-border);color:var(--color-state-stale-text)}.drift-locked{background:var(--color-state-locked-bg);border-color:var(--color-state-locked-border);color:var(--color-state-locked-text)}.drift-ok{background:var(--color-state-approved-bg);border-color:var(--color-state-approved-border);color:var(--color-state-approved-text)}.drift-banner{border-radius:var(--radius-md);display:flex;gap:var(--space-2);margin-bottom:var(--space-4);padding:var(--space-3)}.detail-panel{padding:var(--space-5);position:sticky;top:var(--space-6)}.detail-panel h3{color:var(--color-text-muted);font-size:var(--font-size-sm);letter-spacing:.06em;margin:0 0 var(--space-3);text-transform:uppercase}.kv{font-family:var(--font-family-mono);font-size:var(--font-size-sm)}.kv-row{border-bottom:1px dashed var(--color-border-subtle);display:flex;gap:var(--space-3);justify-content:space-between;padding:var(--space-1) 0}.kv-key{color:var(--color-text-muted)}.kv-value{color:var(--color-text-primary);overflow-wrap:anywhere;text-align:right}.code,.preview-body{background:var(--color-surface-code);color:var(--color-text-mono);font-family:var(--font-family-mono)}.code{border:1px solid var(--color-border-subtle);border-radius:var(--radius-md);margin-top:var(--space-3);overflow:auto;padding:var(--space-3)}.filter-bar{align-items:center;display:flex;gap:var(--space-2);margin-bottom:var(--space-4);padding:var(--space-3)}.filter-chip,.ghost-button{background:var(--color-surface-raised);border-color:var(--color-border-subtle);color:var(--color-text-muted);cursor:pointer;min-height:40px}.filter-chip.active,.filter-chip:hover,.ghost-button:hover{border-color:var(--color-border-default);color:var(--color-text-primary)}.filter-chip .count{background:var(--color-surface-code);border-radius:var(--radius-pill);padding:1px 5px}.filter-date{color:var(--color-text-muted);font-family:var(--font-family-mono);font-size:var(--font-size-sm);margin-left:auto}.topology-toolbar,.topology-status{background:var(--color-surface-panel);border:1px solid var(--color-border-subtle);border-radius:var(--radius-lg);margin-bottom:var(--space-4)}.topology-split{grid-template-columns:minmax(0,1.2fr) minmax(320px,1fr)}.topology-card{background:var(--color-surface-panel);border:1px solid var(--color-border-subtle);border-radius:var(--radius-lg);box-shadow:var(--shadow-card);min-height:280px;overflow:hidden}.topology-card-head{align-items:start;border-bottom:1px solid var(--color-border-subtle);display:flex;gap:var(--space-3);justify-content:space-between;padding:var(--space-4)}.topology-card-head h3{color:var(--color-text-primary);margin:0}.coverage-grid,.reason-list{display:grid;gap:var(--space-3);padding:var(--space-4)}.coverage-row,.reason-card,.module-placeholder{background:color-mix(in srgb,var(--color-surface-raised) 88%,transparent);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md)}.coverage-row{padding:var(--space-3)}.coverage-row-main,.reason-card-head,.reason-card-meta{align-items:center;display:flex;gap:var(--space-2);justify-content:space-between}.coverage-row-meta,.reason-card-meta,.reason-description{color:var(--color-text-muted);font-family:var(--font-family-mono);font-size:var(--font-size-xs)}.coverage-row-meta,.reason-card-meta{margin-top:var(--space-2)}.coverage-path,.reason-card strong{color:var(--color-text-primary);font-family:var(--font-family-mono);overflow-wrap:anywhere}.coverage-chip-full,.reason-tier-always{background:#22c55e1f;border-color:#22c55e4d;color:#86efac}.coverage-chip-partial,.reason-tier-path{background:#facc151f;border-color:#facc154d;color:#fde68a}.coverage-chip-none,.reason-tier-description{background:#94a3b81f;border-color:#94a3b84d;color:#cbd5e1}.coverage-full{box-shadow:inset 2px 0 #22c55e73}.coverage-partial{box-shadow:inset 2px 0 #facc1573}.coverage-none{box-shadow:inset 2px 0 #94a3b840}.reason-card{padding:var(--space-3)}.reason-description{line-height:1.6;margin:var(--space-2) 0 0}.module-placeholder{padding:var(--space-6)}.module-placeholder strong{color:var(--color-text-primary);display:block;font-family:var(--font-family-mono);margin-bottom:var(--space-2)}.module-placeholder p{color:var(--color-text-muted);margin:0}.filter-label{color:var(--color-text-dim);font-size:var(--font-size-xs);letter-spacing:.08em;text-transform:uppercase}.history-toolbar{margin-bottom:var(--space-5)}.history-slider{flex:1}.history-layout{grid-template-columns:minmax(340px,1.05fr) minmax(0,1.4fr)}.history-timeline-panel{min-width:0}.history-timeline-list{display:grid;gap:var(--space-3);max-height:calc(100vh - 280px);overflow:auto;padding:var(--space-4)}.history-timeline-item{background:transparent;border:0;cursor:pointer;padding:0;text-align:left}.history-timeline-item .timeline-entry{margin-bottom:0}.history-timeline-item.selected .timeline-entry{box-shadow:inset 0 0 0 1px var(--color-source-ai-accent)}.history-state-head{align-items:start}.history-state-title{color:var(--color-text-primary);font-family:var(--font-family-mono)}.ghost-button{border:1px solid var(--color-border-subtle);border-radius:var(--radius-md);padding:var(--space-2) var(--space-3)}.empty-card{color:var(--color-text-muted);padding:var(--space-6);text-align:center}.lock-grid{display:grid;gap:var(--space-4);grid-template-columns:repeat(auto-fill,minmax(360px,1fr))}.lock-card,.timeline-entry{background:var(--color-surface-panel);border:1px solid var(--color-border-subtle);border-radius:var(--radius-lg);box-shadow:var(--shadow-card);overflow:hidden}.lock-card{display:flex;flex-direction:column}.lock-drift{border-left:3px solid var(--color-state-drift-border)}.lock-ok{border-left:3px solid var(--color-state-approved-border)}.lock-head,.lock-foot{align-items:center;display:flex;gap:var(--space-3);padding:var(--space-4)}.lock-head{border-bottom:1px solid var(--color-border-subtle)}.lock-foot{border-top:1px solid var(--color-border-subtle);justify-content:space-between}.lock-icon{align-items:center;border-radius:var(--radius-md);display:inline-flex;font-family:var(--font-family-mono);height:28px;justify-content:center;width:28px}.lock-drift .lock-icon{background:var(--color-state-drift-bg);color:var(--color-state-drift-text)}.lock-ok .lock-icon{background:var(--color-state-approved-bg);color:var(--color-state-approved-text)}.lock-title{display:flex;flex:1;flex-direction:column;min-width:0}.lock-title strong{color:var(--color-text-primary);font-family:var(--font-family-mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.lock-title span,.meta-line{color:var(--color-text-dim);font-family:var(--font-family-mono);font-size:var(--font-size-xs)}.lock-body{display:flex;flex:1;flex-direction:column;gap:var(--space-3);padding:var(--space-4)}.hash-block{font-family:var(--font-family-mono);font-size:var(--font-size-sm)}.hash-row{display:grid;gap:var(--space-2);grid-template-columns:110px minmax(0,1fr);padding:var(--space-1) 0}.hash-key{color:var(--color-text-muted);font-size:10px;letter-spacing:.06em;text-transform:uppercase}.hash-value{color:var(--color-text-primary);overflow-wrap:anywhere}.hash-value.is-stale,.hash-value.is-accent{color:var(--color-state-drift-text)}.hash-value.is-stale{text-decoration:line-through}.preview{border:1px solid var(--color-border-subtle);border-radius:var(--radius-md);overflow:hidden}.preview-head{align-items:center;background:var(--color-surface-panel);border-bottom:1px solid var(--color-border-subtle);color:var(--color-text-dim);display:flex;font-family:var(--font-family-mono);font-size:10px;justify-content:space-between;letter-spacing:.06em;padding:var(--space-1) var(--space-3);text-transform:uppercase}.preview-body{display:block;line-height:1.55;margin:0;min-height:92px;overflow:auto;padding:var(--space-3);white-space:pre-wrap}.line-add,.line-del,.line-ctx{display:block}.line-add{background:#22c55e14;color:#86efac}.line-del{background:#dc262614;color:#fca5a5;text-decoration:line-through}.line-num{color:var(--color-text-dim);display:inline-block;padding-right:var(--space-2);text-align:right;-webkit-user-select:none;user-select:none;width:28px}.action-button{align-items:center;border:1px solid var(--color-border-default);border-radius:var(--radius-md);cursor:pointer;display:inline-flex;font-weight:var(--font-weight-medium);gap:var(--space-2);min-height:40px;padding:var(--space-2) var(--space-4);transition:transform var(--motion-duration-fast),background var(--motion-duration-base)}.action-button:active{transform:scale(.98)}.action-approve{background:var(--color-action-primary);border-color:transparent;color:var(--color-action-primary-text)}.action-annotate{background:var(--color-source-human-bg);border-color:var(--color-source-human-border);color:var(--color-source-human-text)}.action-success{background:var(--color-state-approved-bg);border-color:var(--color-state-approved-border);color:var(--color-state-approved-text);cursor:default}.action-busy{pointer-events:none}.action-error{border-color:var(--color-action-danger)}.spinner{animation:spin .7s linear infinite;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;height:14px;width:14px}.source-badge{background:var(--color-surface-raised);color:var(--color-text-muted);min-height:28px}button.source-badge{cursor:pointer}.source-badge-ai{background:var(--color-source-ai-bg);border-color:var(--color-source-ai-border);color:var(--color-source-ai-text)}.source-badge-human{background:var(--color-source-human-bg);border-color:var(--color-source-human-border);color:var(--color-source-human-text)}.source-badge-outline{background:transparent}.source-badge.is-selected{box-shadow:inset 0 0 0 1px currentColor}.source-badge-dot{background:currentColor;border-radius:50%;height:6px;width:6px}.col-headers{display:grid;gap:var(--space-4);grid-template-columns:1fr 1fr;margin-bottom:var(--space-3)}.col-head{align-items:center;border-radius:var(--radius-md);display:flex;font-family:var(--font-family-mono);justify-content:space-between;padding:var(--space-3)}.col-head.ai{background:var(--color-source-ai-bg);color:var(--color-source-ai-text)}.col-head.human{background:var(--color-source-human-bg);color:var(--color-source-human-text)}.timeline-grid{display:grid;gap:0;grid-template-columns:1fr 40px 1fr;position:relative}.axis{align-items:center;display:flex;grid-column:2;grid-row:1 / span 999;justify-content:center;pointer-events:none}.axis-line{align-self:stretch;background:linear-gradient(var(--color-border-subtle),var(--color-border-default),var(--color-border-subtle));width:2px}.timeline-entry{margin-bottom:var(--space-3);padding:var(--space-3) var(--space-4);position:relative}.timeline-ai{border-left:3px solid var(--color-source-ai-border);grid-column:1}.timeline-human{border-right:3px solid var(--color-source-human-border);grid-column:3}.dot-axis{border:2px solid var(--color-surface-canvas);border-radius:50%;height:10px;position:absolute;top:16px;width:10px}.dot-axis.ai{background:var(--color-source-ai-accent);right:-27px}.dot-axis.human{background:var(--color-source-human-accent);left:-27px}.timeline-head,.entry-meta,.entry-foot{align-items:center;display:flex;flex-wrap:wrap;gap:var(--space-2)}.entry-time{color:var(--color-text-muted);font-family:var(--font-family-mono);font-size:var(--font-size-xs);margin-left:auto}.entry-title{color:var(--color-text-primary);font-size:var(--font-size-md);font-weight:var(--font-weight-medium);margin:var(--space-2) 0 0}.entry-meta{color:var(--color-text-muted);font-family:var(--font-family-mono);font-size:var(--font-size-xs);margin-top:var(--space-2)}.meta-key{color:var(--color-text-dim)}.entry-body{color:var(--color-text-secondary);line-height:var(--line-height-loose);margin-top:var(--space-3)}.diff-badge,.commit-hash{color:var(--color-text-muted);font-family:var(--font-family-mono);font-size:var(--font-size-xs)}.diff-badge{background:var(--color-surface-code);border:1px solid var(--color-border-subtle);border-radius:var(--radius-pill);padding:2px 6px}.annotate-form{display:grid;gap:var(--space-2);margin-top:var(--space-3)}.annotate-form label{color:var(--color-text-muted);font-family:var(--font-family-mono);font-size:var(--font-size-xs);text-transform:uppercase}.timeline-empty{grid-column:1 / -1}.doctor-toolbar{margin-bottom:var(--space-5)}.doctor-layout{display:grid;gap:var(--space-5)}.doctor-summary-grid,.doctor-panels{display:grid;gap:var(--space-4);grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.doctor-card,.doctor-summary-card{background:var(--color-surface-panel);border:1px solid var(--color-border-subtle);border-radius:var(--radius-lg);box-shadow:var(--shadow-card)}.doctor-summary-card{display:flex;flex-direction:column;gap:var(--space-2);padding:var(--space-4)}.doctor-summary-label,.doctor-summary-detail,.doctor-card-head span{color:var(--color-text-muted);font-family:var(--font-family-mono);font-size:var(--font-size-xs)}.doctor-summary-label{letter-spacing:.08em;text-transform:uppercase}.doctor-summary-value{color:var(--color-text-primary);font-size:var(--font-size-lg)}.doctor-card{overflow:hidden}.doctor-card-head{align-items:center;border-bottom:1px solid var(--color-border-subtle);display:flex;justify-content:space-between;padding:var(--space-4)}.doctor-card-head h3{color:var(--color-text-primary);font-size:var(--font-size-md);margin:0}.doctor-entry-list,.doctor-check-list{display:grid}.doctor-entry,.doctor-check{display:grid;gap:var(--space-2);padding:var(--space-4)}.doctor-entry+.doctor-entry,.doctor-check+.doctor-check{border-top:1px solid var(--color-border-subtle)}.doctor-entry strong,.doctor-check strong{color:var(--color-text-primary);font-family:var(--font-family-mono);font-size:var(--font-size-sm)}.doctor-entry span,.doctor-check p{color:var(--color-text-muted);margin:0}.doctor-check-head{align-items:center;display:flex;gap:var(--space-3);justify-content:space-between}.doctor-check-warn{background:linear-gradient(180deg,var(--color-state-locked-bg),transparent 90%)}.doctor-check-error{background:linear-gradient(180deg,var(--color-state-stale-bg),transparent 90%)}.doctor-check-ok{background:linear-gradient(180deg,var(--color-state-approved-bg),transparent 90%)}.doctor-empty{border:0;border-radius:0;box-shadow:none;margin:0}.live-region{clip:rect(0 0 0 0);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.45}}@media(prefers-reduced-motion:no-preference){.pulse,.drift-dot.drift-drift,.drift-dot.drift-stale{animation:pulse 2.4s infinite}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:0ms!important;scroll-behavior:auto!important;transition-duration:0ms!important}}@media(max-width:960px){.app-shell{grid-template-columns:var(--layout-sidebar-width-collapsed) minmax(0,1fr)}.brand span:not(.brand-logo),.nav-item span:not(.dot),.nav-item small,.nav-section,.muted-nav{display:none}.sidebar{padding:var(--space-3) var(--space-2)}.nav-item{grid-template-columns:1fr;justify-items:center}}@media(max-width:720px){.app-shell,.view-split,.topology-split,.timeline-grid,.col-headers,.doctor-panels,.doctor-summary-grid{grid-template-columns:1fr}.sidebar{border-bottom:1px solid var(--color-border-subtle);border-right:0;display:flex;overflow-x:auto}.main{min-height:0}.header{align-items:flex-start;flex-direction:column;height:auto;padding:var(--space-3)}.view{padding:var(--space-4)}.detail-panel{position:static}.axis,.dot-axis{display:none}.timeline-ai,.timeline-human{grid-column:1}}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const n of i)if(n.type==="childList")for(const o of n.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function a(i){const n={};return i.integrity&&(n.integrity=i.integrity),i.referrerPolicy&&(n.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?n.credentials="include":i.crossOrigin==="anonymous"?n.credentials="omit":n.credentials="same-origin",n}function r(i){if(i.ep)return;i.ep=!0;const n=a(i);fetch(i.href,n)}})();var it,O,Ta,ne,Jt,Aa,Ea,dt,je,Ce,Ia,Pt,vt,_t,Ra,Ze={},ze=[],br=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,nt=Array.isArray;function K(t,e){for(var a in e)t[a]=e[a];return t}function jt(t){t&&t.parentNode&&t.parentNode.removeChild(t)}function gr(t,e,a){var r,i,n,o={};for(n in e)n=="key"?r=e[n]:n=="ref"?i=e[n]:o[n]=e[n];if(arguments.length>2&&(o.children=arguments.length>3?it.call(arguments,2):a),typeof t=="function"&&t.defaultProps!=null)for(n in t.defaultProps)o[n]===void 0&&(o[n]=t.defaultProps[n]);return Fe(t,o,r,i,null)}function Fe(t,e,a,r,i){var n={type:t,props:e,key:a,ref:r,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:i??++Ta,__i:-1,__u:0};return i==null&&O.vnode!=null&&O.vnode(n),n}function st(t){return t.children}function Me(t,e){this.props=t,this.context=e}function be(t,e){if(e==null)return t.__?be(t.__,t.__i+1):null;for(var a;e<t.__k.length;e++)if((a=t.__k[e])!=null&&a.__e!=null)return a.__e;return typeof t.type=="function"?be(t):null}function yr(t){if(t.__P&&t.__d){var e=t.__v,a=e.__e,r=[],i=[],n=K({},e);n.__v=e.__v+1,O.vnode&&O.vnode(n),Ft(t.__P,n,e,t.__n,t.__P.namespaceURI,32&e.__u?[a]:null,r,a??be(e),!!(32&e.__u),i),n.__v=e.__v,n.__.__k[n.__i]=n,Pa(r,n,i),e.__e=e.__=null,n.__e!=a&&$a(n)}}function $a(t){if((t=t.__)!=null&&t.__c!=null)return t.__e=t.__c.base=null,t.__k.some(function(e){if(e!=null&&e.__e!=null)return t.__e=t.__c.base=e.__e}),$a(t)}function kt(t){(!t.__d&&(t.__d=!0)&&ne.push(t)&&!Ue.__r++||Jt!=O.debounceRendering)&&((Jt=O.debounceRendering)||Aa)(Ue)}function Ue(){try{for(var t,e=1;ne.length;)ne.length>e&&ne.sort(Ea),t=ne.shift(),e=ne.length,yr(t)}finally{ne.length=Ue.__r=0}}function La(t,e,a,r,i,n,o,l,c,d,h){var u,g,p,y,C,w,x,_=r&&r.__k||ze,P=e.length;for(c=vr(a,e,_,c,P),u=0;u<P;u++)(p=a.__k[u])!=null&&(g=p.__i!=-1&&_[p.__i]||Ze,p.__i=u,w=Ft(t,p,g,i,n,o,l,c,d,h),y=p.__e,p.ref&&g.ref!=p.ref&&(g.ref&&Mt(g.ref,null,p),h.push(p.ref,p.__c||y,p)),C==null&&y!=null&&(C=y),(x=!!(4&p.__u))||g.__k===p.__k?(c=Oa(p,c,t,x),x&&g.__e&&(g.__e=null)):typeof p.type=="function"&&w!==void 0?c=w:y&&(c=y.nextSibling),p.__u&=-7);return a.__e=C,c}function vr(t,e,a,r,i){var n,o,l,c,d,h=a.length,u=h,g=0;for(t.__k=new Array(i),n=0;n<i;n++)(o=e[n])!=null&&typeof o!="boolean"&&typeof o!="function"?(typeof o=="string"||typeof o=="number"||typeof o=="bigint"||o.constructor==String?o=t.__k[n]=Fe(null,o,null,null,null):nt(o)?o=t.__k[n]=Fe(st,{children:o},null,null,null):o.constructor===void 0&&o.__b>0?o=t.__k[n]=Fe(o.type,o.props,o.key,o.ref?o.ref:null,o.__v):t.__k[n]=o,c=n+g,o.__=t,o.__b=t.__b+1,l=null,(d=o.__i=_r(o,a,c,u))!=-1&&(u--,(l=a[d])&&(l.__u|=2)),l==null||l.__v==null?(d==-1&&(i>h?g--:i<h&&g++),typeof o.type!="function"&&(o.__u|=4)):d!=c&&(d==c-1?g--:d==c+1?g++:(d>c?g--:g++,o.__u|=4))):t.__k[n]=null;if(u)for(n=0;n<h;n++)(l=a[n])!=null&&(2&l.__u)==0&&(l.__e==r&&(r=be(l)),Fa(l,l));return r}function Oa(t,e,a,r){var i,n;if(typeof t.type=="function"){for(i=t.__k,n=0;i&&n<i.length;n++)i[n]&&(i[n].__=t,e=Oa(i[n],e,a,r));return e}t.__e!=e&&(r&&(e&&t.type&&!e.parentNode&&(e=be(t)),a.insertBefore(t.__e,e||null)),e=t.__e);do e=e&&e.nextSibling;while(e!=null&&e.nodeType==8);return e}function _r(t,e,a,r){var i,n,o,l=t.key,c=t.type,d=e[a],h=d!=null&&(2&d.__u)==0;if(d===null&&l==null||h&&l==d.key&&c==d.type)return a;if(r>(h?1:0)){for(i=a-1,n=a+1;i>=0||n<e.length;)if((d=e[o=i>=0?i--:n++])!=null&&(2&d.__u)==0&&l==d.key&&c==d.type)return o}return-1}function Kt(t,e,a){e[0]=="-"?t.setProperty(e,a??""):t[e]=a==null?"":typeof a!="number"||br.test(e)?a:a+"px"}function $e(t,e,a,r,i){var n,o;e:if(e=="style")if(typeof a=="string")t.style.cssText=a;else{if(typeof r=="string"&&(t.style.cssText=r=""),r)for(e in r)a&&e in a||Kt(t.style,e,"");if(a)for(e in a)r&&a[e]==r[e]||Kt(t.style,e,a[e])}else if(e[0]=="o"&&e[1]=="n")n=e!=(e=e.replace(Ia,"$1")),o=e.toLowerCase(),e=o in t||e=="onFocusOut"||e=="onFocusIn"?o.slice(2):e.slice(2),t.l||(t.l={}),t.l[e+n]=a,a?r?a[Ce]=r[Ce]:(a[Ce]=Pt,t.addEventListener(e,n?_t:vt,n)):t.removeEventListener(e,n?_t:vt,n);else{if(i=="http://www.w3.org/2000/svg")e=e.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(e!="width"&&e!="height"&&e!="href"&&e!="list"&&e!="form"&&e!="tabIndex"&&e!="download"&&e!="rowSpan"&&e!="colSpan"&&e!="role"&&e!="popover"&&e in t)try{t[e]=a??"";break e}catch{}typeof a=="function"||(a==null||a===!1&&e[4]!="-"?t.removeAttribute(e):t.setAttribute(e,e=="popover"&&a==1?"":a))}}function Qt(t){return function(e){if(this.l){var a=this.l[e.type+t];if(e[je]==null)e[je]=Pt++;else if(e[je]<a[Ce])return;return a(O.event?O.event(e):e)}}}function Ft(t,e,a,r,i,n,o,l,c,d){var h,u,g,p,y,C,w,x,_,P,H,Ne,Gt,Re,lt,q=e.type;if(e.constructor!==void 0)return null;128&a.__u&&(c=!!(32&a.__u),n=[l=e.__e=a.__e]),(h=O.__b)&&h(e);e:if(typeof q=="function")try{if(x=e.props,_=q.prototype&&q.prototype.render,P=(h=q.contextType)&&r[h.__c],H=h?P?P.props.value:h.__:r,a.__c?w=(u=e.__c=a.__c).__=u.__E:(_?e.__c=u=new q(x,H):(e.__c=u=new Me(x,H),u.constructor=q,u.render=wr),P&&P.sub(u),u.state||(u.state={}),u.__n=r,g=u.__d=!0,u.__h=[],u._sb=[]),_&&u.__s==null&&(u.__s=u.state),_&&q.getDerivedStateFromProps!=null&&(u.__s==u.state&&(u.__s=K({},u.__s)),K(u.__s,q.getDerivedStateFromProps(x,u.__s))),p=u.props,y=u.state,u.__v=e,g)_&&q.getDerivedStateFromProps==null&&u.componentWillMount!=null&&u.componentWillMount(),_&&u.componentDidMount!=null&&u.__h.push(u.componentDidMount);else{if(_&&q.getDerivedStateFromProps==null&&x!==p&&u.componentWillReceiveProps!=null&&u.componentWillReceiveProps(x,H),e.__v==a.__v||!u.__e&&u.shouldComponentUpdate!=null&&u.shouldComponentUpdate(x,u.__s,H)===!1){e.__v!=a.__v&&(u.props=x,u.state=u.__s,u.__d=!1),e.__e=a.__e,e.__k=a.__k,e.__k.some(function(me){me&&(me.__=e)}),ze.push.apply(u.__h,u._sb),u._sb=[],u.__h.length&&o.push(u);break e}u.componentWillUpdate!=null&&u.componentWillUpdate(x,u.__s,H),_&&u.componentDidUpdate!=null&&u.__h.push(function(){u.componentDidUpdate(p,y,C)})}if(u.context=H,u.props=x,u.__P=t,u.__e=!1,Ne=O.__r,Gt=0,_)u.state=u.__s,u.__d=!1,Ne&&Ne(e),h=u.render(u.props,u.state,u.context),ze.push.apply(u.__h,u._sb),u._sb=[];else do u.__d=!1,Ne&&Ne(e),h=u.render(u.props,u.state,u.context),u.state=u.__s;while(u.__d&&++Gt<25);u.state=u.__s,u.getChildContext!=null&&(r=K(K({},r),u.getChildContext())),_&&!g&&u.getSnapshotBeforeUpdate!=null&&(C=u.getSnapshotBeforeUpdate(p,y)),Re=h!=null&&h.type===st&&h.key==null?ja(h.props.children):h,l=La(t,nt(Re)?Re:[Re],e,a,r,i,n,o,l,c,d),u.base=e.__e,e.__u&=-161,u.__h.length&&o.push(u),w&&(u.__E=u.__=null)}catch(me){if(e.__v=null,c||n!=null)if(me.then){for(e.__u|=c?160:128;l&&l.nodeType==8&&l.nextSibling;)l=l.nextSibling;n[n.indexOf(l)]=null,e.__e=l}else{for(lt=n.length;lt--;)jt(n[lt]);wt(e)}else e.__e=a.__e,e.__k=a.__k,me.then||wt(e);O.__e(me,e,a)}else n==null&&e.__v==a.__v?(e.__k=a.__k,e.__e=a.__e):l=e.__e=kr(a.__e,e,a,r,i,n,o,c,d);return(h=O.diffed)&&h(e),128&e.__u?void 0:l}function wt(t){t&&(t.__c&&(t.__c.__e=!0),t.__k&&t.__k.some(wt))}function Pa(t,e,a){for(var r=0;r<a.length;r++)Mt(a[r],a[++r],a[++r]);O.__c&&O.__c(e,t),t.some(function(i){try{t=i.__h,i.__h=[],t.some(function(n){n.call(i)})}catch(n){O.__e(n,i.__v)}})}function ja(t){return typeof t!="object"||t==null||t.__b>0?t:nt(t)?t.map(ja):K({},t)}function kr(t,e,a,r,i,n,o,l,c){var d,h,u,g,p,y,C,w=a.props||Ze,x=e.props,_=e.type;if(_=="svg"?i="http://www.w3.org/2000/svg":_=="math"?i="http://www.w3.org/1998/Math/MathML":i||(i="http://www.w3.org/1999/xhtml"),n!=null){for(d=0;d<n.length;d++)if((p=n[d])&&"setAttribute"in p==!!_&&(_?p.localName==_:p.nodeType==3)){t=p,n[d]=null;break}}if(t==null){if(_==null)return document.createTextNode(x);t=document.createElementNS(i,_,x.is&&x),l&&(O.__m&&O.__m(e,n),l=!1),n=null}if(_==null)w===x||l&&t.data==x||(t.data=x);else{if(n=n&&it.call(t.childNodes),!l&&n!=null)for(w={},d=0;d<t.attributes.length;d++)w[(p=t.attributes[d]).name]=p.value;for(d in w)p=w[d],d=="dangerouslySetInnerHTML"?u=p:d=="children"||d in x||d=="value"&&"defaultValue"in x||d=="checked"&&"defaultChecked"in x||$e(t,d,null,p,i);for(d in x)p=x[d],d=="children"?g=p:d=="dangerouslySetInnerHTML"?h=p:d=="value"?y=p:d=="checked"?C=p:l&&typeof p!="function"||w[d]===p||$e(t,d,p,w[d],i);if(h)l||u&&(h.__html==u.__html||h.__html==t.innerHTML)||(t.innerHTML=h.__html),e.__k=[];else if(u&&(t.innerHTML=""),La(e.type=="template"?t.content:t,nt(g)?g:[g],e,a,r,_=="foreignObject"?"http://www.w3.org/1999/xhtml":i,n,o,n?n[0]:a.__k&&be(a,0),l,c),n!=null)for(d=n.length;d--;)jt(n[d]);l||(d="value",_=="progress"&&y==null?t.removeAttribute("value"):y!=null&&(y!==t[d]||_=="progress"&&!y||_=="option"&&y!=w[d])&&$e(t,d,y,w[d],i),d="checked",C!=null&&C!=t[d]&&$e(t,d,C,w[d],i))}return t}function Mt(t,e,a){try{if(typeof t=="function"){var r=typeof t.__u=="function";r&&t.__u(),r&&e==null||(t.__u=t(e))}else t.current=e}catch(i){O.__e(i,a)}}function Fa(t,e,a){var r,i;if(O.unmount&&O.unmount(t),(r=t.ref)&&(r.current&&r.current!=t.__e||Mt(r,null,e)),(r=t.__c)!=null){if(r.componentWillUnmount)try{r.componentWillUnmount()}catch(n){O.__e(n,e)}r.base=r.__P=null}if(r=t.__k)for(i=0;i<r.length;i++)r[i]&&Fa(r[i],e,a||typeof t.type!="function");a||jt(t.__e),t.__c=t.__=t.__e=void 0}function wr(t,e,a){return this.constructor(t,a)}function xr(t,e,a){var r,i,n,o;e==document&&(e=document.documentElement),O.__&&O.__(t,e),i=(r=!1)?null:e.__k,n=[],o=[],Ft(e,t=e.__k=gr(st,null,[t]),i||Ze,Ze,e.namespaceURI,i?null:e.firstChild?it.call(e.childNodes):null,n,i?i.__e:e.firstChild,r,o),Pa(n,t,o)}function Nr(t){function e(a){var r,i;return this.getChildContext||(r=new Set,(i={})[e.__c]=this,this.getChildContext=function(){return i},this.componentWillUnmount=function(){r=null},this.shouldComponentUpdate=function(n){this.props.value!=n.value&&r.forEach(function(o){o.__e=!0,kt(o)})},this.sub=function(n){r.add(n);var o=n.componentWillUnmount;n.componentWillUnmount=function(){r&&r.delete(n),o&&o.call(n)}}),a.children}return e.__c="__cC"+Ra++,e.__=t,e.Provider=e.__l=(e.Consumer=function(a,r){return a.children(r)}).contextType=e,e}it=ze.slice,O={__e:function(t,e,a,r){for(var i,n,o;e=e.__;)if((i=e.__c)&&!i.__)try{if((n=i.constructor)&&n.getDerivedStateFromError!=null&&(i.setState(n.getDerivedStateFromError(t)),o=i.__d),i.componentDidCatch!=null&&(i.componentDidCatch(t,r||{}),o=i.__d),o)return i.__E=i}catch(l){t=l}throw t}},Ta=0,Me.prototype.setState=function(t,e){var a;a=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=K({},this.state),typeof t=="function"&&(t=t(K({},a),this.props)),t&&K(a,t),t!=null&&this.__v&&(e&&this._sb.push(e),kt(this))},Me.prototype.forceUpdate=function(t){this.__v&&(this.__e=!0,t&&this.__h.push(t),kt(this))},Me.prototype.render=st,ne=[],Aa=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Ea=function(t,e){return t.__v.__b-e.__v.__b},Ue.__r=0,dt=Math.random().toString(8),je="__d"+dt,Ce="__a"+dt,Ia=/(PointerCapture)$|Capture$/i,Pt=0,vt=Qt(!1),_t=Qt(!0),Ra=0;var Sr=0;function s(t,e,a,r,i,n){e||(e={});var o,l,c=e;if("ref"in c)for(l in c={},e)l=="ref"?o=e[l]:c[l]=e[l];var d={type:t,props:c,key:a,ref:o,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--Sr,__i:-1,__u:0,__source:i,__self:n};if(typeof t=="function"&&(o=t.defaultProps))for(l in o)c[l]===void 0&&(c[l]=o[l]);return O.vnode&&O.vnode(d),d}var ge,j,ct,ea,He=0,Ma=[],F=O,ta=F.__b,aa=F.__r,ra=F.diffed,ia=F.__c,na=F.unmount,sa=F.__;function ot(t,e){F.__h&&F.__h(j,t,He||e),He=0;var a=j.__H||(j.__H={__:[],__h:[]});return t>=a.__.length&&a.__.push({}),a.__[t]}function R(t){return He=1,Cr(Za,t)}function Cr(t,e,a){var r=ot(ge++,2);if(r.t=t,!r.__c&&(r.__=[Za(void 0,e),function(l){var c=r.__N?r.__N[0]:r.__[0],d=r.t(c,l);c!==d&&(r.__N=[d,r.__[1]],r.__c.setState({}))}],r.__c=j,!j.__f)){var i=function(l,c,d){if(!r.__c.__H)return!0;var h=r.__c.__H.__.filter(function(g){return g.__c});if(h.every(function(g){return!g.__N}))return!n||n.call(this,l,c,d);var u=r.__c.props!==l;return h.some(function(g){if(g.__N){var p=g.__[0];g.__=g.__N,g.__N=void 0,p!==g.__[0]&&(u=!0)}}),n&&n.call(this,l,c,d)||u};j.__f=!0;var n=j.shouldComponentUpdate,o=j.componentWillUpdate;j.componentWillUpdate=function(l,c,d){if(this.__e){var h=n;n=void 0,i(l,c,d),n=h}o&&o.call(this,l,c,d)},j.shouldComponentUpdate=i}return r.__N||r.__}function Z(t,e){var a=ot(ge++,3);!F.__s&&Da(a.__H,e)&&(a.__=t,a.u=e,j.__H.__h.push(a))}function Le(t){return He=5,Y(function(){return{current:t}},[])}function Y(t,e){var a=ot(ge++,7);return Da(a.__H,e)&&(a.__=t(),a.__H=e,a.__h=t),a.__}function Tr(t){var e=j.context[t.__c],a=ot(ge++,9);return a.c=t,e?(a.__==null&&(a.__=!0,e.sub(j)),e.props.value):t.__}function Ar(){for(var t;t=Ma.shift();){var e=t.__H;if(t.__P&&e)try{e.__h.some(De),e.__h.some(xt),e.__h=[]}catch(a){e.__h=[],F.__e(a,t.__v)}}}F.__b=function(t){j=null,ta&&ta(t)},F.__=function(t,e){t&&e.__k&&e.__k.__m&&(t.__m=e.__k.__m),sa&&sa(t,e)},F.__r=function(t){aa&&aa(t),ge=0;var e=(j=t.__c).__H;e&&(ct===j?(e.__h=[],j.__h=[],e.__.some(function(a){a.__N&&(a.__=a.__N),a.u=a.__N=void 0})):(e.__h.some(De),e.__h.some(xt),e.__h=[],ge=0)),ct=j},F.diffed=function(t){ra&&ra(t);var e=t.__c;e&&e.__H&&(e.__H.__h.length&&(Ma.push(e)!==1&&ea===F.requestAnimationFrame||((ea=F.requestAnimationFrame)||Er)(Ar)),e.__H.__.some(function(a){a.u&&(a.__H=a.u),a.u=void 0})),ct=j=null},F.__c=function(t,e){e.some(function(a){try{a.__h.some(De),a.__h=a.__h.filter(function(r){return!r.__||xt(r)})}catch(r){e.some(function(i){i.__h&&(i.__h=[])}),e=[],F.__e(r,a.__v)}}),ia&&ia(t,e)},F.unmount=function(t){na&&na(t);var e,a=t.__c;a&&a.__H&&(a.__H.__.some(function(r){try{De(r)}catch(i){e=i}}),a.__H=void 0,e&&F.__e(e,a.__v))};var oa=typeof requestAnimationFrame=="function";function Er(t){var e,a=function(){clearTimeout(r),oa&&cancelAnimationFrame(e),setTimeout(t)},r=setTimeout(a,35);oa&&(e=requestAnimationFrame(a))}function De(t){var e=j,a=t.__c;typeof a=="function"&&(t.__c=void 0,a()),j=e}function xt(t){var e=j;t.__c=t.__(),j=e}function Da(t,e){return!t||t.length!==e.length||e.some(function(a,r){return a!==t[r]})}function Za(t,e){return typeof e=="function"?e(t):e}var Ir=Symbol.for("preact-signals");function Dt(){if(ce>1)ce--;else{var t,e=!1;for((function(){var i=Be;for(Be=void 0;i!==void 0;)i.S.v===i.v&&(i.S.i=i.i),i=i.o})();Te!==void 0;){var a=Te;for(Te=void 0,Ve++;a!==void 0;){var r=a.u;if(a.u=void 0,a.f&=-3,!(8&a.f)&&Ha(a))try{a.c()}catch(i){e||(t=i,e=!0)}a=r}}if(Ve=0,ce--,e)throw t}}var $=void 0;function za(t){var e=$;$=void 0;try{return t()}finally{$=e}}var Te=void 0,ce=0,Ve=0,la=0,Be=void 0,We=0;function Ua(t){if($!==void 0){var e=t.n;if(e===void 0||e.t!==$)return e={i:0,S:t,p:$.s,n:void 0,t:$,e:void 0,x:void 0,r:e},$.s!==void 0&&($.s.n=e),$.s=e,t.n=e,32&$.f&&t.S(e),e;if(e.i===-1)return e.i=0,e.n!==void 0&&(e.n.p=e.p,e.p!==void 0&&(e.p.n=e.n),e.p=$.s,e.n=void 0,$.s.n=e,$.s=e),e}}function U(t,e){this.v=t,this.i=0,this.n=void 0,this.t=void 0,this.l=0,this.W=e?.watched,this.Z=e?.unwatched,this.name=e?.name}U.prototype.brand=Ir;U.prototype.h=function(){return!0};U.prototype.S=function(t){var e=this,a=this.t;a!==t&&t.e===void 0&&(t.x=a,this.t=t,a!==void 0?a.e=t:za(function(){var r;(r=e.W)==null||r.call(e)}))};U.prototype.U=function(t){var e=this;if(this.t!==void 0){var a=t.e,r=t.x;a!==void 0&&(a.x=r,t.e=void 0),r!==void 0&&(r.e=a,t.x=void 0),t===this.t&&(this.t=r,r===void 0&&za(function(){var i;(i=e.Z)==null||i.call(e)}))}};U.prototype.subscribe=function(t){var e=this;return $r(function(){var a=e.value,r=$;$=void 0;try{t(a)}finally{$=r}},{name:"sub"})};U.prototype.valueOf=function(){return this.value};U.prototype.toString=function(){return this.value+""};U.prototype.toJSON=function(){return this.value};U.prototype.peek=function(){var t=$;$=void 0;try{return this.value}finally{$=t}};Object.defineProperty(U.prototype,"value",{get:function(){var t=Ua(this);return t!==void 0&&(t.i=this.i),this.v},set:function(t){if(t!==this.v){if(Ve>100)throw new Error("Cycle detected");(function(a){ce!==0&&Ve===0&&a.l!==la&&(a.l=la,Be={S:a,v:a.v,i:a.i,o:Be})})(this),this.v=t,this.i++,We++,ce++;try{for(var e=this.t;e!==void 0;e=e.x)e.t.N()}finally{Dt()}}}});function Zt(t,e){return new U(t,e)}function Ha(t){for(var e=t.s;e!==void 0;e=e.n)if(e.S.i!==e.i||!e.S.h()||e.S.i!==e.i)return!0;return!1}function Va(t){for(var e=t.s;e!==void 0;e=e.n){var a=e.S.n;if(a!==void 0&&(e.r=a),e.S.n=e,e.i=-1,e.n===void 0){t.s=e;break}}}function Ba(t){for(var e=t.s,a=void 0;e!==void 0;){var r=e.p;e.i===-1?(e.S.U(e),r!==void 0&&(r.n=e.n),e.n!==void 0&&(e.n.p=r)):a=e,e.S.n=e.r,e.r!==void 0&&(e.r=void 0),e=r}t.s=a}function _e(t,e){U.call(this,void 0),this.x=t,this.s=void 0,this.g=We-1,this.f=4,this.W=e?.watched,this.Z=e?.unwatched,this.name=e?.name}_e.prototype=new U;_e.prototype.h=function(){if(this.f&=-3,1&this.f)return!1;if((36&this.f)==32||(this.f&=-5,this.g===We))return!0;if(this.g=We,this.f|=1,this.i>0&&!Ha(this))return this.f&=-2,!0;var t=$;try{Va(this),$=this;var e=this.x();(16&this.f||this.v!==e||this.i===0)&&(this.v=e,this.f&=-17,this.i++)}catch(a){this.v=a,this.f|=16,this.i++}return $=t,Ba(this),this.f&=-2,!0};_e.prototype.S=function(t){if(this.t===void 0){this.f|=36;for(var e=this.s;e!==void 0;e=e.n)e.S.S(e)}U.prototype.S.call(this,t)};_e.prototype.U=function(t){if(this.t!==void 0&&(U.prototype.U.call(this,t),this.t===void 0)){this.f&=-33;for(var e=this.s;e!==void 0;e=e.n)e.S.U(e)}};_e.prototype.N=function(){if(!(2&this.f)){this.f|=6;for(var t=this.t;t!==void 0;t=t.x)t.t.N()}};Object.defineProperty(_e.prototype,"value",{get:function(){if(1&this.f)throw new Error("Cycle detected");var t=Ua(this);if(this.h(),t!==void 0&&(t.i=this.i),16&this.f)throw this.v;return this.v}});function Wa(t){var e=t.m;if(t.m=void 0,typeof e=="function"){ce++;var a=$;$=void 0;try{e()}catch(r){throw t.f&=-2,t.f|=8,zt(t),r}finally{$=a,Dt()}}}function zt(t){for(var e=t.s;e!==void 0;e=e.n)e.S.U(e);t.x=void 0,t.s=void 0,Wa(t)}function Rr(t){if($!==this)throw new Error("Out-of-order effect");Ba(this),$=t,this.f&=-2,8&this.f&&zt(this),Dt()}function ke(t,e){this.x=t,this.m=void 0,this.s=void 0,this.u=void 0,this.f=32,this.name=e?.name}ke.prototype.c=function(){var t=this.S();try{if(8&this.f||this.x===void 0)return;var e=this.x();typeof e=="function"&&(this.m=e)}finally{t()}};ke.prototype.S=function(){if(1&this.f)throw new Error("Cycle detected");this.f|=1,this.f&=-9,Wa(this),Va(this),ce++;var t=$;return $=this,Rr.bind(this,t)};ke.prototype.N=function(){2&this.f||(this.f|=2,this.u=Te,Te=this)};ke.prototype.d=function(){this.f|=8,1&this.f||zt(this)};ke.prototype.dispose=function(){this.d()};function $r(t,e){var a=new ke(t,e);try{a.c()}catch(i){throw a.d(),i}var r=a.d.bind(a);return r[Symbol.dispose]=r,r}async function qa(){return await we("/api/rules")}async function Lr(t){const e=new URLSearchParams;return e.set("path",t),await we(Ut("/api/rules/context",e))}async function Xa(t={}){const e=new URLSearchParams;return t.source!==void 0&&e.set("source",t.source),t.since!==void 0&&e.set("since",String(t.since)),await we(Ut("/api/ledger",e))}async function Or(){return await we("/api/doctor")}async function Ya(){return await we("/api/human-lock")}async function Pr(t){return await Ga("/api/human-lock/approve",t)}async function jr(t){return await Ga("/api/intent/annotate",t)}async function Fr(t){const e=new URLSearchParams;return t.ledgerId!==void 0&&e.set("ledger_id",t.ledgerId),t.ts!==void 0&&e.set("ts",String(t.ts)),await we(Ut("/api/history/state",e))}let ie;function Mr(t,e,a,r,i){let n=!1;const o=new AbortController;let l=!1;const c=Ht({Accept:"text/event-stream"});return e!==null&&e.length>0&&(c["Last-Event-ID"]=e),(async()=>{try{const h=await fetch(t,{headers:c,signal:o.signal});if(!h.ok||h.body===null){d(()=>{i()});return}r();const u=h.body.getReader(),g=new TextDecoder;let p="";for(;!n;){const{done:y,value:C}=await u.read();if(y)break;p+=g.decode(C,{stream:!0}),p=p.replace(/\r\n/g,`
|
|
2
|
-
`);let w;for(;(w=p.indexOf(`
|
|
3
|
-
|
|
4
|
-
`))>=0;){const x=p.slice(0,w);p=p.slice(w+2),Dr(x,a)}}}catch{}finally{n||d(()=>{i()})}})(),{close(){n=!0,o.abort()}};function d(h){l||(l=!0,h())}}function Dr(t,e){let a="message",r="",i="";for(const n of t.split(`
|
|
5
|
-
`))n.startsWith("event:")?a=n.slice(6).trim():n.startsWith("data:")?r=r.length>0?`${r}
|
|
6
|
-
${n.slice(5).trim()}`:n.slice(5).trim():n.startsWith("id:")&&(i=n.slice(3).trim());r.length>0&&e(a,r,i)}function Zr(){if(ie!==void 0)return ie;const e=window.__FABRIC_AUTH_TOKEN__;if(typeof e=="string"&&e.length>0)return ie=e,ie;const a=new URL(window.location.href),r=a.searchParams,i=r.get("token");if(i!==null&&i.length>0){r.delete("token");const n=r.toString(),o=`${a.pathname}${n.length>0?`?${n}`:""}${a.hash}`;return window.history.replaceState({},document.title,o),ie=i,ie}return ie=null,ie}function zr(t){try{const e=JSON.parse(t);return typeof e.type=="string"&&"payload"in e?e:null}catch{return null}}async function we(t){const e=await fetch(t,{headers:Ht({Accept:"application/json"})});return await Ja(e)}async function Ga(t,e){const a=await fetch(t,{method:"POST",headers:Ht({Accept:"application/json","Content-Type":"application/json"}),body:JSON.stringify(e)});return await Ja(a)}async function Ja(t){const e=await t.text(),a=e.length>0?JSON.parse(e):void 0;if(!t.ok)throw new Error(Ur(a,t.status));return a}function Ur(t,e){return t&&typeof t=="object"&&"error"in t&&typeof t.error?.message=="string"?t.error.message:`Fabric API request failed with HTTP ${e}.`}function Ut(t,e){const a=e.toString();return a.length>0?`${t}?${a}`:t}function Ht(t){const e=Zr();return e===null?t:{...t,Authorization:`Bearer ${e}`}}const Hr=["meta:updated","lock:drift","lock:approved","ledger:appended","drift:detected"],Vr=new Set(Hr),ut=Zt([]),ht=Zt(!1),pt=Zt(0),da=1e3,Br=3e4,Wr=2;function qr(){const[t,e]=R({connected:ht.value,lastEvent:ut.value[0]??null,version:pt.value}),a=Le(null),r=Le(da),i=Le(void 0),n=Le(!0);return Z(()=>{n.current=!0;const o=h=>{ht.value=h,e(u=>({...u,connected:h}))},l=(h,u,g)=>{if(!Vr.has(h))return;g.length>0&&(a.current=g);const p=zr(u);p!==null&&(ut.value=[p,...ut.value].slice(0,50),pt.value+=1,e({connected:ht.value,lastEvent:p,version:pt.value}))};let c=null;const d=()=>{n.current&&(c=Mr("/events",a.current,l,()=>{n.current&&(r.current=da,o(!0))},()=>{if(!n.current)return;o(!1);const h=r.current;r.current=Math.min(r.current*Wr,Br),i.current=setTimeout(d,h)}))};return d(),()=>{n.current=!1,clearTimeout(i.current),c?.close(),o(!1)}},[]),t}var Xr={"cli.main.description":"Fabric CLI - AI agent collaboration framework","cli.shared.created":"Created","cli.shared.skipped":"Skipped","cli.shared.next":"Next","cli.shared.reason":"Reason","cli.shared.updated":"Updated","cli.shared.missing":"missing","cli.shared.present":"present","cli.shared.absent":"missing","cli.shared.yes":"yes","cli.shared.no":"no","cli.shared.none":"none","cli.shared.loading":"loading","cli.shared.refresh":"Refresh","cli.shared.target-invalid":"Target must be an existing directory: {target}","cli.shared.template-not-found":"Template not found: {path}","cli.shared.invalid-host-empty":"Invalid host: <empty>","cli.shared.invalid-port":"Invalid port: {value}","cli.approve.description":"Approve drifted human-lock entries from the command line.","cli.approve.args.all.description":"Approve all drifted human-lock entries without prompting.","cli.approve.args.interactive.description":"Prompt before approving each drifted human-lock entry.","cli.approve.args.target.description":"Target project path, default is the current working directory.","cli.approve.no-drift":"No drift entries found.","cli.approve.prompt":"Approve this entry? [y/N] ","cli.approve.approved-one":"Approved {location}","cli.approve.skipped-one":"Skipped {location}","cli.approve.summary":"Approved {approved}/{total} drift entries. Skipped {skipped}.","cli.approve.table.expected":"Expected","cli.approve.table.current":"Current","cli.bootstrap.description":"Install Fabric bootstrap prompts for supported AI clients.","cli.bootstrap.install.description":"Copy Fabric bootstrap templates into native client locations.","cli.bootstrap.install.args.clients.description":"Optional comma-separated client filter, for example claude,cursor,codex.","cli.bootstrap.install.no-targets":"No bootstrap targets detected. Pass --clients claude,cursor,windsurf,roo,gemini,codex to install explicitly.","cli.bootstrap.install.installed":"Installed {path}","cli.bootstrap.install.skipped-header":"Skipped {path}: Fabric Bootstrap header already present.","cli.bootstrap.install.prepended":"Prepended {path}","cli.bootstrap.errors.unknown-client":'Unknown client "{client}". Use a comma-separated list such as claude,cursor,codex.',"cli.config.description":"Manage Fabric MCP client configuration.","cli.config.clients.claude":"Claude Code CLI","cli.config.install.description":"Install Fabric MCP server entries into detected client configs.","cli.config.install.args.clients.description":"Optional comma-separated client filter, for example cursor,codex,gemini.","cli.config.install.args.dry-run.description":"Preview detected write operations without modifying files.","cli.config.errors.unknown-client":'Unknown client "{client}". Use a comma-separated list such as cursor,codex,gemini.',"cli.config.errors.expected-object":"Expected object in {path}","cli.config.install.no-configs":"No Fabric MCP client config detected. Create the client directory or set clientPaths in fabric.config.json.","cli.config.install.no-config-path":"Skipping {client}: no config path detected.","cli.config.install.dry-run":"[dry-run] {client}: would write {path}","cli.config.install.wrote":"{client}: wrote {path}","cli.doctor.description":"Run Fabric doctor checks and optional compliance audit reporting.","cli.doctor.args.target.description":"Target project path. Defaults to CLI arg, EXTERNAL_FIXTURE_PATH, fabric.config.json, then cwd.","cli.doctor.args.audit.description":"Print fab_get_rules compliance violations for AI edit intents.","cli.doctor.args.fix.description":"Migrate the legacy root ledger into .fabric/.intent-ledger.jsonl when needed.","cli.doctor.args.window-minutes.description":"Audit lookback window in minutes for matching fab_get_rules calls. Default 5.","cli.doctor.errors.invalid-window":"Invalid audit window: {value}","cli.doctor.audit.preview-only":"auditMode is off in fabric.config.json; running fab doctor --audit as a manual preview only.","cli.doctor.audit.none":"No AI edit intents recorded yet for compliance audit.","cli.doctor.audit.clean":"All {count} audited edit paths have a preceding fab_get_rules call within {window}.","cli.doctor.audit.violations":"{count} audited edit paths are missing a preceding fab_get_rules call within {window}.","cli.doctor.audit.table.path":"Path","cli.doctor.audit.table.edit":"Edit time","cli.doctor.audit.table.rules":"Last rules","cli.doctor.audit.table.intent":"Intent","cli.hooks.description":"Manage Fabric Git hook templates.","cli.hooks.install.description":"Install the Fabric Husky pre-commit hook template.","cli.hooks.install.args.target.description":"Target project path, default is the current working directory.","cli.hooks.errors.package-json-required":"package.json is required to install hooks: {path}","cli.hooks.install.hook-skipped":"Fabric hook already present in {path}, skipped.","cli.hooks.install.hook-appended":"Appended Fabric hook to existing {path}","cli.hooks.install.hook-created":"Created {path}","cli.hooks.install.prepare-left":"Left existing prepare script unchanged in {path}","cli.hooks.install.prepare-added":"Added prepare script to {path}","cli.human-lint.description":"Validate locked human-edit regions.","cli.human-lint.args.target.description":"Target project path, default is the current working directory.","cli.human-lint.drift-detected":"Human-locked content drift detected. Revert the edit or update approved hashes before committing.","cli.human-lint.table.location":"Location","cli.human-lint.table.expected":"Expected","cli.human-lint.table.got":"Got","cli.init.description":"Initialize Fabric in the target project.","cli.init.args.target.description":"Target project path. Defaults to CLI arg, EXTERNAL_FIXTURE_PATH, fabric.config.json, then cwd.","cli.init.args.debug.description":"Print target resolution details to stderr.","cli.init.args.force.description":"Overwrite existing files (bypass non-destructive guard)","cli.init.args.yes.description":"Accept the current init plan and run without the TTY wizard","cli.init.args.plan.description":"Print the init plan without writing files or running follow-up stages","cli.init.args.reapply.description":"Reapply Fabric-managed files and stage installers over an existing setup","cli.init.args.no-bootstrap.description":"Compatibility flag: remove bootstrap from the init plan","cli.init.args.no-mcp.description":"Compatibility flag: remove MCP configuration from the init plan","cli.init.args.no-hooks.description":"Compatibility flag: remove git hooks from the init plan","cli.init.args.interactive.description":"Compatibility flag: disable the TTY wizard and use direct execution","cli.init.mcp.install.global":"Using globally-installed @fenglimg/fabric-server","cli.init.mcp.install.local":"Installing @fenglimg/fabric-server to project devDependencies","cli.init.mcp.install.prompt":"MCP server install scope (global|local)","cli.init.mcp.install.invalid":'Invalid --mcp-install value "{value}" — falling back to global',"cli.init.mcp.local.installing":"Running {manager} add -D @fenglimg/fabric-server...","cli.init.mcp.local.installed":"Installed to devDependencies","cli.init.created-path":"{label} {path}","cli.init.skipped-existing-path":"{label} {path}: already exists.","cli.init.force.overwritten":"Overwritten","cli.init.force.warning":"--force will overwrite existing Fabric artifacts in {path}","cli.init.stages.bootstrap":"Installing bootstrap templates...","cli.init.stages.mcp":"Configuring MCP clients...","cli.init.stages.hooks":"Installing git hooks...","cli.init.stages.skipped":"skipped","cli.init.stages.completed":"completed","cli.init.stages.failed":"failed","cli.init.stages.summary.ran":"ran","cli.init.stages.summary.skipped":"skipped","cli.init.stages.summary.failed":"failed","cli.init.next-step":"{label} {message}","cli.init.reason-message":"{label} {message}","cli.init.plan.title":"Fabric init plan","cli.init.plan.mode-banner.default":"[mode: apply] Standard init execution","cli.init.plan.mode-banner.plan":"[mode: plan] Dry run only, no files will be written","cli.init.plan.mode-banner.reapply":"[mode: reapply] Force reapplying Fabric-managed assets","cli.init.plan.mode-banner.plan-reapply":"[mode: plan+reapply] Previewing a forced reapply without writing files","cli.init.plan.target":"Target: {target}","cli.init.plan.actions":"Plan: bootstrap={bootstrap} mcp={mcp} hooks={hooks} mcp-install={mcpInstall}","cli.init.plan.detected":"Detected clients: {clients}","cli.init.plan.writes":"Core writes:","cli.init.plan.preview-title":"Fabric init dry run","cli.init.plan.preview-result":"Mode={mode} bootstrap={bootstrap} mcp={mcp} hooks={hooks}","cli.init.mode.default":"default","cli.init.mode.reapply":"reapply","cli.init.mode.badge.default":"APPLY","cli.init.mode.badge.plan":"PLAN","cli.init.mode.badge.reapply":"REAPPLY","cli.init.mode.badge.plan-reapply":"PLAN + REAPPLY","cli.init.compat.plan":"Using standard --plan mode: no files will be written.","cli.init.compat.interactive":"Compatibility: --interactive=false disables the TTY wizard.","cli.init.compat.legacy-stage-flags":"Compatibility: legacy --no-* flags are being mapped into the init plan.","cli.init.wizard.title":"Fabric init wizard","cli.init.wizard.intro":"Fabric init","cli.init.wizard.overview.title":"Install overview","cli.init.wizard.overview.body":`Target: {target}
|
|
7
|
-
Mode: {mode}
|
|
8
|
-
This wizard only reshapes the init plan; execution still runs through the existing Fabric init stages.`,"cli.init.wizard.step.target":"Confirm target","cli.init.wizard.step.plan":"Shape init plan","cli.init.wizard.step.review":"Review final plan","cli.init.wizard.target.confirm":"Continue initializing Fabric in {target}? [Y/n]","cli.init.wizard.stage.bootstrap":"Install bootstrap templates? [{defaultValue}]","cli.init.wizard.stage.mcp":"Configure MCP clients? [{defaultValue}]","cli.init.wizard.stage.hooks":"Install git hooks? [{defaultValue}]","cli.init.wizard.mcp-install":"MCP server install scope (global/local) [{defaultValue}]","cli.init.wizard.execute.confirm":"Execute this init plan now? [Y/n]","cli.init.wizard.outro":"Init plan accepted. Running Fabric init...","cli.init.wizard.invalid-yes-no":"Please answer yes or no.","cli.init.wizard.invalid-select":"Invalid value. Use one of: {options}.","cli.init.wizard.cancelled":"Fabric init cancelled before execution.","cli.init.capabilities.title":"Client capability summary","cli.init.capabilities.none":"No supported client was detected for bootstrap or MCP follow-up.","cli.init.capabilities.header.client":"Client","cli.init.capabilities.header.bootstrap":"Bootstrap","cli.init.capabilities.header.mcp":"MCP","cli.init.capabilities.header.hook":"Hook","cli.init.capabilities.header.skill":"Skill","cli.init.capabilities.header.follow-up":"Follow-up","cli.init.capabilities.status.ready":"ready","cli.init.capabilities.status.installed":"installed","cli.init.capabilities.status.supported":"supported","cli.init.capabilities.status.manual":"manual","cli.init.capabilities.status.skipped":"skipped","cli.init.capabilities.status.failed":"failed","cli.init.capabilities.status.na":"n/a","cli.init.capabilities.follow-up.ready":"continue in client","cli.init.capabilities.follow-up.install":"install client assets","cli.init.capabilities.follow-up.manual":"manual step required","cli.init.next-step.message":"run fab hooks install to add the Day 4 pre-commit pipeline.","cli.init.reason-message.claude-body":".fabric/forensic.json is ready; use the agents-md-init skill to finish internal Fabric initialization.","cli.init.reason-message.codex-body":".fabric/forensic.json is ready; continue with the repo skill at .agents/skills/fabric-init/SKILL.md and enable features.codex_hooks = true for Codex hooks.","cli.init.reason-message.multi-body":".fabric/forensic.json is ready; continue in your installed client flow: Claude can use agents-md-init, and Codex can use .agents/skills/fabric-init/SKILL.md with features.codex_hooks = true.","cli.init.reason-message.installable-body":".fabric/forensic.json is ready; some detected clients support Fabric follow-up but still need client assets installed.","cli.init.reason-message.manual-body":".fabric/forensic.json is ready; some detected clients still need manual follow-up because no Fabric skill is installed for them yet.","cli.init.codex-hooks.created":"{label} {path} with Codex hooks config (requires features.codex_hooks = true).","cli.init.codex-hooks.updated":"{label} {path} with Codex hooks config (requires features.codex_hooks = true).","cli.init.codex-hooks.skipped":"{label} {path}: Codex hooks config already present.","cli.init.claude-settings.created":"{label} {path} with Claude Stop hook.","cli.init.claude-settings.updated":"{label} {path} with Claude Stop hook.","cli.init.claude-settings.skipped":"{label} {path}: Claude Stop hook already present.","cli.init.claude-settings.skipped-invalid":"{label} {path}: unable to merge Claude Stop hook.","cli.init.claude-settings.invalid-object":"{label} {path}: expected a JSON object.","cli.init.claude-settings.invalid-json":"{label} {path}: invalid JSON ({reason}).","cli.init.claude-settings.invalid-hooks":'{label} {path}: "hooks" must be a JSON object.',"cli.init.claude-settings.invalid-stop-array":'{label} {path}: "hooks.Stop" must be an array.',"cli.init.errors.abort-existing":"ABORT: {path} already exists. fab init is non-destructive.","cli.ledger-append.description":"Append an entry to the Fabric intent ledger.","cli.ledger-append.args.target.description":"Target project path, default is the current working directory.","cli.ledger-append.args.staged.description":"Derive the entry from staged changes (used during pre-commit).","cli.ledger-append.requires-staged":"requires --staged in pre-commit context","cli.ledger-append.intent.auto":"auto: {head}{suffix}","cli.ledger-append.intent.auto-more":" +{count} more","cli.pre-commit.description":"Composite pre-commit hook: runs sync-meta --check-only, human-lint, and ledger-append --staged in one Node process.","cli.pre-commit.args.target.description":"Project root directory, defaults to cwd or EXTERNAL_FIXTURE_PATH.","cli.pre-commit.run-failed":"fabric pre-commit: {name} failed - {message}","cli.scan.description":"Scan the project to detect Fabric bootstrap candidates.","cli.scan.args.target.description":"Target absolute path. Defaults to CLI arg, EXTERNAL_FIXTURE_PATH, fabric.config.json, then cwd.","cli.scan.args.debug.description":"Print detection evidence in formatted output.","cli.scan.args.json.description":"Print the diagnostic report as JSON.","cli.scan.report.title":"Fabric scan report","cli.scan.report.target":"Target","cli.scan.report.framework":"Framework","cli.scan.report.evidence":"Evidence","cli.scan.report.readme-quality":"README quality","cli.scan.report.contributing":"CONTRIBUTING.md","cli.scan.report.files-counted":"Files counted","cli.scan.report.ignored-entries":"Ignored entries","cli.scan.report.existing-fabric":"Existing Fabric files","cli.scan.report.recommendations":"Recommendations:","cli.scan.readme-quality.ok":"ok","cli.scan.readme-quality.stub":"stub","cli.scan.recommendation.init":"L0: Run fab init to scaffold .fabric/bootstrap/README.md with TODO markers.","cli.scan.recommendation.readme":"L0: Expand README.md before promoting project facts into Fabric references.","cli.scan.recommendation.contributing":"L0: Add CONTRIBUTING.md or leave a bootstrap TODO reference for contribution flow.","cli.scan.recommendation.unknown-framework":"L1: Add tech-stack TODOs manually because no framework marker was detected.","cli.scan.recommendation.framework-dirs":"L1: Review {framework} directories for future scoped Fabric rule files.","cli.serve.description":"Start the local Fabric MCP HTTP service. Set FABRIC_AUTH_TOKEN to enable Bearer auth for non-localhost binding.","cli.serve.args.port.description":"Listen port, default 7373.","cli.serve.args.host.description":"Listen host, default 127.0.0.1. Set FABRIC_AUTH_TOKEN to enable Bearer auth for non-localhost binding.","cli.serve.args.target.description":"Target project path. Defaults to CLI arg, EXTERNAL_FIXTURE_PATH, fabric.config.json, then cwd.","cli.serve.args.debug.description":"Print target resolution details to stderr.","cli.serve.ready.title":"Fabric Dashboard","cli.serve.warning.host-fallback":"--host {host} requires FABRIC_AUTH_TOKEN; falling back to 127.0.0.1 for safety","cli.serve.error.port-in-use":"Port {port} in use - try --port {nextPort}","cli.update.description":"Refresh MCP host configuration and git hooks without re-creating Fabric files.","cli.update.args.target.description":"Target project path. Defaults to CLI arg, EXTERNAL_FIXTURE_PATH, fabric.config.json, then cwd.","cli.update.args.no-mcp.description":"Skip re-configuring MCP clients","cli.update.args.no-hooks.description":"Skip re-installing git hooks","cli.sync-meta.description":"Sync Fabric metadata from internal rule files.","cli.sync-meta.args.target.description":"Target project path, default is the current working directory.","cli.sync-meta.args.check-only.description":"Exit with code 1 when .fabric/agents.meta.json is out of date.","cli.sync-meta.drift-detected":"Fabric metadata drift detected. Run fab sync-meta to update.","cli.sync-meta.updated":"{label} {path}","dashboard.app.nav.aria-label":"Dashboard views","dashboard.app.nav.module-a.label":"Rule Topology","dashboard.app.nav.module-a.label-bilingual":"规则命中 Rule Topology","dashboard.app.nav.module-a.subtitle":"coverage + hit reasons","dashboard.app.nav.module-b.label":"Cognitive Forensic","dashboard.app.nav.module-b.label-bilingual":"认知扫描 Cognitive Forensic","dashboard.app.nav.module-b.subtitle":"placeholder","dashboard.app.nav.module-c.label":"Semantic Timeline","dashboard.app.nav.module-c.label-bilingual":"语义时间线 Semantic Timeline","dashboard.app.nav.module-c.subtitle":"placeholder","dashboard.app.nav.module-d.label":"Historical Ledger","dashboard.app.nav.module-d.label-bilingual":"历史记录 Historical Ledger","dashboard.app.nav.module-d.subtitle":"placeholder","dashboard.app.nav.rules.label":"Rules Tree","dashboard.app.nav.rules.label-bilingual":"规则树 Rules Tree","dashboard.app.nav.rules.subtitle":"rule structure","dashboard.app.nav.locks.label":"Human Lock","dashboard.app.nav.locks.label-bilingual":"人工保护 Human Lock","dashboard.app.nav.locks.subtitle":"protected regions","dashboard.app.nav.timeline.label":"Intent Timeline","dashboard.app.nav.timeline.label-bilingual":"意图时间线 Intent Timeline","dashboard.app.nav.timeline.subtitle":"change log","dashboard.app.nav.history.label":"History Replay","dashboard.app.nav.history.label-bilingual":"历史回放 History Replay","dashboard.app.nav.history.subtitle":"time travel","dashboard.app.nav.doctor.label":"Doctor","dashboard.app.nav.doctor.label-bilingual":"诊断台 Doctor","dashboard.app.nav.doctor.subtitle":"health checks","dashboard.app.nav.section.modules-status":"Module Status","dashboard.app.nav.section.diagnostics":"Diagnostics","dashboard.app.nav.drift-check":"Drift Check","dashboard.app.nav.modules.read-only":"read-only dashboard","dashboard.app.header.connected":"CONNECTED","dashboard.app.header.connecting":"CONNECTING","dashboard.app.live-region.received":"Received {type}","dashboard.app.breadcrumb.topology":"rule-topology","dashboard.app.breadcrumb.forensic":"cognitive-forensic","dashboard.app.breadcrumb.semantic":"semantic-timeline","dashboard.app.breadcrumb.ledger":"historical-ledger","dashboard.app.breadcrumb.rules":"rules-tree","dashboard.app.breadcrumb.locks":"human-lock","dashboard.app.breadcrumb.timeline":"intent-timeline","dashboard.app.breadcrumb.history":"history-replay","dashboard.app.breadcrumb.doctor":"doctor","dashboard.rule-topology.title":"Rule Topology","dashboard.rule-topology.subtitle":"See which rules match the current path and why","dashboard.rule-topology.path.placeholder":"Sample path for rules context","dashboard.rule-topology.path.aria-label":"Rules context sample path","dashboard.rule-topology.status.sample":"current path {path}","dashboard.rule-topology.status.hits":"{count} hits","dashboard.rule-topology.status.revision":"version {revision}","dashboard.rule-topology.heatmap.title":"Coverage Heatmap","dashboard.rule-topology.heatmap.subtitle":"Heuristic directory coverage derived from scope_glob patterns","dashboard.rule-topology.heatmap.aria-label":"Directory coverage heatmap","dashboard.rule-topology.heatmap.count":"{count} directories","dashboard.rule-topology.heatmap.rules":"{count} rules","dashboard.rule-topology.heatmap.uncovered":"no matching scope","dashboard.rule-topology.heatmap.empty":"No rule directories available.","dashboard.rule-topology.heatmap.density.full":"covered","dashboard.rule-topology.heatmap.density.partial":"partial","dashboard.rule-topology.heatmap.density.none":"uncovered","dashboard.rule-topology.hit-reason.title":"Hit Reasons","dashboard.rule-topology.hit-reason.subtitle":"Why each rule was loaded for the current sample path","dashboard.rule-topology.hit-reason.aria-label":"Rule hit reasons","dashboard.rule-topology.hit-reason.count":"{count} reasons","dashboard.rule-topology.hit-reason.empty":"No rules loaded for this sample path.","dashboard.rule-topology.hit-reason.global":"Global","dashboard.rule-topology.hit-reason.tier.always":"Always-on","dashboard.rule-topology.hit-reason.tier.path":"Glob","dashboard.rule-topology.hit-reason.tier.description":"Description","dashboard.module-placeholder.coming-soon":"Reserved","dashboard.module-placeholder.read-only":"Reserved for future read-only dashboard capabilities.","dashboard.module-placeholder.forensic.title":"Cognitive Forensic","dashboard.module-placeholder.forensic.subtitle":"Coming later","dashboard.module-placeholder.semantic.title":"Semantic Timeline","dashboard.module-placeholder.semantic.subtitle":"Coming later","dashboard.module-placeholder.ledger.title":"Historical Ledger","dashboard.module-placeholder.ledger.subtitle":"Coming later","dashboard.rules-tree.title":"Rules Tree","dashboard.rules-tree.subtitle":"Browse the rule structure, hierarchy, and sync state from .fabric/agents.meta.json","dashboard.rules-tree.filter.placeholder":"Filter by file, glob, priority, hash...","dashboard.rules-tree.filter.aria-label":"Filter rules tree","dashboard.rules-tree.status.loading":"loading rules","dashboard.rules-tree.status.nodes":"{count} nodes · version {revision}","dashboard.rules-tree.status.locks":"{count} protected regions","dashboard.rules-tree.empty":"No matching rules found.","dashboard.rules-tree.tree.aria-label":"Fabric rules tree","dashboard.rules-tree.detail.title":"Node Detail","dashboard.rules-tree.detail.empty":"Select a rule node to inspect scope, dependencies, priority and hash.","dashboard.rules-tree.detail.file":"file","dashboard.rules-tree.detail.scope":"scope","dashboard.rules-tree.detail.priority":"priority","dashboard.rules-tree.detail.hash":"hash","dashboard.rules-tree.detail.no-deps":"no deps","dashboard.human-lock.title":"Human Protection","dashboard.human-lock.subtitle":"Review protected regions that require human confirmation","dashboard.human-lock.filters.aria-label":"Human lock filters","dashboard.human-lock.filters.all":"all","dashboard.human-lock.filters.drift":"drift","dashboard.human-lock.filters.approved":"approved","dashboard.human-lock.summary":"{drift} drift · {approved} confirmed","dashboard.human-lock.empty":"No human lock entries for this filter.","dashboard.intent-timeline.title":"Intent Timeline","dashboard.intent-timeline.subtitle":"Review AI and human change records in reverse chronological order","dashboard.intent-timeline.filter.label":"Source","dashboard.intent-timeline.filter.all":"All","dashboard.intent-timeline.summary":"AI {aiCount} · Human {humanCount}","dashboard.intent-timeline.columns.ai.title":"AI","dashboard.intent-timeline.columns.ai.entries":"{count} entries","dashboard.intent-timeline.columns.human.title":"Human","dashboard.intent-timeline.columns.human.entries":"{count} entries","dashboard.intent-timeline.empty":"No ledger entries found.","dashboard.intent-timeline.annotate.missing-id":"Cannot annotate a ledger entry without an id.","dashboard.history-replay.title":"History Replay","dashboard.history-replay.subtitle":"Review the rules tree state at any recorded point in history","dashboard.history-replay.toolbar.scrub":"Scrub","dashboard.history-replay.toolbar.latest":"Latest","dashboard.history-replay.selected.none":"No historical entry selected","dashboard.history-replay.status.replay-points":"{count} replay points","dashboard.history-replay.status.entries-applied":"{count} entries applied","dashboard.history-replay.empty.entries":"No ledger entries found for replay.","dashboard.history-replay.state.title":"Viewing state as of {label}","dashboard.history-replay.state.meta":"record {ledgerId} · commit {commit} · {mode}","dashboard.history-replay.status.loading":"loading snapshot","dashboard.history-replay.status.nodes":"{count} nodes","dashboard.history-replay.status.unknown-revision":"unknown version","dashboard.history-replay.tree.aria-label":"Historical Fabric rules tree","dashboard.history-replay.empty.loading":"Loading historical snapshot...","dashboard.history-replay.empty.select":"Select a timeline entry to replay its state.","dashboard.history-replay.meta.not-available":"unavailable","dashboard.history-replay.meta.pending":"pending","dashboard.history-replay.meta.na":"n/a","dashboard.doctor.title":"Doctor Console","dashboard.doctor.subtitle":"Check framework, entry points, version drift, and protected paths","dashboard.doctor.toolbar.overall":"Overall","dashboard.doctor.toolbar.no-summary":"No summary yet","dashboard.doctor.toolbar.entry-points-summary":"{framework} · {count} entry points","dashboard.doctor.toolbar.entry-point-summary":"{framework} · {count} entry point","dashboard.doctor.empty.loading":"Loading doctor report...","dashboard.doctor.summary.framework":"Framework","dashboard.doctor.summary.protected-paths":"Protected paths","dashboard.doctor.summary.intent-ledger":"Intent ledger","dashboard.doctor.summary.no-meta-revision":"No metadata version yet","dashboard.doctor.summary.tracked-paths.none":"No tracked paths","dashboard.doctor.summary.tracked-paths.some":"{count} tracked","dashboard.doctor.summary.hashes-intact":"All approved hashes intact","dashboard.doctor.summary.drifted":"{count} drifted","dashboard.doctor.summary.no-ledger-entries":"No ledger entries yet","dashboard.doctor.card.entry-points":"Entry points","dashboard.doctor.card.checks":"Checks","dashboard.doctor.empty.entry-points":"No current entry points detected.","dashboard.doctor.framework.unknown":"unknown","dashboard.doctor.age.none":"No entries","dashboard.doctor.age.seconds":"{count}s ago","dashboard.doctor.age.minutes":"{count}m ago","dashboard.doctor.age.hours":"{count}h ago","dashboard.doctor.age.days":"{count}d ago","dashboard.doctor.age.weeks":"{count}w ago","dashboard.shared.refresh":"Refresh","dashboard.shared.loading":"loading","dashboard.shared.status.ok":"ok","dashboard.shared.status.warn":"warn","dashboard.shared.status.error":"error","dashboard.shared.status.confirmed":"confirmed","dashboard.shared.status.hash-drift":"hash drift","dashboard.shared.status.stale":"stale","dashboard.shared.status.orphan":"orphan","dashboard.shared.status.attention":"attention","dashboard.source.ai":"AI","dashboard.source.human":"Human","dashboard.timeline-entry.aria-label":"{source} intent {intent}","dashboard.timeline-entry.working-tree":"working tree","dashboard.timeline-entry.parent":"parent {parent}","dashboard.timeline-entry.paths":"paths","dashboard.timeline-entry.annotate":"Annotate","dashboard.timeline-entry.annotation-label":"Human annotation","dashboard.timeline-entry.annotation-placeholder":"Explain review outcome or approval context...","dashboard.timeline-entry.annotation-save":"Save annotation","dashboard.tree-node.locked":"locked","dashboard.tree-node.stale.hash-mismatch":"hash mismatch","dashboard.tree-node.stale.orphan":"orphan","dashboard.lock-card.aria-label":"{file} {lineRange} {status}","dashboard.lock-card.status.drift":"hash drift","dashboard.lock-card.status.confirmed":"confirmed","dashboard.lock-card.hash.locked":"locked hash","dashboard.lock-card.hash.current":"current hash","dashboard.lock-card.hash.diff":"diff","dashboard.lock-card.preview.drift":"DRIFT","dashboard.lock-card.preview.sync":"SYNC","dashboard.lock-card.preview.drift-detail":"Hash differs from protected region.","dashboard.lock-card.preview.sync-detail":"Protected region is in sync.","dashboard.lock-card.footer.region":"protected region · {count} lines","dashboard.lock-card.button.approve":"Approve new hash","dashboard.lock-card.button.confirmed":"Confirmed","dashboard.lock-card.diff.hash-mismatch":"hash mismatch","dashboard.lock-card.diff.no-changes":"no changes","dashboard.lock-card.diff.with-bytes":"+{added} / -{removed} · {bytes} bytes","dashboard.lock-card.diff.without-bytes":"+{added} / -{removed}","dashboard.approve-button.retry":"Retry"},Yr={"cli.main.description":"Fabric CLI - AI 智能体协作框架","cli.shared.created":"已创建","cli.shared.skipped":"已跳过","cli.shared.next":"下一步","cli.shared.reason":"原因","cli.shared.updated":"已更新","cli.shared.missing":"缺失","cli.shared.present":"存在","cli.shared.absent":"缺失","cli.shared.yes":"是","cli.shared.no":"否","cli.shared.none":"无","cli.shared.loading":"加载中","cli.shared.refresh":"刷新","cli.shared.target-invalid":"目标必须是已存在的目录:{target}","cli.shared.template-not-found":"未找到模板:{path}","cli.shared.invalid-host-empty":"无效 host:<empty>","cli.shared.invalid-port":"无效端口:{value}","cli.approve.description":"从命令行批准已漂移的 human-lock 记录。","cli.approve.args.all.description":"不提示,批准所有已漂移的 human-lock 记录。","cli.approve.args.interactive.description":"逐条提示后批准已漂移的 human-lock 记录。","cli.approve.args.target.description":"目标项目路径,默认为当前工作目录。","cli.approve.no-drift":"未发现漂移记录。","cli.approve.prompt":"批准此记录?[y/N] ","cli.approve.approved-one":"已批准 {location}","cli.approve.skipped-one":"已跳过 {location}","cli.approve.summary":"已批准 {approved}/{total} 条漂移记录。已跳过 {skipped} 条。","cli.approve.table.expected":"预期","cli.approve.table.current":"当前","cli.bootstrap.description":"为支持的 AI 客户端安装 Fabric 引导提示模板。","cli.bootstrap.install.description":"将 Fabric 引导模板复制到各客户端的原生位置。","cli.bootstrap.install.args.clients.description":"可选的逗号分隔客户端过滤器,例如 claude,cursor,codex。","cli.bootstrap.install.no-targets":"未检测到可安装的 bootstrap 目标。可显式传入 --clients claude,cursor,windsurf,roo,gemini,codex。","cli.bootstrap.install.installed":"已安装 {path}","cli.bootstrap.install.skipped-header":"已跳过 {path}:Fabric Bootstrap 头部已存在。","cli.bootstrap.install.prepended":"已前置写入 {path}","cli.bootstrap.errors.unknown-client":"未知客户端“{client}”。请使用逗号分隔列表,例如 claude,cursor,codex。","cli.config.description":"管理 Fabric MCP 客户端配置。","cli.config.clients.claude":"Claude Code CLI","cli.config.install.description":"将 Fabric MCP 服务端条目安装到检测到的客户端配置中。","cli.config.install.args.clients.description":"可选的逗号分隔客户端过滤器,例如 cursor,codex,gemini。","cli.config.install.args.dry-run.description":"仅预览将要发生的写入操作,不修改文件。","cli.config.errors.unknown-client":"未知客户端“{client}”。请使用逗号分隔列表,例如 cursor,codex,gemini。","cli.config.errors.expected-object":"{path} 中应为对象。","cli.config.install.no-configs":"未检测到 Fabric MCP 客户端配置。请创建客户端目录,或在 fabric.config.json 中设置 clientPaths。","cli.config.install.no-config-path":"跳过 {client}:未检测到配置路径。","cli.config.install.dry-run":"[dry-run] {client}:将写入 {path}","cli.config.install.wrote":"{client}:已写入 {path}","cli.doctor.description":"运行 Fabric doctor 检查,并可选输出合规审计报告。","cli.doctor.args.target.description":"目标项目路径。默认依次使用 CLI 参数、EXTERNAL_FIXTURE_PATH、fabric.config.json、当前目录。","cli.doctor.args.audit.description":"输出 AI 编辑意图缺少 fab_get_rules 前置调用的违规项。","cli.doctor.args.fix.description":"需要时将旧的根目录 ledger 迁移到 .fabric/.intent-ledger.jsonl。","cli.doctor.args.window-minutes.description":"匹配 fab_get_rules 调用的回看时间窗口,单位为分钟。默认 5 分钟。","cli.doctor.errors.invalid-window":"无效的审计时间窗口:{value}","cli.doctor.audit.preview-only":"fabric.config.json 中 auditMode 为 off;当前 fab doctor --audit 仅执行手动预览,不会改变退出码。","cli.doctor.audit.none":"当前还没有可用于合规审计的 AI 编辑意图记录。","cli.doctor.audit.clean":"已审计的 {count} 个编辑路径都在 {window} 内存在前置 fab_get_rules 调用。","cli.doctor.audit.violations":"有 {count} 个已审计编辑路径在 {window} 内缺少前置 fab_get_rules 调用。","cli.doctor.audit.table.path":"路径","cli.doctor.audit.table.edit":"编辑时间","cli.doctor.audit.table.rules":"最近规则调用","cli.doctor.audit.table.intent":"意图","cli.hooks.description":"管理 Fabric Git 钩子模板。","cli.hooks.install.description":"安装 Fabric Husky pre-commit 钩子模板。","cli.hooks.install.args.target.description":"目标项目路径,默认为当前工作目录。","cli.hooks.errors.package-json-required":"安装 hooks 需要 package.json:{path}","cli.hooks.install.hook-skipped":"{path} 中已存在 Fabric hook,已跳过。","cli.hooks.install.hook-appended":"已向现有 {path} 追加 Fabric hook","cli.hooks.install.hook-created":"已创建 {path}","cli.hooks.install.prepare-left":"保留 {path} 中原有的 prepare 脚本不变","cli.hooks.install.prepare-added":"已向 {path} 添加 prepare 脚本","cli.human-lint.description":"验证锁定的人工编辑区块。","cli.human-lint.args.target.description":"目标项目路径,默认为当前工作目录。","cli.human-lint.drift-detected":"检测到 human-lock 内容漂移。请回退编辑,或在提交前更新已批准的哈希。","cli.human-lint.table.location":"位置","cli.human-lint.table.expected":"预期","cli.human-lint.table.got":"实际","cli.init.description":"在目标项目中初始化 Fabric。","cli.init.args.target.description":"目标项目路径。默认依次使用 CLI 参数、EXTERNAL_FIXTURE_PATH、fabric.config.json、当前目录。","cli.init.args.debug.description":"将目标解析细节输出到 stderr。","cli.init.args.force.description":"覆盖现有文件(绕过非破坏性保护)","cli.init.args.yes.description":"接受当前初始化计划并跳过 TTY 向导直接执行","cli.init.args.plan.description":"仅输出初始化计划,不写文件也不执行后续阶段","cli.init.args.reapply.description":"在已有 setup 上重新应用 Fabric 管理的文件和阶段安装器","cli.init.args.no-bootstrap.description":"兼容标志:从初始化计划中移除 bootstrap","cli.init.args.no-mcp.description":"兼容标志:从初始化计划中移除 MCP 配置","cli.init.args.no-hooks.description":"兼容标志:从初始化计划中移除 git hooks","cli.init.args.interactive.description":"兼容标志:禁用 TTY 向导并直接执行","cli.init.mcp.install.global":"使用全局安装的 @fenglimg/fabric-server","cli.init.mcp.install.local":"将 @fenglimg/fabric-server 安装到项目 devDependencies","cli.init.mcp.install.prompt":"MCP 服务端安装范围(global|local)","cli.init.mcp.install.invalid":"无效的 --mcp-install 值“{value}”,将回退到 global","cli.init.mcp.local.installing":"正在运行 {manager} add -D @fenglimg/fabric-server...","cli.init.mcp.local.installed":"已安装到 devDependencies","cli.init.created-path":"{label} {path}","cli.init.skipped-existing-path":"{label} {path}:已存在。","cli.init.force.overwritten":"已覆盖","cli.init.force.warning":"--force 将覆盖 {path} 中现有的 Fabric 产物","cli.init.stages.bootstrap":"正在安装 bootstrap 模板...","cli.init.stages.mcp":"正在配置 MCP 客户端...","cli.init.stages.hooks":"正在安装 git hooks...","cli.init.stages.skipped":"已跳过","cli.init.stages.completed":"已完成","cli.init.stages.failed":"失败","cli.init.stages.summary.ran":"已执行","cli.init.stages.summary.skipped":"已跳过","cli.init.stages.summary.failed":"失败","cli.init.next-step":"{label} {message}","cli.init.reason-message":"{label} {message}","cli.init.plan.title":"Fabric 初始化计划","cli.init.plan.mode-banner.default":"[mode: apply] 标准初始化执行","cli.init.plan.mode-banner.plan":"[mode: plan] 仅预览,不会写入文件","cli.init.plan.mode-banner.reapply":"[mode: reapply] 将强制重新应用 Fabric 管理资产","cli.init.plan.mode-banner.plan-reapply":"[mode: plan+reapply] 正在预览一次强制 reapply,不会写入文件","cli.init.plan.target":"目标:{target}","cli.init.plan.actions":"计划:bootstrap={bootstrap} mcp={mcp} hooks={hooks} mcp-install={mcpInstall}","cli.init.plan.detected":"检测到的客户端:{clients}","cli.init.plan.writes":"核心写入:","cli.init.plan.preview-title":"Fabric 初始化 dry run","cli.init.plan.preview-result":"模式={mode} bootstrap={bootstrap} mcp={mcp} hooks={hooks}","cli.init.mode.default":"default","cli.init.mode.reapply":"reapply","cli.init.mode.badge.default":"APPLY","cli.init.mode.badge.plan":"PLAN","cli.init.mode.badge.reapply":"REAPPLY","cli.init.mode.badge.plan-reapply":"PLAN + REAPPLY","cli.init.compat.plan":"已启用标准 --plan 模式:不会写入任何文件。","cli.init.compat.interactive":"兼容提示:--interactive=false 会禁用 TTY 向导。","cli.init.compat.legacy-stage-flags":"兼容提示:旧的 --no-* 标志正在映射到初始化计划中。","cli.init.wizard.title":"Fabric 初始化向导","cli.init.wizard.intro":"Fabric init","cli.init.wizard.overview.title":"安装概览","cli.init.wizard.overview.body":`目标:{target}
|
|
9
|
-
模式:{mode}
|
|
10
|
-
这个向导只负责调整初始化计划;真正执行仍然走现有的 Fabric init 阶段。`,"cli.init.wizard.step.target":"确认目标","cli.init.wizard.step.plan":"配置初始化计划","cli.init.wizard.step.review":"复核最终计划","cli.init.wizard.target.confirm":"确认在 {target} 中继续初始化 Fabric?[Y/n]","cli.init.wizard.stage.bootstrap":"是否安装 bootstrap 模板?[{defaultValue}]","cli.init.wizard.stage.mcp":"是否配置 MCP 客户端?[{defaultValue}]","cli.init.wizard.stage.hooks":"是否安装 git hooks?[{defaultValue}]","cli.init.wizard.mcp-install":"MCP 服务端安装范围(global/local)[{defaultValue}]","cli.init.wizard.execute.confirm":"现在执行该初始化计划?[Y/n]","cli.init.wizard.outro":"初始化计划已确认,开始执行 Fabric init...","cli.init.wizard.invalid-yes-no":"请输入 yes 或 no。","cli.init.wizard.invalid-select":"无效输入。可选值:{options}。","cli.init.wizard.cancelled":"Fabric 初始化已在执行前取消。","cli.init.capabilities.title":"客户端能力摘要","cli.init.capabilities.none":"没有检测到可用于 bootstrap 或 MCP 后续接力的受支持客户端。","cli.init.capabilities.header.client":"客户端","cli.init.capabilities.header.bootstrap":"Bootstrap","cli.init.capabilities.header.mcp":"MCP","cli.init.capabilities.header.hook":"Hook","cli.init.capabilities.header.skill":"Skill","cli.init.capabilities.header.follow-up":"后续动作","cli.init.capabilities.status.ready":"已就绪","cli.init.capabilities.status.installed":"已安装","cli.init.capabilities.status.supported":"已支持","cli.init.capabilities.status.manual":"手动处理","cli.init.capabilities.status.skipped":"已跳过","cli.init.capabilities.status.failed":"失败","cli.init.capabilities.status.na":"不适用","cli.init.capabilities.follow-up.ready":"可在客户端继续","cli.init.capabilities.follow-up.install":"安装客户端资产","cli.init.capabilities.follow-up.manual":"需要手动后续处理","cli.init.next-step.message":"运行 fab hooks install 以添加第 4 天的 pre-commit 流水线。","cli.init.reason-message.claude-body":".fabric/forensic.json 已就绪;请使用 agents-md-init skill 完成 Fabric 内部初始化。","cli.init.reason-message.codex-body":".fabric/forensic.json 已就绪;请继续使用仓库内的 .agents/skills/fabric-init/SKILL.md,并为 Codex hooks 启用 features.codex_hooks = true。","cli.init.reason-message.multi-body":".fabric/forensic.json 已就绪;请按已安装客户端继续后续流程:Claude 使用 agents-md-init,Codex 使用 .agents/skills/fabric-init/SKILL.md,并启用 features.codex_hooks = true。","cli.init.reason-message.installable-body":".fabric/forensic.json 已就绪;部分已检测到的客户端已支持 Fabric 后续接力,但仍需安装客户端资产。","cli.init.reason-message.manual-body":".fabric/forensic.json 已就绪;部分已检测到的客户端尚未安装 Fabric skill,需要手动完成后续初始化。","cli.init.codex-hooks.created":"{label} {path},并写入 Codex hooks 配置(需启用 features.codex_hooks = true)。","cli.init.codex-hooks.updated":"{label} {path},并写入 Codex hooks 配置(需启用 features.codex_hooks = true)。","cli.init.codex-hooks.skipped":"{label} {path}:Codex hooks 配置已存在。","cli.init.claude-settings.created":"{label} {path},并写入 Claude Stop hook。","cli.init.claude-settings.updated":"{label} {path},并写入 Claude Stop hook。","cli.init.claude-settings.skipped":"{label} {path}:Claude Stop hook 已存在。","cli.init.claude-settings.skipped-invalid":"{label} {path}:无法合并 Claude Stop hook。","cli.init.claude-settings.invalid-object":"{label} {path}:预期为 JSON 对象。","cli.init.claude-settings.invalid-json":"{label} {path}:JSON 无效({reason})。","cli.init.claude-settings.invalid-hooks":'{label} {path}:"hooks" 必须是 JSON 对象。',"cli.init.claude-settings.invalid-stop-array":'{label} {path}:"hooks.Stop" 必须是数组。',"cli.init.errors.abort-existing":"中止:{path} 已存在。fab init 是非破坏性的。","cli.ledger-append.description":"向 Fabric 意图日志追加一条记录。","cli.ledger-append.args.target.description":"目标项目路径,默认为当前工作目录。","cli.ledger-append.args.staged.description":"从暂存变更推导记录(用于 pre-commit 阶段)。","cli.ledger-append.requires-staged":"pre-commit 场景下必须传入 --staged","cli.ledger-append.intent.auto":"自动:{head}{suffix}","cli.ledger-append.intent.auto-more":" 等 {count} 项","cli.pre-commit.description":"复合 pre-commit 钩子:在单个 Node 进程中依次执行 sync-meta --check-only、human-lint、ledger-append --staged。","cli.pre-commit.args.target.description":"项目根目录,默认取当前目录或 EXTERNAL_FIXTURE_PATH。","cli.pre-commit.run-failed":"fabric pre-commit:{name} 失败 - {message}","cli.scan.description":"扫描项目以检测 Fabric 引导候选模块。","cli.scan.args.target.description":"目标绝对路径。默认依次使用 CLI 参数、EXTERNAL_FIXTURE_PATH、fabric.config.json、当前目录。","cli.scan.args.debug.description":"以格式化输出打印检测证据。","cli.scan.args.json.description":"以 JSON 格式输出诊断报告。","cli.scan.report.title":"Fabric 扫描报告","cli.scan.report.target":"目标","cli.scan.report.framework":"框架","cli.scan.report.evidence":"证据","cli.scan.report.readme-quality":"README 质量","cli.scan.report.contributing":"CONTRIBUTING.md","cli.scan.report.files-counted":"文件数","cli.scan.report.ignored-entries":"忽略项","cli.scan.report.existing-fabric":"现有 Fabric 文件","cli.scan.report.recommendations":"建议:","cli.scan.readme-quality.ok":"良好","cli.scan.readme-quality.stub":"草稿","cli.scan.recommendation.init":"L0:运行 fab init,在 .fabric/bootstrap/README.md 生成带 TODO 标记的初始说明。","cli.scan.recommendation.readme":"L0:先补充 README.md,再把项目事实整理到 Fabric 参考文件中。","cli.scan.recommendation.contributing":"L0:添加 CONTRIBUTING.md,或在 bootstrap 中留下贡献流程的 TODO 说明。","cli.scan.recommendation.unknown-framework":"L1:当前未检测到框架标记,需要手动补充技术栈说明。","cli.scan.recommendation.framework-dirs":"L1:检查 {framework} 目录,后续为其补充对应作用域的 Fabric 规则文件。","cli.serve.description":"启动本地 Fabric MCP HTTP 服务。若需绑定到非 localhost,请设置 FABRIC_AUTH_TOKEN 以启用 Bearer 鉴权。","cli.serve.args.port.description":"监听端口,默认 7373。","cli.serve.args.host.description":"监听主机,默认 127.0.0.1。若需绑定到非 localhost,请设置 FABRIC_AUTH_TOKEN 以启用 Bearer 鉴权。","cli.serve.args.target.description":"目标项目路径。默认依次使用 CLI 参数、EXTERNAL_FIXTURE_PATH、fabric.config.json、当前目录。","cli.serve.args.debug.description":"将目标解析细节输出到 stderr。","cli.serve.ready.title":"Fabric 仪表盘","cli.serve.warning.host-fallback":"--host {host} 需要 FABRIC_AUTH_TOKEN;为安全起见已回退到 127.0.0.1","cli.serve.error.port-in-use":"端口 {port} 已被占用,可尝试 --port {nextPort}","cli.update.description":"刷新 MCP 主机配置和 git hooks,不重新创建 Fabric 文件。","cli.update.args.target.description":"目标项目路径。默认依次使用 CLI 参数、EXTERNAL_FIXTURE_PATH、fabric.config.json、当前目录。","cli.update.args.no-mcp.description":"跳过重新配置 MCP 客户端","cli.update.args.no-hooks.description":"跳过重新安装 git hooks","cli.sync-meta.description":"从内部规则文件同步 Fabric 元数据。","cli.sync-meta.args.target.description":"目标项目路径,默认为当前工作目录。","cli.sync-meta.args.check-only.description":"如果 .fabric/agents.meta.json 已过期,则以代码 1 退出。","cli.sync-meta.drift-detected":"检测到 Fabric 元数据漂移。请运行 fab sync-meta 进行更新。","cli.sync-meta.updated":"{label} {path}","dashboard.app.nav.aria-label":"仪表盘视图导航","dashboard.app.nav.module-a.label":"规则拓扑","dashboard.app.nav.module-a.label-bilingual":"规则命中 Rule Topology","dashboard.app.nav.module-a.subtitle":"覆盖热力图 + 命中原因","dashboard.app.nav.module-b.label":"认知扫描","dashboard.app.nav.module-b.label-bilingual":"认知扫描 Cognitive Forensic","dashboard.app.nav.module-b.subtitle":"占位","dashboard.app.nav.module-c.label":"语义时间线","dashboard.app.nav.module-c.label-bilingual":"语义时间线 Semantic Timeline","dashboard.app.nav.module-c.subtitle":"占位","dashboard.app.nav.module-d.label":"历史记录","dashboard.app.nav.module-d.label-bilingual":"历史记录 Historical Ledger","dashboard.app.nav.module-d.subtitle":"占位","dashboard.app.nav.rules.label":"规则树","dashboard.app.nav.rules.label-bilingual":"规则树 Rules Tree","dashboard.app.nav.rules.subtitle":"规则结构","dashboard.app.nav.locks.label":"人工保护","dashboard.app.nav.locks.label-bilingual":"人工保护 Human Lock","dashboard.app.nav.locks.subtitle":"受保护区域","dashboard.app.nav.timeline.label":"意图时间线","dashboard.app.nav.timeline.label-bilingual":"意图时间线 Intent Timeline","dashboard.app.nav.timeline.subtitle":"变更记录","dashboard.app.nav.history.label":"历史回放","dashboard.app.nav.history.label-bilingual":"历史回放 History Replay","dashboard.app.nav.history.subtitle":"时间回溯","dashboard.app.nav.doctor.label":"诊断台","dashboard.app.nav.doctor.label-bilingual":"诊断台 Doctor","dashboard.app.nav.doctor.subtitle":"状态检查","dashboard.app.nav.section.modules-status":"模块状态","dashboard.app.nav.section.diagnostics":"诊断","dashboard.app.nav.drift-check":"漂移检查","dashboard.app.nav.modules.read-only":"只读仪表盘","dashboard.app.header.connected":"已连接","dashboard.app.header.connecting":"连接中","dashboard.app.live-region.received":"已收到 {type}","dashboard.app.breadcrumb.topology":"rule-topology","dashboard.app.breadcrumb.forensic":"cognitive-forensic","dashboard.app.breadcrumb.semantic":"semantic-timeline","dashboard.app.breadcrumb.ledger":"historical-ledger","dashboard.app.breadcrumb.rules":"rules-tree","dashboard.app.breadcrumb.locks":"human-lock","dashboard.app.breadcrumb.timeline":"intent-timeline","dashboard.app.breadcrumb.history":"history-replay","dashboard.app.breadcrumb.doctor":"doctor","dashboard.rule-topology.title":"规则命中","dashboard.rule-topology.subtitle":"查看当前路径会命中哪些规则,以及为什么会命中","dashboard.rule-topology.path.placeholder":"用于规则上下文的样本路径","dashboard.rule-topology.path.aria-label":"规则上下文样本路径","dashboard.rule-topology.status.sample":"当前路径 {path}","dashboard.rule-topology.status.hits":"{count} 条命中","dashboard.rule-topology.status.revision":"版本 {revision}","dashboard.rule-topology.heatmap.title":"覆盖热力图","dashboard.rule-topology.heatmap.subtitle":"基于 scope_glob 模式推导的目录覆盖情况","dashboard.rule-topology.heatmap.aria-label":"目录覆盖热力图","dashboard.rule-topology.heatmap.count":"{count} 个目录","dashboard.rule-topology.heatmap.rules":"{count} 条规则","dashboard.rule-topology.heatmap.uncovered":"没有匹配作用域","dashboard.rule-topology.heatmap.empty":"当前没有可显示的规则目录。","dashboard.rule-topology.heatmap.density.full":"已覆盖","dashboard.rule-topology.heatmap.density.partial":"部分覆盖","dashboard.rule-topology.heatmap.density.none":"未覆盖","dashboard.rule-topology.hit-reason.title":"命中原因","dashboard.rule-topology.hit-reason.subtitle":"显示当前样本路径为何命中这些规则","dashboard.rule-topology.hit-reason.aria-label":"规则命中原因","dashboard.rule-topology.hit-reason.count":"{count} 条原因","dashboard.rule-topology.hit-reason.empty":"当前样本路径没有加载到规则。","dashboard.rule-topology.hit-reason.global":"全局","dashboard.rule-topology.hit-reason.tier.always":"常驻","dashboard.rule-topology.hit-reason.tier.path":"Glob","dashboard.rule-topology.hit-reason.tier.description":"描述","dashboard.module-placeholder.coming-soon":"功能预留","dashboard.module-placeholder.read-only":"为后续只读仪表盘能力预留。","dashboard.module-placeholder.forensic.title":"认知扫描","dashboard.module-placeholder.forensic.subtitle":"后续补充","dashboard.module-placeholder.semantic.title":"语义时间线","dashboard.module-placeholder.semantic.subtitle":"后续补充","dashboard.module-placeholder.ledger.title":"历史记录","dashboard.module-placeholder.ledger.subtitle":"后续补充","dashboard.rules-tree.title":"规则树","dashboard.rules-tree.subtitle":"查看 .fabric/agents.meta.json 中的规则结构、层级和同步状态","dashboard.rules-tree.filter.placeholder":"按文件、作用域、优先级、哈希过滤...","dashboard.rules-tree.filter.aria-label":"过滤规则树","dashboard.rules-tree.status.loading":"规则加载中","dashboard.rules-tree.status.nodes":"{count} 个节点 · 版本 {revision}","dashboard.rules-tree.status.locks":"{count} 个受保护区域","dashboard.rules-tree.empty":"没有匹配的规则。","dashboard.rules-tree.tree.aria-label":"Fabric 规则树","dashboard.rules-tree.detail.title":"节点详情","dashboard.rules-tree.detail.empty":"选择一个规则节点以查看作用域、依赖、优先级和哈希。","dashboard.rules-tree.detail.file":"文件","dashboard.rules-tree.detail.scope":"作用域","dashboard.rules-tree.detail.priority":"优先级","dashboard.rules-tree.detail.hash":"哈希","dashboard.rules-tree.detail.no-deps":"无依赖","dashboard.human-lock.title":"人工保护","dashboard.human-lock.subtitle":"查看需要人工确认的受保护区域","dashboard.human-lock.filters.aria-label":"人工保护过滤器","dashboard.human-lock.filters.all":"全部","dashboard.human-lock.filters.drift":"漂移","dashboard.human-lock.filters.approved":"已批准","dashboard.human-lock.summary":"{drift} 处漂移 · {approved} 项已确认","dashboard.human-lock.empty":"当前过滤条件下没有受保护记录。","dashboard.intent-timeline.title":"意图时间线","dashboard.intent-timeline.subtitle":"查看 AI 与人工留下的变更记录,按时间倒序排列","dashboard.intent-timeline.filter.label":"来源","dashboard.intent-timeline.filter.all":"全部","dashboard.intent-timeline.summary":"AI {aiCount} · Human {humanCount}","dashboard.intent-timeline.columns.ai.title":"AI","dashboard.intent-timeline.columns.ai.entries":"{count} 条记录","dashboard.intent-timeline.columns.human.title":"人工","dashboard.intent-timeline.columns.human.entries":"{count} 条记录","dashboard.intent-timeline.empty":"没有找到日志记录。","dashboard.intent-timeline.annotate.missing-id":"缺少 id,无法为这条日志添加注释。","dashboard.history-replay.title":"历史回放","dashboard.history-replay.subtitle":"按历史记录回看当时的规则树状态","dashboard.history-replay.toolbar.scrub":"拖动","dashboard.history-replay.toolbar.latest":"最新","dashboard.history-replay.selected.none":"尚未选择历史记录","dashboard.history-replay.status.replay-points":"{count} 个回放点","dashboard.history-replay.status.entries-applied":"已应用 {count} 条记录","dashboard.history-replay.empty.entries":"没有可用于回放的日志记录。","dashboard.history-replay.state.title":"查看 {label} 时刻的状态","dashboard.history-replay.state.meta":"记录 {ledgerId} · 提交 {commit} · {mode}","dashboard.history-replay.status.loading":"快照加载中","dashboard.history-replay.status.nodes":"{count} 个节点","dashboard.history-replay.status.unknown-revision":"未知版本","dashboard.history-replay.tree.aria-label":"历史 Fabric 规则树","dashboard.history-replay.empty.loading":"正在加载历史快照...","dashboard.history-replay.empty.select":"请选择一条时间线记录以回放其状态。","dashboard.history-replay.meta.not-available":"不可用","dashboard.history-replay.meta.pending":"等待中","dashboard.history-replay.meta.na":"无","dashboard.doctor.title":"诊断控制台","dashboard.doctor.subtitle":"查看框架、入口点、版本漂移和受保护路径的状态","dashboard.doctor.toolbar.overall":"整体状态","dashboard.doctor.toolbar.no-summary":"暂无摘要","dashboard.doctor.toolbar.entry-points-summary":"{framework} · {count} 个入口点","dashboard.doctor.toolbar.entry-point-summary":"{framework} · {count} 个入口点","dashboard.doctor.empty.loading":"正在加载 doctor 报告...","dashboard.doctor.summary.framework":"框架","dashboard.doctor.summary.protected-paths":"受保护路径","dashboard.doctor.summary.intent-ledger":"意图日志","dashboard.doctor.summary.no-meta-revision":"暂无元数据版本","dashboard.doctor.summary.tracked-paths.none":"没有跟踪路径","dashboard.doctor.summary.tracked-paths.some":"已跟踪 {count} 项","dashboard.doctor.summary.hashes-intact":"所有已批准哈希均完好","dashboard.doctor.summary.drifted":"{count} 项发生漂移","dashboard.doctor.summary.no-ledger-entries":"暂无日志记录","dashboard.doctor.card.entry-points":"入口点","dashboard.doctor.card.checks":"检查项","dashboard.doctor.empty.entry-points":"当前未检测到入口点。","dashboard.doctor.framework.unknown":"未知","dashboard.doctor.age.none":"暂无记录","dashboard.doctor.age.seconds":"{count} 秒前","dashboard.doctor.age.minutes":"{count} 分钟前","dashboard.doctor.age.hours":"{count} 小时前","dashboard.doctor.age.days":"{count} 天前","dashboard.doctor.age.weeks":"{count} 周前","dashboard.shared.refresh":"刷新","dashboard.shared.loading":"加载中","dashboard.shared.status.ok":"正常","dashboard.shared.status.warn":"警告","dashboard.shared.status.error":"错误","dashboard.shared.status.confirmed":"已确认","dashboard.shared.status.hash-drift":"哈希漂移","dashboard.shared.status.stale":"过期","dashboard.shared.status.orphan":"孤立","dashboard.shared.status.attention":"注意","dashboard.source.ai":"AI","dashboard.source.human":"人工","dashboard.timeline-entry.aria-label":"{source} 意图 {intent}","dashboard.timeline-entry.working-tree":"工作区","dashboard.timeline-entry.parent":"父提交 {parent}","dashboard.timeline-entry.paths":"路径","dashboard.timeline-entry.annotate":"添加注释","dashboard.timeline-entry.annotation-label":"人工注释","dashboard.timeline-entry.annotation-placeholder":"说明审核结论或批准背景...","dashboard.timeline-entry.annotation-save":"保存注释","dashboard.tree-node.locked":"已锁定","dashboard.tree-node.stale.hash-mismatch":"哈希不匹配","dashboard.tree-node.stale.orphan":"孤立","dashboard.lock-card.aria-label":"{file} {lineRange} {status}","dashboard.lock-card.status.drift":"哈希漂移","dashboard.lock-card.status.confirmed":"已确认","dashboard.lock-card.hash.locked":"锁定哈希","dashboard.lock-card.hash.current":"当前哈希","dashboard.lock-card.hash.diff":"差异","dashboard.lock-card.preview.drift":"漂移","dashboard.lock-card.preview.sync":"同步","dashboard.lock-card.preview.drift-detail":"哈希与受保护区域不一致。","dashboard.lock-card.preview.sync-detail":"受保护区域当前保持同步。","dashboard.lock-card.footer.region":"受保护区域 · {count} 行","dashboard.lock-card.button.approve":"批准新哈希","dashboard.lock-card.button.confirmed":"已确认","dashboard.lock-card.diff.hash-mismatch":"哈希不一致","dashboard.lock-card.diff.no-changes":"无变更","dashboard.lock-card.diff.with-bytes":"+{added} / -{removed} · {bytes} 字节","dashboard.lock-card.diff.without-bytes":"+{added} / -{removed}","dashboard.approve-button.retry":"重试"},Gr={en:Xr,"zh-CN":Yr};function Jr(t,e=Gr){const a=e[t]??e.en,r=e.en;return(i,n)=>{const o=a[i]??r[i]??i;return n===void 0?o:Object.entries(n).reduce((l,[c,d])=>l.replaceAll(`{${c}}`,d),o)}}function Kr(t){if(typeof t!="string")return"en";const e=t.trim().toLowerCase().replace(/\..*$/,"").replace(/_/g,"-");return e.length===0?"en":e==="zh"||e.startsWith("zh-")?"zh-CN":"en"}function Qr(){return typeof navigator<"u"&&typeof navigator.language=="string"?Kr(navigator.language):"en"}function ei(t=Qr()){return{locale:t,t:Jr(t)}}const Ka=Nr(null);function ti({children:t}){const e=Y(()=>ei(),[]);return s(Ka.Provider,{value:e,children:t})}function D(){const t=Tr(Ka);if(t===null)throw new Error("useI18n must be used within an I18nProvider.");return t}function Qa({variant:t,state:e="idle",size:a="md",onClick:r,children:i,ariaLabel:n}){const{t:o}=D(),[l,c]=R(e),d=e==="idle"?l:e,h=d==="busy",u=async()=>{if(!h){c("busy");try{await r(),c("success"),window.setTimeout(()=>c("idle"),900)}catch{c("error"),window.setTimeout(()=>c("idle"),1400)}}};return s("button",{type:"button",className:`action-button action-${t} action-${a} action-${d}`,"aria-label":n,"aria-busy":h,"aria-disabled":h,onClick:u,children:[h?s("span",{className:"spinner","aria-hidden":"true"}):null,d==="success"?s("span",{"aria-hidden":"true",children:"✓"}):null,d==="error"?o("dashboard.approve-button.retry"):i]})}function ai({nodes:t}){const{t:e}=D(),a=ri(t);return s("section",{className:"topology-card",children:[s("div",{className:"topology-card-head",children:[s("div",{children:[s("h3",{children:e("dashboard.rule-topology.heatmap.title")}),s("p",{className:"muted",children:e("dashboard.rule-topology.heatmap.subtitle")})]}),s("span",{className:"badge badge-level",children:e("dashboard.rule-topology.heatmap.count",{count:String(a.length)})})]}),a.length===0?s("div",{className:"empty-card",children:e("dashboard.rule-topology.heatmap.empty")}):s("div",{className:"coverage-grid",role:"list","aria-label":e("dashboard.rule-topology.heatmap.aria-label"),children:a.map(r=>s("article",{className:`coverage-row coverage-${r.density}`,role:"listitem",children:[s("div",{className:"coverage-row-main",children:[s("span",{className:"coverage-path",children:r.path}),s("span",{className:`badge coverage-chip coverage-chip-${r.density}`,children:e(`dashboard.rule-topology.heatmap.density.${r.density}`)})]}),s("div",{className:"coverage-row-meta",children:[s("span",{children:e("dashboard.rule-topology.heatmap.rules",{count:String(r.directRuleCount)})}),s("span",{children:r.matchingGlobs.slice(0,2).join(" · ")||e("dashboard.rule-topology.heatmap.uncovered")})]})]},r.path))})]})}function ri(t){return ii(t).map(r=>{const i=t.filter(o=>si(r,qe(o.scope_glob))),n=i.some(o=>ni(r,qe(o.scope_glob)));return{path:r,density:n?"full":i.length>0?"partial":"none",matchingGlobs:i.map(o=>o.scope_glob),directRuleCount:i.length}}).sort((r,i)=>r.path.localeCompare(i.path))}function ii(t){const e=new Set;for(const a of t){for(const i of ca(a.file))e.add(i);const r=Vt(a.scope_glob);if(r.length>0)for(const i of ca(r))e.add(i)}return Array.from(e)}function ca(t){const a=qe(t).split("/").filter(Boolean);if(a.length===0)return[];const i=(a.at(-1)??"").includes(".")?a.length-1:a.length,n=[];for(let o=1;o<=i;o+=1)n.push(a.slice(0,o).join("/"));return n}function Vt(t){const e=qe(t).split("/").filter(Boolean),a=[];for(const r of e){if(r==="**"||/[*?[\]{}()!]/.test(r))break;a.push(r)}return a.join("/")}function ni(t,e){const a=Vt(e);return a.length===0?!1:a===t&&(e===t||e.startsWith(`${t}/**`)||e.startsWith(`${t}/*`))}function si(t,e){const a=Vt(e);return a.length===0?!0:a===t||a.startsWith(`${t}/`)||t.startsWith(`${a}/`)}function qe(t){return t.replaceAll("\\","/").replace(/^\.?\//,"").replace(/\/+$/,"")}const oi={ok:"dashboard.shared.status.confirmed",drift:"dashboard.shared.status.hash-drift",stale:"dashboard.shared.status.stale",orphan:"dashboard.shared.status.orphan",locked:"dashboard.shared.status.attention"};function te({kind:t,severity:e,message:a,diffStats:r}){const{t:i}=D();if(e==="ok"&&t==="dot")return null;const n=a??i(oi[e]),o=r===void 0?"":` +${r.added} / -${r.removed}`,l=`drift-indicator drift-${t} drift-${e}`;return t==="dot"?s("span",{className:l,"aria-label":n}):t==="banner"?s("div",{className:l,role:"status",children:[s("span",{"aria-hidden":"true",children:"!"}),s("span",{children:[n,o]})]}):s("span",{className:l,children:[s("span",{"aria-hidden":"true",children:e==="ok"?"✓":"!"}),s("span",{children:[n,o]})]})}function li({meta:t,rulesContext:e}){const{t:a}=D(),r=di(t,e);return s("section",{className:"topology-card",children:[s("div",{className:"topology-card-head",children:[s("div",{children:[s("h3",{children:a("dashboard.rule-topology.hit-reason.title")}),s("p",{className:"muted",children:a("dashboard.rule-topology.hit-reason.subtitle")})]}),s("span",{className:"badge badge-level",children:a("dashboard.rule-topology.hit-reason.count",{count:String(r.length)})})]}),r.length===0?s("div",{className:"empty-card",children:a("dashboard.rule-topology.hit-reason.empty")}):s("div",{className:"reason-list",role:"list","aria-label":a("dashboard.rule-topology.hit-reason.aria-label"),children:r.map(i=>s("article",{className:"reason-card",role:"listitem",children:[s("div",{className:"reason-card-head",children:[s("strong",{children:i.file}),s("span",{className:`badge reason-tier reason-tier-${i.tier}`,children:a(`dashboard.rule-topology.hit-reason.tier.${i.tier}`)})]}),s("div",{className:"reason-card-meta",children:[s("span",{children:i.layer}),s("span",{children:i.tier==="always"?a("dashboard.rule-topology.hit-reason.global"):i.scope})]}),i.description!==null&&i.description.length>0?s("p",{className:"reason-description",children:i.description}):null]},`${i.layer}:${i.file}:${i.tier}`))})]})}function di(t,e){if(t===null||e===null)return[];const a=new Map(Object.values(t.nodes).map(n=>[n.file,n])),r=[],i=new Set;for(const n of e.L1)ua(r,i,a,n.path,"L1");for(const n of e.L2)ua(r,i,a,n.path,"L2");for(const n of e.description_stubs??[]){const o=`description:${n.path}`;if(i.has(o))continue;const l=a.get(n.path);r.push({file:n.path,layer:"description",tier:"description",scope:l?.scope_glob??"",description:n.description}),i.add(o)}return r.sort((n,o)=>n.file.localeCompare(o.file))}function ua(t,e,a,r,i){const n=`${i}:${r}`;if(e.has(n))return;const o=a.get(r),l=o?.activation?.tier??"path";t.push({file:r,layer:i,tier:l,scope:o?.scope_glob??"",description:l==="description"?o?.activation?.description??null:null}),e.add(n)}function ci({entry:t,currentHash:e,diffStats:a,diffPreview:r=[],onApprove:i,busy:n=!1}){const{t:o}=D(),l=e!==void 0&&e!==t.hash,c=l?"drift":"ok",d=o(l?"dashboard.lock-card.status.drift":"dashboard.lock-card.status.confirmed"),h=`L${t.start_line}-L${t.end_line}`;return s("article",{className:`lock-card lock-${c} ${n?"is-busy":""}`,"aria-label":o("dashboard.lock-card.aria-label",{file:t.file,lineRange:h,status:d}),children:[s("header",{className:"lock-head",children:[s("div",{className:"lock-icon","aria-hidden":"true",children:l?"!":"✓"}),s("div",{className:"lock-title",children:[s("strong",{children:t.file}),s("span",{children:h})]}),s(te,{kind:"pill",severity:l?"drift":"ok",message:d})]}),s("div",{className:"lock-body",children:[s("div",{className:"hash-block",children:[s(mt,{label:o("dashboard.lock-card.hash.locked"),value:t.hash,stale:l}),s(mt,{label:o("dashboard.lock-card.hash.current"),value:e??o("dashboard.history-replay.meta.not-available")}),s(mt,{label:o("dashboard.lock-card.hash.diff"),value:ui(a,l,o),accent:l})]}),s("div",{className:"preview",children:[s("div",{className:"preview-head",children:[s("span",{children:[t.file," · ",h]}),s("span",{children:o(l?"dashboard.lock-card.preview.drift":"dashboard.lock-card.preview.sync")})]}),s("pre",{className:"preview-body",children:r.length>0?r.map(u=>s("span",{className:`line-${u.kind}`,children:[s("span",{className:"line-num",children:u.line}),u.text,`
|
|
11
|
-
`]},`${u.kind}:${u.line}:${u.text}`)):`${t.file}
|
|
12
|
-
${h}
|
|
13
|
-
${o(l?"dashboard.lock-card.preview.drift-detail":"dashboard.lock-card.preview.sync-detail")}`})]})]}),s("footer",{className:"lock-foot",children:[s("span",{className:"meta-line",children:o("dashboard.lock-card.footer.region",{count:String(t.end_line-t.start_line+1)})}),l&&e!==void 0&&i!==void 0?s(Qa,{variant:"approve",state:n?"busy":"idle",ariaLabel:o("dashboard.lock-card.button.approve"),onClick:()=>i(t),children:o("dashboard.lock-card.button.approve")}):s("button",{className:"action-button action-approve action-success",type:"button","aria-disabled":"true",children:["✓ ",o("dashboard.lock-card.button.confirmed")]})]})]})}function mt({label:t,value:e,stale:a=!1,accent:r=!1}){return s("div",{className:"hash-row",children:[s("span",{className:"hash-key",children:t}),s("span",{className:`hash-value ${a?"is-stale":""} ${r?"is-accent":""}`,children:e})]})}function ui(t,e,a){return t===void 0?a(e?"dashboard.lock-card.diff.hash-mismatch":"dashboard.lock-card.diff.no-changes"):t.bytes!==void 0?a("dashboard.lock-card.diff.with-bytes",{added:String(t.added),removed:String(t.removed),bytes:String(t.bytes)}):a("dashboard.lock-card.diff.without-bytes",{added:String(t.added),removed:String(t.removed)})}function Nt({source:t,size:e="sm",variant:a="filled",interactive:r=!1,selected:i=!1,onClick:n}){const{t:o}=D(),l=["source-badge",`source-badge-${t}`,`source-badge-${e}`,`source-badge-${a}`,i?"is-selected":""].filter(Boolean).join(" "),c=o(`dashboard.source.${t}`);return r?s("button",{className:l,type:"button","aria-pressed":i,onClick:n,children:[s("span",{className:"source-badge-dot","aria-hidden":"true"}),c]}):s("span",{className:l,children:[s("span",{className:"source-badge-dot","aria-hidden":"true"}),c]})}function er({entry:t,onAnnotate:e,expanded:a=!1,readOnly:r=!1}){const{locale:i,t:n}=D(),[o,l]=R(a),[c,d]=R(""),h=t.source==="ai",u=!r&&h&&e!==void 0&&t.id!==void 0,g=async()=>{const p=c.trim();!h||e===void 0||p.length===0||(await e(t,p),d(""),l(!1))};return s("article",{className:`timeline-entry timeline-${t.source}`,"aria-label":n("dashboard.timeline-entry.aria-label",{source:n(`dashboard.source.${t.source}`),intent:t.intent}),children:[s("div",{className:`dot-axis ${t.source}`,"aria-hidden":"true"}),s("div",{className:"timeline-head",children:[s(Nt,{source:t.source}),h?s("span",{className:"commit-hash",children:t.commit_sha??n("dashboard.timeline-entry.working-tree")}):null,h?null:s("span",{className:"commit-hash",children:n("dashboard.timeline-entry.parent",{parent:t.parent_sha})}),h?null:s("span",{className:"diff-badge",children:t.diff_stat}),s("time",{className:"entry-time",dateTime:new Date(t.ts).toISOString(),children:hi(t.ts,i)})]}),s("h3",{className:"entry-title",children:t.intent}),s("div",{className:"entry-meta",children:[s("span",{children:[s("span",{className:"meta-key",children:n("dashboard.timeline-entry.paths")})," ",t.affected_paths.length]}),t.affected_paths.slice(0,3).map(p=>s("span",{children:p},p))]}),!h&&t.annotation!==void 0?s("div",{className:"entry-body",children:t.annotation}):null,h&&u?s("div",{className:"entry-foot",children:s("button",{className:"ghost-button",type:"button",onClick:()=>l(p=>!p),children:n("dashboard.timeline-entry.annotate")})}):null,o&&h?s("form",{className:"annotate-form",onSubmit:p=>{p.preventDefault(),g()},children:[s("label",{htmlFor:`annotate-${t.id??t.ts}`,children:n("dashboard.timeline-entry.annotation-label")}),s("input",{id:`annotate-${t.id??t.ts}`,className:"annotate-input",value:c,onInput:p=>d(p.currentTarget.value),placeholder:n("dashboard.timeline-entry.annotation-placeholder")}),s(Qa,{variant:"annotate",size:"sm",onClick:g,children:n("dashboard.timeline-entry.annotation-save")})]}):null]})}function hi(t,e){return new Intl.DateTimeFormat(e,{hour:"2-digit",minute:"2-digit",second:"2-digit"}).format(new Date(t))}function Bt({node:t,level:e,selected:a=!1,onSelect:r,humanLockedNearby:i=!1,staleReason:n=null,defaultExpanded:o=!1,readOnly:l=!1,children:c=[]}){const{t:d}=D(),[h,u]=R(o),g=c.length>0,p=t.file,y=n===null?"ok":n==="orphan"?"orphan":"stale",C=()=>{l||(g&&u(x=>!x),r?.(p))},w=x=>{l||((x.key==="Enter"||x.key===" ")&&(x.preventDefault(),C()),x.key==="ArrowRight"&&g&&u(!0),x.key==="ArrowLeft"&&g&&u(!1))};return s("div",{className:`tree-node-group tree-level-${e}`,children:[s("div",{className:["tree-node",a?"is-selected":"",h?"is-expanded":"",i?"is-locked":"",n!==null?"is-stale":"",l?"is-readonly":""].filter(Boolean).join(" "),role:"treeitem","aria-expanded":g?h:void 0,"aria-level":e+1,"aria-readonly":l||void 0,tabIndex:l?-1:0,onClick:l?void 0:C,onKeyDown:l?void 0:w,children:[s("span",{className:"tree-caret","aria-hidden":"true",children:g?"›":"·"}),s("span",{className:"tree-icon","aria-hidden":"true",children:e===0?"F":e===1?"D":"R"}),s("span",{className:"tree-label",children:p}),i?s("span",{className:"badge badge-locked",children:d("dashboard.tree-node.locked")}):null,n!==null?s(te,{kind:"pill",severity:y,message:d(`dashboard.tree-node.stale.${n}`)}):null,s("span",{className:"tree-meta",children:[s("span",{className:"badge badge-level",children:["L",e]}),s("span",{className:"tree-hash",children:pi(t.hash)})]})]}),g&&h?s("div",{className:"tree-children",role:"group",children:c.map(x=>s(Bt,{...x,onSelect:r,readOnly:l},`${x.node.file}:${x.level}`))}):null]})}function pi(t){return t.length>18?`${t.slice(0,12)}…`:t}var I;(function(t){t.assertEqual=i=>{};function e(i){}t.assertIs=e;function a(i){throw new Error}t.assertNever=a,t.arrayToEnum=i=>{const n={};for(const o of i)n[o]=o;return n},t.getValidEnumValues=i=>{const n=t.objectKeys(i).filter(l=>typeof i[i[l]]!="number"),o={};for(const l of n)o[l]=i[l];return t.objectValues(o)},t.objectValues=i=>t.objectKeys(i).map(function(n){return i[n]}),t.objectKeys=typeof Object.keys=="function"?i=>Object.keys(i):i=>{const n=[];for(const o in i)Object.prototype.hasOwnProperty.call(i,o)&&n.push(o);return n},t.find=(i,n)=>{for(const o of i)if(n(o))return o},t.isInteger=typeof Number.isInteger=="function"?i=>Number.isInteger(i):i=>typeof i=="number"&&Number.isFinite(i)&&Math.floor(i)===i;function r(i,n=" | "){return i.map(o=>typeof o=="string"?`'${o}'`:o).join(n)}t.joinValues=r,t.jsonStringifyReplacer=(i,n)=>typeof n=="bigint"?n.toString():n})(I||(I={}));var ha;(function(t){t.mergeShapes=(e,a)=>({...e,...a})})(ha||(ha={}));const v=I.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),se=t=>{switch(typeof t){case"undefined":return v.undefined;case"string":return v.string;case"number":return Number.isNaN(t)?v.nan:v.number;case"boolean":return v.boolean;case"function":return v.function;case"bigint":return v.bigint;case"symbol":return v.symbol;case"object":return Array.isArray(t)?v.array:t===null?v.null:t.then&&typeof t.then=="function"&&t.catch&&typeof t.catch=="function"?v.promise:typeof Map<"u"&&t instanceof Map?v.map:typeof Set<"u"&&t instanceof Set?v.set:typeof Date<"u"&&t instanceof Date?v.date:v.object;default:return v.unknown}},m=I.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]);class ae extends Error{get errors(){return this.issues}constructor(e){super(),this.issues=[],this.addIssue=r=>{this.issues=[...this.issues,r]},this.addIssues=(r=[])=>{this.issues=[...this.issues,...r]};const a=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,a):this.__proto__=a,this.name="ZodError",this.issues=e}format(e){const a=e||function(n){return n.message},r={_errors:[]},i=n=>{for(const o of n.issues)if(o.code==="invalid_union")o.unionErrors.map(i);else if(o.code==="invalid_return_type")i(o.returnTypeError);else if(o.code==="invalid_arguments")i(o.argumentsError);else if(o.path.length===0)r._errors.push(a(o));else{let l=r,c=0;for(;c<o.path.length;){const d=o.path[c];c===o.path.length-1?(l[d]=l[d]||{_errors:[]},l[d]._errors.push(a(o))):l[d]=l[d]||{_errors:[]},l=l[d],c++}}};return i(this),r}static assert(e){if(!(e instanceof ae))throw new Error(`Not a ZodError: ${e}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,I.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(e=a=>a.message){const a={},r=[];for(const i of this.issues)if(i.path.length>0){const n=i.path[0];a[n]=a[n]||[],a[n].push(e(i))}else r.push(e(i));return{formErrors:r,fieldErrors:a}}get formErrors(){return this.flatten()}}ae.create=t=>new ae(t);const St=(t,e)=>{let a;switch(t.code){case m.invalid_type:t.received===v.undefined?a="Required":a=`Expected ${t.expected}, received ${t.received}`;break;case m.invalid_literal:a=`Invalid literal value, expected ${JSON.stringify(t.expected,I.jsonStringifyReplacer)}`;break;case m.unrecognized_keys:a=`Unrecognized key(s) in object: ${I.joinValues(t.keys,", ")}`;break;case m.invalid_union:a="Invalid input";break;case m.invalid_union_discriminator:a=`Invalid discriminator value. Expected ${I.joinValues(t.options)}`;break;case m.invalid_enum_value:a=`Invalid enum value. Expected ${I.joinValues(t.options)}, received '${t.received}'`;break;case m.invalid_arguments:a="Invalid function arguments";break;case m.invalid_return_type:a="Invalid function return type";break;case m.invalid_date:a="Invalid date";break;case m.invalid_string:typeof t.validation=="object"?"includes"in t.validation?(a=`Invalid input: must include "${t.validation.includes}"`,typeof t.validation.position=="number"&&(a=`${a} at one or more positions greater than or equal to ${t.validation.position}`)):"startsWith"in t.validation?a=`Invalid input: must start with "${t.validation.startsWith}"`:"endsWith"in t.validation?a=`Invalid input: must end with "${t.validation.endsWith}"`:I.assertNever(t.validation):t.validation!=="regex"?a=`Invalid ${t.validation}`:a="Invalid";break;case m.too_small:t.type==="array"?a=`Array must contain ${t.exact?"exactly":t.inclusive?"at least":"more than"} ${t.minimum} element(s)`:t.type==="string"?a=`String must contain ${t.exact?"exactly":t.inclusive?"at least":"over"} ${t.minimum} character(s)`:t.type==="number"?a=`Number must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${t.minimum}`:t.type==="bigint"?a=`Number must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${t.minimum}`:t.type==="date"?a=`Date must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(t.minimum))}`:a="Invalid input";break;case m.too_big:t.type==="array"?a=`Array must contain ${t.exact?"exactly":t.inclusive?"at most":"less than"} ${t.maximum} element(s)`:t.type==="string"?a=`String must contain ${t.exact?"exactly":t.inclusive?"at most":"under"} ${t.maximum} character(s)`:t.type==="number"?a=`Number must be ${t.exact?"exactly":t.inclusive?"less than or equal to":"less than"} ${t.maximum}`:t.type==="bigint"?a=`BigInt must be ${t.exact?"exactly":t.inclusive?"less than or equal to":"less than"} ${t.maximum}`:t.type==="date"?a=`Date must be ${t.exact?"exactly":t.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(t.maximum))}`:a="Invalid input";break;case m.custom:a="Invalid input";break;case m.invalid_intersection_types:a="Intersection results could not be merged";break;case m.not_multiple_of:a=`Number must be a multiple of ${t.multipleOf}`;break;case m.not_finite:a="Number must be finite";break;default:a=e.defaultError,I.assertNever(t)}return{message:a}};let mi=St;function fi(){return mi}const bi=t=>{const{data:e,path:a,errorMaps:r,issueData:i}=t,n=[...a,...i.path||[]],o={...i,path:n};if(i.message!==void 0)return{...i,path:n,message:i.message};let l="";const c=r.filter(d=>!!d).slice().reverse();for(const d of c)l=d(o,{data:e,defaultError:l}).message;return{...i,path:n,message:l}};function b(t,e){const a=fi(),r=bi({issueData:e,data:t.data,path:t.path,errorMaps:[t.common.contextualErrorMap,t.schemaErrorMap,a,a===St?void 0:St].filter(i=>!!i)});t.common.issues.push(r)}class z{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(e,a){const r=[];for(const i of a){if(i.status==="aborted")return N;i.status==="dirty"&&e.dirty(),r.push(i.value)}return{status:e.value,value:r}}static async mergeObjectAsync(e,a){const r=[];for(const i of a){const n=await i.key,o=await i.value;r.push({key:n,value:o})}return z.mergeObjectSync(e,r)}static mergeObjectSync(e,a){const r={};for(const i of a){const{key:n,value:o}=i;if(n.status==="aborted"||o.status==="aborted")return N;n.status==="dirty"&&e.dirty(),o.status==="dirty"&&e.dirty(),n.value!=="__proto__"&&(typeof o.value<"u"||i.alwaysSet)&&(r[n.value]=o.value)}return{status:e.value,value:r}}}const N=Object.freeze({status:"aborted"}),Se=t=>({status:"dirty",value:t}),W=t=>({status:"valid",value:t}),pa=t=>t.status==="aborted",ma=t=>t.status==="dirty",ye=t=>t.status==="valid",Xe=t=>typeof Promise<"u"&&t instanceof Promise;var k;(function(t){t.errToObj=e=>typeof e=="string"?{message:e}:e||{},t.toString=e=>typeof e=="string"?e:e?.message})(k||(k={}));class G{constructor(e,a,r,i){this._cachedPath=[],this.parent=e,this.data=a,this._path=r,this._key=i}get path(){return this._cachedPath.length||(Array.isArray(this._key)?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}}const fa=(t,e)=>{if(ye(e))return{success:!0,data:e.value};if(!t.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;const a=new ae(t.common.issues);return this._error=a,this._error}}};function T(t){if(!t)return{};const{errorMap:e,invalid_type_error:a,required_error:r,description:i}=t;if(e&&(a||r))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return e?{errorMap:e,description:i}:{errorMap:(o,l)=>{const{message:c}=t;return o.code==="invalid_enum_value"?{message:c??l.defaultError}:typeof l.data>"u"?{message:c??r??l.defaultError}:o.code!=="invalid_type"?{message:l.defaultError}:{message:c??a??l.defaultError}},description:i}}class E{get description(){return this._def.description}_getType(e){return se(e.data)}_getOrReturnCtx(e,a){return a||{common:e.parent.common,data:e.data,parsedType:se(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}_processInputParams(e){return{status:new z,ctx:{common:e.parent.common,data:e.data,parsedType:se(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}}_parseSync(e){const a=this._parse(e);if(Xe(a))throw new Error("Synchronous parse encountered promise.");return a}_parseAsync(e){const a=this._parse(e);return Promise.resolve(a)}parse(e,a){const r=this.safeParse(e,a);if(r.success)return r.data;throw r.error}safeParse(e,a){const r={common:{issues:[],async:a?.async??!1,contextualErrorMap:a?.errorMap},path:a?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:se(e)},i=this._parseSync({data:e,path:r.path,parent:r});return fa(r,i)}"~validate"(e){const a={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:se(e)};if(!this["~standard"].async)try{const r=this._parseSync({data:e,path:[],parent:a});return ye(r)?{value:r.value}:{issues:a.common.issues}}catch(r){r?.message?.toLowerCase()?.includes("encountered")&&(this["~standard"].async=!0),a.common={issues:[],async:!0}}return this._parseAsync({data:e,path:[],parent:a}).then(r=>ye(r)?{value:r.value}:{issues:a.common.issues})}async parseAsync(e,a){const r=await this.safeParseAsync(e,a);if(r.success)return r.data;throw r.error}async safeParseAsync(e,a){const r={common:{issues:[],contextualErrorMap:a?.errorMap,async:!0},path:a?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:se(e)},i=this._parse({data:e,path:r.path,parent:r}),n=await(Xe(i)?i:Promise.resolve(i));return fa(r,n)}refine(e,a){const r=i=>typeof a=="string"||typeof a>"u"?{message:a}:typeof a=="function"?a(i):a;return this._refinement((i,n)=>{const o=e(i),l=()=>n.addIssue({code:m.custom,...r(i)});return typeof Promise<"u"&&o instanceof Promise?o.then(c=>c?!0:(l(),!1)):o?!0:(l(),!1)})}refinement(e,a){return this._refinement((r,i)=>e(r)?!0:(i.addIssue(typeof a=="function"?a(r,i):a),!1))}_refinement(e){return new le({schema:this,typeName:S.ZodEffects,effect:{type:"refinement",refinement:e}})}superRefine(e){return this._refinement(e)}constructor(e){this.spa=this.safeParseAsync,this._def=e,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:a=>this["~validate"](a)}}optional(){return ee.create(this,this._def)}nullable(){return pe.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return X.create(this)}promise(){return et.create(this,this._def)}or(e){return Ge.create([this,e],this._def)}and(e){return Je.create(this,e,this._def)}transform(e){return new le({...T(this._def),schema:this,typeName:S.ZodEffects,effect:{type:"transform",transform:e}})}default(e){const a=typeof e=="function"?e:()=>e;return new tt({...T(this._def),innerType:this,defaultValue:a,typeName:S.ZodDefault})}brand(){return new ir({typeName:S.ZodBranded,type:this,...T(this._def)})}catch(e){const a=typeof e=="function"?e:()=>e;return new at({...T(this._def),innerType:this,catchValue:a,typeName:S.ZodCatch})}describe(e){const a=this.constructor;return new a({...this._def,description:e})}pipe(e){return qt.create(this,e)}readonly(){return rt.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}const gi=/^c[^\s-]{8,}$/i,yi=/^[0-9a-z]+$/,vi=/^[0-9A-HJKMNP-TV-Z]{26}$/i,_i=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,ki=/^[a-z0-9_-]{21}$/i,wi=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,xi=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,Ni=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,Si="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";let ft;const Ci=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,Ti=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,Ai=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,Ei=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,Ii=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,Ri=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,tr="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",$i=new RegExp(`^${tr}$`);function ar(t){let e="[0-5]\\d";t.precision?e=`${e}\\.\\d{${t.precision}}`:t.precision==null&&(e=`${e}(\\.\\d+)?`);const a=t.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${e})${a}`}function Li(t){return new RegExp(`^${ar(t)}$`)}function Oi(t){let e=`${tr}T${ar(t)}`;const a=[];return a.push(t.local?"Z?":"Z"),t.offset&&a.push("([+-]\\d{2}:?\\d{2})"),e=`${e}(${a.join("|")})`,new RegExp(`^${e}$`)}function Pi(t,e){return!!((e==="v4"||!e)&&Ci.test(t)||(e==="v6"||!e)&&Ai.test(t))}function ji(t,e){if(!wi.test(t))return!1;try{const[a]=t.split(".");if(!a)return!1;const r=a.replace(/-/g,"+").replace(/_/g,"/").padEnd(a.length+(4-a.length%4)%4,"="),i=JSON.parse(atob(r));return!(typeof i!="object"||i===null||"typ"in i&&i?.typ!=="JWT"||!i.alg||e&&i.alg!==e)}catch{return!1}}function Fi(t,e){return!!((e==="v4"||!e)&&Ti.test(t)||(e==="v6"||!e)&&Ei.test(t))}class Q extends E{_parse(e){if(this._def.coerce&&(e.data=String(e.data)),this._getType(e)!==v.string){const n=this._getOrReturnCtx(e);return b(n,{code:m.invalid_type,expected:v.string,received:n.parsedType}),N}const r=new z;let i;for(const n of this._def.checks)if(n.kind==="min")e.data.length<n.value&&(i=this._getOrReturnCtx(e,i),b(i,{code:m.too_small,minimum:n.value,type:"string",inclusive:!0,exact:!1,message:n.message}),r.dirty());else if(n.kind==="max")e.data.length>n.value&&(i=this._getOrReturnCtx(e,i),b(i,{code:m.too_big,maximum:n.value,type:"string",inclusive:!0,exact:!1,message:n.message}),r.dirty());else if(n.kind==="length"){const o=e.data.length>n.value,l=e.data.length<n.value;(o||l)&&(i=this._getOrReturnCtx(e,i),o?b(i,{code:m.too_big,maximum:n.value,type:"string",inclusive:!0,exact:!0,message:n.message}):l&&b(i,{code:m.too_small,minimum:n.value,type:"string",inclusive:!0,exact:!0,message:n.message}),r.dirty())}else if(n.kind==="email")Ni.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"email",code:m.invalid_string,message:n.message}),r.dirty());else if(n.kind==="emoji")ft||(ft=new RegExp(Si,"u")),ft.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"emoji",code:m.invalid_string,message:n.message}),r.dirty());else if(n.kind==="uuid")_i.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"uuid",code:m.invalid_string,message:n.message}),r.dirty());else if(n.kind==="nanoid")ki.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"nanoid",code:m.invalid_string,message:n.message}),r.dirty());else if(n.kind==="cuid")gi.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"cuid",code:m.invalid_string,message:n.message}),r.dirty());else if(n.kind==="cuid2")yi.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"cuid2",code:m.invalid_string,message:n.message}),r.dirty());else if(n.kind==="ulid")vi.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"ulid",code:m.invalid_string,message:n.message}),r.dirty());else if(n.kind==="url")try{new URL(e.data)}catch{i=this._getOrReturnCtx(e,i),b(i,{validation:"url",code:m.invalid_string,message:n.message}),r.dirty()}else n.kind==="regex"?(n.regex.lastIndex=0,n.regex.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"regex",code:m.invalid_string,message:n.message}),r.dirty())):n.kind==="trim"?e.data=e.data.trim():n.kind==="includes"?e.data.includes(n.value,n.position)||(i=this._getOrReturnCtx(e,i),b(i,{code:m.invalid_string,validation:{includes:n.value,position:n.position},message:n.message}),r.dirty()):n.kind==="toLowerCase"?e.data=e.data.toLowerCase():n.kind==="toUpperCase"?e.data=e.data.toUpperCase():n.kind==="startsWith"?e.data.startsWith(n.value)||(i=this._getOrReturnCtx(e,i),b(i,{code:m.invalid_string,validation:{startsWith:n.value},message:n.message}),r.dirty()):n.kind==="endsWith"?e.data.endsWith(n.value)||(i=this._getOrReturnCtx(e,i),b(i,{code:m.invalid_string,validation:{endsWith:n.value},message:n.message}),r.dirty()):n.kind==="datetime"?Oi(n).test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{code:m.invalid_string,validation:"datetime",message:n.message}),r.dirty()):n.kind==="date"?$i.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{code:m.invalid_string,validation:"date",message:n.message}),r.dirty()):n.kind==="time"?Li(n).test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{code:m.invalid_string,validation:"time",message:n.message}),r.dirty()):n.kind==="duration"?xi.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"duration",code:m.invalid_string,message:n.message}),r.dirty()):n.kind==="ip"?Pi(e.data,n.version)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"ip",code:m.invalid_string,message:n.message}),r.dirty()):n.kind==="jwt"?ji(e.data,n.alg)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"jwt",code:m.invalid_string,message:n.message}),r.dirty()):n.kind==="cidr"?Fi(e.data,n.version)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"cidr",code:m.invalid_string,message:n.message}),r.dirty()):n.kind==="base64"?Ii.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"base64",code:m.invalid_string,message:n.message}),r.dirty()):n.kind==="base64url"?Ri.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"base64url",code:m.invalid_string,message:n.message}),r.dirty()):I.assertNever(n);return{status:r.value,value:e.data}}_regex(e,a,r){return this.refinement(i=>e.test(i),{validation:a,code:m.invalid_string,...k.errToObj(r)})}_addCheck(e){return new Q({...this._def,checks:[...this._def.checks,e]})}email(e){return this._addCheck({kind:"email",...k.errToObj(e)})}url(e){return this._addCheck({kind:"url",...k.errToObj(e)})}emoji(e){return this._addCheck({kind:"emoji",...k.errToObj(e)})}uuid(e){return this._addCheck({kind:"uuid",...k.errToObj(e)})}nanoid(e){return this._addCheck({kind:"nanoid",...k.errToObj(e)})}cuid(e){return this._addCheck({kind:"cuid",...k.errToObj(e)})}cuid2(e){return this._addCheck({kind:"cuid2",...k.errToObj(e)})}ulid(e){return this._addCheck({kind:"ulid",...k.errToObj(e)})}base64(e){return this._addCheck({kind:"base64",...k.errToObj(e)})}base64url(e){return this._addCheck({kind:"base64url",...k.errToObj(e)})}jwt(e){return this._addCheck({kind:"jwt",...k.errToObj(e)})}ip(e){return this._addCheck({kind:"ip",...k.errToObj(e)})}cidr(e){return this._addCheck({kind:"cidr",...k.errToObj(e)})}datetime(e){return typeof e=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:e}):this._addCheck({kind:"datetime",precision:typeof e?.precision>"u"?null:e?.precision,offset:e?.offset??!1,local:e?.local??!1,...k.errToObj(e?.message)})}date(e){return this._addCheck({kind:"date",message:e})}time(e){return typeof e=="string"?this._addCheck({kind:"time",precision:null,message:e}):this._addCheck({kind:"time",precision:typeof e?.precision>"u"?null:e?.precision,...k.errToObj(e?.message)})}duration(e){return this._addCheck({kind:"duration",...k.errToObj(e)})}regex(e,a){return this._addCheck({kind:"regex",regex:e,...k.errToObj(a)})}includes(e,a){return this._addCheck({kind:"includes",value:e,position:a?.position,...k.errToObj(a?.message)})}startsWith(e,a){return this._addCheck({kind:"startsWith",value:e,...k.errToObj(a)})}endsWith(e,a){return this._addCheck({kind:"endsWith",value:e,...k.errToObj(a)})}min(e,a){return this._addCheck({kind:"min",value:e,...k.errToObj(a)})}max(e,a){return this._addCheck({kind:"max",value:e,...k.errToObj(a)})}length(e,a){return this._addCheck({kind:"length",value:e,...k.errToObj(a)})}nonempty(e){return this.min(1,k.errToObj(e))}trim(){return new Q({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new Q({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new Q({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(e=>e.kind==="datetime")}get isDate(){return!!this._def.checks.find(e=>e.kind==="date")}get isTime(){return!!this._def.checks.find(e=>e.kind==="time")}get isDuration(){return!!this._def.checks.find(e=>e.kind==="duration")}get isEmail(){return!!this._def.checks.find(e=>e.kind==="email")}get isURL(){return!!this._def.checks.find(e=>e.kind==="url")}get isEmoji(){return!!this._def.checks.find(e=>e.kind==="emoji")}get isUUID(){return!!this._def.checks.find(e=>e.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(e=>e.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(e=>e.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(e=>e.kind==="cuid2")}get isULID(){return!!this._def.checks.find(e=>e.kind==="ulid")}get isIP(){return!!this._def.checks.find(e=>e.kind==="ip")}get isCIDR(){return!!this._def.checks.find(e=>e.kind==="cidr")}get isBase64(){return!!this._def.checks.find(e=>e.kind==="base64")}get isBase64url(){return!!this._def.checks.find(e=>e.kind==="base64url")}get minLength(){let e=null;for(const a of this._def.checks)a.kind==="min"&&(e===null||a.value>e)&&(e=a.value);return e}get maxLength(){let e=null;for(const a of this._def.checks)a.kind==="max"&&(e===null||a.value<e)&&(e=a.value);return e}}Q.create=t=>new Q({checks:[],typeName:S.ZodString,coerce:t?.coerce??!1,...T(t)});function Mi(t,e){const a=(t.toString().split(".")[1]||"").length,r=(e.toString().split(".")[1]||"").length,i=a>r?a:r,n=Number.parseInt(t.toFixed(i).replace(".","")),o=Number.parseInt(e.toFixed(i).replace(".",""));return n%o/10**i}class ve extends E{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(e){if(this._def.coerce&&(e.data=Number(e.data)),this._getType(e)!==v.number){const n=this._getOrReturnCtx(e);return b(n,{code:m.invalid_type,expected:v.number,received:n.parsedType}),N}let r;const i=new z;for(const n of this._def.checks)n.kind==="int"?I.isInteger(e.data)||(r=this._getOrReturnCtx(e,r),b(r,{code:m.invalid_type,expected:"integer",received:"float",message:n.message}),i.dirty()):n.kind==="min"?(n.inclusive?e.data<n.value:e.data<=n.value)&&(r=this._getOrReturnCtx(e,r),b(r,{code:m.too_small,minimum:n.value,type:"number",inclusive:n.inclusive,exact:!1,message:n.message}),i.dirty()):n.kind==="max"?(n.inclusive?e.data>n.value:e.data>=n.value)&&(r=this._getOrReturnCtx(e,r),b(r,{code:m.too_big,maximum:n.value,type:"number",inclusive:n.inclusive,exact:!1,message:n.message}),i.dirty()):n.kind==="multipleOf"?Mi(e.data,n.value)!==0&&(r=this._getOrReturnCtx(e,r),b(r,{code:m.not_multiple_of,multipleOf:n.value,message:n.message}),i.dirty()):n.kind==="finite"?Number.isFinite(e.data)||(r=this._getOrReturnCtx(e,r),b(r,{code:m.not_finite,message:n.message}),i.dirty()):I.assertNever(n);return{status:i.value,value:e.data}}gte(e,a){return this.setLimit("min",e,!0,k.toString(a))}gt(e,a){return this.setLimit("min",e,!1,k.toString(a))}lte(e,a){return this.setLimit("max",e,!0,k.toString(a))}lt(e,a){return this.setLimit("max",e,!1,k.toString(a))}setLimit(e,a,r,i){return new ve({...this._def,checks:[...this._def.checks,{kind:e,value:a,inclusive:r,message:k.toString(i)}]})}_addCheck(e){return new ve({...this._def,checks:[...this._def.checks,e]})}int(e){return this._addCheck({kind:"int",message:k.toString(e)})}positive(e){return this._addCheck({kind:"min",value:0,inclusive:!1,message:k.toString(e)})}negative(e){return this._addCheck({kind:"max",value:0,inclusive:!1,message:k.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:0,inclusive:!0,message:k.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:0,inclusive:!0,message:k.toString(e)})}multipleOf(e,a){return this._addCheck({kind:"multipleOf",value:e,message:k.toString(a)})}finite(e){return this._addCheck({kind:"finite",message:k.toString(e)})}safe(e){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:k.toString(e)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:k.toString(e)})}get minValue(){let e=null;for(const a of this._def.checks)a.kind==="min"&&(e===null||a.value>e)&&(e=a.value);return e}get maxValue(){let e=null;for(const a of this._def.checks)a.kind==="max"&&(e===null||a.value<e)&&(e=a.value);return e}get isInt(){return!!this._def.checks.find(e=>e.kind==="int"||e.kind==="multipleOf"&&I.isInteger(e.value))}get isFinite(){let e=null,a=null;for(const r of this._def.checks){if(r.kind==="finite"||r.kind==="int"||r.kind==="multipleOf")return!0;r.kind==="min"?(a===null||r.value>a)&&(a=r.value):r.kind==="max"&&(e===null||r.value<e)&&(e=r.value)}return Number.isFinite(a)&&Number.isFinite(e)}}ve.create=t=>new ve({checks:[],typeName:S.ZodNumber,coerce:t?.coerce||!1,...T(t)});class Ae extends E{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(e){if(this._def.coerce)try{e.data=BigInt(e.data)}catch{return this._getInvalidInput(e)}if(this._getType(e)!==v.bigint)return this._getInvalidInput(e);let r;const i=new z;for(const n of this._def.checks)n.kind==="min"?(n.inclusive?e.data<n.value:e.data<=n.value)&&(r=this._getOrReturnCtx(e,r),b(r,{code:m.too_small,type:"bigint",minimum:n.value,inclusive:n.inclusive,message:n.message}),i.dirty()):n.kind==="max"?(n.inclusive?e.data>n.value:e.data>=n.value)&&(r=this._getOrReturnCtx(e,r),b(r,{code:m.too_big,type:"bigint",maximum:n.value,inclusive:n.inclusive,message:n.message}),i.dirty()):n.kind==="multipleOf"?e.data%n.value!==BigInt(0)&&(r=this._getOrReturnCtx(e,r),b(r,{code:m.not_multiple_of,multipleOf:n.value,message:n.message}),i.dirty()):I.assertNever(n);return{status:i.value,value:e.data}}_getInvalidInput(e){const a=this._getOrReturnCtx(e);return b(a,{code:m.invalid_type,expected:v.bigint,received:a.parsedType}),N}gte(e,a){return this.setLimit("min",e,!0,k.toString(a))}gt(e,a){return this.setLimit("min",e,!1,k.toString(a))}lte(e,a){return this.setLimit("max",e,!0,k.toString(a))}lt(e,a){return this.setLimit("max",e,!1,k.toString(a))}setLimit(e,a,r,i){return new Ae({...this._def,checks:[...this._def.checks,{kind:e,value:a,inclusive:r,message:k.toString(i)}]})}_addCheck(e){return new Ae({...this._def,checks:[...this._def.checks,e]})}positive(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:k.toString(e)})}negative(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:k.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:k.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:k.toString(e)})}multipleOf(e,a){return this._addCheck({kind:"multipleOf",value:e,message:k.toString(a)})}get minValue(){let e=null;for(const a of this._def.checks)a.kind==="min"&&(e===null||a.value>e)&&(e=a.value);return e}get maxValue(){let e=null;for(const a of this._def.checks)a.kind==="max"&&(e===null||a.value<e)&&(e=a.value);return e}}Ae.create=t=>new Ae({checks:[],typeName:S.ZodBigInt,coerce:t?.coerce??!1,...T(t)});class Ct extends E{_parse(e){if(this._def.coerce&&(e.data=!!e.data),this._getType(e)!==v.boolean){const r=this._getOrReturnCtx(e);return b(r,{code:m.invalid_type,expected:v.boolean,received:r.parsedType}),N}return W(e.data)}}Ct.create=t=>new Ct({typeName:S.ZodBoolean,coerce:t?.coerce||!1,...T(t)});class Ye extends E{_parse(e){if(this._def.coerce&&(e.data=new Date(e.data)),this._getType(e)!==v.date){const n=this._getOrReturnCtx(e);return b(n,{code:m.invalid_type,expected:v.date,received:n.parsedType}),N}if(Number.isNaN(e.data.getTime())){const n=this._getOrReturnCtx(e);return b(n,{code:m.invalid_date}),N}const r=new z;let i;for(const n of this._def.checks)n.kind==="min"?e.data.getTime()<n.value&&(i=this._getOrReturnCtx(e,i),b(i,{code:m.too_small,message:n.message,inclusive:!0,exact:!1,minimum:n.value,type:"date"}),r.dirty()):n.kind==="max"?e.data.getTime()>n.value&&(i=this._getOrReturnCtx(e,i),b(i,{code:m.too_big,message:n.message,inclusive:!0,exact:!1,maximum:n.value,type:"date"}),r.dirty()):I.assertNever(n);return{status:r.value,value:new Date(e.data.getTime())}}_addCheck(e){return new Ye({...this._def,checks:[...this._def.checks,e]})}min(e,a){return this._addCheck({kind:"min",value:e.getTime(),message:k.toString(a)})}max(e,a){return this._addCheck({kind:"max",value:e.getTime(),message:k.toString(a)})}get minDate(){let e=null;for(const a of this._def.checks)a.kind==="min"&&(e===null||a.value>e)&&(e=a.value);return e!=null?new Date(e):null}get maxDate(){let e=null;for(const a of this._def.checks)a.kind==="max"&&(e===null||a.value<e)&&(e=a.value);return e!=null?new Date(e):null}}Ye.create=t=>new Ye({checks:[],coerce:t?.coerce||!1,typeName:S.ZodDate,...T(t)});class ba extends E{_parse(e){if(this._getType(e)!==v.symbol){const r=this._getOrReturnCtx(e);return b(r,{code:m.invalid_type,expected:v.symbol,received:r.parsedType}),N}return W(e.data)}}ba.create=t=>new ba({typeName:S.ZodSymbol,...T(t)});class Tt extends E{_parse(e){if(this._getType(e)!==v.undefined){const r=this._getOrReturnCtx(e);return b(r,{code:m.invalid_type,expected:v.undefined,received:r.parsedType}),N}return W(e.data)}}Tt.create=t=>new Tt({typeName:S.ZodUndefined,...T(t)});class At extends E{_parse(e){if(this._getType(e)!==v.null){const r=this._getOrReturnCtx(e);return b(r,{code:m.invalid_type,expected:v.null,received:r.parsedType}),N}return W(e.data)}}At.create=t=>new At({typeName:S.ZodNull,...T(t)});class ga extends E{constructor(){super(...arguments),this._any=!0}_parse(e){return W(e.data)}}ga.create=t=>new ga({typeName:S.ZodAny,...T(t)});class ya extends E{constructor(){super(...arguments),this._unknown=!0}_parse(e){return W(e.data)}}ya.create=t=>new ya({typeName:S.ZodUnknown,...T(t)});class oe extends E{_parse(e){const a=this._getOrReturnCtx(e);return b(a,{code:m.invalid_type,expected:v.never,received:a.parsedType}),N}}oe.create=t=>new oe({typeName:S.ZodNever,...T(t)});class va extends E{_parse(e){if(this._getType(e)!==v.undefined){const r=this._getOrReturnCtx(e);return b(r,{code:m.invalid_type,expected:v.void,received:r.parsedType}),N}return W(e.data)}}va.create=t=>new va({typeName:S.ZodVoid,...T(t)});class X extends E{_parse(e){const{ctx:a,status:r}=this._processInputParams(e),i=this._def;if(a.parsedType!==v.array)return b(a,{code:m.invalid_type,expected:v.array,received:a.parsedType}),N;if(i.exactLength!==null){const o=a.data.length>i.exactLength.value,l=a.data.length<i.exactLength.value;(o||l)&&(b(a,{code:o?m.too_big:m.too_small,minimum:l?i.exactLength.value:void 0,maximum:o?i.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:i.exactLength.message}),r.dirty())}if(i.minLength!==null&&a.data.length<i.minLength.value&&(b(a,{code:m.too_small,minimum:i.minLength.value,type:"array",inclusive:!0,exact:!1,message:i.minLength.message}),r.dirty()),i.maxLength!==null&&a.data.length>i.maxLength.value&&(b(a,{code:m.too_big,maximum:i.maxLength.value,type:"array",inclusive:!0,exact:!1,message:i.maxLength.message}),r.dirty()),a.common.async)return Promise.all([...a.data].map((o,l)=>i.type._parseAsync(new G(a,o,a.path,l)))).then(o=>z.mergeArray(r,o));const n=[...a.data].map((o,l)=>i.type._parseSync(new G(a,o,a.path,l)));return z.mergeArray(r,n)}get element(){return this._def.type}min(e,a){return new X({...this._def,minLength:{value:e,message:k.toString(a)}})}max(e,a){return new X({...this._def,maxLength:{value:e,message:k.toString(a)}})}length(e,a){return new X({...this._def,exactLength:{value:e,message:k.toString(a)}})}nonempty(e){return this.min(1,e)}}X.create=(t,e)=>new X({type:t,minLength:null,maxLength:null,exactLength:null,typeName:S.ZodArray,...T(e)});function fe(t){if(t instanceof M){const e={};for(const a in t.shape){const r=t.shape[a];e[a]=ee.create(fe(r))}return new M({...t._def,shape:()=>e})}else return t instanceof X?new X({...t._def,type:fe(t.element)}):t instanceof ee?ee.create(fe(t.unwrap())):t instanceof pe?pe.create(fe(t.unwrap())):t instanceof ue?ue.create(t.items.map(e=>fe(e))):t}class M extends E{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;const e=this._def.shape(),a=I.objectKeys(e);return this._cached={shape:e,keys:a},this._cached}_parse(e){if(this._getType(e)!==v.object){const d=this._getOrReturnCtx(e);return b(d,{code:m.invalid_type,expected:v.object,received:d.parsedType}),N}const{status:r,ctx:i}=this._processInputParams(e),{shape:n,keys:o}=this._getCached(),l=[];if(!(this._def.catchall instanceof oe&&this._def.unknownKeys==="strip"))for(const d in i.data)o.includes(d)||l.push(d);const c=[];for(const d of o){const h=n[d],u=i.data[d];c.push({key:{status:"valid",value:d},value:h._parse(new G(i,u,i.path,d)),alwaysSet:d in i.data})}if(this._def.catchall instanceof oe){const d=this._def.unknownKeys;if(d==="passthrough")for(const h of l)c.push({key:{status:"valid",value:h},value:{status:"valid",value:i.data[h]}});else if(d==="strict")l.length>0&&(b(i,{code:m.unrecognized_keys,keys:l}),r.dirty());else if(d!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{const d=this._def.catchall;for(const h of l){const u=i.data[h];c.push({key:{status:"valid",value:h},value:d._parse(new G(i,u,i.path,h)),alwaysSet:h in i.data})}}return i.common.async?Promise.resolve().then(async()=>{const d=[];for(const h of c){const u=await h.key,g=await h.value;d.push({key:u,value:g,alwaysSet:h.alwaysSet})}return d}).then(d=>z.mergeObjectSync(r,d)):z.mergeObjectSync(r,c)}get shape(){return this._def.shape()}strict(e){return k.errToObj,new M({...this._def,unknownKeys:"strict",...e!==void 0?{errorMap:(a,r)=>{const i=this._def.errorMap?.(a,r).message??r.defaultError;return a.code==="unrecognized_keys"?{message:k.errToObj(e).message??i}:{message:i}}}:{}})}strip(){return new M({...this._def,unknownKeys:"strip"})}passthrough(){return new M({...this._def,unknownKeys:"passthrough"})}extend(e){return new M({...this._def,shape:()=>({...this._def.shape(),...e})})}merge(e){return new M({unknownKeys:e._def.unknownKeys,catchall:e._def.catchall,shape:()=>({...this._def.shape(),...e._def.shape()}),typeName:S.ZodObject})}setKey(e,a){return this.augment({[e]:a})}catchall(e){return new M({...this._def,catchall:e})}pick(e){const a={};for(const r of I.objectKeys(e))e[r]&&this.shape[r]&&(a[r]=this.shape[r]);return new M({...this._def,shape:()=>a})}omit(e){const a={};for(const r of I.objectKeys(this.shape))e[r]||(a[r]=this.shape[r]);return new M({...this._def,shape:()=>a})}deepPartial(){return fe(this)}partial(e){const a={};for(const r of I.objectKeys(this.shape)){const i=this.shape[r];e&&!e[r]?a[r]=i:a[r]=i.optional()}return new M({...this._def,shape:()=>a})}required(e){const a={};for(const r of I.objectKeys(this.shape))if(e&&!e[r])a[r]=this.shape[r];else{let n=this.shape[r];for(;n instanceof ee;)n=n._def.innerType;a[r]=n}return new M({...this._def,shape:()=>a})}keyof(){return rr(I.objectKeys(this.shape))}}M.create=(t,e)=>new M({shape:()=>t,unknownKeys:"strip",catchall:oe.create(),typeName:S.ZodObject,...T(e)});M.strictCreate=(t,e)=>new M({shape:()=>t,unknownKeys:"strict",catchall:oe.create(),typeName:S.ZodObject,...T(e)});M.lazycreate=(t,e)=>new M({shape:t,unknownKeys:"strip",catchall:oe.create(),typeName:S.ZodObject,...T(e)});class Ge extends E{_parse(e){const{ctx:a}=this._processInputParams(e),r=this._def.options;function i(n){for(const l of n)if(l.result.status==="valid")return l.result;for(const l of n)if(l.result.status==="dirty")return a.common.issues.push(...l.ctx.common.issues),l.result;const o=n.map(l=>new ae(l.ctx.common.issues));return b(a,{code:m.invalid_union,unionErrors:o}),N}if(a.common.async)return Promise.all(r.map(async n=>{const o={...a,common:{...a.common,issues:[]},parent:null};return{result:await n._parseAsync({data:a.data,path:a.path,parent:o}),ctx:o}})).then(i);{let n;const o=[];for(const c of r){const d={...a,common:{...a.common,issues:[]},parent:null},h=c._parseSync({data:a.data,path:a.path,parent:d});if(h.status==="valid")return h;h.status==="dirty"&&!n&&(n={result:h,ctx:d}),d.common.issues.length&&o.push(d.common.issues)}if(n)return a.common.issues.push(...n.ctx.common.issues),n.result;const l=o.map(c=>new ae(c));return b(a,{code:m.invalid_union,unionErrors:l}),N}}get options(){return this._def.options}}Ge.create=(t,e)=>new Ge({options:t,typeName:S.ZodUnion,...T(e)});const J=t=>t instanceof It?J(t.schema):t instanceof le?J(t.innerType()):t instanceof Qe?[t.value]:t instanceof he?t.options:t instanceof Rt?I.objectValues(t.enum):t instanceof tt?J(t._def.innerType):t instanceof Tt?[void 0]:t instanceof At?[null]:t instanceof ee?[void 0,...J(t.unwrap())]:t instanceof pe?[null,...J(t.unwrap())]:t instanceof ir||t instanceof rt?J(t.unwrap()):t instanceof at?J(t._def.innerType):[];class Wt extends E{_parse(e){const{ctx:a}=this._processInputParams(e);if(a.parsedType!==v.object)return b(a,{code:m.invalid_type,expected:v.object,received:a.parsedType}),N;const r=this.discriminator,i=a.data[r],n=this.optionsMap.get(i);return n?a.common.async?n._parseAsync({data:a.data,path:a.path,parent:a}):n._parseSync({data:a.data,path:a.path,parent:a}):(b(a,{code:m.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[r]}),N)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(e,a,r){const i=new Map;for(const n of a){const o=J(n.shape[e]);if(!o.length)throw new Error(`A discriminator value for key \`${e}\` could not be extracted from all schema options`);for(const l of o){if(i.has(l))throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(l)}`);i.set(l,n)}}return new Wt({typeName:S.ZodDiscriminatedUnion,discriminator:e,options:a,optionsMap:i,...T(r)})}}function Et(t,e){const a=se(t),r=se(e);if(t===e)return{valid:!0,data:t};if(a===v.object&&r===v.object){const i=I.objectKeys(e),n=I.objectKeys(t).filter(l=>i.indexOf(l)!==-1),o={...t,...e};for(const l of n){const c=Et(t[l],e[l]);if(!c.valid)return{valid:!1};o[l]=c.data}return{valid:!0,data:o}}else if(a===v.array&&r===v.array){if(t.length!==e.length)return{valid:!1};const i=[];for(let n=0;n<t.length;n++){const o=t[n],l=e[n],c=Et(o,l);if(!c.valid)return{valid:!1};i.push(c.data)}return{valid:!0,data:i}}else return a===v.date&&r===v.date&&+t==+e?{valid:!0,data:t}:{valid:!1}}class Je extends E{_parse(e){const{status:a,ctx:r}=this._processInputParams(e),i=(n,o)=>{if(pa(n)||pa(o))return N;const l=Et(n.value,o.value);return l.valid?((ma(n)||ma(o))&&a.dirty(),{status:a.value,value:l.data}):(b(r,{code:m.invalid_intersection_types}),N)};return r.common.async?Promise.all([this._def.left._parseAsync({data:r.data,path:r.path,parent:r}),this._def.right._parseAsync({data:r.data,path:r.path,parent:r})]).then(([n,o])=>i(n,o)):i(this._def.left._parseSync({data:r.data,path:r.path,parent:r}),this._def.right._parseSync({data:r.data,path:r.path,parent:r}))}}Je.create=(t,e,a)=>new Je({left:t,right:e,typeName:S.ZodIntersection,...T(a)});class ue extends E{_parse(e){const{status:a,ctx:r}=this._processInputParams(e);if(r.parsedType!==v.array)return b(r,{code:m.invalid_type,expected:v.array,received:r.parsedType}),N;if(r.data.length<this._def.items.length)return b(r,{code:m.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),N;!this._def.rest&&r.data.length>this._def.items.length&&(b(r,{code:m.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),a.dirty());const n=[...r.data].map((o,l)=>{const c=this._def.items[l]||this._def.rest;return c?c._parse(new G(r,o,r.path,l)):null}).filter(o=>!!o);return r.common.async?Promise.all(n).then(o=>z.mergeArray(a,o)):z.mergeArray(a,n)}get items(){return this._def.items}rest(e){return new ue({...this._def,rest:e})}}ue.create=(t,e)=>{if(!Array.isArray(t))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new ue({items:t,typeName:S.ZodTuple,rest:null,...T(e)})};class Ke extends E{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){const{status:a,ctx:r}=this._processInputParams(e);if(r.parsedType!==v.object)return b(r,{code:m.invalid_type,expected:v.object,received:r.parsedType}),N;const i=[],n=this._def.keyType,o=this._def.valueType;for(const l in r.data)i.push({key:n._parse(new G(r,l,r.path,l)),value:o._parse(new G(r,r.data[l],r.path,l)),alwaysSet:l in r.data});return r.common.async?z.mergeObjectAsync(a,i):z.mergeObjectSync(a,i)}get element(){return this._def.valueType}static create(e,a,r){return a instanceof E?new Ke({keyType:e,valueType:a,typeName:S.ZodRecord,...T(r)}):new Ke({keyType:Q.create(),valueType:e,typeName:S.ZodRecord,...T(a)})}}class _a extends E{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){const{status:a,ctx:r}=this._processInputParams(e);if(r.parsedType!==v.map)return b(r,{code:m.invalid_type,expected:v.map,received:r.parsedType}),N;const i=this._def.keyType,n=this._def.valueType,o=[...r.data.entries()].map(([l,c],d)=>({key:i._parse(new G(r,l,r.path,[d,"key"])),value:n._parse(new G(r,c,r.path,[d,"value"]))}));if(r.common.async){const l=new Map;return Promise.resolve().then(async()=>{for(const c of o){const d=await c.key,h=await c.value;if(d.status==="aborted"||h.status==="aborted")return N;(d.status==="dirty"||h.status==="dirty")&&a.dirty(),l.set(d.value,h.value)}return{status:a.value,value:l}})}else{const l=new Map;for(const c of o){const d=c.key,h=c.value;if(d.status==="aborted"||h.status==="aborted")return N;(d.status==="dirty"||h.status==="dirty")&&a.dirty(),l.set(d.value,h.value)}return{status:a.value,value:l}}}}_a.create=(t,e,a)=>new _a({valueType:e,keyType:t,typeName:S.ZodMap,...T(a)});class Ee extends E{_parse(e){const{status:a,ctx:r}=this._processInputParams(e);if(r.parsedType!==v.set)return b(r,{code:m.invalid_type,expected:v.set,received:r.parsedType}),N;const i=this._def;i.minSize!==null&&r.data.size<i.minSize.value&&(b(r,{code:m.too_small,minimum:i.minSize.value,type:"set",inclusive:!0,exact:!1,message:i.minSize.message}),a.dirty()),i.maxSize!==null&&r.data.size>i.maxSize.value&&(b(r,{code:m.too_big,maximum:i.maxSize.value,type:"set",inclusive:!0,exact:!1,message:i.maxSize.message}),a.dirty());const n=this._def.valueType;function o(c){const d=new Set;for(const h of c){if(h.status==="aborted")return N;h.status==="dirty"&&a.dirty(),d.add(h.value)}return{status:a.value,value:d}}const l=[...r.data.values()].map((c,d)=>n._parse(new G(r,c,r.path,d)));return r.common.async?Promise.all(l).then(c=>o(c)):o(l)}min(e,a){return new Ee({...this._def,minSize:{value:e,message:k.toString(a)}})}max(e,a){return new Ee({...this._def,maxSize:{value:e,message:k.toString(a)}})}size(e,a){return this.min(e,a).max(e,a)}nonempty(e){return this.min(1,e)}}Ee.create=(t,e)=>new Ee({valueType:t,minSize:null,maxSize:null,typeName:S.ZodSet,...T(e)});class It extends E{get schema(){return this._def.getter()}_parse(e){const{ctx:a}=this._processInputParams(e);return this._def.getter()._parse({data:a.data,path:a.path,parent:a})}}It.create=(t,e)=>new It({getter:t,typeName:S.ZodLazy,...T(e)});class Qe extends E{_parse(e){if(e.data!==this._def.value){const a=this._getOrReturnCtx(e);return b(a,{received:a.data,code:m.invalid_literal,expected:this._def.value}),N}return{status:"valid",value:e.data}}get value(){return this._def.value}}Qe.create=(t,e)=>new Qe({value:t,typeName:S.ZodLiteral,...T(e)});function rr(t,e){return new he({values:t,typeName:S.ZodEnum,...T(e)})}class he extends E{_parse(e){if(typeof e.data!="string"){const a=this._getOrReturnCtx(e),r=this._def.values;return b(a,{expected:I.joinValues(r),received:a.parsedType,code:m.invalid_type}),N}if(this._cache||(this._cache=new Set(this._def.values)),!this._cache.has(e.data)){const a=this._getOrReturnCtx(e),r=this._def.values;return b(a,{received:a.data,code:m.invalid_enum_value,options:r}),N}return W(e.data)}get options(){return this._def.values}get enum(){const e={};for(const a of this._def.values)e[a]=a;return e}get Values(){const e={};for(const a of this._def.values)e[a]=a;return e}get Enum(){const e={};for(const a of this._def.values)e[a]=a;return e}extract(e,a=this._def){return he.create(e,{...this._def,...a})}exclude(e,a=this._def){return he.create(this.options.filter(r=>!e.includes(r)),{...this._def,...a})}}he.create=rr;class Rt extends E{_parse(e){const a=I.getValidEnumValues(this._def.values),r=this._getOrReturnCtx(e);if(r.parsedType!==v.string&&r.parsedType!==v.number){const i=I.objectValues(a);return b(r,{expected:I.joinValues(i),received:r.parsedType,code:m.invalid_type}),N}if(this._cache||(this._cache=new Set(I.getValidEnumValues(this._def.values))),!this._cache.has(e.data)){const i=I.objectValues(a);return b(r,{received:r.data,code:m.invalid_enum_value,options:i}),N}return W(e.data)}get enum(){return this._def.values}}Rt.create=(t,e)=>new Rt({values:t,typeName:S.ZodNativeEnum,...T(e)});class et extends E{unwrap(){return this._def.type}_parse(e){const{ctx:a}=this._processInputParams(e);if(a.parsedType!==v.promise&&a.common.async===!1)return b(a,{code:m.invalid_type,expected:v.promise,received:a.parsedType}),N;const r=a.parsedType===v.promise?a.data:Promise.resolve(a.data);return W(r.then(i=>this._def.type.parseAsync(i,{path:a.path,errorMap:a.common.contextualErrorMap})))}}et.create=(t,e)=>new et({type:t,typeName:S.ZodPromise,...T(e)});class le extends E{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===S.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(e){const{status:a,ctx:r}=this._processInputParams(e),i=this._def.effect||null,n={addIssue:o=>{b(r,o),o.fatal?a.abort():a.dirty()},get path(){return r.path}};if(n.addIssue=n.addIssue.bind(n),i.type==="preprocess"){const o=i.transform(r.data,n);if(r.common.async)return Promise.resolve(o).then(async l=>{if(a.value==="aborted")return N;const c=await this._def.schema._parseAsync({data:l,path:r.path,parent:r});return c.status==="aborted"?N:c.status==="dirty"||a.value==="dirty"?Se(c.value):c});{if(a.value==="aborted")return N;const l=this._def.schema._parseSync({data:o,path:r.path,parent:r});return l.status==="aborted"?N:l.status==="dirty"||a.value==="dirty"?Se(l.value):l}}if(i.type==="refinement"){const o=l=>{const c=i.refinement(l,n);if(r.common.async)return Promise.resolve(c);if(c instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return l};if(r.common.async===!1){const l=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});return l.status==="aborted"?N:(l.status==="dirty"&&a.dirty(),o(l.value),{status:a.value,value:l.value})}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(l=>l.status==="aborted"?N:(l.status==="dirty"&&a.dirty(),o(l.value).then(()=>({status:a.value,value:l.value}))))}if(i.type==="transform")if(r.common.async===!1){const o=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});if(!ye(o))return N;const l=i.transform(o.value,n);if(l instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:a.value,value:l}}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(o=>ye(o)?Promise.resolve(i.transform(o.value,n)).then(l=>({status:a.value,value:l})):N);I.assertNever(i)}}le.create=(t,e,a)=>new le({schema:t,typeName:S.ZodEffects,effect:e,...T(a)});le.createWithPreprocess=(t,e,a)=>new le({schema:e,effect:{type:"preprocess",transform:t},typeName:S.ZodEffects,...T(a)});class ee extends E{_parse(e){return this._getType(e)===v.undefined?W(void 0):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}ee.create=(t,e)=>new ee({innerType:t,typeName:S.ZodOptional,...T(e)});class pe extends E{_parse(e){return this._getType(e)===v.null?W(null):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}pe.create=(t,e)=>new pe({innerType:t,typeName:S.ZodNullable,...T(e)});class tt extends E{_parse(e){const{ctx:a}=this._processInputParams(e);let r=a.data;return a.parsedType===v.undefined&&(r=this._def.defaultValue()),this._def.innerType._parse({data:r,path:a.path,parent:a})}removeDefault(){return this._def.innerType}}tt.create=(t,e)=>new tt({innerType:t,typeName:S.ZodDefault,defaultValue:typeof e.default=="function"?e.default:()=>e.default,...T(e)});class at extends E{_parse(e){const{ctx:a}=this._processInputParams(e),r={...a,common:{...a.common,issues:[]}},i=this._def.innerType._parse({data:r.data,path:r.path,parent:{...r}});return Xe(i)?i.then(n=>({status:"valid",value:n.status==="valid"?n.value:this._def.catchValue({get error(){return new ae(r.common.issues)},input:r.data})})):{status:"valid",value:i.status==="valid"?i.value:this._def.catchValue({get error(){return new ae(r.common.issues)},input:r.data})}}removeCatch(){return this._def.innerType}}at.create=(t,e)=>new at({innerType:t,typeName:S.ZodCatch,catchValue:typeof e.catch=="function"?e.catch:()=>e.catch,...T(e)});class ka extends E{_parse(e){if(this._getType(e)!==v.nan){const r=this._getOrReturnCtx(e);return b(r,{code:m.invalid_type,expected:v.nan,received:r.parsedType}),N}return{status:"valid",value:e.data}}}ka.create=t=>new ka({typeName:S.ZodNaN,...T(t)});class ir extends E{_parse(e){const{ctx:a}=this._processInputParams(e),r=a.data;return this._def.type._parse({data:r,path:a.path,parent:a})}unwrap(){return this._def.type}}class qt extends E{_parse(e){const{status:a,ctx:r}=this._processInputParams(e);if(r.common.async)return(async()=>{const n=await this._def.in._parseAsync({data:r.data,path:r.path,parent:r});return n.status==="aborted"?N:n.status==="dirty"?(a.dirty(),Se(n.value)):this._def.out._parseAsync({data:n.value,path:r.path,parent:r})})();{const i=this._def.in._parseSync({data:r.data,path:r.path,parent:r});return i.status==="aborted"?N:i.status==="dirty"?(a.dirty(),{status:"dirty",value:i.value}):this._def.out._parseSync({data:i.value,path:r.path,parent:r})}}static create(e,a){return new qt({in:e,out:a,typeName:S.ZodPipeline})}}class rt extends E{_parse(e){const a=this._def.innerType._parse(e),r=i=>(ye(i)&&(i.value=Object.freeze(i.value)),i);return Xe(a)?a.then(i=>r(i)):r(a)}unwrap(){return this._def.innerType}}rt.create=(t,e)=>new rt({innerType:t,typeName:S.ZodReadonly,...T(e)});var S;(function(t){t.ZodString="ZodString",t.ZodNumber="ZodNumber",t.ZodNaN="ZodNaN",t.ZodBigInt="ZodBigInt",t.ZodBoolean="ZodBoolean",t.ZodDate="ZodDate",t.ZodSymbol="ZodSymbol",t.ZodUndefined="ZodUndefined",t.ZodNull="ZodNull",t.ZodAny="ZodAny",t.ZodUnknown="ZodUnknown",t.ZodNever="ZodNever",t.ZodVoid="ZodVoid",t.ZodArray="ZodArray",t.ZodObject="ZodObject",t.ZodUnion="ZodUnion",t.ZodDiscriminatedUnion="ZodDiscriminatedUnion",t.ZodIntersection="ZodIntersection",t.ZodTuple="ZodTuple",t.ZodRecord="ZodRecord",t.ZodMap="ZodMap",t.ZodSet="ZodSet",t.ZodFunction="ZodFunction",t.ZodLazy="ZodLazy",t.ZodLiteral="ZodLiteral",t.ZodEnum="ZodEnum",t.ZodEffects="ZodEffects",t.ZodNativeEnum="ZodNativeEnum",t.ZodOptional="ZodOptional",t.ZodNullable="ZodNullable",t.ZodDefault="ZodDefault",t.ZodCatch="ZodCatch",t.ZodPromise="ZodPromise",t.ZodBranded="ZodBranded",t.ZodPipeline="ZodPipeline",t.ZodReadonly="ZodReadonly"})(S||(S={}));const f=Q.create,V=ve.create,$t=Ct.create;oe.create;const L=X.create,A=M.create;Ge.create;const nr=Wt.create;Je.create;ue.create;const sr=Ke.create,re=Qe.create,B=he.create;et.create;ee.create;pe.create;const Xt=le.createWithPreprocess;var wa=".fabric/agents/",Di=["L0","L1","L2"],Zi=["mirror","cross-cutting","domain","local","global"],zi=["declared","derived"],Lt=B(Di),Ui=B(Zi),Hi=B(zi),or=A({summary:f(),intent_clues:L(f()),tech_stack:L(f()),impact:L(f()),must_read_if:f(),entities:L(f()).optional()}).strict();A({stable_id:f(),level:Lt,required:$t(),selectable:$t(),description:or}).strict();var Vi=A({file:f(),content_ref:f().optional(),scope_glob:f(),deps:L(f()),priority:B(["high","medium","low"]),level:Lt.optional(),layer:Lt,topology_type:Ui,hash:f(),stable_id:f().optional(),identity_source:Hi.optional(),activation:A({tier:B(["always","path","description"]),description:f().optional()}).optional(),description:or.optional()}),Bi=Xt(t=>!Gi(t)||typeof t.file!="string"?t:Ot(t),Vi),Wi=A({revision:f(),nodes:sr(Bi)});function Ot(t){const e=t.stable_id??lr(t.file),a=qi(t);return{...t,layer:t.layer??t.level??xa(t.file),level:t.level??t.layer??xa(t.file),topology_type:t.topology_type??Xi(t.file),stable_id:e,identity_source:a}}function lr(t){const e=Yt(t);return e==="AGENTS.md"||e===".fabric/bootstrap/README.md"?"bootstrap":dr(e).replace(/\.md$/u,"")}function qi(t){if(t.identity_source!==void 0)return t.identity_source;const e=lr(t.file);return t.stable_id!==void 0&&t.stable_id!==e?"declared":"derived"}function xa(t){const e=Yt(t);if(e==="AGENTS.md"||e===".fabric/bootstrap/README.md")return"L0";if(cr(e))return"L1";const a=dr(e),r=Yi(a);return r===0?"L0":r<=2?"L1":"L2"}function Xi(t){return cr(Yt(t))?"cross-cutting":"mirror"}function dr(t){return t.startsWith(wa)?t.slice(wa.length):t}function Yi(t){const e=t.split("/").filter(Boolean);return Math.max(e.length-1,0)}function cr(t){return t.split("/").includes("_cross")}function Yt(t){return t.replaceAll("\\","/")}function Gi(t){return typeof t=="object"&&t!==null}var Ji=B(["ai","human"]),ur=Xt(t=>{if(!(t==null||t==="")){if(typeof t=="number")return t;if(typeof t=="string"){const e=t.trim();if(e.length===0)return;if(/^\d+$/.test(e))return Number.parseInt(e,10);const a=Date.parse(e);return Number.isNaN(a)?t:a}return t}},V().int().nonnegative());A({source:Ji.optional(),since:ur.optional()});A({ledger_id:f().trim().min(1).optional(),ts:ur.optional()}).superRefine((t,e)=>{[t.ledger_id,t.ts].filter(r=>r!==void 0).length!==1&&e.addIssue({code:m.custom,message:"Provide exactly one of ledger_id or ts.",path:["ledger_id"]})});A({file:f().min(1),start_line:V().int().positive(),end_line:V().int().positive(),new_hash:f().min(1)});A({file:f().min(1)});A({ledger_entry_id:f().min(1),annotation:f().trim().min(1)});var hr={id:f().optional(),ts:V().int().nonnegative(),intent:f(),affected_paths:L(f())},Ki=A({...hr,source:re("ai"),commit_sha:f().optional()}),Qi=A({...hr,source:re("human"),parent_sha:f(),parent_ledger_entry_id:f().optional(),diff_stat:f(),annotation:f().optional()}),en=nr("source",[Ki,Qi]),tn=Xt(t=>t&&typeof t=="object"&&!Array.isArray(t)&&(!("source"in t)||t.source===void 0)?{...t,source:"human"}:t,en),Ie=A({file:f(),start_line:V().int().nonnegative(),end_line:V().int().nonnegative(),hash:f()});A({locked:L(Ie).optional()});var Na=B(["strict","warn","off"]),an=A({claudeCodeCLI:f().optional(),claudeCodeDesktop:f().optional(),cursor:f().optional(),windsurf:f().optional(),rooCode:f().optional(),geminiCLI:f().optional(),codexCLI:f().optional()});A({clientPaths:an.optional(),externalFixturePath:f().optional(),scanIgnores:L(f()).optional(),auditMode:Na.optional(),audit_mode:Na.optional()});var rn=A({path:f(),lines:f(),snippet:f(),pattern_hint:f()}),nn=A({file:f(),line:f(),snippet:f()}),sn=A({ratio:V().min(0).max(1),total:V().int().nonnegative(),matched:V().int().nonnegative(),co_occurring_patterns:L(f())}),on=A({type:B(["framework","pattern","invariant","domain"]),statement:f(),confidence:B(["HIGH","MEDIUM","LOW"]),evidence:L(nn),coverage:sn,proposed_rule:f().optional(),alternatives:L(f()).optional()}),ln=A({total_files:V().int().nonnegative(),by_ext:sr(V().int().nonnegative()),key_dirs:L(f()),max_depth:V().int().nonnegative()}),dn=A({path:f(),reason:f(),size_bytes:V().int().nonnegative().optional()}),cn=A({kind:f(),version:f(),subkind:f(),evidence:L(f())}),un=A({quality:B(["missing","stub","ok"]),line_count:V().int().nonnegative(),has_contributing:$t()}),hn=A({path:f(),family:B(["entry","component","config","test","domain"]),rationale:f()}),pn=A({max_files:re(15),max_lines_per_file:re(100)}),mn=A({version:f(),generated_at:f(),generated_by:f(),target:f(),project_name:f(),framework:cn,topology:ln,entry_points:L(dn),code_samples:L(rn),assertions:L(on),candidate_files:L(hn),sampling_budget:pn,readme:un,recommendations_for_skill:L(f()).optional()}),fn=A({kind:f(),version:f(),subkind:f()}),bn=A({confidence:B(["HIGH","MEDIUM","LOW"]),evidence_refs:L(f())}),gn=A({file:f(),lines:f()}),yn=A({type:B(["ban","require","protect"]),rule:f(),rationale:f().optional(),confidence_snapshot:bn.optional(),source_evidence:L(gn).optional()}),vn=A({name:f(),paths:L(f()),summary:f().optional(),topology_type:B(["mirror","cross-cutting"]).optional(),target_path:f().optional()}),_n=A({phase:f(),question:f(),answer:f(),presentation:f().optional(),user_corrections:L(f()).optional()});A({framework:fn,architecture_patterns:L(f()),invariants:L(yn),domain_groups:L(vn),interview_trail:L(_n),forensic_ref:f()});var kn=A({type:re("meta:updated"),payload:Wi}),wn=A({type:re("lock:drift"),payload:A({locked:L(Ie),drifted:L(Ie)})}),xn=A({type:re("lock:approved"),payload:A({locked:L(Ie),approved:L(Ie)})}),Nn=A({type:re("ledger:appended"),payload:tn}),Sn=A({type:re("drift:detected"),payload:mn});nr("type",[kn,wn,xn,Nn,Sn]);function Cn({lastEvent:t}){const{t:e}=D(),[a,r]=R(null),[i,n]=R([]),[o,l]=R(null),[c,d]=R(""),[h,u]=R(null),g=async()=>{try{const[w,x]=await Promise.all([qa(),Ya().catch(()=>[])]);r(w),n(x),u(null)}catch(w){u(w instanceof Error?w.message:String(w))}};Z(()=>{g()},[]),Z(()=>{(t?.type==="meta:updated"||t?.type==="drift:detected"||t?.type==="lock:drift")&&g()},[t]);const p=Y(()=>new Set(i.map(w=>w.file)),[i]),y=Y(()=>a===null?[]:pr(a,p,c),[a,p,c]),C=o===null?null:a?.nodes[o]??null;return s("section",{className:"view",children:[s(xe,{title:e("dashboard.rules-tree.title"),subtitle:e("dashboard.rules-tree.subtitle")}),h!==null?s(te,{kind:"banner",severity:"stale",message:h}):null,s("div",{className:"view-split",children:[s("div",{className:"tree-panel",children:[s("div",{className:"tree-filter",children:[s("input",{value:c,onInput:w=>d(w.currentTarget.value),placeholder:e("dashboard.rules-tree.filter.placeholder"),"aria-label":e("dashboard.rules-tree.filter.aria-label")}),s("button",{className:"ghost-button",type:"button",onClick:()=>{g()},children:e("dashboard.shared.refresh")})]}),s("div",{className:"status-line",children:[s("span",{children:a===null?e("dashboard.rules-tree.status.loading"):e("dashboard.rules-tree.status.nodes",{count:String(Object.keys(a.nodes).length),revision:a.revision})}),s("span",{children:e("dashboard.rules-tree.status.locks",{count:String(i.length)})})]}),s("div",{className:"tree",role:"tree","aria-label":e("dashboard.rules-tree.tree.aria-label"),children:y.length>0?y.map(w=>s(Bt,{...w,selected:w.node.file===o,onSelect:l},w.node.file)):s("div",{className:"empty-card",children:e("dashboard.rules-tree.empty")})})]}),s("aside",{className:"detail-panel",children:[s("h3",{children:e("dashboard.rules-tree.detail.title")}),C===null?s("p",{className:"muted",children:e("dashboard.rules-tree.detail.empty")}):s("div",{className:"kv",children:[s(Oe,{label:e("dashboard.rules-tree.detail.file"),value:C.file}),s(Oe,{label:e("dashboard.rules-tree.detail.scope"),value:C.scope_glob}),s(Oe,{label:e("dashboard.rules-tree.detail.priority"),value:C.priority}),s(Oe,{label:e("dashboard.rules-tree.detail.hash"),value:C.hash}),s("pre",{className:"code",children:C.deps.length>0?C.deps.join(`
|
|
14
|
-
`):e("dashboard.rules-tree.detail.no-deps")})]})]})]})]})}function xe({title:t,subtitle:e}){return s("div",{className:"view-header",children:s("div",{children:[s("h1",{className:"view-title",children:t}),s("p",{className:"view-subtitle",children:e})]})})}function Oe({label:t,value:e}){return s("div",{className:"kv-row",children:[s("span",{className:"kv-key",children:t}),s("span",{className:"kv-value",children:e})]})}function pr(t,e,a){const r=a.trim().toLowerCase(),i=Object.values(t.nodes).filter(l=>r.length===0||JSON.stringify(l).toLowerCase().includes(r)).sort((l,c)=>l.file.localeCompare(c.file)),n=new Map;for(const l of i){const c=l.file.split("/")[0]??"root";n.set(c,[...n.get(c)??[],l])}return[{node:Ot({file:`revision:${t.revision}`,scope_glob:"**/*",deps:[],priority:"high",hash:t.revision}),level:0,defaultExpanded:!0,children:Array.from(n.entries()).map(([l,c])=>({node:Ot({file:l,scope_glob:`${l}/**/*`,deps:[],priority:"medium",hash:`${c.length} nodes`}),level:1,defaultExpanded:!0,children:c.map(d=>({node:d,level:2,humanLockedNearby:e.has(d.file),staleReason:d.hash.length===0?"hash-mismatch":null}))}))}]}function Tn({lastEvent:t}){const{locale:e,t:a}=D(),[r,i]=R(null),[n,o]=R(!0),[l,c]=R(null),d=async()=>{o(!0);try{i(await Or()),c(null)}catch(h){c(h instanceof Error?h.message:String(h))}finally{o(!1)}};return Z(()=>{d()},[]),Z(()=>{(t?.type==="meta:updated"||t?.type==="lock:approved"||t?.type==="lock:drift"||t?.type==="ledger:appended"||t?.type==="drift:detected")&&d()},[t]),s("section",{className:"view",children:[s(xe,{title:a("dashboard.doctor.title"),subtitle:a("dashboard.doctor.subtitle")}),l!==null?s(te,{kind:"banner",severity:"stale",message:l}):null,s("div",{className:"filter-bar doctor-toolbar",children:[s("span",{className:"filter-label",children:a("dashboard.doctor.toolbar.overall")}),s(te,{kind:"pill",severity:mr(r?.status??"warn"),message:a(r===null?"dashboard.shared.loading":`dashboard.shared.status.${r.status}`)}),s("span",{className:"filter-date",children:r===null?a("dashboard.doctor.toolbar.no-summary"):r.summary.entryPoints.length===1?a("dashboard.doctor.toolbar.entry-point-summary",{framework:gt(r.summary.framework,a),count:"1"}):a("dashboard.doctor.toolbar.entry-points-summary",{framework:gt(r.summary.framework,a),count:String(r.summary.entryPoints.length)})}),s("button",{className:"ghost-button",type:"button",onClick:()=>{d()},children:a("dashboard.shared.refresh")})]}),n&&r===null?s("div",{className:"empty-card",children:a("dashboard.doctor.empty.loading")}):null,r!==null?s("div",{className:"doctor-layout",children:[s("div",{className:"doctor-summary-grid",children:[s(bt,{label:a("dashboard.doctor.summary.framework"),value:gt(r.summary.framework,a),detail:r.summary.metaRevision===null?a("dashboard.doctor.summary.no-meta-revision"):`rev ${r.summary.metaRevision}`}),s(bt,{label:a("dashboard.doctor.summary.protected-paths"),value:r.summary.protectedPathCount===0?a("dashboard.doctor.summary.tracked-paths.none"):a("dashboard.doctor.summary.tracked-paths.some",{count:String(r.summary.protectedPathCount)}),detail:r.summary.protectedPathsIntact?a("dashboard.doctor.summary.hashes-intact"):a("dashboard.doctor.summary.drifted",{count:String(r.summary.driftCount)})}),s(bt,{label:a("dashboard.doctor.summary.intent-ledger"),value:En(r.summary.lastLedgerEntryAgeMs,a),detail:r.summary.lastLedgerEntryTs===null?a("dashboard.doctor.summary.no-ledger-entries"):new Date(r.summary.lastLedgerEntryTs).toLocaleString(e)})]}),s("div",{className:"doctor-panels",children:[s("article",{className:"doctor-card",children:[s("div",{className:"doctor-card-head",children:[s("h3",{children:a("dashboard.doctor.card.entry-points")}),s("span",{children:r.summary.entryPoints.length})]}),r.summary.entryPoints.length>0?s("div",{className:"doctor-entry-list",children:r.summary.entryPoints.map(h=>s("div",{className:"doctor-entry",children:[s("strong",{children:h.path}),s("span",{children:h.reason})]},`${h.path}:${h.reason}`))}):s("div",{className:"empty-card doctor-empty",children:a("dashboard.doctor.empty.entry-points")})]}),s("article",{className:"doctor-card",children:[s("div",{className:"doctor-card-head",children:[s("h3",{children:a("dashboard.doctor.card.checks")}),s("span",{children:r.checks.length})]}),s("div",{className:"doctor-check-list",children:r.checks.map(h=>s(An,{check:h},h.name))})]})]})]}):null]})}function bt({label:t,value:e,detail:a}){return s("article",{className:"doctor-summary-card",children:[s("span",{className:"doctor-summary-label",children:t}),s("strong",{className:"doctor-summary-value",children:e}),s("span",{className:"doctor-summary-detail",children:a})]})}function An({check:t}){const{t:e}=D();return s("div",{className:`doctor-check doctor-check-${t.status}`,children:[s("div",{className:"doctor-check-head",children:[s("strong",{children:t.name}),s(te,{kind:"pill",severity:mr(t.status),message:e(`dashboard.shared.status.${t.status}`)})]}),s("p",{children:t.message})]})}function mr(t){switch(t){case"ok":return"ok";case"warn":return"locked";case"error":return"stale"}}function gt(t,e){const a=[t.kind,t.version,t.subkind].filter(r=>r!=="unknown");return a.length>0?a.join(" · "):e("dashboard.doctor.framework.unknown")}function En(t,e){if(t===null)return e("dashboard.doctor.age.none");const a=Math.floor(t/1e3);if(a<60)return e("dashboard.doctor.age.seconds",{count:String(a)});const r=Math.floor(a/60);if(r<60)return e("dashboard.doctor.age.minutes",{count:String(r)});const i=Math.floor(r/60);if(i<48)return e("dashboard.doctor.age.hours",{count:String(i)});const n=Math.floor(i/24);return n<14?e("dashboard.doctor.age.days",{count:String(n)}):e("dashboard.doctor.age.weeks",{count:String(Math.floor(n/7))})}function In({lastEvent:t}){const{locale:e,t:a}=D(),[r,i]=R([]),[n,o]=R(null),[l,c]=R(null),[d,h]=R(!1),[u,g]=R(null),p=async()=>{try{const _=(await Xa()).sort((P,H)=>P.ts-H.ts);i(_),o(P=>_.length===0?null:P!==null&&_.some(H=>H.id===P)?P:_.at(-1)?.id??null),g(null)}catch(_){g(_ instanceof Error?_.message:String(_))}};Z(()=>{p()},[]),Z(()=>{t?.type==="ledger:appended"&&p()},[t]),Z(()=>{if(n===null){c(null);return}let _=!1;return h(!0),Fr({ledgerId:n}).then(P=>{_||(c(P),g(null))}).catch(P=>{_||(c(null),g(P instanceof Error?P.message:String(P)))}).finally(()=>{_||h(!1)}),()=>{_=!0}},[n]);const y=Y(()=>r.findIndex(_=>_.id===n),[r,n]),C=y>=0?r[y]??null:null,w=C===null?a("dashboard.history-replay.selected.none"):new Date(C.ts).toLocaleString(e),x=Y(()=>l===null?[]:pr(l.meta,new Set,""),[l]);return s("section",{className:"view",children:[s(xe,{title:a("dashboard.history-replay.title"),subtitle:a("dashboard.history-replay.subtitle")}),u!==null?s(te,{kind:"banner",severity:"stale",message:u}):null,s("div",{className:"filter-bar history-toolbar",children:[s("span",{className:"filter-label",children:a("dashboard.history-replay.toolbar.scrub")}),s("input",{className:"history-slider",type:"range",min:"0",max:Math.max(r.length-1,0),value:y>=0?y:0,disabled:r.length===0,onInput:_=>{const P=Number.parseInt(_.currentTarget.value,10),H=r[P];H?.id!==void 0&&o(H.id)}}),s("span",{className:"filter-date",children:w}),s("button",{className:"ghost-button",type:"button",disabled:r.length===0,onClick:()=>o(r.at(-1)?.id??null),children:a("dashboard.history-replay.toolbar.latest")})]}),s("div",{className:"view-split history-layout",children:[s("div",{className:"tree-panel history-timeline-panel",children:[s("div",{className:"status-line",children:[s("span",{children:a("dashboard.history-replay.status.replay-points",{count:String(r.length)})}),s("span",{children:a("dashboard.history-replay.status.entries-applied",{count:String(l?.metadata.replayed_count??0)})})]}),s("div",{className:"history-timeline-list",children:r.length>0?[...r].reverse().map(_=>s("div",{className:`history-timeline-item ${_.id===n?"selected":""}`,role:"button",tabIndex:0,onClick:()=>o(_.id??null),onKeyDown:P=>{(P.key==="Enter"||P.key===" ")&&(P.preventDefault(),o(_.id??null))},children:s(er,{entry:_,readOnly:!0})},_.id??`${_.source}:${_.ts}:${_.intent}`)):s("div",{className:"empty-card",children:a("dashboard.history-replay.empty.entries")})})]}),s("div",{className:"tree-panel",children:[s("div",{className:"tree-filter history-state-head",children:s("div",{children:[s("div",{className:"history-state-title",children:a("dashboard.history-replay.state.title",{label:w})}),s("div",{className:"meta-line",children:a("dashboard.history-replay.state.meta",{ledgerId:l?.metadata.at_ledger_id??a("dashboard.history-replay.meta.na"),commit:l?.metadata.at_commit??a("dashboard.history-replay.meta.not-available"),mode:l?.metadata.mode??a("dashboard.history-replay.meta.pending")})})]})}),s("div",{className:"status-line",children:[s("span",{children:l===null?a("dashboard.history-replay.status.loading"):a("dashboard.history-replay.status.nodes",{count:String(Object.keys(l.meta.nodes).length)})}),s("span",{children:l?.meta.revision??a("dashboard.history-replay.status.unknown-revision")})]}),s("div",{className:"tree",role:"tree","aria-label":a("dashboard.history-replay.tree.aria-label"),children:[d?s("div",{className:"empty-card",children:a("dashboard.history-replay.empty.loading")}):null,!d&&x.length>0?x.map(_=>s(Bt,{..._,readOnly:!0},_.node.file)):null,!d&&x.length===0?s("div",{className:"empty-card",children:a("dashboard.history-replay.empty.select")}):null]})]})]})]})}function Rn({lastEvent:t}){const{t:e}=D(),[a,r]=R([]),[i,n]=R("all"),[o,l]=R(null),[c,d]=R(null),h=async()=>{try{r(await Ya()),d(null)}catch(y){d(y instanceof Error?y.message:String(y))}};Z(()=>{h()},[]),Z(()=>{(t?.type==="lock:drift"||t?.type==="lock:approved")&&h()},[t]);const u=Y(()=>({all:a.length,drift:a.filter(y=>y.drift).length,approved:a.filter(y=>!y.drift).length}),[a]),g=a.filter(y=>i==="all"||(i==="drift"?y.drift:!y.drift)),p=async y=>{const C=a.find(w=>de(w)===de(y));if(C!==void 0){l(de(y));try{const w=await Pr({file:C.file,start_line:C.start_line,end_line:C.end_line,new_hash:C.current_hash});r(x=>x.map(_=>de(_)===de(y)?w.entry:_)),d(null)}catch(w){throw d(w instanceof Error?w.message:String(w)),w}finally{l(null)}}};return s("section",{className:"view",children:[s(xe,{title:e("dashboard.human-lock.title"),subtitle:e("dashboard.human-lock.subtitle")}),c!==null?s(te,{kind:"banner",severity:"drift",message:c}):null,s("div",{className:"filter-bar",role:"tablist","aria-label":e("dashboard.human-lock.filters.aria-label"),children:[["all","drift","approved"].map(y=>s("button",{className:`filter-chip ${i===y?"active":""} ${y}`,type:"button",role:"tab","aria-selected":i===y,onClick:()=>n(y),children:[e(`dashboard.human-lock.filters.${y}`),s("span",{className:"count",children:u[y]})]},y)),s("span",{className:"filter-date",children:e("dashboard.human-lock.summary",{drift:String(u.drift),approved:String(u.approved)})})]}),s("div",{className:"lock-grid",children:g.length>0?g.map(y=>s(ci,{entry:y,currentHash:y.current_hash,onApprove:p,busy:o===de(y)},de(y))):s("div",{className:"empty-card",children:e("dashboard.human-lock.empty")})})]})}function de(t){return`${t.file}:${t.start_line}:${t.end_line}`}function $n({lastEvent:t}){const{t:e}=D(),[a,r]=R([]),[i,n]=R("all"),[o,l]=R(null),c=async()=>{try{r((await Xa()).sort((p,y)=>y.ts-p.ts)),l(null)}catch(p){l(p instanceof Error?p.message:String(p))}};Z(()=>{c()},[]),Z(()=>{t?.type==="ledger:appended"&&r(p=>[t.payload,...p].sort((y,C)=>C.ts-y.ts))},[t]);const d=Y(()=>a.filter(p=>i==="all"||p.source===i),[a,i]),h=a.filter(p=>p.source==="ai").length,u=a.length-h,g=async(p,y)=>{if(p.id===void 0)throw new Error(e("dashboard.intent-timeline.annotate.missing-id"));const C=await jr({ledger_entry_id:p.id,annotation:y});C.created&&r(w=>[C.entry,...w].sort((x,_)=>_.ts-x.ts))};return s("section",{className:"view",children:[s(xe,{title:e("dashboard.intent-timeline.title"),subtitle:e("dashboard.intent-timeline.subtitle")}),o!==null?s("div",{className:"empty-card",children:o}):null,s("div",{className:"filter-bar",children:[s("span",{className:"filter-label",children:e("dashboard.intent-timeline.filter.label")}),s("button",{className:`filter-chip ${i==="all"?"active":""}`,type:"button",onClick:()=>n("all"),children:[e("dashboard.intent-timeline.filter.all")," ",a.length]}),s(Nt,{source:"ai",interactive:!0,selected:i==="ai",onClick:()=>n("ai")}),s(Nt,{source:"human",interactive:!0,selected:i==="human",onClick:()=>n("human")}),s("span",{className:"filter-date",children:e("dashboard.intent-timeline.summary",{aiCount:String(h),humanCount:String(u)})})]}),s("div",{className:"col-headers",children:[s("div",{className:"col-head ai",children:[s("strong",{children:e("dashboard.intent-timeline.columns.ai.title")}),s("span",{children:e("dashboard.intent-timeline.columns.ai.entries",{count:String(h)})})]}),s("div",{className:"col-head human",children:[s("strong",{children:e("dashboard.intent-timeline.columns.human.title")}),s("span",{children:e("dashboard.intent-timeline.columns.human.entries",{count:String(u)})})]})]}),s("div",{className:"timeline-grid",children:[s("div",{className:"axis",children:s("div",{className:"axis-line"})}),d.length>0?d.map(p=>s(er,{entry:p,onAnnotate:g},p.id??`${p.source}:${p.ts}:${p.intent}`)):s("div",{className:"empty-card timeline-empty",children:e("dashboard.intent-timeline.empty")})]})]})}const Pe="packages/dashboard/src/views/rule-topology.tsx";function Ln({lastEvent:t}){const{t:e}=D(),[a,r]=R(null),[i,n]=R(null),[o,l]=R(Pe),[c,d]=R(Pe),[h,u]=R(null),g=async C=>{try{const[w,x]=await Promise.all([qa(),Lr(C)]);r(w),n(x),d(C),u(null)}catch(w){u(w instanceof Error?w.message:String(w))}};Z(()=>{g(Pe)},[]),Z(()=>{(t?.type==="meta:updated"||t?.type==="drift:detected"||t?.type==="lock:drift")&&g(c)},[c,t]);const p=Y(()=>a===null?[]:Object.values(a.nodes),[a]),y=(i?.L1.length??0)+(i?.L2.length??0)+(i?.description_stubs?.length??0);return s("section",{className:"view",children:[s(xe,{title:e("dashboard.rule-topology.title"),subtitle:e("dashboard.rule-topology.subtitle")}),h!==null?s(te,{kind:"banner",severity:"stale",message:h}):null,s("div",{className:"tree-filter topology-toolbar",children:[s("input",{value:o,onInput:C=>l(C.currentTarget.value),placeholder:e("dashboard.rule-topology.path.placeholder"),"aria-label":e("dashboard.rule-topology.path.aria-label")}),s("button",{className:"ghost-button",type:"button",onClick:()=>{g(o.trim().length>0?o.trim():Pe)},children:e("dashboard.shared.refresh")})]}),s("div",{className:"status-line topology-status",children:[s("span",{children:e("dashboard.rule-topology.status.sample",{path:c})}),s("span",{children:e("dashboard.rule-topology.status.hits",{count:String(y)})}),s("span",{children:a===null?e("dashboard.shared.loading"):e("dashboard.rule-topology.status.revision",{revision:a.revision})})]}),s("div",{className:"view-split topology-split",children:[s(ai,{nodes:p}),s(li,{meta:a,rulesContext:i})]})]})}function On(){return s(ti,{children:s(Pn,{})})}function Pn(){const{t}=D(),[e,a]=R(Sa()),r=qr(),i=[{id:"topology",hash:"#/topology",label:t("dashboard.app.nav.module-a.label-bilingual"),subtitle:t("dashboard.app.nav.module-a.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.topology")},{id:"forensic",hash:"#/forensic",label:t("dashboard.app.nav.module-b.label-bilingual"),subtitle:t("dashboard.app.nav.module-b.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.forensic")},{id:"semantic",hash:"#/semantic",label:t("dashboard.app.nav.module-c.label-bilingual"),subtitle:t("dashboard.app.nav.module-c.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.semantic")},{id:"ledger",hash:"#/ledger",label:t("dashboard.app.nav.module-d.label-bilingual"),subtitle:t("dashboard.app.nav.module-d.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.ledger")}],n=[{id:"rules",hash:"#/rules",label:t("dashboard.app.nav.rules.label-bilingual"),subtitle:t("dashboard.app.nav.rules.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.rules")},{id:"locks",hash:"#/locks",label:t("dashboard.app.nav.locks.label-bilingual"),subtitle:t("dashboard.app.nav.locks.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.locks")},{id:"timeline",hash:"#/timeline",label:t("dashboard.app.nav.timeline.label-bilingual"),subtitle:t("dashboard.app.nav.timeline.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.timeline")},{id:"history",hash:"#/history",label:t("dashboard.app.nav.history.label-bilingual"),subtitle:t("dashboard.app.nav.history.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.history")},{id:"doctor",hash:"#/doctor",label:t("dashboard.app.nav.doctor.label-bilingual"),subtitle:t("dashboard.app.nav.doctor.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.doctor")}];Z(()=>{const l=()=>a(Sa());return window.addEventListener("hashchange",l),window.location.hash===""&&(window.location.hash="#/topology"),()=>window.removeEventListener("hashchange",l)},[]);const o=Y(()=>[...i,...n].find(l=>l.id===e)??i[0],[n,i,e]);return s(jn,{connected:r.connected,port:Ca(),activeRoute:o.id,children:[s("aside",{className:"sidebar",children:[s("div",{className:"brand",children:[s("span",{className:"brand-logo",children:"F"}),s("span",{children:"fabric"}),s("span",{className:"brand-version",children:"v1.6.0"})]}),s("nav",{"aria-label":t("dashboard.app.nav.aria-label"),children:i.map(l=>s("a",{className:`nav-item ${l.id===e?"active":""}`,href:l.hash,"aria-current":l.id===e?"page":void 0,children:[s("span",{className:"dot","aria-hidden":"true"}),s("span",{children:l.label}),s("small",{children:l.subtitle})]},l.id))}),s("div",{className:"nav-section",children:t("dashboard.app.nav.section.modules-status")}),s("span",{className:"nav-item muted-nav",children:[s("span",{className:"dot"}),t("dashboard.app.nav.modules.read-only")]}),s("div",{className:"nav-section",children:t("dashboard.app.nav.section.diagnostics")}),n.map(l=>s("a",{className:`nav-item ${l.id===e?"active":""}`,href:l.hash,"aria-current":l.id===e?"page":void 0,children:[s("span",{className:"dot","aria-hidden":"true"}),s("span",{children:l.label}),s("small",{children:l.subtitle})]},l.id)),s("span",{className:"nav-item muted-nav",children:[s("span",{className:"dot"}),t("dashboard.app.nav.drift-check")]})]}),s("main",{className:"main",children:[s("header",{className:"header",children:[s("div",{className:"breadcrumb",children:[s("span",{children:window.location.pathname==="/"?"~":window.location.pathname}),s("span",{className:"sep",children:"/"}),s("strong",{children:o.breadcrumb})]}),s("div",{className:"header-actions",children:[s("span",{className:`badge-live ${r.connected?"connected":"disconnected"}`,children:[s("span",{className:"pulse","aria-hidden":"true"}),r.connected?t("dashboard.app.header.connected"):t("dashboard.app.header.connecting")]}),s("span",{className:"port-label",children:[":",Ca()," /events"]})]})]}),e==="topology"?s(Ln,{lastEvent:r.lastEvent}):null,e==="forensic"?s(yt,{title:t("dashboard.module-placeholder.forensic.title"),subtitle:t("dashboard.module-placeholder.forensic.subtitle")}):null,e==="semantic"?s(yt,{title:t("dashboard.module-placeholder.semantic.title"),subtitle:t("dashboard.module-placeholder.semantic.subtitle")}):null,e==="ledger"?s(yt,{title:t("dashboard.module-placeholder.ledger.title"),subtitle:t("dashboard.module-placeholder.ledger.subtitle")}):null,e==="rules"?s(Cn,{lastEvent:r.lastEvent}):null,e==="locks"?s(Rn,{lastEvent:r.lastEvent}):null,e==="timeline"?s($n,{lastEvent:r.lastEvent}):null,e==="history"?s(In,{lastEvent:r.lastEvent}):null,e==="doctor"?s(Tn,{lastEvent:r.lastEvent}):null]}),s("div",{className:"live-region","aria-live":"polite","aria-atomic":"true",children:r.lastEvent===null?"":t("dashboard.app.live-region.received",{type:r.lastEvent.type})})]})}function yt({title:t,subtitle:e}){const{t:a}=D();return s("section",{className:"view",children:[s("div",{className:"view-header",children:s("div",{children:[s("h1",{className:"view-title",children:t}),s("p",{className:"view-subtitle",children:e})]})}),s("div",{className:"empty-card module-placeholder",children:[s("strong",{children:a("dashboard.module-placeholder.coming-soon")}),s("p",{children:a("dashboard.module-placeholder.read-only")})]})]})}function jn({connected:t,port:e,activeRoute:a,children:r}){return s("div",{className:`app-shell ${t?"is-connected":"is-disconnected"}`,"data-port":e,"data-route":a,children:r})}function Sa(){switch(window.location.hash){case"#/topology":return"topology";case"#/forensic":return"forensic";case"#/semantic":return"semantic";case"#/ledger":return"ledger";case"#/locks":return"locks";case"#/timeline":return"timeline";case"#/history":return"history";case"#/doctor":return"doctor";case"#/rules":return"rules";default:return"topology"}}function Ca(){const t=Number.parseInt(window.location.port,10);return Number.isFinite(t)?t:7373}const fr=document.getElementById("app");if(fr===null)throw new Error("Fabric Dashboard root element #app was not found.");xr(s(On,{}),fr);
|