@rubytech/create-maxy-code 0.1.504 → 0.1.505

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/lib/models/dist/index.d.ts +5 -5
  3. package/payload/platform/lib/models/dist/index.d.ts.map +1 -1
  4. package/payload/platform/lib/models/dist/index.js +7 -7
  5. package/payload/platform/lib/models/dist/index.js.map +1 -1
  6. package/payload/platform/lib/models/src/index.ts +7 -7
  7. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +39 -26
  8. package/payload/platform/plugins/admin/skills/public-agent-manager/SKILL.md +2 -2
  9. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +6 -0
  10. package/payload/platform/plugins/docs/references/admin-session.md +1 -1
  11. package/payload/platform/plugins/docs/references/admin-ui.md +38 -25
  12. package/payload/platform/plugins/work/mcp/dist/__tests__/session-metering.test.js +2 -2
  13. package/payload/platform/plugins/work/mcp/dist/__tests__/session-metering.test.js.map +1 -1
  14. package/payload/platform/plugins/work/mcp/dist/index.js +1 -1
  15. package/payload/platform/plugins/work/mcp/dist/index.js.map +1 -1
  16. package/payload/platform/plugins/work/mcp/dist/tools/session-metering.js +2 -2
  17. package/payload/platform/plugins/work/mcp/dist/tools/session-metering.js.map +1 -1
  18. package/payload/platform/scripts/logs-read-jsonl.test.sh +1 -1
  19. package/payload/platform/services/claude-session-manager/dist/http-server.js +2 -2
  20. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  21. package/payload/platform/services/claude-session-manager/dist/pricing.d.ts +19 -11
  22. package/payload/platform/services/claude-session-manager/dist/pricing.d.ts.map +1 -1
  23. package/payload/platform/services/claude-session-manager/dist/pricing.js +18 -15
  24. package/payload/platform/services/claude-session-manager/dist/pricing.js.map +1 -1
  25. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +1 -1
  26. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
  27. package/payload/platform/services/claude-session-manager/dist/session-metering.js +3 -3
  28. package/payload/platform/services/claude-session-manager/dist/session-metering.js.map +1 -1
  29. package/payload/platform/templates/account.json +1 -1
  30. package/payload/platform/templates/specialists/agents/coding-assistant.md +1 -1
  31. package/payload/platform/templates/specialists/agents/content-producer.md +1 -1
  32. package/payload/platform/templates/specialists/agents/librarian.md +1 -1
  33. package/payload/platform/templates/specialists/agents/research-assistant.md +1 -1
  34. package/payload/server/public/activity.html +5 -5
  35. package/payload/server/public/agents.html +4 -4
  36. package/payload/server/public/assets/{AdminLoginScreens-DWMR4KtI.js → AdminLoginScreens-DeWt3H7l.js} +1 -1
  37. package/payload/server/public/assets/AdminShell-u32d8puE.js +2 -0
  38. package/payload/server/public/assets/{activity-DH3z4cv3.js → activity-DjP45-DD.js} +1 -1
  39. package/payload/server/public/assets/{admin-aaGhd2Yh.js → admin-Bo-Y6Vjx.js} +1 -1
  40. package/payload/server/public/assets/agents-C80aCXd8.js +1 -0
  41. package/payload/server/public/assets/{browser-C_MJYN5k.js → browser-ULvl_K5x.js} +1 -1
  42. package/payload/server/public/assets/{calendar-DA0h7dqW.js → calendar-CGMrT6WZ.js} +1 -1
  43. package/payload/server/public/assets/chat-DnWXaWD4.js +1 -0
  44. package/payload/server/public/assets/chevron-left-BB5Iljw-.js +1 -0
  45. package/payload/server/public/assets/chevron-right-DijU96_j.js +1 -0
  46. package/payload/server/public/assets/clock-DsmnhhJh.js +1 -0
  47. package/payload/server/public/assets/data-JPlhOLGC.js +1 -0
  48. package/payload/server/public/assets/{file-text-RCoSeOpD.js → file-text-C5K6DMcK.js} +1 -1
  49. package/payload/server/public/assets/graph-CO6e1bgD.js +51 -0
  50. package/payload/server/public/assets/{graph-labels-DJV0aIG5.js → graph-labels-iliQjlfE.js} +1 -1
  51. package/payload/server/public/assets/{maximize-2-DcESsKbu.js → maximize-2-D-64XK6V.js} +1 -1
  52. package/payload/server/public/assets/{operator-Dlkw1sXJ.js → operator-DyXgogJ1.js} +1 -1
  53. package/payload/server/public/assets/{page-Dl-mgQUu.js → page-DrbiAFS-.js} +1 -1
  54. package/payload/server/public/assets/page-WeM2ry61.js +1 -0
  55. package/payload/server/public/assets/{public-C-UHWk_S.js → public-B9NVDBxW.js} +1 -1
  56. package/payload/server/public/assets/{rotate-ccw-C1nRSAzP.js → rotate-ccw-P35h7ogS.js} +1 -1
  57. package/payload/server/public/assets/{routines-qdAZ0sA4.js → routines-BeiynLF7.js} +1 -1
  58. package/payload/server/public/assets/{skills-B78wr822.js → skills-C5H7ohLp.js} +1 -1
  59. package/payload/server/public/assets/{tasks-DbIsS-vW.js → tasks-CI74_b6H.js} +1 -1
  60. package/payload/server/public/assets/{time-entry-format-BhlltPP8.js → time-entry-format-CDhHCMrW.js} +1 -1
  61. package/payload/server/public/assets/{triangle-alert-rEVGyIhi.js → triangle-alert-OgY71rDV.js} +1 -1
  62. package/payload/server/public/assets/{useCopyFeedback-DzpXjm9d.js → useCopyFeedback-jOGmWwa3.js} +1 -1
  63. package/payload/server/public/assets/{useSubAccountSwitcher-wP8cOzPj.css → useSubAccountSwitcher-AFSwtthL.css} +1 -1
  64. package/payload/server/public/assets/{useVoiceRecorder-CRRmPjYr.js → useVoiceRecorder-CnE3fhfV.js} +1 -1
  65. package/payload/server/public/assets/{wrench-oeLti270.js → wrench-B1hsCj0R.js} +1 -1
  66. package/payload/server/public/browser.html +4 -4
  67. package/payload/server/public/calendar.html +7 -7
  68. package/payload/server/public/chat.html +13 -13
  69. package/payload/server/public/data.html +11 -11
  70. package/payload/server/public/graph.html +9 -9
  71. package/payload/server/public/index.html +14 -14
  72. package/payload/server/public/operator.html +14 -14
  73. package/payload/server/public/public.html +13 -13
  74. package/payload/server/public/routines.html +6 -6
  75. package/payload/server/public/skills.html +5 -5
  76. package/payload/server/public/tasks.html +6 -6
  77. package/payload/server/server.js +111 -31
  78. package/payload/server/public/assets/AdminShell-C8hBpL9K.js +0 -2
  79. package/payload/server/public/assets/agents-SPu-clsf.js +0 -1
  80. package/payload/server/public/assets/chat-Bg7dlM0I.js +0 -1
  81. package/payload/server/public/assets/chevron-left-BoDA12H8.js +0 -1
  82. package/payload/server/public/assets/chevron-right-DXjrO6qA.js +0 -1
  83. package/payload/server/public/assets/clock-BceBgZP1.js +0 -1
  84. package/payload/server/public/assets/data-rNLaurgY.js +0 -1
  85. package/payload/server/public/assets/graph-Dm-YZeNP.js +0 -51
  86. package/payload/server/public/assets/page-DoyJrk8E.js +0 -1
  87. /package/payload/server/public/assets/{useSubAccountSwitcher-DVmWZxar.js → useSubAccountSwitcher-6AFuRawP.js} +0 -0
@@ -13578,7 +13578,7 @@ function writeCanonicalOverrideId(accountDir, userId, sessionId) {
13578
13578
  }
13579
13579
 
13580
13580
  // ../lib/models/src/index.ts
13581
- var OPUS_MODEL = "claude-opus-4-8[1m]";
13581
+ var OPUS_MODEL = "claude-opus-5[1m]";
13582
13582
  var SONNET_MODEL = "claude-sonnet-5";
13583
13583
  var HAIKU_MODEL = "claude-haiku-4-5";
