@rubytech/create-realagent-code 0.1.29 → 0.1.31
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__/init-logging.test.js +85 -0
- package/dist/index.js +21 -10
- package/dist/init-logging.js +28 -0
- package/package.json +1 -1
- package/payload/platform/lib/persistent-components/dist/index.d.ts +11 -12
- package/payload/platform/lib/persistent-components/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/persistent-components/dist/index.js +11 -12
- package/payload/platform/lib/persistent-components/dist/index.js.map +1 -1
- package/payload/platform/lib/persistent-components/src/index.ts +11 -12
- package/payload/platform/neo4j/schema.cypher +6 -3
- package/payload/platform/plugins/admin/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/admin/PLUGIN.md +1 -3
- package/payload/platform/plugins/admin/hooks/onboarding-skill-drift.sh +57 -54
- package/payload/platform/plugins/admin/mcp/dist/index.js +15 -50
- package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/admin/skills/access-manager/references/operations.md +7 -7
- package/payload/platform/plugins/admin/skills/file-presentation/SKILL.md +16 -33
- package/payload/platform/plugins/admin/skills/plugin-management/SKILL.md +1 -1
- package/payload/platform/plugins/admin/skills/public-agent-manager/SKILL.md +2 -2
- package/payload/platform/plugins/admin/skills/stream-log-review/references/analysis-patterns.md +2 -2
- package/payload/platform/plugins/anthropic/skills/get-api-key/SKILL.md +2 -4
- package/payload/platform/plugins/brochures/PLUGIN.md +1 -1
- package/payload/platform/plugins/buyers/PLUGIN.md +1 -2
- package/payload/platform/plugins/deep-research/skills/book-mirror/SKILL.md +1 -1
- package/payload/platform/plugins/deep-research/skills/strategic-reading/SKILL.md +1 -1
- package/payload/platform/plugins/docs/references/plugins-guide.md +2 -2
- package/payload/platform/plugins/email/references/email-reference.md +3 -7
- package/payload/platform/plugins/estate-business/PLUGIN.md +1 -2
- package/payload/platform/plugins/estate-coaching/PLUGIN.md +1 -2
- package/payload/platform/plugins/estate-onboarding/PLUGIN.md +1 -2
- package/payload/platform/plugins/estate-sales/PLUGIN.md +1 -2
- package/payload/platform/plugins/estate-teaching/PLUGIN.md +1 -2
- package/payload/platform/plugins/leads/PLUGIN.md +1 -2
- package/payload/platform/plugins/listings/PLUGIN.md +1 -2
- package/payload/platform/plugins/loop/PLUGIN.md +1 -1
- package/payload/platform/plugins/scheduling/PLUGIN.md +1 -1
- package/payload/platform/plugins/teaching/PLUGIN.md +2 -1
- package/payload/platform/plugins/vendors/PLUGIN.md +1 -2
- package/payload/platform/plugins/whatsapp/mcp/dist/index.js +1 -1
- package/payload/platform/plugins/whatsapp/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/whatsapp/skills/connect-whatsapp/SKILL.md +1 -1
- package/payload/platform/plugins/whatsapp/skills/manage-whatsapp-config/SKILL.md +2 -8
- package/payload/platform/plugins/writer-craft/PLUGIN.md +2 -1
- package/payload/platform/scripts/component-knowledgedoc-backfill.ts +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.js +45 -31
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/index.js +11 -0
- package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/jsonl-observer.d.ts +30 -0
- package/payload/platform/services/claude-session-manager/dist/jsonl-observer.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/jsonl-observer.js +175 -0
- package/payload/platform/services/claude-session-manager/dist/jsonl-observer.js.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts +4 -2
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.js +15 -22
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +13 -0
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +26 -4
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/session-store.d.ts +9 -0
- package/payload/platform/services/claude-session-manager/dist/session-store.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/session-store.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts +10 -7
- package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/system-prompt.js +51 -28
- package/payload/platform/services/claude-session-manager/dist/system-prompt.js.map +1 -1
- package/payload/platform/services/claude-session-manager/scripts/onboarding-advance.sh +61 -0
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-0.md +5 -0
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-1.md +3 -0
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-2.md +3 -0
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-3.md +8 -0
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-4.md +9 -0
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-5.md +3 -0
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-6.md +5 -0
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-7.md +5 -0
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-8.md +5 -0
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-9.md +8 -0
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-complete.md +3 -0
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-unreachable.md +3 -0
- package/payload/platform/templates/agents/public/IDENTITY.md +1 -1
- package/payload/platform/templates/specialists/agents/content-producer.md +3 -3
- package/payload/platform/templates/specialists/agents/personal-assistant.md +2 -2
- package/payload/premium-plugins/real-agent/BUNDLE.md +5 -5
- package/payload/premium-plugins/real-agent/agents/compliance.md +1 -1
- package/payload/premium-plugins/real-agent/agents/negotiator.md +1 -1
- package/payload/premium-plugins/real-agent/agents/valuer.md +1 -1
- package/payload/premium-plugins/real-agent/plugins/brochures/PLUGIN.md +1 -1
- package/payload/premium-plugins/real-agent/plugins/buyers/PLUGIN.md +1 -2
- package/payload/premium-plugins/real-agent/plugins/estate-business/PLUGIN.md +1 -2
- package/payload/premium-plugins/real-agent/plugins/estate-coaching/PLUGIN.md +1 -2
- package/payload/premium-plugins/real-agent/plugins/estate-onboarding/PLUGIN.md +1 -2
- package/payload/premium-plugins/real-agent/plugins/estate-sales/PLUGIN.md +1 -2
- package/payload/premium-plugins/real-agent/plugins/estate-teaching/PLUGIN.md +1 -2
- package/payload/premium-plugins/real-agent/plugins/leads/PLUGIN.md +1 -2
- package/payload/premium-plugins/real-agent/plugins/listings/PLUGIN.md +1 -2
- package/payload/premium-plugins/real-agent/plugins/loop/PLUGIN.md +1 -1
- package/payload/premium-plugins/real-agent/plugins/vendors/PLUGIN.md +1 -2
- package/payload/premium-plugins/teaching/PLUGIN.md +2 -1
- package/payload/premium-plugins/writer-craft/PLUGIN.md +2 -1
- package/payload/server/public/assets/{admin-CDvF5de6.js → admin-Bk2eXMFD.js} +24 -24
- package/payload/server/public/assets/{data-K_kS__sL.js → data-ll_OwVNL.js} +1 -1
- package/payload/server/public/assets/{graph-DeEigyO_.js → graph-DJ2VWioQ.js} +1 -1
- package/payload/server/public/assets/graph-labels-qhU8xZDH.js +1 -0
- package/payload/server/public/assets/{page-qSH972X0.js → page-Dk73ZO1F.js} +1 -1
- package/payload/server/public/assets/{page-B_rpjIRr.js → page-DsYsdBUK.js} +1 -1
- package/payload/server/public/data.html +3 -3
- package/payload/server/public/graph.html +3 -3
- package/payload/server/public/index.html +4 -4
- package/payload/server/server.js +121 -46
- package/payload/platform/plugins/admin/references/contextual-ui.md +0 -107
- package/payload/platform/scripts/__tests__/admin-persist-audit.test.ts +0 -182
- package/payload/server/public/assets/graph-labels-C7I5QvNv.js +0 -1
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Task 943 — admin-persist-audit.
|
|
3
|
-
*
|
|
4
|
-
* Pins Task 940 success criterion #7: the audit harness counts JSONL
|
|
5
|
-
* assistant turns + render-component blocks against Neo4j `:Message` +
|
|
6
|
-
* `:Component` rows for a `conversationId`, prints one
|
|
7
|
-
*
|
|
8
|
-
* [admin-persist-audit] convId=<conv> sdkTurnUuid=<uuid> expected=<message|component> missing reason=neo4j-row-absent
|
|
9
|
-
*
|
|
10
|
-
* line per divergence, and exits non-zero on mismatch.
|
|
11
|
-
*
|
|
12
|
-
* The test mocks the Neo4j surface (`getRecentMessages`, `getSession`) so
|
|
13
|
-
* `runAudit` is a pure function of (JSONL fixture, Neo4j seed). The
|
|
14
|
-
* harness reads the fixture with the real `replayJsonl`, so the matching
|
|
15
|
-
* key (role + content) is verified end-to-end without a graph connection.
|
|
16
|
-
*/
|
|
17
|
-
import { resolve } from "node:path";
|
|
18
|
-
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
19
|
-
|
|
20
|
-
const FIXTURE_PATH = resolve(__dirname, "../../ui/app/lib/__tests__/fixtures/task-940-session.jsonl");
|
|
21
|
-
|
|
22
|
-
// Mock the Neo4j surface. The audit harness imports `getRecentMessages`
|
|
23
|
-
// and `getSession` from `platform/ui/app/lib/neo4j-store`. We replace
|
|
24
|
-
// both with vi-managed fakes; each test reseeds them as needed.
|
|
25
|
-
const getRecentMessagesMock = vi.fn<[string, number?], Promise<Array<{
|
|
26
|
-
role: "user" | "assistant";
|
|
27
|
-
content: string;
|
|
28
|
-
messageId: string;
|
|
29
|
-
components?: Array<{ componentId: string; submitted: boolean }>;
|
|
30
|
-
}>>>();
|
|
31
|
-
|
|
32
|
-
const sessionRunMock = vi.fn<[string, Record<string, unknown>], Promise<{
|
|
33
|
-
records: Array<{ get(key: string): unknown }>;
|
|
34
|
-
}>>();
|
|
35
|
-
const sessionCloseMock = vi.fn<[], Promise<void>>();
|
|
36
|
-
|
|
37
|
-
vi.mock("../../ui/app/lib/neo4j-store", () => ({
|
|
38
|
-
getRecentMessages: (...args: Parameters<typeof getRecentMessagesMock>) => getRecentMessagesMock(...args),
|
|
39
|
-
getSession: () => ({
|
|
40
|
-
run: (cypher: string, params: Record<string, unknown>) => sessionRunMock(cypher, params),
|
|
41
|
-
close: () => sessionCloseMock(),
|
|
42
|
-
}),
|
|
43
|
-
}));
|
|
44
|
-
|
|
45
|
-
vi.mock("../../ui/app/lib/claude-agent/account", () => ({
|
|
46
|
-
ACCOUNTS_DIR: "/tmp/maxy-accounts-fixture",
|
|
47
|
-
}));
|
|
48
|
-
|
|
49
|
-
// PERSISTENT_COMPONENTS is also imported by the audit harness for the
|
|
50
|
-
// :KnowledgeDocument projection check. We mock the set so the test does
|
|
51
|
-
// not depend on the runtime persistent-component list — the fixture
|
|
52
|
-
// components (`document-editor`, `quick-chart`) are both included.
|
|
53
|
-
vi.mock("../../lib/persistent-components/src/index", () => ({
|
|
54
|
-
PERSISTENT_COMPONENTS: new Set<string>(["document-editor", "quick-chart"]),
|
|
55
|
-
isPersistentComponent: (name: string) => name === "document-editor" || name === "quick-chart",
|
|
56
|
-
}));
|
|
57
|
-
|
|
58
|
-
import { runAudit, type AuditArgs } from "../admin-persist-audit";
|
|
59
|
-
|
|
60
|
-
const CONV_ID = "11111111-aaaa-bbbb-cccc-dddddddddddd";
|
|
61
|
-
const ACCOUNT_ID = "b3b638d9-9999-8888-7777-666666666666";
|
|
62
|
-
|
|
63
|
-
const buildArgs = (): AuditArgs => ({
|
|
64
|
-
conversationId: CONV_ID,
|
|
65
|
-
accountId: ACCOUNT_ID,
|
|
66
|
-
jsonlPath: FIXTURE_PATH,
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
const captureConsole = () => {
|
|
70
|
-
const out: string[] = [];
|
|
71
|
-
const err: string[] = [];
|
|
72
|
-
const logSpy = vi.spyOn(console, "log").mockImplementation((...a) => { out.push(a.join(" ")); });
|
|
73
|
-
const errSpy = vi.spyOn(console, "error").mockImplementation((...a) => { err.push(a.join(" ")); });
|
|
74
|
-
return { out, err, restore: () => { logSpy.mockRestore(); errSpy.mockRestore(); } };
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
describe("Task 940 SC7 — admin-persist-audit divergence reporting", () => {
|
|
78
|
-
beforeEach(() => {
|
|
79
|
-
getRecentMessagesMock.mockReset();
|
|
80
|
-
sessionRunMock.mockReset();
|
|
81
|
-
sessionCloseMock.mockReset();
|
|
82
|
-
sessionCloseMock.mockResolvedValue(undefined);
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
it("Neo4j seed missing the assistant turn (and its components) → exit=1, one missing-message line + one missing-component line per component", async () => {
|
|
86
|
-
// Fixture has 1 user + 1 assistant (with 2 components). Seed Neo4j
|
|
87
|
-
// with the user only — the assistant turn is the silent persist
|
|
88
|
-
// failure the audit must surface.
|
|
89
|
-
getRecentMessagesMock.mockResolvedValue([
|
|
90
|
-
{ role: "user", content: "Please render the doc and a chart.", messageId: "neo4j-user", components: [] },
|
|
91
|
-
]);
|
|
92
|
-
// No persistent-component rows in Neo4j (since the assistant turn
|
|
93
|
-
// never persisted). The :KnowledgeDocument check finds nothing → no
|
|
94
|
-
// additional kd-absent divergences.
|
|
95
|
-
sessionRunMock.mockResolvedValue({ records: [] });
|
|
96
|
-
|
|
97
|
-
const cap = captureConsole();
|
|
98
|
-
try {
|
|
99
|
-
const code = await runAudit(buildArgs());
|
|
100
|
-
expect(code).toBe(1);
|
|
101
|
-
|
|
102
|
-
// One divergence line for the assistant message itself…
|
|
103
|
-
const messageMisses = cap.out.filter((l) => /expected=message missing reason=neo4j-row-absent/.test(l));
|
|
104
|
-
expect(messageMisses).toHaveLength(1);
|
|
105
|
-
expect(messageMisses[0]).toMatch(/sdkTurnUuid=22222222/); // matches fixture uuid prefix
|
|
106
|
-
|
|
107
|
-
// …plus one divergence line per component sibling that was queued
|
|
108
|
-
// by the assistant turn's render-component blocks.
|
|
109
|
-
const componentMisses = cap.out.filter((l) => /expected=component .* missing reason=neo4j-row-absent/.test(l));
|
|
110
|
-
expect(componentMisses).toHaveLength(2);
|
|
111
|
-
expect(componentMisses[0]).toMatch(/component_name=document-editor ordinal=0/);
|
|
112
|
-
expect(componentMisses[1]).toMatch(/component_name=quick-chart ordinal=1/);
|
|
113
|
-
|
|
114
|
-
// Status summary line ends with status=mismatch.
|
|
115
|
-
expect(cap.out.some((l) => /status=mismatch/.test(l))).toBe(true);
|
|
116
|
-
} finally {
|
|
117
|
-
cap.restore();
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
it("Neo4j seed in lockstep with JSONL → exit=0, status=ok, zero divergence lines", async () => {
|
|
122
|
-
getRecentMessagesMock.mockResolvedValue([
|
|
123
|
-
{ role: "user", content: "Please render the doc and a chart.", messageId: "neo4j-user", components: [] },
|
|
124
|
-
{
|
|
125
|
-
role: "assistant",
|
|
126
|
-
content: "Here is the doc.\n\nAnd a chart follows.",
|
|
127
|
-
messageId: "neo4j-asst",
|
|
128
|
-
components: [
|
|
129
|
-
{ componentId: "comp-doc", submitted: false },
|
|
130
|
-
{ componentId: "comp-chart", submitted: false },
|
|
131
|
-
],
|
|
132
|
-
},
|
|
133
|
-
]);
|
|
134
|
-
// Persistent-component KD projection: both rows have a sibling
|
|
135
|
-
// :KnowledgeDocument row → no kd-absent divergences.
|
|
136
|
-
sessionRunMock.mockResolvedValue({
|
|
137
|
-
records: [
|
|
138
|
-
{ get: (k: string) => ({ componentId: "comp-doc", componentName: "document-editor", accountId: ACCOUNT_ID, attachmentId: "att-doc", hasProjection: true })[k] },
|
|
139
|
-
{ get: (k: string) => ({ componentId: "comp-chart", componentName: "quick-chart", accountId: ACCOUNT_ID, attachmentId: "att-chart", hasProjection: true })[k] },
|
|
140
|
-
],
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
const cap = captureConsole();
|
|
144
|
-
try {
|
|
145
|
-
const code = await runAudit(buildArgs());
|
|
146
|
-
expect(code).toBe(0);
|
|
147
|
-
expect(cap.out.some((l) => /divergences=0 status=ok/.test(l))).toBe(true);
|
|
148
|
-
expect(cap.out.some((l) => /missing reason=neo4j-row-absent/.test(l))).toBe(false);
|
|
149
|
-
} finally {
|
|
150
|
-
cap.restore();
|
|
151
|
-
}
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
it("Neo4j throw on getRecentMessages → exit=2 (invocation error), no divergence lines", async () => {
|
|
155
|
-
getRecentMessagesMock.mockRejectedValue(new Error("bolt://neo4j unreachable"));
|
|
156
|
-
sessionRunMock.mockResolvedValue({ records: [] });
|
|
157
|
-
|
|
158
|
-
const cap = captureConsole();
|
|
159
|
-
try {
|
|
160
|
-
const code = await runAudit(buildArgs());
|
|
161
|
-
expect(code).toBe(2);
|
|
162
|
-
expect(cap.err.some((l) => /neo4j-read-failed/.test(l) && /bolt:\/\/neo4j unreachable/.test(l))).toBe(true);
|
|
163
|
-
} finally {
|
|
164
|
-
cap.restore();
|
|
165
|
-
}
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
it("JSONL absent → exit=2 (invocation error)", async () => {
|
|
169
|
-
const cap = captureConsole();
|
|
170
|
-
try {
|
|
171
|
-
const code = await runAudit({
|
|
172
|
-
conversationId: CONV_ID,
|
|
173
|
-
accountId: ACCOUNT_ID,
|
|
174
|
-
jsonlPath: resolve(__dirname, "fixtures/does-not-exist.jsonl"),
|
|
175
|
-
});
|
|
176
|
-
expect(code).toBe(2);
|
|
177
|
-
expect(cap.err.some((l) => /jsonl absent path=/.test(l))).toBe(true);
|
|
178
|
-
} finally {
|
|
179
|
-
cap.restore();
|
|
180
|
-
}
|
|
181
|
-
});
|
|
182
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{o as e}from"./chunk-DD-I1_y5.js";import{a as t,c as n,d as r,f as i,h as a,l as o,o as s,r as c,s as l,t as u,u as d}from"./brand-Bm671owU.js";var f=i(`bot`,[[`path`,{d:`M12 8V4H8`,key:`hb8ula`}],[`rect`,{width:`16`,height:`12`,x:`4`,y:`8`,rx:`2`,key:`enze0r`}],[`path`,{d:`M2 14h2`,key:`vft8re`}],[`path`,{d:`M20 14h2`,key:`4cs60a`}],[`path`,{d:`M15 13v2`,key:`1xurst`}],[`path`,{d:`M9 13v2`,key:`rq6x2g`}]]),p=i(`box`,[[`path`,{d:`M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z`,key:`hh9hay`}],[`path`,{d:`m3.3 7 8.7 5 8.7-5`,key:`g66t2b`}],[`path`,{d:`M12 22V12`,key:`d0xqtd`}]]),m=i(`circle-question-mark`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3`,key:`1u773s`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]),h=i(`circle-stop`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`rect`,{x:`9`,y:`9`,width:`6`,height:`6`,rx:`1`,key:`1ssd4o`}]]),g=i(`database`,[[`ellipse`,{cx:`12`,cy:`5`,rx:`9`,ry:`3`,key:`msslwz`}],[`path`,{d:`M3 5V19A9 3 0 0 0 21 19V5`,key:`1wlel7`}],[`path`,{d:`M3 12A9 3 0 0 0 21 12`,key:`mv7ke4`}]]),_=i(`ellipsis-vertical`,[[`circle`,{cx:`12`,cy:`12`,r:`1`,key:`41hilf`}],[`circle`,{cx:`12`,cy:`5`,r:`1`,key:`gxeob9`}],[`circle`,{cx:`12`,cy:`19`,r:`1`,key:`lyex9k`}]]),v=i(`external-link`,[[`path`,{d:`M15 3h6v6`,key:`1q9fwt`}],[`path`,{d:`M10 14 21 3`,key:`gplh6r`}],[`path`,{d:`M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6`,key:`a6xqqp`}]]),y=i(`info`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 16v-4`,key:`1dtifu`}],[`path`,{d:`M12 8h.01`,key:`e9boi3`}]]),b=i(`list-todo`,[[`path`,{d:`M13 5h8`,key:`a7qcls`}],[`path`,{d:`M13 12h8`,key:`h98zly`}],[`path`,{d:`M13 19h8`,key:`c3s6r1`}],[`path`,{d:`m3 17 2 2 4-4`,key:`1jhpwq`}],[`rect`,{x:`3`,y:`4`,width:`6`,height:`6`,rx:`1`,key:`cif1o7`}]]),x=i(`loader-circle`,[[`path`,{d:`M21 12a9 9 0 1 1-6.219-8.56`,key:`13zald`}]]),ee=i(`log-out`,[[`path`,{d:`m16 17 5-5-5-5`,key:`1bji2h`}],[`path`,{d:`M21 12H9`,key:`dn1m92`}],[`path`,{d:`M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4`,key:`1uf3rs`}]]),S=i(`menu`,[[`path`,{d:`M4 5h16`,key:`1tepv9`}],[`path`,{d:`M4 12h16`,key:`1lakjw`}],[`path`,{d:`M4 19h16`,key:`1djgab`}]]),C=i(`panel-left-close`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M9 3v18`,key:`fh3hqa`}],[`path`,{d:`m16 15-3-3 3-3`,key:`14y99z`}]]),w=i(`panel-left-open`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M9 3v18`,key:`fh3hqa`}],[`path`,{d:`m14 9 3 3-3 3`,key:`8010ee`}]]),T=i(`panel-right-open`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M15 3v18`,key:`14nvp0`}],[`path`,{d:`m10 15-3-3 3-3`,key:`1pgupc`}]]),te=i(`panel-right`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M15 3v18`,key:`14nvp0`}]]),E=i(`plus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`M12 5v14`,key:`s699le`}]]),D=i(`refresh-cw`,[[`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`,key:`v9h5vc`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}],[`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`,key:`3uifl3`}],[`path`,{d:`M8 16H3v5`,key:`1cv678`}]]),O=i(`search`,[[`path`,{d:`m21 21-4.34-4.34`,key:`14j7rj`}],[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}]]),k=i(`share-2`,[[`circle`,{cx:`18`,cy:`5`,r:`3`,key:`gq8acd`}],[`circle`,{cx:`6`,cy:`12`,r:`3`,key:`w7nqdw`}],[`circle`,{cx:`18`,cy:`19`,r:`3`,key:`1xt0gg`}],[`line`,{x1:`8.59`,x2:`15.42`,y1:`13.51`,y2:`17.49`,key:`47mynk`}],[`line`,{x1:`15.41`,x2:`8.59`,y1:`6.51`,y2:`10.49`,key:`1n3mei`}]]),A=i(`terminal`,[[`path`,{d:`M12 19h8`,key:`baeox8`}],[`path`,{d:`m4 17 6-6-6-6`,key:`1yngyt`}]]),j=i(`users`,[[`path`,{d:`M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2`,key:`1yyitq`}],[`path`,{d:`M16 3.128a4 4 0 0 1 0 7.744`,key:`16gr8j`}],[`path`,{d:`M22 21v-2a4 4 0 0 0-3-3.87`,key:`kshegd`}],[`circle`,{cx:`9`,cy:`7`,r:`4`,key:`nufk8`}]]),ne=i(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]),M=e(a(),1);function N(e,t,n,r){let i=e===`pane`?`pane-action`:`sidebar-${t}`;console.info(`[admin-ui] ${i} sessionId=${n.slice(0,8)} action=${t} outcome=${r}`)}var P=/session_([A-Za-z0-9_-]+)/;function F(e){if(!e)return null;let t=e.match(P);return t?t[1]:null}async function I(e,t,n,r,i){let a=F(r)??`unknown`,o=e=>e.slice(0,8),s=t===`pane`?`pane-action action=resume-archive`:`sidebar-resume-archive`,c;try{let t=await fetch(`/api/admin/claude-sessions/${encodeURIComponent(n)}/archive?session_key=${encodeURIComponent(e)}`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({mode:`archive`})});c=t.ok?`ok`:t.status===409?`409`:`error`;let r=`[admin-ui] ${s} sourceSessionId=${o(n)} newSessionId=${o(a)} result=${c}`;c===`error`?console.error(r):console.info(r)}catch(e){let t=e instanceof Error?e.message:String(e);console.error(`[admin-ui] ${s} sourceSessionId=${o(n)} newSessionId=${o(a)} result=error detail=${t}`)}finally{i.refetch()}}function re(e,t,n=`pane`){let[r,i]=(0,M.useState)(null),a=(0,M.useCallback)(async r=>{if(!e)return{ok:!1,error:`no-cache-key`};i(`resume`);try{let i=await fetch(`/api/admin/claude-sessions/resume?session_key=${encodeURIComponent(e)}`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({claudeSessionId:r,channel:`browser`})}),a=await i.json();if(!i.ok||!(`sessionId`in a)){let e=a.error??`POST returned ${i.status}`;return N(n,`resume`,r,String(i.status)),{ok:!1,error:e}}return t.setSessions(e=>[a,...e.filter(e=>e.sessionId!==r)]),N(n,`resume`,r,`200`),I(e,n,r,a.url,t),{ok:!0}}catch(e){let i=e instanceof Error?e.message:String(e);return N(n,`resume`,r,`threw`),t.refetch(),{ok:!1,error:i}}finally{i(null)}},[e,t,n]),o=(0,M.useCallback)(async r=>{if(!e)return{ok:!1,error:`no-cache-key`};i(`end`),t.setSessions(e=>e.filter(e=>e.sessionId!==r));try{let i=await fetch(`/api/admin/claude-sessions/${encodeURIComponent(r)}?session_key=${encodeURIComponent(e)}`,{method:`DELETE`});if(!i.ok){let e=await i.text().catch(()=>``);return N(n,`end`,r,String(i.status)),t.refetch(),{ok:!1,error:`DELETE ${i.status} ${e.slice(0,200)}`}}return N(n,`end`,r,`200`),{ok:!0}}catch(e){let i=e instanceof Error?e.message:String(e);return N(n,`end`,r,`threw`),t.refetch(),{ok:!1,error:i}}finally{i(null)}},[e,t,n]),s=(0,M.useCallback)(async r=>{if(!e)return{ok:!1,error:`no-cache-key`};i(`purge`);try{let i=await fetch(`/api/admin/claude-sessions/${encodeURIComponent(r)}?purge=1&session_key=${encodeURIComponent(e)}`,{method:`DELETE`});if(!i.ok){let e=await i.json().catch(()=>({})),t=e.detail||e.error||`DELETE ?purge=1 ${i.status}`;return N(n,`purge`,r,String(i.status)),{ok:!1,error:t}}return t.setSessions(e=>e.filter(e=>e.sessionId!==r)),N(n,`purge`,r,`200`),{ok:!0}}catch(e){let t=e instanceof Error?e.message:String(e);return N(n,`purge`,r,`threw`),{ok:!1,error:t}}finally{i(null)}},[e,t,n]),c=(0,M.useCallback)(async(r,a)=>{if(!e)return{ok:!1,error:`no-cache-key`};i(a);try{let i=await fetch(`/api/admin/claude-sessions/${encodeURIComponent(r)}/archive?session_key=${encodeURIComponent(e)}`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({mode:a})});if(!i.ok){let e=await i.json().catch(()=>({})),t=e.detail||e.error||`POST /archive ${i.status}`;return N(n,a,r,String(i.status)),{ok:!1,error:t}}return a===`archive`?t.setSessions(e=>e.filter(e=>e.sessionId!==r)):t.refetch(),N(n,a,r,`200`),{ok:!0}}catch(e){let t=e instanceof Error?e.message:String(e);return N(n,a,r,`threw`),{ok:!1,error:t}}finally{i(null)}},[e,t,n]);return{inFlight:r,resume:a,end:o,purge:s,archive:(0,M.useCallback)(e=>c(e,`archive`),[c]),unarchive:(0,M.useCallback)(e=>c(e,`unarchive`),[c])}}function L(e){return`code.session.pinned.${e}`}function R(e){if(typeof window>`u`)return new Set;try{let t=window.localStorage.getItem(L(e));if(!t)return new Set;let n=JSON.parse(t);return Array.isArray(n)?new Set(n.filter(e=>typeof e==`string`)):new Set}catch{return new Set}}function ie(e,t){if(!(typeof window>`u`))try{window.localStorage.setItem(L(e),JSON.stringify([...t]))}catch{}}function ae(e){let[t,n]=(0,M.useState)(()=>R(e));(0,M.useEffect)(()=>{n(R(e))},[e]);let r=(0,M.useCallback)(t=>{n(n=>{let r=new Set(n);return r.has(t)?r.delete(t):r.add(t),ie(e,r),r})},[e]);return{pinned:t,isPinned:(0,M.useCallback)(e=>t.has(e),[t]),togglePin:r}}var z=t();function B(e){let{businessName:t,cacheKey:n,conversationId:i,onLaunchBrowser:a,onNavigate:s,onToggleSidebar:d,sidebarOpen:f,onLogout:p,browserLaunching:m}=e,[h,_]=(0,M.useState)(!1),b=(0,M.useRef)(null),C=(0,M.useRef)(null),[w,E]=(0,M.useState)(null),[D,O]=(0,M.useState)(!1),[A,j]=(0,M.useState)(null),[N,P]=(0,M.useState)(null),[F,I]=(0,M.useState)(null),[re,L]=(0,M.useState)(``);(0,M.useEffect)(()=>{L(window.location.hostname.startsWith(`admin.`)?window.location.origin.replace(`admin.`,`public.`):window.location.origin)},[]),(0,M.useEffect)(()=>{if(!h)return;let e=e=>{b.current&&!b.current.contains(e.target)&&_(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[h]),(0,M.useEffect)(()=>{if(!h)return;let e=e=>{e.key===`Escape`&&_(!1)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[h]),(0,M.useEffect)(()=>{h&&C.current?.focus()},[h]),(0,M.useEffect)(()=>{if(!h)return;let e=!1;return fetch(`/api/admin/version`).then(e=>e.json()).then(t=>{e||I(t)}).catch(e=>{console.error(`[admin/version] menu-open client fetch failed:`,e)}),()=>{e=!0}},[h]);let R=(0,M.useCallback)(()=>{_(e=>{let t=!e;return t&&console.info(`[admin-ui] header-menu-open`),t})},[]),ie=(0,M.useCallback)(()=>{_(!1),a()},[a]),ae=(0,M.useCallback)(e=>{_(!1),s(e)},[s]),B=(0,M.useCallback)(async()=>{if(w!==null){E(null),P(null);return}O(!0),j(null);try{let e=await fetch(`/api/admin/agents`);if(!e.ok)throw Error(`Failed to load agents`);E((await e.json()).agents??[])}catch(e){console.error(`[admin/agents] list failed:`,e),j(e instanceof Error?e.message:String(e)),E([])}finally{O(!1)}},[w]),V=(0,M.useCallback)(e=>{P(null),E(t=>t?.filter(t=>t.slug!==e)??null),fetch(`/api/admin/agents/${encodeURIComponent(e)}`,{method:`DELETE`}).catch(e=>console.error(`[admin/agents] delete failed:`,e))},[]),H=(0,M.useCallback)(async()=>{if(_(!1),!n){console.warn(`[admin-ui] header-menu-report-turn cacheKey=null — skipping POST`);return}try{let e=await fetch(`/api/admin/failure-report`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({sessionKey:n,conversationId:i??``,lastUserMessageId:``,lastAssistantMessageId:``,clickTs:new Date().toISOString(),clientSnapshot:{sseReadyState:``,lastEventType:``,lastAppliedMessageId:``}})});console.info(`[admin-ui] header-menu-report-turn ok=${e.ok} status=${e.status}`)}catch(e){console.error(`[admin-ui] header-menu-report-turn failed:`,e)}},[n,i]),oe=(0,M.useCallback)(()=>{_(!1),p()},[p]),se=t||u.productName;return(0,z.jsxs)(`header`,{className:`admin-header`,children:[(0,z.jsx)(`button`,{type:`button`,className:`admin-sidebar-toggle`,"aria-label":f?`Hide sidebar`:`Show sidebar`,title:f?`Hide sidebar`:`Show sidebar`,"aria-expanded":f,onClick:d,children:f?(0,z.jsx)(T,{size:20}):(0,z.jsx)(te,{size:20})}),(0,z.jsxs)(`div`,{className:`chat-header-label`,children:[(0,z.jsx)(`span`,{className:`chat-logo-btn`,"aria-hidden":`true`,children:(0,z.jsx)(`img`,{src:c,alt:``,className:`chat-logo`})}),(0,z.jsx)(`h1`,{className:`chat-tagline`,children:se})]}),(0,z.jsxs)(`div`,{className:`chat-burger-wrap`,ref:b,children:[(0,z.jsx)(`button`,{type:`button`,className:`admin-burger`,onClick:R,"aria-label":`Menu`,"aria-haspopup":`true`,"aria-expanded":h,children:(0,z.jsx)(S,{size:20})}),h&&(0,z.jsxs)(`div`,{className:`admin-menu`,role:`menu`,children:[(0,z.jsxs)(`button`,{ref:C,type:`button`,className:`chat-menu-item`,role:`menuitem`,onClick:ie,disabled:m,children:[(0,z.jsx)(o,{size:14}),` Browser`,m&&(0,z.jsx)(x,{size:12,className:`spin`})]}),(0,z.jsxs)(`button`,{type:`button`,className:`chat-menu-item`,role:`menuitem`,onClick:()=>ae(`data`),children:[(0,z.jsx)(g,{size:14}),` Data`]}),(0,z.jsxs)(`button`,{type:`button`,className:`chat-menu-item`,role:`menuitem`,onClick:()=>ae(`graph`),children:[(0,z.jsx)(k,{size:14}),` Graph`]}),(0,z.jsx)(`div`,{className:`chat-menu-divider`}),(0,z.jsxs)(`button`,{type:`button`,className:`chat-menu-item`,role:`menuitem`,onClick:B,children:[(0,z.jsx)(v,{size:14}),` Public`,D&&(0,z.jsx)(x,{size:12,className:`spin`})]}),w!==null&&(0,z.jsxs)(`div`,{className:`chat-menu-agents`,children:[A&&(0,z.jsx)(`span`,{className:`chat-menu-agent-error`,children:A}),w.length===0&&!A&&(0,z.jsx)(`span`,{className:`chat-menu-agent-empty`,children:`No public agents configured`}),w.map(e=>(0,z.jsxs)(`div`,{className:`chat-menu-item chat-menu-agent-item`,children:[(0,z.jsx)(`span`,{className:`agent-status-dot ${e.status}`}),(0,z.jsxs)(`span`,{className:`agent-text`,children:[(0,z.jsx)(`span`,{className:`agent-display-name`,children:e.displayName}),(0,z.jsxs)(`span`,{className:`agent-slug`,children:[`/`,e.slug]})]}),N===e.slug?(0,z.jsxs)(`span`,{className:`agent-actions agent-confirm`,children:[(0,z.jsx)(`button`,{type:`button`,className:`agent-action-btn agent-confirm-yes`,title:`Confirm delete`,onClick:()=>V(e.slug),children:(0,z.jsx)(r,{size:12})}),(0,z.jsx)(`button`,{type:`button`,className:`agent-action-btn agent-confirm-no`,title:`Cancel`,onClick:()=>P(null),children:(0,z.jsx)(ne,{size:12})})]}):(0,z.jsxs)(`span`,{className:`agent-actions`,children:[(0,z.jsx)(`a`,{href:`${re}/${e.slug}`,target:`_blank`,rel:`noopener noreferrer`,className:`agent-action-btn`,title:`Open agent`,onClick:()=>_(!1),children:(0,z.jsx)(v,{size:12})}),(0,z.jsx)(`button`,{type:`button`,className:`agent-action-btn agent-delete-btn`,title:`Delete agent`,onClick:()=>P(e.slug),children:(0,z.jsx)(l,{size:12})})]})]},e.slug))]}),(0,z.jsx)(`div`,{className:`chat-menu-divider`}),(0,z.jsxs)(`div`,{className:`chat-menu-version chat-menu-version-passive`,children:[(0,z.jsx)(y,{size:14}),(0,z.jsxs)(`span`,{className:`version-installed`,children:[F?`v${F.installed}`:`…`,F&&!F.updateAvailable&&(0,z.jsx)(`span`,{className:`version-uptodate-dot`}),F?.updateAvailable&&(0,z.jsx)(`span`,{className:`version-update-dot`})]})]}),(0,z.jsxs)(`button`,{type:`button`,className:`chat-menu-item`,role:`menuitem`,"data-testid":`report-turn`,onClick:H,children:[(0,z.jsx)(y,{size:14}),` Report this turn`]}),(0,z.jsxs)(`button`,{type:`button`,className:`chat-menu-item`,role:`menuitem`,onClick:oe,children:[(0,z.jsx)(ee,{size:14}),` Log out`]})]})]})]})}var V=`complete onboarding`,H=`maxy-admin-session-key`;function oe(){let[e,t]=(0,M.useState)(!1),n=(0,M.useCallback)(async()=>{if(e)return;t(!0);let n=null;try{n=sessionStorage.getItem(H)}catch{}if(!n){console.error(`[admin-ui] onboarding-banner-spawn-failed reason=no-session-key`),window.location.assign(`/`);return}console.info(`[admin-ui] onboarding-banner-click sessionId=pending`);try{let e=await fetch(`/api/admin/claude-sessions?session_key=${encodeURIComponent(n)}`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({initialMessage:V})});if(!e.ok){console.error(`[admin-ui] onboarding-banner-spawn-failed status=${e.status}`),t(!1);return}let r=await e.json();if(!r.sessionId){console.error(`[admin-ui] onboarding-banner-spawn-failed reason=missing-sessionId`),t(!1);return}console.info(`[admin-ui] onboarding-banner-click sessionId=${r.sessionId.slice(0,8)}`),window.location.assign(`/?sessionId=${encodeURIComponent(r.sessionId)}`)}catch(e){console.error(`[admin-ui] onboarding-banner-spawn-error: ${e instanceof Error?e.message:String(e)}`),t(!1)}},[e]);return(0,M.useEffect)(()=>{console.info(`[admin-ui] onboarding-banner-mount onboardingComplete=false`)},[]),(0,z.jsx)(`div`,{className:`admin-shell-banner`,role:`status`,"aria-live":`polite`,children:(0,z.jsxs)(`button`,{type:`button`,className:`admin-shell-banner-button`,onClick:n,disabled:e,"data-testid":`onboarding-incomplete-banner`,children:[(0,z.jsx)(s,{size:16,"aria-hidden":`true`}),(0,z.jsx)(`span`,{children:`Onboarding is not complete. Continue with your agent.`})]})})}var se=(()=>null),U=(0,M.forwardRef)(function(e,t){let{businessName:r,cacheKey:i,role:a,userName:o,userAvatar:s,sessions:c,sessionsLoading:g,sessionsError:y,ensureSessionsLoaded:ee,refetchSessions:S,onSelectArtefact:T,onSelectProjects:te,onSelectPeople:O,onSelectTasks:k,onSelectAgents:ne,onCloseMobileDrawer:N,onSelectSession:P,selectedSessionId:F,collapsed:I,onToggleCollapsed:L,mobileDrawerOpen:R,actions:ie,recentsActions:B}=e,[V,H]=(0,M.useState)(null),[oe,U]=(0,M.useState)(null),[W,ce]=(0,M.useState)(!1);(0,M.useEffect)(()=>{ee()},[ee]);let le=(0,M.useRef)(null),[G,K]=(0,M.useState)(!1),[q,ue]=(0,M.useState)(`default`),[de,fe]=(0,M.useState)(null),pe=u.productName,me=typeof o==`string`?o:o===null?`name unavailable`:r||pe,he=(me.trim().charAt(0)||`?`).toUpperCase(),ge=ae(u.hostname),_e=(0,M.useMemo)(()=>{let e=c;if(ge.pinned.size===0)return e;let t=[],n=[];for(let r of e)(ge.pinned.has(r.sessionId)?t:n).push(r);return[...t,...n]},[c,ge.pinned]),ve=_e.length,[J,ye]=(0,M.useState)(`chat`),[Y,be]=(0,M.useState)([]),[xe,X]=(0,M.useState)(!1),[Se,Ce]=(0,M.useState)(null),[we,Te]=(0,M.useState)(!1);(0,M.useImperativeHandle)(t,()=>({patchArtefact(e,t){be(n=>n.map(n=>n.id===e?{...n,...t}:n))}}),[]);let[Z,Ee]=(0,M.useState)(!1),De=(0,M.useRef)(null);(0,M.useEffect)(()=>{if(!Z)return;function e(e){De.current&&!De.current.contains(e.target)&&Ee(!1)}return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[Z]);let Oe=(0,M.useCallback)(async()=>{if(i){Te(!0),Ce(null);try{let e=await fetch(`/api/admin/sidebar-artefacts?session_key=${encodeURIComponent(i)}`);if(!e.ok)throw Error(`status ${e.status}`);be((await e.json()).artefacts??[]),X(!0)}catch(e){let t=e instanceof Error?e.message:String(e);Ce(`Failed to load artefacts: ${t}`),console.error(`[admin-ui] sidebar-artefacts fetch failed: ${t}`)}finally{Te(!1)}}},[i]),ke=()=>{ye(`chat`),console.info(`[admin-ui] sidebar-nav surface=sessions count=${ve}`)},Ae=()=>{ye(`artefacts`),console.info(`[admin-ui] sidebar-nav surface=artefacts count=${xe?Y.length:0} collapsed=${I}`),I&&L(),xe||Oe()},Q=I?24:16,je=J===`chat`?`Sessions`:`Artefacts`,Me=J===`chat`?g?`…`:String(ve):we?`…`:String(Y.length),Ne=J===`chat`?g:we,Pe=()=>{J===`chat`?S():Oe(),console.info(`[admin-ui] sidebar-refresh surface=${J}`)},Fe=(0,M.useCallback)(async()=>{if(!(G||!i)){K(!0),fe(null);try{let e=await fetch(`/api/admin/claude-sessions?session_key=${encodeURIComponent(i)}`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({channel:`browser`,permissionMode:q})}),t=await e.json();if(!e.ok||!(`sessionId`in t)){fe(t.error??`POST returned ${e.status}`);return}console.info(`[admin-ui] sidebar-new-session pid=${t.pid} sessionId=${t.sessionId} permissionMode=${q}`),B.setSessions(e=>[t,...e])}catch(e){let t=e instanceof Error?e.message:String(e);fe(t),console.error(`[admin-ui] sidebar-new-session failed:`,t)}finally{K(!1)}}},[i,G,B,q]),$=re(i,B,`sidebar`),Ie=(0,M.useCallback)(async e=>{let t=await $.resume(e);t.ok||console.error(`[admin-ui] sidebar-resume failed: ${t.error}`)},[$]),Le=(0,M.useCallback)(async e=>{ce(!0),U(null);let t=await $.purge(e);t.ok?H(null):U(t.error??`purge failed`),ce(!1)},[$]),Re=(0,M.useCallback)(async e=>{let t=await $.end(e);t.ok||console.error(`[admin-ui] sidebar-end-session failed: ${t.error}`)},[$]);return(0,z.jsxs)(`aside`,{className:`side`,children:[(0,z.jsx)(`div`,{className:`side-head`,children:(0,z.jsx)(`button`,{className:`icon-btn side-head-toggle`,title:R?`Close sidebar`:I?`Expand sidebar`:`Collapse sidebar`,type:`button`,"aria-label":R?`Close sidebar`:I?`Expand sidebar`:`Collapse sidebar`,onClick:()=>{R?(console.info(`[admin-ui] sidebar-head-toggle action=close-drawer state=closed`),N()):(console.info(`[admin-ui] sidebar-head-toggle action=toggle-collapsed state=${I?`expanded`:`collapsed`}`),L())},children:I?(0,z.jsx)(w,{size:28}):(0,z.jsx)(C,{size:28})})}),(0,z.jsxs)(`nav`,{className:`side-nav`,children:[(0,z.jsxs)(`button`,{type:`button`,className:`nav-row${J===`chat`?` active`:``}`,onClick:ke,children:[(0,z.jsx)(A,{size:Q}),(0,z.jsx)(`span`,{className:`label`,children:`Sessions`}),(0,z.jsx)(`span`,{className:`kbd`})]}),(0,z.jsxs)(`button`,{type:`button`,className:`nav-row`,onClick:()=>{console.info(`[admin-ui] sidebar-nav surface=people`),O(),N()},children:[(0,z.jsx)(j,{size:Q}),(0,z.jsx)(`span`,{className:`label`,children:`People`}),(0,z.jsx)(`span`,{className:`kbd`})]}),(0,z.jsxs)(`button`,{type:`button`,className:`nav-row`,onClick:()=>{console.info(`[admin-ui] sidebar-nav surface=agents`),ne(),N()},children:[(0,z.jsx)(f,{size:Q}),(0,z.jsx)(`span`,{className:`label`,children:`Agents`}),(0,z.jsx)(`span`,{className:`kbd`})]}),(0,z.jsxs)(`button`,{type:`button`,className:`nav-row`,onClick:()=>{console.info(`[admin-ui] sidebar-nav surface=projects`),te(),N()},children:[(0,z.jsx)(p,{size:Q}),(0,z.jsx)(`span`,{className:`label`,children:`Projects`}),(0,z.jsx)(`span`,{className:`kbd`})]}),(0,z.jsxs)(`button`,{type:`button`,className:`nav-row`,onClick:()=>{console.info(`[admin-ui] sidebar-nav surface=tasks`),k(),N()},children:[(0,z.jsx)(b,{size:Q}),(0,z.jsx)(`span`,{className:`label`,children:`Tasks`}),(0,z.jsx)(`span`,{className:`kbd`})]}),(0,z.jsxs)(`button`,{type:`button`,className:`nav-row${J===`artefacts`?` active`:``}`,onClick:Ae,children:[(0,z.jsx)(d,{size:Q}),(0,z.jsx)(`span`,{className:`label`,children:`Artefacts`}),(0,z.jsx)(`span`,{className:`kbd`})]})]}),(0,z.jsxs)(`div`,{className:`side-list`,ref:le,children:[(0,z.jsxs)(`div`,{className:`group-head`,children:[(0,z.jsx)(`span`,{children:je}),(0,z.jsxs)(`span`,{className:`group-head-meta`,children:[J===`chat`&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(`select`,{className:`group-head-permission-mode`,value:q,onChange:e=>ue(e.target.value),title:`Permission mode for the next session`,"aria-label":`Permission mode for the next session`,disabled:G,children:[(0,z.jsx)(`option`,{value:`default`,children:`Ask`}),(0,z.jsx)(`option`,{value:`acceptEdits`,children:`Accept edits`}),(0,z.jsx)(`option`,{value:`plan`,children:`Plan`}),(0,z.jsx)(`option`,{value:`auto`,children:`Auto`})]}),(0,z.jsx)(`a`,{className:`group-head-refresh`,href:`/docs/desktop-code-controls`,target:`_blank`,rel:`noopener noreferrer`,title:`Desktop Code-tab controls reference`,"aria-label":`Desktop Code-tab controls reference`,children:(0,z.jsx)(m,{size:12})}),(0,z.jsx)(`button`,{type:`button`,className:`group-head-refresh`,title:`New session`,"aria-label":`New session`,onClick:()=>void Fe(),disabled:G||!i,children:G?(0,z.jsx)(x,{size:12,className:`spinning`}):(0,z.jsx)(E,{size:12})})]}),(0,z.jsx)(`button`,{type:`button`,className:`group-head-refresh`,title:`Refresh ${je.toLowerCase()}`,"aria-label":`Refresh ${je.toLowerCase()}`,onClick:Pe,disabled:Ne,children:(0,z.jsx)(D,{size:12,className:Ne?`spinning`:void 0})}),(0,z.jsx)(`span`,{children:Me})]})]}),de&&J===`chat`&&(0,z.jsx)(`div`,{className:`conv`,style:{color:`var(--text-tertiary)`,cursor:`default`},children:de}),J===`chat`&&(0,z.jsxs)(z.Fragment,{children:[y&&(0,z.jsx)(`div`,{className:`conv`,style:{color:`var(--text-tertiary)`,cursor:`default`},children:y}),_e.map(e=>{let t=e.status===`ended`,r=t?`${e.turnCount}${e.capped?`+`:``} turns · ended`:`pid ${e.pid??`?`}`;return(0,z.jsxs)(`div`,{className:`conv${F===e.sessionId?` active`:``}`,children:[(0,z.jsxs)(`button`,{type:`button`,className:`conv-name-button`,onClick:()=>{P(e.sessionId),N()},title:`Show metadata`,children:[(0,z.jsx)(A,{size:12,className:`conv-channel-icon`,"aria-label":`claude session`}),(0,z.jsxs)(`span`,{className:`conv-name`,children:[e.displayName,` · `,r]})]}),t?(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(`button`,{type:`button`,className:`conversations-action`,title:`Resume session`,"aria-label":`Resume session`,onClick:()=>void Ie(e.sessionId),children:(0,z.jsx)(n,{size:13})}),(0,z.jsx)(`button`,{type:`button`,className:`conversations-action`,title:`Purge JSONL`,"aria-label":`Purge JSONL`,onClick:()=>{U(null),H({sessionId:e.sessionId,displayName:e.displayName})},children:(0,z.jsx)(l,{size:13})})]}):(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(`button`,{type:`button`,className:`conversations-action`,title:`Open in new tab`,"aria-label":`Open in new tab`,onClick:()=>{console.info(`[admin-ui] sidebar-open-session sessionId=${e.sessionId}`),e.url&&window.open(e.url,`_blank`,`noopener,noreferrer`)},children:(0,z.jsx)(v,{size:13})}),(0,z.jsx)(`button`,{type:`button`,className:`conversations-action`,title:`End session`,"aria-label":`End session`,onClick:()=>void Re(e.sessionId),children:(0,z.jsx)(h,{size:13})})]})]},e.sessionId)})]}),J===`artefacts`&&(0,z.jsxs)(z.Fragment,{children:[Se&&(0,z.jsx)(`div`,{className:`conv`,style:{color:`var(--text-tertiary)`,cursor:`default`},children:Se}),xe&&!Se&&Y.length===0&&(0,z.jsx)(`div`,{className:`conv`,style:{color:`var(--text-tertiary)`,cursor:`default`},children:`No artefacts yet`}),Y.map(e=>(0,z.jsxs)(`button`,{type:`button`,className:`conv`,onClick:()=>{T({docId:e.id,name:e.name,content:e.content,editable:e.editable,mimeType:e.mimeType,skipReason:e.skipReason},`sidebar-artefacts`),N()},children:[(0,z.jsx)(`span`,{className:`conv-name`,children:e.name}),(0,z.jsx)(`span`,{className:`conv-kind`,"data-kind":e.kind===`agent-template`?`agent`:`doc`,children:e.kind===`agent-template`?`agent`:`doc`})]},e.id))]})]}),(0,z.jsxs)(`div`,{className:`side-foot`,ref:De,children:[(0,z.jsx)(`div`,{className:`avatar`,children:s?(0,z.jsx)(`img`,{src:s,alt:me}):he}),(0,z.jsxs)(`div`,{className:`who`,children:[(0,z.jsx)(`span`,{className:`name`,children:me}),(0,z.jsx)(`span`,{className:`role`,children:a??`operator`})]}),(0,z.jsx)(`button`,{className:`icon-btn side-foot-actions-trigger`,title:`Conversation actions`,type:`button`,"aria-label":`Conversation actions`,"aria-haspopup":`true`,"aria-expanded":Z,onClick:()=>Ee(e=>!e),children:(0,z.jsx)(_,{size:Q})}),Z&&(0,z.jsx)(`div`,{className:`side-foot-actions-popover`,children:(0,z.jsx)(se,{...ie,onAfterAction:()=>Ee(!1)})})]}),V&&(0,z.jsx)(`div`,{role:`dialog`,"aria-modal":`true`,"aria-labelledby":`purge-confirm-title`,className:`modal-overlay`,onClick:e=>{e.target===e.currentTarget&&!W&&H(null)},children:(0,z.jsxs)(`div`,{className:`modal-card`,children:[(0,z.jsx)(`h3`,{id:`purge-confirm-title`,style:{margin:0,marginBottom:8,fontSize:16,fontWeight:600},children:`Purge session JSONL?`}),(0,z.jsxs)(`p`,{style:{margin:0,marginBottom:8,fontSize:13},children:[`This hard-deletes the transcript and sidecar for `,(0,z.jsx)(`strong`,{children:V.displayName}),`. The action cannot be undone.`]}),oe&&(0,z.jsx)(`p`,{style:{margin:0,marginBottom:8,fontSize:12,color:`var(--text-tertiary)`},children:oe}),(0,z.jsxs)(`div`,{className:`modal-action-row`,children:[(0,z.jsx)(`button`,{type:`button`,className:`modal-action-btn`,disabled:W,onClick:()=>H(null),children:`Cancel`}),(0,z.jsx)(`button`,{type:`button`,className:`modal-action-btn`,"data-variant":`danger`,disabled:W,onClick:()=>void Le(V.sessionId),children:W?(0,z.jsx)(x,{size:13,className:`spinning`}):`Purge`})]})]})})]})});function W(e){return e.map(e=>[e.sessionId,e.displayName,e.lastMessageAt,e.status])}function ce(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++){let r=e[n],i=t[n];if(r[0]!==i[0]||r[1]!==i[1]||r[2]!==i[2]||r[3]!==i[3])return!1}return!0}function le(e){let[t,n]=(0,M.useState)([]),[r,i]=(0,M.useState)(!1),[a,o]=(0,M.useState)(null),[s,c]=(0,M.useState)(null),l=(0,M.useRef)([]),u=(0,M.useCallback)(async(t,r)=>{if(e&&!(!t&&s===e)){r||(i(!0),o(null));try{let t=await fetch(`/api/admin/claude-sessions?session_key=${encodeURIComponent(e)}`);if(!t.ok)throw Error(`claude-sessions fetch returned ${t.status}`);let i=await t.json(),a=Array.isArray(i)?i:i.sessions??[],o=W(a),s=ce(l.current,o);s||(n(a),l.current=o),c(e),r&&console.info(`[admin-ui] sessions-poll outcome=${s?`unchanged`:`changed`} count=${a.length} cacheKey=${e.slice(0,8)}`)}catch(t){r&&console.info(`[admin-ui] sessions-poll outcome=error count=0 cacheKey=${e.slice(0,8)}`),console.error(`[admin/claude-sessions] fetch failed:`,t),r||o(t instanceof Error?t.message:String(t))}finally{r||i(!1)}}},[e,s]);(0,M.useEffect)(()=>{e||(c(null),n([]),o(null),l.current=[])},[e]);let d=(0,M.useCallback)(()=>u(!1,!1),[u]),f=(0,M.useCallback)(()=>u(!0,!1),[u]),p=(0,M.useCallback)(()=>u(!0,!0),[u]),m=(0,M.useRef)(p);return(0,M.useEffect)(()=>{m.current=p},[p]),(0,M.useEffect)(()=>{if(!e)return;let t=setInterval(()=>{m.current()},3e3);return()=>clearInterval(t)},[e]),{sessions:t,setSessions:n,loading:r,loaded:s!==null&&s===e,error:a,ensureLoaded:d,refetch:f}}var G=`admin-sidebar-collapsed`,K=`admin-sidebar-drawer-open`;function q(){if(typeof window>`u`)return!1;try{return window.sessionStorage.getItem(G)===`1`}catch{return!1}}function ue(e){if(!(typeof window>`u`))try{e?window.sessionStorage.setItem(G,`1`):window.sessionStorage.removeItem(G)}catch{}}function de(){if(typeof window>`u`)return!1;try{return window.sessionStorage.getItem(K)===`1`}catch{return!1}}function fe(e){if(!(typeof window>`u`))try{e?window.sessionStorage.setItem(K,`1`):window.sessionStorage.removeItem(K)}catch{}}var pe=720;function me(e){let{cacheKey:t,businessName:n,conversationId:r,onLaunchBrowser:i,onLogout:a,browserLaunching:o=!1,onboardingComplete:s,userName:c,userAvatar:l,role:u,selectedSessionId:d,onSelectSession:f,onSelectArtefact:p,dataArtefact:m=`closed`,children:h,footer:g}=e,[_,v]=(0,M.useState)(()=>q()),[y,b]=(0,M.useState)(()=>de()),[x,ee]=(0,M.useState)(()=>typeof window<`u`&&window.matchMedia(`(max-width: ${pe}px)`).matches);(0,M.useEffect)(()=>{if(typeof window>`u`)return;let e=window.matchMedia(`(max-width: ${pe}px)`),t=e=>ee(e.matches);return e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)},[]);let S=(0,M.useCallback)(e=>{ue(e),v(e)},[]),C=(0,M.useCallback)(e=>{fe(e),b(e)},[]);(0,M.useEffect)(()=>{if(typeof window>`u`)return;let e=window.location?.pathname??``;console.info(`[admin-ui] shell-mount route=${e} collapsed=${_} drawer=${y}`)},[]);let w=x?y:!_,T=(0,M.useCallback)(()=>{if(!(typeof window>`u`))if(window.matchMedia(`(max-width: ${pe}px)`).matches){let e=y;console.info(`[admin-ui] header-sidebar-toggle from=${e?`open`:`closed`} mode=drawer`),C(!e)}else{let e=_;console.info(`[admin-ui] header-sidebar-toggle from=${e?`closed`:`open`} mode=collapse`),S(!e)}},[_,y,S,C]),te=(0,M.useCallback)(e=>{console.info(`[admin-ui] header-menu-nav target=${e}`),window.location.href=e===`data`?`/data`:`/graph`},[]),E=(0,M.useCallback)(()=>{},[]),D=s===!1,O=le(t),k=(0,M.useCallback)(e=>{if(f){f(e);return}window.location.assign(`/?sessionId=${encodeURIComponent(e)}`)},[f]),A=(0,M.useCallback)(e=>{p&&p(e)},[p]),j={collapsed:_,mobileDrawerOpen:y,sidebarOpen:w,onToggleSidebar:T,setMobileDrawerOpen:C,sessionsState:O};return(0,z.jsxs)(`div`,{className:`admin-shell admin-page admin-shell-root`,children:[(0,z.jsx)(B,{businessName:n,cacheKey:t,conversationId:r,onLaunchBrowser:i??E,onNavigate:te,onToggleSidebar:T,sidebarOpen:w,onLogout:a,browserLaunching:o}),D&&(0,z.jsx)(oe,{}),(0,z.jsxs)(`div`,{className:`platform${y?` menu-open`:``}${_?` sidebar-collapsed`:``}`,"data-artefact":m,children:[(0,z.jsx)(U,{businessName:n,cacheKey:t,role:u??null,userName:c,userAvatar:l??null,sessions:O.sessions,sessionsLoading:O.loading,sessionsError:O.error,ensureSessionsLoaded:O.ensureLoaded,refetchSessions:O.refetch,onSelectArtefact:A,onSelectProjects:()=>{window.location.href=`/graph?label=Project`},onSelectPeople:()=>{window.location.href=`/graph?label=Person`},onSelectTasks:()=>{window.location.href=`/graph?label=Task`},onSelectAgents:()=>{window.location.href=`/graph?label=Agent`},onCloseMobileDrawer:()=>C(!1),onSelectSession:k,selectedSessionId:d??null,collapsed:_,onToggleCollapsed:()=>{},mobileDrawerOpen:y,actions:{},recentsActions:{setSessions:O.setSessions,refetch:O.refetch}}),typeof h==`function`?h(j):h]}),y&&(0,z.jsx)(`div`,{className:`sidebar-backdrop menu-open`,"aria-hidden":`true`,onClick:()=>C(!1)}),g]})}var he=`maxy-admin-session`,ge=typeof BroadcastChannel<`u`;function _e(e){if(typeof e!=`object`||!e)return!1;let t=e;return t.type===`rotation`&&typeof t.newKey==`string`&&t.newKey.length>0&&(t.surface===`chat`||t.surface===`graph`||t.surface===`data`||t.surface===`sessions`)&&typeof t.ts==`number`}function ve(e){if(!ge)return()=>{};let t=new BroadcastChannel(he),n=t=>{if(!_e(t.data)){console.warn(`[admin-session-broadcast] outcome=received-malformed payload=${JSON.stringify(t.data)}`);return}e(t.data)};return t.addEventListener(`message`,n),()=>{t.removeEventListener(`message`,n),t.close()}}var J=`maxy-admin-session-key`;function ye(e,t){return`${e}${e.includes(`?`)?`&`:`?`}session_key=${encodeURIComponent(t)}`}async function Y(e){let t;try{t=await e.clone().json()}catch{return`parse-failed`}if(typeof t!=`object`||!t)return`unknown-401`;let n=t.code;return n===`session-missing`||n===`session-not-registered`||n===`session-expired-age`||n===`grant-expired`?n:`unknown-401`}function be(){try{return sessionStorage.getItem(J)}catch{return null}}function xe(e){let{initialCacheKey:t,surface:n}=e,[r,i]=(0,M.useState)(t),a=(0,M.useRef)(t);(0,M.useEffect)(()=>{a.current=r},[r]),(0,M.useEffect)(()=>{t!==a.current&&(i(t),a.current=t,s(e=>e+1))},[t]);let[o,s]=(0,M.useState)(0),[c,l]=(0,M.useState)(null);(0,M.useEffect)(()=>ve(e=>{let t=a.current.slice(0,8),r=e.newKey.slice(0,8);e.newKey!==a.current&&(console.log(`[admin-session-broadcast] outcome=received oldKey=${t} newKey=${r} surface=${n} senderSurface=${e.surface}`),i(e.newKey),s(e=>e+1),l(null))}),[n]);let u=(0,M.useCallback)(()=>{try{sessionStorage.removeItem(J)}catch{}window.location.href=`/`},[]);return{adminFetch:(0,M.useCallback)(async(e,t)=>{let r=a.current,o=ye(e,r),c=await fetch(o,t);if(c.status!==401)return c;let d=await Y(c);if(d===`session-missing`)return console.warn(`[useAdminFetch] outcome=redirect-to-login reason=${d} surface=${n} path=${e}`),u(),c;if(d!==`session-not-registered`)return console.warn(`[useAdminFetch] outcome=redirect-to-login reason=${d} surface=${n} path=${e}`),l({message:`Your admin session has expired. Click to reload and sign in.`,reason:d}),c;let f=be();if(!f||f===r)return console.warn(`[useAdminFetch] outcome=redirect-to-login reason=session-not-registered-no-fresh-key surface=${n} path=${e}`),l({message:`Your admin session was renewed in another tab. Click to reload.`,reason:`session-not-registered`}),c;i(f),a.current=f,s(e=>e+1),console.log(`[useAdminFetch] outcome=retry-after-rotation oldKey=${r.slice(0,8)} newKey=${f.slice(0,8)} surface=${n} path=${e}`);let p=ye(e,f),m=await fetch(p,t);return m.status===401&&(console.warn(`[useAdminFetch] outcome=redirect-to-login reason=second-401-after-retry surface=${n} path=${e}`),l({message:`Your admin session has expired. Click to reload and sign in.`,reason:`session-not-registered`})),m},[u,n]),cacheKey:r,sessionRefetchNonce:o,banner:c,reloadToLogin:u}}var X={LocalBusiness:`#4F6B8A`,Service:`#6B85A0`,PriceSpecification:`#8AA0B8`,OpeningHoursSpecification:`#A8BACE`,Organization:`#8A6B47`,Person:`#B86E4A`,UserProfile:`#D08960`,Preference:`#DFA67A`,AdminUser:`#8C5230`,AccessGrant:`#66381F`,KnowledgeDocument:`#6E8A5A`,ConversationArchive:`#82A06A`,Section:`#8AA876`,Chunk:`#A6C194`,DigitalDocument:`#5A7548`,CreativeWork:`#B5C9A2`,Question:`#C7D6B5`,FAQPage:`#95B385`,DefinedTerm:`#76906A`,Review:`#3F5A2E`,ImageObject:`#A0BB8C`,Conversation:`#6B5A85`,AdminConversation:`#4F4070`,PublicConversation:`#8A75A8`,Message:`#6B7280`,UserMessage:`#DFA67A`,AssistantMessage:`#C9A876`,ToolCall:`#B5ABCB`,Task:`#B0617A`,Project:`#8E4A60`,Event:`#C68095`,Workflow:`#3A6F77`,WorkflowStep:`#5A8E96`,WorkflowRun:`#7AAAB2`,StepResult:`#9CC4CB`,OnboardingState:`#7A5A8A`,Email:`#6F7F4A`,EmailAccount:`#91A063`,Agent:`#B8893D`},Se=`#94A3B8`;Object.freeze(Object.keys(X)),Object.freeze(new Set([`Chunk`,`GraphPreference`]));var Ce=Object.freeze(new Set(`LocalBusiness.Service.PriceSpecification.OpeningHoursSpecification.Organization.Person.UserProfile.Preference.AdminUser.AccessGrant.KnowledgeDocument.DigitalDocument.CreativeWork.Question.FAQPage.DefinedTerm.Review.ImageObject.AdminConversation.PublicConversation.Task.Project.Event.Workflow.OnboardingState.Email.EmailAccount.Agent`.split(`.`)));Object.freeze(new Set([`ToolCall`,`StepResult`,`WorkflowStep`,`WorkflowRun`])),Object.freeze(new Set([`HAS_TOOL_CALL`,`RUN_OF`,`HAS_STEP`,`HAS_RESULT`]));function we(e){for(let t=1;t<e.length;t++)if(Object.prototype.hasOwnProperty.call(X,e[t]))return e[t];return e[0]??null}function Te(e){return X[e]??`#94A3B8`}function Z(e){let t=we(e),n=t?Te(t):Se,r=0;for(let t=1;t<e.length;t++)Object.prototype.hasOwnProperty.call(X,e[t])&&r++;return{displayLabel:t,colour:n,driftCandidates:r}}export{g as _,xe as a,re as c,O as d,D as f,_ as g,v as h,Z as i,ne as l,x as m,Te as n,me as o,E as p,we as r,ae as s,Ce as t,k as u,h as v};
|