@rubytech/create-sitedesk-code 0.1.526 → 0.1.527

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 (190) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +73 -7
  3. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +7 -0
  4. package/payload/platform/plugins/docs/references/admin-ui.md +70 -4
  5. package/payload/platform/plugins/docs/references/internals.md +1 -1
  6. package/payload/platform/plugins/docs/references/platform.md +1 -1
  7. package/payload/platform/plugins/linkedin-extension/extension/README.md +10 -2
  8. package/payload/platform/plugins/linkedin-extension/extension/background/sw.js +37 -4
  9. package/payload/platform/plugins/linkedin-extension/extension/content/profile.js +17 -2
  10. package/payload/platform/plugins/linkedin-extension/extension/content/thread.js +17 -2
  11. package/payload/platform/plugins/linkedin-extension/extension/manifest.json +1 -0
  12. package/payload/platform/plugins/linkedin-extension/extension/options/options.html +1 -0
  13. package/payload/platform/plugins/linkedin-extension/extension/options/options.js +78 -3
  14. package/payload/server/{chunk-WT2PFGY4.js → chunk-KY3BBT67.js} +216 -1
  15. package/payload/server/maxy-edge.js +226 -6
  16. package/payload/server/public/activity.html +5 -5
  17. package/payload/server/public/agents.html +4 -4
  18. package/payload/server/public/assets/{AdminLoginScreens-BgDjueVe.js → AdminLoginScreens-DSt9DYZZ.js} +1 -1
  19. package/payload/server/public/assets/AdminLoginScreens-DSt9DYZZ.js.br +0 -0
  20. package/payload/server/public/assets/AdminLoginScreens-DSt9DYZZ.js.gz +0 -0
  21. package/payload/server/public/assets/{AdminShell-YctTrR-D.js → AdminShell-MM3_yp3N.js} +1 -1
  22. package/payload/server/public/assets/AdminShell-MM3_yp3N.js.br +0 -0
  23. package/payload/server/public/assets/AdminShell-MM3_yp3N.js.gz +0 -0
  24. package/payload/server/public/assets/{activity-DGQt5ys_.js → activity-aVvbaVd4.js} +1 -1
  25. package/payload/server/public/assets/activity-aVvbaVd4.js.br +0 -0
  26. package/payload/server/public/assets/activity-aVvbaVd4.js.gz +0 -0
  27. package/payload/server/public/assets/{admin-DnUxbB3P.js → admin-B0lQnkH-.js} +1 -1
  28. package/payload/server/public/assets/admin-B0lQnkH-.js.br +0 -0
  29. package/payload/server/public/assets/admin-B0lQnkH-.js.gz +0 -0
  30. package/payload/server/public/assets/{agents-Bc2LZjwC.js → agents-CrpVTPRG.js} +1 -1
  31. package/payload/server/public/assets/agents-CrpVTPRG.js.br +0 -0
  32. package/payload/server/public/assets/agents-CrpVTPRG.js.gz +0 -0
  33. package/payload/server/public/assets/browser-CYHUzTop.js +1 -0
  34. package/payload/server/public/assets/browser-CYHUzTop.js.br +0 -0
  35. package/payload/server/public/assets/browser-CYHUzTop.js.gz +0 -0
  36. package/payload/server/public/assets/{calendar-D25EhXbD.js → calendar-4IWQpwYv.js} +1 -1
  37. package/payload/server/public/assets/calendar-4IWQpwYv.js.br +0 -0
  38. package/payload/server/public/assets/calendar-4IWQpwYv.js.gz +0 -0
  39. package/payload/server/public/assets/chat-DmjZTqnV.js +1 -0
  40. package/payload/server/public/assets/chat-DmjZTqnV.js.br +0 -0
  41. package/payload/server/public/assets/chat-DmjZTqnV.js.gz +0 -0
  42. package/payload/server/public/assets/chevron-left-CIl-s3LZ.js +1 -0
  43. package/payload/server/public/assets/chevron-left-CIl-s3LZ.js.br +0 -0
  44. package/payload/server/public/assets/chevron-right-DpAi2BsF.js +1 -0
  45. package/payload/server/public/assets/chevron-right-DpAi2BsF.js.br +0 -0
  46. package/payload/server/public/assets/clock-CGuM9VRx.js +1 -0
  47. package/payload/server/public/assets/clock-CGuM9VRx.js.br +0 -0
  48. package/payload/server/public/assets/data-BpdFiZKH.js +1 -0
  49. package/payload/server/public/assets/data-BpdFiZKH.js.br +2 -0
  50. package/payload/server/public/assets/data-BpdFiZKH.js.gz +0 -0
  51. package/payload/server/public/assets/{file-download-CiGklOfA.js → file-download-DayBHhKS.js} +1 -1
  52. package/payload/server/public/assets/file-download-DayBHhKS.js.br +0 -0
  53. package/payload/server/public/assets/file-download-DayBHhKS.js.gz +0 -0
  54. package/payload/server/public/assets/{file-text-XjJPULAZ.js → file-text-BSyhVH0m.js} +1 -1
  55. package/payload/server/public/assets/file-text-BSyhVH0m.js.br +0 -0
  56. package/payload/server/public/assets/file-text-BSyhVH0m.js.gz +0 -0
  57. package/payload/server/public/assets/{graph-BjHJ0z_6.js → graph-Bjv3Tc3B.js} +1 -1
  58. package/payload/server/public/assets/graph-Bjv3Tc3B.js.br +0 -0
  59. package/payload/server/public/assets/graph-Bjv3Tc3B.js.gz +0 -0
  60. package/payload/server/public/assets/{graph-labels-D-0u37KA.js → graph-labels-DegLKGdx.js} +1 -1
  61. package/payload/server/public/assets/graph-labels-DegLKGdx.js.br +0 -0
  62. package/payload/server/public/assets/graph-labels-DegLKGdx.js.gz +0 -0
  63. package/payload/server/public/assets/{maximize-2-BJ9S-nfS.js → maximize-2-DJFG2EXJ.js} +1 -1
  64. package/payload/server/public/assets/maximize-2-DJFG2EXJ.js.br +0 -0
  65. package/payload/server/public/assets/maximize-2-DJFG2EXJ.js.gz +0 -0
  66. package/payload/server/public/assets/{operator-Cay4rOOK.js → operator-Du9Ve_PR.js} +1 -1
  67. package/payload/server/public/assets/operator-Du9Ve_PR.js.br +0 -0
  68. package/payload/server/public/assets/operator-Du9Ve_PR.js.gz +0 -0
  69. package/payload/server/public/assets/{page-shuh4ES9.js → page-DgHYxG3M.js} +1 -1
  70. package/payload/server/public/assets/page-DgHYxG3M.js.br +0 -0
  71. package/payload/server/public/assets/page-DgHYxG3M.js.gz +0 -0
  72. package/payload/server/public/assets/{page-Cci_j_y7.js → page-qV1ypb6i.js} +5 -5
  73. package/payload/server/public/assets/page-qV1ypb6i.js.br +0 -0
  74. package/payload/server/public/assets/page-qV1ypb6i.js.gz +0 -0
  75. package/payload/server/public/assets/{public-BbJcQGsO.js → public-CNVEM-Bx.js} +1 -1
  76. package/payload/server/public/assets/public-CNVEM-Bx.js.br +0 -0
  77. package/payload/server/public/assets/public-CNVEM-Bx.js.gz +0 -0
  78. package/payload/server/public/assets/{rotate-ccw-jeSVwUAv.js → rotate-ccw-DQCaky8_.js} +1 -1
  79. package/payload/server/public/assets/rotate-ccw-DQCaky8_.js.br +0 -0
  80. package/payload/server/public/assets/rotate-ccw-DQCaky8_.js.gz +0 -0
  81. package/payload/server/public/assets/{routines-D3M1Wh3a.js → routines-DwK5FeLm.js} +1 -1
  82. package/payload/server/public/assets/routines-DwK5FeLm.js.br +0 -0
  83. package/payload/server/public/assets/routines-DwK5FeLm.js.gz +0 -0
  84. package/payload/server/public/assets/{skills-Bhej2ub1.js → skills-CosN3uA4.js} +1 -1
  85. package/payload/server/public/assets/skills-CosN3uA4.js.br +0 -0
  86. package/payload/server/public/assets/skills-CosN3uA4.js.gz +0 -0
  87. package/payload/server/public/assets/tasks-f0QikHmw.js +3 -0
  88. package/payload/server/public/assets/tasks-f0QikHmw.js.br +0 -0
  89. package/payload/server/public/assets/tasks-f0QikHmw.js.gz +0 -0
  90. package/payload/server/public/assets/{time-entry-format-r5UY9rjG.js → time-entry-format-DLTdS35_.js} +1 -1
  91. package/payload/server/public/assets/time-entry-format-DLTdS35_.js.br +0 -0
  92. package/payload/server/public/assets/time-entry-format-DLTdS35_.js.gz +0 -0
  93. package/payload/server/public/assets/{triangle-alert--PCKaewD.js → triangle-alert-CpwrbdYq.js} +1 -1
  94. package/payload/server/public/assets/triangle-alert-CpwrbdYq.js.br +3 -0
  95. package/payload/server/public/assets/triangle-alert-CpwrbdYq.js.gz +0 -0
  96. package/payload/server/public/assets/{useCopyFeedback-Dg5lNgqH.js → useCopyFeedback-D01gSp36.js} +1 -1
  97. package/payload/server/public/assets/useCopyFeedback-D01gSp36.js.br +0 -0
  98. package/payload/server/public/assets/useCopyFeedback-D01gSp36.js.gz +0 -0
  99. package/payload/server/public/assets/useSubAccountSwitcher-CJzJ9xV3.css +1 -0
  100. package/payload/server/public/assets/useSubAccountSwitcher-CJzJ9xV3.css.br +0 -0
  101. package/payload/server/public/assets/useSubAccountSwitcher-CJzJ9xV3.css.gz +0 -0
  102. package/payload/server/public/assets/{useVoiceRecorder-BY6ZsGMH.js → useVoiceRecorder-DiPgyDUy.js} +1 -1
  103. package/payload/server/public/assets/useVoiceRecorder-DiPgyDUy.js.br +0 -0
  104. package/payload/server/public/assets/useVoiceRecorder-DiPgyDUy.js.gz +0 -0
  105. package/payload/server/public/assets/{wrench-Bw1FMolk.js → wrench-C5SJreEu.js} +1 -1
  106. package/payload/server/public/assets/wrench-C5SJreEu.js.br +1 -0
  107. package/payload/server/public/assets/wrench-C5SJreEu.js.gz +0 -0
  108. package/payload/server/public/brand-defaults.css +1 -1
  109. package/payload/server/public/browser.html +4 -4
  110. package/payload/server/public/calendar.html +7 -7
  111. package/payload/server/public/chat.html +13 -13
  112. package/payload/server/public/data.html +12 -12
  113. package/payload/server/public/graph.html +9 -9
  114. package/payload/server/public/index.html +15 -15
  115. package/payload/server/public/operator.html +14 -14
  116. package/payload/server/public/public.html +13 -13
  117. package/payload/server/public/routines.html +7 -7
  118. package/payload/server/public/skills.html +5 -5
  119. package/payload/server/public/tasks.html +6 -6
  120. package/payload/server/server.js +43 -5
  121. package/payload/server/public/assets/AdminLoginScreens-BgDjueVe.js.br +0 -0
  122. package/payload/server/public/assets/AdminLoginScreens-BgDjueVe.js.gz +0 -0
  123. package/payload/server/public/assets/AdminShell-YctTrR-D.js.br +0 -0
  124. package/payload/server/public/assets/AdminShell-YctTrR-D.js.gz +0 -0
  125. package/payload/server/public/assets/activity-DGQt5ys_.js.br +0 -0
  126. package/payload/server/public/assets/activity-DGQt5ys_.js.gz +0 -0
  127. package/payload/server/public/assets/admin-DnUxbB3P.js.br +0 -0
  128. package/payload/server/public/assets/admin-DnUxbB3P.js.gz +0 -0
  129. package/payload/server/public/assets/agents-Bc2LZjwC.js.br +0 -0
  130. package/payload/server/public/assets/agents-Bc2LZjwC.js.gz +0 -0
  131. package/payload/server/public/assets/browser-BtF7SzvG.js +0 -1
  132. package/payload/server/public/assets/browser-BtF7SzvG.js.br +0 -0
  133. package/payload/server/public/assets/browser-BtF7SzvG.js.gz +0 -0
  134. package/payload/server/public/assets/calendar-D25EhXbD.js.br +0 -0
  135. package/payload/server/public/assets/calendar-D25EhXbD.js.gz +0 -0
  136. package/payload/server/public/assets/chat-z4jsHFXg.js +0 -1
  137. package/payload/server/public/assets/chat-z4jsHFXg.js.br +0 -0
  138. package/payload/server/public/assets/chat-z4jsHFXg.js.gz +0 -0
  139. package/payload/server/public/assets/chevron-left-BD09SN6R.js +0 -1
  140. package/payload/server/public/assets/chevron-right-ChmWeo7T.js +0 -1
  141. package/payload/server/public/assets/chevron-right-ChmWeo7T.js.br +0 -0
  142. package/payload/server/public/assets/clock-Yqf7Ke7I.js +0 -1
  143. package/payload/server/public/assets/clock-Yqf7Ke7I.js.br +0 -0
  144. package/payload/server/public/assets/clock-Yqf7Ke7I.js.gz +0 -0
  145. package/payload/server/public/assets/data-RmnKj5nC.js +0 -1
  146. package/payload/server/public/assets/data-RmnKj5nC.js.br +0 -2
  147. package/payload/server/public/assets/data-RmnKj5nC.js.gz +0 -0
  148. package/payload/server/public/assets/file-download-CiGklOfA.js.br +0 -0
  149. package/payload/server/public/assets/file-download-CiGklOfA.js.gz +0 -0
  150. package/payload/server/public/assets/file-text-XjJPULAZ.js.br +0 -0
  151. package/payload/server/public/assets/file-text-XjJPULAZ.js.gz +0 -0
  152. package/payload/server/public/assets/graph-BjHJ0z_6.js.br +0 -0
  153. package/payload/server/public/assets/graph-BjHJ0z_6.js.gz +0 -0
  154. package/payload/server/public/assets/graph-labels-D-0u37KA.js.br +0 -0
  155. package/payload/server/public/assets/graph-labels-D-0u37KA.js.gz +0 -0
  156. package/payload/server/public/assets/maximize-2-BJ9S-nfS.js.br +0 -0
  157. package/payload/server/public/assets/maximize-2-BJ9S-nfS.js.gz +0 -0
  158. package/payload/server/public/assets/operator-Cay4rOOK.js.br +0 -0
  159. package/payload/server/public/assets/operator-Cay4rOOK.js.gz +0 -0
  160. package/payload/server/public/assets/page-Cci_j_y7.js.br +0 -0
  161. package/payload/server/public/assets/page-Cci_j_y7.js.gz +0 -0
  162. package/payload/server/public/assets/page-shuh4ES9.js.br +0 -0
  163. package/payload/server/public/assets/page-shuh4ES9.js.gz +0 -0
  164. package/payload/server/public/assets/public-BbJcQGsO.js.br +0 -0
  165. package/payload/server/public/assets/public-BbJcQGsO.js.gz +0 -0
  166. package/payload/server/public/assets/rotate-ccw-jeSVwUAv.js.br +0 -0
  167. package/payload/server/public/assets/rotate-ccw-jeSVwUAv.js.gz +0 -0
  168. package/payload/server/public/assets/routines-D3M1Wh3a.js.br +0 -0
  169. package/payload/server/public/assets/routines-D3M1Wh3a.js.gz +0 -0
  170. package/payload/server/public/assets/skills-Bhej2ub1.js.br +0 -0
  171. package/payload/server/public/assets/skills-Bhej2ub1.js.gz +0 -0
  172. package/payload/server/public/assets/tasks-qY-dtOI2.js +0 -1
  173. package/payload/server/public/assets/tasks-qY-dtOI2.js.br +0 -0
  174. package/payload/server/public/assets/tasks-qY-dtOI2.js.gz +0 -0
  175. package/payload/server/public/assets/time-entry-format-r5UY9rjG.js.br +0 -0
  176. package/payload/server/public/assets/time-entry-format-r5UY9rjG.js.gz +0 -0
  177. package/payload/server/public/assets/triangle-alert--PCKaewD.js.br +0 -2
  178. package/payload/server/public/assets/triangle-alert--PCKaewD.js.gz +0 -0
  179. package/payload/server/public/assets/useCopyFeedback-Dg5lNgqH.js.br +0 -0
  180. package/payload/server/public/assets/useCopyFeedback-Dg5lNgqH.js.gz +0 -0
  181. package/payload/server/public/assets/useSubAccountSwitcher-BYfe9vj8.css +0 -1
  182. package/payload/server/public/assets/useSubAccountSwitcher-BYfe9vj8.css.br +0 -0
  183. package/payload/server/public/assets/useSubAccountSwitcher-BYfe9vj8.css.gz +0 -0
  184. package/payload/server/public/assets/useVoiceRecorder-BY6ZsGMH.js.br +0 -0
  185. package/payload/server/public/assets/useVoiceRecorder-BY6ZsGMH.js.gz +0 -0
  186. package/payload/server/public/assets/wrench-Bw1FMolk.js.br +0 -0
  187. package/payload/server/public/assets/wrench-Bw1FMolk.js.gz +0 -0
  188. /package/payload/server/public/assets/{useSubAccountSwitcher-CnpeWIYq.js → useSubAccountSwitcher-BRHYXwGO.js} +0 -0
  189. /package/payload/server/public/assets/{useSubAccountSwitcher-CnpeWIYq.js.br → useSubAccountSwitcher-BRHYXwGO.js.br} +0 -0
  190. /package/payload/server/public/assets/{useSubAccountSwitcher-CnpeWIYq.js.gz → useSubAccountSwitcher-BRHYXwGO.js.gz} +0 -0
