@rubytech/create-maxy-code 0.1.315 → 0.1.316

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 (47) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +2 -2
  3. package/payload/platform/plugins/docs/references/admin-session.md +1 -1
  4. package/payload/platform/plugins/docs/references/admin-ui.md +1 -1
  5. package/payload/platform/plugins/memory/references/schema-estate-agent.md +32 -0
  6. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  7. package/payload/platform/services/claude-session-manager/dist/http-server.js +14 -5
  8. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  9. package/payload/platform/services/webchat-channel/dist/permission.d.ts +46 -0
  10. package/payload/platform/services/webchat-channel/dist/permission.d.ts.map +1 -0
  11. package/payload/platform/services/webchat-channel/dist/permission.js +56 -0
  12. package/payload/platform/services/webchat-channel/dist/permission.js.map +1 -0
  13. package/payload/platform/services/webchat-channel/dist/server.d.ts.map +1 -1
  14. package/payload/platform/services/webchat-channel/dist/server.js +47 -1
  15. package/payload/platform/services/webchat-channel/dist/server.js.map +1 -1
  16. package/payload/platform/templates/specialists/agents/data-manager.md +3 -1
  17. package/payload/server/public/assets/{AccessGate-B0sCa0QJ.js → AccessGate-bu988Xo-.js} +1 -1
  18. package/payload/server/public/assets/{AdminLoginScreens-C7Oaqpr6.js → AdminLoginScreens-BCYaOOuk.js} +1 -1
  19. package/payload/server/public/assets/{AdminShell-DgK7TWCI.js → AdminShell-DSjJ4Biu.js} +1 -1
  20. package/payload/server/public/assets/{Checkbox-C4m1jfdP.js → Checkbox-B4Dbvjls.js} +1 -1
  21. package/payload/server/public/assets/{OperatorConversations-z2mSY_eQ.js → OperatorConversations-XsXP7-P-.js} +1 -1
  22. package/payload/server/public/assets/{admin-DxYk1Ghu.js → admin-m0797WGA.js} +1 -1
  23. package/payload/server/public/assets/{audio-attachment-mime-BXj3DB3Y.js → audio-attachment-mime-Jm4KJ4YC.js} +1 -1
  24. package/payload/server/public/assets/{brand-BwWvCHLs.css → brand-DvttVeGB.css} +1 -1
  25. package/payload/server/public/assets/{browser-NzxOujfD.js → browser-CBjNMPsz.js} +1 -1
  26. package/payload/server/public/assets/chat-Sg-RGuV6.js +1 -0
  27. package/payload/server/public/assets/{data-CTROHvif.js → data-CEqE4BDw.js} +1 -1
  28. package/payload/server/public/assets/{graph-Dx2a6vGB.js → graph-BZNc3EXa.js} +1 -1
  29. package/payload/server/public/assets/{graph-labels-Dxqq08v6.js → graph-labels-Bj5yM9bI.js} +1 -1
  30. package/payload/server/public/assets/operator-Bph7mx87.js +1 -0
  31. package/payload/server/public/assets/page-CtWCeXdg.js +1 -0
  32. package/payload/server/public/assets/{public-cuggl7du.js → public-gxHCJCs3.js} +1 -1
  33. package/payload/server/public/assets/{public-next-apqAebbA.js → public-next-C3clISGQ.js} +1 -1
  34. package/payload/server/public/assets/{useSelectionMode-DlgEcMtA.js → useSelectionMode-BMn70cch.js} +1 -1
  35. package/payload/server/public/browser.html +6 -6
  36. package/payload/server/public/chat.html +8 -8
  37. package/payload/server/public/data.html +5 -5
  38. package/payload/server/public/graph.html +8 -8
  39. package/payload/server/public/index.html +8 -8
  40. package/payload/server/public/operator.html +10 -10
  41. package/payload/server/public/public-next.html +9 -9
  42. package/payload/server/public/public.html +7 -7
  43. package/payload/server/server.js +100 -7
  44. package/payload/server/public/assets/chat-CEQTEN5z.js +0 -1
  45. package/payload/server/public/assets/operator-BTHMTwNI.js +0 -1
  46. package/payload/server/public/assets/page-B9fQp1g9.js +0 -1
  47. /package/payload/server/public/assets/{brand-DOgCGEoD.js → brand-D8LClgr_.js} +0 -0
@@ -5,13 +5,13 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Browser — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/browser-NzxOujfD.js"></script>
8
+ <script type="module" crossorigin src="/assets/browser-CBjNMPsz.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CAM3fms7.js">
10
- <link rel="modulepreload" crossorigin href="/assets/brand-DOgCGEoD.js">
11
- <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-z2mSY_eQ.js">
12
- <link rel="modulepreload" crossorigin href="/assets/useSelectionMode-DlgEcMtA.js">
13
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-DgK7TWCI.js">
14
- <link rel="stylesheet" crossorigin href="/assets/brand-BwWvCHLs.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/brand-D8LClgr_.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-XsXP7-P-.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/useSelectionMode-BMn70cch.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-DSjJ4Biu.js">
14
+ <link rel="stylesheet" crossorigin href="/assets/brand-DvttVeGB.css">
15
15
  <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-qc_xy7Az.css">
16
16
  </head>
17
17
  <body>
@@ -5,17 +5,17 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Chat — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/chat-CEQTEN5z.js"></script>
8
+ <script type="module" crossorigin src="/assets/chat-Sg-RGuV6.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CAM3fms7.js">
10
- <link rel="modulepreload" crossorigin href="/assets/brand-DOgCGEoD.js">
11
- <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-z2mSY_eQ.js">
12
- <link rel="modulepreload" crossorigin href="/assets/useSelectionMode-DlgEcMtA.js">
13
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-DgK7TWCI.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/brand-D8LClgr_.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-XsXP7-P-.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/useSelectionMode-BMn70cch.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-DSjJ4Biu.js">
14
14
  <link rel="modulepreload" crossorigin href="/assets/admin-types-D2qTXuCg.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-C5gCWwwF.js">
16
- <link rel="modulepreload" crossorigin href="/assets/audio-attachment-mime-BXj3DB3Y.js">
17
- <link rel="modulepreload" crossorigin href="/assets/page-B9fQp1g9.js">
18
- <link rel="stylesheet" crossorigin href="/assets/brand-BwWvCHLs.css">
16
+ <link rel="modulepreload" crossorigin href="/assets/audio-attachment-mime-Jm4KJ4YC.js">
17
+ <link rel="modulepreload" crossorigin href="/assets/page-CtWCeXdg.js">
18
+ <link rel="stylesheet" crossorigin href="/assets/brand-DvttVeGB.css">
19
19
  <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-qc_xy7Az.css">
20
20
  </head>
21
21
  <body>
@@ -5,12 +5,12 @@
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-CTROHvif.js"></script>
8
+ <script type="module" crossorigin src="/assets/data-CEqE4BDw.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CAM3fms7.js">
10
- <link rel="modulepreload" crossorigin href="/assets/brand-DOgCGEoD.js">
11
- <link rel="modulepreload" crossorigin href="/assets/graph-labels-Dxqq08v6.js">
12
- <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-z2mSY_eQ.js">
13
- <link rel="stylesheet" crossorigin href="/assets/brand-BwWvCHLs.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/brand-D8LClgr_.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/graph-labels-Bj5yM9bI.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-XsXP7-P-.js">
13
+ <link rel="stylesheet" crossorigin href="/assets/brand-DvttVeGB.css">
14
14
  <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-qc_xy7Az.css">
15
15
  </head>
16
16
  <body>
@@ -5,15 +5,15 @@
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-Dx2a6vGB.js"></script>
8
+ <script type="module" crossorigin src="/assets/graph-BZNc3EXa.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CAM3fms7.js">
10
- <link rel="modulepreload" crossorigin href="/assets/brand-DOgCGEoD.js">
11
- <link rel="modulepreload" crossorigin href="/assets/graph-labels-Dxqq08v6.js">
12
- <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-z2mSY_eQ.js">
13
- <link rel="modulepreload" crossorigin href="/assets/useSelectionMode-DlgEcMtA.js">
14
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-DgK7TWCI.js">
15
- <link rel="modulepreload" crossorigin href="/assets/Checkbox-C4m1jfdP.js">
16
- <link rel="stylesheet" crossorigin href="/assets/brand-BwWvCHLs.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/brand-D8LClgr_.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/graph-labels-Bj5yM9bI.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-XsXP7-P-.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/useSelectionMode-BMn70cch.js">
14
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-DSjJ4Biu.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/Checkbox-B4Dbvjls.js">
16
+ <link rel="stylesheet" crossorigin href="/assets/brand-DvttVeGB.css">
17
17
  <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-qc_xy7Az.css">
