@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.
- package/package.json +1 -1
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +2 -2
- package/payload/platform/plugins/docs/references/admin-session.md +1 -1
- package/payload/platform/plugins/docs/references/admin-ui.md +1 -1
- package/payload/platform/plugins/memory/references/schema-estate-agent.md +32 -0
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.js +14 -5
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/webchat-channel/dist/permission.d.ts +46 -0
- package/payload/platform/services/webchat-channel/dist/permission.d.ts.map +1 -0
- package/payload/platform/services/webchat-channel/dist/permission.js +56 -0
- package/payload/platform/services/webchat-channel/dist/permission.js.map +1 -0
- package/payload/platform/services/webchat-channel/dist/server.d.ts.map +1 -1
- package/payload/platform/services/webchat-channel/dist/server.js +47 -1
- package/payload/platform/services/webchat-channel/dist/server.js.map +1 -1
- package/payload/platform/templates/specialists/agents/data-manager.md +3 -1
- package/payload/server/public/assets/{AccessGate-B0sCa0QJ.js → AccessGate-bu988Xo-.js} +1 -1
- package/payload/server/public/assets/{AdminLoginScreens-C7Oaqpr6.js → AdminLoginScreens-BCYaOOuk.js} +1 -1
- package/payload/server/public/assets/{AdminShell-DgK7TWCI.js → AdminShell-DSjJ4Biu.js} +1 -1
- package/payload/server/public/assets/{Checkbox-C4m1jfdP.js → Checkbox-B4Dbvjls.js} +1 -1
- package/payload/server/public/assets/{OperatorConversations-z2mSY_eQ.js → OperatorConversations-XsXP7-P-.js} +1 -1
- package/payload/server/public/assets/{admin-DxYk1Ghu.js → admin-m0797WGA.js} +1 -1
- package/payload/server/public/assets/{audio-attachment-mime-BXj3DB3Y.js → audio-attachment-mime-Jm4KJ4YC.js} +1 -1
- package/payload/server/public/assets/{brand-BwWvCHLs.css → brand-DvttVeGB.css} +1 -1
- package/payload/server/public/assets/{browser-NzxOujfD.js → browser-CBjNMPsz.js} +1 -1
- package/payload/server/public/assets/chat-Sg-RGuV6.js +1 -0
- package/payload/server/public/assets/{data-CTROHvif.js → data-CEqE4BDw.js} +1 -1
- package/payload/server/public/assets/{graph-Dx2a6vGB.js → graph-BZNc3EXa.js} +1 -1
- package/payload/server/public/assets/{graph-labels-Dxqq08v6.js → graph-labels-Bj5yM9bI.js} +1 -1
- package/payload/server/public/assets/operator-Bph7mx87.js +1 -0
- package/payload/server/public/assets/page-CtWCeXdg.js +1 -0
- package/payload/server/public/assets/{public-cuggl7du.js → public-gxHCJCs3.js} +1 -1
- package/payload/server/public/assets/{public-next-apqAebbA.js → public-next-C3clISGQ.js} +1 -1
- package/payload/server/public/assets/{useSelectionMode-DlgEcMtA.js → useSelectionMode-BMn70cch.js} +1 -1
- package/payload/server/public/browser.html +6 -6
- package/payload/server/public/chat.html +8 -8
- package/payload/server/public/data.html +5 -5
- package/payload/server/public/graph.html +8 -8
- package/payload/server/public/index.html +8 -8
- package/payload/server/public/operator.html +10 -10
- package/payload/server/public/public-next.html +9 -9
- package/payload/server/public/public.html +7 -7
- package/payload/server/server.js +100 -7
- package/payload/server/public/assets/chat-CEQTEN5z.js +0 -1
- package/payload/server/public/assets/operator-BTHMTwNI.js +0 -1
- package/payload/server/public/assets/page-B9fQp1g9.js +0 -1
- /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-
|
|
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-
|
|
11
|
-
<link rel="modulepreload" crossorigin href="/assets/OperatorConversations-
|
|
12
|
-
<link rel="modulepreload" crossorigin href="/assets/useSelectionMode-
|
|
13
|
-
<link rel="modulepreload" crossorigin href="/assets/AdminShell-
|
|
14
|
-
<link rel="stylesheet" crossorigin href="/assets/brand-
|
|
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-
|
|
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-
|
|
11
|
-
<link rel="modulepreload" crossorigin href="/assets/OperatorConversations-
|
|
12
|
-
<link rel="modulepreload" crossorigin href="/assets/useSelectionMode-
|
|
13
|
-
<link rel="modulepreload" crossorigin href="/assets/AdminShell-
|
|
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-
|
|
17
|
-
<link rel="modulepreload" crossorigin href="/assets/page-
|
|
18
|
-
<link rel="stylesheet" crossorigin href="/assets/brand-
|
|
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-
|
|
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-
|
|
11
|
-
<link rel="modulepreload" crossorigin href="/assets/graph-labels-
|
|
12
|
-
<link rel="modulepreload" crossorigin href="/assets/OperatorConversations-
|
|
13
|
-
<link rel="stylesheet" crossorigin href="/assets/brand-
|
|
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-
|
|
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-
|
|
11
|
-
<link rel="modulepreload" crossorigin href="/assets/graph-labels-
|
|
12
|
-
<link rel="modulepreload" crossorigin href="/assets/OperatorConversations-
|
|
13
|
-
<link rel="modulepreload" crossorigin href="/assets/useSelectionMode-
|
|
14
|
-
<link rel="modulepreload" crossorigin href="/assets/AdminShell-
|
|
15
|
-
<link rel="modulepreload" crossorigin href="/assets/Checkbox-
|
|
16
|
-
<link rel="stylesheet" crossorigin href="/assets/brand-
|
|
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-
|
|
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-
|
|
11
|
-
<link rel="modulepreload" crossorigin href="/assets/OperatorConversations-
|
|
12
|
-
<link rel="modulepreload" crossorigin href="/assets/useSelectionMode-
|
|
13
|
-
<link rel="modulepreload" crossorigin href="/assets/AdminShell-
|
|
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-
|
|
16
|
-
<link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-
|
|
17
|
-
<link rel="stylesheet" crossorigin href="/assets/brand-
|
|
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-
|
|
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-
|
|
11
|
-
<link rel="modulepreload" crossorigin href="/assets/OperatorConversations-
|
|
12
|
-
<link rel="modulepreload" crossorigin href="/assets/useSelectionMode-
|
|
13
|
-
<link rel="modulepreload" crossorigin href="/assets/AdminShell-
|
|
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-
|
|
16
|
-
<link rel="modulepreload" crossorigin href="/assets/AdminLoginScreens-
|
|
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-
|
|
19
|
-
<link rel="modulepreload" crossorigin href="/assets/page-
|
|
20
|
-
<link rel="stylesheet" crossorigin href="/assets/brand-
|
|
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-
|
|
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-
|
|
11
|
-
<link rel="modulepreload" crossorigin href="/assets/OperatorConversations-
|
|
12
|
-
<link rel="modulepreload" crossorigin href="/assets/useSelectionMode-
|
|
13
|
-
<link rel="modulepreload" crossorigin href="/assets/AdminShell-
|
|
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-
|
|
17
|
-
<link rel="modulepreload" crossorigin href="/assets/page-
|
|
18
|
-
<link rel="modulepreload" crossorigin href="/assets/AccessGate-
|
|
19
|
-
<link rel="stylesheet" crossorigin href="/assets/brand-
|
|
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-
|
|
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-
|
|
11
|
-
<link rel="modulepreload" crossorigin href="/assets/useSelectionMode-
|
|
12
|
-
<link rel="modulepreload" crossorigin href="/assets/Checkbox-
|
|
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-
|
|
15
|
-
<link rel="modulepreload" crossorigin href="/assets/AccessGate-
|
|
16
|
-
<link rel="stylesheet" crossorigin href="/assets/brand-
|
|
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>
|
package/payload/server/server.js
CHANGED
|
@@ -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 !== "
|
|
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({
|
|
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};
|
|
File without changes
|