@rubytech/create-maxy-code 0.1.319 → 0.1.321

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 (104) hide show
  1. package/dist/__tests__/base-toolchain-deps.test.js +67 -0
  2. package/dist/index.js +7 -1
  3. package/package.json +1 -1
  4. package/payload/platform/config/brand.json +1 -1
  5. package/payload/platform/lib/graph-style/dist/index.d.ts.map +1 -1
  6. package/payload/platform/lib/graph-style/dist/index.js +15 -0
  7. package/payload/platform/lib/graph-style/dist/index.js.map +1 -1
  8. package/payload/platform/lib/graph-style/src/index.ts +16 -0
  9. package/payload/platform/lib/graph-write/dist/index.d.ts.map +1 -1
  10. package/payload/platform/lib/graph-write/dist/index.js +3 -0
  11. package/payload/platform/lib/graph-write/dist/index.js.map +1 -1
  12. package/payload/platform/lib/graph-write/src/index.ts +3 -0
  13. package/payload/platform/lib/models/dist/index.d.ts +14 -0
  14. package/payload/platform/lib/models/dist/index.d.ts.map +1 -1
  15. package/payload/platform/lib/models/dist/index.js +22 -1
  16. package/payload/platform/lib/models/dist/index.js.map +1 -1
  17. package/payload/platform/lib/models/src/index.ts +26 -0
  18. package/payload/platform/neo4j/schema.cypher +103 -0
  19. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +40 -10
  20. package/payload/platform/plugins/docs/references/admin-ui.md +26 -5
  21. package/payload/platform/plugins/docs/references/neo4j.md +9 -0
  22. package/payload/platform/plugins/docs/references/platform.md +1 -1
  23. package/payload/platform/plugins/docs/references/plugins-guide.md +2 -2
  24. package/payload/platform/plugins/docs/references/troubleshooting.md +1 -1
  25. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-loader.test.js +28 -0
  26. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-loader.test.js.map +1 -1
  27. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/typed-edge-schema.test.js +7 -1
  28. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/typed-edge-schema.test.js.map +1 -1
  29. package/payload/platform/plugins/memory/mcp/dist/lib/typed-edge-schema.d.ts.map +1 -1
  30. package/payload/platform/plugins/memory/mcp/dist/lib/typed-edge-schema.js +19 -1
  31. package/payload/platform/plugins/memory/mcp/dist/lib/typed-edge-schema.js.map +1 -1
  32. package/payload/platform/plugins/memory/references/schema-knowledge-work.md +80 -0
  33. package/payload/platform/plugins/projects/PLUGIN.md +11 -0
  34. package/payload/platform/plugins/projects/references/meeting-to-tasks.md +34 -0
  35. package/payload/platform/plugins/projects/references/prioritization.md +43 -0
  36. package/payload/platform/plugins/projects/references/risk-premortem.md +34 -0
  37. package/payload/platform/plugins/projects/references/sprint.md +5 -1
  38. package/payload/platform/plugins/projects/references/stakeholder-map.md +43 -0
  39. package/payload/platform/scripts/installer-device-verify.sh +38 -0
  40. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  41. package/payload/platform/services/claude-session-manager/dist/http-server.js +24 -6
  42. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  43. package/payload/platform/services/claude-session-manager/dist/jsonl-enumerator.d.ts +6 -0
  44. package/payload/platform/services/claude-session-manager/dist/jsonl-enumerator.d.ts.map +1 -1
  45. package/payload/platform/services/claude-session-manager/dist/jsonl-enumerator.js +17 -3
  46. package/payload/platform/services/claude-session-manager/dist/jsonl-enumerator.js.map +1 -1
  47. package/payload/platform/services/claude-session-manager/dist/permission-mode-tail.d.ts +3 -1
  48. package/payload/platform/services/claude-session-manager/dist/permission-mode-tail.d.ts.map +1 -1
  49. package/payload/platform/services/claude-session-manager/dist/permission-mode-tail.js.map +1 -1
  50. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +2 -1
  51. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  52. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +10 -3
  53. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  54. package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts +1 -25
  55. package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts.map +1 -1
  56. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +23 -95
  57. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
  58. package/payload/platform/services/claude-session-manager/dist/settings-permission-mode.d.ts +9 -0
  59. package/payload/platform/services/claude-session-manager/dist/settings-permission-mode.d.ts.map +1 -1
  60. package/payload/platform/services/claude-session-manager/dist/settings-permission-mode.js +29 -0
  61. package/payload/platform/services/claude-session-manager/dist/settings-permission-mode.js.map +1 -1
  62. package/payload/premium-plugins/venture-studio/PLUGIN.md +12 -3
  63. package/payload/premium-plugins/venture-studio/skills/investor-data-room/SKILL.md +14 -0
  64. package/payload/premium-plugins/venture-studio/skills/investor-data-room/references/competitive-battlecard.md +37 -0
  65. package/payload/premium-plugins/venture-studio/skills/investor-data-room/references/competitor-analysis.md +32 -0
  66. package/payload/premium-plugins/venture-studio/skills/investor-data-room/references/monetization-strategy.md +35 -0
  67. package/payload/premium-plugins/venture-studio/skills/investor-data-room/references/pricing-strategy.md +37 -0
  68. package/payload/premium-plugins/venture-studio/skills/investor-data-room/references/strategy-frameworks.md +46 -0
  69. package/payload/premium-plugins/venture-studio/skills/legal-essentials/SKILL.md +65 -0
  70. package/payload/premium-plugins/venture-studio/skills/zero-to-prototype/SKILL.md +6 -0
  71. package/payload/premium-plugins/venture-studio/skills/zero-to-prototype/references/market-sizing.md +58 -0
  72. package/payload/premium-plugins/venture-studio/skills/zero-to-prototype/references/strategy-red-team.md +41 -0
  73. package/payload/server/maxy-edge.js +1 -1
  74. package/payload/server/public/assets/{AdminLoginScreens-CrdmA3KA.js → AdminLoginScreens-DKwWudsP.js} +1 -1
  75. package/payload/server/public/assets/AdminShell-BsPsXvJv.js +1 -0
  76. package/payload/server/public/assets/{Checkbox-DXisJRUK.js → Checkbox-V5ubVZG1.js} +1 -1
  77. package/payload/server/public/assets/OperatorConversations-DOGCHZhv.css +1 -0
  78. package/payload/server/public/assets/OperatorConversations-DPRRlS_z.js +9 -0
  79. package/payload/server/public/assets/{admin-DX5lZxWt.js → admin-Cfqj5N4P.js} +1 -1
  80. package/payload/server/public/assets/{browser-Bxx8w8BA.js → browser-CtMwlpyW.js} +1 -1
  81. package/payload/server/public/assets/chat-Bm11OGsU.js +1 -0
  82. package/payload/server/public/assets/data-7_dN5vN5.js +1 -0
  83. package/payload/server/public/assets/{graph-B59N222f.js → graph-Bez5QF37.js} +3 -3
  84. package/payload/server/public/assets/graph-labels-BkbaBPIP.js +1 -0
  85. package/payload/server/public/assets/operator-F5KHg5WG.js +1 -0
  86. package/payload/server/public/assets/page-CExyEcvh.js +30 -0
  87. package/payload/server/public/assets/{public-BcqXGSaE.js → public-wy93nfmL.js} +1 -1
  88. package/payload/server/public/browser.html +4 -4
  89. package/payload/server/public/chat.html +5 -5
  90. package/payload/server/public/data.html +4 -4
  91. package/payload/server/public/graph.html +6 -6
  92. package/payload/server/public/index.html +6 -6
  93. package/payload/server/public/operator.html +7 -7
  94. package/payload/server/public/public.html +5 -5
  95. package/payload/server/server.js +109 -9
  96. package/payload/server/public/assets/AdminShell-0meAFBva.js +0 -1
  97. package/payload/server/public/assets/OperatorConversations-DBy2G8q3.js +0 -9
  98. package/payload/server/public/assets/OperatorConversations-DvRXfq3q.css +0 -1
  99. package/payload/server/public/assets/chat-CT9YrNtI.js +0 -1
  100. package/payload/server/public/assets/data-B9NtsXgF.js +0 -1
  101. package/payload/server/public/assets/graph-labels-70w-1ov0.js +0 -1
  102. package/payload/server/public/assets/operator-DpRAhwQN.js +0 -1
  103. package/payload/server/public/assets/page-Ehjc9b9V.js +0 -30
  104. /package/payload/server/{chunk-NCRJQEZ3.js → chunk-GRKG3KNN.js} +0 -0
@@ -5,11 +5,11 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Data — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/data-B9NtsXgF.js"></script>
8
+ <script type="module" crossorigin src="/assets/data-7_dN5vN5.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-Pqm5yXtL.js">
10
- <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-DBy2G8q3.js">
11
- <link rel="modulepreload" crossorigin href="/assets/graph-labels-70w-1ov0.js">
12
- <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-DvRXfq3q.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-DPRRlS_z.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/graph-labels-BkbaBPIP.js">
12
+ <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-DOGCHZhv.css">
13
13
  </head>
14
14
  <body>
15
15
  <div id="root"></div>
@@ -5,13 +5,13 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Graph — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/graph-B59N222f.js"></script>
8
+ <script type="module" crossorigin src="/assets/graph-Bez5QF37.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-Pqm5yXtL.js">
10
- <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-DBy2G8q3.js">
11
- <link rel="modulepreload" crossorigin href="/assets/graph-labels-70w-1ov0.js">
12
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-0meAFBva.js">
13
- <link rel="modulepreload" crossorigin href="/assets/Checkbox-DXisJRUK.js">
14
- <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-DvRXfq3q.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-DPRRlS_z.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/graph-labels-BkbaBPIP.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-BsPsXvJv.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/Checkbox-V5ubVZG1.js">
14
+ <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-DOGCHZhv.css">
15
15
  </head>
16
16
  <body>
17
17
  <div id="root"></div>
@@ -5,14 +5,14 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/admin-DX5lZxWt.js"></script>
8
+ <script type="module" crossorigin src="/assets/admin-Cfqj5N4P.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-Pqm5yXtL.js">
10
- <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-DBy2G8q3.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-0meAFBva.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-DPRRlS_z.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-BsPsXvJv.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/admin-types-CJrGd46U.js">
13
- <link rel="modulepreload" crossorigin href="/assets/Checkbox-DXisJRUK.js">
14
- <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-CrdmA3KA.js">
15
- <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-DvRXfq3q.css">
13
+ <link rel="modulepreload" crossorigin href="/assets/Checkbox-V5ubVZG1.js">
14
+ <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-DKwWudsP.js">
15
+ <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-DOGCHZhv.css">
16
16
  <link rel="stylesheet" crossorigin href="/assets/AdminLoginScreens-CWMpccrR.css">
17
17
  <link rel="stylesheet" href="/brand-defaults.css">
18
18
  </head>
@@ -5,16 +5,16 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Operator — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/operator-DpRAhwQN.js"></script>
8
+ <script type="module" crossorigin src="/assets/operator-F5KHg5WG.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-Pqm5yXtL.js">
10
- <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-DBy2G8q3.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-0meAFBva.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-DPRRlS_z.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-BsPsXvJv.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/admin-types-CJrGd46U.js">
13
- <link rel="modulepreload" crossorigin href="/assets/Checkbox-DXisJRUK.js">
14
- <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-CrdmA3KA.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/Checkbox-V5ubVZG1.js">
14
+ <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-DKwWudsP.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-Bf_JiD2A.js">
16
- <link rel="modulepreload" crossorigin href="/assets/page-Ehjc9b9V.js">
17
- <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-DvRXfq3q.css">
16
+ <link rel="modulepreload" crossorigin href="/assets/page-CExyEcvh.js">
17
+ <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-DOGCHZhv.css">
18
18
  <link rel="stylesheet" crossorigin href="/assets/AdminLoginScreens-CWMpccrR.css">