18
18
  </head>
19
19
  <body>
@@ -5,16 +5,16 @@
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-DxYk1Ghu.js"></script>
8
+ <script type="module" crossorigin src="/assets/admin-m0797WGA.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CAM3fms7.js">
10
- <link rel="modulepreload" crossorigin href="/assets/brand-DOgCGEoD.js">
11
- <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-z2mSY_eQ.js">
12
- <link rel="modulepreload" crossorigin href="/assets/useSelectionMode-DlgEcMtA.js">
13
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-DgK7TWCI.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/brand-D8LClgr_.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-XsXP7-P-.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/useSelectionMode-BMn70cch.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-DSjJ4Biu.js">
14
14
  <link rel="modulepreload" crossorigin href="/assets/admin-types-D2qTXuCg.js">
15
- <link rel="modulepreload" crossorigin href="/assets/Checkbox-C4m1jfdP.js">
16
- <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-C7Oaqpr6.js">
17
- <link rel="stylesheet" crossorigin href="/assets/brand-BwWvCHLs.css">
15
+ <link rel="modulepreload" crossorigin href="/assets/Checkbox-B4Dbvjls.js">
16
+ <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-BCYaOOuk.js">
17
+ <link rel="stylesheet" crossorigin href="/assets/brand-DvttVeGB.css">
18
18
  <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-qc_xy7Az.css">
19
19
  <link rel="stylesheet" crossorigin href="/assets/AdminLoginScreens-CWMpccrR.css">
20
20
  <link rel="stylesheet" href="/brand-defaults.css">
@@ -5,19 +5,19 @@
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-BTHMTwNI.js"></script>
8
+ <script type="module" crossorigin src="/assets/operator-Bph7mx87.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CAM3fms7.js">
10
- <link rel="modulepreload" crossorigin href="/assets/brand-DOgCGEoD.js">
11
- <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-z2mSY_eQ.js">
12
- <link rel="modulepreload" crossorigin href="/assets/useSelectionMode-DlgEcMtA.js">
13
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-DgK7TWCI.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/brand-D8LClgr_.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-XsXP7-P-.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/useSelectionMode-BMn70cch.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-DSjJ4Biu.js">
14
14
  <link rel="modulepreload" crossorigin href="/assets/admin-types-D2qTXuCg.js">
15
- <link rel="modulepreload" crossorigin href="/assets/Checkbox-C4m1jfdP.js">
16
- <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-C7Oaqpr6.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/Checkbox-B4Dbvjls.js">
16
+ <link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-BCYaOOuk.js">
17
17
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-C5gCWwwF.js">
18
- <link rel="modulepreload" crossorigin href="/assets/audio-attachment-mime-BXj3DB3Y.js">
19
- <link rel="modulepreload" crossorigin href="/assets/page-B9fQp1g9.js">
20
- <link rel="stylesheet" crossorigin href="/assets/brand-BwWvCHLs.css">
18
+ <link rel="modulepreload" crossorigin href="/assets/audio-attachment-mime-Jm4KJ4YC.js">
19
+ <link rel="modulepreload" crossorigin href="/assets/page-CtWCeXdg.js">
20
+ <link rel="stylesheet" crossorigin href="/assets/brand-DvttVeGB.css">
21
21
  <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-qc_xy7Az.css">
22
22
  <link rel="stylesheet" crossorigin href="/assets/AdminLoginScreens-CWMpccrR.css">
23
23
  </head>
@@ -5,18 +5,18 @@
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-next-apqAebbA.js"></script>
8
+ <script type="module" crossorigin src="/assets/public-next-C3clISGQ.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CAM3fms7.js">
10
- <link rel="modulepreload" crossorigin href="/assets/brand-DOgCGEoD.js">
11
- <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-z2mSY_eQ.js">
12
- <link rel="modulepreload" crossorigin href="/assets/useSelectionMode-DlgEcMtA.js">
13
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-DgK7TWCI.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/brand-D8LClgr_.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/OperatorConversations-XsXP7-P-.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/useSelectionMode-BMn70cch.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-DSjJ4Biu.js">
14
14
  <link rel="modulepreload" crossorigin href="/assets/admin-types-D2qTXuCg.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-C5gCWwwF.js">
16
- <link rel="modulepreload" crossorigin href="/assets/audio-attachment-mime-BXj3DB3Y.js">
17
- <link rel="modulepreload" crossorigin href="/assets/page-B9fQp1g9.js">
18
- <link rel="modulepreload" crossorigin href="/assets/AccessGate-B0sCa0QJ.js">
19
- <link rel="stylesheet" crossorigin href="/assets/brand-BwWvCHLs.css">
16
+ <link rel="modulepreload" crossorigin href="/assets/audio-attachment-mime-Jm4KJ4YC.js">
17
+ <link rel="modulepreload" crossorigin href="/assets/page-CtWCeXdg.js">
18
+ <link rel="modulepreload" crossorigin href="/assets/AccessGate-bu988Xo-.js">
19
+ <link rel="stylesheet" crossorigin href="/assets/brand-DvttVeGB.css">
20
20
  <link rel="stylesheet" crossorigin href="/assets/OperatorConversations-qc_xy7Az.css">
21
21
  </head>
22
22
  <body class="public-surface">
@@ -5,15 +5,15 @@
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-cuggl7du.js"></script>
8
+ <script type="module" crossorigin src="/assets/public-gxHCJCs3.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-CAM3fms7.js">
10
- <link rel="modulepreload" crossorigin href="/assets/brand-DOgCGEoD.js">
11
- <link rel="modulepreload" crossorigin href="/assets/useSelectionMode-DlgEcMtA.js">
12
- <link rel="modulepreload" crossorigin href="/assets/Checkbox-C4m1jfdP.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/brand-D8LClgr_.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/useSelectionMode-BMn70cch.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/Checkbox-B4Dbvjls.js">
13
13
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-C5gCWwwF.js">
14
- <link rel="modulepreload" crossorigin href="/assets/audio-attachment-mime-BXj3DB3Y.js">
15
- <link rel="modulepreload" crossorigin href="/assets/AccessGate-B0sCa0QJ.js">
16
- <link rel="stylesheet" crossorigin href="/assets/brand-BwWvCHLs.css">
14
+ <link rel="modulepreload" crossorigin href="/assets/audio-attachment-mime-Jm4KJ4YC.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/AccessGate-bu988Xo-.js">
16
+ <link rel="stylesheet" crossorigin href="/assets/brand-DvttVeGB.css">
17
17
  <link rel="stylesheet" crossorigin href="/assets/public-vnj7OhQj.css">
18
18
  <link rel="stylesheet" href="/brand-defaults.css">
19
19
  </head>
@@ -6891,7 +6891,6 @@ function resolveTitle(body, sessionId, userTitles) {
6891
6891
  const channel = stripped.channel;
6892
6892
  if (userTitle) return { title: trimToTitle(userTitle), source: "user", channel };
6893
6893
  if (aiTitle) return { title: trimToTitle(aiTitle), source: "ai", channel };
6894
- if (stripped.inner) return { title: trimToTitle(stripped.inner), source: "first-message", channel };
6895
6894
  return { title: sessionId.slice(0, 8), source: "prefix", channel };
6896
6895
  }
