@nelsonlongxiang/dsh-open-a2a-net 0.6.31 → 0.6.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/README.md +4 -1
  2. package/README_zh.md +3 -0
  3. package/assets/nexusDist/assets/index-D5H8R8de.js +9 -0
  4. package/assets/nexusDist/assets/index-D9GYZyGZ.css +1 -0
  5. package/assets/nexusDist/index.html +2 -2
  6. package/cli/a2a.mjs +445 -57
  7. package/lib/a2a-client.js +9 -4
  8. package/lib/auth-observer.js +254 -0
  9. package/lib/blob-store.js +210 -0
  10. package/lib/card.js +4 -2
  11. package/lib/cli-deposit.js +122 -7
  12. package/lib/client.js +64 -64
  13. package/lib/client.js.map +1 -1
  14. package/lib/faces/admin.js +133 -43
  15. package/lib/faces/canvas-notify.js +12 -3
  16. package/lib/faces/files.js +155 -0
  17. package/lib/faces/nodes.js +171 -0
  18. package/lib/faces/session-log.js +162 -0
  19. package/lib/faces/wire.js +206 -39
  20. package/lib/index.js +809 -1720
  21. package/lib/joined-store.js +23 -0
  22. package/lib/ledger-conservation.js +97 -0
  23. package/lib/legacy/teams-bridge-inbound.js +156 -0
  24. package/lib/node-bind.js +534 -0
  25. package/lib/node-github.js +72 -0
  26. package/lib/node-self.js +453 -0
  27. package/lib/node-store.js +484 -0
  28. package/lib/node-tasks.js +342 -0
  29. package/lib/origin-claim.js +246 -0
  30. package/lib/peer-directory.js +134 -0
  31. package/lib/receipt.js +26 -1
  32. package/lib/skill/SKILL.md +3 -1
  33. package/lib/skill/references/cli.md +82 -3
  34. package/lib/skill/references/collaboration.md +126 -74
  35. package/lib/skill/references/discovery.md +29 -0
  36. package/lib/skill/references/intake.md +107 -0
  37. package/lib/skill/references/router.md +96 -0
  38. package/lib/skill/references/setup.md +2 -1
  39. package/lib/task-auth.js +483 -0
  40. package/lib/task-ledger.js +324 -12
  41. package/lib/team-store.js +24 -1
  42. package/lib/tools/act.js +383 -0
  43. package/lib/tools/files.js +201 -0
  44. package/lib/tools/info.js +684 -0
  45. package/lib/types/a2a-client.d.ts +10 -4
  46. package/lib/types/auth-observer.d.ts +110 -0
  47. package/lib/types/blob-store.d.ts +83 -0
  48. package/lib/types/cli-deposit.d.ts +38 -0
  49. package/lib/types/faces/admin.d.ts +14 -2
  50. package/lib/types/faces/canvas-notify.d.ts +4 -1
  51. package/lib/types/faces/files.d.ts +53 -0
  52. package/lib/types/faces/nodes.d.ts +69 -0
  53. package/lib/types/faces/session-log.d.ts +44 -0
  54. package/lib/types/faces/wire.d.ts +50 -5
  55. package/lib/types/index.d.ts +27 -0
  56. package/lib/types/joined-store.d.ts +9 -0
  57. package/lib/types/ledger-conservation.d.ts +77 -0
  58. package/lib/types/legacy/teams-bridge-inbound.d.ts +94 -0
  59. package/lib/types/node-bind.d.ts +220 -0
  60. package/lib/types/node-github.d.ts +35 -0
  61. package/lib/types/node-self.d.ts +178 -0
  62. package/lib/types/node-store.d.ts +180 -0
  63. package/lib/types/node-tasks.d.ts +121 -0
  64. package/lib/types/origin-claim.d.ts +119 -0
  65. package/lib/types/peer-directory.d.ts +39 -0
  66. package/lib/types/receipt.d.ts +12 -0
  67. package/lib/types/task-auth.d.ts +271 -0
  68. package/lib/types/task-ledger.d.ts +143 -6
  69. package/lib/types/team-store.d.ts +9 -0
  70. package/lib/types/tools/act.d.ts +52 -0
  71. package/lib/types/tools/files.d.ts +38 -0
  72. package/lib/types/tools/info.d.ts +102 -0
  73. package/lib/types/types.d.ts +6 -0
  74. package/nexus-stage/src/canvas-ops.ts +1 -1
  75. package/nexus-stage/src/federation.ts +1 -0
  76. package/nexus-stage/src/main.ts +41 -18
  77. package/nexus-stage/src/planning-member-handles.ts +34 -0
  78. package/nexus-stage/src/planning-mirror.ts +47 -3
  79. package/nexus-stage/src/planning-reachability.ts +28 -0
  80. package/nexus-stage/src/planning-types.ts +1 -1
  81. package/nexus-stage/src/planning-view.ts +29 -26
  82. package/nexus-stage/src/planning.css +4 -0
  83. package/nexus-stage/src/wb-directory.ts +13 -0
  84. package/nexus-stage/src/workbench.css +3 -0
  85. package/nexus-stage/src/workbench.ts +5 -1
  86. package/package.json +1 -1
  87. package/assets/nexusDist/assets/index-Dz8N80tI.css +0 -1
  88. package/assets/nexusDist/assets/index-jm-cFAhB.js +0 -9
