@rubytech/create-realagent-code 0.1.116 → 0.1.117
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/package.json +1 -1
- package/payload/platform/neo4j/schema.cypher +73 -0
- package/payload/platform/plugins/admin/PLUGIN.md +1 -0
- package/payload/platform/plugins/docs/PLUGIN.md +1 -0
- package/payload/platform/plugins/docs/references/admin-session.md +1 -1
- package/payload/platform/plugins/docs/references/deployment.md +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-cypher-drift.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-cypher-drift.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-cypher-drift.test.js +62 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-cypher-drift.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/vitest.config.ts +2 -0
- package/payload/server/public/assets/{admin-DloKrK2i.js → admin-D6IfAzYY.js} +1 -1
- package/payload/server/public/assets/{data-NMvGx6jm.js → data-BGbQyufe.js} +1 -1
- package/payload/server/public/assets/{graph-CN60KyTy.js → graph-D-1lRTeL.js} +1 -1
- package/payload/server/public/assets/{graph-labels-h39S93Xo.js → graph-labels-BRXJHNYE.js} +1 -1
- package/payload/server/public/assets/{page-B0iMmY6t.js → page-B4oirCvn.js} +1 -1
- package/payload/server/public/assets/{page-CFRU-BdJ.js → page-FmJ7PIYx.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 +14 -0
package/package.json
CHANGED
|
@@ -1100,3 +1100,76 @@ FOR (h:CloudflareHostname) REQUIRE (h.accountId, h.hostnameValue) IS UNIQUE;
|
|
|
1100
1100
|
|
|
1101
1101
|
CREATE INDEX cloudflare_hostname_account IF NOT EXISTS
|
|
1102
1102
|
FOR (h:CloudflareHostname) ON (h.accountId);
|
|
1103
|
+
|
|
1104
|
+
// ----------------------------------------------------------
|
|
1105
|
+
// Estate-agent ontology (Task 358) — Listing-centric model
|
|
1106
|
+
// documented at platform/plugins/memory/references/schema-estate-agent.md.
|
|
1107
|
+
//
|
|
1108
|
+
// These declarations exist primarily so the memory-write validator's
|
|
1109
|
+
// parseLabelsFromSchemaCypher() registers each label on a fresh deploy
|
|
1110
|
+
// where no node of the label has yet landed — without them, the first
|
|
1111
|
+
// :Listing write from the listing-curator agent is rejected as "unknown
|
|
1112
|
+
// label" against an empty db.labels() set.
|
|
1113
|
+
//
|
|
1114
|
+
// Idempotency contracts mirror schema-estate-agent.md:
|
|
1115
|
+
// :Listing / :Viewing / :Offer — (accountId, sourceSystem, sourceId)
|
|
1116
|
+
// :Property — (accountId, slug)
|
|
1117
|
+
// :ImageObject — (accountId, listingSlug, url) for the
|
|
1118
|
+
// estate-agent variant, (accountId, name,
|
|
1119
|
+
// contentUrl) for the brand-asset variant.
|
|
1120
|
+
// Because the two writers use different
|
|
1121
|
+
// natural keys, only an accountId index is
|
|
1122
|
+
// declared at the schema level — uniqueness
|
|
1123
|
+
// is enforced at write time by the curator
|
|
1124
|
+
// / brand-asset writer's MERGE clause.
|
|
1125
|
+
// ----------------------------------------------------------
|
|
1126
|
+
|
|
1127
|
+
CREATE CONSTRAINT listing_account_source_unique IF NOT EXISTS
|
|
1128
|
+
FOR (l:Listing) REQUIRE (l.accountId, l.sourceSystem, l.sourceId) IS UNIQUE;
|
|
1129
|
+
|
|
1130
|
+
CREATE INDEX listing_account IF NOT EXISTS
|
|
1131
|
+
FOR (l:Listing) ON (l.accountId);
|
|
1132
|
+
|
|
1133
|
+
CREATE INDEX listing_status IF NOT EXISTS
|
|
1134
|
+
FOR (l:Listing) ON (l.status);
|
|
1135
|
+
|
|
1136
|
+
CREATE INDEX listing_type IF NOT EXISTS
|
|
1137
|
+
FOR (l:Listing) ON (l.listingType);
|
|
1138
|
+
|
|
1139
|
+
CREATE VECTOR INDEX listing_embedding IF NOT EXISTS
|
|
1140
|
+
FOR (l:Listing) ON (l.embedding)
|
|
1141
|
+
OPTIONS {
|
|
1142
|
+
indexConfig: {
|
|
1143
|
+
`vector.dimensions`: 768,
|
|
1144
|
+
`vector.similarity_function`: 'cosine'
|
|
1145
|
+
}
|
|
1146
|
+
};
|
|
1147
|
+
|
|
1148
|
+
CREATE CONSTRAINT property_account_slug_unique IF NOT EXISTS
|
|
1149
|
+
FOR (p:Property) REQUIRE (p.accountId, p.slug) IS UNIQUE;
|
|
1150
|
+
|
|
1151
|
+
CREATE INDEX property_account IF NOT EXISTS
|
|
1152
|
+
FOR (p:Property) ON (p.accountId);
|
|
1153
|
+
|
|
1154
|
+
CREATE CONSTRAINT viewing_account_source_unique IF NOT EXISTS
|
|
1155
|
+
FOR (v:Viewing) REQUIRE (v.accountId, v.sourceSystem, v.sourceId) IS UNIQUE;
|
|
1156
|
+
|
|
1157
|
+
CREATE INDEX viewing_account IF NOT EXISTS
|
|
1158
|
+
FOR (v:Viewing) ON (v.accountId);
|
|
1159
|
+
|
|
1160
|
+
CREATE CONSTRAINT offer_account_source_unique IF NOT EXISTS
|
|
1161
|
+
FOR (o:Offer) REQUIRE (o.accountId, o.sourceSystem, o.sourceId) IS UNIQUE;
|
|
1162
|
+
|
|
1163
|
+
CREATE INDEX offer_account IF NOT EXISTS
|
|
1164
|
+
FOR (o:Offer) ON (o.accountId);
|
|
1165
|
+
|
|
1166
|
+
CREATE INDEX image_object_account IF NOT EXISTS
|
|
1167
|
+
FOR (i:ImageObject) ON (i.accountId);
|
|
1168
|
+
|
|
1169
|
+
// :PostalAddress (schema:PostalAddress) — shared address nodes documented in
|
|
1170
|
+
// schema-base.md. Address rows are deliberately accountId-free (one address
|
|
1171
|
+
// can be shared across customers / orders / listings); writers MERGE on the
|
|
1172
|
+
// formatted address triple. Declared here so a fresh deploy registers the
|
|
1173
|
+
// label before the first :PostalAddress write lands.
|
|
1174
|
+
CREATE INDEX postal_address_postcode IF NOT EXISTS
|
|
1175
|
+
FOR (a:PostalAddress) ON (a.postalCode);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: admin
|
|
3
|
+
surface: platform
|
|
3
4
|
description: "Platform administration plugin. Provides system-status, public-hostname (deterministic Cloudflare public-URL resolver, single call returning the operator's canonical hostname so agents never guess property names on :CloudflareHostname nodes), brand-settings, account-manage, account-update, admin-add, admin-remove, admin-list, admin-update-pin, agent-list, agent-config-read, logs-read, plugin-read, skill-load (one-call resolve+read for SKILL.md by skill name, the canonical primitive for loading a named skill; plugin-read remains the reader for references/* and PLUGIN.md), store-skill (deterministic write counterpart to plugin-read; persists operator-authored skills as plugin files under the active account), session-reset, session-resume, file-attach, wifi, action-approval tools (action-pending, action-approve, action-reject, action-edit), and session-retrospective-mark-complete (the deterministic sentinel the session-end Stop hook reads via JSONL grep to release the retrospective gate; admin calls it once per session after running the three-pass retrospective) for managing the Maxy platform."
|
|
4
5
|
tools:
|
|
5
6
|
- name: system-status
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: docs
|
|
3
|
+
surface: platform
|
|
3
4
|
description: "Comprehensive user guide and platform documentation for Maxy. Load references when users ask how-to, setup, or troubleshooting questions. Also contains platform architecture references for admin use."
|
|
4
5
|
metadata: {"platform":{"always":true,"embed":["public","admin"],"pluginKey":"docs"}}
|
|
5
6
|
---
|
|
@@ -79,7 +79,7 @@ PreToolUse hook `platform/plugins/admin/hooks/askuserquestion-investigate-gate.s
|
|
|
79
79
|
|
|
80
80
|
## Spawn-with-`initialMessage` wrapper
|
|
81
81
|
|
|
82
|
-
The Hono route `POST /api/admin/claude-sessions` at [`platform/ui/server/routes/admin/claude-sessions.ts`](../../../ui/server/routes/admin/claude-sessions.ts) is the single canonical entry point for any caller — UI click handler or programmatic — that needs to open an admin PTY session with a first user prompt. Direct calls to the session-manager's `/spawn` are not allowed; the wrapper owns the per-spawn enrichment (`aboutOwner`, `dormantPlugins`, `activePlugins`, `specialistDomains`, `tunnelUrl`) and the `senderId` resolution from the admin session cookie. The session manager binds to `127.0.0.1` only so the wrapper is the sole authorised caller; any ad-hoc spawn that bypasses it duplicates this contract and is a bug.
|
|
82
|
+
The Hono route `POST /api/admin/claude-sessions` at [`platform/ui/server/routes/admin/claude-sessions.ts`](../../../ui/server/routes/admin/claude-sessions.ts) is the single canonical entry point for any caller — UI click handler or programmatic — that needs to open an admin PTY session with a first user prompt. Direct calls to the session-manager's `/spawn` are not allowed; the wrapper owns the per-spawn enrichment (`aboutOwner`, `dormantPlugins`, `activePlugins`, `specialistDomains`, `tunnelUrl`) and the `senderId` resolution from the admin session cookie. The session manager binds to `127.0.0.1` only so the wrapper is the sole authorised caller; any ad-hoc spawn that bypasses it duplicates this contract and is a bug. `dormantPlugins` is `installed − enabledPlugins` with one exclusion: PLUGIN.md frontmatter `surface: platform` (admin, docs) marks platform-shell plugins that ship with every install and are never opt-in features, so they never surface in the `<dormant-plugins>` nudge.
|
|
83
83
|
|
|
84
84
|
**Body schema.** `{channel?, permissionMode?, initialMessage?, specialist?, model?}` for the cookie path (Sidebar — `senderId` resolved from the admin session cookie, `hidden: false`). `permissionMode` accepts one of five values matching Claude Code's CLI: `'default'`, `'acceptEdits'`, `'plan'`, `'auto'`, `'bypassPermissions'`. The Stop-hook loopback caller adds `adminSessionId` and uses three overrides: `specialist: 'database-operator'`, `model: 'haiku'`, plus `initialMessage`. The wrapper rejects nothing structurally on the cookie path — string fields are coerced or defaulted (`channel` → `'browser'`, `permissionMode` → undefined, `initialMessage` → null if empty/whitespace). The loopback path refuses with `400 admin-session-id-required` if `adminSessionId` is missing or non-UUID, and `404 admin-session-not-found` if the manager has no StoredSession for it.
|
|
85
85
|
|
|
@@ -85,7 +85,7 @@ Every PTY spawn injects an `--append-system-prompt` block composed of these sent
|
|
|
85
85
|
| `<about-owner>` | upstream `loadUserProfile` + `formatProfileSummary` (UI process) | sentinel renders the prose body with `NOTHING (operator-data source unavailable: \`<reason>\`)` on line one; spawn proceeds |
|
|
86
86
|
| `<specialist-domains>` | `<accountDir>/specialists/agents/*.md` frontmatter (UI process) | sentinel omitted when set is empty |
|
|
87
87
|
| `<plugin-manifest>` | enabled plugins' PLUGIN.md frontmatter + skill SKILL.md frontmatter (UI process) | sentinel omitted when set is empty |
|
|
88
|
-
| `<dormant-plugins>` | installed-minus-enabled set from `platform/plugins/` and `account.json` | sentinel omitted when set is empty |
|
|
88
|
+
| `<dormant-plugins>` | installed-minus-enabled set from `platform/plugins/` and `account.json`, excluding plugins whose PLUGIN.md frontmatter sets `surface: platform` (platform-shell — ships with every install, never opt-in). Absent `surface` field defaults to `feature` (dormant-eligible). | sentinel omitted when set is empty |
|
|
89
89
|
|
|
90
90
|
Diagnostic line per spawn (`~/.<brand>/logs/server.log`):
|
|
91
91
|
|
package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-cypher-drift.test.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-cypher-drift.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/schema-cypher-drift.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { test, expect } from "vitest";
|
|
2
|
+
import { readFileSync, readdirSync } from "node:fs";
|
|
3
|
+
import { resolve, join } from "node:path";
|
|
4
|
+
import { parseLabelsFromSchemaCypher } from "../../../../../../lib/graph-mcp/dist/schema-cypher-parser.js";
|
|
5
|
+
// Task 358 — schema-doc / schema-cypher drift guard.
|
|
6
|
+
//
|
|
7
|
+
// Every label declared in prose by an ontology doc under
|
|
8
|
+
// platform/plugins/memory/references/schema-*.md must also be declared
|
|
9
|
+
// in platform/neo4j/schema.cypher so that
|
|
10
|
+
// parseLabelsFromSchemaCypher() registers it before the first node of
|
|
11
|
+
// that label has landed. Without this guard, a label written in the prose
|
|
12
|
+
// model survives review even when its CREATE CONSTRAINT / CREATE INDEX
|
|
13
|
+
// line is missing — and the first memory-write referencing it fails
|
|
14
|
+
// against a fresh, label-empty graph (the symptom that produced this
|
|
15
|
+
// task, and Task 352 before it).
|
|
16
|
+
const REFERENCES_DIR = resolve(import.meta.dirname, "../../../../references");
|
|
17
|
+
const SCHEMA_CYPHER_PATH = resolve(import.meta.dirname, "../../../../../../neo4j/schema.cypher");
|
|
18
|
+
// Labels named in prose that are deliberately NOT first-class graph
|
|
19
|
+
// nodes — they are sub-labels stacked on a base node by the writer, or
|
|
20
|
+
// schema.org aliases that never reach the graph as their own label.
|
|
21
|
+
// Adding to this set is an intentional exception, not a silent omission.
|
|
22
|
+
const PROSE_ONLY_LABELS = new Set([
|
|
23
|
+
// schema-estate-agent.md treats Applicant as an additional label on a
|
|
24
|
+
// base :Person node; there is no standalone :Applicant.
|
|
25
|
+
"Applicant",
|
|
26
|
+
]);
|
|
27
|
+
function backtickedLabels(text) {
|
|
28
|
+
const labels = new Set();
|
|
29
|
+
// Match `:Label` inside backticks — the convention used by every
|
|
30
|
+
// schema-*.md prose doc to name a Neo4j label.
|
|
31
|
+
for (const match of text.matchAll(/`:([A-Z][A-Za-z0-9]*)`/g)) {
|
|
32
|
+
labels.add(match[1]);
|
|
33
|
+
}
|
|
34
|
+
return labels;
|
|
35
|
+
}
|
|
36
|
+
test("schema-*.md prose labels all appear in schema.cypher", () => {
|
|
37
|
+
const declared = new Set(parseLabelsFromSchemaCypher(readFileSync(SCHEMA_CYPHER_PATH, "utf-8")));
|
|
38
|
+
const files = readdirSync(REFERENCES_DIR).filter((name) => name.startsWith("schema-") && name.endsWith(".md"));
|
|
39
|
+
expect(files.length).toBeGreaterThan(0);
|
|
40
|
+
const missing = [];
|
|
41
|
+
for (const file of files) {
|
|
42
|
+
const text = readFileSync(join(REFERENCES_DIR, file), "utf-8");
|
|
43
|
+
for (const label of backtickedLabels(text)) {
|
|
44
|
+
if (PROSE_ONLY_LABELS.has(label))
|
|
45
|
+
continue;
|
|
46
|
+
if (!declared.has(label)) {
|
|
47
|
+
missing.push({ label, file });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
expect(missing, `Labels named in prose but missing from schema.cypher (add a CREATE CONSTRAINT or CREATE INDEX FOR (x:Label) line, or add to PROSE_ONLY_LABELS with a justification):\n${missing
|
|
52
|
+
.map((m) => ` :${m.label} (${m.file})`)
|
|
53
|
+
.join("\n")}`).toEqual([]);
|
|
54
|
+
});
|
|
55
|
+
test("estate-agent labels are declared in schema.cypher", () => {
|
|
56
|
+
// Task 358 acceptance — explicit assertion against regression.
|
|
57
|
+
const declared = new Set(parseLabelsFromSchemaCypher(readFileSync(SCHEMA_CYPHER_PATH, "utf-8")));
|
|
58
|
+
for (const label of ["Listing", "Property", "Viewing", "Offer", "ImageObject"]) {
|
|
59
|
+
expect(declared.has(label), `expected :${label} in schema.cypher`).toBe(true);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=schema-cypher-drift.test.js.map
|
package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-cypher-drift.test.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-cypher-drift.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/schema-cypher-drift.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,2BAA2B,EAAE,MAAM,8DAA8D,CAAC;AAE3G,qDAAqD;AACrD,EAAE;AACF,yDAAyD;AACzD,uEAAuE;AACvE,0CAA0C;AAC1C,sEAAsE;AACtE,0EAA0E;AAC1E,uEAAuE;AACvE,oEAAoE;AACpE,qEAAqE;AACrE,iCAAiC;AAEjC,MAAM,cAAc,GAAG,OAAO,CAC5B,MAAM,CAAC,IAAI,CAAC,OAAO,EACnB,wBAAwB,CACzB,CAAC;AACF,MAAM,kBAAkB,GAAG,OAAO,CAChC,MAAM,CAAC,IAAI,CAAC,OAAO,EACnB,uCAAuC,CACxC,CAAC;AAEF,oEAAoE;AACpE,uEAAuE;AACvE,oEAAoE;AACpE,yEAAyE;AACzE,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAS;IACxC,sEAAsE;IACtE,wDAAwD;IACxD,WAAW;CACZ,CAAC,CAAC;AAEH,SAAS,gBAAgB,CAAC,IAAY;IACpC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,iEAAiE;IACjE,+CAA+C;IAC/C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,CAAC;QAC7D,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;IAChE,MAAM,QAAQ,GAAG,IAAI,GAAG,CACtB,2BAA2B,CAAC,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC,CACvE,CAAC;IACF,MAAM,KAAK,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC,MAAM,CAC9C,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC7D,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAExC,MAAM,OAAO,GAA2C,EAAE,CAAC;IAC3D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/D,KAAK,MAAM,KAAK,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3C,IAAI,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,SAAS;YAC3C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CACJ,OAAO,EACP,yKAAyK,OAAO;SAC7K,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC;SACvC,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAChB,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mDAAmD,EAAE,GAAG,EAAE;IAC7D,+DAA+D;IAC/D,MAAM,QAAQ,GAAG,IAAI,GAAG,CACtB,2BAA2B,CAAC,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC,CACvE,CAAC;IACF,KAAK,MAAM,KAAK,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC;QAC/E,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,aAAa,KAAK,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChF,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -18,6 +18,8 @@ export default defineConfig({
|
|
|
18
18
|
"src/lib/__tests__/live-schema-source.test.ts",
|
|
19
19
|
// Task 207 — Vitest-style test for `readPassword()` fallback path math.
|
|
20
20
|
"src/lib/__tests__/neo4j-password-path.test.ts",
|
|
21
|
+
// Task 358 — schema-doc / schema.cypher drift guard.
|
|
22
|
+
"src/lib/__tests__/schema-cypher-drift.test.ts",
|
|
21
23
|
],
|
|
22
24
|
testTimeout: 10_000,
|
|
23
25
|
},
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{o as e,t}from"./chunk-DD-I1_y5.js";import{_ as n,a as r,d as i,f as a,g as o,l as s,m as c,p as l,r as u,u as d,v as f,y as p}from"./ChatInput-CJo_77bp.js";import{C as m,S as h,_ as g,a as _,b as v,c as y,d as b,f as x,g as S,l as C,p as w,s as T,u as ee,v as E,x as te,y as ne}from"./graph-labels-h39S93Xo.js";import{a as D,i as re,r as O,t as ie}from"./page-CFRU-BdJ.js";import{i as ae,n as oe,r as se}from"./page-B0iMmY6t.js";import{t as ce}from"./Checkbox-YrQovXpN.js";import{n as le,r as k,t as ue}from"./lib-Bnh57com.js";var de=n(),A=e(p(),1);new Set(`image/jpeg,image/png,image/gif,image/webp,application/pdf,text/plain,text/markdown,text/csv,text/html,text/calendar,application/zip,application/x-zip-compressed,audio/ogg,audio/opus,audio/mp4,audio/mpeg,audio/webm,audio/wav,.opus,.ogg,.m4a,.mp3,.wav,.webm`.split(`,`).filter(e=>!e.startsWith(`.`)));function fe(e){switch(e){case`expanded`:return!0;case`collapsed`:return!1;default:return}}var pe=`admin-landing-redirected`,me=`/graph`;function he(e){return e.appState===`chat`&&!e.alreadyRedirected}function ge(){let[e,t]=(0,A.useState)(`loading`),[n,r]=(0,A.useState)(``),[i,a]=(0,A.useState)(``),[o,s]=(0,A.useState)(``),[c,l]=(0,A.useState)(!1),[u,d]=(0,A.useState)(!1),[f,p]=(0,A.useState)(!1),[m,h]=(0,A.useState)(!1),[g,_]=(0,A.useState)(!1),[v,y]=(0,A.useState)(null),[b,x]=(0,A.useState)(null),[S,C]=(0,A.useState)(void 0),[w,T]=(0,A.useState)(null),[ee,E]=(0,A.useState)(void 0),[te,ne]=(0,A.useState)(null),[D,re]=(0,A.useState)(null),[O,ie]=(0,A.useState)([]),[ae,oe]=(0,A.useState)(!1),[se,ce]=(0,A.useState)(void 0),le=(0,A.useRef)(void 0),[k,ue]=(0,A.useState)(!1);(0,A.useEffect)(()=>{typeof window>`u`||window.location.hostname.startsWith(`admin.`)&&fetch(`/api/remote-auth/status`).then(e=>e.ok?e.json():null).then(e=>{e?.configured&&ue(!0)}).catch(()=>{})},[]);let de=(0,A.useRef)(null),ge=(0,A.useRef)(null);(0,A.useEffect)(()=>{async function e(){let e=null;try{e=sessionStorage.getItem(`maxy-admin-session-key`)}catch{}if(!e)return!1;try{let n=await fetch(`/api/admin/session?session_key=${encodeURIComponent(e)}`);if(n.status===401){try{sessionStorage.removeItem(`maxy-admin-session-key`)}catch{}return!1}if(!n.ok)return!1;let r=await n.json();y(r.session_key),re(r.conversationId??null),C(r.businessName),T(r.role??null),E(r.userName===void 0?null:r.userName),ne(r.avatar??null);let i=fe(r.thinkingView);return le.current=i,ce(i),t(`chat`),!0}catch(e){return console.error(`[admin] session restore failed:`,e),!1}}async function n(r=2){try{let i=await fetch(`/api/health`);if(!i.ok){if(r>0)return await new Promise(e=>setTimeout(e,1500)),n(r-1);console.error(`[admin] health check returned ${i.status} after retries`),t(`set-pin`);return}let a=await i.json();if(!a.pin_configured){t(`set-pin`);return}if(!a.claude_authenticated){t(`connect-claude`);return}if(await e())return;t(`enter-pin`)}catch(e){if(r>0)return await new Promise(e=>setTimeout(e,1500)),n(r-1);console.error(`[admin] health check failed:`,e),t(`set-pin`)}}n()},[]),(0,A.useEffect)(()=>{e===`chat`&&fetch(`/api/admin/claude-info`).then(e=>{if(e.ok)return e.json()}).then(e=>{e&&x(e)}).catch(()=>{})},[e]),(0,A.useEffect)(()=>{if(typeof window>`u`)return;let t=!1;try{t=sessionStorage.getItem(pe)===`1`}catch{}if(he({appState:e,alreadyRedirected:t})){try{sessionStorage.setItem(pe,`1`)}catch{}console.info(`[admin-ui] landing-redirect target=${me}`),window.location.replace(me)}},[e]),(0,A.useEffect)(()=>{if(e!==`chat`)return;let n=setInterval(async()=>{try{let e=await fetch(`/api/health`);if(!e.ok)return;let n=await e.json();(n.auth_status===`dead`||n.auth_status===`missing`)&&t(`connect-claude`)}catch{}},300*1e3);return()=>clearInterval(n)},[e]),(0,A.useEffect)(()=>{e===`connect-claude`&&fetch(`/api/health`).then(e=>e.ok?e.json():null).then(e=>{e?.claude_authenticated&&t(`enter-pin`)}).catch(()=>{})},[e]);async function _e(e,n){d(!0);try{let i=await fetch(`/api/admin/session`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({pin:e,...n?{accountId:n}:{}})});if(!i.ok){s((await i.json().catch(()=>({}))).error||`Invalid PIN`);return}let a=await i.json();if(a.accounts&&!a.session_key){console.log(`[admin] account picker shown: userId=${a.userId} accountCount=${a.accounts.length}`),ie(a.accounts),t(`account-picker`);return}y(a.session_key),re(a.conversationId??null),C(a.businessName),T(a.role??null),E(a.userName===void 0?null:a.userName),ne(a.avatar??null);let o=fe(a.thinkingView);if(le.current=o,ce(o),n)try{sessionStorage.setItem(`maxy-account-id`,n)}catch{}try{sessionStorage.setItem(`maxy-admin-session-key`,a.session_key)}catch{}r(``),t(`chat`)}catch(e){console.error(`[admin] connection error:`,e),s(`Could not connect.`)}finally{d(!1),oe(!1)}}let ve=(0,A.useCallback)(async e=>{if(e.preventDefault(),u)return;s(``);let a=i.trim();if(!a){s(`Please enter your name.`);return}if(n.length<4){s(`PIN must be at least 4 characters.`);return}let o=n;d(!0);try{let e=await fetch(`/api/onboarding/set-pin`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({pin:o,name:a})});if(!e.ok){let n=await e.json().catch(()=>({}));if(e.status===409){console.log(`[admin] PIN already configured — re-checking health`);try{let e=await fetch(`/api/health`);if(e.ok){let r=await e.json();r.pin_configured&&r.claude_authenticated?t(`enter-pin`):r.pin_configured?t(`connect-claude`):s(n.error||`Failed to set PIN.`)}else t(`enter-pin`)}catch{t(`enter-pin`)}return}s(n.error||`Failed to set PIN.`);return}let n=await fetch(`/api/health`);if((n.ok?await n.json():null)?.claude_authenticated){await _e(o);return}r(``),t(`connect-claude`)}catch(e){console.error(`[admin] connection error:`,e),s(`Could not connect.`)}finally{d(!1)}},[n,u,i]),ye=(0,A.useCallback)(async e=>{e.preventDefault(),s(``),await _e(n)},[n]),be=(0,A.useCallback)(async()=>{_(!0);try{await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`logout`})}),y(null),T(null),E(void 0),ne(null);try{sessionStorage.removeItem(`maxy-admin-session-key`)}catch{}t(`connect-claude`)}finally{_(!1)}},[]),xe=(0,A.useCallback)(()=>{y(null),T(null),E(void 0),ne(null);try{sessionStorage.removeItem(`maxy-admin-session-key`),sessionStorage.removeItem(pe)}catch{}r(``),s(``),t(`enter-pin`)},[]);return{appState:e,setAppState:t,pin:n,setPin:r,operatorName:i,setOperatorName:a,pinError:o,setPinError:s,showPin:c,setShowPin:l,pinLoading:u,authPolling:f,setAuthPolling:p,authLoading:m,setAuthLoading:h,disconnecting:g,cacheKey:v,setCacheKey:y,claudeInfo:b,setClaudeInfo:x,businessName:S,role:w,userName:ee,userAvatar:te,conversationId:D,setConversationId:re,accounts:O,accountPickerLoading:ae,expandAll:se,setExpandAll:ce,expandAllDefaultRef:le,remoteAuthEnabled:k,pinInputRef:de,setPinFormRef:ge,handleSetPin:ve,handleLogin:ye,handleAccountSelect:(0,A.useCallback)(async e=>{oe(!0),s(``),await _e(n,e)},[n]),handleDisconnect:be,handleLogout:xe,handleChangePin:(0,A.useCallback)(async()=>{if(!n){s(`Enter your current PIN first.`);return}d(!0),s(``);try{let e=await fetch(`/api/onboarding/set-pin`,{method:`DELETE`,headers:{"Content-Type":`application/json`},body:JSON.stringify({currentPin:n})});if(!e.ok){s((await e.json().catch(()=>({error:`Incorrect PIN.`}))).error||`Incorrect PIN.`);return}r(``),s(``),t(`set-pin`)}catch(e){console.error(`[admin-auth] change pin failed:`,e),s(e instanceof Error?e.message:String(e))}finally{d(!1)}},[n])}}var _e=o(`bold`,[[`path`,{d:`M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8`,key:`mg9rjx`}]]),ve=o(`code-xml`,[[`path`,{d:`m18 16 4-4-4-4`,key:`1inbqp`}],[`path`,{d:`m6 8-4 4 4 4`,key:`15zrgr`}],[`path`,{d:`m14.5 4-5 16`,key:`e7oirm`}]]),ye=o(`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`}]]),be=o(`file-exclamation-point`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M12 9v4`,key:`juzpu7`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]),xe=o(`italic`,[[`line`,{x1:`19`,x2:`10`,y1:`4`,y2:`4`,key:`15jd3p`}],[`line`,{x1:`14`,x2:`5`,y1:`20`,y2:`20`,key:`bu0au3`}],[`line`,{x1:`15`,x2:`9`,y1:`4`,y2:`20`,key:`uljnxc`}]]),Se=o(`link-2`,[[`path`,{d:`M9 17H7A5 5 0 0 1 7 7h2`,key:`8i5ue5`}],[`path`,{d:`M15 7h2a5 5 0 1 1 0 10h-2`,key:`1b9ql8`}],[`line`,{x1:`8`,x2:`16`,y1:`12`,y2:`12`,key:`1jonct`}]]),Ce=o(`maximize-2`,[[`path`,{d:`M15 3h6v6`,key:`1q9fwt`}],[`path`,{d:`m21 3-7 7`,key:`1l2asr`}],[`path`,{d:`m3 21 7-7`,key:`tjx5ai`}],[`path`,{d:`M9 21H3v-6`,key:`wtvkvv`}]]),we=o(`message-square-plus`,[[`path`,{d:`M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z`,key:`18887p`}],[`path`,{d:`M12 8v6`,key:`1ib9pf`}],[`path`,{d:`M9 11h6`,key:`1fldmi`}]]),Te=o(`minimize-2`,[[`path`,{d:`m14 10 7-7`,key:`oa77jy`}],[`path`,{d:`M20 10h-6V4`,key:`mjg0md`}],[`path`,{d:`m3 21 7-7`,key:`tjx5ai`}],[`path`,{d:`M4 14h6v6`,key:`rmj7iw`}]]),Ee=o(`pin`,[[`path`,{d:`M12 17v5`,key:`bb1du9`}],[`path`,{d:`M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z`,key:`1nkz8b`}]]),De=o(`square-arrow-down-left`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`m16 8-8 8`,key:`166keh`}],[`path`,{d:`M16 16H8V8`,key:`1w2ppm`}]]),Oe=o(`triangle-alert`,[[`path`,{d:`m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3`,key:`wmoenq`}],[`path`,{d:`M12 9v4`,key:`juzpu7`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]),j=d();function ke({inputRef:e,value:t,onChange:n,onComplete:r,showPin:i,autoFocus:a}){let o=(0,A.useRef)([]);function s(e,r){r.key===`Backspace`?(r.preventDefault(),t[e]?n(t.slice(0,e)+t.slice(e+1)):e>0&&(n(t.slice(0,e-1)+t.slice(e)),o.current[e-1]?.focus())):r.key===`ArrowLeft`&&e>0?o.current[e-1]?.focus():r.key===`ArrowRight`&&e<5?o.current[e+1]?.focus():r.key===`Enter`&&(r.preventDefault(),r.currentTarget.form?.requestSubmit())}function c(e,i){let a=i.nativeEvent.data;if(!a||!/^\d$/.test(a))return;let s=t.split(``);for(s[e]=a;s.length<e;)s.push(``);let c=s.join(``).replace(/\D/g,``).slice(0,6);n(c),c.length===6?r?.(c):e<5&&o.current[e+1]?.focus()}function l(e){e.preventDefault();let t=e.clipboardData.getData(`text`).replace(/\D/g,``).slice(0,6);t&&(n(t),t.length===6?r?.(t):o.current[t.length]?.focus())}return(0,j.jsx)(`div`,{className:`pin-field`,children:Array.from({length:6}).map((n,r)=>(0,j.jsx)(`input`,{ref:t=>{o.current[r]=t,r===0&&e&&(e.current=t)},type:`text`,inputMode:`numeric`,className:`pin-box${t[r]?` pin-box-filled`:``}`,value:t[r]?i?t[r]:`•`:``,onKeyDown:e=>s(r,e),onInput:e=>c(r,e),onPaste:l,onFocus:e=>e.target.select(),autoFocus:a&&r===0,autoComplete:`off`,maxLength:1,"aria-label":`PIN digit ${r+1}`},r))})}function Ae(e){let{pin:t,setPin:n,showPin:i,setShowPin:a,pinLoading:o,pinError:c,pinInputRef:l,setPinFormRef:u,onSubmit:d,operatorName:f,setOperatorName:p}=e;return(0,j.jsx)(`div`,{className:`connect-page`,children:(0,j.jsxs)(`div`,{className:`connect-content`,children:[(0,j.jsx)(`img`,{src:s,alt:r.productName,className:`connect-logo connect-logo--maxy`}),!r.logoContainsName&&(0,j.jsxs)(`h1`,{className:`connect-title`,children:[`Welcome to `,r.productName]}),(0,j.jsxs)(`p`,{className:`connect-subtitle`,children:[`Tell `,r.productName,` who you are, then choose a PIN.`]}),(0,j.jsxs)(`form`,{ref:u,onSubmit:d,className:`connect-pin-form`,children:[(0,j.jsxs)(`div`,{className:`pin-input-row`,children:[(0,j.jsx)(`input`,{type:`text`,className:`connect-name-input`,placeholder:`Your full name`,value:f,onChange:e=>p(e.target.value),autoComplete:`name`,autoFocus:!0,required:!0,"aria-label":`Your full name`}),(0,j.jsx)(`div`,{style:{width:38,flexShrink:0},"aria-hidden":`true`})]}),(0,j.jsxs)(`div`,{className:`pin-input-row`,children:[(0,j.jsx)(ke,{inputRef:l,value:t,onChange:n,onComplete:()=>{},showPin:i}),(0,j.jsx)(k,{variant:`send`,type:`submit`,disabled:!t||!f.trim(),loading:o,"aria-label":`Set PIN`,children:(0,j.jsxs)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,j.jsx)(`line`,{x1:`5`,y1:`12`,x2:`19`,y2:`12`}),(0,j.jsx)(`polyline`,{points:`12 5 19 12 12 19`})]})})]}),(0,j.jsx)(ce,{checked:i,onChange:()=>a(e=>!e),label:`Show PIN`})]}),c&&(0,j.jsx)(`p`,{className:`admin-pin-error`,children:c})]})})}function je(e){let{pin:t,setPin:n,showPin:i,setShowPin:a,pinLoading:o,pinError:c,pinInputRef:l,onSubmit:u,onChangePin:d,remoteAuthEnabled:f,onSignOutRemote:p}=e;return(0,j.jsxs)(`div`,{className:`connect-page`,children:[f&&p&&(0,j.jsx)(`button`,{type:`button`,className:`connect-signout`,onClick:p,children:`Sign out`}),(0,j.jsxs)(`div`,{className:`connect-content`,children:[(0,j.jsx)(`img`,{src:s,alt:r.productName,className:`connect-logo connect-logo--maxy`}),!r.logoContainsName&&(0,j.jsx)(`h1`,{className:`connect-title`,children:r.productName}),(0,j.jsxs)(`form`,{onSubmit:u,className:`connect-pin-form`,children:[(0,j.jsxs)(`div`,{className:`pin-input-row`,children:[(0,j.jsx)(ke,{inputRef:l,value:t,onChange:n,onComplete:()=>{},showPin:i,autoFocus:!0}),(0,j.jsx)(k,{variant:`send`,type:`submit`,disabled:!t,loading:o,children:(0,j.jsxs)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,j.jsx)(`line`,{x1:`5`,y1:`12`,x2:`19`,y2:`12`}),(0,j.jsx)(`polyline`,{points:`12 5 19 12 12 19`})]})})]}),(0,j.jsxs)(`div`,{className:`pin-options`,children:[(0,j.jsx)(ce,{checked:i,onChange:()=>a(e=>!e),label:`Show PIN`}),(0,j.jsx)(k,{type:`button`,variant:`ghost`,onClick:d,children:`Change PIN`})]})]}),c&&(0,j.jsx)(`p`,{className:`admin-pin-error`,children:c})]})]})}function Me(e){let{accounts:t,loading:n,error:i,onSelect:a}=e;return(0,j.jsx)(`div`,{className:`connect-page`,children:(0,j.jsxs)(`div`,{className:`connect-content`,children:[(0,j.jsx)(`img`,{src:s,alt:r.productName,className:`connect-logo connect-logo--maxy`}),!r.logoContainsName&&(0,j.jsx)(`h1`,{className:`connect-title`,children:r.productName}),(0,j.jsx)(`p`,{className:`connect-subtitle`,children:`Select an account`}),(0,j.jsx)(`div`,{className:`account-picker-list`,children:t.map(e=>(0,j.jsxs)(`button`,{className:`account-picker-card`,onClick:()=>a(e.accountId),disabled:n,type:`button`,children:[(0,j.jsx)(`span`,{className:`account-picker-name`,children:e.businessName||e.accountId}),(0,j.jsx)(`span`,{className:`account-picker-role`,children:e.role}),n&&(0,j.jsx)(E,{className:`account-picker-spinner`,size:16})]},e.accountId))}),i&&(0,j.jsx)(`p`,{className:`admin-pin-error`,children:i})]})})}function Ne(e){let{authPolling:t,setAuthPolling:n,authLoading:i,setAuthLoading:a,pinError:o,setPinError:c,setAppState:l}=e,[u,d]=(0,A.useState)(!1),[f,p]=(0,A.useState)(!1);async function m(){p(!0),c(``);try{let e=await(await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`launch-browser`})})).json();e.launched?d(!0):e.error&&c(e.error)}catch(e){console.error(`[admin] browser launch error:`,e),c(`Could not launch browser.`)}p(!1)}async function h(){a(!0),c(``);try{let e=await(await fetch(`/api/onboarding/claude-auth`,{method:`POST`})).json();if(e.started){n(!0),d(!0),a(!1);for(let e=0;e<120;e++)if(await new Promise(e=>setTimeout(e,2e3)),(await(await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`wait`})})).json()).authenticated){await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`stop`})}),l(`enter-pin`);return}c(`Timed out waiting for sign-in. Try again.`),n(!1)}else e.error&&c(e.error)}catch(e){console.error(`[admin] auth flow error:`,e),c(`Could not start auth flow.`)}a(!1)}async function g(){await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`stop`})}),n(!1),c(``)}return t||u?(0,j.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,height:`100dvh`,overflow:`auto`},children:[(0,j.jsxs)(`header`,{className:`chat-header`,style:{paddingBottom:`12px`,flexShrink:0,position:`relative`,maxWidth:`680px`,width:`100%`,margin:`0 auto`,padding:`24px 20px 12px`},children:[t?(0,j.jsx)(`button`,{onClick:g,style:{position:`absolute`,top:`12px`,right:`12px`,background:`none`,border:`none`,color:`#999`,fontSize:`13px`,cursor:`pointer`,padding:`4px 8px`},"aria-label":`Cancel`,children:`✕`}):(0,j.jsx)(`button`,{onClick:()=>d(!1),style:{position:`absolute`,top:`12px`,right:`12px`,background:`none`,border:`none`,color:`#999`,fontSize:`13px`,cursor:`pointer`,padding:`4px 8px`},"aria-label":`Close browser`,children:`✕`}),(0,j.jsx)(`img`,{src:`/brand/claude.png`,alt:`Claude`,className:`chat-logo`}),(0,j.jsx)(`h1`,{className:`chat-tagline`,children:`Connect Claude`}),(0,j.jsx)(`p`,{className:`chat-intro`,children:t?`Sign in and authorize in the browser below.`:`Open your email or prepare your accounts, then sign in.`}),!t&&(0,j.jsx)(`div`,{style:{marginTop:`12px`},children:(0,j.jsx)(k,{variant:`primary`,onClick:h,disabled:i,children:i?(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(`span`,{className:`spin`,style:{display:`inline-block`},children:`✱`}),` Connecting…`]}):`Sign in to Claude`})})]}),(0,j.jsx)(`div`,{style:{flex:1,display:`flex`,flexDirection:`column`,minHeight:0,gap:`10px`,padding:`0 0 16px`},children:(0,j.jsx)(`iframe`,{src:`/vnc-viewer.html`,style:{flex:1,width:`100%`,minHeight:0,border:`none`,background:`#111`,display:`block`},title:`Claude Sign-in`})}),o&&(0,j.jsx)(`p`,{className:`admin-pin-error`,style:{textAlign:`center`,padding:`0 20px 16px`},children:o})]}):(0,j.jsx)(`div`,{className:`connect-page`,children:(0,j.jsxs)(`div`,{className:`connect-content`,children:[(0,j.jsxs)(`div`,{className:`connect-logos`,children:[(0,j.jsx)(`div`,{className:`connect-logo-wrap`,children:(0,j.jsx)(`img`,{src:`/brand/claude.png`,alt:`Claude`,className:`connect-logo`})}),(0,j.jsx)(`svg`,{className:`connect-arrow`,viewBox:`0 0 48 24`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`,children:(0,j.jsx)(`path`,{d:`M0 12h44m0 0l-8-8m8 8l-8 8`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`})}),(0,j.jsxs)(`div`,{className:`connect-logo-wrap`,children:[(0,j.jsx)(`img`,{src:s,alt:r.productName,className:`connect-logo connect-logo--maxy`}),!r.logoContainsName&&(0,j.jsx)(`span`,{className:`connect-logo-label`,children:r.productName})]})]}),(0,j.jsxs)(`h1`,{className:`connect-title`,children:[`Connect Claude to power `,r.productName]}),(0,j.jsx)(`p`,{className:`connect-subtitle`,children:`Sign in with your Anthropic account to get started.`}),(0,j.jsx)(k,{variant:`primary`,onClick:h,disabled:i,children:i?(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(`span`,{className:`spin`,style:{display:`inline-block`},children:`✱`}),` Connecting…`]}):`Sign in to Claude`}),(0,j.jsx)(`p`,{style:{marginTop:`6px`,fontSize:`11px`,color:`#999`,maxWidth:`300px`,textAlign:`center`,lineHeight:`1.4`},children:`First time? You may need to sign into your email and Anthropic account in the browser before connecting.`}),(0,j.jsx)(`button`,{onClick:m,disabled:f,style:{marginTop:`12px`,background:`none`,border:`none`,color:`var(--color-primary, #666)`,fontSize:`13px`,cursor:`pointer`,textDecoration:`underline`,textUnderlineOffset:`3px`},children:f?`Launching…`:`Open browser first`}),o&&(0,j.jsx)(`p`,{className:`admin-pin-error`,children:o})]})})}var Pe=`maxy-shell-artefact-px`;function Fe(){if(typeof window>`u`)return 320;let e=window.innerWidth,t=document.querySelector(`.platform > .side`)?.getBoundingClientRect(),n=t?t.right:Math.round(e*.3);return Le(Math.round((e-n)*(2/3)))}function Ie(){if(typeof window>`u`)return 320;try{let e=window.localStorage.getItem(Pe);if(!e)return Fe();let t=parseInt(e,10);if(Number.isFinite(t)&&t>=320)return t}catch{}return Fe()}function Le(e){if(typeof window>`u`)return e;let t=window.innerWidth,n=document.querySelector(`.platform > .side`)?.getBoundingClientRect(),r=n?n.right:Math.round(t*.3),i=Math.max(320,t-r-480);return Math.min(Math.max(e,320),i)}function Re({targetSelector:e=`.platform`}){let t=(0,A.useRef)(null),[n,r]=(0,A.useState)(()=>Ie()),i=(0,A.useRef)(n);(0,A.useEffect)(()=>{let t=document.querySelector(e);!t||!(t instanceof HTMLElement)||(t.style.setProperty(`--artefact-px`,`${n}px`),i.current=n)},[n,e]);let a=(0,A.useCallback)(()=>{r(e=>{let t=Le(e);return t===e?e:t})},[]);(0,A.useEffect)(()=>(a(),window.addEventListener(`resize`,a),()=>window.removeEventListener(`resize`,a)),[a]);let o=e=>{e.preventDefault();let n=t.current;if(!n)return;n.setPointerCapture(e.pointerId),n.classList.add(`dragging`);let a=!1,o=e=>{a=!0,r(Le(Math.round(window.innerWidth-e.clientX)))},s=()=>{if(n.releasePointerCapture(e.pointerId),n.classList.remove(`dragging`),window.removeEventListener(`pointermove`,o),window.removeEventListener(`pointerup`,s),!a)return;let t=i.current;try{window.localStorage.setItem(Pe,String(t))}catch{}console.info(`[admin-ui] artefact-resize px=${t}`)};window.addEventListener(`pointermove`,o),window.addEventListener(`pointerup`,s)},s=()=>{let e=Fe();r(e);try{window.localStorage.removeItem(Pe)}catch{}console.info(`[admin-ui] artefact-resize px=${e}`)};return(0,j.jsx)(`div`,{ref:t,className:`art-resize-handle`,role:`separator`,"aria-orientation":`vertical`,"aria-label":`Resize artefact pane`,onPointerDown:o,onDoubleClick:s})}async function*ze(e,t){let n=await fetch(e,{signal:t});if(n.status===202)throw Error(`transcript not yet on disk; reopen after first turn`);if(!n.ok)throw Error(`stream-failed status=${n.status}`);let r=n.body;if(!r)throw Error(`stream-failed no-body`);let i=r.getReader(),a=new TextDecoder(`utf-8`),o=``,s=0,c=new Promise(e=>{let n={value:void 0,done:!0};if(t.aborted){e(n);return}t.addEventListener(`abort`,()=>e(n),{once:!0})});try{for(;;){if(t.aborted)return;let{value:e,done:n}=await Promise.race([i.read(),c]);if(t.aborted)return;if(n)break;o+=a.decode(e,{stream:!0});let r=o.split(`
|
|
1
|
+
import{o as e,t}from"./chunk-DD-I1_y5.js";import{_ as n,a as r,d as i,f as a,g as o,l as s,m as c,p as l,r as u,u as d,v as f,y as p}from"./ChatInput-CJo_77bp.js";import{C as m,S as h,_ as g,a as _,b as v,c as y,d as b,f as x,g as S,l as C,p as w,s as T,u as ee,v as E,x as te,y as ne}from"./graph-labels-BRXJHNYE.js";import{a as D,i as re,r as O,t as ie}from"./page-FmJ7PIYx.js";import{i as ae,n as oe,r as se}from"./page-B4oirCvn.js";import{t as ce}from"./Checkbox-YrQovXpN.js";import{n as le,r as k,t as ue}from"./lib-Bnh57com.js";var de=n(),A=e(p(),1);new Set(`image/jpeg,image/png,image/gif,image/webp,application/pdf,text/plain,text/markdown,text/csv,text/html,text/calendar,application/zip,application/x-zip-compressed,audio/ogg,audio/opus,audio/mp4,audio/mpeg,audio/webm,audio/wav,.opus,.ogg,.m4a,.mp3,.wav,.webm`.split(`,`).filter(e=>!e.startsWith(`.`)));function fe(e){switch(e){case`expanded`:return!0;case`collapsed`:return!1;default:return}}var pe=`admin-landing-redirected`,me=`/graph`;function he(e){return e.appState===`chat`&&!e.alreadyRedirected}function ge(){let[e,t]=(0,A.useState)(`loading`),[n,r]=(0,A.useState)(``),[i,a]=(0,A.useState)(``),[o,s]=(0,A.useState)(``),[c,l]=(0,A.useState)(!1),[u,d]=(0,A.useState)(!1),[f,p]=(0,A.useState)(!1),[m,h]=(0,A.useState)(!1),[g,_]=(0,A.useState)(!1),[v,y]=(0,A.useState)(null),[b,x]=(0,A.useState)(null),[S,C]=(0,A.useState)(void 0),[w,T]=(0,A.useState)(null),[ee,E]=(0,A.useState)(void 0),[te,ne]=(0,A.useState)(null),[D,re]=(0,A.useState)(null),[O,ie]=(0,A.useState)([]),[ae,oe]=(0,A.useState)(!1),[se,ce]=(0,A.useState)(void 0),le=(0,A.useRef)(void 0),[k,ue]=(0,A.useState)(!1);(0,A.useEffect)(()=>{typeof window>`u`||window.location.hostname.startsWith(`admin.`)&&fetch(`/api/remote-auth/status`).then(e=>e.ok?e.json():null).then(e=>{e?.configured&&ue(!0)}).catch(()=>{})},[]);let de=(0,A.useRef)(null),ge=(0,A.useRef)(null);(0,A.useEffect)(()=>{async function e(){let e=null;try{e=sessionStorage.getItem(`maxy-admin-session-key`)}catch{}if(!e)return!1;try{let n=await fetch(`/api/admin/session?session_key=${encodeURIComponent(e)}`);if(n.status===401){try{sessionStorage.removeItem(`maxy-admin-session-key`)}catch{}return!1}if(!n.ok)return!1;let r=await n.json();y(r.session_key),re(r.conversationId??null),C(r.businessName),T(r.role??null),E(r.userName===void 0?null:r.userName),ne(r.avatar??null);let i=fe(r.thinkingView);return le.current=i,ce(i),t(`chat`),!0}catch(e){return console.error(`[admin] session restore failed:`,e),!1}}async function n(r=2){try{let i=await fetch(`/api/health`);if(!i.ok){if(r>0)return await new Promise(e=>setTimeout(e,1500)),n(r-1);console.error(`[admin] health check returned ${i.status} after retries`),t(`set-pin`);return}let a=await i.json();if(!a.pin_configured){t(`set-pin`);return}if(!a.claude_authenticated){t(`connect-claude`);return}if(await e())return;t(`enter-pin`)}catch(e){if(r>0)return await new Promise(e=>setTimeout(e,1500)),n(r-1);console.error(`[admin] health check failed:`,e),t(`set-pin`)}}n()},[]),(0,A.useEffect)(()=>{e===`chat`&&fetch(`/api/admin/claude-info`).then(e=>{if(e.ok)return e.json()}).then(e=>{e&&x(e)}).catch(()=>{})},[e]),(0,A.useEffect)(()=>{if(typeof window>`u`)return;let t=!1;try{t=sessionStorage.getItem(pe)===`1`}catch{}if(he({appState:e,alreadyRedirected:t})){try{sessionStorage.setItem(pe,`1`)}catch{}console.info(`[admin-ui] landing-redirect target=${me}`),window.location.replace(me)}},[e]),(0,A.useEffect)(()=>{if(e!==`chat`)return;let n=setInterval(async()=>{try{let e=await fetch(`/api/health`);if(!e.ok)return;let n=await e.json();(n.auth_status===`dead`||n.auth_status===`missing`)&&t(`connect-claude`)}catch{}},300*1e3);return()=>clearInterval(n)},[e]),(0,A.useEffect)(()=>{e===`connect-claude`&&fetch(`/api/health`).then(e=>e.ok?e.json():null).then(e=>{e?.claude_authenticated&&t(`enter-pin`)}).catch(()=>{})},[e]);async function _e(e,n){d(!0);try{let i=await fetch(`/api/admin/session`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({pin:e,...n?{accountId:n}:{}})});if(!i.ok){s((await i.json().catch(()=>({}))).error||`Invalid PIN`);return}let a=await i.json();if(a.accounts&&!a.session_key){console.log(`[admin] account picker shown: userId=${a.userId} accountCount=${a.accounts.length}`),ie(a.accounts),t(`account-picker`);return}y(a.session_key),re(a.conversationId??null),C(a.businessName),T(a.role??null),E(a.userName===void 0?null:a.userName),ne(a.avatar??null);let o=fe(a.thinkingView);if(le.current=o,ce(o),n)try{sessionStorage.setItem(`maxy-account-id`,n)}catch{}try{sessionStorage.setItem(`maxy-admin-session-key`,a.session_key)}catch{}r(``),t(`chat`)}catch(e){console.error(`[admin] connection error:`,e),s(`Could not connect.`)}finally{d(!1),oe(!1)}}let ve=(0,A.useCallback)(async e=>{if(e.preventDefault(),u)return;s(``);let a=i.trim();if(!a){s(`Please enter your name.`);return}if(n.length<4){s(`PIN must be at least 4 characters.`);return}let o=n;d(!0);try{let e=await fetch(`/api/onboarding/set-pin`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({pin:o,name:a})});if(!e.ok){let n=await e.json().catch(()=>({}));if(e.status===409){console.log(`[admin] PIN already configured — re-checking health`);try{let e=await fetch(`/api/health`);if(e.ok){let r=await e.json();r.pin_configured&&r.claude_authenticated?t(`enter-pin`):r.pin_configured?t(`connect-claude`):s(n.error||`Failed to set PIN.`)}else t(`enter-pin`)}catch{t(`enter-pin`)}return}s(n.error||`Failed to set PIN.`);return}let n=await fetch(`/api/health`);if((n.ok?await n.json():null)?.claude_authenticated){await _e(o);return}r(``),t(`connect-claude`)}catch(e){console.error(`[admin] connection error:`,e),s(`Could not connect.`)}finally{d(!1)}},[n,u,i]),ye=(0,A.useCallback)(async e=>{e.preventDefault(),s(``),await _e(n)},[n]),be=(0,A.useCallback)(async()=>{_(!0);try{await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`logout`})}),y(null),T(null),E(void 0),ne(null);try{sessionStorage.removeItem(`maxy-admin-session-key`)}catch{}t(`connect-claude`)}finally{_(!1)}},[]),xe=(0,A.useCallback)(()=>{y(null),T(null),E(void 0),ne(null);try{sessionStorage.removeItem(`maxy-admin-session-key`),sessionStorage.removeItem(pe)}catch{}r(``),s(``),t(`enter-pin`)},[]);return{appState:e,setAppState:t,pin:n,setPin:r,operatorName:i,setOperatorName:a,pinError:o,setPinError:s,showPin:c,setShowPin:l,pinLoading:u,authPolling:f,setAuthPolling:p,authLoading:m,setAuthLoading:h,disconnecting:g,cacheKey:v,setCacheKey:y,claudeInfo:b,setClaudeInfo:x,businessName:S,role:w,userName:ee,userAvatar:te,conversationId:D,setConversationId:re,accounts:O,accountPickerLoading:ae,expandAll:se,setExpandAll:ce,expandAllDefaultRef:le,remoteAuthEnabled:k,pinInputRef:de,setPinFormRef:ge,handleSetPin:ve,handleLogin:ye,handleAccountSelect:(0,A.useCallback)(async e=>{oe(!0),s(``),await _e(n,e)},[n]),handleDisconnect:be,handleLogout:xe,handleChangePin:(0,A.useCallback)(async()=>{if(!n){s(`Enter your current PIN first.`);return}d(!0),s(``);try{let e=await fetch(`/api/onboarding/set-pin`,{method:`DELETE`,headers:{"Content-Type":`application/json`},body:JSON.stringify({currentPin:n})});if(!e.ok){s((await e.json().catch(()=>({error:`Incorrect PIN.`}))).error||`Incorrect PIN.`);return}r(``),s(``),t(`set-pin`)}catch(e){console.error(`[admin-auth] change pin failed:`,e),s(e instanceof Error?e.message:String(e))}finally{d(!1)}},[n])}}var _e=o(`bold`,[[`path`,{d:`M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8`,key:`mg9rjx`}]]),ve=o(`code-xml`,[[`path`,{d:`m18 16 4-4-4-4`,key:`1inbqp`}],[`path`,{d:`m6 8-4 4 4 4`,key:`15zrgr`}],[`path`,{d:`m14.5 4-5 16`,key:`e7oirm`}]]),ye=o(`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`}]]),be=o(`file-exclamation-point`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M12 9v4`,key:`juzpu7`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]),xe=o(`italic`,[[`line`,{x1:`19`,x2:`10`,y1:`4`,y2:`4`,key:`15jd3p`}],[`line`,{x1:`14`,x2:`5`,y1:`20`,y2:`20`,key:`bu0au3`}],[`line`,{x1:`15`,x2:`9`,y1:`4`,y2:`20`,key:`uljnxc`}]]),Se=o(`link-2`,[[`path`,{d:`M9 17H7A5 5 0 0 1 7 7h2`,key:`8i5ue5`}],[`path`,{d:`M15 7h2a5 5 0 1 1 0 10h-2`,key:`1b9ql8`}],[`line`,{x1:`8`,x2:`16`,y1:`12`,y2:`12`,key:`1jonct`}]]),Ce=o(`maximize-2`,[[`path`,{d:`M15 3h6v6`,key:`1q9fwt`}],[`path`,{d:`m21 3-7 7`,key:`1l2asr`}],[`path`,{d:`m3 21 7-7`,key:`tjx5ai`}],[`path`,{d:`M9 21H3v-6`,key:`wtvkvv`}]]),we=o(`message-square-plus`,[[`path`,{d:`M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z`,key:`18887p`}],[`path`,{d:`M12 8v6`,key:`1ib9pf`}],[`path`,{d:`M9 11h6`,key:`1fldmi`}]]),Te=o(`minimize-2`,[[`path`,{d:`m14 10 7-7`,key:`oa77jy`}],[`path`,{d:`M20 10h-6V4`,key:`mjg0md`}],[`path`,{d:`m3 21 7-7`,key:`tjx5ai`}],[`path`,{d:`M4 14h6v6`,key:`rmj7iw`}]]),Ee=o(`pin`,[[`path`,{d:`M12 17v5`,key:`bb1du9`}],[`path`,{d:`M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z`,key:`1nkz8b`}]]),De=o(`square-arrow-down-left`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`m16 8-8 8`,key:`166keh`}],[`path`,{d:`M16 16H8V8`,key:`1w2ppm`}]]),Oe=o(`triangle-alert`,[[`path`,{d:`m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3`,key:`wmoenq`}],[`path`,{d:`M12 9v4`,key:`juzpu7`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]),j=d();function ke({inputRef:e,value:t,onChange:n,onComplete:r,showPin:i,autoFocus:a}){let o=(0,A.useRef)([]);function s(e,r){r.key===`Backspace`?(r.preventDefault(),t[e]?n(t.slice(0,e)+t.slice(e+1)):e>0&&(n(t.slice(0,e-1)+t.slice(e)),o.current[e-1]?.focus())):r.key===`ArrowLeft`&&e>0?o.current[e-1]?.focus():r.key===`ArrowRight`&&e<5?o.current[e+1]?.focus():r.key===`Enter`&&(r.preventDefault(),r.currentTarget.form?.requestSubmit())}function c(e,i){let a=i.nativeEvent.data;if(!a||!/^\d$/.test(a))return;let s=t.split(``);for(s[e]=a;s.length<e;)s.push(``);let c=s.join(``).replace(/\D/g,``).slice(0,6);n(c),c.length===6?r?.(c):e<5&&o.current[e+1]?.focus()}function l(e){e.preventDefault();let t=e.clipboardData.getData(`text`).replace(/\D/g,``).slice(0,6);t&&(n(t),t.length===6?r?.(t):o.current[t.length]?.focus())}return(0,j.jsx)(`div`,{className:`pin-field`,children:Array.from({length:6}).map((n,r)=>(0,j.jsx)(`input`,{ref:t=>{o.current[r]=t,r===0&&e&&(e.current=t)},type:`text`,inputMode:`numeric`,className:`pin-box${t[r]?` pin-box-filled`:``}`,value:t[r]?i?t[r]:`•`:``,onKeyDown:e=>s(r,e),onInput:e=>c(r,e),onPaste:l,onFocus:e=>e.target.select(),autoFocus:a&&r===0,autoComplete:`off`,maxLength:1,"aria-label":`PIN digit ${r+1}`},r))})}function Ae(e){let{pin:t,setPin:n,showPin:i,setShowPin:a,pinLoading:o,pinError:c,pinInputRef:l,setPinFormRef:u,onSubmit:d,operatorName:f,setOperatorName:p}=e;return(0,j.jsx)(`div`,{className:`connect-page`,children:(0,j.jsxs)(`div`,{className:`connect-content`,children:[(0,j.jsx)(`img`,{src:s,alt:r.productName,className:`connect-logo connect-logo--maxy`}),!r.logoContainsName&&(0,j.jsxs)(`h1`,{className:`connect-title`,children:[`Welcome to `,r.productName]}),(0,j.jsxs)(`p`,{className:`connect-subtitle`,children:[`Tell `,r.productName,` who you are, then choose a PIN.`]}),(0,j.jsxs)(`form`,{ref:u,onSubmit:d,className:`connect-pin-form`,children:[(0,j.jsxs)(`div`,{className:`pin-input-row`,children:[(0,j.jsx)(`input`,{type:`text`,className:`connect-name-input`,placeholder:`Your full name`,value:f,onChange:e=>p(e.target.value),autoComplete:`name`,autoFocus:!0,required:!0,"aria-label":`Your full name`}),(0,j.jsx)(`div`,{style:{width:38,flexShrink:0},"aria-hidden":`true`})]}),(0,j.jsxs)(`div`,{className:`pin-input-row`,children:[(0,j.jsx)(ke,{inputRef:l,value:t,onChange:n,onComplete:()=>{},showPin:i}),(0,j.jsx)(k,{variant:`send`,type:`submit`,disabled:!t||!f.trim(),loading:o,"aria-label":`Set PIN`,children:(0,j.jsxs)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,j.jsx)(`line`,{x1:`5`,y1:`12`,x2:`19`,y2:`12`}),(0,j.jsx)(`polyline`,{points:`12 5 19 12 12 19`})]})})]}),(0,j.jsx)(ce,{checked:i,onChange:()=>a(e=>!e),label:`Show PIN`})]}),c&&(0,j.jsx)(`p`,{className:`admin-pin-error`,children:c})]})})}function je(e){let{pin:t,setPin:n,showPin:i,setShowPin:a,pinLoading:o,pinError:c,pinInputRef:l,onSubmit:u,onChangePin:d,remoteAuthEnabled:f,onSignOutRemote:p}=e;return(0,j.jsxs)(`div`,{className:`connect-page`,children:[f&&p&&(0,j.jsx)(`button`,{type:`button`,className:`connect-signout`,onClick:p,children:`Sign out`}),(0,j.jsxs)(`div`,{className:`connect-content`,children:[(0,j.jsx)(`img`,{src:s,alt:r.productName,className:`connect-logo connect-logo--maxy`}),!r.logoContainsName&&(0,j.jsx)(`h1`,{className:`connect-title`,children:r.productName}),(0,j.jsxs)(`form`,{onSubmit:u,className:`connect-pin-form`,children:[(0,j.jsxs)(`div`,{className:`pin-input-row`,children:[(0,j.jsx)(ke,{inputRef:l,value:t,onChange:n,onComplete:()=>{},showPin:i,autoFocus:!0}),(0,j.jsx)(k,{variant:`send`,type:`submit`,disabled:!t,loading:o,children:(0,j.jsxs)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,j.jsx)(`line`,{x1:`5`,y1:`12`,x2:`19`,y2:`12`}),(0,j.jsx)(`polyline`,{points:`12 5 19 12 12 19`})]})})]}),(0,j.jsxs)(`div`,{className:`pin-options`,children:[(0,j.jsx)(ce,{checked:i,onChange:()=>a(e=>!e),label:`Show PIN`}),(0,j.jsx)(k,{type:`button`,variant:`ghost`,onClick:d,children:`Change PIN`})]})]}),c&&(0,j.jsx)(`p`,{className:`admin-pin-error`,children:c})]})]})}function Me(e){let{accounts:t,loading:n,error:i,onSelect:a}=e;return(0,j.jsx)(`div`,{className:`connect-page`,children:(0,j.jsxs)(`div`,{className:`connect-content`,children:[(0,j.jsx)(`img`,{src:s,alt:r.productName,className:`connect-logo connect-logo--maxy`}),!r.logoContainsName&&(0,j.jsx)(`h1`,{className:`connect-title`,children:r.productName}),(0,j.jsx)(`p`,{className:`connect-subtitle`,children:`Select an account`}),(0,j.jsx)(`div`,{className:`account-picker-list`,children:t.map(e=>(0,j.jsxs)(`button`,{className:`account-picker-card`,onClick:()=>a(e.accountId),disabled:n,type:`button`,children:[(0,j.jsx)(`span`,{className:`account-picker-name`,children:e.businessName||e.accountId}),(0,j.jsx)(`span`,{className:`account-picker-role`,children:e.role}),n&&(0,j.jsx)(E,{className:`account-picker-spinner`,size:16})]},e.accountId))}),i&&(0,j.jsx)(`p`,{className:`admin-pin-error`,children:i})]})})}function Ne(e){let{authPolling:t,setAuthPolling:n,authLoading:i,setAuthLoading:a,pinError:o,setPinError:c,setAppState:l}=e,[u,d]=(0,A.useState)(!1),[f,p]=(0,A.useState)(!1);async function m(){p(!0),c(``);try{let e=await(await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`launch-browser`})})).json();e.launched?d(!0):e.error&&c(e.error)}catch(e){console.error(`[admin] browser launch error:`,e),c(`Could not launch browser.`)}p(!1)}async function h(){a(!0),c(``);try{let e=await(await fetch(`/api/onboarding/claude-auth`,{method:`POST`})).json();if(e.started){n(!0),d(!0),a(!1);for(let e=0;e<120;e++)if(await new Promise(e=>setTimeout(e,2e3)),(await(await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`wait`})})).json()).authenticated){await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`stop`})}),l(`enter-pin`);return}c(`Timed out waiting for sign-in. Try again.`),n(!1)}else e.error&&c(e.error)}catch(e){console.error(`[admin] auth flow error:`,e),c(`Could not start auth flow.`)}a(!1)}async function g(){await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`stop`})}),n(!1),c(``)}return t||u?(0,j.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,height:`100dvh`,overflow:`auto`},children:[(0,j.jsxs)(`header`,{className:`chat-header`,style:{paddingBottom:`12px`,flexShrink:0,position:`relative`,maxWidth:`680px`,width:`100%`,margin:`0 auto`,padding:`24px 20px 12px`},children:[t?(0,j.jsx)(`button`,{onClick:g,style:{position:`absolute`,top:`12px`,right:`12px`,background:`none`,border:`none`,color:`#999`,fontSize:`13px`,cursor:`pointer`,padding:`4px 8px`},"aria-label":`Cancel`,children:`✕`}):(0,j.jsx)(`button`,{onClick:()=>d(!1),style:{position:`absolute`,top:`12px`,right:`12px`,background:`none`,border:`none`,color:`#999`,fontSize:`13px`,cursor:`pointer`,padding:`4px 8px`},"aria-label":`Close browser`,children:`✕`}),(0,j.jsx)(`img`,{src:`/brand/claude.png`,alt:`Claude`,className:`chat-logo`}),(0,j.jsx)(`h1`,{className:`chat-tagline`,children:`Connect Claude`}),(0,j.jsx)(`p`,{className:`chat-intro`,children:t?`Sign in and authorize in the browser below.`:`Open your email or prepare your accounts, then sign in.`}),!t&&(0,j.jsx)(`div`,{style:{marginTop:`12px`},children:(0,j.jsx)(k,{variant:`primary`,onClick:h,disabled:i,children:i?(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(`span`,{className:`spin`,style:{display:`inline-block`},children:`✱`}),` Connecting…`]}):`Sign in to Claude`})})]}),(0,j.jsx)(`div`,{style:{flex:1,display:`flex`,flexDirection:`column`,minHeight:0,gap:`10px`,padding:`0 0 16px`},children:(0,j.jsx)(`iframe`,{src:`/vnc-viewer.html`,style:{flex:1,width:`100%`,minHeight:0,border:`none`,background:`#111`,display:`block`},title:`Claude Sign-in`})}),o&&(0,j.jsx)(`p`,{className:`admin-pin-error`,style:{textAlign:`center`,padding:`0 20px 16px`},children:o})]}):(0,j.jsx)(`div`,{className:`connect-page`,children:(0,j.jsxs)(`div`,{className:`connect-content`,children:[(0,j.jsxs)(`div`,{className:`connect-logos`,children:[(0,j.jsx)(`div`,{className:`connect-logo-wrap`,children:(0,j.jsx)(`img`,{src:`/brand/claude.png`,alt:`Claude`,className:`connect-logo`})}),(0,j.jsx)(`svg`,{className:`connect-arrow`,viewBox:`0 0 48 24`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`,children:(0,j.jsx)(`path`,{d:`M0 12h44m0 0l-8-8m8 8l-8 8`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`})}),(0,j.jsxs)(`div`,{className:`connect-logo-wrap`,children:[(0,j.jsx)(`img`,{src:s,alt:r.productName,className:`connect-logo connect-logo--maxy`}),!r.logoContainsName&&(0,j.jsx)(`span`,{className:`connect-logo-label`,children:r.productName})]})]}),(0,j.jsxs)(`h1`,{className:`connect-title`,children:[`Connect Claude to power `,r.productName]}),(0,j.jsx)(`p`,{className:`connect-subtitle`,children:`Sign in with your Anthropic account to get started.`}),(0,j.jsx)(k,{variant:`primary`,onClick:h,disabled:i,children:i?(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(`span`,{className:`spin`,style:{display:`inline-block`},children:`✱`}),` Connecting…`]}):`Sign in to Claude`}),(0,j.jsx)(`p`,{style:{marginTop:`6px`,fontSize:`11px`,color:`#999`,maxWidth:`300px`,textAlign:`center`,lineHeight:`1.4`},children:`First time? You may need to sign into your email and Anthropic account in the browser before connecting.`}),(0,j.jsx)(`button`,{onClick:m,disabled:f,style:{marginTop:`12px`,background:`none`,border:`none`,color:`var(--color-primary, #666)`,fontSize:`13px`,cursor:`pointer`,textDecoration:`underline`,textUnderlineOffset:`3px`},children:f?`Launching…`:`Open browser first`}),o&&(0,j.jsx)(`p`,{className:`admin-pin-error`,children:o})]})})}var Pe=`maxy-shell-artefact-px`;function Fe(){if(typeof window>`u`)return 320;let e=window.innerWidth,t=document.querySelector(`.platform > .side`)?.getBoundingClientRect(),n=t?t.right:Math.round(e*.3);return Le(Math.round((e-n)*(2/3)))}function Ie(){if(typeof window>`u`)return 320;try{let e=window.localStorage.getItem(Pe);if(!e)return Fe();let t=parseInt(e,10);if(Number.isFinite(t)&&t>=320)return t}catch{}return Fe()}function Le(e){if(typeof window>`u`)return e;let t=window.innerWidth,n=document.querySelector(`.platform > .side`)?.getBoundingClientRect(),r=n?n.right:Math.round(t*.3),i=Math.max(320,t-r-480);return Math.min(Math.max(e,320),i)}function Re({targetSelector:e=`.platform`}){let t=(0,A.useRef)(null),[n,r]=(0,A.useState)(()=>Ie()),i=(0,A.useRef)(n);(0,A.useEffect)(()=>{let t=document.querySelector(e);!t||!(t instanceof HTMLElement)||(t.style.setProperty(`--artefact-px`,`${n}px`),i.current=n)},[n,e]);let a=(0,A.useCallback)(()=>{r(e=>{let t=Le(e);return t===e?e:t})},[]);(0,A.useEffect)(()=>(a(),window.addEventListener(`resize`,a),()=>window.removeEventListener(`resize`,a)),[a]);let o=e=>{e.preventDefault();let n=t.current;if(!n)return;n.setPointerCapture(e.pointerId),n.classList.add(`dragging`);let a=!1,o=e=>{a=!0,r(Le(Math.round(window.innerWidth-e.clientX)))},s=()=>{if(n.releasePointerCapture(e.pointerId),n.classList.remove(`dragging`),window.removeEventListener(`pointermove`,o),window.removeEventListener(`pointerup`,s),!a)return;let t=i.current;try{window.localStorage.setItem(Pe,String(t))}catch{}console.info(`[admin-ui] artefact-resize px=${t}`)};window.addEventListener(`pointermove`,o),window.addEventListener(`pointerup`,s)},s=()=>{let e=Fe();r(e);try{window.localStorage.removeItem(Pe)}catch{}console.info(`[admin-ui] artefact-resize px=${e}`)};return(0,j.jsx)(`div`,{ref:t,className:`art-resize-handle`,role:`separator`,"aria-orientation":`vertical`,"aria-label":`Resize artefact pane`,onPointerDown:o,onDoubleClick:s})}async function*ze(e,t){let n=await fetch(e,{signal:t});if(n.status===202)throw Error(`transcript not yet on disk; reopen after first turn`);if(!n.ok)throw Error(`stream-failed status=${n.status}`);let r=n.body;if(!r)throw Error(`stream-failed no-body`);let i=r.getReader(),a=new TextDecoder(`utf-8`),o=``,s=0,c=new Promise(e=>{let n={value:void 0,done:!0};if(t.aborted){e(n);return}t.addEventListener(`abort`,()=>e(n),{once:!0})});try{for(;;){if(t.aborted)return;let{value:e,done:n}=await Promise.race([i.read(),c]);if(t.aborted)return;if(n)break;o+=a.decode(e,{stream:!0});let r=o.split(`
|
|
2
2
|
`);o=r.pop()??``;for(let e of r)s++,yield Be(e,s)}let e=o+a.decode();e.length>0&&(s++,yield Be(e,s))}finally{try{await i.cancel()}catch{}}}function Be(e,t){try{return{kind:`json`,raw:e,parsed:JSON.parse(e),lineNumber:t}}catch(n){return{kind:`parse-error`,raw:e,lineNumber:t,error:n instanceof Error?n.message:String(n)}}}var Ve=28,He=240,Ue=16,We=8;function Ge(e,t){switch(t.type){case`append`:{let n=e.lines.length>=5e4?[...e.lines.slice(1),t.line]:[...e.lines,t.line],r=e.lines.length>=5e4?e.droppedCount+1:e.droppedCount;return{...e,lines:n,droppedCount:r}}case`complete`:return{...e,streamStatus:`complete`};case`error`:return{...e,streamStatus:`error`,errorMessage:t.message}}}var Ke={lines:[],droppedCount:0,streamStatus:`streaming`,errorMessage:null};function qe(e){if(e.kind===`parse-error`)return{label:`parse-error`,tone:`error`};let t=e.parsed;if(!t||typeof t!=`object`)return{label:`raw`,tone:`raw`};let n=typeof t.type==`string`?t.type:null,r=typeof t.role==`string`?t.role:null;return n===`user`||r===`user`?{label:`user`,tone:`user`}:n===`assistant`||r===`assistant`?{label:`assistant`,tone:`assistant`}:n===`tool_use`?{label:`tool_use`,tone:`tool`}:n===`tool_result`?{label:`tool_result`,tone:`tool`}:n===`system`?{label:`system`,tone:`system`}:{label:`raw`,tone:`raw`}}function Je(e,t,n){let r=He-Ve,i=0,a=Math.max(0,e-1);for(;i<a;){let e=i+a+1>>1,o=0;for(;o<t.length&&t[o]<e;)o++;e*Ve+o*r<=n?i=e:a=e-1}return i}function Ye(e){let{sessionId:t,cacheKey:n,displayName:r,liveStatus:i,onClose:a}=e,[o,s]=(0,A.useReducer)(Ge,Ke),[l,d]=(0,A.useState)(``),[f,p]=(0,A.useState)(()=>new Set),[m,h]=(0,A.useState)(0),[g,_]=(0,A.useState)(0),v=(0,A.useRef)(null),y=(0,A.useRef)(Date.now()),x=(0,A.useRef)(!0),S=(0,A.useRef)(0);(0,A.useEffect)(()=>(console.info(`[admin-ui] jsonl-viewer-open sessionId=${t.slice(0,8)} alive=${i===`alive`}`),()=>{let e=Date.now()-y.current;console.info(`[admin-ui] jsonl-viewer-close sessionId=${t.slice(0,8)} reason=unmount linesRendered=${S.current} ms=${e}`)}),[]),(0,A.useEffect)(()=>{let e=new AbortController,r=`/api/admin/claude-sessions/${encodeURIComponent(t)}/log?session_key=${encodeURIComponent(n)}&follow=1`,i=0;return(async()=>{try{for await(let n of ze(r,e.signal))n.kind===`parse-error`&&i<100&&(i++,console.warn(`[admin-ui] jsonl-viewer parse-error sessionId=${t.slice(0,8)} lineNumber=${n.lineNumber}`)),s({type:`append`,line:n});e.signal.aborted||s({type:`complete`})}catch(t){if(e.signal.aborted)return;s({type:`error`,message:t instanceof Error?t.message:String(t)})}})(),()=>e.abort()},[t,n]),(0,A.useEffect)(()=>{let e=e=>{e.key===`Escape`&&a()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[a]);let C=(0,A.useMemo)(()=>{if(l.length===0)return o.lines;let e=l.toLowerCase();return o.lines.filter(t=>(t.kind===`json`?JSON.stringify(t.parsed):t.raw).toLowerCase().includes(e))},[o.lines,l]),w=(0,A.useMemo)(()=>[...f].sort((e,t)=>e-t),[f]),T=C.length*Ve+Math.min(w.length,C.length)*(He-Ve),ee=Math.max(0,Je(C.length,w,m)-We),E=g===0?Math.min(C.length,30):Math.ceil(g/Ve)+2*We,te=Math.min(C.length,ee+E);(0,A.useLayoutEffect)(()=>{let e=v.current;e&&x.current&&(e.scrollTop=e.scrollHeight)},[C.length,T]);let ne=(0,A.useCallback)(e=>{let t=e.currentTarget;h(t.scrollTop),_(t.clientHeight),x.current=t.scrollHeight-t.scrollTop-t.clientHeight<Ue},[]),D=(0,A.useCallback)(e=>{p(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),re=(0,A.useCallback)(async e=>{await u(e)},[]),O=(0,A.useCallback)(e=>{let t=0;for(;t<w.length&&w[t]<e;)t++;return e*Ve+t*(He-Ve)},[w]),ie=Xe(o,i),ae=C.length===o.lines.length?0:o.lines.length-C.length;return S.current=o.lines.length,(0,j.jsx)(`div`,{role:`dialog`,"aria-modal":`true`,"aria-label":`JSONL viewer`,className:`modal-overlay`,onClick:e=>{e.target===e.currentTarget&&a()},children:(0,j.jsxs)(`div`,{className:`modal-card jsonl-viewer-card`,children:[(0,j.jsxs)(`header`,{className:`jsonl-viewer-header`,children:[(0,j.jsxs)(`div`,{className:`jsonl-viewer-title`,children:[(0,j.jsx)(`strong`,{children:r??`session`}),(0,j.jsx)(`span`,{"data-mono":!0,className:`jsonl-viewer-sid`,children:t.slice(0,8)})]}),(0,j.jsx)(`input`,{type:`text`,className:`jsonl-viewer-search`,placeholder:`search…`,value:l,onChange:e=>d(e.target.value),"aria-label":`Filter visible lines`}),(0,j.jsxs)(`div`,{className:`jsonl-viewer-counts`,children:[(0,j.jsxs)(`span`,{children:[C.length.toLocaleString(),` lines`]}),ae>0&&(0,j.jsxs)(`span`,{children:[` · `,ae.toLocaleString(),` hidden`]}),o.droppedCount>0&&(0,j.jsxs)(`span`,{children:[` · `,o.droppedCount.toLocaleString(),` older dropped`]})]}),(0,j.jsx)(`button`,{type:`button`,className:`action-btn`,"aria-label":`Close JSONL viewer`,onClick:a,children:(0,j.jsx)(b,{size:14})})]}),(0,j.jsx)(`div`,{ref:v,className:`jsonl-viewer-scroll`,onScroll:ne,children:(0,j.jsx)(`div`,{className:`jsonl-viewer-inner`,style:{height:T},children:C.slice(ee,te).map((e,t)=>{let n=ee+t,r=f.has(n),i=O(n),a=qe(e),o={position:`absolute`,top:i,left:0,right:0,height:r?He:Ve},s=(e.kind,e.raw.slice(0,200));return(0,j.jsxs)(`div`,{className:`jsonl-viewer-row`,"data-expanded":r||void 0,"data-tone":a.tone,style:o,children:[(0,j.jsxs)(`button`,{type:`button`,className:`jsonl-viewer-row__main`,onClick:()=>D(n),"aria-expanded":r,children:[(0,j.jsx)(`span`,{className:`jsonl-viewer-badge`,"data-tone":a.tone,children:a.label}),(0,j.jsx)(`span`,{className:`jsonl-viewer-line-no`,"data-mono":!0,children:e.lineNumber}),r?(0,j.jsxs)(`pre`,{className:`jsonl-viewer-pre`,"data-mono":!0,children:[e.kind===`json`?Ze(e.parsed):e.raw,e.kind===`parse-error`&&(0,j.jsx)(`span`,{className:`jsonl-viewer-error`,children:`\n\n[parse-error] ${e.error}`})]}):(0,j.jsx)(`span`,{className:`jsonl-viewer-preview`,"data-mono":!0,children:s})]}),(0,j.jsx)(`button`,{type:`button`,className:`jsonl-viewer-copy`,title:`Copy raw line`,onClick:()=>void re(e.raw),children:(0,j.jsx)(c,{size:12})})]},`${e.lineNumber}-${n}`)})})}),(0,j.jsx)(`footer`,{className:`jsonl-viewer-footer`,children:(0,j.jsx)(`span`,{className:`jsonl-viewer-status`,"data-tone":ie.tone,children:ie.label})})]})})}function Xe(e,t){return e.streamStatus===`error`?{label:`error: ${e.errorMessage??`stream failed`}`,tone:`error`}:t===`alive`?{label:`streaming`,tone:`streaming`}:{label:`complete`,tone:`complete`}}function Ze(e){try{return JSON.stringify(e,null,2)}catch{return String(e)}}function Qe(e){return{pid:e.pid,url:e.url,startedAt:e.startedAt,accountId:e.senderId,role:e.role,channel:e.channel,jsonlPath:e.jsonlPath,status:e.status,archived:e.archived===!0,displayName:e.displayName,titleSource:e.titleSource===`user`||e.titleSource===`ai`?e.titleSource:null,lastMessageAt:e.lastMessageAt,turnCount:e.turnCount,capped:e.capped,sizeBytes:e.sizeBytes,sessionId:e.sessionId,specialist:e.specialist,model:e.model,permissionMode:typeof e.permissionMode==`string`?e.permissionMode:null,effectivePermissionMode:typeof e.effectivePermissionMode==`string`?e.effectivePermissionMode:null}}function $e(e){if(!e)return`—`;let t=Date.parse(e);if(Number.isNaN(t))return e;let n=Date.now()-t,r=Math.round(n/1e3);if(r<60)return`${r}s ago`;let i=Math.round(r/60);if(i<60)return`${i}m ago`;let a=Math.round(i/60);return a<24?`${a}h ago`:`${Math.round(a/24)}d ago`}function et(e){return e==null?`—`:e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function tt(e,t,n){let r=e.permissionMode,i=e.effectivePermissionMode;return r===null&&i===null?`—`:i===null||i===r?r??i??`—`:(n.current!==t&&(n.current=t,console.warn(`[admin-ui] permission-mode-downgraded sessionId=${t.slice(0,8)} requested=${r??`null`} effective=${i}`)),(0,j.jsxs)(`span`,{style:{display:`inline-flex`,alignItems:`center`,gap:6},children:[(0,j.jsx)(Oe,{size:14,"aria-label":`Permission mode downgraded`,style:{color:`var(--text-warn, #b8860b)`}}),(0,j.jsx)(`span`,{children:i}),(0,j.jsxs)(`span`,{className:`text-tertiary`,children:[`(requested: `,r??`null`,`, downgraded)`]})]}))}function nt({sessionId:e,cacheKey:t,onClose:n,recentsActions:o,liveRow:s,onSessionNotFound:d}){let[f,p]=(0,A.useState)(null),[_,v]=(0,A.useState)(!0),[S,w]=(0,A.useState)(null),[ee,te]=(0,A.useState)(!1),[re,O]=(0,A.useState)(null),[ie,ae]=(0,A.useState)(null),[oe,se]=(0,A.useState)(null),[ce,le]=(0,A.useState)(!1),[k,ue]=(0,A.useState)(!1),de=(0,A.useRef)(null),fe=C(t,o,`pane`),{isPinned:pe,togglePin:me}=T(r.hostname),[he,ge]=(0,A.useState)(!1),[_e,ve]=(0,A.useState)(``),be=(0,A.useRef)(s?.status),xe=s?.status,Se=(0,A.useRef)(null),Ce=(0,A.useCallback)(async()=>{v(!0),w(null);try{let n=await fetch(`/api/admin/claude-sessions/${encodeURIComponent(e)}/meta?session_key=${encodeURIComponent(t)}`);if(n.status===404){let t=be.current??`alive`;console.info(`[admin-ui] sidebar-meta-pane-reconcile sessionId=${e.slice(0,8)} from=${t} to=gone trigger=404`),te(!0),p(null),d&&d(e);return}if(!n.ok){let e=await n.text().catch(()=>``);throw Error(`meta returned ${n.status} ${e.slice(0,200)}`)}p(Qe(await n.json())),te(!1)}catch(e){w(e instanceof Error?e.message:String(e)),console.error(`[admin-ui] sidebar-meta-pane fetch failed:`,e)}finally{v(!1)}},[e,t,d]);(0,A.useEffect)(()=>{console.info(`[admin-ui] sidebar-meta-pane sessionId=${e.slice(0,8)}`),Ce()},[Ce,e]),(0,A.useEffect)(()=>{let t=be.current;if(be.current=xe,!(t===void 0&&xe!==void 0)&&t!==xe){if(t===`alive`&&xe===`ended`){console.info(`[admin-ui] sidebar-meta-pane-reconcile sessionId=${e.slice(0,8)} from=alive to=ended trigger=list-flip`),Ce();return}if(t!==void 0&&xe===void 0){console.info(`[admin-ui] sidebar-meta-pane-reconcile sessionId=${e.slice(0,8)} from=${t} to=gone trigger=list-flip`),Ce();return}}},[xe,Ce,e]),(0,A.useEffect)(()=>{if(!ce)return;let e=e=>{de.current&&!de.current.contains(e.target)&&le(!1)},t=e=>{e.key===`Escape`&&le(!1)};return document.addEventListener(`mousedown`,e),window.addEventListener(`keydown`,t),()=>{document.removeEventListener(`mousedown`,e),window.removeEventListener(`keydown`,t)}},[ce]);let we=(0,A.useCallback)(async(e,t)=>{O(await u(t)?`Copied ${e}`:`Copy failed`),window.setTimeout(()=>O(null),1500)},[]),Te=(0,A.useCallback)(()=>{let n=`/api/admin/claude-sessions/${encodeURIComponent(e)}/log?session_key=${encodeURIComponent(t)}&download=1`;try{let t=document.createElement(`a`);t.href=n,t.download=``,t.rel=`noopener`,document.body.appendChild(t),t.click(),document.body.removeChild(t),console.info(`[admin-ui] pane-download-jsonl sessionId=${e.slice(0,8)} outcome=initiated`)}catch(t){let n=t instanceof Error?t.message:String(t);console.error(`[admin-ui] pane-download-jsonl sessionId=${e.slice(0,8)} outcome=error reason=${n}`),ae(`Download failed: ${n}`)}},[e,t]),De=(0,A.useCallback)(async(e,t,r)=>{ae(null);let i=e===`resume`?await fe.resume(t):e===`end`?await fe.end(t):e===`purge`?await fe.purge(t):e===`archive`?await fe.archive(t):await fe.unarchive(t);if(!i.ok){ae(i.error??`action failed`);return}r&&n()},[fe,n]);if(ee&&s===void 0)return(0,j.jsxs)(`main`,{className:`session-meta-pane`,style:{padding:24,display:`flex`,flexDirection:`column`,gap:12},children:[(0,j.jsx)(`p`,{style:{margin:0,fontSize:13,color:`var(--text-secondary)`},children:`Session ended without a transcript. Close this pane.`}),(0,j.jsx)(`div`,{children:(0,j.jsxs)(`button`,{type:`button`,className:`action-btn`,onClick:n,children:[(0,j.jsx)(b,{size:14}),` Close`]})})]});if(_&&!f)return(0,j.jsx)(`main`,{className:`session-meta-pane`,style:{padding:24},children:(0,j.jsx)(E,{size:16,className:`spinning`})});if(S&&!f)return(0,j.jsxs)(`main`,{className:`session-meta-pane`,style:{padding:24},children:[(0,j.jsx)(`p`,{style:{color:`var(--text-tertiary)`},children:S}),(0,j.jsx)(`button`,{type:`button`,className:`action-btn`,onClick:()=>void Ce(),children:`Retry`})]});if(!f)return null;let Oe=f.status===`alive`,ke=pe(e),Ae=fe.inFlight,je=f.url?f.url.match(/session_[A-Za-z0-9]+/)?.[0]??null:null;return(0,j.jsxs)(`main`,{className:`session-meta-pane`,style:{padding:24,display:`flex`,flexDirection:`column`,gap:20,overflowY:`auto`},children:[(0,j.jsxs)(`header`,{style:{display:`flex`,alignItems:`center`,gap:12},children:[he?(0,j.jsx)(`input`,{type:`text`,value:_e,autoFocus:!0,maxLength:200,onChange:e=>ve(e.target.value),onKeyDown:async t=>{if(t.key===`Enter`){t.preventDefault();let n=_e.trim();if(n.length===0||!y(n)){ge(!1);return}if(n===(f.displayName??``)){ge(!1);return}let r=await fe.rename(e,n);r.ok?p(e=>e&&{...e,displayName:n,titleSource:`user`}):console.error(`[admin-ui] pane-rename failed: ${r.error}`),ge(!1)}else t.key===`Escape`&&(t.preventDefault(),ge(!1))},onBlur:async()=>{let t=_e.trim();if(t.length===0||!y(t)||t===(f.displayName??``)){ge(!1);return}let n=await fe.rename(e,t);n.ok?p(e=>e&&{...e,displayName:t,titleSource:`user`}):console.error(`[admin-ui] pane-rename failed: ${n.error}`),ge(!1)},"aria-label":`Rename session`,style:{fontSize:22,fontWeight:600,flex:1,background:`transparent`,border:`1px solid var(--border, #888)`,borderRadius:4,padding:`2px 6px`,color:`inherit`,font:`inherit`,minWidth:0}}):(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(`h2`,{style:{fontSize:22,fontWeight:600,margin:0,flex:1},children:f.displayName??(0,j.jsx)(`span`,{style:{color:`var(--text-tertiary)`},children:`(unnamed)`})}),f.titleSource&&(0,j.jsx)(`span`,{style:{fontSize:11,color:`var(--text-tertiary)`},children:f.titleSource===`user`?`set by you`:`set by Claude`}),(0,j.jsx)(`button`,{type:`button`,className:`icon-btn`,"aria-label":`Rename session`,title:`Rename`,onClick:()=>{ve(f.displayName??``),ge(!0)},children:(0,j.jsx)(g,{size:16})})]}),(0,j.jsx)(`button`,{type:`button`,className:`icon-btn`,"aria-label":`Close pane`,onClick:n,children:(0,j.jsx)(b,{size:18})})]}),(0,j.jsx)(`section`,{children:(0,j.jsxs)(`dl`,{className:`meta-dl`,children:[(0,j.jsx)(`dt`,{children:`Status`}),(0,j.jsx)(`dd`,{children:Oe?`alive · pid ${f.pid??`?`}`:`ended`}),(0,j.jsx)(`dt`,{children:`Agent`}),(0,j.jsx)(`dd`,{children:f.specialist??`admin`}),(0,j.jsx)(`dt`,{title:`Permission mode. The operator's spawn-time choice is the requested mode; the binary may downgrade auto to default at runtime if the auto-mode opt-in isn't satisfied.`,children:`Mode`}),(0,j.jsx)(`dd`,{children:tt(f,e,Se)}),(0,j.jsx)(`dt`,{title:`Model id from the most recent assistant turn in the JSONL tail. Null until the first assistant turn flushes; reflects the latest model used (claude can downgrade mid-session).`,children:`Model`}),(0,j.jsx)(`dd`,{children:f.model??`—`}),(0,j.jsx)(`dt`,{title:`Claude's session — one identity, two phases: bridge suffix from claude.ai/code/<session_xxx> and the JSONL basename UUID on disk. Both reconcile to the same row.`,children:`sessionId`}),(0,j.jsxs)(`dd`,{"data-mono":!0,children:[(0,j.jsx)(`span`,{children:e}),(0,j.jsx)(`button`,{type:`button`,className:`icon-btn`,"aria-label":`Copy sessionId`,onClick:()=>void we(`sessionId`,e),children:(0,j.jsx)(c,{size:12})})]}),(0,j.jsx)(`dt`,{children:`Started at`}),(0,j.jsxs)(`dd`,{children:[f.startedAt,` `,(0,j.jsxs)(`span`,{className:`text-tertiary`,children:[`(`,$e(f.startedAt),`)`]})]}),(0,j.jsx)(`dt`,{children:`Last message`}),(0,j.jsx)(`dd`,{children:f.lastMessageAt?(0,j.jsxs)(j.Fragment,{children:[f.lastMessageAt,` `,(0,j.jsxs)(`span`,{className:`text-tertiary`,children:[`(`,$e(f.lastMessageAt),`)`]})]}):`—`}),(0,j.jsx)(`dt`,{children:`Turns`}),(0,j.jsxs)(`dd`,{children:[f.turnCount,f.capped?(0,j.jsx)(`span`,{className:`text-tertiary`,children:` (≥, JSONL exceeds tail-read cap)`}):null]}),(0,j.jsx)(`dt`,{children:`JSONL size`}),(0,j.jsx)(`dd`,{children:et(f.sizeBytes)}),(0,j.jsx)(`dt`,{children:`JSONL path`}),(0,j.jsxs)(`dd`,{"data-mono":!0,children:[(0,j.jsx)(`span`,{children:f.jsonlPath??`—`}),f.jsonlPath&&(0,j.jsx)(`button`,{type:`button`,className:`icon-btn`,"aria-label":`Copy JSONL path`,onClick:()=>void we(`path`,f.jsonlPath),children:(0,j.jsx)(c,{size:12})})]}),(0,j.jsx)(`dt`,{children:`Session URL`}),(0,j.jsxs)(`dd`,{"data-mono":!0,children:[(0,j.jsx)(`span`,{children:f.url??`—`}),f.url&&(0,j.jsx)(`button`,{type:`button`,className:`icon-btn`,"aria-label":`Copy URL`,onClick:()=>void we(`URL`,f.url),children:(0,j.jsx)(c,{size:12})})]}),(0,j.jsx)(`dt`,{title:"Cross-surface identifier — the `session_xxx` segment from the claude.ai/code URL. Operators use this to map a browser URL back to a row.",children:`Bridge id`}),(0,j.jsxs)(`dd`,{"data-mono":!0,children:[(0,j.jsx)(`span`,{children:je??`—`}),je&&(0,j.jsx)(`button`,{type:`button`,className:`icon-btn`,"aria-label":`Copy Bridge id`,onClick:()=>void we(`Bridge id`,je),children:(0,j.jsx)(c,{size:12})})]}),(0,j.jsx)(`dt`,{children:`Channel`}),(0,j.jsx)(`dd`,{children:f.channel??`—`}),(0,j.jsx)(`dt`,{children:`Role`}),(0,j.jsx)(`dd`,{children:f.role??`—`}),(0,j.jsx)(`dt`,{title:"Account / workspace UUID. Manager API still calls this `senderId` on the wire (channel-agnostic field).",children:`accountId`}),(0,j.jsx)(`dd`,{"data-mono":!0,children:(0,j.jsx)(`span`,{children:f.accountId||`—`})})]})}),(()=>{let t=[];return f.url&&t.push((0,j.jsxs)(`button`,{type:`button`,className:`action-btn`,onClick:()=>window.open(f.url,`_blank`,`noopener,noreferrer`),children:[(0,j.jsx)(ne,{size:14}),` Open in new tab`]},`open-tab`)),f.jsonlPath&&t.push((0,j.jsxs)(`button`,{type:`button`,className:`action-btn`,title:`Download the JSONL transcript file`,onClick:()=>Te(),children:[(0,j.jsx)(l,{size:14}),` Download JSONL`]},`download-jsonl`),(0,j.jsxs)(`button`,{type:`button`,className:`action-btn`,title:`View the JSONL transcript in-app`,onClick:()=>ue(!0),children:[(0,j.jsx)(D,{size:14}),` View JSONL`]},`view-jsonl`)),Oe||t.push((0,j.jsxs)(`button`,{type:`button`,className:`action-btn`,"data-variant":`primary`,disabled:Ae===`resume`,onClick:()=>void De(`resume`,e,!1),children:[Ae===`resume`?(0,j.jsx)(E,{size:14,className:`spinning`}):(0,j.jsx)(a,{size:14}),` Resume`]},`resume`)),t.push((0,j.jsxs)(`button`,{type:`button`,className:`action-btn`,"data-active":ke?`true`:void 0,onClick:()=>me(e),children:[(0,j.jsx)(Ee,{size:14}),` `,ke?`Unpin`:`Pin`]},`pin`),f.archived?(0,j.jsxs)(`button`,{type:`button`,className:`action-btn`,disabled:Ae===`unarchive`,onClick:()=>void De(`unarchive`,e,!0),children:[Ae===`unarchive`?(0,j.jsx)(E,{size:14,className:`spinning`}):(0,j.jsx)(m,{size:14}),` Unarchive`]},`archive`):(0,j.jsxs)(`button`,{type:`button`,className:`action-btn`,disabled:Ae===`archive`,onClick:()=>{Oe?se({action:`archive-alive`,sessionId:e,displayName:f.displayName}):De(`archive`,e,!0)},children:[Ae===`archive`?(0,j.jsx)(E,{size:14,className:`spinning`}):(0,j.jsx)(h,{size:14}),` Archive`]},`archive`)),t.push(Oe?(0,j.jsxs)(`button`,{type:`button`,className:`action-btn`,"data-variant":`danger`,disabled:Ae===`end`,onClick:()=>se({action:`end`,sessionId:e,displayName:f.displayName}),children:[(0,j.jsx)(x,{size:14}),` End session`]},`end`):(0,j.jsxs)(`button`,{type:`button`,className:`action-btn`,"data-variant":`danger`,disabled:Ae===`purge`,onClick:()=>se({action:`purge`,sessionId:e,displayName:f.displayName}),children:[(0,j.jsx)(i,{size:14}),` Purge JSONL`]},`purge`)),(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(`section`,{className:`action-bar`,children:t}),(0,j.jsxs)(`section`,{className:`session-actions-overflow`,ref:de,children:[(0,j.jsx)(`button`,{type:`button`,className:`session-actions-overflow__trigger`,"aria-label":`Actions`,"aria-haspopup":`menu`,"aria-expanded":ce,onClick:()=>{le(t=>{let n=!t;return n&&console.info(`[admin-ui] pane-actions-overflow-open sessionId=${e.slice(0,8)}`),n})},children:(0,j.jsx)(ye,{size:14})}),ce&&(0,j.jsx)(`div`,{className:`overflow-popover`,role:`menu`,onClick:()=>le(!1),children:t})]})]})})(),re&&(0,j.jsx)(`div`,{style:{color:`var(--text-tertiary)`,fontSize:12},children:re}),ie&&(0,j.jsx)(it,{message:ie,onClose:()=>ae(null)}),k&&f.jsonlPath&&(0,j.jsx)(Ye,{sessionId:e,cacheKey:t,displayName:f.displayName,liveStatus:f.status,onClose:()=>ue(!1)}),S&&(0,j.jsx)(`div`,{style:{color:`var(--text-tertiary)`,fontSize:12},children:S}),oe&&(0,j.jsx)(rt,{confirm:oe,busy:oe.action===`archive-alive`?Ae===`end`||Ae===`archive`:Ae===oe.action,onCancel:()=>se(null),onConfirm:async()=>{if(oe.action===`archive-alive`){ae(null);let e=await fe.end(oe.sessionId);if(!e.ok){ae(e.error??`failed to end session`),se(null);return}let t=await fe.archive(oe.sessionId);if(!t.ok){ae(t.error??`failed to archive session`),se(null);return}se(null),n();return}await De(oe.action,oe.sessionId,oe.action===`purge`),se(null)}})]})}function rt({confirm:e,busy:t,onCancel:n,onConfirm:r}){let i,a,o,s=e.displayName??e.sessionId.slice(0,8);switch(e.action){case`end`:i=`End live session?`,a=`This kills the PTY for ${s}. The JSONL is kept on disk and can be resumed later.`,o=`End session`;break;case`purge`:i=`Purge session JSONL?`,a=`This hard-deletes the transcript for ${s}. The action cannot be undone.`,o=`Purge`;break;case`archive-alive`:i=`Session is still running`,a=`End ${s} before archiving? The JSONL is kept and the row moves to the archive.`,o=`End and archive`;break}return(0,j.jsx)(`div`,{role:`dialog`,"aria-modal":`true`,className:`modal-overlay`,onClick:e=>{e.target===e.currentTarget&&!t&&n()},children:(0,j.jsxs)(`div`,{className:`modal-card`,children:[(0,j.jsx)(`h3`,{style:{margin:0,marginBottom:8,fontSize:16,fontWeight:600},children:i}),(0,j.jsx)(`p`,{style:{margin:0,marginBottom:12,fontSize:13},children:a}),(0,j.jsxs)(`div`,{className:`modal-action-row`,children:[(0,j.jsx)(`button`,{type:`button`,className:`modal-action-btn`,disabled:t,onClick:n,children:`Cancel`}),(0,j.jsx)(`button`,{type:`button`,className:`modal-action-btn`,"data-variant":`danger`,disabled:t,onClick:()=>r(),children:t?(0,j.jsx)(E,{size:13,className:`spinning`}):o})]})]})})}function it({message:e,onClose:t}){return(0,j.jsx)(`div`,{role:`alertdialog`,"aria-modal":`true`,className:`modal-overlay`,onClick:e=>{e.target===e.currentTarget&&t()},children:(0,j.jsxs)(`div`,{className:`modal-card`,children:[(0,j.jsx)(`h3`,{style:{margin:0,marginBottom:8,fontSize:16,fontWeight:600},children:`Action failed`}),(0,j.jsx)(`p`,{style:{margin:0,marginBottom:12,fontSize:13,wordBreak:`break-word`},children:e}),(0,j.jsx)(`div`,{className:`modal-action-row`,children:(0,j.jsx)(`button`,{type:`button`,className:`modal-action-btn`,onClick:t,children:`OK`})})]})})}function at({onOpen:e}){return(0,j.jsx)(`footer`,{className:`admin-footer`,children:(0,j.jsxs)(`div`,{className:`powered-by`,role:`button`,tabIndex:0,onClick:e,onKeyDown:t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),e())},"aria-label":`Powered by Claude Code — show details`,children:[(0,j.jsx)(`img`,{src:`/brand/claude.png`,alt:`Claude`,className:`powered-by-icon`}),(0,j.jsx)(`span`,{children:`Powered by Claude Code`})]})})}var ot=t((e=>{var t=p();function n(e,t){return e===t&&(e!==0||1/e==1/t)||e!==e&&t!==t}var r=typeof Object.is==`function`?Object.is:n,i=t.useState,a=t.useEffect,o=t.useLayoutEffect,s=t.useDebugValue;function c(e,t){var n=t(),r=i({inst:{value:n,getSnapshot:t}}),c=r[0].inst,u=r[1];return o(function(){c.value=n,c.getSnapshot=t,l(c)&&u({inst:c})},[e,n,t]),a(function(){return l(c)&&u({inst:c}),e(function(){l(c)&&u({inst:c})})},[e]),s(n),n}function l(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!r(e,n)}catch{return!0}}function u(e,t){return t()}var d=typeof window>`u`||window.document===void 0||window.document.createElement===void 0?u:c;e.useSyncExternalStore=t.useSyncExternalStore===void 0?d:t.useSyncExternalStore})),st=t(((e,t)=>{t.exports=ot()})),ct=st(),lt=e(f(),1);function ut(e){this.content=e}ut.prototype={constructor:ut,find:function(e){for(var t=0;t<this.content.length;t+=2)if(this.content[t]===e)return t;return-1},get:function(e){var t=this.find(e);return t==-1?void 0:this.content[t+1]},update:function(e,t,n){var r=n&&n!=e?this.remove(n):this,i=r.find(e),a=r.content.slice();return i==-1?a.push(n||e,t):(a[i+1]=t,n&&(a[i]=n)),new ut(a)},remove:function(e){var t=this.find(e);if(t==-1)return this;var n=this.content.slice();return n.splice(t,2),new ut(n)},addToStart:function(e,t){return new ut([e,t].concat(this.remove(e).content))},addToEnd:function(e,t){var n=this.remove(e).content.slice();return n.push(e,t),new ut(n)},addBefore:function(e,t,n){var r=this.remove(t),i=r.content.slice(),a=r.find(e);return i.splice(a==-1?i.length:a,0,t,n),new ut(i)},forEach:function(e){for(var t=0;t<this.content.length;t+=2)e(this.content[t],this.content[t+1])},prepend:function(e){return e=ut.from(e),e.size?new ut(e.content.concat(this.subtract(e).content)):this},append:function(e){return e=ut.from(e),e.size?new ut(this.subtract(e).content.concat(e.content)):this},subtract:function(e){var t=this;e=ut.from(e);for(var n=0;n<e.content.length;n+=2)t=t.remove(e.content[n]);return t},toObject:function(){var e={};return this.forEach(function(t,n){e[t]=n}),e},get size(){return this.content.length>>1}},ut.from=function(e){if(e instanceof ut)return e;var t=[];if(e)for(var n in e)t.push(n,e[n]);return new ut(t)};function dt(e,t,n){for(let r=0;;r++){if(r==e.childCount||r==t.childCount)return e.childCount==t.childCount?null:n;let i=e.child(r),a=t.child(r);if(i==a){n+=i.nodeSize;continue}if(!i.sameMarkup(a))return n;if(i.isText&&i.text!=a.text){for(let e=0;i.text[e]==a.text[e];e++)n++;return n}if(i.content.size||a.content.size){let e=dt(i.content,a.content,n+1);if(e!=null)return e}n+=i.nodeSize}}function ft(e,t,n,r){for(let i=e.childCount,a=t.childCount;;){if(i==0||a==0)return i==a?null:{a:n,b:r};let o=e.child(--i),s=t.child(--a),c=o.nodeSize;if(o==s){n-=c,r-=c;continue}if(!o.sameMarkup(s))return{a:n,b:r};if(o.isText&&o.text!=s.text){let e=0,t=Math.min(o.text.length,s.text.length);for(;e<t&&o.text[o.text.length-e-1]==s.text[s.text.length-e-1];)e++,n--,r--;return{a:n,b:r}}if(o.content.size||s.content.size){let e=ft(o.content,s.content,n-1,r-1);if(e)return e}n-=c,r-=c}}var M=class e{constructor(e,t){if(this.content=e,this.size=t||0,t==null)for(let t=0;t<e.length;t++)this.size+=e[t].nodeSize}nodesBetween(e,t,n,r=0,i){for(let a=0,o=0;o<t;a++){let s=this.content[a],c=o+s.nodeSize;if(c>e&&n(s,r+o,i||null,a)!==!1&&s.content.size){let i=o+1;s.nodesBetween(Math.max(0,e-i),Math.min(s.content.size,t-i),n,r+i)}o=c}}descendants(e){this.nodesBetween(0,this.size,e)}textBetween(e,t,n,r){let i=``,a=!0;return this.nodesBetween(e,t,(o,s)=>{let c=o.isText?o.text.slice(Math.max(e,s)-s,t-s):o.isLeaf?r?typeof r==`function`?r(o):r:o.type.spec.leafText?o.type.spec.leafText(o):``:``;o.isBlock&&(o.isLeaf&&c||o.isTextblock)&&n&&(a?a=!1:i+=n),i+=c},0),i}append(t){if(!t.size)return this;if(!this.size)return t;let n=this.lastChild,r=t.firstChild,i=this.content.slice(),a=0;for(n.isText&&n.sameMarkup(r)&&(i[i.length-1]=n.withText(n.text+r.text),a=1);a<t.content.length;a++)i.push(t.content[a]);return new e(i,this.size+t.size)}cut(t,n=this.size){if(t==0&&n==this.size)return this;let r=[],i=0;if(n>t)for(let e=0,a=0;a<n;e++){let o=this.content[e],s=a+o.nodeSize;s>t&&((a<t||s>n)&&(o=o.isText?o.cut(Math.max(0,t-a),Math.min(o.text.length,n-a)):o.cut(Math.max(0,t-a-1),Math.min(o.content.size,n-a-1))),r.push(o),i+=o.nodeSize),a=s}return new e(r,i)}cutByIndex(t,n){return t==n?e.empty:t==0&&n==this.content.length?this:new e(this.content.slice(t,n))}replaceChild(t,n){let r=this.content[t];if(r==n)return this;let i=this.content.slice(),a=this.size+n.nodeSize-r.nodeSize;return i[t]=n,new e(i,a)}addToStart(t){return new e([t].concat(this.content),this.size+t.nodeSize)}addToEnd(t){return new e(this.content.concat(t),this.size+t.nodeSize)}eq(e){if(this.content.length!=e.content.length)return!1;for(let t=0;t<this.content.length;t++)if(!this.content[t].eq(e.content[t]))return!1;return!0}get firstChild(){return this.content.length?this.content[0]:null}get lastChild(){return this.content.length?this.content[this.content.length-1]:null}get childCount(){return this.content.length}child(e){let t=this.content[e];if(!t)throw RangeError(`Index `+e+` out of range for `+this);return t}maybeChild(e){return this.content[e]||null}forEach(e){for(let t=0,n=0;t<this.content.length;t++){let r=this.content[t];e(r,n,t),n+=r.nodeSize}}findDiffStart(e,t=0){return dt(this,e,t)}findDiffEnd(e,t=this.size,n=e.size){return ft(this,e,t,n)}findIndex(e){if(e==0)return mt(0,e);if(e==this.size)return mt(this.content.length,e);if(e>this.size||e<0)throw RangeError(`Position ${e} outside of fragment (${this})`);for(let t=0,n=0;;t++){let r=this.child(t),i=n+r.nodeSize;if(i>=e)return i==e?mt(t+1,i):mt(t,n);n=i}}toString(){return`<`+this.toStringInner()+`>`}toStringInner(){return this.content.join(`, `)}toJSON(){return this.content.length?this.content.map(e=>e.toJSON()):null}static fromJSON(t,n){if(!n)return e.empty;if(!Array.isArray(n))throw RangeError(`Invalid input for Fragment.fromJSON`);return new e(n.map(t.nodeFromJSON))}static fromArray(t){if(!t.length)return e.empty;let n,r=0;for(let e=0;e<t.length;e++){let i=t[e];r+=i.nodeSize,e&&i.isText&&t[e-1].sameMarkup(i)?(n||=t.slice(0,e),n[n.length-1]=i.withText(n[n.length-1].text+i.text)):n&&n.push(i)}return new e(n||t,r)}static from(t){if(!t)return e.empty;if(t instanceof e)return t;if(Array.isArray(t))return this.fromArray(t);if(t.attrs)return new e([t],t.nodeSize);throw RangeError(`Can not convert `+t+` to a Fragment`+(t.nodesBetween?` (looks like multiple versions of prosemirror-model were loaded)`:``))}};M.empty=new M([],0);var pt={index:0,offset:0};function mt(e,t){return pt.index=e,pt.offset=t,pt}function ht(e,t){if(e===t)return!0;if(!(e&&typeof e==`object`)||!(t&&typeof t==`object`))return!1;let n=Array.isArray(e);if(Array.isArray(t)!=n)return!1;if(n){if(e.length!=t.length)return!1;for(let n=0;n<e.length;n++)if(!ht(e[n],t[n]))return!1}else{for(let n in e)if(!(n in t)||!ht(e[n],t[n]))return!1;for(let n in t)if(!(n in e))return!1}return!0}var N=class e{constructor(e,t){this.type=e,this.attrs=t}addToSet(e){let t,n=!1;for(let r=0;r<e.length;r++){let i=e[r];if(this.eq(i))return e;if(this.type.excludes(i.type))t||=e.slice(0,r);else if(i.type.excludes(this.type))return e;else !n&&i.type.rank>this.type.rank&&(t||=e.slice(0,r),t.push(this),n=!0),t&&t.push(i)}return t||=e.slice(),n||t.push(this),t}removeFromSet(e){for(let t=0;t<e.length;t++)if(this.eq(e[t]))return e.slice(0,t).concat(e.slice(t+1));return e}isInSet(e){for(let t=0;t<e.length;t++)if(this.eq(e[t]))return!0;return!1}eq(e){return this==e||this.type==e.type&&ht(this.attrs,e.attrs)}toJSON(){let e={type:this.type.name};for(let t in this.attrs){e.attrs=this.attrs;break}return e}static fromJSON(e,t){if(!t)throw RangeError(`Invalid input for Mark.fromJSON`);let n=e.marks[t.type];if(!n)throw RangeError(`There is no mark type ${t.type} in this schema`);let r=n.create(t.attrs);return n.checkAttrs(r.attrs),r}static sameSet(e,t){if(e==t)return!0;if(e.length!=t.length)return!1;for(let n=0;n<e.length;n++)if(!e[n].eq(t[n]))return!1;return!0}static setFrom(t){if(!t||Array.isArray(t)&&t.length==0)return e.none;if(t instanceof e)return[t];let n=t.slice();return n.sort((e,t)=>e.type.rank-t.type.rank),n}};N.none=[];var gt=class extends Error{},P=class e{constructor(e,t,n){this.content=e,this.openStart=t,this.openEnd=n}get size(){return this.content.size-this.openStart-this.openEnd}insertAt(t,n){let r=vt(this.content,t+this.openStart,n);return r&&new e(r,this.openStart,this.openEnd)}removeBetween(t,n){return new e(_t(this.content,t+this.openStart,n+this.openStart),this.openStart,this.openEnd)}eq(e){return this.content.eq(e.content)&&this.openStart==e.openStart&&this.openEnd==e.openEnd}toString(){return this.content+`(`+this.openStart+`,`+this.openEnd+`)`}toJSON(){if(!this.content.size)return null;let e={content:this.content.toJSON()};return this.openStart>0&&(e.openStart=this.openStart),this.openEnd>0&&(e.openEnd=this.openEnd),e}static fromJSON(t,n){if(!n)return e.empty;let r=n.openStart||0,i=n.openEnd||0;if(typeof r!=`number`||typeof i!=`number`)throw RangeError(`Invalid input for Slice.fromJSON`);return new e(M.fromJSON(t,n.content),r,i)}static maxOpen(t,n=!0){let r=0,i=0;for(let e=t.firstChild;e&&!e.isLeaf&&(n||!e.type.spec.isolating);e=e.firstChild)r++;for(let e=t.lastChild;e&&!e.isLeaf&&(n||!e.type.spec.isolating);e=e.lastChild)i++;return new e(t,r,i)}};P.empty=new P(M.empty,0,0);function _t(e,t,n){let{index:r,offset:i}=e.findIndex(t),a=e.maybeChild(r),{index:o,offset:s}=e.findIndex(n);if(i==t||a.isText){if(s!=n&&!e.child(o).isText)throw RangeError(`Removing non-flat range`);return e.cut(0,t).append(e.cut(n))}if(r!=o)throw RangeError(`Removing non-flat range`);return e.replaceChild(r,a.copy(_t(a.content,t-i-1,n-i-1)))}function vt(e,t,n,r){let{index:i,offset:a}=e.findIndex(t),o=e.maybeChild(i);if(a==t||o.isText)return r&&!r.canReplace(i,i,n)?null:e.cut(0,t).append(n).append(e.cut(t));let s=vt(o.content,t-a-1,n,o);return s&&e.replaceChild(i,o.copy(s))}function yt(e,t,n){if(n.openStart>e.depth)throw new gt(`Inserted content deeper than insertion position`);if(e.depth-n.openStart!=t.depth-n.openEnd)throw new gt(`Inconsistent open depths`);return bt(e,t,n,0)}function bt(e,t,n,r){let i=e.index(r),a=e.node(r);if(i==t.index(r)&&r<e.depth-n.openStart){let o=bt(e,t,n,r+1);return a.copy(a.content.replaceChild(i,o))}else if(!n.content.size)return Tt(a,Dt(e,t,r));else if(!n.openStart&&!n.openEnd&&e.depth==r&&t.depth==r){let r=e.parent,i=r.content;return Tt(r,i.cut(0,e.parentOffset).append(n.content).append(i.cut(t.parentOffset)))}else{let{start:i,end:o}=Ot(n,e);return Tt(a,Et(e,i,o,t,r))}}function xt(e,t){if(!t.type.compatibleContent(e.type))throw new gt(`Cannot join `+t.type.name+` onto `+e.type.name)}function St(e,t,n){let r=e.node(n);return xt(r,t.node(n)),r}function Ct(e,t){let n=t.length-1;n>=0&&e.isText&&e.sameMarkup(t[n])?t[n]=e.withText(t[n].text+e.text):t.push(e)}function wt(e,t,n,r){let i=(t||e).node(n),a=0,o=t?t.index(n):i.childCount;e&&(a=e.index(n),e.depth>n?a++:e.textOffset&&(Ct(e.nodeAfter,r),a++));for(let e=a;e<o;e++)Ct(i.child(e),r);t&&t.depth==n&&t.textOffset&&Ct(t.nodeBefore,r)}function Tt(e,t){return e.type.checkContent(t),e.copy(t)}function Et(e,t,n,r,i){let a=e.depth>i&&St(e,t,i+1),o=r.depth>i&&St(n,r,i+1),s=[];return wt(null,e,i,s),a&&o&&t.index(i)==n.index(i)?(xt(a,o),Ct(Tt(a,Et(e,t,n,r,i+1)),s)):(a&&Ct(Tt(a,Dt(e,t,i+1)),s),wt(t,n,i,s),o&&Ct(Tt(o,Dt(n,r,i+1)),s)),wt(r,null,i,s),new M(s)}function Dt(e,t,n){let r=[];return wt(null,e,n,r),e.depth>n&&Ct(Tt(St(e,t,n+1),Dt(e,t,n+1)),r),wt(t,null,n,r),new M(r)}function Ot(e,t){let n=t.depth-e.openStart,r=t.node(n).copy(e.content);for(let e=n-1;e>=0;e--)r=t.node(e).copy(M.from(r));return{start:r.resolveNoCache(e.openStart+n),end:r.resolveNoCache(r.content.size-e.openEnd-n)}}var kt=class e{constructor(e,t,n){this.pos=e,this.path=t,this.parentOffset=n,this.depth=t.length/3-1}resolveDepth(e){return e==null?this.depth:e<0?this.depth+e:e}get parent(){return this.node(this.depth)}get doc(){return this.node(0)}node(e){return this.path[this.resolveDepth(e)*3]}index(e){return this.path[this.resolveDepth(e)*3+1]}indexAfter(e){return e=this.resolveDepth(e),this.index(e)+(e==this.depth&&!this.textOffset?0:1)}start(e){return e=this.resolveDepth(e),e==0?0:this.path[e*3-1]+1}end(e){return e=this.resolveDepth(e),this.start(e)+this.node(e).content.size}before(e){if(e=this.resolveDepth(e),!e)throw RangeError(`There is no position before the top-level node`);return e==this.depth+1?this.pos:this.path[e*3-1]}after(e){if(e=this.resolveDepth(e),!e)throw RangeError(`There is no position after the top-level node`);return e==this.depth+1?this.pos:this.path[e*3-1]+this.path[e*3].nodeSize}get textOffset(){return this.pos-this.path[this.path.length-1]}get nodeAfter(){let e=this.parent,t=this.index(this.depth);if(t==e.childCount)return null;let n=this.pos-this.path[this.path.length-1],r=e.child(t);return n?e.child(t).cut(n):r}get nodeBefore(){let e=this.index(this.depth),t=this.pos-this.path[this.path.length-1];return t?this.parent.child(e).cut(0,t):e==0?null:this.parent.child(e-1)}posAtIndex(e,t){t=this.resolveDepth(t);let n=this.path[t*3],r=t==0?0:this.path[t*3-1]+1;for(let t=0;t<e;t++)r+=n.child(t).nodeSize;return r}marks(){let e=this.parent,t=this.index();if(e.content.size==0)return N.none;if(this.textOffset)return e.child(t).marks;let n=e.maybeChild(t-1),r=e.maybeChild(t);if(!n){let e=n;n=r,r=e}let i=n.marks;for(var a=0;a<i.length;a++)i[a].type.spec.inclusive===!1&&(!r||!i[a].isInSet(r.marks))&&(i=i[a--].removeFromSet(i));return i}marksAcross(e){let t=this.parent.maybeChild(this.index());if(!t||!t.isInline)return null;let n=t.marks,r=e.parent.maybeChild(e.index());for(var i=0;i<n.length;i++)n[i].type.spec.inclusive===!1&&(!r||!n[i].isInSet(r.marks))&&(n=n[i--].removeFromSet(n));return n}sharedDepth(e){for(let t=this.depth;t>0;t--)if(this.start(t)<=e&&this.end(t)>=e)return t;return 0}blockRange(e=this,t){if(e.pos<this.pos)return e.blockRange(this);for(let n=this.depth-(this.parent.inlineContent||this.pos==e.pos?1:0);n>=0;n--)if(e.pos<=this.end(n)&&(!t||t(this.node(n))))return new Nt(this,e,n);return null}sameParent(e){return this.pos-this.parentOffset==e.pos-e.parentOffset}max(e){return e.pos>this.pos?e:this}min(e){return e.pos<this.pos?e:this}toString(){let e=``;for(let t=1;t<=this.depth;t++)e+=(e?`/`:``)+this.node(t).type.name+`_`+this.index(t-1);return e+`:`+this.parentOffset}static resolve(t,n){if(!(n>=0&&n<=t.content.size))throw RangeError(`Position `+n+` out of range`);let r=[],i=0,a=n;for(let e=t;;){let{index:t,offset:n}=e.content.findIndex(a),o=a-n;if(r.push(e,t,i+n),!o||(e=e.child(t),e.isText))break;a=o-1,i+=n+1}return new e(n,r,a)}static resolveCached(t,n){let r=Mt.get(t);if(r)for(let e=0;e<r.elts.length;e++){let t=r.elts[e];if(t.pos==n)return t}else Mt.set(t,r=new At);let i=r.elts[r.i]=e.resolve(t,n);return r.i=(r.i+1)%jt,i}},At=class{constructor(){this.elts=[],this.i=0}},jt=12,Mt=new WeakMap,Nt=class{constructor(e,t,n){this.$from=e,this.$to=t,this.depth=n}get start(){return this.$from.before(this.depth+1)}get end(){return this.$to.after(this.depth+1)}get parent(){return this.$from.node(this.depth)}get startIndex(){return this.$from.index(this.depth)}get endIndex(){return this.$to.indexAfter(this.depth)}},Pt=Object.create(null),Ft=class e{constructor(e,t,n,r=N.none){this.type=e,this.attrs=t,this.marks=r,this.content=n||M.empty}get children(){return this.content.content}get nodeSize(){return this.isLeaf?1:2+this.content.size}get childCount(){return this.content.childCount}child(e){return this.content.child(e)}maybeChild(e){return this.content.maybeChild(e)}forEach(e){this.content.forEach(e)}nodesBetween(e,t,n,r=0){this.content.nodesBetween(e,t,n,r,this)}descendants(e){this.nodesBetween(0,this.content.size,e)}get textContent(){return this.isLeaf&&this.type.spec.leafText?this.type.spec.leafText(this):this.textBetween(0,this.content.size,``)}textBetween(e,t,n,r){return this.content.textBetween(e,t,n,r)}get firstChild(){return this.content.firstChild}get lastChild(){return this.content.lastChild}eq(e){return this==e||this.sameMarkup(e)&&this.content.eq(e.content)}sameMarkup(e){return this.hasMarkup(e.type,e.attrs,e.marks)}hasMarkup(e,t,n){return this.type==e&&ht(this.attrs,t||e.defaultAttrs||Pt)&&N.sameSet(this.marks,n||N.none)}copy(t=null){return t==this.content?this:new e(this.type,this.attrs,t,this.marks)}mark(t){return t==this.marks?this:new e(this.type,this.attrs,this.content,t)}cut(e,t=this.content.size){return e==0&&t==this.content.size?this:this.copy(this.content.cut(e,t))}slice(e,t=this.content.size,n=!1){if(e==t)return P.empty;let r=this.resolve(e),i=this.resolve(t),a=n?0:r.sharedDepth(t),o=r.start(a);return new P(r.node(a).content.cut(r.pos-o,i.pos-o),r.depth-a,i.depth-a)}replace(e,t,n){return yt(this.resolve(e),this.resolve(t),n)}nodeAt(e){for(let t=this;;){let{index:n,offset:r}=t.content.findIndex(e);if(t=t.maybeChild(n),!t)return null;if(r==e||t.isText)return t;e-=r+1}}childAfter(e){let{index:t,offset:n}=this.content.findIndex(e);return{node:this.content.maybeChild(t),index:t,offset:n}}childBefore(e){if(e==0)return{node:null,index:0,offset:0};let{index:t,offset:n}=this.content.findIndex(e);if(n<e)return{node:this.content.child(t),index:t,offset:n};let r=this.content.child(t-1);return{node:r,index:t-1,offset:n-r.nodeSize}}resolve(e){return kt.resolveCached(this,e)}resolveNoCache(e){return kt.resolve(this,e)}rangeHasMark(e,t,n){let r=!1;return t>e&&this.nodesBetween(e,t,e=>(n.isInSet(e.marks)&&(r=!0),!r)),r}get isBlock(){return this.type.isBlock}get isTextblock(){return this.type.isTextblock}get inlineContent(){return this.type.inlineContent}get isInline(){return this.type.isInline}get isText(){return this.type.isText}get isLeaf(){return this.type.isLeaf}get isAtom(){return this.type.isAtom}toString(){if(this.type.spec.toDebugString)return this.type.spec.toDebugString(this);let e=this.type.name;return this.content.size&&(e+=`(`+this.content.toStringInner()+`)`),Lt(this.marks,e)}contentMatchAt(e){let t=this.type.contentMatch.matchFragment(this.content,0,e);if(!t)throw Error(`Called contentMatchAt on a node with invalid content`);return t}canReplace(e,t,n=M.empty,r=0,i=n.childCount){let a=this.contentMatchAt(e).matchFragment(n,r,i),o=a&&a.matchFragment(this.content,t);if(!o||!o.validEnd)return!1;for(let e=r;e<i;e++)if(!this.type.allowsMarks(n.child(e).marks))return!1;return!0}canReplaceWith(e,t,n,r){if(r&&!this.type.allowsMarks(r))return!1;let i=this.contentMatchAt(e).matchType(n),a=i&&i.matchFragment(this.content,t);return a?a.validEnd:!1}canAppend(e){return e.content.size?this.canReplace(this.childCount,this.childCount,e.content):this.type.compatibleContent(e.type)}check(){this.type.checkContent(this.content),this.type.checkAttrs(this.attrs);let e=N.none;for(let t=0;t<this.marks.length;t++){let n=this.marks[t];n.type.checkAttrs(n.attrs),e=n.addToSet(e)}if(!N.sameSet(e,this.marks))throw RangeError(`Invalid collection of marks for node ${this.type.name}: ${this.marks.map(e=>e.type.name)}`);this.content.forEach(e=>e.check())}toJSON(){let e={type:this.type.name};for(let t in this.attrs){e.attrs=this.attrs;break}return this.content.size&&(e.content=this.content.toJSON()),this.marks.length&&(e.marks=this.marks.map(e=>e.toJSON())),e}static fromJSON(e,t){if(!t)throw RangeError(`Invalid input for Node.fromJSON`);let n;if(t.marks){if(!Array.isArray(t.marks))throw RangeError(`Invalid mark data for Node.fromJSON`);n=t.marks.map(e.markFromJSON)}if(t.type==`text`){if(typeof t.text!=`string`)throw RangeError(`Invalid text node in JSON`);return e.text(t.text,n)}let r=M.fromJSON(e,t.content),i=e.nodeType(t.type).create(t.attrs,r,n);return i.type.checkAttrs(i.attrs),i}};Ft.prototype.text=void 0;var It=class e extends Ft{constructor(e,t,n,r){if(super(e,t,null,r),!n)throw RangeError(`Empty text nodes are not allowed`);this.text=n}toString(){return this.type.spec.toDebugString?this.type.spec.toDebugString(this):Lt(this.marks,JSON.stringify(this.text))}get textContent(){return this.text}textBetween(e,t){return this.text.slice(e,t)}get nodeSize(){return this.text.length}mark(t){return t==this.marks?this:new e(this.type,this.attrs,this.text,t)}withText(t){return t==this.text?this:new e(this.type,this.attrs,t,this.marks)}cut(e=0,t=this.text.length){return e==0&&t==this.text.length?this:this.withText(this.text.slice(e,t))}eq(e){return this.sameMarkup(e)&&this.text==e.text}toJSON(){let e=super.toJSON();return e.text=this.text,e}};function Lt(e,t){for(let n=e.length-1;n>=0;n--)t=e[n].type.name+`(`+t+`)`;return t}var Rt=class e{constructor(e){this.validEnd=e,this.next=[],this.wrapCache=[]}static parse(t,n){let r=new zt(t,n);if(r.next==null)return e.empty;let i=Bt(r);r.next&&r.err(`Unexpected trailing text`);let a=Xt(qt(i));return Zt(a,r),a}matchType(e){for(let t=0;t<this.next.length;t++)if(this.next[t].type==e)return this.next[t].next;return null}matchFragment(e,t=0,n=e.childCount){let r=this;for(let i=t;r&&i<n;i++)r=r.matchType(e.child(i).type);return r}get inlineContent(){return this.next.length!=0&&this.next[0].type.isInline}get defaultType(){for(let e=0;e<this.next.length;e++){let{type:t}=this.next[e];if(!(t.isText||t.hasRequiredAttrs()))return t}return null}compatible(e){for(let t=0;t<this.next.length;t++)for(let n=0;n<e.next.length;n++)if(this.next[t].type==e.next[n].type)return!0;return!1}fillBefore(e,t=!1,n=0){let r=[this];function i(a,o){let s=a.matchFragment(e,n);if(s&&(!t||s.validEnd))return M.from(o.map(e=>e.createAndFill()));for(let e=0;e<a.next.length;e++){let{type:t,next:n}=a.next[e];if(!(t.isText||t.hasRequiredAttrs())&&r.indexOf(n)==-1){r.push(n);let e=i(n,o.concat(t));if(e)return e}}return null}return i(this,[])}findWrapping(e){for(let t=0;t<this.wrapCache.length;t+=2)if(this.wrapCache[t]==e)return this.wrapCache[t+1];let t=this.computeWrapping(e);return this.wrapCache.push(e,t),t}computeWrapping(e){let t=Object.create(null),n=[{match:this,type:null,via:null}];for(;n.length;){let r=n.shift(),i=r.match;if(i.matchType(e)){let e=[];for(let t=r;t.type;t=t.via)e.push(t.type);return e.reverse()}for(let e=0;e<i.next.length;e++){let{type:a,next:o}=i.next[e];!a.isLeaf&&!a.hasRequiredAttrs()&&!(a.name in t)&&(!r.type||o.validEnd)&&(n.push({match:a.contentMatch,type:a,via:r}),t[a.name]=!0)}}return null}get edgeCount(){return this.next.length}edge(e){if(e>=this.next.length)throw RangeError(`There's no ${e}th edge in this content match`);return this.next[e]}toString(){let e=[];function t(n){e.push(n);for(let r=0;r<n.next.length;r++)e.indexOf(n.next[r].next)==-1&&t(n.next[r].next)}return t(this),e.map((t,n)=>{let r=n+(t.validEnd?`*`:` `)+` `;for(let n=0;n<t.next.length;n++)r+=(n?`, `:``)+t.next[n].type.name+`->`+e.indexOf(t.next[n].next);return r}).join(`
|
|
3
3
|
`)}};Rt.empty=new Rt(!0);var zt=class{constructor(e,t){this.string=e,this.nodeTypes=t,this.inline=null,this.pos=0,this.tokens=e.split(/\s*(?=\b|\W|$)/),this.tokens[this.tokens.length-1]==``&&this.tokens.pop(),this.tokens[0]==``&&this.tokens.shift()}get next(){return this.tokens[this.pos]}eat(e){return this.next==e&&(this.pos++||!0)}err(e){throw SyntaxError(e+` (in content expression '`+this.string+`')`)}};function Bt(e){let t=[];do t.push(Vt(e));while(e.eat(`|`));return t.length==1?t[0]:{type:`choice`,exprs:t}}function Vt(e){let t=[];do t.push(Ht(e));while(e.next&&e.next!=`)`&&e.next!=`|`);return t.length==1?t[0]:{type:`seq`,exprs:t}}function Ht(e){let t=Kt(e);for(;;)if(e.eat(`+`))t={type:`plus`,expr:t};else if(e.eat(`*`))t={type:`star`,expr:t};else if(e.eat(`?`))t={type:`opt`,expr:t};else if(e.eat(`{`))t=Wt(e,t);else break;return t}function Ut(e){/\D/.test(e.next)&&e.err(`Expected number, got '`+e.next+`'`);let t=Number(e.next);return e.pos++,t}function Wt(e,t){let n=Ut(e),r=n;return e.eat(`,`)&&(r=e.next==`}`?-1:Ut(e)),e.eat(`}`)||e.err(`Unclosed braced range`),{type:`range`,min:n,max:r,expr:t}}function Gt(e,t){let n=e.nodeTypes,r=n[t];if(r)return[r];let i=[];for(let e in n){let r=n[e];r.isInGroup(t)&&i.push(r)}return i.length==0&&e.err(`No node type or group '`+t+`' found`),i}function Kt(e){if(e.eat(`(`)){let t=Bt(e);return e.eat(`)`)||e.err(`Missing closing paren`),t}else if(/\W/.test(e.next))e.err(`Unexpected token '`+e.next+`'`);else{let t=Gt(e,e.next).map(t=>(e.inline==null?e.inline=t.isInline:e.inline!=t.isInline&&e.err(`Mixing inline and block content`),{type:`name`,value:t}));return e.pos++,t.length==1?t[0]:{type:`choice`,exprs:t}}}function qt(e){let t=[[]];return i(a(e,0),n()),t;function n(){return t.push([])-1}function r(e,n,r){let i={term:r,to:n};return t[e].push(i),i}function i(e,t){e.forEach(e=>e.to=t)}function a(e,t){if(e.type==`choice`)return e.exprs.reduce((e,n)=>e.concat(a(n,t)),[]);if(e.type==`seq`)for(let r=0;;r++){let o=a(e.exprs[r],t);if(r==e.exprs.length-1)return o;i(o,t=n())}else if(e.type==`star`){let o=n();return r(t,o),i(a(e.expr,o),o),[r(o)]}else if(e.type==`plus`){let o=n();return i(a(e.expr,t),o),i(a(e.expr,o),o),[r(o)]}else if(e.type==`opt`)return[r(t)].concat(a(e.expr,t));else if(e.type==`range`){let o=t;for(let t=0;t<e.min;t++){let t=n();i(a(e.expr,o),t),o=t}if(e.max==-1)i(a(e.expr,o),o);else for(let t=e.min;t<e.max;t++){let t=n();r(o,t),i(a(e.expr,o),t),o=t}return[r(o)]}else if(e.type==`name`)return[r(t,void 0,e.value)];else throw Error(`Unknown expr type`)}}function Jt(e,t){return t-e}function Yt(e,t){let n=[];return r(t),n.sort(Jt);function r(t){let i=e[t];if(i.length==1&&!i[0].term)return r(i[0].to);n.push(t);for(let e=0;e<i.length;e++){let{term:t,to:a}=i[e];!t&&n.indexOf(a)==-1&&r(a)}}}function Xt(e){let t=Object.create(null);return n(Yt(e,0));function n(r){let i=[];r.forEach(t=>{e[t].forEach(({term:t,to:n})=>{if(!t)return;let r;for(let e=0;e<i.length;e++)i[e][0]==t&&(r=i[e][1]);Yt(e,n).forEach(e=>{r||i.push([t,r=[]]),r.indexOf(e)==-1&&r.push(e)})})});let a=t[r.join(`,`)]=new Rt(r.indexOf(e.length-1)>-1);for(let e=0;e<i.length;e++){let r=i[e][1].sort(Jt);a.next.push({type:i[e][0],next:t[r.join(`,`)]||n(r)})}return a}}function Zt(e,t){for(let n=0,r=[e];n<r.length;n++){let e=r[n],i=!e.validEnd,a=[];for(let t=0;t<e.next.length;t++){let{type:n,next:o}=e.next[t];a.push(n.name),i&&!(n.isText||n.hasRequiredAttrs())&&(i=!1),r.indexOf(o)==-1&&r.push(o)}i&&t.err(`Only non-generatable nodes (`+a.join(`, `)+`) in a required position (see https://prosemirror.net/docs/guide/#generatable)`)}}function Qt(e){let t=Object.create(null);for(let n in e){let r=e[n];if(!r.hasDefault)return null;t[n]=r.default}return t}function $t(e,t){let n=Object.create(null);for(let r in e){let i=t&&t[r];if(i===void 0){let t=e[r];if(t.hasDefault)i=t.default;else throw RangeError(`No value supplied for attribute `+r)}n[r]=i}return n}function en(e,t,n,r){for(let r in t)if(!(r in e))throw RangeError(`Unsupported attribute ${r} for ${n} of type ${r}`);for(let n in e){let r=e[n];r.validate&&r.validate(t[n])}}function tn(e,t){let n=Object.create(null);if(t)for(let r in t)n[r]=new an(e,r,t[r]);return n}var nn=class e{constructor(e,t,n){this.name=e,this.schema=t,this.spec=n,this.markSet=null,this.groups=n.group?n.group.split(` `):[],this.attrs=tn(e,n.attrs),this.defaultAttrs=Qt(this.attrs),this.contentMatch=null,this.inlineContent=null,this.isBlock=!(n.inline||e==`text`),this.isText=e==`text`}get isInline(){return!this.isBlock}get isTextblock(){return this.isBlock&&this.inlineContent}get isLeaf(){return this.contentMatch==Rt.empty}get isAtom(){return this.isLeaf||!!this.spec.atom}isInGroup(e){return this.groups.indexOf(e)>-1}get whitespace(){return this.spec.whitespace||(this.spec.code?`pre`:`normal`)}hasRequiredAttrs(){for(let e in this.attrs)if(this.attrs[e].isRequired)return!0;return!1}compatibleContent(e){return this==e||this.contentMatch.compatible(e.contentMatch)}computeAttrs(e){return!e&&this.defaultAttrs?this.defaultAttrs:$t(this.attrs,e)}create(e=null,t,n){if(this.isText)throw Error(`NodeType.create can't construct text nodes`);return new Ft(this,this.computeAttrs(e),M.from(t),N.setFrom(n))}createChecked(e=null,t,n){return t=M.from(t),this.checkContent(t),new Ft(this,this.computeAttrs(e),t,N.setFrom(n))}createAndFill(e=null,t,n){if(e=this.computeAttrs(e),t=M.from(t),t.size){let e=this.contentMatch.fillBefore(t);if(!e)return null;t=e.append(t)}let r=this.contentMatch.matchFragment(t),i=r&&r.fillBefore(M.empty,!0);return i?new Ft(this,e,t.append(i),N.setFrom(n)):null}validContent(e){let t=this.contentMatch.matchFragment(e);if(!t||!t.validEnd)return!1;for(let t=0;t<e.childCount;t++)if(!this.allowsMarks(e.child(t).marks))return!1;return!0}checkContent(e){if(!this.validContent(e))throw RangeError(`Invalid content for node ${this.name}: ${e.toString().slice(0,50)}`)}checkAttrs(e){en(this.attrs,e,`node`,this.name)}allowsMarkType(e){return this.markSet==null||this.markSet.indexOf(e)>-1}allowsMarks(e){if(this.markSet==null)return!0;for(let t=0;t<e.length;t++)if(!this.allowsMarkType(e[t].type))return!1;return!0}allowedMarks(e){if(this.markSet==null)return e;let t;for(let n=0;n<e.length;n++)this.allowsMarkType(e[n].type)?t&&t.push(e[n]):t||=e.slice(0,n);return t?t.length?t:N.none:e}static compile(t,n){let r=Object.create(null);t.forEach((t,i)=>r[t]=new e(t,n,i));let i=n.spec.topNode||`doc`;if(!r[i])throw RangeError(`Schema is missing its top node type ('`+i+`')`);if(!r.text)throw RangeError(`Every schema needs a 'text' type`);for(let e in r.text.attrs)throw RangeError(`The text node type should not have attributes`);return r}};function rn(e,t,n){let r=n.split(`|`);return n=>{let i=n===null?`null`:typeof n;if(r.indexOf(i)<0)throw RangeError(`Expected value of type ${r} for attribute ${t} on type ${e}, got ${i}`)}}var an=class{constructor(e,t,n){this.hasDefault=Object.prototype.hasOwnProperty.call(n,`default`),this.default=n.default,this.validate=typeof n.validate==`string`?rn(e,t,n.validate):n.validate}get isRequired(){return!this.hasDefault}},on=class e{constructor(e,t,n,r){this.name=e,this.rank=t,this.schema=n,this.spec=r,this.attrs=tn(e,r.attrs),this.excluded=null;let i=Qt(this.attrs);this.instance=i?new N(this,i):null}create(e=null){return!e&&this.instance?this.instance:new N(this,$t(this.attrs,e))}static compile(t,n){let r=Object.create(null),i=0;return t.forEach((t,a)=>r[t]=new e(t,i++,n,a)),r}removeFromSet(e){for(var t=0;t<e.length;t++)e[t].type==this&&(e=e.slice(0,t).concat(e.slice(t+1)),t--);return e}isInSet(e){for(let t=0;t<e.length;t++)if(e[t].type==this)return e[t]}checkAttrs(e){en(this.attrs,e,`mark`,this.name)}excludes(e){return this.excluded.indexOf(e)>-1}},sn=class{constructor(e){this.linebreakReplacement=null,this.cached=Object.create(null);let t=this.spec={};for(let n in e)t[n]=e[n];t.nodes=ut.from(e.nodes),t.marks=ut.from(e.marks||{}),this.nodes=nn.compile(this.spec.nodes,this),this.marks=on.compile(this.spec.marks,this);let n=Object.create(null);for(let e in this.nodes){if(e in this.marks)throw RangeError(e+` can not be both a node and a mark`);let t=this.nodes[e],r=t.spec.content||``,i=t.spec.marks;if(t.contentMatch=n[r]||(n[r]=Rt.parse(r,this.nodes)),t.inlineContent=t.contentMatch.inlineContent,t.spec.linebreakReplacement){if(this.linebreakReplacement)throw RangeError(`Multiple linebreak nodes defined`);if(!t.isInline||!t.isLeaf)throw RangeError(`Linebreak replacement nodes must be inline leaf nodes`);this.linebreakReplacement=t}t.markSet=i==`_`?null:i?cn(this,i.split(` `)):i==``||!t.inlineContent?[]:null}for(let e in this.marks){let t=this.marks[e],n=t.spec.excludes;t.excluded=n==null?[t]:n==``?[]:cn(this,n.split(` `))}this.nodeFromJSON=e=>Ft.fromJSON(this,e),this.markFromJSON=e=>N.fromJSON(this,e),this.topNodeType=this.nodes[this.spec.topNode||`doc`],this.cached.wrappings=Object.create(null)}node(e,t=null,n,r){if(typeof e==`string`)e=this.nodeType(e);else if(!(e instanceof nn))throw RangeError(`Invalid node type: `+e);else if(e.schema!=this)throw RangeError(`Node type from different schema used (`+e.name+`)`);return e.createChecked(t,n,r)}text(e,t){let n=this.nodes.text;return new It(n,n.defaultAttrs,e,N.setFrom(t))}mark(e,t){return typeof e==`string`&&(e=this.marks[e]),e.create(t)}nodeType(e){let t=this.nodes[e];if(!t)throw RangeError(`Unknown node type: `+e);return t}};function cn(e,t){let n=[];for(let r=0;r<t.length;r++){let i=t[r],a=e.marks[i],o=a;if(a)n.push(a);else for(let t in e.marks){let r=e.marks[t];(i==`_`||r.spec.group&&r.spec.group.split(` `).indexOf(i)>-1)&&n.push(o=r)}if(!o)throw SyntaxError(`Unknown mark type: '`+t[r]+`'`)}return n}function ln(e){return e.tag!=null}function un(e){return e.style!=null}var dn=class e{constructor(e,t){this.schema=e,this.rules=t,this.tags=[],this.styles=[];let n=this.matchedStyles=[];t.forEach(e=>{if(ln(e))this.tags.push(e);else if(un(e)){let t=/[^=]*/.exec(e.style)[0];n.indexOf(t)<0&&n.push(t),this.styles.push(e)}}),this.normalizeLists=!this.tags.some(t=>{if(!/^(ul|ol)\b/.test(t.tag)||!t.node)return!1;let n=e.nodes[t.node];return n.contentMatch.matchType(n)})}parse(e,t={}){let n=new bn(this,t,!1);return n.addAll(e,N.none,t.from,t.to),n.finish()}parseSlice(e,t={}){let n=new bn(this,t,!0);return n.addAll(e,N.none,t.from,t.to),P.maxOpen(n.finish())}matchTag(e,t,n){for(let r=n?this.tags.indexOf(n)+1:0;r<this.tags.length;r++){let n=this.tags[r];if(Sn(e,n.tag)&&(n.namespace===void 0||e.namespaceURI==n.namespace)&&(!n.context||t.matchesContext(n.context))){if(n.getAttrs){let t=n.getAttrs(e);if(t===!1)continue;n.attrs=t||void 0}return n}}}matchStyle(e,t,n,r){for(let i=r?this.styles.indexOf(r)+1:0;i<this.styles.length;i++){let r=this.styles[i],a=r.style;if(!(a.indexOf(e)!=0||r.context&&!n.matchesContext(r.context)||a.length>e.length&&(a.charCodeAt(e.length)!=61||a.slice(e.length+1)!=t))){if(r.getAttrs){let e=r.getAttrs(t);if(e===!1)continue;r.attrs=e||void 0}return r}}}static schemaRules(e){let t=[];function n(e){let n=e.priority==null?50:e.priority,r=0;for(;r<t.length;r++){let e=t[r];if((e.priority==null?50:e.priority)<n)break}t.splice(r,0,e)}for(let t in e.marks){let r=e.marks[t].spec.parseDOM;r&&r.forEach(e=>{n(e=Cn(e)),e.mark||e.ignore||e.clearMark||(e.mark=t)})}for(let t in e.nodes){let r=e.nodes[t].spec.parseDOM;r&&r.forEach(e=>{n(e=Cn(e)),e.node||e.ignore||e.mark||(e.node=t)})}return t}static fromSchema(t){return t.cached.domParser||(t.cached.domParser=new e(t,e.schemaRules(t)))}},fn={address:!0,article:!0,aside:!0,blockquote:!0,canvas:!0,dd:!0,div:!0,dl:!0,fieldset:!0,figcaption:!0,figure:!0,footer:!0,form:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,header:!0,hgroup:!0,hr:!0,li:!0,noscript:!0,ol:!0,output:!0,p:!0,pre:!0,section:!0,table:!0,tfoot:!0,ul:!0},pn={head:!0,noscript:!0,object:!0,script:!0,style:!0,title:!0},mn={ol:!0,ul:!0},hn=1,gn=2,_n=4;function vn(e,t,n){return t==null?e&&e.whitespace==`pre`?hn|gn:n&~_n:(t?hn:0)|(t===`full`?gn:0)}var yn=class{constructor(e,t,n,r,i,a){this.type=e,this.attrs=t,this.marks=n,this.solid=r,this.options=a,this.content=[],this.activeMarks=N.none,this.match=i||(a&_n?null:e.contentMatch)}findWrapping(e){if(!this.match){if(!this.type)return[];let t=this.type.contentMatch.fillBefore(M.from(e));if(t)this.match=this.type.contentMatch.matchFragment(t);else{let t=this.type.contentMatch,n;return(n=t.findWrapping(e.type))?(this.match=t,n):null}}return this.match.findWrapping(e.type)}finish(e){if(!(this.options&hn)){let e=this.content[this.content.length-1],t;if(e&&e.isText&&(t=/[ \t\r\n\u000c]+$/.exec(e.text))){let n=e;e.text.length==t[0].length?this.content.pop():this.content[this.content.length-1]=n.withText(n.text.slice(0,n.text.length-t[0].length))}}let t=M.from(this.content);return!e&&this.match&&(t=t.append(this.match.fillBefore(M.empty,!0))),this.type?this.type.create(this.attrs,t,this.marks):t}inlineContext(e){return this.type?this.type.inlineContent:this.content.length?this.content[0].isInline:e.parentNode&&!fn.hasOwnProperty(e.parentNode.nodeName.toLowerCase())}},bn=class{constructor(e,t,n){this.parser=e,this.options=t,this.isOpen=n,this.open=0,this.localPreserveWS=!1;let r=t.topNode,i,a=vn(null,t.preserveWhitespace,0)|(n?_n:0);i=r?new yn(r.type,r.attrs,N.none,!0,t.topMatch||r.type.contentMatch,a):n?new yn(null,null,N.none,!0,null,a):new yn(e.schema.topNodeType,null,N.none,!0,null,a),this.nodes=[i],this.find=t.findPositions,this.needsBlock=!1}get top(){return this.nodes[this.open]}addDOM(e,t){e.nodeType==3?this.addTextNode(e,t):e.nodeType==1&&this.addElement(e,t)}addTextNode(e,t){let n=e.nodeValue,r=this.top,i=r.options&gn?`full`:this.localPreserveWS||(r.options&hn)>0,{schema:a}=this.parser;if(i===`full`||r.inlineContext(e)||/[^ \t\r\n\u000c]/.test(n)){if(!i){if(n=n.replace(/[ \t\r\n\u000c]+/g,` `),/^[ \t\r\n\u000c]/.test(n)&&this.open==this.nodes.length-1){let t=r.content[r.content.length-1],i=e.previousSibling;(!t||i&&i.nodeName==`BR`||t.isText&&/[ \t\r\n\u000c]$/.test(t.text))&&(n=n.slice(1))}}else if(i===`full`)n=n.replace(/\r\n?/g,`
|
|
4
4
|
`);else if(a.linebreakReplacement&&/[\r\n]/.test(n)&&this.top.findWrapping(a.linebreakReplacement.create())){let e=n.split(/\r?\n|\r/);for(let n=0;n<e.length;n++)n&&this.insertNode(a.linebreakReplacement.create(),t,!0),e[n]&&this.insertNode(a.text(e[n]),t,!/\S/.test(e[n]));n=``}else n=n.replace(/\r?\n|\r/g,` `);n&&this.insertNode(a.text(n),t,!/\S/.test(n)),this.findInText(e)}else this.findInside(e)}addElement(e,t,n){let r=this.localPreserveWS,i=this.top;(e.tagName==`PRE`||/pre/.test(e.style&&e.style.whiteSpace))&&(this.localPreserveWS=!0);let a=e.nodeName.toLowerCase(),o;mn.hasOwnProperty(a)&&this.parser.normalizeLists&&xn(e);let s=this.options.ruleFromNode&&this.options.ruleFromNode(e)||(o=this.parser.matchTag(e,this,n));out:if(s?s.ignore:pn.hasOwnProperty(a))this.findInside(e),this.ignoreFallback(e,t);else if(!s||s.skip||s.closeParent){s&&s.closeParent?this.open=Math.max(0,this.open-1):s&&s.skip.nodeType&&(e=s.skip);let n,r=this.needsBlock;if(fn.hasOwnProperty(a))i.content.length&&i.content[0].isInline&&this.open&&(this.open--,i=this.top),n=!0,i.type||(this.needsBlock=!0);else if(!e.firstChild){this.leafFallback(e,t);break out}let o=s&&s.skip?t:this.readStyles(e,t);o&&this.addAll(e,o),n&&this.sync(i),this.needsBlock=r}else{let n=this.readStyles(e,t);n&&this.addElementByRule(e,s,n,s.consuming===!1?o:void 0)}this.localPreserveWS=r}leafFallback(e,t){e.nodeName==`BR`&&this.top.type&&this.top.type.inlineContent&&this.addTextNode(e.ownerDocument.createTextNode(`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e,u as t}from"./ChatInput-CJo_77bp.js";import"./graph-labels-
|
|
1
|
+
import{_ as e,u as t}from"./ChatInput-CJo_77bp.js";import"./graph-labels-BRXJHNYE.js";import{t as n}from"./page-B4oirCvn.js";var r=e(),i=t();(0,r.createRoot)(document.getElementById(`root`)).render((0,i.jsx)(n,{}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e,u as t}from"./ChatInput-CJo_77bp.js";import"./graph-labels-
|
|
1
|
+
import{_ as e,u as t}from"./ChatInput-CJo_77bp.js";import"./graph-labels-BRXJHNYE.js";import{n}from"./page-FmJ7PIYx.js";import"./Checkbox-YrQovXpN.js";var r=e(),i=t();(0,r.createRoot)(document.getElementById(`root`)).render((0,i.jsx)(n,{}));
|