6897
6896
  app3.get("/", requireAdminSession, async (c) => {
@@ -6971,7 +6970,7 @@ app3.get("/", requireAdminSession, async (c) => {
6971
6970
  if (accountId) {
6972
6971
  await Promise.all(
6973
6972
  rows.map(async (row) => {
6974
- if (row.titleSource !== "first-message" && row.titleSource !== "prefix") return;
6973
+ if (row.titleSource !== "prefix") return;
6975
6974
  const pid = personIdBySession.get(row.sessionId);
6976
6975
  if (pid) {
6977
6976
  const name = await loadPersonNameByElementId(accountId, pid);
@@ -8498,7 +8497,7 @@ ${note}` : note;
8498
8497
  }
8499
8498
  const known = resolvedProjectDir !== null || sessionSidecarExists(target);
8500
8499
  const indicators2 = await fetchComposerIndicators(target);
8501
- return c.json({ sessionId: target, projectDir: resolvedProjectDir, transcriptSessionId, channelBinding: conflictingBinding(channel), known, sizeBytes: jsonlSizeBytes(projectDir2, target), ...indicators2, ...readLevers() });
8500
+ return c.json({ sessionId: target, projectDir: resolvedProjectDir, transcriptSessionId, channelBinding: conflictingBinding(channel), known, sizeBytes: jsonlSizeBytes(projectDir2, target), pendingPermissionPrompt: deps.pendingPromptFor?.(`session:${target}`) ?? null, ...indicators2, ...readLevers() });
8502
8501
  }
8503
8502
  let account;
8504
8503
  try {
@@ -8522,7 +8521,24 @@ ${note}` : note;
8522
8521
  }
8523
8522
  }
8524
8523
  const indicators = await fetchComposerIndicators(sessionId);
8525
- return c.json({ sessionId, projectDir, sizeBytes: jsonlSizeBytes(projectDir, sessionId), ...indicators, ...readLevers(account) });
8524
+ return c.json({ sessionId, projectDir, sizeBytes: jsonlSizeBytes(projectDir, sessionId), pendingPermissionPrompt: deps.pendingPromptFor?.(`session:${sessionId}`) ?? null, ...indicators, ...readLevers(account) });
8525
+ });
8526
+ app53.post("/permission-verdict", requireAdminSession, async (c) => {
8527
+ const body = await c.req.json().catch(() => null);
8528
+ const sessionId = body?.sessionId;
8529
+ const requestId = body?.request_id;
8530
+ const behavior = body?.behavior;
8531
+ if (typeof sessionId !== "string" || !UUID_PATTERN.test(sessionId)) {
8532
+ return c.json({ error: "invalid session id" }, 400);
8533
+ }
8534
+ if (typeof requestId !== "string" || requestId.length === 0) {
8535
+ return c.json({ error: "request_id required" }, 400);
8536
+ }
8537
+ if (behavior !== "allow" && behavior !== "deny") {
8538
+ return c.json({ error: "behavior must be allow or deny" }, 400);
8539
+ }
8540
+ const ok = deps.resolvePermissionVerdict?.(`session:${sessionId}`, requestId, behavior) ?? false;
8541
+ return c.json({ ok });
8526
8542
  });
8527
8543
  return app53;
8528
8544
  }
@@ -19358,6 +19374,20 @@ function createWebchatChannelRoutes(deps) {
19358
19374
  deps.onReady?.(key);
19359
19375
  return c.json({ ok: true });
19360
19376
  });
19377
+ app53.post("/webchat-channel/permission-request", async (c) => {
19378
+ const body = await c.req.json().catch(() => null);
19379
+ const key = body?.key;
19380
+ const requestId = body?.request_id;
19381
+ const toolName = body?.tool_name;
19382
+ const description = body?.description;
19383
+ const inputPreview = body?.input_preview;
19384
+ if (typeof key !== "string" || typeof requestId !== "string" || typeof toolName !== "string" || typeof description !== "string" || typeof inputPreview !== "string") {
19385
+ return c.json({ error: "key, request_id, tool_name, description, input_preview required" }, 400);
19386
+ }
19387
+ if (!deps.awaitPermissionVerdict) return c.json({ timeout: true });
19388
+ const verdict = await deps.awaitPermissionVerdict({ key, requestId, toolName, description, inputPreview });
19389
+ return c.json(verdict);
19390
+ });
19361
19391
  app53.post("/webchat-channel/received", async (c) => {
19362
19392
  const body = await c.req.json().catch(() => null);
19363
19393
  const key = body?.key;
@@ -19378,10 +19408,13 @@ var SWEEP_INTERVAL_MS2 = 15e3;
19378
19408
  function channelIdleMs() {
19379
19409
  return Number(process.env.CHANNEL_PTY_IDLE_MS ?? String(5 * 6e4));
19380
19410
  }
19411
+ function permissionVerdictTtlMs() {
19412
+ return Number(process.env.WEBCHAT_PERMISSION_TTL_MS ?? String(5 * 6e4));
19413
+ }
19381
19414
  function keyDisplay(key) {
19382
19415
  return key.startsWith("session:") ? key.slice(0, "session:".length + 8) : key.slice(0, 8);
19383
19416
  }
19384
- var WebchatGateway = class {
19417
+ var WebchatGateway = class _WebchatGateway {
19385
19418
  constructor(deps) {
19386
19419
  this.deps = deps;
19387
19420
  }
@@ -19394,6 +19427,12 @@ var WebchatGateway = class {
19394
19427
  * /webchat-channel/reply resolves it. Admin webchat registers none (its
19395
19428
  * browser reader tails the JSONL), so handleReply is a no-op there. */
19396
19429
  replyAwaiters = /* @__PURE__ */ new Map();
19430
+ /** Task 940 — open permission prompts awaiting an operator verdict, keyed
19431
+ * `${key}::${requestId}`. The channel server registers one via a held-open
19432
+ * POST (awaitPermissionVerdict); the /chat Allow/Deny button resolves it
19433
+ * (resolvePermissionVerdict); the session pointer surfaces the oldest open
19434
+ * one for that key (pendingPromptFor). */
19435
+ pendingPrompts = /* @__PURE__ */ new Map();
19397
19436
  /** Task 756 — live public sessions, for the idle reaper + session-end review.
19398
19437
  * Admin sessions are never recorded here (they never reap). */
19399
19438
  publicSessions = /* @__PURE__ */ new Map();
@@ -19416,6 +19455,54 @@ var WebchatGateway = class {
19416
19455
  });
19417
19456
  });
19418
19457
  }
19458
+ /** Task 940 — register an open permission prompt and hold for the operator's
19459
+ * verdict. Resolves with `{behavior}` when resolvePermissionVerdict fires for
19460
+ * this key+id, or `{timeout:true}` after `timeoutMs` (the channel server's
19461
+ * held-open POST returns either; on timeout it emits no verdict and the local
19462
+ * terminal dialog stays answerable). */
19463
+ awaitPermissionVerdict(p, timeoutMs) {
19464
+ const k = _WebchatGateway.promptKey(p.key, p.requestId);
19465
+ return new Promise((resolve34) => {
19466
+ this.pendingPrompts.get(k)?.resolve({ timeout: true });
19467
+ const timer2 = setTimeout(() => {
19468
+ this.pendingPrompts.delete(k);
19469
+ resolve34({ timeout: true });
19470
+ }, timeoutMs);
19471
+ if (timer2.unref) timer2.unref();
19472
+ this.pendingPrompts.set(k, {
19473
+ ...p,
19474
+ at: Date.now(),
19475
+ resolve: (r) => {
19476
+ clearTimeout(timer2);
19477
+ this.pendingPrompts.delete(k);
19478
+ resolve34(r);
19479
+ }
19480
+ });
19481
+ console.error(`[webchat:perm] op=open key=${keyDisplay(p.key)} id=${p.requestId} tool=${p.toolName}`);
19482
+ });
19483
+ }
19484
+ /** Task 940 — the operator's Allow/Deny answer for an open prompt. Returns
19485
+ * false (and is a no-op) when no prompt with this key+id is open — a late or
19486
+ * duplicate click. */
19487
+ resolvePermissionVerdict(key, requestId, behavior) {
19488
+ const entry = this.pendingPrompts.get(_WebchatGateway.promptKey(key, requestId));
19489
+ if (!entry) return false;
19490
+ entry.resolve({ behavior });
19491
+ console.error(`[webchat:perm] op=verdict key=${keyDisplay(key)} id=${requestId} behavior=${behavior}`);
19492
+ return true;
19493
+ }
19494
+ /** Task 940 — the oldest open prompt for `key`, for the session pointer's
19495
+ * Allow/Deny card. null when none is open. */
19496
+ pendingPromptFor(key) {
19497
+ let oldest = null;
19498
+ for (const p of this.pendingPrompts.values()) {
19499
+ if (p.key === key && (!oldest || p.at < oldest.at)) oldest = p;
19500
+ }
19501
+ return oldest ? { requestId: oldest.requestId, toolName: oldest.toolName, description: oldest.description, inputPreview: oldest.inputPreview } : null;
19502
+ }
19503
+ static promptKey(key, requestId) {
19504
+ return `${key}::${requestId}`;
19505
+ }
19419
19506
  /** Stamp the op=reply lifeline and resolve any held-open awaiter for `key`.
19420
19507
  * Called by the /reply route's onReply. The first reply after registration
19421
19508
  * wins; a later reply for the same key finds no awaiter and only logs. */
@@ -19478,7 +19565,8 @@ var WebchatGateway = class {
19478
19565
  `[webchat:inbound] op=channel-received key=${key} messageId=${messageId}${found ? "" : " note=unknown"}`
19479
19566
  );
19480
19567
  },
19481
- onReply: (key, text) => this.handleReply(key, text)
19568
+ onReply: (key, text) => this.handleReply(key, text),
19569
+ awaitPermissionVerdict: (p) => this.awaitPermissionVerdict(p, permissionVerdictTtlMs())
19482
19570
  });
19483
19571
  }