13584
13584
  var MODEL_CONTEXT_WINDOW = {
@@ -13590,7 +13590,7 @@ function contextWindow(model) {
13590
13590
  return MODEL_CONTEXT_WINDOW[model] ?? 2e5;
13591
13591
  }
13592
13592
  var MODEL_DISPLAY_NAMES = {
13593
- [OPUS_MODEL]: "Opus 4.8 (1M context)",
13593
+ [OPUS_MODEL]: "Opus 5 (1M context)",
13594
13594
  [SONNET_MODEL]: "Sonnet 5",
13595
13595
  [HAIKU_MODEL]: "Haiku 4.5"
13596
13596
  };
@@ -16170,6 +16170,61 @@ var session_upload_default = app17;
16170
16170
  import { resolve as resolve22 } from "path";
16171
16171
  import { readdirSync as readdirSync21, readFileSync as readFileSync32, existsSync as existsSync30, rmSync as rmSync2 } from "fs";
16172
16172
  var SLUG_UNSAFE = (s) => s.includes("/") || s.includes("..") || s.includes("\\");
16173
+ function subdirs(dir) {
16174
+ if (!existsSync30(dir)) return [];
16175
+ try {
16176
+ return readdirSync21(dir, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name);
16177
+ } catch {
16178
+ return [];
16179
+ }
16180
+ }
16181
+ function splitFrontmatter(text) {
16182
+ const m = text.match(/^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/);
16183
+ const fm = {};
16184
+ if (!m) return { fm, body: text };
16185
+ for (const line of m[1].split(/\r?\n/)) {
16186
+ const kv = line.match(/^([A-Za-z][\w-]*):[ \t]*(.*)$/);
16187
+ if (kv) fm[kv[1]] = kv[2].trim().replace(/^["']|["']$/g, "").trim();
16188
+ }
16189
+ return { fm, body: text.slice(m[0].length) };
16190
+ }
16191
+ function listSpecialists(accountDir) {
16192
+ const pluginsDir = resolve22(accountDir, "plugins");
16193
+ const specialists = [];
16194
+ let specialistsSkipped = 0;
16195
+ for (const plugin of subdirs(pluginsDir).sort()) {
16196
+ const agentsDirP = resolve22(pluginsDir, plugin, "agents");
16197
+ if (!existsSync30(agentsDirP)) continue;
16198
+ let entries;
16199
+ try {
16200
+ entries = readdirSync21(agentsDirP, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));
16201
+ } catch {
16202
+ continue;
16203
+ }
16204
+ for (const entry of entries) {
16205
+ if (!entry.isFile() || !entry.name.endsWith(".md")) continue;
16206
+ try {
16207
+ const { fm } = splitFrontmatter(readFileSync32(resolve22(agentsDirP, entry.name), "utf-8"));
16208
+ if (!fm.name) {
16209
+ specialistsSkipped++;
16210
+ console.error(`[admin/agents] op=list-specialist-skip plugin=${plugin} file=${entry.name}`);
16211
+ continue;
16212
+ }
16213
+ specialists.push({
16214
+ slug: entry.name.replace(/\.md$/, ""),
16215
+ displayName: fm.name,
16216
+ kind: "specialist",
16217
+ plugin,
16218
+ description: fm.description ?? ""
16219
+ });
16220
+ } catch {
16221
+ specialistsSkipped++;
16222
+ console.error(`[admin/agents] op=list-specialist-skip plugin=${plugin} file=${entry.name}`);
16223
+ }
16224
+ }
16225
+ }
16226
+ return { specialists, specialistsSkipped };
16227
+ }
16173
16228
  var OWNED_DOCS = [
16174
16229
  { file: "IDENTITY.md", key: "identity" },
16175
16230
  { file: "SOUL.md", key: "soul" },
@@ -16179,42 +16234,66 @@ var OWNED_DOCS = [
16179
16234
  var app18 = new Hono();
16180
16235
  app18.get("/", (c) => {
16181
16236
  const account = resolveAccount();
16182
- if (!account) return c.json({ agents: [], skipped: 0 });
16183
- const agentsDir = resolve22(account.accountDir, "agents");
16184
- if (!existsSync30(agentsDir)) return c.json({ agents: [], skipped: 0 });
16237
+ if (!account) return c.json({ agents: [], skipped: 0, specialistsSkipped: 0 });
16185
16238
  const agents = [];
16186
16239
  let skipped = 0;
16187
- try {
16188
- const entries = readdirSync21(agentsDir, { withFileTypes: true });
16189
- for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
16190
- if (!entry.isDirectory()) continue;
16191
- if (entry.name === "admin") continue;
16192
- const configPath2 = resolve22(agentsDir, entry.name, "config.json");
16193
- if (!existsSync30(configPath2)) continue;
16194
- try {
16195
- const config = JSON.parse(readFileSync32(configPath2, "utf-8"));
16196
- agents.push({
16197
- slug: entry.name,
16198
- displayName: config.displayName ?? entry.name,
16199
- status: config.status ?? "unknown"
16200
- });
16201
- } catch {
16202
- skipped++;
16203
- console.error(`[admin/agents] failed to parse config.json for agent "${entry.name}" \u2014 skipping`);
16240
+ const agentsDir = resolve22(account.accountDir, "agents");
16241
+ if (existsSync30(agentsDir)) {
16242
+ try {
16243
+ const entries = readdirSync21(agentsDir, { withFileTypes: true });
16244
+ for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
16245
+ if (!entry.isDirectory()) continue;
16246
+ if (entry.name === "admin") continue;
16247
+ const configPath2 = resolve22(agentsDir, entry.name, "config.json");
16248
+ if (!existsSync30(configPath2)) continue;
16249
+ try {
16250
+ const config = JSON.parse(readFileSync32(configPath2, "utf-8"));
16251
+ agents.push({
16252
+ slug: entry.name,
16253
+ displayName: config.displayName ?? entry.name,
16254
+ status: config.status ?? "unknown",
16255
+ kind: "public"
16256
+ });
16257
+ } catch {
16258
+ skipped++;
16259
+ console.error(`[admin/agents] failed to parse config.json for agent "${entry.name}" \u2014 skipping`);
16260
+ }
16204
16261
  }
16262
+ } catch (err) {
16263
+ console.error(`[admin/agents] failed to scan agents directory: ${err}`);
16205
16264
  }
16206
- } catch (err) {
16207
- console.error(`[admin/agents] failed to scan agents directory: ${err}`);
16208
- return c.json({ agents: [], skipped: 0 });
16209
16265
  }
16210
- console.log(`[admin/agents] op=list agents=${agents.length} skipped=${skipped}`);
16211
- return c.json({ agents, skipped });
16266
+ const { specialists, specialistsSkipped } = listSpecialists(account.accountDir);
16267
+ console.log(`[admin/agents] op=list agents=${agents.length} specialists=${specialists.length} skipped=${skipped} specialistsSkipped=${specialistsSkipped}`);
16268
+ return c.json({ agents: [...agents, ...specialists], skipped, specialistsSkipped });
16212
16269
  });
16213
16270
  app18.get("/:slug", (c) => {
16214
16271
  const slug = c.req.param("slug");
16215
16272
  const account = resolveAccount();
16216
16273
  if (!account) return c.json({ error: "No account resolved" }, 400);
16217
16274
  if (SLUG_UNSAFE(slug)) return c.json({ error: "Invalid agent slug" }, 400);
16275
+ const pluginParam = c.req.query("plugin");
16276
+ if (pluginParam) {
16277
+ if (SLUG_UNSAFE(pluginParam)) return c.json({ error: "Invalid plugin" }, 400);
16278
+ const file = resolve22(account.accountDir, "plugins", pluginParam, "agents", `${slug}.md`);
16279
+ if (!existsSync30(file)) return c.json({ error: "Agent not found" }, 404);
16280
+ const { fm, body } = splitFrontmatter(readFileSync32(file, "utf-8"));
16281
+ const skills = subdirs(resolve22(account.accountDir, "plugins", pluginParam, "skills"));
16282
+ console.log(`[admin/agents] op=detail slug=${slug} kind=specialist plugin=${pluginParam}`);
16283
+ return c.json({
16284
+ agent: {
16285
+ kind: "specialist",
16286
+ slug,
16287
+ displayName: fm.name ?? slug,
16288
+ description: fm.description ?? "",
16289
+ summary: fm.summary ?? "",
16290
+ model: fm.model ?? null,
16291
+ tools: fm.tools ? fm.tools.split(",").map((t) => t.trim()).filter(Boolean) : [],
16292
+ systemPrompt: body.trim(),
16293
+ skills
16294
+ }
16295
+ });
16296
+ }
16218
16297
  const agentDir = resolve22(account.accountDir, "agents", slug);
16219
16298
  const configPath2 = resolve22(agentDir, "config.json");
16220
16299
  if (!existsSync30(configPath2)) return c.json({ error: "Agent not found" }, 404);
@@ -24081,7 +24160,7 @@ function accountDirForSession(cacheKey) {
24081
24160
  const match = listValidAccounts().find((a) => a.accountId === accountId);
24082
24161
  return match ? { accountId, accountDir: match.accountDir } : null;
24083
24162
  }
24084
- function subdirs(dir) {
24163
+ function subdirs2(dir) {
24085
24164
  if (!existsSync38(dir)) return [];
24086
24165
  try {
24087
24166
  return readdirSync24(dir, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name);
@@ -24098,10 +24177,10 @@ app49.get("/", requireAdminSession, async (c) => {
24098
24177
  const pluginsDir = resolve32(acct.accountDir, "plugins");
24099
24178
  const skills = [];
24100
24179
  let pluginCount = 0;
24101
- for (const plugin of subdirs(pluginsDir)) {
24180
+ for (const plugin of subdirs2(pluginsDir)) {
24102
24181
  pluginCount++;
24103
24182
  const skillsDir = resolve32(pluginsDir, plugin, "skills");
24104
- for (const skill of subdirs(skillsDir)) {
24183
+ for (const skill of subdirs2(skillsDir)) {
24105
24184
  const skillMd = resolve32(skillsDir, skill, "SKILL.md");
24106
24185
  if (!existsSync38(skillMd)) continue;
24107
24186
  try {
@@ -24161,7 +24240,7 @@ app49.delete("/:plugin/:skill", requireAdminSession, async (c) => {
24161
24240
  }
24162
24241
  try {
24163
24242
  rmSync3(skillDir, { recursive: true, force: true });
24164
- const pluginDirRemoved = subdirs(skillsDir).length === 0;
24243
+ const pluginDirRemoved = subdirs2(skillsDir).length === 0;
24165
24244
  if (pluginDirRemoved) rmSync3(pluginDir, { recursive: true, force: true });
24166
24245
  const skillDirGone = !existsSync38(skillDir);
24167
24246
  if (!skillDirGone) {
@@ -24699,6 +24778,7 @@ app55.post("/", requireAdminSession, async (c) => {
24699
24778
  MATCH (au:AdminUser {userId: $assigneeUserId})
24700
24779
  MERGE (t)-[:ASSIGNED_TO]->(au)
24701
24780
  SET t.updatedAt = $now
24781
+ WITH t, au
24702
24782
  OPTIONAL MATCH (au)-[:OWNS]->(p:Person) WHERE p.accountId = au.accountId
24703
24783
  RETURN au.userId AS userId, p.givenName AS givenName, p.familyName AS familyName`,
24704
24784
  { taskId, accountId, assigneeUserId, now }
@@ -1,2 +0,0 @@
1
- import{o as e}from"./chunk-CltuBf4Z.js";import{A as t,B as n,C as r,D as i,E as a,F as o,G as s,I as c,L as l,M as u,N as d,O as f,P as p,S as m,T as h,W as g,_,a as v,b as ee,d as te,f as y,g as b,h as x,k as S,m as ne,o as C,r as w,t as re,u as ie,v as ae,w as oe,x as T,z as se}from"./useSubAccountSwitcher-DVmWZxar.js";async function ce(){try{let e=await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`logout`})});return e.ok?(await e.json().catch(()=>({})))?.logged_out===!0:(console.error(`[admin-ui] claude-logout http-status=${e.status}`),!1)}catch(e){return console.error(`[admin-ui] claude-logout fetch failed: ${e instanceof Error?e.message:String(e)}`),!1}}var E=n();function le({checked:e,onChange:t,label:n,disabled:r,ariaLabel:i=n}){return(0,E.jsxs)(`label`,{className:`maxy-checkbox${r?` maxy-checkbox--disabled`:``}`,children:[(0,E.jsx)(`input`,{type:`checkbox`,"aria-label":i,checked:e,onChange:e=>t(e.target.checked),disabled:r}),(0,E.jsx)(`span`,{className:`maxy-checkbox__box`,children:`✱`}),n&&(0,E.jsx)(`span`,{className:`maxy-checkbox__label`,children:n})]})}var D=e(s(),1),ue={sm:14,md:16,lg:18},O={sm:30,md:38,lg:46};function k({variant:e=`primary`,size:t=`md`,icon:n,iconPosition:r=`leading`,loading:i=!1,fullWidth:a=!1,disabled:o=!1,type:s=`button`,onClick:c,"aria-label":l,"aria-pressed":u,style:d,className:f,children:p}){let m=[`btn`,`btn--${e}`,t===`md`?``:`btn--${t}`,a?`btn--full`:``,f].filter(Boolean).join(` `),h=ue[t],g={...e===`send`?{width:O[t],height:O[t]}:{},...d},_=Object.keys(g).length>0;return(0,E.jsxs)(`button`,{type:s,className:m,disabled:i||o,onClick:c,"aria-label":l,"aria-pressed":u,style:_?g:void 0,children:[(0,E.jsxs)(`span`,{className:`btn__content`,style:{visibility:i?`hidden`:`visible`},children:[n&&r===`leading`&&(0,E.jsx)(n,{size:h}),p,n&&r===`trailing`&&(0,E.jsx)(n,{size:h})]}),i&&(0,E.jsx)(`span`,{className:`btn__spinner`,children:`✱`})]})}var de=p(`archive-restore`,[[`rect`,{width:`20`,height:`5`,x:`2`,y:`3`,rx:`1`,key:`1wp1u1`}],[`path`,{d:`M4 8v11a2 2 0 0 0 2 2h2`,key:`tvwodi`}],[`path`,{d:`M20 8v11a2 2 0 0 1-2 2h-2`,key:`1gkqxj`}],[`path`,{d:`m9 15 3-3 3 3`,key:`1pd0qc`}],[`path`,{d:`M12 12v9`,key:`192myk`}]]),fe=p(`archive`,[[`rect`,{width:`20`,height:`5`,x:`2`,y:`3`,rx:`1`,key:`1wp1u1`}],[`path`,{d:`M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8`,key:`1s80jp`}],[`path`,{d:`M10 12h4`,key:`a56b0p`}]]),pe=p(`bot`,[[`path`,{d:`M12 8V4H8`,key:`hb8ula`}],[`rect`,{width:`16`,height:`12`,x:`4`,y:`8`,rx:`2`,key:`enze0r`}],[`path`,{d:`M2 14h2`,key:`vft8re`}],[`path`,{d:`M20 14h2`,key:`4cs60a`}],[`path`,{d:`M15 13v2`,key:`1xurst`}],[`path`,{d:`M9 13v2`,key:`rq6x2g`}]]),A=p(`chevron-down`,[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]),me=p(`ellipsis-vertical`,[[`circle`,{cx:`12`,cy:`12`,r:`1`,key:`41hilf`}],[`circle`,{cx:`12`,cy:`5`,r:`1`,key:`gxeob9`}],[`circle`,{cx:`12`,cy:`19`,r:`1`,key:`lyex9k`}]]),he=p(`external-link`,[[`path`,{d:`M15 3h6v6`,key:`1q9fwt`}],[`path`,{d:`M10 14 21 3`,key:`gplh6r`}],[`path`,{d:`M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6`,key:`a6xqqp`}]]),ge=p(`gauge`,[[`path`,{d:`m12 14 4-4`,key:`9kzdfg`}],[`path`,{d:`M3.34 19a10 10 0 1 1 17.32 0`,key:`19p75a`}]]),j=p(`list-todo`,[[`path`,{d:`M13 5h8`,key:`a7qcls`}],[`path`,{d:`M13 12h8`,key:`h98zly`}],[`path`,{d:`M13 19h8`,key:`c3s6r1`}],[`path`,{d:`m3 17 2 2 4-4`,key:`1jhpwq`}],[`rect`,{x:`3`,y:`4`,width:`6`,height:`6`,rx:`1`,key:`cif1o7`}]]),_e=p(`message-square`,[[`path`,{d:`M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z`,key:`18887p`}]]),ve=p(`panel-left`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M9 3v18`,key:`fh3hqa`}]]),ye=p(`sliders-horizontal`,[[`path`,{d:`M10 5H3`,key:`1qgfaw`}],[`path`,{d:`M12 19H3`,key:`yhmn1j`}],[`path`,{d:`M14 3v4`,key:`1sua03`}],[`path`,{d:`M16 17v4`,key:`1q0r14`}],[`path`,{d:`M21 12h-9`,key:`1o4lsq`}],[`path`,{d:`M21 19h-5`,key:`1rlt1p`}],[`path`,{d:`M21 5h-7`,key:`1oszz2`}],[`path`,{d:`M8 10v4`,key:`tgpxqk`}],[`path`,{d:`M8 12H3`,key:`a7s4jb`}]]),be=p(`wand-sparkles`,[[`path`,{d:`m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72`,key:`ul74o6`}],[`path`,{d:`m14 7 3 3`,key:`1r5n42`}],[`path`,{d:`M5 6v4`,key:`ilb8ba`}],[`path`,{d:`M19 14v4`,key:`blhpug`}],[`path`,{d:`M10 2v2`,key:`7u0qdc`}],[`path`,{d:`M7 8H3`,key:`zfb6yr`}],[`path`,{d:`M21 16h-4`,key:`1cnmox`}],[`path`,{d:`M11 3H9`,key:`1obp7u`}]]),xe=p(`waypoints`,[[`path`,{d:`m10.586 5.414-5.172 5.172`,key:`4mc350`}],[`path`,{d:`m18.586 13.414-5.172 5.172`,key:`8c96vv`}],[`path`,{d:`M6 12h12`,key:`8npq4p`}],[`circle`,{cx:`12`,cy:`20`,r:`2`,key:`144qzu`}],[`circle`,{cx:`12`,cy:`4`,r:`2`,key:`muu5ef`}],[`circle`,{cx:`20`,cy:`12`,r:`2`,key:`1xzzfp`}],[`circle`,{cx:`4`,cy:`12`,r:`2`,key:`1hvhnz`}]]),Se=p(`zap`,[[`path`,{d:`M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z`,key:`1xq2db`}]]);function Ce({connected:e,onConnectClaude:t}){return e?(0,E.jsxs)(`span`,{className:`claude-status-pill`,"data-connected":`true`,title:`Claude is connected`,children:[(0,E.jsx)(`img`,{src:`/brand/claude.png`,alt:``,className:`claude-status-pill__mark`}),(0,E.jsx)(`span`,{className:`claude-status-pill__label`,children:`Connected`}),(0,E.jsx)(`span`,{className:`claude-status-pill__dot claude-status-pill__dot--live`,"aria-hidden":`true`})]}):(0,E.jsxs)(`button`,{type:`button`,className:`claude-status-pill claude-status-pill--action`,"data-connected":`false`,onClick:t,title:`Connect Claude`,children:[(0,E.jsx)(`img`,{src:`/brand/claude.png`,alt:``,className:`claude-status-pill__mark`}),(0,E.jsx)(`span`,{className:`claude-status-pill__label`,children:`Connect`}),(0,E.jsx)(`span`,{className:`claude-status-pill__dot claude-status-pill__dot--down`,"aria-hidden":`true`})]})}function we(e){return e===`/`||e===``?`Dashboard`:e.startsWith(`/chat`)?`Chat`:e.startsWith(`/tasks`)?`Tasks`:e.startsWith(`/data`)?`Data`:e.startsWith(`/calendar`)?`Calendar`:e.startsWith(`/graph`)?`Graph`:e.startsWith(`/activity`)?`Activity`:e.startsWith(`/browser`)?`Browser`:`Dashboard`}function Te({title:e,sidebarOpen:t,onToggleSidebar:n,claudeConnected:r,onConnectClaude:i}){let a=e??we(typeof window<`u`?window.location.pathname:`/`),o=r!==void 0&&i!==void 0;return(0,E.jsxs)(`header`,{className:`admin-page-header`,children:[(0,E.jsxs)(`button`,{type:`button`,className:`admin-page-header__toggle`,"aria-label":t?`Hide sidebar`:`Show sidebar`,title:t?`Hide sidebar`:`Show sidebar`,"aria-expanded":t,onClick:n,children:[(0,E.jsx)(ve,{className:`admin-page-header__toggle-desktop`,size:18,strokeWidth:1.75}),(0,E.jsx)(oe,{className:`admin-page-header__toggle-mobile`,size:22,strokeWidth:1.75})]}),(0,E.jsx)(`h1`,{className:`admin-page-header__title`,children:a}),o&&(0,E.jsx)(`div`,{className:`admin-page-header__right`,children:(0,E.jsx)(Ce,{connected:r,onConnectClaude:i})})]})}var Ee=[{label:`Home`,href:`/`,Icon:a,match:e=>e===`/`||e===``},{label:`Chat`,href:`/chat`,Icon:r,match:e=>e.startsWith(`/chat`)},{label:`Tasks`,href:`/tasks`,Icon:j,match:e=>e.startsWith(`/tasks`)},{label:`Data`,href:`/data`,Icon:t,match:e=>e.startsWith(`/data`)},{label:`Calendar`,href:`/calendar`,Icon:u,match:e=>e.startsWith(`/calendar`)}],De=[{label:`Chat`,href:`/`,Icon:r,match:e=>e===`/`||e===``||e.startsWith(`/chat`)},{label:`Data`,href:`/data`,Icon:t,match:e=>e.startsWith(`/data`)}];function Oe(e){let t=Ee.find(t=>t.match(e));return t?t.href:`/`}function M({variant:e=`admin`,onOpenConversations:t}={}){let n=typeof window<`u`?window.location.pathname:`/`,i=e===`operator`?De:Ee,a=e===`operator`?De.find(e=>e.match(n))?.href??`/`:Oe(n),o=e=>{let t=e.href===a,{Icon:n}=e;return(0,E.jsxs)(`a`,{href:e.href,className:`bottom-tab${t?` is-active`:``}`,"aria-current":t?`page`:void 0,children:[(0,E.jsx)(n,{size:19,strokeWidth:1.75}),(0,E.jsx)(`span`,{className:`bottom-tab__label`,children:e.label})]},e.href)};return(0,E.jsxs)(`nav`,{className:`bottom-tab-bar`,"aria-label":`Primary`,children:[i.slice(0,1).map(o),e===`operator`&&t&&(0,E.jsxs)(`button`,{type:`button`,className:`bottom-tab`,onClick:t,children:[(0,E.jsx)(r,{size:19,strokeWidth:1.75}),(0,E.jsx)(`span`,{className:`bottom-tab__label`,children:`Conversations`})]}),i.slice(1).map(o)]})}var ke=`maxy-shell-side-px`;function Ae(){if(typeof window>`u`)return 0;let e=document.querySelector(`.platform > .artefact`)?.getBoundingClientRect();return e&&e.width>0?Math.round(e.width):0}function N(e){if(typeof window>`u`)return e;let t=window.innerWidth,n=Math.max(248,t-480-Ae());return Math.min(Math.max(e,248),n)}function je(){if(typeof window>`u`)return 264;try{let e=window.localStorage.getItem(ke);if(!e)return 264;let t=parseInt(e,10);if(!Number.isFinite(t))return console.warn(`[admin-ui] sidebar-width-parse-failed stored=${JSON.stringify(e)} fallback=264`),264;if(t>=248)return N(t)}catch{}return 264}function Me({targetSelector:e=`.platform`}){let t=(0,D.useRef)(null),[n,r]=(0,D.useState)(()=>je()),i=(0,D.useRef)(n);(0,D.useLayoutEffect)(()=>{let t=document.querySelector(e);!t||!(t instanceof HTMLElement)||(t.style.setProperty(`--side-px`,`${n}px`),i.current=n)},[n,e]);let a=(0,D.useCallback)(()=>{r(e=>{let t=N(e);return t===e?e:t})},[]);(0,D.useEffect)(()=>{a(),window.addEventListener(`resize`,a);let t=document.querySelector(e),n=null;return t instanceof HTMLElement&&(n=new MutationObserver(a),n.observe(t,{attributes:!0,attributeFilter:[`data-artefact`,`class`]})),()=>{window.removeEventListener(`resize`,a),n?.disconnect()}},[a,e]);let o=e=>{e.preventDefault();let n=t.current;if(!n)return;n.setPointerCapture(e.pointerId),n.classList.add(`dragging`);let a=!1,o=e=>{a=!0,r(N(Math.round(e.clientX)))},s=()=>{if(n.releasePointerCapture(e.pointerId),n.classList.remove(`dragging`),window.removeEventListener(`pointermove`,o),window.removeEventListener(`pointerup`,s),!a)return;let t=i.current;try{window.localStorage.setItem(ke,String(t))}catch{}console.info(`[admin-ui] sidebar-resize px=${t}`)};window.addEventListener(`pointermove`,o),window.addEventListener(`pointerup`,s)},s=()=>{let e=N(264);r(e);try{window.localStorage.removeItem(ke)}catch{}console.info(`[admin-ui] sidebar-resize px=${e}`)};return(0,E.jsx)(`div`,{ref:t,className:`side-resize-handle`,role:`separator`,"aria-orientation":`vertical`,"aria-label":`Resize sidebar`,onPointerDown:o,onDoubleClick:s})}var Ne=g();function Pe(e){return Math.max(14,e/2-386)}function Fe(e){return e.left===0&&e.top===0&&e.width===0&&e.height===0}var Ie={position:`fixed`,visibility:`hidden`};function P({anchorRef:e,onClose:t,className:n,role:r,ariaLabel:i,anchorId:a,children:o}){let s=(0,D.useRef)(null),[c,l]=(0,D.useState)(Ie),u=(0,D.useRef)(null),d=(0,D.useCallback)(()=>{let t=s.current;if(!t)return;let r=e.current,i=[n,a].filter(Boolean).join(`:`)||`unknown`,o=t.getBoundingClientRect(),c=window.innerWidth,d=window.innerHeight,f=o.width>0&&o.height>0,p=r?r.getBoundingClientRect():null,m=(e,t)=>console.error(`[anchored-popover] op=offscreen id=${i} left=${e} top=${t} w=${o.width} h=${o.height} viewport=${c},${d}`),h=e=>{e!==u.current&&(u.current=e,console.log(e))};if(h(`[anchored-popover] op=anchor id=${i} present=${!!r} rect=${p?`${p.left},${p.top},${p.width},${p.height}`:`none`}`),!p){let e=Math.max(4,c-o.width-Pe(c)),t=Math.max(4,d-o.height-14);l({position:`fixed`,left:e,top:t,visibility:`visible`}),h(`[anchored-popover] op=placed id=${i} left=${e} top=${t} w=${o.width} h=${o.height} flipped=false clampedLeft=false clampedRight=false`);return}if(f&&Fe(p)){l(Ie),m(p.left,p.top);return}let g=p.right-o.width,_=c-o.width-4,v=!1,ee=!1;g>_&&(g=_,v=!0),g<4&&(g=4,ee=!0);let te=d-p.bottom-4,y=p.top-4,b=o.height+8<=te?!1:o.height+8<=y?!0:y>te,x=Math.max(0,b?y:te),S=b?Math.max(4,p.top-Math.min(o.height,x)):p.bottom;l({position:`fixed`,left:g,top:S,maxHeight:x,visibility:`visible`}),h(`[anchored-popover] op=placed id=${i} left=${g} top=${S} w=${o.width} h=${o.height} maxH=${x} flipped=${b} clampedLeft=${ee} clampedRight=${v}`);let ne=Math.min(o.height,x);f&&(g+o.width<=0||g>=c||S+ne<=0||S>=d)&&m(g,S)},[e,a,n]);return(0,D.useLayoutEffect)(()=>{if(d(),typeof ResizeObserver>`u`)return;let e=new ResizeObserver(()=>d());return s.current&&e.observe(s.current),()=>e.disconnect()},[d]),(0,D.useEffect)(()=>{let n=e=>{e.key===`Escape`&&t()},r=n=>{let r=n.target;e.current?.contains(r)||s.current?.contains(r)||t()},i=n=>{let r=e.current;r&&n.target instanceof Node&&n.target.contains(r)&&t()},a=()=>t();return document.addEventListener(`keydown`,n),document.addEventListener(`pointerdown`,r),window.addEventListener(`scroll`,i,!0),window.addEventListener(`resize`,a),()=>{document.removeEventListener(`keydown`,n),document.removeEventListener(`pointerdown`,r),window.removeEventListener(`scroll`,i,!0),window.removeEventListener(`resize`,a)}},[e,t]),(0,Ne.createPortal)((0,E.jsx)(`div`,{ref:s,className:n,role:r,"aria-label":i,style:c,children:o}),document.body)}function Le({actions:e,disabled:t}){let[n,r]=(0,D.useState)(!1),[i,a]=(0,D.useState)(null),o=(0,D.useRef)(null),s=(0,D.useCallback)(()=>{r(!1),a(null)},[]);return(0,E.jsxs)(`div`,{className:`conv-actions`,children:[(0,E.jsx)(`button`,{ref:o,type:`button`,className:`conv-action conv-actions-overflow`,onClick:()=>r(e=>!e),disabled:t,"aria-haspopup":`menu`,"aria-expanded":n,"aria-label":`Session actions`,title:`Session actions`,children:(0,E.jsx)(oe,{size:12})}),n&&(0,E.jsx)(P,{anchorRef:o,onClose:s,className:`conv-actions-menu`,role:`menu`,children:e.map(e=>e.panel?(0,E.jsxs)(`div`,{className:`conv-actions-menu-disclosure`,children:[(0,E.jsxs)(`button`,{type:`button`,role:`menuitem`,"aria-haspopup":`dialog`,"aria-expanded":i===e.key,disabled:t,onClick:()=>a(t=>t===e.key?null:e.key),children:[e.icon,(0,E.jsx)(`span`,{children:e.menuLabel})]}),i===e.key&&(0,E.jsx)(`div`,{className:`conv-actions-menu-panel`,children:e.panel()})]},e.key):(0,E.jsxs)(`button`,{type:`button`,role:`menuitem`,className:e.danger?`conv-action-danger`:void 0,"aria-busy":e.busy,disabled:t,onClick:t=>{e.onClick?.(t),s()},children:[e.icon,(0,E.jsx)(`span`,{children:e.menuLabel})]},e.key))})]})}var F=`claude-opus-4-8[1m]`,Re=`claude-sonnet-5`,I=`claude-haiku-4-5`,ze={[F]:`Opus 4.8 (1M context)`,[Re]:`Sonnet 5`,[I]:`Haiku 4.5`};function L(e){return ze[e]??e}var R=[F,Re,I];function Be(e){return e.replace(/\[1m\]$/,``)}function z(e){return R.find(t=>Be(t)===Be(e))??e}var Ve=[`default`,`acceptEdits`,`plan`,`auto`,`bypassPermissions`],B=[`low`,`medium`,`high`,`xhigh`];[...Ve],[...B],[...B];var V=[F,Re,I],He={default:`Ask permissions`,acceptEdits:`Accept edits`,plan:`Plan mode`,auto:`Auto mode`,bypassPermissions:`Bypass permissions`},H=Ve.map(e=>({value:e,label:He[e]??e})),U={low:`Low`,medium:`Medium`,high:`High`,xhigh:`Highest`},Ue=B.map(e=>({value:e,label:U[e]??e}));function We(e){if(e){let t=V.find(t=>Be(t)===Be(e));if(t)return t}return F}function Ge({row:e,adminFetch:t,onError:n}){let[r,i]=(0,D.useState)(()=>We(e.model)),[a,o]=(0,D.useState)(``),[s,c]=(0,D.useState)(``),[l,u]=(0,D.useState)(!1),d=(0,D.useRef)(!1);(0,D.useEffect)(()=>{i(We(e.model))},[e.model]);let f=async()=>{if(!d.current){d.current=!0,u(!0);try{let i=await t(`/api/admin/session-reseat`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({fromSessionId:e.sessionId,model:r,...a?{permissionMode:a}:{},...s?{effort:s}:{}})});if(!i.ok){n(`Could not reset ${e.title} (status ${i.status})`),console.error(`[admin-ui] dashboard-reseat-failed sessionId=${e.sessionId} status=${i.status}`),d.current=!1,u(!1);return}let o=await i.json().catch(()=>({}));o.target?window.location.assign(o.target):(n(`Reset of ${e.title} returned no target`),d.current=!1,u(!1))}catch(t){n(`Could not reset ${e.title} (network error)`),console.error(`[admin-ui] dashboard-reseat-failed sessionId=${e.sessionId} error=${t instanceof Error?t.message:String(t)}`),d.current=!1,u(!1)}}};return(0,E.jsxs)(E.Fragment,{children:[(0,E.jsxs)(`label`,{className:`reseat-field`,children:[(0,E.jsx)(`span`,{children:`Model`}),(0,E.jsx)(`select`,{"data-kind":`model`,value:r,disabled:l,onChange:e=>i(e.target.value),children:V.map(e=>(0,E.jsx)(`option`,{value:e,children:L(e)},e))})]}),(0,E.jsxs)(`label`,{className:`reseat-field`,children:[(0,E.jsx)(`span`,{children:`Mode`}),(0,E.jsxs)(`select`,{"data-kind":`mode`,value:a,disabled:l,onChange:e=>o(e.target.value),children:[(0,E.jsx)(`option`,{value:``,children:`Keep current`}),H.map(e=>(0,E.jsx)(`option`,{value:e.value,children:e.label},e.value))]})]}),(0,E.jsxs)(`label`,{className:`reseat-field`,children:[(0,E.jsx)(`span`,{children:`Effort`}),(0,E.jsxs)(`select`,{"data-kind":`effort`,value:s,disabled:l,onChange:e=>c(e.target.value),children:[(0,E.jsx)(`option`,{value:``,children:`Keep current`}),Ue.map(e=>(0,E.jsx)(`option`,{value:e.value,children:e.label},e.value))]})]}),(0,E.jsx)(`button`,{type:`button`,className:`reseat-apply`,disabled:l,"aria-busy":l,onClick:()=>void f(),children:l?(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(h,{size:12,className:`spin`,"aria-hidden":`true`}),`Resetting…`]}):`Reset`})]})}function Ke(e){if(e<60)return`${e}s`;let t=Math.floor(e/60),n=e%60;return n>0?`${t}m ${n}s`:`${t}m`}function qe(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function Je({target:e,anchorEl:t,onConfirm:n,onCancel:r}){let i=(0,D.useRef)(null);return i.current=t,e?(0,E.jsxs)(P,{anchorRef:i,onClose:r,className:`conv-delete-confirm`,role:`alertdialog`,ariaLabel:`Confirm delete session`,children:[(0,E.jsxs)(`div`,{className:`claude-info-header`,children:[(0,E.jsx)(`span`,{children:`Delete this conversation?`}),(0,E.jsx)(`button`,{className:`claude-info-close`,onClick:r,"aria-label":`Close`,children:`✕`})]}),(0,E.jsxs)(`div`,{className:`claude-info-section`,style:{padding:`12px 14px`,fontSize:`11px`,color:`var(--text-secondary)`},children:[(0,E.jsxs)(`div`,{className:`conv-delete-target`,children:[(0,E.jsx)(`span`,{className:`conv-delete-label`,title:e.title,children:e.title||`Untitled session`}),(0,E.jsx)(`code`,{className:`conv-delete-id`,title:e.sessionId,children:e.sessionId.slice(0,8)})]}),(0,E.jsx)(`div`,{style:{marginTop:`8px`},children:`This permanently removes the transcript. It is not moved to Archive and cannot be recovered.`}),e.live&&(0,E.jsx)(`div`,{style:{marginTop:`8px`},children:`This session is running; deleting stops it first.`})]}),(0,E.jsxs)(`div`,{className:`claude-info-section`,style:{display:`flex`,gap:`8px`,padding:`10px 14px`},children:[(0,E.jsx)(k,{variant:`danger`,size:`sm`,style:{flex:1},onClick:n,children:`Delete`}),(0,E.jsx)(k,{variant:`secondary`,size:`sm`,style:{flex:1},onClick:r,children:`Cancel`})]})]}):null}function Ye({open:e,count:t,liveCount:n,onConfirm:r,onCancel:i}){if(!e)return null;let a=t===1?``:`s`;return(0,E.jsx)(`div`,{className:`claude-info-overlay`,onClick:i,children:(0,E.jsxs)(`div`,{className:`claude-info-modal`,onClick:e=>e.stopPropagation(),role:`alertdialog`,"aria-label":`Confirm delete sessions`,children:[(0,E.jsxs)(`div`,{className:`claude-info-header`,children:[(0,E.jsxs)(`span`,{children:[`Delete `,t,` conversation`,a,`?`]}),(0,E.jsx)(`button`,{className:`claude-info-close`,onClick:i,"aria-label":`Close`,children:`✕`})]}),(0,E.jsxs)(`div`,{className:`claude-info-section`,style:{padding:`12px 14px`,fontSize:`11px`,color:`var(--text-secondary)`},children:[`This permanently removes `,t,` transcript`,a,`. `,t===1?`It is`:`They are`,` not moved to Archive and cannot be recovered.`,n>0&&(0,E.jsxs)(`div`,{style:{marginTop:`8px`},children:[n,` `,n===1?`is`:`are`,` running and will be stopped first.`]})]}),(0,E.jsxs)(`div`,{className:`claude-info-section`,style:{display:`flex`,gap:`8px`,padding:`10px 14px`},children:[(0,E.jsxs)(k,{variant:`danger`,size:`sm`,style:{flex:1},onClick:r,children:[`Delete `,t]}),(0,E.jsx)(k,{variant:`secondary`,size:`sm`,style:{flex:1},onClick:i,children:`Cancel`})]})]})})}var Xe=`auth-refresh-failed`;function Ze({error:e,onClose:t}){if(!e)return null;let n=e.reason===Xe,r=n?`Claude sign-in expired`:`Session didn’t open`,i=n?`Your claude.ai login has expired. Re-authenticate to resume sessions.`:`The session did not bind within 60 seconds, so there is no live conversation to open.`;return(0,E.jsx)(`div`,{className:`claude-info-overlay`,onClick:t,children:(0,E.jsxs)(`div`,{className:`claude-info-modal`,onClick:e=>e.stopPropagation(),role:`alertdialog`,"aria-label":`Session could not be opened`,children:[(0,E.jsxs)(`div`,{className:`claude-info-header`,children:[(0,E.jsx)(`span`,{children:r}),(0,E.jsx)(`button`,{className:`claude-info-close`,onClick:t,"aria-label":`Close`,children:`✕`})]}),(0,E.jsxs)(`div`,{className:`claude-info-section`,style:{padding:`12px 14px`,fontSize:`11px`,color:`var(--text-secondary)`},children:[i,(0,E.jsxs)(`div`,{className:`claude-info-row`,style:{marginTop:`8px`},children:[(0,E.jsx)(`span`,{className:`claude-info-label`,children:`Reason`}),(0,E.jsx)(`span`,{className:`claude-info-value`,children:e.reason})]}),e.sessionId&&(0,E.jsxs)(`div`,{className:`claude-info-row`,children:[(0,E.jsx)(`span`,{className:`claude-info-label`,children:`Session`}),(0,E.jsxs)(`span`,{className:`claude-info-value`,children:[e.sessionId.slice(0,8),`…`]})]})]})]})})}function Qe(e){let{show:t,onClose:n,claudeInfo:r,messages:i,sessionElapsed:a,sessionId:o,cacheKey:s}=e,[c,l]=(0,D.useState)(null);if(!t)return null;let u=i.flatMap(e=>e.events?.filter(e=>e.type===`usage`)??[]),d=u.at(-1),f=d?.peak_request_pct==null?d?.context_window?Math.round((d.input_tokens+d.cache_creation_tokens+d.cache_read_tokens)/d.context_window*100):0:Math.round(d.peak_request_pct*100),p=u.reduce((e,t)=>e+t.input_tokens+t.cache_creation_tokens+t.cache_read_tokens+t.output_tokens,0),m=i.flatMap(e=>e.events?.filter(e=>e.type===`rate_limit`)??[]).at(-1),h=u.reduce((e,t)=>e+(t.total_cost_usd??0),0),g=r?.account?.subscriptionType,_=e=>{let t=e*1e3-Date.now();if(t<=0)return`now`;let n=Math.floor(t/36e5),r=Math.floor(t%36e5/6e4);return n>0?`${n}h ${r}m`:`${r}m`};return(0,E.jsx)(`div`,{className:`claude-info-overlay`,onClick:n,children:(0,E.jsxs)(`div`,{className:`claude-info-modal`,onClick:e=>e.stopPropagation(),children:[(0,E.jsxs)(`div`,{className:`claude-info-header`,children:[(0,E.jsx)(`img`,{src:`/brand/claude.png`,alt:`Claude`,className:`claude-info-icon`}),(0,E.jsx)(`span`,{children:`Claude Code`}),(0,E.jsx)(`button`,{className:`claude-info-close`,onClick:n,"aria-label":`Close`,children:`✕`})]}),(0,E.jsxs)(`div`,{className:`claude-info-section`,children:[(0,E.jsxs)(`div`,{className:`claude-info-row`,children:[(0,E.jsx)(`span`,{className:`claude-info-label`,children:`Version`}),(0,E.jsx)(`span`,{className:`claude-info-value`,children:r?r.version:`…`})]}),(0,E.jsxs)(`div`,{className:`claude-info-row`,children:[(0,E.jsx)(`span`,{className:`claude-info-label`,children:`Email`}),(0,E.jsx)(`span`,{className:`claude-info-value`,children:r?.account?.email??`…`})]})]}),(g||m||h>0)&&(0,E.jsxs)(`div`,{className:`claude-info-section`,children:[g&&(0,E.jsxs)(`div`,{className:`claude-info-row`,children:[(0,E.jsx)(`span`,{className:`claude-info-label`,children:`Plan`}),(0,E.jsx)(`span`,{className:`claude-info-value`,style:{textTransform:`capitalize`},children:g})]}),m&&(0,E.jsxs)(E.Fragment,{children:[(0,E.jsxs)(`div`,{className:`claude-info-row`,children:[(0,E.jsx)(`span`,{className:`claude-info-label`,children:`Usage`}),(0,E.jsxs)(`span`,{className:`claude-info-value`,children:[Math.round(m.utilization*100),`%`]})]}),(0,E.jsxs)(`div`,{className:`claude-info-row`,children:[(0,E.jsx)(`span`,{className:`claude-info-label`,children:`Resets in`}),(0,E.jsx)(`span`,{className:`claude-info-value`,children:_(m.resetsAt)})]}),m.isUsingOverage&&(0,E.jsxs)(`div`,{className:`claude-info-row`,children:[(0,E.jsx)(`span`,{className:`claude-info-label`,children:`Overage`}),(0,E.jsx)(`span`,{className:`claude-info-value`,children:`Active`})]})]}),h>0&&(0,E.jsxs)(`div`,{className:`claude-info-row`,children:[(0,E.jsx)(`span`,{className:`claude-info-label`,children:`Session cost`}),(0,E.jsxs)(`span`,{className:`claude-info-value`,children:[`$`,h<.01?h.toFixed(4):h.toFixed(2)]})]})]}),(0,E.jsxs)(`div`,{className:`claude-info-section`,children:[(0,E.jsxs)(`div`,{className:`claude-info-row`,children:[(0,E.jsx)(`span`,{className:`claude-info-label`,children:`Model`}),(0,E.jsx)(`span`,{className:`claude-info-value`,children:r?.model??`…`})]}),(0,E.jsxs)(`div`,{className:`claude-info-row`,children:[(0,E.jsx)(`span`,{className:`claude-info-label`,children:`Context used`}),(0,E.jsx)(`span`,{className:`claude-info-value`,children:f>0?`${f}%`:`—`})]}),(0,E.jsxs)(`div`,{className:`claude-info-row`,children:[(0,E.jsx)(`span`,{className:`claude-info-label`,children:`Tokens`}),(0,E.jsx)(`span`,{className:`claude-info-value`,children:p>0?qe(p):`—`})]}),(0,E.jsxs)(`div`,{className:`claude-info-row`,children:[(0,E.jsx)(`span`,{className:`claude-info-label`,children:`Session`}),(0,E.jsx)(`span`,{className:`claude-info-value`,children:Ke(a)})]}),(o||s)&&(()=>{let e=o??s??``;return(0,E.jsxs)(`div`,{className:`claude-info-row`,children:[(0,E.jsx)(`span`,{className:`claude-info-label`,children:`Session`}),(0,E.jsx)(`button`,{type:`button`,className:`claude-info-value claude-info-id-copy`,title:`${e} (${o?`flushed`:`pre-flush`}) — click to copy`,onClick:async()=>{l(await w(e)?`copied`:`failed`),setTimeout(()=>l(null),1200)},children:c===`copied`?`copied ✓`:c===`failed`?`copy failed ✕`:`${e.slice(0,8)}…`})]})})()]})]})})}function $e({open:e,onConnect:t,onClose:n}){return e?(0,E.jsx)(`div`,{className:`claude-info-overlay`,onClick:n,children:(0,E.jsxs)(`div`,{className:`claude-info-modal`,onClick:e=>e.stopPropagation(),role:`alertdialog`,"aria-label":`Claude is not connected`,children:[(0,E.jsxs)(`div`,{className:`claude-info-header`,children:[(0,E.jsx)(`span`,{children:`Claude isn’t connected`}),(0,E.jsx)(`button`,{className:`claude-info-close`,onClick:n,"aria-label":`Close`,children:`✕`})]}),(0,E.jsxs)(`div`,{className:`claude-info-section`,style:{padding:`12px 14px`,fontSize:`11px`,color:`var(--text-secondary)`,display:`flex`,flexDirection:`column`,gap:`10px`},children:[(0,E.jsx)(`span`,{children:`This needs Claude, which is currently disconnected. Connect to continue — the rest of the dashboard stays available either way.`}),(0,E.jsxs)(`div`,{style:{display:`flex`,gap:`8px`,alignItems:`center`},children:[(0,E.jsx)(k,{variant:`primary`,size:`sm`,onClick:t,children:`Connect Claude`}),(0,E.jsx)(`button`,{type:`button`,className:`claude-info-close`,style:{fontSize:`11px`},onClick:n,children:`Not now`})]})]})]})}):null}function et(e){let t=Math.round(e/6e4),n=Math.floor(t/60),r=t%60;return`${n}h ${String(r).padStart(2,`0`)}m`}function W(e){return e.activeMs.thinking+e.activeMs.messaging+e.activeMs.toolUse}function tt(e){return e.toLocaleString(`en-GB`)}function nt(e){return`£${e.toFixed(2)}`}function rt(e){let t=[`Day`,`Active`,`Output tokens`,`Input tokens`,`Cache write`,`Cache read`,`Opus 4.8 (GBP)`,`Sonnet 4.6 (GBP)`],n=(e,t)=>[e,et(W(t)),String(t.tokens.output),String(t.tokens.input),String(t.tokens.cacheWrite),String(t.tokens.cacheRead),t.costGBP.opus.toFixed(2),t.costGBP.sonnet.toFixed(2)];return[t,...e.days.map(e=>n(e.date,e)),n(`TOTAL (${e.days.length} d)`,e.totals)].map(e=>e.join(`,`)).join(`
2
- `)}function it({label:e,d:t,bold:n}){let r=n?`th`:`td`;return(0,E.jsxs)(`tr`,{className:n?`usage-total-row`:void 0,children:[(0,E.jsx)(r,{className:`usage-day`,children:e}),(0,E.jsx)(r,{children:et(W(t))}),(0,E.jsx)(r,{children:tt(t.tokens.output)}),(0,E.jsx)(r,{children:tt(t.tokens.input)}),(0,E.jsx)(r,{children:tt(t.tokens.cacheWrite)}),(0,E.jsx)(r,{children:tt(t.tokens.cacheRead)}),(0,E.jsx)(r,{children:nt(t.costGBP.opus)}),(0,E.jsx)(r,{children:nt(t.costGBP.sonnet)})]})}function at({show:e,onClose:t,anchorEl:n,sessionId:r,summary:i,loading:a,error:o}){let s=(0,D.useRef)(null);if(s.current=n,!e)return null;let c=!!i&&i.days.length>0;return(0,E.jsxs)(P,{anchorRef:s,onClose:t,className:`usage-popover`,role:`dialog`,ariaLabel:`Session usage and cost`,anchorId:r??void 0,children:[(0,E.jsxs)(`div`,{className:`claude-info-header`,children:[(0,E.jsxs)(`span`,{children:[`Usage & cost`,r?` · ${r.slice(0,8)}`:``]}),c&&(0,E.jsx)(`button`,{className:`usage-download`,onClick:()=>{if(!i)return;let e=new Blob([rt(i)],{type:`text/csv;charset=utf-8`}),t=URL.createObjectURL(e),n=document.createElement(`a`);n.href=t,n.download=`usage-${r?r.slice(0,8):`session`}.csv`,document.body.appendChild(n),n.click(),n.remove(),URL.revokeObjectURL(t)},"aria-label":`Download as CSV`,title:`Download as CSV`,children:(0,E.jsx)(S,{size:14})}),(0,E.jsx)(`button`,{className:`claude-info-close`,onClick:t,"aria-label":`Close`,children:(0,E.jsx)(b,{size:14})})]}),(0,E.jsxs)(`div`,{className:`claude-info-section usage-body`,children:[a&&(0,E.jsx)(`div`,{className:`usage-note`,children:`Computing usage…`}),!a&&o&&(0,E.jsx)(`div`,{className:`usage-note usage-error`,children:o}),!a&&!o&&i&&i.days.length===0&&(0,E.jsx)(`div`,{className:`usage-note`,children:`No usage recorded for this session yet.`}),!a&&!o&&i&&i.days.length>0&&(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(`div`,{className:`usage-table-scroll`,children:(0,E.jsxs)(`table`,{className:`usage-table`,children:[(0,E.jsx)(`thead`,{children:(0,E.jsxs)(`tr`,{children:[(0,E.jsx)(`th`,{className:`usage-day`,children:`Day`}),(0,E.jsx)(`th`,{children:`Active`}),(0,E.jsx)(`th`,{children:`Output tok`}),(0,E.jsx)(`th`,{children:`Input tok`}),(0,E.jsx)(`th`,{children:`Cache write`}),(0,E.jsx)(`th`,{children:`Cache read`}),(0,E.jsx)(`th`,{children:`Opus 4.8 (£)`}),(0,E.jsx)(`th`,{children:`Sonnet 4.6 (£)`})]})}),(0,E.jsxs)(`tbody`,{children:[i.days.map(e=>(0,E.jsx)(it,{label:e.date,d:e},e.date)),(0,E.jsx)(it,{label:`TOTAL (${i.days.length} d)`,d:i.totals,bold:!0})]})]})}),(0,E.jsxs)(`div`,{className:`usage-note usage-caveats`,children:[`Prices dated `,i.pricing.opusPriceDate,` · £/$ `,i.pricing.usdPerGbp,` · Sonnet tokenizer factor `,i.pricing.tokenizerFactor,`. Idle human-wait dominates the calendar span; cache-read tokens dominate cost; Sonnet is a tokenizer-adjusted estimate.`]})]})]})]})}var ot=`https://claude.ai/code`,st=200,ct=[500,1e3,1500,2e3,2500,3e3,3e3];function lt(e,t,n){if(e&&n.target)return{kind:`navigate`,url:n.target,sameOrigin:!0};let r=n.slug??n.bridgeSessionId??null;if(e&&r)return{kind:`navigate`,url:`${ot}/${r}`,sameOrigin:!1};let i=n.reason||n.error||`status ${t}`;return{kind:`error`,sessionId:n.sessionId??null,reason:i}}function ut(e){if(!e)return``;let t=Date.parse(e);return Number.isFinite(t)?new Date(t).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`}):``}function dt(e){let{businessName:n,cacheKey:o,onConnectClaude:s,role:p,userName:g,userAvatar:te,onSelectProjects:b,onSelectTasks:S,onCloseMobileDrawer:w,collapsed:re,onSelectData:oe,initialDataSurface:ce=!1,onLogout:ue,onDisconnect:O,disconnecting:k,claudeConnected:ve=!0,subAccounts:Ce,activeAccountId:we,switchingAccount:Te,onSwitchAccount:Ee,refreshAccounts:De,onOpenConversations:Oe}=e,M=ne(o),ke=(0,D.useCallback)(e=>({key:`reseat`,label:`Reset session ${e.title} (model, mode, effort)`,menuLabel:`Reset`,title:`Reset — move this session onto a chosen model, mode, and effort`,icon:(0,E.jsx)(ye,{size:12}),panel:()=>(0,E.jsx)(Ge,{row:e,adminFetch:M,onError:e=>R({message:e,failed:!0})})}),[M]),Ae=c.productName,N=n||Ae,je=typeof g==`string`?g:g===null?`name unavailable`:N,Me=(je.trim().charAt(0)||`?`).toUpperCase(),[Ne,Pe]=(0,D.useState)(ce?`data`:`sessions`),[Fe,Ie]=(0,D.useState)(!1),[P,F]=(0,D.useState)(!1),Re=!re&&(Ce?.length??0)>1&&!!Ee,I=Ce?.find(e=>e.isHouse)??null,ze=(0,D.useCallback)(()=>{if(I){if(I.accountId===we){console.info(`[admin-ui] op=subaccount-switch-house anchor=brand-icon accountId=${I.accountId.slice(0,8)} switched=false reason=already-house`);return}console.info(`[admin-ui] op=subaccount-switch-house anchor=brand-icon accountId=${I.accountId.slice(0,8)} switched=true`),F(!1),Ee?.(I.accountId,`/`)}},[I,we,Ee]),[L,R]=(0,D.useState)(null),[Be,z]=(0,D.useState)(null),[Ve,B]=(0,D.useState)(!1),[V,He]=(0,D.useState)([]),[H]=(0,D.useState)(()=>typeof window>`u`?null:new URLSearchParams(window.location.search).get(`session`)),[U,Ue]=(0,D.useState)(!1),[We,Ke]=(0,D.useState)(null),[qe,Xe]=(0,D.useState)(!1),[Qe,et]=(0,D.useState)(!1),[W,tt]=(0,D.useState)(!1),[nt,rt]=(0,D.useState)(null),[it,ot]=(0,D.useState)(new Set),dt=(0,D.useRef)(new Map),[G,mt]=(0,D.useState)(!1),[K,ht]=(0,D.useState)(new Set),[gt,_t]=(0,D.useState)(!1),[q,vt]=(0,D.useState)(null),[yt,bt]=(0,D.useState)(new Set),[xt,St]=(0,D.useState)(new Set),[Ct,wt]=(0,D.useState)(new Set),[J,Y]=(0,D.useState)(null),[Tt,Et]=(0,D.useState)(``),[Dt,Ot]=(0,D.useState)(!1),[kt,At]=(0,D.useState)(null),[jt,Mt]=(0,D.useState)(null),[Nt,Pt]=(0,D.useState)(!1),[Ft,It]=(0,D.useState)(null),[X,Lt]=(0,D.useState)(!1),Rt=(0,D.useRef)(0);(0,D.useEffect)(()=>{if(!L)return;let e=setTimeout(()=>R(null),2500);return()=>clearTimeout(e)},[L]);let zt=H!=null&&V.some(e=>e.sessionId===H);(0,D.useEffect)(()=>{H==null||!U||console.info(`[sidebar-sessions] op=select-highlight session=${H.slice(0,8)} matched=${zt}`)},[H,zt,U]);let Z=(0,D.useCallback)(async()=>{if(!o)return null;let e=++Rt.current;Xe(!0),Ke(null);try{let t=await M(`/api/admin/sidebar-sessions`);if(!t.ok)throw Error(`status ${t.status}`);let n=await t.json(),r=n.sessions??[];return e===Rt.current?(He(r),rt(n.accountId??null),Ue(!0),r):(console.info(`[admin-ui] sidebar-sessions-stale-response-dropped token=${e}`),r)}catch(t){let n=t instanceof Error?t.message:String(t);return e===Rt.current&&Ke(`Failed to load sessions: ${n}`),console.error(`[admin-ui] sidebar-sessions fetch failed: ${n}`),null}finally{e===Rt.current&&Xe(!1)}},[o,M]);(0,D.useEffect)(()=>{!o||U||Z()},[o,U,Z]),(0,D.useEffect)(()=>{if(!o)return;let e=null;function t(){console.info(`[admin-ui] sidebar-refresh surface=sessions trigger=poll`),Z()}function n(){e===null&&(e=setInterval(t,ft))}function r(){e!==null&&(clearInterval(e),e=null)}function i(){document.hidden?r():(t(),n())}return document.hidden||n(),document.addEventListener(`visibilitychange`,i),()=>{r(),document.removeEventListener(`visibilitychange`,i)}},[o,Z]);let Bt=()=>{console.info(`[admin-ui] sidebar-refresh surface=sessions trigger=manual`),Z()},Vt=()=>{Pe(`data`),console.info(`[admin-ui] sidebar-nav surface=data collapsed=${re}`),oe(),w()},Q=typeof window<`u`&&window.location?.pathname||`/`,Ht=Ne===`data`,Ut=typeof window<`u`&&window.location?.search||``,Wt=new URLSearchParams(Ut),Gt=Wt.has(`label`)&&!Wt.has(`nodeId`),$=e=>{w(),window.location.href=e},Kt=[{key:`dashboard`,label:`Dashboard`,icon:(0,E.jsx)(a,{size:17,strokeWidth:1.75}),active:Q===`/`&&!Ht,onClick:()=>$(`/`)},{key:`chat`,label:`Chat`,icon:(0,E.jsx)(r,{size:17,strokeWidth:1.75}),active:Q.startsWith(`/chat`),onClick:()=>$(`/chat`)},{key:`tasks`,label:`Tasks`,icon:(0,E.jsx)(j,{size:17,strokeWidth:1.75}),active:Q.startsWith(`/tasks`),onClick:()=>{S(),w()}},{key:`calendar`,label:`Calendar`,icon:(0,E.jsx)(u,{size:17,strokeWidth:1.75}),active:Q.startsWith(`/calendar`),onClick:()=>$(`/calendar`)},{key:`routines`,label:`Routines`,icon:(0,E.jsx)(Se,{size:17,strokeWidth:1.75}),active:Q.startsWith(`/routines`),onClick:()=>$(`/routines`)},{key:`skills`,label:`Skills`,icon:(0,E.jsx)(be,{size:17,strokeWidth:1.75}),active:Q.startsWith(`/skills`),onClick:()=>$(`/skills`)},{key:`agents`,label:`Agents`,icon:(0,E.jsx)(pe,{size:17,strokeWidth:1.75}),active:Q.startsWith(`/agents`),onClick:()=>$(`/agents`)},{key:`data`,label:`Data`,icon:(0,E.jsx)(t,{size:17,strokeWidth:1.75}),active:Ht,onClick:Vt},{key:`container`,label:se().term,icon:(0,E.jsx)(f,{size:17,strokeWidth:1.75}),active:Q.startsWith(`/graph`)&&Gt,onClick:()=>{b(),w()}},{key:`graph`,label:`Graph`,icon:(0,E.jsx)(xe,{size:17,strokeWidth:1.75}),active:Q.startsWith(`/graph`)&&!Gt,onClick:()=>$(`/graph`)},{key:`activity`,label:`Activity`,icon:(0,E.jsx)(d,{size:17,strokeWidth:1.75}),active:Q.startsWith(`/activity`),onClick:()=>$(`/activity`)},{key:`browser`,label:`Browser`,icon:(0,E.jsx)(i,{size:17,strokeWidth:1.75}),active:Q.startsWith(`/browser`),onClick:()=>$(`/browser`)}],qt=(0,D.useCallback)(async e=>{if(yt.has(e.sessionId))return;bt(t=>{let n=new Set(t);return n.add(e.sessionId),n});let t=window.open(``,`_blank`);try{let n=await M(`/api/admin/session-rc-spawn`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({sessionId:e.sessionId,name:e.title||e.sessionId,...e.accountId?{targetAccountId:e.accountId}:{}})}),r=await n.json().catch(()=>({})),i=lt(n.ok,n.status,{...r,sessionId:r.sessionId??e.sessionId});console.info(`[admin-ui] sidebar-session-resume sessionId=${e.sessionId} status=${n.status} outcome=${i.kind} slug=${r.slug??r.bridgeSessionId??`none`}`),i.kind===`navigate`?(w(),t?t.location.href=i.url:window.open(i.url,`_blank`)):(t?.close(),console.error(`[admin-ui] sidebar-session-resume-failed sessionId=${e.sessionId} status=${n.status} reason=${i.reason}`),z(i))}catch(n){t?.close();let r=n instanceof Error?n.message:String(n);console.error(`[admin-ui] sidebar-session-resume-failed sessionId=${e.sessionId} error=${r}`),z({sessionId:e.sessionId,reason:r})}finally{bt(t=>{let n=new Set(t);return n.delete(e.sessionId),n})}},[M,w,yt]),Jt=(0,D.useCallback)(async e=>{let t=e.slice(0,8);for(let n=1;n<=ct.length;n++){await new Promise(e=>setTimeout(e,ct[n-1]));let r=await Z();if(r&&r.some(t=>t.sessionId===e)){console.info(`[admin-ui] sidebar-new-session-converged sessionId=${t} via=retry attempts=${n}`);return}}console.error(`[admin-ui] sidebar-new-session-converge-timeout sessionId=${t}`)},[Z]),Yt=(0,D.useCallback)(async()=>{if(!X){Lt(!0);try{let e=await M(`/api/admin/session-rc-spawn`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({})}),t=await e.json().catch(()=>({})),n=lt(e.ok,e.status,t);console.info(`[admin-ui] sidebar-new-session-spawned status=${e.status} outcome=${n.kind} slug=${t.slug??t.bridgeSessionId??`none`}`),n.kind===`navigate`?n.sameOrigin?window.location.assign(n.url):(window.open(n.url,`_blank`),t.sessionId?Jt(t.sessionId):console.error(`[admin-ui] sidebar-new-session-converge-skipped reason=no-session-id`)):e.status===503||n.reason===`claude-auth-dead`?(console.info(`[admin-ui] op=llm-action-blocked action=spawn reason=claude-disconnected`),B(!0)):(console.error(`[admin-ui] sidebar-new-session-failed status=${e.status} reason=${n.reason}`),z(n))}catch(e){let t=e instanceof Error?e.message:String(e);console.error(`[admin-ui] sidebar-new-session-failed error=${t}`),z({sessionId:null,reason:t})}finally{Lt(!1)}}},[M,X,Jt]),Xt=(0,D.useCallback)((e,t)=>{e.stopPropagation(),vt(t)},[]),Zt=(0,D.useCallback)(async(e,t)=>{e.stopPropagation(),At(t),Mt(null),It(null),Pt(!0);try{let e=await M(`/api/admin/session-usage?sessionId=${encodeURIComponent(t.sessionId)}`),n=await e.json().catch(()=>({}));e.ok?Mt(n):It(n.error??`status ${e.status}`)}catch(e){It(e instanceof Error?e.message:String(e))}finally{Pt(!1)}},[M]),Qt=(0,D.useCallback)(async(e,t={})=>{let n=t.refresh??!0;if(it.has(e.sessionId))return!1;ot(t=>{let n=new Set(t);return n.add(e.sessionId),n});try{let t=await M(`/api/admin/session-delete`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({sessionId:e.sessionId})});if(!t.ok){let n=await t.json().catch(()=>({}));return console.error(`[admin-ui] sidebar-session-delete-failed sessionId=${e.sessionId} status=${t.status} error=${n.error??`unknown`}`),R({message:`Delete failed: ${n.error??`status ${t.status}`}`,failed:!0}),!1}let r=await t.json();return console.info(`[admin-ui] sidebar-session-delete sessionId=${e.sessionId} live=${e.live} confirmed=true pidKilled=${r.pidKilled??`?`} deleted=${r.deleted??`?`}`),He(t=>t.filter(t=>t.sessionId!==e.sessionId)),n&&Z(),!0}catch(t){let n=t instanceof Error?t.message:String(t);return console.error(`[admin-ui] sidebar-session-delete-failed sessionId=${e.sessionId} error=${n}`),R({message:`Delete failed: ${n}`,failed:!0}),!1}finally{ot(t=>{let n=new Set(t);return n.delete(e.sessionId),n})}},[M,it,Z]),$t=(0,D.useCallback)(e=>{ht(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),en=(0,D.useCallback)(()=>{mt(!1),ht(new Set)},[]),tn=(0,D.useCallback)(async()=>{let e=[...K].map(e=>V.find(t=>t.sessionId===e)).filter(e=>!!e),t=e.filter(e=>e.live).length;console.info(`[admin-ui] sidebar-bulk-delete op=start count=${e.length} live=${t}`);let n=(await Promise.all(e.map(e=>Qt(e,{refresh:!1})))).filter(Boolean).length;console.info(`[admin-ui] sidebar-bulk-delete op=done requested=${e.length} ok=${n} failed=${e.length-n}`),Z(),en()},[K,V,Qt,Z,en]),nn=(0,D.useCallback)(async(e,t)=>{if(e.stopPropagation(),!xt.has(t.sessionId)){St(e=>{let n=new Set(e);return n.add(t.sessionId),n});try{let e=await M(`/api/admin/session-stop`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({sessionId:t.sessionId})});if(!e.ok){let n=await e.json().catch(()=>({}));console.error(`[admin-ui] sidebar-session-stop-failed sessionId=${t.sessionId} status=${e.status} error=${n.error??`unknown`}`),R({message:`Stop failed: ${n.error??`status ${e.status}`}`,failed:!0});return}console.info(`[admin-ui] sidebar-session-stop sessionId=${t.sessionId}`),Z()}catch(e){let n=e instanceof Error?e.message:String(e);console.error(`[admin-ui] sidebar-session-stop-failed sessionId=${t.sessionId} error=${n}`),R({message:`Stop failed: ${n}`,failed:!0})}finally{St(e=>{let n=new Set(e);return n.delete(t.sessionId),n})}}},[M,xt,Z]),rn=(0,D.useCallback)(async(e,t,n)=>{if(e.stopPropagation(),!Ct.has(t.sessionId)){wt(e=>{let n=new Set(e);return n.add(t.sessionId),n});try{let e=await M(`/api/admin/session-archive`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({sessionId:t.sessionId,mode:n})});if(!e.ok){let r=await e.json().catch(()=>({})),i=r.detail??r.error??`status ${e.status}`;console.error(`[admin-ui] sidebar-session-archive-failed sessionId=${t.sessionId} mode=${n} status=${e.status} error=${r.error??`unknown`}`),R({message:`${n===`archive`?`Archive`:`Unarchive`} failed: ${i}`,failed:!0});return}console.info(`[admin-ui] sidebar-session-archive sessionId=${t.sessionId} mode=${n}`),Z()}catch(e){let r=e instanceof Error?e.message:String(e);console.error(`[admin-ui] sidebar-session-archive-failed sessionId=${t.sessionId} mode=${n} error=${r}`),R({message:`${n===`archive`?`Archive`:`Unarchive`} failed: ${r}`,failed:!0})}finally{wt(e=>{let n=new Set(e);return n.delete(t.sessionId),n})}}},[M,Ct,Z]),an=(0,D.useCallback)(async e=>{let t=Tt.trim();if(!t){R({message:`Title can’t be empty`,failed:!0});return}if(t.length>st){R({message:`Title too long (max ${st})`,failed:!0});return}Ot(!0);try{let n=await M(`/api/admin/session-rename`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({sessionId:e.sessionId,title:t})});if(!n.ok){let t=await n.json().catch(()=>({})),r=t.reason??t.error??`status ${n.status}`;console.error(`[admin-ui] sidebar-session-rename sessionId=${e.sessionId.slice(0,8)} outcome=rejected reason=${r}`),R({message:`Rename failed: ${r}`,failed:!0});return}console.info(`[admin-ui] sidebar-session-rename sessionId=${e.sessionId.slice(0,8)} outcome=ok`),Y(null),Et(``),Z()}catch(t){let n=t instanceof Error?t.message:String(t);console.error(`[admin-ui] sidebar-session-rename sessionId=${e.sessionId.slice(0,8)} outcome=rejected reason=${n}`),R({message:`Rename failed: ${n}`,failed:!0})}finally{Ot(!1)}},[M,Tt,Z]);return(0,E.jsxs)(`aside`,{className:`side`,children:[(0,E.jsxs)(`div`,{className:`side-brand`,children:[Re?(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(`button`,{type:`button`,className:`side-brand-icon-btn`,"aria-label":`Switch to house account`,disabled:!I,onClick:ze,children:(0,E.jsx)(`img`,{className:`side-brand-icon`,src:l,alt:``,"aria-hidden":`true`})}),(0,E.jsxs)(`button`,{type:`button`,className:`side-brand-trigger`,"aria-haspopup":`menu`,"aria-expanded":P,"aria-label":`Switch sub-account`,onClick:()=>{let e=!P;F(e),e&&De?.(),console.info(`[admin-ui] op=subaccount-switcher-toggle anchor=brand-head open=${e} available=true accounts=${Ce?.length??0}`)},children:[(0,E.jsxs)(`span`,{className:`side-brand-lockup`,children:[(0,E.jsx)(`span`,{className:`side-brand-business`,children:N}),(0,E.jsx)(`span`,{className:`side-brand-product`,children:c.productName})]}),(0,E.jsx)(A,{size:14,className:`side-brand-caret`,"aria-hidden":`true`})]})]}):(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(`img`,{className:`side-brand-icon`,src:l,alt:``,"aria-hidden":`true`}),(0,E.jsxs)(`span`,{className:`side-brand-lockup`,children:[(0,E.jsx)(`span`,{className:`side-brand-business`,children:N}),(0,E.jsx)(`span`,{className:`side-brand-product`,children:c.productName})]})]}),P&&(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(`div`,{className:`side-brand-scrim`,"aria-hidden":`true`,onClick:()=>F(!1)}),(0,E.jsx)(x,{open:P,accounts:Ce??[],activeAccountId:we??null,switching:Te??!1,onSelect:e=>Ee?.(e),onClose:()=>F(!1)})]})]}),(0,E.jsx)(`nav`,{className:`side-nav`,children:Kt.map(e=>(0,E.jsxs)(`button`,{type:`button`,className:`admin-row nav-row${e.active?` active`:``}`,"aria-current":e.active?`page`:void 0,onClick:e.onClick,children:[e.icon,(0,E.jsx)(`span`,{className:`label`,children:e.label}),(0,E.jsx)(`span`,{className:`kbd`})]},e.key))}),(()=>{let e=V.filter(e=>Qe?!0:!e.isSubagent).filter(e=>W?!0:!e.archived),t=V.some(e=>e.isSubagent),n=V.some(e=>e.archived);return(0,E.jsx)(`div`,{className:`side-sessions`,children:(0,E.jsxs)(`div`,{className:`side-list`,children:[(0,E.jsxs)(`div`,{className:`group-head`,children:[(0,E.jsx)(`span`,{children:`Sessions`}),(0,E.jsxs)(`span`,{className:`group-head-meta`,children:[(0,E.jsx)(`button`,{type:`button`,className:`group-head-select${G?` active`:``}`,"aria-pressed":G,title:G?`Exit select mode`:`Select multiple sessions to delete`,onClick:()=>{mt(e=>!e),ht(new Set),Y(null),Et(``)},children:`Select`}),(0,E.jsx)(`button`,{type:`button`,className:`group-head-refresh`,title:`Refresh sessions`,"aria-label":`Refresh sessions`,onClick:Bt,disabled:qe,children:(0,E.jsx)(ee,{size:12,className:qe?`spinning`:void 0})}),(0,E.jsx)(`span`,{children:qe?`…`:String(e.length)}),(0,E.jsxs)(`button`,{type:`button`,className:`admin-btn-cta side-sessions-new`,onClick:Yt,disabled:X,"aria-busy":X,"aria-label":X?`Spawning session`:`New session`,title:X?`Spawning session`:`New session`,children:[X?(0,E.jsx)(h,{size:13,className:`spinning`}):(0,E.jsx)(T,{size:13}),(0,E.jsx)(`span`,{children:X?`Spawning…`:`New session`})]})]})]}),G&&(0,E.jsxs)(`div`,{className:`session-select-bar`,children:[(0,E.jsxs)(`span`,{className:`session-select-count`,children:[K.size,` selected`]}),(0,E.jsxs)(`button`,{type:`button`,className:`session-select-delete`,disabled:K.size===0,onClick:()=>_t(!0),children:[`Delete `,K.size]}),(0,E.jsx)(`button`,{type:`button`,className:`session-select-cancel`,onClick:en,children:`Cancel`})]}),nt&&(0,E.jsx)(`div`,{className:`side-account-id`,title:`This install's accountId. The first 8 characters match the truncated UUID label on the live Remote Control daemon entry in claude.ai/code.`,children:(0,E.jsx)(`code`,{children:nt})}),(t||n)&&(0,E.jsxs)(`div`,{className:`artefact-filter-chips`,children:[t&&(0,E.jsx)(`button`,{type:`button`,className:`artefact-filter-chip${Qe?` active`:``}`,"aria-pressed":Qe,onClick:()=>et(e=>!e),title:Qe?`Hide subagent sessions`:`Show subagent sessions`,children:`Subagents`}),n&&(0,E.jsx)(`button`,{type:`button`,className:`artefact-filter-chip${W?` active`:``}`,"aria-pressed":W,onClick:()=>tt(e=>!e),title:W?`Hide archived sessions`:`Show archived sessions`,children:`Archived`})]}),We&&(0,E.jsx)(`div`,{className:`conv`,style:{color:`var(--text-tertiary)`,cursor:`default`},children:We}),U&&!We&&e.length===0&&(0,E.jsx)(`div`,{className:`conv`,style:{color:`var(--text-tertiary)`,cursor:`default`},children:`No sessions yet`}),e.map(e=>{let t=ut(e.startedAt),n=yt.has(e.sessionId),r=it.has(e.sessionId),i=xt.has(e.sessionId),a=Ct.has(e.sessionId),o=n||r||i||a,s=()=>{window.location.assign(`/chat?session=${e.sessionId}`)},c=[{key:`open`,label:`Resume session ${e.title} in claude.ai/code`,menuLabel:`Resume in claude.ai/code`,title:`Resume in a fresh local Remote Control PTY`,icon:(0,E.jsx)(he,{size:12}),busy:n,onClick:()=>{qt(e)}},{key:`message`,label:`Open session ${e.title} in admin webchat`,menuLabel:`Open in webchat`,title:`Open in admin webchat (/chat) — sending resumes this session`,icon:(0,E.jsx)(_e,{size:12}),onClick:()=>{s()}},{key:`usage`,label:`Usage and cost for session ${e.title}`,menuLabel:`Usage & cost`,title:`Per-day active time, tokens, and estimated GBP cost`,icon:(0,E.jsx)(ge,{size:12}),onClick:t=>{Zt(t,e)}},...e.live?[{key:`stop`,label:`Stop session ${e.title}`,menuLabel:`Stop`,title:`Stop session process (keeps the conversation, can resume later)`,icon:(0,E.jsx)(ae,{size:12}),busy:i,onClick:t=>{nn(t,e)}}]:[],e.archived?{key:`unarchive`,label:`Unarchive session ${e.title}`,menuLabel:`Unarchive`,title:`Unarchive (move back to the active list)`,icon:(0,E.jsx)(de,{size:12}),busy:a,onClick:t=>{rn(t,e,`unarchive`)}}:{key:`archive`,label:`Archive session ${e.title}`,menuLabel:`Archive`,title:`Archive (hide from the list, keeps the conversation resumable)`,icon:(0,E.jsx)(fe,{size:12}),busy:a,onClick:t=>{rn(t,e,`archive`)}},{key:`rename`,label:`Rename session ${e.title}`,menuLabel:`Rename`,title:`Rename this session`,icon:(0,E.jsx)(m,{size:12}),busy:Dt&&J===e.sessionId,onClick:t=>{t.stopPropagation(),Y(e.sessionId),Et(e.personName??e.title)}},{key:`delete`,label:`Delete session ${e.title}`,menuLabel:`Delete`,title:`Delete session (stops the process, removes the conversation)`,icon:(0,E.jsx)(_,{size:12}),danger:!0,busy:r,onClick:t=>{Xt(t,e)}},ke({sessionId:e.sessionId,model:e.model??null,title:e.personName??e.title})],l=e.channel===`whatsapp`?` conv-channel-whatsapp`:e.channel===`telegram`?` conv-channel-telegram`:``,u=e.channel===`whatsapp`||e.channel===`telegram`||e.channel===`webchat`,d=C.includes(e.channel??``)&&e.senderId&&e.titleSource===`prefix`?v({operatorName:e.personName??null,whatsappName:e.whatsappName??null,senderId:e.senderId,title:e.title}):e.personName??e.title;return(0,E.jsxs)(`div`,{ref:t=>{let n=dt.current;t?n.set(e.sessionId,t):n.delete(e.sessionId)},className:`conv conv-with-actions${l}${e.sessionId===H?` active`:``}`,children:[(0,E.jsxs)(`div`,{className:`conv-main-static conv-main-clickable`,role:`button`,tabIndex:0,"aria-label":`Open ${d} in webchat`,onClick:()=>{if(J!==e.sessionId){if(G){$t(e.sessionId);return}s()}},onKeyDown:t=>{J!==e.sessionId&&(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),G?$t(e.sessionId):s())},children:[G&&(0,E.jsx)(`span`,{className:`conv-select-check`,onClick:e=>e.stopPropagation(),children:(0,E.jsx)(le,{checked:K.has(e.sessionId),ariaLabel:`Select ${d}`,onChange:()=>$t(e.sessionId)})}),(0,E.jsx)(`span`,{className:`conv-live-dot`,"data-live":e.live?`1`:`0`,"data-archived":e.archived?`1`:`0`,"aria-label":e.archived?`archived session`:e.live?`live session`:`ended session`}),(0,E.jsxs)(`span`,{className:`conv-stack`,children:[(0,E.jsxs)(`span`,{className:`conv-name-line`,children:[u&&(0,E.jsx)(ie,{channel:e.channel,size:13}),J===e.sessionId?(0,E.jsx)(`input`,{className:`conv-name conv-name-edit`,autoFocus:!0,onFocus:e=>e.currentTarget.select(),value:Tt,disabled:Dt,"aria-label":`New title for session ${e.title}`,onChange:e=>Et(e.target.value),onClick:e=>e.stopPropagation(),onKeyDown:t=>{t.key===`Enter`?(t.preventDefault(),an(e)):t.key===`Escape`&&(t.preventDefault(),Y(null),Et(``))},onBlur:()=>{J===e.sessionId&&!Dt&&(Y(null),Et(``))}}):(0,E.jsx)(`span`,{className:`conv-name`,title:d,children:d})]}),(0,E.jsxs)(`span`,{className:`conv-timestamp`,children:[(0,E.jsx)(`code`,{className:`conv-session-id`,title:`First 8 characters of this session's id — distinguishes rows with identical auto-titles. The resume/delete buttons act on the full id.`,children:e.sessionId.slice(0,8)}),t&&(0,E.jsxs)(`span`,{children:[` · `,t]})]})]})]}),!G&&(0,E.jsx)(Le,{actions:c,disabled:o})]},e.sessionId)})]})})})(),(0,E.jsxs)(`div`,{className:`side-foot`,children:[(0,E.jsx)(`div`,{className:`avatar`,children:te?(0,E.jsx)(`img`,{src:te,alt:je}):Me}),(0,E.jsxs)(`div`,{className:`who`,children:[(0,E.jsx)(`span`,{className:`name`,children:je}),(0,E.jsx)(pt,{})]}),(0,E.jsx)(`button`,{type:`button`,className:`side-foot-kebab`,"aria-label":`Account menu`,"aria-haspopup":`menu`,"aria-expanded":Fe,onClick:()=>Ie(e=>!e),children:(0,E.jsx)(me,{size:16})}),Fe&&(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(`div`,{className:`side-foot-menu-scrim`,"aria-hidden":`true`,onClick:()=>Ie(!1)}),(0,E.jsx)(`div`,{className:`side-foot-menu`,role:`menu`,children:(0,E.jsx)(y,{variant:`admin`,onCloseMenu:()=>Ie(!1),onLogout:ue??(()=>{}),onDisconnect:O,disconnecting:k,claudeConnected:ve,onConnectClaude:s,cacheKey:o,onOpenConversations:Oe})})]})]}),L&&(0,E.jsx)(`div`,{className:`copy-toast${L.failed?` copy-toast-failed`:``}`,role:`status`,children:L.message}),(0,E.jsx)(Ze,{error:Be,onClose:()=>z(null)}),(0,E.jsx)($e,{open:Ve,onConnect:()=>{B(!1),s?.()},onClose:()=>B(!1)}),(0,E.jsx)(Je,{target:q,anchorEl:q?dt.current.get(q.sessionId)??null:null,onCancel:()=>vt(null),onConfirm:()=>{let e=q;vt(null),e&&Qt(e)}},q?.sessionId??`none`),(0,E.jsx)(Ye,{open:gt,count:K.size,liveCount:V.filter(e=>K.has(e.sessionId)&&e.live).length,onConfirm:()=>{_t(!1),tn()},onCancel:()=>_t(!1)}),(0,E.jsx)(at,{show:kt!==null,onClose:()=>{At(null),Mt(null),It(null)},anchorEl:kt?dt.current.get(kt.sessionId)??null:null,sessionId:kt?.sessionId??null,summary:jt,loading:Nt,error:Ft},kt?.sessionId??`none`)]})}var G=5e3,ft=3e4;function pt(){let[e,t]=(0,D.useState)(null);if((0,D.useEffect)(()=>{let e=!1,n=null;async function r(){try{let n=await fetch(`/api/admin/system-stats`);if(!n.ok){console.error(`[admin-ui] system-stats-fetch-failed status=${n.status}`);return}let r=await n.json();e||t(r)}catch(e){console.error(`[admin-ui] system-stats-fetch-failed reason=${e instanceof Error?e.message:String(e)}`)}}function i(){n===null&&(r(),n=setInterval(()=>{r()},G))}function a(){n!==null&&(clearInterval(n),n=null)}function o(){document.hidden?a():i()}return document.hidden||i(),document.addEventListener(`visibilitychange`,o),()=>{e=!0,a(),document.removeEventListener(`visibilitychange`,o)}},[]),!e||e.platform===`darwin`)return null;let n=e.cpuPct,r=e.memUsedPct,i=n!==null&&n>=.9,a=n!==null&&n>=.98,o=r!==null&&r>=.9,s=r!==null&&r>=.98,c=i||o,l=a||s,u=e=>e===null?`—`:`${Math.round(e*100)}%`,d=[`system-stats`];return c&&d.push(`system-stats--warn`),l&&d.push(`system-stats--crit`),(0,E.jsxs)(`span`,{className:d.join(` `),role:`status`,"aria-label":`host CPU and RAM`,children:[(0,E.jsxs)(`span`,{className:i?`system-stats__fig system-stats__fig--warn`:`system-stats__fig`,children:[`CPU `,u(n)]}),` · `,(0,E.jsxs)(`span`,{className:o?`system-stats__fig system-stats__fig--warn`:`system-stats__fig`,children:[`RAM `,u(r)]})]})}var mt=`admin-sidebar-collapsed`,K=`admin-sidebar-drawer-open`,ht=1080;function gt(){if(typeof window>`u`)return!1;let e=null;try{e=window.sessionStorage.getItem(mt)}catch{e=null}return e===null?typeof window.matchMedia==`function`?window.matchMedia(`(min-width: 721px) and (max-width: ${ht}px)`).matches:!1:e===`1`}function _t(e){if(!(typeof window>`u`))try{e?window.sessionStorage.setItem(mt,`1`):window.sessionStorage.removeItem(mt)}catch{}}function q(){if(typeof window>`u`)return!1;try{return window.sessionStorage.getItem(K)===`1`}catch{return!1}}function vt(e){if(!(typeof window>`u`))try{e?window.sessionStorage.setItem(K,`1`):window.sessionStorage.removeItem(K)}catch{}}function yt(e){let[t,n]=(0,D.useState)(()=>typeof window>`u`||typeof window.matchMedia!=`function`?!1:window.matchMedia(e).matches);return(0,D.useEffect)(()=>{if(typeof window>`u`||typeof window.matchMedia!=`function`)return;let t=window.matchMedia(e),r=()=>n(t.matches);return r(),t.addEventListener(`change`,r),()=>t.removeEventListener(`change`,r)},[e]),t}var bt=720;function xt(e,t){return e===`/`?{via:`in-place`}:{via:`navigate`,href:`/?wa=${encodeURIComponent(t.remoteJid??``)}&acct=${encodeURIComponent(t.accountId??``)}`}}function St(e){return e===`/`?{via:`in-place`}:{via:`navigate`,href:`/?data=1`}}function Ct(e,t){if(e!==`/`)return null;let n=new URLSearchParams(t),r=n.get(`wa`),i=n.get(`acct`);return!r||!i?null:{sessionId:``,projectDir:``,title:``,senderId:null,startedAt:``,channel:`whatsapp`,role:`public`,operatorName:null,whatsappName:null,lastMessageAt:null,modelGated:!1,model:null,source:`store`,accountId:i,remoteJid:r}}function wt(e,t){return e===`/`?new URLSearchParams(t).has(`data`):!1}function J(e,t){return t===`operator`&&e===`chat`||e===`dashboard`?`/`:e===`data`?`/data`:e===`graph`?`/graph`:e===`calendar`?`/calendar`:e===`chat`?`/chat`:e===`activity`?`/activity`:`/browser`}function Y(e){let{cacheKey:t,businessName:n,variant:r=`admin`,onLogout:i,onDisconnect:a,disconnecting:s,claudeConnected:c,onConnectClaude:l,userName:u,userAvatar:d,role:f,onOpenConversations:p,children:m,footer:h}=e,{subAccounts:g,activeAccountId:_,switching:v,switchAccount:ee,refreshAccounts:y}=re(t),[b,x]=(0,D.useState)(!0);(0,D.useEffect)(()=>{if(c!==void 0||r!==`admin`)return;let e=!1,t=async()=>{try{let t=await fetch(`/api/health`);if(!t.ok)return;let n=await t.json();e||x(n.auth_status!==`dead`&&n.auth_status!==`missing`)}catch{}};t();let n=setInterval(t,6e4);return()=>{e=!0,clearInterval(n)}},[c,r]);let S=c??b,ne=l??(()=>{window.location.assign(`/?connect=claude`)}),[C,w]=(0,D.useState)(()=>gt()),[ie,ae]=(0,D.useState)(!1),oe=(0,D.useRef)(!0);(0,D.useEffect)(()=>{if(oe.current){oe.current=!1;return}ae(!0);let e=setTimeout(()=>ae(!1),260);return()=>clearTimeout(e)},[C]);let[T,ce]=(0,D.useState)(()=>q()),le=yt(`(max-width: ${bt}px)`),[ue,O]=(0,D.useState)(()=>typeof window>`u`||wt(window.location.pathname,window.location.search)?null:Ct(window.location.pathname,window.location.search)),[k,de]=(0,D.useState)(()=>typeof window>`u`?!1:wt(window.location.pathname,window.location.search)),[fe]=(0,D.useState)(()=>k),pe=(0,D.useCallback)(e=>{_t(e),w(e)},[]),A=(0,D.useCallback)(e=>{vt(e),ce(e)},[]);(0,D.useEffect)(()=>{if(typeof window>`u`)return;let e=window.location?.pathname??``;console.info(`[admin-ui] shell-mount route=${e} variant=${r} sidebar=${r===`operator`?`none`:`present`} collapsed=${C} drawer=${T}`)},[]),(0,D.useEffect)(()=>{typeof window>`u`||!ue||(console.info(`[admin-ui] wa-hydrate route=/ remoteJid=${ue.remoteJid??``}`),window.history.replaceState(null,``,`/`))},[]),(0,D.useEffect)(()=>{typeof window>`u`||!k||(console.info(`[admin-ui] data-hydrate route=/`),window.history.replaceState(null,``,`/`))},[]);let me=(0,D.useCallback)(e=>{if(de(!1),e===null){O(null);return}let t=typeof window<`u`?window.location.pathname:`/`,n=xt(t,e);console.info(`[admin-ui] wa-open route=${t} via=${n.via} sessionId=${e.sessionId.slice(0,8)}`),n.via===`in-place`?O(e):window.location.href=n.href},[]),he=(0,D.useCallback)(()=>{let e=typeof window<`u`?window.location.pathname:`/`,t=St(e);if(console.info(`[admin-ui] data-open route=${e} via=${t.via}`),t.via===`navigate`){window.location.href=t.href;return}O(null),de(!0)},[]),ge=le?T:!C,j=(0,D.useCallback)(()=>{if(!(typeof window>`u`))if(window.matchMedia(`(max-width: ${bt}px)`).matches){let e=T;console.info(`[admin-ui] header-sidebar-toggle from=${e?`open`:`closed`} mode=drawer`),A(!e)}else{let e=C;console.info(`[admin-ui] header-sidebar-toggle from=${e?`closed`:`open`} mode=collapse`),pe(!e)}},[C,T,pe,A]),_e=(0,D.useCallback)(e=>{let t=J(e,r);console.info(`[admin-ui] header-menu-nav target=${e} dest=${t}`),window.location.href=t},[r]),ve={collapsed:C,mobileDrawerOpen:T,sidebarOpen:ge,onToggleSidebar:j,setMobileDrawerOpen:A,selectedWhatsapp:ue,onClearWhatsapp:()=>O(null),onSelectWhatsappConversation:me,dataOpen:k};return r===`operator`?(0,E.jsxs)(`div`,{className:`admin-shell admin-page admin-shell-root`,children:[v&&(0,E.jsx)(o,{surface:`switch`}),(0,E.jsx)(te,{businessName:n,variant:r,onNavigate:_e,onOpenConversations:p,onToggleSidebar:j,sidebarOpen:ge,onLogout:i,onDisconnect:a,disconnecting:s,cacheKey:t,subAccounts:g,activeAccountId:_,switchingAccount:v,onSwitchAccount:ee,refreshAccounts:y}),(0,E.jsx)(`div`,{className:`platform platform-operator`,children:typeof m==`function`?m(ve):m}),(0,E.jsx)(M,{variant:`operator`,onOpenConversations:p}),h]}):(0,E.jsxs)(`div`,{className:`admin-shell admin-page admin-shell-root`,children:[v&&(0,E.jsx)(o,{surface:`switch`}),(0,E.jsxs)(`div`,{className:`platform${T?` menu-open`:``}${!le&&C?` sidebar-collapsed`:``}${ie?` sidebar-animating`:``}`,"data-artefact":`closed`,children:[(0,E.jsx)(dt,{businessName:n,cacheKey:t,onConnectClaude:ne,role:f??null,userName:u,userAvatar:d??null,onSelectProjects:()=>{window.location.href=`/graph?label=${se().label}`},onSelectTasks:()=>{window.location.href=`/tasks`},onCloseMobileDrawer:()=>A(!1),collapsed:C,mobileDrawerOpen:T,onSelectData:he,onCloseData:()=>de(!1),initialDataSurface:fe,onLogout:i,onDisconnect:a,disconnecting:s,claudeConnected:S,subAccounts:g,activeAccountId:_,switchingAccount:v,onSwitchAccount:ee,refreshAccounts:y,onOpenConversations:p}),!le&&(0,E.jsx)(Me,{}),(0,E.jsx)(Te,{sidebarOpen:ge,onToggleSidebar:j,claudeConnected:S,onConnectClaude:ne}),typeof m==`function`?m(ve):m]}),T&&(0,E.jsx)(`div`,{className:`sidebar-backdrop menu-open`,"aria-hidden":`true`,onClick:()=>A(!1)}),(0,E.jsx)(M,{}),h]})}export{k as C,de as S,ce as T,he as _,Qe as a,pe as b,Re as c,Se as d,be as f,ge as g,j as h,$e as i,z as l,_e as m,yt as n,I as o,ye as p,lt as r,F as s,Y as t,L as u,me as v,le as w,fe as x,A as y};
@@ -1 +0,0 @@
1
- import{o as e}from"./chunk-CltuBf4Z.js";import{B as t,F as n,G as r,H as i,T as a,U as o,_ as s,g as c,p as l}from"./useSubAccountSwitcher-DVmWZxar.js";import{T as u,_ as d,b as f,t as p}from"./AdminShell-C8hBpL9K.js";var m=o(),h=e(r(),1),g=t();function _({label:e,body:t}){return(0,g.jsxs)(`div`,{className:`agent-doc`,children:[(0,g.jsx)(`span`,{className:`agent-doc-label`,children:e}),(0,g.jsx)(`pre`,{className:`skill-body`,children:t.trim()||`Empty.`})]})}function v({summary:e,publicBaseUrl:t,adminFetch:n,onClose:r,onDeleted:i}){let[o,l]=(0,h.useState)(null),[u,p]=(0,h.useState)(!0),[m,v]=(0,h.useState)(null),[y,b]=(0,h.useState)(!1),[x,S]=(0,h.useState)(!1);(0,h.useEffect)(()=>{let t=!1;return p(!0),v(null),n(`/api/admin/agents/${encodeURIComponent(e.slug)}`).then(async e=>{if(!t){if(!e.ok)throw Error(`HTTP ${e.status}`);l((await e.json()).agent)}}).catch(e=>{t||v(e instanceof Error?e.message:`Failed to load`)}).finally(()=>{t||p(!1)}),()=>{t=!0}},[n,e.slug]),(0,h.useEffect)(()=>{let e=e=>{e.key===`Escape`&&!x&&r()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[x,r]);let C=(0,h.useCallback)(async()=>{S(!0),v(null);try{let t=await n(`/api/admin/agents/${encodeURIComponent(e.slug)}`,{method:`DELETE`,headers:{"content-type":`application/json`}});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error??`HTTP ${t.status}`)}i(e)}catch(e){v(e instanceof Error?e.message:`Delete failed`),S(!1),b(!1)}},[n,e,i]);return(0,g.jsx)(`div`,{className:`cal-modal-overlay`,onClick:()=>{x||r()},children:(0,g.jsxs)(`div`,{className:`cal-modal cal-modal-wide`,role:`dialog`,"aria-modal":`true`,"aria-label":`Agent detail`,onClick:e=>e.stopPropagation(),children:[(0,g.jsxs)(`div`,{className:`cal-modal-header`,children:[(0,g.jsxs)(`span`,{className:`cal-modal-kind`,children:[(0,g.jsx)(f,{size:13}),` Agent`]}),(0,g.jsx)(`button`,{type:`button`,className:`cal-modal-close`,onClick:r,"aria-label":`Close`,autoFocus:!0,disabled:x,children:(0,g.jsx)(c,{size:16})})]}),(0,g.jsxs)(`div`,{className:`cal-modal-body`,children:[(0,g.jsx)(`div`,{className:`cal-modal-title`,children:e.displayName}),(0,g.jsxs)(`div`,{className:`cal-modal-row cal-modal-meta`,children:[(0,g.jsx)(`span`,{className:`agent-status-dot ${e.status}`}),(0,g.jsxs)(`span`,{children:[`/`,e.slug]})]}),u&&(0,g.jsxs)(`div`,{className:`cal-modal-row cal-modal-meta`,children:[(0,g.jsx)(a,{size:14,className:`spin`}),(0,g.jsx)(`span`,{children:`Loading…`})]}),o&&(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(`div`,{className:`cal-modal-row cal-modal-meta`,children:(0,g.jsxs)(`span`,{children:[o.status,o.model?` · ${o.model}`:``]})}),(0,g.jsx)(`div`,{className:`cal-modal-row cal-modal-meta`,children:(0,g.jsxs)(`a`,{href:`${t}/${e.slug}`,target:`_blank`,rel:`noopener noreferrer`,className:`cal-link`,children:[(0,g.jsx)(d,{size:13}),` Open agent`]})}),o.present.identity&&(0,g.jsx)(_,{label:`Identity`,body:o.identity}),o.present.soul&&(0,g.jsx)(_,{label:`Soul`,body:o.soul}),o.present.knowledge&&(0,g.jsx)(_,{label:`Knowledge`,body:o.knowledge}),o.present.knowledgeSummary&&(0,g.jsx)(_,{label:`Knowledge summary`,body:o.knowledgeSummary}),o.knowledgeKeywords.length>0&&(0,g.jsxs)(`div`,{className:`skill-refs`,children:[(0,g.jsx)(`span`,{className:`skill-refs-label`,children:`Knowledge keywords`}),o.knowledgeKeywords.map(e=>(0,g.jsx)(`span`,{className:`skill-ref`,children:e},e))]})]})]}),m&&(0,g.jsx)(`div`,{className:`cal-modal-error`,children:m}),(0,g.jsxs)(`div`,{className:`cal-modal-actions`,children:[!y&&(0,g.jsxs)(`button`,{type:`button`,className:`cal-modal-btn cal-modal-btn-danger`,onClick:()=>b(!0),disabled:x||u,children:[(0,g.jsx)(s,{size:14}),` Delete`]}),y&&(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(`span`,{className:`cal-modal-confirm-text`,children:`Delete this agent?`}),(0,g.jsxs)(`button`,{type:`button`,className:`cal-modal-btn cal-modal-btn-danger`,onClick:C,disabled:x,children:[x?(0,g.jsx)(a,{size:14,className:`spin`}):(0,g.jsx)(s,{size:14}),` Delete`]}),(0,g.jsx)(`button`,{type:`button`,className:`cal-modal-btn`,onClick:()=>b(!1),disabled:x,children:`Cancel`})]})]})]})})}var y=`maxy-admin-session-key`;function b(){let[e,t]=(0,h.useState)(null),[r,i]=(0,h.useState)(!1),[a,o]=(0,h.useState)(void 0),[s,c]=(0,h.useState)(null),[d,f]=(0,h.useState)(void 0),[m,_]=(0,h.useState)(null),[v,b]=(0,h.useState)(null);(0,h.useEffect)(()=>{let e=!1,n=null;try{n=sessionStorage.getItem(y)}catch{}if(!n){i(!0);return}return fetch(`/api/admin/session?session_key=${encodeURIComponent(n)}`).then(async r=>{if(!e){if(r.status===401){try{sessionStorage.removeItem(y)}catch{}window.location.href=`/`;return}if(r.ok)try{let e=await r.json();typeof e.businessName==`string`&&o(e.businessName),e.sessionId!==void 0&&c(e.sessionId??null),b(e.role??null),f(e.userName===void 0?null:e.userName),_(e.avatar??null)}catch{}t(n),i(!0)}}).catch(()=>{e||(t(n),i(!0))}),()=>{e=!0}},[]);let S=(0,h.useCallback)(()=>{try{sessionStorage.removeItem(y)}catch{}window.location.href=`/`},[]),[C,w]=(0,h.useState)(!1),T=(0,h.useCallback)(async()=>{w(!0);try{let e=await u();if(e){try{sessionStorage.removeItem(y)}catch{}window.location.href=`/`}return e}finally{w(!1)}},[]);return r?e?(0,g.jsx)(l,{cacheKey:e,surface:`agents`,onSessionExpired:({code:e,path:t})=>{console.warn(`[admin-auth] outcome=session-expired-redirect code=${e} path=${t} surface=agents`);try{sessionStorage.removeItem(y)}catch{}window.location.href=`/`},children:(0,g.jsx)(p,{cacheKey:e,businessName:a,sessionId:s,onLogout:S,onDisconnect:T,disconnecting:C,userName:d,userAvatar:m,role:v,children:(0,g.jsx)(x,{cacheKey:e})})}):(0,g.jsx)(`div`,{className:`cal-page`,children:(0,g.jsxs)(`div`,{className:`cal-empty`,children:[(0,g.jsx)(`p`,{children:`You are not signed in.`}),(0,g.jsxs)(`p`,{children:[`Open the `,(0,g.jsx)(`a`,{href:`/`,className:`cal-link`,children:`main admin page`}),` and log in, then return here.`]})]})}):(0,g.jsx)(n,{surface:`gate`})}function x({cacheKey:e}){let{adminFetch:t,sessionRefetchNonce:r}=i({initialCacheKey:e,surface:`agents`}),[o,s]=(0,h.useState)([]),[c,l]=(0,h.useState)(0),[u,d]=(0,h.useState)(!1),[p,m]=(0,h.useState)(!1),[_,y]=(0,h.useState)(null),[b,x]=(0,h.useState)(null),[S,C]=(0,h.useState)(``);(0,h.useEffect)(()=>{C(window.location.hostname.startsWith(`admin.`)?window.location.origin.replace(`admin.`,`public.`):window.location.origin)},[]);let w=(0,h.useCallback)(()=>{let e=!1;return d(!0),y(null),t(`/api/admin/agents`).then(async t=>{if(e)return;if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.json();s(Array.isArray(n.agents)?n.agents:[]),l(typeof n.skipped==`number`?n.skipped:0)}).catch(t=>{e||(y(t instanceof Error?t.message:`Failed to load`),s([]))}).finally(()=>{e||(d(!1),m(!0))}),()=>{e=!0}},[t]);(0,h.useEffect)(()=>w(),[w,r]);let T=(0,h.useCallback)(e=>{s(t=>t.filter(t=>t.slug!==e.slug)),x(null),w()},[w]);return p?(0,g.jsxs)(`div`,{className:`cal-page`,children:[(0,g.jsx)(`header`,{className:`cal-header`,children:(0,g.jsxs)(`div`,{className:`cal-nav`,children:[(0,g.jsxs)(`span`,{className:`cal-range-label`,children:[(0,g.jsx)(f,{size:16}),` Agents`]}),u&&(0,g.jsx)(a,{size:16,className:`spin`})]})}),(0,g.jsxs)(`div`,{className:`cal-body`,children:[_&&(0,g.jsxs)(`div`,{className:`cal-error`,children:[`Could not load agents: `,_]}),c>0&&(0,g.jsxs)(`div`,{className:`cal-error`,children:[c,` agent`,c===1?``:`s`,` could not be read (malformed config).`]}),!_&&!u&&o.length===0&&(0,g.jsx)(`div`,{className:`cal-empty`,children:(0,g.jsx)(`p`,{children:`No agents yet. Ask in chat to create one.`})}),o.length>0&&(0,g.jsx)(`div`,{className:`routine-list`,children:o.map(e=>(0,g.jsxs)(`button`,{type:`button`,className:`routine-card`,onClick:()=>x(e),children:[(0,g.jsx)(`span`,{className:`routine-card-title`,children:e.displayName}),(0,g.jsxs)(`span`,{className:`routine-card-sched`,children:[(0,g.jsx)(`span`,{className:`agent-status-dot ${e.status}`}),` /`,e.slug]}),(0,g.jsx)(`span`,{className:`routine-card-meta`,children:e.status})]},e.slug))})]}),b&&(0,g.jsx)(v,{summary:b,publicBaseUrl:S,adminFetch:t,onClose:()=>x(null),onDeleted:T})]}):(0,g.jsx)(n,{surface:`gate`})}(0,m.createRoot)(document.getElementById(`root`)).render((0,g.jsx)(b,{}));
@@ -1 +0,0 @@
1
- import{B as e,U as t}from"./useSubAccountSwitcher-DVmWZxar.js";import"./useVoiceRecorder-CRRmPjYr.js";import"./AdminShell-C8hBpL9K.js";import{n}from"./page-Dl-mgQUu.js";import"./useCopyFeedback-DzpXjm9d.js";var r=t(),i=e();(0,r.createRoot)(document.getElementById(`root`)).render((0,i.jsx)(n,{}));
@@ -1 +0,0 @@
1
- import{P as e}from"./useSubAccountSwitcher-DVmWZxar.js";var t=e(`chevron-left`,[[`path`,{d:`m15 18-6-6 6-6`,key:`1wnfg3`}]]);export{t};
@@ -1 +0,0 @@
1
- import{P as e}from"./useSubAccountSwitcher-DVmWZxar.js";var t=e(`chevron-right`,[[`path`,{d:`m9 18 6-6-6-6`,key:`mthhwq`}]]);export{t};
@@ -1 +0,0 @@
1
- import{P as e}from"./useSubAccountSwitcher-DVmWZxar.js";var t=e(`clock`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 6v6l4 2`,key:`mmk7yg`}]]);export{t};
@@ -1 +0,0 @@
1
- import{B as e,U as t}from"./useSubAccountSwitcher-DVmWZxar.js";import"./useVoiceRecorder-CRRmPjYr.js";import{t as n}from"./page-DoyJrk8E.js";import"./graph-labels-DJV0aIG5.js";var r=t(),i=e();(0,r.createRoot)(document.getElementById(`root`)).render((0,i.jsx)(n,{}));