bazilion 0.5.0 → 0.6.0
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/README.md +14 -9
- package/dist/cli.js +365 -140
- package/dist/cli.js.map +1 -1
- package/dist/daemon.js +4452 -16989
- package/dist/daemon.js.map +1 -1
- package/dist/web/client/assets/AgentAvatar-Cq7PVBE_.js +1 -0
- package/dist/web/client/assets/AgentTabs-M5K8emJ8.js +1 -0
- package/dist/web/client/assets/Button-BefUtjMZ.js +1 -0
- package/dist/web/client/assets/ChatPane-C8zQfpzH.js +74 -0
- package/dist/web/client/assets/ConfigTabs-DRqAymcN.js +1 -0
- package/dist/web/client/assets/FieldRow-BqWnxZiX.js +1 -0
- package/dist/web/client/assets/MembersEditor-B-47GLUb.js +1 -0
- package/dist/web/client/assets/SpawnTeamModal-DiiC7Nc0.js +1 -0
- package/dist/web/client/assets/TemplatesTabs-DB4KERTQ.js +1 -0
- package/dist/web/client/assets/_id-B7gv1aPQ.js +1 -0
- package/dist/web/client/assets/_id-C7d1AqS0.js +1 -0
- package/dist/web/client/assets/_id-DhiwjC8u.js +1 -0
- package/dist/web/client/assets/_id-p8lUuNFm.js +1 -0
- package/dist/web/client/assets/agents-v8G-wt0M.js +1 -0
- package/dist/web/client/assets/config-BdmYpS_y.js +3 -0
- package/dist/web/client/assets/groups-DiY_ExGM.js +1 -0
- package/dist/web/client/assets/inbox-DtfVx246.js +1 -0
- package/dist/web/client/assets/index-BQUL6oyH.js +12 -0
- package/dist/web/client/assets/login-CVS70W9g.js +1 -0
- package/dist/web/client/assets/mcp-BDLQq8OZ.js +1 -0
- package/dist/web/client/assets/memory-6GGuAXwx.js +1 -0
- package/dist/web/client/assets/profile-groups-BA8rwZMA.js +1 -0
- package/dist/web/client/assets/profiles-C0aAcPZg.js +1 -0
- package/dist/web/client/assets/routes-DgAhnKFw.js +1 -0
- package/dist/web/client/assets/services-BZ86QEah.js +1 -0
- package/dist/web/client/assets/skills-mv_NNNwo.js +1 -0
- package/dist/web/client/assets/styles-CmqUskDu.css +2 -0
- package/dist/web/client/assets/telegram-5f9WXs3x.js +1 -0
- package/dist/web/client/assets/tokens-DHiYsFUh.js +1 -0
- package/dist/web/client/assets/triggers-CjC8Ljrz.js +1 -0
- package/dist/web/client/assets/welcome-C-Cu-ziL.js +1 -0
- package/dist/web/client/assets/wire-constants-BkT5-597.js +1 -0
- package/dist/web/client/baziu.svg +8 -0
- package/dist/web/server/assets/AgentAvatar-8gTAy_tP.js +37 -0
- package/dist/web/server/assets/AgentTabs-BOjTN7QF.js +34 -0
- package/dist/web/server/assets/Button-Dsnw22OF.js +17 -0
- package/dist/web/server/assets/ChatPane-BvpswYvF.js +1084 -0
- package/dist/web/server/assets/ConfigTabs-CyuxzesF.js +41 -0
- package/dist/web/server/assets/FieldRow-DwyqycWI.js +94 -0
- package/dist/web/server/assets/MembersEditor-BWQztvrX.js +131 -0
- package/dist/web/server/assets/Sidebar-DmEiewRN.js +529 -0
- package/dist/web/server/assets/SpawnTeamModal-dSN421k_.js +107 -0
- package/dist/web/server/assets/TemplatesTabs---7h5GYa.js +30 -0
- package/dist/web/server/assets/_id-BZ-YCWSw.js +16 -0
- package/dist/web/server/assets/_id-Bm4-_AP-.js +367 -0
- package/dist/web/server/assets/_id-C78M9_j9.js +12 -0
- package/dist/web/server/assets/_id-CGZbudCl.js +28 -0
- package/dist/web/server/assets/_id-CHNm7EAd.js +161 -0
- package/dist/web/server/assets/_id-CrQbC5L8.js +16 -0
- package/dist/web/server/assets/_id-Crcw2HhT.js +38 -0
- package/dist/web/server/assets/_id-CvIGhq4U.js +16 -0
- package/dist/web/server/assets/_id-DF3pfi9M.js +27 -0
- package/dist/web/server/assets/_id-Dc8P9sy2.js +24 -0
- package/dist/web/server/assets/_id-GJk3EYTT.js +662 -0
- package/dist/web/server/assets/_id-pd4S7LTi.js +467 -0
- package/dist/web/server/assets/_tanstack-start-manifest_v-CPyKYMJg.js +174 -0
- package/dist/web/server/assets/agents-70EwQJR6.js +210 -0
- package/dist/web/server/assets/agents-Ds4lcREv.js +26 -0
- package/dist/web/server/assets/agents-K4Smhnq3.js +14 -0
- package/dist/web/server/assets/auth-DpAGLHpA.js +26 -0
- package/dist/web/server/assets/config-CMXUx_IF.js +19 -0
- package/dist/web/server/assets/config-DQbCsY_l.js +382 -0
- package/dist/web/server/assets/config-DxCGYgR9.js +12 -0
- package/dist/web/server/assets/createServerRpc-CBTntoKx.js +12 -0
- package/dist/web/server/assets/createSsrRpc-DHBVUN8O.js +16 -0
- package/dist/web/server/assets/daemon-client-2NRMzlTr.js +96 -0
- package/dist/web/server/assets/empty-plugin-adapters-Bos_V2s-.js +5 -0
- package/dist/web/server/assets/groups-CXVew7BP.js +150 -0
- package/dist/web/server/assets/groups-Cms8cvH5.js +12 -0
- package/dist/web/server/assets/groups-Dmcvw5ya.js +21 -0
- package/dist/web/server/assets/inbox-0QfwsrGo.js +27 -0
- package/dist/web/server/assets/inbox-8HybA2Ws.js +133 -0
- package/dist/web/server/assets/inbox-B7UWoICA.js +42 -0
- package/dist/web/server/assets/login-CNznncgA.js +58 -0
- package/dist/web/server/assets/login-CQybKk7Y.js +74 -0
- package/dist/web/server/assets/mcp-42BrkI1I.js +12 -0
- package/dist/web/server/assets/mcp-DIa0kIOf.js +268 -0
- package/dist/web/server/assets/mcp-DsTjY3uz.js +12 -0
- package/dist/web/server/assets/memory-BfrMp8iY.js +284 -0
- package/dist/web/server/assets/memory-Dr0lOM2y.js +28 -0
- package/dist/web/server/assets/memory-EEgLDfCj.js +16 -0
- package/dist/web/server/assets/profile-groups-BW5gU-fG.js +12 -0
- package/dist/web/server/assets/profile-groups-B_kIT6BU.js +208 -0
- package/dist/web/server/assets/profile-groups-C5isDI2t.js +28 -0
- package/dist/web/server/assets/profiles-BP1v-jna.js +453 -0
- package/dist/web/server/assets/profiles-BbPTpmyq.js +26 -0
- package/dist/web/server/assets/profiles-Cy5auEj8.js +12 -0
- package/dist/web/server/assets/router-CL100-Ly.js +460 -0
- package/dist/web/server/assets/routes-CzJLQxcS.js +14 -0
- package/dist/web/server/assets/routes-D2H1Hnoh.js +57 -0
- package/dist/web/server/assets/routes-Dzk8jvIo.js +33 -0
- package/dist/web/server/assets/services-Bgj6M2gC.js +12 -0
- package/dist/web/server/assets/services-DEgYsWJ4.js +17 -0
- package/dist/web/server/assets/services-DFenjiw0.js +94 -0
- package/dist/web/server/assets/skills-BASIP_rT.js +12 -0
- package/dist/web/server/assets/skills-C-JPRCHh.js +12 -0
- package/dist/web/server/assets/skills-DZXN680t.js +261 -0
- package/dist/web/server/assets/start-cOXH7eTI.js +4 -0
- package/dist/web/server/assets/telegram-BbvqVWxa.js +583 -0
- package/dist/web/server/assets/telegram-Bq49AtnP.js +12 -0
- package/dist/web/server/assets/telegram-sUckI94O.js +12 -0
- package/dist/web/server/assets/tokens-BERRE0wB.js +14 -0
- package/dist/web/server/assets/tokens-CImgxhDI.js +193 -0
- package/dist/web/server/assets/tokens-Dwn00iV7.js +12 -0
- package/dist/web/server/assets/triggers-DtexqbNH.js +16 -0
- package/dist/web/server/assets/triggers-TyIjwSYn.js +26 -0
- package/dist/web/server/assets/triggers-_iSeahif.js +191 -0
- package/dist/web/server/assets/welcome-BkQ9NC5K.js +81 -0
- package/dist/web/server/assets/wire-constants-Deb4NxBb.js +16 -0
- package/dist/web/server/server.js +5899 -0
- package/dist/web-server.js +42 -0
- package/dist/web-server.js.map +1 -0
- package/package.json +10 -4
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
//#region src/components/ConfigTabs.tsx
|
|
3
|
+
var TABS = [
|
|
4
|
+
{
|
|
5
|
+
key: "providers",
|
|
6
|
+
href: "/config",
|
|
7
|
+
label: "providers"
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
key: "services",
|
|
11
|
+
href: "/config/services",
|
|
12
|
+
label: "services"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
key: "mcp",
|
|
16
|
+
href: "/config/mcp",
|
|
17
|
+
label: "mcp"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
key: "integrations",
|
|
21
|
+
href: "/config/integrations/telegram",
|
|
22
|
+
label: "integrations"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
key: "tokens",
|
|
26
|
+
href: "/config/tokens",
|
|
27
|
+
label: "tokens"
|
|
28
|
+
}
|
|
29
|
+
];
|
|
30
|
+
function ConfigTabs({ active }) {
|
|
31
|
+
return /* @__PURE__ */ jsx("nav", {
|
|
32
|
+
className: "flex gap-1 border-b mb-6",
|
|
33
|
+
children: TABS.map((t) => /* @__PURE__ */ jsx("a", {
|
|
34
|
+
href: t.href,
|
|
35
|
+
className: `px-3 py-2 text-sm border-b-2 -mb-px ${t.key === active ? "border-primary text-primary font-semibold" : "border-transparent text-muted-foreground hover:text-foreground"}`,
|
|
36
|
+
children: t.label
|
|
37
|
+
}, t.key))
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
export { ConfigTabs as t };
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
import { useRouter } from "@tanstack/react-router";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
//#region src/components/FieldRow.tsx
|
|
5
|
+
function FieldRow({ field }) {
|
|
6
|
+
const router = useRouter();
|
|
7
|
+
const [value, setValue] = useState(field.kind === "config" ? field.value ?? "" : "");
|
|
8
|
+
const [busy, setBusy] = useState(false);
|
|
9
|
+
const [err, setErr] = useState(null);
|
|
10
|
+
const [savedAt, setSavedAt] = useState(null);
|
|
11
|
+
async function save(e) {
|
|
12
|
+
e.preventDefault();
|
|
13
|
+
setBusy(true);
|
|
14
|
+
setErr(null);
|
|
15
|
+
try {
|
|
16
|
+
const res = await fetch(`/api/config/fields/${encodeURIComponent(field.envVar)}`, {
|
|
17
|
+
method: "PUT",
|
|
18
|
+
headers: { "content-type": "application/json" },
|
|
19
|
+
body: JSON.stringify({ value })
|
|
20
|
+
});
|
|
21
|
+
if (!res.ok) {
|
|
22
|
+
const j = await res.json().catch(() => ({}));
|
|
23
|
+
throw new Error(j.error ?? `${res.status} ${res.statusText}`);
|
|
24
|
+
}
|
|
25
|
+
setSavedAt(Date.now());
|
|
26
|
+
if (field.kind === "secret") setValue("");
|
|
27
|
+
await router.invalidate();
|
|
28
|
+
} catch (e) {
|
|
29
|
+
setErr(e.message);
|
|
30
|
+
} finally {
|
|
31
|
+
setBusy(false);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return /* @__PURE__ */ jsxs("form", {
|
|
35
|
+
onSubmit: save,
|
|
36
|
+
className: "grid grid-cols-[12rem_minmax(14rem,1fr)_auto_auto] gap-2 items-center py-2 border-b last:border-0",
|
|
37
|
+
children: [
|
|
38
|
+
/* @__PURE__ */ jsxs("div", {
|
|
39
|
+
className: "min-w-0",
|
|
40
|
+
children: [
|
|
41
|
+
/* @__PURE__ */ jsx("div", {
|
|
42
|
+
className: "text-sm",
|
|
43
|
+
children: field.label
|
|
44
|
+
}),
|
|
45
|
+
/* @__PURE__ */ jsx("div", {
|
|
46
|
+
className: "font-mono text-xs text-muted-foreground",
|
|
47
|
+
children: field.envVar
|
|
48
|
+
}),
|
|
49
|
+
field.description && /* @__PURE__ */ jsx("div", {
|
|
50
|
+
className: "text-xs text-muted-foreground mt-0.5",
|
|
51
|
+
children: field.description
|
|
52
|
+
})
|
|
53
|
+
]
|
|
54
|
+
}),
|
|
55
|
+
field.kind === "config" ? /* @__PURE__ */ jsx("input", {
|
|
56
|
+
type: "text",
|
|
57
|
+
value,
|
|
58
|
+
onChange: (e) => setValue(e.target.value),
|
|
59
|
+
placeholder: field.placeholder ?? "",
|
|
60
|
+
className: "rounded-md border bg-background px-2 py-1.5 text-sm outline-none focus:ring-2 focus:ring-ring/30"
|
|
61
|
+
}) : /* @__PURE__ */ jsx("input", {
|
|
62
|
+
type: "password",
|
|
63
|
+
value,
|
|
64
|
+
onChange: (e) => setValue(e.target.value),
|
|
65
|
+
placeholder: field.set ? "(replace — blank clears)" : field.placeholder ?? "paste key…",
|
|
66
|
+
autoComplete: "off",
|
|
67
|
+
className: "rounded-md border bg-background px-2 py-1.5 text-sm outline-none focus:ring-2 focus:ring-ring/30"
|
|
68
|
+
}),
|
|
69
|
+
/* @__PURE__ */ jsxs("span", {
|
|
70
|
+
className: "text-xs",
|
|
71
|
+
children: [field.kind === "secret" && field.set && /* @__PURE__ */ jsx("span", {
|
|
72
|
+
className: "rounded-full bg-emerald-100 text-emerald-800 px-1.5 py-0.5",
|
|
73
|
+
title: `preview: ${field.preview ?? ""}`,
|
|
74
|
+
children: "set"
|
|
75
|
+
}), savedAt && Date.now() - savedAt < 2e3 && /* @__PURE__ */ jsx("span", {
|
|
76
|
+
className: "text-emerald-700 ml-2",
|
|
77
|
+
children: "saved ✓"
|
|
78
|
+
})]
|
|
79
|
+
}),
|
|
80
|
+
/* @__PURE__ */ jsx("button", {
|
|
81
|
+
type: "submit",
|
|
82
|
+
disabled: busy,
|
|
83
|
+
className: "unstyled rounded-md border bg-background px-2 py-1.5 text-xs text-foreground hover:bg-accent disabled:opacity-50",
|
|
84
|
+
children: "save"
|
|
85
|
+
}),
|
|
86
|
+
err && /* @__PURE__ */ jsx("p", {
|
|
87
|
+
className: "col-span-4 text-xs text-rose-700",
|
|
88
|
+
children: err
|
|
89
|
+
})
|
|
90
|
+
]
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
//#endregion
|
|
94
|
+
export { FieldRow as t };
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { r as REASONING_LEVELS } from "./wire-constants-Deb4NxBb.js";
|
|
2
|
+
import { t as Button } from "./Button-Dsnw22OF.js";
|
|
3
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
//#region src/components/MembersEditor.tsx
|
|
5
|
+
function MembersEditor({ members, onChange, profiles, modelGroups, emptyHint = "No members yet. Add one to define your first team member." }) {
|
|
6
|
+
function update(i, patch) {
|
|
7
|
+
onChange(members.map((m, idx) => idx === i ? {
|
|
8
|
+
...m,
|
|
9
|
+
...patch
|
|
10
|
+
} : m));
|
|
11
|
+
}
|
|
12
|
+
function move(i, delta) {
|
|
13
|
+
const j = i + delta;
|
|
14
|
+
if (j < 0 || j >= members.length) return;
|
|
15
|
+
const next = [...members];
|
|
16
|
+
const tmp = next[i];
|
|
17
|
+
const swap = next[j];
|
|
18
|
+
if (!tmp || !swap) return;
|
|
19
|
+
next[i] = swap;
|
|
20
|
+
next[j] = tmp;
|
|
21
|
+
onChange(next);
|
|
22
|
+
}
|
|
23
|
+
function removeMember(i) {
|
|
24
|
+
onChange(members.filter((_, idx) => idx !== i));
|
|
25
|
+
}
|
|
26
|
+
function addMember() {
|
|
27
|
+
const firstProfile = profiles[0];
|
|
28
|
+
if (!firstProfile) return;
|
|
29
|
+
onChange([...members, {
|
|
30
|
+
profileId: firstProfile.id,
|
|
31
|
+
agentName: "agent",
|
|
32
|
+
modelOverride: null,
|
|
33
|
+
reasoningLevel: null
|
|
34
|
+
}]);
|
|
35
|
+
}
|
|
36
|
+
if (profiles.length === 0) return /* @__PURE__ */ jsxs("p", {
|
|
37
|
+
className: "muted",
|
|
38
|
+
children: [
|
|
39
|
+
"Create a profile first under ",
|
|
40
|
+
/* @__PURE__ */ jsx("a", {
|
|
41
|
+
href: "/profiles",
|
|
42
|
+
children: "/profiles"
|
|
43
|
+
}),
|
|
44
|
+
" — members reference existing profiles."
|
|
45
|
+
]
|
|
46
|
+
});
|
|
47
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [members.length === 0 ? /* @__PURE__ */ jsx("p", {
|
|
48
|
+
className: "muted",
|
|
49
|
+
children: emptyHint
|
|
50
|
+
}) : /* @__PURE__ */ jsxs("table", { children: [/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
51
|
+
/* @__PURE__ */ jsx("th", { children: "#" }),
|
|
52
|
+
/* @__PURE__ */ jsx("th", { children: "profile" }),
|
|
53
|
+
/* @__PURE__ */ jsx("th", { children: "agent name" }),
|
|
54
|
+
/* @__PURE__ */ jsx("th", { children: "model override" }),
|
|
55
|
+
/* @__PURE__ */ jsx("th", { children: "reasoning" }),
|
|
56
|
+
/* @__PURE__ */ jsx("th", {})
|
|
57
|
+
] }) }), /* @__PURE__ */ jsx("tbody", { children: members.map((m, i) => /* @__PURE__ */ jsxs("tr", { children: [
|
|
58
|
+
/* @__PURE__ */ jsx("td", { children: i }),
|
|
59
|
+
/* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("select", {
|
|
60
|
+
value: m.profileId,
|
|
61
|
+
onChange: (e) => update(i, { profileId: e.target.value }),
|
|
62
|
+
children: profiles.map((p) => /* @__PURE__ */ jsx("option", {
|
|
63
|
+
value: p.id,
|
|
64
|
+
children: p.id
|
|
65
|
+
}, p.id))
|
|
66
|
+
}) }),
|
|
67
|
+
/* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("input", {
|
|
68
|
+
value: m.agentName,
|
|
69
|
+
onChange: (e) => update(i, { agentName: e.target.value })
|
|
70
|
+
}) }),
|
|
71
|
+
/* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsxs("select", {
|
|
72
|
+
value: m.modelOverride ?? "",
|
|
73
|
+
onChange: (e) => update(i, { modelOverride: e.target.value === "" ? null : e.target.value }),
|
|
74
|
+
children: [/* @__PURE__ */ jsx("option", {
|
|
75
|
+
value: "",
|
|
76
|
+
children: "(use profile default)"
|
|
77
|
+
}), modelGroups.map((g) => /* @__PURE__ */ jsx("optgroup", {
|
|
78
|
+
label: g.provider,
|
|
79
|
+
children: g.models.map((mm) => /* @__PURE__ */ jsx("option", {
|
|
80
|
+
value: `${g.provider}:${mm}`,
|
|
81
|
+
children: `${g.provider}:${mm}`
|
|
82
|
+
}, mm))
|
|
83
|
+
}, g.provider))]
|
|
84
|
+
}) }),
|
|
85
|
+
/* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsxs("select", {
|
|
86
|
+
value: m.reasoningLevel ?? "",
|
|
87
|
+
onChange: (e) => update(i, { reasoningLevel: e.target.value === "" ? null : e.target.value }),
|
|
88
|
+
children: [/* @__PURE__ */ jsx("option", {
|
|
89
|
+
value: "",
|
|
90
|
+
children: "(default: medium)"
|
|
91
|
+
}), REASONING_LEVELS.map((lvl) => /* @__PURE__ */ jsx("option", {
|
|
92
|
+
value: lvl,
|
|
93
|
+
children: lvl
|
|
94
|
+
}, lvl))]
|
|
95
|
+
}) }),
|
|
96
|
+
/* @__PURE__ */ jsxs("td", {
|
|
97
|
+
className: "flex gap-1",
|
|
98
|
+
children: [
|
|
99
|
+
/* @__PURE__ */ jsx(Button, {
|
|
100
|
+
variant: "ghost",
|
|
101
|
+
onClick: () => move(i, -1),
|
|
102
|
+
disabled: i === 0,
|
|
103
|
+
title: "move up",
|
|
104
|
+
children: "↑"
|
|
105
|
+
}),
|
|
106
|
+
/* @__PURE__ */ jsx(Button, {
|
|
107
|
+
variant: "ghost",
|
|
108
|
+
onClick: () => move(i, 1),
|
|
109
|
+
disabled: i === members.length - 1,
|
|
110
|
+
title: "move down",
|
|
111
|
+
children: "↓"
|
|
112
|
+
}),
|
|
113
|
+
/* @__PURE__ */ jsx(Button, {
|
|
114
|
+
variant: "danger",
|
|
115
|
+
onClick: () => removeMember(i),
|
|
116
|
+
title: "remove member",
|
|
117
|
+
children: "✕"
|
|
118
|
+
})
|
|
119
|
+
]
|
|
120
|
+
})
|
|
121
|
+
] }, i)) })] }), /* @__PURE__ */ jsx("div", {
|
|
122
|
+
className: "mt-3",
|
|
123
|
+
children: /* @__PURE__ */ jsx(Button, {
|
|
124
|
+
variant: "ghost",
|
|
125
|
+
onClick: addMember,
|
|
126
|
+
children: "+ add member"
|
|
127
|
+
})
|
|
128
|
+
})] });
|
|
129
|
+
}
|
|
130
|
+
//#endregion
|
|
131
|
+
export { MembersEditor as t };
|