@@ -1 +0,0 @@
1
- #dsh-plan *,#dsh-plan *:before,#dsh-plan *:after{box-sizing:border-box}#dsh-plan{--uupm-ink-0:var(--n-ink,#dde3f0);--uupm-ink-1:var(--n-ink-muted,#7a86a0);--uupm-bg-0:var(--n-bg,#060a12);--uupm-bg-1:var(--n-panel,#0d1322);--uupm-bg-2:var(--n-raised,#131b2e);--uupm-accent:var(--n-accent,#9673f7);--uupm-live:var(--n-live,#4ade80);--uupm-cold:var(--n-cold,#7a86a0);--uupm-edge-member:var(--n-canvas,#22d3ee);--uupm-warn:var(--n-act,#f59e0b);--uupm-error:var(--n-danger,#f87171);--uupm-indigo:var(--n-federal,#6366f1);--uupm-wash-5:color-mix(in srgb,var(--uupm-accent) 5%,transparent);--uupm-wash-8:color-mix(in srgb,var(--uupm-accent) 8%,transparent);--uupm-wash-12:color-mix(in srgb,var(--uupm-accent) 12%,transparent);--uupm-wash-15:color-mix(in srgb,var(--uupm-accent) 15%,transparent);--uupm-wash-18:color-mix(in srgb,var(--uupm-accent) 18%,transparent);--surface:var(--uupm-bg-1);--ink:var(--uupm-ink-0);--ink-muted:var(--uupm-ink-1);--accent:var(--uupm-accent);--edge-live:var(--uupm-live);--edge-cold:var(--uupm-cold);--federal:var(--uupm-indigo);--card-bg:var(--surface);--card-line:var(--n-card-line,#5c6680);--card-line-hover:var(--uupm-ink-1);--toolbar-bg:color-mix(in srgb,var(--uupm-bg-1) 92%,transparent);--grid-dot:color-mix(in srgb,var(--uupm-ink-1) 22%,transparent);--scrim:color-mix(in srgb,var(--uupm-bg-0) 60%,transparent);--error-ink:var(--n-error-ink,#fecaca);--error-panel:var(--n-error-panel,#2a0d10f2)}#dsh-plan{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;background:var(--uupm-bg-0);color:var(--ink);font-size:13px;line-height:1.5;outline:none}#dsh-plan .mono{font-family:ui-monospace,Cascadia,Consolas,monospace}#dsh-plan:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}#dsh-plan .p-grid{position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;pointer-events:none;background-image:radial-gradient(circle,var(--grid-dot) 1px,transparent 1px);background-size:24px 24px;background-position:0 0}#dsh-plan .p-world{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;transform-origin:0 0}#dsh-plan .p-layer{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}#dsh-plan .p-edges{position:absolute;overflow:visible;width:100%;height:100%;pointer-events:none}#dsh-plan .p-frame{pointer-events:none}#dsh-plan .p-frame-head,#dsh-plan .p-node{pointer-events:auto}#dsh-plan .e-member{stroke:var(--uupm-edge-member);stroke-opacity:.38;stroke-width:1.5}#dsh-plan .e-member.dashed{stroke-dasharray:3 4}#dsh-plan .p-frame{--frame-ink:var(--frame-line,#8B5CF6)}@media (prefers-color-scheme: light){#dsh-plan .p-frame{--frame-ink:color-mix(in srgb,var(--frame-line,#8B5CF6) 72%,black)}}#dsh-plan .p-frame{position:absolute;border:1px solid var(--frame-ink);border-radius:10px;background:var(--frame-bg,var(--uupm-wash-5));min-width:120px;min-height:60px}#dsh-plan .p-frame-head{position:absolute;top:-13px;left:50%;transform:translate(-50%);height:24px;padding:0 10px;border-radius:6px;display:flex;gap:8px;align-items:center;background:var(--uupm-bg-2);border:1px solid var(--frame-ink);font-size:12px;font-weight:600;letter-spacing:.02em;white-space:nowrap;cursor:grab}#dsh-plan .p-frame-head:active{cursor:grabbing}#dsh-plan .p-frame-head:hover{border-color:var(--card-line-hover)}#dsh-plan .p-frame-head .cnt{color:var(--ink-muted);font-weight:400}#dsh-plan .p-frame-head .route{font-size:10.5px;color:var(--ink-muted)}#dsh-plan .p-frame.is-mirror{border-style:dashed}#dsh-plan .p-frame.is-syncing .p-frame-head .route{color:var(--accent)}#dsh-plan .p-node{position:absolute;width:172px;height:56px;padding:8px 26px 8px 14px;background:var(--card-bg);border:1px solid var(--card-line);border-left:3px solid var(--edge-live);border-radius:8px;cursor:grab;-webkit-user-select:none;user-select:none;transition:border-color .12s cubic-bezier(.2,0,0,1),transform .12s cubic-bezier(.2,0,0,1)}#dsh-plan .p-node:hover{border-color:var(--card-line-hover)}#dsh-plan .p-node:active{cursor:grabbing}#dsh-plan .p-node:focus-visible{outline:2px solid var(--accent);outline-offset:2px}#dsh-plan .p-node.selected{outline:2px solid var(--accent);outline-offset:1px}#dsh-plan .p-node.dragging{transform:scale(1.02);border-color:var(--accent)}#dsh-plan .p-node.cold{border-left-color:var(--edge-cold)}#dsh-plan .p-node .nm{font-weight:600;display:flex;align-items:center;gap:7px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#dsh-plan .p-node .nm-text{min-width:0;overflow:hidden;white-space:normal;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:1.25}#dsh-plan .p-node.remote .nm-text{overflow-wrap:anywhere}#dsh-plan .p-node .dot{width:8px;height:8px;border-radius:50%;background:var(--edge-live);flex:none}#dsh-plan .p-node.cold .dot{background:transparent;border:1.5px solid var(--edge-cold)}#dsh-plan .p-node .sub{font-size:11px;color:var(--ink-muted);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#dsh-plan .p-node.pulse{box-shadow:0 0 0 2px var(--accent),0 0 14px 4px var(--uupm-wash-15);border-color:var(--accent)}#dsh-plan .p-search{position:relative}#dsh-plan .p-search-input{width:170px;min-height:28px;padding:2px 8px;font-size:12px;background:transparent;color:var(--ink);border:1px solid var(--card-line);border-radius:6px}#dsh-plan .p-search-input:focus-visible{outline:2px solid var(--accent);outline-offset:1px}#dsh-plan .p-search-list{position:absolute;top:100%;left:0;margin-top:4px;display:none;min-width:240px;max-height:220px;overflow:auto;z-index:9;background:var(--toolbar-bg);border:1px solid var(--card-line);border-radius:6px}#dsh-plan .p-search-hit{padding:5px 10px;font-size:12px;color:var(--ink);cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#dsh-plan .p-search-hit:hover,#dsh-plan .p-search-hit.active{background:var(--uupm-wash-15)}#dsh-plan .p-node .prio{position:absolute;top:6px;right:8px;font-size:10px;color:var(--ink-muted);border:1px solid var(--card-line);border-radius:4px;padding:0 5px}#dsh-plan .p-marquee{position:absolute;z-index:2;display:none;pointer-events:none;border:1px solid var(--accent);background:var(--uupm-wash-8)}#dsh-plan .p-toolbar{position:absolute;top:16px;left:16px;z-index:3;display:flex;gap:6px;align-items:center;background:var(--toolbar-bg);border:1px solid var(--card-line);border-radius:8px;padding:6px 8px}#dsh-plan .p-tabs{position:absolute;top:16px;left:50%;transform:translate(-50%);z-index:3;display:flex;gap:4px;background:var(--toolbar-bg);border:1px solid var(--card-line);border-radius:8px;padding:4px}#dsh-plan .p-tabs [role=tab]{background:transparent;color:var(--ink-muted);border:1px solid transparent;border-radius:6px;padding:4px 12px;font:inherit;cursor:pointer}#dsh-plan .p-tabs [role=tab]:hover{color:var(--ink);border-color:var(--card-line)}#dsh-plan .p-tabs [role=tab][aria-selected=true]{color:var(--ink);border-color:var(--accent);background:var(--uupm-wash-12)}#dsh-plan .p-tabs [role=tab]:focus-visible{outline:2px solid var(--accent);outline-offset:1px}#dsh-plan .p-toolbar button{background:transparent;color:var(--ink);border:1px solid var(--card-line);border-radius:6px;padding:4px 10px;font:inherit;cursor:pointer;white-space:nowrap}#dsh-plan .p-toolbar button:hover{border-color:var(--accent)}#dsh-plan .p-toolbar button:active{background:var(--uupm-wash-15)}#dsh-plan .p-toolbar button:focus-visible{outline:2px solid var(--accent);outline-offset:1px}#dsh-plan .p-zoom{min-width:44px;text-align:center;font-size:11px;color:var(--ink-muted)}#dsh-plan .p-sep{align-self:stretch;width:1px;margin:2px 4px;background:var(--card-line)}#dsh-plan .p-lamp{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--ink-muted);padding:0 6px}#dsh-plan .p-lamp i{width:7px;height:7px;border-radius:50%;background:var(--ink-muted);transition:background .14s ease}#dsh-plan .p-lamp.saved i{background:var(--edge-live)}#dsh-plan .p-lamp.pending i{background:var(--uupm-warn)}#dsh-plan .p-lamp.error{color:var(--uupm-error);cursor:pointer}#dsh-plan .p-lamp.error i{background:var(--uupm-error)}#dsh-plan .p-lamp.error:hover{border:1px solid var(--uupm-error);border-radius:4px}#dsh-plan .p-status{position:absolute;top:16px;right:16px;z-index:3;display:flex;gap:14px;background:var(--toolbar-bg);border:1px solid var(--card-line);border-radius:8px;padding:8px 14px;font-size:12px}#dsh-plan .p-status b{font-weight:600}#dsh-plan .ok{color:var(--edge-live)}#dsh-plan .warn{color:var(--uupm-warn)}#dsh-plan .mut{color:var(--ink-muted)}#dsh-plan .p-legend{position:absolute;bottom:16px;left:16px;z-index:3;font-size:11px;color:var(--ink-muted);background:var(--toolbar-bg);border:1px solid var(--card-line);border-radius:8px;padding:4px 10px}#dsh-plan .p-legend summary{cursor:pointer;padding:2px 0;-webkit-user-select:none;user-select:none}#dsh-plan .p-legend summary:focus-visible{outline:2px solid var(--accent);outline-offset:2px}#dsh-plan .p-legend[open]{padding-bottom:8px}#dsh-plan .p-legend-rows{display:grid;gap:4px;margin-top:4px}#dsh-plan .p-legend i{display:inline-block;width:18px;border-top:2px solid var(--uupm-edge-member);vertical-align:middle;margin-right:6px}#dsh-plan .p-legend i.dashed{border-top-style:dashed}@media (max-width:680px){#dsh-plan .p-toolbar{position:relative;top:auto;left:auto;margin:8px 8px 0;flex-wrap:wrap;row-gap:6px}#dsh-plan .p-toolbar>*{flex:none}#dsh-plan .p-toolbar .p-search{order:-1;flex:1 1 100%}#dsh-plan .p-toolbar .p-sep{display:none}#dsh-plan .p-toolbar .p-search-input{width:100%;box-sizing:border-box}#dsh-plan .p-status{position:relative;top:auto;right:auto;left:auto;width:fit-content;margin:6px 8px 0;padding:6px 10px;gap:10px;flex-wrap:wrap}#dsh-plan .p-legend{display:none}}@media (pointer:coarse){#dsh-plan .p-toolbar button{min-height:36px;min-width:36px}}@media (prefers-reduced-motion: reduce){#dsh-plan *{transition:none!important;animation:none!important}}#dsh-plan .p-frame.drop-target{border-color:var(--accent);border-width:2px;background:var(--uupm-wash-12)}#dsh-plan .p-frame-head:focus-visible{outline:2px solid var(--accent);outline-offset:1px}#dsh-plan .p-node.remote{border-left-color:var(--federal);padding-right:46px}#dsh-plan .p-node.remote .dot{background:var(--federal)}#dsh-plan .p-node.remote .prio{color:var(--ink)}#dsh-plan .p-node .prio.lnk-linked{color:var(--live, #2e9e5b);border-color:var(--live, #2e9e5b)}#dsh-plan .p-node .prio.lnk-stranger{color:var(--ink-muted);border-color:var(--card-line)}#dsh-plan .e-activity{stroke:var(--accent);stroke-width:2;stroke-dasharray:8 6;stroke-opacity:.9}#dsh-plan .e-federal{stroke:var(--federal);stroke-width:1.5;stroke-dasharray:6 5;stroke-opacity:.5}#dsh-plan .edge-label{font-size:10.5px;fill:var(--ink-muted)}@media (prefers-reduced-motion: no-preference){#dsh-plan .e-activity{animation:p-activity-flow 1.1s linear infinite}}@keyframes p-activity-flow{to{stroke-dashoffset:-28}}#dsh-plan .p-status{cursor:pointer}#dsh-plan .p-status:hover{border-color:var(--accent)}#dsh-plan .p-status:active{background:var(--uupm-wash-12)}#dsh-plan .p-status:focus-visible{outline:2px solid var(--accent);outline-offset:2px}#dsh-plan .p-menu{position:fixed;z-index:5;min-width:170px;display:grid;padding:4px;gap:2px;background:var(--toolbar-bg);border:1px solid var(--card-line);border-radius:8px}#dsh-plan .p-menu [role=menuitem]{background:transparent;color:var(--ink);border:1px solid transparent;border-radius:6px;padding:6px 10px;font:inherit;text-align:left;cursor:pointer;white-space:nowrap}#dsh-plan .p-menu [role=menuitem]:hover{border-color:var(--card-line);background:var(--uupm-wash-8)}#dsh-plan .p-menu [role=menuitem]:active{background:var(--uupm-wash-18)}#dsh-plan .p-menu [role=menuitem]:focus-visible{outline:2px solid var(--accent);outline-offset:1px}#dsh-plan .p-menu [role=menuitem][aria-disabled=true]{color:var(--ink-muted);cursor:not-allowed}#dsh-plan .p-dialog{position:absolute;top:0;right:0;bottom:0;left:0;z-index:6;display:grid;place-items:center;background:var(--scrim)}#dsh-plan .p-dialog-panel{min-width:300px;padding:14px 16px;display:grid;gap:10px;background:var(--uupm-bg-2);border:1px solid var(--card-line);border-radius:10px}#dsh-plan .p-dialog-title{font-weight:600;font-size:12.5px;color:var(--ink)}#dsh-plan .p-dialog-input{font:inherit;color:var(--ink);background:var(--uupm-bg-0);border:1px solid var(--card-line);border-radius:6px;padding:7px 10px}#dsh-plan .p-dialog-input:hover{border-color:color-mix(in srgb,var(--uupm-ink-1) 55%,transparent)}#dsh-plan .p-dialog-input:focus-visible{outline:2px solid var(--accent);outline-offset:1px;border-color:var(--accent)}#dsh-plan .p-dialog-err{min-height:1.2em;font-size:11px;color:var(--uupm-error)}#dsh-plan .p-dialog-row{display:flex;gap:8px;justify-content:flex-end}#dsh-plan .p-dialog-row button{background:transparent;color:var(--ink);border:1px solid var(--card-line);border-radius:6px;padding:5px 12px;font:inherit;cursor:pointer}#dsh-plan .p-dialog-row button:hover{border-color:var(--accent)}#dsh-plan .p-dialog-row button:active{background:var(--uupm-wash-15)}#dsh-plan .p-dialog-row button:focus-visible{outline:2px solid var(--accent);outline-offset:1px}#dsh-plan .p-notice-stack{position:absolute;bottom:52px;left:50%;transform:translate(-50%);z-index:5;display:grid;gap:6px;justify-items:center;pointer-events:none}#dsh-plan .p-notice{max-width:60ch;padding:7px 12px;font-size:12px;color:var(--ink);background:var(--toolbar-bg);border:1px solid var(--card-line);border-radius:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#dsh-plan .p-notice.error{color:var(--error-ink);border-color:var(--uupm-error);background:var(--error-panel)}#dsh-plan .p-netbtn{color:var(--ink-muted)}#dsh-plan .p-netbtn:not([disabled]){color:var(--ink)}#dsh-plan .p-netmenu{max-height:240px;overflow:auto}#dsh-plan .p-nodebtn{color:var(--ink)}#dsh-plan .p-nodelist{min-width:300px;max-width:340px;max-height:420px;overflow:auto;padding:6px}#dsh-plan .p-nodelist-head{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:2px 4px 6px;border-bottom:1px solid var(--card-line)}#dsh-plan .p-nodelist-title{font-size:12px;font-weight:600;color:var(--ink)}#dsh-plan .p-nodesel{font:inherit;font-size:11.5px;color:var(--ink);background:var(--uupm-bg-0);border:1px solid var(--card-line);border-radius:6px;padding:2px 6px;max-width:220px}#dsh-plan .p-nodesel:focus-visible{outline:2px solid var(--accent);outline-offset:1px}#dsh-plan .p-nodelist-group{font-size:11px;color:var(--ink-muted);padding:8px 4px 3px;display:flex;align-items:baseline;gap:8px}#dsh-plan .p-nodelist-note{font-size:10px;color:var(--ink-muted);opacity:.8}#dsh-plan .p-noderow{display:flex;align-items:center;gap:6px;padding:3px 4px;border-radius:6px;font-size:12px;color:var(--ink)}#dsh-plan .p-noderow:hover{background:var(--uupm-wash-8)}#dsh-plan .p-nodedot{flex:none;width:7px;height:7px;border-radius:50%;background:var(--edge-live)}#dsh-plan .p-nodedot.cold{background:var(--ink-muted)}#dsh-plan .p-nodedot.off{background:transparent;border:1px solid var(--ink-muted)}#dsh-plan .p-nodename{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#dsh-plan .p-nonet{flex:none;font-size:10px;color:var(--uupm-warn);border:1px solid var(--uupm-warn);border-radius:4px;padding:0 4px}#dsh-plan .p-teamcount{flex:none;font-size:10px;color:var(--ink-muted);border:1px solid var(--card-line);border-radius:4px;padding:0 4px}#dsh-plan .p-listbtn{flex:none;background:transparent;color:var(--ink);border:1px solid var(--card-line);border-radius:5px;padding:1px 7px;font:inherit;font-size:11px;cursor:pointer}#dsh-plan .p-listbtn:hover{border-color:var(--card-line-hover);background:var(--uupm-wash-8)}#dsh-plan .p-listbtn:focus-visible{outline:2px solid var(--accent);outline-offset:1px}#dsh-plan .p-nodelist-empty{padding:10px 4px;font-size:11.5px;color:var(--ink-muted)}#dsh-plan .p-frame{position:absolute}#dsh-plan .p-frame-handle{position:absolute;pointer-events:auto;width:10px;height:10px;z-index:2;opacity:0;transition:opacity .12s ease}#dsh-plan .p-frame:hover .p-frame-handle{opacity:1}#dsh-plan .p-frame-handle:after{content:"";position:absolute;top:2px;right:2px;bottom:2px;left:2px;background:var(--frame-ink);border-radius:2px}#dsh-plan .p-h-n{top:-5px;left:calc(50% - 12px);width:24px;height:8px;cursor:ns-resize}#dsh-plan .p-h-s{bottom:-5px;left:calc(50% - 12px);width:24px;height:8px;cursor:ns-resize}#dsh-plan .p-h-e{right:-5px;top:calc(50% - 12px);width:8px;height:24px;cursor:ew-resize}#dsh-plan .p-h-w{left:-5px;top:calc(50% - 12px);width:8px;height:24px;cursor:ew-resize}#dsh-plan .p-h-ne{top:-5px;right:-5px;cursor:nesw-resize}#dsh-plan .p-h-nw{top:-5px;left:-5px;cursor:nwse-resize}#dsh-plan .p-h-se{bottom:-5px;right:-5px;cursor:nwse-resize}#dsh-plan .p-h-sw{bottom:-5px;left:-5px;cursor:nesw-resize}#dsh-plan .p-h-ne:after,#dsh-plan .p-h-sw:after{transform:rotate(45deg)}#dsh-plan .p-h-nw:after,#dsh-plan .p-h-se:after{transform:rotate(-45deg)}#dsh-plan .p-frame.selected .p-frame-handle{opacity:1}#dsh-plan .p-frame.selected{outline:1px solid var(--frame-ink)}:root{color-scheme:dark;--n-bg:#060a12;--n-ink:#dde3f0;--n-ink-muted:#7a86a0;--n-panel:#0d1322;--n-live:#4ade80;--n-cold:#7a86a0;--n-border:#223052;--n-act:#f59e0b;--n-danger:#f87171;--n-accent:#9673f7;--n-rail-w:300px;--n-canvas:#22d3ee;--n-line:var(--n-border);--n-raised:#131b2e;--n-federal:#6366f1;--n-card-line:#5c6680;--n-error-ink:#fecaca;--n-error-panel:#2a0d10f2;--n-shadow:rgba(0,0,0,.35)}@media (prefers-color-scheme: light){:root{--n-bg:#eef2fa;--n-ink:#1a2438;--n-ink-muted:#5a6580;--n-panel:#ffffff;--n-live:#157a37;--n-border:#c6d0e6;--n-act:#a84d08;--n-danger:#b91c1c;--n-accent:#6d28d9;--n-cold:#636c81;--n-canvas:#0e7490;--n-raised:#ffffff;--n-federal:#4f46e5;--n-card-line:#8a95ae;--n-error-ink:#b91c1c;--n-error-panel:#fef2f2f2;--n-shadow:rgba(26,36,56,.16)}}@media (min-width:1440px){:root{--n-rail-w:340px }}html,body,#app{height:100%;margin:0}body{background:var(--n-bg);color:var(--n-ink);font:13px/1.45 system-ui,Segoe UI,Roboto,PingFang SC,Microsoft YaHei,sans-serif}.wb{display:flex;flex-direction:column;height:100%}.wb-header{display:flex;align-items:center;gap:12px;padding:8px 14px;border-bottom:1px solid var(--n-border);background:var(--n-panel)}.wb-title{display:flex;align-items:center;gap:10px;font-weight:600;font-size:14px;white-space:nowrap}.wb-badge{font-size:11px;font-weight:400;color:var(--n-ink-muted);border:1px solid var(--n-border);border-radius:99px;padding:1px 8px}.wb-badge[hidden]{display:none}.wb-row-remote{margin-left:6px;padding:0 6px;border:1px solid currentColor;border-radius:99px;font-size:10.5px;color:var(--n-ink-muted);vertical-align:1px}.wb-header-stats{display:flex;gap:16px;font-size:12px;color:var(--n-ink-muted);flex-wrap:wrap;min-width:0}.wb-header-stats .wb-kv{display:flex;gap:6px}.wb-header-stats .wb-kv-k{color:var(--n-ink-muted)}.wb-header-stats .wb-kv-v{color:var(--n-ink)}.wb-header-ok{color:var(--n-ink-muted)}.wb-alert{border:1px solid currentColor;border-radius:99px;padding:0 9px;line-height:20px;white-space:nowrap;cursor:pointer;background:transparent;font:inherit}.wb-alert:hover{background:color-mix(in srgb,currentColor 12%,transparent)}.wb-alert:focus-visible{outline:2px solid currentColor;outline-offset:2px}.wb-alert-danger{color:var(--n-danger)}.wb-alert-warn{color:var(--n-act)}.wb-forensics{font-family:ui-monospace,Consolas,monospace;font-size:11px}.wb-icon-btn{background:none;border:1px solid var(--n-border);color:var(--n-ink);border-radius:8px;width:30px;height:30px;display:none;align-items:center;justify-content:center;font:inherit;font-size:14px;cursor:pointer;flex:none}.wb-icon-btn:hover{border-color:var(--n-accent)}.wb-menu{margin-left:0}.wb-rail-toggle{margin-left:auto}.wb.is-rail-collapsed .wb-rail{display:none}.wb-body{position:relative;display:grid;grid-template-columns:minmax(0,var(--n-rail-w)) minmax(0,1fr);flex:1;min-height:0}.wb-rail{border-right:1px solid var(--n-border);min-width:0;min-height:0;display:flex;flex-direction:column;overflow:hidden;background:color-mix(in srgb,var(--n-panel) 60%,var(--n-bg))}.wb-side-head{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--n-ink-muted);margin:10px 2px 4px}.wb-item{display:flex;gap:7px;align-items:center;width:100%;text-align:left;background:none;border:none;color:var(--n-ink);font:inherit;padding:3px 6px;border-radius:6px;cursor:pointer}.wb-item:hover{background:color-mix(in srgb,var(--n-accent) 14%,transparent)}.wb-dot{font-size:10px}.wb-dot-live{color:var(--n-live)}.wb-dot-cold{color:var(--n-cold)}.wb-dot-canvas{color:var(--n-canvas)}.wb-dot-remote{color:var(--n-act)}.wb-dir-tools{display:flex;flex-direction:column;gap:6px;padding:8px 6px 4px}.wb-search{background:var(--n-panel);border:1px solid var(--n-border);color:var(--n-ink);border-radius:6px;padding:4px 8px;font:inherit;font-size:12.5px;min-width:0}.wb-search:focus{outline:1px solid var(--n-accent)}.wb-filters{display:flex;flex-wrap:wrap;gap:4px}.wb-filter{background:none;border:1px solid var(--n-border);color:var(--n-ink-muted);border-radius:99px;padding:0 10px;min-height:24px;font:inherit;font-size:11.5px;cursor:pointer}.wb-filter:hover{border-color:var(--n-accent);color:var(--n-ink)}.wb-filter.is-active{border-color:var(--n-accent);color:var(--n-ink);background:color-mix(in srgb,var(--n-accent) 16%,transparent)}.wb-item-badge{flex:none;font-size:10.5px;color:var(--n-canvas);border:1px solid color-mix(in srgb,var(--n-canvas) 45%,transparent);border-radius:99px;padding:0 6px;line-height:17px;white-space:nowrap}.wb-item-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wb-member-row{display:flex;align-items:center;gap:8px;padding:3px 2px;border-radius:6px}.wb-member-row:hover{background:color-mix(in srgb,var(--n-accent) 10%,transparent)}.wb-member-dot{flex:none;font-size:11px;color:var(--n-ink-muted);min-width:44px}.wb-member-label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wb-member-remove,.wb-member-submit{background:none;border:1px solid var(--n-border);color:var(--n-ink);border-radius:6px;padding:1px 8px;font:inherit;font-size:11.5px;cursor:pointer;flex:none}.wb-member-remove:hover:not(:disabled),.wb-member-submit:hover:not(:disabled){border-color:var(--n-danger)}.wb-member-submit:hover:not(:disabled){border-color:var(--n-accent)}.wb-member-add{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}.wb-member-pick,.wb-member-manual{background:var(--n-panel);border:1px solid var(--n-border);color:var(--n-ink);border-radius:6px;padding:3px 8px;font:inherit;font-size:12px;min-width:0}.wb-member-pick{flex:1 1 150px}.wb-member-manual{flex:1 1 130px}.wb-member-pick:focus,.wb-member-manual:focus{outline:1px solid var(--n-accent)}.wb-hint{margin-top:10px;font-size:11px;color:var(--n-ink-muted);line-height:1.5}.wb-dispatch{margin-top:12px;border-top:1px dashed var(--n-border);padding-top:8px}.wb-dispatch-form{display:flex;flex-direction:column;gap:6px;margin-top:6px}.wb-dispatch-text{background:var(--n-panel);border:1px solid var(--n-border);color:var(--n-ink);border-radius:6px;padding:5px 8px;font:inherit;font-size:12px;min-height:52px;resize:vertical}.wb-dispatch-text:focus{outline:1px solid var(--n-accent)}.wb-dispatch-submit{align-self:flex-end;background:none;border:1px solid var(--n-border);color:var(--n-ink);border-radius:6px;padding:2px 14px;font:inherit;font-size:11.5px;cursor:pointer}.wb-dispatch-submit:hover:not(:disabled){border-color:var(--n-accent)}.wb-dispatch-note{font-size:11px;color:var(--n-ink-muted);line-height:1.4;min-height:0}.wb-stage{position:relative;min-width:0;min-height:0;display:flex;flex-direction:column}.wb-stage-board{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden}.wb-stage-board.is-hidden{display:none}.wb-data{display:flex;flex-direction:column;gap:14px;padding:10px 14px;overflow-y:auto;min-height:0}.wb-data.is-hidden{display:none}.wb-pane-head{font-size:12px;color:var(--n-ink-muted);margin:4px 0 8px}.wb-pane-subhead{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--n-ink-muted);margin:12px 0 6px}.wb-table,.wb-row{display:flex;gap:10px;align-items:baseline}.wb-row{font-family:ui-monospace,Consolas,monospace;font-size:12px;background:color-mix(in srgb,var(--n-panel) 55%,transparent);border:1px solid var(--n-border);border-radius:6px;padding:3px 8px;flex-wrap:wrap}.wb-row-team{color:var(--n-accent);min-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wb-row-meta{color:var(--n-ink-muted)}.wb-row-badges{color:var(--n-live)}.wb-row-dir{min-width:16px}.wb-row-dir.is-fail{color:var(--n-danger)}.wb-btn{background:none;border:1px solid var(--n-border);color:var(--n-ink);border-radius:6px;padding:2px 10px;font:inherit;font-size:12px;cursor:pointer;margin-left:auto}.wb-btn:hover:not(:disabled){border-color:var(--n-accent)}.wb-btn:disabled{opacity:.5;cursor:default}.wb-btn-primary{border-color:var(--n-accent);color:var(--n-ink)}.wb-action{display:flex;gap:10px;align-items:baseline;font-size:12.5px;padding:5px 8px;border-radius:6px;border:1px solid var(--n-border);margin-bottom:4px}.wb-action-high{border-color:var(--n-danger)}.wb-action-text{flex:1}.wb-draft{display:flex;flex-direction:column;gap:8px;max-width:560px;margin-top:6px}.wb-select,.wb-textarea{background:var(--n-panel);border:1px solid var(--n-border);color:var(--n-ink);border-radius:8px;padding:6px 9px;font:inherit}.wb-textarea{resize:vertical}.wb-select:focus,.wb-textarea:focus{outline:1px solid var(--n-accent)}.wb-inspector{position:absolute;top:8px;right:8px;width:280px;max-height:calc(100% - 16px);overflow-y:auto;background:var(--n-panel);border:1px solid var(--n-border);border-radius:10px;padding:10px;z-index:20;box-shadow:0 8px 24px var(--n-shadow);display:none}.wb-inspector.is-open{display:block}.wb-inspector-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}.wb-inspector-title{font-weight:600;font-size:12.5px}.wb-inspector .wb-icon-btn{display:inline-flex;width:24px;height:24px;font-size:12px}.wb-card{display:flex;flex-direction:column;gap:6px}.wb-kv{display:flex;gap:8px;font-size:12px}.wb-kv-k{color:var(--n-ink-muted);min-width:58px;flex:none}.wb-kv-v{word-break:break-all}.wb-muted{color:var(--n-ink-muted)}.wb-chat{position:absolute;top:8px;right:8px;bottom:8px;width:400px;max-width:calc(100% - 16px);display:flex;flex-direction:column;background:var(--n-panel);border:1px solid var(--n-border);border-radius:12px;z-index:22;box-shadow:0 8px 24px var(--n-shadow);overflow:hidden;transform:translate(calc(100% + 12px));transition:transform .18s ease;pointer-events:none}.wb-chat.is-open{transform:translate(0);pointer-events:auto}.wb-chat-head{display:flex;align-items:center;gap:8px;padding:10px 10px 10px 12px;border-bottom:1px solid var(--n-border);flex:none}.wb-chat-dot{flex:none;width:8px;height:8px;border-radius:50%;background:var(--n-ink-muted)}.wb-chat-dot.is-live{background:var(--n-live)}.wb-chat-dot.is-cold{background:transparent;border:1.5px solid var(--n-ink-muted)}.wb-chat-dot.is-peer{background:var(--n-federal)}.wb-chat-titles{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;line-height:1.3}.wb-chat-title{font-weight:600;font-size:13.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wb-chat-sub{font:11px/1.4 ui-monospace,Consolas,monospace;color:var(--n-ink-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wb-chat .wb-icon-btn{display:inline-flex;width:28px;height:28px;font-size:13px;flex:none;border-color:transparent}.wb-chat .wb-icon-btn:hover{border-color:var(--n-border)}.wb-chat .wb-icon-btn:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}.wb-chat .wb-chat-back[hidden]{display:none}.wb-chat-info-btn[aria-expanded=true]{border-color:var(--n-accent);color:var(--n-accent)}.wb-chat-info{flex:none;display:flex;flex-direction:column;gap:4px;padding:8px 12px;font-size:12px;border-bottom:1px solid var(--n-border);background:color-mix(in srgb,var(--n-bg) 55%,var(--n-panel))}.wb-chat-info[hidden]{display:none}.wb-chat-info .wb-kv-v{font-family:ui-monospace,Consolas,monospace;font-size:11.5px}.wb-chat-thread{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;display:flex;flex-direction:column;gap:10px;padding:12px}.wb-chat-thread:focus-visible{outline:2px solid var(--n-accent);outline-offset:-2px}.wb-chat-log,.wb-chat-sent{display:flex;flex-direction:column;gap:10px}.wb-chat-notice{align-self:center;max-width:92%;text-align:center;font-size:11.5px;line-height:1.5;color:var(--n-ink-muted);border:1px dashed var(--n-border);border-radius:8px;padding:6px 10px}.wb-chat-notice[hidden]{display:none}.wb-chat-empty{align-self:center;padding:24px 8px;font-size:12px;color:var(--n-ink-muted);text-align:center}.wb-chat-empty.is-error{color:var(--n-danger)}.wb-msg{display:flex;flex-direction:column;gap:4px;max-width:86%;padding:8px 11px;border-radius:12px;font-size:13px;line-height:1.55}.wb-msg-assistant{align-self:flex-start;background:var(--n-raised);border:1px solid var(--n-border);border-bottom-left-radius:4px}.wb-msg-user{align-self:flex-end;background:color-mix(in srgb,var(--n-accent) 16%,var(--n-panel));border:1px solid color-mix(in srgb,var(--n-accent) 35%,transparent);border-bottom-right-radius:4px}.wb-msg-ledger{align-self:center;max-width:92%;background:transparent;border:1px dashed var(--n-border);font-size:12px}.wb-msg-ledger .wb-msg-text{color:var(--n-ink-muted)}.wb-msg-ledger .wb-msg-meta{justify-content:center}.wb-msg-in .wb-msg-meta{justify-content:flex-start}.wb-msg-who{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.wb-msg-text{color:var(--n-ink);white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere}.wb-msg-meta{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:6px;font-size:11px}.wb-msg-task{font-family:ui-monospace,Consolas,monospace;color:var(--n-ink-muted)}.wb-msg-status{border:1px solid currentColor;border-radius:99px;padding:0 7px;line-height:18px;white-space:nowrap}.wb-msg-status.is-wait,.wb-msg-status.is-muted{color:var(--n-ink-muted)}.wb-msg-status.is-ok{color:var(--n-live)}.wb-msg-status.is-warn{color:var(--n-act)}.wb-msg-status.is-danger{color:var(--n-danger)}.wb-chat-divider{display:flex;align-items:center;gap:8px;font-size:11px;color:var(--n-ink-muted);margin-top:4px}.wb-chat-divider:before,.wb-chat-divider:after{content:"";flex:1;border-top:1px solid var(--n-border)}.wb-chat-sessions{display:flex;flex-direction:column;gap:6px}.wb-chat-session{display:flex;flex-direction:column;align-items:flex-start;gap:2px;width:100%;text-align:left;background:var(--n-raised);border:1px solid var(--n-border);border-radius:8px;padding:7px 10px;color:var(--n-ink);font:inherit;cursor:pointer}.wb-chat-session:hover{border-color:var(--n-accent)}.wb-chat-session:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}.wb-chat-session-id{font:12px ui-monospace,Consolas,monospace}.wb-chat-session-meta{font-size:11px;color:var(--n-ink-muted)}.wb-chat-foot{flex:none;border-top:1px solid var(--n-border);padding:8px 10px 10px;background:var(--n-panel)}.wb-chat-composer{display:flex;flex-direction:column;gap:4px}.wb-chat-composer-row{display:flex;align-items:flex-end;gap:8px}.wb-chat-composer .wb-dispatch-text{flex:1 1 auto;min-height:38px;max-height:160px;resize:none;border-radius:10px;padding:8px 10px;font-size:13px;line-height:1.5}.wb-chat-composer .wb-dispatch-submit{align-self:auto;height:38px;padding:0 16px;border-radius:10px;background:var(--n-accent);border-color:var(--n-accent);color:var(--n-bg);font-size:13px;font-weight:600}.wb-chat-composer .wb-dispatch-submit:hover:not(:disabled){border-color:var(--n-accent);filter:brightness(1.08)}.wb-chat-composer .wb-dispatch-submit:disabled{opacity:.45;cursor:default}.wb-chat-composer .wb-dispatch-note{font-size:11px;padding-left:2px}.wb-chat-composer .wb-dispatch-note.is-error{color:var(--n-danger)}.wb-chat-readonly{font-size:12px;color:var(--n-ink-muted);text-align:center;padding:4px 0}.nexus-fault{display:none;position:fixed;top:10px;right:12px;z-index:50;max-width:420px;font:12px/1.5 ui-monospace,Consolas,monospace;color:var(--n-error-ink);background:var(--n-error-panel);border:1px solid var(--n-danger);border-radius:8px;padding:6px 10px;pointer-events:none}@media (max-width:1023px){.wb-menu{display:inline-flex}.wb-rail-toggle{display:none}.wb-body{grid-template-columns:minmax(0,1fr)}.wb-rail{position:fixed;left:0;top:0;bottom:0;width:min(86vw,320px);z-index:40;background:var(--n-panel);border-right:1px solid var(--n-border);transform:translate(-102%);transition:transform .18s ease;box-shadow:8px 0 24px var(--n-shadow)}.wb.is-rail-open .wb-rail{transform:translate(0)}.wb-inspector{left:8px;right:8px;width:auto;top:auto;bottom:8px;max-height:45%}.wb-chat{left:8px;right:8px;width:auto;top:auto;bottom:8px;height:85%;max-height:85%;transform:translateY(102%)}.wb-chat.is-open{transform:translateY(0)}}@media (pointer:coarse){.wb-filter,.wb-item,.wb-tab{min-height:36px}.wb-icon-btn,.wb-inspector .wb-icon-btn,.wb-chat .wb-icon-btn{width:36px;height:36px}}@media (max-width:680px){.wb-header{flex-wrap:wrap;row-gap:4px}.wb-header-stats{order:3;width:100%}.wb-row-team{min-width:0;flex:1 1 auto}.wb-data{padding:8px}}.wb-host-row{display:flex;align-items:center;gap:7px;padding:4px 6px;border:1px solid var(--n-border);border-radius:7px;margin-bottom:4px;cursor:pointer;font-size:12px}.wb-host-row:hover{border-color:var(--n-accent);background:color-mix(in srgb,var(--n-accent) 8%,transparent)}.wb-host-row:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}.wb-host-lamp{flex:none;width:8px;height:8px;border-radius:50%;background:var(--n-ink-muted)}.wb-host-lamp.is-live{background:var(--n-live)}.wb-host-lamp.is-warm{background:var(--n-act)}.wb-host-lamp.is-cold{background:var(--n-ink-muted)}.wb-host-lamp.is-fail{background:var(--n-danger)}.wb-host-lamp.is-unknown{background:transparent;border:1px solid var(--n-ink-muted)}.wb-host-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--n-ink)}.wb-host-badge{flex:none;font-size:10.5px;border-radius:99px;padding:0 7px;line-height:17px;border:1px solid var(--n-border)}.wb-host-badge.is-linked{color:var(--n-live);border-color:var(--n-live)}.wb-host-badge.is-stranger{color:var(--n-ink-muted);border-color:var(--n-border)}.wb-host-ver{flex:none;font-size:10px;color:var(--n-ink-muted);border:1px solid var(--n-border);border-radius:4px;padding:0 4px}.wb-host-url{flex:none;max-width:40%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--n-ink-muted);font-size:10.5px}.wb-tabs{flex:none;display:flex;gap:2px;padding:6px 6px 0;border-bottom:1px solid var(--n-border);overflow-x:auto;scrollbar-width:none}.wb-tab{flex:1 1 auto;display:inline-flex;align-items:center;justify-content:center;gap:5px;min-width:0;background:none;border:none;border-bottom:2px solid transparent;color:var(--n-ink-muted);font:inherit;font-size:12.5px;padding:6px 6px 7px;cursor:pointer;white-space:nowrap}.wb-tab:hover{color:var(--n-ink)}.wb-tab.is-active{color:var(--n-ink);border-bottom-color:var(--n-accent);font-weight:600}.wb-tab:focus-visible{outline:2px solid var(--n-accent);outline-offset:-2px;border-radius:6px 6px 0 0}.wb-tab[hidden]{display:none}.wb-tab-badge{font:10.5px/16px ui-monospace,Consolas,monospace;color:var(--n-ink-muted);font-weight:400}.wb-tab-badge:empty{display:none}.wb-tab-badge.is-danger,.wb-tab-badge.is-warn,.wb-tab-badge.is-accent{padding:0 6px;border-radius:99px;border:1px solid currentColor}.wb-tab-badge.is-danger{color:var(--n-danger)}.wb-tab-badge.is-warn{color:var(--n-act)}.wb-tab-badge.is-accent{color:var(--n-accent)}.wb-tabpanels{flex:1 1 auto;min-height:0;display:flex;flex-direction:column}.wb-tabpanel{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:8px 10px 16px}.wb-tabpanel[hidden]{display:none}.wb-tabpanel:focus-visible{outline:2px solid var(--n-accent);outline-offset:-2px}.wb-tabpanel .wb-pane{display:flex;flex-direction:column;gap:8px}.wb-tabpanel .wb-dir-tools{padding:0 0 6px}.wb-dir-group{display:flex;flex-direction:column;gap:1px;margin-top:10px}.wb-dir-group:first-child{margin-top:2px}.wb-dir-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;padding:0 6px 4px;font-size:11px;letter-spacing:.04em;color:var(--n-ink-muted)}.wb-dir-head-label{font-weight:600;color:var(--n-ink)}.wb-dir-head-note{font-size:10.5px}.wb-dir-day{padding:6px 6px 2px;font-size:10.5px;color:var(--n-ink-muted)}.wb-dir-empty{padding:24px 8px;text-align:center;font-size:12px;color:var(--n-ink-muted)}.wb-directory .wb-item{gap:9px;padding:5px 6px;border-radius:8px}.wb-directory .wb-item:focus-visible{outline:2px solid var(--n-accent);outline-offset:-2px}.wb-item-text{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;line-height:1.35}.wb-item-sub{font:11px/1.35 ui-monospace,Consolas,monospace;color:var(--n-ink-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wb-item.is-untitled .wb-item-label{color:var(--n-ink-muted);font-family:ui-monospace,Consolas,monospace;font-size:12px}.wb-dot-log{color:var(--n-ink-muted)}.wb-led-tiles{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px}.wb-led-tile{display:flex;flex-direction:column;align-items:flex-start;gap:1px;padding:7px 8px;border-radius:8px;border:1px solid var(--n-border);background:var(--n-raised);cursor:help;min-width:0}.wb-led-tile-v{font:600 17px/1.15 ui-monospace,Consolas,monospace;color:var(--n-ink)}.wb-led-tile-k{font-size:11px;color:var(--n-ink-muted)}.wb-led-tile.is-warn{border-color:var(--n-act)}.wb-led-tile.is-warn .wb-led-tile-v{color:var(--n-act)}.wb-led-tile.is-danger{border-color:var(--n-danger)}.wb-led-tile.is-danger .wb-led-tile-v{color:var(--n-danger)}.wb-led-split{display:flex;flex-direction:column;gap:4px}.wb-led-split-bar{display:flex;height:6px;border-radius:99px;overflow:hidden;background:var(--n-border)}.wb-led-seg{display:block;height:100%}.wb-led-split-legend{display:flex;flex-wrap:wrap;gap:4px 10px;font-size:11px;color:var(--n-ink-muted)}.wb-led-split-item{display:inline-flex;align-items:center;gap:4px}.wb-led-swatch{display:inline-block;width:8px;height:8px;border-radius:2px}.wb-led-seg.is-completed,.wb-led-swatch.is-completed{background:var(--n-live)}.wb-led-seg.is-rejected,.wb-led-swatch.is-rejected{background:var(--n-act)}.wb-led-seg.is-failed,.wb-led-swatch.is-failed{background:var(--n-danger)}.wb-led-seg.is-abandoned,.wb-led-swatch.is-abandoned{background:var(--n-ink-muted)}.wb-led-seg.is-unclassified,.wb-led-swatch.is-unclassified,.wb-led-seg.is-other,.wb-led-swatch.is-other{background:color-mix(in srgb,var(--n-ink-muted) 45%,var(--n-border))}.wb-led-group{display:flex;flex-direction:column;gap:6px;margin-top:4px}.wb-led-group-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;font-size:11.5px;font-weight:600;color:var(--n-ink)}.wb-led-group-hint{font-size:10.5px;font-weight:400;color:var(--n-ink-muted)}.wb-led-group.is-danger .wb-led-group-head{color:var(--n-danger)}.wb-led-group.is-warn .wb-led-group-head{color:var(--n-act)}.wb-led-card{position:relative;display:flex;flex-direction:column;gap:3px;padding:7px 9px;border-radius:8px;border:1px solid var(--n-border);background:var(--n-raised);min-width:0}.wb-led-card.is-danger{border-color:var(--n-danger)}.wb-led-card.is-warn{border-left:3px solid var(--n-act)}.wb-led-card.is-muted,.wb-led-card.is-quiet{background:transparent}.wb-led-card.is-link{cursor:pointer}.wb-led-card.is-link:hover{border-color:var(--n-accent)}.wb-led-card.is-link:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}.wb-led-card-head{display:flex;align-items:flex-start;gap:6px;min-width:0}.wb-led-dir{flex:none;font-size:12px;color:var(--n-ink-muted);line-height:1.45}.wb-led-dir.is-in{color:var(--n-federal)}.wb-led-brief{flex:1 1 auto;min-width:0;font-size:12.5px;line-height:1.45;color:var(--n-ink);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;overflow-wrap:anywhere}.wb-led-card.is-muted .wb-led-brief,.wb-led-card.is-quiet .wb-led-brief{color:var(--n-ink-muted)}.wb-led-card.is-danger .wb-led-brief{color:var(--n-danger)}.wb-led-brief.is-missing{font-style:italic}.wb-led-meta{display:flex;flex-wrap:wrap;gap:2px 8px;font:11px/1.45 ui-monospace,Consolas,monospace;color:var(--n-ink-muted);min-width:0}.wb-led-meta>span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.wb-led-chip{border:1px solid var(--n-border);border-radius:99px;padding:0 6px;font-family:inherit}.wb-led-abandon{position:absolute;top:6px;right:6px;margin-left:0;padding:1px 9px;font-size:11.5px}.wb-led-abandon.is-quiet{border-color:transparent;background:transparent;color:var(--n-ink-muted)}.wb-led-abandon.is-quiet:hover{border-color:var(--n-border);color:var(--n-ink)}.wb-led-card:has(.wb-led-abandon) .wb-led-card-head{padding-right:52px}.wb-led-empty{padding:24px 8px;text-align:center;font-size:12px;color:var(--n-ink-muted)}.wb-led-forensics{font-size:11px;color:var(--n-ink-muted);border-top:1px dashed var(--n-border);padding-top:6px;margin-top:4px}.wb-led-forensics summary{cursor:pointer}.wb-led-forensics summary:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}.wb-led-forensics-body{display:flex;flex-direction:column;gap:2px;padding:4px 0 0 12px;font-family:ui-monospace,Consolas,monospace}
@@ -1,9 +0,0 @@
1
- var bo=Object.defineProperty;var go=(e,t,n)=>t in e?bo(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var $t=(e,t,n)=>go(e,typeof t!="symbol"?t+"":t,n);(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))s(o);new MutationObserver(o=>{for(const i of o)if(i.type==="childList")for(const r of i.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&s(r)}).observe(document,{childList:!0,subtree:!0});function n(o){const i={};return o.integrity&&(i.integrity=o.integrity),o.referrerPolicy&&(i.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?i.credentials="include":o.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function s(o){if(o.ep)return;o.ep=!0;const i=n(o);fetch(o.href,i)}})();const en=6e4;function vo(e,t,n=Date.now){let s=-en;return{fault(o){const i=n();i-s>=en&&(t(`[nexus] ${o}`),s=i),e.show(o)},clear(){e.hide(),s=-en}}}function st(e){return e.name??e.team??e.label??""}function qn(e,t){var i,r;const n=(c,m)=>c!==void 0&&c.trim()!==""?{name:c,remote:m}:void 0,s=(e.sessions??[]).find(c=>c.team===t);if(s!==void 0)return n(st(s),!1);const o=(e.remote??[]).find(c=>c.team===t);return o!==void 0?n(st(o),!0):n((r=(((i=e.canvas)==null?void 0:i.teams)??[]).find(c=>c.team===t))==null?void 0:r.name,!1)}function yo(e,t){const n=qn(e,t);return n===void 0?t:n.remote?`${n.name}(远端)`:n.name}function Xt(e,t,n,s=""){const o=qn(t,n);if(e.textContent=`${s}${(o==null?void 0:o.name)??n}`,e.title=n,(o==null?void 0:o.remote)===!0){const i=e.appendChild(document.createElement("span"));i.className="wb-row-remote",i.textContent="远端",i.title="名字由对端自行发布"}}const wo=60*6e4;function Mt(e){var t;return e.direction==="inbound"||e.direction===void 0&&((t=e.peer)==null?void 0:t.startsWith("local:"))===!0}function kn(e){var t;return((t=e.peer)==null?void 0:t.startsWith("local:"))===!0?e.peer.slice(6):void 0}function _t(e,t){return e.settleable!==void 0?e.settleable===!1:t-e.startedAt>=wo}function rn(e,t){const n=(e.tasks??[]).filter(r=>r.receiptExpected!==!1),s=n.filter(r=>!Mt(r)&&_t(r,t)),o=n.filter(r=>Mt(r)&&_t(r,t)),i=e.tasksDead??[];return{stale:s,owedOverdue:o,deadLetters:i.filter(r=>r.reason!=="fire-forget"),expired:i.filter(r=>r.reason==="fire-forget")}}function ke(e,t){const n=document.createElement(e);return t!==void 0&&(n.className=t),n}function En(e,t){const n=Math.max(0,Math.round((t-e)/1e3));if(n<90)return`${n}s`;const s=Math.round(n/60);if(s<90)return`${s}m`;const o=Math.round(s/60);return o<48?`${o}h`:`${Math.round(o/24)}d`}function Rt(e,t,n,s,o){const i=ke("div",`wb-led-tile${o!==void 0?` is-${o}`:""}`);i.title=s,i.appendChild(ke("span","wb-led-tile-v")).textContent=String(n),i.appendChild(ke("span","wb-led-tile-k")).textContent=t,e.appendChild(i)}const an=[{key:"completed",label:"完成",tone:"completed"},{key:"sync_completed",label:"同步完成",tone:"completed"},{key:"rejected",label:"拒绝",tone:"rejected"},{key:"failed",label:"失败",tone:"failed"},{key:"expired",label:"过期",tone:"abandoned"},{key:"abandoned",label:"放弃",tone:"abandoned"},{key:"unknown",label:"结论不明",tone:"unclassified"},{key:"unclassified",label:"未分类",tone:"unclassified"}];function xo(e,t,n){const s=ke("div","wb-led-split"),o=ke("div","wb-led-split-bar");o.setAttribute("role","img");const i=ke("div","wb-led-split-legend"),r=new Set(an.map(l=>l.key)),c=an.map(l=>[l.tone,l.label,t[l.key]??0]);for(const[l,p]of Object.entries(t))r.has(l)||c.push(["other",l,p]);const m=[];for(const[l,p,b]of c){if(b<=0)continue;const _=ke("span",`wb-led-seg is-${l}`);_.style.width=`${Math.max(2,b/n*100)}%`,o.appendChild(_);const N=ke("span","wb-led-split-item");N.appendChild(ke("i",`wb-led-swatch is-${l}`)),N.appendChild(document.createTextNode(`${p} ${b}`)),i.appendChild(N),m.push(`${p} ${b}`)}o.setAttribute("aria-label",`归档结局:${m.join(",")}`),s.append(o,i),e.appendChild(s)}function Co(e,t){var Le;e.replaceChildren();const{state:n,now:s}=t,o=n.tasks??[],i=n.tasksDead??[],r=n.archivedCount??0,c=rn(n,s),m=o.filter(O=>O.receiptExpected===!1),l=o.filter(O=>O.receiptExpected!==!1),p=l.filter(O=>Mt(O)),b=l.filter(O=>!Mt(O)),_=c.stale,N=b.filter(O=>!_t(O,s)),G=c.stale.length,ue=ke("div","wb-led-tiles");Rt(ue,"待回执",l.length,`要回执、仍未结算的任务(含陈旧与本机欠对方的入站行)${m.length>0?`;另有免回执 ${m.length} 条不计`:""}`),Rt(ue,"陈旧",G,"我方派发、要回执、已等待 ≥1h 仍未回执(可催办);本机欠对方的入站行在「待本机回执」组另计,免回执行不算陈旧",G>0?"warn":void 0),Rt(ue,"死信",c.deadLetters.length,"超过 24h TTL 仍未结算(unconsumed);需清账(abandon)才能移出。免回执到期另列,不算死信",c.deadLetters.length>0?"danger":void 0),Rt(ue,"已归档",r,"已离开台账并留档的任务(结算、拒绝或放弃),用于审计"),e.appendChild(ue),r>0&&n.archivedSplit!==void 0&&xo(e,n.archivedSplit,r);const Z=(O,z)=>{const se=ke("div",`wb-led-card is-${z.tone}`),Ne=ke("div","wb-led-card-head");Ne.appendChild(ke("span",`wb-led-dir${z.inbound?" is-in":""}`)).textContent=z.inbound?"↙":"↗";const Q=ke("span","wb-led-brief");Q.textContent=z.brief!==void 0&&z.brief!==""?z.brief:"(无摘要——派发未带 brief)",(z.brief===void 0||z.brief==="")&&Q.classList.add("is-missing"),Ne.appendChild(Q),se.appendChild(Ne);const B=ke("div","wb-led-meta"),ve=B.appendChild(ke("span","wb-led-team"));z.inbound?z.sender!==void 0?Xt(ve,n,z.sender,"来自 "):ve.textContent="来自 对端":Xt(ve,n,z.team,"发往 "),z.inbound&&Xt(B.appendChild(ke("span","wb-led-to")),n,z.team,"至 "),B.appendChild(ke("span")).textContent=z.atText,B.appendChild(ke("span","wb-led-task")).textContent=z.taskId;for(const le of z.chips)B.appendChild(ke("span","wb-led-chip")).textContent=le;if(se.appendChild(B),se.title=`${z.taskId}
2
- ${z.team}`,z.dead!==void 0){const le=z.dead,ye=le.reason==="fire-forget",Te=ke("button",`wb-btn wb-led-abandon${ye?" is-quiet":""}`);Te.type="button",Te.textContent=ye?"移出":"清账",Te.title=ye?"可选:把这条已过期的免回执记录移出台账(不是失败,不处理也无妨)":"从台账移出这条死信(abandon)",Te.addEventListener("click",Qe=>{Qe.stopPropagation(),Te.disabled=!0,t.abandon(le.taskId,"workbench dead-letter cleanup").then(Je=>{Te.disabled=!1,Te.textContent=Je?"已清":"失败"})}),se.appendChild(Te)}if(t.canOpenTeam(z.team)){se.classList.add("is-link"),se.setAttribute("role","button"),se.tabIndex=0,se.setAttribute("aria-label",`${Q.textContent},打开 ${z.team} 的对话`);const le=()=>{t.openTeam(z.team)};se.addEventListener("click",le),se.addEventListener("keydown",ye=>{(ye.key==="Enter"||ye.key===" ")&&(ye.preventDefault(),le())})}O.appendChild(se)},k=(O,z,se,Ne)=>{if(z===0)return null;const Q=ke("div",`wb-led-group is-${se}`);Q.dataset.group=O;const B=ke("div","wb-led-group-head");return B.appendChild(ke("span")).textContent=`${O} · ${z}`,B.appendChild(ke("span","wb-led-group-hint")).textContent=Ne,Q.appendChild(B),e.appendChild(Q),Q},C=(O,z)=>{const se=Mt(O);return{brief:O.brief,team:O.team,sender:kn(O),taskId:O.taskId,atText:`${En(O.startedAt,s)} 前${se?"收到":"派发"}`,inbound:se,tone:z,chips:[...O.settleable===!0?["可结算"]:[],...O.receiptExpected===!1?["无回执债"]:[],...se?["入站"]:[],...O.status!=="pending"?[O.status]:[]]}},I=(O,z,se)=>({brief:O.brief,team:O.team,sender:kn(O),taskId:O.taskId,atText:`${En(O.deadAt,s)} 前${se}`,inbound:Mt(O),tone:z,dead:O,chips:O.reason!==void 0&&O.reason!==""&&O.reason!=="unspecified"&&O.reason!=="fire-forget"?[O.reason]:[]}),u=k("死信",c.deadLetters.length,"danger","需清账");if(u!==null)for(const O of[...c.deadLetters].sort((z,se)=>se.deadAt-z.deadAt))Z(u,I(O,"danger","死信"));const h=k("陈旧",_.length,"warn","我方派发 ≥1 小时仍无回执,可催办");if(h!==null)for(const O of[..._].sort((z,se)=>z.startedAt-se.startedAt))Z(h,C(O,"warn"));const S=c.owedOverdue.length,w=k("待本机回执",p.length,S>0?"warn":"quiet",S>0?`对方在等本机回执 · ${S} 条超过 1 小时`:"对方在等本机回执");if(w!==null)for(const O of[...p].sort((z,se)=>z.startedAt-se.startedAt))Z(w,C(O,_t(O,s)?"warn":"quiet"));const F=k("等待回执",N.length,"quiet","1 小时内");if(F!==null)for(const O of[...N].sort((z,se)=>se.startedAt-z.startedAt))Z(F,C(O,"quiet"));const x=k("免回执",m.length,"muted","不等回执,24h 后自动归档");if(x!==null)for(const O of m)Z(x,C(O,"muted"));const W=k("已过期(免回执)",c.expired.length,"muted","正常记账,不是失败");if(W!==null)for(const O of[...c.expired].sort((z,se)=>se.deadAt-z.deadAt))Z(W,I(O,"muted","过期"));o.length+i.length===0&&(e.appendChild(ke("div","wb-led-empty")).textContent="台账为空——没有待回执的任务");const D=n.idempotency,ie=(Le=n.reconcile)==null?void 0:Le.state;if(D!==void 0||ie!==void 0){const O=ke("details","wb-led-forensics wb-forensics");O.appendChild(ke("summary")).textContent="取证";const z=ke("div","wb-led-forensics-body");D!==void 0&&(z.appendChild(ke("div")).textContent=`幂等 claims ${D.claimsFresh??0} · replays ${D.replays??0} · conflicts ${D.conflicts??0}`),ie!==void 0&&(z.appendChild(ke("div")).textContent=`reconcile ${ie}`),O.appendChild(z),e.appendChild(O)}const Ee=l.length+c.deadLetters.length;return{badge:Ee>0?String(Ee):"",tone:c.deadLetters.length>0?"danger":G>0||S>0?"warn":void 0}}const At=4e3,ko=32;function fe(e,t){const n=document.createElement(e);return t!==void 0&&(n.className=t),n}function Dt(e,t,n=""){const s=fe("button",`wb-icon-btn wb-chat-act ${n}`.trim());return s.type="button",s.setAttribute("aria-label",e),s.title=e,s.textContent=t,s}function tn(e,t){const n=Math.max(0,Math.round((t-e)/1e3));if(n<60)return"刚刚";const s=Math.round(n/60);if(s<60)return`${s} 分钟前`;const o=Math.round(s/60);return o<48?`${o} 小时前`:`${Math.round(o/24)} 天前`}function Eo(e){return e>=1e6?`${(e/1e6).toFixed(1)} MB`:e>=1e3?`${Math.round(e/1e3)} KB`:`${e} B`}function nn(e){const t=e.kind==="session"||e.kind==="remote"?e.team:void 0;return t!==void 0&&t!==""?t:void 0}function $n(e){return e.kind==="remote"?`remote:${e.team}`:`${e.kind}:${e.id}`}function $o(e){let t=null,n=null,s=!1,o=!1;const i=new Map,r=new Map,c=new Map,m=new Map,l=new Set,p=new Map,b=new Map,_=fe("aside","wb-chat");_.setAttribute("aria-label","对话");const N=fe("div","wb-chat-head"),G=Dt("返回会话列表","‹","wb-chat-back"),ue=fe("span","wb-chat-dot"),Z=fe("div","wb-chat-titles"),k=fe("span","wb-chat-title"),C=fe("span","wb-chat-sub");Z.append(k,C);const I=Dt("刷新对话","↻","wb-chat-refresh"),u=Dt("会话详情","ⓘ","wb-chat-info-btn");u.setAttribute("aria-expanded","false");const h=Dt("关闭对话","✕","wb-chat-close");N.append(G,ue,Z,I,u,h);const S=fe("div","wb-chat-info");S.hidden=!0;const w=fe("div","wb-chat-thread");w.setAttribute("role","log"),w.setAttribute("aria-live","polite"),w.tabIndex=0;const F=fe("div","wb-chat-notice"),x=fe("div","wb-chat-log"),W=fe("div","wb-chat-sent");w.append(F,x,W);const D=fe("div","wb-chat-foot");_.append(N,S,w,D),G.addEventListener("click",()=>{(t==null?void 0:t.kind)==="peer"&&(t.picked=void 0,Pe())}),I.addEventListener("click",()=>{if(t===null)return;const d=ie(t);d!==void 0&&i.delete(d),t.kind==="peer"&&t.picked===void 0&&t.url!==void 0&&c.delete(`peer:${t.url}`),Te(!0)}),u.addEventListener("click",()=>{o=!o,S.hidden=!o,u.setAttribute("aria-expanded",String(o))}),h.addEventListener("click",()=>yt()),w.addEventListener("scroll",()=>{const d=t!==null?ie(t):void 0;d!==void 0&&r.set(d,w.scrollTop)}),document.addEventListener("keydown",d=>{if(d.key!=="Escape"||!_.classList.contains("is-open"))return;const A=d.target;if(A instanceof HTMLElement){if(!_.contains(A)){const L=A instanceof HTMLTextAreaElement||A instanceof HTMLInputElement||A.isContentEditable,U=A.closest(".wb-stage-board")!==null;if(L||U)return}yt()}});function ie(d){if(d.kind==="session"||d.kind==="log")return e.sessionLog!==void 0?`local:${d.id}`:void 0;if(d.kind==="remote")return e.remoteSessionLog!==void 0?`remote:${d.team}`:void 0;if(d.picked!==void 0&&d.url!==void 0&&e.remoteSessionLog!==void 0)return`peer:${d.url}:${d.picked}`}function Ee(d){var A,L,U;return d.kind==="session"||d.kind==="log"?((A=e.sessionLog)==null?void 0:A.call(e,d.id))??Promise.resolve({ok:!1,error:"sessionLog unavailable"}):d.kind==="remote"?((L=e.remoteSessionLog)==null?void 0:L.call(e,{team:d.team}))??Promise.resolve({ok:!1,error:"remoteSessionLog unavailable"}):((U=e.remoteSessionLog)==null?void 0:U.call(e,{peer:d.url,id:d.picked}))??Promise.resolve({ok:!1,error:"remoteSessionLog unavailable"})}function Le(){const d=t;if(d===null)return;const A=d.kind==="log"||d.kind==="remote"||d.kind==="session"&&d.live===!1;ue.className=`wb-chat-dot ${d.kind==="peer"?"is-peer":A?"is-cold":"is-live"}`,ue.title=d.kind==="peer"?"对端主机":d.kind==="log"?"只读日志":d.kind==="remote"?"远端会话":d.live===!1?"冷会话":"在线",k.textContent=d.kind==="peer"&&d.picked!==void 0?`…${d.picked.slice(-12)}`:d.title,C.textContent=d.kind==="peer"&&d.picked!==void 0?d.title:d.sub,G.hidden=!(d.kind==="peer"&&d.picked!==void 0)}function O(d,A){const L=fe("div","wb-kv");L.appendChild(fe("span","wb-kv-k")).textContent=d,L.appendChild(fe("span","wb-kv-v")).textContent=A,S.appendChild(L)}function z(){var A,L,U;S.replaceChildren();const d=t;d!==null&&(d.kind==="session"?(O("会话",d.id),d.team!==void 0&&O("路由",d.team),O("来源","本机会话日志")):d.kind==="log"?(O("会话",d.id),O("来源","本机会话日志(不在网络目录)")):d.kind==="remote"?(O("路由",d.team),((A=d.row)==null?void 0:A.origin)!==void 0&&O("来源",d.row.origin),((L=d.row)==null?void 0:L.via)!==void 0&&O("经",d.row.via),((U=d.row)==null?void 0:U.workspace)!==void 0&&O("工作区",d.row.workspace)):(O("对端",d.url??d.sub),d.picked!==void 0&&O("会话",d.picked),O("来源","经本机代理读取对端 /a2a/log")))}function se(d){return d.kind==="log"?"只读日志 —— 此会话当前不在网络目录(可能已归档或未入网)。":d.kind==="remote"?e.remoteSessionLog!==void 0?"远端会话 —— 经本机代理从对端 /a2a/log 读取最近对话。":"远端节点的对话记录在对端机器上;本页的代理读取面未启用。":d.kind==="peer"?d.url===void 0||e.remoteSessionLog===void 0?`对端主机节点(${d.sub})—— 会话记录存放在对端机器上,本页只读本机会话日志。`:d.picked===void 0?"对端主机 —— 选择一个会话阅读(经本机代理读取对端 /a2a/log)。":"":e.sessionLog===void 0?"本页未接入会话日志读取,只显示从这里发出的消息。":""}function Ne(){return w.scrollHeight-w.scrollTop-w.clientHeight<=ko}function Q(d){const A=()=>{w.scrollTop=w.scrollHeight};A(),requestAnimationFrame(A)}function B(d,A){const L=fe("div",`wb-chat-empty${A==="error"?" is-error":""}`);return L.textContent=d,L}function ve(d,A){const L=d==="user",U=fe("div",`wb-msg ${L?"wb-msg-user":"wb-msg-assistant"}`),Y=fe("span","wb-msg-who");Y.textContent=L?"问":"答";const de=fe("div","wb-msg-text");return de.textContent=A,U.append(Y,de),U}function le(d){if(x.replaceChildren(),d===void 0){x.appendChild(B("读取中…"));return}if(d.ok!==!0||d.messages===void 0){x.appendChild(B(`无法读取(${d.error??"未知错误"})`,"error"));return}if(d.messages.length===0){x.appendChild(B("暂无对话记录"));return}for(const A of d.messages)x.appendChild(ve(A.role,A.text))}function ye(d,A){if(x.replaceChildren(),A===void 0){x.appendChild(B("读取中…"));return}if(A.ok!==!0||A.sessions===void 0){x.appendChild(B(`无法读取(${A.error??"未知错误"})`,"error"));return}if(A.sessions.length===0){x.appendChild(B("对端没有可读会话"));return}const L=fe("div","wb-chat-sessions"),U=e.now();for(const Y of A.sessions){const de=fe("button","wb-chat-session");de.type="button",de.appendChild(fe("span","wb-chat-session-id")).textContent=`…${Y.id.slice(-12)}`;const ae=[Y.mtimeMs!==void 0?tn(Y.mtimeMs,U):"",Eo(Y.sizeBytes)].filter(Boolean).join(" · ");de.appendChild(fe("span","wb-chat-session-meta")).textContent=ae,de.title=Y.id,de.addEventListener("click",()=>{(t==null?void 0:t.kind)!=="peer"||t.url!==d||(t.picked=Y.id,Pe())}),L.appendChild(de)}x.appendChild(L)}function Te(d=!1){const A=t;if(A===null)return;if(F.textContent=se(A),F.hidden=F.textContent==="",A.kind==="peer"&&A.picked===void 0){if(A.url===void 0||e.remoteSessionLog===void 0){x.replaceChildren();return}const Y=A.url,de=`peer:${Y}`;if(!d&&c.has(de)){ye(Y,c.get(de));return}c.set(de,void 0),ye(Y,void 0),e.remoteSessionLog({peer:Y}).then(ae=>{c.set(de,ae),(t==null?void 0:t.kind)==="peer"&&t.url===Y&&t.picked===void 0&&ye(Y,ae)},ae=>{const pe={ok:!1,error:ae instanceof Error?ae.message:String(ae)};c.set(de,pe),(t==null?void 0:t.kind)==="peer"&&t.url===Y&&t.picked===void 0&&ye(Y,pe)});return}const L=ie(A);if(L===void 0){x.replaceChildren(),Ye(!0);return}const U=()=>{const Y=r.get(L);Y===void 0||d?Q():(w.scrollTop=Y,requestAnimationFrame(()=>{t!==null&&ie(t)===L&&(w.scrollTop=Y)}))};if(!d&&i.has(L)&&i.get(L)!==void 0){le(i.get(L)),Ye(!0),U();return}d&&r.delete(L),i.set(L,void 0),le(void 0),Ye(!0),Ee(A).then(Y=>{var de;i.set(L,Y),(Y==null?void 0:Y.ok)===!0&&Y.messages!==void 0&&((de=e.onTranscript)==null||de.call(e,A,Y.messages)),!(t===null||ie(t)!==L)&&(le(Y),Ye(),U())},Y=>{const de={ok:!1,error:Y instanceof Error?Y.message:String(Y)};i.set(L,de),t!==null&&ie(t)===L&&le(de)})}function Qe(d){return((n==null?void 0:n.tasks)??[]).filter(A=>A.team===d)}function Je(d){return((n==null?void 0:n.tasksDead)??[]).filter(A=>A.team===d)}let Ke="";function bt(d){return d.reason==="fire-forget"?{text:"已过期(免回执)",tone:"muted",hint:"免回执消息到 24h TTL 归档,属正常记账"}:{text:"死信",tone:"danger",hint:d.reason!==void 0&&d.reason!=="unspecified"?`${d.reason}:超过 24h TTL 仍未结算,需在台账清账`:"超过 24h TTL 仍未结算,需在台账清账"}}function He(d,A){const L=d.direction==="inbound";if(d.receiptExpected===!1)return{text:L?"来信 · 无需回执":"已送达 · 无回执",tone:"muted",hint:"免回执消息:不等回执,24h 后自动归档"};const U=_t(d,A),Y=L?U?"待本机回执 · 超 1 小时":"待本机回执":U?"陈旧":"待回执",de=d.status!=="pending"?` · ${d.status}`:"";return{text:`${Y}${de}`,tone:U?"warn":"wait",hint:`${L?"对方等待本机回执;":""}${L?"收到":"派发"}于 ${tn(d.startedAt,A)}`}}function Ve(d,A){const L=`结算于 ${tn(d.resolvedAt,A)}`;if(d.receiptExpected===!1&&d.endedBy==="abandoned")return d.late===!0?{text:"已移出(免回执) · 回执迟到",tone:"warn",hint:`${L};免回执消息本机移出后对方回执才到,结局不改写`}:{text:"已移出(免回执)",tone:"muted",hint:`${L};免回执消息,本机移出台账,不是失败`};if(d.endedBy==="abandoned"||d.endedBy==="cancelled"){const ae=d.endedBy==="cancelled"?"撤回":"放弃";return d.late===!0?{text:`已${ae} · 回执迟到`,tone:"warn",hint:`${L};本机${ae}之后对方回执才到,结局不改写`}:{text:`已${ae}`,tone:"muted",hint:`${L};本机${ae},未等到回执`}}if(d.endedBy==="echo")return{text:"已结算 · 内容回显",tone:"ok",hint:`${L};对方回了内容但未带正式回执,按内容回显结算`};if(d.endedBy===void 0&&d.outcome==="abandoned")return{text:"已放弃(本机或对方)",tone:"muted",hint:`${L};本机放弃或撤回,或对方回执报告放弃`};const U=d.summary!==void 0&&d.summary!==""?` · ${d.summary}`:"";if(d.outcome==="abandoned")return{text:"已回执 · 对方放弃",tone:"warn",hint:`${L};对方回执报告放弃${U}`};const Y=an.find(ae=>ae.key===d.outcome),de=(Y==null?void 0:Y.tone)==="completed"?"ok":(Y==null?void 0:Y.tone)==="failed"?"danger":(Y==null?void 0:Y.tone)==="rejected"?"warn":"muted";return d.outcome==="unclassified"?{text:"已回执",tone:"ok",hint:`${L};回执未带结论${U}`}:{text:`已回执 · ${(Y==null?void 0:Y.label)??d.outcome}`,tone:de,hint:`${L}${U}`}}function rt(d,A,L){const U=Je(A).find(ae=>ae.taskId===d);if(U!==void 0)return bt(U);const Y=Qe(A).find(ae=>ae.taskId===d);if(Y!==void 0)return He(Y,L);const de=((n==null?void 0:n.archived)??[]).find(ae=>ae.taskId===d&&ae.team===A);return de!==void 0?Ve(de,L):l.has(d)?{text:"已离开台账",tone:"muted",hint:"已结算、放弃或撤回之一;主机未给出这条的结局(旧主机,或已超出最近 64 条归档)"}:{text:"已派发",tone:"muted",hint:"异步送达;回执到达后进台账"}}function gt(d){const A=e.now(),L=m.get(d)??[],U=new Set(L.map(oe=>oe.taskId).filter(oe=>oe!==void 0)),Y=oe=>oe!==void 0&&oe!==""?oe:"(无摘要)",de=Qe(d).filter(oe=>!U.has(oe.taskId)).map(oe=>({at:oe.startedAt,side:oe.direction==="inbound"?"theirs":"mine",text:Y(oe.brief),status:He(oe,A),taskId:oe.taskId})),ae=Je(d).filter(oe=>!U.has(oe.taskId)).map(oe=>{var qe;const xe=oe.direction??p.get(oe.taskId)??(((qe=oe.peer)==null?void 0:qe.startsWith("local:"))===!0?"inbound":void 0);return{at:oe.startedAt,side:xe==="inbound"?"theirs":xe==="outbound"?"mine":"system",text:Y(oe.brief),status:bt(oe),taskId:oe.taskId}}),pe=L.map(oe=>({at:oe.at,side:"mine",text:oe.text,status:oe.state==="sending"?{text:"发送中…",tone:"muted"}:oe.state==="failed"?{text:`失败:${oe.error??"未知原因"}`,tone:"danger"}:oe.taskId!==void 0?rt(oe.taskId,d,A):{text:"已派发",tone:"muted"},taskId:oe.taskId}));return[...de,...ae,...pe].sort((oe,xe)=>oe.at-xe.at)}function Ye(d=!1){const A=t,L=A!==null?nn(A):void 0,U=L!==void 0?gt(L):[],Y=JSON.stringify([L??"",...U.map(pe=>[pe.taskId??"",pe.side,pe.text,pe.status.text])]);if(!d&&Y===Ke)return;Ke=Y;const de=Ne();if(W.replaceChildren(),U.length===0)return;const ae=fe("div","wb-chat-divider");ae.textContent="台账往来 · 异步送达,回执进台账",W.appendChild(ae);for(const pe of U){const oe=pe.side==="mine"?"wb-msg wb-msg-user wb-msg-out":pe.side==="theirs"?"wb-msg wb-msg-assistant wb-msg-in":"wb-msg wb-msg-ledger",xe=fe("div",oe);xe.appendChild(fe("span","wb-msg-who")).textContent=pe.side==="mine"?"我":pe.side==="theirs"?"对方":"台账记录",xe.appendChild(fe("div","wb-msg-text")).textContent=pe.text;const qe=fe("div","wb-msg-meta");pe.taskId!==void 0&&(qe.appendChild(fe("span","wb-msg-task")).textContent=pe.taskId);const Re=fe("span",`wb-msg-status is-${pe.status.tone}`);Re.textContent=pe.status.text,pe.status.hint!==void 0&&(Re.title=pe.status.hint),qe.appendChild(Re),xe.appendChild(qe),W.appendChild(xe)}de&&Q()}function We(d){const A=d.text.value.length;d.note.classList.remove("is-error"),d.note.textContent=A>At*.9?`${A}/${At}`:"Enter 发送 · Shift+Enter 换行",A>At&&d.note.classList.add("is-error"),d.submit.disabled=d.text.value.trim()===""||A>At}function vt(d){d.style.height="auto",d.style.height=`${Math.min(d.scrollHeight,160)}px`}function ut(d){const A=fe("form","wb-dispatch-form wb-chat-composer"),L=document.createElement("textarea");L.className="wb-dispatch-text",L.rows=1,L.placeholder="发一句话任务给这个节点…",L.setAttribute("aria-label","发送消息");const U=fe("button","wb-dispatch-submit");U.type="submit",U.textContent="发送",U.setAttribute("aria-label","发送");const Y=fe("div","wb-dispatch-note");Y.setAttribute("aria-live","polite");const de=fe("div","wb-chat-composer-row");de.append(L,U),A.append(de,Y);const ae={team:d,form:A,text:L,note:Y,submit:U};return L.addEventListener("input",()=>{vt(L),We(ae)}),L.addEventListener("keydown",pe=>{pe.key!=="Enter"||pe.shiftKey||pe.ctrlKey||pe.altKey||pe.metaKey||pe.isComposing||(pe.preventDefault(),A.requestSubmit())}),A.addEventListener("submit",pe=>{pe.preventDefault();const oe=L.value.trim();if(oe===""||oe.length>At||e.dispatchQuick===void 0)return;const xe={text:oe,at:e.now(),state:"sending"},qe=m.get(d)??[];qe.push(xe),m.set(d,qe),L.value="",vt(L),We(ae),L.focus({preventScroll:!0}),Ye(),Q(),e.dispatchQuick(d,oe).then(Re=>Re,Re=>({ok:!1,error:Re instanceof Error?Re.message:String(Re)})).then(Re=>{Re.ok===!0?(xe.state="sent",xe.taskId=Re.task_id,Y.classList.remove("is-error"),Y.textContent=`已派发${Re.task_id!==void 0?` · ${Re.task_id}`:""} · 回执将入台账`):(xe.state="failed",xe.error=Re.error??"未知原因",L.value===""&&(L.value=oe,vt(L)),Y.classList.add("is-error"),Y.textContent=`失败:${xe.error}`,U.disabled=L.value.trim()===""),t!==null&&nn(t)===d&&Ye()})}),We(ae),ae}function we(){const d=t;if(D.replaceChildren(),d===null)return;const A=nn(d);if(A!==void 0&&e.dispatchQuick!==void 0){let U=b.get(A);U===void 0&&(U=ut(A),b.set(A,U)),D.appendChild(U.form),s&&(s=!1,U.text.focus({preventScroll:!0}));return}s=!1;const L=fe("div","wb-chat-readonly");L.textContent=d.kind==="log"?"只读日志:此会话不在网络目录,不能从这里派发。":d.kind==="peer"?"对端主机:选择会话阅读;要派发请打开它的远端会话节点。":"此节点没有可派发的路由。",D.appendChild(L)}function Pe(){Le(),z(),Te(),we()}function Ge(d){const A=t!==null&&$n(t)===$n(d);t=d,A||(s=!0),Pe(),_.classList.add("is-open")}function yt(){t=null,_.classList.remove("is-open")}function at(d){n=d;for(const L of(d==null?void 0:d.tasks)??[])l.add(L.taskId),p.set(L.taskId,L.direction==="inbound"?"inbound":"outbound");const A=t;if(A!==null){if(A.kind==="session"&&d!==null){const L=(d.sessions??[]).find(U=>U.id===A.id);L!==void 0&&(A.title=st(L),A.live=L.live)}Le(),Ye()}}return{root:_,open:Ge,close:yt,isOpen:()=>t!==null,update:at}}const Gn="dsh-a2a.rail.tab";function No(){try{return window.localStorage.getItem(Gn)}catch{return null}}function Mo(e){try{window.localStorage.setItem(Gn,e)}catch{}}function So(e,t={}){var Z;const n=document.createElement("aside");n.className="wb-rail";const s=document.createElement("div");s.className="wb-tabs",s.setAttribute("role","tablist"),s.setAttribute("aria-label","工作台侧栏");const o=document.createElement("div");o.className="wb-tabpanels",n.append(s,o);const i=new Map,r=new Map,c=new Map,m=new Set;for(const k of e){const C=document.createElement("button");C.type="button",C.className="wb-tab",C.id=`wb-tab-${k.key}`,C.dataset.sec=k.key,C.setAttribute("role","tab"),C.setAttribute("aria-controls",`wb-panel-${k.key}`);const I=document.createElement("span");I.className="wb-tab-label",I.textContent=k.label;const u=document.createElement("span");u.className="wb-tab-badge",C.append(I,u),C.addEventListener("click",()=>N(k.key)),s.appendChild(C);const h=document.createElement("section");h.className="wb-tabpanel",h.id=`wb-panel-${k.key}`,h.dataset.sec=k.key,h.setAttribute("role","tabpanel"),h.setAttribute("aria-labelledby",C.id),h.tabIndex=-1,o.appendChild(h),i.set(k.key,C),r.set(k.key,h),c.set(k.key,u)}const l=()=>e.map(k=>k.key).filter(k=>!m.has(k)),p=No();let b=((Z=e.find(k=>k.key===p))==null?void 0:Z.key)??e[0].key;s.addEventListener("keydown",k=>{const C=l(),I=C.indexOf(b);let u;k.key==="ArrowRight"?u=C[(I+1)%C.length]:k.key==="ArrowLeft"?u=C[(I-1+C.length)%C.length]:k.key==="Home"?u=C[0]:k.key==="End"&&(u=C[C.length-1]),u!==void 0&&(k.preventDefault(),N(u,{focus:!0}))});function _(){for(const k of e){const C=k.key===b,I=i.get(k.key);I.setAttribute("aria-selected",String(C)),I.tabIndex=C?0:-1,I.classList.toggle("is-active",C),I.hidden=m.has(k.key),r.get(k.key).hidden=!C}}function N(k,C={}){var u;if(m.has(k))return;const I=k!==b;b=k,Mo(k),_(),C.focus===!0&&i.get(k).focus(),I&&((u=t.onChange)==null||u.call(t,k))}function G(k,C,I){const u=c.get(k);u.textContent=C,u.className=`wb-tab-badge${I!==void 0?` is-${I}`:""}`}function ue(k,C){C?m.add(k):m.delete(k),m.has(b)&&(b=l()[0]??e[0].key),_()}return _(),{root:n,panel:k=>r.get(k),select:N,selected:()=>b,setBadge:G,setHidden:ue}}const Ao=[{key:"all",label:"全部",hint:"不过滤:目录全部条目"},{key:"local",label:"本机",hint:"本机会话节点(现场 + 冷启动)"},{key:"canvas",label:"队",hint:"画布队(人类手工分配的组队)"},{key:"remote",label:"远端",hint:"远端会话队(来自对端卡片)"},{key:"logs",label:"日志",hint:"本机日志:不在网络目录里的会话档案"}];function et(e,t){const n=document.createElement(e);return t!==void 0&&(n.className=t),n}function Bt(...e){const t=[];for(const n of e)n!==void 0&&(typeof n=="string"?t.push(n):t.push(...n));return t.join(" ").toLowerCase()}function Lo(e,t){const n=Math.max(0,Math.round((t-e)/1e3));if(n<60)return"刚刚";const s=Math.round(n/60);if(s<60)return`${s} 分钟前`;const o=Math.round(s/60);return o<48?`${o} 小时前`:`${Math.round(o/24)} 天前`}function Nn(e){return e>=1e6?`${(e/1e6).toFixed(1)} MB`:e>=1e3?`${Math.round(e/1e3)} KB`:`${e} B`}function Io(e,t){const n=new Date(t);n.setHours(0,0,0,0);const s=n.getTime();return e>=s?"今天":e>=s-864e5?"昨天":"更早"}function To(e,t){var I;e.replaceChildren();const{state:n,search:s,filter:o}=t,i=s!==""||o!=="all",r=(u,h)=>(o==="all"||o===u)&&(s===""||h.includes(s)),c=(u,h,S)=>{const w=et("div","wb-dir-group"),F=et("div","wb-dir-head");return F.appendChild(et("span","wb-dir-head-label")).textContent=`${u} · ${h}`,S!==void 0&&(F.appendChild(et("span","wb-dir-head-note")).textContent=S),w.appendChild(F),e.appendChild(w),w},m=(u,h,S,w,F,x,W)=>{const D=et("button","wb-item");D.type="button",D.appendChild(et("span",`wb-dot ${h}`)).textContent=S;const ie=et("span","wb-item-text");return ie.appendChild(et("span","wb-item-label")).textContent=w,F!==""&&(ie.appendChild(et("span","wb-item-sub")).textContent=F),D.appendChild(ie),W!==void 0&&(D.title=W),D.addEventListener("click",x),u.appendChild(D),D},l=(u,h)=>{if(h===void 0||h.length===0)return;const S=et("span","wb-item-badge"),w=h.map(F=>F.slice(F.lastIndexOf("/")+1));S.textContent=`▤ ${w.slice(0,2).join(" ")}${w.length>2?` +${w.length-2}`:""}`,S.title=`画布队:${h.join(" · ")}`,u.appendChild(S)},p=(n.sessions??[]).filter(u=>r("local",Bt(st(u),u.team,u.label,u.id,u.canvasTeams))),b=p.filter(u=>u.live===!0),_=p.filter(u=>u.live!==!0);if(p.length>0){const u=c("本机会话",p.length,_.length>0?`${b.length} 在线 · ${_.length} 冷`:void 0);for(const h of[...b,..._]){const S=h.live===!0,w=m(u,S?"wb-dot-live":"wb-dot-cold",S?"●":"○",st(h),S?h.team:`冷 · ${h.team}`,()=>t.openChat({kind:"session",id:h.id,title:st(h),sub:h.team,team:h.team,live:h.live}),h.id);l(w,h.canvasTeams)}}const N=(((I=n.canvas)==null?void 0:I.teams)??[]).filter(u=>r("canvas",Bt(u.name,u.team,u.members.map(h=>h.team??h.id))));if(N.length>0){const u=c("画布队",N.length);for(const h of N){const S=h.members.filter(w=>w.remote===!0).length;m(u,"wb-dot-canvas","▤",h.name,`${h.members.length} 成员${S>0?` · ${S} 远端`:""}`,()=>t.selectCanvas(h),h.team)}}const G=(n.remote??[]).filter(u=>r("remote",Bt(st(u),u.team,u.origin,u.workspace,u.canvasTeams)));if(G.length>0){const u=c("远端节点",G.length);for(const h of G){const S=m(u,"wb-dot-remote","◇",st(h),h.origin!==void 0&&h.origin!==""?h.origin:h.team,()=>t.openChat({kind:"remote",team:h.team,title:st(h),sub:h.team,row:h}),h.team);l(S,h.canvasTeams)}}const ue=new Set((n.sessions??[]).map(u=>u.id)),Z=t.logs.filter(u=>!ue.has(u.id)&&r("logs",Bt(u.id,t.titles.get(u.id))));if(Z.length>0){const u=t.logTotal!==void 0&&t.logTotal>t.logs.length,h=c("本机日志",Z.length,u?`显示 ${t.logs.length} / 共 ${t.logTotal}`:void 0);let S="";for(const w of[...Z].sort((F,x)=>x.mtimeMs-F.mtimeMs)){const F=Io(w.mtimeMs,t.now);F!==S&&(S=F,h.appendChild(et("div","wb-dir-day")).textContent=F);const x=t.titles.get(w.id),W=m(h,"wb-dot-log","❐",x??`会话 …${w.id.slice(-12)}`,`${Lo(w.mtimeMs,t.now)} · ${Nn(w.sizeBytes)}`,()=>t.openChat({kind:"log",id:w.id,title:x??`…${w.id.slice(-12)}`,sub:"本机日志"}),`${w.id}
3
- ${new Date(w.mtimeMs).toLocaleString()} · ${Nn(w.sizeBytes)}`);x===void 0&&W.classList.add("is-untitled")}}p.length+N.length+G.length+Z.length===0&&(e.appendChild(et("div","wb-dir-empty")).textContent=i?"无匹配条目":"目录为空");const k=n.sessions??[];return`${k.filter(u=>u.live===!0).length}/${k.length}`}const Qn="dsh-a2a.logtitles",_o=300,Mn=60;function Oo(){try{const e=window.localStorage.getItem(Qn),t=e===null?null:JSON.parse(e);if(t!==null&&typeof t=="object")return new Map(Object.entries(t).filter(n=>typeof n[1]=="string"))}catch{}return new Map}function Fo(e,t,n){const s=n.find(r=>r.role==="user"&&r.text.trim()!=="")??n.find(r=>r.text.trim()!=="");if(s===void 0)return!1;const o=s.text.trim().split(`
4
- `)[0].trim(),i=o.length>Mn?`${o.slice(0,Mn-1)}…`:o;if(e.get(t)===i)return!1;for(e.delete(t),e.set(t,i);e.size>_o;)e.delete(e.keys().next().value);try{window.localStorage.setItem(Qn,JSON.stringify(Object.fromEntries(e)))}catch{}return!0}function ct(e){return e.name??e.team??e.label??""}function Lt(e,t){const n=Math.max(0,Math.round((t-e)/1e3));if(n<90)return`${n}s`;const s=Math.round(n/60);if(s<90)return`${s}m`;const o=Math.round(s/60);return o<48?`${o}h`:`${Math.round(o/24)}d`}function T(e,t){const n=document.createElement(e);return t!==void 0&&(n.className=t),n}function Sn(e,t,n){const s=T("div","wb-kv");s.appendChild(T("span","wb-kv-k")).textContent=t,s.appendChild(T("span","wb-kv-v")).textContent=n,e.appendChild(s)}function Po(e){try{return new URL(e).host}catch{return e}}const Ro=[{key:"directory",label:"目录"},{key:"hosts",label:"主机"},{key:"ledger",label:"台账"},{key:"activity",label:"活动"},{key:"plan",label:"规划"}];function Do(e){const t=e.board;let n="data",s,o=null,i="",r="all",c=null,m=null,l=[],p;const b=Oo();let _=!1;const N=T("div","wb");N.setAttribute("data-testid","wb-root");const G=T("header","wb-header"),ue=T("button","wb-icon-btn wb-menu");ue.type="button",ue.dataset.testid="wb-menu",ue.setAttribute("aria-label","打开目录抽屉"),ue.textContent="☰",ue.addEventListener("click",()=>N.classList.toggle("is-rail-open")),G.appendChild(ue);const Z=T("div","wb-title");Z.appendChild(T("span","wb-title-main")).textContent="A2A 工作台";const k=T("span","wb-badge");Z.appendChild(k),G.appendChild(Z);const C=T("button","wb-icon-btn wb-owner-btn");C.type="button",C.dataset.testid="wb-owner-btn",C.setAttribute("aria-label","主人设置(三键面板)"),C.title="主人设置:入网白名单 / 可见性 / 发布",C.textContent="⚙",C.addEventListener("click",()=>{at=!at,A()}),G.appendChild(C);const I=T("div","wb-header-stats");G.appendChild(I);const u=T("button","wb-icon-btn wb-rail-toggle");u.type="button",u.dataset.testid="wb-rail-toggle",u.setAttribute("aria-label","折叠/展开侧栏"),u.textContent="◧",u.addEventListener("click",()=>{N.classList.toggle("is-rail-collapsed"),n==="canvas"&&t!==void 0&&t.activate()}),G.appendChild(u);const h=T("div","wb-body"),S=So(Ro),w=S.root,F=T("div","wb-directory"),x=T("div","wb-dir-tools"),W=document.createElement("input");W.className="wb-search",W.type="search",W.placeholder="搜索:名称 / 队 / 会话 / 节点",W.setAttribute("aria-label","统一搜索目录"),W.addEventListener("input",()=>{i=W.value.trim().toLowerCase(),He()}),x.appendChild(W);const D=T("div","wb-filters");for(const E of Ao){const g=T("button","wb-filter");g.type="button",g.textContent=E.label,g.dataset.filter=E.key,g.title=E.hint,g.addEventListener("click",()=>{r=E.key,He()}),D.appendChild(g)}x.appendChild(D),S.panel("directory").appendChild(x),S.panel("directory").appendChild(F);const ie=T("section","wb-pane"),Ee=T("section","wb-pane"),Le=T("section","wb-pane"),O=T("section","wb-pane"),z=[["ledger",ie],["activity",Ee],["plan",Le],["hosts",O]],se=T("main","wb-stage"),Ne=T("section","wb-stage-board");t!==void 0&&(Ne.appendChild(t.root),se.appendChild(Ne));const Q=T("div","wb-data"),B=T("aside","wb-inspector"),ve=T("div","wb-inspector-head");ve.appendChild(T("span","wb-inspector-title")).textContent="详情";const le=T("button","wb-icon-btn");le.type="button",le.setAttribute("aria-label","关闭详情"),le.textContent="✕",le.addEventListener("click",()=>bt(void 0)),ve.appendChild(le),B.appendChild(ve);const ye=T("div","wb-inspector-body");B.appendChild(ye);const Te=$o({now:e.now,sessionLog:e.sessionLog,remoteSessionLog:e.remoteSessionLog,dispatchQuick:e.dispatchQuick,onTranscript:(E,g)=>{E.kind!=="log"&&E.kind!=="session"||Fo(b,E.id,g)&&He()}});se.appendChild(Q),h.appendChild(w),h.appendChild(se),h.appendChild(B),h.appendChild(Te.root),N.appendChild(G),N.appendChild(h);function Qe(E){for(const[g,R]of z){const $=E==="canvas"?S.panel(g):Q;S.setHidden(g,E!=="canvas"),R.parentElement!==$&&$.appendChild(R)}}function Je(){const g=t!==void 0&&t.available()?"canvas":"data";N.dataset.mode=g,Ne.classList.toggle("is-hidden",g!=="canvas"),Q.classList.toggle("is-hidden",g==="canvas"),Qe(g),g!==n&&(t!==void 0&&(g==="canvas"?t.activate():t.deactivate()),n=g)}function Ke(E){for(;E.firstChild!==null;)E.removeChild(E.firstChild);return E}function bt(E){s=E,((E==null?void 0:E.kind)!=="canvas"||(c==null?void 0:c.name)!==E.row.name)&&(c=null),(E==null?void 0:E.kind)!=="canvas"&&(m=null),U(),N.classList.remove("is-rail-open")}function He(){for(let g=0;g<D.children.length;g++){const R=D.children[g];R.classList.toggle("is-active",R.dataset.filter===r)}if(o===null){F.replaceChildren(T("div","wb-muted")),F.firstElementChild.textContent="载入中…",S.setBadge("directory","");return}const E=To(F,{state:o,logs:l,logTotal:p,titles:b,search:i,filter:r,now:e.now(),openChat:ae,selectCanvas:g=>bt({kind:"canvas",row:g})});S.setBadge("directory",E)}function Ve(){const E=Ke(O);if(o===null){S.setBadge("hosts","");return}const g=e.now(),R=[...o.peers??[]].sort(($,P)=>{const H=ne=>ne.link==="linked"?0:1;return H($)-H(P)||(P.score??0)-($.score??0)});if(S.setBadge("hosts",R.length>0?`${R.filter($=>$.link==="linked").length}/${R.length}`:""),R.length===0){E.appendChild(T("div","wb-nodelist-empty")).textContent="暂无 tracked peer——配 peers 种子或等 referral 到达";return}for(const $ of R){const P=Po($.url),H=T("div","wb-host-row"),ne=T("span","wb-host-lamp"),re=$.lastContactAt,V=re===void 0?void 0:g-re,he=$.lastContactOk;V===void 0?ne.classList.add("is-unknown"):he===!1&&V<=5*6e4?ne.classList.add("is-fail"):V<=6e4?ne.classList.add("is-live"):V<=5*6e4?ne.classList.add("is-warm"):ne.classList.add("is-cold"),ne.title=re===void 0?"尚无接触记录":`最近接触 ${Lt(re,g)}${he===!1?"(失败)":he===!0?"(成功)":""}`,H.appendChild(ne),H.appendChild(T("span","wb-host-name")).textContent=$.name!==void 0&&$.name!==""?$.name:P;const _e=T("span",`wb-host-badge ${$.link==="linked"?"is-linked":"is-stranger"}`);_e.textContent=`${$.link==="linked"?"linked":"stranger"} ${$.verified===!0?"✓":"✗"}`,_e.title=$.link==="linked"?`已建立运营者链接(互种或 canvas 引用);${$.verified===!0?"验签有效":"尚未持有验签通过的卡片"}`:"无运营者关系(验签 ≠ 关系)",H.appendChild(_e),$.version!==void 0&&$.version!==""&&(H.appendChild(T("span","wb-host-ver")).textContent=$.version),H.appendChild(T("span","wb-host-url mono")).textContent=P,H.setAttribute("role","button"),H.tabIndex=0,H.title=`${$.url} · score ${String($.score??0)}`;const ee=()=>{ae({kind:"peer",id:`peer-${P}`,title:$.name!==void 0&&$.name!==""?$.name:P,sub:P,url:$.url})};H.addEventListener("click",ee),H.addEventListener("keydown",Oe=>{(Oe.key==="Enter"||Oe.key===" ")&&(Oe.preventDefault(),ee())}),E.appendChild(H)}}function rt(){if(o===null){ie.replaceChildren(),S.setBadge("ledger","");return}const E=o,g=$=>{const P=(E.sessions??[]).find(ne=>ne.team===$);if(P!==void 0)return{kind:"session",id:P.id,title:ct(P),sub:P.team,team:P.team,live:P.live};const H=(E.remote??[]).find(ne=>ne.team===$);if(H!==void 0)return{kind:"remote",team:H.team,title:ct(H),sub:H.team,row:H}},R=Co(ie,{state:E,now:e.now(),abandon:($,P)=>e.abandon($,P),canOpenTeam:$=>g($)!==void 0,openTeam:$=>{const P=g($);return P===void 0?!1:(ae(P),!0)}});S.setBadge("ledger",R.badge,R.tone)}function gt(E,g,R){Xt(E.appendChild(T("span","wb-row-team")),g,R)}function Ye(){var ne;const E=Ke(Ee);if(o===null)return;const g=e.now(),R=o.inFlight??[];S.setBadge("activity",R.length>0?String(R.length):"",R.length>0?"accent":void 0);const $=T("div","wb-pane-head");if($.textContent=`在途 ${R.length} · 活动 ${((ne=o.activity)==null?void 0:ne.length)??0}`,E.appendChild($),R.length>0){const re=T("div","wb-pane-subhead");re.textContent="在途路由",E.appendChild(re);for(const V of R){const he=T("div","wb-row");he.appendChild(T("span","wb-row-dir")).textContent="→",gt(he,o,V.team),he.appendChild(T("span","wb-row-meta")).textContent=`${V.peer} · ${Lt(V.startedAt,g)}`,E.appendChild(he)}}const P=T("div","wb-pane-subhead");P.textContent="活动环(最新在前)",E.appendChild(P);const H=o.activity??[];if(H.length===0){E.appendChild(T("div","wb-muted")).textContent="暂无活动";return}for(const re of H){const V=T("div","wb-row"),he=T("span","wb-row-dir");he.textContent=re.dir==="out"?"→":"←",re.ok!==!0&&he.classList.add("is-fail"),V.appendChild(he),gt(V,o,re.team),V.appendChild(T("span","wb-row-meta")).textContent=`${re.peer} · ${Lt(re.ts,g)}`,V.appendChild(T("span","wb-row-badges")).textContent=re.ok===!0?"":"失败",E.appendChild(V)}}function We(E){var ne,re;const g=e.now(),R=[],$=rn(E,g);$.deadLetters.length>0&&R.push({severity:"high",text:`清账 ${$.deadLetters.length} 条死信(目标早已离开或死信化,无回执可期)`});for(const V of $.stale){const he=V.brief===void 0||V.brief===""?"":`「${V.brief}」`;R.push({severity:"normal",text:`催办 ${V.taskId} → ${yo(E,V.team)}(等待 ${Lt(V.startedAt,g)} 无回执)${he}`,brief:`a2a_route 催收回执:task ${V.taskId}(team ${V.team})${he===""?"":`原任务「${V.brief}」`}已派发 ${Lt(V.startedAt,g)},请回报结果或回执。`})}const P=(E.sessions??[]).filter(V=>V.live!==!0).map(V=>ct(V));if(P.length>0){const V=P.slice(0,3).join("、")+(P.length>3?` 等 ${P.length} 个`:"");R.push({severity:"normal",text:`冷会话 ${P.length} 个(${V}):在 GUI 打开即可唤醒加入面`})}for(const V of((ne=E.reconcile)==null?void 0:ne.rows)??[])if(V.needsRepair===!0){const he=(E.sessions??[]).find(ee=>ee.id===V.id),_e=he!==void 0?`${ct(he)}(${V.id})`:V.id;R.push({severity:"high",text:`reconcile 需修复:${_e} ${V.error}`})}const H=((re=E.idempotency)==null?void 0:re.conflicts)??0;return H>0&&R.push({severity:"high",text:`幂等冲突 ${H} 例:人工核查 UNIQUE-ization 流量`}),R}function vt(){const E=Ke(Le);if(o===null)return;const g=We(o);S.setBadge("plan",g.length>0?String(g.length):"",g.some(P=>P.severity==="high")?"danger":void 0);const R=T("div","wb-pane-head");R.textContent=g.length===0?"网络健康——无待办行动":`待办行动 ${g.length}`,E.appendChild(R);for(const P of g){const H=T("div",`wb-action${P.severity==="high"?" wb-action-high":""}`);if(H.appendChild(T("span","wb-action-text")).textContent=P.text,P.brief!==void 0){const ne=T("button","wb-btn");ne.type="button",ne.textContent="复制催办",ne.addEventListener("click",()=>e.copy(P.brief??"")),H.appendChild(ne)}E.appendChild(H)}const $=T("div","wb-pane-subhead");$.textContent="派单起草(复制后在任一会话粘贴执行)",E.appendChild($),E.appendChild(ut)}const ut=T("div","wb-draft"),we=document.createElement("select");we.className="wb-select";const Pe=document.createElement("textarea");Pe.className="wb-textarea",Pe.rows=3,Pe.placeholder="任务正文:目标、验收、期限…";const Ge=T("button","wb-btn wb-btn-primary");Ge.type="button",Ge.textContent="复制任务书",Ge.addEventListener("click",()=>{const E=we.value,g=Pe.value.trim();E===""||g===""||e.copy(`a2a_route 派单 → ${E}:
5
- ${g}`)}),ut.appendChild(we),ut.appendChild(Pe),ut.appendChild(Ge);function yt(){var P;const E=we.value;Ke(we);const g=document.createElement("option");if(g.value="",g.textContent="选择目标队…",we.appendChild(g),o===null)return;const R=o,$=new Map;for(const H of R.sessions??[])H.team!==void 0&&H.team!==""&&$.set(H.team,`${ct(H)}(会话队)`);for(const H of((P=R.canvas)==null?void 0:P.teams)??[])$.set(H.team,`${H.name}(canvas 队)`);for(const H of R.remote??[])$.set(H.team,`${ct(H)}(远端)`);for(const[H,ne]of $){const re=document.createElement("option");re.value=H,re.textContent=`${ne} · ${H}`,we.appendChild(re)}E!==""&&$.has(E)&&(we.value=E)}let at=!1,d=null;function A(){var E;U(),at&&((E=e.ownerSettingsRead)==null||E.call(e).then(g=>{if(at){if(g.ok!==!0){d=null,U();return}d={teamJoinAllowlist:g.teamJoinAllowlist??[],teamScopeInfo:g.teamScopeInfo!==!1,announce:g.announce===!0,announceRestartPending:g.announceRestartPending===!0},U()}}))}function L(E){const g=T("div","wb-card"),R=T("div","wb-inspector-head");R.appendChild(T("span","wb-inspector-title")).textContent="主人设置";const $=T("button","wb-icon-btn");if($.type="button",$.setAttribute("aria-label","关闭主人设置"),$.textContent="✕",$.addEventListener("click",()=>{at=!1,U()}),R.appendChild($),g.appendChild(R),e.ownerSettingsRead===void 0){const Ce=T("div","wb-hint");Ce.textContent="此宿主未提供主人设置面(旧版本)——升级后可用。",g.appendChild(Ce),E.appendChild(g);return}if(d===null){const Ce=T("div","wb-hint");Ce.textContent="读取中…",g.appendChild(Ce),E.appendChild(g);return}const P=d,H=T("div","wb-side-head");H.textContent="入网白名单(精确团队名)",g.appendChild(H);for(const Ce of P.teamJoinAllowlist){const nt=T("div","wb-member-row");nt.appendChild(T("span","wb-member-label")).textContent=Ce;const kt=T("button","wb-member-remove");kt.type="button",kt.textContent="移除",kt.addEventListener("click",()=>{var Ot;(Ot=e.ownerSettingsWrite)==null||Ot.call(e,{teamJoinAllowlist:P.teamJoinAllowlist.filter(Ft=>Ft!==Ce)}).then(()=>A())}),nt.appendChild(kt),g.appendChild(nt)}const ne=T("div","wb-member-add"),re=T("input","wb-member-manual");re.type="text",re.placeholder="dsh/团队名(精确,无通配)",re.setAttribute("aria-label","新增白名单团队名");const V=T("button","wb-member-submit");V.type="button",V.textContent="加入";const he=()=>{var nt;const Ce=re.value.trim();Ce===""||P.teamJoinAllowlist.includes(Ce)||(nt=e.ownerSettingsWrite)==null||nt.call(e,{teamJoinAllowlist:[...P.teamJoinAllowlist,Ce]}).then(()=>A())};V.addEventListener("click",he),re.addEventListener("keydown",Ce=>{Ce.key==="Enter"&&he()}),ne.append(re,V),g.appendChild(ne);const _e=T("div","wb-side-head");_e.textContent="目录可见性(teamScopeInfo)",g.appendChild(_e);const ee=T("div","wb-member-row"),Oe=T("button","wb-member-submit");Oe.type="button",Oe.textContent=P.teamScopeInfo?"已开:仅显示已加入团队(点击放开为全舰队可见)":"已关:全舰队可见(点击收窄为已加入团队)",Oe.addEventListener("click",()=>{var Ce;(Ce=e.ownerSettingsWrite)==null||Ce.call(e,{teamScopeInfo:!P.teamScopeInfo}).then(()=>A())}),ee.appendChild(Oe),g.appendChild(ee);const Xe=T("div","wb-hint");Xe.textContent="精度说明:teamScopeInfo 只管「目录显示范围」。关上它不会解锁任何通信准入——会话入网(S3)与目标级路由(F5)规则原样生效。",g.appendChild(Xe);const Ue=T("div","wb-side-head");Ue.textContent="节点发布(announce)",g.appendChild(Ue);const Ze=T("div","wb-member-row"),je=T("button","wb-member-submit");if(je.type="button",je.textContent=P.announce?"已开:本节点发布签名卡(点击关闭)":"已关:本节点不发布(点击开启——重启宿主后生效)",je.addEventListener("click",()=>{var Ce;(Ce=e.ownerSettingsWrite)==null||Ce.call(e,{announce:!P.announce}).then(()=>A())}),Ze.appendChild(je),g.appendChild(Ze),P.announceRestartPending){const Ce=T("div","wb-hint");Ce.textContent="有 announce 变更待生效:重启宿主后按新配置发布。",g.appendChild(Ce)}E.appendChild(g)}function U(){var $;const E=Ke(ye);if(at){B.classList.add("is-open"),L(E);return}if(B.classList.toggle("is-open",s!==void 0),s===void 0)return;const g=s,R=T("div","wb-card");if(g.kind==="canvas"){const P=((($=o==null?void 0:o.canvas)==null?void 0:$.teams)??[]).find(ee=>ee.name===g.row.name)??g.row;Sn(R,"Canvas 队",P.name),Sn(R,"路由队",P.team);const H=T("div","wb-side-head");if(H.textContent=`成员 · ${P.members.length}`,R.appendChild(H),P.members.length===0){const ee=T("div","wb-muted");ee.textContent="空队——用下方表单添加成员",R.appendChild(ee)}for(const ee of P.members){const Oe=T("div","wb-member-row"),Xe=ee.remote===!0?"◇ 远端":ee.live===!0?"● 现场":ee.joined===!0?"○ 冷启":"· 未入网";Oe.appendChild(T("span","wb-member-dot")).textContent=Xe;const Ue=T("span","wb-member-label"),Ze=((o==null?void 0:o.sessions)??[]).find(Ce=>Ce.id===ee.id);Ue.textContent=ee.remote===!0?ee.id:Ze!==void 0?ct(Ze):ee.id,Ue.title=ee.team??ee.id,Oe.appendChild(Ue);const je=T("button","wb-member-remove");je.type="button",je.textContent="移除",je.addEventListener("click",async()=>{je.disabled=!0,await e.canvasOp("remove-member",P.name,ee.id)||(je.disabled=!1)}),Oe.appendChild(je),R.appendChild(Oe)}if((c==null?void 0:c.name)!==P.name){const ee=T("form","wb-member-add"),Oe=document.createElement("select");Oe.className="wb-member-pick",Oe.setAttribute("aria-label","选择成员");const Xe=document.createElement("input");Xe.type="text",Xe.className="wb-member-manual",Xe.placeholder="或输入远端句柄 zone/id8",Xe.setAttribute("aria-label","远端成员句柄");const Ue=T("button","wb-member-submit");Ue.type="submit",Ue.textContent="添加",ee.appendChild(Oe),ee.appendChild(Xe),ee.appendChild(Ue),ee.addEventListener("submit",async Ze=>{Ze.preventDefault();const je=Xe.value.trim(),Ce=je!==""?je:Oe.value;if(Ce==="")return;Ue.disabled=!0;const nt=await e.canvasOp("add-member",P.name,Ce);Ue.disabled=!1,nt&&(Xe.value="")}),c={name:P.name,form:ee,pick:Oe,manual:Xe}}const ne=c.pick,re=ne.value;Ke(ne),ne.appendChild(new Option("本机会话(现场/冷启动)…","",!0,!0));const V=new Set(P.members.map(ee=>ee.id));for(const ee of(o==null?void 0:o.sessions)??[])V.has(ee.id)||ne.appendChild(new Option(`${ct(ee)} — 本机`,ee.id));let he=!1;for(const ee of(o==null?void 0:o.remote)??[])ee.team.includes("/")&&(V.has(ee.team)||(he||(ne.appendChild(new Option("远端会话队(目录卡片)…","",!0,!1)),he=!0),ne.appendChild(new Option(`${ct(ee)} — 远端`,ee.team))));he||ne.appendChild(new Option("(暂无可拉入的远端会话队——见下方说明)","",!0,!1)),re!==""&&Array.from(ne.options).some(ee=>ee.value===re)&&(ne.value=re),R.appendChild(c.form);const _e=T("div","wb-hint");_e.textContent="成员由人类在此手工分配(agent 不可自组队)。远端成员走对端目录路由,不做本机冷唤醒;地址由目录在派发时重解析。远端下拉只列 zone/id8 会话句柄——若为空,说明目录里还没有已链接对端的会话队(未链接的对端只给最小卡);此时可在输入框手输句柄(如 dsh/xxxxxxxx)先把人拉进来,句柄本身即链接手势。",R.appendChild(_e),e.dispatchQuick!==void 0&&R.appendChild(de(P.team))}E.appendChild(R)}function Y(E){const g=T("form","wb-dispatch-form"),R=document.createElement("textarea");R.className="wb-dispatch-text",R.placeholder="一句话任务…(≤4000 字符,异步送达,回执进台账)",R.setAttribute("aria-label","快派消息");const $=T("button","wb-dispatch-submit");$.type="submit",$.textContent="发送";const P=T("div","wb-dispatch-note");return g.appendChild(R),g.appendChild($),g.appendChild(P),R.addEventListener("keydown",H=>{H.key!=="Enter"||H.shiftKey||H.ctrlKey||H.altKey||H.metaKey||H.isComposing||(H.preventDefault(),$.disabled||g.requestSubmit())}),g.addEventListener("submit",async H=>{var V;H.preventDefault();const ne=R.value.trim();if(ne===""||$.disabled)return;$.disabled=!0,P.textContent="派发中…";let re;try{re=await(((V=e.dispatchQuick)==null?void 0:V.call(e,E,ne))??Promise.resolve({ok:!1,error:"dispatch unavailable"}))}catch(he){re={ok:!1,error:he instanceof Error?he.message:String(he)}}$.disabled=!1,re.ok===!0&&(R.value=""),R.focus({preventScroll:!0}),P.textContent=re.ok===!0?`已派发${re.task_id!==void 0?` · ${re.task_id}`:""} · 回执将入台账(待回执)`:`失败:${re.error??"未知原因"}`}),{form:g,text:R,note:P}}function de(E){const g=T("div","wb-dispatch"),R=T("div","wb-side-head");return R.textContent="快派",g.appendChild(R),(m==null?void 0:m.team)!==E&&(m={team:E,...Y(E)}),g.appendChild(m.form),g}function ae(E){Te.open(E),N.classList.remove("is-rail-open")}function pe(E){if(o===null)return;const g=(o.sessions??[]).find($=>$.id===E);if(g!==void 0){ae({kind:"session",id:E,title:ct(g),sub:g.team,team:g.team,live:g.live});return}if(E.startsWith("peer-")){const $=E.slice(5),P=(o.peers??[]).find(H=>H.url.includes($));ae({kind:"peer",id:E,title:P!==void 0?P.url:$,sub:$,url:P==null?void 0:P.url});return}l.find($=>$.id===E)!==void 0&&ae({kind:"log",id:E,title:`…${E.slice(-12)}`,sub:"档案"})}function oe(){var V,he;k.textContent=(o==null?void 0:o.version)!==void 0?`v${o.version}`:"",k.hidden=(o==null?void 0:o.version)===void 0;const E=Ke(I);if(o===null)return;const g=[],R=rn(o,e.now()),$=R.deadLetters.length;$>0&&g.push({text:`死信 ${$}`,tone:"danger",title:"超过 24h TTL 仍未结算的任务(unconsumed),需在台账清账",tab:"ledger",group:"死信"});const P=R.stale.length;P>0&&g.push({text:`陈旧 ${P}`,tone:"warn",title:"我方派发、要回执、已等待 ≥1h 仍未回执(可催办;免回执行不算)",tab:"ledger",group:"陈旧"});const H=R.owedOverdue.length;H>0&&g.push({text:`欠回执 ${H}`,tone:"warn",title:"对方投递给本机、已等待本机回执超过 1 小时",tab:"ledger",group:"待本机回执"});const ne=((V=o.idempotency)==null?void 0:V.conflicts)??0;ne>0&&g.push({text:`幂等冲突 ${ne}`,tone:"danger",title:"同一幂等键对应了不同载荷,需人工核查",tab:"ledger",group:"取证"});const re=(((he=o.reconcile)==null?void 0:he.rows)??[]).filter(_e=>_e.needsRepair===!0).length;if(re>0&&g.push({text:`需修复 ${re}`,tone:"danger",title:"reconcile 无法自动恢复的会话,见行动计划",tab:"plan"}),g.length===0){E.appendChild(T("span","wb-header-ok")).textContent="● 无异常";return}for(const _e of g){const ee=T("button",`wb-alert wb-alert-${_e.tone}`);ee.type="button",ee.textContent=_e.text,ee.title=`${_e.title}(点击查看)`,ee.addEventListener("click",()=>xe(_e.tab,_e.group)),E.appendChild(ee)}}function xe(E,g){var P;const R=z.find(([H])=>H===E)[1];n==="canvas"&&(N.classList.add("is-rail-open"),S.select(E,{focus:!1}));const $=g===void 0?R:g==="取证"?R.querySelector("details.wb-led-forensics"):Array.from(R.querySelectorAll(".wb-led-group")).find(H=>H.dataset.group===g)??null;$!==null&&($ instanceof HTMLDetailsElement&&($.open=!0),(P=$.scrollIntoView)==null||P.call($,{block:"start",behavior:"smooth"}))}function qe(E){o=E,e.sessionLogList!==void 0&&!_&&(_=!0,e.sessionLogList().then(g=>{l=g.ok&&g.sessions!==void 0?g.sessions:[],p=g.ok?g.count:void 0}).catch(()=>{}).finally(()=>{_=!1,He()})),oe(),He(),yt(),Ve(),rt(),Te.update(E),Ye(),vt(),U(),Je()}function Re(E){if(E==="board"){Je();return}S.select(E)}return qe(null),{root:N,update:qe,mode:()=>n,selectTab:Re,openNodeChat:pe}}const pt=1e6,fn=.25,pn=3,Zn=256,eo=96;function St(e){const t=typeof e=="number"?e:Number.NaN;if(Number.isFinite(t))return Math.max(-pt,Math.min(pt,Math.round(t)))}function to(e){if(e===null||typeof e!="object")return;const t=e,n=St(t.x),s=St(t.y);return n===void 0||s===void 0?void 0:{x:n,y:s}}function Bo(e){const t=to(e);if(t===void 0)return;const n=e,s=St(n.w),o=St(n.h);if(!(s===void 0||o===void 0||s<=0||o<=0))return{...t,w:Math.min(s,pt),h:Math.min(o,pt)}}function no(e){if(e===null||typeof e!="object")return;const t=e;if(t.version!==1)return;const n=t.viewport;if(n===null||typeof n!="object")return;const s=n,o=St(s.x),i=St(s.y),r=s.scale,c=typeof r=="number"?r:Number.NaN;if(o===void 0||i===void 0||!Number.isFinite(c))return;const m=Math.max(fn,Math.min(pn,c)),l={};if(t.nodes!==null&&typeof t.nodes=="object")for(const[b,_]of Object.entries(t.nodes)){if(typeof b!="string"||b===""||b.length>128)continue;const N=to(_);if(N!==void 0&&(l[b]=N),Object.keys(l).length>=Zn)break}const p={};if(t.frames!==null&&typeof t.frames=="object")for(const[b,_]of Object.entries(t.frames)){if(typeof b!="string"||b===""||b.includes("/")||b.length>40)continue;const N=Bo(_);if(N!==void 0&&(p[b]=N),Object.keys(p).length>=eo)break}return{version:1,viewport:{x:o,y:i,scale:m},nodes:l,frames:p}}function jo(e,t,n){const s=r=>Math.max(-pt,Math.min(pt,Math.round(r))),o={};for(const[r,c]of t)if(!(typeof r!="string"||r===""||r.length>128)&&(o[r]={x:s(c.x),y:s(c.y)},Object.keys(o).length>=Zn))break;const i={};for(const[r,c]of n){if(typeof r!="string"||r===""||r.includes("/")||r.length>40)continue;const m=s(c.w),l=s(c.h);if(!(m<=0||l<=0)&&(i[r]={x:s(c.x),y:s(c.y),w:Math.min(m,pt),h:Math.min(l,pt)},Object.keys(i).length>=eo))break}return{version:1,viewport:{x:s(e.x),y:s(e.y),scale:Math.max(fn,Math.min(pn,e.scale))},nodes:o,frames:i}}function oo(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619)>>>0;return t>>>0}const Be=172,Fe=56,wt=[150,290,430],tt=16;function Ho(e){const t=oo(e),n=Math.floor(t/tt)%wt.length,o=t%tt/tt*Math.PI*2+n*(Math.PI/tt),i=wt[n];return{x:Math.round(Math.cos(o)*i),y:Math.round(Math.sin(o)*i*.6)}}function so(e){const t=new Map;for(const n of e)for(const s of n.members)t.has(s.id)||t.set(s.id,n.name);return t}const An=64,Ln=24,In=20,Yo=4,Tn=24,_n=44,Wo=24;function Xo(e,t,n=Number.POSITIVE_INFINITY){const s=new Set(t),o=so(e),i=e.map(b=>[...new Set(b.members.map(_=>_.id))].filter(_=>s.has(_)&&o.get(_)===b.name));i.push(t.filter(b=>!o.has(b)));const r=new Map;let c=0,m=0,l=0,p=0;for(const b of i){if(b.length===0)continue;const _=Math.min(3,Math.max(b.length>1?2:1,Math.ceil(Math.sqrt(b.length)))),N=Math.ceil(b.length/_),G=Math.max(260,_*Be+(_-1)*Ln+Tn*2),ue=Math.max(160,N*Fe+(N-1)*In+_n+Wo);p>0&&(p%Yo===0||c+G>n)&&(c=0,m+=l+An,l=0),b.forEach((Z,k)=>{const C=k%_,I=Math.floor(k/_);r.set(Z,{x:c+Tn+Be/2+C*(Be+Ln),y:m+_n+Fe/2+I*(Fe+In)})}),c+=G+An,l=Math.max(l,ue),p+=1}return r}const jt=12;function io(e,t){const n=m=>t.every(l=>Math.abs(l.x-m.x)>=Be+jt||Math.abs(l.y-m.y)>=Fe+jt),s=Ho(e);if(n(s))return s;const o=oo(e),i=tt*wt.length,r=Math.floor(o/tt)%wt.length*tt+o%tt;for(let m=1;m<i;m++){const l=(r+m)%i,p=Math.floor(l/tt),b=l%tt/tt*Math.PI*2+p*(Math.PI/tt),_=wt[p],N={x:Math.round(Math.cos(b)*_),y:Math.round(Math.sin(b)*_*.6)};if(n(N))return N}const c=wt[wt.length-1];for(let m=0;;m++)for(let l=0;l<6;l++){const p={x:Math.round(-c+l*(Be+jt)),y:Math.round(c*.6+Fe*2+m*(Fe+jt))};if(n(p))return p}}function it(e){return{x:e.x-Be/2,y:e.y-Fe/2,w:Be,h:Fe}}function hn(e){if(e.length===0)return{x:0,y:0,w:260,h:160};let t=Number.POSITIVE_INFINITY,n=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY;for(const p of e)t=Math.min(t,p.x),n=Math.min(n,p.y),s=Math.max(s,p.x+p.w),o=Math.max(o,p.y+p.h);const i=24,r=44,c=24,m=Math.max(260,Math.round(s-t+i*2)),l=Math.max(160,Math.round(o-n+r+c));return{x:Math.round(t-i),y:Math.round(n-r),w:m,h:l}}class bn{constructor(){$t(this,"revisionCounter",0);$t(this,"nodes",new Map);$t(this,"frames",new Map);$t(this,"selection",new Set);$t(this,"viewport",{x:0,y:0,scale:1})}get revision(){return this.revisionCounter}getNode(t){return this.nodes.get(t)}allNodes(){return[...this.nodes.values()]}nodeIds(){return[...this.nodes.keys()]}getFrame(t){return this.frames.get(t)}allFrames(){return[...this.frames.entries()]}isSelected(t){return this.selection.has(t)}selectedIds(){return[...this.selection]}bump(){this.revisionCounter+=1}dragNodes(t,n,s){let o=!1;for(const i of t){const r=this.nodes.get(i);r!==void 0&&(r.x+=n,r.y+=s,o=!0)}o&&this.bump()}beginFrameDrag(t){const n=this.frames.get(t);if(n!==void 0)return{name:t,rect:{...n}}}applyFrameDrag(t,n,s){const o=this.frames.get(t.name);o!==void 0&&(o.x=t.rect.x+n,o.y=t.rect.y+s,this.bump())}nudge(t,n,s){this.dragNodes(t,n,s)}marqueeSelect(t,n){n||this.selection.clear();for(const s of this.nodes.values()){const o=it(s);o.x<t.x+t.w&&o.x+o.w>t.x&&o.y<t.y+t.h&&o.y+o.h>t.y&&this.selection.add(s.id)}this.bump()}setSelection(t){this.selection=new Set(t),this.bump()}upsertNode(t){const n=this.nodes.get(t.id);if(n===void 0){this.nodes.set(t.id,t),this.bump();return}n.label=t.label,n.name=t.name,n.description=t.description,n.live=t.live,n.memberships=t.memberships,this.bump()}removeNode(t){this.nodes.delete(t)&&(this.selection.delete(t),this.bump())}setFrame(t,n){this.frames.set(t,n),this.bump()}removeFrame(t){this.frames.delete(t)&&this.bump()}upsertScore(t,n){const s=this.nodes.get(t);s===void 0||s.score===n||(s.score=n,this.bump())}positions(){const t=new Map;for(const[n,s]of this.nodes)t.set(n,{x:s.x,y:s.y});return t}frameRects(){const t=new Map;for(const[n,s]of this.frames)t.set(n,{...s});return t}teamMemberIds(t){const n=[];for(const s of this.nodes.values()){const o=s.memberships.find(i=>i.team===t);o!==void 0&&n.push({id:s.id,index:o.index})}return n.sort((s,o)=>s.index-o.index).map(s=>s.id)}setTeamMembers(t,n){for(const s of this.nodes.values()){const o=s.memberships.filter(r=>r.team!==t),i=n.indexOf(s.id);i>=0&&o.push({team:t,index:i}),s.memberships=o}this.bump()}contentBounds(){let t=Number.POSITIVE_INFINITY,n=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY;const i=r=>{t=Math.min(t,r.x),n=Math.min(n,r.y),s=Math.max(s,r.x+r.w),o=Math.max(o,r.y+r.h)};for(const r of this.nodes.values())r.remote!==!0&&i(it(r));for(const r of this.frames.values())i(r);return t===Number.POSITIVE_INFINITY?null:{minX:t,minY:n,maxX:s,maxY:o}}static fromState(t){const n=new bn,s=no(t.layout),o=new Map;for(const i of t.teams)for(let r=0;r<i.members.length;r++){const c=i.members[r].id,m=o.get(c)??[];m.push({team:i.name,index:r}),o.set(c,m)}for(const i of t.sessions){if(i.joined!==!0)continue;const r=s==null?void 0:s.nodes[i.id];let c,m;if(r!==void 0&&typeof r.x=="number"&&typeof r.y=="number")c=r.x,m=r.y;else{const l=io(i.id,[...n.nodes.values()]);c=l.x,m=l.y}n.nodes.set(i.id,{id:i.id,x:c,y:m,label:i.label,team:i.team,name:i.name,description:i.description,live:i.live!==!1,memberships:o.get(i.id)??[]})}for(const i of t.teams){const r=s==null?void 0:s.frames[i.name];if(r!==void 0){n.frames.set(i.name,{x:r.x,y:r.y,w:r.w,h:r.h});continue}const c=[];for(const m of i.members){const l=n.nodes.get(m.id);l!==void 0&&c.push(it(l))}c.length>0&&n.frames.set(i.name,hn(c))}return n.viewport=s!==void 0?{...s.viewport}:{x:0,y:0,scale:1},n}}const Ko=24,ro=-13,Uo=ro+Ko;function zo(e,t,n){const s=[],o=new Set;for(const i of e){const r=t.get(i.name);if(r===void 0)continue;const c=r.x+r.w/2,m=r.y+Uo;for(const l of i.members){const p=n.get(l.id);if(p===void 0)continue;const b=o.has(l.id);o.add(l.id),s.push({x1:c,y1:m,x2:p.x,y2:p.y-Fe/2,dashed:b,team:i.name,id:l.id})}}return s}function Jo(e,t){for(;e.firstChild!==null;)e.firstChild.remove();const n=t.allFrames().map(([s])=>({name:s,members:t.teamMemberIds(s).map(o=>({id:o}))}));for(const s of zo(n,new Map(t.allFrames()),t.positions())){const o=document.createElementNS("http://www.w3.org/2000/svg","line");o.setAttribute("class","e-member"+(s.dashed?" dashed":"")),o.setAttribute("x1",String(s.x1)),o.setAttribute("y1",String(s.y1)),o.setAttribute("x2",String(s.x2)),o.setAttribute("y2",String(s.y2)),e.appendChild(o)}}function Vo(e){return`peer-${xt(e).replace(/[^A-Za-z0-9.:\[\]-]/g,"-")}`}function xt(e){try{return new URL(e).host}catch{return e}}function qo(e){const t=new Map;for(const n of e){const s=n.via!==void 0&&n.via!==""?xt(n.via):"",o=t.get(s)??[];o.push(n),t.set(s,o)}return t}const Go=140,Qo=200,Zo=90,es=20,Ht=60;function ts(e,t){const n=t!==null?t.maxX+Go:Qo,s=t!==null?t.minY:0;return e.map((o,i)=>({url:o.url,score:o.score,x:n,y:s+i*Zo}))}function ns(e,t,n,s){const o=new Map;for(const r of e){if(!t.has(r.team))continue;const c=`${r.team}\0${r.peer}`,m=o.get(c);m===void 0?o.set(c,{team:r.team,peer:r.peer,startedAt:r.startedAt,count:1}):(m.startedAt=Math.min(m.startedAt,r.startedAt),m.count+=1)}const i=[];for(const r of o.values()){const c=t.get(r.team);if(c===void 0)continue;const m=n.find(p=>{try{return new URL(p.url).host===r.peer}catch{return!1}});if(m===void 0)continue;const l=Math.max(0,Math.round((s-r.startedAt)/1e3));i.push({x1:c.x,y1:c.y,x2:m.x,y2:m.y,label:`a2a_route · ${r.peer} · ${l}s`+(r.count>1?` ×${r.count}`:"")})}return i}function os(e,t){const n=t!==null?{x:t.maxX+es,y:e.length>0?(e[0].y+e[e.length-1].y)/2:(t.minY+t.maxY)/2}:{x:-80,y:0};return e.map((s,o)=>({x1:n.x,y1:n.y,x2:s.x,y2:s.y,label:o===0?"gns referral":""}))}function ss(e,t){if(e===null&&t.length===0)return null;let n=e!==null?e.minX:Number.POSITIVE_INFINITY,s=e!==null?e.minY:Number.POSITIVE_INFINITY,o=e!==null?e.maxX:Number.NEGATIVE_INFINITY,i=e!==null?e.maxY:Number.NEGATIVE_INFINITY;for(const r of t)n=Math.min(n,r.x-Ht),s=Math.min(s,r.y-Ht),o=Math.max(o,r.x+Ht),i=Math.max(i,r.y+Ht);return{minX:n,minY:s,maxX:o,maxY:i}}const is=11;function rs(e,t){let n=[],s=[],o=[];function i(c){for(const p of n)p.remove();n=[];const m=t.allNodes().filter(p=>p.remote===!0).map(p=>({url:p.peerUrl??p.id.slice(5),score:p.score,x:p.x,y:p.y}));s=m;const l=t.contentBounds();if(l!==null){const p=new Map;for(const[b,_]of t.allFrames())p.set(b,{name:b,x:_.x+_.w/2,y:_.y+is});for(const b of ns(o,p,m,c))n.push(...r(b,"e-activity",b.label));for(const b of os(m,l))n.push(...r(b,"e-federal",b.label))}}function r(c,m,l){const p=document.createElementNS("http://www.w3.org/2000/svg","line");p.setAttribute("class",m),p.setAttribute("x1",String(c.x1)),p.setAttribute("y1",String(c.y1)),p.setAttribute("x2",String(c.x2)),p.setAttribute("y2",String(c.y2)),e.appendChild(p);const b=[p];if(l!==""){const _=document.createElementNS("http://www.w3.org/2000/svg","text");_.setAttribute("class","edge-label mono"),_.setAttribute("x",String((c.x1+c.x2)/2+14)),_.setAttribute("y",String((c.y1+c.y2)/2+18)),_.textContent=l,e.appendChild(_),b.push(_)}return b}return{render:i,flyTo(c){return c(),s},placements:()=>s,setInFlight:c=>{o=c}}}const On={x:0,y:0,scale:1};function Jt(e){return Math.max(fn,Math.min(pn,e))}function Nt(e){const t=Number.isFinite(e.scale)?e.scale:1,n=Number.isFinite(e.x)?e.x:0,s=Number.isFinite(e.y)?e.y:0;return{x:n,y:s,scale:Jt(t)}}function mt(e,t,n){return{x:e.x+t/e.scale,y:e.y+n/e.scale}}function on(e,t,n){return{x:e.x+t/e.scale,y:e.y+n/e.scale,scale:e.scale}}function Fn(e,t,n,s){const o=Jt(e.scale*t);return o===e.scale?e:{x:e.x+n/e.scale-n/o,y:e.y+s/e.scale-s/o,scale:o}}const as=680,cs=.8,ls=.6,Pn=16;function gn(e,t,n,s=Number.POSITIVE_INFINITY){if(e===null||t<=0||n<=0)return On;const o=e.maxX-e.minX,i=e.maxY-e.minY;if(!(o>0)||!(i>0))return On;const r=.9*Math.min(t/o,n/i),c=Math.min(s,r),m=t<as?cs:ls;if(r<m){const p=Jt(Math.min(s,m));return{x:e.minX-Pn/p,y:e.minY-Pn/p,scale:p}}const l=Jt(c);return{x:(e.minX+e.maxX)/2-t/(2*l),y:(e.minY+e.maxY)/2-n/(2*l),scale:l}}function ds(e){return`translate(${-e.x*e.scale}px, ${-e.y*e.scale}px) scale(${e.scale})`}function Rn(e,t){let n=e===null?null:{...e,minY:e.minY+ro};for(const s of t){if(s.remote!==!0)continue;const o=it(s);n=n===null?{minX:o.x,minY:o.y,maxX:o.x+o.w,maxY:o.y+o.h}:{minX:Math.min(n.minX,o.x),minY:Math.min(n.minY,o.y),maxX:Math.max(n.maxX,o.x+o.w),maxY:Math.max(n.maxY,o.y+o.h)}}return n}function Dn(e,t,n,s){const o=s>0&&s<n/2?s:0,i=gn(e,t,n-o,1);return o===0||e===null?i:{...i,y:i.y-o/i.scale}}function Bn(...e){const t=Math.max(0,...e.map(n=>n.offsetHeight>0?n.offsetTop+n.offsetHeight:0));return t>0?t+8:0}function cn(e){return e.type==="join-network"||e.type==="leave-network"?"$network":e.type==="create-team"||e.type==="remove-team"?e.name:e.team}function ms(e,t){if(t.type==="create-team"){const o=t.ids.map(i=>e.getNode(i)).filter(i=>i!==void 0).map(i=>it(i));return o.length>0&&e.setFrame(t.name,hn(o)),e.setTeamMembers(t.name,t.ids),()=>{e.setTeamMembers(t.name,e.teamMemberIds(t.name).filter(i=>!t.ids.includes(i))),e.removeFrame(t.name)}}if(t.type==="add-member"){const o=e.teamMemberIds(t.team),i=t.ids.filter(r=>!o.includes(r));return e.setTeamMembers(t.team,[...o,...i]),()=>{e.setTeamMembers(t.team,e.teamMemberIds(t.team).filter(r=>!i.includes(r)))}}if(t.type==="remove-member"){const o=e.teamMemberIds(t.team);return e.setTeamMembers(t.team,o.filter(i=>!t.ids.includes(i))),()=>{const i=e.teamMemberIds(t.team);e.setTeamMembers(t.team,[...i,...t.ids.filter(r=>!i.includes(r))])}}if(t.type==="remove-team"){const o=e.teamMemberIds(t.name),i=e.getFrame(t.name),r=i!==void 0?{...i}:void 0;return e.setTeamMembers(t.name,[]),e.removeFrame(t.name),()=>{r!==void 0&&e.setFrame(t.name,r),e.setTeamMembers(t.name,o)}}if(t.type==="join-network"||t.type==="leave-network")return()=>{};const n=e.teamMemberIds(t.team);let s=[...n];for(const o of t.ops)o.op==="remove"?s=s.filter(i=>i!==o.id):s.push(o.id);return e.setTeamMembers(t.team,s),()=>{let o=e.teamMemberIds(t.team);for(let i=0;i<n.length;i++){const r=n[i];o[i]!==r&&o.includes(r)&&(o=o.filter(c=>c!==r),o.push(r))}e.setTeamMembers(t.team,o)}}function jn(e,t,n,s,o){if(n||s(),!(t.type==="remove-team"&&n||t.type==="create-team"&&!n&&t.created===!0)||o===void 0||e.getFrame(cn(t))!==void 0)return o;const r={...o.frames};return delete r[cn(t)],{...o,frames:r}}function ln(e,t){const n=[...e],s=[];for(let o=0;o<t.length;o++){const i=t[o];n[o]!==i&&n.includes(i)&&(s.push({op:"remove",id:i}),s.push({op:"add",id:i}),n.splice(n.indexOf(i),1),n.push(i))}return s}function us(e,t){return e.teamMemberIds(t).map(n=>{var s;return{id:n,y:((s=e.getNode(n))==null?void 0:s.y)??0}}).sort((n,s)=>n.y-s.y).map(n=>n.id)}function Hn(e,t){let n,s=Number.POSITIVE_INFINITY;for(const[o,i]of e){if(t.x<i.x||t.x>i.x+i.w||t.y<i.y||t.y>i.y+i.h)continue;const r=i.w*i.h;r<s&&(n=o,s=r)}return n}const Yn=[9133302,3900150,1357990,16096779,15485081,8702998];function fs(e){const{root:t,netBtn:n,signal:s,model:o}=e;function i(){return o.selectedIds().map(h=>{var S;return{id:h,y:((S=o.getNode(h))==null?void 0:S.y)??0}}).sort((h,S)=>h.y-S.y).map(h=>h.id)}function r(){if(c!==null)return;const h=i().filter(S=>{const w=o.getNode(S);return w===void 0?!1:w.remote!==!0||w.remoteHandle!==void 0&&w.remoteHandle!==""});if(h.length<2){e.notice("info","框选至少 2 个会话节点");return}m(h)}let c=null;function m(h){const S=document.createElement("div");S.className="p-dialog";const w=document.createElement("div");w.className="p-dialog-panel",w.setAttribute("role","dialog"),w.setAttribute("aria-modal","true"),w.setAttribute("aria-labelledby","p-dialog-title");const F=document.createElement("div");F.id="p-dialog-title",F.className="p-dialog-title",F.textContent=`组建团队(${h.length} 个节点,自上而下即优先级)`;const x=document.createElement("input");x.className="p-dialog-input",x.maxLength=40,x.setAttribute("aria-label","团队名");const W=document.createElement("div");W.className="p-dialog-err",W.setAttribute("aria-live","polite");const D=document.createElement("div");D.className="p-dialog-row";const ie=document.createElement("button");ie.type="button",ie.textContent="组建";const Ee=document.createElement("button");Ee.type="button",Ee.textContent="取消",D.append(ie,Ee),w.append(F,x,W,D),S.appendChild(w),t.appendChild(S);const Le=document.activeElement,O=()=>{S.remove(),c=null,Le==null||Le.focus()},z=()=>{const Ne=x.value.trim();return Ne===""||Ne.length>40||Ne.includes("/")||/^\d+$/.test(Ne)?"队名需 1..40 字,不含“/”,不为纯数字":null},se=()=>{const Ne=z();if(Ne!==null){W.textContent=Ne,x.focus();return}const Q=x.value.trim();if(O(),o.getFrame(Q)!==void 0){e.notice("info",`已加入现有团队「${Q}」`),e.emit({type:"add-member",team:Q,ids:h});return}e.emit({type:"create-team",name:Q,ids:h,created:!0})};ie.addEventListener("click",se),Ee.addEventListener("click",O),x.addEventListener("keydown",Ne=>{const Q=Ne;Q.key==="Enter"&&(Q.preventDefault(),se()),Q.key==="Escape"&&(Q.preventDefault(),O())}),S.addEventListener("keydown",Ne=>{const Q=Ne;if(Q.key==="Escape"){Q.preventDefault(),Q.stopPropagation(),O();return}if(Q.key!=="Tab")return;Q.preventDefault();const B=Array.from(w.querySelectorAll("input, button")),ve=B.indexOf(document.activeElement),le=Q.shiftKey?B[(ve-1+B.length)%B.length]:B[(ve+1)%B.length];le==null||le.focus()},s),c={wrap:S,restoreFocus:Le},x.focus()}let l=null,p="root",b=null,_=null,N=[];function G(){_==null||_.remove(),_=null}function ue(){var w;if(_!==null){G();return}if(N.length===0)return;const h=document.createElement("div");h.className="p-menu p-netmenu",h.setAttribute("role","menu"),h.setAttribute("aria-label","未入网会话");for(const F of N)h.appendChild(k(`${F.name!==void 0&&F.name!==""?F.name:F.label} — 入网`,!0,()=>{G(),e.emit({type:"join-network",id:F.id})}));_=h,t.appendChild(h);const S=n.getBoundingClientRect();h.style.left=`${String(Math.min(S.left,window.innerWidth-220))}px`,h.style.top=`${String(Math.max(8,S.top-(N.length*30+10)))}px`,h.addEventListener("keydown",F=>{F.key==="Escape"&&(F.stopPropagation(),G(),n.focus())}),(w=h.querySelector("button"))==null||w.focus(),document.addEventListener("pointerdown",F=>{if(_===null)return;const x=F.target;x!==null&&(x.closest(".p-netmenu")!==null||x===n||n.contains(x))||G()},s)}function Z(){l==null||l.remove(),l=null,p="root",b!==null&&b.isConnected?b.focus():t.focus(),b=null}function k(h,S,w){const F=document.createElement("button");return F.type="button",F.setAttribute("role","menuitem"),F.textContent=h,S?F.addEventListener("click",()=>{Z(),w()}):(F.disabled=!0,F.setAttribute("aria-disabled","true")),F}function C(h,S,w,F="root",x){var Ee,Le,O,z,se,Ne;x!==void 0&&(b=x),b===null&&(b=e.anchorFor(w)),l==null||l.remove(),p=F;const W=document.createElement("div");W.className="p-menu",W.setAttribute("role","menu"),W.setAttribute("aria-label","团队操作");let D=[];if(w.kind==="frame")D=[k(`解散团队「${w.name}」`,!0,()=>e.emit({type:"remove-team",name:w.name}))];else{const Q=w.id;if(F==="root"){const B=k("组成团队…",o.selectedIds().length>=2,()=>m(i()));B.title="先框选或 Shift 加选至少 2 个节点",D.push(B),e.teams().length>0&&(D.push(k("加入团队 ▸",!0,()=>C(h,S,w,"join"))),(((Ee=o.getNode(Q))==null?void 0:Ee.memberships.map(le=>le.team))??[]).length>0&&(D.push(k("置顶路由 ▸",!0,()=>C(h,S,w,"promote"))),D.push(k("离队 ▸",!0,()=>C(h,S,w,"leave"))))),((Le=o.getNode(Q))==null?void 0:Le.remote)!==!0&&D.push(k("退网",!0,()=>e.emit({type:"leave-network",id:Q})))}else{D.push(k("‹ 返回",!0,()=>C(h,S,w,"root")));for(const B of e.teams())if(F==="join"){const ve=((O=o.getNode(Q))==null?void 0:O.memberships.some(le=>le.team===B.name))??!0;D.push(k(ve?`${B.name}(已加入)`:B.name,!ve,()=>e.emit({type:"add-member",team:B.name,ids:[Q]})))}else if(F==="leave"){const ve=((z=o.getNode(Q))==null?void 0:z.memberships.some(le=>le.team===B.name))??!1;D.push(k(B.name,ve,()=>e.emit({type:"remove-member",team:B.name,ids:[Q]})))}else{const ve=((se=o.getNode(Q))==null?void 0:se.memberships.some(le=>le.team===B.name))??!1;D.push(k(B.name,ve,()=>{const le=o.teamMemberIds(B.name),ye=[Q,...le.filter(Te=>Te!==Q)];e.emit({type:"reorder",team:B.name,ops:ln(le,ye)})}))}}}W.append(...D),W.style.left=`${Math.min(h,window.innerWidth-200)}px`;const ie=D.length*30+8;W.style.top=`${Math.max(8,Math.min(S,window.innerHeight-ie-8))}px`,W.addEventListener("keydown",Q=>{var ye,Te,Qe,Je;const B=Q,ve=Array.from(W.querySelectorAll("[role=menuitem]")),le=ve.indexOf(document.activeElement);B.key==="ArrowDown"?(B.preventDefault(),(ye=ve[(le+1+ve.length)%ve.length])==null||ye.focus()):B.key==="ArrowUp"?(B.preventDefault(),(Te=ve[(le-1+ve.length)%ve.length])==null||Te.focus()):B.key==="Home"?(B.preventDefault(),(Qe=ve[0])==null||Qe.focus()):B.key==="End"?(B.preventDefault(),(Je=ve[ve.length-1])==null||Je.focus()):B.key==="Escape"&&(B.preventDefault(),B.stopPropagation(),p!=="root"?C(h,S,w,"root"):Z())}),t.appendChild(W),l=W,(Ne=D[0])==null||Ne.focus()}function I(h,S,w){if(c!==null)return;const F=(w==null?void 0:w.closest(".p-node"))??null;if(F!==null){const D=o.getNode(F.dataset.id??"");if((D==null?void 0:D.remote)===!0&&(D.remoteHandle===void 0||D.remoteHandle===""))return}const x=F,W=(w==null?void 0:w.closest(".p-frame-head"))??null;if(x!==null){const D=x.dataset.id??"";o.isSelected(D)||o.setSelection([D]),b=x,C(h,S,{kind:"node",id:D})}else W!==null&&(b=W,C(h,S,{kind:"frame",name:W.dataset.frame??""}))}function u(h){N=h,n.textContent=`未入网${N.length>0?`(${String(N.length)})`:""}`,n.disabled=N.length===0,n.setAttribute("aria-disabled",String(N.length===0)),N.length===0&&G()}return{menuItem:k,isMenuOpen:()=>l!==null,isDialogOpen:()=>c!==null,closeMenu:Z,openMenu:C,contextMenuAt:I,openNameDialog:m,startCreateFromSelection:r,toggleNetMenu:ue,setUnjoined:u}}function ps(e,t){const n=t.trim().toLowerCase();return n===""?[]:e.filter(s=>s.name.toLowerCase().includes(n)||s.team.toLowerCase().includes(n)||(s.host??"").toLowerCase().includes(n)).slice(0,8)}function hs(e,t){return e.allNodes().map(n=>{const s=n.id.slice(5),o=n.id.startsWith("member-")?n.name!==void 0&&n.name!==""?n.name:n.team:n.remote===!0?s:t(n);return{id:n.id,name:o,team:n.team,...n.remote===!0?{host:s}:{}}})}function bs(e,t=1200){e!==void 0&&(e.classList.add("pulse"),setTimeout(()=>e.classList.remove("pulse"),t))}function gs(e){return t=>{const n=e.model.getNode(t);if(n===void 0)return;const s=e.viewSize();e.setVp(gn({minX:n.x,minY:n.y,maxX:n.x+Be,maxY:n.y+Fe},s.w,s.h,1)),e.applyViewport(),e.markDirty(),bs(e.cardEl(t))}}function vs(e,t,n,s){const o=ys({onPick:s});return e.appendChild(o.root),{...o,refresh:()=>o.setIndex(hs(t,n))}}function ys(e){const t=document.createElement("div");t.className="p-search";const n=document.createElement("input");n.type="search",n.className="p-search-input",n.placeholder="🔍 搜索(Ctrl+K)",n.title="搜索名字 / 句柄 / 宿主(Ctrl+K 聚焦,Esc 清空)",n.setAttribute("aria-label","搜索画板节点:名字、句柄或宿主");const s=document.createElement("div");s.className="p-search-list";let o=[],i=[],r=0;const c=()=>{s.style.display="none",s.textContent=""},m=()=>{if(s.textContent="",i.length===0){c();return}i.forEach((b,_)=>{const N=document.createElement("div");N.className="p-search-hit"+(_===r?" active":""),N.dataset.id=b.id,N.textContent=b.name===b.team?b.name:`${b.name} · ${b.team}`,N.addEventListener("mousedown",G=>{G.preventDefault(),e.onPick(b.id),l()}),s.appendChild(N)}),s.style.display="block"},l=()=>{n.value="",i=[],c()},p=()=>{i=ps(o,n.value),r=0,m()};return n.addEventListener("input",p),n.addEventListener("keydown",b=>{if(b.key==="Escape"){l(),n.blur(),b.stopPropagation();return}if(b.key==="ArrowDown"||b.key==="ArrowUp"){if(i.length===0)return;b.preventDefault(),r=(r+(b.key==="ArrowDown"?1:i.length-1))%i.length,m();return}b.key==="Enter"&&i.length>0&&(b.preventDefault(),e.onPick(i[r].id),l())}),t.append(n,s),{root:t,setIndex(b){o=b,n.value!==""&&p()},focus(){n.focus(),n.select()},clear(){l()}}}const Yt=28,Wn=16,Xn=14,Kn=48,ws=4,xs=180,Cs=90,ks=1600;function Es(e){const t=e.wrapWidth??ks,n=e.frames.map(m=>{const l=Math.max(m.soleIds.length,1),p=Math.min(ws,Math.max(1,Math.ceil(Math.sqrt(l)))),b=Math.ceil(l/p),_=Math.max(xs,Yt*2+p*Be+(p-1)*Wn),N=Math.max(Cs,Yt*2+b*Fe+(b-1)*Xn);return{name:m.name,w:_,h:N,rows:b,perRow:p,soleIds:m.soleIds}}),s=[],o=[];let i=0,r=0,c=0;for(const m of n){i>0&&i+m.w>t&&(i=0,r+=c+Kn,c=0);const l={x:i,y:r,w:m.w,h:m.h};s.push({name:m.name,rect:l});const p=l.x+Yt+Be/2;let b=l.y+Yt+Fe/2;m.soleIds.forEach((_,N)=>{const G=N%m.perRow;N>0&&G===0&&(b+=Fe+Xn),o.push({id:_,x:p+G*(Be+Wn),y:b})}),i+=m.w+Kn,c=Math.max(c,m.h)}return{frames:s,seats:o}}function $s(e,t){const n=[];for(const[o,i]of e.allFrames()){if(t.has(o))continue;const r=e.teamMemberIds(o).map(c=>e.getNode(c)).filter(c=>c!==void 0).filter(c=>c.memberships.length===1).map(c=>c.id);n.push({name:o,rect:i,soleIds:r})}if(n.length===0)return!1;const s=Es({frames:n});for(const o of s.frames)e.setFrame(o.name,o.rect);for(const o of s.seats){const i=e.getNode(o.id);i!==void 0&&e.dragNodes([o.id],o.x-i.x,o.y-i.y)}return!0}function Ns(e,t){if(e===void 0)return;const n=xt(e);return{text:t?`同步中… · ${n}`:`镜像 · ${n}`,title:t?`已把改动交给属主 ${n},等待它确认`:`这个团队属于 ${n},这里显示的是它的镜像;拖入或移出成员会经中继交给 ${n} 执行`,syncing:t}}const Ct=24,Ms=200,Kt=(e,t)=>e.x<t.x+t.w&&t.x<e.x+e.w&&e.y<t.y+t.h&&t.y<e.y+e.h;function Ss(e,t){const n=t.x+t.w+Ct-e.x,s=t.x-Ct-(e.x+e.w),o=t.y+t.h+Ct-e.y,i=t.y-Ct-(e.y+e.h),r=Math.abs(n)<=Math.abs(s)?n:s,c=Math.abs(o)<=Math.abs(i)?o:i;return Math.abs(r)<=Math.abs(c)?{dx:r,dy:0}:{dx:0,dy:c}}function As(e,t,n,s){const o=e.beginFrameDrag(t);o!==void 0&&e.applyFrameDrag(o,n,s)}function Ls(e,t,n){let s=!1;for(let o=0;o<Ms;o++){const i=e.allFrames();let r;for(let k=0;k<i.length&&r===void 0;k++)for(let C=k+1;C<i.length;C++){const[I,u]=i[k],[h,S]=i[C];if(!(t.has(I)&&t.has(h))&&Kt(u,S)){r=[I,u,h,S];break}}if(r===void 0)return s;const[c,m,l,p]=r,b=k=>t.has(k)?2:k===n?1:0,[_,N,G]=b(c)<b(l)?[c,m,p]:[l,p,m],{dx:ue,dy:Z}=Ss(N,G);As(e,_,ue,Z),s=!0}return s}const ht=28,Ut=16,Vt=14;function Is(e){const t=[];for(let n=e.y+ht;n+Fe<=e.y+e.h-ht;n+=Fe+Vt)for(let s=e.x+ht;s+Be<=e.x+e.w-ht;s+=Be+Ut)t.push({x:s+Be/2,y:n+Fe/2});return t}function Ts(e){let t=!1;const n=e.allFrames(),s=new Map(n);for(const o of e.allNodes()){const i=new Set(o.memberships.map(Z=>Z.team)),r=n.find(([Z,k])=>!i.has(Z)&&Kt(it(o),k));if(r===void 0)continue;const c=r[1],m=Z=>{const k=it(Z);return n.every(([C,I])=>i.has(C)||!Kt(k,I))&&e.allNodes().every(C=>C.id===o.id||!Kt(k,it(C)))},p=o.memberships.map(Z=>s.get(Z.team)).filter(Z=>Z!==void 0).flatMap(Is).find(m),b={x:c.x+c.w+Ct+Be/2,y:o.y},_={x:o.x,y:c.y+c.h+Ct+Fe/2},N=Math.max(...n.map(([,Z])=>Z.x+Z.w))+Ct+Be/2,G=Array.from({length:2*e.allNodes().length+1},(Z,k)=>({x:N,y:c.y+Fe/2+k*(Fe+Vt)})),ue=p??[b,_,...G].find(m)??G[G.length-1];e.dragNodes([o.id],ue.x-o.x,ue.y-o.y),t=!0}return t}function Wt(e,t,n){const s=Ls(e,t,n),o=Ts(e);return s||o}function _s(e){for(const[t,n]of e.allFrames()){const s=e.teamMemberIds(t).map(l=>e.getNode(l)).filter(l=>l!==void 0).filter(l=>l.memberships.length===1);if(s.length===0)continue;const o=Math.max(1,Math.floor((n.w-2*ht+Ut)/(Be+Ut))),i=Math.ceil(s.length/o),r=ht*2+i*Fe+(i-1)*Vt;r>n.h&&e.setFrame(t,{...n,h:Math.min(r,n.h+400)});const c=n.x+ht+Be/2;let m=n.y+ht+Fe/2;s.forEach((l,p)=>{const b=p%o;p>0&&b===0&&(m+=Fe+Vt);const _=c+b*(Be+Ut);e.dragNodes([l.id],_-l.x,m-l.y)})}}const Os=30;function Fs(e){const t=[],n=()=>({nodes:new Map(e.allNodes().map(i=>[i.id,{x:i.x,y:i.y}])),frames:new Map(e.allFrames().map(([i,r])=>[i,{...r}]))}),s=i=>e.allNodes().some(r=>{const c=i.nodes.get(r.id);return c!==void 0&&(c.x!==r.x||c.y!==r.y)})||e.allFrames().some(([r,c])=>{const m=i.frames.get(r);return m!==void 0&&(m.x!==c.x||m.y!==c.y||m.w!==c.w||m.h!==c.h)}),o=i=>{for(const r of e.allNodes()){const c=i.nodes.get(r.id);c!==void 0&&(c.x!==r.x||c.y!==r.y)&&e.dragNodes([r.id],c.x-r.x,c.y-r.y)}for(const[r,c]of e.allFrames()){const m=i.frames.get(r);m!==void 0&&(m.x!==c.x||m.y!==c.y||m.w!==c.w||m.h!==c.h)&&e.setFrame(r,{...m})}};return{capture:n,commit(i){s(i)&&(t.push(i),t.length>Os&&t.shift())},undo(){const i=t.pop();return i===void 0?!1:(o(i),!0)},revert(i){return s(i)?(o(i),!0):!1},get depth(){return t.length}}}function Ps(e){const{root:t,trigger:n,signal:s,model:o}=e;let i=null,r="",c=null;function m(){c==null||c.remove(),c=null}function l(){m(),i==null||i.remove(),i=null}function p(){if(i!==null){l();return}const C=document.createElement("div");C.className="p-menu p-nodelist",C.setAttribute("role","dialog"),C.setAttribute("aria-label","节点清单"),i=C,t.appendChild(C);const I=n.getBoundingClientRect();C.style.left=`${String(Math.min(I.left,window.innerWidth-340))}px`,C.style.top=`${String(Math.max(8,I.top-320))}px`,C.addEventListener("keydown",u=>{u.key==="Escape"&&(u.stopPropagation(),l(),n.focus())}),b()}function b(){var F;const C=i;if(C===null)return;m(),C.textContent="";const I=document.createElement("div");I.className="p-nodelist-head";const u=document.createElement("span");u.className="p-nodelist-title",u.textContent="节点";const h=document.createElement("select");h.className="p-nodesel",h.setAttribute("aria-label","选择 host 或对等节点");const S=document.createElement("option");S.value="",S.textContent="本机",h.appendChild(S);for(const[x,W]of e.facts().remoteTeams){if(x==="")continue;const D=document.createElement("option");D.value=x,D.textContent=((F=W[0])==null?void 0:F.origin)!==void 0&&W[0].origin!==""?`${W[0].origin}(${x})`:x,h.appendChild(D)}r!==""&&!e.facts().remoteTeams.has(r)&&(r=""),h.value=r,h.addEventListener("change",()=>{r=h.value,b()}),I.append(u,h);const w=document.createElement("div");w.className="p-nodelist-body",C.append(I,w),r===""?Z(w):k(w,e.facts().remoteTeams.get(r)??[])}function _(C,I){const u=document.createElement("span");return u.className="p-nodedot"+(I!==!0?" off":C===!1?" cold":""),u}function N(C,I){const u=document.createElement("button");return u.type="button",u.className="p-listbtn",u.textContent=C,u.addEventListener("click",h=>{h.stopPropagation(),I()}),u}function G(C,I){const u=document.createElement("div");if(u.className="p-nodelist-group",u.textContent=C,I!==void 0){const h=document.createElement("span");h.className="p-nodelist-note",h.textContent=I,u.appendChild(h)}return u}function ue(C,I){var S,w;m();const u=document.createElement("div");u.className="p-menu",u.setAttribute("role","menu"),u.setAttribute("aria-label","加入团队");for(const F of e.facts().teams){const x=((S=o.getNode(I))==null?void 0:S.memberships.some(W=>W.team===F.name))??!1;u.appendChild(e.menuItem(x?`${F.name}(已加入)`:F.name,!x,()=>{l(),e.emit({type:"add-member",team:F.name,ids:[I]})}))}u.appendChild(e.menuItem("新团队…",!0,()=>{l(),e.openNameDialog([I])})),c=u,t.appendChild(u);const h=C.getBoundingClientRect();u.style.left=`${String(Math.min(h.right+4,window.innerWidth-180))}px`,u.style.top=`${String(Math.max(8,h.top-60))}px`,u.addEventListener("keydown",F=>{F.key==="Escape"&&(F.stopPropagation(),m(),C.focus())}),(w=u.querySelector("button"))==null||w.focus()}function Z(C){var w,F;const I=new Set(e.facts().canvasMemberIds);for(const x of e.facts().sessions)x.teams!==void 0&&x.teams.length>0&&I.add(x.id);const u=e.facts().sessions.filter(x=>x.joined===!0&&!I.has(x.id)),h=e.facts().sessions.filter(x=>x.joined!==!0),S=e.facts().sessions.filter(x=>x.joined===!0&&I.has(x.id));C.appendChild(G(`未组队 (${String(u.length)})`,"无网络能力"));for(const x of u){const W=document.createElement("div");W.className="p-noderow";const D=document.createElement("span");D.className="p-nodename",D.textContent=x.name!==void 0&&x.name!==""?x.name:x.label,D.title=x.team;const ie=document.createElement("span");ie.className="p-nonet",ie.textContent="无网络能力";const Ee=N("入队▸",()=>ue(Ee,x.id));W.append(_(x.live,!0),D,ie,Ee,N("退网",()=>{l(),e.emit({type:"leave-network",id:x.id})})),C.appendChild(W)}C.appendChild(G(`未入网 (${String(h.length)})`));for(const x of h){const W=document.createElement("div");W.className="p-noderow";const D=document.createElement("span");D.className="p-nodename",D.textContent=x.name!==void 0&&x.name!==""?x.name:x.label,D.title=x.id,W.append(_(x.live,!1),D,N("入网",()=>{l(),e.emit({type:"join-network",id:x.id})})),C.appendChild(W)}C.appendChild(G(`已组队 (${String(S.length)})`,"画布展示"));for(const x of S){const W=document.createElement("div");W.className="p-noderow";const D=document.createElement("span");D.className="p-nodename",D.textContent=x.name!==void 0&&x.name!==""?x.name:x.label,D.title=x.team;const ie=((w=o.getNode(x.id))==null?void 0:w.memberships.length)??0,Ee=((F=x.teams)==null?void 0:F.length)??0,Le=document.createElement("span");Le.className="p-teamcount",Le.textContent=`队×${String(Math.max(ie,0)+Ee)}`,W.append(_(x.live,!0),D,Le,N("定位",()=>{e.locate(x.id)})),C.appendChild(W)}if(e.facts().sessions.length===0){const x=document.createElement("div");x.className="p-nodelist-empty",x.textContent="无会话节点",C.appendChild(x)}}function k(C,I){var S;const u=I.filter(w=>w.teams===void 0||w.teams.length===0),h=I.filter(w=>w.teams!==void 0&&w.teams.length>0);C.appendChild(G(`未组队 (${String(u.length)})`,"无网络能力 · 只读"));for(const w of u){const F=document.createElement("div");F.className="p-noderow";const x=document.createElement("span");x.className="p-nodename",x.textContent=w.name!==void 0&&w.name!==""?w.name:w.team,x.title=w.team;const W=document.createElement("span");W.className="p-nonet",W.textContent="无网络能力",F.append(_(!0,!0),x,W),C.appendChild(F)}C.appendChild(G(`已组队 (${String(h.length)})`,"只读"));for(const w of h){const F=document.createElement("div");F.className="p-noderow";const x=document.createElement("span");x.className="p-nodename",x.textContent=w.name!==void 0&&w.name!==""?w.name:w.team,x.title=w.team;const W=document.createElement("span");W.className="p-teamcount",W.textContent=`队×${String(((S=w.teams)==null?void 0:S.length)??0)}`,F.append(_(!0,!0),x,W),C.appendChild(F)}if(I.length===0){const w=document.createElement("div");w.className="p-nodelist-empty",w.textContent="该节点未发布会话",C.appendChild(w)}}return document.addEventListener("pointerdown",C=>{if(i===null)return;const I=C.target;if(I===null){l();return}I.closest(".p-nodelist")!==null||I.closest(".p-menu")!==null||I===n||n.contains(I)||l()},s),{toggle:p,close:l,refresh:()=>{i!==null&&b()}}}function Rs(e){let t=e;const n=t.search(/\|| ```|^```/);return n>=0&&(t=t.slice(0,n)),t.replace(/\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/(^|\s)#{1,6}\s+/g,"$1").replace(/\*\*|__|`/g,"").replace(/\s+/g," ").trim()}function Ds(e,t){const n=e.map(i=>i.name!==void 0&&i.name!==""?i.name:i.team),s=n.slice(0,2).join("、"),o=n.length>2?` +${n.length-2}`:"";return(t!==void 0?`score ${t} · `:"")+`${e.length} 远端团队`+(s!==""?`:${s}${o}`:"")}function Bs(e,t,n){if(e.id.startsWith("member-"))return{title:e.name!==void 0&&e.name!==""?e.name:e.team,sub:e.team,tip:e.team};if(e.remote===!0){const m=e.id.slice(5),l=t.length===1&&t[0].name!==void 0&&t[0].name!==""?t[0].name:void 0,p=Ds(t,n);return l!==void 0?{title:l,sub:`${m} · ${p}`,tip:`${l}
6
- ${m}
7
- ${p}`}:{title:m,sub:p,tip:`${m}
8
- ${p}`}}const s=st(e),o=e.team+(e.name!==void 0&&e.name!==""?" · "+e.name:""),i=Rs(e.description??""),r=i!==""?i:o===s?"":e.team,c=(e.memberships.length>1?` · 跨队×${e.memberships.length}`:"")+(e.teams!==void 0&&e.teams.length>0?` · 网络队×${e.teams.length}`:"");return{title:s,sub:r+c,tip:i!==""?`${o}
9
- ${i}`:o}}const Un="dsh-a2a.board.legend";function js(){const e=document.createElement("details");e.className="p-legend";const t=document.createElement("summary");t.textContent="图例",t.title="边的含义(点击展开 / 收起)";const n=document.createElement("div");n.className="p-legend-rows";const s=(o,i,r)=>{const c=document.createElement("span"),m=document.createElement("i");o&&(m.className="dashed"),r!==void 0&&(m.style.borderTopColor=r),c.append(m,document.createTextNode(i)),n.appendChild(c)};s(!1,"成员边(星形,框→成员)"),s(!0,"跨队多属(虚线)"),s(!1,"活动边(inFlight 路由,瞬时)","var(--accent)"),s(!0,"联邦线(→peer)","var(--federal)"),e.append(t,n);try{e.open=window.localStorage.getItem(Un)==="open"}catch{}return e.addEventListener("toggle",()=>{try{window.localStorage.setItem(Un,e.open?"open":"closed")}catch{}}),e}function Hs(e){return e<680?"narrow":e<1024?"medium":"wide"}function Ys(e){let t=0;for(let c=0;c<e.length;c++)t=(t*31+e.charCodeAt(c)&268435455)>>>0;const n=Yn[t%Yn.length],s="#"+n.toString(16).padStart(6,"0"),o=n>>16&255,i=n>>8&255,r=n&255;return{line:s,bg:`rgba(${o},${i},${r},0.05)`}}function Ws(e){const t=new bn;let n,s={...t.viewport},o={kind:"none"},i=!1,r=-1,c=!0,m=!1;const l=Fs(t);let p,b=!1;const _=()=>Hs(globalThis.innerWidth||Ve),N=()=>{var a;(a=e.viewportStore)==null||a.set(_(),s),e.onDirty()},G=e.now??Date.now,ue=new AbortController,Z=[];let k=null,C=!1;const I={signal:ue.signal},u=document.createElement("section");u.id="dsh-plan",u.setAttribute("role","tabpanel"),u.setAttribute("aria-label","A2A 规划画布"),u.tabIndex=0,u.style.display="none";const h=document.createElement("div");h.className="p-grid";const S=document.createElement("div");S.className="p-world";const w=document.createElementNS("http://www.w3.org/2000/svg","svg");w.setAttribute("class","p-edges");const F=document.createElement("div");F.className="p-layer p-frames";let x;const W=a=>{var f,y;x!==void 0&&((f=Pe.get(x))==null||f.classList.remove("selected")),x=a,a!==void 0&&((y=Pe.get(a))==null||y.classList.add("selected"))},D=document.createElement("div");D.className="p-layer p-nodes",D.setAttribute("role","listbox"),D.setAttribute("aria-multiselectable","true"),D.setAttribute("aria-label","会话节点"),S.append(w,F,D);const ie=document.createElement("div");ie.className="p-marquee";const Ee=document.createElement("div");Ee.className="p-toolbar";const Le=document.createElement("span");Le.className="p-zoom mono",Le.textContent="100%";const O=(a,f,y)=>{const M=document.createElement("button");return M.type="button",M.textContent=a,M.title=f,M.addEventListener("click",y,I),M},z=()=>{const a=document.createElement("span");return a.className="p-sep",a.setAttribute("role","separator"),a.setAttribute("aria-orientation","vertical"),a};Ee.append(O("适配","适配视图(快捷键 0)",()=>Ce()),O("-","缩小",()=>Ze(1/1.2)),Le,O("+","放大",()=>Ze(1.2)),z(),O("建队","组成团队(G):先框选至少 2 个节点",()=>$.startCreateFromSelection()),O("整理成员","每队框内仅属一队的成员自动排齐(多队成员不动)",()=>vt()),O("一键重排","全板队框+成员重排:框尺寸随内容自适应、框位行流式平铺(远端队框与多归属成员不动)",()=>ut()),O("撤销","撤销上一次布局改动:拖动、缩放、整理、重排、载入时避让(Ctrl+Z;入队离队不撤销)",()=>je()));const se=O("未入网","未入网会话(点击选择入网)",()=>$.toggleNetMenu());se.className="p-netbtn",se.setAttribute("aria-haspopup","menu"),Ee.append(z(),se);const Ne=vs(Ee,t,st,a=>pe(a)),Q=O("节点","节点清单:本机与对等节点(未组队/未入网在此管理)",()=>ne.toggle());Q.className="p-nodebtn",Q.setAttribute("aria-haspopup","dialog"),Ee.appendChild(Q);const B=document.createElement("span");B.setAttribute("aria-live","polite"),B.className="p-lamp";const ve=document.createElement("i"),le=document.createElement("span");le.textContent="布局",B.append(ve,le),B.addEventListener("click",()=>{B.classList.contains("error")&&e.onLampClick()},I),B.addEventListener("keydown",a=>{const f=a;(f.key==="Enter"||f.key===" ")&&B.classList.contains("error")&&(f.preventDefault(),e.onLampClick())},I),Ee.appendChild(B);const ye=document.createElement("div");ye.className="p-status";const Te=document.createElement("span"),Qe=document.createElement("span"),Je=document.createElement("span");Je.className="mut";const Ke=document.createElement("span");Ke.className="mut",ye.append(Te,Qe,Je,Ke),ye.tabIndex=0,ye.setAttribute("role","button"),ye.setAttribute("aria-label","定位在途路由与联邦对端"),ye.title="定位在途与联邦(回车)",ye.addEventListener("click",()=>ae(),I),ye.addEventListener("keydown",a=>{const f=a;(f.key==="Enter"||f.key===" ")&&(f.preventDefault(),ae())},I);const bt=js(),He=document.createElement("div");He.className="p-notice-stack",He.setAttribute("role","log"),He.setAttribute("aria-live","polite"),u.append(h,S,ie,Ee,ye,bt,He);let Ve=0,rt=0;const gt=()=>e.viewSize?e.viewSize():{w:u.clientWidth,h:u.clientHeight},Ye=()=>{const a=gt();Ve=a.w,rt=a.h};function We(){S.style.transform=ds(s);const a=24*s.scale;h.style.backgroundSize=`${a}px ${a}px`,h.style.backgroundPosition=`${-s.x*s.scale}px ${-s.y*s.scale}px`,Le.textContent=`${Math.round(s.scale*100)}%`}function vt(){const a=l.capture();_s(t),Wt(t,new Set(E.keys())),l.commit(a),N(),we()}function ut(){const a=l.capture();$s(t,new Set(E.keys()))&&(Wt(t,new Set(E.keys())),l.commit(a),N(),we())}function we(){We(),t.revision!==r&&(r=t.revision,yt(),d(),Jo(w,t)),de()}const Pe=new Map,Ge=new Map;function yt(){const a=new Set;for(const[f,y]of t.allFrames()){a.add(f);let M=Pe.get(f);if(M===void 0){M=document.createElement("div"),M.className="p-frame",M.dataset.name=f;const v=document.createElement("div");v.className="p-frame-head",v.dataset.frame=f,v.tabIndex=0,v.setAttribute("role","button"),v.setAttribute("aria-haspopup","menu"),v.setAttribute("aria-label",`团队框 ${f}(拖动整组,回车菜单)`);const me=document.createElement("span");me.className="ttl";const ce=document.createElement("span");ce.className="cnt mono";const Ie=document.createElement("span");Ie.className="route mono",v.append(me,ce,Ie),M.appendChild(v);for(const Se of["n","s","e","w","ne","nw","se","sw"]){const be=document.createElement("div");be.className=`p-frame-handle p-h-${Se}`,be.dataset.frame=f,be.dataset.dir=Se,M.appendChild(be)}F.appendChild(M),Pe.set(f,M)}const j=Ys(f);M.style.setProperty("--frame-line",j.line),M.style.setProperty("--frame-bg",j.bg),M.style.left=`${y.x}px`,M.style.top=`${y.y}px`,M.style.width=`${y.w}px`,M.style.height=`${y.h}px`;const J=M.querySelector(".ttl"),K=M.querySelector(".cnt"),X=M.querySelector(".route");J.textContent!==f&&(J.textContent=f);let te=0,q=0;for(const v of t.allNodes())v.memberships.find(ce=>ce.team===f)!==void 0&&(te+=1,v.memberships.length>1&&(q+=1));const Me=`${te} 成员`+(q>0?` +${q} 跨队`:"");K.textContent!==Me&&(K.textContent=Me);const $e=Ns(E.get(f),xe.has(f)),Ae=($e==null?void 0:$e.text)??at(f);X.textContent!==Ae&&(X.textContent=Ae),X.title=($e==null?void 0:$e.title)??"",M.classList.toggle("is-mirror",$e!==void 0),M.classList.toggle("is-syncing",($e==null?void 0:$e.syncing)===!0);const De=`团队框 ${f}${$e!==void 0?`(${$e.text})`:""}(拖动整组,回车菜单)`,dt=M.querySelector(".p-frame-head");dt.getAttribute("aria-label")!==De&&dt.setAttribute("aria-label",De)}for(const[f,y]of[...Pe])a.has(f)||(y.remove(),Pe.delete(f))}function at(a){const f=Pt.find(y=>y.name===a);return(f==null?void 0:f.team)??a}function d(){const a=new Set;for(const f of t.allNodes()){a.add(f.id);let y=Ge.get(f.id);if(y===void 0){y=document.createElement("div"),y.className="p-node",y.dataset.id=f.id,y.tabIndex=0;const q=document.createElement("div");q.className="nm";const Me=document.createElement("span");Me.className="dot";const $e=document.createElement("span");$e.className="nm-text",q.append(Me,$e);const Ae=document.createElement("div");Ae.className="sub mono";const De=document.createElement("span");De.className="prio mono",y.append(q,Ae,De),D.appendChild(y),Ge.set(f.id,y)}const M=it(f);y.style.left=`${M.x}px`,y.style.top=`${M.y}px`,y.classList.toggle("cold",!f.live),y.classList.toggle("remote",f.remote===!0),y.classList.toggle("selected",t.isSelected(f.id)),y.setAttribute("aria-selected",String(t.isSelected(f.id)));const j=f.id.slice(5),J=Bs(f,f.remote===!0?L.get(j)??[]:[],U.get(j)),K=y.querySelector(".nm-text");K.textContent!==J.title&&(K.textContent=J.title);const X=y.querySelector(".sub");X.textContent!==J.sub&&(X.textContent=J.sub),y.title!==J.tip&&(y.title=J.tip);const te=y.querySelector(".prio");if(f.remote===!0){const q=Y.get(j),Me=(q==null?void 0:q.link)==="linked"?"lnk-linked":(q==null?void 0:q.link)==="stranger"?"lnk-stranger":"";te.className!==`prio mono ${Me}`.trim()&&(te.className=`prio mono ${Me}`.trim());const $e=q===void 0?"":q.verified===!0?"✓":"✗",Ae=((q==null?void 0:q.link)??"peer")+$e;te.textContent!==Ae&&(te.textContent=Ae)}else{te.className!=="prio mono"&&(te.className="prio mono");const q=f.memberships[0]!==void 0?`P${f.memberships[0].index}`:"";te.textContent!==q&&(te.textContent=q)}}for(const[f,y]of[...Ge])a.has(f)||(y.remove(),Ge.delete(f));Ne.refresh()}const A=rs(w,t);let L=new Map;const U=new Map,Y=new Map;function de(){A.render(G())}function ae(){s=gn(ss(t.contentBounds(),A.placements()),u.clientWidth||Ve,u.clientHeight||rt),We(),N()}const pe=gs({model:t,viewSize:gt,setVp:a=>{s=a},applyViewport:We,markDirty:N,cardEl:a=>Ge.get(a)});function oe(a){var M;const f=a.sessions.filter(j=>j.live!==!1).length,y=(j,J,K)=>{const X=document.createElement("b");X.className=J,X.textContent=K,j.replaceChildren(X)};y(Te,"ok",`● ${f} live`),y(Qe,"warn",`● ${a.sessions.length-f} cold`),Je.textContent=`${((M=a.inFlight)==null?void 0:M.length)??0} inFlight`,Ke.className="mut",Ke.textContent=`${a.teams.length} 队 · ${a.peerCount} peer`}const xe=new Map,qe=a=>{xe.set(a,(xe.get(a)??0)+1),r=-1},Re=a=>{r=-1;const f=(xe.get(a)??0)-1;f<=0?xe.delete(a):xe.set(a,f)};let E=new Map;function g(a){function f(j){const J=K=>{var te;const X=[];for(const q of K){if(!q.startsWith("peer-")&&!q.startsWith("member-")){X.push(q);continue}const Me=(te=t.getNode(q))==null?void 0:te.remoteHandle;Me!==void 0&&Me!==""&&X.push(Me)}return X};if(j.type==="add-member"||j.type==="remove-member"||j.type==="create-team"){const K=J(j.ids),X=j.type!=="create-team"?E.get(j.team):void 0;return K.length>0||X!==void 0?{...j,ids:K,...X!==void 0?{fleetPeer:X}:{}}:j}return j}if(a.type==="add-member"||a.type==="remove-member"||a.type==="reorder"||a.type==="create-team"){const j=a.type==="reorder"?a.ops.map(J=>J.id):[...a.ids];for(const J of j){if(J===""||J.startsWith("peer-")||J.startsWith("member-")||t.getNode(J)!==void 0)continue;const K=P.find(q=>q.id===J);if(K===void 0)continue;const X=n==null?void 0:n.nodes[J],te=X!==void 0?{x:X.x,y:X.y}:vn(J);t.upsertNode({id:J,x:te.x,y:te.y,label:K.label,team:K.team,name:K.name,description:K.description,live:K.live!==!1,memberships:[],...K.teams!==void 0&&K.teams.length>0?{teams:K.teams}:{}})}}const y=ms(t,a),M=cn(a);qe(M),we(),e.onCanvasAction(f(a)).then(j=>{Re(M),n=jn(t,a,j,y,n),N(),we()},()=>{Re(M),n=jn(t,a,!1,y,n),N(),R("error","操作通道异常,已回滚"),we()})}function R(a,f){var M;for(;He.childElementCount>=3;)(M=He.firstElementChild)==null||M.remove();const y=document.createElement("div");y.className="p-notice"+(a==="error"?" error":""),y.setAttribute("role",a==="error"?"alert":"status"),y.textContent=f,He.appendChild(y),Z.push(setTimeout(()=>y.remove(),4e3))}const $=fs({root:u,netBtn:se,signal:I,model:t,teams:()=>Pt,anchorFor:a=>(a.kind==="node"?Ge.get(a.id):Pe.get(a.name))??null,emit:g,notice:R});let P=[],H=new Set;const ne=Ps({root:u,trigger:Q,signal:I,model:t,facts:()=>({sessions:P,canvasMemberIds:H,remoteTeams:L,teams:Pt}),menuItem:$.menuItem,emit:g,openNameDialog:$.openNameDialog,locate:re});function re(a){var M;const f=t.getNode(a);if(f===void 0)return;ne.close();const y=((M=e.viewSize)==null?void 0:M.call(e))??{w:u.clientWidth>0?u.clientWidth:800,h:u.clientHeight>0?u.clientHeight:600};s=Nt({scale:s.scale,x:f.x-y.w/(2*s.scale),y:f.y-y.h/(2*s.scale)}),We(),r=-1,we()}function V(a){const f=u.getBoundingClientRect();return{x:a.clientX-f.left,y:a.clientY-f.top}}function he(a,f){var K;const y=V(f),M=mt(s,y.x,y.y),j=Hn(new Map(t.allFrames()),M),J=a.ids.filter(X=>{const te=t.getNode(X);return te===void 0?!1:te.remote!==!0?!0:te.remoteHandle!==void 0&&te.remoteHandle!==""});if(j!==void 0){const X=J.filter(te=>{var q;return!((q=t.getNode(te))!=null&&q.memberships.some(Me=>Me.team===j))});if(X.length>0){g({type:"add-member",team:j,ids:X});return}if(a.ids.length===1&&((K=t.getNode(a.clicked))==null?void 0:K.remote)!==!0){const te=t.teamMemberIds(j),q=us(t,j);q.join("\0")!==te.join("\0")&&g({type:"reorder",team:j,ops:ln(te,q)})}}}function _e(a){if(Ve===0&&Ye(),$.isDialogOpen()){a.preventDefault();return}const f=a.target;if($.isMenuOpen()){if(f!==null&&f.closest(".p-menu")!==null)return;$.closeMenu(),a.preventDefault();return}if(f!==null&&f.closest("button, input, textarea, select, .p-toolbar, .p-search, .p-lamp, .p-status, .p-legend")!==null)return;p=l.capture();const y=V(a);if(a.button===2){k={x:y.x,y:y.y,target:a.target,moved:!1},a.preventDefault();try{u.setPointerCapture(a.pointerId??0)}catch{}return}const M=f!==null?f.closest(".p-node"):null,j=f!==null?f.closest(".p-frame-head"):null;if((M!==null||j!==null)&&a.button===1){o={kind:"pan",last:y,moved:!1},a.preventDefault();try{u.setPointerCapture(a.pointerId??0)}catch{}return}const J=f!==null?f.closest(".p-frame-handle"):null;if(x!==void 0){const K=Pe.get(x),X=f!==null&&K!==void 0&&(K.contains(f)||K===f),te=j!==null&&j.dataset.frame===x;!X&&!te&&W(void 0)}if(J!==null&&a.button===0){const K=J.dataset.frame??"";W(K);const X=t.getFrame(K);if(X===void 0)return;o={kind:"frame-resize",name:K,dir:J.dataset.dir??"se",startRect:{...X},origin:mt(s,y.x,y.y),moved:!1},a.preventDefault();try{u.setPointerCapture(a.pointerId??0)}catch{}return}if(M!==null){if(a.button!==0)return;const K=M.dataset.id??"",X=t.isSelected(K);!X&&!a.shiftKey&&t.setSelection([K]);const te=a.shiftKey||X?t.isSelected(K)?t.selectedIds():[...t.selectedIds(),K]:[K];o={kind:"node",clicked:K,ids:te,last:mt(s,y.x,y.y),moved:!1,el:M},M.classList.add("dragging")}else if(j!==null){if(a.button!==0)return;const K=j.dataset.frame??"";W(K);const X=t.beginFrameDrag(K);if(X===void 0)return;o={kind:"frame",name:K,snap:X,origin:mt(s,y.x,y.y),moved:!1}}else if(a.button===1||a.button===0&&i)o={kind:"pan",last:y,moved:!1};else if(a.button===0)o={kind:"marquee",origin:y,last:y,additive:a.shiftKey},ie.style.display="block",ie.style.left=`${y.x}px`,ie.style.top=`${y.y}px`,ie.style.width="0px",ie.style.height="0px";else return;a.preventDefault();try{u.setPointerCapture(a.pointerId??0)}catch{}}function ee(a){const f=V(a);if(k!==null){const y=f.x-k.x,M=f.y-k.y;Math.hypot(y,M)>4&&(k.moved=!0,s=Nt(on(s,-y,-M)),k.x=f.x,k.y=f.y,We());return}if(o.kind==="node"){const y=mt(s,f.x,f.y),M=y.x-o.last.x,j=y.y-o.last.y;if(M===0&&j===0)return;o.moved=!0,o.last=y,t.dragNodes(o.ids,M,j);const J=Hn(new Map(t.allFrames()),y),K=o.ids.filter(te=>{const q=t.getNode(te);return q===void 0?!1:q.remote!==!0||q.remoteHandle!==void 0&&q.remoteHandle!==""}),X=J!==void 0&&K.length>0;for(const[te,q]of Pe)q.classList.toggle("drop-target",X&&te===J);we()}else if(o.kind==="frame"){const y=mt(s,f.x,f.y),M=y.x-o.origin.x,j=y.y-o.origin.y;if(!o.moved&&M===0&&j===0)return;o.moved=!0,t.applyFrameDrag(o.snap,M,j),we()}else if(o.kind==="frame-resize"){const y=mt(s,f.x,f.y),M=y.x-o.origin.x,j=y.y-o.origin.y;if(!o.moved&&M===0&&j===0)return;o.moved=!0;const J=220,K=120,X={...o.startRect};let{x:te,y:q,w:Me,h:$e}=X;o.dir.includes("e")&&(Me=Math.max(J,X.w+M)),o.dir.includes("s")&&($e=Math.max(K,X.h+j)),o.dir.includes("w")&&(Me=Math.max(J,X.w-M),te=X.x+(X.w-Me)),o.dir.includes("n")&&($e=Math.max(K,X.h-j),q=X.y+(X.h-$e)),t.setFrame(o.name,{x:Math.round(te),y:Math.round(q),w:Math.round(Me),h:Math.round($e)}),we()}else if(o.kind==="pan")s=on(s,f.x-o.last.x,f.y-o.last.y),o.last=f,o.moved=!0,We();else if(o.kind==="marquee"){const y=Math.min(o.origin.x,f.x),M=Math.min(o.origin.y,f.y);ie.style.left=`${y}px`,ie.style.top=`${M}px`,ie.style.width=`${Math.abs(f.x-o.origin.x)}px`,ie.style.height=`${Math.abs(f.y-o.origin.y)}px`,o.last=f}}function Oe(a){var f,y;if(k!==null){const M=k.moved,j=k.target,J=k.x,K=k.y;k=null,M?(C=!0,N()):j!==null&&$.contextMenuAt(J,K,j);return}if(o.kind==="node"){const M=o.clicked;if(o.moved)he(o,a),N();else if(a.shiftKey){const j=t.selectedIds();t.setSelection(j.includes(M)?j.filter(J=>J!==M):[...j,M])}else t.setSelection([M]),(f=e.onNodePick)==null||f.call(e,M);for(const j of Pe.values())j.classList.remove("drop-target");(y=o.el)==null||y.classList.remove("dragging"),we()}else if(o.kind==="frame"||o.kind==="frame-resize")o.moved&&(Wt(t,new Set(E.keys()),o.name),N(),we());else if(o.kind==="pan")o.moved&&N();else if(o.kind==="marquee"){const M=o.last,j=mt(s,Math.min(o.origin.x,M.x),Math.min(o.origin.y,M.y)),J=mt(s,Math.max(o.origin.x,M.x),Math.max(o.origin.y,M.y));t.marqueeSelect({x:j.x,y:j.y,w:J.x-j.x,h:J.y-j.y},o.additive),ie.style.display="none",we()}o={kind:"none"},p!==void 0&&(l.commit(p),p=void 0);try{u.releasePointerCapture(a.pointerId??0)}catch{}}function Xe(a){var y;for(const M of Pe.values())M.classList.remove("drop-target");o.kind==="node"&&((y=o.el)==null||y.classList.remove("dragging"));const f=o.kind==="pan"&&o.moved||(k==null?void 0:k.moved)===!0;ie.style.display="none",k=null,o={kind:"none"},p!==void 0&&l.revert(p)&&we(),f&&N(),p=void 0;try{u.releasePointerCapture(a.pointerId??0)}catch{}}function Ue(a){$.isMenuOpen()&&$.closeMenu();const f=V(a);if(a.shiftKey&&!a.ctrlKey){const y=a.deltaMode===1?16:1;s=Nt(on(s,(a.deltaX??0)*y,(a.deltaY??0)*y))}else{const y=a.deltaMode===1?16:1,M=Math.exp(-((a.deltaY??0)*y)*.0015);s=Fn(s,M,f.x,f.y)}a.preventDefault(),We(),N()}function Ze(a){Ye(),s=Fn(s,a,Ve/2,rt/2),We(),N()}function je(){l.undo()?(N(),we()):R("info","没有可撤销的布局改动")}function Ce(){Ye(),s=Dn(Rn(t.contentBounds(),t.allNodes()),Ve,rt,Bn(Ee,ye)),We(),N()}function nt(a){var J,K,X,te,q,Me,$e;if($.isDialogOpen()||((K=(J=a.target)==null?void 0:J.closest)==null?void 0:K.call(J,".p-search"))!==null)return;if((a.ctrlKey||a.metaKey)&&a.key.toLowerCase()==="k"){a.preventDefault(),Ne.focus();return}if((a.ctrlKey||a.metaKey)&&!a.shiftKey&&a.key.toLowerCase()==="z"){a.preventDefault(),je();return}if(a.ctrlKey||a.metaKey)return;if($.isMenuOpen()){a.key==="Escape"&&($.closeMenu(),a.preventDefault());return}if(a.key===" "&&a.target===u){i=!0,a.preventDefault();return}const f=((te=(X=a.target)==null?void 0:X.closest)==null?void 0:te.call(X,".p-frame-head"))??null;if((a.key==="Enter"||a.key===" ")&&f!==null){a.preventDefault();const Ae=f.getBoundingClientRect();$.contextMenuAt(Ae.left+Ae.width/2,Ae.top+Ae.height/2,f);return}if(a.key===" "&&((Me=(q=a.target)==null?void 0:q.classList)!=null&&Me.contains("p-node"))){const De=a.target.dataset.id??"",dt=t.selectedIds();t.setSelection(dt.includes(De)?dt.filter(v=>v!==De):[...dt,De]),we(),a.preventDefault();return}if(a.key==="F10"&&a.shiftKey||a.key==="ContextMenu"){a.preventDefault();const Ae=document.activeElement??null,De=(($e=Ae==null?void 0:Ae.getBoundingClientRect)==null?void 0:$e.call(Ae))??{left:0,top:0,width:0,height:0};$.contextMenuAt(De.left+De.width/2,De.top+De.height/2,Ae);return}if(a.key==="Delete"||a.key==="Backspace"){a.preventDefault(),kt();return}if(a.altKey&&(a.key==="ArrowUp"||a.key==="ArrowDown")){a.preventDefault(),Ot(a.key==="ArrowUp");return}if(a.key==="g"||a.key==="G"){$.startCreateFromSelection();return}if(a.key==="0"){Ce();return}if(a.key==="="||a.key==="+"){Ze(1.2);return}if(a.key==="-"){Ze(1/1.2);return}if(a.key==="Escape"){if($.isMenuOpen()){$.closeMenu(),we();return}t.setSelection([]),we();return}const y=a.shiftKey?40:8,j={ArrowLeft:[-y,0],ArrowRight:[y,0],ArrowUp:[0,-y],ArrowDown:[0,y]}[a.key];if(j!==void 0){a.preventDefault();const Ae=t.selectedIds();if(Ae.length>0){const De=l.capture();t.nudge(Ae,j[0],j[1]),l.commit(De),we(),N()}}}function kt(){var M,j,J;const a=document.activeElement,f=((M=a==null?void 0:a.closest)==null?void 0:M.call(a,".p-frame-head"))??null,y=((j=a==null?void 0:a.closest)==null?void 0:j.call(a,".p-node"))??null;if(f!==null){g({type:"remove-team",name:f.dataset.frame??""});return}if(y!==null){const K=y.dataset.id??"",X=((J=t.getNode(K))==null?void 0:J.memberships.map(te=>te.team))??[];if(X.length===0){R("info","该节点未加入任何团队");return}if(X.length===1){g({type:"remove-member",team:X[0],ids:[K]});return}$.openMenu(window.innerWidth/2,window.innerHeight/2,{kind:"node",id:K},"leave",y);return}R("info","焦点不在节点或团队框上")}function Ot(a){var Me,$e;const f=document.activeElement,y=((Me=f==null?void 0:f.closest)==null?void 0:Me.call(f,".p-node"))??null;if(y===null)return;const M=y.dataset.id??"",j=(($e=t.getNode(M))==null?void 0:$e.memberships)??[];if(j.length!==1)return;const J=j[0].team,K=t.teamMemberIds(J),X=K.indexOf(M),te=a?Math.max(0,X-1):Math.min(K.length-1,X+1);if(te===X)return;const q=[...K];q.splice(X,1),q.splice(te,0,M),g({type:"reorder",team:J,ops:ln(K,q)})}function Ft(a){a.key===" "&&(i=!1)}u.addEventListener("pointerdown",a=>_e(a),I),u.addEventListener("pointermove",a=>ee(a),I),u.addEventListener("pointerup",a=>Oe(a),I),u.addEventListener("pointercancel",a=>Xe(a),I),u.addEventListener("wheel",a=>Ue(a),{...I,passive:!1}),u.addEventListener("keydown",a=>nt(a),I),u.addEventListener("keyup",a=>Ft(a),I),u.addEventListener("contextmenu",a=>{var y,M;const f=a;if(((M=(y=f.target)==null?void 0:y.closest)==null?void 0:M.call(y,"input, textarea, .p-search"))==null){if(f.preventDefault(),C){C=!1;return}$.contextMenuAt(f.clientX,f.clientY,f.target)}},I);let Pt=[];function co(a){var Ae,De,dt;Pt=a.teams,a.peers,A.setInFlight(a.inFlight??[]),P=a.sessions,$.setUnjoined(a.sessions.filter(v=>v.joined!==!0&&!v.id.startsWith("peer-")));const f=new Map;for(const v of a.teams)for(let me=0;me<v.members.length;me++){const ce=v.members[me].id,Ie=f.get(ce)??[];Ie.push({team:v.name,index:me}),f.set(ce,Ie)}H=new Set(f.keys());const y=new Set,M=v=>{const me=f.get(v)??[];if(xe.size===0)return me;const ce=me.filter(Se=>!xe.has(Se.team)),Ie=[];for(const[Se]of xe){const ge=t.teamMemberIds(Se).indexOf(v);ge>=0&&Ie.push({team:Se,index:ge})}return[...ce,...Ie]};let j;if(n===void 0&&!t.allNodes().some(v=>v.remote!==!0)){const v=a.sessions.filter(me=>{var ce;return me.joined===!0&&(M(me.id).length>0||(((ce=me.teams)==null?void 0:ce.length)??0)>0)}).map(me=>me.id);Ye(),j=Xo(a.teams,v,Ve>0?Ve:void 0)}for(const v of a.sessions){if(v.joined!==!0)continue;const me=M(v.id);if(!(me.length===0&&(v.teams===void 0||v.teams.length===0)))if(y.add(v.id),t.getNode(v.id)!==void 0)t.upsertNode({id:v.id,x:t.getNode(v.id).x,y:t.getNode(v.id).y,label:v.label,team:v.team,name:v.name,description:v.description,live:v.live!==!1,memberships:me,...v.teams!==void 0&&v.teams.length>0?{teams:v.teams}:{}});else{const ce=n==null?void 0:n.nodes[v.id];let Ie,Se;if(ce!==void 0)Ie=ce.x,Se=ce.y;else{const be=(j==null?void 0:j.get(v.id))??vn(v.id);Ie=be.x,Se=be.y}t.upsertNode({id:v.id,x:Ie,y:Se,label:v.label,team:v.team,name:v.name,description:v.description,live:v.live!==!1,memberships:me,...v.teams!==void 0&&v.teams.length>0?{teams:v.teams}:{}})}}for(const v of t.nodeIds())!y.has(v)&&!v.startsWith("peer-")&&!v.startsWith("member-")&&t.removeNode(v);const J=new Set;L=qo(a.remoteTeams??[]),U.clear();for(const v of a.peers??[])U.set(xt(v.url),v.score),Y.set(xt(v.url),{link:v.link,verified:v.verified});if(a.peers!==void 0){const v=t.contentBounds(),me=ts(a.peers,v);a.peers.forEach((ce,Ie)=>{var yn,wn,xn,Cn;const Se=Vo(ce.url);J.add(Se);const be=n==null?void 0:n.nodes[Se],ge=t.getNode(Se),ft=ge!==void 0?{x:ge.x,y:ge.y}:be!==void 0?{x:be.x,y:be.y}:{x:((yn=me[Ie])==null?void 0:yn.x)??200,y:((wn=me[Ie])==null?void 0:wn.y)??0},ot=xt(ce.url),Et=(Cn=(xn=L.get(ot))==null?void 0:xn[0])==null?void 0:Cn.team;t.upsertNode({id:Se,x:ft.x,y:ft.y,label:ce.url,team:"",name:ce.url,peerUrl:ce.url,remoteHandle:Et,live:!0,remote:!0,memberships:[]}),t.upsertScore(Se,ce.score)})}for(const v of t.nodeIds())v.startsWith("peer-")&&!J.has(v)&&t.removeNode(v);const K=new Set;for(const[v,me]of L){const ce=t.allNodes().find(be=>be.remote===!0&&xt(be.peerUrl??"")===v&&!be.id.startsWith("member-")),Ie=((ce==null?void 0:ce.x)??400)+190;let Se=(ce==null?void 0:ce.y)??0;for(const be of me){if(!be.team.includes("/"))continue;const ge=`member-${be.team.replace(/[^a-z0-9-]/gi,"-")}`;if(K.has(ge))continue;K.add(ge);const ft=n==null?void 0:n.nodes[ge],ot=t.getNode(ge),Et=ot!==void 0?{x:ot.x,y:ot.y}:ft!==void 0?{x:ft.x,y:ft.y}:{x:Ie,y:Se};Se+=92,t.upsertNode({id:ge,x:Et.x,y:Et.y,label:be.team,team:be.team,name:be.name!==void 0&&be.name!==""?be.name:be.team,remoteHandle:be.team,live:!0,remote:!0,memberships:[]})}}for(const v of t.nodeIds())v.startsWith("member-")&&!K.has(v)&&t.removeNode(v);const X=new Map;for(const v of t.allNodes())v.remote!==!0||v.remoteHandle===void 0||v.remoteHandle===""||(!X.has(v.remoteHandle)||v.id.startsWith("member-"))&&X.set(v.remoteHandle,v.id);for(const v of a.teams){if(xe.has(v.name))continue;const me=[];for(const Se of v.members){const be=X.get(Se.id)??Se.id;t.getNode(be)!==void 0&&me.push(be)}const ce=[...t.teamMemberIds(v.name)].sort().join("|"),Ie=[...me].sort().join("|");ce!==Ie&&t.setTeamMembers(v.name,me)}const te=new Map,q=E;if(E=te,a.peerOrg!==void 0){let v=0;const me=new Set(a.teams.map(ce=>ce.name));for(const ce of a.peerOrg){const Ie=((De=(Ae=a.remoteTeams)==null?void 0:Ae.find(ge=>ge.via===ce.url))==null?void 0:De.team.split("/")[0])??"dsh",Se=ge=>ge.replace(/^session-/,"").slice(0,8),be=ge=>ge.includes("/")?`member-${ge.replace(/[^a-z0-9-]/gi,"-")}`:`member-${Ie}-${Se(ge)}`;for(const ge of ce.org){if(ge.name===""||me.has(ge.name))continue;const ft=ge.members.map(be).filter(Et=>t.getNode(Et)!==void 0),ot=(dt=n==null?void 0:n.frames)==null?void 0:dt[ge.name];t.getFrame(ge.name)===void 0&&t.setFrame(ge.name,ot!==void 0?{x:ot.x,y:ot.y,w:ot.w,h:ot.h}:{x:200+v%4*280,y:940+Math.floor(v/4)*160,w:250,h:130}),t.setTeamMembers(ge.name,ft),te.set(ge.name,ce.url),v+=1}}}for(const[v,me]of q)te.has(v)||t.removeFrame(v);const Me=new Map;for(const v of t.allNodes())v.remote===!0&&v.remoteHandle!==void 0&&v.remoteHandle!==""&&Me.set(v.remoteHandle,v.id);const $e=so(a.teams);for(const v of a.teams){if(t.getFrame(v.name)!==void 0||xe.has(v.name))continue;const me=n==null?void 0:n.frames[v.name];if(me!==void 0){t.setFrame(v.name,{...me});continue}const ce=[],Ie=[];for(const be of v.members){const ge=t.getNode(Me.get(be.id)??be.id);ge!==void 0&&(Ie.push(it(ge)),$e.get(ge.id)===v.name&&ce.push(it(ge)))}const Se=ce.length>0?ce:Ie;Se.length>0&&t.setFrame(v.name,hn(Se))}for(const[v]of t.allFrames())xe.has(v)||!a.teams.some(me=>me.name===v)&&!te.has(v)&&t.removeFrame(v);if(ne.refresh(),oe(a),!m&&o.kind==="none"&&t.nodeIds().length>0){m=!0;const v=l.capture();Wt(t,new Set(E.keys())),l.commit(v)}c&&o.kind==="none"&&t.nodeIds().length>0&&(Ye(),Ve>0&&rt>0&&(c=!1,s=Dn(Rn(t.contentBounds(),t.allNodes()),Ve,rt,Bn(Ee,ye)))),we()}function vn(a){return io(a,t.allNodes().filter(f=>f.remote!==!0))}function lo(a){const f=no(a);if(f===void 0)return;n=f;const y=e.viewportStore;if(y===void 0)c=!1,o.kind==="none"&&(s=Nt({...f.viewport}));else if(!b&&o.kind==="none"){b=!0;const M=y.get(_());M!=null&&Number.isFinite(M.x)&&Number.isFinite(M.y)&&Number.isFinite(M.scale)?(s=Nt({x:M.x,y:M.y,scale:M.scale}),c=!1):_()==="wide"&&(s=Nt({...f.viewport}),c=!1)}r=-1,we()}function mo(){return jo(s,t.positions(),t.frameRects())}function uo(a,f){B.classList.remove("pending","saved","error"),a==="pending"&&B.classList.add("pending"),a==="saved"&&B.classList.add("saved"),a==="error"&&B.classList.add("error"),a==="error"?(B.tabIndex=0,B.setAttribute("role","button"),B.setAttribute("aria-label","布局保存失败,按回车重试")):(B.removeAttribute("tabindex"),B.removeAttribute("role"),B.removeAttribute("aria-label"));const y=a==="pending"?"布局待保存…":a==="saved"?`布局已保存 ${f??""}`.trimEnd():a==="error"?"保存失败 · 回车重试":"布局";le.textContent=y}function fo(){u.style.display="block",Ye(),We(),u.focus()}function po(){u.style.display="none"}function ho(){ue.abort();for(const a of Z)clearTimeout(a)}return{root:u,reconcile:co,activate:fo,deactivate:po,adoptExternalLayout:lo,snapshotDoc:mo,setLamp:uo,notice:R,destroy:ho,seam:{pointerDown:_e,pointerMove:ee,pointerUp:Oe,pointerCancel:Xe,wheel:Ue,key:nt,keyUp:Ft,contextMenu(a){a.preventDefault(),$.contextMenuAt(a.clientX,a.clientY,a.target)}}}}const Xs=800;function Ks(e){let t,n=!1,s=!1,o=!1,i="idle";function r(p){p!==i&&(i=p,e.onLamp(p))}function c(){t!==void 0&&(t(),t=void 0)}function m(){c(),t=e.schedule(()=>{t=void 0,l(!1)},Xs)}async function l(p){if(n){s=!0;return}n=!0,c();const b=e.snapshot();let _;try{_=JSON.stringify(b)}catch{n=!1,r("error"),e.onHttpError("layout document is not JSON-serializable");return}try{const N=await e.send(b,{keepalive:p});if(N===null||typeof N!="object"||N.ok!==!0){r("error");const G=N!==null&&typeof N=="object"&&typeof N.error=="string"?N.error:"layout save refused";e.onHttpError(`layout save: ${G}`)}else JSON.stringify(e.snapshot())===_&&(e.onAdopt(N.layout),r("saved"))}catch(N){r("error"),e.onHttpError(`layout save unreachable: ${String((N==null?void 0:N.message)??N).slice(0,80)}`)}if(n=!1,i==="error"){o=!1;return}if(o){o=!1,l(!0);return}s&&(s=!1,r("pending"),m())}return{markDirty(){if(s=!1,r("pending"),n){s=!0;return}m()},retry(){i!=="error"||n||(r("pending"),l(!1))},flush(){if(n){o=!0,s=!0;return}c(),l(!0)},isBusy(){return n},dispose(){c()}}}function zn(e){return e!=null&&typeof e.error=="string"?e.error:void 0}function Us(e){const t=new Map;let n=0;function s(r,c){n+=1;const m=t.get(r)??Promise.resolve(),l=async()=>{try{return await c()}finally{n-=1}},p=m.then(l,l);return t.set(r,p.then(()=>{},()=>{})),p}async function o(r){var ue,Z,k,C;let c;try{c=await e.send(r)}catch(I){const u=String((I==null?void 0:I.message)??I).slice(0,80);return e.onNotice("error",`画布不可达:${u}`),!1}if(c.status>=400)return e.onNotice("error",zn(c.body)??`HTTP ${c.status}`),!1;if(((ue=c.body)==null?void 0:ue.ok)===!0)return!0;const m=c.body!=null&&typeof c.body=="object"?zn(c.body):void 0;if(m!==void 0)return e.onNotice("error",m),!1;const l=String(r.name??""),p=String(r.id??""),b=(Z=c.body)==null?void 0:Z.members,_=(k=c.body)==null?void 0:k.teams,N=Array.isArray(b)&&b.every(I=>typeof I=="string"),G=Array.isArray(_)&&_.every(I=>typeof I=="string");return((C=c.body)==null?void 0:C.ok)===!1&&(r.action==="add-member"&&N&&b.includes(p)||r.action==="remove-member"&&N&&!b.includes(p)||r.action==="remove"&&G&&!_.includes(l))?!0:(e.onNotice("error","画布操作未确认:"+String(r.action)+"(可能队伍/成员已达上限,请重试)"),!1)}async function i(r,c){for(const m of c)if(!await o({...r,id:m}))return!1;return!0}return{createTeam(r,c){return s(r,async()=>{if(!await o({action:"create",name:r}))return!1;for(let m=0;m<c.length;m++)if(!await o({action:"add-member",name:r,id:c[m]}))return!1;return!0})},addMembers(r,c){return s(r,()=>i({action:"add-member",name:r},c))},removeMembers(r,c){return s(r,()=>i({action:"remove-member",name:r},c))},runRosterOps(r,c){return s(r,async()=>{for(const m of c){const l=m.op==="remove"?{action:"remove-member",name:r,id:m.id}:{action:"add-member",name:r,id:m.id};if(!await o(l))return!1}return!0})},removeTeam(r){return s(r,()=>o({action:"remove",name:r}))},hasPending(){return n>0}}}const ao=document.getElementById("app"),zs=(()=>{try{return window.sessionStorage.getItem("dsh_a2a_key")??""}catch{return""}})(),dn=window.__DSH_A2A_KEY__??zs,ze=(e,t={})=>fetch(e,{...t,headers:{...t.headers??{},...dn!==""?{"X-API-Key":dn}:{}}});dn===""&&ze("/__dsh_a2a/owner-settings").then(e=>{if(e.status!==401)return;const t=document.createElement("div");t.className="nexus-keygate",t.style.cssText="position:fixed;inset:0;display:flex;align-items:center;justify-content:center;flex-direction:column;gap:10px;background:#fff;z-index:9999;font:14px/1.5 system-ui,sans-serif;color:#000";const n=document.createElement("div");n.textContent="此面板经远程面打开(密钥不随页面下发)——输入控制密钥";const s=document.createElement("input");s.type="password",s.placeholder="X-API-Key",s.setAttribute("aria-label","控制密钥");const o=document.createElement("button");o.type="button",o.textContent="进入面板";const i=document.createElement("div");i.style.color="#b00";const r=()=>{const c=s.value.trim();c!==""&&fetch("/__dsh_a2a/owner-settings",{headers:{"X-API-Key":c}}).then(m=>{if(m.status===401){i.textContent="密钥不对,再试一次";return}try{window.sessionStorage.setItem("dsh_a2a_key",c)}catch{}window.location.reload()})};o.addEventListener("click",r),s.addEventListener("keydown",c=>{c.key==="Enter"&&r()}),t.append(n,s,o,i),document.body.appendChild(t)});const Tt=document.createElement("div");Tt.className="nexus-fault";ao.appendChild(Tt);const{fault:mn,clear:Js}=vo({show(e){Tt.textContent=e,Tt.style.display="block"},hide(){Tt.style.display="none"}},e=>console.error(e));let zt;const Jn="dsh-a2a.viewport.",Vs={get(e){try{const t=window.localStorage.getItem(Jn+e);return t===null?void 0:JSON.parse(t)}catch{return}},set(e,t){try{window.localStorage.setItem(Jn+e,JSON.stringify({x:t.x,y:t.y,scale:t.scale}))}catch{}}},lt=Ws({viewportStore:Vs,onDirty:()=>qt.markDirty(),onLampClick:()=>qt.retry(),onNodePick:e=>{zt==null||zt(e)},onCanvasAction:async e=>{const t=await qs(e);return Zt(),t}}),qt=Ks({snapshot:()=>lt.snapshotDoc(),send:(e,t)=>ze("/__dsh_a2a/canvas-layout",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"save",layout:e}),cache:"no-store",keepalive:t.keepalive}).then(async n=>await n.json()),schedule:(e,t)=>{const n=setTimeout(e,t);return()=>{clearTimeout(n)}},now:Date.now,onLamp:e=>{un=e;const t=new Date,n=String(t.getHours()).padStart(2,"0")+":"+String(t.getMinutes()).padStart(2,"0");lt.setLamp(e,n)},onAdopt:e=>{lt.adoptExternalLayout(e)},onHttpError:e=>mn(e)});window.addEventListener("pagehide",()=>qt.flush());const It=Us({send:async e=>{const t=await ze("/__dsh_a2a/canvas",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e),cache:"no-store"});return{status:t.status,body:await t.json()}},onNotice:(e,t)=>lt.notice(e,t)});function qs(e){if((e.type==="add-member"||e.type==="remove-member")&&e.fleetPeer!==void 0)return(async()=>{for(const t of e.ids){const n=await ze("/__dsh_a2a/fleet-canvas-op",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({peer:e.fleetPeer,op:e.type==="add-member"?"add-member":"remove-member",name:e.team,id:t}),cache:"no-store"}).catch(()=>{}),s=n!==void 0?await n.json().catch(()=>{}):void 0;if((s==null?void 0:s.ok)!==!0)return lt.notice("error",`跨主机团队操作失败:${String((s==null?void 0:s.error)??"对端无响应")}`),!1}return!0})();switch(e.type){case"create-team":return It.createTeam(e.name,e.ids,e.created);case"add-member":return It.addMembers(e.team,e.ids);case"remove-member":return It.removeMembers(e.team,e.ids);case"remove-team":return It.removeTeam(e.name);case"reorder":return It.runRosterOps(e.team,e.ops);case"join-network":case"leave-network":return Gs(e.type==="join-network"?"join":"leave",e.id)}}async function Gs(e,t){const n=await ze(`/__dsh_a2a/${e}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:t}),cache:"no-store"}).catch(()=>{});return n!==void 0&&n.ok}let un="idle",Gt=!1,Vn,sn=!1;async function Qs(){const e=await ze("/__dsh_a2a/canvas-layout",{cache:"no-store"});if(!e.ok)throw new Error(`/__dsh_a2a/canvas-layout ${e.status}`);return(await e.json()).layout??null}const Qt=Do({now:()=>Date.now(),async ownerSettingsRead(){try{return await(await ze("/__dsh_a2a/owner-settings")).json()}catch{return{ok:!1,error:"unreachable"}}},async ownerSettingsWrite(e){try{return await(await ze("/__dsh_a2a/owner-settings",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})).json()}catch{return{ok:!1,error:"unreachable"}}},async abandon(e,t){try{return(await ze("/__dsh_a2a/tasks/abandon",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({task_id:e,reason:t})})).ok}catch{return!1}},copy(e){var t;(t=navigator.clipboard)==null||t.writeText(e).catch(()=>{})},async canvasOp(e,t,n){try{const s=await ze("/__dsh_a2a/canvas",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({action:e,name:t,id:n})}),o=await s.json().catch(()=>({}));return s.ok&&o.ok!==!1?!0:(console.warn(`canvas ${e} ${t}: ${o.error??`HTTP ${s.status}`}`),!1)}catch{return!1}},async dispatchQuick(e,t){try{const n=await ze("/__dsh_a2a/dispatch",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({team:e,message:t})}),s=await n.json().catch(()=>({}));return{ok:n.ok&&s.ok===!0,task_id:s.task_id,reply:s.reply,error:s.error??`HTTP ${n.status}`}}catch(n){return{ok:!1,error:n instanceof Error?n.message:String(n)}}},async sessionLog(e){try{const t=await ze(`/__dsh_a2a/session-log?id=${encodeURIComponent(e)}`),n=await t.json().catch(()=>({}));return{ok:t.ok&&n.ok===!0,messages:n.messages,error:n.error??(t.ok?void 0:`HTTP ${t.status}`)}}catch(t){return{ok:!1,error:t instanceof Error?t.message:String(t)}}},async sessionLogList(){try{const e=await ze("/__dsh_a2a/session-log"),t=await e.json().catch(()=>({}));return{ok:e.ok&&t.ok===!0,sessions:t.sessions,count:typeof t.count=="number"?t.count:void 0,error:t.error??(e.ok?void 0:`HTTP ${e.status}`)}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}},async remoteSessionLog(e){try{const t=new URLSearchParams;e.team!==void 0&&t.set("team",e.team),e.peer!==void 0&&t.set("peer",e.peer),e.id!==void 0&&t.set("id",e.id),e.limit!==void 0&&t.set("limit",String(e.limit));const n=await ze(`/__dsh_a2a/remote-session-log?${t.toString()}`),s=await n.json().catch(()=>({}));return{ok:n.ok&&s.ok===!0,messages:s.messages,sessions:s.sessions,error:s.error??(n.ok?void 0:`HTTP ${n.status}`),via:s.via}}catch(t){return{ok:!1,error:t instanceof Error?t.message:String(t)}}},board:{root:lt.root,activate:()=>lt.activate(),deactivate:()=>lt.deactivate(),available:()=>Gt}});ao.appendChild(Qt.root);zt=e=>{Qt.openNodeChat(e)};if(new URLSearchParams(window.location.search).get("mode")==="plan"){const e=window.setInterval(()=>{Gt&&(Qt.selectTab("board"),window.clearInterval(e))},300);window.setTimeout(()=>window.clearInterval(e),3e4)}async function Zt(){var e;try{const t=await ze("/__dsh_a2a/state",{cache:"no-store"});if(!t.ok)throw new Error(`/__dsh_a2a/state ${t.status}`);const n=await t.json();if(Js(),Gt=n.canvas!==void 0,Qt.update(n),Gt)try{const l=await Qs(),p=JSON.stringify(l??null);p!==Vn&&(Vn=p,(un==="idle"||un==="saved")&&!qt.isBusy()&&lt.adoptExternalLayout(l)),sn=!0}catch(l){if(!sn){mn(`canvas layout 获取失败:${String(l)}`);return}}else sn=!0;const s=(n.sessions??[]).map(l=>({...l,joined:l.joined===!0})),o=((e=n.canvas)==null?void 0:e.teams)??[],i=(n.peers??[]).filter(l=>l!==null&&typeof l=="object"&&typeof l.url=="string"),r=(n.inFlight??[]).filter(l=>l!==null&&typeof l=="object"&&typeof l.team=="string"&&typeof l.peer=="string"&&Number.isFinite(l.startedAt)),c=(n.remote??[]).filter(l=>l!==null&&typeof l=="object"&&typeof l.team=="string"&&typeof l.via=="string").map(l=>({team:l.team,name:l.name,via:l.via,workspace:l.workspace,...typeof l.origin=="string"&&l.origin!==""?{origin:l.origin}:{},...Array.isArray(l.teams)&&l.teams.length>0?{teams:l.teams.filter(p=>typeof p=="string"&&p!=="")}:{}})),m=(n.peerOrg??[]).filter(l=>l!==null&&typeof l=="object").filter(l=>typeof l.url=="string"&&Array.isArray(l.org)).map(l=>({url:l.url,org:l.org.filter(p=>p!==null&&typeof p=="object").filter(p=>typeof p.team=="string"&&p.team!=="").map(p=>({name:typeof p.name=="string"?p.name:"",team:p.team,members:Array.isArray(p.members)?p.members.filter(b=>typeof b=="string"):[]}))}));lt.reconcile({sessions:s,teams:o,peerCount:i.length,peers:i,inFlight:r,remoteTeams:c,peerOrg:m})}catch(t){mn(`state 轮询失败:${String(t)}`)}}Zt();window.setInterval(()=>{document.hidden||Zt()},3e3);document.addEventListener("visibilitychange",()=>{document.hidden||Zt()});