@rubytech/create-sitedesk-code 0.1.525 → 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.
- package/dist/__tests__/samba-provision.test.js +46 -1
- package/dist/__tests__/websockify-bind-wiring.test.js +47 -0
- package/dist/index.js +39 -1
- package/dist/samba-provision.js +37 -0
- package/package.json +1 -1
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +80 -13
- package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +13 -0
- package/payload/platform/plugins/docs/references/admin-ui.md +70 -4
- package/payload/platform/plugins/docs/references/internals.md +1 -1
- package/payload/platform/plugins/docs/references/platform.md +1 -1
- package/payload/platform/plugins/linkedin-extension/extension/README.md +10 -2
- package/payload/platform/plugins/linkedin-extension/extension/background/sw.js +37 -4
- package/payload/platform/plugins/linkedin-extension/extension/content/profile.js +17 -2
- package/payload/platform/plugins/linkedin-extension/extension/content/thread.js +17 -2
- package/payload/platform/plugins/linkedin-extension/extension/manifest.json +1 -0
- package/payload/platform/plugins/linkedin-extension/extension/options/options.html +1 -0
- package/payload/platform/plugins/linkedin-extension/extension/options/options.js +78 -3
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/routine-roster-audit.test.js +63 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/routine-roster-audit.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts +35 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js +78 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +13 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
- package/payload/platform/scripts/vnc.sh +45 -1
- package/payload/server/{chunk-VUXKXOJU.js → chunk-7MGR5M6G.js} +4 -2
- package/payload/server/{chunk-WT2PFGY4.js → chunk-KY3BBT67.js} +216 -1
- package/payload/server/{manager-4TJK3YOY.js → manager-6XOWHREK.js} +1 -1
- package/payload/server/maxy-edge.js +226 -6
- package/payload/server/public/activity.html +5 -5
- package/payload/server/public/agents.html +4 -4
- package/payload/server/public/assets/{AdminLoginScreens-BgDjueVe.js → AdminLoginScreens-DSt9DYZZ.js} +1 -1
- package/payload/server/public/assets/AdminLoginScreens-DSt9DYZZ.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-DSt9DYZZ.js.gz +0 -0
- package/payload/server/public/assets/{AdminShell-YctTrR-D.js → AdminShell-MM3_yp3N.js} +1 -1
- package/payload/server/public/assets/AdminShell-MM3_yp3N.js.br +0 -0
- package/payload/server/public/assets/AdminShell-MM3_yp3N.js.gz +0 -0
- package/payload/server/public/assets/{activity-DGQt5ys_.js → activity-aVvbaVd4.js} +1 -1
- package/payload/server/public/assets/activity-aVvbaVd4.js.br +0 -0
- package/payload/server/public/assets/activity-aVvbaVd4.js.gz +0 -0
- package/payload/server/public/assets/{admin-DnUxbB3P.js → admin-B0lQnkH-.js} +1 -1
- package/payload/server/public/assets/admin-B0lQnkH-.js.br +0 -0
- package/payload/server/public/assets/admin-B0lQnkH-.js.gz +0 -0
- package/payload/server/public/assets/{agents-Bc2LZjwC.js → agents-CrpVTPRG.js} +1 -1
- package/payload/server/public/assets/agents-CrpVTPRG.js.br +0 -0
- package/payload/server/public/assets/agents-CrpVTPRG.js.gz +0 -0
- package/payload/server/public/assets/browser-CYHUzTop.js +1 -0
- package/payload/server/public/assets/browser-CYHUzTop.js.br +0 -0
- package/payload/server/public/assets/browser-CYHUzTop.js.gz +0 -0
- package/payload/server/public/assets/{calendar-D25EhXbD.js → calendar-4IWQpwYv.js} +1 -1
- package/payload/server/public/assets/calendar-4IWQpwYv.js.br +0 -0
- package/payload/server/public/assets/calendar-4IWQpwYv.js.gz +0 -0
- package/payload/server/public/assets/chat-DmjZTqnV.js +1 -0
- package/payload/server/public/assets/chat-DmjZTqnV.js.br +0 -0
- package/payload/server/public/assets/chat-DmjZTqnV.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-CIl-s3LZ.js +1 -0
- package/payload/server/public/assets/chevron-left-CIl-s3LZ.js.br +0 -0
- package/payload/server/public/assets/chevron-right-DpAi2BsF.js +1 -0
- package/payload/server/public/assets/chevron-right-DpAi2BsF.js.br +0 -0
- package/payload/server/public/assets/clock-CGuM9VRx.js +1 -0
- package/payload/server/public/assets/clock-CGuM9VRx.js.br +0 -0
- package/payload/server/public/assets/data-BpdFiZKH.js +1 -0
- package/payload/server/public/assets/data-BpdFiZKH.js.br +2 -0
- package/payload/server/public/assets/data-BpdFiZKH.js.gz +0 -0
- package/payload/server/public/assets/{file-download-CiGklOfA.js → file-download-DayBHhKS.js} +1 -1
- package/payload/server/public/assets/file-download-DayBHhKS.js.br +0 -0
- package/payload/server/public/assets/file-download-DayBHhKS.js.gz +0 -0
- package/payload/server/public/assets/{file-text-XjJPULAZ.js → file-text-BSyhVH0m.js} +1 -1
- package/payload/server/public/assets/file-text-BSyhVH0m.js.br +0 -0
- package/payload/server/public/assets/file-text-BSyhVH0m.js.gz +0 -0
- package/payload/server/public/assets/{graph-BjHJ0z_6.js → graph-Bjv3Tc3B.js} +1 -1
- package/payload/server/public/assets/graph-Bjv3Tc3B.js.br +0 -0
- package/payload/server/public/assets/graph-Bjv3Tc3B.js.gz +0 -0
- package/payload/server/public/assets/{graph-labels-D-0u37KA.js → graph-labels-DegLKGdx.js} +1 -1
- package/payload/server/public/assets/graph-labels-DegLKGdx.js.br +0 -0
- package/payload/server/public/assets/graph-labels-DegLKGdx.js.gz +0 -0
- package/payload/server/public/assets/{maximize-2-BJ9S-nfS.js → maximize-2-DJFG2EXJ.js} +1 -1
- package/payload/server/public/assets/maximize-2-DJFG2EXJ.js.br +0 -0
- package/payload/server/public/assets/maximize-2-DJFG2EXJ.js.gz +0 -0
- package/payload/server/public/assets/{operator-Cay4rOOK.js → operator-Du9Ve_PR.js} +1 -1
- package/payload/server/public/assets/operator-Du9Ve_PR.js.br +0 -0
- package/payload/server/public/assets/operator-Du9Ve_PR.js.gz +0 -0
- package/payload/server/public/assets/{page-shuh4ES9.js → page-DgHYxG3M.js} +1 -1
- package/payload/server/public/assets/page-DgHYxG3M.js.br +0 -0
- package/payload/server/public/assets/page-DgHYxG3M.js.gz +0 -0
- package/payload/server/public/assets/{page-Cci_j_y7.js → page-qV1ypb6i.js} +5 -5
- package/payload/server/public/assets/page-qV1ypb6i.js.br +0 -0
- package/payload/server/public/assets/page-qV1ypb6i.js.gz +0 -0
- package/payload/server/public/assets/{public-BbJcQGsO.js → public-CNVEM-Bx.js} +1 -1
- package/payload/server/public/assets/public-CNVEM-Bx.js.br +0 -0
- package/payload/server/public/assets/public-CNVEM-Bx.js.gz +0 -0
- package/payload/server/public/assets/{rotate-ccw-jeSVwUAv.js → rotate-ccw-DQCaky8_.js} +1 -1
- package/payload/server/public/assets/rotate-ccw-DQCaky8_.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-DQCaky8_.js.gz +0 -0
- package/payload/server/public/assets/{routines-D3M1Wh3a.js → routines-DwK5FeLm.js} +1 -1
- package/payload/server/public/assets/routines-DwK5FeLm.js.br +0 -0
- package/payload/server/public/assets/routines-DwK5FeLm.js.gz +0 -0
- package/payload/server/public/assets/{skills-Bhej2ub1.js → skills-CosN3uA4.js} +1 -1
- package/payload/server/public/assets/skills-CosN3uA4.js.br +0 -0
- package/payload/server/public/assets/skills-CosN3uA4.js.gz +0 -0
- package/payload/server/public/assets/tasks-f0QikHmw.js +3 -0
- package/payload/server/public/assets/tasks-f0QikHmw.js.br +0 -0
- package/payload/server/public/assets/tasks-f0QikHmw.js.gz +0 -0
- package/payload/server/public/assets/{time-entry-format-r5UY9rjG.js → time-entry-format-DLTdS35_.js} +1 -1
- package/payload/server/public/assets/time-entry-format-DLTdS35_.js.br +0 -0
- package/payload/server/public/assets/time-entry-format-DLTdS35_.js.gz +0 -0
- package/payload/server/public/assets/{triangle-alert--PCKaewD.js → triangle-alert-CpwrbdYq.js} +1 -1
- package/payload/server/public/assets/triangle-alert-CpwrbdYq.js.br +3 -0
- package/payload/server/public/assets/triangle-alert-CpwrbdYq.js.gz +0 -0
- package/payload/server/public/assets/{useCopyFeedback-Dg5lNgqH.js → useCopyFeedback-D01gSp36.js} +1 -1
- package/payload/server/public/assets/useCopyFeedback-D01gSp36.js.br +0 -0
- package/payload/server/public/assets/useCopyFeedback-D01gSp36.js.gz +0 -0
- package/payload/server/public/assets/useSubAccountSwitcher-CJzJ9xV3.css +1 -0
- package/payload/server/public/assets/useSubAccountSwitcher-CJzJ9xV3.css.br +0 -0
- package/payload/server/public/assets/useSubAccountSwitcher-CJzJ9xV3.css.gz +0 -0
- package/payload/server/public/assets/{useVoiceRecorder-BY6ZsGMH.js → useVoiceRecorder-DiPgyDUy.js} +1 -1
- package/payload/server/public/assets/useVoiceRecorder-DiPgyDUy.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-DiPgyDUy.js.gz +0 -0
- package/payload/server/public/assets/{wrench-Bw1FMolk.js → wrench-C5SJreEu.js} +1 -1
- package/payload/server/public/assets/wrench-C5SJreEu.js.br +1 -0
- package/payload/server/public/assets/wrench-C5SJreEu.js.gz +0 -0
- package/payload/server/public/brand-defaults.css +1 -1
- package/payload/server/public/browser.html +4 -4
- package/payload/server/public/calendar.html +7 -7
- package/payload/server/public/chat.html +13 -13
- package/payload/server/public/data.html +12 -12
- package/payload/server/public/graph.html +9 -9
- package/payload/server/public/index.html +15 -15
- package/payload/server/public/operator.html +14 -14
- package/payload/server/public/public.html +13 -13
- package/payload/server/public/routines.html +7 -7
- package/payload/server/public/skills.html +5 -5
- package/payload/server/public/tasks.html +6 -6
- package/payload/server/server.js +53 -9
- package/payload/server/public/assets/AdminLoginScreens-BgDjueVe.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-BgDjueVe.js.gz +0 -0
- package/payload/server/public/assets/AdminShell-YctTrR-D.js.br +0 -0
- package/payload/server/public/assets/AdminShell-YctTrR-D.js.gz +0 -0
- package/payload/server/public/assets/activity-DGQt5ys_.js.br +0 -0
- package/payload/server/public/assets/activity-DGQt5ys_.js.gz +0 -0
- package/payload/server/public/assets/admin-DnUxbB3P.js.br +0 -0
- package/payload/server/public/assets/admin-DnUxbB3P.js.gz +0 -0
- package/payload/server/public/assets/agents-Bc2LZjwC.js.br +0 -0
- package/payload/server/public/assets/agents-Bc2LZjwC.js.gz +0 -0
- package/payload/server/public/assets/browser-BtF7SzvG.js +0 -1
- package/payload/server/public/assets/browser-BtF7SzvG.js.br +0 -0
- package/payload/server/public/assets/browser-BtF7SzvG.js.gz +0 -0
- package/payload/server/public/assets/calendar-D25EhXbD.js.br +0 -0
- package/payload/server/public/assets/calendar-D25EhXbD.js.gz +0 -0
- package/payload/server/public/assets/chat-z4jsHFXg.js +0 -1
- package/payload/server/public/assets/chat-z4jsHFXg.js.br +0 -0
- package/payload/server/public/assets/chat-z4jsHFXg.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-BD09SN6R.js +0 -1
- package/payload/server/public/assets/chevron-right-ChmWeo7T.js +0 -1
- package/payload/server/public/assets/chevron-right-ChmWeo7T.js.br +0 -0
- package/payload/server/public/assets/clock-Yqf7Ke7I.js +0 -1
- package/payload/server/public/assets/clock-Yqf7Ke7I.js.br +0 -0
- package/payload/server/public/assets/clock-Yqf7Ke7I.js.gz +0 -0
- package/payload/server/public/assets/data-RmnKj5nC.js +0 -1
- package/payload/server/public/assets/data-RmnKj5nC.js.br +0 -2
- package/payload/server/public/assets/data-RmnKj5nC.js.gz +0 -0
- package/payload/server/public/assets/file-download-CiGklOfA.js.br +0 -0
- package/payload/server/public/assets/file-download-CiGklOfA.js.gz +0 -0
- package/payload/server/public/assets/file-text-XjJPULAZ.js.br +0 -0
- package/payload/server/public/assets/file-text-XjJPULAZ.js.gz +0 -0
- package/payload/server/public/assets/graph-BjHJ0z_6.js.br +0 -0
- package/payload/server/public/assets/graph-BjHJ0z_6.js.gz +0 -0
- package/payload/server/public/assets/graph-labels-D-0u37KA.js.br +0 -0
- package/payload/server/public/assets/graph-labels-D-0u37KA.js.gz +0 -0
- package/payload/server/public/assets/maximize-2-BJ9S-nfS.js.br +0 -0
- package/payload/server/public/assets/maximize-2-BJ9S-nfS.js.gz +0 -0
- package/payload/server/public/assets/operator-Cay4rOOK.js.br +0 -0
- package/payload/server/public/assets/operator-Cay4rOOK.js.gz +0 -0
- package/payload/server/public/assets/page-Cci_j_y7.js.br +0 -0
- package/payload/server/public/assets/page-Cci_j_y7.js.gz +0 -0
- package/payload/server/public/assets/page-shuh4ES9.js.br +0 -0
- package/payload/server/public/assets/page-shuh4ES9.js.gz +0 -0
- package/payload/server/public/assets/public-BbJcQGsO.js.br +0 -0
- package/payload/server/public/assets/public-BbJcQGsO.js.gz +0 -0
- package/payload/server/public/assets/rotate-ccw-jeSVwUAv.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-jeSVwUAv.js.gz +0 -0
- package/payload/server/public/assets/routines-D3M1Wh3a.js.br +0 -0
- package/payload/server/public/assets/routines-D3M1Wh3a.js.gz +0 -0
- package/payload/server/public/assets/skills-Bhej2ub1.js.br +0 -0
- package/payload/server/public/assets/skills-Bhej2ub1.js.gz +0 -0
- package/payload/server/public/assets/tasks-qY-dtOI2.js +0 -1
- package/payload/server/public/assets/tasks-qY-dtOI2.js.br +0 -0
- package/payload/server/public/assets/tasks-qY-dtOI2.js.gz +0 -0
- package/payload/server/public/assets/time-entry-format-r5UY9rjG.js.br +0 -0
- package/payload/server/public/assets/time-entry-format-r5UY9rjG.js.gz +0 -0
- package/payload/server/public/assets/triangle-alert--PCKaewD.js.br +0 -2
- package/payload/server/public/assets/triangle-alert--PCKaewD.js.gz +0 -0
- package/payload/server/public/assets/useCopyFeedback-Dg5lNgqH.js.br +0 -0
- package/payload/server/public/assets/useCopyFeedback-Dg5lNgqH.js.gz +0 -0
- package/payload/server/public/assets/useSubAccountSwitcher-BYfe9vj8.css +0 -1
- package/payload/server/public/assets/useSubAccountSwitcher-BYfe9vj8.css.br +0 -0
- package/payload/server/public/assets/useSubAccountSwitcher-BYfe9vj8.css.gz +0 -0
- package/payload/server/public/assets/useVoiceRecorder-BY6ZsGMH.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-BY6ZsGMH.js.gz +0 -0
- package/payload/server/public/assets/wrench-Bw1FMolk.js.br +0 -0
- package/payload/server/public/assets/wrench-Bw1FMolk.js.gz +0 -0
- /package/payload/server/public/assets/{useSubAccountSwitcher-CnpeWIYq.js → useSubAccountSwitcher-BRHYXwGO.js} +0 -0
- /package/payload/server/public/assets/{useSubAccountSwitcher-CnpeWIYq.js.br → useSubAccountSwitcher-BRHYXwGO.js.br} +0 -0
- /package/payload/server/public/assets/{useSubAccountSwitcher-CnpeWIYq.js.gz → useSubAccountSwitcher-BRHYXwGO.js.gz} +0 -0
package/payload/server/server.js
CHANGED
|
@@ -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-
|
|
62
|
+
} from "./chunk-KY3BBT67.js";
|
|
60
63
|
import {
|
|
61
64
|
DATA_ROOT,
|
|
62
65
|
EXTRACTED_TEXT_SUFFIX,
|
|
@@ -180,7 +183,7 @@ import {
|
|
|
180
183
|
waitForConnection,
|
|
181
184
|
warnNonUuidAccount,
|
|
182
185
|
writeChatMetadataMerged
|
|
183
|
-
} from "./chunk-
|
|
186
|
+
} from "./chunk-7MGR5M6G.js";
|
|
184
187
|
import {
|
|
185
188
|
ACCOUNTS_DIR,
|
|
186
189
|
BIN_DIR,
|
|
@@ -5008,7 +5011,7 @@ async function defaultHttpGet(url) {
|
|
|
5008
5011
|
}
|
|
5009
5012
|
}
|
|
5010
5013
|
async function defaultResolve(accountId) {
|
|
5011
|
-
const { resolveSocket: resolveSocket2 } = await import("./manager-
|
|
5014
|
+
const { resolveSocket: resolveSocket2 } = await import("./manager-6XOWHREK.js");
|
|
5012
5015
|
return resolveSocket2(accountId);
|
|
5013
5016
|
}
|
|
5014
5017
|
async function fetchAvatar(accountId, jid, deps = {}) {
|
|
@@ -6620,15 +6623,21 @@ app3.post("/disconnect", async (c) => {
|
|
|
6620
6623
|
}
|
|
6621
6624
|
});
|
|
6622
6625
|
app3.post("/reconnect", async (c) => {
|
|
6626
|
+
let accountId = "(unresolved)";
|
|
6623
6627
|
try {
|
|
6624
6628
|
const body = await c.req.json().catch(() => ({}));
|
|
6625
|
-
|
|
6629
|
+
accountId = validateAccountId(body.accountId);
|
|
6626
6630
|
const denial = selfOrHouseScopeDenial(c, accountId, "reconnect");
|
|
6627
6631
|
if (denial) return denial;
|
|
6628
6632
|
await startConnection(accountId);
|
|
6633
|
+
console.error(
|
|
6634
|
+
`[whatsapp:route] op=reconnect account=${accountId} started=true outcome=accepted reason=none`
|
|
6635
|
+
);
|
|
6629
6636
|
return c.json({ reconnecting: true, accountId });
|
|
6630
6637
|
} catch (err) {
|
|
6631
|
-
console.error(
|
|
6638
|
+
console.error(
|
|
6639
|
+
`[whatsapp:route] op=reconnect account=${accountId} started=false outcome=refused reason=${String(err)}`
|
|
6640
|
+
);
|
|
6632
6641
|
return c.json({ error: String(err) }, 500);
|
|
6633
6642
|
}
|
|
6634
6643
|
});
|
|
@@ -20714,6 +20723,7 @@ function resolveSpawnPlan(host, operatorDomains, body, mintId = randomUUID7, adm
|
|
|
20714
20723
|
const resumeId = typeof body.sessionId === "string" && body.sessionId.length > 0 ? body.sessionId : void 0;
|
|
20715
20724
|
const name = typeof body.name === "string" && body.name.length > 0 ? body.name : void 0;
|
|
20716
20725
|
const rawTitle = typeof body.title === "string" ? body.title.trim() : "";
|
|
20726
|
+
const rawInitialMessage = typeof body.initialMessage === "string" ? body.initialMessage.trim() : "";
|
|
20717
20727
|
const webchatBind = resumeId === void 0 || operator;
|
|
20718
20728
|
const kind = resumeId === void 0 ? "new" : "resume";
|
|
20719
20729
|
const origin = operator ? "operator" : "admin";
|
|
@@ -20736,6 +20746,7 @@ function resolveSpawnPlan(host, operatorDomains, body, mintId = randomUUID7, adm
|
|
|
20736
20746
|
if (name) payload.name = name;
|
|
20737
20747
|
if (pickedModel) payload.model = pickedModel;
|
|
20738
20748
|
if (pickedEffort) payload.effort = pickedEffort;
|
|
20749
|
+
if (kind === "new" && rawInitialMessage.length > 0) payload.initialMessage = rawInitialMessage;
|
|
20739
20750
|
if (adminUserId) payload.adminUserId = adminUserId;
|
|
20740
20751
|
if (targetAccountId) payload.targetAccountId = targetAccountId;
|
|
20741
20752
|
if (authenticatedName) payload.authenticatedName = authenticatedName;
|
|
@@ -20783,7 +20794,10 @@ app38.post("/", requireAdminSession, async (c) => {
|
|
|
20783
20794
|
`[chat-spawn] op=request spawnReqId=${spawnReqId} origin=${plan.origin} kind=${plan.kind} sessionId=${plan.kind === "new" ? "new" : plan.sessionId}`
|
|
20784
20795
|
);
|
|
20785
20796
|
if (plan.webchatBind) {
|
|
20786
|
-
|
|
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
|
+
);
|
|
20787
20801
|
console.log(
|
|
20788
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"}`
|
|
20789
20803
|
);
|
|
@@ -21977,6 +21991,33 @@ app48.post("/launch", requireAdminSession, async (c) => {
|
|
|
21977
21991
|
);
|
|
21978
21992
|
}
|
|
21979
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
|
+
});
|
|
21980
22021
|
var browser_default = app48;
|
|
21981
22022
|
|
|
21982
22023
|
// server/routes/admin/calendar.ts
|
|
@@ -24044,7 +24085,8 @@ app59.post("/", requireAdminSession, async (c) => {
|
|
|
24044
24085
|
`MATCH (t:Task {taskId: $taskId, accountId: $accountId})
|
|
24045
24086
|
OPTIONAL MATCH (t)-[:WORKED_ON_IN]->(conv:Conversation)
|
|
24046
24087
|
WITH t, head(collect(conv)) AS linked
|
|
24047
|
-
RETURN t.name AS name,
|
|
24088
|
+
RETURN t.name AS name, t.description AS description, t.notes AS notes,
|
|
24089
|
+
linked.sessionId AS sessionId LIMIT 1`,
|
|
24048
24090
|
{ taskId, accountId }
|
|
24049
24091
|
);
|
|
24050
24092
|
if (found.records.length === 0) {
|
|
@@ -24053,8 +24095,10 @@ app59.post("/", requireAdminSession, async (c) => {
|
|
|
24053
24095
|
}
|
|
24054
24096
|
const title = found.records[0].get("name") ?? "";
|
|
24055
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") ?? "";
|
|
24056
24100
|
console.log(`${TAG34} op=request taskId=${taskId} account=${accountId} linked=${sessionId ?? "none"}`);
|
|
24057
|
-
if (sessionId !== null) return c.json({ sessionId, title,
|
|
24101
|
+
if (sessionId !== null) return c.json({ sessionId, title, description, notes });
|
|
24058
24102
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
24059
24103
|
const stamped = await session.run(
|
|
24060
24104
|
`MATCH (t:Task {taskId: $taskId, accountId: $accountId})
|
|
@@ -24064,7 +24108,7 @@ app59.post("/", requireAdminSession, async (c) => {
|
|
|
24064
24108
|
);
|
|
24065
24109
|
const at = stamped.records[0]?.get("at") ?? void 0;
|
|
24066
24110
|
console.log(`${TAG34} op=marker taskId=${taskId} stamped=${at !== void 0}`);
|
|
24067
|
-
return c.json({ sessionId: null, title,
|
|
24111
|
+
return c.json({ sessionId: null, title, description, notes });
|
|
24068
24112
|
} catch (err) {
|
|
24069
24113
|
console.error(`${TAG34} op=request taskId=${taskId} error="${err instanceof Error ? err.message : String(err)}"`);
|
|
24070
24114
|
return c.json({ error: "task-session-open-failed" }, 500);
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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)(_,{}));
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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,{}));
|
|
Binary file
|
|
Binary file
|
|
@@ -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};
|
|
Binary file
|
|
@@ -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};
|
|
Binary file
|
|
Binary file
|
|
@@ -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,{}));
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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,{}));
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|