19
19
  </head>
20
20
  <body>
@@ -5,14 +5,14 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/public-BcqXGSaE.js"></script>
8
+ <script type="module" crossorigin src="/assets/public-wy93nfmL.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-Pqm5yXtL.js">
10
- <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-DBy2G8q3.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-0meAFBva.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-DPRRlS_z.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-BsPsXvJv.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/admin-types-CJrGd46U.js">
13
13
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-Bf_JiD2A.js">
14
- <link rel="modulepreload" crossorigin href="/assets/page-Ehjc9b9V.js">
15
- <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-DvRXfq3q.css">
14
+ <link rel="modulepreload" crossorigin href="/assets/page-CExyEcvh.js">
15
+ <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-DOGCHZhv.css">
16
16
  <link rel="stylesheet" href="/brand-defaults.css">
17
17
  </head>
18
18
  <body class="public-surface">
@@ -106,7 +106,7 @@ import {
106
106
  vncLog,
107
107
  walkPremiumBundles,
108
108
  writeAdminUserAndPerson
109
- } from "./chunk-NCRJQEZ3.js";
109
+ } from "./chunk-GRKG3KNN.js";
110
110
  import {
111
111
  __commonJS,
112
112
  __toESM
@@ -486,7 +486,22 @@ var require_dist2 = __commonJS({
486
486
  EmailAccount: "#91A063",
487
487
  // Public-agent projection — burnished bronze sits between
488
488
  // people-terracotta and email-moss but shares neither hue.
489
- Agent: "#B8893D"
489
+ Agent: "#B8893D",
490
+ // Knowledge-work ontology (the Maxy brand; schema-knowledge-work.md).
491
+ // Two bands, kept apart from every other family so a knowledge-worker
492
+ // legend reads them as their own groups. Strategy/decision sits in an
493
+ // indigo→violet band (distinct from the business slates and the plum
494
+ // conversational family); Risk is a lone desaturated signal-red placed
495
+ // away from both bands so it reads as a warning; research/evidence sits
496
+ // in a teal→green→gold band (distinct from workflow teal and knowledge
497
+ // moss). All seven hexes are pairwise-unique across the registry.
498
+ Objective: "#3D5A98",
499
+ KeyResult: "#5E7BC4",
500
+ Decision: "#7E60B0",
501
+ Risk: "#C15B57",
502
+ Source: "#2F8FA6",
503
+ Finding: "#4FA389",
504
+ Hypothesis: "#9A8C3E"
490
505
  };
491
506
  exports.FALLBACK_LABEL_COLOUR = "#94A3B8";
492
507
  exports.ALL_GRAPH_LABELS = Object.freeze(Object.keys(exports.GRAPH_LABEL_COLOURS));
@@ -882,7 +897,16 @@ var require_dist3 = __commonJS({
882
897
  "Job",
883
898
  "LineItem",
884
899
  "QuoteDocument",
885
- "VariationNote"
900
+ "VariationNote",
901
+ // Knowledge-work vertical — the seven gap labels, each carrying a
902
+ // CREATE VECTOR INDEX in schema.cypher so the chokepoint auto-embeds them.
903
+ "Objective",
904
+ "KeyResult",
905
+ "Decision",
906
+ "Risk",
907
+ "Source",
908
+ "Finding",
909
+ "Hypothesis"
886
910
  ]);
887
911
  exports.DOCUMENT_ARCHIVE_LABELS = /* @__PURE__ */ new Set([
888
912
  "KnowledgeDocument",
@@ -8004,6 +8028,9 @@ var MODEL_CONTEXT_WINDOW = {
8004
8028
  [SONNET_MODEL]: 2e5,
8005
8029
  [HAIKU_MODEL]: 2e5
8006
8030
  };
8031
+ function contextWindow(model) {
8032
+ return MODEL_CONTEXT_WINDOW[model] ?? 2e5;
8033
+ }
8007
8034
  var MODEL_DISPLAY_NAMES = {
8008
8035
  [OPUS_MODEL]: "Opus 4.8 (1M context)",
8009
8036
  [SONNET_MODEL]: "Sonnet 4.6",
@@ -8013,6 +8040,12 @@ var SELECTABLE_MODELS = [OPUS_MODEL, SONNET_MODEL, HAIKU_MODEL];
8013
8040
  function isSelectableModel(id) {
8014
8041
  return SELECTABLE_MODELS.includes(id);
8015
8042
  }
8043
+ function baseModelId(id) {
8044
+ return id.replace(/\[1m\]$/, "");
8045
+ }
8046
+ function canonicalModelId(id) {
8047
+ return SELECTABLE_MODELS.find((m) => baseModelId(m) === baseModelId(id)) ?? id;
8048
+ }
8016
8049
  var PERMISSION_MODES = ["default", "acceptEdits", "plan", "auto", "bypassPermissions"];
8017
8050
  function isPermissionMode(value) {
8018
8051
  return PERMISSION_MODES.includes(value);
@@ -8021,6 +8054,8 @@ var EFFORT_LEVELS = ["low", "medium", "high", "xhigh"];
8021
8054
  function isEffortLevel(value) {
8022
8055
  return EFFORT_LEVELS.includes(value);
8023
8056
  }
8057
+ var SPAWN_PERMISSION_MODES = [...PERMISSION_MODES, "dontAsk"];
8058
+ var SESSION_EFFORT_LEVELS = ["auto", ...EFFORT_LEVELS, "max"];
8024
8059
 
8025
8060
  // ../services/claude-session-manager/src/sidecar-store.ts
8026
8061
  import { existsSync as existsSync8, mkdirSync as mkdirSync2, readdirSync as readdirSync9, readFileSync as readFileSync15, renameSync as renameSync2, unlinkSync, writeFileSync as writeFileSync6 } from "fs";
@@ -8212,7 +8247,9 @@ var NO_INDICATORS = {
8212
8247
  activity: null,
8213
8248
  permissionMode: null,
8214
8249
  effectivePermissionMode: null,
8215
- model: null
8250
+ model: null,
8251
+ effort: null,
8252
+ contextUsage: null
8216
8253
  };
8217
8254
  var indicatorsErrorLogged = false;
8218
8255
  var INDICATORS_TIMEOUT_MS = 1500;
@@ -8229,11 +8266,21 @@ async function fetchComposerIndicators(sessionId) {
8229
8266
  });
8230
8267
  if (!res.ok) return NO_INDICATORS;
8231
8268
  const body = await res.json();
8269
+ const model = typeof body.model === "string" ? body.model : null;
8270
+ const effort = typeof body.effortLevel === "string" ? body.effortLevel : null;
8271
+ const turnCount = typeof body.turnCount === "number" ? body.turnCount : 0;
8272
+ const usedTokens = typeof body.usedTokens === "number" ? body.usedTokens : null;
8273
+ const window = contextWindow(canonicalModelId(model ?? ""));
8274
+ const pct = usedTokens != null ? Math.round(usedTokens / window * 100) : null;
8275
+ const contextUsage = usedTokens != null ? { usedTokens, window, pct } : null;
8276
+ console.log(`[webchat-session] op=context-usage key=${sessionId} turns=${turnCount} used=${usedTokens ?? "absent"} window=${window} pct=${pct ?? "absent"}`);
8232
8277
  return {
8233
8278
  activity: typeof body.activity === "string" ? body.activity : null,
8234
8279
  permissionMode: typeof body.permissionMode === "string" ? body.permissionMode : null,
8235
8280
  effectivePermissionMode: typeof body.effectivePermissionMode === "string" ? body.effectivePermissionMode : null,
8236
- model: typeof body.model === "string" ? body.model : null
8281
+ model,
8282
+ effort,
8283
+ contextUsage
8237
8284
  };
8238
8285
  } catch (err) {
8239
8286
  if (!indicatorsErrorLogged) {
@@ -13386,6 +13433,7 @@ app20.get("/download", requireAdminSession, async (c) => {
13386
13433
  if (root !== "data" && root !== "claude-uploads") {
13387
13434
  return c.json({ error: "invalid root" }, 400);
13388
13435
  }
13436
+ const disposition = c.req.query("disposition") ?? "attachment";
13389
13437
  const resolution = root === "claude-uploads" ? resolveClaudeUploadsPath(rawPath) : resolveDataPath(rawPath);
13390
13438
  if (!resolution.ok) {
13391
13439
  if (resolution.status === 403) {
@@ -13414,6 +13462,21 @@ app20.get("/download", requireAdminSession, async (c) => {
13414
13462
  const mimeType = detectMimeType(absolute);
13415
13463
  const nodeStream = createReadStream2(absolute);
13416
13464
  const webStream = Readable2.toWeb(nodeStream);
13465
+ if (disposition === "inline") {
13466
+ if (!mimeType.startsWith("image/")) {
13467
+ console.error(`[data] op=thumb-refused path="${relPath}" mime="${mimeType}" reason=not-image`);
13468
+ return c.json({ error: "Inline serve is image-only" }, 400);
13469
+ }
13470
+ console.error(`[data] op=thumb-serve path="${relPath}" mime="${mimeType}" size=${info.size} status=200`);
13471
+ return new Response(webStream, {
13472
+ status: 200,
13473
+ headers: {
13474
+ "Content-Type": mimeType,
13475
+ "Content-Length": String(info.size),
13476
+ "Cache-Control": "private, max-age=3600"
13477
+ }
13478
+ });
13479
+ }
13417
13480
  console.error(`[data] file-download root="${root}" path="${relPath}" size=${info.size}`);
13418
13481
  const safeQuotedName = filename.replace(/[\r\n"\\]/g, "_");
13419
13482
  const encodedName = encodeURIComponent(filename);
@@ -14711,7 +14774,15 @@ var FILTER_TOP_LEVEL_LABELS = Object.freeze(
14711
14774
  "Workflow",
14712
14775
  "Email",
14713
14776
  "EmailAccount",
14714
- "Agent"
14777
+ "Agent",
14778
+ // Knowledge-work vertical (schema-knowledge-work.md) — operator-entry labels.
14779
+ "Objective",
14780
+ "KeyResult",
14781
+ "Decision",
14782
+ "Risk",
14783
+ "Source",
14784
+ "Finding",
14785
+ "Hypothesis"
14715
14786
  ])
14716
14787
  );
14717
14788
  var AGENT_ACTION_LABELS = Object.freeze(
@@ -19720,6 +19791,7 @@ function buildPublicWebchatSpawnRequest(input) {
19720
19791
  channel: "webchat",
19721
19792
  accountId: input.accountId,
19722
19793
  agentSlug,
19794
+ model: SONNET_MODEL,
19723
19795
  // sliceToken/personId are present only for a gated visitor; open-mode
19724
19796
  // public agents carry neither (mirrors the bridge's open-mode key).
19725
19797
  ...sliceToken ? { sliceToken } : {},
@@ -20770,6 +20842,34 @@ function resolveDefaultSlug() {
20770
20842
  function escapeHtml(s) {
20771
20843
  return s.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
20772
20844
  }
20845
+ var brandedHtmlCache = /* @__PURE__ */ new Map();
20846
+ function brandedPublicHtml(agentSlug) {
20847
+ const baseHtml = cachedHtml("public.html");
20848
+ if (!agentSlug) return baseHtml;
20849
+ const cached3 = brandedHtmlCache.get(agentSlug);
20850
+ const branding = loadBrandingCache(agentSlug);
20851
+ if (!branding) return baseHtml;
20852
+ const brandHash = JSON.stringify(branding).length;
20853
+ if (cached3 && cached3.mtime === brandHash) return cached3.html;
20854
+ const title = escapeHtml(branding.name);
20855
+ const description = branding.tagline ? escapeHtml(branding.tagline) : "";
20856
+ const themeColor = branding.primaryColor || "";
20857
+ const ogImage = branding.logoUrl || "";
20858
+ const favicon = branding.faviconUrl || "";
20859
+ const metaTags = [
20860
+ ` <title>${title}</title>`,
20861
+ favicon ? ` <link rel="icon" href="${escapeHtml(favicon)}">` : ` <link rel="icon" href="${escapeHtml(brandFaviconPath)}">`,
20862
+ themeColor ? ` <meta name="theme-color" content="${escapeHtml(themeColor)}">` : "",
20863
+ ` <meta property="og:title" content="${title}">`,
20864
+ description ? ` <meta property="og:description" content="${description}">` : "",
20865
+ ogImage ? ` <meta property="og:image" content="${escapeHtml(ogImage)}">` : "",
20866
+ ' <meta property="og:type" content="website">'
20867
+ ].filter(Boolean).join("\n");
20868
+ const html = baseHtml.replace(` <title>${escapeHtml(BRAND.productName)}</title>
20869
+ <link rel="icon" href="${escapeHtml(brandFaviconPath)}">`, metaTags);
20870
+ brandedHtmlCache.set(agentSlug, { html, mtime: brandHash });
20871
+ return html;
20872
+ }
20773
20873
  function agentUnavailableHtml() {
20774
20874
  return `<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>${escapeHtml(BRAND.productName)}</title></head><body style="font-family:system-ui,sans-serif;max-width:32rem;margin:4rem auto;padding:0 1.5rem;color:#222"><h1 style="font-size:1.25rem">Agent unavailable</h1><p>This agent isn't available right now. If you reached this page from a saved link, the agent may have been turned off.</p></body></html>`;
20775
20875
  }
@@ -20790,7 +20890,7 @@ app52.get("/", (c) => {
20790
20890
  );
20791
20891
  }
20792
20892
  console.error(`[public-root] op=serve-default slug=${defaultSlug}`);
20793
- return c.html(cachedHtml("public.html"));
20893
+ return c.html(brandedPublicHtml(defaultSlug));
20794
20894
  }
20795
20895
  console.log(`[host-class] host=${host} class=admin served=index.html`);
20796
20896
  return c.html(cachedHtml("index.html"));
@@ -20856,7 +20956,7 @@ app52.post("/api/vnc/client-event", async (c) => {
20856
20956
  return c.json({ ok: true });
20857
20957
  });
20858
20958
  app52.get("/g/:slug", (c) => {
20859
- return c.html(cachedHtml("public.html"));
20959
+ return c.html(brandedPublicHtml(resolveDefaultSlug() ?? void 0));
20860
20960
  });
20861
20961
  for (const pwa of PWA_SURFACES) {
20862
20962
  app52.get(pwa.manifestPath, (c) => {
@@ -20912,7 +21012,7 @@ app52.get("/:slug", async (c, next) => {
20912
21012
  }
20913
21013
  const branding = loadBrandingCache(slug);
20914
21014
  console.error(`[public-catchall] served path=/${slug} slug=${slug} branding=${branding ? "hit" : "miss"}`);
20915
- return c.html(cachedHtml("public.html"));
21015
+ return c.html(brandedPublicHtml(slug));
20916
21016
  }
20917
21017
  await next();
20918
21018
  });
@@ -1 +0,0 @@
1
- import{o as e}from"./chunk-Pqm5yXtL.js";import{I as t,L as n,M as r,O as i,S as a,T as o,_ as s,b as c,d as l,f as u,h as d,k as f,m as p,p as m,t as h,v as g,w as _}from"./OperatorConversations-DBy2G8q3.js";async function ee(){try{let e=await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`logout`})});return e.ok?(await e.json().catch(()=>({})))?.logged_out===!0:(console.error(`[admin-ui] claude-logout http-status=${e.status}`),!1)}catch(e){return console.error(`[admin-ui] claude-logout fetch failed: ${e instanceof Error?e.message:String(e)}`),!1}}var te=r(`archive-restore`,[[`rect`,{width:`20`,height:`5`,x:`2`,y:`3`,rx:`1`,key:`1wp1u1`}],[`path`,{d:`M4 8v11a2 2 0 0 0 2 2h2`,key:`tvwodi`}],[`path`,{d:`M20 8v11a2 2 0 0 1-2 2h-2`,key:`1gkqxj`}],[`path`,{d:`m9 15 3-3 3 3`,key:`1pd0qc`}],[`path`,{d:`M12 12v9`,key:`192myk`}]]),v=r(`archive`,[[`rect`,{width:`20`,height:`5`,x:`2`,y:`3`,rx:`1`,key:`1wp1u1`}],[`path`,{d:`M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8`,key:`1s80jp`}],[`path`,{d:`M10 12h4`,key:`a56b0p`}]]),y=r(`bot`,[[`path`,{d:`M12 8V4H8`,key:`hb8ula`}],[`rect`,{width:`16`,height:`12`,x:`4`,y:`8`,rx:`2`,key:`enze0r`}],[`path`,{d:`M2 14h2`,key:`vft8re`}],[`path`,{d:`M20 14h2`,key:`4cs60a`}],[`path`,{d:`M15 13v2`,key:`1xurst`}],[`path`,{d:`M9 13v2`,key:`rq6x2g`}]]),ne=r(`box`,[[`path`,{d:`M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z`,key:`hh9hay`}],[`path`,{d:`m3.3 7 8.7 5 8.7-5`,key:`g66t2b`}],[`path`,{d:`M12 22V12`,key:`d0xqtd`}]]),b=r(`ellipsis`,[[`circle`,{cx:`12`,cy:`12`,r:`1`,key:`41hilf`}],[`circle`,{cx:`19`,cy:`12`,r:`1`,key:`1wjl8i`}],[`circle`,{cx:`5`,cy:`12`,r:`1`,key:`1pcz8c`}]]),x=r(`file-text`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10 9H8`,key:`b1mrlr`}],[`path`,{d:`M16 13H8`,key:`t4e002`}],[`path`,{d:`M16 17H8`,key:`z1uh3a`}]]),re=r(`history`,[[`path`,{d:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`1357e3`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}],[`path`,{d:`M12 7v5l4 2`,key:`1fdv2h`}]]),S=r(`list-todo`,[[`path`,{d:`M13 5h8`,key:`a7qcls`}],[`path`,{d:`M13 12h8`,key:`h98zly`}],[`path`,{d:`M13 19h8`,key:`c3s6r1`}],[`path`,{d:`m3 17 2 2 4-4`,key:`1jhpwq`}],[`rect`,{x:`3`,y:`4`,width:`6`,height:`6`,rx:`1`,key:`cif1o7`}]]),C=r(`message-square`,[[`path`,{d:`M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z`,key:`18887p`}]]),w=r(`plus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`M12 5v14`,key:`s699le`}]]),ie=r(`sliders-horizontal`,[[`path`,{d:`M10 5H3`,key:`1qgfaw`}],[`path`,{d:`M12 19H3`,key:`yhmn1j`}],[`path`,{d:`M14 3v4`,key:`1sua03`}],[`path`,{d:`M16 17v4`,key:`1q0r14`}],[`path`,{d:`M21 12h-9`,key:`1o4lsq`}],[`path`,{d:`M21 19h-5`,key:`1rlt1p`}],[`path`,{d:`M21 5h-7`,key:`1oszz2`}],[`path`,{d:`M8 10v4`,key:`tgpxqk`}],[`path`,{d:`M8 12H3`,key:`a7s4jb`}]]),ae=r(`square`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}]]),T=r(`users`,[[`path`,{d:`M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2`,key:`1yyitq`}],[`path`,{d:`M16 3.128a4 4 0 0 1 0 7.744`,key:`16gr8j`}],[`path`,{d:`M22 21v-2a4 4 0 0 0-3-3.87`,key:`kshegd`}],[`circle`,{cx:`9`,cy:`7`,r:`4`,key:`nufk8`}]]),E=e(n(),1),D=c(),oe={sm:14,md:16,lg:18},O={sm:30,md:38,lg:46};function k({variant:e=`primary`,size:t=`md`,icon:n,iconPosition:r=`leading`,loading:i=!1,fullWidth:a=!1,disabled:o=!1,type:s=`button`,onClick:c,"aria-label":l,style:u,className:d,children:f}){let p=[`btn`,`btn--${e}`,t===`md`?``:`btn--${t}`,a?`btn--full`:``,d].filter(Boolean).join(` `),m=oe[t],h={...e===`send`?{width:O[t],height:O[t]}:{},...u},g=Object.keys(h).length>0;return(0,D.jsxs)(`button`,{type:s,className:p,disabled:i||o,onClick:c,"aria-label":l,style:g?h:void 0,children:[(0,D.jsxs)(`span`,{className:`btn__content`,style:{visibility:i?`hidden`:`visible`},children:[n&&r===`leading`&&(0,D.jsx)(n,{size:m}),f,n&&r===`trailing`&&(0,D.jsx)(n,{size:m})]}),i&&(0,D.jsx)(`span`,{className:`btn__spinner`,children:`✱`})]})}var se=`maxy-shell-side-px`;function ce(){if(typeof window>`u`)return 0;let e=document.querySelector(`.platform > .artefact`)?.getBoundingClientRect();return e&&e.width>0?Math.round(e.width):0}function A(e){if(typeof window>`u`)return e;let t=window.innerWidth,n=Math.max(248,t-480-ce());return Math.min(Math.max(e,248),n)}function j(){if(typeof window>`u`)return 264;try{let e=window.localStorage.getItem(se);if(!e)return 264;let t=parseInt(e,10);if(!Number.isFinite(t))return console.warn(`[admin-ui] sidebar-width-parse-failed stored=${JSON.stringify(e)} fallback=264`),264;if(t>=248)return A(t)}catch{}return 264}function le({targetSelector:e=`.platform`}){let t=(0,E.useRef)(null),[n,r]=(0,E.useState)(()=>j()),i=(0,E.useRef)(n);(0,E.useLayoutEffect)(()=>{let t=document.querySelector(e);!t||!(t instanceof HTMLElement)||(t.style.setProperty(`--side-px`,`${n}px`),i.current=n)},[n,e]);let a=(0,E.useCallback)(()=>{r(e=>{let t=A(e);return t===e?e:t})},[]);(0,E.useEffect)(()=>{a(),window.addEventListener(`resize`,a);let t=document.querySelector(e),n=null;return t instanceof HTMLElement&&(n=new MutationObserver(a),n.observe(t,{attributes:!0,attributeFilter:[`data-artefact`,`class`]})),()=>{window.removeEventListener(`resize`,a),n?.disconnect()}},[a,e]);let o=e=>{e.preventDefault();let n=t.current;if(!n)return;n.setPointerCapture(e.pointerId),n.classList.add(`dragging`);let a=!1,o=e=>{a=!0,r(A(Math.round(e.clientX)))},s=()=>{if(n.releasePointerCapture(e.pointerId),n.classList.remove(`dragging`),window.removeEventListener(`pointermove`,o),window.removeEventListener(`pointerup`,s),!a)return;let t=i.current;try{window.localStorage.setItem(se,String(t))}catch{}console.info(`[admin-ui] sidebar-resize px=${t}`)};window.addEventListener(`pointermove`,o),window.addEventListener(`pointerup`,s)},s=()=>{let e=A(264);r(e);try{window.localStorage.removeItem(se)}catch{}console.info(`[admin-ui] sidebar-resize px=${e}`)};return(0,D.jsx)(`div`,{ref:t,className:`side-resize-handle`,role:`separator`,"aria-orientation":`vertical`,"aria-label":`Resize sidebar`,onPointerDown:o,onDoubleClick:s})}var ue=t();function M({anchorRef:e,onClose:t,className:n,role:r,ariaLabel:i,children:a}){let o=(0,E.useRef)(null),[s,c]=(0,E.useState)({position:`fixed`,visibility:`hidden`}),l=(0,E.useCallback)(()=>{let t=e.current,n=o.current;if(!t||!n)return;let r=t.getBoundingClientRect(),i=n.getBoundingClientRect(),a=r.right-i.width;a<4&&(a=4);let s=window.innerHeight-r.bottom<i.height+8&&r.top>i.height+8?r.top-i.height:r.bottom;c({position:`fixed`,left:a,top:s,visibility:`visible`})},[e]);return(0,E.useLayoutEffect)(()=>{if(l(),typeof ResizeObserver>`u`)return;let e=new ResizeObserver(()=>l());return o.current&&e.observe(o.current),()=>e.disconnect()},[l]),(0,E.useEffect)(()=>{let n=e=>{e.key===`Escape`&&t()},r=n=>{let r=n.target;e.current?.contains(r)||o.current?.contains(r)||t()},i=n=>{let r=e.current;r&&n.target instanceof Node&&n.target.contains(r)&&t()},a=()=>t();return document.addEventListener(`keydown`,n),document.addEventListener(`pointerdown`,r),window.addEventListener(`scroll`,i,!0),window.addEventListener(`resize`,a),()=>{document.removeEventListener(`keydown`,n),document.removeEventListener(`pointerdown`,r),window.removeEventListener(`scroll`,i,!0),window.removeEventListener(`resize`,a)}},[e,t]),(0,ue.createPortal)((0,D.jsx)(`div`,{ref:o,className:n,role:r,"aria-label":i,style:s,children:a}),document.body)}function de({action:e,disabled:t,open:n,onToggle:r,onClose:i}){let a=(0,E.useRef)(null);return(0,D.jsxs)(D.Fragment,{children:[(0,D.jsx)(`button`,{ref:a,type:`button`,className:`conv-action`,onClick:r,disabled:t,"aria-haspopup":`dialog`,"aria-expanded":n,"aria-label":e.label,title:e.title,children:e.icon}),n&&(0,D.jsx)(M,{anchorRef:a,onClose:i,className:e.panelClassName,role:`dialog`,ariaLabel:e.label,children:e.panel()})]})}function fe({actions:e,disabled:t,collapsed:n}){let[r,i]=(0,E.useState)(null),[a,o]=(0,E.useState)(!1),[s,c]=(0,E.useState)(null),l=(0,E.useRef)(null);(0,E.useEffect)(()=>{i(null),o(!1),c(null)},[n]);let u=(0,E.useCallback)(()=>{o(!1),c(null)},[]);return n?(0,D.jsxs)(`div`,{className:`conv-actions`,children:[(0,D.jsx)(`button`,{ref:l,type:`button`,className:`conv-action conv-actions-overflow`,onClick:()=>o(e=>!e),disabled:t,"aria-haspopup":`menu`,"aria-expanded":a,"aria-label":`Session actions`,title:`Session actions`,children:(0,D.jsx)(b,{size:12})}),a&&(0,D.jsx)(M,{anchorRef:l,onClose:u,className:`conv-actions-menu`,role:`menu`,children:e.map(e=>e.panel?(0,D.jsxs)(`div`,{className:`conv-actions-menu-disclosure`,children:[(0,D.jsxs)(`button`,{type:`button`,role:`menuitem`,"aria-haspopup":`dialog`,"aria-expanded":s===e.key,disabled:t,onClick:()=>c(t=>t===e.key?null:e.key),children:[e.icon,(0,D.jsx)(`span`,{children:e.menuLabel})]}),s===e.key&&(0,D.jsx)(`div`,{className:`conv-actions-menu-panel`,children:e.panel()})]},e.key):(0,D.jsxs)(`button`,{type:`button`,role:`menuitem`,className:e.danger?`conv-action-danger`:void 0,"aria-busy":e.busy,disabled:t,onClick:t=>{e.onClick?.(t),u()},children:[e.icon,(0,D.jsx)(`span`,{children:e.menuLabel})]},e.key))})]}):(0,D.jsx)(`div`,{className:`conv-actions`,children:e.map(e=>e.panel?(0,D.jsx)(de,{action:e,disabled:t,open:r===e.key,onToggle:()=>i(t=>t===e.key?null:e.key),onClose:()=>i(null)},e.key):(0,D.jsx)(`button`,{type:`button`,className:e.danger?`conv-action conv-action-danger`:`conv-action`,onClick:e.onClick,disabled:t,"aria-busy":e.busy,"aria-label":e.label,title:e.title,children:e.icon},e.key))})}var N=`claude-opus-4-8[1m]`,P=`claude-sonnet-4-6`,F=`claude-haiku-4-5`,pe={[N]:`Opus 4.8 (1M context)`,[P]:`Sonnet 4.6`,[F]:`Haiku 4.5`};function I(e){return pe[e]??e}function L(e){return e.replace(/\[1m\]$/,``)}var R=[`default`,`acceptEdits`,`plan`,`auto`,`bypassPermissions`];function me(e){return R.includes(e)}var z=[`low`,`medium`,`high`,`xhigh`],B=[N,P,F],V={default:`Ask permissions`,acceptEdits:`Accept edits`,plan:`Plan mode`,auto:`Auto mode`,bypassPermissions:`Bypass permissions`},he=R.map(e=>({value:e,label:V[e]??e})),H={low:`Low`,medium:`Medium`,high:`High`,xhigh:`Highest`},U=z.map(e=>({value:e,label:H[e]??e}));function ge(e){if(e){let t=B.find(t=>L(t)===L(e));if(t)return t}return N}function _e({row:e,adminFetch:t,onError:n}){let[r,i]=(0,E.useState)(()=>ge(e.model)),[a,o]=(0,E.useState)(``),[s,c]=(0,E.useState)(``),[l,u]=(0,E.useState)(!1),d=(0,E.useRef)(!1);(0,E.useEffect)(()=>{i(ge(e.model))},[e.model]);let f=async()=>{if(!d.current){d.current=!0,u(!0);try{let i=await t(`/api/admin/session-reseat`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({fromSessionId:e.sessionId,model:r,...a?{permissionMode:a}:{},...s?{effort:s}:{}})});if(!i.ok){n(`Could not re-seat ${e.title} (status ${i.status})`),console.error(`[admin-ui] dashboard-reseat-failed sessionId=${e.sessionId} status=${i.status}`),d.current=!1,u(!1);return}let o=await i.json().catch(()=>({}));o.target?window.location.assign(o.target):(n(`Re-seat of ${e.title} returned no target`),d.current=!1,u(!1))}catch(t){n(`Could not re-seat ${e.title} (network error)`),console.error(`[admin-ui] dashboard-reseat-failed sessionId=${e.sessionId} error=${t instanceof Error?t.message:String(t)}`),d.current=!1,u(!1)}}};return(0,D.jsxs)(D.Fragment,{children:[(0,D.jsxs)(`label`,{className:`reseat-field`,children:[(0,D.jsx)(`span`,{children:`Model`}),(0,D.jsx)(`select`,{"data-kind":`model`,value:r,disabled:l,onChange:e=>i(e.target.value),children:B.map(e=>(0,D.jsx)(`option`,{value:e,children:I(e)},e))})]}),(0,D.jsxs)(`label`,{className:`reseat-field`,children:[(0,D.jsx)(`span`,{children:`Mode`}),(0,D.jsxs)(`select`,{"data-kind":`mode`,value:a,disabled:l,onChange:e=>o(e.target.value),children:[(0,D.jsx)(`option`,{value:``,children:`Keep current`}),he.map(e=>(0,D.jsx)(`option`,{value:e.value,children:e.label},e.value))]})]}),(0,D.jsxs)(`label`,{className:`reseat-field`,children:[(0,D.jsx)(`span`,{children:`Effort`}),(0,D.jsxs)(`select`,{"data-kind":`effort`,value:s,disabled:l,onChange:e=>c(e.target.value),children:[(0,D.jsx)(`option`,{value:``,children:`Keep current`}),U.map(e=>(0,D.jsx)(`option`,{value:e.value,children:e.label},e.value))]})]}),(0,D.jsx)(`button`,{type:`button`,className:`reseat-apply`,disabled:l,"aria-busy":l,onClick:()=>void f(),children:`Re-seat`})]})}var ve=[`whatsapp`,`telegram`];function W(e){if(e<60)return`${e}s`;let t=Math.floor(e/60),n=e%60;return n>0?`${t}m ${n}s`:`${t}m`}function G(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}async function ye(e){if(navigator.clipboard)try{return await navigator.clipboard.writeText(e),!0}catch{}try{let t=document.createElement(`textarea`);t.value=e,t.style.position=`fixed`,t.style.opacity=`0`,document.body.appendChild(t),t.select();let n=document.execCommand(`copy`);return document.body.removeChild(t),n}catch{return!1}}function be({target:e,onConfirm:t,onCancel:n}){return e?(0,D.jsx)(`div`,{className:`claude-info-overlay`,onClick:n,children:(0,D.jsxs)(`div`,{className:`claude-info-modal`,onClick:e=>e.stopPropagation(),role:`alertdialog`,"aria-label":`Confirm delete session`,children:[(0,D.jsxs)(`div`,{className:`claude-info-header`,children:[(0,D.jsx)(`span`,{children:`Delete this conversation?`}),(0,D.jsx)(`button`,{className:`claude-info-close`,onClick:n,"aria-label":`Close`,children:`✕`})]}),(0,D.jsxs)(`div`,{className:`claude-info-section`,style:{padding:`12px 14px`,fontSize:`11px`,color:`var(--text-secondary)`},children:[`This permanently removes the transcript. It is not moved to Archive and cannot be recovered.`,e.live&&(0,D.jsx)(`div`,{style:{marginTop:`8px`},children:`This session is running; deleting stops it first.`})]}),(0,D.jsxs)(`div`,{className:`claude-info-section`,style:{display:`flex`,gap:`8px`,padding:`10px 14px`},children:[(0,D.jsx)(k,{variant:`danger`,size:`sm`,style:{flex:1},onClick:t,children:`Delete`}),(0,D.jsx)(k,{variant:`secondary`,size:`sm`,style:{flex:1},onClick:n,children:`Cancel`})]})]})}):null}var K=`auth-refresh-failed`;function xe({error:e,onClose:t}){if(!e)return null;let n=e.reason===K,r=n?`Claude sign-in expired`:`Session didn’t open`,i=n?`Your claude.ai login has expired. Re-authenticate to resume sessions.`:`The session did not bind within 60 seconds, so there is no live conversation to open.`;return(0,D.jsx)(`div`,{className:`claude-info-overlay`,onClick:t,children:(0,D.jsxs)(`div`,{className:`claude-info-modal`,onClick:e=>e.stopPropagation(),role:`alertdialog`,"aria-label":`Session could not be opened`,children:[(0,D.jsxs)(`div`,{className:`claude-info-header`,children:[(0,D.jsx)(`span`,{children:r}),(0,D.jsx)(`button`,{className:`claude-info-close`,onClick:t,"aria-label":`Close`,children:`✕`})]}),(0,D.jsxs)(`div`,{className:`claude-info-section`,style:{padding:`12px 14px`,fontSize:`11px`,color:`var(--text-secondary)`},children:[i,(0,D.jsxs)(`div`,{className:`claude-info-row`,style:{marginTop:`8px`},children:[(0,D.jsx)(`span`,{className:`claude-info-label`,children:`Reason`}),(0,D.jsx)(`span`,{className:`claude-info-value`,children:e.reason})]}),e.sessionId&&(0,D.jsxs)(`div`,{className:`claude-info-row`,children:[(0,D.jsx)(`span`,{className:`claude-info-label`,children:`Session`}),(0,D.jsxs)(`span`,{className:`claude-info-value`,children:[e.sessionId.slice(0,8),`…`]})]})]})]})})}function Se(e){let{show:t,onClose:n,claudeInfo:r,messages:i,sessionElapsed:a,sessionId:o,cacheKey:s}=e,[c,l]=(0,E.useState)(null);if(!t)return null;let u=i.flatMap(e=>e.events?.filter(e=>e.type===`usage`)??[]),d=u.at(-1),f=d?.peak_request_pct==null?d?.context_window?Math.round((d.input_tokens+d.cache_creation_tokens+d.cache_read_tokens)/d.context_window*100):0:Math.round(d.peak_request_pct*100),p=u.reduce((e,t)=>e+t.input_tokens+t.cache_creation_tokens+t.cache_read_tokens+t.output_tokens,0),m=i.flatMap(e=>e.events?.filter(e=>e.type===`rate_limit`)??[]).at(-1),h=u.reduce((e,t)=>e+(t.total_cost_usd??0),0),g=r?.account?.subscriptionType,_=e=>{let t=e*1e3-Date.now();if(t<=0)return`now`;let n=Math.floor(t/36e5),r=Math.floor(t%36e5/6e4);return n>0?`${n}h ${r}m`:`${r}m`};return(0,D.jsx)(`div`,{className:`claude-info-overlay`,onClick:n,children:(0,D.jsxs)(`div`,{className:`claude-info-modal`,onClick:e=>e.stopPropagation(),children:[(0,D.jsxs)(`div`,{className:`claude-info-header`,children:[(0,D.jsx)(`img`,{src:`/brand/claude.png`,alt:`Claude`,className:`claude-info-icon`}),(0,D.jsx)(`span`,{children:`Claude Code`}),(0,D.jsx)(`button`,{className:`claude-info-close`,onClick:n,"aria-label":`Close`,children:`✕`})]}),(0,D.jsxs)(`div`,{className:`claude-info-section`,children:[(0,D.jsxs)(`div`,{className:`claude-info-row`,children:[(0,D.jsx)(`span`,{className:`claude-info-label`,children:`Version`}),(0,D.jsx)(`span`,{className:`claude-info-value`,children:r?r.version:`…`})]}),(0,D.jsxs)(`div`,{className:`claude-info-row`,children:[(0,D.jsx)(`span`,{className:`claude-info-label`,children:`Email`}),(0,D.jsx)(`span`,{className:`claude-info-value`,children:r?.account?.email??`…`})]})]}),(g||m||h>0)&&(0,D.jsxs)(`div`,{className:`claude-info-section`,children:[g&&(0,D.jsxs)(`div`,{className:`claude-info-row`,children:[(0,D.jsx)(`span`,{className:`claude-info-label`,children:`Plan`}),(0,D.jsx)(`span`,{className:`claude-info-value`,style:{textTransform:`capitalize`},children:g})]}),m&&(0,D.jsxs)(D.Fragment,{children:[(0,D.jsxs)(`div`,{className:`claude-info-row`,children:[(0,D.jsx)(`span`,{className:`claude-info-label`,children:`Usage`}),(0,D.jsxs)(`span`,{className:`claude-info-value`,children:[Math.round(m.utilization*100),`%`]})]}),(0,D.jsxs)(`div`,{className:`claude-info-row`,children:[(0,D.jsx)(`span`,{className:`claude-info-label`,children:`Resets in`}),(0,D.jsx)(`span`,{className:`claude-info-value`,children:_(m.resetsAt)})]}),m.isUsingOverage&&(0,D.jsxs)(`div`,{className:`claude-info-row`,children:[(0,D.jsx)(`span`,{className:`claude-info-label`,children:`Overage`}),(0,D.jsx)(`span`,{className:`claude-info-value`,children:`Active`})]})]}),h>0&&(0,D.jsxs)(`div`,{className:`claude-info-row`,children:[(0,D.jsx)(`span`,{className:`claude-info-label`,children:`Session cost`}),(0,D.jsxs)(`span`,{className:`claude-info-value`,children:[`$`,h<.01?h.toFixed(4):h.toFixed(2)]})]})]}),(0,D.jsxs)(`div`,{className:`claude-info-section`,children:[(0,D.jsxs)(`div`,{className:`claude-info-row`,children:[(0,D.jsx)(`span`,{className:`claude-info-label`,children:`Model`}),(0,D.jsx)(`span`,{className:`claude-info-value`,children:r?.model??`…`})]}),(0,D.jsxs)(`div`,{className:`claude-info-row`,children:[(0,D.jsx)(`span`,{className:`claude-info-label`,children:`Context used`}),(0,D.jsx)(`span`,{className:`claude-info-value`,children:f>0?`${f}%`:`—`})]}),(0,D.jsxs)(`div`,{className:`claude-info-row`,children:[(0,D.jsx)(`span`,{className:`claude-info-label`,children:`Tokens`}),(0,D.jsx)(`span`,{className:`claude-info-value`,children:p>0?G(p):`—`})]}),(0,D.jsxs)(`div`,{className:`claude-info-row`,children:[(0,D.jsx)(`span`,{className:`claude-info-label`,children:`Session`}),(0,D.jsx)(`span`,{className:`claude-info-value`,children:W(a)})]}),(o||s)&&(()=>{let e=o??s??``;return(0,D.jsxs)(`div`,{className:`claude-info-row`,children:[(0,D.jsx)(`span`,{className:`claude-info-label`,children:`Session`}),(0,D.jsx)(`button`,{type:`button`,className:`claude-info-value claude-info-id-copy`,title:`${e} (${o?`flushed`:`pre-flush`}) — click to copy`,onClick:async()=>{l(await ye(e)?`copied`:`failed`),setTimeout(()=>l(null),1200)},children:c===`copied`?`copied ✓`:c===`failed`?`copy failed ✕`:`${e.slice(0,8)}…`})]})})()]})]})})}var Ce=`https://claude.ai/code`,we=200,Te=[500,1e3,1500,2e3,2500,3e3,3e3];function Ee(e,t,n){if(e&&n.target)return{kind:`navigate`,url:n.target};let r=n.slug??n.bridgeSessionId??null;if(e&&r)return{kind:`navigate`,url:`${Ce}/${r}`};let i=n.reason||n.error||`status ${t}`;return{kind:`error`,sessionId:n.sessionId??null,reason:i}}function De(e){if(!e)return``;let t=Date.parse(e);return Number.isFinite(t)?new Date(t).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`}):``}function Oe(e){let{businessName:t,cacheKey:n,role:r,userName:c,userAvatar:d,onSelectProjects:h,onSelectPeople:ee,onSelectTasks:b,onSelectAgents:oe,onCloseMobileDrawer:O,collapsed:k,selectedWhatsappId:se,onSelectWhatsappConversation:ce,initialWhatsappSurface:A=!1}=e,j=s(n),le=(0,E.useCallback)(e=>({key:`reseat`,label:`Re-seat session ${e.title} (model, mode, effort)`,menuLabel:`Re-seat`,title:`Re-seat — move this session onto a chosen model, mode, and effort`,icon:(0,D.jsx)(ie,{size:12}),panelClassName:`reseat-panel`,panel:()=>(0,D.jsx)(_e,{row:e,adminFetch:j,onError:e=>U({message:e,failed:!0})})}),[j]),ue=g.productName,M=typeof c==`string`?c:c===null?`name unavailable`:t||ue,de=(M.trim().charAt(0)||`?`).toUpperCase(),[N,P]=(0,E.useState)(A?`whatsapp`:`sessions`),[F,pe]=(0,E.useState)([]),[I,L]=(0,E.useState)(!1),[R,me]=(0,E.useState)(null),[z,B]=(0,E.useState)(!1),[V,he]=(0,E.useState)(`file`),[H,U]=(0,E.useState)(null),[ge,W]=(0,E.useState)(null),[G,ye]=(0,E.useState)([]),[K,Se]=(0,E.useState)(!1),[Ce,Oe]=(0,E.useState)(null),[ke,q]=(0,E.useState)(!1),[J,Ne]=(0,E.useState)(!1),[Y,Pe]=(0,E.useState)(!1),[Fe,Ie]=(0,E.useState)(null),[Le,Re]=(0,E.useState)(new Set),[ze,Be]=(0,E.useState)(null),[Ve,He]=(0,E.useState)(new Set),[Ue,We]=(0,E.useState)(new Set),[Ge,Ke]=(0,E.useState)(new Set),[qe,Je]=(0,E.useState)(null),[Ye,X]=(0,E.useState)(``),[Xe,Ze]=(0,E.useState)(!1),[Z,Qe]=(0,E.useState)(!1),$e=(0,E.useRef)(null),et=(0,E.useRef)(0),[tt,nt]=(0,E.useState)(0);(0,E.useEffect)(()=>{let e=$e.current;if(!e||typeof ResizeObserver>`u`)return;let t=new ResizeObserver(e=>{let t=e[0]?.contentRect.width??0;nt(e=>Math.abs(e-t)<1?e:t)});return t.observe(e),()=>t.disconnect()},[N]);let rt=tt>0&&tt<400,[it,at]=(0,E.useState)([]),[ot,st]=(0,E.useState)(!1),[ct,lt]=(0,E.useState)(null),[ut,dt]=(0,E.useState)(`whatsapp`),ft=(0,E.useCallback)(e=>{if(O(),!n){console.error(`[admin-ui] artefact-download-blocked id=${e.id} reason=no-cache-key`),U({message:`Session not ready — try again`,failed:!0});return}if(!e.downloadPath){console.error(`[admin-ui] artefact-download-blocked id=${e.id} reason=not-downloadable`),U({message:`${e.name} can’t be downloaded`,failed:!0});return}console.info(`[admin-ui] artefact-download id=${e.id} root=${e.downloadRoot??`data`} path=${e.downloadPath}`),l(n,e.downloadPath,e.downloadRoot??`data`),U({message:`Downloading ${e.name}`,failed:!1})},[n,O]);(0,E.useEffect)(()=>{if(!H)return;let e=setTimeout(()=>U(null),2500);return()=>clearTimeout(e)},[H]);let pt=(0,E.useCallback)(async()=>{if(n){B(!0),me(null);try{let e=await j(`/api/admin/sidebar-artefacts`);if(!e.ok)throw Error(`status ${e.status}`);pe((await e.json()).artefacts??[]),L(!0)}catch(e){let t=e instanceof Error?e.message:String(e);me(`Failed to load artefacts: ${t}`),console.error(`[admin-ui] sidebar-artefacts fetch failed: ${t}`)}finally{B(!1)}}},[n,j]),Q=(0,E.useCallback)(async()=>{if(!n)return null;let e=++et.current;q(!0),Oe(null);try{let t=await j(`/api/admin/sidebar-sessions`);if(!t.ok)throw Error(`status ${t.status}`);let n=await t.json(),r=n.sessions??[];return e===et.current?(ye(r),Ie(n.accountId??null),Se(!0),r):(console.info(`[admin-ui] sidebar-sessions-stale-response-dropped token=${e}`),r)}catch(t){let n=t instanceof Error?t.message:String(t);return e===et.current&&Oe(`Failed to load sessions: ${n}`),console.error(`[admin-ui] sidebar-sessions fetch failed: ${n}`),null}finally{e===et.current&&q(!1)}},[n,j]),mt=(0,E.useCallback)(async()=>{if(n){lt(null);try{let e=await j(`/api/whatsapp-reader/conversations`);if(!e.ok)throw Error(`status ${e.status}`);at((await e.json()).conversations??[]),st(!0)}catch(e){let t=e instanceof Error?e.message:String(e);lt(`Couldn't load conversations.`),console.error(`[admin-ui] channel-convos fetch failed: ${t}`)}}},[n,j]);(0,E.useEffect)(()=>{!n||K||Q()},[n,K,Q]),(0,E.useEffect)(()=>{if(!n)return;let e=null;return mt(),e=setInterval(()=>{mt()},Ae),()=>{e!==null&&clearInterval(e)}},[n,mt]),(0,E.useEffect)(()=>{if(!n)return;let e=null;function t(){console.info(`[admin-ui] sidebar-refresh surface=sessions trigger=poll`),Q()}function r(){e===null&&(e=setInterval(t,je))}function i(){e!==null&&(clearInterval(e),e=null)}function a(){document.hidden?i():(t(),r())}return document.hidden||r(),document.addEventListener(`visibilitychange`,a),()=>{i(),document.removeEventListener(`visibilitychange`,a)}},[n,Q]);let ht=(0,E.useMemo)(()=>{let e=new Map;for(let t of ve)e.set(t,[]);for(let t of it)e.get(t.channel)?.push(t);for(let t of ve)console.info(`[admin-ui] sidebar-nav surface=${t} count=${e.get(t).length}`);return e},[it]),gt={whatsapp:`WhatsApp`,telegram:`Telegram`,webchat:`Webchat`},_t=()=>{ce(null),P(`artefacts`),console.info(`[admin-ui] sidebar-nav surface=artefacts count=${I?F.length:0} collapsed=${k}`),pt()},$=1.5,vt=()=>{console.info(`[admin-ui] sidebar-refresh surface=artefacts`),pt()},yt=()=>{ce(null),P(`sessions`),console.info(`[admin-ui] sidebar-nav surface=sessions count=${K?G.length:0} collapsed=${k}`),K||Q()},bt=()=>{console.info(`[admin-ui] sidebar-refresh surface=sessions trigger=manual`),Q()},xt=e=>{P(`whatsapp`),dt(e),console.info(`[admin-ui] sidebar-nav surface=${e} count=${ht.get(e)?.length??0} collapsed=${k}`)},St=(0,E.useCallback)(async e=>{if(Ve.has(e.sessionId))return;He(t=>{let n=new Set(t);return n.add(e.sessionId),n});let t=window.open(``,`_blank`);try{let n=await j(`/api/admin/session-rc-spawn`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({sessionId:e.sessionId,name:e.title||e.sessionId})}),r=await n.json().catch(()=>({})),i=Ee(n.ok,n.status,{...r,sessionId:r.sessionId??e.sessionId});console.info(`[admin-ui] sidebar-session-resume sessionId=${e.sessionId} status=${n.status} outcome=${i.kind} slug=${r.slug??r.bridgeSessionId??`none`}`),i.kind===`navigate`?(O(),t?t.location.href=i.url:window.open(i.url,`_blank`)):(t?.close(),console.error(`[admin-ui] sidebar-session-resume-failed sessionId=${e.sessionId} status=${n.status} reason=${i.reason}`),W(i))}catch(n){t?.close();let r=n instanceof Error?n.message:String(n);console.error(`[admin-ui] sidebar-session-resume-failed sessionId=${e.sessionId} error=${r}`),W({sessionId:e.sessionId,reason:r})}finally{He(t=>{let n=new Set(t);return n.delete(e.sessionId),n})}},[j,O,Ve]),Ct=(0,E.useCallback)(async e=>{let t=e.slice(0,8);for(let n=1;n<=Te.length;n++){await new Promise(e=>setTimeout(e,Te[n-1]));let r=await Q();if(r&&r.some(t=>t.sessionId===e)){console.info(`[admin-ui] sidebar-new-session-converged sessionId=${t} via=retry attempts=${n}`);return}}console.error(`[admin-ui] sidebar-new-session-converge-timeout sessionId=${t}`)},[Q]),wt=(0,E.useCallback)(async()=>{if(Z)return;Qe(!0);let e=window.open(``,`_blank`);try{let t=await j(`/api/admin/session-rc-spawn`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({})}),n=await t.json().catch(()=>({})),r=Ee(t.ok,t.status,n);console.info(`[admin-ui] sidebar-new-session-spawned status=${t.status} outcome=${r.kind} slug=${n.slug??n.bridgeSessionId??`none`}`),r.kind===`navigate`?(e?e.location.href=r.url:window.open(r.url,`_blank`),n.sessionId?Ct(n.sessionId):console.error(`[admin-ui] sidebar-new-session-converge-skipped reason=no-session-id`)):(e?.close(),console.error(`[admin-ui] sidebar-new-session-failed status=${t.status} reason=${r.reason}`),W(r))}catch(t){e?.close();let n=t instanceof Error?t.message:String(t);console.error(`[admin-ui] sidebar-new-session-failed error=${n}`),W({sessionId:null,reason:n})}finally{Qe(!1)}},[j,Z,Ct]),Tt=(0,E.useCallback)((e,t)=>{e.stopPropagation(),Be(t)},[]),Et=(0,E.useCallback)(async e=>{if(!Le.has(e.sessionId)){Re(t=>{let n=new Set(t);return n.add(e.sessionId),n});try{let t=await j(`/api/admin/session-delete`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({sessionId:e.sessionId})});if(!t.ok){let n=await t.json().catch(()=>({}));console.error(`[admin-ui] sidebar-session-delete-failed sessionId=${e.sessionId} status=${t.status} error=${n.error??`unknown`}`),U({message:`Delete failed: ${n.error??`status ${t.status}`}`,failed:!0});return}let n=await t.json();console.info(`[admin-ui] sidebar-session-delete sessionId=${e.sessionId} live=${e.live} confirmed=true pidKilled=${n.pidKilled??`?`} deleted=${n.deleted??`?`}`),ye(t=>t.filter(t=>t.sessionId!==e.sessionId)),Q()}catch(t){let n=t instanceof Error?t.message:String(t);console.error(`[admin-ui] sidebar-session-delete-failed sessionId=${e.sessionId} error=${n}`),U({message:`Delete failed: ${n}`,failed:!0})}finally{Re(t=>{let n=new Set(t);return n.delete(e.sessionId),n})}}},[j,Le,Q]),Dt=(0,E.useCallback)(async(e,t)=>{if(e.stopPropagation(),!Ue.has(t.sessionId)){We(e=>{let n=new Set(e);return n.add(t.sessionId),n});try{let e=await j(`/api/admin/session-stop`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({sessionId:t.sessionId})});if(!e.ok){let n=await e.json().catch(()=>({}));console.error(`[admin-ui] sidebar-session-stop-failed sessionId=${t.sessionId} status=${e.status} error=${n.error??`unknown`}`),U({message:`Stop failed: ${n.error??`status ${e.status}`}`,failed:!0});return}console.info(`[admin-ui] sidebar-session-stop sessionId=${t.sessionId}`),Q()}catch(e){let n=e instanceof Error?e.message:String(e);console.error(`[admin-ui] sidebar-session-stop-failed sessionId=${t.sessionId} error=${n}`),U({message:`Stop failed: ${n}`,failed:!0})}finally{We(e=>{let n=new Set(e);return n.delete(t.sessionId),n})}}},[j,Ue,Q]),Ot=(0,E.useCallback)(async(e,t,n)=>{if(e.stopPropagation(),!Ge.has(t.sessionId)){Ke(e=>{let n=new Set(e);return n.add(t.sessionId),n});try{let e=await j(`/api/admin/session-archive`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({sessionId:t.sessionId,mode:n})});if(!e.ok){let r=await e.json().catch(()=>({})),i=r.detail??r.error??`status ${e.status}`;console.error(`[admin-ui] sidebar-session-archive-failed sessionId=${t.sessionId} mode=${n} status=${e.status} error=${r.error??`unknown`}`),U({message:`${n===`archive`?`Archive`:`Unarchive`} failed: ${i}`,failed:!0});return}console.info(`[admin-ui] sidebar-session-archive sessionId=${t.sessionId} mode=${n}`),Q()}catch(e){let r=e instanceof Error?e.message:String(e);console.error(`[admin-ui] sidebar-session-archive-failed sessionId=${t.sessionId} mode=${n} error=${r}`),U({message:`${n===`archive`?`Archive`:`Unarchive`} failed: ${r}`,failed:!0})}finally{Ke(e=>{let n=new Set(e);return n.delete(t.sessionId),n})}}},[j,Ge,Q]),kt=(0,E.useCallback)(async e=>{let t=Ye.trim();if(!t){U({message:`Title can’t be empty`,failed:!0});return}if(t.length>we){U({message:`Title too long (max ${we})`,failed:!0});return}Ze(!0);try{let n=await j(`/api/admin/session-rename`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({sessionId:e.sessionId,title:t})});if(!n.ok){let t=await n.json().catch(()=>({})),r=t.reason??t.error??`status ${n.status}`;console.error(`[admin-ui] sidebar-session-rename sessionId=${e.sessionId.slice(0,8)} outcome=rejected reason=${r}`),U({message:`Rename failed: ${r}`,failed:!0});return}console.info(`[admin-ui] sidebar-session-rename sessionId=${e.sessionId.slice(0,8)} outcome=ok`),Je(null),X(``),Q()}catch(t){let n=t instanceof Error?t.message:String(t);console.error(`[admin-ui] sidebar-session-rename sessionId=${e.sessionId.slice(0,8)} outcome=rejected reason=${n}`),U({message:`Rename failed: ${n}`,failed:!0})}finally{Ze(!1)}},[j,Ye,Q]);return(0,D.jsxs)(`aside`,{className:`side`,children:[(0,D.jsx)(`div`,{className:`side-new-session-row`,children:(0,D.jsxs)(`button`,{type:`button`,className:`side-new-session`,onClick:wt,disabled:Z,"aria-busy":Z,children:[(0,D.jsx)(w,{size:14}),(0,D.jsx)(`span`,{children:Z?`Spawning…`:`New session`})]})}),(0,D.jsxs)(`nav`,{className:`side-nav`,children:[(0,D.jsxs)(`button`,{type:`button`,className:`nav-row`,onClick:()=>{console.info(`[admin-ui] sidebar-nav surface=people`),ee(),O()},children:[(0,D.jsx)(T,{size:20,strokeWidth:$}),(0,D.jsx)(`span`,{className:`label`,children:`People`}),(0,D.jsx)(`span`,{className:`kbd`})]}),(0,D.jsxs)(`button`,{type:`button`,className:`nav-row`,onClick:()=>{console.info(`[admin-ui] sidebar-nav surface=agents`),oe(),O()},children:[(0,D.jsx)(y,{size:20,strokeWidth:$}),(0,D.jsx)(`span`,{className:`label`,children:`Agents`}),(0,D.jsx)(`span`,{className:`kbd`})]}),(0,D.jsxs)(`button`,{type:`button`,className:`nav-row`,onClick:()=>{console.info(`[admin-ui] sidebar-nav surface=projects`),h(),O()},children:[(0,D.jsx)(ne,{size:20,strokeWidth:$}),(0,D.jsx)(`span`,{className:`label`,children:`Projects`}),(0,D.jsx)(`span`,{className:`kbd`})]}),(0,D.jsxs)(`button`,{type:`button`,className:`nav-row`,onClick:()=>{console.info(`[admin-ui] sidebar-nav surface=tasks`),b(),O()},children:[(0,D.jsx)(S,{size:20,strokeWidth:$}),(0,D.jsx)(`span`,{className:`label`,children:`Tasks`}),(0,D.jsx)(`span`,{className:`kbd`})]}),(0,D.jsxs)(`button`,{type:`button`,className:`nav-row${N===`artefacts`?` active`:``}`,onClick:_t,children:[(0,D.jsx)(x,{size:20,strokeWidth:$}),(0,D.jsx)(`span`,{className:`label`,children:`Artefacts`}),(0,D.jsx)(`span`,{className:`kbd`})]}),(0,D.jsxs)(`button`,{type:`button`,className:`nav-row${N===`sessions`?` active`:``}`,onClick:yt,children:[(0,D.jsx)(re,{size:20,strokeWidth:$}),(0,D.jsx)(`span`,{className:`label`,children:`Sessions`}),(0,D.jsx)(`span`,{className:`kbd`})]}),ot&&ve.filter(e=>ht.get(e).length>0).map(e=>(0,D.jsxs)(`button`,{type:`button`,className:`nav-row${N===`whatsapp`&&ut===e?` active`:``}`,onClick:()=>xt(e),children:[(0,D.jsx)(m,{channel:e,size:16}),(0,D.jsx)(`span`,{className:`label`,children:gt[e]}),(0,D.jsx)(`span`,{className:`kbd`})]},e)),ct&&(0,D.jsx)(`div`,{className:`nav-row`,style:{color:`var(--text-tertiary)`,cursor:`default`},"aria-disabled":`true`,children:(0,D.jsx)(`span`,{className:`label`,children:ct})})]}),N===`artefacts`&&(0,D.jsxs)(`div`,{className:`side-list`,children:[(0,D.jsxs)(`div`,{className:`group-head`,children:[(0,D.jsx)(`span`,{children:`Artefacts`}),(0,D.jsxs)(`span`,{className:`group-head-meta`,children:[(0,D.jsx)(`button`,{type:`button`,className:`group-head-refresh`,title:`Refresh artefacts`,"aria-label":`Refresh artefacts`,onClick:vt,disabled:z,children:(0,D.jsx)(_,{size:12,className:z?`spinning`:void 0})}),(0,D.jsx)(`span`,{children:z?`…`:String(F.length)})]})]}),R&&(0,D.jsx)(`div`,{className:`conv`,style:{color:`var(--text-tertiary)`,cursor:`default`},children:R}),I&&!R&&F.length>0&&(()=>{let e=F.filter(e=>e.kind===`agent-template`).length,t=F.length-e;return(0,D.jsx)(`div`,{className:`artefact-filter-chips`,children:[{key:`all`,label:`All`,count:F.length},{key:`agent`,label:`Agents`,count:e},{key:`file`,label:`Files`,count:t}].map(e=>(0,D.jsxs)(`button`,{type:`button`,className:`artefact-filter-chip${V===e.key?` active`:``}`,onClick:()=>he(e.key),disabled:e.count===0&&e.key!==`all`,children:[e.label,(0,D.jsx)(`span`,{className:`artefact-filter-chip-count`,children:e.count})]},e.key))})})(),I&&!R&&F.length===0&&(0,D.jsx)(`div`,{className:`conv`,style:{color:`var(--text-tertiary)`,cursor:`default`},children:`No artefacts yet`}),F.filter(e=>V===`all`?!0:V===`agent`?e.kind===`agent-template`:e.kind!==`agent-template`).map(e=>{let t=e.kind===`agent-template`,n=t?y:x,r=De(e.updatedAt),i=e.downloadPath!==null;return(0,D.jsxs)(`button`,{type:`button`,className:`conv`,onClick:()=>ft(e),disabled:!i,style:i?void 0:{cursor:`default`},title:i?`Download ${e.name}`:`${e.name} can’t be downloaded`,children:[(0,D.jsx)(n,{size:14,className:`conv-icon`,"data-kind":t?`agent`:`file`,"aria-label":t?`agent template`:`file`}),(0,D.jsxs)(`span`,{className:`conv-stack`,children:[(0,D.jsx)(`span`,{className:`conv-name-line`,children:(0,D.jsx)(`span`,{className:`conv-name`,children:e.name})}),r&&(0,D.jsx)(`span`,{className:`conv-timestamp`,children:r})]}),i&&(0,D.jsx)(f,{size:12,className:`conv-rc-icon`,"aria-hidden":`true`})]},e.id)})]}),N===`sessions`&&(()=>{let e=G.filter(e=>J?!0:!e.isSubagent).filter(e=>Y?!0:!e.archived),t=G.some(e=>e.isSubagent),n=G.some(e=>e.archived);return(0,D.jsxs)(`div`,{className:`side-list`,ref:$e,children:[(0,D.jsxs)(`div`,{className:`group-head`,children:[(0,D.jsx)(`span`,{children:`Sessions`}),(0,D.jsxs)(`span`,{className:`group-head-meta`,children:[(0,D.jsx)(`button`,{type:`button`,className:`group-head-refresh`,title:`Refresh sessions`,"aria-label":`Refresh sessions`,onClick:bt,disabled:ke,children:(0,D.jsx)(_,{size:12,className:ke?`spinning`:void 0})}),(0,D.jsx)(`span`,{children:ke?`…`:String(e.length)})]})]}),Fe&&(0,D.jsx)(`div`,{className:`side-account-id`,title:`This install's accountId. The first 8 characters match the truncated UUID label on the live Remote Control daemon entry in claude.ai/code.`,children:(0,D.jsx)(`code`,{children:Fe})}),(t||n)&&(0,D.jsxs)(`div`,{className:`artefact-filter-chips`,children:[t&&(0,D.jsx)(`button`,{type:`button`,className:`artefact-filter-chip${J?` active`:``}`,"aria-pressed":J,onClick:()=>Ne(e=>!e),title:J?`Hide subagent sessions`:`Show subagent sessions`,children:`Subagents`}),n&&(0,D.jsx)(`button`,{type:`button`,className:`artefact-filter-chip${Y?` active`:``}`,"aria-pressed":Y,onClick:()=>Pe(e=>!e),title:Y?`Hide archived sessions`:`Show archived sessions`,children:`Archived`})]}),Ce&&(0,D.jsx)(`div`,{className:`conv`,style:{color:`var(--text-tertiary)`,cursor:`default`},children:Ce}),K&&!Ce&&e.length===0&&(0,D.jsx)(`div`,{className:`conv`,style:{color:`var(--text-tertiary)`,cursor:`default`},children:`No sessions yet`}),e.map(e=>{let t=De(e.startedAt),n=Ve.has(e.sessionId),r=Le.has(e.sessionId),s=Ue.has(e.sessionId),c=Ge.has(e.sessionId),l=n||r||s||c,u=[{key:`open`,label:`Resume session ${e.title} in claude.ai/code`,menuLabel:`Resume in claude.ai/code`,title:`Resume in a fresh local Remote Control PTY`,icon:(0,D.jsx)(i,{size:12}),busy:n,onClick:()=>{St(e)}},{key:`message`,label:`Open session ${e.title} in admin webchat`,menuLabel:`Open in webchat`,title:`Open in admin webchat (/chat) — sending resumes this session`,icon:(0,D.jsx)(C,{size:12}),onClick:()=>{window.location.assign(`/chat?session=${e.sessionId}`)}},...e.live?[{key:`stop`,label:`Stop session ${e.title}`,menuLabel:`Stop`,title:`Stop session process (keeps the conversation, can resume later)`,icon:(0,D.jsx)(ae,{size:12}),busy:s,onClick:t=>{Dt(t,e)}}]:[],e.archived?{key:`unarchive`,label:`Unarchive session ${e.title}`,menuLabel:`Unarchive`,title:`Unarchive (move back to the active list)`,icon:(0,D.jsx)(te,{size:12}),busy:c,onClick:t=>{Ot(t,e,`unarchive`)}}:{key:`archive`,label:`Archive session ${e.title}`,menuLabel:`Archive`,title:`Archive (hide from the list, keeps the conversation resumable)`,icon:(0,D.jsx)(v,{size:12}),busy:c,onClick:t=>{Ot(t,e,`archive`)}},{key:`rename`,label:`Rename session ${e.title}`,menuLabel:`Rename`,title:`Rename this session`,icon:(0,D.jsx)(o,{size:12}),busy:Xe&&qe===e.sessionId,onClick:t=>{t.stopPropagation(),Je(e.sessionId),X(e.personName??e.title)}},{key:`delete`,label:`Delete session ${e.title}`,menuLabel:`Delete`,title:`Delete session (stops the process, removes the conversation)`,icon:(0,D.jsx)(a,{size:12}),danger:!0,busy:r,onClick:t=>{Tt(t,e)}},le({sessionId:e.sessionId,model:e.model??null,title:e.personName??e.title})];return(0,D.jsxs)(`div`,{className:`conv conv-with-actions`,children:[(0,D.jsxs)(`div`,{className:`conv-main-static`,children:[(0,D.jsx)(`span`,{className:`conv-live-dot`,"data-live":e.live?`1`:`0`,"aria-label":e.live?`live session`:`ended session`}),(0,D.jsxs)(`span`,{className:`conv-stack`,children:[(0,D.jsxs)(`span`,{className:`conv-name-line`,children:[e.channel&&(0,D.jsx)(p,{channel:e.channel,size:13}),qe===e.sessionId?(0,D.jsx)(`input`,{className:`conv-name conv-name-edit`,autoFocus:!0,value:Ye,disabled:Xe,"aria-label":`New title for session ${e.title}`,onChange:e=>X(e.target.value),onClick:e=>e.stopPropagation(),onKeyDown:t=>{t.key===`Enter`?(t.preventDefault(),kt(e)):t.key===`Escape`&&(t.preventDefault(),Je(null),X(``))},onBlur:()=>{qe===e.sessionId&&!Xe&&(Je(null),X(``))}}):(0,D.jsx)(`span`,{className:`conv-name`,title:e.personName??e.title,children:e.personName??e.title})]}),(0,D.jsxs)(`span`,{className:`conv-timestamp`,children:[(0,D.jsx)(`code`,{className:`conv-session-id`,title:`First 8 characters of this session's id — distinguishes rows with identical auto-titles. The resume/delete buttons act on the full id.`,children:e.sessionId.slice(0,8)}),t&&(0,D.jsxs)(`span`,{children:[` · `,t]})]})]})]}),(0,D.jsx)(fe,{actions:u,disabled:l,collapsed:rt})]},e.sessionId)})]})})(),N===`whatsapp`&&(0,D.jsxs)(`div`,{className:`side-list`,children:[(0,D.jsxs)(`div`,{className:`group-head`,children:[(0,D.jsx)(`span`,{children:gt[ut]}),(0,D.jsxs)(`span`,{className:`group-head-meta`,children:[(0,D.jsx)(`button`,{type:`button`,className:`group-head-refresh`,title:`Refresh conversations`,"aria-label":`Refresh conversations`,onClick:()=>{mt()},children:(0,D.jsx)(_,{size:12})}),(0,D.jsx)(`span`,{children:String(ht.get(ut).length)})]})]}),ht.get(ut).map(e=>{let t=De(e.lastMessageAt);return(0,D.jsxs)(`div`,{className:`conv conv-with-actions${se===e.sessionId?` active`:``}`,children:[(0,D.jsxs)(`button`,{type:`button`,className:`conv-main-static conv-main-btn`,onClick:()=>{ce(e),O()},title:e.title,children:[(0,D.jsx)(m,{channel:e.channel,size:14}),(0,D.jsxs)(`span`,{className:`conv-stack`,children:[(0,D.jsxs)(`span`,{className:`conv-name-line`,children:[(0,D.jsx)(`span`,{className:`conv-name`,children:u(e)}),e.role===`public`&&(0,D.jsx)(`span`,{className:`conv-tag conv-tag-public`,children:`Public`})]}),t&&(0,D.jsx)(`span`,{className:`conv-timestamp`,children:t})]})]}),(0,D.jsx)(fe,{actions:[le({sessionId:e.sessionId,model:e.model,title:e.title})],disabled:!1,collapsed:rt})]},e.sessionId)})]}),(0,D.jsx)(Me,{}),(0,D.jsxs)(`div`,{className:`side-foot`,children:[(0,D.jsx)(`div`,{className:`avatar`,children:d?(0,D.jsx)(`img`,{src:d,alt:M}):de}),(0,D.jsxs)(`div`,{className:`who`,children:[(0,D.jsx)(`span`,{className:`name`,children:M}),(0,D.jsx)(`span`,{className:`role`,children:r??`operator`})]})]}),H&&(0,D.jsx)(`div`,{className:`copy-toast${H.failed?` copy-toast-failed`:``}`,role:`status`,children:H.message}),(0,D.jsx)(xe,{error:ge,onClose:()=>W(null)}),(0,D.jsx)(be,{target:ze,onCancel:()=>Be(null),onConfirm:()=>{let e=ze;Be(null),e&&Et(e)}})]})}var ke=5e3,Ae=3e4,je=3e4;function Me(){let[e,t]=(0,E.useState)(null);if((0,E.useEffect)(()=>{let e=!1,n=null;async function r(){try{let n=await fetch(`/api/admin/system-stats`);if(!n.ok){console.error(`[admin-ui] system-stats-fetch-failed status=${n.status}`);return}let r=await n.json();e||t(r)}catch(e){console.error(`[admin-ui] system-stats-fetch-failed reason=${e instanceof Error?e.message:String(e)}`)}}function i(){n===null&&(r(),n=setInterval(()=>{r()},ke))}function a(){n!==null&&(clearInterval(n),n=null)}function o(){document.hidden?a():i()}return document.hidden||i(),document.addEventListener(`visibilitychange`,o),()=>{e=!0,a(),document.removeEventListener(`visibilitychange`,o)}},[]),!e||e.platform===`darwin`)return null;let n=e.cpuPct,r=e.memUsedPct,i=n!==null&&n>=.9,a=n!==null&&n>=.98,o=r!==null&&r>=.9,s=r!==null&&r>=.98,c=i||o,l=a||s,u=e=>e===null?`—`:`${Math.round(e*100)}%`,d=e=>{if(e===null)return{width:`0%`,background:`var(--text-tertiary)`};let t=Math.min(1,Math.max(0,e)),n=Math.round(140*(1-t));return{width:`${Math.round(t*100)}%`,background:`hsl(${n}, 65%, 45%)`}},f=[`system-stats`];return c&&f.push(`system-stats--warn`),l&&f.push(`system-stats--crit`),(0,D.jsxs)(`div`,{className:f.join(` `),role:`status`,"aria-label":`host CPU and RAM`,children:[(0,D.jsxs)(`div`,{className:`system-stats__metric`,children:[(0,D.jsxs)(`span`,{className:i?`system-stats__fig system-stats__fig--warn`:`system-stats__fig`,children:[`CPU `,u(n)]}),(0,D.jsx)(`div`,{className:`system-stats__bar`,children:(0,D.jsx)(`div`,{className:`system-stats__bar-fill`,style:d(n)})})]}),(0,D.jsxs)(`div`,{className:`system-stats__metric`,children:[(0,D.jsxs)(`span`,{className:o?`system-stats__fig system-stats__fig--warn`:`system-stats__fig`,children:[`RAM `,u(r)]}),(0,D.jsx)(`div`,{className:`system-stats__bar`,children:(0,D.jsx)(`div`,{className:`system-stats__bar-fill`,style:d(r)})})]})]})}var q=`admin-sidebar-collapsed`,J=`admin-sidebar-drawer-open`;function Ne(){if(typeof window>`u`)return!1;try{return window.sessionStorage.getItem(q)===`1`}catch{return!1}}function Y(e){if(!(typeof window>`u`))try{e?window.sessionStorage.setItem(q,`1`):window.sessionStorage.removeItem(q)}catch{}}function Pe(){if(typeof window>`u`)return!1;try{return window.sessionStorage.getItem(J)===`1`}catch{return!1}}function Fe(e){if(!(typeof window>`u`))try{e?window.sessionStorage.setItem(J,`1`):window.sessionStorage.removeItem(J)}catch{}}var Ie=720;function Le(e,t){return e===`/`?{via:`in-place`}:{via:`navigate`,href:`/?wa=${encodeURIComponent(t.sessionId)}&projectDir=${encodeURIComponent(t.projectDir)}`}}function Re(e,t){if(e!==`/`)return null;let n=new URLSearchParams(t),r=n.get(`wa`),i=n.get(`projectDir`);return!r||!i?null:{sessionId:r,projectDir:i,title:``,senderId:null,startedAt:``,channel:`whatsapp`,role:`admin`,operatorName:null,whatsappName:null,lastMessageAt:null,modelGated:!1}}function ze(e,t){return t===`operator`&&e===`chat`||e===`dashboard`?`/`:e===`data`?`/data`:e===`graph`?`/graph`:e===`chat`?`/chat`:`/browser`}function Be(e){let{cacheKey:t,businessName:n,variant:r=`admin`,onLogout:i,onDisconnect:a,disconnecting:o,userName:s,userAvatar:c,role:l,children:u,footer:f}=e,[p,m]=(0,E.useState)(()=>Ne()),[g,_]=(0,E.useState)(()=>Pe()),[ee,te]=(0,E.useState)(()=>typeof window<`u`&&window.matchMedia(`(max-width: ${Ie}px)`).matches),[v,y]=(0,E.useState)(()=>typeof window>`u`?null:Re(window.location.pathname,window.location.search)),[ne]=(0,E.useState)(()=>v!==null);(0,E.useEffect)(()=>{if(typeof window>`u`)return;let e=window.matchMedia(`(max-width: ${Ie}px)`),t=e=>te(e.matches);return e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)},[]);let b=(0,E.useCallback)(e=>{Y(e),m(e)},[]),x=(0,E.useCallback)(e=>{Fe(e),_(e)},[]);(0,E.useEffect)(()=>{if(typeof window>`u`)return;let e=window.location?.pathname??``;console.info(`[admin-ui] shell-mount route=${e} variant=${r} sidebar=${r===`operator`?`none`:`present`} collapsed=${p} drawer=${g}`)},[]),(0,E.useEffect)(()=>{typeof window>`u`||!v||(console.info(`[admin-ui] wa-hydrate route=/ sessionId=${v.sessionId.slice(0,8)}`),window.history.replaceState(null,``,`/`))},[]);let re=(0,E.useCallback)(e=>{if(e===null){y(null);return}let t=typeof window<`u`?window.location.pathname:`/`,n=Le(t,e);console.info(`[admin-ui] wa-open route=${t} via=${n.via} sessionId=${e.sessionId.slice(0,8)}`),n.via===`in-place`?y(e):window.location.href=n.href},[]),S=ee?g:!p,C=(0,E.useCallback)(()=>{if(!(typeof window>`u`))if(window.matchMedia(`(max-width: ${Ie}px)`).matches){let e=g;console.info(`[admin-ui] header-sidebar-toggle from=${e?`open`:`closed`} mode=drawer`),x(!e)}else{let e=p;console.info(`[admin-ui] header-sidebar-toggle from=${e?`closed`:`open`} mode=collapse`),b(!e)}},[p,g,b,x]),w=(0,E.useCallback)(e=>{let t=ze(e,r);console.info(`[admin-ui] header-menu-nav target=${e} dest=${t}`),window.location.href=t},[r]),[ie,ae]=(0,E.useState)(`chat`),[T,oe]=(0,E.useState)([]);(0,E.useEffect)(()=>{if(r!==`operator`||!t)return;let e=!1;return fetch(`/api/whatsapp-reader/conversations?session_key=${encodeURIComponent(t)}`).then(e=>e.ok?e.json():{conversations:[]}).then(t=>{e||oe(t.conversations??[])}).catch(()=>{}),()=>{e=!0}},[r,t]);let O=(0,E.useMemo)(()=>[...new Set(T.map(e=>e.channel))],[T]),k={collapsed:p,mobileDrawerOpen:g,sidebarOpen:S,onToggleSidebar:C,setMobileDrawerOpen:x,selectedWhatsapp:v,onClearWhatsapp:()=>y(null)};return r===`operator`?(0,D.jsxs)(`div`,{className:`admin-shell admin-page admin-shell-root`,children:[(0,D.jsx)(d,{businessName:n,variant:r,onNavigate:w,conversationsCount:T.length,conversationsChannels:O,onOpenConversations:()=>ae(`conversations`),onToggleSidebar:C,sidebarOpen:S,onLogout:i,onDisconnect:a,disconnecting:o}),(0,D.jsx)(`div`,{className:`platform platform-operator`,children:ie===`conversations`?(0,D.jsx)(h,{conversations:T,sessionKey:t??``,onBack:()=>ae(`chat`)}):typeof u==`function`?u(k):u}),f]}):(0,D.jsxs)(`div`,{className:`admin-shell admin-page admin-shell-root`,children:[(0,D.jsx)(d,{businessName:n,variant:r,onNavigate:w,onToggleSidebar:C,sidebarOpen:S,onLogout:i,onDisconnect:a,disconnecting:o}),(0,D.jsxs)(`div`,{className:`platform${g?` menu-open`:``}${p?` sidebar-collapsed`:``}`,"data-artefact":`closed`,children:[(0,D.jsx)(Oe,{businessName:n,cacheKey:t,role:l??null,userName:s,userAvatar:c??null,onSelectProjects:()=>{window.location.href=`/graph?label=Project`},onSelectPeople:()=>{window.location.href=`/graph?label=Person`},onSelectTasks:()=>{window.location.href=`/graph?label=Task`},onSelectAgents:()=>{window.location.href=`/graph?label=Agent`},onCloseMobileDrawer:()=>x(!1),collapsed:p,mobileDrawerOpen:g,selectedWhatsappId:v?.sessionId??null,onSelectWhatsappConversation:re,initialWhatsappSurface:ne}),!ee&&(0,D.jsx)(le,{}),typeof u==`function`?u(k):u]}),g&&(0,D.jsx)(`div`,{className:`sidebar-backdrop menu-open`,"aria-hidden":`true`,onClick:()=>x(!1)}),f]})}export{y as _,N as a,L as c,k as d,T as f,x as g,S as h,F as i,me as l,w as m,Se as n,R as o,ie as p,z as r,P as s,Be as t,I as u,ee as v};