@fenglimg/fabric-server 1.3.0 → 1.4.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.
@@ -1,5 +1,5 @@
1
1
  // src/constants.ts
2
- var AGENTS_MD_RESOURCE_URI = "fabric://agents-md";
2
+ var AGENTS_MD_RESOURCE_URI = "fabric://bootstrap-readme";
3
3
 
4
4
  // src/cache.ts
5
5
  var ContextCache = class {
@@ -265,6 +265,7 @@ async function readAuditLogWindowed(projectRoot, ts, windowMs) {
265
265
  const cursor = contextCache.getAuditCursor(projectRoot);
266
266
  const startOffset = cursor !== void 0 && cursor.offset <= fileSize ? cursor.offset : 0;
267
267
  const priorRemainder = startOffset > 0 && cursor !== void 0 ? cursor.remainder : "";
268
+ const priorWindowEntries = startOffset > 0 && cursor !== void 0 ? cursor.windowEntries : [];
268
269
  const effectiveStart = cursor !== void 0 && cursor.offset > fileSize ? 0 : startOffset;
269
270
  let newEntries = [];
270
271
  if (fileSize > effectiveStart) {
@@ -281,22 +282,28 @@ async function readAuditLogWindowed(projectRoot, ts, windowMs) {
281
282
  }
282
283
  } catch (error) {
283
284
  contextCache.resetAuditCursor(projectRoot);
284
- return readAuditLogFull(projectRoot);
285
+ return (await readAuditLogFull(projectRoot)).filter((entry) => ts - entry.ts <= windowMs && entry.ts <= ts);
285
286
  }
286
287
  const lines = chunk.split(/\r?\n/);
287
288
  const remainder = chunk.endsWith("\n") ? "" : lines.pop() ?? "";
288
- contextCache.setAuditCursor(projectRoot, { offset: fileSize, remainder });
289
- newEntries = parseAuditLogText(lines.join("\n"));
289
+ const windowEntries = [...priorWindowEntries, ...parseAuditLogText(lines.join("\n"))].filter(
290
+ (entry) => ts - entry.ts <= windowMs && entry.ts <= ts
291
+ );
292
+ contextCache.setAuditCursor(projectRoot, { offset: fileSize, remainder, windowEntries });
293
+ newEntries = windowEntries;
290
294
  } else {
295
+ const windowEntries = priorWindowEntries.filter((entry) => ts - entry.ts <= windowMs && entry.ts <= ts);
291
296
  contextCache.setAuditCursor(projectRoot, {
292
297
  offset: fileSize,
293
- remainder: cursor?.remainder ?? ""
298
+ remainder: cursor?.remainder ?? "",
299
+ windowEntries
294
300
  });
301
+ newEntries = windowEntries;
295
302
  }
296
303
  if (effectiveStart === 0 && cursor !== void 0 && cursor.offset > fileSize) {
297
- return newEntries.filter((e) => ts - e.ts <= windowMs);
304
+ return newEntries.filter((entry) => ts - entry.ts <= windowMs && entry.ts <= ts);
298
305
  }
299
- return newEntries.filter((e) => ts - e.ts <= windowMs && e.ts <= ts);
306
+ return newEntries;
300
307
  }
