pi-roundtable-web 0.25.0 → 0.26.1
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/CHANGELOG.md +54 -0
- package/README.md +165 -12
- package/dist/account-zk4efb87.css +102 -0
- package/dist/chunk-account-ghq105t4.js +1 -0
- package/dist/chunk-action-menu-me0g9qsc.js +1 -0
- package/dist/{chunk-agent-0pm9p3nn.js → chunk-agent-rdv7ekrt.js} +1 -1
- package/dist/chunk-arranged-rooms-81rqhx9x.js +1 -0
- package/dist/chunk-character-creator-bd426yjw.js +1 -0
- package/dist/chunk-codeeditor-ajhgd33t.js +2 -0
- package/dist/chunk-confirm-p3mts8mx.js +1 -0
- package/dist/{chunk-connectors-anhghy3k.js → chunk-connectors-bkv3xn83.js} +1 -1
- package/dist/chunk-conversations-0e0vbxwr.js +1 -0
- package/dist/{chunk-drag-q4fx9b22.js → chunk-drag-peyb8t0k.js} +1 -1
- package/dist/{chunk-entry-he1embgp.js → chunk-entry-mv7q8br0.js} +1 -1
- package/dist/chunk-folder-list-era3tksh.js +1 -0
- package/dist/chunk-folds-hvws0bd5.js +1 -0
- package/dist/chunk-gate-hc7dd0fx.js +1 -0
- package/dist/chunk-group-scene-dkbpmbh5.js +1 -0
- package/dist/chunk-group-table-fqmxgdfw.js +1 -0
- package/dist/chunk-host-icons-4xde9ntk.js +1 -0
- package/dist/chunk-host-picture-014yzk20.js +1 -0
- package/dist/chunk-host-state-t56e5sdy.js +1 -0
- package/dist/chunk-host-ui-p1zy9nmp.js +1 -0
- package/dist/chunk-index-0fmmvgee.js +2 -0
- package/dist/chunk-index-0q15ysrb.js +1 -0
- package/dist/chunk-index-0xh24y25.js +2 -0
- package/dist/chunk-index-2yebd9tb.js +426 -0
- package/dist/chunk-index-4t0r3t3b.js +2 -0
- package/dist/chunk-index-5yzfrf7b.js +138 -0
- package/dist/{chunk-index-d5abvq7v.js → chunk-index-6twb7ccd.js} +2 -2
- package/dist/chunk-index-73gh7kgr.js +920 -0
- package/dist/chunk-index-7xffskfa.js +8 -0
- package/dist/chunk-index-aqw7cy5j.js +1 -0
- package/dist/chunk-index-b6ca02e8.js +2 -0
- package/dist/chunk-index-b8nvhcx5.js +2 -0
- package/dist/{chunk-index-bvfqjh77.js → chunk-index-cvbdf2ca.js} +2 -2
- package/dist/chunk-index-czdketze.js +2 -0
- package/dist/{chunk-index-9jqcskb4.js → chunk-index-dt9775ka.js} +5 -5
- package/dist/chunk-index-eg55mqqe.js +1 -0
- package/dist/chunk-index-gr6e0hse.js +2 -0
- package/dist/chunk-index-gyary7np.js +13 -0
- package/dist/chunk-index-j214tczc.js +1 -0
- package/dist/chunk-index-jd6632ef.js +2 -0
- package/dist/chunk-index-jw7dtshr.js +2 -0
- package/dist/{chunk-index-krtk6nn2.js → chunk-index-k7t14rwa.js} +2 -2
- package/dist/chunk-index-kwcx62wb.js +4 -0
- package/dist/chunk-index-m7fvw92f.js +2 -0
- package/dist/chunk-index-mmg788a1.js +2 -0
- package/dist/chunk-index-mq0dacwr.js +2 -0
- package/dist/chunk-index-p53ak25v.js +2 -0
- package/dist/{chunk-index-27qca4mr.js → chunk-index-pk1yxkv4.js} +2 -2
- package/dist/{chunk-index-9b1kt7qw.css → chunk-index-rbcz9jd4.css} +1 -1
- package/dist/{chunk-index-s681nny9.js → chunk-index-rmxbdmn2.js} +2 -2
- package/dist/chunk-index-rnxj3z8k.js +2 -0
- package/dist/chunk-index-snzzfhk3.js +2 -0
- package/dist/chunk-index-v3bmr0nw.js +2 -0
- package/dist/chunk-index-vcyzwtk2.js +2 -0
- package/dist/{chunk-index-zfd00hwb.js → chunk-index-w2j3njb6.js} +2 -2
- package/dist/chunk-index-w31c4yjv.js +2 -0
- package/dist/chunk-index-wrm8w165.js +2 -0
- package/dist/chunk-index-xh0mg9cw.js +2 -0
- package/dist/chunk-index-ybtvvx85.js +2 -0
- package/dist/chunk-index-yzsgsvnp.js +2 -0
- package/dist/{chunk-index-18gxy79n.js → chunk-index-z9x4cnzf.js} +2 -2
- package/dist/chunk-index-zrvg23jd.js +2 -0
- package/dist/chunk-index-zynq0b0w.js +50 -0
- package/dist/chunk-lang-css-88v3hp3d.js +1 -0
- package/dist/{chunk-lang-dockerfile-d5mzxs60.js → chunk-lang-dockerfile-k728ewsf.js} +1 -1
- package/dist/{chunk-lang-go-830fmhba.js → chunk-lang-go-wjwgay4v.js} +3 -3
- package/dist/chunk-lang-html-07d47es4.js +1 -0
- package/dist/chunk-lang-javascript-fmhhgzwd.js +1 -0
- package/dist/{chunk-lang-json-5eaarz7j.js → chunk-lang-json-7gd89mvs.js} +1 -1
- package/dist/chunk-lang-markdown-b6qbe8bt.js +6 -0
- package/dist/{chunk-lang-python-fjw84w10.js → chunk-lang-python-3v56y31b.js} +2 -2
- package/dist/{chunk-lang-rust-5rbp2zdk.js → chunk-lang-rust-kh0z74d1.js} +1 -1
- package/dist/{chunk-lang-shell-vzagpym3.js → chunk-lang-shell-9zv0zvbx.js} +1 -1
- package/dist/{chunk-lang-sql-0c2w9c2y.js → chunk-lang-sql-yw6bf3t7.js} +2 -2
- package/dist/{chunk-lang-toml-yr9fv6eb.js → chunk-lang-toml-tg1r96nq.js} +1 -1
- package/dist/chunk-lang-typescript-etjjvr2g.js +1 -0
- package/dist/{chunk-lang-xml-eze08p42.js → chunk-lang-xml-ev1mndd4.js} +1 -1
- package/dist/{chunk-lang-yaml-c4b6ft3y.js → chunk-lang-yaml-fz5qpb3r.js} +1 -1
- package/dist/chunk-layout-actions-48ecgtkg.js +1 -0
- package/dist/{chunk-menu-items-jrwxycr1.js → chunk-menu-items-1epy3h0t.js} +2 -2
- package/dist/chunk-mode-toggle-fxmfxsa4.js +1 -0
- package/dist/chunk-note-row-kd0fy7ee.js +75 -0
- package/dist/chunk-notes-yb8f057c.js +1 -0
- package/dist/chunk-notice-bell-wr4f1rph.js +1 -0
- package/dist/chunk-notices-x07da5bb.js +1 -0
- package/dist/chunk-onboarding-csrkbh9z.js +1 -0
- package/dist/chunk-overview-avc2d30t.js +1 -0
- package/dist/chunk-palette-9nhp95bz.js +1 -0
- package/dist/chunk-placement-items-q694dpgk.js +1 -0
- package/dist/chunk-profile-6qemf3m7.js +1 -0
- package/dist/chunk-prompt-history-7enzp2p3.js +1 -0
- package/dist/chunk-prompts-nv6mrn0q.js +1 -0
- package/dist/chunk-room-confirms-zz7n61y7.js +1 -0
- package/dist/chunk-room-menu-rr6nzap1.js +1 -0
- package/dist/chunk-rooms-menu-button-zbtwj47d.js +1 -0
- package/dist/chunk-schedules-rw57nr0m.js +1 -0
- package/dist/{chunk-seat-menu-jv4s7hmj.js → chunk-seat-menu-ys5v9abz.js} +1 -1
- package/dist/chunk-sheet-hosts-jhvaacst.js +1 -0
- package/dist/chunk-skill-editor-sz8an8qr.js +8 -0
- package/dist/chunk-skills-tnr1h16h.js +1 -0
- package/dist/chunk-switcher-list-17enhrse.js +1 -0
- package/dist/chunk-tab-dot-r6brdbmw.js +1 -0
- package/dist/chunk-table-r12cja6p.js +1 -0
- package/dist/chunk-table-seats-g3t392zz.js +1 -0
- package/dist/{chunk-table2d-4sje1fr0.js → chunk-table2d-p3ezsdcj.js} +1 -1
- package/dist/{chunk-table3d-h64skazp.js → chunk-table3d-4x2n2b00.js} +23 -23
- package/dist/chunk-thread-actions-qc6ezkha.js +1 -0
- package/dist/chunk-transcript-n2s6dher.js +1 -0
- package/dist/chunk-where-f3scdydc.js +1 -0
- package/dist/chunk-workspace-xs023bxm.js +1 -0
- package/dist/chunk-zh-tw-efvmk3fd.js +1 -0
- package/dist/index.html +1 -1
- package/dist/sw.js +1 -1
- package/package.json +5 -4
- package/src/api-types.ts +356 -4
- package/src/app/app.ts +201 -32
- package/src/app/desk.ts +47 -22
- package/src/app/files.ts +73 -7
- package/src/app/presence.ts +2 -2
- package/src/app/protocol.ts +63 -1
- package/src/app/room-log.ts +153 -14
- package/src/app/rooms.ts +39 -0
- package/src/app/routes.ts +168 -28
- package/src/app/socket.ts +349 -81
- package/src/app/sockets.ts +108 -20
- package/src/app/surface.ts +72 -36
- package/src/app/threads.ts +31 -2
- package/src/app/uploads.ts +33 -7
- package/src/auth/authenticator.ts +77 -8
- package/src/auth/login-page.ts +4 -2
- package/src/auth/next.ts +52 -0
- package/src/auth/oidc-pages.ts +62 -0
- package/src/auth/oidc.ts +649 -0
- package/src/auth/sessions.ts +193 -0
- package/src/authz.ts +173 -0
- package/src/console-api.ts +122 -25
- package/src/console-server.ts +102 -12
- package/src/gate.ts +90 -0
- package/src/host/access.ts +161 -0
- package/src/host/cards.ts +112 -0
- package/src/host/context.ts +188 -0
- package/src/host/forms.ts +240 -0
- package/src/host/frames.ts +349 -0
- package/src/host/host-app.ts +178 -0
- package/src/host/host-context.ts +49 -0
- package/src/host/host-routes.ts +396 -0
- package/src/host/pages.ts +266 -0
- package/src/host/reads.ts +155 -0
- package/src/host/retention.ts +41 -0
- package/src/host/room-views.ts +137 -0
- package/src/host/rooms-service.ts +429 -0
- package/src/host/stored-json.ts +13 -0
- package/src/host/views.ts +106 -0
- package/src/i18n/zh-tw.ts +139 -0
- package/src/index.ts +15 -1
- package/src/notices/api.ts +43 -0
- package/src/notices/mount.ts +292 -0
- package/src/notices/service.ts +294 -0
- package/src/notices/store.ts +298 -0
- package/src/notices/urls.ts +38 -0
- package/src/onboarding/api.ts +32 -0
- package/src/onboarding/service.ts +149 -0
- package/src/onboarding/steps.ts +75 -0
- package/src/onboarding/waivers.ts +40 -0
- package/src/options.ts +534 -34
- package/src/page-presentation.ts +47 -2
- package/src/profile/api.ts +175 -0
- package/src/profile/links.ts +162 -0
- package/src/push/api.ts +189 -52
- package/src/push/dispatch.ts +156 -0
- package/src/push/drain.ts +139 -0
- package/src/push/outbox.ts +218 -0
- package/src/push/prefs.ts +118 -0
- package/src/push/sender.ts +7 -2
- package/src/push/triggers.ts +56 -5
- package/src/push/vapid.ts +19 -0
- package/src/push/web-push-transport.ts +106 -0
- package/src/push-sender/index.ts +14 -0
- package/src/push-sender/run.ts +118 -0
- package/src/push-sender/session.ts +54 -0
- package/src/pwa.ts +32 -4
- package/src/visitors.ts +94 -6
- package/src/web-app.ts +718 -0
- package/src/web-plugin.ts +279 -26
- package/dist/chunk-action-menu-qe839g4b.js +0 -1
- package/dist/chunk-arranged-rooms-enpfswmg.js +0 -1
- package/dist/chunk-character-creator-6yf29xwx.js +0 -1
- package/dist/chunk-codeeditor-gdbdg7rp.js +0 -2
- package/dist/chunk-confirm-xrw7d732.js +0 -1
- package/dist/chunk-conversations-ry228aes.js +0 -1
- package/dist/chunk-folder-list-5cp8stna.js +0 -1
- package/dist/chunk-folds-hff104tk.js +0 -1
- package/dist/chunk-group-scene-h228jdat.js +0 -1
- package/dist/chunk-index-0p5h2kdz.js +0 -2
- package/dist/chunk-index-0pt08yd9.js +0 -1
- package/dist/chunk-index-12bw9yj8.js +0 -2
- package/dist/chunk-index-2ad17eh4.js +0 -2
- package/dist/chunk-index-31wh5twj.js +0 -52
- package/dist/chunk-index-4dy94pbz.js +0 -2
- package/dist/chunk-index-4ecjtdy8.js +0 -13
- package/dist/chunk-index-4v1b7ks9.js +0 -2
- package/dist/chunk-index-5d8yjj4m.js +0 -2
- package/dist/chunk-index-89ajmxh7.js +0 -2
- package/dist/chunk-index-b9ny4623.js +0 -2
- package/dist/chunk-index-e1dr6g10.js +0 -2
- package/dist/chunk-index-gpkzhq1g.js +0 -2
- package/dist/chunk-index-hk3xyy20.js +0 -2
- package/dist/chunk-index-jm23vn03.js +0 -4
- package/dist/chunk-index-k7gh0jvz.js +0 -2
- package/dist/chunk-index-ky42ev0b.js +0 -2
- package/dist/chunk-index-pa2yyqh0.js +0 -2
- package/dist/chunk-index-pcvt668q.js +0 -2
- package/dist/chunk-index-pqw27eye.js +0 -1
- package/dist/chunk-index-wmbmmrd4.js +0 -302
- package/dist/chunk-index-ymbjrsp6.js +0 -2
- package/dist/chunk-lang-css-t85r8rz0.js +0 -1
- package/dist/chunk-lang-html-n6jparge.js +0 -1
- package/dist/chunk-lang-javascript-xj00cp97.js +0 -1
- package/dist/chunk-lang-markdown-zxx8eke8.js +0 -6
- package/dist/chunk-lang-typescript-8f6yywt3.js +0 -1
- package/dist/chunk-layout-actions-bv0chj41.js +0 -1
- package/dist/chunk-notes-9b7pgqfe.js +0 -1
- package/dist/chunk-overview-8yw71esz.js +0 -1
- package/dist/chunk-palette-frms7axe.js +0 -1
- package/dist/chunk-placement-items-fvfy9m0y.js +0 -1
- package/dist/chunk-prompt-history-yrqehads.js +0 -1
- package/dist/chunk-prompts-g6609tqx.js +0 -1
- package/dist/chunk-room-confirms-0a2y0925.js +0 -1
- package/dist/chunk-room-menu-g11q97br.js +0 -1
- package/dist/chunk-rooms-menu-button-h9qge48n.js +0 -1
- package/dist/chunk-schedules-ezmacrbj.js +0 -1
- package/dist/chunk-sheet-hosts-b0azyfhb.js +0 -1
- package/dist/chunk-skill-editor-h6k6whwg.js +0 -8
- package/dist/chunk-skills-gqcfhq56.js +0 -1
- package/dist/chunk-switcher-list-mcpamqnj.js +0 -1
- package/dist/chunk-table-s8cde1xz.js +0 -1
- package/dist/chunk-table-seats-wqkjn8bc.js +0 -1
- package/dist/chunk-transcript-c59c6mpm.js +0 -1
- package/dist/chunk-workspace-0cyspkk4.js +0 -1
- package/dist/chunk-zh-tw-nc93jm10.js +0 -1
package/src/web-plugin.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
1
2
|
import { join } from "node:path";
|
|
2
3
|
import {
|
|
3
4
|
AGENTS,
|
|
@@ -6,12 +7,14 @@ import {
|
|
|
6
7
|
IDENTITY,
|
|
7
8
|
MEMORY,
|
|
8
9
|
MODES,
|
|
10
|
+
PROFILES,
|
|
9
11
|
PROMPTS,
|
|
10
12
|
type RoundtablePlugin,
|
|
11
13
|
SCHEDULES,
|
|
12
14
|
SKILLS,
|
|
13
15
|
} from "pi-roundtable";
|
|
14
16
|
import { DISCORD } from "pi-roundtable/discord";
|
|
17
|
+
import type { KindLinkView, PageLinkView, PaneName } from "./api-types.ts";
|
|
15
18
|
import { APP_MIGRATIONS, OwnerApp } from "./app/app.ts";
|
|
16
19
|
import { APP_PROTOCOL } from "./app/protocol.ts";
|
|
17
20
|
import { UPLOAD_FRAMING_BYTES } from "./app/uploads.ts";
|
|
@@ -21,8 +24,16 @@ import {
|
|
|
21
24
|
createAuthenticator,
|
|
22
25
|
WEB_CONSOLE_IDENTITY,
|
|
23
26
|
} from "./auth/authenticator.ts";
|
|
24
|
-
import {
|
|
27
|
+
import { discoverProvider, OidcLogin } from "./auth/oidc.ts";
|
|
28
|
+
import { loadSessionKey } from "./auth/session-key.ts";
|
|
29
|
+
import { WebSessions } from "./auth/sessions.ts";
|
|
30
|
+
import {
|
|
31
|
+
type AccessView,
|
|
32
|
+
ConsoleApi,
|
|
33
|
+
type ConsolePorts,
|
|
34
|
+
} from "./console-api.ts";
|
|
25
35
|
import { ConsoleServer } from "./console-server.ts";
|
|
36
|
+
import { Gate } from "./gate.ts";
|
|
26
37
|
import {
|
|
27
38
|
protectedDirs,
|
|
28
39
|
type ResolvedOptions,
|
|
@@ -32,7 +43,11 @@ import {
|
|
|
32
43
|
workspaceRootsOf,
|
|
33
44
|
} from "./options.ts";
|
|
34
45
|
import { loadVapid } from "./push/vapid.ts";
|
|
35
|
-
import { consoleVisitors } from "./visitors.ts";
|
|
46
|
+
import { accessVisitors, consoleVisitors } from "./visitors.ts";
|
|
47
|
+
import { hostIcon, viewerOf, WEB_APP, WebAppRegistry } from "./web-app.ts";
|
|
48
|
+
|
|
49
|
+
/** How often sessions past their limit are deleted: daily. */
|
|
50
|
+
const SESSION_SWEEP_MS = 86_400_000;
|
|
36
51
|
|
|
37
52
|
/** The longest a WebSocket stays open under `password` auth: the session cookie is looked at again after this. */
|
|
38
53
|
const PASSWORD_SOCKET_LIFE_MS = 3_600_000;
|
|
@@ -49,11 +64,16 @@ export function webConsole(options: WebConsoleOptions): RoundtablePlugin {
|
|
|
49
64
|
const { auth } = settings;
|
|
50
65
|
const rooms = settings.panes.includes("rooms");
|
|
51
66
|
const schedules = settings.panes.includes("schedules");
|
|
67
|
+
const migrations = [
|
|
68
|
+
...(rooms ? APP_MIGRATIONS : []),
|
|
69
|
+
...(auth.mode === "oidc" ? [WebSessions.migration] : []),
|
|
70
|
+
];
|
|
52
71
|
return definePlugin({
|
|
53
72
|
name: "web-console",
|
|
54
|
-
...(
|
|
55
|
-
|
|
56
|
-
|
|
73
|
+
...(migrations.length > 0 ? { migrations } : {}),
|
|
74
|
+
provides: [WEB_APP],
|
|
75
|
+
// `none` and `password` speak for one principal through this identity; a verifier or a sign-in brings its own.
|
|
76
|
+
...(auth.mode !== "none" && auth.mode !== "password"
|
|
57
77
|
? {}
|
|
58
78
|
: {
|
|
59
79
|
identities: [
|
|
@@ -68,7 +88,10 @@ export function webConsole(options: WebConsoleOptions): RoundtablePlugin {
|
|
|
68
88
|
...(settings.panes.includes("overview") || rooms ? [AGENTS] : []),
|
|
69
89
|
...(rooms ? [MODES] : []),
|
|
70
90
|
...(schedules ? [SCHEDULES] : []),
|
|
71
|
-
|
|
91
|
+
// A list that names the notes pane needs the memory; the default list drops it without one.
|
|
92
|
+
...(settings.panesGiven && settings.panes.includes("notes")
|
|
93
|
+
? [MEMORY]
|
|
94
|
+
: []),
|
|
72
95
|
],
|
|
73
96
|
setup: (context) => build(settings, context),
|
|
74
97
|
});
|
|
@@ -78,6 +101,20 @@ type Context = Parameters<RoundtablePlugin["setup"]>[0];
|
|
|
78
101
|
|
|
79
102
|
async function build(settings: ResolvedOptions, context: Context) {
|
|
80
103
|
const { services, queue, logger, env } = context;
|
|
104
|
+
// What the other plugins register their rooms, pages and steps in: sealed when the web service starts.
|
|
105
|
+
const webApp = new WebAppRegistry(settings.surface);
|
|
106
|
+
services.provide(WEB_APP, webApp);
|
|
107
|
+
const external = settings.push.sender !== "internal";
|
|
108
|
+
const vapidFile = join(settings.dataDir, "web", "vapid.json");
|
|
109
|
+
// An external sender holds the key: the app never makes or reads one, and a leftover file would say it does.
|
|
110
|
+
if (external && existsSync(vapidFile))
|
|
111
|
+
throw new Error(
|
|
112
|
+
`web-console: push.sender is external, but ${vapidFile} exists. The app must not hold a push key: delete the file (devices subscribe again against the sender's key)`,
|
|
113
|
+
);
|
|
114
|
+
if (settings.admission === "access" && env.agentTools === "full")
|
|
115
|
+
logger.warn(
|
|
116
|
+
"web-console: admission is access and the agents carry shell tools. Anyone who can write the database can make a web session, and an agent with a shell can; keep admission owners behind a signing proxy, or run the agent server with tools chat-only",
|
|
117
|
+
);
|
|
81
118
|
const features =
|
|
82
119
|
typeof settings.features === "function"
|
|
83
120
|
? await settings.features(context)
|
|
@@ -110,9 +147,20 @@ async function build(settings: ResolvedOptions, context: Context) {
|
|
|
110
147
|
"web-console: the workspace pane needs a directory to show: the agents' workspace (the agent server provides it) or workspace.roots",
|
|
111
148
|
);
|
|
112
149
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
150
|
+
// The default list shows the notes pane only when the host keeps memory.
|
|
151
|
+
const memory = services.find(MEMORY);
|
|
152
|
+
const withoutNotes = !settings.panesGiven && memory === undefined;
|
|
153
|
+
if (withoutNotes && settings.panes.includes("notes"))
|
|
154
|
+
logger.warn("the notes pane is left out: this host keeps no memory");
|
|
155
|
+
const servable = (pane: PaneName) =>
|
|
156
|
+
(pane !== "workspace" || workspaceRoots.length > 0) &&
|
|
157
|
+
(pane !== "notes" || !withoutNotes);
|
|
158
|
+
const panes = settings.panes.filter(servable);
|
|
159
|
+
const tierPanes = {
|
|
160
|
+
owner: panes,
|
|
161
|
+
admin: settings.tierPanes.admin.filter(servable),
|
|
162
|
+
member: settings.tierPanes.member.filter(servable),
|
|
163
|
+
};
|
|
116
164
|
if (workspaceRoots.length > 0) checkRoots(workspaceRoots, guarded);
|
|
117
165
|
const workspace =
|
|
118
166
|
panes.includes("workspace") && rooms
|
|
@@ -126,6 +174,11 @@ async function build(settings: ResolvedOptions, context: Context) {
|
|
|
126
174
|
// Absent on a host without the registry: the console then lists conversations found by name only.
|
|
127
175
|
const registry = services.find(CONVERSATIONS);
|
|
128
176
|
const identity = services.get(IDENTITY);
|
|
177
|
+
const profiles = services.find(PROFILES);
|
|
178
|
+
if (settings.admission === "access" && !profiles)
|
|
179
|
+
throw new Error(
|
|
180
|
+
"web-console: admission access needs the PROFILES service; a plugin that replaces IDENTITY must provide PROFILES too",
|
|
181
|
+
);
|
|
129
182
|
// An agent's skills are chosen from what the Skills pane lists when the host supplies it, else from the addon's own catalog.
|
|
130
183
|
const skillRegistry = services.find(SKILLS);
|
|
131
184
|
const skills = skillRegistry
|
|
@@ -150,21 +203,83 @@ async function build(settings: ResolvedOptions, context: Context) {
|
|
|
150
203
|
};
|
|
151
204
|
// A broken page stops startup here, before anything connects.
|
|
152
205
|
const assets = loadAssets(settings.assetDir);
|
|
206
|
+
const gate = new Gate({ registry: webApp });
|
|
207
|
+
/** The `icon` of a link when the host named one of the console's icons. */
|
|
208
|
+
const iconOf = (name: unknown) => {
|
|
209
|
+
const icon = hostIcon(name);
|
|
210
|
+
return icon ? { icon } : {};
|
|
211
|
+
};
|
|
212
|
+
const hosted: ConsolePorts["hosted"] = async (visitor) => {
|
|
213
|
+
const viewer = viewerOf(visitor);
|
|
214
|
+
const pages: PageLinkView[] = [];
|
|
215
|
+
for (const page of webApp.hostPages()) {
|
|
216
|
+
try {
|
|
217
|
+
if (await page.visible(viewer))
|
|
218
|
+
pages.push({
|
|
219
|
+
id: page.id,
|
|
220
|
+
label: page.label,
|
|
221
|
+
place: page.place,
|
|
222
|
+
...iconOf(page.icon),
|
|
223
|
+
});
|
|
224
|
+
} catch (error) {
|
|
225
|
+
logger.warn(
|
|
226
|
+
{ page: page.id, err: error },
|
|
227
|
+
"a page's visibility was not read",
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
const kinds: KindLinkView[] = [];
|
|
232
|
+
for (const kind of webApp.kinds()) {
|
|
233
|
+
try {
|
|
234
|
+
if ((await kind.list(viewer, {})) !== undefined)
|
|
235
|
+
kinds.push({
|
|
236
|
+
kind: kind.kind,
|
|
237
|
+
label: kind.label,
|
|
238
|
+
...iconOf(kind.icon),
|
|
239
|
+
});
|
|
240
|
+
} catch (error) {
|
|
241
|
+
logger.warn(
|
|
242
|
+
{ kind: kind.kind, err: error },
|
|
243
|
+
"a kind of room was not listed",
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return { pages, kinds };
|
|
248
|
+
};
|
|
249
|
+
const access: AccessView | undefined =
|
|
250
|
+
settings.admission === "access"
|
|
251
|
+
? {
|
|
252
|
+
push: {
|
|
253
|
+
tiers: settings.push.tiers,
|
|
254
|
+
...(settings.push.sender !== "internal"
|
|
255
|
+
? {
|
|
256
|
+
key: settings.push.sender.external.publicKey,
|
|
257
|
+
...(settings.push.sender.external.subscribePath
|
|
258
|
+
? {
|
|
259
|
+
subscribe: settings.push.sender.external.subscribePath,
|
|
260
|
+
}
|
|
261
|
+
: {}),
|
|
262
|
+
}
|
|
263
|
+
: {}),
|
|
264
|
+
},
|
|
265
|
+
gate: (visitor) => gate.required(viewerOf(visitor)),
|
|
266
|
+
}
|
|
267
|
+
: undefined;
|
|
153
268
|
const api = new ConsoleApi({
|
|
154
269
|
title: settings.title,
|
|
155
270
|
timeZone: env.timeZone,
|
|
156
271
|
panes,
|
|
272
|
+
tierPanes,
|
|
273
|
+
...(access ? { access } : {}),
|
|
274
|
+
hosted,
|
|
157
275
|
sessionsDir: settings.sessionsDir,
|
|
158
276
|
...(team ? { team } : {}),
|
|
159
277
|
queue,
|
|
160
278
|
...(connection
|
|
161
279
|
? { channelName: (id: string) => connection.channelInfo(id) }
|
|
162
280
|
: {}),
|
|
163
|
-
...(
|
|
164
|
-
? {
|
|
165
|
-
memoryOf: (principalId: string) =>
|
|
166
|
-
services.get(MEMORY).forSpeaker(principalId),
|
|
167
|
-
}
|
|
281
|
+
...(panes.includes("notes") && memory
|
|
282
|
+
? { memoryOf: (principalId: string) => memory.forSpeaker(principalId) }
|
|
168
283
|
: {}),
|
|
169
284
|
people: identity,
|
|
170
285
|
...(settings.exclude ? { exclude: settings.exclude } : {}),
|
|
@@ -177,16 +292,45 @@ async function build(settings: ResolvedOptions, context: Context) {
|
|
|
177
292
|
characterSkins: env.characterSkins,
|
|
178
293
|
...(settings.routing === "path" ? { mountPath: settings.mount } : {}),
|
|
179
294
|
...(rooms
|
|
180
|
-
? {
|
|
295
|
+
? {
|
|
296
|
+
app: {
|
|
297
|
+
surface: settings.surface,
|
|
298
|
+
protocol: APP_PROTOCOL,
|
|
299
|
+
...(settings.modes ? {} : { modes: false as const }),
|
|
300
|
+
},
|
|
301
|
+
}
|
|
181
302
|
: {}),
|
|
182
303
|
...(settings.presentation ? { presentation: settings.presentation } : {}),
|
|
183
304
|
});
|
|
305
|
+
const identify =
|
|
306
|
+
settings.admission === "access"
|
|
307
|
+
? accessVisitors(identity, { surface: settings.surface, logger })
|
|
308
|
+
: consoleVisitors(identity, {
|
|
309
|
+
logger,
|
|
310
|
+
...(settings.ownerId ? { ownerId: settings.ownerId } : {}),
|
|
311
|
+
});
|
|
312
|
+
// An open socket closes when its session ends; the app is made after the sign-in it hangs on.
|
|
313
|
+
let sessionEnded: (id: string) => void = () => undefined;
|
|
314
|
+
let sweeper: ReturnType<typeof setInterval> | undefined;
|
|
315
|
+
const sessions =
|
|
316
|
+
settings.auth.mode === "oidc"
|
|
317
|
+
? new WebSessions(context.database(), { days: settings.auth.sessionDays })
|
|
318
|
+
: undefined;
|
|
319
|
+
const oidc =
|
|
320
|
+
settings.auth.mode === "oidc" && sessions
|
|
321
|
+
? await startOidc(settings.auth, {
|
|
322
|
+
sessions,
|
|
323
|
+
settings,
|
|
324
|
+
identify,
|
|
325
|
+
logger,
|
|
326
|
+
events: context.events,
|
|
327
|
+
ended: (id) => sessionEnded(id),
|
|
328
|
+
})
|
|
329
|
+
: undefined;
|
|
184
330
|
const authenticator = createAuthenticator({
|
|
185
331
|
auth: settings.auth,
|
|
186
|
-
identify
|
|
187
|
-
|
|
188
|
-
...(settings.ownerId ? { ownerId: settings.ownerId } : {}),
|
|
189
|
-
}),
|
|
332
|
+
identify,
|
|
333
|
+
...(oidc && sessions ? { oidc: { login: oidc, sessions } } : {}),
|
|
190
334
|
origin: settings.origin,
|
|
191
335
|
mount: settings.mount,
|
|
192
336
|
title: settings.title,
|
|
@@ -198,21 +342,25 @@ async function build(settings: ResolvedOptions, context: Context) {
|
|
|
198
342
|
address: context.listener(settings.listener),
|
|
199
343
|
},
|
|
200
344
|
});
|
|
201
|
-
if (rooms && !settings.push.subject)
|
|
345
|
+
if (rooms && !external && !settings.push.subject)
|
|
202
346
|
logger.warn(
|
|
203
347
|
"web push is off: the origin is not https, so set push.subject to a mailto: or https: contact",
|
|
204
348
|
);
|
|
205
|
-
const vapid = rooms
|
|
206
|
-
? await loadVapid(join(settings.dataDir, "web", "vapid.json"))
|
|
207
|
-
: undefined;
|
|
349
|
+
const vapid = rooms && !external ? await loadVapid(vapidFile) : undefined;
|
|
208
350
|
const app =
|
|
209
|
-
rooms && vapid
|
|
351
|
+
rooms && (vapid || external)
|
|
210
352
|
? new OwnerApp({
|
|
211
353
|
...(settings.presentation
|
|
212
354
|
? { presentation: settings.presentation }
|
|
213
355
|
: {}),
|
|
356
|
+
extras: {
|
|
357
|
+
...(profiles ? { profiles } : {}),
|
|
358
|
+
routing: settings.routing,
|
|
359
|
+
onboarding: settings.onboarding,
|
|
360
|
+
push: settings.push,
|
|
361
|
+
},
|
|
214
362
|
push: {
|
|
215
|
-
vapid,
|
|
363
|
+
...(vapid ? { vapid } : {}),
|
|
216
364
|
subject: settings.push.subject,
|
|
217
365
|
preview: settings.push.preview,
|
|
218
366
|
...(settings.push.quietHours
|
|
@@ -232,8 +380,21 @@ async function build(settings: ResolvedOptions, context: Context) {
|
|
|
232
380
|
dataDir: settings.dataDir,
|
|
233
381
|
cardGraceSeconds: settings.cardGraceSeconds,
|
|
234
382
|
uploadMaxBytes: settings.uploadMaxBytes,
|
|
383
|
+
uploadKeepDays: settings.uploadKeepDays,
|
|
384
|
+
events: context.events,
|
|
385
|
+
// The name the person goes by in the app, as the profiles name them.
|
|
386
|
+
...(profiles
|
|
387
|
+
? { nameOf: async (id: string) => (await profiles.of(id)).name }
|
|
388
|
+
: {}),
|
|
389
|
+
roomUrl: (room, message) =>
|
|
390
|
+
`${settings.routing === "path" ? `${settings.mount}/room/` : `${settings.mount}/#/room/`}${encodeURIComponent(room)}${message === undefined ? "" : `?message=${message}`}`,
|
|
235
391
|
authenticator,
|
|
236
392
|
authMode: settings.auth.mode,
|
|
393
|
+
admission: settings.admission,
|
|
394
|
+
registry: webApp,
|
|
395
|
+
gate,
|
|
396
|
+
pushTiers: settings.push.tiers,
|
|
397
|
+
modeSwitches: settings.modes,
|
|
237
398
|
// A password session outlives a logout or a new password on an open socket, so the socket is capped.
|
|
238
399
|
...(settings.auth.mode === "password"
|
|
239
400
|
? { socketLifeMs: PASSWORD_SOCKET_LIFE_MS }
|
|
@@ -253,18 +414,25 @@ async function build(settings: ResolvedOptions, context: Context) {
|
|
|
253
414
|
logger,
|
|
254
415
|
})
|
|
255
416
|
: undefined;
|
|
256
|
-
if (app)
|
|
417
|
+
if (app) {
|
|
418
|
+
listeners.push(() => app.changed());
|
|
419
|
+
sessionEnded = (id) => app.sessionEnded(id);
|
|
420
|
+
}
|
|
257
421
|
const server = new ConsoleServer({
|
|
258
422
|
mount: settings.mount,
|
|
259
423
|
assets,
|
|
260
424
|
authenticator,
|
|
261
425
|
pathRouting: settings.routing === "path",
|
|
262
426
|
title: settings.title,
|
|
427
|
+
origin: settings.origin,
|
|
428
|
+
...(settings.description ? { description: settings.description } : {}),
|
|
263
429
|
...(settings.iconsDir ? { iconsDir: settings.iconsDir } : {}),
|
|
264
430
|
look: settings.look,
|
|
265
431
|
...(settings.presentation ? { presentation: settings.presentation } : {}),
|
|
266
432
|
api,
|
|
267
433
|
...(app ? { app } : {}),
|
|
434
|
+
gate,
|
|
435
|
+
surface: settings.surface,
|
|
268
436
|
subscribe: (listener) => {
|
|
269
437
|
listeners.push(listener);
|
|
270
438
|
queue.onChange(listener);
|
|
@@ -277,10 +445,26 @@ async function build(settings: ResolvedOptions, context: Context) {
|
|
|
277
445
|
{
|
|
278
446
|
name: "web-console",
|
|
279
447
|
start: () => {
|
|
448
|
+
checkRegistered(settings, webApp);
|
|
449
|
+
webApp.seal();
|
|
280
450
|
server.start();
|
|
281
451
|
app?.start();
|
|
452
|
+
if (sessions) {
|
|
453
|
+
const sweep = () =>
|
|
454
|
+
sessions
|
|
455
|
+
.sweep()
|
|
456
|
+
.catch((error: unknown) =>
|
|
457
|
+
logger.warn(
|
|
458
|
+
{ err: error },
|
|
459
|
+
"old web sessions were not deleted",
|
|
460
|
+
),
|
|
461
|
+
);
|
|
462
|
+
sweep();
|
|
463
|
+
sweeper = setInterval(sweep, SESSION_SWEEP_MS);
|
|
464
|
+
}
|
|
282
465
|
},
|
|
283
466
|
stop: () => {
|
|
467
|
+
clearInterval(sweeper);
|
|
284
468
|
app?.stop();
|
|
285
469
|
server.stop();
|
|
286
470
|
},
|
|
@@ -297,3 +481,72 @@ async function build(settings: ResolvedOptions, context: Context) {
|
|
|
297
481
|
dashboard: [`Web console: ${settings.origin}${settings.mount}/`],
|
|
298
482
|
};
|
|
299
483
|
}
|
|
484
|
+
|
|
485
|
+
/** What the host registered, checked when the service starts: every provider onboarding names has its prover. */
|
|
486
|
+
function checkRegistered(settings: ResolvedOptions, webApp: WebAppRegistry) {
|
|
487
|
+
if (
|
|
488
|
+
settings.onboarding.push !== "off" &&
|
|
489
|
+
(!settings.panes.includes("rooms") ||
|
|
490
|
+
(settings.push.sender === "internal" && !settings.push.subject))
|
|
491
|
+
)
|
|
492
|
+
throw new Error(
|
|
493
|
+
"web-console: onboarding.push asks people to turn push on, but push is off here. It needs the rooms pane and a push.subject (or an external sender)",
|
|
494
|
+
);
|
|
495
|
+
for (const provider of Object.keys(settings.onboarding.links))
|
|
496
|
+
if (!webApp.prover(provider))
|
|
497
|
+
throw new Error(
|
|
498
|
+
`web-console: onboarding.links names ${provider}, but no plugin registered a link prover for it (WEB_APP.registerLinkProver)`,
|
|
499
|
+
);
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
interface OidcParts {
|
|
503
|
+
sessions: WebSessions;
|
|
504
|
+
settings: ResolvedOptions;
|
|
505
|
+
identify: Parameters<typeof createAuthenticator>[0]["identify"];
|
|
506
|
+
logger: Context["logger"];
|
|
507
|
+
events: Context["events"];
|
|
508
|
+
ended(id: string): void;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
/** Reads the provider's discovery document, the client secret and the session key, and makes the sign-in flow. */
|
|
512
|
+
async function startOidc(
|
|
513
|
+
auth: Extract<ResolvedOptions["auth"], { mode: "oidc" }>,
|
|
514
|
+
parts: OidcParts,
|
|
515
|
+
): Promise<OidcLogin> {
|
|
516
|
+
const { settings, logger } = parts;
|
|
517
|
+
let clientSecret: string | undefined;
|
|
518
|
+
if (auth.clientSecretEnv) {
|
|
519
|
+
clientSecret = process.env[auth.clientSecretEnv];
|
|
520
|
+
if (!clientSecret)
|
|
521
|
+
throw new Error(
|
|
522
|
+
`web-console: auth.clientSecretEnv names ${auth.clientSecretEnv}, which is not set`,
|
|
523
|
+
);
|
|
524
|
+
}
|
|
525
|
+
return new OidcLogin({
|
|
526
|
+
settings: auth,
|
|
527
|
+
metadata: await discoverProvider(auth),
|
|
528
|
+
...(clientSecret ? { clientSecret } : {}),
|
|
529
|
+
sessions: parts.sessions,
|
|
530
|
+
key: loadSessionKey(settings.dataDir, logger),
|
|
531
|
+
origin: settings.origin,
|
|
532
|
+
mount: settings.mount,
|
|
533
|
+
surface: settings.surface,
|
|
534
|
+
routing: settings.routing,
|
|
535
|
+
title: settings.title,
|
|
536
|
+
presentation: settings.presentation,
|
|
537
|
+
identify: parts.identify,
|
|
538
|
+
onSignIn: (info) =>
|
|
539
|
+
parts.events.action?.({
|
|
540
|
+
kind: "sign-in",
|
|
541
|
+
actor: info.speakerId,
|
|
542
|
+
principalId: info.principalId,
|
|
543
|
+
ok: true,
|
|
544
|
+
at: new Date(),
|
|
545
|
+
}),
|
|
546
|
+
onEnded: parts.ended,
|
|
547
|
+
...(auth.onSessionVerified
|
|
548
|
+
? { onSessionVerified: auth.onSessionVerified }
|
|
549
|
+
: {}),
|
|
550
|
+
logger,
|
|
551
|
+
});
|
|
552
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s,Ht,l,r,p,e,n,a,zt,ar}from"./chunk-index-31wh5twj.js";import{N}from"./chunk-index-5d8yjj4m.js";var k=()=>typeof matchMedia==="function"&&matchMedia("(max-width: 719px)").matches,x={rtMenu:!0},g=()=>Boolean(window.history.state?.rtMenu),E=8,y=(t)=>t?.isConnected?t:null;function b(t){return t.items.map((o)=>n("button",{type:"button",role:o.checked===void 0?"menuitem":"menuitemcheckbox",...o.checked===void 0?{}:{"aria-checked":o.checked},className:"menu-item menu-link","data-tone":o.tone,onClick:()=>t.onChoose(o),children:[o.icon?e("span",{className:"menu-icon","data-tone":o.tone,children:e(a,{name:o.icon,size:18})}):null,e("span",{className:"menu-text",children:e("strong",{children:o.label})}),o.checked?e(a,{name:"check",size:18,className:"menu-check"}):null]},o.id))}function H({menu:t}){let o=l(void 0);if(t)o.current=t;let i=o.current,m=l(!1),v=l(void 0),h=t?.serial;return s(()=>{if(h===void 0)return;return window.history.pushState(x,"",window.location.href),m.current=!0,()=>{if(m.current)m.current=!1,window.history.back()}},[h]),s(()=>{let f=()=>{if(!m.current||g())return;m.current=!1,zt();let M=v.current;v.current=void 0,M?.()};return window.addEventListener("popstate",f),()=>window.removeEventListener("popstate",f)},[]),e(N,{open:t!==void 0,title:i?.title??"",onClose:zt,restoreFocus:()=>y(i?.source??null),children:i?e("div",{className:"menu action-items",role:"menu","aria-label":i.title,children:e(b,{items:i.items,onChoose:(f)=>{if(!m.current){zt(),f.run();return}v.current=f.run,window.history.back()}})}):null})}function T({menu:t}){let o=l(null),[i,m]=r(t.at),{source:v}=t,h=(u)=>{y(v)?.focus(),zt(),u?.()},f=l(h);f.current=h,Ht(()=>{let u=o.current;if(!u)return;let c=u.getBoundingClientRect();m({x:Math.max(E,Math.min(t.at.x,window.innerWidth-c.width-E)),y:Math.max(E,Math.min(t.at.y,window.innerHeight-c.height-E))}),u.querySelector('[role^="menuitem"]')?.focus()},[t.serial]),s(()=>{let u=(d)=>{if(d.target instanceof Node&&o.current?.contains(d.target))return;zt()},c=()=>zt();return document.addEventListener("pointerdown",u,!0),document.addEventListener("wheel",u,{capture:!0,passive:!0}),document.addEventListener("touchmove",u,{capture:!0,passive:!0}),window.addEventListener("resize",c),()=>{document.removeEventListener("pointerdown",u,!0),document.removeEventListener("wheel",u,!0),document.removeEventListener("touchmove",u,!0),window.removeEventListener("resize",c)}},[]);let M=(u)=>{let c=[...o.current?.querySelectorAll('[role^="menuitem"]')??[]],d=c.indexOf(document.activeElement),w=(L)=>{u.preventDefault(),c[(L+c.length)%c.length]?.focus()};switch(u.key){case"Escape":u.preventDefault(),u.stopPropagation(),f.current();return;case"ArrowDown":return w(d+1);case"ArrowUp":return w(d<0?-1:d-1);case"Tab":return w(u.shiftKey?d<0?-1:d-1:d+1);case"Home":return w(0);case"End":return w(-1)}};return e("div",{ref:o,className:"action-popover",role:"menu","aria-label":t.title,tabIndex:-1,style:{left:`${i.x}px`,top:`${i.y}px`},onKeyDown:M,children:e(b,{items:t.items,onChoose:(u)=>h(u.run)})})}function O(){let t=ar(),o=l(void 0);if(t&&o.current?.serial!==t.serial)o.current={serial:t.serial,sheet:k()};let i=Boolean(t&&o.current?.sheet);return n(p,{children:[e(H,{menu:i?t:void 0}),t&&!i?e(T,{menu:t},t.serial):null]})}export{O as ActionMenuHost};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{O,W,P,de,X,l,t,p,e,n,a,d,_,Q,se,Oe,kt,Dt,Wn,Pn,xi,en,Qn}from"./chunk-index-31wh5twj.js";import{Se}from"./chunk-index-12bw9yj8.js";import{fn,pn,mn,wt}from"./chunk-index-wmbmmrd4.js";import{yn}from"./chunk-index-89ajmxh7.js";import{Et,gt}from"./chunk-index-gpkzhq1g.js";fn();var T=P(()=>(O("5cp8stna"),import("./chunk-folder-list-5cp8stna.js")).then((o)=>({default:o.FolderList}))),D=de(function(i){let{view:r}=i,g=wt(()=>kt(r.key),r.home?void 0:pn(r.key));return e(xi,{...i,press:g,item:{...r.home?{}:{"data-drop-item":"","data-key":r.key},...i.arranging?{"data-arranging":""}:{}},after:i.arranging?e("button",{type:"button",className:"icon-button row-more","aria-haspopup":"menu","aria-label":t("Room menu"),onClick:(c)=>{let m=c.currentTarget;kt(r.key).then((u)=>{if(!u)return;let f=m.getBoundingClientRect();Oe({...u,at:{x:f.left,y:f.bottom},via:"key",source:m})},()=>{return})},children:e(a,{name:"more",size:18})}):null})});function z(o){let{now:i}=se(),{timeZone:r}=Q(),g=en(o.rooms);return e("ul",{className:"room-list",children:g.map(({key:c,...m})=>{let u=o.threads[c];return e(D,{...m,active:c===o.active,now:i,timeZone:r,arranging:o.arranging,...u?{threads:e(Qn,{open:u.open,closed:u.closed,active:o.active})}:{}},c)})})}function v(o){let r=en(o.rooms).length===0;if(r&&o.zone?.kind!=="pinned")return null;return n("section",{className:"stack",...r?{"data-empty":""}:{},...o.zone?{"data-drop-zone":o.zone.kind,"data-zone-id":o.zone.id}:{},children:[e("h2",{className:"section-title",children:o.title}),r?null:e(z,{rooms:o.rooms,threads:o.threads,active:o.active,arranging:o.arranging})]})}function oe(o){let i=d((s)=>JSON.stringify({listed:s.listed,...Et(s,(L)=>gt(s,L))})),r=mn(),g=l(i);if(!r)g.current=i;let c=g.current,{listed:m,...u}=X(()=>JSON.parse(c),[c]),{home:f,pinned:N,folders:y,restAgents:A,restGroups:S,rest:R,threads:w,orphans:h}=u,k=Wn(),C=f.length+N.length+R.length===0&&y.every((s)=>s.rooms.length===0)&&h.open.length+h.closed.length===0,b={threads:w,active:o.active,arranging:k};return n("div",{className:"page","data-column":o.active?"":void 0,"data-drop-root":"",children:[n("header",{className:"page-head",children:[e("h1",{children:t("Rooms")}),n("div",{className:"actions",children:[n("button",{type:"button",className:"header-button search-button",onClick:o.onSearch,children:[e(a,{name:"search",size:16}),e("span",{children:t("Find a room")}),e("kbd",{children:"⌘K"})]}),m?e("button",{type:"button",className:"header-button icon-button","aria-haspopup":"menu","aria-label":t("Folders and order"),onClick:(s)=>yn(s.currentTarget),children:e(a,{name:"more",size:18})}):null,e("button",{type:"button",className:"header-button icon-button","aria-label":t("Add"),"aria-haspopup":"menu",onClick:(s)=>Dt(s.currentTarget),children:e(a,{name:"plus"})})]})]}),k?n("div",{className:"arrange-bar",children:[n("button",{type:"button",className:"secondary",onClick:()=>Se({kind:"new"}),children:[e(a,{name:"plus",size:16}),e("span",{children:t("Add a folder")})]}),e("button",{type:"button",onClick:()=>Pn(!1),children:t("Done")})]}):null,m&&C?e(_,{children:t("No rooms yet. Rooms appear when the team has an agent.")}):null,!m?n("div",{className:"stack","aria-busy":"true",children:[e("div",{className:"skeleton"}),e("div",{className:"skeleton"}),e("div",{className:"skeleton"})]}):null,e(v,{title:t("Home"),rooms:f,...b}),e(v,{title:t("Pinned"),rooms:N,zone:{kind:"pinned",id:"pinned"},...b}),y.length>0?e("div",{className:"stack folder-list","data-folder-list":"",children:e(W,{fallback:e("div",{className:"skeleton","aria-busy":"true"}),children:e(T,{folders:y,active:o.active,listed:m,rooms:(s)=>e(z,{rooms:s,threads:w,active:o.active,arranging:k})})})}):null,y.length>0?e(v,{title:t("Ungrouped"),rooms:R,zone:{kind:"rest",id:"rest"},...b}):n(p,{children:[e(v,{title:t("Agents"),rooms:A,zone:{kind:"rest",id:"rest-agents"},...b}),e(v,{title:t("Groups"),rooms:S,zone:{kind:"rest",id:"rest-groups"},...b})]}),h.open.length+h.closed.length>0?n("section",{className:"stack",children:[e("h2",{className:"section-title",children:t("Dispatch threads")}),e(Qn,{open:h.open,closed:h.closed,active:o.active})]}):null]})}export{oe as ArrangedRoomsPage};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Ce,Tt,V,Mn,Vt}from"./chunk-index-18gxy79n.js";import{de,Oi,s,D,X,l,r,t,c,p,e,n,xn,h,me,m,f,Ie,jt,oe,$e}from"./chunk-index-31wh5twj.js";import{re}from"./chunk-index-ky42ev0b.js";import{N}from"./chunk-index-5d8yjj4m.js";var ue={"hat.none":"No hat","hat.goggcap":"Leather cap","hat.tallcap":"Burgundian felt cap","hat.softcap":"Soft cap","hat.hardhat":"Iron skullcap","hat.fcap":"Hunter's cap","hat.winghelm":"Winged helm","hat.helm":"Helm","hat.mortar":"Biretta","hat.beret":"Chaperon","hat.goggles":"Pointed cap","hat.tricorn":"Pilgrim hat","hat.sailor":"Straw hat","hat.kettle":"Kettle hat","hat.cavalier":"Feathered hat","hat.toque":"Linen cook's cap","hair.none":"No hair","beard.none":"No beard","accessory.none":"No accessory","prop.beads":"Prayer beads","prop.marotte":"Marotte","prop.map":"Chart","prop.flask":"Alchemist's phial","prop.telescope":"Astrolabe","prop.wrench":"Dividers","outfit.surplice":"Surplice","outfit.overalls":"Work jerkin","outfit.armor":"Mail hauberk","outfit.apron":"Smith's apron","outfit.chef":"Cook's tunic","outfit.coat":"Doublet","outfit.vest":"Pourpoint","outfit.sailor":"Mariner's tunic","hair.bob":"Bob","hair.bun":"Bun","hair.ponytail":"Ponytail"},x=(a)=>a.charAt(0).toUpperCase()+a.slice(1);function P(a,o){let b=`character.${a}.${o}`,g=t(b);if(g!==b)return g;if(a==="class")return V.classes[o]?.label??x(o);return ue[`${a}.${o}`]??x(o)}function Q(a){let o=`character.jobs.${a}`,b=t(o);return b!==o?b:V.classes[a]?.jobs??""}var M=[{field:"hat",title:c("Hat"),ids:V.hats},{field:"outfit",title:c("Outfit"),ids:V.outfits},{field:"prop",title:c("Prop"),ids:V.props},{field:"hair",title:c("Hair"),ids:V.hair},{field:"beard",title:c("Beard"),ids:["none",...V.beards]},{field:"accessory",title:c("Accessory"),ids:["none",...V.accessories]}],fe=new Set(["class","colors","palette","build","skin","hairColor",...M.map((a)=>a.field)]),te=Object.keys(V.palettes),Y={idle:c("Idle"),thinking:c("Thinking"),working:c("Working"),waiting:c("Waiting for you"),done:c("Done"),error:c("Error"),sleepy:c("Sleepy")},he={slim:c("Slim"),regular:c("Regular"),stout:c("Stout")};function O(a){return{class:a.class,outfit:a.outfit,hat:a.hat,prop:a.prop,hair:a.hair,beard:a.beard,accessory:a.accessory,build:a.build,skin:a.skin,hairColor:a.hairColor,colors:{...a.colors}}}var Z=(a)=>JSON.stringify(O(a)),C=(a)=>a[Math.floor(Math.random()*a.length)];function be(){return{class:C(Ce),outfit:C(V.outfits),hat:C(V.hats),prop:C(V.props),hair:C(V.hair),beard:C(["none",...V.beards]),accessory:C(["none",...V.accessories]),build:C(["slim","regular","stout"]),skin:C([0,1,2,3,4,5]),hairColor:C(V.hairColors),palette:C(te)}}var ae=de(function(o){return n("button",{type:"button",className:"creator-tile","aria-pressed":o.pressed,title:o.hint?`${o.label} — ${o.hint}`:o.label,onClick:o.onPick,...o.data,children:[e(oe,{spec:o.spec,size:o.size,live:!1}),e("span",{children:o.label})]})});function ge(a,o,b){let g=JSON.stringify({...a,[o]:0});return X(()=>b.map((d)=>({...a,[o]:d})),[g,o,b])}function pe(){let a=l(null),[o,b]=r();return s(()=>{let g=a.current;if(!g)return;let d=()=>{let S=g.scrollLeft>1,w=g.scrollLeft+g.clientWidth<g.scrollWidth-1;b(S&&w?"both":w?"end":S?"start":void 0)};d(),g.addEventListener("scroll",d,{passive:!0});let y=typeof ResizeObserver>"u"?void 0:new ResizeObserver(d);return y?.observe(g),()=>{g.removeEventListener("scroll",d),y?.disconnect()}},[]),[a,o]}function ye(a){let{part:o}=a,b=ge(a.shown,o.field,o.ids),[g,d]=pe();return e("div",{className:"creator-strip",ref:g,"data-more":d,children:o.ids.map((y,S)=>e(ae,{data:{[`data-${o.field}`]:y},spec:b[S],size:44,label:P(o.field,y),pressed:a.draft[o.field]===y,onPick:()=>a.onPick(y)},y))})}function K(a){return e("button",{type:"button",className:"creator-swatch","aria-pressed":a.pressed,"aria-label":a.label,title:a.label,style:{background:a.background},onClick:a.onPick,...a.data})}function L(a){return n("div",{className:"creator-field","data-field":a.field,children:[a.title?e("h3",{children:a.title}):null,a.children,a.error?e("p",{className:"field-error",role:"alert",children:a.error}):null]})}function Oe(a){let[o,b]=r(a.character),g=Oi(o),[d,y]=r({}),[S,w]=r(!1),[R,ie]=r("idle"),[z,T]=r(),[I,W]=r(),U=Ie("(max-width: 719px)"),_=l(null),F=D(),ne=$e(o),se=jt(),A=Z(o)!==Z(a.character);s(()=>b(a.character),[a.character]),s(()=>{if(!A||a.onPick)return;let i=(k)=>k.preventDefault(),u=(k)=>{if(k.button!==0||k.metaKey||k.ctrlKey||k.shiftKey||k.altKey)return;let E=k.target instanceof Element?k.target.closest("a"):null;if(!E||E.target||E.hasAttribute("download"))return;if(_.current?.contains(E))return;k.preventDefault(),k.stopPropagation(),T({kind:"link",anchor:E})},H=xn((k)=>T({kind:"navigate",proceed:k}));return window.addEventListener("beforeunload",i),document.addEventListener("click",u,!0),()=>{H(),window.removeEventListener("beforeunload",i),document.removeEventListener("click",u,!0)}},[A,a.onPick]);let v=(i)=>{y({}),b((u)=>Mn(i,u))},le=async()=>{if(a.onPick){a.onPick(O(o),o);return}w(!0),y({});try{let i=await m.setCharacter(a.name,O(o));a.onSaved?.(i),h(t("Saved."))}catch(i){let u=i instanceof me&&i.field?i.field.split(".")[0]:void 0,H=u&&fe.has(u)?u:"*";y({[H]:f(i)})}finally{w(!1)}},ce=async()=>{let i=z;if(b(a.character),y({}),i?.kind==="link")setTimeout(()=>i.anchor.click(),0);else if(i?.kind==="navigate")i.proceed()},j=e(L,{field:"class",title:t("Class"),error:d.class,children:e("div",{className:"creator-grid",children:Ce.map((i)=>e(ke,{id:i,base:g,pressed:o.class===i,onPick:()=>v({class:i,colors:o.colors})},i))})}),G=n(L,{field:"colors",title:t("Colors"),error:d.colors??d.palette,children:[n("fieldset",{className:"creator-swatches",children:[e("legend",{className:"visually-hidden",children:t("Palette")}),te.map((i)=>{let u=V.palettes[i];return e(K,{data:{"data-palette":i},label:P("palette",i),pressed:o.palette===i,background:`linear-gradient(135deg, ${u.primary} 52%, ${u.trim} 52%)`,onPick:()=>v({palette:i})},i)})]}),e("div",{className:"creator-custom",children:["primary","secondary","trim"].map((i)=>n("label",{children:[e("span",{children:i==="primary"?t("Primary (the accent)"):i==="secondary"?t("Secondary"):t("Trim")}),e("input",{type:"color",value:o.colors[i],onChange:(u)=>v({colors:{[i]:u.target.value}})})]},i))})]}),J=M.map((i)=>e(L,{field:i.field,title:t(i.title),error:d[i.field],children:e(ye,{part:i,draft:o,shown:g,onPick:(u)=>v({[i.field]:u})})},i.field)),q=n(p,{children:[e(L,{field:"build",title:t("Build"),error:d.build,children:n("fieldset",{className:"segmented",children:[e("legend",{className:"visually-hidden",children:t("Build")}),["slim","regular","stout"].map((i)=>n("label",{"data-checked":o.build===i,children:[e("input",{type:"radio",name:`${F}-build`,checked:o.build===i,onChange:()=>v({build:i})}),ee(i)]},i))]})}),e(L,{field:"skin",title:t("Skin tone"),error:d.skin,children:n("fieldset",{className:"creator-swatches",children:[e("legend",{className:"visually-hidden",children:t("Skin tone")}),(se??V.skins).map((i,u)=>e(K,{data:{"data-skin":String(u)},label:t("Skin tone {n}",{n:u+1}),pressed:o.skin===u,background:i,onPick:()=>v({skin:u})},u))]})}),e(L,{field:"hairColor",title:t("Hair color"),error:d.hairColor,children:n("fieldset",{className:"creator-swatches",children:[e("legend",{className:"visually-hidden",children:t("Hair color")}),V.hairColors.map((i,u)=>e(K,{data:{"data-hair-color":i},label:t("Hair color {n}",{n:u+1}),pressed:o.hairColor===i,background:i,onPick:()=>v({hairColor:i})},i)),e("input",{type:"color","aria-label":t("Hair color"),value:o.hairColor,onChange:(i)=>v({hairColor:i.target.value})})]})})]}),B=[{id:"class",title:t("Class"),summary:P("class",o.class),error:d.class,node:j},{id:"colors",title:t("Colors"),summary:o.palette?P("palette",o.palette):o.colors.primary,error:d.colors??d.palette,node:G},...M.map((i,u)=>({id:i.field,title:t(i.title),summary:P(i.field,o[i.field]),error:d[i.field],node:J[u]})),{id:"body",title:t("Body"),summary:ee(o.build),error:d.build??d.skin??d.hairColor,node:q}];return n("form",{ref:_,className:"creator",style:ne,"aria-labelledby":F,onSubmit:(i)=>{if(i.preventDefault(),(A||a.onPick)&&!S)le()},children:[e("h2",{id:F,className:"visually-hidden",children:t("Character of {name}",{name:a.displayName})}),n("div",{className:"creator-preview",children:[e(oe,{spec:o,name:a.name,state:R,size:176,label:t("{name}, {state}",{name:a.displayName,state:t(Y[R])})}),e("button",{type:"button",className:"secondary","data-action":"cycle",onClick:()=>ie((i)=>Tt[(Tt.indexOf(i)+1)%Tt.length]??"idle"),children:t("Preview states")}),e("span",{className:"meta","aria-live":"polite",children:t(Y[R])})]}),n("div",{className:"creator-body",children:[d["*"]?e("p",{className:"field-error",role:"alert","data-field":"*",children:d["*"]}):null,U?e("ul",{className:"creator-sections",children:B.map((i)=>e("li",{children:n("button",{type:"button",className:"creator-section secondary",onClick:()=>W(i.id),children:[e("strong",{children:i.title}),e("span",{className:"meta",children:i.summary}),i.error?e("span",{className:"field-error",role:"alert",children:i.error}):null]})},i.id))}):n(p,{children:[j,G,J,q]}),n("div",{className:"actions creator-actions",children:[e("button",{type:"button",className:"secondary","data-action":"suggest",onClick:()=>{y({}),b(Vt({name:a.name,displayName:a.displayName,prompt:a.prompt}))},children:t("Suggest from role")}),e("button",{type:"button",className:"secondary","data-action":"randomize",onClick:()=>v(be()),children:t("Randomize")}),e("button",{type:"button",className:"secondary","data-action":"cancel",onClick:()=>{if(a.onCancel)a.onCancel();else if(A)T({kind:"cancel"})},children:t("Cancel")}),e("button",{type:"submit","data-action":"save",disabled:!A&&!a.onPick||S,children:S?t("Saving…"):a.onPick?t("Use this look"):t("Save")})]})]}),e(N,{open:U&&I!==void 0,title:B.find((i)=>i.id===I)?.title??"",onClose:()=>W(void 0),children:e("div",{className:"stack",children:B.find((i)=>i.id===I)?.node})}),e(re,{open:z!==void 0,title:t("Discard your changes?"),confirmLabel:t("Discard"),cancelLabel:t("Keep editing"),tone:"danger",onClose:()=>T(void 0),onConfirm:ce,children:e("p",{children:t("The new look for {name} has not been saved.",{name:a.displayName})})})]})}var ee=(a)=>t(he[a]);function ke(a){let o=a.base.colors,b=X(()=>Mn({class:a.id,colors:o}),[a.id,o]);return e(ae,{data:{"data-class":a.id},spec:b,size:56,label:P("class",a.id),hint:Q(a.id),pressed:a.pressed,onPick:a.onPick})}export{Oe as CharacterCreator};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{z,le,Cn,Ii,An,Fe,ce,o,g,ve,Pe,bt,Qe,U,te,ne,A,et,tt,Me,ue,k,K,xe,u,ot,Di,Ui,Vi,$n,ln,Bi,qi,Fi,Gi,v,i,T,Xe,St,dn,si,Zt,Wt,Yi,Hi,Ze}from"./chunk-index-4ecjtdy8.js";import{O}from"./chunk-index-31wh5twj.js";var on=(e)=>{let{state:t}=e,n=t.doc.lineAt(t.selection.main.from),r=Le(e.state,n.from);return r.line?sn(e):r.block?an(e):!1};function Ae(e,t){return({state:n,dispatch:r})=>{if(n.readOnly)return!1;let l=e(t,n);if(!l)return!1;return r(n.update(l)),!0}}var sn=Ae(fn,0);var cn=Ae(nt,0);var an=Ae((e,t)=>nt(e,t,hn(t)),0);function Le(e,t){let n=e.languageDataAt("commentTokens",t,1);return n.length?n[0]:{}}var V=50;function un(e,{open:t,close:n},r,l){let s=e.sliceDoc(r-V,r),c=e.sliceDoc(l,l+V),a=/\s*$/.exec(s)[0].length,h=/^\s*/.exec(c)[0].length,d=s.length-a;if(s.slice(d-t.length,d)==t&&c.slice(h,h+n.length)==n)return{open:{pos:r-a,margin:a&&1},close:{pos:l+h,margin:h&&1}};let f,m;if(l-r<=2*V)f=m=e.sliceDoc(r,l);else f=e.sliceDoc(r,r+V),m=e.sliceDoc(l-V,l);let p=/^\s*/.exec(f)[0].length,E=/\s*$/.exec(m)[0].length,M=m.length-E-n.length;if(f.slice(p,p+t.length)==t&&m.slice(M,M+n.length)==n)return{open:{pos:r+p+t.length,margin:/\s/.test(f.charAt(p+t.length))?1:0},close:{pos:l-E-n.length,margin:/\s/.test(m.charAt(M-1))?1:0}};return null}function hn(e){let t=[];for(let n of e.selection.ranges){let r=e.doc.lineAt(n.from),l=n.to<=r.to?r:e.doc.lineAt(n.to);if(l.from>r.from&&l.from==n.to)l=n.to==r.to+1?r:e.doc.lineAt(n.to-1);let s=t.length-1;if(s>=0&&t[s].to>r.from)t[s].to=l.to;else t.push({from:r.from+/^\s*/.exec(r.text)[0].length,to:l.to})}return t}function nt(e,t,n=t.selection.ranges){let r=n.map((s)=>Le(t,s.from).block);if(!r.every((s)=>s))return null;let l=n.map((s,c)=>un(t,r[c],s.from,s.to));if(e!=2&&!l.every((s)=>s))return{changes:t.changes(n.map((s,c)=>{if(l[c])return[];return[{from:s.from,insert:r[c].open+" "},{from:s.to,insert:" "+r[c].close}]}))};else if(e!=1&&l.some((s)=>s)){let s=[];for(let c=0,a;c<l.length;c++)if(a=l[c]){let h=r[c],{open:d,close:f}=a;s.push({from:d.pos-h.open.length,to:d.pos+d.margin},{from:f.pos-f.margin,to:f.pos+h.close.length})}return{changes:s}}return null}function fn(e,t,n=t.selection.ranges){let r=[],l=-1;e:for(let{from:s,to:c}of n){let a=r.length,h=1e9,d;for(let f=s;f<=c;){let m=t.doc.lineAt(f);if(d==null){if(d=Le(t,m.from).line,!d)continue e}if(m.from>l&&(s==c||c>m.from)){l=m.from;let p=/^\s*/.exec(m.text)[0].length,E=p==m.length,M=m.text.slice(p,p+d.length)==d?p:-1;if(p<m.text.length&&p<h)h=p;r.push({line:m,comment:M,token:d,indent:p,empty:E,single:!1})}f=m.to+1}if(h<1e9){for(let f=a;f<r.length;f++)if(r[f].indent<r[f].line.text.length)r[f].indent=h}if(r.length==a+1)r[a].single=!0}if(e!=2&&r.some((s)=>s.comment<0&&(!s.empty||s.single))){let s=[];for(let{line:a,token:h,indent:d,empty:f,single:m}of r)if(m||!f)s.push({from:a.from+d,insert:h+" "});let c=t.changes(s);return{changes:c,selection:t.selection.map(c,1)}}else if(e!=1&&r.some((s)=>s.comment>=0)){let s=[];for(let{line:c,comment:a,token:h}of r)if(a>=0){let d=c.from+a,f=d+h.length;if(c.text[f-c.from]==" ")f++;s.push({from:d,to:f})}return{changes:s}}return null}var ke=Qe.define(),mn=Qe.define(),pn=g.define(),rt=g.define({combine(e){return et(e,{minDepth:100,newGroupDelay:500,joinToEvent:(t,n)=>n},{minDepth:Math.max,newGroupDelay:Math.min,joinToEvent:(t,n)=>(r,l)=>t(r,l)||n(r,l)})}}),lt=ve.define({create(){return D.empty},update(e,t){let n=t.state.facet(rt),r=t.annotation(ke);if(r){let h=x.fromTransaction(t,r.selection),d=r.side,f=d==0?e.undone:e.done;if(h)f=j(f,f.length,n.minDepth,h);else f=ct(f,t.startState.selection);return new D(d==0?r.rest:f,d==0?f:r.rest)}let l=t.annotation(mn);if(l=="full"||l=="before")e=e.isolate();if(t.annotation(te.addToHistory)===!1)return!t.changes.empty?e.addMapping(t.changes.desc):e;let s=x.fromTransaction(t),c=t.annotation(te.time),a=t.annotation(te.userEvent);if(s)e=e.addChanges(s,c,a,n,t);else if(t.selection)e=e.addSelection(t.startState.selection,c,a,n.newGroupDelay);if(l=="full"||l=="after")e=e.isolate();return e},toJSON(e){return{done:e.done.map((t)=>t.toJSON()),undone:e.undone.map((t)=>t.toJSON())}},fromJSON(e){return new D(e.done.map(x.fromJSON),e.undone.map(x.fromJSON))}});function it(e={}){return[lt,rt.of(e),u.domEventHandlers({beforeinput(t,n){let r=t.inputType=="historyUndo"?Y:t.inputType=="historyRedo"?G:null;if(!r)return!1;return t.preventDefault(),r(n)}})]}function X(e,t){return function({state:n,dispatch:r}){if(!t&&n.readOnly)return!1;let l=n.field(lt,!1);if(!l)return!1;let s=l.pop(e,n,t);if(!s)return!1;return r(s),!0}}var Y=X(0,!1),G=X(1,!1),gn=X(0,!0),yn=X(1,!0);class x{constructor(e,t,n,r,l){this.changes=e,this.effects=t,this.mapped=n,this.startSelection=r,this.selectionsAfter=l}setSelAfter(e){return new x(this.changes,this.effects,this.mapped,this.startSelection,e)}toJSON(){var e,t,n;return{changes:(e=this.changes)===null||e===void 0?void 0:e.toJSON(),mapped:(t=this.mapped)===null||t===void 0?void 0:t.toJSON(),startSelection:(n=this.startSelection)===null||n===void 0?void 0:n.toJSON(),selectionsAfter:this.selectionsAfter.map((r)=>r.toJSON())}}static fromJSON(e){return new x(e.changes&&ce.fromJSON(e.changes),[],e.mapped&&Fe.fromJSON(e.mapped),e.startSelection&&o.fromJSON(e.startSelection),e.selectionsAfter.map(o.fromJSON))}static fromTransaction(e,t){let n=b;for(let r of e.startState.facet(pn)){let l=r(e);if(l.length)n=n.concat(l)}if(!n.length&&e.changes.empty)return null;return new x(e.changes.invert(e.startState.doc),n,void 0,t||e.startState.selection,b)}static selection(e){return new x(void 0,b,void 0,void 0,e)}}function j(e,t,n,r){let l=t+1>n+20?t-n-1:0,s=e.slice(l,t);return s.push(r),s}function xn(e,t){let n=[],r=!1;return e.iterChangedRanges((l,s)=>n.push(l,s)),t.iterChangedRanges((l,s,c,a)=>{for(let h=0;h<n.length;){let d=n[h++],f=n[h++];if(a>=d&&c<=f)r=!0}}),r}function Sn(e,t){return e.ranges.length==t.ranges.length&&e.ranges.filter((n,r)=>n.empty!=t.ranges[r].empty).length===0}function st(e,t){return!e.length?t:!t.length?e:e.concat(t)}var b=[],kn=200;function ct(e,t){if(!e.length)return[x.selection([t])];else{let n=e[e.length-1],r=n.selectionsAfter.slice(Math.max(0,n.selectionsAfter.length-kn));if(r.length&&r[r.length-1].eq(t))return e;return r.push(t),j(e,e.length-1,1e9,n.setSelAfter(r))}}function vn(e){let t=e[e.length-1],n=e.slice();return n[e.length-1]=t.setSelAfter(t.selectionsAfter.slice(0,t.selectionsAfter.length-1)),n}function Se(e,t){if(!e.length)return e;let n=e.length,r=b;while(n){let l=bn(e[n-1],t,r);if(l.changes&&!l.changes.empty||l.effects.length){let s=e.slice(0,n);return s[n-1]=l,s}else t=l.mapped,n--,r=l.selectionsAfter}return r.length?[x.selection(r)]:b}function bn(e,t,n){let r=st(e.selectionsAfter.length?e.selectionsAfter.map((a)=>a.map(t)):b,n);if(!e.changes)return x.selection(r);let l=e.changes.map(t),s=t.mapDesc(e.changes,!0),c=e.mapped?e.mapped.composeDesc(s):s;return new x(l,U.mapEffects(e.effects,t),c,e.startSelection.map(s),r)}var Mn=/^(input\.type|delete)($|\.)/;class D{constructor(e,t,n=0,r=void 0){this.done=e,this.undone=t,this.prevTime=n,this.prevUserEvent=r}isolate(){return this.prevTime?new D(this.done,this.undone):this}addChanges(e,t,n,r,l){let s=this.done,c=s[s.length-1];if(c&&c.changes&&!c.changes.empty&&e.changes&&(!n||Mn.test(n))&&(!c.selectionsAfter.length&&t-this.prevTime<r.newGroupDelay&&r.joinToEvent(l,xn(c.changes,e.changes))||n=="input.type.compose"))s=j(s,s.length-1,r.minDepth,new x(e.changes.compose(c.changes),st(U.mapEffects(e.effects,c.changes),c.effects),c.mapped,c.startSelection,b));else s=j(s,s.length,r.minDepth,e);return new D(s,b,t,n)}addSelection(e,t,n,r){let l=this.done.length?this.done[this.done.length-1].selectionsAfter:b;if(l.length>0&&t-this.prevTime<r&&n==this.prevUserEvent&&n&&/^select($|\.)/.test(n)&&Sn(l[l.length-1],e))return this;return new D(ct(this.done,e),this.undone,t,n)}addMapping(e){return new D(Se(this.done,e),Se(this.undone,e),this.prevTime,this.prevUserEvent)}pop(e,t,n){let r=e==0?this.done:this.undone;if(r.length==0)return null;let l=r[r.length-1],s=l.selectionsAfter[0]||(l.startSelection?l.startSelection.map(l.changes.invertedDesc,1):t.selection);if(n&&l.selectionsAfter.length)return t.update({selection:l.selectionsAfter[l.selectionsAfter.length-1],annotations:ke.of({side:e,rest:vn(r),selection:s}),userEvent:e==0?"select.undo":"select.redo",scrollIntoView:!0});else if(!l.changes)return null;else{let c=r.length==1?b:r.slice(0,r.length-1);if(l.mapped)c=Se(c,l.mapped);return t.update({changes:l.changes,selection:l.startSelection,effects:l.effects,annotations:ke.of({side:e,rest:c,selection:s}),filter:!1,userEvent:e==0?"undo":"redo",scrollIntoView:!0})}}}D.empty=new D(b,b);var at=[{key:"Mod-z",run:Y,preventDefault:!0},{key:"Mod-y",mac:"Mod-Shift-z",run:G,preventDefault:!0},{linux:"Ctrl-Shift-z",run:G,preventDefault:!0},{key:"Mod-u",run:gn,preventDefault:!0},{key:"Alt-u",mac:"Mod-Shift-u",run:yn,preventDefault:!0}];function I(e,t){return o.create(e.ranges.map(t),e.mainIndex)}function L(e,t){return e.update({selection:t,scrollIntoView:!0,userEvent:"select"})}function B({state:e,dispatch:t},n){let r=I(e.selection,n);if(r.eq(e.selection,!0))return!1;return t(L(e,r)),!0}function Z(e,t){return o.cursor(t?e.to:e.from)}function ut(e,t){return B(e,(n)=>n.empty?e.moveByChar(n,t):Z(n,t))}function y(e){return e.textDirectionAt(e.state.selection.main.head)==K.LTR}var ht=(e)=>ut(e,!y(e)),ft=(e)=>ut(e,y(e));function dt(e,t){return B(e,(n)=>n.empty?e.moveByGroup(n,t):Z(n,t))}var Ln=(e)=>dt(e,!y(e)),Bn=(e)=>dt(e,y(e));var Qr=typeof Intl<"u"&&Intl.Segmenter?new Intl.Segmenter(void 0,{granularity:"word"}):null;function Dn(e,t,n){if(t.type.prop(n))return!0;let r=t.to-t.from;return r&&(r>2||/[^\s,.;:]/.test(e.sliceDoc(t.from,t.to)))||t.firstChild}function ee(e,t,n){let r=T(e).resolveInner(t.head),l=n?v.closedBy:v.openedBy;for(let h=t.head;;){let d=n?r.childAfter(h):r.childBefore(h);if(!d)break;if(Dn(e,d,l))r=d;else h=n?d.to:d.from}let s=r.type.prop(l),c,a;if(s&&(c=n?Ze(e,r.from,1):Ze(e,r.to,-1))&&c.matched)a=n?c.end.to:c.end.from;else a=n?r.to:r.from;return o.cursor(a,n?-1:1)}var En=(e)=>B(e,(t)=>ee(e.state,t,!y(e))),Tn=(e)=>B(e,(t)=>ee(e.state,t,y(e)));function mt(e,t){return B(e,(n)=>{if(!n.empty)return Z(n,t);let r=e.moveVertically(n,t);return r.head!=n.head?r:e.moveToLineBoundary(n,t)})}var pt=(e)=>mt(e,!1),gt=(e)=>mt(e,!0);function yt(e){let t=e.scrollDOM.clientHeight<e.scrollDOM.scrollHeight-2,n=0,r=0,l;if(t){for(let s of e.state.facet(u.scrollMargins)){let c=s(e);if(c===null||c===void 0?void 0:c.top)n=Math.max(c===null||c===void 0?void 0:c.top,n);if(c===null||c===void 0?void 0:c.bottom)r=Math.max(c===null||c===void 0?void 0:c.bottom,r)}l=e.scrollDOM.clientHeight-n-r}else l=(e.dom.ownerDocument.defaultView||window).innerHeight;return{marginTop:n,marginBottom:r,selfScroll:t,height:Math.max(e.defaultLineHeight,l-5)}}function xt(e,t){let n=yt(e),{state:r}=e,l=I(r.selection,(c)=>c.empty?e.moveVertically(c,t,n.height):Z(c,t));if(l.eq(r.selection))return!1;let s;if(n.selfScroll){let c=e.coordsAtPos(r.selection.main.head),a=e.scrollDOM.getBoundingClientRect(),h=a.top+n.marginTop,d=a.bottom-n.marginBottom;if(c&&c.top>h&&c.bottom<d)s=u.scrollIntoView(l.main.head,{y:"start",yMargin:c.top-h})}return e.dispatch(L(r,l),{effects:s}),!0}var ze=(e)=>xt(e,!1),be=(e)=>xt(e,!0);function w(e,t,n){let r=e.lineBlockAt(t.head),l=e.moveToLineBoundary(t,n);if(l.head==t.head&&l.head!=(n?r.to:r.from))l=e.moveToLineBoundary(t,n,!1);if(!n&&l.head==r.from&&r.length){let s=/^\s*/.exec(e.state.sliceDoc(r.from,Math.min(r.from+100,r.to)))[0].length;if(s&&t.head!=r.from+s)l=o.cursor(r.from+s)}return l}var wn=(e)=>B(e,(t)=>w(e,t,!0)),Wn=(e)=>B(e,(t)=>w(e,t,!1)),Rn=(e)=>B(e,(t)=>w(e,t,!y(e))),On=(e)=>B(e,(t)=>w(e,t,y(e))),Fn=(e)=>B(e,(t)=>e.moveToLineBoundary(t,!1,!1)),In=(e)=>B(e,(t)=>e.moveToLineBoundary(t,!0,!1));function Pn(e,t,n){let r=!1,l=I(e.selection,(s)=>{let c=Ze(e,s.head,-1)||Ze(e,s.head,1)||s.head>0&&Ze(e,s.head-1,1)||s.head<e.doc.length&&Ze(e,s.head+1,-1);if(!c||!c.end)return s;r=!0;let a=c.start.from==s.head?c.end.to:c.end.from;return n?o.range(s.anchor,a):o.cursor(a)});if(!r)return!1;return t(L(e,l)),!0}var Nn=({state:e,dispatch:t})=>Pn(e,t,!1);function C(e,t,n){let r=I(e.state.selection,(l)=>{if(l.undirectional&&l.head>=l.anchor!=t)l=o.range(l.head,l.anchor);let s=n(l);return o.range(l.anchor,s.head,s.goalColumn,s.bidiLevel||void 0,s.assoc)});if(r.eq(e.state.selection))return!1;return e.dispatch(L(e.state,r)),!0}function kt(e,t){return C(e,t,(n)=>e.moveByChar(n,t))}var vt=(e)=>kt(e,!y(e)),Ct=(e)=>kt(e,y(e));function Mt(e,t){return C(e,t,(n)=>e.moveByGroup(n,t))}var qn=(e)=>Mt(e,!y(e)),Vn=(e)=>Mt(e,y(e));var Gn=(e)=>{let t=!y(e);return C(e,t,(n)=>ee(e.state,n,t))},Un=(e)=>{let t=y(e);return C(e,t,(n)=>ee(e.state,n,t))};function At(e,t){return C(e,t,(n)=>e.moveVertically(n,t))}var Lt=(e)=>At(e,!1),Bt=(e)=>At(e,!0);function Dt(e,t){return C(e,t,(n)=>e.moveVertically(n,t,yt(e).height))}var _e=(e)=>Dt(e,!1),Je=(e)=>Dt(e,!0),zn=(e)=>C(e,!0,(t)=>w(e,t,!0)),_n=(e)=>C(e,!1,(t)=>w(e,t,!1)),Jn=(e)=>{let t=!y(e);return C(e,t,(n)=>w(e,n,t))},Kn=(e)=>{let t=y(e);return C(e,t,(n)=>w(e,n,t))},Hn=(e)=>C(e,!1,(t)=>o.cursor(e.lineBlockAt(t.head).from)),Qn=(e)=>C(e,!0,(t)=>o.cursor(e.lineBlockAt(t.head).to)),$e=({state:e,dispatch:t})=>(t(L(e,{anchor:0})),!0),Ke=({state:e,dispatch:t})=>(t(L(e,{anchor:e.doc.length})),!0),He=({state:e,dispatch:t})=>(t(L(e,{anchor:e.selection.main.anchor,head:0})),!0),je=({state:e,dispatch:t})=>(t(L(e,{anchor:e.selection.main.anchor,head:e.doc.length})),!0),jn=({state:e,dispatch:t})=>(t(e.update({selection:{anchor:0,head:e.doc.length},userEvent:"select"})),!0),Xn=({state:e,dispatch:t})=>{let n=re(e).map(({from:r,to:l})=>o.undirectionalRange(r,Math.min(l+1,e.doc.length)));return t(e.update({selection:o.create(n),userEvent:"select"})),!0},Yn=({state:e,dispatch:t})=>{let n=I(e.selection,(r)=>{let l=T(e),s=l.resolveStack(r.from,1);if(r.empty){let c=l.resolveStack(r.from,-1);if(c.node.from>=s.node.from&&c.node.to<=s.node.to)s=c}for(let c=s;c;c=c.next){let{node:a}=c;if((a.from<r.from&&a.to>=r.to||a.to>r.to&&a.from<=r.from)&&c.next)return o.undirectionalRange(a.from,a.to)}return r});if(n.eq(e.selection))return!1;return t(L(e,n)),!0};function Et(e,t){let{state:n}=e,r=n.selection,l=n.selection.ranges.slice();for(let s of n.selection.ranges){let c=n.doc.lineAt(s.head);if(t?c.to<e.state.doc.length:c.from>0)for(let a=s;;){let h=e.moveVertically(a,t);if(h.head<c.from||h.head>c.to){if(!l.some((d)=>d.head==h.head))l.push(h);break}else if(h.head==a.head)break;else a=h}}if(l.length==r.ranges.length)return!1;return e.dispatch(L(n,o.create(l,l.length-1))),!0}var Zn=(e)=>Et(e,!1),er=(e)=>Et(e,!0),tr=({state:e,dispatch:t})=>{let n=e.selection,r=null;if(n.ranges.length>1)r=o.create([n.main]);else if(!n.main.empty)r=o.create([o.cursor(n.main.head)]);if(!r)return!1;return t(L(e,r)),!0};function _(e,t){if(e.state.readOnly)return!1;let n="delete.selection",{state:r}=e,l=r.changeByRange((s)=>{let{from:c,to:a}=s;if(c==a){let h=t(s);if(h<c)n="delete.backward",h=Q(e,h,!1);else if(h>c)n="delete.forward",h=Q(e,h,!0);c=Math.min(c,h),a=Math.max(a,h)}else c=Q(e,c,!1),a=Q(e,a,!0);return c==a?{range:s}:{changes:{from:c,to:a},range:o.cursor(c,c<s.head?-1:1)}});if(l.changes.empty)return!1;return e.dispatch(r.update(l,{scrollIntoView:!0,userEvent:n,effects:n=="delete.selection"?u.announce.of(r.phrase("Selection deleted")):void 0})),!0}function Q(e,t,n){if(e instanceof u)for(let r of e.state.facet(u.atomicRanges).map((l)=>l(e)))r.between(t,t,(l,s)=>{if(l<t&&s>t)t=n?s:l});return t}var Tt=(e,t,n)=>_(e,(r)=>{let l=r.from,{state:s}=e,c=s.doc.lineAt(l),a,h;if(n&&!t&&l>c.from&&l<c.from+200&&!/[^ \t]/.test(a=c.text.slice(0,l-c.from))){if(a[a.length-1]=="\t")return l-1;let d=Me(a,s.tabSize),f=d%St(s)||St(s);for(let m=0;m<f&&a[a.length-1-m]==" ";m++)l--;h=l}else if(h=le(c.text,l-c.from,t,t)+c.from,h==l&&c.number!=(t?s.doc.lines:1))h+=t?1:-1;else if(!t&&/[\ufe00-\ufe0f]/.test(c.text.slice(h-c.from,l-c.from)))h=le(c.text,h-c.from,!1,!1)+c.from;return h}),Ce=(e)=>Tt(e,!1,!0);var wt=(e)=>Tt(e,!0,!1),Rt=(e,t)=>_(e,(n)=>{let r=n.head,{state:l}=e,s=l.doc.lineAt(r),c=l.charCategorizer(r);for(let a=null;;){if(r==(t?s.to:s.from)){if(r==n.head&&s.number!=(t?l.doc.lines:1))r+=t?1:-1;break}let h=le(s.text,r-s.from,t)+s.from,d=s.text.slice(Math.min(r,h)-s.from,Math.max(r,h)-s.from),f=c(d);if(a!=null&&f!=a)break;if(d!=" "||r!=n.head)a=f;r=h}return r}),Ot=(e)=>Rt(e,!1),nr=(e)=>Rt(e,!0);var rr=(e)=>_(e,(t)=>{let n=e.lineBlockAt(t.head).to;return t.head<n?n:Math.min(e.state.doc.length,t.head+1)});var or=(e)=>_(e,(t)=>{let n=e.moveToLineBoundary(t,!1).head;return t.head>n?n:Math.max(0,t.head-1)}),lr=(e)=>_(e,(t)=>{let n=e.moveToLineBoundary(t,!0).head;return t.head<n?n:Math.min(e.state.doc.length,t.head+1)});var ir=({state:e,dispatch:t})=>{if(e.readOnly)return!1;let n=e.changeByRange((r)=>({changes:{from:r.from,to:r.to,insert:z.of(["",""])},range:o.cursor(r.from)}));return t(e.update(n,{scrollIntoView:!0,userEvent:"input"})),!0},sr=({state:e,dispatch:t})=>{if(e.readOnly)return!1;let n=e.changeByRange((r)=>{if(!r.empty||r.from==0||r.from==e.doc.length)return{range:r};let l=r.from,s=e.doc.lineAt(l),c=l==s.from?l-1:le(s.text,l-s.from,!1)+s.from,a=l==s.to?l+1:le(s.text,l-s.from,!0)+s.from;return{changes:{from:c,to:a,insert:e.doc.slice(l,a).append(e.doc.slice(c,l))},range:o.cursor(a)}});if(n.changes.empty)return!1;return t(e.update(n,{scrollIntoView:!0,userEvent:"move.character"})),!0};function re(e){let t=[],n=-1;for(let r of e.selection.ranges){let l=e.doc.lineAt(r.from),s=e.doc.lineAt(r.to);if(!r.empty&&r.to==s.from)s=e.doc.lineAt(r.to-1);if(n>=l.number){let c=t[t.length-1];c.to=s.to,c.ranges.push(r)}else t.push({from:l.from,to:s.to,ranges:[r]});n=s.number+1}return t}function Ft(e,t,n){if(e.readOnly)return!1;let r=[],l=[];for(let s of re(e)){if(n?s.to==e.doc.length:s.from==0)continue;let c=e.doc.lineAt(n?s.to+1:s.from-1),a=c.length+1;if(n){r.push({from:s.to,to:c.to},{from:s.from,insert:c.text+e.lineBreak});for(let h of s.ranges)l.push(o.range(Math.min(e.doc.length,h.anchor+a),Math.min(e.doc.length,h.head+a)))}else{r.push({from:c.from,to:s.from},{from:s.to,insert:e.lineBreak+c.text});for(let h of s.ranges)l.push(o.range(h.anchor-a,h.head-a))}}if(!r.length)return!1;return t(e.update({changes:r,scrollIntoView:!0,selection:o.create(l,e.selection.mainIndex),userEvent:"move.line"})),!0}var cr=({state:e,dispatch:t})=>Ft(e,t,!1),ar=({state:e,dispatch:t})=>Ft(e,t,!0);function It(e,t,n){if(e.readOnly)return!1;let r=[];for(let s of re(e))if(n)r.push({from:s.from,insert:e.doc.slice(s.from,s.to)+e.lineBreak});else r.push({from:s.to,insert:e.lineBreak+e.doc.slice(s.from,s.to)});let l=e.changes(r);return t(e.update({changes:l,selection:e.selection.map(l,n?1:-1),scrollIntoView:!0,userEvent:"input.copyline"})),!0}var ur=({state:e,dispatch:t})=>It(e,t,!1),hr=({state:e,dispatch:t})=>It(e,t,!0),fr=(e)=>{if(e.state.readOnly)return!1;let{state:t}=e,n=t.changes(re(t).map(({from:l,to:s})=>{if(l>0)l--;else if(s<t.doc.length)s++;return{from:l,to:s}})),r=I(t.selection,(l)=>{let s=void 0;if(e.lineWrapping){let c=e.lineBlockAt(l.head),a=e.coordsAtPos(l.head,l.assoc||1);if(a)s=c.bottom+e.documentTop-a.bottom+e.defaultLineHeight/2}return e.moveVertically(l,!0,s)}).map(n);return e.dispatch({changes:n,selection:r,scrollIntoView:!0,userEvent:"delete.line"}),!0};function dr(e,t){if(/\(\)|\[\]|\{\}/.test(e.sliceDoc(t-1,t+1)))return{from:t,to:t};let n=T(e).resolveInner(t),r=n.childBefore(t),l=n.childAfter(t),s;if(r&&l&&r.to<=t&&l.from>=t&&(s=r.type.prop(v.closedBy))&&s.indexOf(l.name)>-1&&e.doc.lineAt(r.to).from==e.doc.lineAt(l.from).from&&!/\S/.test(e.sliceDoc(r.to,l.from)))return{from:r.to,to:l.from};return null}var Ye=Pt(!1),mr=Pt(!0);function Pt(e){return({state:t,dispatch:n})=>{if(t.readOnly)return!1;let r=t.changeByRange((l)=>{let{from:s,to:c}=l,a=t.doc.lineAt(s),h=!e&&s==c&&dr(t,s);if(e)s=c=(c<=a.to?a:t.doc.lineAt(c)).to;let d=new Zt(t,{simulateBreak:s,simulateDoubleBreak:!!h}),f=si(d,s);if(f==null)f=Me(/^\s*/.exec(t.doc.lineAt(s).text)[0],t.tabSize);while(c<a.to&&/\s/.test(a.text[c-a.from]))c++;if(h)({from:s,to:c}=h);else if(s>a.from&&s<a.from+100&&!/\S/.test(a.text.slice(0,s)))s=a.from;let m=["",dn(t,f)];if(h)m.push(dn(t,d.lineIndent(a.from,-1)));return{changes:{from:s,to:c,insert:z.of(m)},range:o.cursor(s+1+m[1].length)}});return n(t.update(r,{scrollIntoView:!0,userEvent:"input"})),!0}}function Be(e,t){let n=-1;return e.changeByRange((r)=>{let l=[];for(let c=r.from;c<=r.to;){let a=e.doc.lineAt(c);if(a.number>n&&(r.empty||r.to>a.from))t(a,l,r),n=a.number;c=a.to+1}let s=e.changes(l);return{changes:l,range:o.range(s.mapPos(r.anchor,1),s.mapPos(r.head,1))}})}var pr=({state:e,dispatch:t})=>{if(e.readOnly)return!1;let n=Object.create(null),r=new Zt(e,{overrideIndentation:(s)=>{let c=n[s];return c==null?-1:c}}),l=Be(e,(s,c,a)=>{let h=si(r,s.from);if(h==null)return;if(!/\S/.test(s.text))h=0;let d=/^\s*/.exec(s.text)[0],f=dn(e,h);if(d!=f||a.from<s.from+d.length)n[s.from]=h,c.push({from:s.from,to:s.from+d.length,insert:f})});if(!l.changes.empty)t(e.update(l,{userEvent:"indent"}));return!0},oe=({state:e,dispatch:t})=>{if(e.readOnly)return!1;return t(e.update(Be(e,(n,r)=>{r.push({from:n.from,insert:e.facet(Xe)})}),{userEvent:"input.indent"})),!0},Nt=({state:e,dispatch:t})=>{if(e.readOnly)return!1;return t(e.update(Be(e,(n,r)=>{let l=/^\s*/.exec(n.text)[0];if(!l)return;let s=Me(l,e.tabSize),c=0,a=dn(e,Math.max(0,s-St(e)));while(c<l.length&&c<a.length&&l.charCodeAt(c)==a.charCodeAt(c))c++;r.push({from:n.from+c,to:n.from+l.length,insert:a.slice(c)})}),{userEvent:"delete.dedent"})),!0},gr=(e)=>(e.setTabFocusMode(),!0);var yr=[{key:"Ctrl-b",run:ht,shift:vt,preventDefault:!0},{key:"Ctrl-f",run:ft,shift:Ct},{key:"Ctrl-p",run:pt,shift:Lt},{key:"Ctrl-n",run:gt,shift:Bt},{key:"Ctrl-a",run:Fn,shift:Hn},{key:"Ctrl-e",run:In,shift:Qn},{key:"Ctrl-d",run:wt},{key:"Ctrl-h",run:Ce},{key:"Ctrl-k",run:rr},{key:"Ctrl-Alt-h",run:Ot},{key:"Ctrl-o",run:ir},{key:"Ctrl-t",run:sr},{key:"Ctrl-v",run:be}],xr=[{key:"ArrowLeft",run:ht,shift:vt,preventDefault:!0},{key:"Mod-ArrowLeft",mac:"Alt-ArrowLeft",run:Ln,shift:qn,preventDefault:!0},{mac:"Cmd-ArrowLeft",run:Rn,shift:Jn,preventDefault:!0},{key:"ArrowRight",run:ft,shift:Ct,preventDefault:!0},{key:"Mod-ArrowRight",mac:"Alt-ArrowRight",run:Bn,shift:Vn,preventDefault:!0},{mac:"Cmd-ArrowRight",run:On,shift:Kn,preventDefault:!0},{key:"ArrowUp",run:pt,shift:Lt,preventDefault:!0},{mac:"Cmd-ArrowUp",run:$e,shift:He},{mac:"Ctrl-ArrowUp",run:ze,shift:_e},{key:"ArrowDown",run:gt,shift:Bt,preventDefault:!0},{mac:"Cmd-ArrowDown",run:Ke,shift:je},{mac:"Ctrl-ArrowDown",run:be,shift:Je},{key:"PageUp",run:ze,shift:_e},{key:"PageDown",run:be,shift:Je},{key:"Home",run:Wn,shift:_n,preventDefault:!0},{key:"Mod-Home",run:$e,shift:He},{key:"End",run:wn,shift:zn,preventDefault:!0},{key:"Mod-End",run:Ke,shift:je},{key:"Enter",run:Ye,shift:Ye},{key:"Mod-a",run:jn},{key:"Backspace",run:Ce,shift:Ce,preventDefault:!0},{key:"Delete",run:wt,preventDefault:!0},{key:"Mod-Backspace",mac:"Alt-Backspace",run:Ot,preventDefault:!0},{key:"Mod-Delete",mac:"Alt-Delete",run:nr,preventDefault:!0},{mac:"Mod-Backspace",run:or,preventDefault:!0},{mac:"Mod-Delete",run:lr,preventDefault:!0}].concat(yr.map((e)=>({mac:e.key,run:e.run,shift:e.shift}))),qt=[{key:"Alt-ArrowLeft",mac:"Ctrl-ArrowLeft",run:En,shift:Gn},{key:"Alt-ArrowRight",mac:"Ctrl-ArrowRight",run:Tn,shift:Un},{key:"Alt-ArrowUp",run:cr},{key:"Shift-Alt-ArrowUp",run:ur},{key:"Alt-ArrowDown",run:ar},{key:"Shift-Alt-ArrowDown",run:hr},{key:"Mod-Alt-ArrowUp",run:Zn},{key:"Mod-Alt-ArrowDown",run:er},{key:"Escape",run:tr},{key:"Mod-Enter",run:mr},{key:"Alt-l",mac:"Ctrl-l",run:Xn},{key:"Mod-i",run:Yn,preventDefault:!0},{key:"Mod-[",run:Nt},{key:"Mod-]",run:oe},{key:"Mod-Alt-\\",run:pr},{key:"Shift-Mod-k",run:fr},{key:"Shift-Mod-\\",run:Nn},{key:"Mod-/",run:on},{key:"Alt-A",mac:"Ctrl-A",run:cn},{key:"Ctrl-m",mac:"Shift-Alt-m",run:gr}].concat(xr),Vt={key:"Tab",run:oe,shift:Nt};var Gt=typeof String.prototype.normalize=="function"?(e)=>e.normalize("NFKD"):(e)=>e;class R{constructor(e,t,n=0,r=e.length,l,s){this.test=s,this.value={from:0,to:0,precise:!1},this.done=!1,this.matches=[],this.buffer="",this.bufferPos=0,this.iter=e.iterRange(n,r),this.bufferStart=n,this.normalize=l?(c)=>l(Gt(c)):Gt,this.query=this.normalize(t)}peek(){if(this.bufferPos==this.buffer.length){if(this.bufferStart+=this.buffer.length,this.iter.next(),this.iter.done)return-1;this.bufferPos=0,this.buffer=this.iter.value}return Cn(this.buffer,this.bufferPos)}next(){while(this.matches.length)this.matches.pop();return this.nextOverlapping()}nextOverlapping(){for(;;){let e=this.peek();if(e<0)return this.done=!0,this;let t=Ii(e),n=this.bufferStart+this.bufferPos;this.bufferPos+=An(e);let r=this.normalize(t);if(r.length)for(let l=0,s=n,c=!0;;l++){let a=r.charCodeAt(l),h=this.match(a,s,c,this.bufferPos+this.bufferStart,l==r.length-1);if(h)return this.value=h,this;if(l==r.length-1)break;if(c&&l<t.length&&t.charCodeAt(l)==a)s++;else c=!1}}}match(e,t,n,r,l){let s=null;for(let c=0;c<this.matches.length;){let a=this.matches[c],h=!1;if(this.query.charCodeAt(a.index)==e)if(a.index==this.query.length-1)s={from:a.from,to:r,precise:l&&a.precise};else a.index++,h=!0;if(h)c++;else this.matches.splice(c,1)}if(this.query.charCodeAt(0)==e)if(this.query.length==1)s={from:t,to:r,precise:n&&l};else this.matches.push({from:t,index:1,precise:n});if(s&&this.test&&!this.test(s.from,s.to,this.buffer,this.bufferStart))s=null;return s}}if(typeof Symbol<"u")R.prototype[Symbol.iterator]=function(){return this};var _t={from:-1,to:-1,match:/.*/.exec(""),precise:!0},we="gm"+(/x/.unicode==null?"":"u");class We{constructor(e,t,n,r=0,l=e.length){if(this.text=e,this.to=l,this.curLine="",this.done=!1,this.value=_t,/\\[sWDnr]|\n|\r|\[\^/.test(t))return new Re(e,t,n,r,l);this.re=new RegExp(t,we+((n===null||n===void 0?void 0:n.ignoreCase)?"i":"")),this.test=n===null||n===void 0?void 0:n.test,this.iter=e.iter();let s=e.lineAt(r);this.curLineStart=s.from,this.matchPos=he(e,r),this.getLine(this.curLineStart)}getLine(e){if(this.iter.next(e),this.iter.lineBreak)this.curLine="";else{if(this.curLine=this.iter.value,this.curLineStart+this.curLine.length>this.to)this.curLine=this.curLine.slice(0,this.to-this.curLineStart);this.iter.next()}}nextLine(){if(this.curLineStart=this.curLineStart+this.curLine.length+1,this.curLineStart>this.to)this.curLine="";else this.getLine(0)}next(){for(let e=this.matchPos-this.curLineStart;;){this.re.lastIndex=e;let t=this.matchPos<=this.to&&this.re.exec(this.curLine);if(t){let n=this.curLineStart+t.index,r=n+t[0].length;if(this.matchPos=he(this.text,r+(n==r?1:0)),n==this.curLineStart+this.curLine.length)this.nextLine();if((n<r||n>this.value.to)&&(!this.test||this.test(n,r,t)))return this.value={from:n,to:r,precise:!0,match:t},this;e=this.matchPos-this.curLineStart}else if(this.curLineStart+this.curLine.length<this.to)this.nextLine(),e=0;else return this.done=!0,this}}}var De=new WeakMap;class q{constructor(e,t){this.from=e,this.text=t}get to(){return this.from+this.text.length}static get(e,t,n){let r=De.get(e);if(!r||r.from>=n||r.to<=t){let c=new q(t,e.sliceString(t,n));return De.set(e,c),c}if(r.from==t&&r.to==n)return r;let{text:l,from:s}=r;if(s>t)l=e.sliceString(t,s)+l,s=t;if(r.to<n)l+=e.sliceString(r.to,n);return De.set(e,new q(s,l)),new q(t,l.slice(t-s,n-s))}}class Re{constructor(e,t,n,r,l){this.text=e,this.to=l,this.done=!1,this.value=_t,this.matchPos=he(e,r),this.re=new RegExp(t,we+((n===null||n===void 0?void 0:n.ignoreCase)?"i":"")),this.test=n===null||n===void 0?void 0:n.test,this.flat=q.get(e,r,this.chunkEnd(r+5000))}chunkEnd(e){return e>=this.to?this.to:this.text.lineAt(e).to}next(){for(;;){let e=this.re.lastIndex=this.matchPos-this.flat.from,t=this.re.exec(this.flat.text);if(t&&!t[0]&&t.index==e)this.re.lastIndex=e+1,t=this.re.exec(this.flat.text);if(t){let n=this.flat.from+t.index,r=n+t[0].length;if((this.flat.to>=this.to||t.index+t[0].length<=this.flat.text.length-10)&&(!this.test||this.test(n,r,t)))return this.value={from:n,to:r,precise:!0,match:t},this.matchPos=he(this.text,r+(n==r?1:0)),this}if(this.flat.to==this.to)return this.done=!0,this;this.flat=q.get(this.text,this.flat.from,this.chunkEnd(this.flat.from+this.flat.text.length*2))}}}if(typeof Symbol<"u")We.prototype[Symbol.iterator]=Re.prototype[Symbol.iterator]=function(){return this};function Sr(e){try{return new RegExp(e,we),!0}catch(t){return!1}}function he(e,t){if(t>=e.length)return t;let n=e.lineAt(t),r;while(t<n.to&&(r=n.text.charCodeAt(t-n.from))>=56320&&r<57344)t++;return t}var kr=(e)=>{let t=qi(e,"cm-goto-line");if(t){let c=t.dom.querySelector("input[type=text]");if(c)c.select();return!0}let{state:n}=e,r=String(n.doc.lineAt(e.state.selection.main.head).number),{close:l,result:s}=Bi(e,{class:"cm-goto-line",label:n.phrase("Go to line"),input:{type:"text",name:"line",value:r},focus:!0,submitLabel:n.phrase("go")});return s.then((c)=>{let a=c&&/^([+-])?(\d+)?(:\d+)?(%)?$/.exec(c.elements.line.value);if(!a){e.dispatch({effects:l});return}let h=n.doc.lineAt(n.selection.main.head),[,d,f,m,p]=a,E=m?+m.slice(1):0,M=f?+f:h.number;if(f&&p){let ye=M/100;if(d)ye=ye*(d=="-"?-1:1)+h.number/n.doc.lines;M=Math.round(n.doc.lines*ye)}else if(f&&d)M=M*(d=="-"?-1:1)+h.number;let Ge=n.doc.line(Math.max(1,Math.min(n.doc.lines,M))),Ue=o.cursor(Ge.from+Math.max(0,Math.min(E,Ge.length)));e.dispatch({effects:[l,u.scrollIntoView(Ue.from,{y:"center"})],selection:Ue})}),!0},vr={highlightWordAroundCursor:!1,minSelectionLength:1,maxMatches:100,wholeWords:!1},Jt=g.define({combine(e){return et(e,vr,{highlightWordAroundCursor:(t,n)=>t||n,minSelectionLength:Math.min,maxMatches:Math.min})}});function $t(e){let t=[Lr,Ar];if(e)t.push(Jt.of(e));return t}var br=k.mark({class:"cm-selectionMatch"}),Cr=k.mark({class:"cm-selectionMatch cm-selectionMatch-main"});function Ut(e,t,n,r){return(n==0||e(t.sliceDoc(n-1,n))!=ne.Word)&&(r==t.doc.length||e(t.sliceDoc(r,r+1))!=ne.Word)}function Mr(e,t,n,r){return e(t.sliceDoc(n,n+1))==ne.Word&&e(t.sliceDoc(r-1,r))==ne.Word}var Ar=xe.fromClass(class{constructor(e){this.decorations=this.getDeco(e)}update(e){if(e.selectionSet||e.docChanged||e.viewportChanged)this.decorations=this.getDeco(e.view)}getDeco(e){let t=e.state.facet(Jt),{state:n}=e,r=n.selection;if(r.ranges.length>1)return k.none;let l=r.main,s,c=null;if(l.empty){if(!t.highlightWordAroundCursor)return k.none;let h=n.wordAt(l.head);if(!h)return k.none;c=n.charCategorizer(l.head),s=n.sliceDoc(h.from,h.to)}else{let h=l.to-l.from;if(h<t.minSelectionLength||h>200)return k.none;if(t.wholeWords){if(s=n.sliceDoc(l.from,l.to),c=n.charCategorizer(l.head),!(Ut(c,n,l.from,l.to)&&Mr(c,n,l.from,l.to)))return k.none}else if(s=n.sliceDoc(l.from,l.to),!s)return k.none}let a=[];for(let h of e.visibleRanges){let d=new R(n.doc,s,h.from,h.to);while(!d.next().done){let{from:f,to:m}=d.value;if(!c||Ut(c,n,f,m)){if(l.empty&&f<=l.from&&m>=l.to)a.push(Cr.range(f,m));else if(f>=l.to||m<=l.from)a.push(br.range(f,m));if(a.length>t.maxMatches)return k.none}}}return k.set(a)}},{decorations:(e)=>e.decorations}),Lr=u.baseTheme({".cm-selectionMatch":{backgroundColor:"#99ff7780"},".cm-searchMatch .cm-selectionMatch":{backgroundColor:"transparent"}}),Br=({state:e,dispatch:t})=>{let{selection:n}=e,r=o.create(n.ranges.map((l)=>e.wordAt(l.head)||o.cursor(l.head)),n.mainIndex);if(r.eq(n))return!1;return t(e.update({selection:r})),!0};function Dr(e,t){let{main:n,ranges:r}=e.selection,l=e.wordAt(n.head),s=l&&l.from==n.from&&l.to==n.to;for(let c=!1,a=new R(e.doc,t,r[r.length-1].to);;)if(a.next(),a.done){if(c)return null;a=new R(e.doc,t,0,Math.max(0,r[r.length-1].from-1)),c=!0}else{if(c&&r.some((h)=>h.from==a.value.from))continue;if(s){let h=e.wordAt(a.value.from);if(!h||h.from!=a.value.from||h.to!=a.value.to)continue}return a.value}}var Er=({state:e,dispatch:t})=>{let{ranges:n}=e.selection;if(n.some((s)=>s.from===s.to))return Br({state:e,dispatch:t});let r=e.sliceDoc(n[0].from,n[0].to);if(e.selection.ranges.some((s)=>e.sliceDoc(s.from,s.to)!=r))return!1;let l=Dr(e,r);if(!l)return!1;return t(e.update({selection:e.selection.addRange(o.range(l.from,l.to),!1),effects:u.scrollIntoView(l.to)})),!0},F=g.define({combine(e){return et(e,{top:!1,caseSensitive:!1,literal:!1,regexp:!1,wholeWord:!1,createPanel:(t)=>new tn(t),scrollToMatch:(t)=>u.scrollIntoView(t)})}});function Kt(e){return e?[F.of(e),Te]:Te}class Oe{constructor(e){this.search=e.search,this.caseSensitive=!!e.caseSensitive,this.literal=!!e.literal,this.regexp=!!e.regexp,this.replace=e.replace||"",this.valid=!!this.search&&(!this.regexp||Sr(this.search)),this.unquoted=this.unquote(this.search),this.wholeWord=!!e.wholeWord,this.test=e.test}unquote(e){return this.literal?e:e.replace(/\\([nrt\\])/g,(t,n)=>n=="n"?`
|
|
2
|
-
`:n=="r"?"\r":n=="t"?"\t":"\\")}eq(e){return this.search==e.search&&this.replace==e.replace&&this.caseSensitive==e.caseSensitive&&this.regexp==e.regexp&&this.wholeWord==e.wholeWord&&this.test==e.test}create(){return this.regexp?new Qt(this):new Ht(this)}getCursor(e,t=0,n){let r=e.doc?e:A.create({doc:e});if(n==null)n=r.doc.length;return this.regexp?N(this,r,t,n):P(this,r,t,n)}}class Ie{constructor(e){this.spec=e}}function Tr(e,t,n){return(r,l,s,c)=>{if(n&&!n(r,l,s,c))return!1;let a=r>=c&&l<=c+s.length?s.slice(r-c,l-c):t.doc.sliceString(r,l);return e(a,t,r,l)}}function P(e,t,n,r){let l;if(e.wholeWord)l=wr(t.doc,t.charCategorizer(t.selection.main.head));if(e.test)l=Tr(e.test,t,l);return new R(t.doc,e.unquoted,n,r,e.caseSensitive?void 0:(s)=>s.toLowerCase(),l)}function wr(e,t){return(n,r,l,s)=>{if(s>n||s+l.length<r)s=Math.max(0,n-2),l=e.sliceString(s,Math.min(e.length,r+2));return(t(fe(l,n-s))!=ne.Word||t(de(l,n-s))!=ne.Word)&&(t(de(l,r-s))!=ne.Word||t(fe(l,r-s))!=ne.Word)}}class Ht extends Ie{constructor(e){super(e)}nextMatch(e,t,n){let r=P(this.spec,e,n,e.doc.length).nextOverlapping();if(r.done){let l=Math.min(e.doc.length,t+this.spec.unquoted.length);r=P(this.spec,e,0,l).nextOverlapping()}return r.done||r.value.from==t&&r.value.to==n?null:r.value}prevMatchInRange(e,t,n){for(let r=n;;){let l=Math.max(t,r-1e4-this.spec.unquoted.length),s=P(this.spec,e,l,r),c=null;while(!s.nextOverlapping().done)c=s.value;if(c)return c;if(l==t)return null;r-=1e4}}prevMatch(e,t,n){let r=this.prevMatchInRange(e,0,t);if(!r)r=this.prevMatchInRange(e,Math.max(0,n-this.spec.unquoted.length),e.doc.length);return r&&(r.from!=t||r.to!=n)?r:null}getReplacement(e){return this.spec.unquote(this.spec.replace)}matchAll(e,t){let n=P(this.spec,e,0,e.doc.length),r=[];while(!n.next().done){if(r.length>=t)return null;r.push(n.value)}return r}highlight(e,t,n,r){let l=P(this.spec,e,Math.max(0,t-this.spec.unquoted.length),Math.min(n+this.spec.unquoted.length,e.doc.length));while(!l.next().done)r(l.value.from,l.value.to)}}function Wr(e,t,n){return(r,l,s)=>(!n||n(r,l,s))&&e(s[0],t,r,l)}function N(e,t,n,r){let l;if(e.wholeWord)l=Rr(t.charCategorizer(t.selection.main.head));if(e.test)l=Wr(e.test,t,l);return new We(t.doc,e.search,{ignoreCase:!e.caseSensitive,test:l},n,r)}function fe(e,t){return e.slice(le(e,t,!1),t)}function de(e,t){return e.slice(t,le(e,t))}function Rr(e){return(t,n,r)=>!r[0].length||(e(fe(r.input,r.index))!=ne.Word||e(de(r.input,r.index))!=ne.Word)&&(e(de(r.input,r.index+r[0].length))!=ne.Word||e(fe(r.input,r.index+r[0].length))!=ne.Word)}class Qt extends Ie{nextMatch(e,t,n){let r=N(this.spec,e,n,e.doc.length).next();if(r.done)r=N(this.spec,e,0,t).next();return r.done?null:r.value}prevMatchInRange(e,t,n){for(let r=1;;r++){let l=Math.max(t,n-r*1e4),s=N(this.spec,e,l,n),c=null;while(!s.next().done)c=s.value;if(c&&(l==t||c.from>l+10))return c;if(l==t)return null}}prevMatch(e,t,n){return this.prevMatchInRange(e,0,t)||this.prevMatchInRange(e,n,e.doc.length)}getReplacement(e){return this.spec.unquote(this.spec.replace).replace(/\$([$&]|\d+)/g,(t,n)=>{if(n=="&")return e.match[0];if(n=="$")return"$";for(let r=n.length;r>0;r--){let l=+n.slice(0,r);if(l>0&&l<e.match.length)return e.match[l]+n.slice(r)}return t})}matchAll(e,t){let n=N(this.spec,e,0,e.doc.length),r=[];while(!n.next().done){if(r.length>=t)return null;r.push(n.value)}return r}highlight(e,t,n,r){let l=N(this.spec,e,Math.max(0,t-250),Math.min(n+250,e.doc.length));while(!l.next().done)r(l.value.from,l.value.to)}}var J=U.define(),Ne=U.define(),W=ve.define({create(e){return new ae(Ee(e).create(),null)},update(e,t){for(let n of t.effects)if(n.is(J))e=new ae(n.value.create(),e.panel);else if(n.is(Ne))e=new ae(e.query,n.value?qe:null);return e},provide:(e)=>ln.from(e,(t)=>t.panel)});class ae{constructor(e,t){this.query=e,this.panel=t}}var Or=k.mark({class:"cm-searchMatch"}),Fr=k.mark({class:"cm-searchMatch cm-searchMatch-selected"}),Ir=xe.fromClass(class{constructor(e){this.view=e,this.decorations=this.highlight(e.state.field(W))}update(e){let t=e.state.field(W);if(t!=e.startState.field(W)||e.docChanged||e.selectionSet||e.viewportChanged)this.decorations=this.highlight(t)}highlight({query:e,panel:t}){if(!t||!e.spec.valid)return k.none;let{view:n}=this,r=new tt;for(let l=0,s=n.visibleRanges,c=s.length;l<c;l++){let{from:a,to:h}=s[l];while(l<c-1&&h>s[l+1].from-500)h=s[++l].to;e.highlight(n.state,a,h,(d,f)=>{let m=n.state.selection.ranges.some((p)=>p.from==d&&p.to==f);r.add(d,f,m?Fr:Or)})}return r.finish()}},{decorations:(e)=>e.decorations});function H(e){return(t)=>{let n=t.state.field(W,!1);return n&&n.query.spec.valid?e(t,n):ge(t)}}var me=H((e,{query:t})=>{let{to:n}=e.state.selection.main,r=t.nextMatch(e.state,n,n);if(!r)return!1;let l=o.single(r.from,r.to),s=e.state.facet(F);return e.dispatch({selection:l,effects:[Ve(e,r),s.scrollToMatch(l.main,e)],userEvent:"select.search"}),Xt(e),!0}),pe=H((e,{query:t})=>{let{state:n}=e,{from:r}=n.selection.main,l=t.prevMatch(n,r,r);if(!l)return!1;let s=o.single(l.from,l.to),c=e.state.facet(F);return e.dispatch({selection:s,effects:[Ve(e,l),c.scrollToMatch(s.main,e)],userEvent:"select.search"}),Xt(e),!0}),Pr=H((e,{query:t})=>{let n=t.matchAll(e.state,1000);if(!n||!n.length)return!1;return e.dispatch({selection:o.create(n.map((r)=>o.range(r.from,r.to))),userEvent:"select.search.matches"}),!0}),Nr=({state:e,dispatch:t})=>{let n=e.selection;if(n.ranges.length>1||n.main.empty)return!1;let{from:r,to:l}=n.main,s=[],c=0;for(let a=new R(e.doc,e.sliceDoc(r,l));!a.next().done;){if(s.length>1000)return!1;if(a.value.from==r)c=s.length;s.push(o.range(a.value.from,a.value.to))}return t(e.update({selection:o.create(s,c),userEvent:"select.search.matches"})),!0},zt=H((e,{query:t})=>{let{state:n}=e,{from:r,to:l}=n.selection.main;if(n.readOnly)return!1;let s=t.nextMatch(n,r,r);if(!s)return!1;let c=s,a=[],h,d,f=[];if(!c.precise)c=t.nextMatch(n,c.from,c.to);else if(c.from==r&&c.to==l)d=n.toText(t.getReplacement(c)),a.push({from:c.from,to:c.to,insert:d}),c=t.nextMatch(n,c.from,c.to),f.push(u.announce.of(n.phrase("replaced match on line $",n.doc.lineAt(r).number)+"."));let m=e.state.changes(a);if(c)h=o.single(c.from,c.to).map(m),f.push(Ve(e,c)),f.push(n.facet(F).scrollToMatch(h.main,e));return e.dispatch({changes:m,selection:h,effects:f,userEvent:"input.replace"}),!0}),qr=H((e,{query:t})=>{if(e.state.readOnly)return!1;let n=[];for(let l of t.matchAll(e.state,1e9)){let{from:s,to:c,precise:a}=l;if(a)n.push({from:s,to:c,insert:t.getReplacement(l)})}if(!n.length)return!1;let r=e.state.phrase("replaced $ matches",n.length)+".";return e.dispatch({changes:n,effects:u.announce.of(r),userEvent:"input.replace.all"}),!0});function qe(e){return e.state.facet(F).createPanel(e)}function Ee(e,t){var n,r,l,s,c;let a=e.selection.main,h=a.empty||a.to>a.from+100?"":e.sliceDoc(a.from,a.to);if(t&&!h)return t;let d=e.facet(F);return new Oe({search:((n=t===null||t===void 0?void 0:t.literal)!==null&&n!==void 0?n:d.literal)?h:h.replace(/\n/g,"\\n"),caseSensitive:(r=t===null||t===void 0?void 0:t.caseSensitive)!==null&&r!==void 0?r:d.caseSensitive,literal:(l=t===null||t===void 0?void 0:t.literal)!==null&&l!==void 0?l:d.literal,regexp:(s=t===null||t===void 0?void 0:t.regexp)!==null&&s!==void 0?s:d.regexp,wholeWord:(c=t===null||t===void 0?void 0:t.wholeWord)!==null&&c!==void 0?c:d.wholeWord})}function jt(e){let t=$n(e,qe);return t&&t.dom.querySelector("[main-field]")}function Xt(e){let t=jt(e);if(t&&t==e.root.activeElement)t.select()}var ge=(e)=>{let t=e.state.field(W,!1);if(t&&t.panel){let n=jt(e);if(n&&n!=e.root.activeElement){let r=Ee(e.state,t.query.spec);if(r.valid)e.dispatch({effects:J.of(r)});n.focus(),n.select()}}else e.dispatch({effects:[Ne.of(!0),t?J.of(Ee(e.state,t.query.spec)):U.appendConfig.of(Te)]});return!0},Yt=(e)=>{let t=e.state.field(W,!1);if(!t||!t.panel)return!1;let n=$n(e,qe);if(n&&n.dom.contains(e.root.activeElement))e.focus();return e.dispatch({effects:Ne.of(!1)}),!0},en=[{key:"Mod-f",run:ge,scope:"editor search-panel"},{key:"F3",run:me,shift:pe,scope:"editor search-panel",preventDefault:!0},{key:"Mod-g",run:me,shift:pe,scope:"editor search-panel",preventDefault:!0},{key:"Escape",run:Yt,scope:"editor search-panel"},{key:"Mod-Shift-l",run:Nr},{key:"Mod-Alt-g",run:kr},{key:"Mod-d",run:Er,preventDefault:!0}];class tn{constructor(e){this.view=e;let t=this.query=e.state.field(W).query.spec;this.commit=this.commit.bind(this),this.searchField=ue("input",{value:t.search,placeholder:S(e,"Find"),"aria-label":S(e,"Find"),class:"cm-textfield",name:"search",form:"","main-field":"true",onchange:this.commit,onkeyup:this.commit}),this.replaceField=ue("input",{value:t.replace,placeholder:S(e,"Replace"),"aria-label":S(e,"Replace"),class:"cm-textfield",name:"replace",form:"",onchange:this.commit,onkeyup:this.commit}),this.caseField=ue("input",{type:"checkbox",name:"case",form:"",checked:t.caseSensitive,onchange:this.commit}),this.reField=ue("input",{type:"checkbox",name:"re",form:"",checked:t.regexp,onchange:this.commit}),this.wordField=ue("input",{type:"checkbox",name:"word",form:"",checked:t.wholeWord,onchange:this.commit});function n(r,l,s){return ue("button",{class:"cm-button",name:r,onclick:l,type:"button"},s)}this.dom=ue("div",{onkeydown:(r)=>this.keydown(r),class:"cm-search"},[this.searchField,n("next",()=>me(e),[S(e,"next")]),n("prev",()=>pe(e),[S(e,"previous")]),n("select",()=>Pr(e),[S(e,"all")]),ue("label",null,[this.caseField,S(e,"match case")]),ue("label",null,[this.reField,S(e,"regexp")]),ue("label",null,[this.wordField,S(e,"by word")]),...e.state.readOnly?[]:[ue("br"),this.replaceField,n("replace",()=>zt(e),[S(e,"replace")]),n("replaceAll",()=>qr(e),[S(e,"replace all")])],ue("button",{name:"close",onclick:()=>Yt(e),"aria-label":S(e,"close"),type:"button"},["×"])])}commit(){let e=new Oe({search:this.searchField.value,caseSensitive:this.caseField.checked,regexp:this.reField.checked,wholeWord:this.wordField.checked,replace:this.replaceField.value});if(!e.eq(this.query))this.query=e,this.view.dispatch({effects:J.of(e)})}keydown(e){if(Di(this.view,e,"search-panel"))e.preventDefault();else if(e.keyCode==13&&e.target==this.searchField)e.preventDefault(),(e.shiftKey?pe:me)(this.view);else if(e.keyCode==13&&e.target==this.replaceField)e.preventDefault(),zt(this.view)}update(e){for(let t of e.transactions)for(let n of t.effects)if(n.is(J)&&!n.value.eq(this.query))this.setQuery(n.value)}setQuery(e){this.query=e,this.searchField.value=e.search,this.replaceField.value=e.replace,this.caseField.checked=e.caseSensitive,this.reField.checked=e.regexp,this.wordField.checked=e.wholeWord}mount(){this.searchField.select()}get pos(){return 80}get top(){return this.view.state.facet(F).top}}function S(e,t){return e.state.phrase(t)}var ie=30,se=/[\s\.,:;?!]/;function Ve(e,{from:t,to:n}){let r=e.state.doc.lineAt(t),l=e.state.doc.lineAt(n).to,s=Math.max(r.from,t-ie),c=Math.min(l,n+ie),a=e.state.sliceDoc(s,c);if(s!=r.from){for(let h=0;h<ie;h++)if(!se.test(a[h+1])&&se.test(a[h])){a=a.slice(h);break}}if(c!=l){for(let h=a.length-1;h>a.length-ie;h--)if(!se.test(a[h-1])&&se.test(a[h])){a=a.slice(0,h);break}}return u.announce.of(`${e.state.phrase("current match")}. ${a} ${e.state.phrase("on line")} ${r.number}.`)}var Vr=u.baseTheme({".cm-panel.cm-search":{padding:"2px 6px 4px",position:"relative","& [name=close]":{position:"absolute",top:"0",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",padding:0,margin:0},"& input, & button, & label":{margin:".2em .6em .2em 0"},"& input[type=checkbox]":{marginRight:".2em"},"& label":{fontSize:"80%",whiteSpace:"pre"}},"&light .cm-searchMatch":{backgroundColor:"#ffff0054"},"&dark .cm-searchMatch":{backgroundColor:"#00ffff8a"},"&light .cm-searchMatch-selected":{backgroundColor:"#ff6a0054"},"&dark .cm-searchMatch-selected":{backgroundColor:"#ff00ff8a"}}),Te=[W,Pe.low(Ir),Vr];var Gr=u.theme({"&":{color:"var(--code-fg)",backgroundColor:"var(--code-bg)",height:"100%",fontSize:"var(--code-size, 13px)"},"&.cm-focused":{outline:"none"},".cm-scroller":{fontFamily:"var(--font-mono)",lineHeight:"1.55",overflow:"auto"},".cm-content":{caretColor:"var(--code-fg)",padding:"0.5rem 0"},".cm-line":{padding:"0 0.75rem"},".cm-cursor, .cm-dropCursor":{borderLeftColor:"var(--code-fg)"},"&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection":{backgroundColor:"var(--code-selection)"},".cm-activeLine":{backgroundColor:"var(--code-active-line)"},".cm-gutters":{backgroundColor:"var(--code-gutter-bg)",color:"var(--code-gutter)",border:"none",borderRight:"1px solid var(--border)"},".cm-activeLineGutter":{backgroundColor:"var(--code-active-line)",color:"var(--code-fg)"},".cm-lineNumbers .cm-gutterElement":{padding:"0 0.5rem 0 0.5rem",minWidth:"2.25rem"},".cm-matchingBracket, .cm-nonmatchingBracket":{backgroundColor:"var(--code-selection)",outline:"1px solid var(--border-strong)"},".cm-searchMatch":{backgroundColor:"var(--warn-soft)",outline:"1px solid var(--warn)"},".cm-searchMatch.cm-searchMatch-selected":{backgroundColor:"var(--accent-soft)",outline:"1px solid var(--accent)"},".cm-panels":{backgroundColor:"var(--surface-2)",color:"var(--text)",borderColor:"var(--border)",fontFamily:"var(--font)"},".cm-panels-top":{borderBottom:"1px solid var(--border)"},".cm-panel.cm-search":{padding:"0.5rem 2rem 0.5rem 0.5rem"},".cm-panel.cm-search input, .cm-panel.cm-search button, .cm-panel.cm-search label":{fontSize:"0.875rem"},".cm-panel.cm-search input[type=text]":{backgroundColor:"var(--surface)",color:"var(--text)",border:"1px solid var(--control-border)",borderRadius:"var(--radius-sm)",padding:"0.25rem 0.5rem"},".cm-panel.cm-search button":{backgroundColor:"var(--surface-3)",color:"var(--text)",border:"1px solid var(--border-strong)",borderRadius:"var(--radius-sm)",backgroundImage:"none",padding:"0.25rem 0.625rem"},".cm-panel.cm-search [name=close]":{color:"var(--muted)"}}),Ur=Wt.define([{tag:[i.keyword,i.modifier,i.operatorKeyword,i.controlKeyword],color:"var(--code-keyword)"},{tag:[i.string,i.regexp,i.special(i.string),i.inserted],color:"var(--code-string)"},{tag:[i.number,i.bool,i.null,i.atom,i.literal],color:"var(--code-number)"},{tag:[i.comment,i.lineComment,i.blockComment,i.docComment],color:"var(--code-comment)",fontStyle:"italic"},{tag:[i.typeName,i.className,i.namespace,i.tagName,i.standard(i.tagName)],color:"var(--code-type)"},{tag:[i.function(i.variableName),i.function(i.propertyName),i.definition(i.variableName),i.labelName],color:"var(--code-function)"},{tag:[i.meta,i.processingInstruction,i.annotation,i.attributeName,i.propertyName,i.heading],color:"var(--code-meta)"},{tag:i.heading,fontWeight:"bold"},{tag:i.strong,fontWeight:"bold"},{tag:i.emphasis,fontStyle:"italic"},{tag:i.strikethrough,textDecoration:"line-through"},{tag:i.link,color:"var(--code-function)",textDecoration:"underline"},{tag:i.url,color:"var(--code-function)"},{tag:i.invalid,color:"var(--danger)"},{tag:i.deleted,color:"var(--danger)"}]),nn=[Gr,Yi(Ur)];var zr={typescript:()=>(O("8f6yywt3"),import("./chunk-lang-typescript-8f6yywt3.js")),javascript:()=>(O("xj00cp97"),import("./chunk-lang-javascript-xj00cp97.js")),json:()=>(O("5eaarz7j"),import("./chunk-lang-json-5eaarz7j.js")),markdown:()=>(O("zxx8eke8"),import("./chunk-lang-markdown-zxx8eke8.js")),css:()=>(O("t85r8rz0"),import("./chunk-lang-css-t85r8rz0.js")),html:()=>(O("n6jparge"),import("./chunk-lang-html-n6jparge.js")),python:()=>(O("fjw84w10"),import("./chunk-lang-python-fjw84w10.js")),yaml:()=>(O("c4b6ft3y"),import("./chunk-lang-yaml-c4b6ft3y.js")),go:()=>(O("830fmhba"),import("./chunk-lang-go-830fmhba.js")),rust:()=>(O("5rbp2zdk"),import("./chunk-lang-rust-5rbp2zdk.js")),sql:()=>(O("0c2w9c2y"),import("./chunk-lang-sql-0c2w9c2y.js")),xml:()=>(O("eze08p42"),import("./chunk-lang-xml-eze08p42.js")),shell:()=>(O("vzagpym3"),import("./chunk-lang-shell-vzagpym3.js")),toml:()=>(O("yr9fv6eb"),import("./chunk-lang-toml-yr9fv6eb.js")),dockerfile:()=>(O("d5mzxs60"),import("./chunk-lang-dockerfile-d5mzxs60.js"))};async function rn(e){if(e==="plain")return;try{return(await zr[e]()).language()}catch(t){console.warn("a language for the editor failed to load",t);return}}function _r(e){if(typeof e.attachShadow!=="function"||typeof CSSStyleSheet>"u"||!("adoptedStyleSheets"in Document.prototype))return{parent:e,root:void 0};let t=e.shadowRoot??e.attachShadow({mode:"open"}),n=new CSSStyleSheet;return n.replaceSync(":host{display:flex;flex-direction:column;min-height:0}.cm-editor{flex:1;min-height:0}"),t.adoptedStyleSheets=[...t.adoptedStyleSheets,n],{parent:t,root:t}}async function mo(e){let t=new bt,n=new bt,r=new bt,l=await rn(e.language),s=(m)=>[A.readOnly.of(!m),u.editable.of(m)],c={editable:e.editable,wrap:e.wrap,language:l??[]},a,h=(m)=>[Fi(),Vi(),Gi(),it(),Ui(),Hi(),$t(),Kt({top:!0}),Xe.of(" "),A.phrases.of(e.phrases),nn,ot.of([{key:"Mod-s",preventDefault:!0,run:()=>(e.onSave(),!0)},{key:"Escape",run:()=>(e.onEscape(),!0)},Vt,...en,...at,...qt]),A.lineSeparator.of(m),t.of(s(c.editable)),n.of(c.wrap?u.lineWrapping:[]),r.of(c.language),u.updateListener.of((p)=>{if(p.docChanged)e.onChange()})],d=_r(e.parent),f=new u({parent:d.parent,root:d.root,state:A.create({doc:e.text,extensions:h(e.eol)})});return a=f.state.doc,{text:()=>f.state.doc.sliceString(0,void 0,f.state.lineBreak),dirty:()=>a===void 0||!f.state.doc.eq(a),snapshot:()=>f.state.doc,markSaved:(m)=>{a=m??f.state.doc},replace:(m,p)=>{let E=f.scrollDOM.scrollTop;f.setState(A.create({doc:m,extensions:h(p)})),a=f.state.doc,f.scrollDOM.scrollTop=E},setEditable:(m)=>{c.editable=m,f.dispatch({effects:t.reconfigure(s(m))})},setWrap:(m)=>{c.wrap=m,f.dispatch({effects:n.reconfigure(m?u.lineWrapping:[])})},setLanguage:async(m)=>{c.language=await rn(m)??[],f.dispatch({effects:r.reconfigure(c.language)})},undo:()=>{Y(f)},redo:()=>{G(f)},find:()=>{ge(f)},tab:()=>{oe(f)},focus:()=>f.focus(),scrollTop:()=>f.scrollDOM.scrollTop,scrollTo:(m)=>{f.scrollDOM.scrollTop=m},destroy:()=>f.destroy()}}export{mo as createEditor};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{re}from"./chunk-index-ky42ev0b.js";import"./chunk-index-5d8yjj4m.js";export{re as Confirm};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t,c,p,e,n,C,x,y,_,L,m,Q,se,Ke,J,we,Nt,wn}from"./chunk-index-31wh5twj.js";import{fe}from"./chunk-index-hk3xyy20.js";var u=[{kind:"owner",title:c("Owner channels"),note:c("Direct messages and channels where the owner talks to the assistant.")},{kind:"agent",title:c("Agent channels"),note:c("The agent server's one-to-one channels.")},{kind:"group",title:c("Group channels"),note:c("The agent server's group channels.")},{kind:"outside",title:c("Outside agents"),note:c("Conversations an agent outside Discord holds over MCP.")},{kind:"plugin",title:c("Plugin conversations"),note:c("Conversations a plugin runs, such as a web chat, as the host recorded them.")}];function Z(){let{timeZone:o}=Q(),{now:i}=se(),{data:s,error:a}=fe(()=>m.conversations(),"conversations"),d=s?.conversations;if(!d)return a?e(y,{message:a}):e(x,{});return n(p,{children:[a?e(y,{message:a}):null,u.map((r)=>{let h=d.filter((l)=>l.kind===r.kind);return n("section",{className:"stack",children:[e("h2",{children:t(r.title)}),e("p",{className:"hint",children:t(r.note)}),h.length===0?e(_,{children:t("None stored.")}):null,h.map((l)=>e(g,{item:l,now:i,timeZone:o},l.key))]},r.kind)})]})}function g(o){let{item:i}=o,s=Nt(i.channel,i.id),a=wn(i);return n("a",{className:"card card-link",href:C("conversations",i.key),children:[n("div",{className:"card-head",children:[e("strong",{children:a}),i.busy>0?e(L,{tone:"busy",children:t("running")}):null,i.liveBytes===0?e(L,{children:t("archived only")}):null]}),n("p",{className:"meta",children:[(i.kind==="outside"||i.kind==="plugin")&&i.startedAt?`${t("Started")} ${J(i.startedAt,o.timeZone)} · `:s.detail?`${s.detail} · `:"",i.principal?`${i.visibility==="private"?t("Private to {name}",{name:i.principal.name}):t("Shared · {name}",{name:i.principal.name})} · `:"",t("Last active")," ",Ke(i.lastActive,o.now,o.timeZone)," ·"," ",we(i.liveBytes)," ·"," ",t("{count} archived",{count:i.archives})]})]})}export{Z as ConversationsPage};
|