@ampless/admin 0.2.0-alpha.17 → 0.2.0-alpha.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/index.d.ts +2 -48
- package/dist/api/index.js +0 -452
- package/dist/chunk-4QYY7CO7.js +358 -0
- package/dist/{chunk-T3ONEJ6K.js → chunk-5JKOPRCO.js} +2 -2
- package/dist/{chunk-KAMD3SDE.js → chunk-5Q6KVRZ2.js} +2 -2
- package/dist/{chunk-WJTZ5BNQ.js → chunk-A3SWBQA6.js} +1 -1
- package/dist/{chunk-I5S7J7UZ.js → chunk-BC4B6DLO.js} +2 -2
- package/dist/{chunk-5VDMBDFB.js → chunk-CQY55RDG.js} +1 -1
- package/dist/{chunk-3EDGG6ST.js → chunk-CVJCMTYB.js} +2 -2
- package/dist/{chunk-LIGSQETK.js → chunk-IM5MVZOH.js} +2 -2
- package/dist/{chunk-YECVXCET.js → chunk-OSUTPPAU.js} +79 -63
- package/dist/{chunk-G7B3R6WQ.js → chunk-QXJIIBUQ.js} +2 -2
- package/dist/{chunk-IJKYZNII.js → chunk-S66L5CDS.js} +1 -1
- package/dist/{chunk-XFJXMCXX.js → chunk-SRNH2IVA.js} +1 -1
- package/dist/{chunk-OYKHRBCF.js → chunk-W6BXESPW.js} +1 -1
- package/dist/{chunk-K4GZPMPL.js → chunk-XY4JWSMS.js} +1 -1
- package/dist/components/admin-dashboard.js +3 -3
- package/dist/components/edit-post-view.js +5 -5
- package/dist/components/index.d.ts +1 -1
- package/dist/components/index.js +6 -6
- package/dist/components/login-view.js +3 -3
- package/dist/components/mcp-tokens-view.d.ts +19 -2
- package/dist/components/mcp-tokens-view.js +3 -3
- package/dist/components/media-view.js +5 -5
- package/dist/components/new-post-view.js +5 -5
- package/dist/components/posts-list-view.js +3 -3
- package/dist/components/users-list-view.js +3 -3
- package/dist/{i18n-B1gZ90FD.d.ts → i18n-MWvAMHzn.d.ts} +118 -94
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/metafile-esm.json +1 -1
- package/dist/pages/index.d.ts +15 -3
- package/dist/pages/index.js +29 -15
- package/package.json +3 -3
- package/dist/chunk-Q7WU724A.js +0 -205
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import {
|
|
3
|
+
useT
|
|
4
|
+
} from "./chunk-XY4JWSMS.js";
|
|
5
|
+
|
|
6
|
+
// src/components/mcp-tokens-view.tsx
|
|
7
|
+
import { useEffect, useState } from "react";
|
|
8
|
+
import {
|
|
9
|
+
Button,
|
|
10
|
+
Table,
|
|
11
|
+
TableBody,
|
|
12
|
+
TableCell,
|
|
13
|
+
TableHead,
|
|
14
|
+
TableHeader,
|
|
15
|
+
TableRow
|
|
16
|
+
} from "@ampless/runtime/ui";
|
|
17
|
+
|
|
18
|
+
// src/lib/mcp-token-format.ts
|
|
19
|
+
import { randomBytes, createHash } from "crypto";
|
|
20
|
+
function generateToken() {
|
|
21
|
+
const bytes = randomBytes(32);
|
|
22
|
+
const random = bytes.toString("base64url");
|
|
23
|
+
const plain = `amk_${random}`;
|
|
24
|
+
return {
|
|
25
|
+
plain,
|
|
26
|
+
hash: hashToken(plain),
|
|
27
|
+
prefix: plain.slice(0, 8)
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function hashToken(plain) {
|
|
31
|
+
return createHash("sha256").update(plain).digest("hex");
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// src/lib/mcp-token-storage.ts
|
|
35
|
+
import { getKvStore } from "ampless";
|
|
36
|
+
var TOKENS_PK = "mcp-tokens";
|
|
37
|
+
async function listTokens() {
|
|
38
|
+
const items = await getKvStore().query(TOKENS_PK);
|
|
39
|
+
return items.map((item) => item.value);
|
|
40
|
+
}
|
|
41
|
+
async function findByHash(hash) {
|
|
42
|
+
return await getKvStore().get(TOKENS_PK, hash);
|
|
43
|
+
}
|
|
44
|
+
async function createToken(meta) {
|
|
45
|
+
const full = {
|
|
46
|
+
...meta,
|
|
47
|
+
lastUsedAt: null,
|
|
48
|
+
revokedAt: null
|
|
49
|
+
};
|
|
50
|
+
await getKvStore().put(TOKENS_PK, meta.hash, full);
|
|
51
|
+
return full;
|
|
52
|
+
}
|
|
53
|
+
async function revokeToken(hash) {
|
|
54
|
+
const existing = await findByHash(hash);
|
|
55
|
+
if (!existing) return;
|
|
56
|
+
if (existing.revokedAt) return;
|
|
57
|
+
await getKvStore().put(TOKENS_PK, hash, {
|
|
58
|
+
...existing,
|
|
59
|
+
revokedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// src/components/mcp-tokens-view.tsx
|
|
64
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
65
|
+
function tokenStatus(tok) {
|
|
66
|
+
if (tok.revokedAt) return "revoked";
|
|
67
|
+
if (tok.expiresAt && new Date(tok.expiresAt) < /* @__PURE__ */ new Date()) return "expired";
|
|
68
|
+
return "active";
|
|
69
|
+
}
|
|
70
|
+
function relativeTime(iso) {
|
|
71
|
+
if (!iso) return "";
|
|
72
|
+
const ms = Date.now() - new Date(iso).getTime();
|
|
73
|
+
const s = Math.floor(ms / 1e3);
|
|
74
|
+
if (s < 60) return `${s}s ago`;
|
|
75
|
+
const m = Math.floor(s / 60);
|
|
76
|
+
if (m < 60) return `${m}m ago`;
|
|
77
|
+
const h = Math.floor(m / 60);
|
|
78
|
+
if (h < 24) return `${h}h ago`;
|
|
79
|
+
const d = Math.floor(h / 24);
|
|
80
|
+
return `${d}d ago`;
|
|
81
|
+
}
|
|
82
|
+
function McpTokensView({ currentUserId, currentUserEmail, sites, mcpEndpoint }) {
|
|
83
|
+
const t = useT();
|
|
84
|
+
const [endpointCopied, setEndpointCopied] = useState(false);
|
|
85
|
+
async function copyEndpoint() {
|
|
86
|
+
if (!mcpEndpoint) return;
|
|
87
|
+
try {
|
|
88
|
+
await navigator.clipboard.writeText(mcpEndpoint);
|
|
89
|
+
setEndpointCopied(true);
|
|
90
|
+
setTimeout(() => setEndpointCopied(false), 2e3);
|
|
91
|
+
} catch (err) {
|
|
92
|
+
console.error("[mcp-tokens-view] copy endpoint failed", err);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const [tokens, setTokens] = useState(null);
|
|
96
|
+
const [loading, setLoading] = useState(true);
|
|
97
|
+
const [loadError, setLoadError] = useState(null);
|
|
98
|
+
const [showCreateModal, setShowCreateModal] = useState(false);
|
|
99
|
+
const [scopeSiteId, setScopeSiteId] = useState(null);
|
|
100
|
+
const [expPreset, setExpPreset] = useState("never");
|
|
101
|
+
const [customDate, setCustomDate] = useState("");
|
|
102
|
+
const [creating, setCreating] = useState(false);
|
|
103
|
+
const [createError, setCreateError] = useState(null);
|
|
104
|
+
const [revealedPlain, setRevealedPlain] = useState(null);
|
|
105
|
+
const [copied, setCopied] = useState(false);
|
|
106
|
+
async function loadTokens() {
|
|
107
|
+
setLoading(true);
|
|
108
|
+
setLoadError(null);
|
|
109
|
+
try {
|
|
110
|
+
const list = await listTokens();
|
|
111
|
+
setTokens(list);
|
|
112
|
+
} catch (err) {
|
|
113
|
+
console.error("[mcp-tokens-view] listTokens failed", err);
|
|
114
|
+
setLoadError(err instanceof Error ? err.message : String(err));
|
|
115
|
+
} finally {
|
|
116
|
+
setLoading(false);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
useEffect(() => {
|
|
120
|
+
void loadTokens();
|
|
121
|
+
}, []);
|
|
122
|
+
function openCreateModal() {
|
|
123
|
+
setScopeSiteId(null);
|
|
124
|
+
setExpPreset("never");
|
|
125
|
+
setCustomDate("");
|
|
126
|
+
setCreateError(null);
|
|
127
|
+
setShowCreateModal(true);
|
|
128
|
+
}
|
|
129
|
+
function expiresAtFromPreset() {
|
|
130
|
+
if (expPreset === "never") return null;
|
|
131
|
+
if (expPreset === "30days") {
|
|
132
|
+
const d = /* @__PURE__ */ new Date();
|
|
133
|
+
d.setDate(d.getDate() + 30);
|
|
134
|
+
return d.toISOString();
|
|
135
|
+
}
|
|
136
|
+
if (expPreset === "90days") {
|
|
137
|
+
const d = /* @__PURE__ */ new Date();
|
|
138
|
+
d.setDate(d.getDate() + 90);
|
|
139
|
+
return d.toISOString();
|
|
140
|
+
}
|
|
141
|
+
if (expPreset === "custom" && customDate) {
|
|
142
|
+
return new Date(customDate).toISOString();
|
|
143
|
+
}
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
async function handleIssue() {
|
|
147
|
+
setCreating(true);
|
|
148
|
+
setCreateError(null);
|
|
149
|
+
try {
|
|
150
|
+
const { plain, hash, prefix } = generateToken();
|
|
151
|
+
const meta = await createToken({
|
|
152
|
+
hash,
|
|
153
|
+
prefix,
|
|
154
|
+
scope: { siteId: scopeSiteId },
|
|
155
|
+
createdBy: currentUserId,
|
|
156
|
+
createdByEmail: currentUserEmail,
|
|
157
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
158
|
+
expiresAt: expiresAtFromPreset()
|
|
159
|
+
});
|
|
160
|
+
void meta;
|
|
161
|
+
setShowCreateModal(false);
|
|
162
|
+
setRevealedPlain(plain);
|
|
163
|
+
void loadTokens();
|
|
164
|
+
} catch (err) {
|
|
165
|
+
console.error("[mcp-tokens-view] createToken failed", err);
|
|
166
|
+
setCreateError(err instanceof Error ? err.message : String(err));
|
|
167
|
+
} finally {
|
|
168
|
+
setCreating(false);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
async function handleRevoke(hash) {
|
|
172
|
+
if (!confirm(t("mcpTokens.revokeConfirm"))) return;
|
|
173
|
+
try {
|
|
174
|
+
await revokeToken(hash);
|
|
175
|
+
void loadTokens();
|
|
176
|
+
} catch (err) {
|
|
177
|
+
console.error("[mcp-tokens-view] revokeToken failed", err);
|
|
178
|
+
alert(err instanceof Error ? err.message : String(err));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
async function copyToClipboard() {
|
|
182
|
+
if (!revealedPlain) return;
|
|
183
|
+
try {
|
|
184
|
+
await navigator.clipboard.writeText(revealedPlain);
|
|
185
|
+
setCopied(true);
|
|
186
|
+
setTimeout(() => setCopied(false), 1500);
|
|
187
|
+
} catch (err) {
|
|
188
|
+
console.warn("[mcp-tokens-view] clipboard write failed", err);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
function scopeLabel(siteId) {
|
|
192
|
+
if (!siteId) return t("mcpTokens.scopeAll");
|
|
193
|
+
const site = sites.find((s) => s.id === siteId);
|
|
194
|
+
return site?.name ?? siteId;
|
|
195
|
+
}
|
|
196
|
+
return /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-4xl space-y-8 p-4 md:p-8", children: [
|
|
197
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-4", children: [
|
|
198
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
199
|
+
/* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold md:text-3xl", children: t("mcpTokens.title") }),
|
|
200
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: t("mcpTokens.description") })
|
|
201
|
+
] }),
|
|
202
|
+
/* @__PURE__ */ jsx(Button, { type: "button", onClick: openCreateModal, children: t("mcpTokens.createButton") })
|
|
203
|
+
] }),
|
|
204
|
+
/* @__PURE__ */ jsxs("div", { className: "rounded-md border bg-card px-4 py-3 text-sm", children: [
|
|
205
|
+
/* @__PURE__ */ jsx("p", { className: "font-medium", children: t("mcpTokens.endpointTitle") }),
|
|
206
|
+
mcpEndpoint ? /* @__PURE__ */ jsxs("div", { className: "mt-2 flex items-center gap-2", children: [
|
|
207
|
+
/* @__PURE__ */ jsx("code", { className: "flex-1 overflow-x-auto rounded border bg-muted px-2 py-1 font-mono text-xs", children: mcpEndpoint }),
|
|
208
|
+
/* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: copyEndpoint, children: endpointCopied ? t("mcpTokens.endpointCopied") : t("mcpTokens.endpointCopy") })
|
|
209
|
+
] }) : /* @__PURE__ */ jsx("p", { className: "mt-1 text-muted-foreground", children: t("mcpTokens.endpointMissing") })
|
|
210
|
+
] }),
|
|
211
|
+
/* @__PURE__ */ jsx("div", { className: "rounded-md border border-yellow-300 bg-yellow-50 px-4 py-3 text-sm text-yellow-800 dark:border-yellow-700 dark:bg-yellow-950 dark:text-yellow-200", children: t("mcpTokens.inertBanner") }),
|
|
212
|
+
/* @__PURE__ */ jsx("section", { className: "space-y-3", children: loading ? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: t("mcpTokens.loading") }) : loadError ? /* @__PURE__ */ jsxs("p", { className: "text-sm text-destructive", children: [
|
|
213
|
+
t("mcpTokens.error"),
|
|
214
|
+
": ",
|
|
215
|
+
loadError
|
|
216
|
+
] }) : !tokens || tokens.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: t("mcpTokens.listEmpty") }) : /* @__PURE__ */ jsx("div", { className: "overflow-x-auto rounded-md border", children: /* @__PURE__ */ jsxs(Table, { children: [
|
|
217
|
+
/* @__PURE__ */ jsx(TableHeader, { children: /* @__PURE__ */ jsxs(TableRow, { children: [
|
|
218
|
+
/* @__PURE__ */ jsx(TableHead, { children: t("mcpTokens.columnPrefix") }),
|
|
219
|
+
/* @__PURE__ */ jsx(TableHead, { children: t("mcpTokens.columnScope") }),
|
|
220
|
+
/* @__PURE__ */ jsx(TableHead, { children: t("mcpTokens.columnCreated") }),
|
|
221
|
+
/* @__PURE__ */ jsx(TableHead, { children: t("mcpTokens.columnLastUsed") }),
|
|
222
|
+
/* @__PURE__ */ jsx(TableHead, { children: t("mcpTokens.columnStatus") }),
|
|
223
|
+
/* @__PURE__ */ jsx(TableHead, { children: t("common.actions") })
|
|
224
|
+
] }) }),
|
|
225
|
+
/* @__PURE__ */ jsx(TableBody, { children: tokens.map((tok) => {
|
|
226
|
+
const status = tokenStatus(tok);
|
|
227
|
+
return /* @__PURE__ */ jsxs(TableRow, { children: [
|
|
228
|
+
/* @__PURE__ */ jsx(TableCell, { className: "font-mono text-xs", children: tok.prefix }),
|
|
229
|
+
/* @__PURE__ */ jsx(TableCell, { className: "text-sm", children: scopeLabel(tok.scope.siteId) }),
|
|
230
|
+
/* @__PURE__ */ jsxs(TableCell, { className: "text-xs text-muted-foreground", children: [
|
|
231
|
+
/* @__PURE__ */ jsx("span", { title: tok.createdAt, children: relativeTime(tok.createdAt) }),
|
|
232
|
+
tok.createdByEmail && /* @__PURE__ */ jsxs("span", { className: "ml-1 text-muted-foreground/70", children: [
|
|
233
|
+
"by ",
|
|
234
|
+
tok.createdByEmail
|
|
235
|
+
] })
|
|
236
|
+
] }),
|
|
237
|
+
/* @__PURE__ */ jsx(TableCell, { className: "text-xs text-muted-foreground", children: tok.lastUsedAt ? /* @__PURE__ */ jsx("span", { title: tok.lastUsedAt, children: relativeTime(tok.lastUsedAt) }) : t("mcpTokens.lastUsedNever") }),
|
|
238
|
+
/* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx(
|
|
239
|
+
"span",
|
|
240
|
+
{
|
|
241
|
+
className: status === "active" ? "text-sm font-medium text-green-700 dark:text-green-400" : "text-sm text-muted-foreground",
|
|
242
|
+
children: status === "active" ? t("mcpTokens.statusActive") : status === "revoked" ? t("mcpTokens.statusRevoked") : t("mcpTokens.statusExpired")
|
|
243
|
+
}
|
|
244
|
+
) }),
|
|
245
|
+
/* @__PURE__ */ jsx(TableCell, { children: status === "active" && /* @__PURE__ */ jsx(
|
|
246
|
+
Button,
|
|
247
|
+
{
|
|
248
|
+
type: "button",
|
|
249
|
+
variant: "outline",
|
|
250
|
+
size: "sm",
|
|
251
|
+
onClick: () => handleRevoke(tok.hash),
|
|
252
|
+
children: t("mcpTokens.revoke")
|
|
253
|
+
}
|
|
254
|
+
) })
|
|
255
|
+
] }, tok.hash);
|
|
256
|
+
}) })
|
|
257
|
+
] }) }) }),
|
|
258
|
+
showCreateModal && /* @__PURE__ */ jsx("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4", children: /* @__PURE__ */ jsxs("div", { className: "w-full max-w-md rounded-md border bg-card p-6 shadow-lg", children: [
|
|
259
|
+
/* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold", children: t("mcpTokens.createModalTitle") }),
|
|
260
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-4 space-y-4", children: [
|
|
261
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
|
|
262
|
+
/* @__PURE__ */ jsx("label", { className: "text-sm font-medium", htmlFor: "mcp-scope", children: t("mcpTokens.scopeLabel") }),
|
|
263
|
+
/* @__PURE__ */ jsxs(
|
|
264
|
+
"select",
|
|
265
|
+
{
|
|
266
|
+
id: "mcp-scope",
|
|
267
|
+
className: "w-full rounded-md border bg-background px-2 py-1.5 text-sm",
|
|
268
|
+
value: scopeSiteId ?? "",
|
|
269
|
+
onChange: (e) => setScopeSiteId(e.target.value === "" ? null : e.target.value),
|
|
270
|
+
children: [
|
|
271
|
+
/* @__PURE__ */ jsx("option", { value: "", children: t("mcpTokens.scopeAll") }),
|
|
272
|
+
sites.map((s) => /* @__PURE__ */ jsx("option", { value: s.id, children: s.name }, s.id))
|
|
273
|
+
]
|
|
274
|
+
}
|
|
275
|
+
)
|
|
276
|
+
] }),
|
|
277
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
278
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: t("mcpTokens.expirationLabel") }),
|
|
279
|
+
["never", "30days", "90days", "custom"].map((preset) => /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2 text-sm", children: [
|
|
280
|
+
/* @__PURE__ */ jsx(
|
|
281
|
+
"input",
|
|
282
|
+
{
|
|
283
|
+
type: "radio",
|
|
284
|
+
name: "mcp-expiration",
|
|
285
|
+
value: preset,
|
|
286
|
+
checked: expPreset === preset,
|
|
287
|
+
onChange: () => setExpPreset(preset)
|
|
288
|
+
}
|
|
289
|
+
),
|
|
290
|
+
t(`mcpTokens.expiration${preset.charAt(0).toUpperCase() + preset.slice(1)}`)
|
|
291
|
+
] }, preset)),
|
|
292
|
+
expPreset === "custom" && /* @__PURE__ */ jsx(
|
|
293
|
+
"input",
|
|
294
|
+
{
|
|
295
|
+
type: "date",
|
|
296
|
+
className: "mt-1 block rounded-md border bg-background px-2 py-1 text-sm",
|
|
297
|
+
value: customDate,
|
|
298
|
+
min: (/* @__PURE__ */ new Date()).toISOString().slice(0, 10),
|
|
299
|
+
onChange: (e) => setCustomDate(e.target.value)
|
|
300
|
+
}
|
|
301
|
+
)
|
|
302
|
+
] }),
|
|
303
|
+
createError && /* @__PURE__ */ jsx("p", { className: "text-sm text-destructive", children: createError })
|
|
304
|
+
] }),
|
|
305
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-6 flex justify-end gap-2", children: [
|
|
306
|
+
/* @__PURE__ */ jsx(
|
|
307
|
+
Button,
|
|
308
|
+
{
|
|
309
|
+
type: "button",
|
|
310
|
+
variant: "outline",
|
|
311
|
+
onClick: () => setShowCreateModal(false),
|
|
312
|
+
children: t("common.cancel")
|
|
313
|
+
}
|
|
314
|
+
),
|
|
315
|
+
/* @__PURE__ */ jsx(
|
|
316
|
+
Button,
|
|
317
|
+
{
|
|
318
|
+
type: "button",
|
|
319
|
+
disabled: creating || expPreset === "custom" && !customDate,
|
|
320
|
+
onClick: () => void handleIssue(),
|
|
321
|
+
children: creating ? t("mcpTokens.issuing") : t("mcpTokens.issueButton")
|
|
322
|
+
}
|
|
323
|
+
)
|
|
324
|
+
] })
|
|
325
|
+
] }) }),
|
|
326
|
+
revealedPlain && /* @__PURE__ */ jsx("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4", children: /* @__PURE__ */ jsxs("div", { className: "w-full max-w-2xl rounded-md border bg-card p-6 shadow-lg", children: [
|
|
327
|
+
/* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold", children: t("mcpTokens.revealTitle") }),
|
|
328
|
+
/* @__PURE__ */ jsx("p", { className: "mt-2 text-sm text-muted-foreground", children: t("mcpTokens.revealHint") }),
|
|
329
|
+
/* @__PURE__ */ jsx("div", { className: "mt-4 rounded-md border bg-muted/50 p-3", children: /* @__PURE__ */ jsx("code", { className: "block select-all break-all font-mono text-xs", children: revealedPlain }) }),
|
|
330
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-4 flex justify-end gap-2", children: [
|
|
331
|
+
/* @__PURE__ */ jsx(
|
|
332
|
+
Button,
|
|
333
|
+
{
|
|
334
|
+
type: "button",
|
|
335
|
+
variant: "outline",
|
|
336
|
+
onClick: () => void copyToClipboard(),
|
|
337
|
+
children: copied ? t("mcpTokens.copied") : t("mcpTokens.copy")
|
|
338
|
+
}
|
|
339
|
+
),
|
|
340
|
+
/* @__PURE__ */ jsx(
|
|
341
|
+
Button,
|
|
342
|
+
{
|
|
343
|
+
type: "button",
|
|
344
|
+
onClick: () => {
|
|
345
|
+
setRevealedPlain(null);
|
|
346
|
+
setCopied(false);
|
|
347
|
+
},
|
|
348
|
+
children: t("mcpTokens.done")
|
|
349
|
+
}
|
|
350
|
+
)
|
|
351
|
+
] })
|
|
352
|
+
] }) })
|
|
353
|
+
] });
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
export {
|
|
357
|
+
McpTokensView
|
|
358
|
+
};
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import {
|
|
3
3
|
PostForm
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-CVJCMTYB.js";
|
|
5
5
|
import {
|
|
6
6
|
readAdminSiteIdFromCookie
|
|
7
7
|
} from "./chunk-TZWSXAHD.js";
|
|
8
8
|
import {
|
|
9
9
|
useT
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-XY4JWSMS.js";
|
|
11
11
|
|
|
12
12
|
// src/components/edit-post-view.tsx
|
|
13
13
|
import { useEffect, useState, use } from "react";
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
import {
|
|
3
3
|
ImageUploadDialog,
|
|
4
4
|
getMediaProcessingDefaults
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-S66L5CDS.js";
|
|
6
6
|
import {
|
|
7
7
|
publicMediaUrl
|
|
8
8
|
} from "./chunk-2ITWLRYF.js";
|
|
9
9
|
import {
|
|
10
10
|
useT
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-XY4JWSMS.js";
|
|
12
12
|
|
|
13
13
|
// src/components/media-uploader.tsx
|
|
14
14
|
import { useState, useEffect, useCallback, useRef } from "react";
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import {
|
|
3
3
|
PostForm
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-CVJCMTYB.js";
|
|
5
5
|
import {
|
|
6
6
|
useT
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-XY4JWSMS.js";
|
|
8
8
|
|
|
9
9
|
// src/components/new-post-view.tsx
|
|
10
10
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -5,13 +5,13 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
ImageUploadDialog,
|
|
7
7
|
getMediaProcessingDefaults
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-S66L5CDS.js";
|
|
9
9
|
import {
|
|
10
10
|
publicMediaUrl
|
|
11
11
|
} from "./chunk-2ITWLRYF.js";
|
|
12
12
|
import {
|
|
13
13
|
useT
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-XY4JWSMS.js";
|
|
15
15
|
|
|
16
16
|
// src/lib/upload.ts
|
|
17
17
|
import { uploadData } from "aws-amplify/storage";
|
|
@@ -10,14 +10,14 @@ import {
|
|
|
10
10
|
} from "./chunk-7IR4F7GA.js";
|
|
11
11
|
import {
|
|
12
12
|
setAdminCmsConfigClient
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-S66L5CDS.js";
|
|
14
14
|
import {
|
|
15
15
|
setAdminMediaContext
|
|
16
16
|
} from "./chunk-2ITWLRYF.js";
|
|
17
17
|
import {
|
|
18
18
|
useLocale,
|
|
19
19
|
useT
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-XY4JWSMS.js";
|
|
21
21
|
|
|
22
22
|
// src/lib/amplify-client.ts
|
|
23
23
|
import { Amplify } from "aws-amplify";
|
|
@@ -184,37 +184,6 @@ var en_default = {
|
|
|
184
184
|
roleNone: "None"
|
|
185
185
|
}
|
|
186
186
|
},
|
|
187
|
-
mcpTokens: {
|
|
188
|
-
title: "MCP tokens",
|
|
189
|
-
description: "Access tokens for the MCP HTTP endpoint at /api/mcp. Use them in Claude Desktop / Cursor / any MCP-aware client to read and write this CMS over the wire.",
|
|
190
|
-
setupMissing: "MCP service Cognito user not configured. Set AMPLESS_MCP_SERVICE_EMAIL and AMPLESS_MCP_SERVICE_PASSWORD as Amplify Hosting environment variables and redeploy. See docs/mcp-http-setup.md.",
|
|
191
|
-
createTitle: "Create token",
|
|
192
|
-
createHint: "Pick a memorable label so you can revoke this token later. Role limits what the token can do \u2014 admin can delete posts, editor cannot.",
|
|
193
|
-
labelLabel: "Label",
|
|
194
|
-
labelPlaceholder: "Claude Desktop \u2014 laptop",
|
|
195
|
-
roleLabel: "Role",
|
|
196
|
-
roleAdmin: "Admin (all tools incl. delete)",
|
|
197
|
-
roleEditor: "Editor (cannot delete)",
|
|
198
|
-
createButton: "Generate token",
|
|
199
|
-
creating: "Generating...",
|
|
200
|
-
createdTitle: "Token created \u2014 copy it now",
|
|
201
|
-
createdHint: "This is the only time the plaintext token will be shown. Copy it into your MCP client config; if you lose it, revoke this token and generate a fresh one.",
|
|
202
|
-
copy: "Copy",
|
|
203
|
-
copied: "Copied!",
|
|
204
|
-
close: "Close",
|
|
205
|
-
listTitle: "Active tokens",
|
|
206
|
-
listEmpty: "No tokens issued yet.",
|
|
207
|
-
columnLabel: "Label",
|
|
208
|
-
columnRole: "Role",
|
|
209
|
-
columnCreated: "Created",
|
|
210
|
-
columnLastUsed: "Last used",
|
|
211
|
-
columnActions: "Actions",
|
|
212
|
-
lastUsedNever: "Never",
|
|
213
|
-
revoke: "Revoke",
|
|
214
|
-
revokeConfirm: "Revoke this token? Clients using it will start getting 401 immediately.",
|
|
215
|
-
loading: "Loading tokens...",
|
|
216
|
-
error: "Failed to load tokens"
|
|
217
|
-
},
|
|
218
187
|
theme: {
|
|
219
188
|
title: "Theme",
|
|
220
189
|
activeLabel: "Active theme",
|
|
@@ -300,6 +269,45 @@ var en_default = {
|
|
|
300
269
|
userExists: "An account with this email already exists."
|
|
301
270
|
}
|
|
302
271
|
},
|
|
272
|
+
mcpTokens: {
|
|
273
|
+
title: "MCP tokens",
|
|
274
|
+
description: "Access tokens for the HTTP MCP endpoint. Use them in Claude Desktop / Cursor / any MCP-aware client to read and write this CMS over the wire.",
|
|
275
|
+
endpointTitle: "MCP endpoint",
|
|
276
|
+
endpointCopy: "Copy",
|
|
277
|
+
endpointCopied: "Copied",
|
|
278
|
+
endpointMissing: "Not deployed yet. Run `npm run sandbox` or push to Amplify Hosting to provision the endpoint URL.",
|
|
279
|
+
inertBanner: "Heads up: the endpoint validates tokens, but tool dispatch (list_posts / create_post / etc.) lands in v0.2 Phase 4. Valid tokens currently get a stub 200 response.",
|
|
280
|
+
createButton: "Create token",
|
|
281
|
+
createModalTitle: "Create token",
|
|
282
|
+
scopeLabel: "Scope",
|
|
283
|
+
scopeAll: "All sites",
|
|
284
|
+
expirationLabel: "Expiration",
|
|
285
|
+
expirationNever: "Never",
|
|
286
|
+
expiration30days: "30 days",
|
|
287
|
+
expiration90days: "90 days",
|
|
288
|
+
expirationCustom: "Custom date",
|
|
289
|
+
issueButton: "Issue token",
|
|
290
|
+
issuing: "Issuing...",
|
|
291
|
+
revealTitle: "Token issued",
|
|
292
|
+
revealHint: "This is the only time you will see this token. Copy it now \u2014 closing this dialog discards it permanently.",
|
|
293
|
+
copy: "Copy",
|
|
294
|
+
copied: "Copied!",
|
|
295
|
+
done: "Done",
|
|
296
|
+
loading: "Loading tokens...",
|
|
297
|
+
error: "Failed to load tokens",
|
|
298
|
+
listEmpty: "No tokens yet. Click 'Create token' to issue your first one.",
|
|
299
|
+
columnPrefix: "Prefix",
|
|
300
|
+
columnScope: "Scope",
|
|
301
|
+
columnCreated: "Created",
|
|
302
|
+
columnLastUsed: "Last used",
|
|
303
|
+
columnStatus: "Status",
|
|
304
|
+
lastUsedNever: "Never used",
|
|
305
|
+
statusActive: "Active",
|
|
306
|
+
statusRevoked: "Revoked",
|
|
307
|
+
statusExpired: "Expired",
|
|
308
|
+
revoke: "Revoke",
|
|
309
|
+
revokeConfirm: "Revoke this token? This cannot be undone."
|
|
310
|
+
},
|
|
303
311
|
public: {
|
|
304
312
|
back: "\u2190 Back",
|
|
305
313
|
home: "\u2190 Home",
|
|
@@ -345,7 +353,7 @@ var ja_default = {
|
|
|
345
353
|
media: "\u30E1\u30C7\u30A3\u30A2",
|
|
346
354
|
sites: "\u30B5\u30A4\u30C8",
|
|
347
355
|
users: "\u30E6\u30FC\u30B6\u30FC",
|
|
348
|
-
mcpTokens: "MCP\u30C8\u30FC\u30AF\u30F3",
|
|
356
|
+
mcpTokens: "MCP \u30C8\u30FC\u30AF\u30F3",
|
|
349
357
|
viewSite: "\u30B5\u30A4\u30C8\u3092\u8868\u793A",
|
|
350
358
|
signOut: "\u30B5\u30A4\u30F3\u30A2\u30A6\u30C8",
|
|
351
359
|
site: "\u30B5\u30A4\u30C8",
|
|
@@ -494,37 +502,6 @@ var ja_default = {
|
|
|
494
502
|
roleNone: "\u306A\u3057"
|
|
495
503
|
}
|
|
496
504
|
},
|
|
497
|
-
mcpTokens: {
|
|
498
|
-
title: "MCP\u30C8\u30FC\u30AF\u30F3",
|
|
499
|
-
description: "/api/mcp \u306E HTTP MCP \u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3067\u4F7F\u3046\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u3002Claude Desktop / Cursor \u306A\u3069\u306E MCP \u5BFE\u5FDC\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u306B\u767B\u9332\u3059\u308B\u3068\u3001AI \u304B\u3089\u3053\u306E CMS \u3092\u8AAD\u307F\u66F8\u304D\u3067\u304D\u308B\u3088\u3046\u306B\u306A\u308A\u307E\u3059\u3002",
|
|
500
|
-
setupMissing: "MCP \u30B5\u30FC\u30D3\u30B9 Cognito \u30E6\u30FC\u30B6\u30FC\u304C\u672A\u8A2D\u5B9A\u3067\u3059\u3002Amplify Hosting \u306E\u74B0\u5883\u5909\u6570 AMPLESS_MCP_SERVICE_EMAIL \u3068 AMPLESS_MCP_SERVICE_PASSWORD \u3092\u8A2D\u5B9A\u3057\u3066\u518D\u30C7\u30D7\u30ED\u30A4\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u8A73\u7D30\u306F docs/mcp-http-setup.md \u3092\u53C2\u7167\u3002",
|
|
501
|
-
createTitle: "\u30C8\u30FC\u30AF\u30F3\u4F5C\u6210",
|
|
502
|
-
createHint: "\u5F8C\u3067\u53D6\u308A\u6D88\u3057\u3084\u3059\u3044\u3088\u3046\u3001\u7528\u9014\u304C\u308F\u304B\u308B\u30E9\u30D9\u30EB\u3092\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044\u3002\u30ED\u30FC\u30EB\u306F\u6A29\u9650\u3092\u5236\u9650\u3057\u307E\u3059 \u2014 admin \u306F\u524A\u9664\u3082\u53EF\u3001editor \u306F\u524A\u9664\u4E0D\u53EF\u3002",
|
|
503
|
-
labelLabel: "\u30E9\u30D9\u30EB",
|
|
504
|
-
labelPlaceholder: "Claude Desktop \u2014 \u30E9\u30C3\u30D7\u30C8\u30C3\u30D7",
|
|
505
|
-
roleLabel: "\u30ED\u30FC\u30EB",
|
|
506
|
-
roleAdmin: "Admin (\u524A\u9664\u3092\u542B\u3080\u5168\u30C4\u30FC\u30EB)",
|
|
507
|
-
roleEditor: "Editor (\u524A\u9664\u306F\u4E0D\u53EF)",
|
|
508
|
-
createButton: "\u30C8\u30FC\u30AF\u30F3\u751F\u6210",
|
|
509
|
-
creating: "\u751F\u6210\u4E2D...",
|
|
510
|
-
createdTitle: "\u30C8\u30FC\u30AF\u30F3\u3092\u751F\u6210\u3057\u307E\u3057\u305F \u2014 \u4ECA\u3059\u3050\u30B3\u30D4\u30FC\u3057\u3066\u304F\u3060\u3055\u3044",
|
|
511
|
-
createdHint: "\u5E73\u6587\u3092\u8868\u793A\u3059\u308B\u306E\u306F\u3053\u306E 1 \u56DE\u3060\u3051\u3067\u3059\u3002MCP \u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u306E\u8A2D\u5B9A\u306B\u8CBC\u308A\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044\u3002\u7D1B\u5931\u3057\u305F\u5834\u5408\u306F\u53D6\u308A\u6D88\u3057\u3066\u518D\u767A\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
512
|
-
copy: "\u30B3\u30D4\u30FC",
|
|
513
|
-
copied: "\u30B3\u30D4\u30FC\u3057\u307E\u3057\u305F!",
|
|
514
|
-
close: "\u9589\u3058\u308B",
|
|
515
|
-
listTitle: "\u6709\u52B9\u306A\u30C8\u30FC\u30AF\u30F3",
|
|
516
|
-
listEmpty: "\u307E\u3060\u30C8\u30FC\u30AF\u30F3\u3092\u767A\u884C\u3057\u3066\u3044\u307E\u305B\u3093\u3002",
|
|
517
|
-
columnLabel: "\u30E9\u30D9\u30EB",
|
|
518
|
-
columnRole: "\u30ED\u30FC\u30EB",
|
|
519
|
-
columnCreated: "\u4F5C\u6210\u65E5\u6642",
|
|
520
|
-
columnLastUsed: "\u6700\u7D42\u4F7F\u7528",
|
|
521
|
-
columnActions: "\u64CD\u4F5C",
|
|
522
|
-
lastUsedNever: "\u672A\u4F7F\u7528",
|
|
523
|
-
revoke: "\u53D6\u308A\u6D88\u3057",
|
|
524
|
-
revokeConfirm: "\u3053\u306E\u30C8\u30FC\u30AF\u30F3\u3092\u53D6\u308A\u6D88\u3057\u307E\u3059\u304B? \u4F7F\u7528\u4E2D\u306E\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u306F\u5373\u5EA7\u306B 401 \u306B\u306A\u308A\u307E\u3059\u3002",
|
|
525
|
-
loading: "\u30C8\u30FC\u30AF\u30F3\u4E00\u89A7\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D...",
|
|
526
|
-
error: "\u30C8\u30FC\u30AF\u30F3\u4E00\u89A7\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F"
|
|
527
|
-
},
|
|
528
505
|
theme: {
|
|
529
506
|
title: "\u30C6\u30FC\u30DE",
|
|
530
507
|
activeLabel: "\u30A2\u30AF\u30C6\u30A3\u30D6\u30C6\u30FC\u30DE",
|
|
@@ -610,6 +587,45 @@ var ja_default = {
|
|
|
610
587
|
userExists: "\u3053\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u306F\u65E2\u306B\u5B58\u5728\u3057\u307E\u3059\u3002"
|
|
611
588
|
}
|
|
612
589
|
},
|
|
590
|
+
mcpTokens: {
|
|
591
|
+
title: "MCP \u30C8\u30FC\u30AF\u30F3",
|
|
592
|
+
description: "HTTP MCP \u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u7528\u306E\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u3002Claude Desktop / Cursor \u306A\u3069\u306E MCP \u5BFE\u5FDC\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u304B\u3089\u3001\u3053\u306E CMS \u306E\u8AAD\u307F\u66F8\u304D\u306B\u4F7F\u3048\u307E\u3059\u3002",
|
|
593
|
+
endpointTitle: "MCP \u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8",
|
|
594
|
+
endpointCopy: "\u30B3\u30D4\u30FC",
|
|
595
|
+
endpointCopied: "\u30B3\u30D4\u30FC\u6E08\u307F",
|
|
596
|
+
endpointMissing: "\u307E\u3060\u30C7\u30D7\u30ED\u30A4\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002`npm run sandbox` \u3092\u5B9F\u884C\u3059\u308B\u304B Amplify Hosting \u306B push \u3057\u3066\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8 URL \u3092\u30D7\u30ED\u30D3\u30B8\u30E7\u30CB\u30F3\u30B0\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
597
|
+
inertBanner: "\u6CE8\u610F: \u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u306F\u30C8\u30FC\u30AF\u30F3\u691C\u8A3C\u3092\u884C\u3044\u307E\u3059\u304C\u3001\u30C4\u30FC\u30EB\u30C7\u30A3\u30B9\u30D1\u30C3\u30C1 (list_posts / create_post \u306A\u3069) \u306F v0.2 Phase 4 \u3067\u5B9F\u88C5\u3055\u308C\u307E\u3059\u3002\u73FE\u5728\u306F\u6709\u52B9\u306A\u30C8\u30FC\u30AF\u30F3\u306B\u5BFE\u3057\u3066 stub \u306E 200 \u30EC\u30B9\u30DD\u30F3\u30B9\u3092\u8FD4\u3057\u307E\u3059\u3002",
|
|
598
|
+
createButton: "\u30C8\u30FC\u30AF\u30F3\u3092\u4F5C\u6210",
|
|
599
|
+
createModalTitle: "\u30C8\u30FC\u30AF\u30F3\u3092\u4F5C\u6210",
|
|
600
|
+
scopeLabel: "\u30B9\u30B3\u30FC\u30D7",
|
|
601
|
+
scopeAll: "\u3059\u3079\u3066\u306E\u30B5\u30A4\u30C8",
|
|
602
|
+
expirationLabel: "\u6709\u52B9\u671F\u9650",
|
|
603
|
+
expirationNever: "\u7121\u671F\u9650",
|
|
604
|
+
expiration30days: "30\u65E5",
|
|
605
|
+
expiration90days: "90\u65E5",
|
|
606
|
+
expirationCustom: "\u65E5\u4ED8\u3092\u6307\u5B9A",
|
|
607
|
+
issueButton: "\u30C8\u30FC\u30AF\u30F3\u3092\u767A\u884C",
|
|
608
|
+
issuing: "\u767A\u884C\u4E2D...",
|
|
609
|
+
revealTitle: "\u30C8\u30FC\u30AF\u30F3\u3092\u767A\u884C\u3057\u307E\u3057\u305F",
|
|
610
|
+
revealHint: "\u3053\u306E\u30C8\u30FC\u30AF\u30F3\u304C\u8868\u793A\u3055\u308C\u308B\u306E\u306F\u4ECA\u56DE\u9650\u308A\u3067\u3059\u3002\u4ECA\u3059\u3050\u30B3\u30D4\u30FC\u3057\u3066\u304F\u3060\u3055\u3044 \u2014 \u30C0\u30A4\u30A2\u30ED\u30B0\u3092\u9589\u3058\u308B\u3068\u6C38\u4E45\u306B\u5931\u308F\u308C\u307E\u3059\u3002",
|
|
611
|
+
copy: "\u30B3\u30D4\u30FC",
|
|
612
|
+
copied: "\u30B3\u30D4\u30FC\u3057\u307E\u3057\u305F",
|
|
613
|
+
done: "\u9589\u3058\u308B",
|
|
614
|
+
loading: "\u30C8\u30FC\u30AF\u30F3\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D...",
|
|
615
|
+
error: "\u30C8\u30FC\u30AF\u30F3\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
|
|
616
|
+
listEmpty: "\u30C8\u30FC\u30AF\u30F3\u304C\u307E\u3060\u3042\u308A\u307E\u305B\u3093\u3002\u300C\u30C8\u30FC\u30AF\u30F3\u3092\u4F5C\u6210\u300D\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u6700\u521D\u306E\u30C8\u30FC\u30AF\u30F3\u3092\u767A\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
617
|
+
columnPrefix: "\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9",
|
|
618
|
+
columnScope: "\u30B9\u30B3\u30FC\u30D7",
|
|
619
|
+
columnCreated: "\u4F5C\u6210\u65E5\u6642",
|
|
620
|
+
columnLastUsed: "\u6700\u7D42\u4F7F\u7528",
|
|
621
|
+
columnStatus: "\u30B9\u30C6\u30FC\u30BF\u30B9",
|
|
622
|
+
lastUsedNever: "\u672A\u4F7F\u7528",
|
|
623
|
+
statusActive: "\u6709\u52B9",
|
|
624
|
+
statusRevoked: "\u5931\u52B9",
|
|
625
|
+
statusExpired: "\u671F\u9650\u5207\u308C",
|
|
626
|
+
revoke: "\u5931\u52B9",
|
|
627
|
+
revokeConfirm: "\u3053\u306E\u30C8\u30FC\u30AF\u30F3\u3092\u5931\u52B9\u3055\u305B\u307E\u3059\u304B\uFF1F\u3053\u306E\u64CD\u4F5C\u306F\u5143\u306B\u623B\u305B\u307E\u305B\u3093\u3002"
|
|
628
|
+
},
|
|
613
629
|
public: {
|
|
614
630
|
back: "\u2190 \u623B\u308B",
|
|
615
631
|
home: "\u2190 \u30DB\u30FC\u30E0",
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import {
|
|
3
3
|
MediaUploader
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-5Q6KVRZ2.js";
|
|
5
5
|
import {
|
|
6
6
|
useT
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-XY4JWSMS.js";
|
|
8
8
|
|
|
9
9
|
// src/components/media-view.tsx
|
|
10
10
|
import { jsx, jsxs } from "react/jsx-runtime";
|