301
308
  function parseAuditLogText(raw) {
302
309
  return raw.split(/\r?\n/).map((line) => line.trim()).filter((line) => line.length > 0).map(parseAuditLogLine).filter((entry) => entry !== null);
@@ -337,7 +344,6 @@ async function appendAuditLogEntries(projectRoot, entries) {
337
344
  await mkdir(auditDir, { recursive: true });
338
345
  await appendFile(auditPath, `${entries.map((entry) => JSON.stringify(entry)).join("\n")}
339
346
  `, "utf8");
340
- contextCache.resetAuditCursor(projectRoot);
341
347
  }
342
348
  function parseAuditLogLine(line) {
343
349
  try {
@@ -13,7 +13,7 @@ import {
13
13
  readHumanLockEntry,
14
14
  readLedger,
15
15
  runDoctorReport
16
- } from "./chunk-DQ7RCYKB.js";
16
+ } from "./chunk-GU7AMRM3.js";
17
17
 
18
18
  // src/http.ts
19
19
  import { randomUUID } from "crypto";
@@ -959,7 +959,7 @@ function createScanReport(targetInput = process.cwd()) {
959
959
  const framework = detectFramework(target);
960
960
  const readmeQuality = getReadmeQuality(target);
961
961
  const hasContributing = existsSync(join2(target, "CONTRIBUTING.md"));
962
- const hasExistingFabric = existsSync(join2(target, "AGENTS.md")) || existsSync(join2(target, ".fabric"));
962
+ const hasExistingFabric = existsSync(join2(target, ".fabric", "bootstrap", "README.md")) || existsSync(join2(target, ".fabric"));
963
963
  const walkResult = walkFiles(target, DEFAULT_IGNORES);
964
964
  return {
965
965
  target,
@@ -1036,18 +1036,18 @@ function toPosixPath(path) {
1036
1036
  function buildRecommendations(input) {
1037
1037
  const recommendations = [];
1038
1038
  if (!input.hasExistingFabric) {
1039
- recommendations.push("L0: Run fab init to scaffold AGENTS.md with TODO markers.");
1039
+ recommendations.push("L0: Run fab init to scaffold .fabric/bootstrap/README.md with TODO markers.");
1040
1040
  }
1041
1041
  if (input.readmeQuality === "stub") {
1042
- recommendations.push("L0: Expand README.md before promoting project facts into AGENTS.md references.");
1042
+ recommendations.push("L0: Expand README.md before promoting project facts into Fabric references.");
1043
1043
  }
1044
1044
  if (!input.hasContributing) {
1045
- recommendations.push("L0: Add CONTRIBUTING.md or leave an AGENTS.md TODO reference for contribution flow.");
1045
+ recommendations.push("L0: Add CONTRIBUTING.md or leave a bootstrap TODO reference for contribution flow.");
1046
1046
  }
1047
1047
  if (input.framework.kind === "unknown") {
1048
1048
  recommendations.push("L1: Add tech-stack TODOs manually because no framework marker was detected.");
1049
1049
  } else {
1050
- recommendations.push(`L1: Review ${input.framework.kind} directories for future scoped AGENTS.md files.`);
1050
+ recommendations.push(`L1: Review ${input.framework.kind} directories for future scoped Fabric rule files.`);
1051
1051
  }
1052
1052
  return recommendations;
1053
1053
  }
@@ -1189,7 +1189,7 @@ function createFabricHttpApp(options) {
1189
1189
  const sessions = /* @__PURE__ */ new Map();
1190
1190
  process.env.FABRIC_PROJECT_ROOT = projectRoot;
1191
1191
  const cacheWatcher = chokidar2.watch(
1192
- [".fabric/agents.meta.json", "AGENTS.md"],
1192
+ [".fabric/agents.meta.json", ".fabric/bootstrap/README.md"],
1193
1193
  {
1194
1194
  cwd: projectRoot,
1195
1195
  ignoreInitial: true,
@@ -1209,7 +1209,7 @@ function createFabricHttpApp(options) {
1209
1209
  toolListNotifyTimer = setTimeout(() => {
1210
1210
  notifyAllSessions(sessions, "tools/list_changed");
1211
1211
  }, NOTIFY_DEBOUNCE_MS);
1212
- } else if (normalized === "AGENTS.md") {
1212
+ } else if (normalized === ".fabric/bootstrap/README.md") {
1213
1213
  contextCache.invalidate("file_watch", projectRoot);
1214
1214
  clearTimeout(agentsMdNotifyTimer);
1215
1215
  agentsMdNotifyTimer = setTimeout(() => {
@@ -1217,6 +1217,16 @@ function createFabricHttpApp(options) {
1217
1217
  }, NOTIFY_DEBOUNCE_MS);
1218
1218
  }
1219
1219
  });
1220
+ let disposed = false;
1221
+ app.dispose = async () => {
1222
+ if (disposed) {
1223
+ return;
1224
+ }
1225
+ disposed = true;
1226
+ clearTimeout(agentsMdNotifyTimer);
1227
+ clearTimeout(toolListNotifyTimer);
1228
+ await cacheWatcher.close();
1229
+ };
1220
1230
  app.disable("x-powered-by");
1221
1231
  if (authToken !== void 0) {
1222
1232
  const bearerAuth = createBearerAuthMiddleware(authToken);
package/dist/index.d.ts CHANGED
@@ -64,8 +64,8 @@ declare function runDoctorAuditReport(target: string, options?: {
64
64
  /**
65
65
  * Shared constants used across the server package.
66
66
  */
67
- /** MCP resource URI for the project's AGENTS.md (L0 rules) file. */
68
- declare const AGENTS_MD_RESOURCE_URI = "fabric://agents-md";
67
+ /** MCP resource URI for the project's bootstrap README (L0 rules) file. */
68
+ declare const AGENTS_MD_RESOURCE_URI = "fabric://bootstrap-readme";
69
69
 
70
70
  declare function createFabricServer(): McpServer;
71
71
  declare function startStdioServer(): Promise<void>;
package/dist/index.js CHANGED
@@ -12,7 +12,7 @@ import {
12
12
  runDoctorAuditReport,
13
13
  runDoctorReport,
14
14
  sha256
15
- } from "./chunk-DQ7RCYKB.js";
15
+ } from "./chunk-GU7AMRM3.js";
16
16
 
17
17
  // src/index.ts
18
18
  import { readFile as readFile2 } from "fs/promises";
@@ -82,9 +82,15 @@ function registerAppendIntent(server) {
82
82
  async ({ entry }) => {
83
83
  const projectRoot = resolveProjectRoot();
84
84
  const result = await appendIntent(projectRoot, { entry });
85
+ const structuredContent = {
86
+ success: result.success,
87
+ timestamp: result.timestamp,
88
+ entry: { ...result.entry },
89
+ compliance: result.compliance
90
+ };
85
91
  return {
86
92
  content: [{ type: "text", text: JSON.stringify(result) }],
87
- structuredContent: result
93
+ structuredContent
88
94
  };
89
95
  }
90
96
  );
@@ -126,7 +132,7 @@ async function loadGetRulesContext(projectRoot) {
126
132
  return cached;
127
133
  }
128
134
  const meta = await readAgentsMeta(projectRoot);
129
- const l0Content = await readFile(join(projectRoot, "AGENTS.md"), "utf8");
135
+ const l0Content = await readFile(join(projectRoot, ".fabric", "bootstrap", "README.md"), "utf8");
130
136
  const humanLockedNearby = (await readHumanLock(projectRoot)).map((entry) => ({
131
137
  file: entry.file,
132
138
  excerpt: JSON.stringify(entry)
@@ -320,6 +326,7 @@ function registerPlanContext(server) {
320
326
  }
321
327
 
322
328
  // src/tools/update-registry.ts
329
+ import { agentsLayerSchema, agentsTopologyTypeSchema } from "@fenglimg/fabric-shared";
323
330
  import { z as z4 } from "zod";
324
331
 
325
332
  // src/services/update-registry.ts
@@ -389,15 +396,19 @@ function applyRegistryOperation(meta, op, nodeId, data) {
389
396
  }
390
397
 
391
398
  // src/tools/update-registry.ts
399
+ var nodeInputSchema = z4.object({
400
+ file: z4.string().optional(),
401
+ scope_glob: z4.string().optional(),
402
+ deps: z4.array(z4.string()).optional(),
403
+ priority: z4.enum(["high", "medium", "low"]).optional(),
404
+ layer: agentsLayerSchema.optional(),
405
+ topology_type: agentsTopologyTypeSchema.optional(),
406
+ hash: z4.string().optional()
407
+ });
392
408
  var inputSchema4 = {
393
409
  op: z4.enum(["add-node", "remove-node", "update-node"]),
394
410
  node_id: z4.string(),
395
- data: z4.object({
396
- file: z4.string(),
397
- scope_glob: z4.string(),
398
- deps: z4.array(z4.string()).optional(),
399
- priority: z4.number().optional()
400
- }).optional()
411
+ data: nodeInputSchema.optional()
401
412
  };
402
413
  var outputSchema4 = z4.object({
403
414
  success: z4.boolean(),
@@ -437,22 +448,22 @@ function formatError(error) {
437
448
  function createFabricServer() {
438
449
  const server = new McpServer({
439
450
  name: "fabric-context-server",
440
- version: "1.3.0"
451
+ version: "1.4.0"
441
452
  });
442
453
  registerGetRules(server);
443
454
  registerPlanContext(server);
444
455
  registerAppendIntent(server);
445
456
  registerUpdateRegistry(server);
446
457
  server.registerResource(
447
- "AGENTS.md",
458
+ "bootstrap README",
448
459
  AGENTS_MD_RESOURCE_URI,
449
460
  {
450
- description: "L0 fabric rules file \u2014 global agent instructions for this project",
461
+ description: "L0 fabric bootstrap file \u2014 global agent instructions for this project",
451
462
  mimeType: "text/markdown"
452
463
  },
453
464
  async (_uri) => {
454
465
  const projectRoot = process.env.FABRIC_PROJECT_ROOT ?? process.cwd();
455
- const content = await readFile2(join3(projectRoot, "AGENTS.md"), "utf8");
466
+ const content = await readFile2(join3(projectRoot, ".fabric", "bootstrap", "README.md"), "utf8");
456
467
  return {
457
468
  contents: [
458
469
  {
@@ -472,11 +483,14 @@ async function startStdioServer() {
472
483
  await server.connect(transport);
473
484
  }
474
485
  async function startHttpServer(options) {
475
- const { createFabricHttpApp } = await import("./http-YPXWM5QS.js");
486
+ const { createFabricHttpApp } = await import("./http-7OHSKCPN.js");
476
487
  const { port, projectRoot, host = "127.0.0.1", authToken, dashboardDistPath, dev } = options;
477
488
  const app = createFabricHttpApp({ projectRoot, host, authToken, dashboardDistPath, dev });
478
489
  return await new Promise((resolveServer, rejectServer) => {
479
490
  const server = app.listen(port, host);
491
+ server.once("close", () => {
492
+ void app.dispose();
493
+ });
480
494
  server.once("listening", () => {
481
495
  resolveServer(server);
482
496
  });
@@ -0,0 +1,14 @@
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 s of n.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&r(s)}).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 at,$,ba,ie,Ht,ga,_a,ot,Pe,Ne,ya,It,bt,gt,va,De={},Ze=[],rr=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,rt=Array.isArray;function G(t,e){for(var a in e)t[a]=e[a];return t}function Rt(t){t&&t.parentNode&&t.parentNode.removeChild(t)}function ir(t,e,a){var r,i,n,s={};for(n in e)n=="key"?r=e[n]:n=="ref"?i=e[n]:s[n]=e[n];if(arguments.length>2&&(s.children=arguments.length>3?at.call(arguments,2):a),typeof t=="function"&&t.defaultProps!=null)for(n in t.defaultProps)s[n]===void 0&&(s[n]=t.defaultProps[n]);return je(t,s,r,i,null)}function je(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??++ba,__i:-1,__u:0};return i==null&&$.vnode!=null&&$.vnode(n),n}function it(t){return t.children}function Fe(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 nr(t){if(t.__P&&t.__d){var e=t.__v,a=e.__e,r=[],i=[],n=G({},e);n.__v=e.__v+1,$.vnode&&$.vnode(n),$t(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,Na(r,n,i),e.__e=e.__=null,n.__e!=a&&ka(n)}}function ka(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}),ka(t)}function _t(t){(!t.__d&&(t.__d=!0)&&ie.push(t)&&!ze.__r++||Ht!=$.debounceRendering)&&((Ht=$.debounceRendering)||ga)(ze)}function ze(){try{for(var t,e=1;ie.length;)ie.length>e&&ie.sort(_a),t=ie.shift(),e=ie.length,nr(t)}finally{ie.length=ze.__r=0}}function wa(t,e,a,r,i,n,s,o,c,d,h){var u,g,p,y,T,w,x,v=r&&r.__k||Ze,O=e.length;for(c=sr(a,e,v,c,O),u=0;u<O;u++)(p=a.__k[u])!=null&&(g=p.__i!=-1&&v[p.__i]||De,p.__i=u,w=$t(t,p,g,i,n,s,o,c,d,h),y=p.__e,p.ref&&g.ref!=p.ref&&(g.ref&&Ot(g.ref,null,p),h.push(p.ref,p.__c||y,p)),T==null&&y!=null&&(T=y),(x=!!(4&p.__u))||g.__k===p.__k?(c=xa(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=T,c}function sr(t,e,a,r,i){var n,s,o,c,d,h=a.length,u=h,g=0;for(t.__k=new Array(i),n=0;n<i;n++)(s=e[n])!=null&&typeof s!="boolean"&&typeof s!="function"?(typeof s=="string"||typeof s=="number"||typeof s=="bigint"||s.constructor==String?s=t.__k[n]=je(null,s,null,null,null):rt(s)?s=t.__k[n]=je(it,{children:s},null,null,null):s.constructor===void 0&&s.__b>0?s=t.__k[n]=je(s.type,s.props,s.key,s.ref?s.ref:null,s.__v):t.__k[n]=s,c=n+g,s.__=t,s.__b=t.__b+1,o=null,(d=s.__i=or(s,a,c,u))!=-1&&(u--,(o=a[d])&&(o.__u|=2)),o==null||o.__v==null?(d==-1&&(i>h?g--:i<h&&g++),typeof s.type!="function"&&(s.__u|=4)):d!=c&&(d==c-1?g--:d==c+1?g++:(d>c?g--:g++,s.__u|=4))):t.__k[n]=null;if(u)for(n=0;n<h;n++)(o=a[n])!=null&&(2&o.__u)==0&&(o.__e==r&&(r=be(o)),Ca(o,o));return r}function xa(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=xa(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 or(t,e,a,r){var i,n,s,o=t.key,c=t.type,d=e[a],h=d!=null&&(2&d.__u)==0;if(d===null&&o==null||h&&o==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[s=i>=0?i--:n++])!=null&&(2&d.__u)==0&&o==d.key&&c==d.type)return s}return-1}function Vt(t,e,a){e[0]=="-"?t.setProperty(e,a??""):t[e]=a==null?"":typeof a!="number"||rr.test(e)?a:a+"px"}function $e(t,e,a,r,i){var n,s;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||Vt(t.style,e,"");if(a)for(e in a)r&&a[e]==r[e]||Vt(t.style,e,a[e])}else if(e[0]=="o"&&e[1]=="n")n=e!=(e=e.replace(ya,"$1")),s=e.toLowerCase(),e=s in t||e=="onFocusOut"||e=="onFocusIn"?s.slice(2):e.slice(2),t.l||(t.l={}),t.l[e+n]=a,a?r?a[Ne]=r[Ne]:(a[Ne]=It,t.addEventListener(e,n?gt:bt,n)):t.removeEventListener(e,n?gt:bt,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 Bt(t){return function(e){if(this.l){var a=this.l[e.type+t];if(e[Pe]==null)e[Pe]=It++;else if(e[Pe]<a[Ne])return;return a($.event?$.event(e):e)}}}function $t(t,e,a,r,i,n,s,o,c,d){var h,u,g,p,y,T,w,x,v,O,z,we,Ut,Re,st,q=e.type;if(e.constructor!==void 0)return null;128&a.__u&&(c=!!(32&a.__u),n=[o=e.__e=a.__e]),(h=$.__b)&&h(e);e:if(typeof q=="function")try{if(x=e.props,v=q.prototype&&q.prototype.render,O=(h=q.contextType)&&r[h.__c],z=h?O?O.props.value:h.__:r,a.__c?w=(u=e.__c=a.__c).__=u.__E:(v?e.__c=u=new q(x,z):(e.__c=u=new Fe(x,z),u.constructor=q,u.render=dr),O&&O.sub(u),u.state||(u.state={}),u.__n=r,g=u.__d=!0,u.__h=[],u._sb=[]),v&&u.__s==null&&(u.__s=u.state),v&&q.getDerivedStateFromProps!=null&&(u.__s==u.state&&(u.__s=G({},u.__s)),G(u.__s,q.getDerivedStateFromProps(x,u.__s))),p=u.props,y=u.state,u.__v=e,g)v&&q.getDerivedStateFromProps==null&&u.componentWillMount!=null&&u.componentWillMount(),v&&u.componentDidMount!=null&&u.__h.push(u.componentDidMount);else{if(v&&q.getDerivedStateFromProps==null&&x!==p&&u.componentWillReceiveProps!=null&&u.componentWillReceiveProps(x,z),e.__v==a.__v||!u.__e&&u.shouldComponentUpdate!=null&&u.shouldComponentUpdate(x,u.__s,z)===!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(fe){fe&&(fe.__=e)}),Ze.push.apply(u.__h,u._sb),u._sb=[],u.__h.length&&s.push(u);break e}u.componentWillUpdate!=null&&u.componentWillUpdate(x,u.__s,z),v&&u.componentDidUpdate!=null&&u.__h.push(function(){u.componentDidUpdate(p,y,T)})}if(u.context=z,u.props=x,u.__P=t,u.__e=!1,we=$.__r,Ut=0,v)u.state=u.__s,u.__d=!1,we&&we(e),h=u.render(u.props,u.state,u.context),Ze.push.apply(u.__h,u._sb),u._sb=[];else do u.__d=!1,we&&we(e),h=u.render(u.props,u.state,u.context),u.state=u.__s;while(u.__d&&++Ut<25);u.state=u.__s,u.getChildContext!=null&&(r=G(G({},r),u.getChildContext())),v&&!g&&u.getSnapshotBeforeUpdate!=null&&(T=u.getSnapshotBeforeUpdate(p,y)),Re=h!=null&&h.type===it&&h.key==null?Sa(h.props.children):h,o=wa(t,rt(Re)?Re:[Re],e,a,r,i,n,s,o,c,d),u.base=e.__e,e.__u&=-161,u.__h.length&&s.push(u),w&&(u.__E=u.__=null)}catch(fe){if(e.__v=null,c||n!=null)if(fe.then){for(e.__u|=c?160:128;o&&o.nodeType==8&&o.nextSibling;)o=o.nextSibling;n[n.indexOf(o)]=null,e.__e=o}else{for(st=n.length;st--;)Rt(n[st]);yt(e)}else e.__e=a.__e,e.__k=a.__k,fe.then||yt(e);$.__e(fe,e,a)}else n==null&&e.__v==a.__v?(e.__k=a.__k,e.__e=a.__e):o=e.__e=lr(a.__e,e,a,r,i,n,s,c,d);return(h=$.diffed)&&h(e),128&e.__u?void 0:o}function yt(t){t&&(t.__c&&(t.__c.__e=!0),t.__k&&t.__k.some(yt))}function Na(t,e,a){for(var r=0;r<a.length;r++)Ot(a[r],a[++r],a[++r]);$.__c&&$.__c(e,t),t.some(function(i){try{t=i.__h,i.__h=[],t.some(function(n){n.call(i)})}catch(n){$.__e(n,i.__v)}})}function Sa(t){return typeof t!="object"||t==null||t.__b>0?t:rt(t)?t.map(Sa):G({},t)}function lr(t,e,a,r,i,n,s,o,c){var d,h,u,g,p,y,T,w=a.props||De,x=e.props,v=e.type;if(v=="svg"?i="http://www.w3.org/2000/svg":v=="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==!!v&&(v?p.localName==v:p.nodeType==3)){t=p,n[d]=null;break}}if(t==null){if(v==null)return document.createTextNode(x);t=document.createElementNS(i,v,x.is&&x),o&&($.__m&&$.__m(e,n),o=!1),n=null}if(v==null)w===x||o&&t.data==x||(t.data=x);else{if(n=n&&at.call(t.childNodes),!o&&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"?T=p:o&&typeof p!="function"||w[d]===p||$e(t,d,p,w[d],i);if(h)o||u&&(h.__html==u.__html||h.__html==t.innerHTML)||(t.innerHTML=h.__html),e.__k=[];else if(u&&(t.innerHTML=""),wa(e.type=="template"?t.content:t,rt(g)?g:[g],e,a,r,v=="foreignObject"?"http://www.w3.org/1999/xhtml":i,n,s,n?n[0]:a.__k&&be(a,0),o,c),n!=null)for(d=n.length;d--;)Rt(n[d]);o||(d="value",v=="progress"&&y==null?t.removeAttribute("value"):y!=null&&(y!==t[d]||v=="progress"&&!y||v=="option"&&y!=w[d])&&$e(t,d,y,w[d],i),d="checked",T!=null&&T!=t[d]&&$e(t,d,T,w[d],i))}return t}function Ot(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){$.__e(i,a)}}function Ca(t,e,a){var r,i;if($.unmount&&$.unmount(t),(r=t.ref)&&(r.current&&r.current!=t.__e||Ot(r,null,e)),(r=t.__c)!=null){if(r.componentWillUnmount)try{r.componentWillUnmount()}catch(n){$.__e(n,e)}r.base=r.__P=null}if(r=t.__k)for(i=0;i<r.length;i++)r[i]&&Ca(r[i],e,a||typeof t.type!="function");a||Rt(t.__e),t.__c=t.__=t.__e=void 0}function dr(t,e,a){return this.constructor(t,a)}function cr(t,e,a){var r,i,n,s;e==document&&(e=document.documentElement),$.__&&$.__(t,e),i=(r=!1)?null:e.__k,n=[],s=[],$t(e,t=e.__k=ir(it,null,[t]),i||De,De,e.namespaceURI,i?null:e.firstChild?at.call(e.childNodes):null,n,i?i.__e:e.firstChild,r,s),Na(n,t,s)}function ur(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(s){s.__e=!0,_t(s)})},this.sub=function(n){r.add(n);var s=n.componentWillUnmount;n.componentWillUnmount=function(){r&&r.delete(n),s&&s.call(n)}}),a.children}return e.__c="__cC"+va++,e.__=t,e.Provider=e.__l=(e.Consumer=function(a,r){return a.children(r)}).contextType=e,e}at=Ze.slice,$={__e:function(t,e,a,r){for(var i,n,s;e=e.__;)if((i=e.__c)&&!i.__)try{if((n=i.constructor)&&n.getDerivedStateFromError!=null&&(i.setState(n.getDerivedStateFromError(t)),s=i.__d),i.componentDidCatch!=null&&(i.componentDidCatch(t,r||{}),s=i.__d),s)return i.__E=i}catch(o){t=o}throw t}},ba=0,Fe.prototype.setState=function(t,e){var a;a=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=G({},this.state),typeof t=="function"&&(t=t(G({},a),this.props)),t&&G(a,t),t!=null&&this.__v&&(e&&this._sb.push(e),_t(this))},Fe.prototype.forceUpdate=function(t){this.__v&&(this.__e=!0,t&&this.__h.push(t),_t(this))},Fe.prototype.render=it,ie=[],ga=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,_a=function(t,e){return t.__v.__b-e.__v.__b},ze.__r=0,ot=Math.random().toString(8),Pe="__d"+ot,Ne="__a"+ot,ya=/(PointerCapture)$|Capture$/i,It=0,bt=Bt(!1),gt=Bt(!0),va=0;var hr=0;function l(t,e,a,r,i,n){e||(e={});var s,o,c=e;if("ref"in c)for(o in c={},e)o=="ref"?s=e[o]:c[o]=e[o];var d={type:t,props:c,key:a,ref:s,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--hr,__i:-1,__u:0,__source:i,__self:n};if(typeof t=="function"&&(s=t.defaultProps))for(o in s)c[o]===void 0&&(c[o]=s[o]);return $.vnode&&$.vnode(d),d}var ge,j,lt,Wt,Ue=0,Ta=[],F=$,qt=F.__b,Xt=F.__r,Yt=F.diffed,Jt=F.__c,Gt=F.unmount,Kt=F.__;function nt(t,e){F.__h&&F.__h(j,t,Ue||e),Ue=0;var a=j.__H||(j.__H={__:[],__h:[]});return t>=a.__.length&&a.__.push({}),a.__[t]}function L(t){return Ue=1,pr(Ea,t)}function pr(t,e,a){var r=nt(ge++,2);if(r.t=t,!r.__c&&(r.__=[Ea(void 0,e),function(o){var c=r.__N?r.__N[0]:r.__[0],d=r.t(c,o);c!==d&&(r.__N=[d,r.__[1]],r.__c.setState({}))}],r.__c=j,!j.__f)){var i=function(o,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,o,c,d);var u=r.__c.props!==o;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,o,c,d)||u};j.__f=!0;var n=j.shouldComponentUpdate,s=j.componentWillUpdate;j.componentWillUpdate=function(o,c,d){if(this.__e){var h=n;n=void 0,i(o,c,d),n=h}s&&s.call(this,o,c,d)},j.shouldComponentUpdate=i}return r.__N||r.__}function H(t,e){var a=nt(ge++,3);!F.__s&&Aa(a.__H,e)&&(a.__=t,a.u=e,j.__H.__h.push(a))}function Oe(t){return Ue=5,ee(function(){return{current:t}},[])}function ee(t,e){var a=nt(ge++,7);return Aa(a.__H,e)&&(a.__=t(),a.__H=e,a.__h=t),a.__}function fr(t){var e=j.context[t.__c],a=nt(ge++,9);return a.c=t,e?(a.__==null&&(a.__=!0,e.sub(j)),e.props.value):t.__}function mr(){for(var t;t=Ta.shift();){var e=t.__H;if(t.__P&&e)try{e.__h.some(Me),e.__h.some(vt),e.__h=[]}catch(a){e.__h=[],F.__e(a,t.__v)}}}F.__b=function(t){j=null,qt&&qt(t)},F.__=function(t,e){t&&e.__k&&e.__k.__m&&(t.__m=e.__k.__m),Kt&&Kt(t,e)},F.__r=function(t){Xt&&Xt(t),ge=0;var e=(j=t.__c).__H;e&&(lt===j?(e.__h=[],j.__h=[],e.__.some(function(a){a.__N&&(a.__=a.__N),a.u=a.__N=void 0})):(e.__h.some(Me),e.__h.some(vt),e.__h=[],ge=0)),lt=j},F.diffed=function(t){Yt&&Yt(t);var e=t.__c;e&&e.__H&&(e.__H.__h.length&&(Ta.push(e)!==1&&Wt===F.requestAnimationFrame||((Wt=F.requestAnimationFrame)||br)(mr)),e.__H.__.some(function(a){a.u&&(a.__H=a.u),a.u=void 0})),lt=j=null},F.__c=function(t,e){e.some(function(a){try{a.__h.some(Me),a.__h=a.__h.filter(function(r){return!r.__||vt(r)})}catch(r){e.some(function(i){i.__h&&(i.__h=[])}),e=[],F.__e(r,a.__v)}}),Jt&&Jt(t,e)},F.unmount=function(t){Gt&&Gt(t);var e,a=t.__c;a&&a.__H&&(a.__H.__.some(function(r){try{Me(r)}catch(i){e=i}}),a.__H=void 0,e&&F.__e(e,a.__v))};var Qt=typeof requestAnimationFrame=="function";function br(t){var e,a=function(){clearTimeout(r),Qt&&cancelAnimationFrame(e),setTimeout(t)},r=setTimeout(a,35);Qt&&(e=requestAnimationFrame(a))}function Me(t){var e=j,a=t.__c;typeof a=="function"&&(t.__c=void 0,a()),j=e}function vt(t){var e=j;t.__c=t.__(),j=e}function Aa(t,e){return!t||t.length!==e.length||e.some(function(a,r){return a!==t[r]})}function Ea(t,e){return typeof e=="function"?e(t):e}var gr=Symbol.for("preact-signals");function Lt(){if(ce>1)ce--;else{var t,e=!1;for((function(){var i=Ve;for(Ve=void 0;i!==void 0;)i.S.v===i.v&&(i.S.i=i.i),i=i.o})();Se!==void 0;){var a=Se;for(Se=void 0,He++;a!==void 0;){var r=a.u;if(a.u=void 0,a.f&=-3,!(8&a.f)&&$a(a))try{a.c()}catch(i){e||(t=i,e=!0)}a=r}}if(He=0,ce--,e)throw t}}var R=void 0;function Ia(t){var e=R;R=void 0;try{return t()}finally{R=e}}var Se=void 0,ce=0,He=0,ea=0,Ve=void 0,Be=0;function Ra(t){if(R!==void 0){var e=t.n;if(e===void 0||e.t!==R)return e={i:0,S:t,p:R.s,n:void 0,t:R,e:void 0,x:void 0,r:e},R.s!==void 0&&(R.s.n=e),R.s=e,t.n=e,32&R.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=R.s,e.n=void 0,R.s.n=e,R.s=e),e}}function Z(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}Z.prototype.brand=gr;Z.prototype.h=function(){return!0};Z.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:Ia(function(){var r;(r=e.W)==null||r.call(e)}))};Z.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&&Ia(function(){var i;(i=e.Z)==null||i.call(e)}))}};Z.prototype.subscribe=function(t){var e=this;return yr(function(){var a=e.value,r=R;R=void 0;try{t(a)}finally{R=r}},{name:"sub"})};Z.prototype.valueOf=function(){return this.value};Z.prototype.toString=function(){return this.value+""};Z.prototype.toJSON=function(){return this.value};Z.prototype.peek=function(){var t=R;R=void 0;try{return this.value}finally{R=t}};Object.defineProperty(Z.prototype,"value",{get:function(){var t=Ra(this);return t!==void 0&&(t.i=this.i),this.v},set:function(t){if(t!==this.v){if(He>100)throw new Error("Cycle detected");(function(a){ce!==0&&He===0&&a.l!==ea&&(a.l=ea,Ve={S:a,v:a.v,i:a.i,o:Ve})})(this),this.v=t,this.i++,Be++,ce++;try{for(var e=this.t;e!==void 0;e=e.x)e.t.N()}finally{Lt()}}}});function Pt(t,e){return new Z(t,e)}function $a(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 Oa(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 La(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 ve(t,e){Z.call(this,void 0),this.x=t,this.s=void 0,this.g=Be-1,this.f=4,this.W=e?.watched,this.Z=e?.unwatched,this.name=e?.name}ve.prototype=new Z;ve.prototype.h=function(){if(this.f&=-3,1&this.f)return!1;if((36&this.f)==32||(this.f&=-5,this.g===Be))return!0;if(this.g=Be,this.f|=1,this.i>0&&!$a(this))return this.f&=-2,!0;var t=R;try{Oa(this),R=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 R=t,La(this),this.f&=-2,!0};ve.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)}Z.prototype.S.call(this,t)};ve.prototype.U=function(t){if(this.t!==void 0&&(Z.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)}};ve.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(ve.prototype,"value",{get:function(){if(1&this.f)throw new Error("Cycle detected");var t=Ra(this);if(this.h(),t!==void 0&&(t.i=this.i),16&this.f)throw this.v;return this.v}});function Pa(t){var e=t.m;if(t.m=void 0,typeof e=="function"){ce++;var a=R;R=void 0;try{e()}catch(r){throw t.f&=-2,t.f|=8,jt(t),r}finally{R=a,Lt()}}}function jt(t){for(var e=t.s;e!==void 0;e=e.n)e.S.U(e);t.x=void 0,t.s=void 0,Pa(t)}function _r(t){if(R!==this)throw new Error("Out-of-order effect");La(this),R=t,this.f&=-2,8&this.f&&jt(this),Lt()}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,Pa(this),Oa(this),ce++;var t=R;return R=this,_r.bind(this,t)};ke.prototype.N=function(){2&this.f||(this.f|=2,this.u=Se,Se=this)};ke.prototype.d=function(){this.f|=8,1&this.f||jt(this)};ke.prototype.dispose=function(){this.d()};function yr(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 vr(){return await Ee("/api/rules")}async function ja(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 Ee(Za("/api/ledger",e))}async function kr(){return await Ee("/api/doctor")}async function Fa(){return await Ee("/api/human-lock")}async function wr(t){return await Ma("/api/human-lock/approve",t)}async function xr(t){return await Ma("/api/intent/annotate",t)}async function Nr(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 Ee(Za("/api/history/state",e))}let re;function Sr(t,e,a,r,i){let n=!1;const s=new AbortController;let o=!1;const c=Ft({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:s.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:T}=await u.read();if(y)break;p+=g.decode(T,{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),Cr(x,a)}}}catch{}finally{n||d(()=>{i()})}})(),{close(){n=!0,s.abort()}};function d(h){o||(o=!0,h())}}function Cr(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 Tr(){if(re!==void 0)return re;const e=window.__FABRIC_AUTH_TOKEN__;if(typeof e=="string"&&e.length>0)return re=e,re;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(),s=`${a.pathname}${n.length>0?`?${n}`:""}${a.hash}`;return window.history.replaceState({},document.title,s),re=i,re}return re=null,re}function Ar(t){try{const e=JSON.parse(t);return typeof e.type=="string"&&"payload"in e?e:null}catch{return null}}async function Ee(t){const e=await fetch(t,{headers:Ft({Accept:"application/json"})});return await Da(e)}async function Ma(t,e){const a=await fetch(t,{method:"POST",headers:Ft({Accept:"application/json","Content-Type":"application/json"}),body:JSON.stringify(e)});return await Da(a)}async function Da(t){const e=await t.text(),a=e.length>0?JSON.parse(e):void 0;if(!t.ok)throw new Error(Er(a,t.status));return a}function Er(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 Za(t,e){const a=e.toString();return a.length>0?`${t}?${a}`:t}function Ft(t){const e=Tr();return e===null?t:{...t,Authorization:`Bearer ${e}`}}const Ir=["meta:updated","lock:drift","lock:approved","ledger:appended","drift:detected"],Rr=new Set(Ir),dt=Pt([]),ct=Pt(!1),ut=Pt(0),ta=1e3,$r=3e4,Or=2;function Lr(){const[t,e]=L({connected:ct.value,lastEvent:dt.value[0]??null,version:ut.value}),a=Oe(null),r=Oe(ta),i=Oe(void 0),n=Oe(!0);return H(()=>{n.current=!0;const s=h=>{ct.value=h,e(u=>({...u,connected:h}))},o=(h,u,g)=>{if(!Rr.has(h))return;g.length>0&&(a.current=g);const p=Ar(u);p!==null&&(dt.value=[p,...dt.value].slice(0,50),ut.value+=1,e({connected:ct.value,lastEvent:p,version:ut.value}))};let c=null;const d=()=>{n.current&&(c=Sr("/events",a.current,o,()=>{n.current&&(r.current=ta,s(!0))},()=>{if(!n.current)return;s(!1);const h=r.current;r.current=Math.min(r.current*Or,$r),i.current=setTimeout(d,h)}))};return d(),()=>{n.current=!1,clearTimeout(i.current),c?.close(),s(!1)}},[]),t}var Pr={"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.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.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 canonical --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.rules.label":"Rules Tree","dashboard.app.nav.rules.label-bilingual":"规则树 Rules Tree","dashboard.app.nav.rules.subtitle":"meta graph","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":"ledger stream","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":"fab diagnostics","dashboard.app.nav.section.diagnostics":"Diagnostics","dashboard.app.nav.drift-check":"Drift Check","dashboard.app.header.connected":"CONNECTED","dashboard.app.header.connecting":"CONNECTING","dashboard.app.live-region.received":"Received {type}","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.rules-tree.title":"Rules Tree Browser","dashboard.rules-tree.subtitle":".fabric/agents.meta.json · L0/L1/L2 hierarchy · hash drift aware","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 · rev {revision}","dashboard.rules-tree.status.locks":"{count} human locks","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 Lock Vault","dashboard.human-lock.subtitle":"Protected regions awaiting approval · ritual writes only","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":".intent-ledger.jsonl · dual-column AI | Human · sorted by timestamp desc","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":"Time-travel through ledger commits and rehydrate the rules tree at any recorded point","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":"ledger {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 revision","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":"fab doctor surface · framework, entry points, revision drift, 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 meta revision 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"},jr={"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.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.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":"已启用 canonical --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:当前未检测到框架标记,需要手动补充技术栈 TODO。","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.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":"fab 诊断","dashboard.app.nav.section.diagnostics":"诊断","dashboard.app.nav.drift-check":"漂移检查","dashboard.app.header.connected":"已连接","dashboard.app.header.connecting":"连接中","dashboard.app.live-region.received":"已收到 {type}","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.rules-tree.title":"规则树浏览器","dashboard.rules-tree.subtitle":".fabric/agents.meta.json · L0/L1/L2 层级 · 感知哈希漂移","dashboard.rules-tree.filter.placeholder":"按文件、glob、优先级、哈希过滤...","dashboard.rules-tree.filter.aria-label":"过滤规则树","dashboard.rules-tree.status.loading":"规则加载中","dashboard.rules-tree.status.nodes":"{count} 个节点 · rev {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":".intent-ledger.jsonl · AI | Human 双列 · 按时间倒序","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":"ledger {ledgerId} · commit {commit} · {mode}","dashboard.history-replay.status.loading":"快照加载中","dashboard.history-replay.status.nodes":"{count} 个节点","dashboard.history-replay.status.unknown-revision":"未知 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":"fab doctor 面板 · 框架、入口点、revision 漂移、受保护路径","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":"暂无 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":"重试"},Fr={en:Pr,"zh-CN":jr};function Mr(t,e=Fr){const a=e[t]??e.en,r=e.en;return(i,n)=>{const s=a[i]??r[i]??i;return n===void 0?s:Object.entries(n).reduce((o,[c,d])=>o.replaceAll(`{${c}}`,d),s)}}function Dr(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 Zr(){return typeof navigator<"u"&&typeof navigator.language=="string"?Dr(navigator.language):"en"}function zr(t=Zr()){return{locale:t,t:Mr(t)}}const za=ur(null);function Ur({children:t}){const e=ee(()=>zr(),[]);return l(za.Provider,{value:e,children:t})}function V(){const t=fr(za);if(t===null)throw new Error("useI18n must be used within an I18nProvider.");return t}function Ua({variant:t,state:e="idle",size:a="md",onClick:r,children:i,ariaLabel:n}){const{t:s}=V(),[o,c]=L(e),d=e==="idle"?o: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 l("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?l("span",{className:"spinner","aria-hidden":"true"}):null,d==="success"?l("span",{"aria-hidden":"true",children:"✓"}):null,d==="error"?s("dashboard.approve-button.retry"):i]})}const Hr={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 se({kind:t,severity:e,message:a,diffStats:r}){const{t:i}=V();if(e==="ok"&&t==="dot")return null;const n=a??i(Hr[e]),s=r===void 0?"":` +${r.added} / -${r.removed}`,o=`drift-indicator drift-${t} drift-${e}`;return t==="dot"?l("span",{className:o,"aria-label":n}):t==="banner"?l("div",{className:o,role:"status",children:[l("span",{"aria-hidden":"true",children:"!"}),l("span",{children:[n,s]})]}):l("span",{className:o,children:[l("span",{"aria-hidden":"true",children:e==="ok"?"✓":"!"}),l("span",{children:[n,s]})]})}function Vr({entry:t,currentHash:e,diffStats:a,diffPreview:r=[],onApprove:i,busy:n=!1}){const{t:s}=V(),o=e!==void 0&&e!==t.hash,c=o?"drift":"ok",d=s(o?"dashboard.lock-card.status.drift":"dashboard.lock-card.status.confirmed"),h=`L${t.start_line}-L${t.end_line}`;return l("article",{className:`lock-card lock-${c} ${n?"is-busy":""}`,"aria-label":s("dashboard.lock-card.aria-label",{file:t.file,lineRange:h,status:d}),children:[l("header",{className:"lock-head",children:[l("div",{className:"lock-icon","aria-hidden":"true",children:o?"!":"✓"}),l("div",{className:"lock-title",children:[l("strong",{children:t.file}),l("span",{children:h})]}),l(se,{kind:"pill",severity:o?"drift":"ok",message:d})]}),l("div",{className:"lock-body",children:[l("div",{className:"hash-block",children:[l(ht,{label:s("dashboard.lock-card.hash.locked"),value:t.hash,stale:o}),l(ht,{label:s("dashboard.lock-card.hash.current"),value:e??s("dashboard.history-replay.meta.not-available")}),l(ht,{label:s("dashboard.lock-card.hash.diff"),value:Br(a,o,s),accent:o})]}),l("div",{className:"preview",children:[l("div",{className:"preview-head",children:[l("span",{children:[t.file," · ",h]}),l("span",{children:s(o?"dashboard.lock-card.preview.drift":"dashboard.lock-card.preview.sync")})]}),l("pre",{className:"preview-body",children:r.length>0?r.map(u=>l("span",{className:`line-${u.kind}`,children:[l("span",{className:"line-num",children:u.line}),u.text,`
11
+ `]},`${u.kind}:${u.line}:${u.text}`)):`${t.file}
12
+ ${h}
13
+ ${s(o?"dashboard.lock-card.preview.drift-detail":"dashboard.lock-card.preview.sync-detail")}`})]})]}),l("footer",{className:"lock-foot",children:[l("span",{className:"meta-line",children:s("dashboard.lock-card.footer.region",{count:String(t.end_line-t.start_line+1)})}),o&&e!==void 0&&i!==void 0?l(Ua,{variant:"approve",state:n?"busy":"idle",ariaLabel:s("dashboard.lock-card.button.approve"),onClick:()=>i(t),children:s("dashboard.lock-card.button.approve")}):l("button",{className:"action-button action-approve action-success",type:"button","aria-disabled":"true",children:["✓ ",s("dashboard.lock-card.button.confirmed")]})]})]})}function ht({label:t,value:e,stale:a=!1,accent:r=!1}){return l("div",{className:"hash-row",children:[l("span",{className:"hash-key",children:t}),l("span",{className:`hash-value ${a?"is-stale":""} ${r?"is-accent":""}`,children:e})]})}function Br(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 kt({source:t,size:e="sm",variant:a="filled",interactive:r=!1,selected:i=!1,onClick:n}){const{t:s}=V(),o=["source-badge",`source-badge-${t}`,`source-badge-${e}`,`source-badge-${a}`,i?"is-selected":""].filter(Boolean).join(" "),c=s(`dashboard.source.${t}`);return r?l("button",{className:o,type:"button","aria-pressed":i,onClick:n,children:[l("span",{className:"source-badge-dot","aria-hidden":"true"}),c]}):l("span",{className:o,children:[l("span",{className:"source-badge-dot","aria-hidden":"true"}),c]})}function Ha({entry:t,onAnnotate:e,expanded:a=!1,readOnly:r=!1}){const{locale:i,t:n}=V(),[s,o]=L(a),[c,d]=L(""),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(""),o(!1))};return l("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:[l("div",{className:`dot-axis ${t.source}`,"aria-hidden":"true"}),l("div",{className:"timeline-head",children:[l(kt,{source:t.source}),h?l("span",{className:"commit-hash",children:t.commit_sha??n("dashboard.timeline-entry.working-tree")}):null,h?null:l("span",{className:"commit-hash",children:n("dashboard.timeline-entry.parent",{parent:t.parent_sha})}),h?null:l("span",{className:"diff-badge",children:t.diff_stat}),l("time",{className:"entry-time",dateTime:new Date(t.ts).toISOString(),children:Wr(t.ts,i)})]}),l("h3",{className:"entry-title",children:t.intent}),l("div",{className:"entry-meta",children:[l("span",{children:[l("span",{className:"meta-key",children:n("dashboard.timeline-entry.paths")})," ",t.affected_paths.length]}),t.affected_paths.slice(0,3).map(p=>l("span",{children:p},p))]}),!h&&t.annotation!==void 0?l("div",{className:"entry-body",children:t.annotation}):null,h&&u?l("div",{className:"entry-foot",children:l("button",{className:"ghost-button",type:"button",onClick:()=>o(p=>!p),children:n("dashboard.timeline-entry.annotate")})}):null,s&&h?l("form",{className:"annotate-form",onSubmit:p=>{p.preventDefault(),g()},children:[l("label",{htmlFor:`annotate-${t.id??t.ts}`,children:n("dashboard.timeline-entry.annotation-label")}),l("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")}),l(Ua,{variant:"annotate",size:"sm",onClick:g,children:n("dashboard.timeline-entry.annotation-save")})]}):null]})}function Wr(t,e){return new Intl.DateTimeFormat(e,{hour:"2-digit",minute:"2-digit",second:"2-digit"}).format(new Date(t))}function Mt({node:t,level:e,selected:a=!1,onSelect:r,humanLockedNearby:i=!1,staleReason:n=null,defaultExpanded:s=!1,readOnly:o=!1,children:c=[]}){const{t:d}=V(),[h,u]=L(s),g=c.length>0,p=t.file,y=n===null?"ok":n==="orphan"?"orphan":"stale",T=()=>{o||(g&&u(x=>!x),r?.(p))},w=x=>{o||((x.key==="Enter"||x.key===" ")&&(x.preventDefault(),T()),x.key==="ArrowRight"&&g&&u(!0),x.key==="ArrowLeft"&&g&&u(!1))};return l("div",{className:`tree-node-group tree-level-${e}`,children:[l("div",{className:["tree-node",a?"is-selected":"",h?"is-expanded":"",i?"is-locked":"",n!==null?"is-stale":"",o?"is-readonly":""].filter(Boolean).join(" "),role:"treeitem","aria-expanded":g?h:void 0,"aria-level":e+1,"aria-readonly":o||void 0,tabIndex:o?-1:0,onClick:o?void 0:T,onKeyDown:o?void 0:w,children:[l("span",{className:"tree-caret","aria-hidden":"true",children:g?"›":"·"}),l("span",{className:"tree-icon","aria-hidden":"true",children:e===0?"F":e===1?"D":"R"}),l("span",{className:"tree-label",children:p}),i?l("span",{className:"badge badge-locked",children:d("dashboard.tree-node.locked")}):null,n!==null?l(se,{kind:"pill",severity:y,message:d(`dashboard.tree-node.stale.${n}`)}):null,l("span",{className:"tree-meta",children:[l("span",{className:"badge badge-level",children:["L",e]}),l("span",{className:"tree-hash",children:qr(t.hash)})]})]}),g&&h?l("div",{className:"tree-children",role:"group",children:c.map(x=>l(Mt,{...x,onSelect:r,readOnly:o},`${x.node.file}:${x.level}`))}):null]})}function qr(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 s of i)n[s]=s;return n},t.getValidEnumValues=i=>{const n=t.objectKeys(i).filter(o=>typeof i[i[o]]!="number"),s={};for(const o of n)s[o]=i[o];return t.objectValues(s)},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 s in i)Object.prototype.hasOwnProperty.call(i,s)&&n.push(s);return n},t.find=(i,n)=>{for(const s of i)if(n(s))return s},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(s=>typeof s=="string"?`'${s}'`:s).join(n)}t.joinValues=r,t.jsonStringifyReplacer=(i,n)=>typeof n=="bigint"?n.toString():n})(I||(I={}));var aa;(function(t){t.mergeShapes=(e,a)=>({...e,...a})})(aa||(aa={}));const _=I.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),ne=t=>{switch(typeof t){case"undefined":return _.undefined;case"string":return _.string;case"number":return Number.isNaN(t)?_.nan:_.number;case"boolean":return _.boolean;case"function":return _.function;case"bigint":return _.bigint;case"symbol":return _.symbol;case"object":return Array.isArray(t)?_.array:t===null?_.null:t.then&&typeof t.then=="function"&&t.catch&&typeof t.catch=="function"?_.promise:typeof Map<"u"&&t instanceof Map?_.map:typeof Set<"u"&&t instanceof Set?_.set:typeof Date<"u"&&t instanceof Date?_.date:_.object;default:return _.unknown}},f=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 te 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 s of n.issues)if(s.code==="invalid_union")s.unionErrors.map(i);else if(s.code==="invalid_return_type")i(s.returnTypeError);else if(s.code==="invalid_arguments")i(s.argumentsError);else if(s.path.length===0)r._errors.push(a(s));else{let o=r,c=0;for(;c<s.path.length;){const d=s.path[c];c===s.path.length-1?(o[d]=o[d]||{_errors:[]},o[d]._errors.push(a(s))):o[d]=o[d]||{_errors:[]},o=o[d],c++}}};return i(this),r}static assert(e){if(!(e instanceof te))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()}}te.create=t=>new te(t);const wt=(t,e)=>{let a;switch(t.code){case f.invalid_type:t.received===_.undefined?a="Required":a=`Expected ${t.expected}, received ${t.received}`;break;case f.invalid_literal:a=`Invalid literal value, expected ${JSON.stringify(t.expected,I.jsonStringifyReplacer)}`;break;case f.unrecognized_keys:a=`Unrecognized key(s) in object: ${I.joinValues(t.keys,", ")}`;break;case f.invalid_union:a="Invalid input";break;case f.invalid_union_discriminator:a=`Invalid discriminator value. Expected ${I.joinValues(t.options)}`;break;case f.invalid_enum_value:a=`Invalid enum value. Expected ${I.joinValues(t.options)}, received '${t.received}'`;break;case f.invalid_arguments:a="Invalid function arguments";break;case f.invalid_return_type:a="Invalid function return type";break;case f.invalid_date:a="Invalid date";break;case f.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 f.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 f.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 f.custom:a="Invalid input";break;case f.invalid_intersection_types:a="Intersection results could not be merged";break;case f.not_multiple_of:a=`Number must be a multiple of ${t.multipleOf}`;break;case f.not_finite:a="Number must be finite";break;default:a=e.defaultError,I.assertNever(t)}return{message:a}};let Xr=wt;function Yr(){return Xr}const Jr=t=>{const{data:e,path:a,errorMaps:r,issueData:i}=t,n=[...a,...i.path||[]],s={...i,path:n};if(i.message!==void 0)return{...i,path:n,message:i.message};let o="";const c=r.filter(d=>!!d).slice().reverse();for(const d of c)o=d(s,{data:e,defaultError:o}).message;return{...i,path:n,message:o}};function b(t,e){const a=Yr(),r=Jr({issueData:e,data:t.data,path:t.path,errorMaps:[t.common.contextualErrorMap,t.schemaErrorMap,a,a===wt?void 0:wt].filter(i=>!!i)});t.common.issues.push(r)}class D{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,s=await i.value;r.push({key:n,value:s})}return D.mergeObjectSync(e,r)}static mergeObjectSync(e,a){const r={};for(const i of a){const{key:n,value:s}=i;if(n.status==="aborted"||s.status==="aborted")return N;n.status==="dirty"&&e.dirty(),s.status==="dirty"&&e.dirty(),n.value!=="__proto__"&&(typeof s.value<"u"||i.alwaysSet)&&(r[n.value]=s.value)}return{status:e.value,value:r}}}const N=Object.freeze({status:"aborted"}),xe=t=>({status:"dirty",value:t}),W=t=>({status:"valid",value:t}),ra=t=>t.status==="aborted",ia=t=>t.status==="dirty",_e=t=>t.status==="valid",We=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 Y{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 na=(t,e)=>{if(_e(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 te(t.common.issues);return this._error=a,this._error}}};function C(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:(s,o)=>{const{message:c}=t;return s.code==="invalid_enum_value"?{message:c??o.defaultError}:typeof o.data>"u"?{message:c??r??o.defaultError}:s.code!=="invalid_type"?{message:o.defaultError}:{message:c??a??o.defaultError}},description:i}}class E{get description(){return this._def.description}_getType(e){return ne(e.data)}_getOrReturnCtx(e,a){return a||{common:e.parent.common,data:e.data,parsedType:ne(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}_processInputParams(e){return{status:new D,ctx:{common:e.parent.common,data:e.data,parsedType:ne(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}}_parseSync(e){const a=this._parse(e);if(We(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:ne(e)},i=this._parseSync({data:e,path:r.path,parent:r});return na(r,i)}"~validate"(e){const a={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:ne(e)};if(!this["~standard"].async)try{const r=this._parseSync({data:e,path:[],parent:a});return _e(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=>_e(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:ne(e)},i=this._parse({data:e,path:r.path,parent:r}),n=await(We(i)?i:Promise.resolve(i));return na(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 s=e(i),o=()=>n.addIssue({code:f.custom,...r(i)});return typeof Promise<"u"&&s instanceof Promise?s.then(c=>c?!0:(o(),!1)):s?!0:(o(),!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 Q.create(this,this._def)}nullable(){return pe.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return X.create(this)}promise(){return Ke.create(this,this._def)}or(e){return Xe.create([this,e],this._def)}and(e){return Ye.create(this,e,this._def)}transform(e){return new le({...C(this._def),schema:this,typeName:S.ZodEffects,effect:{type:"transform",transform:e}})}default(e){const a=typeof e=="function"?e:()=>e;return new Qe({...C(this._def),innerType:this,defaultValue:a,typeName:S.ZodDefault})}brand(){return new qa({typeName:S.ZodBranded,type:this,...C(this._def)})}catch(e){const a=typeof e=="function"?e:()=>e;return new et({...C(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 Zt.create(this,e)}readonly(){return tt.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}const Gr=/^c[^\s-]{8,}$/i,Kr=/^[0-9a-z]+$/,Qr=/^[0-9A-HJKMNP-TV-Z]{26}$/i,ei=/^[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,ti=/^[a-z0-9_-]{21}$/i,ai=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,ri=/^[-+]?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)?)??$/,ii=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,ni="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";let pt;const si=/^(?:(?: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])$/,oi=/^(?:(?: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])$/,li=/^(([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]))$/,di=/^(([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])$/,ci=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,ui=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,Va="((\\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])))",hi=new RegExp(`^${Va}$`);function Ba(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 pi(t){return new RegExp(`^${Ba(t)}$`)}function fi(t){let e=`${Va}T${Ba(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 mi(t,e){return!!((e==="v4"||!e)&&si.test(t)||(e==="v6"||!e)&&li.test(t))}function bi(t,e){if(!ai.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 gi(t,e){return!!((e==="v4"||!e)&&oi.test(t)||(e==="v6"||!e)&&di.test(t))}class K extends E{_parse(e){if(this._def.coerce&&(e.data=String(e.data)),this._getType(e)!==_.string){const n=this._getOrReturnCtx(e);return b(n,{code:f.invalid_type,expected:_.string,received:n.parsedType}),N}const r=new D;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:f.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:f.too_big,maximum:n.value,type:"string",inclusive:!0,exact:!1,message:n.message}),r.dirty());else if(n.kind==="length"){const s=e.data.length>n.value,o=e.data.length<n.value;(s||o)&&(i=this._getOrReturnCtx(e,i),s?b(i,{code:f.too_big,maximum:n.value,type:"string",inclusive:!0,exact:!0,message:n.message}):o&&b(i,{code:f.too_small,minimum:n.value,type:"string",inclusive:!0,exact:!0,message:n.message}),r.dirty())}else if(n.kind==="email")ii.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"email",code:f.invalid_string,message:n.message}),r.dirty());else if(n.kind==="emoji")pt||(pt=new RegExp(ni,"u")),pt.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"emoji",code:f.invalid_string,message:n.message}),r.dirty());else if(n.kind==="uuid")ei.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"uuid",code:f.invalid_string,message:n.message}),r.dirty());else if(n.kind==="nanoid")ti.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"nanoid",code:f.invalid_string,message:n.message}),r.dirty());else if(n.kind==="cuid")Gr.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"cuid",code:f.invalid_string,message:n.message}),r.dirty());else if(n.kind==="cuid2")Kr.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"cuid2",code:f.invalid_string,message:n.message}),r.dirty());else if(n.kind==="ulid")Qr.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"ulid",code:f.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:f.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:f.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:f.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:f.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:f.invalid_string,validation:{endsWith:n.value},message:n.message}),r.dirty()):n.kind==="datetime"?fi(n).test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{code:f.invalid_string,validation:"datetime",message:n.message}),r.dirty()):n.kind==="date"?hi.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{code:f.invalid_string,validation:"date",message:n.message}),r.dirty()):n.kind==="time"?pi(n).test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{code:f.invalid_string,validation:"time",message:n.message}),r.dirty()):n.kind==="duration"?ri.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"duration",code:f.invalid_string,message:n.message}),r.dirty()):n.kind==="ip"?mi(e.data,n.version)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"ip",code:f.invalid_string,message:n.message}),r.dirty()):n.kind==="jwt"?bi(e.data,n.alg)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"jwt",code:f.invalid_string,message:n.message}),r.dirty()):n.kind==="cidr"?gi(e.data,n.version)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"cidr",code:f.invalid_string,message:n.message}),r.dirty()):n.kind==="base64"?ci.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"base64",code:f.invalid_string,message:n.message}),r.dirty()):n.kind==="base64url"?ui.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"base64url",code:f.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:f.invalid_string,...k.errToObj(r)})}_addCheck(e){return new K({...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 K({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new K({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new K({...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}}K.create=t=>new K({checks:[],typeName:S.ZodString,coerce:t?.coerce??!1,...C(t)});function _i(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(".","")),s=Number.parseInt(e.toFixed(i).replace(".",""));return n%s/10**i}class ye 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)!==_.number){const n=this._getOrReturnCtx(e);return b(n,{code:f.invalid_type,expected:_.number,received:n.parsedType}),N}let r;const i=new D;for(const n of this._def.checks)n.kind==="int"?I.isInteger(e.data)||(r=this._getOrReturnCtx(e,r),b(r,{code:f.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:f.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:f.too_big,maximum:n.value,type:"number",inclusive:n.inclusive,exact:!1,message:n.message}),i.dirty()):n.kind==="multipleOf"?_i(e.data,n.value)!==0&&(r=this._getOrReturnCtx(e,r),b(r,{code:f.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:f.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 ye({...this._def,checks:[...this._def.checks,{kind:e,value:a,inclusive:r,message:k.toString(i)}]})}_addCheck(e){return new ye({...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)}}ye.create=t=>new ye({checks:[],typeName:S.ZodNumber,coerce:t?.coerce||!1,...C(t)});class Ce 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)!==_.bigint)return this._getInvalidInput(e);let r;const i=new D;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:f.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:f.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:f.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:f.invalid_type,expected:_.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 Ce({...this._def,checks:[...this._def.checks,{kind:e,value:a,inclusive:r,message:k.toString(i)}]})}_addCheck(e){return new Ce({...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}}Ce.create=t=>new Ce({checks:[],typeName:S.ZodBigInt,coerce:t?.coerce??!1,...C(t)});class xt extends E{_parse(e){if(this._def.coerce&&(e.data=!!e.data),this._getType(e)!==_.boolean){const r=this._getOrReturnCtx(e);return b(r,{code:f.invalid_type,expected:_.boolean,received:r.parsedType}),N}return W(e.data)}}xt.create=t=>new xt({typeName:S.ZodBoolean,coerce:t?.coerce||!1,...C(t)});class qe extends E{_parse(e){if(this._def.coerce&&(e.data=new Date(e.data)),this._getType(e)!==_.date){const n=this._getOrReturnCtx(e);return b(n,{code:f.invalid_type,expected:_.date,received:n.parsedType}),N}if(Number.isNaN(e.data.getTime())){const n=this._getOrReturnCtx(e);return b(n,{code:f.invalid_date}),N}const r=new D;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:f.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:f.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 qe({...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}}qe.create=t=>new qe({checks:[],coerce:t?.coerce||!1,typeName:S.ZodDate,...C(t)});class sa extends E{_parse(e){if(this._getType(e)!==_.symbol){const r=this._getOrReturnCtx(e);return b(r,{code:f.invalid_type,expected:_.symbol,received:r.parsedType}),N}return W(e.data)}}sa.create=t=>new sa({typeName:S.ZodSymbol,...C(t)});class Nt extends E{_parse(e){if(this._getType(e)!==_.undefined){const r=this._getOrReturnCtx(e);return b(r,{code:f.invalid_type,expected:_.undefined,received:r.parsedType}),N}return W(e.data)}}Nt.create=t=>new Nt({typeName:S.ZodUndefined,...C(t)});class St extends E{_parse(e){if(this._getType(e)!==_.null){const r=this._getOrReturnCtx(e);return b(r,{code:f.invalid_type,expected:_.null,received:r.parsedType}),N}return W(e.data)}}St.create=t=>new St({typeName:S.ZodNull,...C(t)});class oa extends E{constructor(){super(...arguments),this._any=!0}_parse(e){return W(e.data)}}oa.create=t=>new oa({typeName:S.ZodAny,...C(t)});class la extends E{constructor(){super(...arguments),this._unknown=!0}_parse(e){return W(e.data)}}la.create=t=>new la({typeName:S.ZodUnknown,...C(t)});class oe extends E{_parse(e){const a=this._getOrReturnCtx(e);return b(a,{code:f.invalid_type,expected:_.never,received:a.parsedType}),N}}oe.create=t=>new oe({typeName:S.ZodNever,...C(t)});class da extends E{_parse(e){if(this._getType(e)!==_.undefined){const r=this._getOrReturnCtx(e);return b(r,{code:f.invalid_type,expected:_.void,received:r.parsedType}),N}return W(e.data)}}da.create=t=>new da({typeName:S.ZodVoid,...C(t)});class X extends E{_parse(e){const{ctx:a,status:r}=this._processInputParams(e),i=this._def;if(a.parsedType!==_.array)return b(a,{code:f.invalid_type,expected:_.array,received:a.parsedType}),N;if(i.exactLength!==null){const s=a.data.length>i.exactLength.value,o=a.data.length<i.exactLength.value;(s||o)&&(b(a,{code:s?f.too_big:f.too_small,minimum:o?i.exactLength.value:void 0,maximum:s?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:f.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:f.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((s,o)=>i.type._parseAsync(new Y(a,s,a.path,o)))).then(s=>D.mergeArray(r,s));const n=[...a.data].map((s,o)=>i.type._parseSync(new Y(a,s,a.path,o)));return D.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,...C(e)});function me(t){if(t instanceof M){const e={};for(const a in t.shape){const r=t.shape[a];e[a]=Q.create(me(r))}return new M({...t._def,shape:()=>e})}else return t instanceof X?new X({...t._def,type:me(t.element)}):t instanceof Q?Q.create(me(t.unwrap())):t instanceof pe?pe.create(me(t.unwrap())):t instanceof ue?ue.create(t.items.map(e=>me(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)!==_.object){const d=this._getOrReturnCtx(e);return b(d,{code:f.invalid_type,expected:_.object,received:d.parsedType}),N}const{status:r,ctx:i}=this._processInputParams(e),{shape:n,keys:s}=this._getCached(),o=[];if(!(this._def.catchall instanceof oe&&this._def.unknownKeys==="strip"))for(const d in i.data)s.includes(d)||o.push(d);const c=[];for(const d of s){const h=n[d],u=i.data[d];c.push({key:{status:"valid",value:d},value:h._parse(new Y(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 o)c.push({key:{status:"valid",value:h},value:{status:"valid",value:i.data[h]}});else if(d==="strict")o.length>0&&(b(i,{code:f.unrecognized_keys,keys:o}),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 o){const u=i.data[h];c.push({key:{status:"valid",value:h},value:d._parse(new Y(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=>D.mergeObjectSync(r,d)):D.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 me(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 Q;)n=n._def.innerType;a[r]=n}return new M({...this._def,shape:()=>a})}keyof(){return Wa(I.objectKeys(this.shape))}}M.create=(t,e)=>new M({shape:()=>t,unknownKeys:"strip",catchall:oe.create(),typeName:S.ZodObject,...C(e)});M.strictCreate=(t,e)=>new M({shape:()=>t,unknownKeys:"strict",catchall:oe.create(),typeName:S.ZodObject,...C(e)});M.lazycreate=(t,e)=>new M({shape:t,unknownKeys:"strip",catchall:oe.create(),typeName:S.ZodObject,...C(e)});class Xe extends E{_parse(e){const{ctx:a}=this._processInputParams(e),r=this._def.options;function i(n){for(const o of n)if(o.result.status==="valid")return o.result;for(const o of n)if(o.result.status==="dirty")return a.common.issues.push(...o.ctx.common.issues),o.result;const s=n.map(o=>new te(o.ctx.common.issues));return b(a,{code:f.invalid_union,unionErrors:s}),N}if(a.common.async)return Promise.all(r.map(async n=>{const s={...a,common:{...a.common,issues:[]},parent:null};return{result:await n._parseAsync({data:a.data,path:a.path,parent:s}),ctx:s}})).then(i);{let n;const s=[];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&&s.push(d.common.issues)}if(n)return a.common.issues.push(...n.ctx.common.issues),n.result;const o=s.map(c=>new te(c));return b(a,{code:f.invalid_union,unionErrors:o}),N}}get options(){return this._def.options}}Xe.create=(t,e)=>new Xe({options:t,typeName:S.ZodUnion,...C(e)});const J=t=>t instanceof Tt?J(t.schema):t instanceof le?J(t.innerType()):t instanceof Ge?[t.value]:t instanceof he?t.options:t instanceof At?I.objectValues(t.enum):t instanceof Qe?J(t._def.innerType):t instanceof Nt?[void 0]:t instanceof St?[null]:t instanceof Q?[void 0,...J(t.unwrap())]:t instanceof pe?[null,...J(t.unwrap())]:t instanceof qa||t instanceof tt?J(t.unwrap()):t instanceof et?J(t._def.innerType):[];class Dt extends E{_parse(e){const{ctx:a}=this._processInputParams(e);if(a.parsedType!==_.object)return b(a,{code:f.invalid_type,expected:_.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:f.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 s=J(n.shape[e]);if(!s.length)throw new Error(`A discriminator value for key \`${e}\` could not be extracted from all schema options`);for(const o of s){if(i.has(o))throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(o)}`);i.set(o,n)}}return new Dt({typeName:S.ZodDiscriminatedUnion,discriminator:e,options:a,optionsMap:i,...C(r)})}}function Ct(t,e){const a=ne(t),r=ne(e);if(t===e)return{valid:!0,data:t};if(a===_.object&&r===_.object){const i=I.objectKeys(e),n=I.objectKeys(t).filter(o=>i.indexOf(o)!==-1),s={...t,...e};for(const o of n){const c=Ct(t[o],e[o]);if(!c.valid)return{valid:!1};s[o]=c.data}return{valid:!0,data:s}}else if(a===_.array&&r===_.array){if(t.length!==e.length)return{valid:!1};const i=[];for(let n=0;n<t.length;n++){const s=t[n],o=e[n],c=Ct(s,o);if(!c.valid)return{valid:!1};i.push(c.data)}return{valid:!0,data:i}}else return a===_.date&&r===_.date&&+t==+e?{valid:!0,data:t}:{valid:!1}}class Ye extends E{_parse(e){const{status:a,ctx:r}=this._processInputParams(e),i=(n,s)=>{if(ra(n)||ra(s))return N;const o=Ct(n.value,s.value);return o.valid?((ia(n)||ia(s))&&a.dirty(),{status:a.value,value:o.data}):(b(r,{code:f.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,s])=>i(n,s)):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}))}}Ye.create=(t,e,a)=>new Ye({left:t,right:e,typeName:S.ZodIntersection,...C(a)});class ue extends E{_parse(e){const{status:a,ctx:r}=this._processInputParams(e);if(r.parsedType!==_.array)return b(r,{code:f.invalid_type,expected:_.array,received:r.parsedType}),N;if(r.data.length<this._def.items.length)return b(r,{code:f.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:f.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),a.dirty());const n=[...r.data].map((s,o)=>{const c=this._def.items[o]||this._def.rest;return c?c._parse(new Y(r,s,r.path,o)):null}).filter(s=>!!s);return r.common.async?Promise.all(n).then(s=>D.mergeArray(a,s)):D.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,...C(e)})};class Je 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!==_.object)return b(r,{code:f.invalid_type,expected:_.object,received:r.parsedType}),N;const i=[],n=this._def.keyType,s=this._def.valueType;for(const o in r.data)i.push({key:n._parse(new Y(r,o,r.path,o)),value:s._parse(new Y(r,r.data[o],r.path,o)),alwaysSet:o in r.data});return r.common.async?D.mergeObjectAsync(a,i):D.mergeObjectSync(a,i)}get element(){return this._def.valueType}static create(e,a,r){return a instanceof E?new Je({keyType:e,valueType:a,typeName:S.ZodRecord,...C(r)}):new Je({keyType:K.create(),valueType:e,typeName:S.ZodRecord,...C(a)})}}class ca 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!==_.map)return b(r,{code:f.invalid_type,expected:_.map,received:r.parsedType}),N;const i=this._def.keyType,n=this._def.valueType,s=[...r.data.entries()].map(([o,c],d)=>({key:i._parse(new Y(r,o,r.path,[d,"key"])),value:n._parse(new Y(r,c,r.path,[d,"value"]))}));if(r.common.async){const o=new Map;return Promise.resolve().then(async()=>{for(const c of s){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(),o.set(d.value,h.value)}return{status:a.value,value:o}})}else{const o=new Map;for(const c of s){const d=c.key,h=c.value;if(d.status==="aborted"||h.status==="aborted")return N;(d.status==="dirty"||h.status==="dirty")&&a.dirty(),o.set(d.value,h.value)}return{status:a.value,value:o}}}}ca.create=(t,e,a)=>new ca({valueType:e,keyType:t,typeName:S.ZodMap,...C(a)});class Te extends E{_parse(e){const{status:a,ctx:r}=this._processInputParams(e);if(r.parsedType!==_.set)return b(r,{code:f.invalid_type,expected:_.set,received:r.parsedType}),N;const i=this._def;i.minSize!==null&&r.data.size<i.minSize.value&&(b(r,{code:f.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:f.too_big,maximum:i.maxSize.value,type:"set",inclusive:!0,exact:!1,message:i.maxSize.message}),a.dirty());const n=this._def.valueType;function s(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 o=[...r.data.values()].map((c,d)=>n._parse(new Y(r,c,r.path,d)));return r.common.async?Promise.all(o).then(c=>s(c)):s(o)}min(e,a){return new Te({...this._def,minSize:{value:e,message:k.toString(a)}})}max(e,a){return new Te({...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)}}Te.create=(t,e)=>new Te({valueType:t,minSize:null,maxSize:null,typeName:S.ZodSet,...C(e)});class Tt 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})}}Tt.create=(t,e)=>new Tt({getter:t,typeName:S.ZodLazy,...C(e)});class Ge extends E{_parse(e){if(e.data!==this._def.value){const a=this._getOrReturnCtx(e);return b(a,{received:a.data,code:f.invalid_literal,expected:this._def.value}),N}return{status:"valid",value:e.data}}get value(){return this._def.value}}Ge.create=(t,e)=>new Ge({value:t,typeName:S.ZodLiteral,...C(e)});function Wa(t,e){return new he({values:t,typeName:S.ZodEnum,...C(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:f.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:f.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=Wa;class At extends E{_parse(e){const a=I.getValidEnumValues(this._def.values),r=this._getOrReturnCtx(e);if(r.parsedType!==_.string&&r.parsedType!==_.number){const i=I.objectValues(a);return b(r,{expected:I.joinValues(i),received:r.parsedType,code:f.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:f.invalid_enum_value,options:i}),N}return W(e.data)}get enum(){return this._def.values}}At.create=(t,e)=>new At({values:t,typeName:S.ZodNativeEnum,...C(e)});class Ke extends E{unwrap(){return this._def.type}_parse(e){const{ctx:a}=this._processInputParams(e);if(a.parsedType!==_.promise&&a.common.async===!1)return b(a,{code:f.invalid_type,expected:_.promise,received:a.parsedType}),N;const r=a.parsedType===_.promise?a.data:Promise.resolve(a.data);return W(r.then(i=>this._def.type.parseAsync(i,{path:a.path,errorMap:a.common.contextualErrorMap})))}}Ke.create=(t,e)=>new Ke({type:t,typeName:S.ZodPromise,...C(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:s=>{b(r,s),s.fatal?a.abort():a.dirty()},get path(){return r.path}};if(n.addIssue=n.addIssue.bind(n),i.type==="preprocess"){const s=i.transform(r.data,n);if(r.common.async)return Promise.resolve(s).then(async o=>{if(a.value==="aborted")return N;const c=await this._def.schema._parseAsync({data:o,path:r.path,parent:r});return c.status==="aborted"?N:c.status==="dirty"||a.value==="dirty"?xe(c.value):c});{if(a.value==="aborted")return N;const o=this._def.schema._parseSync({data:s,path:r.path,parent:r});return o.status==="aborted"?N:o.status==="dirty"||a.value==="dirty"?xe(o.value):o}}if(i.type==="refinement"){const s=o=>{const c=i.refinement(o,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 o};if(r.common.async===!1){const o=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});return o.status==="aborted"?N:(o.status==="dirty"&&a.dirty(),s(o.value),{status:a.value,value:o.value})}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(o=>o.status==="aborted"?N:(o.status==="dirty"&&a.dirty(),s(o.value).then(()=>({status:a.value,value:o.value}))))}if(i.type==="transform")if(r.common.async===!1){const s=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});if(!_e(s))return N;const o=i.transform(s.value,n);if(o instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:a.value,value:o}}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(s=>_e(s)?Promise.resolve(i.transform(s.value,n)).then(o=>({status:a.value,value:o})):N);I.assertNever(i)}}le.create=(t,e,a)=>new le({schema:t,typeName:S.ZodEffects,effect:e,...C(a)});le.createWithPreprocess=(t,e,a)=>new le({schema:e,effect:{type:"preprocess",transform:t},typeName:S.ZodEffects,...C(a)});class Q extends E{_parse(e){return this._getType(e)===_.undefined?W(void 0):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}Q.create=(t,e)=>new Q({innerType:t,typeName:S.ZodOptional,...C(e)});class pe extends E{_parse(e){return this._getType(e)===_.null?W(null):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}pe.create=(t,e)=>new pe({innerType:t,typeName:S.ZodNullable,...C(e)});class Qe extends E{_parse(e){const{ctx:a}=this._processInputParams(e);let r=a.data;return a.parsedType===_.undefined&&(r=this._def.defaultValue()),this._def.innerType._parse({data:r,path:a.path,parent:a})}removeDefault(){return this._def.innerType}}Qe.create=(t,e)=>new Qe({innerType:t,typeName:S.ZodDefault,defaultValue:typeof e.default=="function"?e.default:()=>e.default,...C(e)});class et 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 We(i)?i.then(n=>({status:"valid",value:n.status==="valid"?n.value:this._def.catchValue({get error(){return new te(r.common.issues)},input:r.data})})):{status:"valid",value:i.status==="valid"?i.value:this._def.catchValue({get error(){return new te(r.common.issues)},input:r.data})}}removeCatch(){return this._def.innerType}}et.create=(t,e)=>new et({innerType:t,typeName:S.ZodCatch,catchValue:typeof e.catch=="function"?e.catch:()=>e.catch,...C(e)});class ua extends E{_parse(e){if(this._getType(e)!==_.nan){const r=this._getOrReturnCtx(e);return b(r,{code:f.invalid_type,expected:_.nan,received:r.parsedType}),N}return{status:"valid",value:e.data}}}ua.create=t=>new ua({typeName:S.ZodNaN,...C(t)});class qa 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 Zt 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(),xe(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 Zt({in:e,out:a,typeName:S.ZodPipeline})}}class tt extends E{_parse(e){const a=this._def.innerType._parse(e),r=i=>(_e(i)&&(i.value=Object.freeze(i.value)),i);return We(a)?a.then(i=>r(i)):r(a)}unwrap(){return this._def.innerType}}tt.create=(t,e)=>new tt({innerType:t,typeName:S.ZodReadonly,...C(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 m=K.create,U=ye.create,yi=xt.create;oe.create;const P=X.create,A=M.create;Xe.create;const Xa=Dt.create;Ye.create;ue.create;const Ya=Je.create,ae=Ge.create,B=he.create;Ke.create;Q.create;pe.create;const zt=le.createWithPreprocess;var ha=".fabric/agents/",vi=["L0","L1","L2"],ki=["mirror","cross-cutting"],wi=B(vi),xi=B(ki),Ni=A({file:m(),scope_glob:m(),deps:P(m()),priority:B(["high","medium","low"]),layer:wi,topology_type:xi,hash:m()}),Si=zt(t=>!Ri(t)||typeof t.file!="string"?t:Et(t),Ni),Ci=A({revision:m(),nodes:Ya(Si)});function Et(t){return{...t,layer:t.layer??Ti(t.file),topology_type:t.topology_type??Ai(t.file)}}function Ti(t){const e=Ga(t);if(e==="AGENTS.md"||e===".fabric/bootstrap/README.md")return"L0";if(Ja(e))return"L1";const a=Ei(e),r=Ii(a);return r===0?"L0":r<=2?"L1":"L2"}function Ai(t){return Ja(Ga(t))?"cross-cutting":"mirror"}function Ei(t){return t.startsWith(ha)?t.slice(ha.length):t}function Ii(t){const e=t.split("/").filter(Boolean);return Math.max(e.length-1,0)}function Ja(t){return t.split("/").includes("_cross")}function Ga(t){return t.replaceAll("\\","/")}function Ri(t){return typeof t=="object"&&t!==null}var $i=B(["ai","human"]),Ka=zt(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}},U().int().nonnegative());A({source:$i.optional(),since:Ka.optional()});A({ledger_id:m().trim().min(1).optional(),ts:Ka.optional()}).superRefine((t,e)=>{[t.ledger_id,t.ts].filter(r=>r!==void 0).length!==1&&e.addIssue({code:f.custom,message:"Provide exactly one of ledger_id or ts.",path:["ledger_id"]})});A({file:m().min(1),start_line:U().int().positive(),end_line:U().int().positive(),new_hash:m().min(1)});A({file:m().min(1)});A({ledger_entry_id:m().min(1),annotation:m().trim().min(1)});var Qa={id:m().optional(),ts:U().int().nonnegative(),intent:m(),affected_paths:P(m())},Oi=A({...Qa,source:ae("ai"),commit_sha:m().optional()}),Li=A({...Qa,source:ae("human"),parent_sha:m(),parent_ledger_entry_id:m().optional(),diff_stat:m(),annotation:m().optional()}),Pi=Xa("source",[Oi,Li]),ji=zt(t=>t&&typeof t=="object"&&!Array.isArray(t)&&(!("source"in t)||t.source===void 0)?{...t,source:"human"}:t,Pi),Ae=A({file:m(),start_line:U().int().nonnegative(),end_line:U().int().nonnegative(),hash:m()});A({locked:P(Ae).optional()});var pa=B(["strict","warn","off"]),Fi=A({claudeCodeCLI:m().optional(),claudeCodeDesktop:m().optional(),cursor:m().optional(),windsurf:m().optional(),rooCode:m().optional(),geminiCLI:m().optional(),codexCLI:m().optional()});A({clientPaths:Fi.optional(),externalFixturePath:m().optional(),scanIgnores:P(m()).optional(),auditMode:pa.optional(),audit_mode:pa.optional()});var Mi=A({path:m(),lines:m(),snippet:m(),pattern_hint:m()}),Di=A({file:m(),line:m(),snippet:m()}),Zi=A({ratio:U().min(0).max(1),total:U().int().nonnegative(),matched:U().int().nonnegative(),co_occurring_patterns:P(m())}),zi=A({type:B(["framework","pattern","invariant","domain"]),statement:m(),confidence:B(["HIGH","MEDIUM","LOW"]),evidence:P(Di),coverage:Zi,proposed_rule:m().optional(),alternatives:P(m()).optional()}),Ui=A({total_files:U().int().nonnegative(),by_ext:Ya(U().int().nonnegative()),key_dirs:P(m()),max_depth:U().int().nonnegative()}),Hi=A({path:m(),reason:m(),size_bytes:U().int().nonnegative().optional()}),Vi=A({kind:m(),version:m(),subkind:m(),evidence:P(m())}),Bi=A({quality:B(["missing","stub","ok"]),line_count:U().int().nonnegative(),has_contributing:yi()}),Wi=A({path:m(),family:B(["entry","component","config","test","domain"]),rationale:m()}),qi=A({max_files:ae(15),max_lines_per_file:ae(100)}),Xi=A({version:m(),generated_at:m(),generated_by:m(),target:m(),project_name:m(),framework:Vi,topology:Ui,entry_points:P(Hi),code_samples:P(Mi),assertions:P(zi),candidate_files:P(Wi),sampling_budget:qi,readme:Bi,recommendations_for_skill:P(m()).optional()}),Yi=A({kind:m(),version:m(),subkind:m()}),Ji=A({confidence:B(["HIGH","MEDIUM","LOW"]),evidence_refs:P(m())}),Gi=A({file:m(),lines:m()}),Ki=A({type:B(["ban","require","protect"]),rule:m(),rationale:m().optional(),confidence_snapshot:Ji.optional(),source_evidence:P(Gi).optional()}),Qi=A({name:m(),paths:P(m()),summary:m().optional(),topology_type:B(["mirror","cross-cutting"]).optional(),target_path:m().optional()}),en=A({phase:m(),question:m(),answer:m(),presentation:m().optional(),user_corrections:P(m()).optional()});A({framework:Yi,architecture_patterns:P(m()),invariants:P(Ki),domain_groups:P(Qi),interview_trail:P(en),forensic_ref:m()});var tn=A({type:ae("meta:updated"),payload:Ci}),an=A({type:ae("lock:drift"),payload:A({locked:P(Ae),drifted:P(Ae)})}),rn=A({type:ae("lock:approved"),payload:A({locked:P(Ae),approved:P(Ae)})}),nn=A({type:ae("ledger:appended"),payload:ji}),sn=A({type:ae("drift:detected"),payload:Xi});Xa("type",[tn,an,rn,nn,sn]);function on({lastEvent:t}){const{t:e}=V(),[a,r]=L(null),[i,n]=L([]),[s,o]=L(null),[c,d]=L(""),[h,u]=L(null),g=async()=>{try{const[w,x]=await Promise.all([vr(),Fa().catch(()=>[])]);r(w),n(x),u(null)}catch(w){u(w instanceof Error?w.message:String(w))}};H(()=>{g()},[]),H(()=>{(t?.type==="meta:updated"||t?.type==="drift:detected"||t?.type==="lock:drift")&&g()},[t]);const p=ee(()=>new Set(i.map(w=>w.file)),[i]),y=ee(()=>a===null?[]:er(a,p,c),[a,p,c]),T=s===null?null:a?.nodes[s]??null;return l("section",{className:"view",children:[l(Ie,{title:e("dashboard.rules-tree.title"),subtitle:e("dashboard.rules-tree.subtitle")}),h!==null?l(se,{kind:"banner",severity:"stale",message:h}):null,l("div",{className:"view-split",children:[l("div",{className:"tree-panel",children:[l("div",{className:"tree-filter",children:[l("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")}),l("button",{className:"ghost-button",type:"button",onClick:()=>{g()},children:e("dashboard.shared.refresh")})]}),l("div",{className:"status-line",children:[l("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})}),l("span",{children:e("dashboard.rules-tree.status.locks",{count:String(i.length)})})]}),l("div",{className:"tree",role:"tree","aria-label":e("dashboard.rules-tree.tree.aria-label"),children:y.length>0?y.map(w=>l(Mt,{...w,selected:w.node.file===s,onSelect:o},w.node.file)):l("div",{className:"empty-card",children:e("dashboard.rules-tree.empty")})})]}),l("aside",{className:"detail-panel",children:[l("h3",{children:e("dashboard.rules-tree.detail.title")}),T===null?l("p",{className:"muted",children:e("dashboard.rules-tree.detail.empty")}):l("div",{className:"kv",children:[l(Le,{label:e("dashboard.rules-tree.detail.file"),value:T.file}),l(Le,{label:e("dashboard.rules-tree.detail.scope"),value:T.scope_glob}),l(Le,{label:e("dashboard.rules-tree.detail.priority"),value:T.priority}),l(Le,{label:e("dashboard.rules-tree.detail.hash"),value:T.hash}),l("pre",{className:"code",children:T.deps.length>0?T.deps.join(`
14
+ `):e("dashboard.rules-tree.detail.no-deps")})]})]})]})]})}function Ie({title:t,subtitle:e}){return l("div",{className:"view-header",children:l("div",{children:[l("h1",{className:"view-title",children:t}),l("p",{className:"view-subtitle",children:e})]})})}function Le({label:t,value:e}){return l("div",{className:"kv-row",children:[l("span",{className:"kv-key",children:t}),l("span",{className:"kv-value",children:e})]})}function er(t,e,a){const r=a.trim().toLowerCase(),i=Object.values(t.nodes).filter(o=>r.length===0||JSON.stringify(o).toLowerCase().includes(r)).sort((o,c)=>o.file.localeCompare(c.file)),n=new Map;for(const o of i){const c=o.file.split("/")[0]??"root";n.set(c,[...n.get(c)??[],o])}return[{node:Et({file:`revision:${t.revision}`,scope_glob:"**/*",deps:[],priority:"high",hash:t.revision}),level:0,defaultExpanded:!0,children:Array.from(n.entries()).map(([o,c])=>({node:Et({file:o,scope_glob:`${o}/**/*`,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 ln({lastEvent:t}){const{locale:e,t:a}=V(),[r,i]=L(null),[n,s]=L(!0),[o,c]=L(null),d=async()=>{s(!0);try{i(await kr()),c(null)}catch(h){c(h instanceof Error?h.message:String(h))}finally{s(!1)}};return H(()=>{d()},[]),H(()=>{(t?.type==="meta:updated"||t?.type==="lock:approved"||t?.type==="lock:drift"||t?.type==="ledger:appended"||t?.type==="drift:detected")&&d()},[t]),l("section",{className:"view",children:[l(Ie,{title:a("dashboard.doctor.title"),subtitle:a("dashboard.doctor.subtitle")}),o!==null?l(se,{kind:"banner",severity:"stale",message:o}):null,l("div",{className:"filter-bar doctor-toolbar",children:[l("span",{className:"filter-label",children:a("dashboard.doctor.toolbar.overall")}),l(se,{kind:"pill",severity:tr(r?.status??"warn"),message:a(r===null?"dashboard.shared.loading":`dashboard.shared.status.${r.status}`)}),l("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:mt(r.summary.framework,a),count:"1"}):a("dashboard.doctor.toolbar.entry-points-summary",{framework:mt(r.summary.framework,a),count:String(r.summary.entryPoints.length)})}),l("button",{className:"ghost-button",type:"button",onClick:()=>{d()},children:a("dashboard.shared.refresh")})]}),n&&r===null?l("div",{className:"empty-card",children:a("dashboard.doctor.empty.loading")}):null,r!==null?l("div",{className:"doctor-layout",children:[l("div",{className:"doctor-summary-grid",children:[l(ft,{label:a("dashboard.doctor.summary.framework"),value:mt(r.summary.framework,a),detail:r.summary.metaRevision===null?a("dashboard.doctor.summary.no-meta-revision"):`rev ${r.summary.metaRevision}`}),l(ft,{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)})}),l(ft,{label:a("dashboard.doctor.summary.intent-ledger"),value:cn(r.summary.lastLedgerEntryAgeMs,a),detail:r.summary.lastLedgerEntryTs===null?a("dashboard.doctor.summary.no-ledger-entries"):new Date(r.summary.lastLedgerEntryTs).toLocaleString(e)})]}),l("div",{className:"doctor-panels",children:[l("article",{className:"doctor-card",children:[l("div",{className:"doctor-card-head",children:[l("h3",{children:a("dashboard.doctor.card.entry-points")}),l("span",{children:r.summary.entryPoints.length})]}),r.summary.entryPoints.length>0?l("div",{className:"doctor-entry-list",children:r.summary.entryPoints.map(h=>l("div",{className:"doctor-entry",children:[l("strong",{children:h.path}),l("span",{children:h.reason})]},`${h.path}:${h.reason}`))}):l("div",{className:"empty-card doctor-empty",children:a("dashboard.doctor.empty.entry-points")})]}),l("article",{className:"doctor-card",children:[l("div",{className:"doctor-card-head",children:[l("h3",{children:a("dashboard.doctor.card.checks")}),l("span",{children:r.checks.length})]}),l("div",{className:"doctor-check-list",children:r.checks.map(h=>l(dn,{check:h},h.name))})]})]})]}):null]})}function ft({label:t,value:e,detail:a}){return l("article",{className:"doctor-summary-card",children:[l("span",{className:"doctor-summary-label",children:t}),l("strong",{className:"doctor-summary-value",children:e}),l("span",{className:"doctor-summary-detail",children:a})]})}function dn({check:t}){const{t:e}=V();return l("div",{className:`doctor-check doctor-check-${t.status}`,children:[l("div",{className:"doctor-check-head",children:[l("strong",{children:t.name}),l(se,{kind:"pill",severity:tr(t.status),message:e(`dashboard.shared.status.${t.status}`)})]}),l("p",{children:t.message})]})}function tr(t){switch(t){case"ok":return"ok";case"warn":return"locked";case"error":return"stale"}}function mt(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 cn(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 un({lastEvent:t}){const{locale:e,t:a}=V(),[r,i]=L([]),[n,s]=L(null),[o,c]=L(null),[d,h]=L(!1),[u,g]=L(null),p=async()=>{try{const v=(await ja()).sort((O,z)=>O.ts-z.ts);i(v),s(O=>v.length===0?null:O!==null&&v.some(z=>z.id===O)?O:v.at(-1)?.id??null),g(null)}catch(v){g(v instanceof Error?v.message:String(v))}};H(()=>{p()},[]),H(()=>{t?.type==="ledger:appended"&&p()},[t]),H(()=>{if(n===null){c(null);return}let v=!1;return h(!0),Nr({ledgerId:n}).then(O=>{v||(c(O),g(null))}).catch(O=>{v||(c(null),g(O instanceof Error?O.message:String(O)))}).finally(()=>{v||h(!1)}),()=>{v=!0}},[n]);const y=ee(()=>r.findIndex(v=>v.id===n),[r,n]),T=y>=0?r[y]??null:null,w=T===null?a("dashboard.history-replay.selected.none"):new Date(T.ts).toLocaleString(e),x=ee(()=>o===null?[]:er(o.meta,new Set,""),[o]);return l("section",{className:"view",children:[l(Ie,{title:a("dashboard.history-replay.title"),subtitle:a("dashboard.history-replay.subtitle")}),u!==null?l(se,{kind:"banner",severity:"stale",message:u}):null,l("div",{className:"filter-bar history-toolbar",children:[l("span",{className:"filter-label",children:a("dashboard.history-replay.toolbar.scrub")}),l("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:v=>{const O=Number.parseInt(v.currentTarget.value,10),z=r[O];z?.id!==void 0&&s(z.id)}}),l("span",{className:"filter-date",children:w}),l("button",{className:"ghost-button",type:"button",disabled:r.length===0,onClick:()=>s(r.at(-1)?.id??null),children:a("dashboard.history-replay.toolbar.latest")})]}),l("div",{className:"view-split history-layout",children:[l("div",{className:"tree-panel history-timeline-panel",children:[l("div",{className:"status-line",children:[l("span",{children:a("dashboard.history-replay.status.replay-points",{count:String(r.length)})}),l("span",{children:a("dashboard.history-replay.status.entries-applied",{count:String(o?.metadata.replayed_count??0)})})]}),l("div",{className:"history-timeline-list",children:r.length>0?[...r].reverse().map(v=>l("div",{className:`history-timeline-item ${v.id===n?"selected":""}`,role:"button",tabIndex:0,onClick:()=>s(v.id??null),onKeyDown:O=>{(O.key==="Enter"||O.key===" ")&&(O.preventDefault(),s(v.id??null))},children:l(Ha,{entry:v,readOnly:!0})},v.id??`${v.source}:${v.ts}:${v.intent}`)):l("div",{className:"empty-card",children:a("dashboard.history-replay.empty.entries")})})]}),l("div",{className:"tree-panel",children:[l("div",{className:"tree-filter history-state-head",children:l("div",{children:[l("div",{className:"history-state-title",children:a("dashboard.history-replay.state.title",{label:w})}),l("div",{className:"meta-line",children:a("dashboard.history-replay.state.meta",{ledgerId:o?.metadata.at_ledger_id??a("dashboard.history-replay.meta.na"),commit:o?.metadata.at_commit??a("dashboard.history-replay.meta.not-available"),mode:o?.metadata.mode??a("dashboard.history-replay.meta.pending")})})]})}),l("div",{className:"status-line",children:[l("span",{children:o===null?a("dashboard.history-replay.status.loading"):a("dashboard.history-replay.status.nodes",{count:String(Object.keys(o.meta.nodes).length)})}),l("span",{children:o?.meta.revision??a("dashboard.history-replay.status.unknown-revision")})]}),l("div",{className:"tree",role:"tree","aria-label":a("dashboard.history-replay.tree.aria-label"),children:[d?l("div",{className:"empty-card",children:a("dashboard.history-replay.empty.loading")}):null,!d&&x.length>0?x.map(v=>l(Mt,{...v,readOnly:!0},v.node.file)):null,!d&&x.length===0?l("div",{className:"empty-card",children:a("dashboard.history-replay.empty.select")}):null]})]})]})]})}function hn({lastEvent:t}){const{t:e}=V(),[a,r]=L([]),[i,n]=L("all"),[s,o]=L(null),[c,d]=L(null),h=async()=>{try{r(await Fa()),d(null)}catch(y){d(y instanceof Error?y.message:String(y))}};H(()=>{h()},[]),H(()=>{(t?.type==="lock:drift"||t?.type==="lock:approved")&&h()},[t]);const u=ee(()=>({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 T=a.find(w=>de(w)===de(y));if(T!==void 0){o(de(y));try{const w=await wr({file:T.file,start_line:T.start_line,end_line:T.end_line,new_hash:T.current_hash});r(x=>x.map(v=>de(v)===de(y)?w.entry:v)),d(null)}catch(w){throw d(w instanceof Error?w.message:String(w)),w}finally{o(null)}}};return l("section",{className:"view",children:[l(Ie,{title:e("dashboard.human-lock.title"),subtitle:e("dashboard.human-lock.subtitle")}),c!==null?l(se,{kind:"banner",severity:"drift",message:c}):null,l("div",{className:"filter-bar",role:"tablist","aria-label":e("dashboard.human-lock.filters.aria-label"),children:[["all","drift","approved"].map(y=>l("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}`),l("span",{className:"count",children:u[y]})]},y)),l("span",{className:"filter-date",children:e("dashboard.human-lock.summary",{drift:String(u.drift),approved:String(u.approved)})})]}),l("div",{className:"lock-grid",children:g.length>0?g.map(y=>l(Vr,{entry:y,currentHash:y.current_hash,onApprove:p,busy:s===de(y)},de(y))):l("div",{className:"empty-card",children:e("dashboard.human-lock.empty")})})]})}function de(t){return`${t.file}:${t.start_line}:${t.end_line}`}function pn({lastEvent:t}){const{t:e}=V(),[a,r]=L([]),[i,n]=L("all"),[s,o]=L(null),c=async()=>{try{r((await ja()).sort((p,y)=>y.ts-p.ts)),o(null)}catch(p){o(p instanceof Error?p.message:String(p))}};H(()=>{c()},[]),H(()=>{t?.type==="ledger:appended"&&r(p=>[t.payload,...p].sort((y,T)=>T.ts-y.ts))},[t]);const d=ee(()=>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 T=await xr({ledger_entry_id:p.id,annotation:y});T.created&&r(w=>[T.entry,...w].sort((x,v)=>v.ts-x.ts))};return l("section",{className:"view",children:[l(Ie,{title:e("dashboard.intent-timeline.title"),subtitle:e("dashboard.intent-timeline.subtitle")}),s!==null?l("div",{className:"empty-card",children:s}):null,l("div",{className:"filter-bar",children:[l("span",{className:"filter-label",children:e("dashboard.intent-timeline.filter.label")}),l("button",{className:`filter-chip ${i==="all"?"active":""}`,type:"button",onClick:()=>n("all"),children:[e("dashboard.intent-timeline.filter.all")," ",a.length]}),l(kt,{source:"ai",interactive:!0,selected:i==="ai",onClick:()=>n("ai")}),l(kt,{source:"human",interactive:!0,selected:i==="human",onClick:()=>n("human")}),l("span",{className:"filter-date",children:e("dashboard.intent-timeline.summary",{aiCount:String(h),humanCount:String(u)})})]}),l("div",{className:"col-headers",children:[l("div",{className:"col-head ai",children:[l("strong",{children:e("dashboard.intent-timeline.columns.ai.title")}),l("span",{children:e("dashboard.intent-timeline.columns.ai.entries",{count:String(h)})})]}),l("div",{className:"col-head human",children:[l("strong",{children:e("dashboard.intent-timeline.columns.human.title")}),l("span",{children:e("dashboard.intent-timeline.columns.human.entries",{count:String(u)})})]})]}),l("div",{className:"timeline-grid",children:[l("div",{className:"axis",children:l("div",{className:"axis-line"})}),d.length>0?d.map(p=>l(Ha,{entry:p,onAnnotate:g},p.id??`${p.source}:${p.ts}:${p.intent}`)):l("div",{className:"empty-card timeline-empty",children:e("dashboard.intent-timeline.empty")})]})]})}function fn(){return l(Ur,{children:l(mn,{})})}function mn(){const{t}=V(),[e,a]=L(fa()),r=Lr(),i=[{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")}];H(()=>{const s=()=>a(fa());return window.addEventListener("hashchange",s),window.location.hash===""&&(window.location.hash="#/rules"),()=>window.removeEventListener("hashchange",s)},[]);const n=ee(()=>i.find(s=>s.id===e)??i[0],[e]);return l(bn,{connected:r.connected,port:ma(),activeRoute:n.id,children:[l("aside",{className:"sidebar",children:[l("div",{className:"brand",children:[l("span",{className:"brand-logo",children:"F"}),l("span",{children:"fabric"}),l("span",{className:"brand-version",children:"v1.4.0"})]}),l("nav",{"aria-label":t("dashboard.app.nav.aria-label"),children:i.map(s=>l("a",{className:`nav-item ${s.id===e?"active":""}`,href:s.hash,"aria-current":s.id===e?"page":void 0,children:[l("span",{className:"dot","aria-hidden":"true"}),l("span",{children:s.label}),l("small",{children:s.subtitle})]},s.id))}),l("div",{className:"nav-section",children:t("dashboard.app.nav.section.diagnostics")}),l("span",{className:"nav-item muted-nav",children:[l("span",{className:"dot"}),t("dashboard.app.nav.drift-check")]})]}),l("main",{className:"main",children:[l("header",{className:"header",children:[l("div",{className:"breadcrumb",children:[l("span",{children:window.location.pathname==="/"?"~":window.location.pathname}),l("span",{className:"sep",children:"/"}),l("strong",{children:n.breadcrumb})]}),l("div",{className:"header-actions",children:[l("span",{className:`badge-live ${r.connected?"connected":"disconnected"}`,children:[l("span",{className:"pulse","aria-hidden":"true"}),r.connected?t("dashboard.app.header.connected"):t("dashboard.app.header.connecting")]}),l("span",{className:"port-label",children:[":",ma()," /events"]})]})]}),e==="rules"?l(on,{lastEvent:r.lastEvent}):null,e==="locks"?l(hn,{lastEvent:r.lastEvent}):null,e==="timeline"?l(pn,{lastEvent:r.lastEvent}):null,e==="history"?l(un,{lastEvent:r.lastEvent}):null,e==="doctor"?l(ln,{lastEvent:r.lastEvent}):null]}),l("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 bn({connected:t,port:e,activeRoute:a,children:r}){return l("div",{className:`app-shell ${t?"is-connected":"is-disconnected"}`,"data-port":e,"data-route":a,children:r})}function fa(){switch(window.location.hash){case"#/locks":return"locks";case"#/timeline":return"timeline";case"#/history":return"history";case"#/doctor":return"doctor";default:return"rules"}}function ma(){const t=Number.parseInt(window.location.port,10);return Number.isFinite(t)?t:7373}const ar=document.getElementById("app");if(ar===null)throw new Error("Fabric Dashboard root element #app was not found.");cr(l(fn,{}),ar);
@@ -1,14 +1,14 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <meta name="color-scheme" content="dark" />
7
- <title>Fabric Dashboard</title>
8
- <script type="module" crossorigin src="/assets/index-Btq99IfR.js"></script>
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <meta name="color-scheme" content="dark" />
7
+ <title>Fabric Dashboard</title>
8
+ <script type="module" crossorigin src="/assets/index-CWkgSd3Y.js"></script>
9
9
  <link rel="stylesheet" crossorigin href="/assets/index-D45wW11O.css">
10
- </head>
11
- <body>
12
- <div id="app"></div>
13
- </body>
14
- </html>
10
+ </head>
11
+ <body>
12
+ <div id="app"></div>
13
+ </body>
14
+ </html>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fenglimg/fabric-server",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -13,14 +13,14 @@
13
13
  "express": "^5.2.1",
14
14
  "minimatch": "^10.0.1",
15
15
  "zod": "^3.25.0",
16
- "@fenglimg/fabric-shared": "1.3.0"
16
+ "@fenglimg/fabric-shared": "1.4.0"
17
17
  },
18
18
  "devDependencies": {
19
19
  "@types/express": "^5.0.6",
20
20
  "@types/node": "^22.15.0",
21
21
  "tsup": "^8.5.0",
22
22
  "typescript": "^5.8.3",
23
- "@fenglimg/fabric-dashboard": "1.3.0"
23
+ "@fenglimg/fabric-dashboard": "1.4.0"
24
24
  },
25
25
  "scripts": {
26
26
  "build": "tsup src/index.ts --format esm --dts --clean && node scripts/copy-dashboard.mjs",
@@ -1,10 +0,0 @@
1
- (function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const n of document.querySelectorAll('link[rel="modulepreload"]'))r(n);new MutationObserver(n=>{for(const i of n)if(i.type==="childList")for(const s of i.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&r(s)}).observe(document,{childList:!0,subtree:!0});function a(n){const i={};return n.integrity&&(i.integrity=n.integrity),n.referrerPolicy&&(i.referrerPolicy=n.referrerPolicy),n.crossOrigin==="use-credentials"?i.credentials="include":n.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(n){if(n.ep)return;n.ep=!0;const i=a(n);fetch(n.href,i)}})();var at,$,_a,ne,Vt,ga,ba,ot,je,Ne,va,It,_t,gt,ya,De={},Ze=[],rr=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,rt=Array.isArray;function K(t,e){for(var a in e)t[a]=e[a];return t}function Rt(t){t&&t.parentNode&&t.parentNode.removeChild(t)}function nr(t,e,a){var r,n,i,s={};for(i in e)i=="key"?r=e[i]:i=="ref"?n=e[i]:s[i]=e[i];if(arguments.length>2&&(s.children=arguments.length>3?at.call(arguments,2):a),typeof t=="function"&&t.defaultProps!=null)for(i in t.defaultProps)s[i]===void 0&&(s[i]=t.defaultProps[i]);return Pe(t,s,r,n,null)}function Pe(t,e,a,r,n){var i={type:t,props:e,key:a,ref:r,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:n??++_a,__i:-1,__u:0};return n==null&&$.vnode!=null&&$.vnode(i),i}function nt(t){return t.children}function Fe(t,e){this.props=t,this.context=e}function _e(t,e){if(e==null)return t.__?_e(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"?_e(t):null}function ir(t){if(t.__P&&t.__d){var e=t.__v,a=e.__e,r=[],n=[],i=K({},e);i.__v=e.__v+1,$.vnode&&$.vnode(i),$t(t.__P,i,e,t.__n,t.__P.namespaceURI,32&e.__u?[a]:null,r,a??_e(e),!!(32&e.__u),n),i.__v=e.__v,i.__.__k[i.__i]=i,Na(r,i,n),e.__e=e.__=null,i.__e!=a&&ka(i)}}function ka(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}),ka(t)}function bt(t){(!t.__d&&(t.__d=!0)&&ne.push(t)&&!Ue.__r++||Vt!=$.debounceRendering)&&((Vt=$.debounceRendering)||ga)(Ue)}function Ue(){try{for(var t,e=1;ne.length;)ne.length>e&&ne.sort(ba),t=ne.shift(),e=ne.length,ir(t)}finally{ne.length=Ue.__r=0}}function wa(t,e,a,r,n,i,s,o,c,l,h){var u,g,p,v,C,w,x,y=r&&r.__k||Ze,O=e.length;for(c=sr(a,e,y,c,O),u=0;u<O;u++)(p=a.__k[u])!=null&&(g=p.__i!=-1&&y[p.__i]||De,p.__i=u,w=$t(t,p,g,n,i,s,o,c,l,h),v=p.__e,p.ref&&g.ref!=p.ref&&(g.ref&&Ot(g.ref,null,p),h.push(p.ref,p.__c||v,p)),C==null&&v!=null&&(C=v),(x=!!(4&p.__u))||g.__k===p.__k?(c=xa(p,c,t,x),x&&g.__e&&(g.__e=null)):typeof p.type=="function"&&w!==void 0?c=w:v&&(c=v.nextSibling),p.__u&=-7);return a.__e=C,c}function sr(t,e,a,r,n){var i,s,o,c,l,h=a.length,u=h,g=0;for(t.__k=new Array(n),i=0;i<n;i++)(s=e[i])!=null&&typeof s!="boolean"&&typeof s!="function"?(typeof s=="string"||typeof s=="number"||typeof s=="bigint"||s.constructor==String?s=t.__k[i]=Pe(null,s,null,null,null):rt(s)?s=t.__k[i]=Pe(nt,{children:s},null,null,null):s.constructor===void 0&&s.__b>0?s=t.__k[i]=Pe(s.type,s.props,s.key,s.ref?s.ref:null,s.__v):t.__k[i]=s,c=i+g,s.__=t,s.__b=t.__b+1,o=null,(l=s.__i=or(s,a,c,u))!=-1&&(u--,(o=a[l])&&(o.__u|=2)),o==null||o.__v==null?(l==-1&&(n>h?g--:n<h&&g++),typeof s.type!="function"&&(s.__u|=4)):l!=c&&(l==c-1?g--:l==c+1?g++:(l>c?g--:g++,s.__u|=4))):t.__k[i]=null;if(u)for(i=0;i<h;i++)(o=a[i])!=null&&(2&o.__u)==0&&(o.__e==r&&(r=_e(o)),Ta(o,o));return r}function xa(t,e,a,r){var n,i;if(typeof t.type=="function"){for(n=t.__k,i=0;n&&i<n.length;i++)n[i]&&(n[i].__=t,e=xa(n[i],e,a,r));return e}t.__e!=e&&(r&&(e&&t.type&&!e.parentNode&&(e=_e(t)),a.insertBefore(t.__e,e||null)),e=t.__e);do e=e&&e.nextSibling;while(e!=null&&e.nodeType==8);return e}function or(t,e,a,r){var n,i,s,o=t.key,c=t.type,l=e[a],h=l!=null&&(2&l.__u)==0;if(l===null&&o==null||h&&o==l.key&&c==l.type)return a;if(r>(h?1:0)){for(n=a-1,i=a+1;n>=0||i<e.length;)if((l=e[s=n>=0?n--:i++])!=null&&(2&l.__u)==0&&o==l.key&&c==l.type)return s}return-1}function Bt(t,e,a){e[0]=="-"?t.setProperty(e,a??""):t[e]=a==null?"":typeof a!="number"||rr.test(e)?a:a+"px"}function $e(t,e,a,r,n){var i,s;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||Bt(t.style,e,"");if(a)for(e in a)r&&a[e]==r[e]||Bt(t.style,e,a[e])}else if(e[0]=="o"&&e[1]=="n")i=e!=(e=e.replace(va,"$1")),s=e.toLowerCase(),e=s in t||e=="onFocusOut"||e=="onFocusIn"?s.slice(2):e.slice(2),t.l||(t.l={}),t.l[e+i]=a,a?r?a[Ne]=r[Ne]:(a[Ne]=It,t.addEventListener(e,i?gt:_t,i)):t.removeEventListener(e,i?gt:_t,i);else{if(n=="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 zt(t){return function(e){if(this.l){var a=this.l[e.type+t];if(e[je]==null)e[je]=It++;else if(e[je]<a[Ne])return;return a($.event?$.event(e):e)}}}function $t(t,e,a,r,n,i,s,o,c,l){var h,u,g,p,v,C,w,x,y,O,U,we,Ht,Re,st,q=e.type;if(e.constructor!==void 0)return null;128&a.__u&&(c=!!(32&a.__u),i=[o=e.__e=a.__e]),(h=$.__b)&&h(e);e:if(typeof q=="function")try{if(x=e.props,y=q.prototype&&q.prototype.render,O=(h=q.contextType)&&r[h.__c],U=h?O?O.props.value:h.__:r,a.__c?w=(u=e.__c=a.__c).__=u.__E:(y?e.__c=u=new q(x,U):(e.__c=u=new Fe(x,U),u.constructor=q,u.render=lr),O&&O.sub(u),u.state||(u.state={}),u.__n=r,g=u.__d=!0,u.__h=[],u._sb=[]),y&&u.__s==null&&(u.__s=u.state),y&&q.getDerivedStateFromProps!=null&&(u.__s==u.state&&(u.__s=K({},u.__s)),K(u.__s,q.getDerivedStateFromProps(x,u.__s))),p=u.props,v=u.state,u.__v=e,g)y&&q.getDerivedStateFromProps==null&&u.componentWillMount!=null&&u.componentWillMount(),y&&u.componentDidMount!=null&&u.__h.push(u.componentDidMount);else{if(y&&q.getDerivedStateFromProps==null&&x!==p&&u.componentWillReceiveProps!=null&&u.componentWillReceiveProps(x,U),e.__v==a.__v||!u.__e&&u.shouldComponentUpdate!=null&&u.shouldComponentUpdate(x,u.__s,U)===!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(fe){fe&&(fe.__=e)}),Ze.push.apply(u.__h,u._sb),u._sb=[],u.__h.length&&s.push(u);break e}u.componentWillUpdate!=null&&u.componentWillUpdate(x,u.__s,U),y&&u.componentDidUpdate!=null&&u.__h.push(function(){u.componentDidUpdate(p,v,C)})}if(u.context=U,u.props=x,u.__P=t,u.__e=!1,we=$.__r,Ht=0,y)u.state=u.__s,u.__d=!1,we&&we(e),h=u.render(u.props,u.state,u.context),Ze.push.apply(u.__h,u._sb),u._sb=[];else do u.__d=!1,we&&we(e),h=u.render(u.props,u.state,u.context),u.state=u.__s;while(u.__d&&++Ht<25);u.state=u.__s,u.getChildContext!=null&&(r=K(K({},r),u.getChildContext())),y&&!g&&u.getSnapshotBeforeUpdate!=null&&(C=u.getSnapshotBeforeUpdate(p,v)),Re=h!=null&&h.type===nt&&h.key==null?Sa(h.props.children):h,o=wa(t,rt(Re)?Re:[Re],e,a,r,n,i,s,o,c,l),u.base=e.__e,e.__u&=-161,u.__h.length&&s.push(u),w&&(u.__E=u.__=null)}catch(fe){if(e.__v=null,c||i!=null)if(fe.then){for(e.__u|=c?160:128;o&&o.nodeType==8&&o.nextSibling;)o=o.nextSibling;i[i.indexOf(o)]=null,e.__e=o}else{for(st=i.length;st--;)Rt(i[st]);vt(e)}else e.__e=a.__e,e.__k=a.__k,fe.then||vt(e);$.__e(fe,e,a)}else i==null&&e.__v==a.__v?(e.__k=a.__k,e.__e=a.__e):o=e.__e=dr(a.__e,e,a,r,n,i,s,c,l);return(h=$.diffed)&&h(e),128&e.__u?void 0:o}function vt(t){t&&(t.__c&&(t.__c.__e=!0),t.__k&&t.__k.some(vt))}function Na(t,e,a){for(var r=0;r<a.length;r++)Ot(a[r],a[++r],a[++r]);$.__c&&$.__c(e,t),t.some(function(n){try{t=n.__h,n.__h=[],t.some(function(i){i.call(n)})}catch(i){$.__e(i,n.__v)}})}function Sa(t){return typeof t!="object"||t==null||t.__b>0?t:rt(t)?t.map(Sa):K({},t)}function dr(t,e,a,r,n,i,s,o,c){var l,h,u,g,p,v,C,w=a.props||De,x=e.props,y=e.type;if(y=="svg"?n="http://www.w3.org/2000/svg":y=="math"?n="http://www.w3.org/1998/Math/MathML":n||(n="http://www.w3.org/1999/xhtml"),i!=null){for(l=0;l<i.length;l++)if((p=i[l])&&"setAttribute"in p==!!y&&(y?p.localName==y:p.nodeType==3)){t=p,i[l]=null;break}}if(t==null){if(y==null)return document.createTextNode(x);t=document.createElementNS(n,y,x.is&&x),o&&($.__m&&$.__m(e,i),o=!1),i=null}if(y==null)w===x||o&&t.data==x||(t.data=x);else{if(i=i&&at.call(t.childNodes),!o&&i!=null)for(w={},l=0;l<t.attributes.length;l++)w[(p=t.attributes[l]).name]=p.value;for(l in w)p=w[l],l=="dangerouslySetInnerHTML"?u=p:l=="children"||l in x||l=="value"&&"defaultValue"in x||l=="checked"&&"defaultChecked"in x||$e(t,l,null,p,n);for(l in x)p=x[l],l=="children"?g=p:l=="dangerouslySetInnerHTML"?h=p:l=="value"?v=p:l=="checked"?C=p:o&&typeof p!="function"||w[l]===p||$e(t,l,p,w[l],n);if(h)o||u&&(h.__html==u.__html||h.__html==t.innerHTML)||(t.innerHTML=h.__html),e.__k=[];else if(u&&(t.innerHTML=""),wa(e.type=="template"?t.content:t,rt(g)?g:[g],e,a,r,y=="foreignObject"?"http://www.w3.org/1999/xhtml":n,i,s,i?i[0]:a.__k&&_e(a,0),o,c),i!=null)for(l=i.length;l--;)Rt(i[l]);o||(l="value",y=="progress"&&v==null?t.removeAttribute("value"):v!=null&&(v!==t[l]||y=="progress"&&!v||y=="option"&&v!=w[l])&&$e(t,l,v,w[l],n),l="checked",C!=null&&C!=t[l]&&$e(t,l,C,w[l],n))}return t}function Ot(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(n){$.__e(n,a)}}function Ta(t,e,a){var r,n;if($.unmount&&$.unmount(t),(r=t.ref)&&(r.current&&r.current!=t.__e||Ot(r,null,e)),(r=t.__c)!=null){if(r.componentWillUnmount)try{r.componentWillUnmount()}catch(i){$.__e(i,e)}r.base=r.__P=null}if(r=t.__k)for(n=0;n<r.length;n++)r[n]&&Ta(r[n],e,a||typeof t.type!="function");a||Rt(t.__e),t.__c=t.__=t.__e=void 0}function lr(t,e,a){return this.constructor(t,a)}function cr(t,e,a){var r,n,i,s;e==document&&(e=document.documentElement),$.__&&$.__(t,e),n=(r=!1)?null:e.__k,i=[],s=[],$t(e,t=e.__k=nr(nt,null,[t]),n||De,De,e.namespaceURI,n?null:e.firstChild?at.call(e.childNodes):null,i,n?n.__e:e.firstChild,r,s),Na(i,t,s)}function ur(t){function e(a){var r,n;return this.getChildContext||(r=new Set,(n={})[e.__c]=this,this.getChildContext=function(){return n},this.componentWillUnmount=function(){r=null},this.shouldComponentUpdate=function(i){this.props.value!=i.value&&r.forEach(function(s){s.__e=!0,bt(s)})},this.sub=function(i){r.add(i);var s=i.componentWillUnmount;i.componentWillUnmount=function(){r&&r.delete(i),s&&s.call(i)}}),a.children}return e.__c="__cC"+ya++,e.__=t,e.Provider=e.__l=(e.Consumer=function(a,r){return a.children(r)}).contextType=e,e}at=Ze.slice,$={__e:function(t,e,a,r){for(var n,i,s;e=e.__;)if((n=e.__c)&&!n.__)try{if((i=n.constructor)&&i.getDerivedStateFromError!=null&&(n.setState(i.getDerivedStateFromError(t)),s=n.__d),n.componentDidCatch!=null&&(n.componentDidCatch(t,r||{}),s=n.__d),s)return n.__E=n}catch(o){t=o}throw t}},_a=0,Fe.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),bt(this))},Fe.prototype.forceUpdate=function(t){this.__v&&(this.__e=!0,t&&this.__h.push(t),bt(this))},Fe.prototype.render=nt,ne=[],ga=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,ba=function(t,e){return t.__v.__b-e.__v.__b},Ue.__r=0,ot=Math.random().toString(8),je="__d"+ot,Ne="__a"+ot,va=/(PointerCapture)$|Capture$/i,It=0,_t=zt(!1),gt=zt(!0),ya=0;var hr=0;function d(t,e,a,r,n,i){e||(e={});var s,o,c=e;if("ref"in c)for(o in c={},e)o=="ref"?s=e[o]:c[o]=e[o];var l={type:t,props:c,key:a,ref:s,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--hr,__i:-1,__u:0,__source:n,__self:i};if(typeof t=="function"&&(s=t.defaultProps))for(o in s)c[o]===void 0&&(c[o]=s[o]);return $.vnode&&$.vnode(l),l}var ge,P,dt,Wt,He=0,Ca=[],F=$,qt=F.__b,Gt=F.__r,Xt=F.diffed,Jt=F.__c,Kt=F.unmount,Yt=F.__;function it(t,e){F.__h&&F.__h(P,t,He||e),He=0;var a=P.__H||(P.__H={__:[],__h:[]});return t>=a.__.length&&a.__.push({}),a.__[t]}function L(t){return He=1,pr(Ea,t)}function pr(t,e,a){var r=it(ge++,2);if(r.t=t,!r.__c&&(r.__=[Ea(void 0,e),function(o){var c=r.__N?r.__N[0]:r.__[0],l=r.t(c,o);c!==l&&(r.__N=[l,r.__[1]],r.__c.setState({}))}],r.__c=P,!P.__f)){var n=function(o,c,l){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!i||i.call(this,o,c,l);var u=r.__c.props!==o;return h.some(function(g){if(g.__N){var p=g.__[0];g.__=g.__N,g.__N=void 0,p!==g.__[0]&&(u=!0)}}),i&&i.call(this,o,c,l)||u};P.__f=!0;var i=P.shouldComponentUpdate,s=P.componentWillUpdate;P.componentWillUpdate=function(o,c,l){if(this.__e){var h=i;i=void 0,n(o,c,l),i=h}s&&s.call(this,o,c,l)},P.shouldComponentUpdate=n}return r.__N||r.__}function V(t,e){var a=it(ge++,3);!F.__s&&Aa(a.__H,e)&&(a.__=t,a.u=e,P.__H.__h.push(a))}function Oe(t){return He=5,ee(function(){return{current:t}},[])}function ee(t,e){var a=it(ge++,7);return Aa(a.__H,e)&&(a.__=t(),a.__H=e,a.__h=t),a.__}function fr(t){var e=P.context[t.__c],a=it(ge++,9);return a.c=t,e?(a.__==null&&(a.__=!0,e.sub(P)),e.props.value):t.__}function mr(){for(var t;t=Ca.shift();){var e=t.__H;if(t.__P&&e)try{e.__h.some(Me),e.__h.some(yt),e.__h=[]}catch(a){e.__h=[],F.__e(a,t.__v)}}}F.__b=function(t){P=null,qt&&qt(t)},F.__=function(t,e){t&&e.__k&&e.__k.__m&&(t.__m=e.__k.__m),Yt&&Yt(t,e)},F.__r=function(t){Gt&&Gt(t),ge=0;var e=(P=t.__c).__H;e&&(dt===P?(e.__h=[],P.__h=[],e.__.some(function(a){a.__N&&(a.__=a.__N),a.u=a.__N=void 0})):(e.__h.some(Me),e.__h.some(yt),e.__h=[],ge=0)),dt=P},F.diffed=function(t){Xt&&Xt(t);var e=t.__c;e&&e.__H&&(e.__H.__h.length&&(Ca.push(e)!==1&&Wt===F.requestAnimationFrame||((Wt=F.requestAnimationFrame)||_r)(mr)),e.__H.__.some(function(a){a.u&&(a.__H=a.u),a.u=void 0})),dt=P=null},F.__c=function(t,e){e.some(function(a){try{a.__h.some(Me),a.__h=a.__h.filter(function(r){return!r.__||yt(r)})}catch(r){e.some(function(n){n.__h&&(n.__h=[])}),e=[],F.__e(r,a.__v)}}),Jt&&Jt(t,e)},F.unmount=function(t){Kt&&Kt(t);var e,a=t.__c;a&&a.__H&&(a.__H.__.some(function(r){try{Me(r)}catch(n){e=n}}),a.__H=void 0,e&&F.__e(e,a.__v))};var Qt=typeof requestAnimationFrame=="function";function _r(t){var e,a=function(){clearTimeout(r),Qt&&cancelAnimationFrame(e),setTimeout(t)},r=setTimeout(a,35);Qt&&(e=requestAnimationFrame(a))}function Me(t){var e=P,a=t.__c;typeof a=="function"&&(t.__c=void 0,a()),P=e}function yt(t){var e=P;t.__c=t.__(),P=e}function Aa(t,e){return!t||t.length!==e.length||e.some(function(a,r){return a!==t[r]})}function Ea(t,e){return typeof e=="function"?e(t):e}var gr=Symbol.for("preact-signals");function Lt(){if(ce>1)ce--;else{var t,e=!1;for((function(){var n=Be;for(Be=void 0;n!==void 0;)n.S.v===n.v&&(n.S.i=n.i),n=n.o})();Se!==void 0;){var a=Se;for(Se=void 0,Ve++;a!==void 0;){var r=a.u;if(a.u=void 0,a.f&=-3,!(8&a.f)&&$a(a))try{a.c()}catch(n){e||(t=n,e=!0)}a=r}}if(Ve=0,ce--,e)throw t}}var R=void 0;function Ia(t){var e=R;R=void 0;try{return t()}finally{R=e}}var Se=void 0,ce=0,Ve=0,ea=0,Be=void 0,ze=0;function Ra(t){if(R!==void 0){var e=t.n;if(e===void 0||e.t!==R)return e={i:0,S:t,p:R.s,n:void 0,t:R,e:void 0,x:void 0,r:e},R.s!==void 0&&(R.s.n=e),R.s=e,t.n=e,32&R.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=R.s,e.n=void 0,R.s.n=e,R.s=e),e}}function Z(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}Z.prototype.brand=gr;Z.prototype.h=function(){return!0};Z.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:Ia(function(){var r;(r=e.W)==null||r.call(e)}))};Z.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&&Ia(function(){var n;(n=e.Z)==null||n.call(e)}))}};Z.prototype.subscribe=function(t){var e=this;return vr(function(){var a=e.value,r=R;R=void 0;try{t(a)}finally{R=r}},{name:"sub"})};Z.prototype.valueOf=function(){return this.value};Z.prototype.toString=function(){return this.value+""};Z.prototype.toJSON=function(){return this.value};Z.prototype.peek=function(){var t=R;R=void 0;try{return this.value}finally{R=t}};Object.defineProperty(Z.prototype,"value",{get:function(){var t=Ra(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!==ea&&(a.l=ea,Be={S:a,v:a.v,i:a.i,o:Be})})(this),this.v=t,this.i++,ze++,ce++;try{for(var e=this.t;e!==void 0;e=e.x)e.t.N()}finally{Lt()}}}});function jt(t,e){return new Z(t,e)}function $a(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 Oa(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 La(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 ye(t,e){Z.call(this,void 0),this.x=t,this.s=void 0,this.g=ze-1,this.f=4,this.W=e?.watched,this.Z=e?.unwatched,this.name=e?.name}ye.prototype=new Z;ye.prototype.h=function(){if(this.f&=-3,1&this.f)return!1;if((36&this.f)==32||(this.f&=-5,this.g===ze))return!0;if(this.g=ze,this.f|=1,this.i>0&&!$a(this))return this.f&=-2,!0;var t=R;try{Oa(this),R=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 R=t,La(this),this.f&=-2,!0};ye.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)}Z.prototype.S.call(this,t)};ye.prototype.U=function(t){if(this.t!==void 0&&(Z.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)}};ye.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(ye.prototype,"value",{get:function(){if(1&this.f)throw new Error("Cycle detected");var t=Ra(this);if(this.h(),t!==void 0&&(t.i=this.i),16&this.f)throw this.v;return this.v}});function ja(t){var e=t.m;if(t.m=void 0,typeof e=="function"){ce++;var a=R;R=void 0;try{e()}catch(r){throw t.f&=-2,t.f|=8,Pt(t),r}finally{R=a,Lt()}}}function Pt(t){for(var e=t.s;e!==void 0;e=e.n)e.S.U(e);t.x=void 0,t.s=void 0,ja(t)}function br(t){if(R!==this)throw new Error("Out-of-order effect");La(this),R=t,this.f&=-2,8&this.f&&Pt(this),Lt()}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,ja(this),Oa(this),ce++;var t=R;return R=this,br.bind(this,t)};ke.prototype.N=function(){2&this.f||(this.f|=2,this.u=Se,Se=this)};ke.prototype.d=function(){this.f|=8,1&this.f||Pt(this)};ke.prototype.dispose=function(){this.d()};function vr(t,e){var a=new ke(t,e);try{a.c()}catch(n){throw a.d(),n}var r=a.d.bind(a);return r[Symbol.dispose]=r,r}async function yr(){return await Ee("/api/rules")}async function Pa(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 Ee(Za("/api/ledger",e))}async function kr(){return await Ee("/api/doctor")}async function Fa(){return await Ee("/api/human-lock")}async function wr(t){return await Ma("/api/human-lock/approve",t)}async function xr(t){return await Ma("/api/intent/annotate",t)}async function Nr(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 Ee(Za("/api/history/state",e))}let re;function Sr(t,e,a,r,n){let i=!1;const s=new AbortController;let o=!1;const c=Ft({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:s.signal});if(!h.ok||h.body===null){l(()=>{n()});return}r();const u=h.body.getReader(),g=new TextDecoder;let p="";for(;!i;){const{done:v,value:C}=await u.read();if(v)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),Tr(x,a)}}}catch{}finally{i||l(()=>{n()})}})(),{close(){i=!0,s.abort()}};function l(h){o||(o=!0,h())}}function Tr(t,e){let a="message",r="",n="";for(const i of t.split(`
5
- `))i.startsWith("event:")?a=i.slice(6).trim():i.startsWith("data:")?r=r.length>0?`${r}
6
- ${i.slice(5).trim()}`:i.slice(5).trim():i.startsWith("id:")&&(n=i.slice(3).trim());r.length>0&&e(a,r,n)}function Cr(){if(re!==void 0)return re;const e=window.__FABRIC_AUTH_TOKEN__;if(typeof e=="string"&&e.length>0)return re=e,re;const a=new URL(window.location.href),r=a.searchParams,n=r.get("token");if(n!==null&&n.length>0){r.delete("token");const i=r.toString(),s=`${a.pathname}${i.length>0?`?${i}`:""}${a.hash}`;return window.history.replaceState({},document.title,s),re=n,re}return re=null,re}function Ar(t){try{const e=JSON.parse(t);return typeof e.type=="string"&&"payload"in e?e:null}catch{return null}}async function Ee(t){const e=await fetch(t,{headers:Ft({Accept:"application/json"})});return await Da(e)}async function Ma(t,e){const a=await fetch(t,{method:"POST",headers:Ft({Accept:"application/json","Content-Type":"application/json"}),body:JSON.stringify(e)});return await Da(a)}async function Da(t){const e=await t.text(),a=e.length>0?JSON.parse(e):void 0;if(!t.ok)throw new Error(Er(a,t.status));return a}function Er(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 Za(t,e){const a=e.toString();return a.length>0?`${t}?${a}`:t}function Ft(t){const e=Cr();return e===null?t:{...t,Authorization:`Bearer ${e}`}}const Ir=["meta:updated","lock:drift","lock:approved","ledger:appended","drift:detected"],Rr=new Set(Ir),lt=jt([]),ct=jt(!1),ut=jt(0),ta=1e3,$r=3e4,Or=2;function Lr(){const[t,e]=L({connected:ct.value,lastEvent:lt.value[0]??null,version:ut.value}),a=Oe(null),r=Oe(ta),n=Oe(void 0),i=Oe(!0);return V(()=>{i.current=!0;const s=h=>{ct.value=h,e(u=>({...u,connected:h}))},o=(h,u,g)=>{if(!Rr.has(h))return;g.length>0&&(a.current=g);const p=Ar(u);p!==null&&(lt.value=[p,...lt.value].slice(0,50),ut.value+=1,e({connected:ct.value,lastEvent:p,version:ut.value}))};let c=null;const l=()=>{i.current&&(c=Sr("/events",a.current,o,()=>{i.current&&(r.current=ta,s(!0))},()=>{if(!i.current)return;s(!1);const h=r.current;r.current=Math.min(r.current*Or,$r),n.current=setTimeout(l,h)}))};return l(),()=>{i.current=!1,clearTimeout(n.current),c?.close(),s(!1)}},[]),t}var jr={"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.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.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.no-bootstrap.description":"Skip running bootstrap installer as part of init","cli.init.args.no-mcp.description":"Skip configuring MCP clients as part of init","cli.init.args.no-hooks.description":"Skip installing git hooks as part of init","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.next-step.message":"run fab hooks install to add the Day 4 pre-commit pipeline.","cli.init.reason-message.body":".fabric/forensic.json is ready; use the agents-md-init skill to finish AGENTS.md initialization.","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 AGENTS.md with TODO markers.","cli.scan.recommendation.readme":"L0: Expand README.md before promoting project facts into AGENTS.md references.","cli.scan.recommendation.contributing":"L0: Add CONTRIBUTING.md or leave an AGENTS.md 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 AGENTS.md 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 AGENTS.md 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.rules.label":"Rules Tree","dashboard.app.nav.rules.label-bilingual":"规则树 Rules Tree","dashboard.app.nav.rules.subtitle":"meta graph","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":"ledger stream","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":"fab diagnostics","dashboard.app.nav.section.diagnostics":"Diagnostics","dashboard.app.nav.drift-check":"Drift Check","dashboard.app.header.connected":"CONNECTED","dashboard.app.header.connecting":"CONNECTING","dashboard.app.live-region.received":"Received {type}","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.rules-tree.title":"Rules Tree Browser","dashboard.rules-tree.subtitle":".fabric/agents.meta.json · L0/L1/L2 hierarchy · hash drift aware","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 · rev {revision}","dashboard.rules-tree.status.locks":"{count} human locks","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 Lock Vault","dashboard.human-lock.subtitle":"Protected regions awaiting approval · ritual writes only","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":".intent-ledger.jsonl · dual-column AI | Human · sorted by timestamp desc","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":"Time-travel through ledger commits and rehydrate the rules tree at any recorded point","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":"ledger {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 revision","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":"fab doctor surface · framework, entry points, revision drift, 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 meta revision 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"},Pr={"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.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.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.no-bootstrap.description":"初始化时跳过运行 bootstrap 安装器","cli.init.args.no-mcp.description":"初始化时跳过配置 MCP 客户端","cli.init.args.no-hooks.description":"初始化时跳过安装 git hooks","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.next-step.message":"运行 fab hooks install 以添加第 4 天的 pre-commit 流水线。","cli.init.reason-message.body":".fabric/forensic.json 已就绪;请使用 agents-md-init skill 完成 AGENTS.md 初始化。","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,为 AGENTS.md 生成带 TODO 标记的初始骨架。","cli.scan.recommendation.readme":"L0:先补充 README.md,再把项目事实沉淀到 AGENTS.md 引用中。","cli.scan.recommendation.contributing":"L0:添加 CONTRIBUTING.md,或在 AGENTS.md 中留下贡献流程的 TODO 引用。","cli.scan.recommendation.unknown-framework":"L1:当前未检测到框架标记,需要手动补充技术栈 TODO。","cli.scan.recommendation.framework-dirs":"L1:检查 {framework} 目录,后续为其补充作用域化 AGENTS.md 文件。","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":"从 AGENTS.md 文件同步 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.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":"fab 诊断","dashboard.app.nav.section.diagnostics":"诊断","dashboard.app.nav.drift-check":"漂移检查","dashboard.app.header.connected":"已连接","dashboard.app.header.connecting":"连接中","dashboard.app.live-region.received":"已收到 {type}","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.rules-tree.title":"规则树浏览器","dashboard.rules-tree.subtitle":".fabric/agents.meta.json · L0/L1/L2 层级 · 感知哈希漂移","dashboard.rules-tree.filter.placeholder":"按文件、glob、优先级、哈希过滤...","dashboard.rules-tree.filter.aria-label":"过滤规则树","dashboard.rules-tree.status.loading":"规则加载中","dashboard.rules-tree.status.nodes":"{count} 个节点 · rev {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":".intent-ledger.jsonl · AI | Human 双列 · 按时间倒序","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":"ledger {ledgerId} · commit {commit} · {mode}","dashboard.history-replay.status.loading":"快照加载中","dashboard.history-replay.status.nodes":"{count} 个节点","dashboard.history-replay.status.unknown-revision":"未知 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":"fab doctor 面板 · 框架、入口点、revision 漂移、受保护路径","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":"暂无 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":"重试"},Fr={en:jr,"zh-CN":Pr};function Mr(t,e=Fr){const a=e[t]??e.en,r=e.en;return(n,i)=>{const s=a[n]??r[n]??n;return i===void 0?s:Object.entries(i).reduce((o,[c,l])=>o.replaceAll(`{${c}}`,l),s)}}function Dr(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 Zr(){return typeof navigator<"u"&&typeof navigator.language=="string"?Dr(navigator.language):"en"}function Ur(t=Zr()){return{locale:t,t:Mr(t)}}const Ua=ur(null);function Hr({children:t}){const e=ee(()=>Ur(),[]);return d(Ua.Provider,{value:e,children:t})}function B(){const t=fr(Ua);if(t===null)throw new Error("useI18n must be used within an I18nProvider.");return t}function Ha({variant:t,state:e="idle",size:a="md",onClick:r,children:n,ariaLabel:i}){const{t:s}=B(),[o,c]=L(e),l=e==="idle"?o:e,h=l==="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 d("button",{type:"button",className:`action-button action-${t} action-${a} action-${l}`,"aria-label":i,"aria-busy":h,"aria-disabled":h,onClick:u,children:[h?d("span",{className:"spinner","aria-hidden":"true"}):null,l==="success"?d("span",{"aria-hidden":"true",children:"✓"}):null,l==="error"?s("dashboard.approve-button.retry"):n]})}const Vr={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 se({kind:t,severity:e,message:a,diffStats:r}){const{t:n}=B();if(e==="ok"&&t==="dot")return null;const i=a??n(Vr[e]),s=r===void 0?"":` +${r.added} / -${r.removed}`,o=`drift-indicator drift-${t} drift-${e}`;return t==="dot"?d("span",{className:o,"aria-label":i}):t==="banner"?d("div",{className:o,role:"status",children:[d("span",{"aria-hidden":"true",children:"!"}),d("span",{children:[i,s]})]}):d("span",{className:o,children:[d("span",{"aria-hidden":"true",children:e==="ok"?"✓":"!"}),d("span",{children:[i,s]})]})}function Br({entry:t,currentHash:e,diffStats:a,diffPreview:r=[],onApprove:n,busy:i=!1}){const{t:s}=B(),o=e!==void 0&&e!==t.hash,c=o?"drift":"ok",l=s(o?"dashboard.lock-card.status.drift":"dashboard.lock-card.status.confirmed"),h=`L${t.start_line}-L${t.end_line}`;return d("article",{className:`lock-card lock-${c} ${i?"is-busy":""}`,"aria-label":s("dashboard.lock-card.aria-label",{file:t.file,lineRange:h,status:l}),children:[d("header",{className:"lock-head",children:[d("div",{className:"lock-icon","aria-hidden":"true",children:o?"!":"✓"}),d("div",{className:"lock-title",children:[d("strong",{children:t.file}),d("span",{children:h})]}),d(se,{kind:"pill",severity:o?"drift":"ok",message:l})]}),d("div",{className:"lock-body",children:[d("div",{className:"hash-block",children:[d(ht,{label:s("dashboard.lock-card.hash.locked"),value:t.hash,stale:o}),d(ht,{label:s("dashboard.lock-card.hash.current"),value:e??s("dashboard.history-replay.meta.not-available")}),d(ht,{label:s("dashboard.lock-card.hash.diff"),value:zr(a,o,s),accent:o})]}),d("div",{className:"preview",children:[d("div",{className:"preview-head",children:[d("span",{children:[t.file," · ",h]}),d("span",{children:s(o?"dashboard.lock-card.preview.drift":"dashboard.lock-card.preview.sync")})]}),d("pre",{className:"preview-body",children:r.length>0?r.map(u=>d("span",{className:`line-${u.kind}`,children:[d("span",{className:"line-num",children:u.line}),u.text,`
7
- `]},`${u.kind}:${u.line}:${u.text}`)):`${t.file}
8
- ${h}
9
- ${s(o?"dashboard.lock-card.preview.drift-detail":"dashboard.lock-card.preview.sync-detail")}`})]})]}),d("footer",{className:"lock-foot",children:[d("span",{className:"meta-line",children:s("dashboard.lock-card.footer.region",{count:String(t.end_line-t.start_line+1)})}),o&&e!==void 0&&n!==void 0?d(Ha,{variant:"approve",state:i?"busy":"idle",ariaLabel:s("dashboard.lock-card.button.approve"),onClick:()=>n(t),children:s("dashboard.lock-card.button.approve")}):d("button",{className:"action-button action-approve action-success",type:"button","aria-disabled":"true",children:["✓ ",s("dashboard.lock-card.button.confirmed")]})]})]})}function ht({label:t,value:e,stale:a=!1,accent:r=!1}){return d("div",{className:"hash-row",children:[d("span",{className:"hash-key",children:t}),d("span",{className:`hash-value ${a?"is-stale":""} ${r?"is-accent":""}`,children:e})]})}function zr(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 kt({source:t,size:e="sm",variant:a="filled",interactive:r=!1,selected:n=!1,onClick:i}){const{t:s}=B(),o=["source-badge",`source-badge-${t}`,`source-badge-${e}`,`source-badge-${a}`,n?"is-selected":""].filter(Boolean).join(" "),c=s(`dashboard.source.${t}`);return r?d("button",{className:o,type:"button","aria-pressed":n,onClick:i,children:[d("span",{className:"source-badge-dot","aria-hidden":"true"}),c]}):d("span",{className:o,children:[d("span",{className:"source-badge-dot","aria-hidden":"true"}),c]})}function Va({entry:t,onAnnotate:e,expanded:a=!1,readOnly:r=!1}){const{locale:n,t:i}=B(),[s,o]=L(a),[c,l]=L(""),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),l(""),o(!1))};return d("article",{className:`timeline-entry timeline-${t.source}`,"aria-label":i("dashboard.timeline-entry.aria-label",{source:i(`dashboard.source.${t.source}`),intent:t.intent}),children:[d("div",{className:`dot-axis ${t.source}`,"aria-hidden":"true"}),d("div",{className:"timeline-head",children:[d(kt,{source:t.source}),h?d("span",{className:"commit-hash",children:t.commit_sha??i("dashboard.timeline-entry.working-tree")}):null,h?null:d("span",{className:"commit-hash",children:i("dashboard.timeline-entry.parent",{parent:t.parent_sha})}),h?null:d("span",{className:"diff-badge",children:t.diff_stat}),d("time",{className:"entry-time",dateTime:new Date(t.ts).toISOString(),children:Wr(t.ts,n)})]}),d("h3",{className:"entry-title",children:t.intent}),d("div",{className:"entry-meta",children:[d("span",{children:[d("span",{className:"meta-key",children:i("dashboard.timeline-entry.paths")})," ",t.affected_paths.length]}),t.affected_paths.slice(0,3).map(p=>d("span",{children:p},p))]}),!h&&t.annotation!==void 0?d("div",{className:"entry-body",children:t.annotation}):null,h&&u?d("div",{className:"entry-foot",children:d("button",{className:"ghost-button",type:"button",onClick:()=>o(p=>!p),children:i("dashboard.timeline-entry.annotate")})}):null,s&&h?d("form",{className:"annotate-form",onSubmit:p=>{p.preventDefault(),g()},children:[d("label",{htmlFor:`annotate-${t.id??t.ts}`,children:i("dashboard.timeline-entry.annotation-label")}),d("input",{id:`annotate-${t.id??t.ts}`,className:"annotate-input",value:c,onInput:p=>l(p.currentTarget.value),placeholder:i("dashboard.timeline-entry.annotation-placeholder")}),d(Ha,{variant:"annotate",size:"sm",onClick:g,children:i("dashboard.timeline-entry.annotation-save")})]}):null]})}function Wr(t,e){return new Intl.DateTimeFormat(e,{hour:"2-digit",minute:"2-digit",second:"2-digit"}).format(new Date(t))}function Mt({node:t,level:e,selected:a=!1,onSelect:r,humanLockedNearby:n=!1,staleReason:i=null,defaultExpanded:s=!1,readOnly:o=!1,children:c=[]}){const{t:l}=B(),[h,u]=L(s),g=c.length>0,p=t.file,v=i===null?"ok":i==="orphan"?"orphan":"stale",C=()=>{o||(g&&u(x=>!x),r?.(p))},w=x=>{o||((x.key==="Enter"||x.key===" ")&&(x.preventDefault(),C()),x.key==="ArrowRight"&&g&&u(!0),x.key==="ArrowLeft"&&g&&u(!1))};return d("div",{className:`tree-node-group tree-level-${e}`,children:[d("div",{className:["tree-node",a?"is-selected":"",h?"is-expanded":"",n?"is-locked":"",i!==null?"is-stale":"",o?"is-readonly":""].filter(Boolean).join(" "),role:"treeitem","aria-expanded":g?h:void 0,"aria-level":e+1,"aria-readonly":o||void 0,tabIndex:o?-1:0,onClick:o?void 0:C,onKeyDown:o?void 0:w,children:[d("span",{className:"tree-caret","aria-hidden":"true",children:g?"›":"·"}),d("span",{className:"tree-icon","aria-hidden":"true",children:e===0?"F":e===1?"D":"R"}),d("span",{className:"tree-label",children:p}),n?d("span",{className:"badge badge-locked",children:l("dashboard.tree-node.locked")}):null,i!==null?d(se,{kind:"pill",severity:v,message:l(`dashboard.tree-node.stale.${i}`)}):null,d("span",{className:"tree-meta",children:[d("span",{className:"badge badge-level",children:["L",e]}),d("span",{className:"tree-hash",children:qr(t.hash)})]})]}),g&&h?d("div",{className:"tree-children",role:"group",children:c.map(x=>d(Mt,{...x,onSelect:r,readOnly:o},`${x.node.file}:${x.level}`))}):null]})}function qr(t){return t.length>18?`${t.slice(0,12)}…`:t}var I;(function(t){t.assertEqual=n=>{};function e(n){}t.assertIs=e;function a(n){throw new Error}t.assertNever=a,t.arrayToEnum=n=>{const i={};for(const s of n)i[s]=s;return i},t.getValidEnumValues=n=>{const i=t.objectKeys(n).filter(o=>typeof n[n[o]]!="number"),s={};for(const o of i)s[o]=n[o];return t.objectValues(s)},t.objectValues=n=>t.objectKeys(n).map(function(i){return n[i]}),t.objectKeys=typeof Object.keys=="function"?n=>Object.keys(n):n=>{const i=[];for(const s in n)Object.prototype.hasOwnProperty.call(n,s)&&i.push(s);return i},t.find=(n,i)=>{for(const s of n)if(i(s))return s},t.isInteger=typeof Number.isInteger=="function"?n=>Number.isInteger(n):n=>typeof n=="number"&&Number.isFinite(n)&&Math.floor(n)===n;function r(n,i=" | "){return n.map(s=>typeof s=="string"?`'${s}'`:s).join(i)}t.joinValues=r,t.jsonStringifyReplacer=(n,i)=>typeof i=="bigint"?i.toString():i})(I||(I={}));var aa;(function(t){t.mergeShapes=(e,a)=>({...e,...a})})(aa||(aa={}));const b=I.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),ie=t=>{switch(typeof t){case"undefined":return b.undefined;case"string":return b.string;case"number":return Number.isNaN(t)?b.nan:b.number;case"boolean":return b.boolean;case"function":return b.function;case"bigint":return b.bigint;case"symbol":return b.symbol;case"object":return Array.isArray(t)?b.array:t===null?b.null:t.then&&typeof t.then=="function"&&t.catch&&typeof t.catch=="function"?b.promise:typeof Map<"u"&&t instanceof Map?b.map:typeof Set<"u"&&t instanceof Set?b.set:typeof Date<"u"&&t instanceof Date?b.date:b.object;default:return b.unknown}},f=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 te 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(i){return i.message},r={_errors:[]},n=i=>{for(const s of i.issues)if(s.code==="invalid_union")s.unionErrors.map(n);else if(s.code==="invalid_return_type")n(s.returnTypeError);else if(s.code==="invalid_arguments")n(s.argumentsError);else if(s.path.length===0)r._errors.push(a(s));else{let o=r,c=0;for(;c<s.path.length;){const l=s.path[c];c===s.path.length-1?(o[l]=o[l]||{_errors:[]},o[l]._errors.push(a(s))):o[l]=o[l]||{_errors:[]},o=o[l],c++}}};return n(this),r}static assert(e){if(!(e instanceof te))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 n of this.issues)if(n.path.length>0){const i=n.path[0];a[i]=a[i]||[],a[i].push(e(n))}else r.push(e(n));return{formErrors:r,fieldErrors:a}}get formErrors(){return this.flatten()}}te.create=t=>new te(t);const wt=(t,e)=>{let a;switch(t.code){case f.invalid_type:t.received===b.undefined?a="Required":a=`Expected ${t.expected}, received ${t.received}`;break;case f.invalid_literal:a=`Invalid literal value, expected ${JSON.stringify(t.expected,I.jsonStringifyReplacer)}`;break;case f.unrecognized_keys:a=`Unrecognized key(s) in object: ${I.joinValues(t.keys,", ")}`;break;case f.invalid_union:a="Invalid input";break;case f.invalid_union_discriminator:a=`Invalid discriminator value. Expected ${I.joinValues(t.options)}`;break;case f.invalid_enum_value:a=`Invalid enum value. Expected ${I.joinValues(t.options)}, received '${t.received}'`;break;case f.invalid_arguments:a="Invalid function arguments";break;case f.invalid_return_type:a="Invalid function return type";break;case f.invalid_date:a="Invalid date";break;case f.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 f.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 f.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 f.custom:a="Invalid input";break;case f.invalid_intersection_types:a="Intersection results could not be merged";break;case f.not_multiple_of:a=`Number must be a multiple of ${t.multipleOf}`;break;case f.not_finite:a="Number must be finite";break;default:a=e.defaultError,I.assertNever(t)}return{message:a}};let Gr=wt;function Xr(){return Gr}const Jr=t=>{const{data:e,path:a,errorMaps:r,issueData:n}=t,i=[...a,...n.path||[]],s={...n,path:i};if(n.message!==void 0)return{...n,path:i,message:n.message};let o="";const c=r.filter(l=>!!l).slice().reverse();for(const l of c)o=l(s,{data:e,defaultError:o}).message;return{...n,path:i,message:o}};function _(t,e){const a=Xr(),r=Jr({issueData:e,data:t.data,path:t.path,errorMaps:[t.common.contextualErrorMap,t.schemaErrorMap,a,a===wt?void 0:wt].filter(n=>!!n)});t.common.issues.push(r)}class D{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 n of a){if(n.status==="aborted")return N;n.status==="dirty"&&e.dirty(),r.push(n.value)}return{status:e.value,value:r}}static async mergeObjectAsync(e,a){const r=[];for(const n of a){const i=await n.key,s=await n.value;r.push({key:i,value:s})}return D.mergeObjectSync(e,r)}static mergeObjectSync(e,a){const r={};for(const n of a){const{key:i,value:s}=n;if(i.status==="aborted"||s.status==="aborted")return N;i.status==="dirty"&&e.dirty(),s.status==="dirty"&&e.dirty(),i.value!=="__proto__"&&(typeof s.value<"u"||n.alwaysSet)&&(r[i.value]=s.value)}return{status:e.value,value:r}}}const N=Object.freeze({status:"aborted"}),xe=t=>({status:"dirty",value:t}),W=t=>({status:"valid",value:t}),ra=t=>t.status==="aborted",na=t=>t.status==="dirty",be=t=>t.status==="valid",We=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 X{constructor(e,a,r,n){this._cachedPath=[],this.parent=e,this.data=a,this._path=r,this._key=n}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 ia=(t,e)=>{if(be(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 te(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:n}=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:n}:{errorMap:(s,o)=>{const{message:c}=t;return s.code==="invalid_enum_value"?{message:c??o.defaultError}:typeof o.data>"u"?{message:c??r??o.defaultError}:s.code!=="invalid_type"?{message:o.defaultError}:{message:c??a??o.defaultError}},description:n}}class E{get description(){return this._def.description}_getType(e){return ie(e.data)}_getOrReturnCtx(e,a){return a||{common:e.parent.common,data:e.data,parsedType:ie(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}_processInputParams(e){return{status:new D,ctx:{common:e.parent.common,data:e.data,parsedType:ie(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}}_parseSync(e){const a=this._parse(e);if(We(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:ie(e)},n=this._parseSync({data:e,path:r.path,parent:r});return ia(r,n)}"~validate"(e){const a={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:ie(e)};if(!this["~standard"].async)try{const r=this._parseSync({data:e,path:[],parent:a});return be(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=>be(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:ie(e)},n=this._parse({data:e,path:r.path,parent:r}),i=await(We(n)?n:Promise.resolve(n));return ia(r,i)}refine(e,a){const r=n=>typeof a=="string"||typeof a>"u"?{message:a}:typeof a=="function"?a(n):a;return this._refinement((n,i)=>{const s=e(n),o=()=>i.addIssue({code:f.custom,...r(n)});return typeof Promise<"u"&&s instanceof Promise?s.then(c=>c?!0:(o(),!1)):s?!0:(o(),!1)})}refinement(e,a){return this._refinement((r,n)=>e(r)?!0:(n.addIssue(typeof a=="function"?a(r,n):a),!1))}_refinement(e){return new de({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 Q.create(this,this._def)}nullable(){return pe.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return G.create(this)}promise(){return Ye.create(this,this._def)}or(e){return Ge.create([this,e],this._def)}and(e){return Xe.create(this,e,this._def)}transform(e){return new de({...T(this._def),schema:this,typeName:S.ZodEffects,effect:{type:"transform",transform:e}})}default(e){const a=typeof e=="function"?e:()=>e;return new Qe({...T(this._def),innerType:this,defaultValue:a,typeName:S.ZodDefault})}brand(){return new qa({typeName:S.ZodBranded,type:this,...T(this._def)})}catch(e){const a=typeof e=="function"?e:()=>e;return new et({...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 Zt.create(this,e)}readonly(){return tt.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}const Kr=/^c[^\s-]{8,}$/i,Yr=/^[0-9a-z]+$/,Qr=/^[0-9A-HJKMNP-TV-Z]{26}$/i,en=/^[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,tn=/^[a-z0-9_-]{21}$/i,an=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,rn=/^[-+]?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)?)??$/,nn=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,sn="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";let pt;const on=/^(?:(?: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])$/,dn=/^(?:(?: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])$/,ln=/^(([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]))$/,cn=/^(([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])$/,un=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,hn=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,Ba="((\\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])))",pn=new RegExp(`^${Ba}$`);function za(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 fn(t){return new RegExp(`^${za(t)}$`)}function mn(t){let e=`${Ba}T${za(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 _n(t,e){return!!((e==="v4"||!e)&&on.test(t)||(e==="v6"||!e)&&ln.test(t))}function gn(t,e){if(!an.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,"="),n=JSON.parse(atob(r));return!(typeof n!="object"||n===null||"typ"in n&&n?.typ!=="JWT"||!n.alg||e&&n.alg!==e)}catch{return!1}}function bn(t,e){return!!((e==="v4"||!e)&&dn.test(t)||(e==="v6"||!e)&&cn.test(t))}class Y extends E{_parse(e){if(this._def.coerce&&(e.data=String(e.data)),this._getType(e)!==b.string){const i=this._getOrReturnCtx(e);return _(i,{code:f.invalid_type,expected:b.string,received:i.parsedType}),N}const r=new D;let n;for(const i of this._def.checks)if(i.kind==="min")e.data.length<i.value&&(n=this._getOrReturnCtx(e,n),_(n,{code:f.too_small,minimum:i.value,type:"string",inclusive:!0,exact:!1,message:i.message}),r.dirty());else if(i.kind==="max")e.data.length>i.value&&(n=this._getOrReturnCtx(e,n),_(n,{code:f.too_big,maximum:i.value,type:"string",inclusive:!0,exact:!1,message:i.message}),r.dirty());else if(i.kind==="length"){const s=e.data.length>i.value,o=e.data.length<i.value;(s||o)&&(n=this._getOrReturnCtx(e,n),s?_(n,{code:f.too_big,maximum:i.value,type:"string",inclusive:!0,exact:!0,message:i.message}):o&&_(n,{code:f.too_small,minimum:i.value,type:"string",inclusive:!0,exact:!0,message:i.message}),r.dirty())}else if(i.kind==="email")nn.test(e.data)||(n=this._getOrReturnCtx(e,n),_(n,{validation:"email",code:f.invalid_string,message:i.message}),r.dirty());else if(i.kind==="emoji")pt||(pt=new RegExp(sn,"u")),pt.test(e.data)||(n=this._getOrReturnCtx(e,n),_(n,{validation:"emoji",code:f.invalid_string,message:i.message}),r.dirty());else if(i.kind==="uuid")en.test(e.data)||(n=this._getOrReturnCtx(e,n),_(n,{validation:"uuid",code:f.invalid_string,message:i.message}),r.dirty());else if(i.kind==="nanoid")tn.test(e.data)||(n=this._getOrReturnCtx(e,n),_(n,{validation:"nanoid",code:f.invalid_string,message:i.message}),r.dirty());else if(i.kind==="cuid")Kr.test(e.data)||(n=this._getOrReturnCtx(e,n),_(n,{validation:"cuid",code:f.invalid_string,message:i.message}),r.dirty());else if(i.kind==="cuid2")Yr.test(e.data)||(n=this._getOrReturnCtx(e,n),_(n,{validation:"cuid2",code:f.invalid_string,message:i.message}),r.dirty());else if(i.kind==="ulid")Qr.test(e.data)||(n=this._getOrReturnCtx(e,n),_(n,{validation:"ulid",code:f.invalid_string,message:i.message}),r.dirty());else if(i.kind==="url")try{new URL(e.data)}catch{n=this._getOrReturnCtx(e,n),_(n,{validation:"url",code:f.invalid_string,message:i.message}),r.dirty()}else i.kind==="regex"?(i.regex.lastIndex=0,i.regex.test(e.data)||(n=this._getOrReturnCtx(e,n),_(n,{validation:"regex",code:f.invalid_string,message:i.message}),r.dirty())):i.kind==="trim"?e.data=e.data.trim():i.kind==="includes"?e.data.includes(i.value,i.position)||(n=this._getOrReturnCtx(e,n),_(n,{code:f.invalid_string,validation:{includes:i.value,position:i.position},message:i.message}),r.dirty()):i.kind==="toLowerCase"?e.data=e.data.toLowerCase():i.kind==="toUpperCase"?e.data=e.data.toUpperCase():i.kind==="startsWith"?e.data.startsWith(i.value)||(n=this._getOrReturnCtx(e,n),_(n,{code:f.invalid_string,validation:{startsWith:i.value},message:i.message}),r.dirty()):i.kind==="endsWith"?e.data.endsWith(i.value)||(n=this._getOrReturnCtx(e,n),_(n,{code:f.invalid_string,validation:{endsWith:i.value},message:i.message}),r.dirty()):i.kind==="datetime"?mn(i).test(e.data)||(n=this._getOrReturnCtx(e,n),_(n,{code:f.invalid_string,validation:"datetime",message:i.message}),r.dirty()):i.kind==="date"?pn.test(e.data)||(n=this._getOrReturnCtx(e,n),_(n,{code:f.invalid_string,validation:"date",message:i.message}),r.dirty()):i.kind==="time"?fn(i).test(e.data)||(n=this._getOrReturnCtx(e,n),_(n,{code:f.invalid_string,validation:"time",message:i.message}),r.dirty()):i.kind==="duration"?rn.test(e.data)||(n=this._getOrReturnCtx(e,n),_(n,{validation:"duration",code:f.invalid_string,message:i.message}),r.dirty()):i.kind==="ip"?_n(e.data,i.version)||(n=this._getOrReturnCtx(e,n),_(n,{validation:"ip",code:f.invalid_string,message:i.message}),r.dirty()):i.kind==="jwt"?gn(e.data,i.alg)||(n=this._getOrReturnCtx(e,n),_(n,{validation:"jwt",code:f.invalid_string,message:i.message}),r.dirty()):i.kind==="cidr"?bn(e.data,i.version)||(n=this._getOrReturnCtx(e,n),_(n,{validation:"cidr",code:f.invalid_string,message:i.message}),r.dirty()):i.kind==="base64"?un.test(e.data)||(n=this._getOrReturnCtx(e,n),_(n,{validation:"base64",code:f.invalid_string,message:i.message}),r.dirty()):i.kind==="base64url"?hn.test(e.data)||(n=this._getOrReturnCtx(e,n),_(n,{validation:"base64url",code:f.invalid_string,message:i.message}),r.dirty()):I.assertNever(i);return{status:r.value,value:e.data}}_regex(e,a,r){return this.refinement(n=>e.test(n),{validation:a,code:f.invalid_string,...k.errToObj(r)})}_addCheck(e){return new Y({...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 Y({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new Y({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new Y({...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}}Y.create=t=>new Y({checks:[],typeName:S.ZodString,coerce:t?.coerce??!1,...T(t)});function vn(t,e){const a=(t.toString().split(".")[1]||"").length,r=(e.toString().split(".")[1]||"").length,n=a>r?a:r,i=Number.parseInt(t.toFixed(n).replace(".","")),s=Number.parseInt(e.toFixed(n).replace(".",""));return i%s/10**n}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)!==b.number){const i=this._getOrReturnCtx(e);return _(i,{code:f.invalid_type,expected:b.number,received:i.parsedType}),N}let r;const n=new D;for(const i of this._def.checks)i.kind==="int"?I.isInteger(e.data)||(r=this._getOrReturnCtx(e,r),_(r,{code:f.invalid_type,expected:"integer",received:"float",message:i.message}),n.dirty()):i.kind==="min"?(i.inclusive?e.data<i.value:e.data<=i.value)&&(r=this._getOrReturnCtx(e,r),_(r,{code:f.too_small,minimum:i.value,type:"number",inclusive:i.inclusive,exact:!1,message:i.message}),n.dirty()):i.kind==="max"?(i.inclusive?e.data>i.value:e.data>=i.value)&&(r=this._getOrReturnCtx(e,r),_(r,{code:f.too_big,maximum:i.value,type:"number",inclusive:i.inclusive,exact:!1,message:i.message}),n.dirty()):i.kind==="multipleOf"?vn(e.data,i.value)!==0&&(r=this._getOrReturnCtx(e,r),_(r,{code:f.not_multiple_of,multipleOf:i.value,message:i.message}),n.dirty()):i.kind==="finite"?Number.isFinite(e.data)||(r=this._getOrReturnCtx(e,r),_(r,{code:f.not_finite,message:i.message}),n.dirty()):I.assertNever(i);return{status:n.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,n){return new ve({...this._def,checks:[...this._def.checks,{kind:e,value:a,inclusive:r,message:k.toString(n)}]})}_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 Te 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)!==b.bigint)return this._getInvalidInput(e);let r;const n=new D;for(const i of this._def.checks)i.kind==="min"?(i.inclusive?e.data<i.value:e.data<=i.value)&&(r=this._getOrReturnCtx(e,r),_(r,{code:f.too_small,type:"bigint",minimum:i.value,inclusive:i.inclusive,message:i.message}),n.dirty()):i.kind==="max"?(i.inclusive?e.data>i.value:e.data>=i.value)&&(r=this._getOrReturnCtx(e,r),_(r,{code:f.too_big,type:"bigint",maximum:i.value,inclusive:i.inclusive,message:i.message}),n.dirty()):i.kind==="multipleOf"?e.data%i.value!==BigInt(0)&&(r=this._getOrReturnCtx(e,r),_(r,{code:f.not_multiple_of,multipleOf:i.value,message:i.message}),n.dirty()):I.assertNever(i);return{status:n.value,value:e.data}}_getInvalidInput(e){const a=this._getOrReturnCtx(e);return _(a,{code:f.invalid_type,expected:b.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,n){return new Te({...this._def,checks:[...this._def.checks,{kind:e,value:a,inclusive:r,message:k.toString(n)}]})}_addCheck(e){return new Te({...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}}Te.create=t=>new Te({checks:[],typeName:S.ZodBigInt,coerce:t?.coerce??!1,...T(t)});class xt extends E{_parse(e){if(this._def.coerce&&(e.data=!!e.data),this._getType(e)!==b.boolean){const r=this._getOrReturnCtx(e);return _(r,{code:f.invalid_type,expected:b.boolean,received:r.parsedType}),N}return W(e.data)}}xt.create=t=>new xt({typeName:S.ZodBoolean,coerce:t?.coerce||!1,...T(t)});class qe extends E{_parse(e){if(this._def.coerce&&(e.data=new Date(e.data)),this._getType(e)!==b.date){const i=this._getOrReturnCtx(e);return _(i,{code:f.invalid_type,expected:b.date,received:i.parsedType}),N}if(Number.isNaN(e.data.getTime())){const i=this._getOrReturnCtx(e);return _(i,{code:f.invalid_date}),N}const r=new D;let n;for(const i of this._def.checks)i.kind==="min"?e.data.getTime()<i.value&&(n=this._getOrReturnCtx(e,n),_(n,{code:f.too_small,message:i.message,inclusive:!0,exact:!1,minimum:i.value,type:"date"}),r.dirty()):i.kind==="max"?e.data.getTime()>i.value&&(n=this._getOrReturnCtx(e,n),_(n,{code:f.too_big,message:i.message,inclusive:!0,exact:!1,maximum:i.value,type:"date"}),r.dirty()):I.assertNever(i);return{status:r.value,value:new Date(e.data.getTime())}}_addCheck(e){return new qe({...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}}qe.create=t=>new qe({checks:[],coerce:t?.coerce||!1,typeName:S.ZodDate,...T(t)});class sa extends E{_parse(e){if(this._getType(e)!==b.symbol){const r=this._getOrReturnCtx(e);return _(r,{code:f.invalid_type,expected:b.symbol,received:r.parsedType}),N}return W(e.data)}}sa.create=t=>new sa({typeName:S.ZodSymbol,...T(t)});class Nt extends E{_parse(e){if(this._getType(e)!==b.undefined){const r=this._getOrReturnCtx(e);return _(r,{code:f.invalid_type,expected:b.undefined,received:r.parsedType}),N}return W(e.data)}}Nt.create=t=>new Nt({typeName:S.ZodUndefined,...T(t)});class St extends E{_parse(e){if(this._getType(e)!==b.null){const r=this._getOrReturnCtx(e);return _(r,{code:f.invalid_type,expected:b.null,received:r.parsedType}),N}return W(e.data)}}St.create=t=>new St({typeName:S.ZodNull,...T(t)});class oa extends E{constructor(){super(...arguments),this._any=!0}_parse(e){return W(e.data)}}oa.create=t=>new oa({typeName:S.ZodAny,...T(t)});class da extends E{constructor(){super(...arguments),this._unknown=!0}_parse(e){return W(e.data)}}da.create=t=>new da({typeName:S.ZodUnknown,...T(t)});class oe extends E{_parse(e){const a=this._getOrReturnCtx(e);return _(a,{code:f.invalid_type,expected:b.never,received:a.parsedType}),N}}oe.create=t=>new oe({typeName:S.ZodNever,...T(t)});class la extends E{_parse(e){if(this._getType(e)!==b.undefined){const r=this._getOrReturnCtx(e);return _(r,{code:f.invalid_type,expected:b.void,received:r.parsedType}),N}return W(e.data)}}la.create=t=>new la({typeName:S.ZodVoid,...T(t)});class G extends E{_parse(e){const{ctx:a,status:r}=this._processInputParams(e),n=this._def;if(a.parsedType!==b.array)return _(a,{code:f.invalid_type,expected:b.array,received:a.parsedType}),N;if(n.exactLength!==null){const s=a.data.length>n.exactLength.value,o=a.data.length<n.exactLength.value;(s||o)&&(_(a,{code:s?f.too_big:f.too_small,minimum:o?n.exactLength.value:void 0,maximum:s?n.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:n.exactLength.message}),r.dirty())}if(n.minLength!==null&&a.data.length<n.minLength.value&&(_(a,{code:f.too_small,minimum:n.minLength.value,type:"array",inclusive:!0,exact:!1,message:n.minLength.message}),r.dirty()),n.maxLength!==null&&a.data.length>n.maxLength.value&&(_(a,{code:f.too_big,maximum:n.maxLength.value,type:"array",inclusive:!0,exact:!1,message:n.maxLength.message}),r.dirty()),a.common.async)return Promise.all([...a.data].map((s,o)=>n.type._parseAsync(new X(a,s,a.path,o)))).then(s=>D.mergeArray(r,s));const i=[...a.data].map((s,o)=>n.type._parseSync(new X(a,s,a.path,o)));return D.mergeArray(r,i)}get element(){return this._def.type}min(e,a){return new G({...this._def,minLength:{value:e,message:k.toString(a)}})}max(e,a){return new G({...this._def,maxLength:{value:e,message:k.toString(a)}})}length(e,a){return new G({...this._def,exactLength:{value:e,message:k.toString(a)}})}nonempty(e){return this.min(1,e)}}G.create=(t,e)=>new G({type:t,minLength:null,maxLength:null,exactLength:null,typeName:S.ZodArray,...T(e)});function me(t){if(t instanceof M){const e={};for(const a in t.shape){const r=t.shape[a];e[a]=Q.create(me(r))}return new M({...t._def,shape:()=>e})}else return t instanceof G?new G({...t._def,type:me(t.element)}):t instanceof Q?Q.create(me(t.unwrap())):t instanceof pe?pe.create(me(t.unwrap())):t instanceof ue?ue.create(t.items.map(e=>me(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)!==b.object){const l=this._getOrReturnCtx(e);return _(l,{code:f.invalid_type,expected:b.object,received:l.parsedType}),N}const{status:r,ctx:n}=this._processInputParams(e),{shape:i,keys:s}=this._getCached(),o=[];if(!(this._def.catchall instanceof oe&&this._def.unknownKeys==="strip"))for(const l in n.data)s.includes(l)||o.push(l);const c=[];for(const l of s){const h=i[l],u=n.data[l];c.push({key:{status:"valid",value:l},value:h._parse(new X(n,u,n.path,l)),alwaysSet:l in n.data})}if(this._def.catchall instanceof oe){const l=this._def.unknownKeys;if(l==="passthrough")for(const h of o)c.push({key:{status:"valid",value:h},value:{status:"valid",value:n.data[h]}});else if(l==="strict")o.length>0&&(_(n,{code:f.unrecognized_keys,keys:o}),r.dirty());else if(l!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{const l=this._def.catchall;for(const h of o){const u=n.data[h];c.push({key:{status:"valid",value:h},value:l._parse(new X(n,u,n.path,h)),alwaysSet:h in n.data})}}return n.common.async?Promise.resolve().then(async()=>{const l=[];for(const h of c){const u=await h.key,g=await h.value;l.push({key:u,value:g,alwaysSet:h.alwaysSet})}return l}).then(l=>D.mergeObjectSync(r,l)):D.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 n=this._def.errorMap?.(a,r).message??r.defaultError;return a.code==="unrecognized_keys"?{message:k.errToObj(e).message??n}:{message:n}}}:{}})}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 me(this)}partial(e){const a={};for(const r of I.objectKeys(this.shape)){const n=this.shape[r];e&&!e[r]?a[r]=n:a[r]=n.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 i=this.shape[r];for(;i instanceof Q;)i=i._def.innerType;a[r]=i}return new M({...this._def,shape:()=>a})}keyof(){return Wa(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 n(i){for(const o of i)if(o.result.status==="valid")return o.result;for(const o of i)if(o.result.status==="dirty")return a.common.issues.push(...o.ctx.common.issues),o.result;const s=i.map(o=>new te(o.ctx.common.issues));return _(a,{code:f.invalid_union,unionErrors:s}),N}if(a.common.async)return Promise.all(r.map(async i=>{const s={...a,common:{...a.common,issues:[]},parent:null};return{result:await i._parseAsync({data:a.data,path:a.path,parent:s}),ctx:s}})).then(n);{let i;const s=[];for(const c of r){const l={...a,common:{...a.common,issues:[]},parent:null},h=c._parseSync({data:a.data,path:a.path,parent:l});if(h.status==="valid")return h;h.status==="dirty"&&!i&&(i={result:h,ctx:l}),l.common.issues.length&&s.push(l.common.issues)}if(i)return a.common.issues.push(...i.ctx.common.issues),i.result;const o=s.map(c=>new te(c));return _(a,{code:f.invalid_union,unionErrors:o}),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 Ct?J(t.schema):t instanceof de?J(t.innerType()):t instanceof Ke?[t.value]:t instanceof he?t.options:t instanceof At?I.objectValues(t.enum):t instanceof Qe?J(t._def.innerType):t instanceof Nt?[void 0]:t instanceof St?[null]:t instanceof Q?[void 0,...J(t.unwrap())]:t instanceof pe?[null,...J(t.unwrap())]:t instanceof qa||t instanceof tt?J(t.unwrap()):t instanceof et?J(t._def.innerType):[];class Dt extends E{_parse(e){const{ctx:a}=this._processInputParams(e);if(a.parsedType!==b.object)return _(a,{code:f.invalid_type,expected:b.object,received:a.parsedType}),N;const r=this.discriminator,n=a.data[r],i=this.optionsMap.get(n);return i?a.common.async?i._parseAsync({data:a.data,path:a.path,parent:a}):i._parseSync({data:a.data,path:a.path,parent:a}):(_(a,{code:f.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 n=new Map;for(const i of a){const s=J(i.shape[e]);if(!s.length)throw new Error(`A discriminator value for key \`${e}\` could not be extracted from all schema options`);for(const o of s){if(n.has(o))throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(o)}`);n.set(o,i)}}return new Dt({typeName:S.ZodDiscriminatedUnion,discriminator:e,options:a,optionsMap:n,...T(r)})}}function Tt(t,e){const a=ie(t),r=ie(e);if(t===e)return{valid:!0,data:t};if(a===b.object&&r===b.object){const n=I.objectKeys(e),i=I.objectKeys(t).filter(o=>n.indexOf(o)!==-1),s={...t,...e};for(const o of i){const c=Tt(t[o],e[o]);if(!c.valid)return{valid:!1};s[o]=c.data}return{valid:!0,data:s}}else if(a===b.array&&r===b.array){if(t.length!==e.length)return{valid:!1};const n=[];for(let i=0;i<t.length;i++){const s=t[i],o=e[i],c=Tt(s,o);if(!c.valid)return{valid:!1};n.push(c.data)}return{valid:!0,data:n}}else return a===b.date&&r===b.date&&+t==+e?{valid:!0,data:t}:{valid:!1}}class Xe extends E{_parse(e){const{status:a,ctx:r}=this._processInputParams(e),n=(i,s)=>{if(ra(i)||ra(s))return N;const o=Tt(i.value,s.value);return o.valid?((na(i)||na(s))&&a.dirty(),{status:a.value,value:o.data}):(_(r,{code:f.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(([i,s])=>n(i,s)):n(this._def.left._parseSync({data:r.data,path:r.path,parent:r}),this._def.right._parseSync({data:r.data,path:r.path,parent:r}))}}Xe.create=(t,e,a)=>new Xe({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!==b.array)return _(r,{code:f.invalid_type,expected:b.array,received:r.parsedType}),N;if(r.data.length<this._def.items.length)return _(r,{code:f.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),N;!this._def.rest&&r.data.length>this._def.items.length&&(_(r,{code:f.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),a.dirty());const i=[...r.data].map((s,o)=>{const c=this._def.items[o]||this._def.rest;return c?c._parse(new X(r,s,r.path,o)):null}).filter(s=>!!s);return r.common.async?Promise.all(i).then(s=>D.mergeArray(a,s)):D.mergeArray(a,i)}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 Je 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!==b.object)return _(r,{code:f.invalid_type,expected:b.object,received:r.parsedType}),N;const n=[],i=this._def.keyType,s=this._def.valueType;for(const o in r.data)n.push({key:i._parse(new X(r,o,r.path,o)),value:s._parse(new X(r,r.data[o],r.path,o)),alwaysSet:o in r.data});return r.common.async?D.mergeObjectAsync(a,n):D.mergeObjectSync(a,n)}get element(){return this._def.valueType}static create(e,a,r){return a instanceof E?new Je({keyType:e,valueType:a,typeName:S.ZodRecord,...T(r)}):new Je({keyType:Y.create(),valueType:e,typeName:S.ZodRecord,...T(a)})}}class ca 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!==b.map)return _(r,{code:f.invalid_type,expected:b.map,received:r.parsedType}),N;const n=this._def.keyType,i=this._def.valueType,s=[...r.data.entries()].map(([o,c],l)=>({key:n._parse(new X(r,o,r.path,[l,"key"])),value:i._parse(new X(r,c,r.path,[l,"value"]))}));if(r.common.async){const o=new Map;return Promise.resolve().then(async()=>{for(const c of s){const l=await c.key,h=await c.value;if(l.status==="aborted"||h.status==="aborted")return N;(l.status==="dirty"||h.status==="dirty")&&a.dirty(),o.set(l.value,h.value)}return{status:a.value,value:o}})}else{const o=new Map;for(const c of s){const l=c.key,h=c.value;if(l.status==="aborted"||h.status==="aborted")return N;(l.status==="dirty"||h.status==="dirty")&&a.dirty(),o.set(l.value,h.value)}return{status:a.value,value:o}}}}ca.create=(t,e,a)=>new ca({valueType:e,keyType:t,typeName:S.ZodMap,...T(a)});class Ce extends E{_parse(e){const{status:a,ctx:r}=this._processInputParams(e);if(r.parsedType!==b.set)return _(r,{code:f.invalid_type,expected:b.set,received:r.parsedType}),N;const n=this._def;n.minSize!==null&&r.data.size<n.minSize.value&&(_(r,{code:f.too_small,minimum:n.minSize.value,type:"set",inclusive:!0,exact:!1,message:n.minSize.message}),a.dirty()),n.maxSize!==null&&r.data.size>n.maxSize.value&&(_(r,{code:f.too_big,maximum:n.maxSize.value,type:"set",inclusive:!0,exact:!1,message:n.maxSize.message}),a.dirty());const i=this._def.valueType;function s(c){const l=new Set;for(const h of c){if(h.status==="aborted")return N;h.status==="dirty"&&a.dirty(),l.add(h.value)}return{status:a.value,value:l}}const o=[...r.data.values()].map((c,l)=>i._parse(new X(r,c,r.path,l)));return r.common.async?Promise.all(o).then(c=>s(c)):s(o)}min(e,a){return new Ce({...this._def,minSize:{value:e,message:k.toString(a)}})}max(e,a){return new Ce({...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)}}Ce.create=(t,e)=>new Ce({valueType:t,minSize:null,maxSize:null,typeName:S.ZodSet,...T(e)});class Ct 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})}}Ct.create=(t,e)=>new Ct({getter:t,typeName:S.ZodLazy,...T(e)});class Ke extends E{_parse(e){if(e.data!==this._def.value){const a=this._getOrReturnCtx(e);return _(a,{received:a.data,code:f.invalid_literal,expected:this._def.value}),N}return{status:"valid",value:e.data}}get value(){return this._def.value}}Ke.create=(t,e)=>new Ke({value:t,typeName:S.ZodLiteral,...T(e)});function Wa(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 _(a,{expected:I.joinValues(r),received:a.parsedType,code:f.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 _(a,{received:a.data,code:f.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=Wa;class At extends E{_parse(e){const a=I.getValidEnumValues(this._def.values),r=this._getOrReturnCtx(e);if(r.parsedType!==b.string&&r.parsedType!==b.number){const n=I.objectValues(a);return _(r,{expected:I.joinValues(n),received:r.parsedType,code:f.invalid_type}),N}if(this._cache||(this._cache=new Set(I.getValidEnumValues(this._def.values))),!this._cache.has(e.data)){const n=I.objectValues(a);return _(r,{received:r.data,code:f.invalid_enum_value,options:n}),N}return W(e.data)}get enum(){return this._def.values}}At.create=(t,e)=>new At({values:t,typeName:S.ZodNativeEnum,...T(e)});class Ye extends E{unwrap(){return this._def.type}_parse(e){const{ctx:a}=this._processInputParams(e);if(a.parsedType!==b.promise&&a.common.async===!1)return _(a,{code:f.invalid_type,expected:b.promise,received:a.parsedType}),N;const r=a.parsedType===b.promise?a.data:Promise.resolve(a.data);return W(r.then(n=>this._def.type.parseAsync(n,{path:a.path,errorMap:a.common.contextualErrorMap})))}}Ye.create=(t,e)=>new Ye({type:t,typeName:S.ZodPromise,...T(e)});class de 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),n=this._def.effect||null,i={addIssue:s=>{_(r,s),s.fatal?a.abort():a.dirty()},get path(){return r.path}};if(i.addIssue=i.addIssue.bind(i),n.type==="preprocess"){const s=n.transform(r.data,i);if(r.common.async)return Promise.resolve(s).then(async o=>{if(a.value==="aborted")return N;const c=await this._def.schema._parseAsync({data:o,path:r.path,parent:r});return c.status==="aborted"?N:c.status==="dirty"||a.value==="dirty"?xe(c.value):c});{if(a.value==="aborted")return N;const o=this._def.schema._parseSync({data:s,path:r.path,parent:r});return o.status==="aborted"?N:o.status==="dirty"||a.value==="dirty"?xe(o.value):o}}if(n.type==="refinement"){const s=o=>{const c=n.refinement(o,i);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 o};if(r.common.async===!1){const o=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});return o.status==="aborted"?N:(o.status==="dirty"&&a.dirty(),s(o.value),{status:a.value,value:o.value})}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(o=>o.status==="aborted"?N:(o.status==="dirty"&&a.dirty(),s(o.value).then(()=>({status:a.value,value:o.value}))))}if(n.type==="transform")if(r.common.async===!1){const s=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});if(!be(s))return N;const o=n.transform(s.value,i);if(o instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:a.value,value:o}}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(s=>be(s)?Promise.resolve(n.transform(s.value,i)).then(o=>({status:a.value,value:o})):N);I.assertNever(n)}}de.create=(t,e,a)=>new de({schema:t,typeName:S.ZodEffects,effect:e,...T(a)});de.createWithPreprocess=(t,e,a)=>new de({schema:e,effect:{type:"preprocess",transform:t},typeName:S.ZodEffects,...T(a)});class Q extends E{_parse(e){return this._getType(e)===b.undefined?W(void 0):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}Q.create=(t,e)=>new Q({innerType:t,typeName:S.ZodOptional,...T(e)});class pe extends E{_parse(e){return this._getType(e)===b.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 Qe extends E{_parse(e){const{ctx:a}=this._processInputParams(e);let r=a.data;return a.parsedType===b.undefined&&(r=this._def.defaultValue()),this._def.innerType._parse({data:r,path:a.path,parent:a})}removeDefault(){return this._def.innerType}}Qe.create=(t,e)=>new Qe({innerType:t,typeName:S.ZodDefault,defaultValue:typeof e.default=="function"?e.default:()=>e.default,...T(e)});class et extends E{_parse(e){const{ctx:a}=this._processInputParams(e),r={...a,common:{...a.common,issues:[]}},n=this._def.innerType._parse({data:r.data,path:r.path,parent:{...r}});return We(n)?n.then(i=>({status:"valid",value:i.status==="valid"?i.value:this._def.catchValue({get error(){return new te(r.common.issues)},input:r.data})})):{status:"valid",value:n.status==="valid"?n.value:this._def.catchValue({get error(){return new te(r.common.issues)},input:r.data})}}removeCatch(){return this._def.innerType}}et.create=(t,e)=>new et({innerType:t,typeName:S.ZodCatch,catchValue:typeof e.catch=="function"?e.catch:()=>e.catch,...T(e)});class ua extends E{_parse(e){if(this._getType(e)!==b.nan){const r=this._getOrReturnCtx(e);return _(r,{code:f.invalid_type,expected:b.nan,received:r.parsedType}),N}return{status:"valid",value:e.data}}}ua.create=t=>new ua({typeName:S.ZodNaN,...T(t)});class qa 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 Zt extends E{_parse(e){const{status:a,ctx:r}=this._processInputParams(e);if(r.common.async)return(async()=>{const i=await this._def.in._parseAsync({data:r.data,path:r.path,parent:r});return i.status==="aborted"?N:i.status==="dirty"?(a.dirty(),xe(i.value)):this._def.out._parseAsync({data:i.value,path:r.path,parent:r})})();{const n=this._def.in._parseSync({data:r.data,path:r.path,parent:r});return n.status==="aborted"?N:n.status==="dirty"?(a.dirty(),{status:"dirty",value:n.value}):this._def.out._parseSync({data:n.value,path:r.path,parent:r})}}static create(e,a){return new Zt({in:e,out:a,typeName:S.ZodPipeline})}}class tt extends E{_parse(e){const a=this._def.innerType._parse(e),r=n=>(be(n)&&(n.value=Object.freeze(n.value)),n);return We(a)?a.then(n=>r(n)):r(a)}unwrap(){return this._def.innerType}}tt.create=(t,e)=>new tt({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 m=Y.create,H=ve.create,yn=xt.create;oe.create;const j=G.create,A=M.create;Ge.create;const Ga=Dt.create;Xe.create;ue.create;const Xa=Je.create,ae=Ke.create,z=he.create;Ye.create;Q.create;pe.create;const Ut=de.createWithPreprocess;var ha=".fabric/agents/",kn=["L0","L1","L2"],wn=["mirror","cross-cutting"],xn=z(kn),Nn=z(wn),Sn=A({file:m(),scope_glob:m(),deps:j(m()),priority:z(["high","medium","low"]),layer:xn,topology_type:Nn,hash:m()}),Tn=Ut(t=>!$n(t)||typeof t.file!="string"?t:Et(t),Sn),Cn=A({revision:m(),nodes:Xa(Tn)});function Et(t){return{...t,layer:t.layer??An(t.file),topology_type:t.topology_type??En(t.file)}}function An(t){const e=Ka(t);if(e==="AGENTS.md")return"L0";if(Ja(e))return"L1";const a=In(e),r=Rn(a);return r===0?"L0":r<=2?"L1":"L2"}function En(t){return Ja(Ka(t))?"cross-cutting":"mirror"}function In(t){return t.startsWith(ha)?t.slice(ha.length):t}function Rn(t){const e=t.split("/").filter(Boolean);return Math.max(e.length-1,0)}function Ja(t){return t.split("/").includes("_cross")}function Ka(t){return t.replaceAll("\\","/")}function $n(t){return typeof t=="object"&&t!==null}var On=z(["ai","human"]),Ya=Ut(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}},H().int().nonnegative());A({source:On.optional(),since:Ya.optional()});A({ledger_id:m().trim().min(1).optional(),ts:Ya.optional()}).superRefine((t,e)=>{[t.ledger_id,t.ts].filter(r=>r!==void 0).length!==1&&e.addIssue({code:f.custom,message:"Provide exactly one of ledger_id or ts.",path:["ledger_id"]})});A({file:m().min(1),start_line:H().int().positive(),end_line:H().int().positive(),new_hash:m().min(1)});A({file:m().min(1)});A({ledger_entry_id:m().min(1),annotation:m().trim().min(1)});var Qa={id:m().optional(),ts:H().int().nonnegative(),intent:m(),affected_paths:j(m())},Ln=A({...Qa,source:ae("ai"),commit_sha:m().optional()}),jn=A({...Qa,source:ae("human"),parent_sha:m(),parent_ledger_entry_id:m().optional(),diff_stat:m(),annotation:m().optional()}),Pn=Ga("source",[Ln,jn]),Fn=Ut(t=>t&&typeof t=="object"&&!Array.isArray(t)&&(!("source"in t)||t.source===void 0)?{...t,source:"human"}:t,Pn),Ae=A({file:m(),start_line:H().int().nonnegative(),end_line:H().int().nonnegative(),hash:m()});A({locked:j(Ae).optional()});var pa=z(["strict","warn","off"]),Mn=A({claudeCodeCLI:m().optional(),claudeCodeDesktop:m().optional(),cursor:m().optional(),windsurf:m().optional(),rooCode:m().optional(),geminiCLI:m().optional(),codexCLI:m().optional()});A({clientPaths:Mn.optional(),externalFixturePath:m().optional(),scanIgnores:j(m()).optional(),auditMode:pa.optional(),audit_mode:pa.optional()});var Dn=A({path:m(),lines:m(),snippet:m(),pattern_hint:m()}),Zn=A({file:m(),line:m(),snippet:m()}),Un=A({ratio:H().min(0).max(1),total:H().int().nonnegative(),matched:H().int().nonnegative(),co_occurring_patterns:j(m())}),Hn=A({type:z(["framework","pattern","invariant","domain"]),statement:m(),confidence:z(["HIGH","MEDIUM","LOW"]),evidence:j(Zn),coverage:Un,proposed_rule:m().optional(),alternatives:j(m()).optional()}),Vn=A({total_files:H().int().nonnegative(),by_ext:Xa(H().int().nonnegative()),key_dirs:j(m()),max_depth:H().int().nonnegative()}),Bn=A({path:m(),reason:m(),size_bytes:H().int().nonnegative().optional()}),zn=A({kind:m(),version:m(),subkind:m(),evidence:j(m())}),Wn=A({quality:z(["missing","stub","ok"]),line_count:H().int().nonnegative(),has_contributing:yn()}),qn=A({path:m(),family:z(["entry","component","config","test","domain"]),rationale:m()}),Gn=A({max_files:ae(15),max_lines_per_file:ae(100)}),Xn=A({version:m(),generated_at:m(),generated_by:m(),target:m(),project_name:m(),framework:zn,topology:Vn,entry_points:j(Bn),code_samples:j(Dn),assertions:j(Hn),candidate_files:j(qn),sampling_budget:Gn,readme:Wn,recommendations_for_skill:j(m()).optional()}),Jn=A({kind:m(),version:m(),subkind:m()}),Kn=A({confidence:z(["HIGH","MEDIUM","LOW"]),evidence_refs:j(m())}),Yn=A({file:m(),lines:m()}),Qn=A({type:z(["ban","require","protect"]),rule:m(),rationale:m().optional(),confidence_snapshot:Kn.optional(),source_evidence:j(Yn).optional()}),ei=A({name:m(),paths:j(m()),summary:m().optional(),topology_type:z(["mirror","cross-cutting"]).optional(),target_path:m().optional()}),ti=A({phase:m(),question:m(),answer:m(),presentation:m().optional(),user_corrections:j(m()).optional()});A({framework:Jn,architecture_patterns:j(m()),invariants:j(Qn),domain_groups:j(ei),interview_trail:j(ti),forensic_ref:m()});var ai=A({type:ae("meta:updated"),payload:Cn}),ri=A({type:ae("lock:drift"),payload:A({locked:j(Ae),drifted:j(Ae)})}),ni=A({type:ae("lock:approved"),payload:A({locked:j(Ae),approved:j(Ae)})}),ii=A({type:ae("ledger:appended"),payload:Fn}),si=A({type:ae("drift:detected"),payload:Xn});Ga("type",[ai,ri,ni,ii,si]);function oi({lastEvent:t}){const{t:e}=B(),[a,r]=L(null),[n,i]=L([]),[s,o]=L(null),[c,l]=L(""),[h,u]=L(null),g=async()=>{try{const[w,x]=await Promise.all([yr(),Fa().catch(()=>[])]);r(w),i(x),u(null)}catch(w){u(w instanceof Error?w.message:String(w))}};V(()=>{g()},[]),V(()=>{(t?.type==="meta:updated"||t?.type==="drift:detected"||t?.type==="lock:drift")&&g()},[t]);const p=ee(()=>new Set(n.map(w=>w.file)),[n]),v=ee(()=>a===null?[]:er(a,p,c),[a,p,c]),C=s===null?null:a?.nodes[s]??null;return d("section",{className:"view",children:[d(Ie,{title:e("dashboard.rules-tree.title"),subtitle:e("dashboard.rules-tree.subtitle")}),h!==null?d(se,{kind:"banner",severity:"stale",message:h}):null,d("div",{className:"view-split",children:[d("div",{className:"tree-panel",children:[d("div",{className:"tree-filter",children:[d("input",{value:c,onInput:w=>l(w.currentTarget.value),placeholder:e("dashboard.rules-tree.filter.placeholder"),"aria-label":e("dashboard.rules-tree.filter.aria-label")}),d("button",{className:"ghost-button",type:"button",onClick:()=>{g()},children:e("dashboard.shared.refresh")})]}),d("div",{className:"status-line",children:[d("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})}),d("span",{children:e("dashboard.rules-tree.status.locks",{count:String(n.length)})})]}),d("div",{className:"tree",role:"tree","aria-label":e("dashboard.rules-tree.tree.aria-label"),children:v.length>0?v.map(w=>d(Mt,{...w,selected:w.node.file===s,onSelect:o},w.node.file)):d("div",{className:"empty-card",children:e("dashboard.rules-tree.empty")})})]}),d("aside",{className:"detail-panel",children:[d("h3",{children:e("dashboard.rules-tree.detail.title")}),C===null?d("p",{className:"muted",children:e("dashboard.rules-tree.detail.empty")}):d("div",{className:"kv",children:[d(Le,{label:e("dashboard.rules-tree.detail.file"),value:C.file}),d(Le,{label:e("dashboard.rules-tree.detail.scope"),value:C.scope_glob}),d(Le,{label:e("dashboard.rules-tree.detail.priority"),value:C.priority}),d(Le,{label:e("dashboard.rules-tree.detail.hash"),value:C.hash}),d("pre",{className:"code",children:C.deps.length>0?C.deps.join(`
10
- `):e("dashboard.rules-tree.detail.no-deps")})]})]})]})]})}function Ie({title:t,subtitle:e}){return d("div",{className:"view-header",children:d("div",{children:[d("h1",{className:"view-title",children:t}),d("p",{className:"view-subtitle",children:e})]})})}function Le({label:t,value:e}){return d("div",{className:"kv-row",children:[d("span",{className:"kv-key",children:t}),d("span",{className:"kv-value",children:e})]})}function er(t,e,a){const r=a.trim().toLowerCase(),n=Object.values(t.nodes).filter(o=>r.length===0||JSON.stringify(o).toLowerCase().includes(r)).sort((o,c)=>o.file.localeCompare(c.file)),i=new Map;for(const o of n){const c=o.file.split("/")[0]??"root";i.set(c,[...i.get(c)??[],o])}return[{node:Et({file:`revision:${t.revision}`,scope_glob:"**/*",deps:[],priority:"high",hash:t.revision}),level:0,defaultExpanded:!0,children:Array.from(i.entries()).map(([o,c])=>({node:Et({file:o,scope_glob:`${o}/**/*`,deps:[],priority:"medium",hash:`${c.length} nodes`}),level:1,defaultExpanded:!0,children:c.map(l=>({node:l,level:2,humanLockedNearby:e.has(l.file),staleReason:l.hash.length===0?"hash-mismatch":null}))}))}]}function di({lastEvent:t}){const{locale:e,t:a}=B(),[r,n]=L(null),[i,s]=L(!0),[o,c]=L(null),l=async()=>{s(!0);try{n(await kr()),c(null)}catch(h){c(h instanceof Error?h.message:String(h))}finally{s(!1)}};return V(()=>{l()},[]),V(()=>{(t?.type==="meta:updated"||t?.type==="lock:approved"||t?.type==="lock:drift"||t?.type==="ledger:appended"||t?.type==="drift:detected")&&l()},[t]),d("section",{className:"view",children:[d(Ie,{title:a("dashboard.doctor.title"),subtitle:a("dashboard.doctor.subtitle")}),o!==null?d(se,{kind:"banner",severity:"stale",message:o}):null,d("div",{className:"filter-bar doctor-toolbar",children:[d("span",{className:"filter-label",children:a("dashboard.doctor.toolbar.overall")}),d(se,{kind:"pill",severity:tr(r?.status??"warn"),message:a(r===null?"dashboard.shared.loading":`dashboard.shared.status.${r.status}`)}),d("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:mt(r.summary.framework,a),count:"1"}):a("dashboard.doctor.toolbar.entry-points-summary",{framework:mt(r.summary.framework,a),count:String(r.summary.entryPoints.length)})}),d("button",{className:"ghost-button",type:"button",onClick:()=>{l()},children:a("dashboard.shared.refresh")})]}),i&&r===null?d("div",{className:"empty-card",children:a("dashboard.doctor.empty.loading")}):null,r!==null?d("div",{className:"doctor-layout",children:[d("div",{className:"doctor-summary-grid",children:[d(ft,{label:a("dashboard.doctor.summary.framework"),value:mt(r.summary.framework,a),detail:r.summary.metaRevision===null?a("dashboard.doctor.summary.no-meta-revision"):`rev ${r.summary.metaRevision}`}),d(ft,{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)})}),d(ft,{label:a("dashboard.doctor.summary.intent-ledger"),value:ci(r.summary.lastLedgerEntryAgeMs,a),detail:r.summary.lastLedgerEntryTs===null?a("dashboard.doctor.summary.no-ledger-entries"):new Date(r.summary.lastLedgerEntryTs).toLocaleString(e)})]}),d("div",{className:"doctor-panels",children:[d("article",{className:"doctor-card",children:[d("div",{className:"doctor-card-head",children:[d("h3",{children:a("dashboard.doctor.card.entry-points")}),d("span",{children:r.summary.entryPoints.length})]}),r.summary.entryPoints.length>0?d("div",{className:"doctor-entry-list",children:r.summary.entryPoints.map(h=>d("div",{className:"doctor-entry",children:[d("strong",{children:h.path}),d("span",{children:h.reason})]},`${h.path}:${h.reason}`))}):d("div",{className:"empty-card doctor-empty",children:a("dashboard.doctor.empty.entry-points")})]}),d("article",{className:"doctor-card",children:[d("div",{className:"doctor-card-head",children:[d("h3",{children:a("dashboard.doctor.card.checks")}),d("span",{children:r.checks.length})]}),d("div",{className:"doctor-check-list",children:r.checks.map(h=>d(li,{check:h},h.name))})]})]})]}):null]})}function ft({label:t,value:e,detail:a}){return d("article",{className:"doctor-summary-card",children:[d("span",{className:"doctor-summary-label",children:t}),d("strong",{className:"doctor-summary-value",children:e}),d("span",{className:"doctor-summary-detail",children:a})]})}function li({check:t}){const{t:e}=B();return d("div",{className:`doctor-check doctor-check-${t.status}`,children:[d("div",{className:"doctor-check-head",children:[d("strong",{children:t.name}),d(se,{kind:"pill",severity:tr(t.status),message:e(`dashboard.shared.status.${t.status}`)})]}),d("p",{children:t.message})]})}function tr(t){switch(t){case"ok":return"ok";case"warn":return"locked";case"error":return"stale"}}function mt(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 ci(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 n=Math.floor(r/60);if(n<48)return e("dashboard.doctor.age.hours",{count:String(n)});const i=Math.floor(n/24);return i<14?e("dashboard.doctor.age.days",{count:String(i)}):e("dashboard.doctor.age.weeks",{count:String(Math.floor(i/7))})}function ui({lastEvent:t}){const{locale:e,t:a}=B(),[r,n]=L([]),[i,s]=L(null),[o,c]=L(null),[l,h]=L(!1),[u,g]=L(null),p=async()=>{try{const y=(await Pa()).sort((O,U)=>O.ts-U.ts);n(y),s(O=>y.length===0?null:O!==null&&y.some(U=>U.id===O)?O:y.at(-1)?.id??null),g(null)}catch(y){g(y instanceof Error?y.message:String(y))}};V(()=>{p()},[]),V(()=>{t?.type==="ledger:appended"&&p()},[t]),V(()=>{if(i===null){c(null);return}let y=!1;return h(!0),Nr({ledgerId:i}).then(O=>{y||(c(O),g(null))}).catch(O=>{y||(c(null),g(O instanceof Error?O.message:String(O)))}).finally(()=>{y||h(!1)}),()=>{y=!0}},[i]);const v=ee(()=>r.findIndex(y=>y.id===i),[r,i]),C=v>=0?r[v]??null:null,w=C===null?a("dashboard.history-replay.selected.none"):new Date(C.ts).toLocaleString(e),x=ee(()=>o===null?[]:er(o.meta,new Set,""),[o]);return d("section",{className:"view",children:[d(Ie,{title:a("dashboard.history-replay.title"),subtitle:a("dashboard.history-replay.subtitle")}),u!==null?d(se,{kind:"banner",severity:"stale",message:u}):null,d("div",{className:"filter-bar history-toolbar",children:[d("span",{className:"filter-label",children:a("dashboard.history-replay.toolbar.scrub")}),d("input",{className:"history-slider",type:"range",min:"0",max:Math.max(r.length-1,0),value:v>=0?v:0,disabled:r.length===0,onInput:y=>{const O=Number.parseInt(y.currentTarget.value,10),U=r[O];U?.id!==void 0&&s(U.id)}}),d("span",{className:"filter-date",children:w}),d("button",{className:"ghost-button",type:"button",disabled:r.length===0,onClick:()=>s(r.at(-1)?.id??null),children:a("dashboard.history-replay.toolbar.latest")})]}),d("div",{className:"view-split history-layout",children:[d("div",{className:"tree-panel history-timeline-panel",children:[d("div",{className:"status-line",children:[d("span",{children:a("dashboard.history-replay.status.replay-points",{count:String(r.length)})}),d("span",{children:a("dashboard.history-replay.status.entries-applied",{count:String(o?.metadata.replayed_count??0)})})]}),d("div",{className:"history-timeline-list",children:r.length>0?[...r].reverse().map(y=>d("div",{className:`history-timeline-item ${y.id===i?"selected":""}`,role:"button",tabIndex:0,onClick:()=>s(y.id??null),onKeyDown:O=>{(O.key==="Enter"||O.key===" ")&&(O.preventDefault(),s(y.id??null))},children:d(Va,{entry:y,readOnly:!0})},y.id??`${y.source}:${y.ts}:${y.intent}`)):d("div",{className:"empty-card",children:a("dashboard.history-replay.empty.entries")})})]}),d("div",{className:"tree-panel",children:[d("div",{className:"tree-filter history-state-head",children:d("div",{children:[d("div",{className:"history-state-title",children:a("dashboard.history-replay.state.title",{label:w})}),d("div",{className:"meta-line",children:a("dashboard.history-replay.state.meta",{ledgerId:o?.metadata.at_ledger_id??a("dashboard.history-replay.meta.na"),commit:o?.metadata.at_commit??a("dashboard.history-replay.meta.not-available"),mode:o?.metadata.mode??a("dashboard.history-replay.meta.pending")})})]})}),d("div",{className:"status-line",children:[d("span",{children:o===null?a("dashboard.history-replay.status.loading"):a("dashboard.history-replay.status.nodes",{count:String(Object.keys(o.meta.nodes).length)})}),d("span",{children:o?.meta.revision??a("dashboard.history-replay.status.unknown-revision")})]}),d("div",{className:"tree",role:"tree","aria-label":a("dashboard.history-replay.tree.aria-label"),children:[l?d("div",{className:"empty-card",children:a("dashboard.history-replay.empty.loading")}):null,!l&&x.length>0?x.map(y=>d(Mt,{...y,readOnly:!0},y.node.file)):null,!l&&x.length===0?d("div",{className:"empty-card",children:a("dashboard.history-replay.empty.select")}):null]})]})]})]})}function hi({lastEvent:t}){const{t:e}=B(),[a,r]=L([]),[n,i]=L("all"),[s,o]=L(null),[c,l]=L(null),h=async()=>{try{r(await Fa()),l(null)}catch(v){l(v instanceof Error?v.message:String(v))}};V(()=>{h()},[]),V(()=>{(t?.type==="lock:drift"||t?.type==="lock:approved")&&h()},[t]);const u=ee(()=>({all:a.length,drift:a.filter(v=>v.drift).length,approved:a.filter(v=>!v.drift).length}),[a]),g=a.filter(v=>n==="all"||(n==="drift"?v.drift:!v.drift)),p=async v=>{const C=a.find(w=>le(w)===le(v));if(C!==void 0){o(le(v));try{const w=await wr({file:C.file,start_line:C.start_line,end_line:C.end_line,new_hash:C.current_hash});r(x=>x.map(y=>le(y)===le(v)?w.entry:y)),l(null)}catch(w){throw l(w instanceof Error?w.message:String(w)),w}finally{o(null)}}};return d("section",{className:"view",children:[d(Ie,{title:e("dashboard.human-lock.title"),subtitle:e("dashboard.human-lock.subtitle")}),c!==null?d(se,{kind:"banner",severity:"drift",message:c}):null,d("div",{className:"filter-bar",role:"tablist","aria-label":e("dashboard.human-lock.filters.aria-label"),children:[["all","drift","approved"].map(v=>d("button",{className:`filter-chip ${n===v?"active":""} ${v}`,type:"button",role:"tab","aria-selected":n===v,onClick:()=>i(v),children:[e(`dashboard.human-lock.filters.${v}`),d("span",{className:"count",children:u[v]})]},v)),d("span",{className:"filter-date",children:e("dashboard.human-lock.summary",{drift:String(u.drift),approved:String(u.approved)})})]}),d("div",{className:"lock-grid",children:g.length>0?g.map(v=>d(Br,{entry:v,currentHash:v.current_hash,onApprove:p,busy:s===le(v)},le(v))):d("div",{className:"empty-card",children:e("dashboard.human-lock.empty")})})]})}function le(t){return`${t.file}:${t.start_line}:${t.end_line}`}function pi({lastEvent:t}){const{t:e}=B(),[a,r]=L([]),[n,i]=L("all"),[s,o]=L(null),c=async()=>{try{r((await Pa()).sort((p,v)=>v.ts-p.ts)),o(null)}catch(p){o(p instanceof Error?p.message:String(p))}};V(()=>{c()},[]),V(()=>{t?.type==="ledger:appended"&&r(p=>[t.payload,...p].sort((v,C)=>C.ts-v.ts))},[t]);const l=ee(()=>a.filter(p=>n==="all"||p.source===n),[a,n]),h=a.filter(p=>p.source==="ai").length,u=a.length-h,g=async(p,v)=>{if(p.id===void 0)throw new Error(e("dashboard.intent-timeline.annotate.missing-id"));const C=await xr({ledger_entry_id:p.id,annotation:v});C.created&&r(w=>[C.entry,...w].sort((x,y)=>y.ts-x.ts))};return d("section",{className:"view",children:[d(Ie,{title:e("dashboard.intent-timeline.title"),subtitle:e("dashboard.intent-timeline.subtitle")}),s!==null?d("div",{className:"empty-card",children:s}):null,d("div",{className:"filter-bar",children:[d("span",{className:"filter-label",children:e("dashboard.intent-timeline.filter.label")}),d("button",{className:`filter-chip ${n==="all"?"active":""}`,type:"button",onClick:()=>i("all"),children:[e("dashboard.intent-timeline.filter.all")," ",a.length]}),d(kt,{source:"ai",interactive:!0,selected:n==="ai",onClick:()=>i("ai")}),d(kt,{source:"human",interactive:!0,selected:n==="human",onClick:()=>i("human")}),d("span",{className:"filter-date",children:e("dashboard.intent-timeline.summary",{aiCount:String(h),humanCount:String(u)})})]}),d("div",{className:"col-headers",children:[d("div",{className:"col-head ai",children:[d("strong",{children:e("dashboard.intent-timeline.columns.ai.title")}),d("span",{children:e("dashboard.intent-timeline.columns.ai.entries",{count:String(h)})})]}),d("div",{className:"col-head human",children:[d("strong",{children:e("dashboard.intent-timeline.columns.human.title")}),d("span",{children:e("dashboard.intent-timeline.columns.human.entries",{count:String(u)})})]})]}),d("div",{className:"timeline-grid",children:[d("div",{className:"axis",children:d("div",{className:"axis-line"})}),l.length>0?l.map(p=>d(Va,{entry:p,onAnnotate:g},p.id??`${p.source}:${p.ts}:${p.intent}`)):d("div",{className:"empty-card timeline-empty",children:e("dashboard.intent-timeline.empty")})]})]})}function fi(){return d(Hr,{children:d(mi,{})})}function mi(){const{t}=B(),[e,a]=L(fa()),r=Lr(),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")}];V(()=>{const s=()=>a(fa());return window.addEventListener("hashchange",s),window.location.hash===""&&(window.location.hash="#/rules"),()=>window.removeEventListener("hashchange",s)},[]);const i=ee(()=>n.find(s=>s.id===e)??n[0],[e]);return d(_i,{connected:r.connected,port:ma(),activeRoute:i.id,children:[d("aside",{className:"sidebar",children:[d("div",{className:"brand",children:[d("span",{className:"brand-logo",children:"F"}),d("span",{children:"fabric"}),d("span",{className:"brand-version",children:"v1.3.0"})]}),d("nav",{"aria-label":t("dashboard.app.nav.aria-label"),children:n.map(s=>d("a",{className:`nav-item ${s.id===e?"active":""}`,href:s.hash,"aria-current":s.id===e?"page":void 0,children:[d("span",{className:"dot","aria-hidden":"true"}),d("span",{children:s.label}),d("small",{children:s.subtitle})]},s.id))}),d("div",{className:"nav-section",children:t("dashboard.app.nav.section.diagnostics")}),d("span",{className:"nav-item muted-nav",children:[d("span",{className:"dot"}),t("dashboard.app.nav.drift-check")]})]}),d("main",{className:"main",children:[d("header",{className:"header",children:[d("div",{className:"breadcrumb",children:[d("span",{children:window.location.pathname==="/"?"~":window.location.pathname}),d("span",{className:"sep",children:"/"}),d("strong",{children:i.breadcrumb})]}),d("div",{className:"header-actions",children:[d("span",{className:`badge-live ${r.connected?"connected":"disconnected"}`,children:[d("span",{className:"pulse","aria-hidden":"true"}),r.connected?t("dashboard.app.header.connected"):t("dashboard.app.header.connecting")]}),d("span",{className:"port-label",children:[":",ma()," /events"]})]})]}),e==="rules"?d(oi,{lastEvent:r.lastEvent}):null,e==="locks"?d(hi,{lastEvent:r.lastEvent}):null,e==="timeline"?d(pi,{lastEvent:r.lastEvent}):null,e==="history"?d(ui,{lastEvent:r.lastEvent}):null,e==="doctor"?d(di,{lastEvent:r.lastEvent}):null]}),d("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 _i({connected:t,port:e,activeRoute:a,children:r}){return d("div",{className:`app-shell ${t?"is-connected":"is-disconnected"}`,"data-port":e,"data-route":a,children:r})}function fa(){switch(window.location.hash){case"#/locks":return"locks";case"#/timeline":return"timeline";case"#/history":return"history";case"#/doctor":return"doctor";default:return"rules"}}function ma(){const t=Number.parseInt(window.location.port,10);return Number.isFinite(t)?t:7373}const ar=document.getElementById("app");if(ar===null)throw new Error("Fabric Dashboard root element #app was not found.");cr(d(fi,{}),ar);