19484
19572
  /** Run one reconciliation pass: log every terminal delivery event the sweep
@@ -20385,7 +20473,12 @@ app52.route("/api/chat", chatRoutes);
20385
20473
  app52.route("/api/whatsapp", whatsapp_default);
20386
20474
  app52.route("/api/whatsapp-reader", whatsapp_reader_default);
20387
20475
  app52.route("/api/public-reader", public_reader_default);
20388
- app52.route("/api/webchat", createWebchatRoutes({ handleInbound: (input) => webchatGateway.handleInbound(input) }));
20476
+ app52.route("/api/webchat", createWebchatRoutes({
20477
+ handleInbound: (input) => webchatGateway.handleInbound(input),
20478
+ // Task 940 — the permission relay's pointer read + verdict write.
20479
+ pendingPromptFor: (key) => webchatGateway.pendingPromptFor(key),
20480
+ resolvePermissionVerdict: (key, requestId, behavior) => webchatGateway.resolvePermissionVerdict(key, requestId, behavior)
20481
+ }));
20389
20482
  app52.route("/api/webchat/greeting", webchat_greeting_default);
20390
20483
  app52.route("/api/telegram", telegram_default);
20391
20484
  app52.route("/api/quickbooks", quickbooks_default);
@@ -1 +0,0 @@
1
- import{l as e,o as t}from"./brand-DOgCGEoD.js";import"./OperatorConversations-z2mSY_eQ.js";import"./admin-types-D2qTXuCg.js";import"./AdminShell-DgK7TWCI.js";import{n}from"./page-B9fQp1g9.js";import"./audio-attachment-mime-BXj3DB3Y.js";import"./useSelectionMode-DlgEcMtA.js";var r=e(),i=t();(0,r.createRoot)(document.getElementById(`root`)).render((0,i.jsx)(n,{}));
@@ -1 +0,0 @@
1
- import{o as e}from"./chunk-CAM3fms7.js";import{d as t,l as n,o as r}from"./brand-DOgCGEoD.js";import"./OperatorConversations-z2mSY_eQ.js";import{n as i,t as a}from"./AdminLoginScreens-C7Oaqpr6.js";import"./admin-types-D2qTXuCg.js";import"./AdminShell-DgK7TWCI.js";import{t as o}from"./page-B9fQp1g9.js";import"./audio-attachment-mime-BXj3DB3Y.js";import"./useSelectionMode-DlgEcMtA.js";import"./Checkbox-C4m1jfdP.js";var s=n(),c=e(t(),1),l=r();function u(){let e=i(`operator`),t=(0,c.useRef)(null);return(0,c.useEffect)(()=>{e.appState!==`chat`&&t.current!==e.appState&&(t.current=e.appState,console.info(`[operator-ui] op=auth-gate state=${e.appState}`))},[e.appState]),e.appState===`chat`?(0,l.jsx)(o,{variant:`operator`}):(0,l.jsx)(a,{auth:e})}(0,s.createRoot)(document.getElementById(`root`)).render((0,l.jsx)(u,{}));
@@ -1 +0,0 @@
1
- import{o as e}from"./chunk-CAM3fms7.js";import{c as t,d as n,o as r}from"./brand-DOgCGEoD.js";import{a as i,i as a,n as o,o as s,p as c,r as l,s as u,w as d,y as f}from"./OperatorConversations-z2mSY_eQ.js";import{n as ee,r as te,t as ne}from"./admin-types-D2qTXuCg.js";import{a as p,c as m,d as h,f as re,i as g,o as _,p as v,r as y,s as ie,t as b,u as ae}from"./AdminShell-DgK7TWCI.js";import{c as x,f as S,i as C,n as oe,p as se,r as ce,t as le}from"./audio-attachment-mime-BXj3DB3Y.js";import{i as ue}from"./useSelectionMode-DlgEcMtA.js";var de=t(`calendar-clock`,[[`path`,{d:`M16 14v2.2l1.6 1`,key:`fo4ql5`}],[`path`,{d:`M16 2v4`,key:`4m81vk`}],[`path`,{d:`M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5`,key:`1osxxc`}],[`path`,{d:`M3 10h5`,key:`r794hk`}],[`path`,{d:`M8 2v4`,key:`1cmpym`}],[`circle`,{cx:`16`,cy:`16`,r:`6`,key:`qoo3c4`}]]),fe=t(`corner-down-left`,[[`path`,{d:`M20 4v7a4 4 0 0 1-4 4H4`,key:`6o5b7l`}],[`path`,{d:`m9 10-5 5 5 5`,key:`1kshq7`}]]),pe=t(`graduation-cap`,[[`path`,{d:`M21.42 10.922a1 1 0 0 0-.019-1.838L12.83 5.18a2 2 0 0 0-1.66 0L2.6 9.08a1 1 0 0 0 0 1.832l8.57 3.908a2 2 0 0 0 1.66 0z`,key:`j76jl0`}],[`path`,{d:`M22 10v6`,key:`1lu8f3`}],[`path`,{d:`M6 12.5V16a6 3 0 0 0 12 0v-3.5`,key:`1r8lef`}]]),me=t(`shield`,[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}]]),w=`Accomplishing.Actioning.Actualizing.Architecting.Baking.Beaming.Befuddling.Billowing.Blanching.Bloviating.Boogieing.Boondoggling.Booping.Bootstrapping.Brewing.Bunning.Burrowing.Calculating.Canoodling.Caramelizing.Cascading.Catapulting.Cerebrating.Channeling.Channelling.Choreographing.Churning.Clauding.Coalescing.Cogitating.Combobulating.Composing.Computing.Concocting.Considering.Contemplating.Cooking.Crafting.Creating.Crunching.Crystallizing.Cultivating.Deciphering.Deliberating.Determining.Discombobulating.Doing.Doodling.Drizzling.Ebbing.Effecting.Elucidating.Embellishing.Enchanting.Envisioning.Evaporating.Fermenting.Finagling.Flibbertigibbeting.Flowing.Flummoxing.Fluttering.Forging.Forming.Frolicking.Frosting.Gallivanting.Galloping.Garnishing.Generating.Germinating.Gesticulating.Gitifying.Grooving.Gusting.Harmonizing.Hashing.Hatching.Herding.Honking.Hullaballooing.Hyperspacing.Ideating.Imagining.Improvising.Incubating.Inferring.Infusing.Ionizing.Jitterbugging.Julienning.Kneading.Leavening.Levitating.Lollygagging.Manifesting.Marinating.Meandering.Metamorphosing.Misting.Moonwalking.Moseying.Mulling.Musing.Mustering.Nebulizing.Nesting.Newspapering.Noodling.Nucleating.Orbiting.Orchestrating.Osmosing.Perambulating.Percolating.Perusing.Philosophising.Photosynthesizing.Pollinating.Pondering.Pontificating.Pouncing.Precipitating.Prestidigitating.Processing.Proofing.Propagating.Puttering.Puzzling.Quantumizing.Razzmatazzing.Recombobulating.Reticulating.Roosting.Ruminating.Scampering.Schlepping.Scurrying.Seasoning.Shenaniganing.Shimmying.Simmering.Skedaddling.Sketching.Slithering.Smooshing.Spelunking.Spinning.Sprouting.Stewing.Sublimating.Swirling.Swooping.Symbioting.Synthesizing.Tempering.Thinking.Thundering.Tinkering.Tomfoolering.Transfiguring.Transmuting.Twisting.Undulating.Unfurling.Unravelling.Vibing.Waddling.Wandering.Warping.Whatchamacalliting.Whirlpooling.Whirring.Whisking.Wibbling.Working.Wrangling.Zesting.Zigzagging`.split(`.`),T=e(n(),1),E=r(),he=1800;function ge(){let[e,t]=(0,T.useState)(()=>Math.floor(Math.random()*w.length));return(0,T.useEffect)(()=>{let e=setInterval(()=>t(e=>(e+1)%w.length),he);return()=>clearInterval(e)},[]),(0,E.jsxs)(`div`,{className:`chat-activity`,"aria-live":`polite`,"aria-label":`Agent is working`,children:[(0,E.jsx)(`img`,{src:`/brand/claude.png`,alt:``,className:`chat-activity-icon`}),(0,E.jsxs)(`span`,{className:`chat-activity-word`,children:[w[e],`…`]})]})}function D({variant:e,label:t,children:n}){let[r,i]=(0,T.useState)(!1);return(0,E.jsxs)(`div`,{className:`chat-${e}`,children:[(0,E.jsxs)(`button`,{type:`button`,className:`chat-${e}-toggle`,"aria-expanded":r,onClick:()=>i(e=>!e),children:[(0,E.jsx)(`span`,{className:`wa-chevron`,children:r?`▾`:`▸`}),(0,E.jsx)(`span`,{className:`chat-${e}-label`,children:t})]}),r&&n]})}function O({turns:e}){let t=e.filter(e=>e.kind===`tool-call`).length;return(0,E.jsx)(D,{variant:`toolrun`,label:t>0?`Used ${t} tool${t===1?``:`s`}`:`${e.length} tool result${e.length===1?``:`s`}`,children:e.map((e,t)=>(0,E.jsxs)(`div`,{className:`chat-toolrun-item`,children:[(0,E.jsx)(`span`,{className:`chat-toolrun-name`,children:e.kind===`tool-call`?`↳ ${e.name}`:e.isError?`result (error)`:`result`}),(0,E.jsx)(`pre`,{className:`wa-code`,children:e.kind===`tool-call`?JSON.stringify(e.input,null,2):e.text})]},t))})}function k({turns:e}){return(0,E.jsx)(D,{variant:`thinking`,label:`Thinking`,children:e.map((e,t)=>(0,E.jsx)(`div`,{className:`chat-thinking-item`,children:(0,E.jsx)(C,{content:e.text})},t))})}function A({composed:e}){return(0,E.jsx)(D,{variant:`composed`,label:`What the agent received`,children:(0,E.jsx)(`pre`,{className:`wa-code chat-composed-body`,children:e})})}function j({ts:e}){let t=i(e);return t?(0,E.jsx)(`time`,{className:`chat-time`,children:t}):null}function M(e,t){return`/api/admin/files/download?path=${encodeURIComponent(e)}&root=data&session_key=${encodeURIComponent(t)}`}var N=/\.(png|jpe?g|gif|webp|svg|bmp)$/i;function P(e,t,n,r){return t===`public`?`/api/public-reader/attachment/${e}?sessionId=${encodeURIComponent(n)}`:`/api/admin/attachment/${e}?session_key=${encodeURIComponent(r)}`}function F(e){if(e<1024)return`${e} B`;let t=e/1024;if(t<1024)return`${t<10?t.toFixed(1):Math.round(t)} KB`;let n=t/1024;return`${n<10?n.toFixed(1):Math.round(n)} MB`}function _e({src:e,alt:t}){let[n,r]=(0,T.useState)(!1);return(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(`img`,{className:`chat-attachment-image`,src:e,alt:t,onClick:()=>r(!0)}),n&&(0,E.jsx)(`div`,{className:`chat-attachment-overlay`,role:`dialog`,"aria-label":t,onClick:()=>r(!1),children:(0,E.jsx)(`img`,{className:`chat-attachment-overlay-image`,src:e,alt:t})})]})}function I({filename:e,href:t,mimeType:n,sizeBytes:r,expandable:i}){if((n?n.startsWith(`image/`):N.test(e))&&t)return i?(0,E.jsx)(_e,{src:t,alt:e}):(0,E.jsx)(`img`,{className:`chat-attachment-image`,src:t,alt:e});let a=r==null?e:`${e} · ${F(r)}`;return t?(0,E.jsxs)(`a`,{className:`chat-attachment-chip`,href:t,download:e,children:[`📎 `,a]}):(0,E.jsxs)(`p`,{className:`chat-doc`,children:[`📎 `,a]})}function L(e,t,n,r,i){switch(e.kind){case`operator-inbound`:case`operator-typed`:{let a=e.kind===`operator-inbound`?e.rawBody:void 0,o=a??e.text,c=e.kind===`operator-inbound`?e.attachments:void 0;return(0,E.jsxs)(`div`,{className:`chat-turn-op`,children:[e.kind===`operator-inbound`&&e.source&&(0,E.jsx)(`span`,{className:`chat-via`,children:s(e.source).replace(` · `,``)}),o&&(0,E.jsx)(`p`,{className:`chat-op-body`,children:o}),c&&c.length>0&&(0,E.jsx)(`div`,{className:`chat-attachment-list`,children:c.map((e,t)=>(0,E.jsx)(I,{expandable:!0,filename:e.filename,mimeType:e.mimeType,sizeBytes:e.sizeBytes,href:P(e.attachmentId,n,r,i)},t))}),a!==void 0&&n===`admin`&&(0,E.jsx)(A,{composed:e.text}),(0,E.jsx)(j,{ts:e.ts})]},t)}case`agent-reply`:return(0,E.jsxs)(`div`,{className:`chat-prose`,children:[(0,E.jsx)(C,{content:e.text}),(0,E.jsx)(j,{ts:e.ts})]},t);case`agent-reply-document`:return(0,E.jsxs)(`div`,{className:`chat-prose`,children:[e.files.map((e,t)=>(0,E.jsx)(I,{filename:a(e)},t)),e.caption&&(0,E.jsx)(C,{content:e.caption}),(0,E.jsx)(j,{ts:e.ts})]},t);case`agent-file`:return(0,E.jsxs)(`div`,{className:`chat-prose`,children:[e.files.map((t,n)=>{let r=a(t),o=e.downloads?.[n];if(!o)return(0,E.jsxs)(`p`,{className:`chat-doc`,children:[`📎 `,r]},n);let s=M(o,i);return N.test(r)?(0,E.jsx)(`img`,{className:`chat-doc-image`,src:s,alt:r},n):(0,E.jsxs)(`a`,{className:`chat-doc chat-doc-attachment`,href:s,download:r,children:[`📎 `,r]},n)}),e.caption&&(0,E.jsx)(C,{content:e.caption}),(0,E.jsx)(j,{ts:e.ts})]},t);case`agent-error`:return(0,E.jsxs)(`div`,{className:`chat-agent-error`,role:`alert`,children:[(0,E.jsx)(`span`,{className:`chat-agent-error-msg`,children:u(e.code,n)}),n===`admin`&&e.code===`agent_error`&&e.raw&&(0,E.jsx)(`pre`,{className:`chat-agent-error-raw`,children:e.raw})]},t)}}function ve(e,t,n,r=`admin`){let i=[],a=[],s=[],c=()=>{a.length!==0&&(i.push((0,E.jsx)(O,{turns:a},`tools-${i.length}`)),a=[])},l=()=>{s.length!==0&&(i.push((0,E.jsx)(k,{turns:s},`think-${i.length}`)),s=[])};return e.forEach((e,u)=>{if(e.kind===`turn`&&(e.turn.kind===`tool-call`||e.turn.kind===`tool-result`)){l(),a.push(e.turn);return}if(e.kind===`turn`&&e.turn.kind===`agent-text`){c(),s.push(e.turn);return}c(),l(),e.kind===`directive`?i.push((0,E.jsx)(o,{entry:e.entry,sessionId:t,sessionKey:n},u)):i.push(L(e.turn,u,r,t,n))}),c(),l(),i}var R=[g,p,y];function ye(e){return R.find(t=>_(t)===_(e))??e}var z=[`low`,`medium`,`high`,`xhigh`],B={low:`Low`,medium:`Medium`,high:`High`,xhigh:`Highest`},be=[{value:`default`,label:`Ask permissions`},{value:`acceptEdits`,label:`Accept edits`},{value:`plan`,label:`Plan mode`},{value:`auto`,label:`Auto mode`},{value:`bypassPermissions`,label:`Bypass permissions`}],xe=Object.fromEntries(be.map(e=>[e.value,e.label])),Se=2500,Ce=15e3;function V(e){let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(void 0,{weekday:`short`,day:`numeric`,month:`short`,hour:`2-digit`,minute:`2-digit`})}function we({cacheKey:e,userName:t}){let[n,r]=(0,T.useState)(null);(0,T.useEffect)(()=>{let t=!1;return fetch(`/api/webchat/greeting?session_key=${encodeURIComponent(e)}`).then(async e=>{let n=await e.json();if(!t){if(!e.ok||n.ok!==!0){console.warn(`[admin-ui] greeting-unavailable status=${e.status} ok=${String(n.ok)}`);return}r({events:n.events,tasks:n.tasks,specialists:n.specialists??[]})}}).catch(e=>{t||console.warn(`[admin-ui] greeting-unavailable error=${e instanceof Error?e.message:String(e)}`)}),()=>{t=!0}},[e]);let i=t?.trim().split(/\s+/)[0],a=n?n.tasks.total-n.tasks.items.length:0;return(0,E.jsxs)(`div`,{className:`webchat-greeting`,children:[(0,E.jsx)(`h2`,{className:`webchat-greeting-head`,children:i?`What's up next, ${i}?`:`What's up next?`}),n&&(0,E.jsxs)(E.Fragment,{children:[(0,E.jsxs)(`section`,{className:`webchat-greeting-section`,"data-kind":`events`,children:[(0,E.jsxs)(`h3`,{className:`webchat-greeting-label`,children:[(0,E.jsx)(de,{size:14}),` Upcoming schedule`]}),n.events.length===0?(0,E.jsx)(`p`,{className:`webchat-greeting-none`,children:`Nothing scheduled`}):n.events.map(e=>(0,E.jsxs)(`div`,{className:`webchat-greeting-row`,children:[(0,E.jsx)(`span`,{className:`webchat-greeting-name`,children:e.name}),(0,E.jsx)(`span`,{className:`webchat-greeting-when`,children:V(e.at)})]},e.eventId))]}),(0,E.jsxs)(`section`,{className:`webchat-greeting-section`,"data-kind":`tasks`,children:[(0,E.jsxs)(`h3`,{className:`webchat-greeting-label`,children:[(0,E.jsx)(h,{size:14}),` Outstanding tasks`]}),n.tasks.items.length===0?(0,E.jsx)(`p`,{className:`webchat-greeting-none`,children:`No open tasks`}):(0,E.jsxs)(E.Fragment,{children:[n.tasks.items.map(e=>(0,E.jsxs)(`div`,{className:`webchat-greeting-row`,children:[(0,E.jsx)(`span`,{className:`webchat-greeting-name`,children:e.name}),(0,E.jsx)(`span`,{className:`webchat-greeting-status`,children:e.status})]},e.taskId)),a>0&&(0,E.jsxs)(`p`,{className:`webchat-greeting-more`,children:[`+`,a,` more`]})]})]}),(0,E.jsxs)(`section`,{className:`webchat-greeting-section`,"data-kind":`specialists`,children:[(0,E.jsxs)(`h3`,{className:`webchat-greeting-label`,children:[(0,E.jsx)(m,{size:14}),` Your specialists`]}),n.specialists.length===0?(0,E.jsx)(`p`,{className:`webchat-greeting-none`,children:`No specialists installed`}):n.specialists.map((e,t)=>(0,E.jsxs)(`div`,{className:`webchat-greeting-row webchat-greeting-row-stacked`,children:[(0,E.jsx)(`span`,{className:`webchat-greeting-name`,children:e.name}),e.summary&&(0,E.jsx)(`span`,{className:`webchat-greeting-summary`,children:e.summary})]},`${t}-${e.name}`))]})]})]})}function H(e,t){let n=(0,T.useRef)(null);return(0,T.useEffect)(()=>{if(!e)return;let r=e=>{n.current&&!n.current.contains(e.target)&&t(!1)},i=e=>{e.key===`Escape`&&t(!1)};return document.addEventListener(`mousedown`,r),window.addEventListener(`keydown`,i),()=>{document.removeEventListener(`mousedown`,r),window.removeEventListener(`keydown`,i)}},[e,t]),n}function Te({kind:e,label:t,icon:n,options:r,selected:i,disabled:a,onPick:o}){let[s,c]=(0,T.useState)(!1);return(0,E.jsxs)(`div`,{className:`webchat-picker`,ref:H(s,c),children:[(0,E.jsx)(`button`,{type:`button`,className:`webchat-control webchat-picker-trigger`,"data-kind":e,disabled:a,"aria-haspopup":`listbox`,"aria-expanded":s,"aria-label":i?`${t}: ${i}`:t,title:`${t} — ${i??t}`,onClick:()=>c(e=>!e),children:n}),s&&(0,E.jsx)(`div`,{className:`webchat-picker-panel`,role:`listbox`,children:r.map(t=>(0,E.jsxs)(`button`,{type:`button`,className:`webchat-picker-option`,"data-kind":e,"data-value":t.value,role:`option`,"aria-checked":t.value===i||t.label===i,onClick:()=>{o(t.value),c(!1)},children:[(0,E.jsx)(d,{size:12,className:`webchat-picker-check`}),t.label]},t.value))})]})}function Ee({icon:e,value:t,index:n,disabled:r,onPick:i}){let[a,o]=(0,T.useState)(!1),s=H(a,o),c=B[t]??`Medium`;return(0,E.jsxs)(`div`,{className:`webchat-picker`,ref:s,children:[(0,E.jsx)(`button`,{type:`button`,className:`webchat-control webchat-picker-trigger`,"data-kind":`effort`,disabled:r,"aria-haspopup":`dialog`,"aria-expanded":a,"aria-label":`Thinking effort: ${c}`,title:`Thinking — ${c} (Faster ↔ Smarter)`,onClick:()=>o(e=>!e),children:e}),a&&(0,E.jsxs)(`div`,{className:`webchat-picker-panel webchat-effort-panel`,role:`dialog`,"aria-label":`Effort for new sessions`,children:[(0,E.jsx)(`div`,{className:`webchat-effort-head`,children:(0,E.jsxs)(`span`,{className:`webchat-effort-title`,children:[`Effort `,(0,E.jsx)(`strong`,{children:c})]})}),(0,E.jsxs)(`div`,{className:`webchat-effort-ends`,children:[(0,E.jsx)(`span`,{children:`Faster`}),(0,E.jsx)(`span`,{children:`Smarter`})]}),(0,E.jsxs)(`div`,{className:`webchat-effort-track`,children:[(0,E.jsx)(`span`,{className:`webchat-effort-dots`,"aria-hidden":`true`,children:z.map((e,t)=>(0,E.jsx)(`span`,{className:`webchat-effort-dot`,"data-max":t===z.length-1},e))}),(0,E.jsx)(`input`,{type:`range`,className:`webchat-effort-slider`,"data-kind":`effort`,min:0,max:z.length-1,step:1,value:n,disabled:r,"aria-label":`Effort for new sessions`,onChange:e=>i(z[Number(e.target.value)])})]})]})]})}function De({cacheKey:e,userName:t,targetSessionId:n,variant:r=`admin`}){let i=r===`public`,[a,o]=(0,T.useState)(null),[s,c]=(0,T.useState)(null),[u,d]=(0,T.useState)(``),[f,p]=(0,T.useState)(!1),[m,h]=(0,T.useState)(null),[g,v]=(0,T.useState)(null),y=(0,T.useRef)(!1),[b,C]=(0,T.useState)([]),[de,w]=(0,T.useState)(null),[he,D]=(0,T.useState)(!1),O=(0,T.useRef)(null),k=()=>Math.round((typeof window>`u`?900:window.innerHeight)/3),[A,j]=(0,T.useState)(null),M=(0,T.useRef)(null),N=(0,T.useRef)(null),P=(0,T.useCallback)(e=>{let t=N.current;t&&j(Math.min(k(),Math.max(44,t.startH+(t.startY-e.clientY))))},[]),F=(0,T.useCallback)(()=>{N.current=null,window.removeEventListener(`pointermove`,P),window.removeEventListener(`pointerup`,F)},[P]),_e=(0,T.useCallback)(e=>{N.current={startY:e.clientY,startH:M.current?.offsetHeight??44},window.addEventListener(`pointermove`,P),window.addEventListener(`pointerup`,F),e.preventDefault()},[P,F]),I=(0,T.useCallback)(e=>{let t=A??M.current?.offsetHeight??44;e.key===`ArrowUp`?(e.preventDefault(),j(Math.min(k(),t+24))):e.key===`ArrowDown`&&(e.preventDefault(),j(Math.max(44,t-24)))},[A]),L=(0,T.useCallback)(e=>{w(null);let t=e.find(e=>!le(e.type,te));if(t){w(`Unsupported file type: "${t.type}". Supported: images, PDF, plain text, markdown, CSV, calendar, zip, voice notes.`);return}let n=e.find(e=>e.size>ee);if(n){w(`"${n.name}" exceeds the 50 MB limit.`);return}C(t=>[...t,...e].slice(0,5))},[]),B=(0,T.useMemo)(()=>b.map(e=>e.type.startsWith(`image/`)?URL.createObjectURL(e):null),[b]);(0,T.useEffect)(()=>()=>{for(let e of B)e&&URL.revokeObjectURL(e)},[B]);let V=oe(),H=V.state===`recording`||V.state===`paused`||V.state===`sending`,De=(0,T.useCallback)(async()=>{let t=await V.send();if(!t)return;let r=t.type===`audio/ogg`?`.ogg`:t.type===`audio/mp4`?`.m4a`:`.webm`,a=new File([t],`voice-note${r}`,{type:t.type});if(f){C(e=>[...e,a].slice(0,5));return}p(!0);let o=new FormData;if(i){o.append(`message`,``),o.append(`session_key`,s??``);let e=x();e&&o.append(`agent`,e)}else o.append(`text`,``);o.append(`attachments`,a),!i&&n&&o.append(`session`,n);try{let t=i?await fetch(`/api/chat`,{method:`POST`,body:o}):await fetch(`/api/webchat/send?session_key=${encodeURIComponent(e)}`,{method:`POST`,body:o});t.ok||(console.error(`[admin-ui] webchat-send-failed kind=voice status=${t.status}`),C(e=>[...e,a].slice(0,5)),w(`Voice note failed to send. The recording is attached — press send to retry.`))}catch(e){console.error(`[admin-ui] webchat-send-failed kind=voice error=${e instanceof Error?e.message:String(e)}`),C(e=>[...e,a].slice(0,5)),w(`Voice note failed to send. The recording is attached — press send to retry.`)}finally{p(!1)}},[V,e,n,f,i,s]),U=(0,T.useRef)(!1);(0,T.useEffect)(()=>(U.current=!1,()=>{U.current=!0}),[]);let W=(0,T.useRef)(!1),Oe=(0,T.useCallback)(async()=>{if(W.current)return null;W.current=!0;try{if(i){let e=x(),t=await fetch(`/api/public-reader/session${e?`?agent=${encodeURIComponent(e)}`:``}`);if(!t.ok)return null;let n=await t.json();if(U.current)return null;c(n.sessionKey);let r={sessionId:n.sessionId??``,projectDir:n.projectDir};return o(r),r}let t=`session_key=${encodeURIComponent(e)}${n?`&session=${encodeURIComponent(n)}`:``}`,r=await fetch(`/api/webchat/session?${t}`);if(!r.ok)return null;let a=await r.json();return U.current||o(a),a}catch{return null}finally{W.current=!1}},[e,n,i]);(0,T.useEffect)(()=>{Oe();let e=setInterval(()=>{Oe()},Se);return()=>clearInterval(e)},[Oe]);let ke=(0,T.useCallback)(async()=>{let t=u.trim();if(!(!t&&b.length===0||f)){p(!0),y.current=!1;try{if(i){let e=s;if(!e){console.error(`[public-webchat] op=send-skip reason=no-key`);return}let n,r=x();if(b.length>0){let i=new FormData;i.append(`message`,t),i.append(`session_key`,e),r&&i.append(`agent`,r);for(let e of b)i.append(`attachments`,e);n=await fetch(`/api/chat`,{method:`POST`,body:i})}else n=await fetch(`/api/chat`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({message:t,session_key:e,...r?{agent:r}:{}})});n.ok?(d(``),C([]),w(null)):console.error(`[public-webchat] op=send-failed status=${n.status}`);return}let r;if(b.length>0){let i=new FormData;i.append(`text`,t);for(let e of b)i.append(`attachments`,e);n&&i.append(`session`,n),r=await fetch(`/api/webchat/send?session_key=${encodeURIComponent(e)}`,{method:`POST`,body:i})}else r=await fetch(`/api/webchat/send?session_key=${encodeURIComponent(e)}`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(n?{text:t,session:n}:{text:t})});if(r.ok){w(null),v(null),y.current=!0,h({baselineSize:a?.sizeBytes??null});return}else r.status===409?console.error(`[admin-ui] webchat-send-refused reason=channel-conflict`):console.error(`[admin-ui] webchat-send-failed status=${r.status}`)}catch(e){console.error(`[admin-ui] webchat-send-failed error=${e instanceof Error?e.message:String(e)}`)}finally{y.current||p(!1)}}},[u,f,e,b,n,i,s,a?.sizeBytes]),Ae=(0,T.useCallback)(e=>{e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),ke())},[ke]);(0,T.useEffect)(()=>{if(!m)return;let e=a?.sizeBytes;e!=null&&(m.baselineSize==null||e>m.baselineSize)&&(d(``),C([]),v(null),h(null),y.current=!1,p(!1))},[a,m]),(0,T.useEffect)(()=>{if(!m)return;let e=setTimeout(()=>{h(null),y.current=!1,p(!1),v(`Couldn't be delivered — press send to retry.`)},Ce);return()=>clearTimeout(e)},[m]);let G=n?a?.channelBinding??null:null,je=(0,T.useRef)(!1);(0,T.useEffect)(()=>{!n||je.current||!a||(je.current=!0,console.warn(`[admin-ui] chat-session-target sessionId=${n} jsonl=${a.projectDir?`found`:`missing`} known=${a.known===!0}`))},[a,n]);let Me=(0,T.useRef)(!1);(0,T.useEffect)(()=>{n||Me.current||!a?.sessionId||(Me.current=!0,console.info(`[admin-ui] chat-session-resolve sessionId=${a.sessionId.slice(0,8)} source=canonical`))},[a,n]);let Ne=a?a.effectivePermissionMode??a.permissionMode??null:null,K=a?.model??null,Pe=a?.activity===`busy`,[q,Fe]=(0,T.useState)(null),[J,Ie]=(0,T.useState)(null),[Y,Le]=(0,T.useState)(null),[Re,X]=(0,T.useState)(null),ze=(0,T.useCallback)(async(t,n)=>{let r=t===`model`?Fe:t===`effort`?Ie:Le;r(n),X(null);try{let i=await fetch(`/api/webchat/settings?session_key=${encodeURIComponent(e)}`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({op:t,value:n})});i.ok||(r(null),X(`Could not save ${t} (status ${i.status})`),console.error(`[admin-ui] webchat-settings-failed op=${t} status=${i.status}`))}catch(e){r(null),X(`Could not save ${t} (network error)`),console.error(`[admin-ui] webchat-settings-failed op=${t} error=${e instanceof Error?e.message:String(e)}`)}},[e]),Z=(0,T.useRef)(!1),Be=(0,T.useCallback)(async t=>{if(a?.sessionId&&!Z.current){Z.current=!0,X(null);try{let n=await fetch(`/api/admin/session-reseat?session_key=${encodeURIComponent(e)}`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({fromSessionId:a.sessionId,model:t.model,...t.mode?{permissionMode:t.mode}:{},...t.effort?{effort:t.effort}:{}})});if(!n.ok){X(`Could not move this chat (status ${n.status})`),console.error(`[admin-ui] reseat-failed status=${n.status}`),Z.current=!1;return}let r=await n.json();r.target?window.location.href=r.target:Z.current=!1}catch(e){X(`Could not move this chat (network error)`),console.error(`[admin-ui] reseat-failed error=${e instanceof Error?e.message:String(e)}`),Z.current=!1}}},[e,a?.sessionId]);(0,T.useEffect)(()=>{q!==null&&a?.leverModel===q&&Fe(null),J!==null&&a?.leverEffort===J&&Ie(null),Y!==null&&a?.leverMode===Y&&Le(null)},[a,q,J,Y]);let Q=q??a?.leverModel??K??``,Ve=J??a?.leverEffort??``,$=Y??a?.leverMode??Ne??null,He=Math.max(0,z.indexOf(Ve||`medium`)),Ue=Q&&!R.includes(Q)?[...R,Q]:R,We=(0,T.useRef)(!1);return(0,T.useEffect)(()=>{We.current||a?.projectDir&&a.activity==null&&Ne==null&&K==null&&(We.current=!0,console.warn(`[admin-ui] composer-indicators-unavailable sessionId=${a.sessionId} (manager meta unreadable or pre-activity)`))},[a,Ne,K]),(0,E.jsxs)(`div`,{className:`webchat-page`,children:[a?.projectDir?(0,E.jsx)(l,{resetKey:a.sessionId,sessionId:a.transcriptSessionId??a.sessionId,projectDir:a.projectDir,sessionKey:i?s??``:e,renderItems:i?(e,t,n)=>ve(e,t,n,`public`):ve,cleanViewToggle:r===`admin`,forceDeliveredOnly:r===`operator`||i,streamEndpoint:i?`/api/public-reader/stream`:`/api/whatsapp-reader/stream`,suppressDirectives:i,tail:!i&&Pe?(0,E.jsx)(ge,{}):null},a.sessionId):a&&!i?!n||a.known?(0,E.jsx)(we,{cacheKey:e,userName:t}):(0,E.jsx)(`div`,{className:`webchat-greeting`,children:(0,E.jsx)(`p`,{className:`webchat-greeting-none`,children:`No transcript found for this session.`})}):null,(0,E.jsxs)(`div`,{className:`webchat-composer`,children:[(0,E.jsxs)(`div`,{className:`webchat-composer-box${he?` drag-over`:``}`,onDragOver:e=>{e.preventDefault(),D(!0)},onDragLeave:()=>D(!1),onDrop:e=>{e.preventDefault(),D(!1),L([...e.dataTransfer.files])},children:[(0,E.jsx)(`input`,{ref:O,type:`file`,multiple:!0,accept:ne,style:{display:`none`},onChange:e=>{e.target.files&&L([...e.target.files]),e.target.value=``}}),!H&&(0,E.jsx)(`div`,{className:`webchat-resize-handle`,role:`separator`,"aria-orientation":`horizontal`,"aria-label":`Resize input — drag up to enlarge`,tabIndex:0,onPointerDown:_e,onKeyDown:I}),b.length>0&&(0,E.jsx)(`div`,{className:`attachment-strip`,children:b.map((e,t)=>(0,E.jsxs)(`div`,{className:`attachment-chip`,children:[B[t]?(0,E.jsx)(`img`,{src:B[t],alt:e.name,className:`attachment-chip-thumb`}):e.type.startsWith(`audio/`)?(0,E.jsx)(S,{size:14}):e.type===`application/pdf`?(0,E.jsx)(ue,{size:14}):(0,E.jsx)(se,{size:14}),(0,E.jsx)(`span`,{className:`attachment-chip-name`,children:e.name}),(0,E.jsx)(`button`,{type:`button`,className:`attachment-chip-remove`,onClick:()=>C(e=>e.filter((e,n)=>n!==t)),"aria-label":`Remove ${e.name}`,children:`×`})]},t))}),de&&(0,E.jsx)(`p`,{className:`attach-error`,children:de}),g&&(0,E.jsx)(`p`,{className:`webchat-send-error`,role:`alert`,children:g}),V.state===`error`&&V.errorMessage&&(0,E.jsxs)(`p`,{className:`voice-error`,role:`alert`,children:[(0,E.jsx)(S,{size:14}),V.errorMessage]}),H?(0,E.jsx)(`div`,{className:`webchat-input-row voice-active`,children:(0,E.jsx)(ce,{state:V.state,elapsedSeconds:V.elapsedSeconds,waveform:V.waveform,onTogglePause:V.togglePause,onDiscard:V.discard,onSend:()=>void De()})}):(0,E.jsxs)(`div`,{className:`webchat-input-row`,children:[(0,E.jsx)(`textarea`,{ref:M,className:`webchat-input`,value:u,placeholder:`Message your agent…`,rows:2,style:A==null?void 0:{height:`${A}px`},disabled:G!==null,onChange:e=>d(e.target.value),onKeyDown:Ae,onPaste:e=>{let t=e.clipboardData?.items;if(!t)return;let n=[];for(let e of t){if(e.kind!==`file`)continue;let t=e.getAsFile();if(!t)continue;let r=t.type.split(`/`)[1]?.replace(`jpeg`,`jpg`)||`png`;n.push(new File([t],`pasted-image-${Date.now()}.${r}`,{type:t.type}))}n.length>0&&L(n)}}),(0,E.jsx)(`button`,{type:`button`,className:`webchat-send`,onClick:()=>void ke(),disabled:f||u.trim().length===0&&b.length===0||G!==null,"aria-label":`Send`,title:`Send`,children:(0,E.jsx)(fe,{size:16})})]}),G!==null&&(0,E.jsxs)(`p`,{className:`webchat-conflict-hint`,children:[`This session is bound to the `,G,` channel — message it there. The transcript stays readable here.`]})]}),(0,E.jsxs)(`div`,{className:`webchat-controls`,children:[(0,E.jsxs)(`div`,{className:`webchat-controls-left`,children:[(0,E.jsx)(`button`,{type:`button`,className:`webchat-control`,onClick:()=>O.current?.click(),disabled:G!==null,title:`Attach files`,"aria-label":`Attach`,children:(0,E.jsx)(ae,{size:14})}),(0,E.jsx)(`button`,{type:`button`,className:`webchat-control`,onClick:V.start,disabled:H||G!==null,title:`Record voice note`,"aria-label":`Voice input`,children:(0,E.jsx)(S,{size:14})})]}),!i&&(0,E.jsxs)(`div`,{className:`webchat-controls-right`,children:[a?.sessionId&&(0,E.jsx)(`code`,{className:`webchat-session-id`,title:`First 8 characters of this session's id — matches the Sessions list.`,children:a.sessionId.slice(0,8)}),Re&&(0,E.jsx)(`span`,{className:`webchat-settings-error`,role:`alert`,children:Re}),$&&(0,E.jsx)(Te,{kind:`mode`,label:`Permission mode`,icon:(0,E.jsx)(me,{size:14}),options:be,selected:xe[$]??$,disabled:G!==null,onPick:e=>{a?.projectDir&&Q?Be({model:ye(Q),mode:e}):ze(`mode`,e)}}),(0,E.jsx)(Te,{kind:`model`,label:`Model`,icon:(0,E.jsx)(re,{size:14}),options:Ue.map(e=>({value:e,label:ie(e)})),selected:Q?ie(Q):null,disabled:G!==null,onPick:e=>{a?.projectDir?(!K||_(e)!==_(K))&&Be({model:e}):ze(`model`,e)}}),(0,E.jsx)(Ee,{icon:(0,E.jsx)(pe,{size:14}),value:Ve,index:He,disabled:G!==null,onPick:e=>{a?.projectDir&&Q?Be({model:ye(Q),effort:e}):ze(`effort`,e)}})]})]})]})]})}function U({variant:e=`admin`}){let[t,n]=(0,T.useState)(null),[r]=(0,T.useState)(()=>{if(e===`operator`)return null;try{return new URLSearchParams(window.location.search).get(`session`)}catch{return null}}),[i,a]=(0,T.useState)(!1),[o,s]=(0,T.useState)(void 0),[l,u]=(0,T.useState)(null),[d,ee]=(0,T.useState)(void 0),[te,ne]=(0,T.useState)(null),[p,m]=(0,T.useState)(null);(0,T.useEffect)(()=>{let e=!1,t=null;try{t=sessionStorage.getItem(`maxy-admin-session-key`)}catch{}if(!t){n(null),a(!0);return}return fetch(`/api/admin/session?session_key=${encodeURIComponent(t)}`).then(async r=>{if(!e){if(r.status===401){try{sessionStorage.removeItem(`maxy-admin-session-key`)}catch{}window.location.href=`/`;return}if(r.ok)try{let e=await r.json();typeof e.businessName==`string`&&s(e.businessName),e.sessionId!==void 0&&u(e.sessionId??null),m(e.role??null),ee(e.userName===void 0?null:e.userName),ne(e.avatar??null)}catch{}n(t),a(!0)}}).catch(()=>{e||(n(t),a(!0))}),()=>{e=!0}},[]);let h=(0,T.useRef)(!1);(0,T.useEffect)(()=>{e!==`operator`||!i||!t||h.current||(h.current=!0,console.info(`[operator-ui] op=mount surface=chat sessionId=${(l??``).slice(0,8)}`))},[e,i,t,l]);let re=(0,T.useCallback)(()=>{try{sessionStorage.removeItem(`maxy-admin-session-key`)}catch{}window.location.href=`/`},[]),[g,_]=(0,T.useState)(!1),y=(0,T.useCallback)(async()=>{_(!0);try{let e=await v();if(e){try{sessionStorage.removeItem(`maxy-admin-session-key`)}catch{}window.location.href=`/`}return e}finally{_(!1)}},[]);return i?t?(0,E.jsx)(c,{cacheKey:t,surface:`chat`,onSessionExpired:({code:e,path:t})=>{console.warn(`[admin-auth] outcome=session-expired-redirect code=${e} path=${t} surface=chat`);try{sessionStorage.removeItem(`maxy-admin-session-key`)}catch{}window.location.href=`/`},children:(0,E.jsx)(b,{cacheKey:t,businessName:o,variant:e,sessionId:l,onLogout:re,onDisconnect:y,disconnecting:g,userName:d,userAvatar:te,role:p,children:(0,E.jsx)(De,{cacheKey:t,userName:d??null,targetSessionId:r,variant:e})})}):(0,E.jsx)(`div`,{className:`data-page`,children:(0,E.jsxs)(`div`,{className:`data-empty`,children:[(0,E.jsx)(`p`,{children:`You are not signed in.`}),(0,E.jsxs)(`p`,{children:[`Open the `,(0,E.jsx)(`a`,{href:`/`,className:`data-link`,children:`main admin page`}),` and log in, then return here.`]})]})}):(0,E.jsx)(`div`,{className:`data-page`,children:(0,E.jsxs)(`div`,{className:`data-loading`,children:[(0,E.jsx)(f,{size:18,className:`spin`}),` Loading…`]})})}function W(){return(0,E.jsx)(U,{})}export{W as n,De as r,U as t};