@@ -16,6 +16,7 @@ import {
16
16
  clientIpMiddleware,
17
17
  createRemoteSession,
18
18
  emitMissingOnResolve,
19
+ fetchPageTargets,
19
20
  findMissingPlugins,
20
21
  fingerprintSessionKey,
21
22
  getAccountIdForSession,
@@ -32,6 +33,7 @@ import {
32
33
  isPublicPathAllowed,
33
34
  isRemoteAuthConfigured,
34
35
  migrateLegacyRemotePassword,
36
+ parseScreencastEvent,
35
37
  reconcileEnabledPluginsForAccounts,
36
38
  recordFailedAttempt,
37
39
  registerSession,
@@ -43,6 +45,7 @@ import {
43
45
  resolveClientIp,
44
46
  safeJson,
45
47
  sanitizeClientCorrId,
48
+ screencastLog,
46
49
  serve,
47
50
  setAccessPassword,
48
51
  setRemotePassword,
@@ -56,7 +59,7 @@ import {
56
59
  verifyRemotePassword,
57
60
  vncLog,
58
61
  walkPremiumBundles
59
- } from "./chunk-WT2PFGY4.js";
62
+ } from "./chunk-KY3BBT67.js";
60
63
  import {
61
64
  DATA_ROOT,
62
65
  EXTRACTED_TEXT_SUFFIX,
@@ -20720,6 +20723,7 @@ function resolveSpawnPlan(host, operatorDomains, body, mintId = randomUUID7, adm
20720
20723
  const resumeId = typeof body.sessionId === "string" && body.sessionId.length > 0 ? body.sessionId : void 0;
20721
20724
  const name = typeof body.name === "string" && body.name.length > 0 ? body.name : void 0;
20722
20725
  const rawTitle = typeof body.title === "string" ? body.title.trim() : "";
20726
+ const rawInitialMessage = typeof body.initialMessage === "string" ? body.initialMessage.trim() : "";
20723
20727
  const webchatBind = resumeId === void 0 || operator;
20724
20728
  const kind = resumeId === void 0 ? "new" : "resume";
20725
20729
  const origin = operator ? "operator" : "admin";
@@ -20742,6 +20746,7 @@ function resolveSpawnPlan(host, operatorDomains, body, mintId = randomUUID7, adm
20742
20746
  if (name) payload.name = name;
20743
20747
  if (pickedModel) payload.model = pickedModel;
20744
20748
  if (pickedEffort) payload.effort = pickedEffort;
20749
+ if (kind === "new" && rawInitialMessage.length > 0) payload.initialMessage = rawInitialMessage;
20745
20750
  if (adminUserId) payload.adminUserId = adminUserId;
20746
20751
  if (targetAccountId) payload.targetAccountId = targetAccountId;
20747
20752
  if (authenticatedName) payload.authenticatedName = authenticatedName;
@@ -20789,7 +20794,10 @@ app38.post("/", requireAdminSession, async (c) => {
20789
20794
  `[chat-spawn] op=request spawnReqId=${spawnReqId} origin=${plan.origin} kind=${plan.kind} sessionId=${plan.kind === "new" ? "new" : plan.sessionId}`
20790
20795
  );
20791
20796
  if (plan.webchatBind) {
20792
- console.log(`[chat-spawn] op=args spawnReqId=${spawnReqId} webchatChannel=present sessionId=${plan.sessionId}`);
20797
+ const seedBytes = typeof plan.payload.initialMessage === "string" ? Buffer.byteLength(plan.payload.initialMessage, "utf8") : 0;
20798
+ console.log(
20799
+ `[chat-spawn] op=args spawnReqId=${spawnReqId} webchatChannel=present sessionId=${plan.sessionId} initialMessage=${seedBytes > 0 ? `${seedBytes}b` : "none"}`
20800
+ );
20793
20801
  console.log(
20794
20802
  `[webchat-spawn] op=args sessionId=${plan.sessionId} model=${plan.model ?? "default"} effort=${plan.effort ?? "default"} source=${plan.paramsSource} accountId=${plan.payload.targetAccountId?.slice(0, 8) ?? "unset"}`
20795
20803
  );
@@ -21983,6 +21991,33 @@ app48.post("/launch", requireAdminSession, async (c) => {
21983
21991
  );
21984
21992
  }
21985
21993
  });
21994
+ app48.get("/screencast-targets", requireAdminSession, async (c) => {
21995
+ const result = await fetchPageTargets({
21996
+ fetchImpl: fetch,
21997
+ cdpPort: CDP_PORT,
21998
+ platform: process.platform
21999
+ });
22000
+ if (!result.ok) {
22001
+ screencastLog("targets-failed", { status: result.status, error: result.error });
22002
+ return c.json({ ok: false, error: result.error }, result.status);
22003
+ }
22004
+ screencastLog("targets", { count: result.targets.length, cdpPort: CDP_PORT });
22005
+ return c.json({ ok: true, targets: result.targets });
22006
+ });
22007
+ app48.post("/screencast-event", requireAdminSession, async (c) => {
22008
+ let body;
22009
+ try {
22010
+ body = await c.req.json();
22011
+ } catch {
22012
+ return c.json({ ok: false, error: "invalid json" }, 400);
22013
+ }
22014
+ const parsed = parseScreencastEvent(body);
22015
+ if (!parsed.ok) {
22016
+ return c.json({ ok: false, error: "unknown op" }, 400);
22017
+ }
22018
+ screencastLog(parsed.op, parsed.detail);
22019
+ return c.json({ ok: true });
22020
+ });
21986
22021
  var browser_default = app48;
21987
22022
 
21988
22023
  // server/routes/admin/calendar.ts
@@ -24050,7 +24085,8 @@ app59.post("/", requireAdminSession, async (c) => {
24050
24085
  `MATCH (t:Task {taskId: $taskId, accountId: $accountId})
24051
24086
  OPTIONAL MATCH (t)-[:WORKED_ON_IN]->(conv:Conversation)
24052
24087
  WITH t, head(collect(conv)) AS linked
24053
- RETURN t.name AS name, linked.sessionId AS sessionId LIMIT 1`,
24088
+ RETURN t.name AS name, t.description AS description, t.notes AS notes,
24089
+ linked.sessionId AS sessionId LIMIT 1`,
24054
24090
  { taskId, accountId }
24055
24091
  );
24056
24092
  if (found.records.length === 0) {
@@ -24059,8 +24095,10 @@ app59.post("/", requireAdminSession, async (c) => {
24059
24095
  }
24060
24096
  const title = found.records[0].get("name") ?? "";
24061
24097
  const sessionId = found.records[0].get("sessionId") ?? null;
24098
+ const description = found.records[0].get("description") ?? "";
24099
+ const notes = found.records[0].get("notes") ?? "";
24062
24100
  console.log(`${TAG34} op=request taskId=${taskId} account=${accountId} linked=${sessionId ?? "none"}`);
24063
- if (sessionId !== null) return c.json({ sessionId, title, accountId });
24101
+ if (sessionId !== null) return c.json({ sessionId, title, description, notes });
24064
24102
  const now = (/* @__PURE__ */ new Date()).toISOString();
24065
24103
  const stamped = await session.run(
24066
24104
  `MATCH (t:Task {taskId: $taskId, accountId: $accountId})
@@ -24070,7 +24108,7 @@ app59.post("/", requireAdminSession, async (c) => {
24070
24108
  );
24071
24109
  const at = stamped.records[0]?.get("at") ?? void 0;
24072
24110
  console.log(`${TAG34} op=marker taskId=${taskId} stamped=${at !== void 0}`);
24073
- return c.json({ sessionId: null, title, accountId });
24111
+ return c.json({ sessionId: null, title, description, notes });
24074
24112
  } catch (err) {
24075
24113
  console.error(`${TAG34} op=request taskId=${taskId} error="${err instanceof Error ? err.message : String(err)}"`);
24076
24114
  return c.json({ error: "task-session-open-failed" }, 500);
@@ -1 +0,0 @@
1
- import{o as e}from"./chunk-CltuBf4Z.js";import{D as t,H as n,J as r,K as i,R as a,g as o,h as s,k as c}from"./useSubAccountSwitcher-CnpeWIYq.js";import{E as l,t as u,v as d}from"./AdminShell-YctTrR-D.js";var f=i(),p=e(r(),1),m=n(),h=`maxy-vnc-popout`;function g(){let[e,n]=(0,p.useState)(null),[r,i]=(0,p.useState)(!1),[s,l]=(0,p.useState)(null),u=o(null);(0,p.useEffect)(()=>{let e=!1;return fetch(`/vnc-viewer.html`,{method:`HEAD`}).then(t=>{e||(console.info(`[browser-page] op=viewer-probe available=${t.ok}`),n(t.ok))}).catch(()=>{e||(console.info(`[browser-page] op=viewer-probe available=false`),n(!1))}),()=>{e=!0}},[]);let f=(0,p.useCallback)(()=>{window.open(`/vnc-popout.html?title=${encodeURIComponent(a.productName)}`,h,`width=1024,height=768`)},[]),g=(0,p.useCallback)(async()=>{i(!0),l(null);try{let e=await u(`/api/admin/browser/launch`,{method:`POST`});if(!e.ok){let t=await e.json().catch(()=>({}));throw Error(t.error||`Launch failed (${e.status})`)}}catch(e){l(e instanceof Error?e.message:String(e))}finally{i(!1)}},[u]);return e===null?(0,m.jsx)(`div`,{className:`vnc-surface`,children:(0,m.jsxs)(`div`,{className:`data-loading`,children:[(0,m.jsx)(t,{size:18,className:`spin`}),` Checking viewer…`]})}):e?(0,m.jsxs)(`div`,{className:`vnc-surface`,children:[(0,m.jsxs)(`div`,{className:`vnc-surface__toolbar`,children:[(0,m.jsxs)(`button`,{type:`button`,className:`vnc-surface__btn`,onClick:g,disabled:r,children:[r?(0,m.jsx)(t,{size:14,className:`spin`}):(0,m.jsx)(c,{size:14}),` Launch browser`]}),(0,m.jsxs)(`button`,{type:`button`,className:`vnc-surface__btn`,onClick:f,children:[(0,m.jsx)(d,{size:14}),` Pop out`]}),s&&(0,m.jsx)(`span`,{className:`vnc-surface__error`,children:s})]}),(0,m.jsx)(`div`,{className:`vnc-surface__viewport`,children:(0,m.jsx)(`iframe`,{className:`vnc-surface__iframe`,src:`/vnc-viewer.html`,title:`VNC viewer`})})]}):(0,m.jsx)(`div`,{className:`vnc-surface`,children:(0,m.jsxs)(`div`,{className:`vnc-surface__unavailable`,children:[(0,m.jsx)(c,{size:28,strokeWidth:1.75}),(0,m.jsx)(`p`,{children:`VNC surface not available on this platform.`})]})})}function _(){let[e,n]=(0,p.useState)(null),[r,i]=(0,p.useState)(!1),[a,o]=(0,p.useState)(void 0),[d,f]=(0,p.useState)(null),[h,_]=(0,p.useState)(void 0),[v,y]=(0,p.useState)(null),[b,x]=(0,p.useState)(null);(0,p.useEffect)(()=>{let e=!1,t=null;try{t=sessionStorage.getItem(`maxy-admin-session-key`)}catch{}if(!t){n(null),i(!0);return}return fetch(`/api/admin/session?session_key=${encodeURIComponent(t)}`).then(async r=>{if(!e){if(r.status===401){try{sessionStorage.removeItem(`maxy-admin-session-key`)}catch{}window.location.href=`/`;return}if(r.ok)try{let e=await r.json();typeof e.businessName==`string`&&o(e.businessName),e.sessionId!==void 0&&f(e.sessionId??null),x(e.role??null),_(e.userName===void 0?null:e.userName),y(e.avatar??null)}catch{}n(t),i(!0)}}).catch(()=>{e||(n(t),i(!0))}),()=>{e=!0}},[]);let S=(0,p.useCallback)(()=>{try{sessionStorage.removeItem(`maxy-admin-session-key`)}catch{}window.location.href=`/`},[]),[C,w]=(0,p.useState)(!1),T=(0,p.useCallback)(async()=>{w(!0);try{let e=await l();if(e){try{sessionStorage.removeItem(`maxy-admin-session-key`)}catch{}window.location.href=`/`}return e}finally{w(!1)}},[]);return r?e?(0,m.jsx)(s,{cacheKey:e,surface:`browser`,onSessionExpired:({code:e,path:t})=>{console.warn(`[admin-auth] outcome=session-expired-redirect code=${e} path=${t} surface=browser`);try{sessionStorage.removeItem(`maxy-admin-session-key`)}catch{}window.location.href=`/`},children:(0,m.jsx)(u,{cacheKey:e,businessName:a,sessionId:d,onLogout:S,onDisconnect:T,disconnecting:C,userName:h,userAvatar:v,role:b,children:(0,m.jsxs)(`div`,{className:`data-page`,children:[(0,m.jsx)(`header`,{className:`data-header`,children:(0,m.jsxs)(`h1`,{className:`data-title`,children:[(0,m.jsx)(c,{size:18}),` Browser`]})}),(0,m.jsx)(g,{})]})})}):(0,m.jsxs)(`div`,{className:`data-page`,children:[(0,m.jsx)(`header`,{className:`data-header`,children:(0,m.jsxs)(`h1`,{className:`data-title`,children:[(0,m.jsx)(c,{size:18}),` Browser`]})}),(0,m.jsxs)(`div`,{className:`data-empty`,children:[(0,m.jsx)(`p`,{children:`You are not signed in.`}),(0,m.jsxs)(`p`,{children:[`Open the `,(0,m.jsx)(`a`,{href:`/`,className:`data-link`,children:`main admin page`}),` and log in, then return here.`]})]})]}):(0,m.jsx)(`div`,{className:`data-page`,children:(0,m.jsxs)(`div`,{className:`data-loading`,children:[(0,m.jsx)(t,{size:18,className:`spin`}),` Loading…`]})})}(0,f.createRoot)(document.getElementById(`root`)).render((0,m.jsx)(_,{}));
@@ -1 +0,0 @@
1
- import{H as e,K as t}from"./useSubAccountSwitcher-CnpeWIYq.js";import"./useVoiceRecorder-BY6ZsGMH.js";import"./AdminShell-YctTrR-D.js";import{n}from"./page-Cci_j_y7.js";import"./useCopyFeedback-Dg5lNgqH.js";var r=t(),i=e();(0,r.createRoot)(document.getElementById(`root`)).render((0,i.jsx)(n,{}));
@@ -1 +0,0 @@
1
- import{I as e}from"./useSubAccountSwitcher-CnpeWIYq.js";var t=e(`chevron-left`,[[`path`,{d:`m15 18-6-6 6-6`,key:`1wnfg3`}]]);export{t};
@@ -1 +0,0 @@
1
- import{I as e}from"./useSubAccountSwitcher-CnpeWIYq.js";var t=e(`chevron-right`,[[`path`,{d:`m9 18 6-6-6-6`,key:`mthhwq`}]]);export{t};
@@ -1 +0,0 @@
1
- import{I as e}from"./useSubAccountSwitcher-CnpeWIYq.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{H as e,K as t}from"./useSubAccountSwitcher-CnpeWIYq.js";import"./useVoiceRecorder-BY6ZsGMH.js";import{t as n}from"./page-shuh4ES9.js";import"./graph-labels-D-0u37KA.js";var r=t(),i=e();(0,r.createRoot)(document.getElementById(`root`)).render((0,i.jsx)(n,{}));
@@ -1,2 +0,0 @@
1
-  `�
2
- ��@�N^?]Z���ښS�^���R��T {i�4�:
@@ -1 +0,0 @@
1
- import{o as e}from"./chunk-CltuBf4Z.js";import{G as t,H as n,J as r,K as i,L as a,N as o,b as s,h as c,v as l,w as u}from"./useSubAccountSwitcher-CnpeWIYq.js";import{E as d,h as f,r as p,t as m}from"./AdminShell-YctTrR-D.js";import{n as h,t as g}from"./time-entry-format-r5UY9rjG.js";import{t as _}from"./rotate-ccw-jeSVwUAv.js";var v=i(),y=e(r(),1);function b(e=3e4){let[t,n]=(0,y.useState)(()=>Date.now());return(0,y.useEffect)(()=>{let t=setInterval(()=>n(Date.now()),e);return()=>clearInterval(t)},[e]),t}function x(e,t){let n=new Map,r=(e,t,r)=>{let i=n.get(e)??{openCount:0,totalSeconds:0};i.totalSeconds+=t,r&&(i.openCount+=1),n.set(e,i)};for(let t of e)t.clientName&&r(t.clientName,t.secondsLogged,!0);for(let e of t)e.clientName&&r(e.clientName,e.secondsLogged,!1);let i=[...n.entries()].map(([e,t])=>({name:e,openCount:t.openCount,totalSeconds:t.totalSeconds}));return i.sort((e,t)=>t.openCount-e.openCount||e.name.localeCompare(t.name)),S(e,i),i}function S(e,t){let n=t.reduce((e,t)=>e+t.openCount,0),r=e.filter(e=>!e.clientName).length,i=n+r===e.length;return i||console.warn(`[tasks-clients] reconcile-mismatch assigned=${n} unassigned=${r} openTotal=${e.length}`),i}var C=`__unassigned__`;function w(e,t){return e===`__unassigned__`?`Unassigned`:t||e.slice(0,8)}function T(e){return e===null||e===``?C:e}function E(e,t){let n=new Map,r=(e,t)=>{let r=T(e.assigneeUserId),i=n.get(r)??{name:null,openCount:0,totalCount:0};i.name===null&&e.assigneeName&&(i.name=e.assigneeName),i.totalCount+=1,t&&(i.openCount+=1),n.set(r,i)};for(let t of e)r(t,!0);for(let e of t)r(e,!1);let i=[...n.entries()].map(([e,t])=>({userId:e,label:w(e,t.name),openCount:t.openCount,totalCount:t.totalCount}));return i.sort((e,t)=>t.openCount-e.openCount||e.label.localeCompare(t.label)),i}function D(e,t){return t===null?!0:T(e.assigneeUserId)===t}var O=n();function k(e){let t=e.name??e.userId.slice(0,8);return e.kind===`owner`?`${t} (owner)`:t}var A=`maxy-admin-session-key`;function j(e){let t=[];return e.clientName&&t.push(e.clientName),e.propertyAddress&&t.push(e.propertyAddress),e.fee!=null&&t.push(`£${e.fee}`),t.join(` · `)}function M(e){if(!e)return``;let t=Date.parse(e);if(!Number.isFinite(t))return``;let n=new Date(t);return`${n.getUTCDate()} ${[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`][n.getUTCMonth()]} ${n.getUTCFullYear()}`}function N(e){return e.assigneeName?e.assigneeName:e.assigneeUserId?e.assigneeUserId.slice(0,8):`Unassigned`}function P(e,t){return[t,M(e.createdAt),N(e)].filter(Boolean).join(` · `)}function ee(e,t){if(e.running&&e.runningStartedAt){let n=Date.parse(e.runningStartedAt);if(Number.isFinite(n))return e.secondsLogged+Math.max(0,(t-n)/1e3)}return e.secondsLogged}function te({clients:e,onSelect:t}){return(0,O.jsxs)(`section`,{className:`admin-card tasks-card`,children:[(0,O.jsxs)(`div`,{className:`tasks-card-head`,children:[(0,O.jsx)(`span`,{className:`tasks-card-title`,children:`Clients`}),(0,O.jsxs)(`span`,{className:`tasks-card-count`,children:[e.length,` total`]})]}),e.length===0&&(0,O.jsx)(`div`,{className:`tasks-empty`,children:`No clients yet.`}),e.map(e=>(0,O.jsx)(`button`,{className:`tasks-row tasks-client-row`,onClick:()=>t(e.name),children:(0,O.jsxs)(`div`,{className:`tasks-row-main`,children:[(0,O.jsx)(`div`,{className:`tasks-row-name`,children:e.name}),(0,O.jsxs)(`div`,{className:`tasks-row-sub`,children:[e.openCount,` open · `,g(e.totalSeconds),` logged`]})]})},e.name))]})}function ne({task:e,roster:t,busy:n,onAssign:r,onClose:i}){return(0,y.useEffect)(()=>{let e=e=>{e.key===`Escape`&&i()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[i]),(0,O.jsx)(`div`,{className:`tasks-detail-backdrop`,onClick:i,children:(0,O.jsxs)(`div`,{className:`tasks-detail`,role:`dialog`,"aria-modal":`true`,"aria-label":`Task detail`,onClick:e=>e.stopPropagation(),children:[(0,O.jsxs)(`div`,{className:`tasks-detail-head`,children:[(0,O.jsx)(`h2`,{className:`tasks-detail-title`,children:e?e.name:`Task no longer available`}),(0,O.jsx)(`button`,{className:`tasks-detail-close`,"aria-label":`Close`,onClick:i,children:(0,O.jsx)(l,{size:16})})]}),e===null?(0,O.jsx)(`p`,{className:`tasks-detail-gone`,children:`This task is no longer in the list. It may have been completed, cancelled or removed. Close this and reload to see the current list.`}):(0,O.jsxs)(`dl`,{className:`tasks-detail-fields`,children:[(0,O.jsx)(`dt`,{children:`Status`}),(0,O.jsx)(`dd`,{children:e.status}),(0,O.jsx)(`dt`,{children:`Logged`}),(0,O.jsx)(`dd`,{children:g(e.secondsLogged)}),(0,O.jsx)(`dt`,{children:`Created`}),(0,O.jsx)(`dd`,{children:M(e.createdAt)||`Not recorded`}),(0,O.jsx)(`dt`,{children:`Assignee`}),(0,O.jsx)(`dd`,{children:e.taskId===null?N(e):(0,O.jsxs)(`select`,{className:`tasks-assign-select`,"aria-label":`Assignee`,disabled:n,value:e.assigneeUserId??``,onChange:t=>r(e.taskId,t.target.value===``?null:t.target.value),children:[(0,O.jsx)(`option`,{value:``,children:`Unassigned`}),e.assigneeUserId&&!t.some(t=>t.userId===e.assigneeUserId)&&(0,O.jsxs)(`option`,{value:e.assigneeUserId,children:[N(e),` (not in roster)`]}),t.map(e=>(0,O.jsx)(`option`,{value:e.userId,children:k(e)},e.userId))]})}),e.clientName&&(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(`dt`,{children:`Client`}),(0,O.jsx)(`dd`,{children:e.clientName})]}),e.propertyAddress&&(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(`dt`,{children:`Property`}),(0,O.jsx)(`dd`,{children:e.propertyAddress})]}),e.fee!=null&&(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(`dt`,{children:`Fee`}),(0,O.jsxs)(`dd`,{children:[`£`,e.fee]})]})]})]})})}function F({adminFetch:e}){let[t,n]=(0,y.useState)({open:[],completed:[]}),[r,i]=(0,y.useState)(!1),[c,d]=(0,y.useState)(!1),m=(0,y.useRef)(!1),v=(0,y.useRef)(``),S=b(1e3),[C,w]=(0,y.useState)(`open`),[T,k]=(0,y.useState)(null),[A,M]=(0,y.useState)(null),[N,F]=(0,y.useState)(null),[I,L]=(0,y.useState)(``),[R,z]=(0,y.useState)(null),[re,B]=(0,y.useState)(null),V=(0,y.useRef)(new Set),[ie,H]=(0,y.useState)(new Set),U=(0,y.useMemo)(()=>{if(R!==null)return[...t.open,...t.completed].find(e=>e.rowKey===R)??null},[t,R]);(0,y.useEffect)(()=>{R!==null&&U===null&&console.error(`[tasks-ui] op=detail-failed rowKey=${R} reason=not-in-list`)},[R,U]);let W=(0,y.useMemo)(()=>x(t.open,t.completed),[t]),G=(0,y.useMemo)(()=>T===null?{open:t.open,completed:t.completed}:{open:t.open.filter(e=>e.clientName===T),completed:t.completed.filter(e=>e.clientName===T)},[t,T]),K=(0,y.useMemo)(()=>E(G.open,G.completed),[G]),ae=(0,y.useCallback)(e=>{k(e),w(`open`)},[]);(0,y.useEffect)(()=>{T&&!W.some(e=>e.name===T)&&k(null)},[W,T]),(0,y.useEffect)(()=>{A&&!K.some(e=>e.userId===A)&&M(null)},[K,A]),(0,y.useEffect)(()=>{B(null)},[C,T,A]);let q=t.open.filter(e=>e.running||(T===null||e.clientName===T)&&D(e,A)),J=(T?t.completed.filter(e=>e.clientName===T):t.completed).filter(e=>D(e,A)),[oe,se]=(0,y.useState)([]),Y=(0,y.useCallback)(async()=>{let t=await e(`/api/admin/tasks-list`);t.ok&&n(await t.json()),i(!0)},[e]);(0,y.useEffect)(()=>{Y()},[Y]),(0,y.useEffect)(()=>{(async()=>{let t=await e(`/api/admin/admin-users-list`);if(t.ok){let e=await t.json();e.ok&&Array.isArray(e.users)&&se(e.users)}})()},[e]);let X=(0,y.useCallback)(async(t,n,r)=>{if(m.current)return!1;m.current=!0,d(!0);try{return await e(t,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({taskId:n,...r})}),await Y(),!0}finally{m.current=!1,d(!1)}},[e,Y]),ce=(0,y.useCallback)(async e=>{await X(`/api/admin/task-complete`,e)&&console.log(`[tasks-ui] op=complete taskId=${e.slice(0,8)} confirmed=true`)},[X]),le=(0,y.useCallback)((e,t)=>{let n=String(Math.round(e.secondsLogged/60));v.current=n,F(t),L(n)},[]),Z=(0,y.useCallback)(()=>{F(null),L(``)},[]),ue=(0,y.useCallback)(async e=>{let t=I.trim(),n=Number(t);if(!(t===``||!Number.isInteger(n)||n<0)){if(t===v.current){Z();return}F(null),L(``),await X(`/api/admin/task-time-adjust`,e,{newSeconds:n*60})}},[I,X,Z]),de=(0,y.useCallback)(e=>{X(`/api/admin/task-time-adjust`,e,{newSeconds:0})},[X]),fe=(0,y.useCallback)((e,t)=>{X(`/api/admin/task-assign`,e,{assigneeUserId:t})},[X]),pe=(0,y.useCallback)(async t=>{if(!V.current.has(t)){V.current.add(t),H(new Set(V.current));try{let n=await e(`/api/admin/task-session-open`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({taskId:t})});if(!n.ok){console.error(`[admin-ui] task-session op=open-failed taskId=${t} status=${n.status}`);return}let{sessionId:r,title:i,accountId:a}=await n.json(),o=r===null?`new`:`resume`,s=r===null?{title:i}:{sessionId:r,name:i,...a?{targetAccountId:a}:{}},c=await e(`/api/admin/session-rc-spawn`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(s)}),l=await c.json().catch(()=>({})),u=p(c.ok,c.status,l),d=l.sessionId??r??null;if(console.info(`[admin-ui] task-session op=spawn taskId=${t} kind=${o} status=${c.status} outcome=${u.kind} requested=${r??`new`} landed=${d??`none`}`),u.kind!==`navigate`){console.error(`[admin-ui] task-session op=spawn-failed taskId=${t} reason=${u.reason}`);return}let f=!1;if(d!==null){let n=await e(`/api/admin/task-session-link`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({taskId:t,sessionId:d})});f=n.ok&&(await n.json().catch(()=>({}))).linked===!0}else console.error(`[admin-ui] task-session op=link-skipped taskId=${t} reason=no-landed-session-id`);console.info(`[admin-ui] task-session op=navigate taskId=${t} sessionId=${d??`none`} linked=${f} sameOrigin=${u.sameOrigin}`),u.sameOrigin?window.location.assign(u.url):window.open(u.url,`_blank`)}catch(e){console.error(`[admin-ui] task-session op=failed taskId=${t} error=${e instanceof Error?e.message:String(e)}`)}finally{V.current.delete(t),H(new Set(V.current))}}},[e]);if(!r)return(0,O.jsx)(a,{surface:`gate`});let Q=e=>e.taskId!==null&&N===e.taskId,$=(e,t)=>Q(e)?(0,O.jsxs)(`div`,{className:`tasks-edit`,children:[(0,O.jsx)(`input`,{className:`tasks-edit-input`,type:`number`,min:0,step:1,"aria-label":`Logged minutes`,value:I,onChange:e=>L(e.target.value)}),(0,O.jsx)(`span`,{className:`tasks-edit-unit`,children:`min`}),(0,O.jsxs)(`button`,{className:`admin-btn-cta tasks-btn-action`,disabled:c,onClick:()=>void ue(t),children:[(0,O.jsx)(o,{size:14}),` Save`]}),(0,O.jsxs)(`button`,{className:`tasks-btn-secondary tasks-btn-action`,onClick:Z,children:[(0,O.jsx)(l,{size:14}),` Cancel`]})]}):(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(`button`,{className:`tasks-time-btn`,"aria-label":`Edit time`,disabled:c||e.running,title:e.running?`Stop the timer before editing time`:void 0,onClick:()=>le(e,t),children:(0,O.jsx)(u,{size:14})}),(0,O.jsx)(`button`,{className:`tasks-time-btn`,"aria-label":`Reset time`,disabled:c||e.running,title:e.running?`Stop the timer before resetting time`:void 0,onClick:()=>de(t),children:(0,O.jsx)(_,{size:14})})]});return(0,O.jsxs)(`div`,{className:`ui-page ui-page--full tasks-body`,children:[R!==null&&(0,O.jsx)(ne,{task:U??null,roster:oe,busy:c,onAssign:fe,onClose:()=>z(null)}),(0,O.jsxs)(`div`,{className:`tasks-tabs`,children:[(0,O.jsxs)(`button`,{className:`admin-chip ${C===`open`?`is-active`:``}`,onClick:()=>w(`open`),children:[`Open `,(0,O.jsx)(`span`,{className:`tasks-tab-badge`,children:t.open.length})]}),(0,O.jsxs)(`button`,{className:`admin-chip ${C===`completed`?`is-active`:``}`,onClick:()=>w(`completed`),children:[`Completed `,(0,O.jsx)(`span`,{className:`tasks-tab-badge`,children:t.completed.length})]}),(0,O.jsxs)(`button`,{className:`admin-chip ${C===`clients`?`is-active`:``}`,onClick:()=>w(`clients`),children:[`Clients `,(0,O.jsx)(`span`,{className:`tasks-tab-badge`,children:W.length})]})]}),C===`clients`?(0,O.jsx)(te,{clients:W,onSelect:ae}):(0,O.jsxs)(O.Fragment,{children:[T&&(0,O.jsxs)(`div`,{className:`tasks-filter-banner`,children:[(0,O.jsxs)(`span`,{children:[`Showing `,T]}),(0,O.jsx)(`button`,{className:`tasks-filter-clear`,onClick:()=>k(null),children:`Clear`})]}),K.length>0&&(0,O.jsxs)(`div`,{className:`tasks-assignee-bar`,children:[(0,O.jsxs)(`button`,{className:`admin-chip ${A===null?`is-active`:``}`,"aria-pressed":A===null,onClick:()=>M(null),children:[`All `,(0,O.jsx)(`span`,{className:`tasks-assignee-count`,children:G.open.length})]}),K.map(e=>(0,O.jsxs)(`button`,{className:`admin-chip ${A===e.userId?`is-active`:``}`,"aria-pressed":A===e.userId,"aria-label":`Assignee ${e.label}`,title:e.userId===`__unassigned__`?`Tasks with no assigned admin`:`AdminUser ${e.userId}`,onClick:()=>M(A===e.userId?null:e.userId),children:[e.label,` `,(0,O.jsx)(`span`,{className:`tasks-assignee-count`,children:e.openCount})]},e.userId))]}),C===`open`?(0,O.jsxs)(`section`,{className:`admin-card tasks-card`,children:[(0,O.jsxs)(`div`,{className:`tasks-card-head`,children:[(0,O.jsx)(`span`,{className:`tasks-card-title`,children:`Open tasks`}),(0,O.jsxs)(`span`,{className:`tasks-card-count`,children:[q.length,` to do`]})]}),q.length===0&&(0,O.jsx)(`div`,{className:`tasks-empty`,children:`No open tasks.`}),q.map(e=>(0,O.jsxs)(`div`,{className:`tasks-row`,children:[(0,O.jsx)(`button`,{className:`tasks-row-open`,"aria-label":`Open task detail: ${e.name}`,onClick:()=>z(e.rowKey),children:(0,O.jsxs)(`div`,{className:`tasks-row-main`,children:[(0,O.jsx)(`div`,{className:`tasks-row-name`,children:e.name}),(0,O.jsx)(`div`,{className:`tasks-row-sub`,children:P(e,j(e))})]})}),(0,O.jsx)(`div`,{className:`tasks-row-elapsed ${e.running?`tasks-row-elapsed-running`:``}`,children:g(ee(e,S))}),(0,O.jsx)(`div`,{className:`tasks-row-controls`,children:e.taskId!==null&&re===e.taskId?(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(`span`,{className:`tasks-confirm-label`,children:`Complete?`}),(0,O.jsxs)(`button`,{className:`admin-btn-cta tasks-btn-action`,disabled:c,onClick:()=>{B(null),ce(e.taskId)},children:[(0,O.jsx)(o,{size:14}),` Confirm complete`]}),(0,O.jsxs)(`button`,{className:`tasks-btn-secondary tasks-btn-action`,onClick:()=>B(null),children:[(0,O.jsx)(l,{size:14}),` Keep open`]})]}):e.taskId===null?(0,O.jsx)(`span`,{className:`tasks-row-broken`,title:`This task has no id, so it cannot be started, edited or completed. Repair it by running platform/scripts/backfill-task-ids.sh on this install.`,children:`Needs repair`}):(0,O.jsxs)(O.Fragment,{children:[$(e,e.taskId),Q(e)?null:(0,O.jsxs)(`button`,{className:`tasks-btn-secondary tasks-btn-action`,"aria-label":`Open session for task: ${e.name}`,disabled:ie.has(e.taskId),title:e.sessionId?`Resume this task’s session`:`Start a session for this task`,onClick:()=>void pe(e.taskId),children:[(0,O.jsx)(f,{size:14}),` Session`]}),Q(e)?null:(0,O.jsxs)(`button`,{className:`tasks-btn-secondary tasks-btn-action`,"aria-label":`Complete task: ${e.name}`,disabled:c||e.running,title:e.running?`Stop the timer before completing`:void 0,onClick:()=>B(e.taskId),children:[(0,O.jsx)(o,{size:14}),` Complete`]}),Q(e)?null:e.running?(0,O.jsxs)(`button`,{className:`admin-btn-danger tasks-btn-action`,disabled:c,onClick:()=>void X(`/api/admin/task-timer-stop`,e.taskId),children:[(0,O.jsx)(s,{size:14}),` Stop`]}):(0,O.jsxs)(`button`,{className:`admin-btn-cta tasks-btn-action`,disabled:c,onClick:()=>void X(`/api/admin/task-timer-start`,e.taskId),children:[(0,O.jsx)(h,{size:14}),` Start`]})]})})]},e.rowKey))]}):(0,O.jsxs)(`section`,{className:`admin-card tasks-card`,children:[(0,O.jsxs)(`div`,{className:`tasks-card-head`,children:[(0,O.jsx)(`span`,{className:`tasks-card-title`,children:`Completed`}),(0,O.jsxs)(`span`,{className:`tasks-card-count`,children:[J.length,` done`]})]}),J.length===0&&(0,O.jsx)(`div`,{className:`tasks-empty`,children:`Nothing completed yet.`}),J.map(e=>(0,O.jsxs)(`div`,{className:`tasks-row tasks-row-done`,children:[(0,O.jsx)(`button`,{className:`tasks-row-open`,"aria-label":`Open task detail: ${e.name}`,onClick:()=>z(e.rowKey),children:(0,O.jsxs)(`div`,{className:`tasks-row-main`,children:[(0,O.jsx)(`div`,{className:`tasks-row-name`,children:e.name}),(0,O.jsx)(`div`,{className:`tasks-row-sub`,children:P(e,j(e))})]})}),(0,O.jsx)(`div`,{className:`tasks-row-elapsed`,children:g(e.secondsLogged)}),(0,O.jsx)(`div`,{className:`tasks-row-controls`,children:e.taskId===null?(0,O.jsx)(`span`,{className:`tasks-row-broken`,title:`This task has no id, so its logged time cannot be edited. Repair it by running platform/scripts/backfill-task-ids.sh on this install.`,children:`Needs repair`}):$(e,e.taskId)})]},e.rowKey))]})]})]})}function I({cacheKey:e}){let{adminFetch:n}=t({initialCacheKey:e,surface:`tasks`});return(0,O.jsx)(F,{adminFetch:n})}function L(){let[e,t]=(0,y.useState)(null),[n,r]=(0,y.useState)(!1),[i,o]=(0,y.useState)(void 0),[s,l]=(0,y.useState)(null),[u,f]=(0,y.useState)(null),[p,h]=(0,y.useState)(null),[g,_]=(0,y.useState)(null);(0,y.useEffect)(()=>{let e=!1,n=null;try{n=sessionStorage.getItem(A)}catch{}if(!n){t(null),r(!0);return}return fetch(`/api/admin/session?session_key=${encodeURIComponent(n)}`).then(async i=>{if(!e){if(i.status===401){try{sessionStorage.removeItem(A)}catch{}window.location.href=`/`;return}if(i.ok)try{let e=await i.json();typeof e.businessName==`string`&&o(e.businessName),e.sessionId!==void 0&&l(e.sessionId??null),f(e.role??null),h(e.userName===void 0?null:e.userName),_(e.avatar??null)}catch{}t(n),r(!0)}}).catch(()=>{e||(t(n),r(!0))}),()=>{e=!0}},[]);let v=(0,y.useCallback)(()=>{try{sessionStorage.removeItem(A)}catch{}window.location.href=`/`},[]),[b,x]=(0,y.useState)(!1),S=(0,y.useCallback)(async()=>{x(!0);try{let e=await d();if(e){try{sessionStorage.removeItem(A)}catch{}window.location.href=`/`}return e}finally{x(!1)}},[]);return n?e?(0,O.jsx)(c,{cacheKey:e,surface:`tasks`,onSessionExpired:({code:e,path:t})=>{console.warn(`[admin-auth] outcome=session-expired-redirect code=${e} path=${t} surface=tasks`);try{sessionStorage.removeItem(A)}catch{}window.location.href=`/`},children:(0,O.jsx)(m,{cacheKey:e,businessName:i,sessionId:s,onLogout:v,onDisconnect:S,disconnecting:b,userName:p,userAvatar:g,role:u,children:(0,O.jsx)(I,{cacheKey:e})})}):(0,O.jsx)(`div`,{className:`tasks-page`,children:(0,O.jsxs)(`div`,{className:`tasks-empty`,children:[(0,O.jsx)(`p`,{children:`You are not signed in.`}),(0,O.jsxs)(`p`,{children:[`Open the `,(0,O.jsx)(`a`,{href:`/`,className:`tasks-link`,children:`main admin page`}),` and log in, then return here.`]})]})}):(0,O.jsx)(a,{surface:`gate`})}(0,v.createRoot)(document.getElementById(`root`)).render((0,O.jsx)(L,{}));
@@ -1,2 +0,0 @@
1
- 
2
- c��i�$��h`�{�n���p7�A��ل�a'�o�+�?u�D�~��}9>=�"d�㳸�R$���)����O�d�+�k��UE�4Pl�T�sX�M�m�wI���T�)M��C��ŷK��#��?��􎢂��U���s�[M�*QVܜ4�$�3�(���