wednesdayai 0.6.1-dev.27 → 0.6.1-dev.28
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/dist/{agent-CQhgyAis.js → agent-BDuI5Zvc.js} +26 -26
- package/dist/{agent-Y_2aRBZH.js → agent-BW-Yan08.js} +11 -11
- package/dist/{agent-turn-runner-faZvyYiv.js → agent-turn-runner-BfXiXNe2.js} +6 -6
- package/dist/{agent-turn-runner-ClBJoKQQ.js → agent-turn-runner-CHm-I95T.js} +5 -5
- package/dist/build-info.json +3 -3
- package/dist/bundled/boot-md/handler.js +32 -32
- package/dist/bundled/bootstrap-extra-files/handler.js +4 -4
- package/dist/bundled/command-logger/handler.js +2 -2
- package/dist/bundled/session-journal/handler.js +31 -31
- package/dist/bundled/session-memory/handler.js +31 -31
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/{chrome-B3nEcesV.js → chrome-CKy31bWh.js} +32 -32
- package/dist/{chrome-DLbFTDQE.js → chrome-Ct9vb6SC.js} +12 -12
- package/dist/{command-queue-BSbitNdP.js → command-queue-AIWqKnVD.js} +1 -1
- package/dist/{command-queue-BijpV9rd.js → command-queue-CNStMA4Y.js} +1 -1
- package/dist/control-ui-v2/assets/{AgentsView-DVvw6PTU.js → AgentsView-3Qsr3xnf.js} +1 -1
- package/dist/control-ui-v2/assets/{AutomationsView-CxjmPRdI.js → AutomationsView-DkBzPKKQ.js} +1 -1
- package/dist/control-ui-v2/assets/Badge-CB5TWfdz.js +1 -0
- package/dist/control-ui-v2/assets/{Button-DL76WqX4.js → Button-CGdLofSY.js} +1 -1
- package/dist/control-ui-v2/assets/{ChannelsView-BDcVzQIM.js → ChannelsView-BRb8eYyh.js} +1 -1
- package/dist/control-ui-v2/assets/{ConfigForm-CbvOdyOA.js → ConfigForm-D8_bqW8x.js} +1 -1
- package/dist/control-ui-v2/assets/{ConfirmDialog-DGHQXUr5.js → ConfirmDialog-B7aotBjN.js} +1 -1
- package/dist/control-ui-v2/assets/{DataTable-lEkd1R85.js → DataTable-CSi930kO.js} +1 -1
- package/dist/control-ui-v2/assets/{DebugView-CHHmLv3x.js → DebugView-8cZqh6FQ.js} +1 -1
- package/dist/control-ui-v2/assets/{Dialog-rIrrCPSu.js → Dialog-CQE8Pvh6.js} +1 -1
- package/dist/control-ui-v2/assets/{DreamsView-uQSpm1S4.js → DreamsView-B0KzP2OM.js} +1 -1
- package/dist/control-ui-v2/assets/{EntityLink-AEBgCNQX.js → EntityLink-BO2oG3y8.js} +1 -1
- package/dist/control-ui-v2/assets/{FilterPills-HxAXXDO8.js → FilterPills-9pNaAyrL.js} +1 -1
- package/dist/control-ui-v2/assets/{InstancesView-Svk7C7AX.js → InstancesView-BbunCxYg.js} +1 -1
- package/dist/control-ui-v2/assets/{LearningView-CWqWycCM.js → LearningView-CEqD48Ll.js} +1 -1
- package/dist/control-ui-v2/assets/{LogsView-D7kaR6es.js → LogsView-fcI0vxkz.js} +1 -1
- package/dist/control-ui-v2/assets/{NodesView-CqKA1XAX.js → NodesView-BONHE7EP.js} +1 -1
- package/dist/control-ui-v2/assets/{OverviewView-Dz3YnxWP.js → OverviewView-BpynJnjy.js} +1 -1
- package/dist/control-ui-v2/assets/{Panel-CyfpswdJ.js → Panel-9wOynsWc.js} +1 -1
- package/dist/control-ui-v2/assets/{PluginMount-C1HeSpS9.js → PluginMount-6N20-nhI.js} +1 -1
- package/dist/control-ui-v2/assets/{PluginPageView-Dap5OwAt.js → PluginPageView-DZ3bh805.js} +1 -1
- package/dist/control-ui-v2/assets/{PluginPanels-DdDZQ_Dn.js → PluginPanels-DulRlgcm.js} +1 -1
- package/dist/control-ui-v2/assets/{RunsView-CQXkKsIZ.js → RunsView-dcBTwtFX.js} +1 -1
- package/dist/control-ui-v2/assets/{SessionsView-Bs9UqOQr.js → SessionsView-CZuTvckb.js} +1 -1
- package/dist/control-ui-v2/assets/{SettingsView-BhorzAw5.js → SettingsView-BTcubWvr.js} +1 -1
- package/dist/control-ui-v2/assets/{SkillsView-ClzUjPU-.js → SkillsView-Bj7lvW23.js} +1 -1
- package/dist/control-ui-v2/assets/{Stat-BruDi6qc.js → Stat-BZwg1PGE.js} +1 -1
- package/dist/control-ui-v2/assets/{StatusDot-Cij-6nH8.js → StatusDot-DHhJ1VpB.js} +1 -1
- package/dist/control-ui-v2/assets/{StorageView-BYgvfNcg.js → StorageView-B5cF1lld.js} +1 -1
- package/dist/control-ui-v2/assets/{UpdatedAgo-DWSnE4WG.js → UpdatedAgo-Dw3kxb2x.js} +1 -1
- package/dist/control-ui-v2/assets/{UsageView-C_ezU9jy.js → UsageView-DBZ1WkEI.js} +1 -1
- package/dist/control-ui-v2/assets/{config-store-27hOx1yp.js → config-store-XvvVJ8Fq.js} +1 -1
- package/dist/control-ui-v2/assets/{format-dlOOV12I.js → format-CGs6a1G6.js} +1 -1
- package/dist/control-ui-v2/assets/gateway-features-BZH74_Oc.js +1 -0
- package/dist/control-ui-v2/assets/{index-OijNknZs.js → index-BvXiY83i.js} +1 -1
- package/dist/control-ui-v2/assets/{links-C1sAzVEH.js → links-DlVrQOFC.js} +2 -2
- package/dist/control-ui-v2/assets/{run-rows-BYCIH1Sn.js → run-rows-Au2UUkD7.js} +1 -1
- package/dist/control-ui-v2/assets/{runs-store-DLIlHRM6.js → runs-store-DXgNPFWM.js} +1 -1
- package/dist/control-ui-v2/assets/{use-gateway-query-CF94JYnM.js → use-gateway-query-D25QZANO.js} +1 -1
- package/dist/control-ui-v2/index.html +7 -7
- package/dist/{deliver-CY4Fs4RX.js → deliver-DsuMPE0S.js} +28 -28
- package/dist/{deliver-xfGDp6XD.js → deliver-DxVojbH7.js} +6 -6
- package/dist/{diagnostic-S8OX1Eq2.js → diagnostic-C4pLNG6a.js} +1 -1
- package/dist/{diagnostic-BZYYYnMx.js → diagnostic-DJ11ZJIJ.js} +3 -3
- package/dist/{errors-BRYMqzPb.js → errors-0-at0aYV.js} +1 -1
- package/dist/extensionAPI.js +24 -24
- package/dist/{fences-Dtk43Q2a.js → fences-Z8d1dj8p.js} +16 -16
- package/dist/{fences-DbKcVN_n.js → fences-j5vzXLXf.js} +1 -1
- package/dist/{fetch-guard-UCuiKQ5E.js → fetch-guard-BQ-NMG7L.js} +2 -2
- package/dist/{fetch-guard-DuBGo4VE.js → fetch-guard-BaBd9ZVm.js} +2 -2
- package/dist/{frontmatter-DHBTRDiB.js → frontmatter-CzhUc9Ri.js} +5 -5
- package/dist/{fs-safe-Bk4Thq7a.js → fs-safe-Bd1xxVwv.js} +1 -1
- package/dist/{fs-safe-CyG0wflg.js → fs-safe-DMWtsz4J.js} +26 -26
- package/dist/{legacy-names-6uH6aLhq.js → legacy-names-chsmo2vs.js} +26 -26
- package/dist/llm-slug-generator.js +31 -31
- package/dist/{manager-BvLLls5L.js → manager-B4xc1xN6.js} +16 -16
- package/dist/{manager-Cf3W8LKj.js → manager-CD-sBxdS.js} +3 -3
- package/dist/{model-selection-Ca4WCV4n.js → model-selection-CYS--Nqz.js} +1 -1
- package/dist/{model-selection-CbMZx9fR.js → model-selection-Ds5bEVQ2.js} +82 -82
- package/dist/{nudge-DelcKR7z.js → nudge-CKFTN2YI.js} +9 -9
- package/dist/{nudge-Dd9wU1K5.js → nudge-DZuNGDE_.js} +32 -32
- package/dist/{outbound-attachment-CKATrxgO.js → outbound-attachment-BsEApkFu.js} +9 -9
- package/dist/{outbound-attachment-Btl5f-Lu.js → outbound-attachment-DHLTkCuI.js} +4 -4
- package/dist/{pi-embedded-ApthdT0k.js → pi-embedded-C8SqFziv.js} +40 -40
- package/dist/{pi-embedded-D-4wht-f.js → pi-embedded-yXKiYEGf.js} +229 -229
- package/dist/{pi-model-discovery-Dgbp4zjx.js → pi-model-discovery-CtfGh_up.js} +7 -7
- package/dist/{pi-model-discovery-D-D_mngz.js → pi-model-discovery-De5Z6lro.js} +1 -1
- package/dist/{proxy-env-v_oj7Urd.js → proxy-env-D4WYaw6X.js} +1 -1
- package/dist/{proxy-env-BRG1LWK1.js → proxy-env-DPCNy_X3.js} +1 -1
- package/dist/{pw-ai-BH-MmrGa.js → pw-ai-BmuDO1HM.js} +5 -5
- package/dist/{pw-ai-DK4N7_nV.js → pw-ai-ohfJZ9jX.js} +11 -11
- package/dist/{qmd-manager-Cdz2xlNp.js → qmd-manager-2dro3Ccn.js} +9 -9
- package/dist/{qmd-manager-NT_CKYQG.js → qmd-manager-CgZ9ng9u.js} +4 -4
- package/dist/{qmd-scope-CyWbQgiS.js → qmd-scope-DMUA3Vq9.js} +1 -1
- package/dist/{qmd-scope-hzI66flw.js → qmd-scope-RFd-g5Qi.js} +1 -1
- package/dist/{query-expansion-CPkdZdty.js → query-expansion-DQ8zm-TE.js} +1 -1
- package/dist/{query-expansion-feTsk3WF.js → query-expansion-GZKwviqQ.js} +13 -13
- package/dist/{recorder-DCGoPaKG.js → recorder-DA5NY6nl.js} +1 -1
- package/dist/{recorder-C3f7IlHZ.js → recorder-dKE74HOC.js} +2 -2
- package/dist/{redact-C4XKILzo.js → redact-LOuk7TRy.js} +1 -1
- package/dist/{reply-directives-BjV2MFIq.js → reply-directives-8FtYI79u.js} +9 -9
- package/dist/{reply-directives-ToqsETSh.js → reply-directives-CE9WoRyW.js} +49 -49
- package/dist/{runs-CPjMwHXQ.js → runs-BIabbRe5.js} +8 -8
- package/dist/{runs-D7qs08K3.js → runs-Dw8BeXyu.js} +5 -5
- package/dist/{send-BnVk7V-5.js → send-BQzswQlt.js} +5 -5
- package/dist/{send-DDBl5H1k.js → send-BTp_lz-m.js} +4 -4
- package/dist/{send-B9huC0Lk.js → send-CWcFiq7U.js} +3 -3
- package/dist/{send-Cj5zKV3M.js → send-DW_8PsC0.js} +4 -4
- package/dist/{sessions-zel35iDK.js → sessions-Bz8mUwgo.js} +5 -5
- package/dist/{sessions-CXuFR_IY.js → sessions-DKv9bCbi.js} +1 -1
- package/dist/{subsystem-DoQFckDJ.js → subsystem-cFv2jJm-.js} +71 -71
- package/dist/{tool-loop-detection-CtOkwPJY.js → tool-loop-detection-9fAxiikd.js} +2 -2
- package/dist/{user-run-recording-BVpLQDqe.js → user-run-recording-C1LRU5Lb.js} +2 -2
- package/dist/{user-run-recording-C10wwXyW.js → user-run-recording-CWRiZJsh.js} +1 -1
- package/dist/web-client/assets/{hast-util-from-dom-CvePVP6E.js → hast-util-from-dom-BoP9fB2c.js} +1 -1
- package/dist/web-client/assets/{hast-util-to-mdast-CwugKdbc.js → hast-util-to-mdast-Bo07nYTv.js} +1 -1
- package/dist/web-client/assets/{index-CFHLAWrp.js → index-CwqOe0fG.js} +2 -2
- package/dist/web-client/index.html +1 -1
- package/dist/{ws-2U5gNvRt.js → ws-Do6yaRWR.js} +1 -1
- package/dist/{ws-DrXm3NWZ.js → ws-Dt2EocLN.js} +1 -1
- package/extensions/a2a/package.json +1 -1
- package/extensions/acpx/package.json +1 -1
- package/extensions/anthropic/package.json +1 -1
- package/extensions/bifrost/package.json +1 -1
- package/extensions/bluebubbles/package.json +1 -1
- package/extensions/copilot-proxy/package.json +1 -1
- package/extensions/deepgram/package.json +1 -1
- package/extensions/deepinfra/package.json +1 -1
- package/extensions/diagnostics-otel/package.json +1 -1
- package/extensions/diffs/package.json +1 -1
- package/extensions/discord/package.json +1 -1
- package/extensions/dream-cycle/package.json +1 -1
- package/extensions/elevenlabs/package.json +1 -1
- package/extensions/feishu/package.json +1 -1
- package/extensions/gemini-search/package.json +1 -1
- package/extensions/google/package.json +1 -1
- package/extensions/google-gemini-cli-auth/package.json +1 -1
- package/extensions/googlechat/package.json +1 -1
- package/extensions/grok-search/package.json +1 -1
- package/extensions/groq/package.json +1 -1
- package/extensions/identity-oidc/package.json +1 -1
- package/extensions/imessage/package.json +1 -1
- package/extensions/irc/package.json +1 -1
- package/extensions/kimi-search/package.json +1 -1
- package/extensions/kokoro/package.json +1 -1
- package/extensions/learning-core/package.json +1 -1
- package/extensions/line/package.json +1 -1
- package/extensions/llm-task/package.json +1 -1
- package/extensions/lobster/package.json +1 -1
- package/extensions/matrix/CHANGELOG.md +1 -1
- package/extensions/matrix/package.json +1 -1
- package/extensions/mattermost/package.json +1 -1
- package/extensions/memory-core/package.json +1 -1
- package/extensions/memory-lancedb/package.json +1 -1
- package/extensions/minimax/package.json +1 -1
- package/extensions/minimax-portal-auth/package.json +1 -1
- package/extensions/mistral/package.json +1 -1
- package/extensions/moonshot/package.json +1 -1
- package/extensions/msteams/CHANGELOG.md +1 -1
- package/extensions/msteams/package.json +1 -1
- package/extensions/nextcloud-talk/package.json +1 -1
- package/extensions/nostr/CHANGELOG.md +1 -1
- package/extensions/nostr/package.json +1 -1
- package/extensions/open-prose/package.json +1 -1
- package/extensions/openai/package.json +1 -1
- package/extensions/openai-realtime/package.json +1 -1
- package/extensions/openrouter/package.json +1 -1
- package/extensions/perplexity-search/package.json +1 -1
- package/extensions/searxng-search/package.json +1 -1
- package/extensions/signal/package.json +1 -1
- package/extensions/slack/package.json +1 -1
- package/extensions/synology-chat/package.json +1 -1
- package/extensions/telegram/package.json +1 -1
- package/extensions/tlon/package.json +1 -1
- package/extensions/twitch/CHANGELOG.md +1 -1
- package/extensions/twitch/package.json +1 -1
- package/extensions/ui-surfaces/package.json +1 -1
- package/extensions/voice-call/CHANGELOG.md +1 -1
- package/extensions/voice-call/package.json +1 -1
- package/extensions/whatsapp/package.json +1 -1
- package/extensions/zai/package.json +1 -1
- package/extensions/zalo/CHANGELOG.md +1 -1
- package/extensions/zalo/package.json +1 -1
- package/extensions/zalouser/CHANGELOG.md +1 -1
- package/extensions/zalouser/package.json +1 -1
- package/package.json +1 -1
- package/dist/control-ui-v2/assets/Badge-4n2tRQ02.js +0 -1
- package/dist/control-ui-v2/assets/gateway-features-BIj6-KTX.js +0 -1
- package/dist/github-copilot-token-Bm6yG6tw.js +0 -106
- package/dist/paths-BIDPYPVC.js +0 -233
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { V as loadConfig } from "./model-selection-
|
|
2
|
-
import { H as isPathInside, V as isNotFoundPathError, Z as CONFIG_DIR, mt as resolvePreferredOpenClawTmpDir, t as createSubsystemLogger } from "./subsystem-
|
|
3
|
-
import { n as isLoopbackAddress, r as isLoopbackHost, t as rawDataToString } from "./ws-
|
|
4
|
-
import { i as openFileWithinRoot, t as SafeOpenError } from "./fs-safe-
|
|
5
|
-
import { a as isErrno } from "./errors-
|
|
6
|
-
import { c as resolvePinnedHostnameWithPolicy, s as isPrivateNetworkAllowedByPolicy, t as hasProxyEnvConfigured } from "./proxy-env-
|
|
1
|
+
import { V as loadConfig } from "./model-selection-Ds5bEVQ2.js";
|
|
2
|
+
import { H as isPathInside, V as isNotFoundPathError, Z as CONFIG_DIR, mt as resolvePreferredOpenClawTmpDir, t as createSubsystemLogger } from "./subsystem-cFv2jJm-.js";
|
|
3
|
+
import { n as isLoopbackAddress, r as isLoopbackHost, t as rawDataToString } from "./ws-Do6yaRWR.js";
|
|
4
|
+
import { i as openFileWithinRoot, t as SafeOpenError } from "./fs-safe-DMWtsz4J.js";
|
|
5
|
+
import { a as isErrno } from "./errors-0-at0aYV.js";
|
|
6
|
+
import { c as resolvePinnedHostnameWithPolicy, s as isPrivateNetworkAllowedByPolicy, t as hasProxyEnvConfigured } from "./proxy-env-D4WYaw6X.js";
|
|
7
7
|
import path from "node:path";
|
|
8
|
-
import
|
|
8
|
+
import syncFs from "node:fs";
|
|
9
9
|
import os from "node:os";
|
|
10
|
-
import fs
|
|
10
|
+
import fs from "node:fs/promises";
|
|
11
11
|
import { execFileSync, spawn } from "node:child_process";
|
|
12
12
|
import { createHmac } from "node:crypto";
|
|
13
13
|
import net from "node:net";
|
|
14
14
|
import http, { createServer } from "node:http";
|
|
15
15
|
import https from "node:https";
|
|
16
|
-
import WebSocket
|
|
16
|
+
import WebSocket, { WebSocketServer } from "ws";
|
|
17
17
|
|
|
18
18
|
//#region src/browser/constants.ts
|
|
19
19
|
const DEFAULT_OPENCLAW_BROWSER_ENABLED = true;
|
|
@@ -66,28 +66,28 @@ function invalidPath(scopeLabel) {
|
|
|
66
66
|
}
|
|
67
67
|
async function resolveRealPathIfExists(targetPath) {
|
|
68
68
|
try {
|
|
69
|
-
return await fs
|
|
69
|
+
return await fs.realpath(targetPath);
|
|
70
70
|
} catch {
|
|
71
71
|
return;
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
async function resolveTrustedRootRealPath(rootDir) {
|
|
75
75
|
try {
|
|
76
|
-
const rootLstat = await fs
|
|
76
|
+
const rootLstat = await fs.lstat(rootDir);
|
|
77
77
|
if (!rootLstat.isDirectory() || rootLstat.isSymbolicLink()) return;
|
|
78
|
-
return await fs
|
|
78
|
+
return await fs.realpath(rootDir);
|
|
79
79
|
} catch {
|
|
80
80
|
return;
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
83
|
async function validateCanonicalPathWithinRoot(params) {
|
|
84
84
|
try {
|
|
85
|
-
const candidateLstat = await fs
|
|
85
|
+
const candidateLstat = await fs.lstat(params.candidatePath);
|
|
86
86
|
if (candidateLstat.isSymbolicLink()) return "invalid";
|
|
87
87
|
if (params.expect === "directory" && !candidateLstat.isDirectory()) return "invalid";
|
|
88
88
|
if (params.expect === "file" && !candidateLstat.isFile()) return "invalid";
|
|
89
89
|
if (params.expect === "file" && candidateLstat.nlink > 1) return "invalid";
|
|
90
|
-
const candidateRealPath = await fs
|
|
90
|
+
const candidateRealPath = await fs.realpath(params.candidatePath);
|
|
91
91
|
return isPathInside(params.rootRealPath, candidateRealPath) ? "ok" : "invalid";
|
|
92
92
|
} catch (err) {
|
|
93
93
|
return isNotFoundPathError(err) ? "not-found" : "invalid";
|
|
@@ -165,7 +165,7 @@ async function resolveCheckedPathsWithinRoot(params) {
|
|
|
165
165
|
};
|
|
166
166
|
if (!rootRealPath || !raw || !path.isAbsolute(raw)) return lexicalPathResult;
|
|
167
167
|
try {
|
|
168
|
-
const resolvedExistingPath = await fs
|
|
168
|
+
const resolvedExistingPath = await fs.realpath(raw);
|
|
169
169
|
const relativePath = path.relative(rootRealPath, resolvedExistingPath);
|
|
170
170
|
if (!isInRoot(relativePath)) return lexicalPathResult;
|
|
171
171
|
return {
|
|
@@ -501,7 +501,7 @@ async function ensureChromeExtensionRelayServer(opts) {
|
|
|
501
501
|
let extensionWs = null;
|
|
502
502
|
const cdpClients = /* @__PURE__ */ new Set();
|
|
503
503
|
const connectedTargets = /* @__PURE__ */ new Map();
|
|
504
|
-
const extensionConnected = () => extensionWs?.readyState === WebSocket
|
|
504
|
+
const extensionConnected = () => extensionWs?.readyState === WebSocket.OPEN;
|
|
505
505
|
const hasConnectedTargets = () => connectedTargets.size > 0;
|
|
506
506
|
let extensionDisconnectCleanupTimer = null;
|
|
507
507
|
const extensionReconnectWaiters = /* @__PURE__ */ new Set();
|
|
@@ -553,7 +553,7 @@ async function ensureChromeExtensionRelayServer(opts) {
|
|
|
553
553
|
let nextExtensionId = 1;
|
|
554
554
|
const sendToExtension = async (payload) => {
|
|
555
555
|
const ws = extensionWs;
|
|
556
|
-
if (!ws || ws.readyState !== WebSocket
|
|
556
|
+
if (!ws || ws.readyState !== WebSocket.OPEN) throw new Error("Chrome extension not connected");
|
|
557
557
|
ws.send(JSON.stringify(payload));
|
|
558
558
|
return await new Promise((resolve, reject) => {
|
|
559
559
|
const timer = setTimeout(() => {
|
|
@@ -570,12 +570,12 @@ async function ensureChromeExtensionRelayServer(opts) {
|
|
|
570
570
|
const broadcastToCdpClients = (evt) => {
|
|
571
571
|
const msg = JSON.stringify(evt);
|
|
572
572
|
for (const ws of cdpClients) {
|
|
573
|
-
if (ws.readyState !== WebSocket
|
|
573
|
+
if (ws.readyState !== WebSocket.OPEN) continue;
|
|
574
574
|
ws.send(msg);
|
|
575
575
|
}
|
|
576
576
|
};
|
|
577
577
|
const sendResponseToCdp = (ws, res) => {
|
|
578
|
-
if (ws.readyState !== WebSocket
|
|
578
|
+
if (ws.readyState !== WebSocket.OPEN) return;
|
|
579
579
|
ws.send(JSON.stringify(res));
|
|
580
580
|
};
|
|
581
581
|
const dropConnectedTargetSession = (sessionId) => {
|
|
@@ -829,7 +829,7 @@ async function ensureChromeExtensionRelayServer(opts) {
|
|
|
829
829
|
rejectUpgrade(socket, 401, "Unauthorized");
|
|
830
830
|
return;
|
|
831
831
|
}
|
|
832
|
-
if (extensionWs && extensionWs.readyState !== WebSocket
|
|
832
|
+
if (extensionWs && extensionWs.readyState !== WebSocket.OPEN) {
|
|
833
833
|
try {
|
|
834
834
|
extensionWs.terminate();
|
|
835
835
|
} catch {}
|
|
@@ -862,7 +862,7 @@ async function ensureChromeExtensionRelayServer(opts) {
|
|
|
862
862
|
clearExtensionDisconnectCleanupTimer();
|
|
863
863
|
flushExtensionReconnectWaiters(true);
|
|
864
864
|
const ping = setInterval(() => {
|
|
865
|
-
if (ws.readyState !== WebSocket
|
|
865
|
+
if (ws.readyState !== WebSocket.OPEN) return;
|
|
866
866
|
ws.send(JSON.stringify({ method: "ping" }));
|
|
867
867
|
}, 5e3);
|
|
868
868
|
ws.on("message", (data) => {
|
|
@@ -1218,7 +1218,7 @@ function openCdpWebSocket(wsUrl, opts) {
|
|
|
1218
1218
|
const headers = getHeadersWithAuth(wsUrl, opts?.headers ?? {});
|
|
1219
1219
|
const handshakeTimeoutMs = typeof opts?.handshakeTimeoutMs === "number" && Number.isFinite(opts.handshakeTimeoutMs) ? Math.max(1, Math.floor(opts.handshakeTimeoutMs)) : CDP_WS_HANDSHAKE_TIMEOUT_MS;
|
|
1220
1220
|
const agent = getDirectAgentForCdp(wsUrl);
|
|
1221
|
-
return new WebSocket
|
|
1221
|
+
return new WebSocket(wsUrl, {
|
|
1222
1222
|
handshakeTimeout: handshakeTimeoutMs,
|
|
1223
1223
|
...Object.keys(headers).length ? { headers } : {},
|
|
1224
1224
|
...agent ? { agent } : {}
|
|
@@ -1503,7 +1503,7 @@ const CHROMIUM_EXE_NAMES = new Set([
|
|
|
1503
1503
|
]);
|
|
1504
1504
|
function exists$1(filePath) {
|
|
1505
1505
|
try {
|
|
1506
|
-
return
|
|
1506
|
+
return syncFs.existsSync(filePath);
|
|
1507
1507
|
} catch {
|
|
1508
1508
|
return false;
|
|
1509
1509
|
}
|
|
@@ -1646,7 +1646,7 @@ function findDesktopFilePath(desktopId) {
|
|
|
1646
1646
|
}
|
|
1647
1647
|
function readDesktopExecLine(desktopPath) {
|
|
1648
1648
|
try {
|
|
1649
|
-
const lines =
|
|
1649
|
+
const lines = syncFs.readFileSync(desktopPath, "utf8").split(/\r?\n/);
|
|
1650
1650
|
for (const line of lines) if (line.startsWith("Exec=")) return line.slice(5).trim();
|
|
1651
1651
|
} catch {}
|
|
1652
1652
|
return null;
|
|
@@ -1904,7 +1904,7 @@ function resolveBrowserExecutableForPlatform(resolved, platform) {
|
|
|
1904
1904
|
const LSOF_CANDIDATES = process.platform === "darwin" ? ["/usr/sbin/lsof", "/usr/bin/lsof"] : ["/usr/bin/lsof", "/usr/sbin/lsof"];
|
|
1905
1905
|
function resolveLsofCommandSync() {
|
|
1906
1906
|
for (const candidate of LSOF_CANDIDATES) try {
|
|
1907
|
-
|
|
1907
|
+
syncFs.accessSync(candidate, syncFs.constants.X_OK);
|
|
1908
1908
|
return candidate;
|
|
1909
1909
|
} catch {}
|
|
1910
1910
|
return "lsof";
|
|
@@ -1949,8 +1949,8 @@ function decoratedMarkerPath(userDataDir) {
|
|
|
1949
1949
|
}
|
|
1950
1950
|
function safeReadJson(filePath) {
|
|
1951
1951
|
try {
|
|
1952
|
-
if (!
|
|
1953
|
-
const raw =
|
|
1952
|
+
if (!syncFs.existsSync(filePath)) return null;
|
|
1953
|
+
const raw = syncFs.readFileSync(filePath, "utf-8");
|
|
1954
1954
|
const parsed = JSON.parse(raw);
|
|
1955
1955
|
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return null;
|
|
1956
1956
|
return parsed;
|
|
@@ -1959,8 +1959,8 @@ function safeReadJson(filePath) {
|
|
|
1959
1959
|
}
|
|
1960
1960
|
}
|
|
1961
1961
|
function safeWriteJson(filePath, data) {
|
|
1962
|
-
|
|
1963
|
-
|
|
1962
|
+
syncFs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
1963
|
+
syncFs.writeFileSync(filePath, JSON.stringify(data, null, 2));
|
|
1964
1964
|
}
|
|
1965
1965
|
function setDeep(obj, keys, value) {
|
|
1966
1966
|
let node = obj;
|
|
@@ -2087,7 +2087,7 @@ function decorateOpenClawProfile(userDataDir, opts) {
|
|
|
2087
2087
|
}
|
|
2088
2088
|
safeWriteJson(preferencesPath, prefs);
|
|
2089
2089
|
try {
|
|
2090
|
-
|
|
2090
|
+
syncFs.writeFileSync(decoratedMarkerPath(userDataDir), `${Date.now()}\n`, "utf-8");
|
|
2091
2091
|
} catch {}
|
|
2092
2092
|
}
|
|
2093
2093
|
function ensureProfileCleanExit(userDataDir) {
|
|
@@ -2103,7 +2103,7 @@ function ensureProfileCleanExit(userDataDir) {
|
|
|
2103
2103
|
const log = createSubsystemLogger("browser").child("chrome");
|
|
2104
2104
|
function exists(filePath) {
|
|
2105
2105
|
try {
|
|
2106
|
-
return
|
|
2106
|
+
return syncFs.existsSync(filePath);
|
|
2107
2107
|
} catch {
|
|
2108
2108
|
return false;
|
|
2109
2109
|
}
|
|
@@ -2201,7 +2201,7 @@ async function launchOpenClawChrome(resolved, profile) {
|
|
|
2201
2201
|
const exe = resolveBrowserExecutable(resolved);
|
|
2202
2202
|
if (!exe) throw new Error("No supported browser found (Chrome/Brave/Edge/Chromium on macOS, Linux, or Windows).");
|
|
2203
2203
|
const userDataDir = resolveOpenClawUserDataDir(profile.name);
|
|
2204
|
-
|
|
2204
|
+
syncFs.mkdirSync(userDataDir, { recursive: true });
|
|
2205
2205
|
const needsDecorate = !isProfileDecorated(userDataDir, profile.name, (profile.color ?? DEFAULT_OPENCLAW_BROWSER_COLOR).toUpperCase());
|
|
2206
2206
|
const spawnOnce = () => {
|
|
2207
2207
|
const args = [
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { V as loadConfig } from "./model-selection-
|
|
1
|
+
import { V as loadConfig } from "./model-selection-CYS--Nqz.js";
|
|
2
2
|
import { H as isPathInside, V as isNotFoundPathError, Z as CONFIG_DIR, mt as resolvePreferredOpenClawTmpDir, t as createSubsystemLogger } from "./subsystem-DynBFcQj.js";
|
|
3
|
-
import { n as isLoopbackAddress, r as isLoopbackHost, t as rawDataToString } from "./ws-
|
|
4
|
-
import { i as openFileWithinRoot, t as SafeOpenError } from "./fs-safe-
|
|
3
|
+
import { n as isLoopbackAddress, r as isLoopbackHost, t as rawDataToString } from "./ws-Dt2EocLN.js";
|
|
4
|
+
import { i as openFileWithinRoot, t as SafeOpenError } from "./fs-safe-Bd1xxVwv.js";
|
|
5
5
|
import { a as isErrno } from "./errors-yyPKpoXR.js";
|
|
6
|
-
import { c as resolvePinnedHostnameWithPolicy, s as isPrivateNetworkAllowedByPolicy, t as hasProxyEnvConfigured } from "./proxy-env-
|
|
6
|
+
import { c as resolvePinnedHostnameWithPolicy, s as isPrivateNetworkAllowedByPolicy, t as hasProxyEnvConfigured } from "./proxy-env-DPCNy_X3.js";
|
|
7
7
|
import path from "node:path";
|
|
8
8
|
import syncFs from "node:fs";
|
|
9
9
|
import os from "node:os";
|
|
@@ -13,7 +13,7 @@ import { createHmac } from "node:crypto";
|
|
|
13
13
|
import net from "node:net";
|
|
14
14
|
import http, { createServer } from "node:http";
|
|
15
15
|
import https from "node:https";
|
|
16
|
-
import WebSocket
|
|
16
|
+
import WebSocket, { WebSocketServer } from "ws";
|
|
17
17
|
|
|
18
18
|
//#region src/browser/constants.ts
|
|
19
19
|
const DEFAULT_OPENCLAW_BROWSER_ENABLED = true;
|
|
@@ -501,7 +501,7 @@ async function ensureChromeExtensionRelayServer(opts) {
|
|
|
501
501
|
let extensionWs = null;
|
|
502
502
|
const cdpClients = /* @__PURE__ */ new Set();
|
|
503
503
|
const connectedTargets = /* @__PURE__ */ new Map();
|
|
504
|
-
const extensionConnected = () => extensionWs?.readyState === WebSocket
|
|
504
|
+
const extensionConnected = () => extensionWs?.readyState === WebSocket.OPEN;
|
|
505
505
|
const hasConnectedTargets = () => connectedTargets.size > 0;
|
|
506
506
|
let extensionDisconnectCleanupTimer = null;
|
|
507
507
|
const extensionReconnectWaiters = /* @__PURE__ */ new Set();
|
|
@@ -553,7 +553,7 @@ async function ensureChromeExtensionRelayServer(opts) {
|
|
|
553
553
|
let nextExtensionId = 1;
|
|
554
554
|
const sendToExtension = async (payload) => {
|
|
555
555
|
const ws = extensionWs;
|
|
556
|
-
if (!ws || ws.readyState !== WebSocket
|
|
556
|
+
if (!ws || ws.readyState !== WebSocket.OPEN) throw new Error("Chrome extension not connected");
|
|
557
557
|
ws.send(JSON.stringify(payload));
|
|
558
558
|
return await new Promise((resolve, reject) => {
|
|
559
559
|
const timer = setTimeout(() => {
|
|
@@ -570,12 +570,12 @@ async function ensureChromeExtensionRelayServer(opts) {
|
|
|
570
570
|
const broadcastToCdpClients = (evt) => {
|
|
571
571
|
const msg = JSON.stringify(evt);
|
|
572
572
|
for (const ws of cdpClients) {
|
|
573
|
-
if (ws.readyState !== WebSocket
|
|
573
|
+
if (ws.readyState !== WebSocket.OPEN) continue;
|
|
574
574
|
ws.send(msg);
|
|
575
575
|
}
|
|
576
576
|
};
|
|
577
577
|
const sendResponseToCdp = (ws, res) => {
|
|
578
|
-
if (ws.readyState !== WebSocket
|
|
578
|
+
if (ws.readyState !== WebSocket.OPEN) return;
|
|
579
579
|
ws.send(JSON.stringify(res));
|
|
580
580
|
};
|
|
581
581
|
const dropConnectedTargetSession = (sessionId) => {
|
|
@@ -829,7 +829,7 @@ async function ensureChromeExtensionRelayServer(opts) {
|
|
|
829
829
|
rejectUpgrade(socket, 401, "Unauthorized");
|
|
830
830
|
return;
|
|
831
831
|
}
|
|
832
|
-
if (extensionWs && extensionWs.readyState !== WebSocket
|
|
832
|
+
if (extensionWs && extensionWs.readyState !== WebSocket.OPEN) {
|
|
833
833
|
try {
|
|
834
834
|
extensionWs.terminate();
|
|
835
835
|
} catch {}
|
|
@@ -862,7 +862,7 @@ async function ensureChromeExtensionRelayServer(opts) {
|
|
|
862
862
|
clearExtensionDisconnectCleanupTimer();
|
|
863
863
|
flushExtensionReconnectWaiters(true);
|
|
864
864
|
const ping = setInterval(() => {
|
|
865
|
-
if (ws.readyState !== WebSocket
|
|
865
|
+
if (ws.readyState !== WebSocket.OPEN) return;
|
|
866
866
|
ws.send(JSON.stringify({ method: "ping" }));
|
|
867
867
|
}, 5e3);
|
|
868
868
|
ws.on("message", (data) => {
|
|
@@ -1218,7 +1218,7 @@ function openCdpWebSocket(wsUrl, opts) {
|
|
|
1218
1218
|
const headers = getHeadersWithAuth(wsUrl, opts?.headers ?? {});
|
|
1219
1219
|
const handshakeTimeoutMs = typeof opts?.handshakeTimeoutMs === "number" && Number.isFinite(opts.handshakeTimeoutMs) ? Math.max(1, Math.floor(opts.handshakeTimeoutMs)) : CDP_WS_HANDSHAKE_TIMEOUT_MS;
|
|
1220
1220
|
const agent = getDirectAgentForCdp(wsUrl);
|
|
1221
|
-
return new WebSocket
|
|
1221
|
+
return new WebSocket(wsUrl, {
|
|
1222
1222
|
handshakeTimeout: handshakeTimeoutMs,
|
|
1223
1223
|
...Object.keys(headers).length ? { headers } : {},
|
|
1224
1224
|
...agent ? { agent } : {}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
|
|
2
2
|
import { n as resolveProcessScopedMap } from "./plain-object-Doc_YkH1.js";
|
|
3
|
-
import { a as logLaneTaskCompleted, i as logLaneEnqueue, r as logLaneDequeue, t as diag } from "./diagnostic-
|
|
3
|
+
import { a as logLaneTaskCompleted, i as logLaneEnqueue, r as logLaneDequeue, t as diag } from "./diagnostic-DJ11ZJIJ.js";
|
|
4
4
|
import { t as CommandLane } from "./lanes-D1Q3LLIs.js";
|
|
5
5
|
|
|
6
6
|
//#region src/process/command-queue.ts
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
|
|
2
2
|
import { n as resolveProcessScopedMap } from "./plain-object-Doc_YkH1.js";
|
|
3
|
-
import { a as logLaneTaskCompleted, i as logLaneEnqueue, r as logLaneDequeue, t as diag } from "./diagnostic-
|
|
3
|
+
import { a as logLaneTaskCompleted, i as logLaneEnqueue, r as logLaneDequeue, t as diag } from "./diagnostic-C4pLNG6a.js";
|
|
4
4
|
import { t as CommandLane } from "./lanes-DWpYhh13.js";
|
|
5
5
|
|
|
6
6
|
//#region src/process/command-queue.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e,c as t,h as n,i as r,l as i,s as a,t as o}from"./format-dlOOV12I.js";import{n as s,o as c,t as l}from"./links-C1sAzVEH.js";import{t as u}from"./Button-DL76WqX4.js";import{t as d}from"./Dialog-rIrrCPSu.js";import{r as f}from"./config-store-27hOx1yp.js";import{n as p,t as m}from"./use-gateway-query-CF94JYnM.js";import{t as h}from"./Badge-4n2tRQ02.js";import{t as g}from"./Panel-CyfpswdJ.js";import{t as _}from"./EntityLink-AEBgCNQX.js";import{t as v}from"./Stat-BruDi6qc.js";import{a as y,i as b,n as x,r as S}from"./skills-model-DANiC-ui.js";var C=e(n(),1),w=t();function T({src:e,emoji:t,label:n,large:r=!1,testId:i}){let[a,o]=(0,C.useState)(!1),[s,c]=(0,C.useState)(e);e!==s&&(c(e),o(!1));let l=[`ct-agents__avatar`,r?`ct-agents__avatar--lg`:null].filter(Boolean).join(` `);return e&&!a?(0,w.jsx)(`img`,{className:l,src:e,alt:``,"data-testid":i?`${i}-img`:void 0,onError:()=>o(!0)}):(0,w.jsx)(`span`,{className:l,"data-testid":i?`${i}-fallback`:void 0,"aria-hidden":`true`,children:t||n.slice(0,1).toUpperCase()})}function E(e){if(!e)return`-`;if(typeof e==`string`)return e.trim()||`-`;let t=P(e);if(!t)return`-`;let n=typeof t.primary==`string`?t.primary.trim():``;if(!n)return`-`;let r=Array.isArray(t.fallbacks)?t.fallbacks.length:0;return r>0?`${n} (+${r} fallback)`:n}function D(e){let t=e.match(/^(.+) \(\+\d+ fallback\)$/);return t?t[1]:e}function O(e){if(!e)return null;if(typeof e==`string`)return e.trim()||null;let t=P(e);return t&&(typeof t.primary==`string`?t.primary:typeof t.model==`string`?t.model:typeof t.id==`string`?t.id:typeof t.value==`string`?t.value:null)?.trim()||null}function k(e){let t=P(e);if(!t)return null;let n=Array.isArray(t.fallbacks)?t.fallbacks:Array.isArray(t.fallback)?t.fallback:null;return n?n.filter(e=>typeof e==`string`):null}function A(e,t){return k(e)??k(t)}function j(e){return e.split(`,`).map(e=>e.trim()).filter(Boolean)}function M(e,t){let n=(e||null)?.agents?.defaults?.models,r=[];if(n&&typeof n==`object`)for(let[e,t]of Object.entries(n)){let n=e.trim();if(!n)continue;let i=t?.alias?.trim(),a=i&&i!==n?`${i} (${n})`:n;r.push({value:n,label:a})}let i=t?r.some(e=>e.value===t):!1;return t&&!i&&r.unshift({value:t,label:`Current (${t})`}),r.length===0?[{value:``,label:`No configured models`,disabled:!0}]:r}function N(e){let t=new Map;for(let n of e){let e=n.team?.id??null,r=e??`\0`,i=t.get(r);i||(i={teamId:e,title:e===null?null:n.team?.name??e,agents:[]},t.set(r,i)),n.team?.role===`lead`?(e!==null&&n.team?.name&&(i.title=n.team.name),i.agents.unshift(n)):i.agents.push(n)}return[...t.values()].toSorted((e,t)=>e.teamId===null?1:t.teamId===null?-1:0)}function P(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function F(e){let t=P(e);return t&&typeof t.id==`string`?t.id:null}function I(e){return e.name?.trim()||e.identity?.name?.trim()||e.id}function L(e){let t=e.trim();if(!t||t.length>16)return!1;let n=!1;for(let e=0;e<t.length;e+=1)if(t.charCodeAt(e)>127){n=!0;break}return n?!t.includes(`://`)&&!t.includes(`/`)&&!t.includes(`.`):!1}function R(e,t){let n=t?.emoji?.trim();if(n&&L(n))return n;let r=e.identity?.emoji?.trim();if(r&&L(r))return r;let i=t?.avatar?.trim();if(i&&L(i))return i;let a=e.identity?.avatar?.trim();return a&&L(a)?a:``}function z(e,t){let n=[t?.avatar,e.identity?.avatarUrl,e.identity?.avatar];for(let e of n){let t=e?.trim();if(t&&!L(t))return t}return null}function ee(e,t){return t&&e===t?`default`:null}function te(e){if(e==null||!Number.isFinite(e))return`-`;if(e<1024)return`${e} B`;let t=[`KB`,`MB`,`GB`,`TB`],n=e/1024,r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r+=1;return`${n.toFixed(+(n<10))} ${t[r]}`}function B(e,t){let n=e||null;return{entry:(n?.agents?.list??[]).find(e=>F(e)===t)??null,defaults:n?.agents?.defaults??null}}function V(e,t){let n=e?e.agents?.list:void 0;return Array.isArray(n)?n.findIndex(e=>F(e)===t):-1}function ne(e){let{agent:t,config:n,filesWorkspace:r,defaultId:i,agentIdentity:a}=e,o=B(n,t.id),s=r||o.entry?.workspace||o.defaults?.workspace||`default`,c=o.entry?.model?E(o.entry?.model):E(o.defaults?.model),l=a?.name?.trim()||t.identity?.name?.trim()||t.name?.trim()||o.entry?.name||t.id,u=R(t,a)||`-`,d=Array.isArray(o.entry?.skills)?o.entry?.skills:null,f=d?.length??null;return{workspace:s,model:c,identityName:l,identityEmoji:u,skillsLabel:d?`${f} selected`:`all skills`,isDefault:!!(i&&t.id===i)}}function re(e,t){if(!e)return null;let n=P(e.channels)?.[t];return P(n)??P(e[t])}function ie(e){if(e==null)return`n/a`;if(typeof e==`string`||typeof e==`number`||typeof e==`boolean`)return String(e);try{return JSON.stringify(e)}catch{return`n/a`}}function ae(e){let t=re(e.configForm,e.channelId);return t?e.fields.flatMap(e=>e in t?[{label:e,value:ie(t[e])}]:[]):[]}function oe(e){let t=e/6e4;if(t<60)return`${Math.round(t)}m`;let n=t/60;return n<24?`${Math.round(n*10)/10}h`:`${Math.round(n/24*10)/10}d`}function se(e){let t=e.schedule;if(t.kind===`at`){let e=Date.parse(t.at);return Number.isFinite(e)?`At ${new Date(e).toLocaleString()}`:`At ${t.at}`}return t.kind===`every`?`Every ${oe(t.everyMs)}`:`Cron ${t.expr}${t.tz?` (${t.tz})`:``}`}function ce(e){let t=e.payload;if(t.kind===`systemEvent`)return`System: ${t.text}`;if(t.kind===`wakeGate`){let e=t.gate.kind===`command`?t.gate.command:t.gate.model;return`Wake gate: ${t.gate.kind} (${e??`model`})`}return`Agent: ${t.message}`}var le=[`groupPolicy`,`streamMode`,`dmPolicy`];function ue(e,t){return e.channelMeta?.find(e=>e.id===t)?.label||e.channelLabels[t]||t}function de(e){if(!e)return[];let t=new Set;for(let n of e.channelOrder??[])t.add(n);for(let n of e.channelMeta??[])t.add(n.id);for(let n of Object.keys(e.channelAccounts??{}))t.add(n);let n=[],r=e.channelOrder?.length?e.channelOrder:Array.from(t);for(let e of r)t.has(e)&&(n.push(e),t.delete(e));for(let e of t)n.push(e);return n.map(t=>({id:t,label:ue(e,t),accounts:e.channelAccounts?.[t]??[]}))}function fe(e){let t=0,n=0,r=0;for(let i of e){let e=i.probe&&typeof i.probe==`object`&&`ok`in i.probe?!!i.probe.ok:!1;(i.connected===!0||i.running===!0||e)&&(t+=1),i.configured&&(n+=1),i.enabled&&(r+=1)}return{total:e.length,connected:t,configured:n,enabled:r}}function pe({context:e}){let t=p(`channels.status`,{probe:!1},{refreshMs:m}),n=he(),i=de(t.data),o=t.data?.ts??null;return(0,w.jsxs)(`div`,{"data-testid":`agent-channels`,children:[(0,w.jsx)(me,{context:e,subtitle:`Workspace, identity, and model configuration.`}),(0,w.jsxs)(`div`,{className:`ct-agents__panel-head`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Channels`}),(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,children:`Gateway-wide channel status snapshot.`}),(0,w.jsxs)(`p`,{className:`ct-agents__panel-sub`,children:[`Last refresh: `,o?r(o):`never`]})]}),(0,w.jsx)(u,{size:`sm`,disabled:t.loading,onClick:t.reload,children:t.loading?`Refreshing…`:`Refresh`})]}),t.error?(0,w.jsx)(a,{tone:`error`,message:t.error}):null,t.loading&&!t.data?(0,w.jsx)(a,{tone:`loading`,message:`Loading channels…`}):null,t.data&&i.length===0?(0,w.jsx)(a,{message:`No channels found.`}):null,(0,w.jsx)(`div`,{className:`ct-agents__channel-list`,children:i.map(e=>{let t=fe(e.accounts),r=t.total?`${t.connected}/${t.total} connected`:`no accounts`,i=t.configured?`${t.configured} configured`:`not configured`,a=t.total?`${t.enabled} enabled`:`disabled`,o=ae({configForm:n,channelId:e.id,fields:le});return(0,w.jsxs)(`div`,{className:`ct-agents__channel-row`,"data-testid":`agent-channel-${e.id}`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`div`,{className:`ct-agents__channel-label`,children:e.label}),(0,w.jsx)(`div`,{className:`ct-agents__channel-id ct-mono`,children:e.id})]}),(0,w.jsxs)(`div`,{className:`ct-agents__channel-meta`,children:[(0,w.jsx)(`span`,{children:r}),(0,w.jsx)(`span`,{children:i}),(0,w.jsx)(`span`,{children:a}),o.map(e=>(0,w.jsxs)(`span`,{children:[e.label,`: `,e.value]},e.label))]})]},e.id)})})]})}function me({context:e,subtitle:t}){let n=[[`Workspace`,e.workspace],[`Primary model`,e.model],[`Identity name`,e.identityName],[`Identity emoji`,e.identityEmoji],[`Skills filter`,e.skillsLabel],[`Default`,e.isDefault?`yes`:`no`]];return(0,w.jsxs)(`div`,{className:`ct-agents__context-card`,"data-testid":`agent-context-card`,children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Agent context`}),(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,children:t}),(0,w.jsx)(`div`,{className:`ct-agents__kv-grid`,children:n.map(([e,t])=>(0,w.jsxs)(`div`,{className:`ct-agents__kv`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:e}),(0,w.jsx)(`span`,{className:`ct-agents__kv-value`,children:t})]},e))})]})}function he(){let e=f(e=>e.draft),t=f(e=>e.snapshot?.config??null);return e??t}var ge={includeDisabled:!0,limit:200,offset:0,sortBy:`nextRunAtMs`,sortDir:`asc`},_e=50;function ve(e){let t=i(e=>e.request),[n,r]=(0,C.useState)({jobs:[],loading:!1,error:null});return(0,C.useEffect)(()=>{if(!e||e.hasMore!==!0){r(e=>e.jobs.length===0&&!e.loading&&e.error===null?e:{jobs:[],loading:!1,error:null});return}let n=!1;return r(e=>({jobs:e.jobs,loading:!0,error:null})),(async()=>{let i=[],a=e.nextOffset??200;for(let e=0;e<_e;e+=1)try{let e=await t(`cron.list`,{...ge,offset:a});if(n)return;let r=e.jobs??[];if(i.push(...r),e.hasMore!==!0||r.length===0)break;a=e.nextOffset??a+r.length}catch(e){n||r({jobs:i,loading:!1,error:o(e)});return}n||r({jobs:i,loading:!1,error:null})})(),()=>{n=!0}},[e,t]),n}function ye({agentId:e,context:t}){let n=p(`cron.status`,{},{refreshMs:m}),i=p(`cron.list`,ge,{refreshMs:m}),o=ve(i.data),c=(0,C.useMemo)(()=>[...i.data?.jobs??[],...o.jobs].filter(t=>t.agentId===e),[i.data,o.jobs,e]),d=i.error??o.error;return(0,w.jsxs)(`div`,{"data-testid":`agent-cron`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__cron-top`,children:[(0,w.jsx)(me,{context:t,subtitle:`Workspace and scheduling targets.`}),(0,w.jsxs)(`div`,{className:`ct-agents__context-card`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__panel-head`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Scheduler`}),(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,children:`Gateway cron status.`})]}),(0,w.jsx)(u,{size:`sm`,disabled:n.loading,onClick:()=>{n.reload(),i.reload()},children:`Refresh`})]}),(0,w.jsxs)(`div`,{className:`ct-agents__stats`,children:[(0,w.jsx)(v,{label:`Enabled`,value:n.data?n.data.enabled?`Yes`:`No`:`n/a`}),(0,w.jsx)(v,{label:`Jobs`,value:n.data?.jobs??`n/a`}),(0,w.jsx)(v,{label:`Next wake`,value:r(n.data?.nextWakeAtMs??null)})]}),n.error?(0,w.jsx)(a,{tone:`error`,message:n.error}):null]})]}),(0,w.jsx)(`div`,{className:`ct-agents__panel-head`,children:(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Agent cron jobs`}),(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,children:`Scheduled jobs targeting this agent.`})]})}),d?(0,w.jsx)(a,{tone:`error`,message:d}):null,i.loading&&!i.data?(0,w.jsx)(a,{tone:`loading`,message:`Loading jobs…`}):null,i.data&&!o.loading&&c.length===0?(0,w.jsx)(a,{message:`No jobs assigned.`}):null,(0,w.jsx)(`div`,{className:`ct-agents__cron-list`,children:c.map(e=>(0,w.jsxs)(`div`,{className:`ct-agents__cron-row`,"data-testid":`agent-cron-job-${e.id}`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__cron-main`,children:[(0,w.jsx)(`span`,{className:`ct-agents__channel-label`,children:e.name}),e.description?(0,w.jsx)(`span`,{className:`ct-agents__panel-sub`,children:e.description}):null,(0,w.jsxs)(`span`,{className:`ct-agents__chip-row`,children:[(0,w.jsx)(h,{children:se(e)}),(0,w.jsx)(h,{tone:e.enabled?`ok`:`warn`,children:e.enabled?`enabled`:`disabled`}),(0,w.jsx)(h,{children:e.sessionTarget})]})]}),(0,w.jsxs)(`div`,{className:`ct-agents__cron-meta`,children:[(0,w.jsxs)(`span`,{className:`ct-agents__panel-sub`,children:[`Last `,r(e.state?.lastRunAtMs),` · Next`,` `,r(e.state?.nextRunAtMs)]}),(0,w.jsx)(`span`,{className:`ct-agents__panel-sub`,children:ce(e)}),(0,w.jsx)(u,{size:`sm`,"data-testid":`agent-cron-open-${e.id}`,onClick:()=>l(s.automation(e.id)),children:`Open in Automations`})]})]},e.id))})]})}function be({agentId:e}){let t=i(e=>e.request),n=p(`agents.files.list`,{agentId:e}),[r,s]=(0,C.useState)({}),[c,l]=(0,C.useState)({}),[d,f]=(0,C.useState)(null),[m,h]=(0,C.useState)(!1),[g,_]=(0,C.useState)(null),v=(0,C.useRef)({}),y=n.data?.agentId===e?n.data.files??[]:[],b=d?y.find(e=>e.name===d)??null:null,x=d?r[d]??``:``,S=d?Object.hasOwn(r,d):!1,T=d?c[d]??x:``,E=d?T!==x:!1,D=(e,t)=>{v.current={...v.current,[e]:t},s(v.current)};(0,C.useEffect)(()=>{d&&y.length>0&&!y.some(e=>e.name===d)&&f(null)},[d,y]),(0,C.useEffect)(()=>{if(!d||Object.hasOwn(v.current,d))return;let n=!1,r=d;return t(`agents.files.get`,{agentId:e,name:r}).then(e=>{n||!e?.file||(D(r,e.file.content??``),l(t=>({...t,[r]:e.file.content??``})))}).catch(e=>{n||_(o(e))}),()=>{n=!0}},[d,e,t]);let O=async()=>{if(!d||!E||m)return;let i=d,a=c[i]??r[i]??``;h(!0),_(null);try{(await t(`agents.files.set`,{agentId:e,name:i,content:a}))?.file&&(D(i,a),l(e=>({...e,[i]:a})),n.reload())}catch(e){_(o(e))}finally{h(!1)}};return(0,w.jsxs)(`div`,{"data-testid":`agent-files`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__panel-head`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Core files`}),(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,children:`Bootstrap persona, identity, and tool guidance.`}),n.data?.agentId===e?(0,w.jsxs)(`p`,{className:`ct-agents__panel-sub ct-mono`,children:[`Workspace: `,n.data.workspace]}):null]}),(0,w.jsx)(u,{size:`sm`,disabled:n.loading,"data-testid":`agent-files-refresh`,onClick:n.reload,children:n.loading?`Loading…`:`Refresh`})]}),n.error?(0,w.jsx)(a,{tone:`error`,message:n.error}):null,n.loading&&!n.data?(0,w.jsx)(a,{tone:`loading`,message:`Loading files…`}):null,g?(0,w.jsx)(`div`,{role:`alert`,className:`ct-agents__callout ct-agents__callout--danger`,"data-testid":`agent-files-error`,children:g}):null,n.data?y.length===0?(0,w.jsx)(a,{message:`No files found.`}):(0,w.jsxs)(`div`,{className:`ct-agents__files-grid`,children:[(0,w.jsx)(`div`,{className:`ct-agents__files-list`,"data-testid":`agent-files-list`,children:y.map(e=>(0,w.jsx)(xe,{file:e,active:d===e.name,onSelect:()=>f(e.name)},e.name))}),(0,w.jsx)(`div`,{className:`ct-agents__files-editor`,children:b?(0,w.jsxs)(w.Fragment,{children:[(0,w.jsxs)(`div`,{className:`ct-agents__file-head`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`div`,{className:`ct-agents__file-name ct-mono`,children:b.name}),(0,w.jsx)(`div`,{className:`ct-agents__file-path ct-mono`,children:b.path})]}),(0,w.jsxs)(`div`,{className:`ct-agents__file-actions`,children:[(0,w.jsx)(u,{size:`sm`,disabled:!E,"data-testid":`agent-file-reset`,onClick:()=>l(e=>({...e,[b.name]:x})),children:`Reset`}),(0,w.jsx)(u,{size:`sm`,variant:`primary`,disabled:m||!E,"data-testid":`agent-file-save`,onClick:()=>void O(),children:m?`Saving…`:`Save`})]})]}),b.missing?(0,w.jsx)(`div`,{className:`ct-agents__callout`,children:`This file is missing. Saving will create it in the agent workspace.`}):null,(0,w.jsxs)(`label`,{className:`ct-agents__field`,children:[(0,w.jsx)(`span`,{children:`Content`}),(0,w.jsx)(`textarea`,{"data-testid":`agent-file-editor`,rows:16,value:T,disabled:!S,placeholder:S?void 0:`Loading…`,onChange:e=>l(t=>({...t,[b.name]:e.target.value}))})]})]}):(0,w.jsx)(a,{message:`Select a file to edit.`})})]}):null]})}function xe({file:e,active:t,onSelect:n}){let i=e.missing?`Missing`:`${te(e.size)} · ${r(e.updatedAtMs??null)}`;return(0,w.jsxs)(`button`,{type:`button`,className:`ct-agents__file-row${t?` ct-agents__file-row--active`:``}`,"data-testid":`agent-file-${e.name}`,onClick:n,children:[(0,w.jsxs)(`span`,{className:`ct-agents__file-row-main`,children:[(0,w.jsx)(`span`,{className:`ct-agents__file-row-name ct-mono`,children:e.name}),(0,w.jsx)(`span`,{className:`ct-agents__file-row-meta`,children:i})]}),e.missing?(0,w.jsx)(`span`,{className:`ct-agents__pill ct-agents__pill--warn`,children:`missing`}):null]})}function H({testId:e,onBeforeSave:t}){let n=f(e=>e.dirty),r=f(e=>e.busy),i=f(e=>e.error),a=f(e=>e.snapshot!==null),o=async()=>{t?.(),await f.getState().save(`set`)};return(0,w.jsxs)(`div`,{className:`ct-agents__config-actions`,children:[i?(0,w.jsxs)(`div`,{className:`ct-agents__config-error`,role:`alert`,"data-testid":`${e}-error`,children:[(0,w.jsx)(`span`,{children:i}),(0,w.jsx)(u,{size:`sm`,"data-testid":`${e}-error-reload`,onClick:()=>void f.getState().load(),children:`Reload from gateway`})]}):null,(0,w.jsxs)(`div`,{className:`ct-agents__config-buttons`,children:[(0,w.jsx)(`span`,{className:`ct-agents__config-state`,"data-testid":`${e}-state`,children:a?n?`unsaved`:`saved`:`Config not loaded`}),(0,w.jsx)(u,{size:`sm`,disabled:r,"data-testid":`${e}-reload`,onClick:()=>void f.getState().load(),children:`Reload Config`}),(0,w.jsx)(u,{size:`sm`,variant:`primary`,disabled:r||!n,"data-testid":`${e}-save`,onClick:()=>void o(),children:r?`Saving…`:`Save`})]})]})}function Se(e){return e&&typeof e==`object`&&!Array.isArray(e)?`primary`in e&&typeof e.primary==`string`&&e.primary.trim()||null:typeof e==`string`&&e.trim()||null}function Ce(e,t,n,r,i){let a=V(e,t);if(a<0)return;let o=[`agents`,`list`,a,`model`];if(!n){i(o);return}let s=B(e,t).entry?.model;if(s&&typeof s==`object`&&!Array.isArray(s)){let e=k(s);r(o,{primary:n,...e?{fallbacks:e}:{}});return}r(o,n)}function we(e,t,n,r,i){let a=V(e,t);if(a<0)return;let o=[`agents`,`list`,a,`model`],s=Se(B(e,t).entry?.model);if(n.length===0){s?r(o,s):i(o);return}r(o,s?{primary:s,fallbacks:n}:{fallbacks:n})}function Te({agent:e,defaultId:t,identity:n,identityLoading:r,identityError:i}){let a=f(e=>e.draft),o=f(e=>e.snapshot?.config??null),s=f(e=>e.busy),c=f(e=>e.schema!==null),l=a??o,u=B(l,e.id),d=u.entry?.workspace||u.defaults?.workspace||`default`,p=u.entry?.model?E(u.entry.model):E(u.defaults?.model),m=E(u.defaults?.model),h=O(u.entry?.model)??(p===`-`?null:D(p))??O(u.defaults?.model)??(m===`-`?null:D(m)),g=A(u.entry?.model,u.defaults?.model),_=g?g.join(`, `):``,[v,y]=(0,C.useState)(null);(0,C.useEffect)(()=>{y(null)},[_]);let b=v??_,x=n?.name?.trim()||e.identity?.name?.trim()||e.name?.trim()||u.entry?.name||`-`,S=R(e,n)||`-`,T=Array.isArray(u.entry?.skills)?u.entry?.skills:null,k=r?`Loading…`:i?`Unavailable`:``,N=!!(t&&e.id===t),P=ne({agent:e,config:l,filesWorkspace:null,defaultId:t,agentIdentity:n}),F=!!l&&c&&!s,I=(e,t)=>f.getState().setPath(e,t),L=e=>f.getState().removePath(e),z=()=>{if(v===null||v===_){y(null);return}y(null),we(l,e.id,j(v),I,L)};return(0,w.jsxs)(`div`,{"data-testid":`agent-overview`,children:[(0,w.jsx)(`div`,{className:`ct-agents__kv-grid`,children:[[`Workspace`,d],[`Primary model`,p],[`Identity name`,x,k||void 0],[`Default`,N?`yes`:`no`],[`Identity emoji`,S],[`Skills filter`,T?`${T.length} selected`:`all skills`]].map(([e,t,n])=>(0,w.jsxs)(`div`,{className:`ct-agents__kv`,"data-testid":`agent-kv-${e.toLowerCase().replace(/\s+/g,`-`)}`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:e}),(0,w.jsx)(`span`,{className:e===`Workspace`?`ct-agents__kv-value ct-mono`:`ct-agents__kv-value`,children:t}),n?(0,w.jsx)(`span`,{className:`ct-agents__kv-note`,children:n}):null]},e))}),(0,w.jsxs)(`div`,{className:`ct-agents__model-edit`,"data-testid":`agent-model-edit`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Model selection`}),(0,w.jsxs)(`div`,{className:`ct-agents__model-fields`,children:[(0,w.jsxs)(`label`,{className:`ct-agents__field`,children:[(0,w.jsxs)(`span`,{children:[`Primary model`,N?` (default)`:``]}),(0,w.jsxs)(`select`,{"data-testid":`agent-model-select`,value:h??``,disabled:!F,onChange:t=>Ce(l,e.id,t.target.value||null,I,L),children:[N?null:(0,w.jsx)(`option`,{value:``,children:m===`-`?`Inherit default`:`Inherit default (${m})`}),M(l,h).map(e=>(0,w.jsx)(`option`,{value:e.value,disabled:e.disabled,children:e.label},e.value))]})]}),(0,w.jsxs)(`label`,{className:`ct-agents__field`,children:[(0,w.jsx)(`span`,{children:`Fallbacks (comma-separated)`}),(0,w.jsx)(`input`,{"data-testid":`agent-fallbacks-input`,value:b,disabled:!F,placeholder:`provider/model, provider/model`,onChange:e=>y(e.target.value),onBlur:z})]})]}),(0,w.jsx)(H,{testId:`agent-config`,onBeforeSave:z})]}),(0,w.jsxs)(`p`,{className:`ct-agents__hint`,children:[`Routing context: `,P.model===`-`?`model unset`:P.model,`,`,` `,P.skillsLabel,`.`]})]})}var Ee=[{id:`fs`,label:`Files`},{id:`runtime`,label:`Runtime`},{id:`web`,label:`Web`},{id:`memory`,label:`Memory`},{id:`sessions`,label:`Sessions`},{id:`ui`,label:`UI`},{id:`messaging`,label:`Messaging`},{id:`automation`,label:`Automation`},{id:`nodes`,label:`Nodes`},{id:`agents`,label:`Agents`},{id:`media`,label:`Media`}],U=[{id:`read`,label:`read`,description:`Read file contents`,sectionId:`fs`,profiles:[`coding`]},{id:`write`,label:`write`,description:`Create or overwrite files`,sectionId:`fs`,profiles:[`coding`]},{id:`edit`,label:`edit`,description:`Make precise edits`,sectionId:`fs`,profiles:[`coding`]},{id:`delete`,label:`delete`,description:`Delete a workspace file`,sectionId:`fs`,profiles:[`coding`]},{id:`apply_patch`,label:`apply_patch`,description:`Patch files (OpenAI)`,sectionId:`fs`,profiles:[`coding`]},{id:`exec`,label:`exec`,description:`Run shell commands`,sectionId:`runtime`,profiles:[`coding`]},{id:`process`,label:`process`,description:`Manage background processes`,sectionId:`runtime`,profiles:[`coding`]},{id:`web_search`,label:`web_search`,description:`Search the web`,sectionId:`web`,profiles:[],includeInOpenClawGroup:!0},{id:`web_fetch`,label:`web_fetch`,description:`Fetch web content`,sectionId:`web`,profiles:[],includeInOpenClawGroup:!0},{id:`memory_search`,label:`memory_search`,description:`Semantic search`,sectionId:`memory`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`memory_get`,label:`memory_get`,description:`Read memory files`,sectionId:`memory`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`sessions_list`,label:`sessions_list`,description:`List sessions`,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`sessions_history`,label:`sessions_history`,description:`Session history`,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`sessions_send`,label:`sessions_send`,description:`Send to session`,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`agents_nudge`,label:`agents_nudge`,description:`Wake another agent`,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`sessions_spawn`,label:`sessions_spawn`,description:`Spawn sub-agent`,sectionId:`sessions`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`subagents`,label:`subagents`,description:`Manage sub-agents`,sectionId:`sessions`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`session_status`,label:`session_status`,description:`Session status`,sectionId:`sessions`,profiles:[`minimal`,`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`browser`,label:`browser`,description:`Control web browser`,sectionId:`ui`,profiles:[],includeInOpenClawGroup:!0},{id:`canvas`,label:`canvas`,description:`Control canvases`,sectionId:`ui`,profiles:[],includeInOpenClawGroup:!0},{id:`message`,label:`message`,description:`Send messages`,sectionId:`messaging`,profiles:[`messaging`],includeInOpenClawGroup:!0},{id:`cron`,label:`cron`,description:`Schedule tasks`,sectionId:`automation`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`gateway`,label:`gateway`,description:`Gateway control`,sectionId:`automation`,profiles:[],includeInOpenClawGroup:!0},{id:`nodes`,label:`nodes`,description:`Nodes + devices`,sectionId:`nodes`,profiles:[],includeInOpenClawGroup:!0},{id:`agents_list`,label:`agents_list`,description:`List agents`,sectionId:`agents`,profiles:[],includeInOpenClawGroup:!0},{id:`image`,label:`image`,description:`Image understanding`,sectionId:`media`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`tts`,label:`tts`,description:`Text-to-speech conversion`,sectionId:`media`,profiles:[],includeInOpenClawGroup:!0}];new Map(U.map(e=>[e.id,e]));function W(e){return U.filter(t=>t.profiles.includes(e)).map(e=>e.id)}var De={minimal:{allow:W(`minimal`)},coding:{allow:W(`coding`)},messaging:{allow:W(`messaging`)},full:{}};function Oe(){let e=new Map;for(let t of U){let n=`group:${t.sectionId}`,r=e.get(n)??[];r.push(t.id),e.set(n,r)}return{"group:openclaw":U.filter(e=>e.includeInOpenClawGroup).map(e=>e.id),...Object.fromEntries(e.entries())}}var ke=Oe(),Ae=[{id:`minimal`,label:`Minimal`},{id:`coding`,label:`Coding`},{id:`messaging`,label:`Messaging`},{id:`full`,label:`Full`}];function je(e){if(!e)return;let t=De[e];if(t&&!(!t.allow&&!t.deny))return{allow:t.allow?[...t.allow]:void 0,deny:t.deny?[...t.deny]:void 0}}function Me(){return Ee.map(e=>({id:e.id,label:e.label,tools:U.filter(t=>t.sectionId===e.id).map(e=>({id:e.id,label:e.label,description:e.description}))})).filter(e=>e.tools.length>0)}var Ne={bash:`exec`,"apply-patch":`apply_patch`},Pe={...ke};function G(e){let t=e.trim().toLowerCase();return Ne[t]??t}function Fe(e){return e?e.map(G).filter(Boolean):[]}function Ie(e){let t=Fe(e),n=[];for(let e of t){let t=Pe[e];if(t){n.push(...t);continue}n.push(e)}return Array.from(new Set(n))}function Le(e){return je(e)}var Re=Me().map(e=>({id:e.id,label:e.label,source:`core`,tools:e.tools.map(e=>({...e,source:`core`,defaultProfiles:[]}))})),ze=Ae.map(e=>({...e}));function Be(e){return(e?e.tools:void 0)??{}}function Ve(e){let t=G(e);if(!t)return{kind:`exact`,value:``};if(t===`*`)return{kind:`all`};if(!t.includes(`*`))return{kind:`exact`,value:t};let n=t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);return{kind:`regex`,value:RegExp(`^${n.replaceAll(`\\*`,`.*`)}$`)}}function K(e){return Array.isArray(e)?Ie(e).map(Ve).filter(e=>e.kind!==`exact`||e.value.length>0):[]}function q(e,t){for(let n of t)if(n.kind===`all`||n.kind===`exact`&&e===n.value||n.kind===`regex`&&n.value.test(e))return!0;return!1}function He(e,t){if(!t)return!0;let n=G(e);if(q(n,K(t.deny)))return!1;let r=K(t.allow);return r.length===0||q(n,r)?!0:n===`apply_patch`&&q(`exec`,r)}function J(e,t){if(!Array.isArray(t)||t.length===0)return!1;let n=G(e),r=K(t);return q(n,r)?!0:n===`apply_patch`&&q(`exec`,r)}function Ue(e){return Le(e)??void 0}function Y(e,t,n){let r=He(e,t),i=J(e,n.alsoAllow),a=J(e,n.deny);return{allowed:(r||i)&&!a,baseAllowed:r,denied:a}}function We(e){return e.map(e=>G(e)).filter(e=>e.length>0)}function Ge(e){let t=new Set(We(e.current.alsoAllow)),n=new Set(We(e.current.deny));for(let r of e.toggles){let i=G(r.toolId);i&&(r.enable?(n.delete(i),e.baseAllowed(i)||t.add(i)):(t.delete(i),n.add(i)))}return{alsoAllow:[...t],deny:[...n]}}function Ke(e){let t=e.current?e.current.map(e=>e.trim()).filter(Boolean):null,n=new Set(t??e.allSkills),r=e.skillName.trim();return e.enable?n.add(r):n.delete(r),[...n]}function qe({agent:e}){let t=e.id,n=p(`skills.status`,{agentId:t},{refreshMs:m}),r=f(e=>e.draft),i=f(e=>e.snapshot?.config??null),o=f(e=>e.busy),s=f(e=>e.schema!==null),[c,l]=(0,C.useState)(``),d=r??i,h=B(d,t),g=Array.isArray(h.entry?.skills)?h.entry.skills:void 0,_=new Set((g??[]).map(e=>e.trim()).filter(Boolean)),v=g!==void 0,x=n.data!==null,S=x?n.data?.skills??[]:[],T=b(S,c),E=y(T),D=v?S.filter(e=>_.has(e.name)).length:S.length,O=!!d&&s&&!o,k=e=>{let n=V(d,t);if(n<0)return;let r=[`agents`,`list`,n,`skills`],i=f.getState();e===null?i.removePath(r):i.setPath(r,e)},A=(e,t)=>{let n=e.name.trim();if(!O||!n)return;let r=S.map(e=>e.name).filter(Boolean);k(Ke({current:g??null,allSkills:r,skillName:n,enable:t}))};return(0,w.jsxs)(`div`,{"data-testid":`agent-skills`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__panel-head`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Skills`}),(0,w.jsxs)(`p`,{className:`ct-agents__panel-sub`,children:[`Per-agent skill allowlist and workspace skills.`,` `,S.length>0?(0,w.jsxs)(`span`,{className:`ct-mono`,"data-testid":`agent-skills-count`,children:[D,`/`,S.length]}):null]})]}),(0,w.jsxs)(`div`,{className:`ct-agents__button-row`,children:[(0,w.jsx)(u,{size:`sm`,disabled:!O,"data-testid":`agent-skills-use-all`,onClick:()=>k(null),children:`Use All`}),(0,w.jsx)(u,{size:`sm`,disabled:!O,"data-testid":`agent-skills-disable-all`,onClick:()=>k([]),children:`Disable All`}),(0,w.jsx)(u,{size:`sm`,disabled:n.loading,"data-testid":`agent-skills-refresh`,onClick:n.reload,children:n.loading?`Loading…`:`Refresh`}),(0,w.jsx)(H,{testId:`agent-skills`})]})]}),d?null:(0,w.jsx)(`div`,{className:`ct-agents__callout`,children:`Load the gateway config to set per-agent skills.`}),(0,w.jsx)(`div`,{className:`ct-agents__callout`,"data-testid":`agent-skills-callout`,children:v?`This agent uses a custom skill allowlist.`:`All skills are enabled. Disabling any skill will create a per-agent allowlist.`}),!x&&!n.loading?(0,w.jsx)(`div`,{className:`ct-agents__callout`,children:`Load skills for this agent to view workspace-specific entries.`}):null,n.error?(0,w.jsx)(a,{tone:`error`,message:n.error}):null,n.loading&&!n.data?(0,w.jsx)(a,{tone:`loading`,message:`Loading skills…`}):null,(0,w.jsxs)(`div`,{className:`ct-agents__skills-filters`,children:[(0,w.jsx)(`input`,{type:`text`,"aria-label":`Filter skills`,placeholder:`Search skills`,"data-testid":`agent-skills-filter`,value:c,onChange:e=>l(e.target.value)}),(0,w.jsxs)(`span`,{className:`ct-agents__panel-sub`,"data-testid":`agent-skills-shown`,children:[T.length,` shown`]})]}),x&&T.length===0?(0,w.jsx)(a,{message:`No skills found.`}):null,(0,w.jsx)(`div`,{className:`ct-agents__skills-groups`,children:E.map(e=>(0,w.jsxs)(`details`,{className:`ct-agents__skills-group`,open:!(e.id===`workspace`||e.id===`built-in`),"data-testid":`agent-skill-group-${e.id}`,children:[(0,w.jsxs)(`summary`,{children:[(0,w.jsx)(`span`,{children:e.label}),(0,w.jsx)(`span`,{className:`ct-agents__panel-sub`,children:e.skills.length})]}),(0,w.jsx)(`div`,{className:`ct-agents__skills-list`,children:e.skills.map(e=>(0,w.jsx)(Je,{skill:e,enabled:!v||_.has(e.name),editable:O,onToggle:t=>A(e,t)},e.skillKey))})]},e.id))})]})}function Je({skill:e,enabled:t,editable:n,onToggle:r}){let i=x(e),a=S(e);return(0,w.jsxs)(`div`,{className:`ct-agents__skill-row`,"data-testid":`agent-skill-row-${e.name}`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__skill-main`,children:[(0,w.jsxs)(`span`,{className:`ct-agents__channel-label`,children:[e.emoji?`${e.emoji} `:``,e.name]}),(0,w.jsx)(`span`,{className:`ct-agents__panel-sub`,children:e.description}),(0,w.jsxs)(`span`,{className:`ct-agents__chip-row`,children:[(0,w.jsx)(h,{children:e.source}),(0,w.jsx)(h,{tone:e.eligible?`ok`:`warn`,children:e.eligible?`eligible`:`blocked`}),e.disabled?(0,w.jsx)(h,{tone:`warn`,children:`disabled`}):null]}),i.length>0?(0,w.jsxs)(`span`,{className:`ct-agents__panel-sub`,children:[`Missing: `,i.join(`, `)]}):null,a.length>0?(0,w.jsxs)(`span`,{className:`ct-agents__panel-sub`,children:[`Reason: `,a.join(`, `)]}):null]}),(0,w.jsx)(`label`,{className:`ct-agents__tool-toggle`,children:(0,w.jsx)(`input`,{type:`checkbox`,"aria-label":`Enable ${e.name}`,checked:t,disabled:!n,onChange:e=>r(e.target.checked)})})]})}var Ye=[{id:`readonly`,label:`Readonly`},{id:`minimal`,label:`Minimal`},{id:`coding`,label:`Coding`},{id:`full`,label:`Full`}];function X(e,t){let n=V(e,t);return n<0?null:[`agents`,`list`,n,`tools`]}function Xe({agent:e}){let t=e.id,n=p(`tools.catalog`,{agentId:t,includePlugins:!0},{refreshMs:3e4}),r=f(e=>e.draft),i=f(e=>e.snapshot?.config??null),a=f(e=>e.busy),o=f(e=>e.schema!==null),s=r??i,c=B(s,t).entry?.tools??{},l=Be(s),d=c.profile??l.profile??`full`,m=c.profile?`agent override`:l.profile?`global default`:`default`,h=c.exec?.preset??l.exec?.preset??null,g=n.data&&n.data.agentId===t?n.data.execPolicy:void 0,_=g?.canExec??`full`,v=Array.isArray(c.allow)&&c.allow.length>0,y=Array.isArray(l.allow)&&l.allow.length>0,b=!!s&&o&&!a&&!v,x=!!s&&o&&!a,S={alsoAllow:v?[]:c.alsoAllow??[],deny:v?[]:c.deny??[]},C=v?{allow:c.allow??[],deny:c.deny??[]}:Ue(d),T=n.data?.groups?.length&&n.data.agentId===t?n.data.groups:Re,E=n.data?.profiles?.length&&n.data.agentId===t?n.data.profiles:ze,D=T.flatMap(e=>e.tools.map(e=>e.id)),O=e=>Y(e,C,S).baseAllowed,k=D.filter(e=>Y(e,C,S).allowed).length,A=e=>{let n=X(s,t);if(!n)return;let r=f.getState();e.alsoAllow.length>0?r.setPath([...n,`alsoAllow`],e.alsoAllow):r.removePath([...n,`alsoAllow`]),e.deny.length>0?r.setPath([...n,`deny`],e.deny):r.removePath([...n,`deny`])},j=(e,t)=>{A(Ge({current:S,baseAllowed:O,toggles:[{toolId:e,enable:t}]}))},M=e=>{A(Ge({current:S,baseAllowed:O,toggles:D.map(t=>({toolId:t,enable:e}))}))},N=(e,n)=>{let r=X(s,t);if(!r)return;let i=f.getState();e?i.setPath([...r,`profile`],e):i.removePath([...r,`profile`]),n&&i.removePath([...r,`allow`])},P=e=>{let n=X(s,t);if(!n)return;let r=f.getState();e?r.setPath([...n,`exec`,`preset`],e):r.removePath([...n,`exec`,`preset`])},F=Y(`exec`,C,S).allowed;return(0,w.jsxs)(`div`,{"data-testid":`agent-tools`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__panel-head`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Tool access`}),(0,w.jsxs)(`p`,{className:`ct-agents__panel-sub`,children:[`Profile + per-tool overrides for this agent.`,` `,(0,w.jsxs)(`span`,{className:`ct-mono`,children:[k,`/`,D.length]}),` `,`enabled.`]})]}),(0,w.jsxs)(`div`,{className:`ct-agents__button-row`,children:[(0,w.jsx)(u,{size:`sm`,disabled:!b,onClick:()=>M(!0),children:`Enable All`}),(0,w.jsx)(u,{size:`sm`,disabled:!b,onClick:()=>M(!1),children:`Disable All`}),(0,w.jsx)(H,{testId:`agent-tools`})]})]}),n.error?(0,w.jsx)(`div`,{className:`ct-agents__callout ct-agents__callout--warn`,role:`status`,children:`Could not load runtime tool catalog. Showing fallback list.`}):null,s?null:(0,w.jsx)(`div`,{className:`ct-agents__callout`,children:`Load the gateway config to adjust tool profiles.`}),v?(0,w.jsx)(`div`,{className:`ct-agents__callout`,children:`This agent is using an explicit allowlist in config. Tool overrides are managed in the Config tab.`}):null,y?(0,w.jsx)(`div`,{className:`ct-agents__callout`,children:`Global tools.allow is set. Agent overrides cannot enable tools that are globally blocked.`}):null,F&&g?.canExec===`none`?(0,w.jsx)(`div`,{className:`ct-agents__callout ct-agents__callout--warn`,"data-testid":`agent-tools-exec-none`,children:`Exec tool is enabled but tools.exec security denies every command - pick a preset below or adjust tools.exec.security.`}):null,F&&_===`safebins-only`?(0,w.jsx)(`div`,{className:`ct-agents__callout`,"data-testid":`agent-tools-safebins`,children:`Exec is limited to safe bins; choose a preset to broaden read-only diagnostics.`}):null,(0,w.jsxs)(`div`,{className:`ct-agents__kv-grid ct-agents__kv-grid--tools`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__kv`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Profile`}),(0,w.jsx)(`span`,{className:`ct-agents__kv-value ct-mono`,"data-testid":`agent-tools-profile`,children:d})]}),(0,w.jsxs)(`div`,{className:`ct-agents__kv`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Source`}),(0,w.jsx)(`span`,{className:`ct-agents__kv-value`,children:m})]}),a?(0,w.jsxs)(`div`,{className:`ct-agents__kv`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Status`}),(0,w.jsx)(`span`,{className:`ct-agents__kv-value ct-mono`,children:`unsaved`})]}):null,g?(0,w.jsxs)(`div`,{className:`ct-agents__kv`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Exec`}),(0,w.jsxs)(`span`,{className:`ct-agents__kv-value ct-mono`,"data-testid":`agent-tools-exec-policy`,children:[g.presetId??g.security,` · `,g.ask,` · `,g.canExec]})]}):null]}),(0,w.jsxs)(`div`,{className:`ct-agents__presets`,"data-testid":`agent-tools-presets`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Quick presets`}),(0,w.jsxs)(`div`,{className:`ct-agents__button-row`,children:[E.map(e=>(0,w.jsx)(u,{size:`sm`,"aria-pressed":d===e.id,disabled:!b,onClick:()=>N(e.id,!0),children:e.label},e.id)),(0,w.jsx)(u,{size:`sm`,"aria-pressed":!1,disabled:!b,onClick:()=>N(null,!1),children:`Inherit`})]})]}),(0,w.jsxs)(`div`,{className:`ct-agents__presets`,"data-testid":`agent-exec-presets`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Exec policy`}),(0,w.jsxs)(`div`,{className:`ct-agents__button-row`,children:[Ye.map(e=>(0,w.jsx)(u,{size:`sm`,"aria-pressed":h===e.id,disabled:!x,onClick:()=>P(e.id),children:e.label},e.id)),(0,w.jsx)(u,{size:`sm`,"aria-pressed":!1,disabled:!x,onClick:()=>P(null),children:`Inherit`})]})]}),(0,w.jsx)(`div`,{className:`ct-agents__tools-grid`,children:T.map(e=>(0,w.jsxs)(`div`,{className:`ct-agents__tools-section`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__tools-head`,children:[(0,w.jsx)(`span`,{children:e.label}),e.source===`plugin`?(0,w.jsx)(`span`,{className:`ct-mono`,children:`plugin`}):null]}),(0,w.jsx)(`div`,{className:`ct-agents__tools-list`,children:e.tools.map(e=>{let t=e.source===`plugin`?e.pluginId?`plugin:${e.pluginId}`:`plugin`:`core`;return(0,w.jsxs)(`div`,{className:`ct-agents__tool-row`,"data-testid":`agent-tool-${e.id}`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsxs)(`div`,{className:`ct-agents__tool-title ct-mono`,children:[e.label,(0,w.jsx)(`span`,{className:`ct-agents__tool-source`,children:t}),e.optional===!0?(0,w.jsx)(`span`,{className:`ct-agents__tool-source`,children:`optional`}):null]}),(0,w.jsx)(`div`,{className:`ct-agents__tool-desc`,children:e.description})]}),(0,w.jsx)(`label`,{className:`ct-agents__tool-toggle`,children:(0,w.jsx)(`input`,{type:`checkbox`,"aria-label":`Enable ${e.label}`,checked:Y(e.id,C,S).allowed,disabled:!b,onChange:t=>j(e.id,t.target.checked)})})]},e.id)})})]},e.id))}),n.loading?(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,children:`Refreshing tool catalog…`}):null]})}var Z=[{id:`overview`,label:`Overview`},{id:`files`,label:`Files`},{id:`tools`,label:`Tools`},{id:`skills`,label:`Skills`},{id:`channels`,label:`Channels`},{id:`cron`,label:`Cron jobs`}];function Ze({agent:e,agents:t,defaultId:n,panel:r,onPanelChange:i}){let a=e.id,o=p(`agent.identity.get`,{agentId:a}),c=f(e=>e.draft),l=f(e=>e.snapshot?.config??null),u=c??l,d=o.data&&o.data.agentId===a?o.data:null,m=ee(a,n),g=I(e),v=e.description?.trim()||e.identity?.theme?.trim()||`Agent workspace and routing.`,y=z(e,d),b=R(e,d),x=e.team?.id,S=x===void 0?[]:t.filter(e=>e.team?.id===x&&e.id!==a).toSorted((e,t)=>Number(t.team?.role===`lead`)-Number(e.team?.role===`lead`)),C=ne({agent:e,config:u,filesWorkspace:null,defaultId:n,agentIdentity:d});return(0,w.jsxs)(`div`,{className:`ct-agents__detail`,"data-testid":`agent-detail`,children:[(0,w.jsxs)(`section`,{className:`ct-agents__header`,"data-testid":`agent-header`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__header-main`,children:[(0,w.jsx)(T,{src:y,emoji:b,label:g,large:!0,testId:`agent-avatar`}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h2`,{className:`ct-agents__name`,"data-testid":`agent-name`,children:g}),(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,"data-testid":`agent-subtitle`,children:v})]})]}),(0,w.jsxs)(`div`,{className:`ct-agents__header-meta`,children:[(0,w.jsx)(`span`,{className:`ct-mono`,"data-testid":`agent-id`,children:a}),e.team?(0,w.jsxs)(h,{tone:`neutral`,children:[e.team.name??e.team.id,` · `,e.team.role]}):null,m?(0,w.jsx)(h,{tone:`accent`,children:m}):null,o.error?(0,w.jsx)(h,{tone:`danger`,children:`identity unavailable`}):null]})]}),(0,w.jsxs)(`div`,{className:`ct-agents__links`,"data-testid":`agent-links`,children:[(0,w.jsx)(_,{to:s.sessions({agent:a}),children:`Sessions`}),(0,w.jsx)(_,{to:s.runs({agent:a}),children:`Runs`}),S.length>0?(0,w.jsxs)(`span`,{className:`ct-agents__team-links`,children:[`Team:`,S.map(e=>(0,w.jsx)(_,{to:s.agent(e.id),children:I(e)},e.id))]}):null]}),(0,w.jsx)(`div`,{className:`ct-agents__tabs`,role:`tablist`,"data-testid":`agent-tabs`,children:Z.map(e=>(0,w.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":r===e.id,className:`ct-agents__tab${r===e.id?` ct-agents__tab--active`:``}`,onClick:()=>i(e.id),children:e.label},e.id))}),r===`overview`?(0,w.jsx)(Te,{agent:e,defaultId:n,identity:d,identityLoading:o.loading,identityError:o.error}):null,r===`files`?(0,w.jsx)(be,{agentId:a},a):null,r===`tools`?(0,w.jsx)(Xe,{agent:e},a):null,r===`skills`?(0,w.jsx)(qe,{agent:e},a):null,r===`channels`?(0,w.jsx)(pe,{context:C},a):null,r===`cron`?(0,w.jsx)(ye,{agentId:a,context:C},a):null]})}var Q=`Check in`;function $(e){let t=new URL(window.location.href);t.searchParams.set(`agent`,e.agent),e.tab===`overview`?t.searchParams.delete(`tab`):t.searchParams.set(`tab`,e.tab),window.history.replaceState({},``,`${t.pathname}${t.search}`)}function Qe(){let e=c(),t=i(e=>e.request),n=p(`agents.list`,{},{refreshMs:m}),r=n.data?.agents??[],s=n.data?.defaultId??null,[l,h]=(0,C.useState)(()=>Z.find(t=>t.id===e.params.get(`tab`))?.id??`overview`),[_,v]=(0,C.useState)(()=>e.params.get(`agent`)),[y,b]=(0,C.useState)(!1),[x,S]=(0,C.useState)(Q),[T,E]=(0,C.useState)(!1),[D,O]=(0,C.useState)(null),k=(0,C.useRef)(!1),A=(0,C.useRef)(e.params.get(`agent`)),j=(0,C.useRef)(Z.find(t=>t.id===e.params.get(`tab`))?.id??`overview`),M=e.params.get(`agent`);(0,C.useEffect)(()=>{M!==A.current&&(A.current=M,M&&v(M))},[M]);let P=e.params.get(`tab`);(0,C.useEffect)(()=>{let e=Z.find(e=>e.id===P)?.id??`overview`;e!==j.current&&(j.current=e,h(e))},[P]);let F=r.find(e=>e.id===_)??r.find(e=>e.id===s)??r[0]??null;(0,C.useEffect)(()=>{k.current||(k.current=!0,f.getState().load())},[]);let I=e=>{e!==F?.id&&(A.current=e,v(e),$({agent:e,tab:l}))},L=e=>{h(e),j.current=e,F&&$({agent:F.id,tab:e})},R=async()=>{if(!F||T)return;let e=x.trim();if(e){E(!0),O(null);try{await t(`agent.nudge`,{agentId:F.id,text:e}),b(!1),S(Q)}catch(e){O(o(e))}finally{E(!1)}}};return(0,w.jsxs)(`div`,{className:`ct-page`,"data-testid":`agents-view`,children:[(0,w.jsx)(`header`,{className:`ct-page__head`,children:(0,w.jsxs)(`div`,{className:`ct-page__head-text`,children:[(0,w.jsx)(`h1`,{className:`ct-page__title`,children:`Agents`}),(0,w.jsx)(`p`,{className:`ct-page__sub`,children:`Personas, workspaces, tools and schedules.`})]})}),(0,w.jsxs)(`div`,{className:`ct-agents__layout`,children:[(0,w.jsxs)(g,{className:`ct-agents__sidebar`,title:`Agents`,sub:`${r.length} configured.`,actions:(0,w.jsx)(u,{size:`sm`,disabled:!F,"data-testid":`agents-nudge`,onClick:()=>{S(Q),O(null),b(!0)},children:`Nudge agent`}),children:[n.error?(0,w.jsx)(a,{tone:`error`,message:n.error}):null,n.loading&&!n.data?(0,w.jsx)(a,{tone:`loading`,message:`Loading agents…`}):null,n.data&&r.length===0?(0,w.jsx)(a,{message:`No agents found.`}):null,(0,w.jsx)(`div`,{className:`ct-agents__list`,"data-testid":`agent-list`,children:N(r).map(e=>(0,w.jsxs)(`div`,{className:`ct-agents__group`,children:[e.title?(0,w.jsx)(`h3`,{className:`ct-agents__group-title`,"data-testid":`agent-group-${e.teamId}`,children:e.title}):null,e.agents.map(e=>(0,w.jsx)($e,{agent:e,defaultId:s,active:F?.id===e.id,onSelect:()=>I(e.id)},e.id))]},e.teamId??`__ungrouped`))})]}),F?(0,w.jsx)(Ze,{agent:F,agents:r,defaultId:s,panel:l,onPanelChange:L},F.id):(0,w.jsx)(g,{title:`Select an agent`,sub:`Pick an agent to inspect its workspace and tools.`,children:n.data&&r.length===0?(0,w.jsx)(a,{message:`No agents are configured on this gateway.`}):null})]}),(0,w.jsxs)(d,{open:y,title:`Nudge agent`,onClose:()=>b(!1),width:`sm`,footer:(0,w.jsxs)(`div`,{className:`ct-agents__dialog-actions`,children:[(0,w.jsx)(u,{size:`sm`,onClick:()=>b(!1),children:`Cancel`}),(0,w.jsx)(u,{size:`sm`,variant:`primary`,disabled:T||!x.trim(),"data-testid":`agents-nudge-send`,onClick:()=>void R(),children:T?`Sending…`:`Send nudge`})]}),children:[(0,w.jsxs)(`label`,{className:`ct-agents__field`,children:[(0,w.jsx)(`span`,{children:`Message`}),(0,w.jsx)(`textarea`,{"data-testid":`agents-nudge-text`,rows:3,value:x,onChange:e=>S(e.target.value)})]}),D?(0,w.jsx)(`p`,{className:`ct-agents__callout ct-agents__callout--danger`,role:`alert`,children:D}):null]})]})}function $e({agent:e,defaultId:t,active:n,onSelect:r}){let i=I(e),a=ee(e.id,t);return(0,w.jsxs)(`button`,{type:`button`,className:`ct-agents__row${n?` ct-agents__row--active`:``}`,"data-testid":`agent-row-${e.id}`,"aria-current":n?`true`:void 0,onClick:r,children:[(0,w.jsx)(T,{src:z(e,null),emoji:R(e,null),label:i}),(0,w.jsxs)(`span`,{className:`ct-agents__row-info`,children:[(0,w.jsx)(`span`,{className:`ct-agents__row-name`,children:i}),(0,w.jsx)(`span`,{className:`ct-agents__row-id ct-mono`,children:e.id})]}),a?(0,w.jsx)(h,{tone:`accent`,children:a}):null,e.team?.role===`lead`?(0,w.jsx)(h,{tone:`neutral`,children:`lead`}):null,e.userFacing===!1?(0,w.jsx)(h,{tone:`neutral`,children:`internal`}):null]})}export{Qe as default};
|
|
1
|
+
import{_ as e,c as t,h as n,i as r,l as i,s as a,t as o}from"./format-CGs6a1G6.js";import{n as s,o as c,t as l}from"./links-DlVrQOFC.js";import{t as u}from"./Button-CGdLofSY.js";import{t as d}from"./Dialog-CQE8Pvh6.js";import{r as f}from"./config-store-XvvVJ8Fq.js";import{n as p,t as m}from"./use-gateway-query-D25QZANO.js";import{t as h}from"./Badge-CB5TWfdz.js";import{t as g}from"./Panel-9wOynsWc.js";import{t as _}from"./EntityLink-BO2oG3y8.js";import{t as v}from"./Stat-BZwg1PGE.js";import{a as y,i as b,n as x,r as S}from"./skills-model-DANiC-ui.js";var C=e(n(),1),w=t();function T({src:e,emoji:t,label:n,large:r=!1,testId:i}){let[a,o]=(0,C.useState)(!1),[s,c]=(0,C.useState)(e);e!==s&&(c(e),o(!1));let l=[`ct-agents__avatar`,r?`ct-agents__avatar--lg`:null].filter(Boolean).join(` `);return e&&!a?(0,w.jsx)(`img`,{className:l,src:e,alt:``,"data-testid":i?`${i}-img`:void 0,onError:()=>o(!0)}):(0,w.jsx)(`span`,{className:l,"data-testid":i?`${i}-fallback`:void 0,"aria-hidden":`true`,children:t||n.slice(0,1).toUpperCase()})}function E(e){if(!e)return`-`;if(typeof e==`string`)return e.trim()||`-`;let t=P(e);if(!t)return`-`;let n=typeof t.primary==`string`?t.primary.trim():``;if(!n)return`-`;let r=Array.isArray(t.fallbacks)?t.fallbacks.length:0;return r>0?`${n} (+${r} fallback)`:n}function D(e){let t=e.match(/^(.+) \(\+\d+ fallback\)$/);return t?t[1]:e}function O(e){if(!e)return null;if(typeof e==`string`)return e.trim()||null;let t=P(e);return t&&(typeof t.primary==`string`?t.primary:typeof t.model==`string`?t.model:typeof t.id==`string`?t.id:typeof t.value==`string`?t.value:null)?.trim()||null}function k(e){let t=P(e);if(!t)return null;let n=Array.isArray(t.fallbacks)?t.fallbacks:Array.isArray(t.fallback)?t.fallback:null;return n?n.filter(e=>typeof e==`string`):null}function A(e,t){return k(e)??k(t)}function j(e){return e.split(`,`).map(e=>e.trim()).filter(Boolean)}function M(e,t){let n=(e||null)?.agents?.defaults?.models,r=[];if(n&&typeof n==`object`)for(let[e,t]of Object.entries(n)){let n=e.trim();if(!n)continue;let i=t?.alias?.trim(),a=i&&i!==n?`${i} (${n})`:n;r.push({value:n,label:a})}let i=t?r.some(e=>e.value===t):!1;return t&&!i&&r.unshift({value:t,label:`Current (${t})`}),r.length===0?[{value:``,label:`No configured models`,disabled:!0}]:r}function N(e){let t=new Map;for(let n of e){let e=n.team?.id??null,r=e??`\0`,i=t.get(r);i||(i={teamId:e,title:e===null?null:n.team?.name??e,agents:[]},t.set(r,i)),n.team?.role===`lead`?(e!==null&&n.team?.name&&(i.title=n.team.name),i.agents.unshift(n)):i.agents.push(n)}return[...t.values()].toSorted((e,t)=>e.teamId===null?1:t.teamId===null?-1:0)}function P(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function F(e){let t=P(e);return t&&typeof t.id==`string`?t.id:null}function I(e){return e.name?.trim()||e.identity?.name?.trim()||e.id}function L(e){let t=e.trim();if(!t||t.length>16)return!1;let n=!1;for(let e=0;e<t.length;e+=1)if(t.charCodeAt(e)>127){n=!0;break}return n?!t.includes(`://`)&&!t.includes(`/`)&&!t.includes(`.`):!1}function R(e,t){let n=t?.emoji?.trim();if(n&&L(n))return n;let r=e.identity?.emoji?.trim();if(r&&L(r))return r;let i=t?.avatar?.trim();if(i&&L(i))return i;let a=e.identity?.avatar?.trim();return a&&L(a)?a:``}function z(e,t){let n=[t?.avatar,e.identity?.avatarUrl,e.identity?.avatar];for(let e of n){let t=e?.trim();if(t&&!L(t))return t}return null}function ee(e,t){return t&&e===t?`default`:null}function te(e){if(e==null||!Number.isFinite(e))return`-`;if(e<1024)return`${e} B`;let t=[`KB`,`MB`,`GB`,`TB`],n=e/1024,r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r+=1;return`${n.toFixed(+(n<10))} ${t[r]}`}function B(e,t){let n=e||null;return{entry:(n?.agents?.list??[]).find(e=>F(e)===t)??null,defaults:n?.agents?.defaults??null}}function V(e,t){let n=e?e.agents?.list:void 0;return Array.isArray(n)?n.findIndex(e=>F(e)===t):-1}function ne(e){let{agent:t,config:n,filesWorkspace:r,defaultId:i,agentIdentity:a}=e,o=B(n,t.id),s=r||o.entry?.workspace||o.defaults?.workspace||`default`,c=o.entry?.model?E(o.entry?.model):E(o.defaults?.model),l=a?.name?.trim()||t.identity?.name?.trim()||t.name?.trim()||o.entry?.name||t.id,u=R(t,a)||`-`,d=Array.isArray(o.entry?.skills)?o.entry?.skills:null,f=d?.length??null;return{workspace:s,model:c,identityName:l,identityEmoji:u,skillsLabel:d?`${f} selected`:`all skills`,isDefault:!!(i&&t.id===i)}}function re(e,t){if(!e)return null;let n=P(e.channels)?.[t];return P(n)??P(e[t])}function ie(e){if(e==null)return`n/a`;if(typeof e==`string`||typeof e==`number`||typeof e==`boolean`)return String(e);try{return JSON.stringify(e)}catch{return`n/a`}}function ae(e){let t=re(e.configForm,e.channelId);return t?e.fields.flatMap(e=>e in t?[{label:e,value:ie(t[e])}]:[]):[]}function oe(e){let t=e/6e4;if(t<60)return`${Math.round(t)}m`;let n=t/60;return n<24?`${Math.round(n*10)/10}h`:`${Math.round(n/24*10)/10}d`}function se(e){let t=e.schedule;if(t.kind===`at`){let e=Date.parse(t.at);return Number.isFinite(e)?`At ${new Date(e).toLocaleString()}`:`At ${t.at}`}return t.kind===`every`?`Every ${oe(t.everyMs)}`:`Cron ${t.expr}${t.tz?` (${t.tz})`:``}`}function ce(e){let t=e.payload;if(t.kind===`systemEvent`)return`System: ${t.text}`;if(t.kind===`wakeGate`){let e=t.gate.kind===`command`?t.gate.command:t.gate.model;return`Wake gate: ${t.gate.kind} (${e??`model`})`}return`Agent: ${t.message}`}var le=[`groupPolicy`,`streamMode`,`dmPolicy`];function ue(e,t){return e.channelMeta?.find(e=>e.id===t)?.label||e.channelLabels[t]||t}function de(e){if(!e)return[];let t=new Set;for(let n of e.channelOrder??[])t.add(n);for(let n of e.channelMeta??[])t.add(n.id);for(let n of Object.keys(e.channelAccounts??{}))t.add(n);let n=[],r=e.channelOrder?.length?e.channelOrder:Array.from(t);for(let e of r)t.has(e)&&(n.push(e),t.delete(e));for(let e of t)n.push(e);return n.map(t=>({id:t,label:ue(e,t),accounts:e.channelAccounts?.[t]??[]}))}function fe(e){let t=0,n=0,r=0;for(let i of e){let e=i.probe&&typeof i.probe==`object`&&`ok`in i.probe?!!i.probe.ok:!1;(i.connected===!0||i.running===!0||e)&&(t+=1),i.configured&&(n+=1),i.enabled&&(r+=1)}return{total:e.length,connected:t,configured:n,enabled:r}}function pe({context:e}){let t=p(`channels.status`,{probe:!1},{refreshMs:m}),n=he(),i=de(t.data),o=t.data?.ts??null;return(0,w.jsxs)(`div`,{"data-testid":`agent-channels`,children:[(0,w.jsx)(me,{context:e,subtitle:`Workspace, identity, and model configuration.`}),(0,w.jsxs)(`div`,{className:`ct-agents__panel-head`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Channels`}),(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,children:`Gateway-wide channel status snapshot.`}),(0,w.jsxs)(`p`,{className:`ct-agents__panel-sub`,children:[`Last refresh: `,o?r(o):`never`]})]}),(0,w.jsx)(u,{size:`sm`,disabled:t.loading,onClick:t.reload,children:t.loading?`Refreshing…`:`Refresh`})]}),t.error?(0,w.jsx)(a,{tone:`error`,message:t.error}):null,t.loading&&!t.data?(0,w.jsx)(a,{tone:`loading`,message:`Loading channels…`}):null,t.data&&i.length===0?(0,w.jsx)(a,{message:`No channels found.`}):null,(0,w.jsx)(`div`,{className:`ct-agents__channel-list`,children:i.map(e=>{let t=fe(e.accounts),r=t.total?`${t.connected}/${t.total} connected`:`no accounts`,i=t.configured?`${t.configured} configured`:`not configured`,a=t.total?`${t.enabled} enabled`:`disabled`,o=ae({configForm:n,channelId:e.id,fields:le});return(0,w.jsxs)(`div`,{className:`ct-agents__channel-row`,"data-testid":`agent-channel-${e.id}`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`div`,{className:`ct-agents__channel-label`,children:e.label}),(0,w.jsx)(`div`,{className:`ct-agents__channel-id ct-mono`,children:e.id})]}),(0,w.jsxs)(`div`,{className:`ct-agents__channel-meta`,children:[(0,w.jsx)(`span`,{children:r}),(0,w.jsx)(`span`,{children:i}),(0,w.jsx)(`span`,{children:a}),o.map(e=>(0,w.jsxs)(`span`,{children:[e.label,`: `,e.value]},e.label))]})]},e.id)})})]})}function me({context:e,subtitle:t}){let n=[[`Workspace`,e.workspace],[`Primary model`,e.model],[`Identity name`,e.identityName],[`Identity emoji`,e.identityEmoji],[`Skills filter`,e.skillsLabel],[`Default`,e.isDefault?`yes`:`no`]];return(0,w.jsxs)(`div`,{className:`ct-agents__context-card`,"data-testid":`agent-context-card`,children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Agent context`}),(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,children:t}),(0,w.jsx)(`div`,{className:`ct-agents__kv-grid`,children:n.map(([e,t])=>(0,w.jsxs)(`div`,{className:`ct-agents__kv`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:e}),(0,w.jsx)(`span`,{className:`ct-agents__kv-value`,children:t})]},e))})]})}function he(){let e=f(e=>e.draft),t=f(e=>e.snapshot?.config??null);return e??t}var ge={includeDisabled:!0,limit:200,offset:0,sortBy:`nextRunAtMs`,sortDir:`asc`},_e=50;function ve(e){let t=i(e=>e.request),[n,r]=(0,C.useState)({jobs:[],loading:!1,error:null});return(0,C.useEffect)(()=>{if(!e||e.hasMore!==!0){r(e=>e.jobs.length===0&&!e.loading&&e.error===null?e:{jobs:[],loading:!1,error:null});return}let n=!1;return r(e=>({jobs:e.jobs,loading:!0,error:null})),(async()=>{let i=[],a=e.nextOffset??200;for(let e=0;e<_e;e+=1)try{let e=await t(`cron.list`,{...ge,offset:a});if(n)return;let r=e.jobs??[];if(i.push(...r),e.hasMore!==!0||r.length===0)break;a=e.nextOffset??a+r.length}catch(e){n||r({jobs:i,loading:!1,error:o(e)});return}n||r({jobs:i,loading:!1,error:null})})(),()=>{n=!0}},[e,t]),n}function ye({agentId:e,context:t}){let n=p(`cron.status`,{},{refreshMs:m}),i=p(`cron.list`,ge,{refreshMs:m}),o=ve(i.data),c=(0,C.useMemo)(()=>[...i.data?.jobs??[],...o.jobs].filter(t=>t.agentId===e),[i.data,o.jobs,e]),d=i.error??o.error;return(0,w.jsxs)(`div`,{"data-testid":`agent-cron`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__cron-top`,children:[(0,w.jsx)(me,{context:t,subtitle:`Workspace and scheduling targets.`}),(0,w.jsxs)(`div`,{className:`ct-agents__context-card`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__panel-head`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Scheduler`}),(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,children:`Gateway cron status.`})]}),(0,w.jsx)(u,{size:`sm`,disabled:n.loading,onClick:()=>{n.reload(),i.reload()},children:`Refresh`})]}),(0,w.jsxs)(`div`,{className:`ct-agents__stats`,children:[(0,w.jsx)(v,{label:`Enabled`,value:n.data?n.data.enabled?`Yes`:`No`:`n/a`}),(0,w.jsx)(v,{label:`Jobs`,value:n.data?.jobs??`n/a`}),(0,w.jsx)(v,{label:`Next wake`,value:r(n.data?.nextWakeAtMs??null)})]}),n.error?(0,w.jsx)(a,{tone:`error`,message:n.error}):null]})]}),(0,w.jsx)(`div`,{className:`ct-agents__panel-head`,children:(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Agent cron jobs`}),(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,children:`Scheduled jobs targeting this agent.`})]})}),d?(0,w.jsx)(a,{tone:`error`,message:d}):null,i.loading&&!i.data?(0,w.jsx)(a,{tone:`loading`,message:`Loading jobs…`}):null,i.data&&!o.loading&&c.length===0?(0,w.jsx)(a,{message:`No jobs assigned.`}):null,(0,w.jsx)(`div`,{className:`ct-agents__cron-list`,children:c.map(e=>(0,w.jsxs)(`div`,{className:`ct-agents__cron-row`,"data-testid":`agent-cron-job-${e.id}`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__cron-main`,children:[(0,w.jsx)(`span`,{className:`ct-agents__channel-label`,children:e.name}),e.description?(0,w.jsx)(`span`,{className:`ct-agents__panel-sub`,children:e.description}):null,(0,w.jsxs)(`span`,{className:`ct-agents__chip-row`,children:[(0,w.jsx)(h,{children:se(e)}),(0,w.jsx)(h,{tone:e.enabled?`ok`:`warn`,children:e.enabled?`enabled`:`disabled`}),(0,w.jsx)(h,{children:e.sessionTarget})]})]}),(0,w.jsxs)(`div`,{className:`ct-agents__cron-meta`,children:[(0,w.jsxs)(`span`,{className:`ct-agents__panel-sub`,children:[`Last `,r(e.state?.lastRunAtMs),` · Next`,` `,r(e.state?.nextRunAtMs)]}),(0,w.jsx)(`span`,{className:`ct-agents__panel-sub`,children:ce(e)}),(0,w.jsx)(u,{size:`sm`,"data-testid":`agent-cron-open-${e.id}`,onClick:()=>l(s.automation(e.id)),children:`Open in Automations`})]})]},e.id))})]})}function be({agentId:e}){let t=i(e=>e.request),n=p(`agents.files.list`,{agentId:e}),[r,s]=(0,C.useState)({}),[c,l]=(0,C.useState)({}),[d,f]=(0,C.useState)(null),[m,h]=(0,C.useState)(!1),[g,_]=(0,C.useState)(null),v=(0,C.useRef)({}),y=n.data?.agentId===e?n.data.files??[]:[],b=d?y.find(e=>e.name===d)??null:null,x=d?r[d]??``:``,S=d?Object.hasOwn(r,d):!1,T=d?c[d]??x:``,E=d?T!==x:!1,D=(e,t)=>{v.current={...v.current,[e]:t},s(v.current)};(0,C.useEffect)(()=>{d&&y.length>0&&!y.some(e=>e.name===d)&&f(null)},[d,y]),(0,C.useEffect)(()=>{if(!d||Object.hasOwn(v.current,d))return;let n=!1,r=d;return t(`agents.files.get`,{agentId:e,name:r}).then(e=>{n||!e?.file||(D(r,e.file.content??``),l(t=>({...t,[r]:e.file.content??``})))}).catch(e=>{n||_(o(e))}),()=>{n=!0}},[d,e,t]);let O=async()=>{if(!d||!E||m)return;let i=d,a=c[i]??r[i]??``;h(!0),_(null);try{(await t(`agents.files.set`,{agentId:e,name:i,content:a}))?.file&&(D(i,a),l(e=>({...e,[i]:a})),n.reload())}catch(e){_(o(e))}finally{h(!1)}};return(0,w.jsxs)(`div`,{"data-testid":`agent-files`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__panel-head`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Core files`}),(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,children:`Bootstrap persona, identity, and tool guidance.`}),n.data?.agentId===e?(0,w.jsxs)(`p`,{className:`ct-agents__panel-sub ct-mono`,children:[`Workspace: `,n.data.workspace]}):null]}),(0,w.jsx)(u,{size:`sm`,disabled:n.loading,"data-testid":`agent-files-refresh`,onClick:n.reload,children:n.loading?`Loading…`:`Refresh`})]}),n.error?(0,w.jsx)(a,{tone:`error`,message:n.error}):null,n.loading&&!n.data?(0,w.jsx)(a,{tone:`loading`,message:`Loading files…`}):null,g?(0,w.jsx)(`div`,{role:`alert`,className:`ct-agents__callout ct-agents__callout--danger`,"data-testid":`agent-files-error`,children:g}):null,n.data?y.length===0?(0,w.jsx)(a,{message:`No files found.`}):(0,w.jsxs)(`div`,{className:`ct-agents__files-grid`,children:[(0,w.jsx)(`div`,{className:`ct-agents__files-list`,"data-testid":`agent-files-list`,children:y.map(e=>(0,w.jsx)(xe,{file:e,active:d===e.name,onSelect:()=>f(e.name)},e.name))}),(0,w.jsx)(`div`,{className:`ct-agents__files-editor`,children:b?(0,w.jsxs)(w.Fragment,{children:[(0,w.jsxs)(`div`,{className:`ct-agents__file-head`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`div`,{className:`ct-agents__file-name ct-mono`,children:b.name}),(0,w.jsx)(`div`,{className:`ct-agents__file-path ct-mono`,children:b.path})]}),(0,w.jsxs)(`div`,{className:`ct-agents__file-actions`,children:[(0,w.jsx)(u,{size:`sm`,disabled:!E,"data-testid":`agent-file-reset`,onClick:()=>l(e=>({...e,[b.name]:x})),children:`Reset`}),(0,w.jsx)(u,{size:`sm`,variant:`primary`,disabled:m||!E,"data-testid":`agent-file-save`,onClick:()=>void O(),children:m?`Saving…`:`Save`})]})]}),b.missing?(0,w.jsx)(`div`,{className:`ct-agents__callout`,children:`This file is missing. Saving will create it in the agent workspace.`}):null,(0,w.jsxs)(`label`,{className:`ct-agents__field`,children:[(0,w.jsx)(`span`,{children:`Content`}),(0,w.jsx)(`textarea`,{"data-testid":`agent-file-editor`,rows:16,value:T,disabled:!S,placeholder:S?void 0:`Loading…`,onChange:e=>l(t=>({...t,[b.name]:e.target.value}))})]})]}):(0,w.jsx)(a,{message:`Select a file to edit.`})})]}):null]})}function xe({file:e,active:t,onSelect:n}){let i=e.missing?`Missing`:`${te(e.size)} · ${r(e.updatedAtMs??null)}`;return(0,w.jsxs)(`button`,{type:`button`,className:`ct-agents__file-row${t?` ct-agents__file-row--active`:``}`,"data-testid":`agent-file-${e.name}`,onClick:n,children:[(0,w.jsxs)(`span`,{className:`ct-agents__file-row-main`,children:[(0,w.jsx)(`span`,{className:`ct-agents__file-row-name ct-mono`,children:e.name}),(0,w.jsx)(`span`,{className:`ct-agents__file-row-meta`,children:i})]}),e.missing?(0,w.jsx)(`span`,{className:`ct-agents__pill ct-agents__pill--warn`,children:`missing`}):null]})}function H({testId:e,onBeforeSave:t}){let n=f(e=>e.dirty),r=f(e=>e.busy),i=f(e=>e.error),a=f(e=>e.snapshot!==null),o=async()=>{t?.(),await f.getState().save(`set`)};return(0,w.jsxs)(`div`,{className:`ct-agents__config-actions`,children:[i?(0,w.jsxs)(`div`,{className:`ct-agents__config-error`,role:`alert`,"data-testid":`${e}-error`,children:[(0,w.jsx)(`span`,{children:i}),(0,w.jsx)(u,{size:`sm`,"data-testid":`${e}-error-reload`,onClick:()=>void f.getState().load(),children:`Reload from gateway`})]}):null,(0,w.jsxs)(`div`,{className:`ct-agents__config-buttons`,children:[(0,w.jsx)(`span`,{className:`ct-agents__config-state`,"data-testid":`${e}-state`,children:a?n?`unsaved`:`saved`:`Config not loaded`}),(0,w.jsx)(u,{size:`sm`,disabled:r,"data-testid":`${e}-reload`,onClick:()=>void f.getState().load(),children:`Reload Config`}),(0,w.jsx)(u,{size:`sm`,variant:`primary`,disabled:r||!n,"data-testid":`${e}-save`,onClick:()=>void o(),children:r?`Saving…`:`Save`})]})]})}function Se(e){return e&&typeof e==`object`&&!Array.isArray(e)?`primary`in e&&typeof e.primary==`string`&&e.primary.trim()||null:typeof e==`string`&&e.trim()||null}function Ce(e,t,n,r,i){let a=V(e,t);if(a<0)return;let o=[`agents`,`list`,a,`model`];if(!n){i(o);return}let s=B(e,t).entry?.model;if(s&&typeof s==`object`&&!Array.isArray(s)){let e=k(s);r(o,{primary:n,...e?{fallbacks:e}:{}});return}r(o,n)}function we(e,t,n,r,i){let a=V(e,t);if(a<0)return;let o=[`agents`,`list`,a,`model`],s=Se(B(e,t).entry?.model);if(n.length===0){s?r(o,s):i(o);return}r(o,s?{primary:s,fallbacks:n}:{fallbacks:n})}function Te({agent:e,defaultId:t,identity:n,identityLoading:r,identityError:i}){let a=f(e=>e.draft),o=f(e=>e.snapshot?.config??null),s=f(e=>e.busy),c=f(e=>e.schema!==null),l=a??o,u=B(l,e.id),d=u.entry?.workspace||u.defaults?.workspace||`default`,p=u.entry?.model?E(u.entry.model):E(u.defaults?.model),m=E(u.defaults?.model),h=O(u.entry?.model)??(p===`-`?null:D(p))??O(u.defaults?.model)??(m===`-`?null:D(m)),g=A(u.entry?.model,u.defaults?.model),_=g?g.join(`, `):``,[v,y]=(0,C.useState)(null);(0,C.useEffect)(()=>{y(null)},[_]);let b=v??_,x=n?.name?.trim()||e.identity?.name?.trim()||e.name?.trim()||u.entry?.name||`-`,S=R(e,n)||`-`,T=Array.isArray(u.entry?.skills)?u.entry?.skills:null,k=r?`Loading…`:i?`Unavailable`:``,N=!!(t&&e.id===t),P=ne({agent:e,config:l,filesWorkspace:null,defaultId:t,agentIdentity:n}),F=!!l&&c&&!s,I=(e,t)=>f.getState().setPath(e,t),L=e=>f.getState().removePath(e),z=()=>{if(v===null||v===_){y(null);return}y(null),we(l,e.id,j(v),I,L)};return(0,w.jsxs)(`div`,{"data-testid":`agent-overview`,children:[(0,w.jsx)(`div`,{className:`ct-agents__kv-grid`,children:[[`Workspace`,d],[`Primary model`,p],[`Identity name`,x,k||void 0],[`Default`,N?`yes`:`no`],[`Identity emoji`,S],[`Skills filter`,T?`${T.length} selected`:`all skills`]].map(([e,t,n])=>(0,w.jsxs)(`div`,{className:`ct-agents__kv`,"data-testid":`agent-kv-${e.toLowerCase().replace(/\s+/g,`-`)}`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:e}),(0,w.jsx)(`span`,{className:e===`Workspace`?`ct-agents__kv-value ct-mono`:`ct-agents__kv-value`,children:t}),n?(0,w.jsx)(`span`,{className:`ct-agents__kv-note`,children:n}):null]},e))}),(0,w.jsxs)(`div`,{className:`ct-agents__model-edit`,"data-testid":`agent-model-edit`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Model selection`}),(0,w.jsxs)(`div`,{className:`ct-agents__model-fields`,children:[(0,w.jsxs)(`label`,{className:`ct-agents__field`,children:[(0,w.jsxs)(`span`,{children:[`Primary model`,N?` (default)`:``]}),(0,w.jsxs)(`select`,{"data-testid":`agent-model-select`,value:h??``,disabled:!F,onChange:t=>Ce(l,e.id,t.target.value||null,I,L),children:[N?null:(0,w.jsx)(`option`,{value:``,children:m===`-`?`Inherit default`:`Inherit default (${m})`}),M(l,h).map(e=>(0,w.jsx)(`option`,{value:e.value,disabled:e.disabled,children:e.label},e.value))]})]}),(0,w.jsxs)(`label`,{className:`ct-agents__field`,children:[(0,w.jsx)(`span`,{children:`Fallbacks (comma-separated)`}),(0,w.jsx)(`input`,{"data-testid":`agent-fallbacks-input`,value:b,disabled:!F,placeholder:`provider/model, provider/model`,onChange:e=>y(e.target.value),onBlur:z})]})]}),(0,w.jsx)(H,{testId:`agent-config`,onBeforeSave:z})]}),(0,w.jsxs)(`p`,{className:`ct-agents__hint`,children:[`Routing context: `,P.model===`-`?`model unset`:P.model,`,`,` `,P.skillsLabel,`.`]})]})}var Ee=[{id:`fs`,label:`Files`},{id:`runtime`,label:`Runtime`},{id:`web`,label:`Web`},{id:`memory`,label:`Memory`},{id:`sessions`,label:`Sessions`},{id:`ui`,label:`UI`},{id:`messaging`,label:`Messaging`},{id:`automation`,label:`Automation`},{id:`nodes`,label:`Nodes`},{id:`agents`,label:`Agents`},{id:`media`,label:`Media`}],U=[{id:`read`,label:`read`,description:`Read file contents`,sectionId:`fs`,profiles:[`coding`]},{id:`write`,label:`write`,description:`Create or overwrite files`,sectionId:`fs`,profiles:[`coding`]},{id:`edit`,label:`edit`,description:`Make precise edits`,sectionId:`fs`,profiles:[`coding`]},{id:`delete`,label:`delete`,description:`Delete a workspace file`,sectionId:`fs`,profiles:[`coding`]},{id:`apply_patch`,label:`apply_patch`,description:`Patch files (OpenAI)`,sectionId:`fs`,profiles:[`coding`]},{id:`exec`,label:`exec`,description:`Run shell commands`,sectionId:`runtime`,profiles:[`coding`]},{id:`process`,label:`process`,description:`Manage background processes`,sectionId:`runtime`,profiles:[`coding`]},{id:`web_search`,label:`web_search`,description:`Search the web`,sectionId:`web`,profiles:[],includeInOpenClawGroup:!0},{id:`web_fetch`,label:`web_fetch`,description:`Fetch web content`,sectionId:`web`,profiles:[],includeInOpenClawGroup:!0},{id:`memory_search`,label:`memory_search`,description:`Semantic search`,sectionId:`memory`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`memory_get`,label:`memory_get`,description:`Read memory files`,sectionId:`memory`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`sessions_list`,label:`sessions_list`,description:`List sessions`,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`sessions_history`,label:`sessions_history`,description:`Session history`,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`sessions_send`,label:`sessions_send`,description:`Send to session`,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`agents_nudge`,label:`agents_nudge`,description:`Wake another agent`,sectionId:`sessions`,profiles:[`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`sessions_spawn`,label:`sessions_spawn`,description:`Spawn sub-agent`,sectionId:`sessions`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`subagents`,label:`subagents`,description:`Manage sub-agents`,sectionId:`sessions`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`session_status`,label:`session_status`,description:`Session status`,sectionId:`sessions`,profiles:[`minimal`,`coding`,`messaging`],includeInOpenClawGroup:!0},{id:`browser`,label:`browser`,description:`Control web browser`,sectionId:`ui`,profiles:[],includeInOpenClawGroup:!0},{id:`canvas`,label:`canvas`,description:`Control canvases`,sectionId:`ui`,profiles:[],includeInOpenClawGroup:!0},{id:`message`,label:`message`,description:`Send messages`,sectionId:`messaging`,profiles:[`messaging`],includeInOpenClawGroup:!0},{id:`cron`,label:`cron`,description:`Schedule tasks`,sectionId:`automation`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`gateway`,label:`gateway`,description:`Gateway control`,sectionId:`automation`,profiles:[],includeInOpenClawGroup:!0},{id:`nodes`,label:`nodes`,description:`Nodes + devices`,sectionId:`nodes`,profiles:[],includeInOpenClawGroup:!0},{id:`agents_list`,label:`agents_list`,description:`List agents`,sectionId:`agents`,profiles:[],includeInOpenClawGroup:!0},{id:`image`,label:`image`,description:`Image understanding`,sectionId:`media`,profiles:[`coding`],includeInOpenClawGroup:!0},{id:`tts`,label:`tts`,description:`Text-to-speech conversion`,sectionId:`media`,profiles:[],includeInOpenClawGroup:!0}];new Map(U.map(e=>[e.id,e]));function W(e){return U.filter(t=>t.profiles.includes(e)).map(e=>e.id)}var De={minimal:{allow:W(`minimal`)},coding:{allow:W(`coding`)},messaging:{allow:W(`messaging`)},full:{}};function Oe(){let e=new Map;for(let t of U){let n=`group:${t.sectionId}`,r=e.get(n)??[];r.push(t.id),e.set(n,r)}return{"group:openclaw":U.filter(e=>e.includeInOpenClawGroup).map(e=>e.id),...Object.fromEntries(e.entries())}}var ke=Oe(),Ae=[{id:`minimal`,label:`Minimal`},{id:`coding`,label:`Coding`},{id:`messaging`,label:`Messaging`},{id:`full`,label:`Full`}];function je(e){if(!e)return;let t=De[e];if(t&&!(!t.allow&&!t.deny))return{allow:t.allow?[...t.allow]:void 0,deny:t.deny?[...t.deny]:void 0}}function Me(){return Ee.map(e=>({id:e.id,label:e.label,tools:U.filter(t=>t.sectionId===e.id).map(e=>({id:e.id,label:e.label,description:e.description}))})).filter(e=>e.tools.length>0)}var Ne={bash:`exec`,"apply-patch":`apply_patch`},Pe={...ke};function G(e){let t=e.trim().toLowerCase();return Ne[t]??t}function Fe(e){return e?e.map(G).filter(Boolean):[]}function Ie(e){let t=Fe(e),n=[];for(let e of t){let t=Pe[e];if(t){n.push(...t);continue}n.push(e)}return Array.from(new Set(n))}function Le(e){return je(e)}var Re=Me().map(e=>({id:e.id,label:e.label,source:`core`,tools:e.tools.map(e=>({...e,source:`core`,defaultProfiles:[]}))})),ze=Ae.map(e=>({...e}));function Be(e){return(e?e.tools:void 0)??{}}function Ve(e){let t=G(e);if(!t)return{kind:`exact`,value:``};if(t===`*`)return{kind:`all`};if(!t.includes(`*`))return{kind:`exact`,value:t};let n=t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);return{kind:`regex`,value:RegExp(`^${n.replaceAll(`\\*`,`.*`)}$`)}}function K(e){return Array.isArray(e)?Ie(e).map(Ve).filter(e=>e.kind!==`exact`||e.value.length>0):[]}function q(e,t){for(let n of t)if(n.kind===`all`||n.kind===`exact`&&e===n.value||n.kind===`regex`&&n.value.test(e))return!0;return!1}function He(e,t){if(!t)return!0;let n=G(e);if(q(n,K(t.deny)))return!1;let r=K(t.allow);return r.length===0||q(n,r)?!0:n===`apply_patch`&&q(`exec`,r)}function J(e,t){if(!Array.isArray(t)||t.length===0)return!1;let n=G(e),r=K(t);return q(n,r)?!0:n===`apply_patch`&&q(`exec`,r)}function Ue(e){return Le(e)??void 0}function Y(e,t,n){let r=He(e,t),i=J(e,n.alsoAllow),a=J(e,n.deny);return{allowed:(r||i)&&!a,baseAllowed:r,denied:a}}function We(e){return e.map(e=>G(e)).filter(e=>e.length>0)}function Ge(e){let t=new Set(We(e.current.alsoAllow)),n=new Set(We(e.current.deny));for(let r of e.toggles){let i=G(r.toolId);i&&(r.enable?(n.delete(i),e.baseAllowed(i)||t.add(i)):(t.delete(i),n.add(i)))}return{alsoAllow:[...t],deny:[...n]}}function Ke(e){let t=e.current?e.current.map(e=>e.trim()).filter(Boolean):null,n=new Set(t??e.allSkills),r=e.skillName.trim();return e.enable?n.add(r):n.delete(r),[...n]}function qe({agent:e}){let t=e.id,n=p(`skills.status`,{agentId:t},{refreshMs:m}),r=f(e=>e.draft),i=f(e=>e.snapshot?.config??null),o=f(e=>e.busy),s=f(e=>e.schema!==null),[c,l]=(0,C.useState)(``),d=r??i,h=B(d,t),g=Array.isArray(h.entry?.skills)?h.entry.skills:void 0,_=new Set((g??[]).map(e=>e.trim()).filter(Boolean)),v=g!==void 0,x=n.data!==null,S=x?n.data?.skills??[]:[],T=b(S,c),E=y(T),D=v?S.filter(e=>_.has(e.name)).length:S.length,O=!!d&&s&&!o,k=e=>{let n=V(d,t);if(n<0)return;let r=[`agents`,`list`,n,`skills`],i=f.getState();e===null?i.removePath(r):i.setPath(r,e)},A=(e,t)=>{let n=e.name.trim();if(!O||!n)return;let r=S.map(e=>e.name).filter(Boolean);k(Ke({current:g??null,allSkills:r,skillName:n,enable:t}))};return(0,w.jsxs)(`div`,{"data-testid":`agent-skills`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__panel-head`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Skills`}),(0,w.jsxs)(`p`,{className:`ct-agents__panel-sub`,children:[`Per-agent skill allowlist and workspace skills.`,` `,S.length>0?(0,w.jsxs)(`span`,{className:`ct-mono`,"data-testid":`agent-skills-count`,children:[D,`/`,S.length]}):null]})]}),(0,w.jsxs)(`div`,{className:`ct-agents__button-row`,children:[(0,w.jsx)(u,{size:`sm`,disabled:!O,"data-testid":`agent-skills-use-all`,onClick:()=>k(null),children:`Use All`}),(0,w.jsx)(u,{size:`sm`,disabled:!O,"data-testid":`agent-skills-disable-all`,onClick:()=>k([]),children:`Disable All`}),(0,w.jsx)(u,{size:`sm`,disabled:n.loading,"data-testid":`agent-skills-refresh`,onClick:n.reload,children:n.loading?`Loading…`:`Refresh`}),(0,w.jsx)(H,{testId:`agent-skills`})]})]}),d?null:(0,w.jsx)(`div`,{className:`ct-agents__callout`,children:`Load the gateway config to set per-agent skills.`}),(0,w.jsx)(`div`,{className:`ct-agents__callout`,"data-testid":`agent-skills-callout`,children:v?`This agent uses a custom skill allowlist.`:`All skills are enabled. Disabling any skill will create a per-agent allowlist.`}),!x&&!n.loading?(0,w.jsx)(`div`,{className:`ct-agents__callout`,children:`Load skills for this agent to view workspace-specific entries.`}):null,n.error?(0,w.jsx)(a,{tone:`error`,message:n.error}):null,n.loading&&!n.data?(0,w.jsx)(a,{tone:`loading`,message:`Loading skills…`}):null,(0,w.jsxs)(`div`,{className:`ct-agents__skills-filters`,children:[(0,w.jsx)(`input`,{type:`text`,"aria-label":`Filter skills`,placeholder:`Search skills`,"data-testid":`agent-skills-filter`,value:c,onChange:e=>l(e.target.value)}),(0,w.jsxs)(`span`,{className:`ct-agents__panel-sub`,"data-testid":`agent-skills-shown`,children:[T.length,` shown`]})]}),x&&T.length===0?(0,w.jsx)(a,{message:`No skills found.`}):null,(0,w.jsx)(`div`,{className:`ct-agents__skills-groups`,children:E.map(e=>(0,w.jsxs)(`details`,{className:`ct-agents__skills-group`,open:!(e.id===`workspace`||e.id===`built-in`),"data-testid":`agent-skill-group-${e.id}`,children:[(0,w.jsxs)(`summary`,{children:[(0,w.jsx)(`span`,{children:e.label}),(0,w.jsx)(`span`,{className:`ct-agents__panel-sub`,children:e.skills.length})]}),(0,w.jsx)(`div`,{className:`ct-agents__skills-list`,children:e.skills.map(e=>(0,w.jsx)(Je,{skill:e,enabled:!v||_.has(e.name),editable:O,onToggle:t=>A(e,t)},e.skillKey))})]},e.id))})]})}function Je({skill:e,enabled:t,editable:n,onToggle:r}){let i=x(e),a=S(e);return(0,w.jsxs)(`div`,{className:`ct-agents__skill-row`,"data-testid":`agent-skill-row-${e.name}`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__skill-main`,children:[(0,w.jsxs)(`span`,{className:`ct-agents__channel-label`,children:[e.emoji?`${e.emoji} `:``,e.name]}),(0,w.jsx)(`span`,{className:`ct-agents__panel-sub`,children:e.description}),(0,w.jsxs)(`span`,{className:`ct-agents__chip-row`,children:[(0,w.jsx)(h,{children:e.source}),(0,w.jsx)(h,{tone:e.eligible?`ok`:`warn`,children:e.eligible?`eligible`:`blocked`}),e.disabled?(0,w.jsx)(h,{tone:`warn`,children:`disabled`}):null]}),i.length>0?(0,w.jsxs)(`span`,{className:`ct-agents__panel-sub`,children:[`Missing: `,i.join(`, `)]}):null,a.length>0?(0,w.jsxs)(`span`,{className:`ct-agents__panel-sub`,children:[`Reason: `,a.join(`, `)]}):null]}),(0,w.jsx)(`label`,{className:`ct-agents__tool-toggle`,children:(0,w.jsx)(`input`,{type:`checkbox`,"aria-label":`Enable ${e.name}`,checked:t,disabled:!n,onChange:e=>r(e.target.checked)})})]})}var Ye=[{id:`readonly`,label:`Readonly`},{id:`minimal`,label:`Minimal`},{id:`coding`,label:`Coding`},{id:`full`,label:`Full`}];function X(e,t){let n=V(e,t);return n<0?null:[`agents`,`list`,n,`tools`]}function Xe({agent:e}){let t=e.id,n=p(`tools.catalog`,{agentId:t,includePlugins:!0},{refreshMs:3e4}),r=f(e=>e.draft),i=f(e=>e.snapshot?.config??null),a=f(e=>e.busy),o=f(e=>e.schema!==null),s=r??i,c=B(s,t).entry?.tools??{},l=Be(s),d=c.profile??l.profile??`full`,m=c.profile?`agent override`:l.profile?`global default`:`default`,h=c.exec?.preset??l.exec?.preset??null,g=n.data&&n.data.agentId===t?n.data.execPolicy:void 0,_=g?.canExec??`full`,v=Array.isArray(c.allow)&&c.allow.length>0,y=Array.isArray(l.allow)&&l.allow.length>0,b=!!s&&o&&!a&&!v,x=!!s&&o&&!a,S={alsoAllow:v?[]:c.alsoAllow??[],deny:v?[]:c.deny??[]},C=v?{allow:c.allow??[],deny:c.deny??[]}:Ue(d),T=n.data?.groups?.length&&n.data.agentId===t?n.data.groups:Re,E=n.data?.profiles?.length&&n.data.agentId===t?n.data.profiles:ze,D=T.flatMap(e=>e.tools.map(e=>e.id)),O=e=>Y(e,C,S).baseAllowed,k=D.filter(e=>Y(e,C,S).allowed).length,A=e=>{let n=X(s,t);if(!n)return;let r=f.getState();e.alsoAllow.length>0?r.setPath([...n,`alsoAllow`],e.alsoAllow):r.removePath([...n,`alsoAllow`]),e.deny.length>0?r.setPath([...n,`deny`],e.deny):r.removePath([...n,`deny`])},j=(e,t)=>{A(Ge({current:S,baseAllowed:O,toggles:[{toolId:e,enable:t}]}))},M=e=>{A(Ge({current:S,baseAllowed:O,toggles:D.map(t=>({toolId:t,enable:e}))}))},N=(e,n)=>{let r=X(s,t);if(!r)return;let i=f.getState();e?i.setPath([...r,`profile`],e):i.removePath([...r,`profile`]),n&&i.removePath([...r,`allow`])},P=e=>{let n=X(s,t);if(!n)return;let r=f.getState();e?r.setPath([...n,`exec`,`preset`],e):r.removePath([...n,`exec`,`preset`])},F=Y(`exec`,C,S).allowed;return(0,w.jsxs)(`div`,{"data-testid":`agent-tools`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__panel-head`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h3`,{className:`ct-agents__panel-title`,children:`Tool access`}),(0,w.jsxs)(`p`,{className:`ct-agents__panel-sub`,children:[`Profile + per-tool overrides for this agent.`,` `,(0,w.jsxs)(`span`,{className:`ct-mono`,children:[k,`/`,D.length]}),` `,`enabled.`]})]}),(0,w.jsxs)(`div`,{className:`ct-agents__button-row`,children:[(0,w.jsx)(u,{size:`sm`,disabled:!b,onClick:()=>M(!0),children:`Enable All`}),(0,w.jsx)(u,{size:`sm`,disabled:!b,onClick:()=>M(!1),children:`Disable All`}),(0,w.jsx)(H,{testId:`agent-tools`})]})]}),n.error?(0,w.jsx)(`div`,{className:`ct-agents__callout ct-agents__callout--warn`,role:`status`,children:`Could not load runtime tool catalog. Showing fallback list.`}):null,s?null:(0,w.jsx)(`div`,{className:`ct-agents__callout`,children:`Load the gateway config to adjust tool profiles.`}),v?(0,w.jsx)(`div`,{className:`ct-agents__callout`,children:`This agent is using an explicit allowlist in config. Tool overrides are managed in the Config tab.`}):null,y?(0,w.jsx)(`div`,{className:`ct-agents__callout`,children:`Global tools.allow is set. Agent overrides cannot enable tools that are globally blocked.`}):null,F&&g?.canExec===`none`?(0,w.jsx)(`div`,{className:`ct-agents__callout ct-agents__callout--warn`,"data-testid":`agent-tools-exec-none`,children:`Exec tool is enabled but tools.exec security denies every command - pick a preset below or adjust tools.exec.security.`}):null,F&&_===`safebins-only`?(0,w.jsx)(`div`,{className:`ct-agents__callout`,"data-testid":`agent-tools-safebins`,children:`Exec is limited to safe bins; choose a preset to broaden read-only diagnostics.`}):null,(0,w.jsxs)(`div`,{className:`ct-agents__kv-grid ct-agents__kv-grid--tools`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__kv`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Profile`}),(0,w.jsx)(`span`,{className:`ct-agents__kv-value ct-mono`,"data-testid":`agent-tools-profile`,children:d})]}),(0,w.jsxs)(`div`,{className:`ct-agents__kv`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Source`}),(0,w.jsx)(`span`,{className:`ct-agents__kv-value`,children:m})]}),a?(0,w.jsxs)(`div`,{className:`ct-agents__kv`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Status`}),(0,w.jsx)(`span`,{className:`ct-agents__kv-value ct-mono`,children:`unsaved`})]}):null,g?(0,w.jsxs)(`div`,{className:`ct-agents__kv`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Exec`}),(0,w.jsxs)(`span`,{className:`ct-agents__kv-value ct-mono`,"data-testid":`agent-tools-exec-policy`,children:[g.presetId??g.security,` · `,g.ask,` · `,g.canExec]})]}):null]}),(0,w.jsxs)(`div`,{className:`ct-agents__presets`,"data-testid":`agent-tools-presets`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Quick presets`}),(0,w.jsxs)(`div`,{className:`ct-agents__button-row`,children:[E.map(e=>(0,w.jsx)(u,{size:`sm`,"aria-pressed":d===e.id,disabled:!b,onClick:()=>N(e.id,!0),children:e.label},e.id)),(0,w.jsx)(u,{size:`sm`,"aria-pressed":!1,disabled:!b,onClick:()=>N(null,!1),children:`Inherit`})]})]}),(0,w.jsxs)(`div`,{className:`ct-agents__presets`,"data-testid":`agent-exec-presets`,children:[(0,w.jsx)(`span`,{className:`ct-agents__kv-label`,children:`Exec policy`}),(0,w.jsxs)(`div`,{className:`ct-agents__button-row`,children:[Ye.map(e=>(0,w.jsx)(u,{size:`sm`,"aria-pressed":h===e.id,disabled:!x,onClick:()=>P(e.id),children:e.label},e.id)),(0,w.jsx)(u,{size:`sm`,"aria-pressed":!1,disabled:!x,onClick:()=>P(null),children:`Inherit`})]})]}),(0,w.jsx)(`div`,{className:`ct-agents__tools-grid`,children:T.map(e=>(0,w.jsxs)(`div`,{className:`ct-agents__tools-section`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__tools-head`,children:[(0,w.jsx)(`span`,{children:e.label}),e.source===`plugin`?(0,w.jsx)(`span`,{className:`ct-mono`,children:`plugin`}):null]}),(0,w.jsx)(`div`,{className:`ct-agents__tools-list`,children:e.tools.map(e=>{let t=e.source===`plugin`?e.pluginId?`plugin:${e.pluginId}`:`plugin`:`core`;return(0,w.jsxs)(`div`,{className:`ct-agents__tool-row`,"data-testid":`agent-tool-${e.id}`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsxs)(`div`,{className:`ct-agents__tool-title ct-mono`,children:[e.label,(0,w.jsx)(`span`,{className:`ct-agents__tool-source`,children:t}),e.optional===!0?(0,w.jsx)(`span`,{className:`ct-agents__tool-source`,children:`optional`}):null]}),(0,w.jsx)(`div`,{className:`ct-agents__tool-desc`,children:e.description})]}),(0,w.jsx)(`label`,{className:`ct-agents__tool-toggle`,children:(0,w.jsx)(`input`,{type:`checkbox`,"aria-label":`Enable ${e.label}`,checked:Y(e.id,C,S).allowed,disabled:!b,onChange:t=>j(e.id,t.target.checked)})})]},e.id)})})]},e.id))}),n.loading?(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,children:`Refreshing tool catalog…`}):null]})}var Z=[{id:`overview`,label:`Overview`},{id:`files`,label:`Files`},{id:`tools`,label:`Tools`},{id:`skills`,label:`Skills`},{id:`channels`,label:`Channels`},{id:`cron`,label:`Cron jobs`}];function Ze({agent:e,agents:t,defaultId:n,panel:r,onPanelChange:i}){let a=e.id,o=p(`agent.identity.get`,{agentId:a}),c=f(e=>e.draft),l=f(e=>e.snapshot?.config??null),u=c??l,d=o.data&&o.data.agentId===a?o.data:null,m=ee(a,n),g=I(e),v=e.description?.trim()||e.identity?.theme?.trim()||`Agent workspace and routing.`,y=z(e,d),b=R(e,d),x=e.team?.id,S=x===void 0?[]:t.filter(e=>e.team?.id===x&&e.id!==a).toSorted((e,t)=>Number(t.team?.role===`lead`)-Number(e.team?.role===`lead`)),C=ne({agent:e,config:u,filesWorkspace:null,defaultId:n,agentIdentity:d});return(0,w.jsxs)(`div`,{className:`ct-agents__detail`,"data-testid":`agent-detail`,children:[(0,w.jsxs)(`section`,{className:`ct-agents__header`,"data-testid":`agent-header`,children:[(0,w.jsxs)(`div`,{className:`ct-agents__header-main`,children:[(0,w.jsx)(T,{src:y,emoji:b,label:g,large:!0,testId:`agent-avatar`}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h2`,{className:`ct-agents__name`,"data-testid":`agent-name`,children:g}),(0,w.jsx)(`p`,{className:`ct-agents__panel-sub`,"data-testid":`agent-subtitle`,children:v})]})]}),(0,w.jsxs)(`div`,{className:`ct-agents__header-meta`,children:[(0,w.jsx)(`span`,{className:`ct-mono`,"data-testid":`agent-id`,children:a}),e.team?(0,w.jsxs)(h,{tone:`neutral`,children:[e.team.name??e.team.id,` · `,e.team.role]}):null,m?(0,w.jsx)(h,{tone:`accent`,children:m}):null,o.error?(0,w.jsx)(h,{tone:`danger`,children:`identity unavailable`}):null]})]}),(0,w.jsxs)(`div`,{className:`ct-agents__links`,"data-testid":`agent-links`,children:[(0,w.jsx)(_,{to:s.sessions({agent:a}),children:`Sessions`}),(0,w.jsx)(_,{to:s.runs({agent:a}),children:`Runs`}),S.length>0?(0,w.jsxs)(`span`,{className:`ct-agents__team-links`,children:[`Team:`,S.map(e=>(0,w.jsx)(_,{to:s.agent(e.id),children:I(e)},e.id))]}):null]}),(0,w.jsx)(`div`,{className:`ct-agents__tabs`,role:`tablist`,"data-testid":`agent-tabs`,children:Z.map(e=>(0,w.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":r===e.id,className:`ct-agents__tab${r===e.id?` ct-agents__tab--active`:``}`,onClick:()=>i(e.id),children:e.label},e.id))}),r===`overview`?(0,w.jsx)(Te,{agent:e,defaultId:n,identity:d,identityLoading:o.loading,identityError:o.error}):null,r===`files`?(0,w.jsx)(be,{agentId:a},a):null,r===`tools`?(0,w.jsx)(Xe,{agent:e},a):null,r===`skills`?(0,w.jsx)(qe,{agent:e},a):null,r===`channels`?(0,w.jsx)(pe,{context:C},a):null,r===`cron`?(0,w.jsx)(ye,{agentId:a,context:C},a):null]})}var Q=`Check in`;function $(e){let t=new URL(window.location.href);t.searchParams.set(`agent`,e.agent),e.tab===`overview`?t.searchParams.delete(`tab`):t.searchParams.set(`tab`,e.tab),window.history.replaceState({},``,`${t.pathname}${t.search}`)}function Qe(){let e=c(),t=i(e=>e.request),n=p(`agents.list`,{},{refreshMs:m}),r=n.data?.agents??[],s=n.data?.defaultId??null,[l,h]=(0,C.useState)(()=>Z.find(t=>t.id===e.params.get(`tab`))?.id??`overview`),[_,v]=(0,C.useState)(()=>e.params.get(`agent`)),[y,b]=(0,C.useState)(!1),[x,S]=(0,C.useState)(Q),[T,E]=(0,C.useState)(!1),[D,O]=(0,C.useState)(null),k=(0,C.useRef)(!1),A=(0,C.useRef)(e.params.get(`agent`)),j=(0,C.useRef)(Z.find(t=>t.id===e.params.get(`tab`))?.id??`overview`),M=e.params.get(`agent`);(0,C.useEffect)(()=>{M!==A.current&&(A.current=M,M&&v(M))},[M]);let P=e.params.get(`tab`);(0,C.useEffect)(()=>{let e=Z.find(e=>e.id===P)?.id??`overview`;e!==j.current&&(j.current=e,h(e))},[P]);let F=r.find(e=>e.id===_)??r.find(e=>e.id===s)??r[0]??null;(0,C.useEffect)(()=>{k.current||(k.current=!0,f.getState().load())},[]);let I=e=>{e!==F?.id&&(A.current=e,v(e),$({agent:e,tab:l}))},L=e=>{h(e),j.current=e,F&&$({agent:F.id,tab:e})},R=async()=>{if(!F||T)return;let e=x.trim();if(e){E(!0),O(null);try{await t(`agent.nudge`,{agentId:F.id,text:e}),b(!1),S(Q)}catch(e){O(o(e))}finally{E(!1)}}};return(0,w.jsxs)(`div`,{className:`ct-page`,"data-testid":`agents-view`,children:[(0,w.jsx)(`header`,{className:`ct-page__head`,children:(0,w.jsxs)(`div`,{className:`ct-page__head-text`,children:[(0,w.jsx)(`h1`,{className:`ct-page__title`,children:`Agents`}),(0,w.jsx)(`p`,{className:`ct-page__sub`,children:`Personas, workspaces, tools and schedules.`})]})}),(0,w.jsxs)(`div`,{className:`ct-agents__layout`,children:[(0,w.jsxs)(g,{className:`ct-agents__sidebar`,title:`Agents`,sub:`${r.length} configured.`,actions:(0,w.jsx)(u,{size:`sm`,disabled:!F,"data-testid":`agents-nudge`,onClick:()=>{S(Q),O(null),b(!0)},children:`Nudge agent`}),children:[n.error?(0,w.jsx)(a,{tone:`error`,message:n.error}):null,n.loading&&!n.data?(0,w.jsx)(a,{tone:`loading`,message:`Loading agents…`}):null,n.data&&r.length===0?(0,w.jsx)(a,{message:`No agents found.`}):null,(0,w.jsx)(`div`,{className:`ct-agents__list`,"data-testid":`agent-list`,children:N(r).map(e=>(0,w.jsxs)(`div`,{className:`ct-agents__group`,children:[e.title?(0,w.jsx)(`h3`,{className:`ct-agents__group-title`,"data-testid":`agent-group-${e.teamId}`,children:e.title}):null,e.agents.map(e=>(0,w.jsx)($e,{agent:e,defaultId:s,active:F?.id===e.id,onSelect:()=>I(e.id)},e.id))]},e.teamId??`__ungrouped`))})]}),F?(0,w.jsx)(Ze,{agent:F,agents:r,defaultId:s,panel:l,onPanelChange:L},F.id):(0,w.jsx)(g,{title:`Select an agent`,sub:`Pick an agent to inspect its workspace and tools.`,children:n.data&&r.length===0?(0,w.jsx)(a,{message:`No agents are configured on this gateway.`}):null})]}),(0,w.jsxs)(d,{open:y,title:`Nudge agent`,onClose:()=>b(!1),width:`sm`,footer:(0,w.jsxs)(`div`,{className:`ct-agents__dialog-actions`,children:[(0,w.jsx)(u,{size:`sm`,onClick:()=>b(!1),children:`Cancel`}),(0,w.jsx)(u,{size:`sm`,variant:`primary`,disabled:T||!x.trim(),"data-testid":`agents-nudge-send`,onClick:()=>void R(),children:T?`Sending…`:`Send nudge`})]}),children:[(0,w.jsxs)(`label`,{className:`ct-agents__field`,children:[(0,w.jsx)(`span`,{children:`Message`}),(0,w.jsx)(`textarea`,{"data-testid":`agents-nudge-text`,rows:3,value:x,onChange:e=>S(e.target.value)})]}),D?(0,w.jsx)(`p`,{className:`ct-agents__callout ct-agents__callout--danger`,role:`alert`,children:D}):null]})]})}function $e({agent:e,defaultId:t,active:n,onSelect:r}){let i=I(e),a=ee(e.id,t);return(0,w.jsxs)(`button`,{type:`button`,className:`ct-agents__row${n?` ct-agents__row--active`:``}`,"data-testid":`agent-row-${e.id}`,"aria-current":n?`true`:void 0,onClick:r,children:[(0,w.jsx)(T,{src:z(e,null),emoji:R(e,null),label:i}),(0,w.jsxs)(`span`,{className:`ct-agents__row-info`,children:[(0,w.jsx)(`span`,{className:`ct-agents__row-name`,children:i}),(0,w.jsx)(`span`,{className:`ct-agents__row-id ct-mono`,children:e.id})]}),a?(0,w.jsx)(h,{tone:`accent`,children:a}):null,e.team?.role===`lead`?(0,w.jsx)(h,{tone:`neutral`,children:`lead`}):null,e.userFacing===!1?(0,w.jsx)(h,{tone:`neutral`,children:`internal`}):null]})}export{Qe as default};
|