contentrain 0.4.4 → 0.5.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/README.md +112 -34
- package/dist/{activity-CbkxcfDf.mjs → activity-B8j9gfsK.mjs} +3 -3
- package/dist/{branches-D2UWex1N.mjs → branches-CvpFbyrJ.mjs} +3 -3
- package/dist/{cdn-build-BzC2QPNi.mjs → cdn-build-DS9FprWU.mjs} +3 -3
- package/dist/{cdn-init-CsmqJIaQ.mjs → cdn-init-Bm4dpEJn.mjs} +3 -3
- package/dist/{connect-DJo9PSiw.mjs → connect-Bb0BrZsx.mjs} +3 -3
- package/dist/describe-DJ5H9Cxm.mjs +106 -0
- package/dist/describe-format-CUAqB0C4.mjs +50 -0
- package/dist/{diff--halNUpG.mjs → diff-ov1j9bAb.mjs} +67 -59
- package/dist/doctor-MOf_LQEL.mjs +95 -0
- package/dist/{generate-DrUojrk8.mjs → generate-ByscV5SN.mjs} +26 -9
- package/dist/index.mjs +50 -12
- package/dist/{init-CqoDCSV5.mjs → init-540qiNQJ.mjs} +6 -6
- package/dist/{login-DCXkOrQV.mjs → login-xvzL-UvR.mjs} +3 -3
- package/dist/{logout-nPt2UAeQ.mjs → logout-DzspSatR.mjs} +2 -2
- package/dist/mcp-client-DVWTex2i.mjs +44 -0
- package/dist/merge-DdPRttF-.mjs +82 -0
- package/dist/{resolve-context-Cg6JoVZt.mjs → resolve-context-hKVYPniC.mjs} +1 -1
- package/dist/scaffold-iuvrMh78.mjs +115 -0
- package/dist/{serve-CNeFIQ1i.mjs → serve-CxA2pKbp.mjs} +58 -5
- package/dist/serve-ui/assets/{AgentPromptGroup.vue_vue_type_script_setup_true_lang-Ulb-9Tr3.js → AgentPromptGroup.vue_vue_type_script_setup_true_lang-Bftt9tx_.js} +1 -1
- package/dist/serve-ui/assets/AppLayout-B-fbrfMk.js +21 -0
- package/dist/serve-ui/assets/BranchDetailPage-B3PL9PGp.js +17 -0
- package/dist/serve-ui/assets/{BranchesPage-CSwikNkd.js → BranchesPage-4YpE_szf.js} +2 -2
- package/dist/serve-ui/assets/CardContent.vue_vue_type_script_setup_true_lang-D1L2MnBU.js +1 -0
- package/dist/serve-ui/assets/CollapsibleTrigger.vue_vue_type_script_setup_true_lang-B4uDtllm.js +1 -0
- package/dist/serve-ui/assets/{Collection-DTB4xCCE.js → Collection-9URFko-Y.js} +2 -2
- package/dist/serve-ui/assets/ConfigProvider-CwkmRpT5.js +1 -0
- package/dist/serve-ui/assets/{ContentListPage-DF-LjAaS.js → ContentListPage-BMfSfg8x.js} +2 -2
- package/dist/serve-ui/assets/ContentPage-BXUnNJlB.js +1 -0
- package/dist/serve-ui/assets/DashboardPage-1UyYgg5J.js +21 -0
- package/dist/serve-ui/assets/{DialogTitle.vue_vue_type_script_setup_true_lang-2sQAJn_Y.js → DialogTitle.vue_vue_type_script_setup_true_lang-M4LOzTva.js} +1 -1
- package/dist/serve-ui/assets/DoctorPage-WnQ8xYWy.js +1 -0
- package/dist/serve-ui/assets/FormatReferencePage-DoKEaawl.js +1 -0
- package/dist/serve-ui/assets/{Input.vue_vue_type_script_setup_true_lang-BveqfZsR.js → Input.vue_vue_type_script_setup_true_lang-tW0hgReH.js} +2 -2
- package/dist/serve-ui/assets/{ModelDetailPage-_TIV9itx.js → ModelDetailPage-BysqN8IL.js} +3 -3
- package/dist/serve-ui/assets/ModelsPage-DFZrdBIi.js +1 -0
- package/dist/serve-ui/assets/{NormalizePage-Cde8vdk2.js → NormalizePage-4f5Ib_ES.js} +2 -2
- package/dist/serve-ui/assets/{PageHeader.vue_vue_type_script_setup_true_lang-CEnjONvd.js → PageHeader.vue_vue_type_script_setup_true_lang-Bln1czg7.js} +1 -1
- package/dist/serve-ui/assets/Presence-CA3xTrht.js +3 -0
- package/dist/serve-ui/assets/{Separator.vue_vue_type_script_setup_true_lang-1pFZ2PR2.js → Separator.vue_vue_type_script_setup_true_lang-PECBq3nc.js} +1 -1
- package/dist/serve-ui/assets/{StudioHint.vue_vue_type_script_setup_true_lang-C6JN5tPq.js → StudioHint.vue_vue_type_script_setup_true_lang-DYTEoyjw.js} +1 -1
- package/dist/serve-ui/assets/{TrustBadge.vue_vue_type_script_setup_true_lang-KRiTnLVk.js → TrustBadge.vue_vue_type_script_setup_true_lang-BRXWvOYU.js} +2 -2
- package/dist/serve-ui/assets/ValidatePage-BMTpV2KL.js +16 -0
- package/dist/serve-ui/assets/{arrow-down-BAJwpryD.js → arrow-down-IJu6H7Es.js} +1 -1
- package/dist/serve-ui/assets/{arrow-left-DANf_wrK.js → arrow-left-D8ZjVYAI.js} +1 -1
- package/dist/serve-ui/assets/{book-marked-DS8FXgjz.js → book-marked-BNyyZrq3.js} +1 -1
- package/dist/serve-ui/assets/{book-open-DnH5T78M.js → book-open-Dw1fQtSI.js} +1 -1
- package/dist/serve-ui/assets/{box-UJk5SvJJ.js → box-BoGMZDZR.js} +1 -1
- package/dist/serve-ui/assets/{chevron-down-C1nYx5Eu.js → chevron-down-UcXxhyyY.js} +1 -1
- package/dist/serve-ui/assets/{chevron-right-XnJVrezx.js → chevron-right-SpdM5LBc.js} +1 -1
- package/dist/serve-ui/assets/circle-alert-CEwKJpYl.js +6 -0
- package/dist/serve-ui/assets/{content-Ctqretwl.js → content-BQEzysvq.js} +1 -1
- package/dist/serve-ui/assets/{database-Wd_i2bM1.js → database-U6JU8oc9.js} +1 -1
- package/dist/serve-ui/assets/{file-code-ScWZN40B.js → file-code-_sq1QHQo.js} +1 -1
- package/dist/serve-ui/assets/{file-text-J3Wzwieh.js → file-text-BiMGJckO.js} +1 -1
- package/dist/serve-ui/assets/{git-branch-DqEFTZDt.js → git-branch-CdZMOuSP.js} +1 -1
- package/dist/serve-ui/assets/{git-merge-Bmz-MVBm.js → git-merge-D8Y-BwIh.js} +1 -1
- package/dist/serve-ui/assets/{hash-pCwLSzjB.js → hash-CrXakbCy.js} +1 -1
- package/dist/serve-ui/assets/index-DL_dw3XX.js +80 -0
- package/dist/serve-ui/assets/index-KZ2rT4mJ.css +1 -0
- package/dist/serve-ui/assets/{languages-CQqNMim-.js → languages-DvyMGPwy.js} +1 -1
- package/dist/serve-ui/assets/{plus-Cw1OnTR2.js → plus-Ddujj7Qx.js} +1 -1
- package/dist/serve-ui/assets/project-Dg2BVay_.js +1 -0
- package/dist/serve-ui/assets/{scan-search-UJ-_oiOR.js → scan-search-CsPYGmEs.js} +1 -1
- package/dist/serve-ui/assets/{settings-Dnm4yTIj.js → settings-IQvevsKM.js} +1 -1
- package/dist/serve-ui/assets/{shield-check-B67ELGUT.js → shield-check-BmSBU8Ai.js} +1 -1
- package/dist/serve-ui/assets/stethoscope-DgCa_7BL.js +6 -0
- package/dist/serve-ui/assets/{trash-2-B1QgZW1G.js → trash-2-CNTkluuz.js} +1 -1
- package/dist/serve-ui/assets/useDirection-DfPL7a9d.js +1 -0
- package/dist/serve-ui/assets/{useId-CPFWZ4Bo.js → useId-B-RTM02R.js} +1 -1
- package/dist/serve-ui/assets/{useNonce-BffIzuhE.js → useNonce-DR6M3tLq.js} +1 -1
- package/dist/serve-ui/assets/useWatch-D4Y-epQR.js +1 -0
- package/dist/serve-ui/index.html +2 -2
- package/dist/{server-DTdmutjb.mjs → server-B1PSjXbu.mjs} +313 -112
- package/dist/{setup-Y1LFQ9rZ.mjs → setup-BMqKibZt.mjs} +3 -3
- package/dist/{skills-Cp8KF1af.mjs → skills-CZ54F-97.mjs} +3 -3
- package/dist/{status-Cyv-jo1y.mjs → status-BJ6Lu3J4.mjs} +3 -3
- package/dist/{status-CoHgz6HN.mjs → status-Bmjfrk-B.mjs} +24 -11
- package/dist/studio-DPVJ-2oG.mjs +24 -0
- package/dist/{submissions-bIG-MWvv.mjs → submissions-zH_S7JIQ.mjs} +3 -3
- package/dist/{usage-B2xuc2DT.mjs → usage-z6eyT64a.mjs} +3 -3
- package/dist/{validate-B10L7RL7.mjs → validate-BG0X5g09.mjs} +102 -4
- package/dist/{webhooks-Dq3zFLP7.mjs → webhooks-CBG2Bs9P.mjs} +3 -3
- package/dist/{whoami-Ub5RznbU.mjs → whoami-CXVfvo7x.mjs} +2 -2
- package/package.json +7 -6
- package/dist/doctor-DyKjAIKH.mjs +0 -187
- package/dist/serve-ui/assets/AppLayout-C91DN08z.js +0 -21
- package/dist/serve-ui/assets/BranchDetailPage-BokOnhE7.js +0 -17
- package/dist/serve-ui/assets/CollapsibleTrigger.vue_vue_type_script_setup_true_lang-BRzXVXDG.js +0 -1
- package/dist/serve-ui/assets/ConfigProvider-Dvd7YoEV.js +0 -1
- package/dist/serve-ui/assets/ContentPage-BABg8pgn.js +0 -1
- package/dist/serve-ui/assets/DashboardPage-BFLFEJNZ.js +0 -21
- package/dist/serve-ui/assets/ModelsPage-DrQemHQ-.js +0 -1
- package/dist/serve-ui/assets/Presence-BXKCIfUk.js +0 -3
- package/dist/serve-ui/assets/ValidatePage-DRFAySNR.js +0 -21
- package/dist/serve-ui/assets/index-CG5NtNtt.css +0 -1
- package/dist/serve-ui/assets/index-De_z0714.js +0 -1
- package/dist/serve-ui/assets/index-RDdffBTh.js +0 -80
- package/dist/serve-ui/assets/project-BlZcHJw6.js +0 -1
- package/dist/serve-ui/assets/useDirection-B4S5kPsI.js +0 -1
- package/dist/serve-ui/assets/useWatch-B2FLRWr8.js +0 -1
- package/dist/studio-CJUGiIMd.mjs +0 -24
- package/dist/{client-C400qHcL.mjs → client-C9E9D4mb.mjs} +1 -1
- package/dist/{context-An3xrvcP.mjs → context-OskMGy8y.mjs} +1 -1
- package/dist/{demo-DcBt6fw8.mjs → demo-BOUcAoFZ.mjs} +3 -3
- package/dist/{ide-_C2gUPbQ.mjs → ide-DPDVYiaq.mjs} +1 -1
- package/dist/{oauth-server-Beppljfz.mjs → oauth-server-smSxDoH5.mjs} +1 -1
- /package/dist/{ui-B5mXontH.mjs → ui-B8l_LC36.mjs} +0 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
//#region src/studio/index.ts
|
|
3
|
+
var studio_default = defineCommand({
|
|
4
|
+
meta: {
|
|
5
|
+
name: "studio",
|
|
6
|
+
description: "Interact with Contentrain Studio"
|
|
7
|
+
},
|
|
8
|
+
subCommands: {
|
|
9
|
+
login: () => import("./login-xvzL-UvR.mjs").then((m) => m.default),
|
|
10
|
+
logout: () => import("./logout-DzspSatR.mjs").then((m) => m.default),
|
|
11
|
+
whoami: () => import("./whoami-CXVfvo7x.mjs").then((m) => m.default),
|
|
12
|
+
connect: () => import("./connect-Bb0BrZsx.mjs").then((m) => m.default),
|
|
13
|
+
status: () => import("./status-BJ6Lu3J4.mjs").then((m) => m.default),
|
|
14
|
+
activity: () => import("./activity-B8j9gfsK.mjs").then((m) => m.default),
|
|
15
|
+
usage: () => import("./usage-z6eyT64a.mjs").then((m) => m.default),
|
|
16
|
+
branches: () => import("./branches-CvpFbyrJ.mjs").then((m) => m.default),
|
|
17
|
+
"cdn-init": () => import("./cdn-init-Bm4dpEJn.mjs").then((m) => m.default),
|
|
18
|
+
"cdn-build": () => import("./cdn-build-DS9FprWU.mjs").then((m) => m.default),
|
|
19
|
+
webhooks: () => import("./webhooks-CBG2Bs9P.mjs").then((m) => m.default),
|
|
20
|
+
submissions: () => import("./submissions-zH_S7JIQ.mjs").then((m) => m.default)
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
//#endregion
|
|
24
|
+
export { studio_default as default };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { i as pc, r as formatTable, t as formatCount } from "./ui-
|
|
2
|
-
import { n as resolveStudioClient } from "./client-
|
|
3
|
-
import { t as resolveStudioContext } from "./resolve-context-
|
|
1
|
+
import { i as pc, r as formatTable, t as formatCount } from "./ui-B8l_LC36.mjs";
|
|
2
|
+
import { n as resolveStudioClient } from "./client-C9E9D4mb.mjs";
|
|
3
|
+
import { t as resolveStudioContext } from "./resolve-context-hKVYPniC.mjs";
|
|
4
4
|
import { defineCommand } from "citty";
|
|
5
5
|
import { confirm, intro, isCancel, log, outro, select, spinner } from "@clack/prompts";
|
|
6
6
|
//#region src/studio/commands/submissions.ts
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { i as pc, n as formatPercent, r as formatTable } from "./ui-
|
|
2
|
-
import { n as resolveStudioClient } from "./client-
|
|
3
|
-
import { t as resolveStudioContext } from "./resolve-context-
|
|
1
|
+
import { i as pc, n as formatPercent, r as formatTable } from "./ui-B8l_LC36.mjs";
|
|
2
|
+
import { n as resolveStudioClient } from "./client-C9E9D4mb.mjs";
|
|
3
|
+
import { t as resolveStudioContext } from "./resolve-context-hKVYPniC.mjs";
|
|
4
4
|
import { defineCommand } from "citty";
|
|
5
5
|
import { intro, log, outro, spinner } from "@clack/prompts";
|
|
6
6
|
//#region src/studio/commands/usage.ts
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { a as severityColor, i as pc, t as formatCount } from "./ui-B8l_LC36.mjs";
|
|
2
|
+
import { t as debug } from "./index.mjs";
|
|
3
|
+
import { n as requireInitialized, r as resolveProjectRoot, t as loadProjectContext } from "./context-OskMGy8y.mjs";
|
|
3
4
|
import { defineCommand } from "citty";
|
|
4
5
|
import { intro, isCancel, log, outro, select, spinner } from "@clack/prompts";
|
|
6
|
+
import { join } from "node:path";
|
|
5
7
|
import { writeContext } from "@contentrain/mcp/core/context";
|
|
8
|
+
import { contentrainDir } from "@contentrain/mcp/util/fs";
|
|
6
9
|
import { buildBranchName, createTransaction } from "@contentrain/mcp/git/transaction";
|
|
7
10
|
import { validateProject } from "@contentrain/mcp/core/validator";
|
|
8
11
|
//#region src/commands/validate.ts
|
|
@@ -36,11 +39,23 @@ var validate_default = defineCommand({
|
|
|
36
39
|
type: "string",
|
|
37
40
|
description: "Validate single model",
|
|
38
41
|
required: false
|
|
42
|
+
},
|
|
43
|
+
watch: {
|
|
44
|
+
type: "boolean",
|
|
45
|
+
description: "Re-run validation when .contentrain/ changes (read-only, forces fix off)",
|
|
46
|
+
required: false
|
|
39
47
|
}
|
|
40
48
|
},
|
|
41
49
|
async run({ args }) {
|
|
42
50
|
const projectRoot = await resolveProjectRoot(args.root);
|
|
43
51
|
requireInitialized(await loadProjectContext(projectRoot));
|
|
52
|
+
if (args.watch) {
|
|
53
|
+
await runWatchMode(projectRoot, {
|
|
54
|
+
model: args.model,
|
|
55
|
+
json: Boolean(args.json)
|
|
56
|
+
});
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
44
59
|
if (!args.json) intro(pc.bold("contentrain validate"));
|
|
45
60
|
const s = !args.json ? spinner() : null;
|
|
46
61
|
s?.start("Validating...");
|
|
@@ -55,7 +70,9 @@ var validate_default = defineCommand({
|
|
|
55
70
|
process.exitCode = 1;
|
|
56
71
|
return;
|
|
57
72
|
}
|
|
58
|
-
const
|
|
73
|
+
const branch = buildBranchName("fix", "validate");
|
|
74
|
+
const tx = await createTransaction(projectRoot, branch);
|
|
75
|
+
let txResult;
|
|
59
76
|
try {
|
|
60
77
|
await tx.write(async (wt) => {
|
|
61
78
|
result = await validateProject(wt, {
|
|
@@ -68,10 +85,15 @@ var validate_default = defineCommand({
|
|
|
68
85
|
});
|
|
69
86
|
});
|
|
70
87
|
await tx.commit("[contentrain] validate: auto-fix");
|
|
71
|
-
await tx.complete();
|
|
88
|
+
txResult = await tx.complete();
|
|
72
89
|
} finally {
|
|
73
90
|
await tx.cleanup();
|
|
74
91
|
}
|
|
92
|
+
if (txResult && result && result.fixed > 0) {
|
|
93
|
+
if (txResult.action === "pending-review") log.info(`Fixes committed to branch ${pc.cyan(branch)} (pending review). Run ${pc.cyan("contentrain diff")} to merge.`);
|
|
94
|
+
else if (txResult.action === "auto-merged") log.success(`Fixes auto-merged into ${pc.cyan("contentrain")} (commit ${pc.dim(txResult.commit.slice(0, 8))}).`);
|
|
95
|
+
if (txResult.sync?.skipped?.length) log.warning(`${txResult.sync.skipped.length} file(s) skipped during sync — you have uncommitted changes.`);
|
|
96
|
+
}
|
|
75
97
|
} else result = await validateProject(projectRoot, {
|
|
76
98
|
model: args.model,
|
|
77
99
|
fix: false
|
|
@@ -151,5 +173,81 @@ var validate_default = defineCommand({
|
|
|
151
173
|
}
|
|
152
174
|
}
|
|
153
175
|
});
|
|
176
|
+
/**
|
|
177
|
+
* Watch `.contentrain/content/` + `.contentrain/models/` and re-run
|
|
178
|
+
* validation on every change. Debounced 300ms (same as the serve
|
|
179
|
+
* watcher) so a burst of writes produces one report, not one per file.
|
|
180
|
+
* JSON mode prints one JSON object per run, newline-separated, so
|
|
181
|
+
* line-oriented consumers (jq, tail -f) can process the stream.
|
|
182
|
+
*/
|
|
183
|
+
async function runWatchMode(projectRoot, options) {
|
|
184
|
+
const { watch } = await import("chokidar");
|
|
185
|
+
const crDir = contentrainDir(projectRoot);
|
|
186
|
+
const targets = [
|
|
187
|
+
join(crDir, "content"),
|
|
188
|
+
join(crDir, "models"),
|
|
189
|
+
join(crDir, "config.json")
|
|
190
|
+
];
|
|
191
|
+
if (!options.json) {
|
|
192
|
+
intro(pc.bold("contentrain validate --watch"));
|
|
193
|
+
log.info("Watching .contentrain/ for changes (Ctrl+C to exit).");
|
|
194
|
+
}
|
|
195
|
+
let running = false;
|
|
196
|
+
let queued = false;
|
|
197
|
+
async function runOnce() {
|
|
198
|
+
if (running) {
|
|
199
|
+
queued = true;
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
running = true;
|
|
203
|
+
try {
|
|
204
|
+
debug("validate", "running validateProject");
|
|
205
|
+
const result = await validateProject(projectRoot, { model: options.model });
|
|
206
|
+
if (options.json) process.stdout.write(JSON.stringify(result) + "\n");
|
|
207
|
+
else {
|
|
208
|
+
const e = result.summary.errors;
|
|
209
|
+
const w = result.summary.warnings;
|
|
210
|
+
const stamp = (/* @__PURE__ */ new Date()).toLocaleTimeString();
|
|
211
|
+
const headline = e === 0 && w === 0 ? pc.green(`${stamp} — clean`) : `${stamp} — ${e > 0 ? pc.red(`${e} error${e === 1 ? "" : "s"}`) : "0 errors"}, ${w > 0 ? pc.yellow(`${w} warning${w === 1 ? "" : "s"}`) : "0 warnings"}`;
|
|
212
|
+
log.message(headline);
|
|
213
|
+
}
|
|
214
|
+
} catch (error) {
|
|
215
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
216
|
+
if (options.json) process.stdout.write(JSON.stringify({ error: message }) + "\n");
|
|
217
|
+
else log.error(message);
|
|
218
|
+
} finally {
|
|
219
|
+
running = false;
|
|
220
|
+
if (queued) {
|
|
221
|
+
queued = false;
|
|
222
|
+
runOnce();
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
const watcher = watch(targets, {
|
|
227
|
+
ignoreInitial: true,
|
|
228
|
+
ignored: ["**/node_modules/**", "**/.git/**"]
|
|
229
|
+
});
|
|
230
|
+
let debounceTimer = null;
|
|
231
|
+
watcher.on("all", (eventType, filePath) => {
|
|
232
|
+
debug("validate", `chokidar ${eventType} ${filePath}`);
|
|
233
|
+
if (debounceTimer) clearTimeout(debounceTimer);
|
|
234
|
+
debounceTimer = setTimeout(() => {
|
|
235
|
+
runOnce();
|
|
236
|
+
}, 300);
|
|
237
|
+
});
|
|
238
|
+
watcher.on("error", (err) => {
|
|
239
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
240
|
+
if (options.json) process.stdout.write(JSON.stringify({ watcherError: message }) + "\n");
|
|
241
|
+
else log.error(`Watcher error: ${message}`);
|
|
242
|
+
});
|
|
243
|
+
runOnce();
|
|
244
|
+
await new Promise((resolve) => {
|
|
245
|
+
process.on("SIGINT", () => {
|
|
246
|
+
watcher.close();
|
|
247
|
+
if (!options.json) log.info("\nStopped watching.");
|
|
248
|
+
resolve();
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
}
|
|
154
252
|
//#endregion
|
|
155
253
|
export { validate_default as default };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { i as pc, o as statusIcon, r as formatTable } from "./ui-
|
|
2
|
-
import { n as resolveStudioClient } from "./client-
|
|
3
|
-
import { t as resolveStudioContext } from "./resolve-context-
|
|
1
|
+
import { i as pc, o as statusIcon, r as formatTable } from "./ui-B8l_LC36.mjs";
|
|
2
|
+
import { n as resolveStudioClient } from "./client-C9E9D4mb.mjs";
|
|
3
|
+
import { t as resolveStudioContext } from "./resolve-context-hKVYPniC.mjs";
|
|
4
4
|
import { defineCommand } from "citty";
|
|
5
5
|
import { confirm, intro, isCancel, log, multiselect, outro, select, spinner, text } from "@clack/prompts";
|
|
6
6
|
//#region src/studio/commands/webhooks.ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { i as pc } from "./ui-
|
|
2
|
-
import { i as checkPermissions, n as resolveStudioClient, r as AuthExpiredError } from "./client-
|
|
1
|
+
import { i as pc } from "./ui-B8l_LC36.mjs";
|
|
2
|
+
import { i as checkPermissions, n as resolveStudioClient, r as AuthExpiredError } from "./client-C9E9D4mb.mjs";
|
|
3
3
|
import { defineCommand } from "citty";
|
|
4
4
|
import { intro, log, outro } from "@clack/prompts";
|
|
5
5
|
//#region src/studio/commands/whoami.ts
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "contentrain",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "CLI for Contentrain — AI content governance infrastructure",
|
|
6
6
|
"type": "module",
|
|
@@ -46,11 +46,12 @@
|
|
|
46
46
|
"picocolors": "^1.1.0",
|
|
47
47
|
"simple-git": "^3.27.0",
|
|
48
48
|
"ws": "^8.18.0",
|
|
49
|
-
"
|
|
50
|
-
"@contentrain/
|
|
51
|
-
"@contentrain/
|
|
52
|
-
"@contentrain/
|
|
53
|
-
"@contentrain/
|
|
49
|
+
"zod": "^3.24.0",
|
|
50
|
+
"@contentrain/mcp": "1.4.0",
|
|
51
|
+
"@contentrain/query": "5.1.5",
|
|
52
|
+
"@contentrain/rules": "0.4.0",
|
|
53
|
+
"@contentrain/skills": "0.4.0",
|
|
54
|
+
"@contentrain/types": "0.5.0"
|
|
54
55
|
},
|
|
55
56
|
"devDependencies": {
|
|
56
57
|
"@types/ws": "^8.5.0",
|
package/dist/doctor-DyKjAIKH.mjs
DELETED
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
import { r as resolveProjectRoot } from "./context-An3xrvcP.mjs";
|
|
2
|
-
import { i as pc, o as statusIcon } from "./ui-B5mXontH.mjs";
|
|
3
|
-
import { defineCommand } from "citty";
|
|
4
|
-
import { intro, log, outro, spinner } from "@clack/prompts";
|
|
5
|
-
import { simpleGit } from "simple-git";
|
|
6
|
-
import { readConfig } from "@contentrain/mcp/core/config";
|
|
7
|
-
import { join } from "node:path";
|
|
8
|
-
import { listModels, readModel } from "@contentrain/mcp/core/model-manager";
|
|
9
|
-
import { contentrainDir, pathExists, readDir } from "@contentrain/mcp/util/fs";
|
|
10
|
-
import { stat } from "node:fs/promises";
|
|
11
|
-
import { resolveContentDir } from "@contentrain/mcp/core/content-manager";
|
|
12
|
-
//#region src/commands/doctor.ts
|
|
13
|
-
var doctor_default = defineCommand({
|
|
14
|
-
meta: {
|
|
15
|
-
name: "doctor",
|
|
16
|
-
description: "Check project health and environment"
|
|
17
|
-
},
|
|
18
|
-
args: { root: {
|
|
19
|
-
type: "string",
|
|
20
|
-
description: "Project root path",
|
|
21
|
-
required: false
|
|
22
|
-
} },
|
|
23
|
-
async run({ args }) {
|
|
24
|
-
const projectRoot = await resolveProjectRoot(args.root);
|
|
25
|
-
intro(pc.bold("contentrain doctor"));
|
|
26
|
-
const s = spinner();
|
|
27
|
-
s.start("Running health checks...");
|
|
28
|
-
const checks = [];
|
|
29
|
-
try {
|
|
30
|
-
const version = await simpleGit(projectRoot).version();
|
|
31
|
-
checks.push({
|
|
32
|
-
name: "Git",
|
|
33
|
-
pass: true,
|
|
34
|
-
detail: `v${version.major}.${version.minor}.${version.patch}`
|
|
35
|
-
});
|
|
36
|
-
} catch {
|
|
37
|
-
checks.push({
|
|
38
|
-
name: "Git",
|
|
39
|
-
pass: false,
|
|
40
|
-
detail: "Not installed or not in PATH"
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
const hasGit = await pathExists(join(projectRoot, ".git"));
|
|
44
|
-
checks.push({
|
|
45
|
-
name: "Git repository",
|
|
46
|
-
pass: hasGit,
|
|
47
|
-
detail: hasGit ? projectRoot : "No .git directory found"
|
|
48
|
-
});
|
|
49
|
-
const nodeVersion = process.versions.node;
|
|
50
|
-
const [major] = nodeVersion.split(".").map(Number);
|
|
51
|
-
checks.push({
|
|
52
|
-
name: "Node.js",
|
|
53
|
-
pass: (major ?? 0) >= 22,
|
|
54
|
-
detail: `v${nodeVersion}${(major ?? 0) < 22 ? " (requires ≥22)" : ""}`
|
|
55
|
-
});
|
|
56
|
-
const crDir = contentrainDir(projectRoot);
|
|
57
|
-
const hasCrDir = await pathExists(crDir);
|
|
58
|
-
const hasConfig = await pathExists(join(crDir, "config.json"));
|
|
59
|
-
const hasModels = await pathExists(join(crDir, "models"));
|
|
60
|
-
const hasContent = await pathExists(join(crDir, "content"));
|
|
61
|
-
checks.push({
|
|
62
|
-
name: ".contentrain/ structure",
|
|
63
|
-
pass: hasCrDir && hasConfig && hasModels && hasContent,
|
|
64
|
-
detail: !hasCrDir ? "Not initialized — run `contentrain init`" : [
|
|
65
|
-
hasConfig ? null : "missing config.json",
|
|
66
|
-
hasModels ? null : "missing models/",
|
|
67
|
-
hasContent ? null : "missing content/"
|
|
68
|
-
].filter(Boolean).join(", ") || "OK"
|
|
69
|
-
});
|
|
70
|
-
if (hasConfig) {
|
|
71
|
-
const config = await readConfig(projectRoot);
|
|
72
|
-
checks.push({
|
|
73
|
-
name: "Config",
|
|
74
|
-
pass: config !== null,
|
|
75
|
-
detail: config ? `stack: ${config.stack}, locales: ${config.locales.supported.join(", ")}` : "Failed to parse config.json"
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
if (hasCrDir) try {
|
|
79
|
-
const models = await listModels(projectRoot);
|
|
80
|
-
let allParseable = true;
|
|
81
|
-
for (const m of models) if (!await readModel(projectRoot, m.id)) allParseable = false;
|
|
82
|
-
checks.push({
|
|
83
|
-
name: "Models",
|
|
84
|
-
pass: allParseable,
|
|
85
|
-
detail: `${models.length} model(s)${allParseable ? ", all valid" : ", some failed to parse"}`
|
|
86
|
-
});
|
|
87
|
-
} catch {
|
|
88
|
-
checks.push({
|
|
89
|
-
name: "Models",
|
|
90
|
-
pass: false,
|
|
91
|
-
detail: "Failed to read models"
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
if (hasCrDir) {
|
|
95
|
-
const orphans = await findOrphanContent(projectRoot);
|
|
96
|
-
checks.push({
|
|
97
|
-
name: "Orphan content",
|
|
98
|
-
pass: orphans.length === 0,
|
|
99
|
-
detail: orphans.length === 0 ? "None" : `Found: ${orphans.join(", ")}`
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
if (hasGit) try {
|
|
103
|
-
const staleCount = (await simpleGit(projectRoot).branch(["--list", "contentrain/*"])).all.length;
|
|
104
|
-
checks.push({
|
|
105
|
-
name: "Pending branches",
|
|
106
|
-
pass: staleCount < 50,
|
|
107
|
-
detail: staleCount === 0 ? "None" : staleCount >= 80 ? `${staleCount} branches (BLOCKED — limit: 80)` : staleCount >= 50 ? `${staleCount} branches (WARNING — limit: 50)` : `${staleCount} contentrain branch(es)`
|
|
108
|
-
});
|
|
109
|
-
} catch {
|
|
110
|
-
checks.push({
|
|
111
|
-
name: "Pending branches",
|
|
112
|
-
pass: true,
|
|
113
|
-
detail: "Could not check"
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
const clientDir = join(crDir, "client");
|
|
117
|
-
const modelsDir = join(crDir, "models");
|
|
118
|
-
if (await pathExists(clientDir) && await pathExists(modelsDir)) try {
|
|
119
|
-
const clientStat = await stat(clientDir);
|
|
120
|
-
const modelsStat = await stat(modelsDir);
|
|
121
|
-
const fresh = clientStat.mtimeMs >= modelsStat.mtimeMs;
|
|
122
|
-
checks.push({
|
|
123
|
-
name: "SDK client",
|
|
124
|
-
pass: fresh,
|
|
125
|
-
detail: fresh ? "Up to date" : "Stale — run `contentrain generate`"
|
|
126
|
-
});
|
|
127
|
-
} catch {
|
|
128
|
-
checks.push({
|
|
129
|
-
name: "SDK client",
|
|
130
|
-
pass: true,
|
|
131
|
-
detail: "Could not check"
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
s.stop("Health checks complete");
|
|
135
|
-
const passed = checks.filter((c) => c.pass).length;
|
|
136
|
-
const failed = checks.filter((c) => !c.pass).length;
|
|
137
|
-
for (const check of checks) log.message(`${statusIcon(check.pass)} ${pc.bold(check.name)}: ${check.detail}`);
|
|
138
|
-
if (failed === 0) outro(pc.green(`All ${passed} checks passed!`));
|
|
139
|
-
else outro(pc.yellow(`${passed} passed, ${failed} failed`));
|
|
140
|
-
}
|
|
141
|
-
});
|
|
142
|
-
async function findOrphanContent(projectRoot) {
|
|
143
|
-
const crDir = contentrainDir(projectRoot);
|
|
144
|
-
const models = await listModels(projectRoot);
|
|
145
|
-
const orphans = [];
|
|
146
|
-
const knownContentDirs = /* @__PURE__ */ new Set();
|
|
147
|
-
for (const m of models) {
|
|
148
|
-
const full = await readModel(projectRoot, m.id);
|
|
149
|
-
const modelForPath = full ? {
|
|
150
|
-
...full,
|
|
151
|
-
content_path: full.content_path ?? m.content_path
|
|
152
|
-
} : {
|
|
153
|
-
id: m.id,
|
|
154
|
-
name: m.id,
|
|
155
|
-
kind: m.kind,
|
|
156
|
-
domain: m.domain,
|
|
157
|
-
i18n: m.i18n,
|
|
158
|
-
fields: {},
|
|
159
|
-
content_path: m.content_path
|
|
160
|
-
};
|
|
161
|
-
knownContentDirs.add(resolveContentDir(projectRoot, modelForPath));
|
|
162
|
-
}
|
|
163
|
-
const contentDir = join(crDir, "content");
|
|
164
|
-
if (await pathExists(contentDir)) {
|
|
165
|
-
const domains = await readDir(contentDir);
|
|
166
|
-
for (const domain of domains) {
|
|
167
|
-
const domainDir = join(contentDir, domain);
|
|
168
|
-
const entries = await readDir(domainDir);
|
|
169
|
-
for (const entry of entries) {
|
|
170
|
-
if (entry === ".gitkeep") continue;
|
|
171
|
-
const entryDir = join(domainDir, entry);
|
|
172
|
-
if (!knownContentDirs.has(entryDir)) orphans.push(`${domain}/${entry}`);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
for (const dir of knownContentDirs) {
|
|
177
|
-
if (dir.startsWith(contentDir)) continue;
|
|
178
|
-
if (!await pathExists(dir)) {
|
|
179
|
-
orphans.push(`(missing custom path) ${dir}`);
|
|
180
|
-
continue;
|
|
181
|
-
}
|
|
182
|
-
await readDir(dir);
|
|
183
|
-
}
|
|
184
|
-
return orphans;
|
|
185
|
-
}
|
|
186
|
-
//#endregion
|
|
187
|
-
export { doctor_default as default };
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import{c as G,d as Ae,r as w,w as F,a as E,t as le,o as v,b as S,e as b,f as k,n as K,u as t,m as A,g as M,h as C,i as O,j as x,k as X,l as Y,p as $,q as _,s as V,F as J,v as Z,x as ae,R as ve,y as H,z,A as he,B as P,C as Le,D as de}from"./index-RDdffBTh.js";import{u as Pe,S as $e,_ as Re}from"./Input.vue_vue_type_script_setup_true_lang-BveqfZsR.js";import{u as Q}from"./project-BlZcHJw6.js";import{_ as re}from"./index-De_z0714.js";import{B as be}from"./box-UJk5SvJJ.js";import{F as me}from"./file-text-J3Wzwieh.js";import{S as _e}from"./shield-check-B67ELGUT.js";import{G as ge}from"./git-branch-DqEFTZDt.js";import{S as Te}from"./scan-search-UJ-_oiOR.js";import{B as De}from"./book-open-DnH5T78M.js";import{u as R,c as ne,a as q,P as ee,b as se,d as Se,w as Ie}from"./Presence-BXKCIfUk.js";import{u as ze}from"./useDirection-B4S5kPsI.js";import{P as W,r as ye,d as ie,u as xe}from"./useWatch-B2FLRWr8.js";import{c as He,u as Oe}from"./useNonce-BffIzuhE.js";import"./ConfigProvider-Dvd7YoEV.js";/**
|
|
2
|
-
* @license lucide-vue-next v0.474.0 - ISC
|
|
3
|
-
*
|
|
4
|
-
* This source code is licensed under the ISC license.
|
|
5
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/const Be=G("GithubIcon",[["path",{d:"M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4",key:"tonef"}],["path",{d:"M9 18c-4.51 2-5-2-7-2",key:"9comsn"}]]);/**
|
|
7
|
-
* @license lucide-vue-next v0.474.0 - ISC
|
|
8
|
-
*
|
|
9
|
-
* This source code is licensed under the ISC license.
|
|
10
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
-
*/const we=G("LayoutDashboardIcon",[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]]);/**
|
|
12
|
-
* @license lucide-vue-next v0.474.0 - ISC
|
|
13
|
-
*
|
|
14
|
-
* This source code is licensed under the ISC license.
|
|
15
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
16
|
-
*/const Ne=G("MoonIcon",[["path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z",key:"a7tn18"}]]);/**
|
|
17
|
-
* @license lucide-vue-next v0.474.0 - ISC
|
|
18
|
-
*
|
|
19
|
-
* This source code is licensed under the ISC license.
|
|
20
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
21
|
-
*/const Me=G("SunIcon",[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]]),Ve="/icon-color.svg",qe="/logo/color-icon-black-text.svg",We="/logo/color-icon-white-text.svg",Xe=Ae("ui",()=>{const u=Pe({attribute:"class"}),e=w(!1),o=w(JSON.parse(localStorage.getItem("cr-dismissed-hints")??"{}"));function a(){u.value=u.value==="dark"?"light":"dark"}function n(l){o.value[l]=Date.now(),localStorage.setItem("cr-dismissed-hints",JSON.stringify(o.value))}function s(l){const r=o.value[l];if(!r)return!1;const c=10080*60*1e3;return Date.now()-r<c}return F(e,l=>{localStorage.setItem("cr-sidebar-collapsed",String(l))}),localStorage.getItem("cr-sidebar-collapsed")==="true"&&(e.value=!0),{colorMode:u,sidebarCollapsed:e,toggleTheme:a,dismissHint:n,isHintDismissed:s}}),[T,Ye]=ne("ScrollAreaRoot");var je=E({__name:"ScrollAreaRoot",props:{type:{type:String,required:!1,default:"hover"},dir:{type:String,required:!1},scrollHideDelay:{type:Number,required:!1,default:600},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(u,{expose:e}){const o=u,a=w(0),n=w(0),s=w(),i=w(),l=w(),r=w(),c=w(!1),d=w(!1),{type:m,dir:f,scrollHideDelay:y}=le(o),L=ze(f);function D(){var h;(h=s.value)==null||h.scrollTo({top:0})}function I(){var h;(h=s.value)==null||h.scrollTo({top:0,left:0})}e({viewport:s,scrollTop:D,scrollTopLeft:I});const{forwardRef:p,currentElement:g}=R();return Ye({type:m,dir:L,scrollHideDelay:y,scrollArea:g,viewport:s,onViewportChange:h=>{s.value=h||void 0},content:i,onContentChange:h=>{i.value=h},scrollbarX:l,scrollbarXEnabled:c,scrollbarY:r,scrollbarYEnabled:d,onScrollbarXChange:h=>{l.value=h||void 0},onScrollbarYChange:h=>{r.value=h||void 0},onScrollbarXEnabledChange:h=>{c.value=h},onScrollbarYEnabledChange:h=>{d.value=h},onCornerWidthChange:h=>{a.value=h},onCornerHeightChange:h=>{n.value=h}}),(h,B)=>(v(),S(t(W),{ref:t(p),"as-child":o.asChild,as:h.as,dir:t(L),style:K({position:"relative","--reka-scroll-area-corner-width":`${a.value}px`,"--reka-scroll-area-corner-height":`${n.value}px`})},{default:b(()=>[k(h.$slots,"default")]),_:3},8,["as-child","as","dir","style"]))}}),Ue=je,Fe=E({__name:"ScrollAreaCornerImpl",setup(u){const e=T(),o=w(0),a=w(0),n=C(()=>!!o.value&&!!a.value);function s(){var r;const l=((r=e.scrollbarX.value)==null?void 0:r.offsetHeight)||0;e.onCornerHeightChange(l),a.value=l}function i(){var r;const l=((r=e.scrollbarY.value)==null?void 0:r.offsetWidth)||0;e.onCornerWidthChange(l),o.value=l}return q(e.scrollbarX.value,s),q(e.scrollbarY.value,i),F(()=>e.scrollbarX.value,s),F(()=>e.scrollbarY.value,i),(l,r)=>{var c;return n.value?(v(),S(t(W),A({key:0,style:{width:`${o.value}px`,height:`${a.value}px`,position:"absolute",right:t(e).dir.value==="ltr"?0:void 0,left:t(e).dir.value==="rtl"?0:void 0,bottom:0}},(c=l.$parent)==null?void 0:c.$props),{default:b(()=>[k(l.$slots,"default")]),_:3},16,["style"])):M("v-if",!0)}}}),Ge=Fe,Ke=E({__name:"ScrollAreaCorner",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(u){const e=u,{forwardRef:o}=R(),a=T(),n=C(()=>!!a.scrollbarX.value&&!!a.scrollbarY.value),s=C(()=>a.type.value!=="scroll"&&n.value);return(i,l)=>s.value?(v(),S(Ge,A({key:0},e,{ref:t(o)}),{default:b(()=>[k(i.$slots,"default")]),_:3},16)):M("v-if",!0)}}),Je=Ke;function Ce(u,e){return o=>{if(u[0]===u[1]||e[0]===e[1])return e[0];const a=(e[1]-e[0])/(u[1]-u[0]);return e[0]+a*(o-u[0])}}function te(u){const e=ke(u.viewport,u.content),o=u.scrollbar.paddingStart+u.scrollbar.paddingEnd,a=(u.scrollbar.size-o)*e;return Math.max(a,18)}function ke(u,e){const o=u/e;return Number.isNaN(o)?0:o}function Ze(u,e=()=>{}){let o={left:u.scrollLeft,top:u.scrollTop},a=0;return(function n(){const s={left:u.scrollLeft,top:u.scrollTop},i=o.left!==s.left,l=o.top!==s.top;(i||l)&&e(),o=s,a=window.requestAnimationFrame(n)})(),()=>window.cancelAnimationFrame(a)}function pe(u,e,o="ltr"){const a=te(e),n=e.scrollbar.paddingStart+e.scrollbar.paddingEnd,s=e.scrollbar.size-n,i=e.content-e.viewport,l=s-a,r=o==="ltr"?[0,i]:[i*-1,0],c=He(u,r[0],r[1]);return Ce([0,i],[0,l])(c)}function U(u){return u?Number.parseInt(u,10):0}function Qe(u,e,o,a="ltr"){const n=te(o),s=n/2,i=e||s,l=n-i,r=o.scrollbar.paddingStart+i,c=o.scrollbar.size-o.scrollbar.paddingEnd-l,d=o.content-o.viewport,m=a==="ltr"?[0,d]:[d*-1,0];return Ce([r,c],m)(u)}function fe(u,e){return u>0&&u<e}var et=E({__name:"ScrollAreaScrollbarX",setup(u){const e=T(),o=oe(),{forwardRef:a,currentElement:n}=R();O(()=>{n.value&&e.onScrollbarXChange(n.value)});const s=C(()=>o.sizes.value);return(i,l)=>(v(),S(Ee,{ref:t(a),"is-horizontal":!0,"data-orientation":"horizontal",style:K({bottom:0,left:t(e).dir.value==="rtl"?"var(--reka-scroll-area-corner-width)":0,right:t(e).dir.value==="ltr"?"var(--reka-scroll-area-corner-width)":0,"--reka-scroll-area-thumb-width":s.value?`${t(te)(s.value)}px`:void 0}),onOnDragScroll:l[0]||(l[0]=r=>t(o).onDragScroll(r.x))},{default:b(()=>[k(i.$slots,"default")]),_:3},8,["style"]))}}),tt=et,ot=E({__name:"ScrollAreaScrollbarY",setup(u){const e=T(),o=oe(),{forwardRef:a,currentElement:n}=R();O(()=>{n.value&&e.onScrollbarYChange(n.value)});const s=C(()=>o.sizes.value);return(i,l)=>(v(),S(Ee,{ref:t(a),"is-horizontal":!1,"data-orientation":"vertical",style:K({top:0,right:t(e).dir.value==="ltr"?0:void 0,left:t(e).dir.value==="rtl"?0:void 0,bottom:"var(--reka-scroll-area-corner-height)","--reka-scroll-area-thumb-height":s.value?`${t(te)(s.value)}px`:void 0}),onOnDragScroll:l[0]||(l[0]=r=>t(o).onDragScroll(r.y))},{default:b(()=>[k(i.$slots,"default")]),_:3},8,["style"]))}}),rt=ot,lt=E({__name:"ScrollAreaScrollbarAuto",props:{forceMount:{type:Boolean,required:!1}},setup(u){const e=T(),o=j(),{forwardRef:a}=R(),n=w(!1),s=se(()=>{if(e.viewport.value){const i=e.viewport.value.offsetWidth<e.viewport.value.scrollWidth,l=e.viewport.value.offsetHeight<e.viewport.value.scrollHeight;n.value=o.isHorizontal.value?i:l}},10);return O(()=>s()),q(e.viewport,s),q(e.content,s),(i,l)=>(v(),S(t(ee),{present:i.forceMount||n.value},{default:b(()=>[x(ue,A(i.$attrs,{ref:t(a),"data-state":n.value?"visible":"hidden"}),{default:b(()=>[k(i.$slots,"default")]),_:3},16,["data-state"])]),_:3},8,["present"]))}}),ce=lt,at=E({inheritAttrs:!1,__name:"ScrollAreaScrollbarGlimpse",props:{forceMount:{type:Boolean,required:!1}},setup(u){const e=T(),o=j(),{forwardRef:a}=R(),{state:n,dispatch:s}=Se("hidden",{hidden:{POINTER_ENTER:"glimpse",SCROLL:"scrolling"},glimpse:{HIDE:"hidden",POINTER_LEAVE:"hidden",SCROLL:"scrolling",POINTER_ENTER:"glimpse"},scrolling:{SCROLL_END:"idle",POINTER_ENTER:"interacting"},interacting:{SCROLL:"interacting",POINTER_LEAVE:"idle"},idle:{HIDE:"hidden",SCROLL:"scrolling",POINTER_ENTER:"interacting"}}),i=C(()=>n.value!=="hidden");function l(){s("POINTER_ENTER")}function r(){s("POINTER_LEAVE")}const c=se(()=>s("SCROLL_END"),100);return X(d=>{if(n.value==="glimpse"){const m=window.setTimeout(()=>s("HIDE"),e.scrollHideDelay.value);d(()=>{window.clearTimeout(m)})}}),X(d=>{if(n.value==="idle"){const m=window.setTimeout(()=>s("HIDE"),e.scrollHideDelay.value);d(()=>{window.clearTimeout(m)})}}),X(d=>{const m=e.viewport.value,f=o.isHorizontal.value?"scrollLeft":"scrollTop";if(m){let y=m[f];const L=()=>{const D=m[f];y!==D&&(s("SCROLL"),c()),y=D};m.addEventListener("scroll",L),d(()=>{m.removeEventListener("scroll",L)})}}),O(()=>{const d=e.scrollArea.value;d&&(d.addEventListener("pointerenter",l),d.addEventListener("pointerleave",r))}),Y(()=>{const d=e.scrollArea.value;d&&(d.removeEventListener("pointerenter",l),d.removeEventListener("pointerleave",r))}),(d,m)=>(v(),S(t(ee),{present:d.forceMount||i.value},{default:b(()=>[x(ce,A(d.$attrs,{ref:t(a),"data-state":i.value?"visible":"hidden"}),{default:b(()=>[k(d.$slots,"default")]),_:3},16,["data-state"])]),_:3},8,["present"]))}}),nt=at,st=E({inheritAttrs:!1,__name:"ScrollAreaScrollbarHover",props:{forceMount:{type:Boolean,required:!1}},setup(u){const e=T(),{forwardRef:o}=R();let a;const n=w(!1);function s(){window.clearTimeout(a),n.value=!0}function i(){a=window.setTimeout(()=>{n.value=!1},e.scrollHideDelay.value)}return O(()=>{const l=e.scrollArea.value;l&&(l.addEventListener("pointerenter",s),l.addEventListener("pointerleave",i))}),Y(()=>{const l=e.scrollArea.value;l&&(window.clearTimeout(a),l.removeEventListener("pointerenter",s),l.removeEventListener("pointerleave",i))}),(l,r)=>(v(),S(t(ee),{present:l.forceMount||n.value},{default:b(()=>[x(ce,A(l.$attrs,{ref:t(o),"data-state":n.value?"visible":"hidden"}),{default:b(()=>[k(l.$slots,"default")]),_:3},16,["data-state"])]),_:3},8,["present"]))}}),it=st,ct=E({__name:"ScrollAreaScrollbarScroll",props:{forceMount:{type:Boolean,required:!1}},setup(u){const e=T(),o=j(),{forwardRef:a}=R(),{state:n,dispatch:s}=Se("hidden",{hidden:{SCROLL:"scrolling"},scrolling:{SCROLL_END:"idle",POINTER_ENTER:"interacting"},interacting:{SCROLL:"interacting",POINTER_LEAVE:"idle"},idle:{HIDE:"hidden",SCROLL:"scrolling",POINTER_ENTER:"interacting"}}),i=C(()=>n.value!=="hidden");X(r=>{if(n.value==="idle"){const c=window.setTimeout(()=>s("HIDE"),e.scrollHideDelay.value);r(()=>{window.clearTimeout(c)})}});const l=se(()=>s("SCROLL_END"),100);return X(r=>{const c=e.viewport.value,d=o.isHorizontal.value?"scrollLeft":"scrollTop";if(c){let m=c[d];const f=()=>{const y=c[d];m!==y&&(s("SCROLL"),l()),m=y};c.addEventListener("scroll",f),r(()=>{c.removeEventListener("scroll",f)})}}),(r,c)=>(v(),S(t(ee),{present:r.forceMount||i.value},{default:b(()=>[x(ue,A(r.$attrs,{ref:t(a),"data-state":i.value?"visible":"hidden"}),{default:b(()=>[k(r.$slots,"default")]),_:3},16,["data-state"])]),_:3},8,["present"]))}}),ut=ct;const[j,dt]=ne("ScrollAreaScrollbar");var pt=E({inheritAttrs:!1,__name:"ScrollAreaScrollbar",props:{orientation:{type:String,required:!1,default:"vertical"},forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"div"}},setup(u){const e=u,{forwardRef:o}=R(),a=T(),n=C(()=>e.orientation==="horizontal");F(n,()=>{n.value?a.onScrollbarXEnabledChange(!0):a.onScrollbarYEnabledChange(!0)},{immediate:!0}),Y(()=>{a.onScrollbarXEnabledChange(!1),a.onScrollbarYEnabledChange(!1)});const{orientation:s,forceMount:i,asChild:l,as:r}=le(e);return dt({orientation:s,forceMount:i,isHorizontal:n,as:r,asChild:l}),(c,d)=>t(a).type.value==="hover"?(v(),S(it,A({key:0},c.$attrs,{ref:t(o),"force-mount":t(i)}),{default:b(()=>[k(c.$slots,"default")]),_:3},16,["force-mount"])):t(a).type.value==="scroll"?(v(),S(ut,A({key:1},c.$attrs,{ref:t(o),"force-mount":t(i)}),{default:b(()=>[k(c.$slots,"default")]),_:3},16,["force-mount"])):t(a).type.value==="glimpse"?(v(),S(nt,A({key:2},c.$attrs,{ref:t(o),"force-mount":t(i)}),{default:b(()=>[k(c.$slots,"default")]),_:3},16,["force-mount"])):t(a).type.value==="auto"?(v(),S(ce,A({key:3},c.$attrs,{ref:t(o),"force-mount":t(i)}),{default:b(()=>[k(c.$slots,"default")]),_:3},16,["force-mount"])):t(a).type.value==="always"?(v(),S(ue,A({key:4},c.$attrs,{ref:t(o),"data-state":"visible"}),{default:b(()=>[k(c.$slots,"default")]),_:3},16)):M("v-if",!0)}}),ft=pt;const[oe,vt]=ne("ScrollAreaScrollbarVisible");var ht=E({__name:"ScrollAreaScrollbarVisible",setup(u){const e=T(),o=j(),{forwardRef:a}=R(),n=w({content:0,viewport:0,scrollbar:{size:0,paddingStart:0,paddingEnd:0}}),s=C(()=>{const p=ke(n.value.viewport,n.value.content);return p>0&&p<1}),i=w(),l=w(0);function r(p,g){if(y.value){const h=e.viewport.value.scrollLeft+p.deltaY;e.viewport.value.scrollLeft=h,fe(h,g)&&p.preventDefault()}else{const h=e.viewport.value.scrollTop+p.deltaY;e.viewport.value.scrollTop=h,fe(h,g)&&p.preventDefault()}}function c(p,g){y.value?l.value=g.x:l.value=g.y}function d(p){l.value=0}function m(p){n.value=p}function f(p,g){return Qe(p,l.value,n.value,g)}const y=C(()=>o.isHorizontal.value);function L(p){y.value?e.viewport.value.scrollLeft=f(p,e.dir.value):e.viewport.value.scrollTop=f(p)}function D(){if(y.value){if(e.viewport.value&&i.value){const p=e.viewport.value.scrollLeft,g=pe(p,n.value,e.dir.value);i.value.style.transform=`translate3d(${g}px, 0, 0)`}}else if(e.viewport.value&&i.value){const p=e.viewport.value.scrollTop,g=pe(p,n.value);i.value.style.transform=`translate3d(0, ${g}px, 0)`}}function I(p){i.value=p}return vt({sizes:n,hasThumb:s,handleWheelScroll:r,handleThumbDown:c,handleThumbUp:d,handleSizeChange:m,onThumbPositionChange:D,onThumbChange:I,onDragScroll:L}),(p,g)=>y.value?(v(),S(tt,A({key:0},p.$attrs,{ref:t(a)}),{default:b(()=>[k(p.$slots,"default")]),_:3},16)):(v(),S(rt,A({key:1},p.$attrs,{ref:t(a)}),{default:b(()=>[k(p.$slots,"default")]),_:3},16))}}),ue=ht,bt=E({__name:"ScrollAreaScrollbarImpl",props:{isHorizontal:{type:Boolean,required:!0}},emits:["onDragScroll","onWheelScroll","onThumbPointerDown"],setup(u,{emit:e}){const o=u,a=e,n=T(),s=oe(),i=j(),{forwardRef:l,currentElement:r}=R(),c=w(""),d=w();function m(p){var g,h;if(d.value){const B=p.clientX-((g=d.value)==null?void 0:g.left),N=p.clientY-((h=d.value)==null?void 0:h.top);a("onDragScroll",{x:B,y:N})}}function f(p){p.button===0&&(p.target.setPointerCapture(p.pointerId),d.value=r.value.getBoundingClientRect(),c.value=document.body.style.webkitUserSelect,document.body.style.webkitUserSelect="none",n.viewport&&(n.viewport.value.style.scrollBehavior="auto"),m(p))}function y(p){m(p)}function L(p){const g=p.target;g.hasPointerCapture(p.pointerId)&&g.releasePointerCapture(p.pointerId),document.body.style.webkitUserSelect=c.value,n.viewport&&(n.viewport.value.style.scrollBehavior=""),d.value=void 0}function D(p){var N;const g=p.target,h=(N=r.value)==null?void 0:N.contains(g),B=s.sizes.value.content-s.sizes.value.viewport;h&&s.handleWheelScroll(p,B)}O(()=>{document.addEventListener("wheel",D,{passive:!1})}),Y(()=>{document.removeEventListener("wheel",D)});function I(){var p,g,h,B,N;r.value&&(o.isHorizontal?s.handleSizeChange({content:((p=n.viewport.value)==null?void 0:p.scrollWidth)??0,viewport:((g=n.viewport.value)==null?void 0:g.offsetWidth)??0,scrollbar:{size:r.value.clientWidth??0,paddingStart:U(getComputedStyle(r.value).paddingLeft),paddingEnd:U(getComputedStyle(r.value).paddingRight)}}):s.handleSizeChange({content:((h=n.viewport.value)==null?void 0:h.scrollHeight)??0,viewport:((B=n.viewport.value)==null?void 0:B.offsetHeight)??0,scrollbar:{size:((N=r.value)==null?void 0:N.clientHeight)??0,paddingStart:U(getComputedStyle(r.value).paddingTop),paddingEnd:U(getComputedStyle(r.value).paddingBottom)}}),s.onThumbPositionChange())}return q(r,I),q(n.content,I),(p,g)=>(v(),S(t(W),{ref:t(l),style:{position:"absolute"},"data-scrollbarimpl":"",as:t(i).as.value,"as-child":t(i).asChild.value,onPointerdown:f,onPointermove:y,onPointerup:L},{default:b(()=>[k(p.$slots,"default")]),_:3},8,["as","as-child"]))}}),Ee=bt,mt=E({__name:"ScrollAreaThumb",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(u){const e=u,o=T(),a=oe();function n(f){const L=f.target.getBoundingClientRect(),D=f.clientX-L.left,I=f.clientY-L.top;a.handleThumbDown(f,{x:D,y:I})}function s(f){a.handleThumbUp(f)}const{forwardRef:i,currentElement:l}=R(),r=w(),c=C(()=>o.viewport.value);function d(){if(!r.value){const f=Ze(c.value,a.onThumbPositionChange);r.value=f,a.onThumbPositionChange()}}const m=C(()=>a.sizes.value);return Ie(m,()=>{a.onThumbChange(l.value),c.value&&(a.onThumbPositionChange(),c.value.addEventListener("scroll",d))}),Y(()=>{var f;c.value.removeEventListener("scroll",d),(f=o.viewport.value)==null||f.removeEventListener("scroll",d)}),(f,y)=>(v(),S(t(W),{ref:t(i),"data-state":t(a).hasThumb?"visible":"hidden",style:{width:"var(--reka-scroll-area-thumb-width)",height:"var(--reka-scroll-area-thumb-height)"},"as-child":e.asChild,as:f.as,onPointerdown:n,onPointerup:s},{default:b(()=>[k(f.$slots,"default")]),_:3},8,["data-state","as-child","as"]))}}),_t=mt,gt=E({inheritAttrs:!1,__name:"ScrollAreaViewport",props:{nonce:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(u,{expose:e}){const o=u,{nonce:a}=le(o),n=Oe(a),s=T(),i=w();O(()=>{s.onViewportChange(i.value),s.onContentChange(r.value)}),e({viewportElement:i});const{forwardRef:l,currentElement:r}=R();return(c,d)=>(v(),$(J,null,[_("div",A({ref_key:"viewportElement",ref:i,"data-reka-scroll-area-viewport":"",style:{overflowX:t(s).scrollbarXEnabled.value?"scroll":"hidden",overflowY:t(s).scrollbarYEnabled.value?"scroll":"hidden"}},c.$attrs,{tabindex:0}),[x(t(W),{ref:t(l),style:K({minWidth:t(s).scrollbarXEnabled.value?"fit-content":void 0}),"as-child":o.asChild,as:c.as},{default:b(()=>[k(c.$slots,"default")]),_:3},8,["style","as-child","as"])],16),x(t(W),{as:"style",nonce:t(n)},{default:b(()=>d[0]||(d[0]=[V(" /* Hide scrollbars cross-browser and enable momentum scroll for touch devices */ [data-reka-scroll-area-viewport] { scrollbar-width:none; -ms-overflow-style:none; -webkit-overflow-scrolling:touch; } [data-reka-scroll-area-viewport]::-webkit-scrollbar { display:none; } ")])),_:1,__:[0]},8,["nonce"])],64))}}),St=gt;const yt={class:"group flex h-screen w-18 min-w-18 flex-col overflow-hidden border-r border-border bg-card transition-all duration-200 ease-in-out hover:w-55 hover:min-w-55 xl:w-55 xl:min-w-55"},xt={class:"flex flex-1 flex-col gap-1 px-3 pt-4"},wt={class:"truncate opacity-0 transition-opacity duration-200 group-hover:opacity-100 xl:opacity-100"},Ct={class:"flex flex-col gap-1 px-3 mt-auto"},kt={class:"flex items-center gap-3 px-3 pb-4"},Et={class:"truncate opacity-0 transition-opacity duration-200 group-hover:opacity-100 xl:opacity-100"},At=E({__name:"PrimarySidebar",setup(u){const e=Z(),o=Xe(),a=Q(),n=[{icon:we,label:"Dashboard",to:"/",exact:!0},{icon:be,label:"Models",to:"/models"},{icon:me,label:"Content",to:"/content"},{icon:_e,label:"Validate",to:"/validate"},{icon:ge,label:"Branches",to:"/branches"},{icon:Te,label:"Normalize",to:"/normalize"}];function s(r){return r.exact?e.path===r.to:e.path.startsWith(r.to)}const i=C(()=>{var r,c;return((c=(r=a.status)==null?void 0:r.branches)==null?void 0:c.unmerged)??0}),l=C(()=>{var c;const r=(c=a.status)==null?void 0:c.validation;return r?r.errors+r.warnings:0});return(r,c)=>(v(),$("aside",yt,[c[3]||(c[3]=_("div",{class:"flex h-14 items-center px-4 shrink-0"},[_("img",{src:Ve,alt:"Contentrain",class:"size-8 shrink-0 block group-hover:hidden xl:hidden"}),_("img",{src:qe,alt:"Contentrain",class:"h-7 shrink-0 hidden group-hover:block xl:block dark:hidden"}),_("img",{src:We,alt:"Contentrain",class:"h-7 shrink-0 hidden dark:group-hover:block dark:xl:block"})],-1)),_("nav",xt,[(v(),$(J,null,ae(n,d=>x(t(ve),{key:d.to,to:d.to,class:H(t(z)("flex items-center gap-3 rounded-lg px-3 py-2.5 text-sm transition-all duration-150",s(d)?"bg-background text-primary font-medium shadow-sm border border-border":"text-muted-foreground hover:bg-background/60 hover:text-foreground"))},{default:b(()=>[(v(),S(he(d.icon),{class:"size-5 shrink-0"})),_("span",wt,P(d.label),1),d.to==="/branches"&&i.value>0?(v(),S(t(re),{key:0,variant:"secondary",class:"ml-auto text-[10px] h-5 px-1.5 opacity-0 group-hover:opacity-100 xl:opacity-100 transition-opacity"},{default:b(()=>[V(P(i.value),1)]),_:1})):M("",!0),d.to==="/validate"&&l.value>0?(v(),S(t(re),{key:1,class:"ml-auto text-[10px] h-5 px-1.5 bg-status-error/10 text-status-error border-0 opacity-0 group-hover:opacity-100 xl:opacity-100 transition-opacity"},{default:b(()=>[V(P(l.value),1)]),_:1})):M("",!0)]),_:2},1032,["to","class"])),64))]),_("div",Ct,[_("a",{href:"https://ai.contentrain.io",target:"_blank",rel:"noopener",class:H(t(z)("flex items-center gap-3 rounded-lg px-3 py-2 text-sm transition-all duration-150","text-muted-foreground hover:bg-background/60 hover:text-foreground"))},[x(t(De),{class:"size-5 shrink-0"}),c[1]||(c[1]=_("span",{class:"truncate opacity-0 transition-opacity duration-200 group-hover:opacity-100 xl:opacity-100"}," Docs ",-1))],2),_("a",{href:"https://github.com/Contentrain/ai",target:"_blank",rel:"noopener",class:H(t(z)("flex items-center gap-3 rounded-lg px-3 py-2 text-sm transition-all duration-150","text-muted-foreground hover:bg-background/60 hover:text-foreground"))},[x(t(Be),{class:"size-5 shrink-0"}),c[2]||(c[2]=_("span",{class:"truncate opacity-0 transition-opacity duration-200 group-hover:opacity-100 xl:opacity-100"}," GitHub ",-1))],2)]),_("div",kt,[_("button",{class:H(t(z)("flex items-center gap-3 rounded-lg px-3 py-2.5 text-sm w-full transition-all duration-150","text-muted-foreground hover:bg-background/60 hover:text-foreground")),onClick:c[0]||(c[0]=d=>t(o).toggleTheme())},[t(o).colorMode==="dark"?(v(),S(t(Me),{key:0,class:"size-5 shrink-0"})):(v(),S(t(Ne),{key:1,class:"size-5 shrink-0"})),_("span",Et,P(t(o).colorMode==="dark"?"Light mode":"Dark mode"),1)],2)])]))}}),Lt=E({__name:"ScrollBar",props:{orientation:{default:"vertical"},forceMount:{type:Boolean},asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},setup(u){const e=u,o=ye(e,"class");return(a,n)=>(v(),S(t(ft),A({"data-slot":"scroll-area-scrollbar"},t(o),{class:t(z)("flex touch-none p-px transition-colors select-none",u.orientation==="vertical"&&"h-full w-2.5 border-l border-l-transparent",u.orientation==="horizontal"&&"h-2.5 flex-col border-t border-t-transparent",e.class)}),{default:b(()=>[x(t(_t),{"data-slot":"scroll-area-thumb",class:"bg-border relative flex-1 rounded-full"})]),_:1},16,["class"]))}}),Pt=E({__name:"ScrollArea",props:{type:{},dir:{},scrollHideDelay:{},asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},setup(u){const e=u,o=ye(e,"class");return(a,n)=>(v(),S(t(Ue),A({"data-slot":"scroll-area"},t(o),{class:t(z)("relative",e.class)}),{default:b(()=>[x(t(St),{"data-slot":"scroll-area-viewport",class:"focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1"},{default:b(()=>[k(a.$slots,"default")]),_:3}),x(Lt),x(t(Je))]),_:3},16,["class"]))}}),$t={class:"flex h-full"},Rt={class:"hidden w-55 shrink-0 flex-col border-r border-border sidebar-gradient lg:flex"},Tt={class:"p-3"},Dt={class:"relative"},It=["onClick"],zt={class:"truncate flex-1"},Ht={key:0,class:"px-3 py-6 text-center text-xs text-muted-foreground"},Ot={class:"flex-1 min-w-0 overflow-y-auto custom-scrollbar"},Bt=E({__name:"SubSidebarLayout",props:{basePath:{},paramKey:{}},setup(u){const e=ie("serve-ui-texts").locale("en").get(),o=u,a=Z(),n=Le(),s=Q(),i=w(""),l=C(()=>{var f;const d=((f=s.status)==null?void 0:f.models)??[];if(!i.value)return d;const m=i.value.toLowerCase();return d.filter(y=>y.id.toLowerCase().includes(m)||y.domain.toLowerCase().includes(m))}),r=C(()=>a.params[o.paramKey]),c={collection:"bg-primary/10 text-primary",singleton:"bg-status-info/10 text-status-info",document:"bg-status-success/10 text-status-success",dictionary:"bg-status-warning/10 text-status-warning"};return(d,m)=>(v(),$("div",$t,[_("aside",Rt,[_("div",Tt,[_("div",Dt,[x(t($e),{class:"absolute left-2.5 top-2.5 size-3.5 text-muted-foreground"}),x(t(Re),{modelValue:i.value,"onUpdate:modelValue":m[0]||(m[0]=f=>i.value=f),placeholder:t(e)["sub-sidebar-layout.search"],class:"h-8 bg-background pl-8 text-xs"},null,8,["modelValue","placeholder"])])]),x(t(Pt),{class:"flex-1 px-1.5"},{default:b(()=>[(v(!0),$(J,null,ae(l.value,f=>{var y;return v(),$("button",{key:f.id,class:H(t(z)("flex w-full items-center gap-2 rounded-md px-3 py-2 text-left text-sm transition-colors",r.value===f.id?"bg-background font-medium text-primary shadow-sm border border-border":"text-muted-foreground hover:bg-background/60 hover:text-foreground")),onClick:L=>t(n).push(`${u.basePath}/${f.id}`)},[_("span",{class:H(t(z)("size-1.5 rounded-full shrink-0",((y=c[f.kind])==null?void 0:y.split(" ")[0])??"bg-muted"))},null,2),_("span",zt,P(f.id),1),x(t(re),{variant:"secondary",class:"text-[10px] shrink-0 h-4 px-1"},{default:b(()=>[V(P(f.kind==="singleton"?"1":f.fields),1)]),_:2},1024)],10,It)}),128)),l.value.length===0?(v(),$("div",Ht,P(t(e)["sub-sidebar-layout.no-models-found"]),1)):M("",!0)]),_:1})]),_("div",Ot,[k(d.$slots,"default")])]))}}),Nt={class:"flex items-center gap-4 border-t border-border bg-background px-6 py-1.5 text-xs text-muted-foreground"},Mt={class:"flex items-center gap-1.5"},Vt={key:0,class:"ml-auto"},qt=E({__name:"StatusBar",setup(u){const e=ie("serve-ui-texts").locale("en").get(),o=Q(),{connected:a,lastUpdate:n}=xe(),s=C(()=>{var r;return((r=o.status)==null?void 0:r.models.length)??0}),i=C(()=>{var r,c;return((c=(r=o.status)==null?void 0:r.config)==null?void 0:c.locales.supported.length)??0}),l=C(()=>{if(!n.value)return"";const r=Date.now()-n.value.getTime();return r<5e3?"just now":r<6e4?`${Math.floor(r/1e3)}s ago`:r<36e5?`${Math.floor(r/6e4)}m ago`:n.value.toLocaleTimeString()});return(r,c)=>(v(),$("footer",Nt,[_("span",Mt,[_("span",{class:H(["size-1.5 rounded-full",t(a)?"bg-status-success":"bg-status-error"])},null,2),V(" "+P(t(a)?"watching":"disconnected"),1)]),c[0]||(c[0]=_("span",{class:"h-3 w-px bg-border"},null,-1)),_("span",null,P(s.value)+" "+P(t(e)["status-bar.models"]),1),c[1]||(c[1]=_("span",{class:"h-3 w-px bg-border"},null,-1)),_("span",null,P(i.value)+" "+P(t(e)["status-bar.locales"]),1),l.value?(v(),$("span",Vt,P(l.value),1)):M("",!0)]))}}),Wt={class:"fixed bottom-0 left-0 right-0 z-50 border-t border-border bg-background"},Xt={class:"flex items-center justify-around py-2"},Yt=E({__name:"MobileNav",setup(u){const e=ie("serve-ui-texts").locale("en").get(),o=Z(),a=[{icon:we,label:e["mobile-nav.dash"],to:"/",exact:!0},{icon:be,label:e["mobile-nav.models"],to:"/models"},{icon:me,label:e["mobile-nav.content"],to:"/content"},{icon:_e,label:e["mobile-nav.valid"],to:"/validate"},{icon:ge,label:e["mobile-nav.branch"],to:"/branches"}];function n(s){return s.exact?o.path===s.to:o.path.startsWith(s.to)}return(s,i)=>(v(),$("nav",Wt,[_("div",Xt,[(v(),$(J,null,ae(a,l=>x(t(ve),{key:l.to,to:l.to,class:H(t(z)("flex flex-col items-center gap-0.5 px-3 py-1 text-[10px]",n(l)?"text-primary":"text-muted-foreground"))},{default:b(()=>[(v(),S(he(l.icon),{class:"size-5"})),V(" "+P(l.label),1)]),_:2},1032,["to","class"])),64))])]))}}),jt={class:"flex h-screen max-h-screen w-full max-w-480 mx-auto"},Ut={class:"flex flex-1 flex-col min-w-0"},Ft={class:"flex-1 overflow-hidden pb-16 md:pb-0"},Gt={key:1,class:"h-full overflow-y-auto custom-scrollbar"},po=E({__name:"AppLayout",setup(u){const e=Z(),o=Q(),a=C(()=>e.meta.subSidebar===!0),n=C(()=>e.meta.basePath??""),s=C(()=>e.meta.paramKey??"");return xe(i=>{(i.type==="config:changed"||i.type==="model:changed"||i.type==="context:changed")&&o.fetchStatus()}),O(()=>{o.fetchStatus()}),(i,l)=>(v(),$("div",jt,[x(At,{class:"hidden md:flex"}),_("div",Ut,[_("main",Ft,[a.value?(v(),S(Bt,{key:0,"base-path":n.value,"param-key":s.value},{default:b(()=>[x(t(de))]),_:1},8,["base-path","param-key"])):(v(),$("div",Gt,[x(t(de))]))]),x(qt,{class:"hidden md:flex"})]),x(Yt,{class:"md:hidden"})]))}});export{po as default};
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import{c as M,a as w,o as n,b as m,e as s,f as j,m as N,u as e,i as te,z as O,p as f,y as L,j as t,s as d,g as z,E as D,q as u,B as o,L as R,F as T,x as E,h as k,r as A,X as V,C as ue,v as de}from"./index-RDdffBTh.js";import{u as pe}from"./content-Ctqretwl.js";import{a as C,_ as fe}from"./PageHeader.vue_vue_type_script_setup_true_lang-CEnjONvd.js";import{_ as me,C as _e,a as W}from"./AgentPromptGroup.vue_vue_type_script_setup_true_lang-Ulb-9Tr3.js";import{_ as he}from"./TrustBadge.vue_vue_type_script_setup_true_lang-KRiTnLVk.js";import{_ as G,a as ve,b as ge,c as ye,d as be}from"./CollapsibleTrigger.vue_vue_type_script_setup_true_lang-BRzXVXDG.js";import{_ as xe}from"./Separator.vue_vue_type_script_setup_true_lang-1pFZ2PR2.js";import{i as se,D as ke,_ as U,b as X,c as H,d as Z}from"./DialogTitle.vue_vue_type_script_setup_true_lang-2sQAJn_Y.js";import{b as ze,u as Ce}from"./useId-CPFWZ4Bo.js";import{u as ae}from"./Presence-BXKCIfUk.js";import{P as le,r as we,d as $e}from"./useWatch-B2FLRWr8.js";import{A as Be}from"./arrow-left-DANf_wrK.js";import{G as J}from"./git-merge-Bmz-MVBm.js";import{G as K}from"./git-branch-DqEFTZDt.js";import{P as De,M as je}from"./plus-Cw1OnTR2.js";import{F as Fe}from"./file-text-J3Wzwieh.js";import"./shield-check-B67ELGUT.js";import"./getActiveElement-FUKBWQwh.js";import"./ConfigProvider-Dvd7YoEV.js";/**
|
|
2
|
-
* @license lucide-vue-next v0.474.0 - ISC
|
|
3
|
-
*
|
|
4
|
-
* This source code is licensed under the ISC license.
|
|
5
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/const qe=M("CircleCheckBigIcon",[["path",{d:"M21.801 10A10 10 0 1 1 17 3.335",key:"yps3ct"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]]);/**
|
|
7
|
-
* @license lucide-vue-next v0.474.0 - ISC
|
|
8
|
-
*
|
|
9
|
-
* This source code is licensed under the ISC license.
|
|
10
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
-
*/const Ie=M("CircleXIcon",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]]);/**
|
|
12
|
-
* @license lucide-vue-next v0.474.0 - ISC
|
|
13
|
-
*
|
|
14
|
-
* This source code is licensed under the ISC license.
|
|
15
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
16
|
-
*/const Pe=M("FileIcon",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}]]);var Te=w({__name:"DialogDescription",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"p"}},setup(g){const _=g;ae();const i=se();return(p,a)=>(n(),m(e(le),N(_,{id:e(i).descriptionId}),{default:s(()=>[j(p.$slots,"default")]),_:3},16,["id"]))}}),Ae=Te,Ne=w({__name:"DialogTrigger",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(g){const _=g,i=se(),{forwardRef:p,currentElement:a}=ae();return i.contentId||(i.contentId=ze(void 0,"reka-dialog-content")),te(()=>{i.triggerElement.value=a.value}),(h,v)=>(n(),m(e(le),N(_,{ref:e(p),type:h.as==="button"?"button":void 0,"aria-haspopup":"dialog","aria-expanded":e(i).open.value||!1,"aria-controls":e(i).open.value?e(i).contentId:void 0,"data-state":e(i).open.value?"open":"closed",onClick:e(i).onOpenToggle}),{default:s(()=>[j(h.$slots,"default")]),_:3},16,["type","aria-expanded","aria-controls","data-state","onClick"]))}}),Re=Ne;const Q=w({__name:"DialogDescription",props:{asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},setup(g){const _=g,i=we(_,"class"),p=Ce(i);return(a,h)=>(n(),m(e(Ae),N({"data-slot":"dialog-description"},e(p),{class:e(O)("text-muted-foreground text-sm",_.class)}),{default:s(()=>[j(a.$slots,"default")]),_:3},16,["class"]))}}),Y=w({__name:"DialogFooter",props:{class:{type:[Boolean,null,String,Object,Array]},showCloseButton:{type:Boolean,default:!1}},setup(g){const _=g;return(i,p)=>(n(),f("div",{"data-slot":"dialog-footer",class:L(e(O)("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",_.class))},[j(i.$slots,"default"),g.showCloseButton?(n(),m(e(ke),{key:0,"as-child":""},{default:s(()=>[t(e(C),{variant:"outline"},{default:s(()=>[...p[0]||(p[0]=[d(" Close ",-1)])]),_:1})]),_:1})):z("",!0)],2))}}),ee=w({__name:"DialogTrigger",props:{asChild:{type:Boolean},as:{}},setup(g){const _=g;return(i,p)=>(n(),m(e(Re),N({"data-slot":"dialog-trigger"},_),{default:s(()=>[j(i.$slots,"default")]),_:3},16))}}),We="/merge-2.svg",Le={class:"rounded bg-muted px-1.5 py-0.5 font-mono text-xs"},Me={class:"rounded bg-muted px-1.5 py-0.5 font-mono text-xs"},Oe={class:"rounded bg-muted px-1.5 py-0.5 font-mono text-xs"},Se={class:"px-6 py-6 space-y-4"},Ee={class:"text-sm"},Ve={key:1,class:"flex justify-center py-12"},Ge={class:"flex items-center gap-4 flex-wrap"},Ue={class:"flex items-center gap-2"},Xe={class:"text-xs font-mono bg-muted px-2 py-1 rounded"},He={class:"flex items-center gap-2"},Ze={class:"text-xs font-mono bg-primary/10 text-primary px-2 py-1 rounded"},Je={class:"ml-auto flex items-center gap-3 text-xs text-muted-foreground"},Ke={class:"flex items-center gap-1"},Qe={class:"flex items-center gap-1 text-status-success"},Ye={class:"flex items-center gap-1 text-status-error"},et={key:0,class:"rounded-lg border border-border bg-muted/30 p-4 font-mono text-xs text-muted-foreground overflow-x-auto whitespace-pre-wrap"},tt={key:1,class:"space-y-3"},st={class:"font-mono text-xs text-foreground flex-1 truncate"},at={class:"flex items-center gap-2 text-xs shrink-0"},lt={key:0,class:"text-status-success font-mono"},rt={key:1,class:"text-status-error font-mono"},ot={class:"max-h-96 overflow-auto custom-scrollbar"},nt={class:"p-0 m-0"},it={class:"block text-xs leading-5"},ct={key:2,class:"flex flex-col items-center py-12 text-center"},ut={class:"text-sm text-muted-foreground"},Ft=w({__name:"BranchDetailPage",setup(g){const _=de(),i=ue(),p=pe(),a=$e("serve-ui-texts").locale("en").get(),h=k(()=>decodeURIComponent(_.params.branchName)),v=k(()=>p.branchDiff),y=A(!1),b=A(null),F=A(!1),q=A(!1),I=k(()=>{const l=h.value.replace("contentrain/","").split("/");return{scope:l[0]??"unknown",target:l.length>2?l.slice(1,-1).join("/"):l[1]??"",timestamp:l.length>2?l[l.length-1]??"":""}}),$=k(()=>{var P;if(!((P=v.value)!=null&&P.diff))return[];const x=v.value.diff,l=[];let r=null;for(const c of x.split(`
|
|
17
|
-
`))if(c.startsWith("diff --git")){r&&l.push(r);const B=c.match(/b\/(.+)$/);r={path:(B==null?void 0:B[1])??"unknown",additions:0,deletions:0,lines:[]},r.lines.push({text:c,type:"header"})}else r&&(c.startsWith("+++")||c.startsWith("---")||c.startsWith("index ")?r.lines.push({text:c,type:"header"}):c.startsWith("@@")?r.lines.push({text:c,type:"hunk"}):c.startsWith("+")?(r.additions++,r.lines.push({text:c,type:"add"})):c.startsWith("-")?(r.deletions++,r.lines.push({text:c,type:"remove"})):r.lines.push({text:c,type:"context"}));return r&&l.push(r),l}),re=k(()=>$.value.reduce((x,l)=>x+l.additions,0)),oe=k(()=>$.value.reduce((x,l)=>x+l.deletions,0)),ne=k(()=>h.value.includes("normalize")),S=k(()=>{var l;if(!((l=v.value)!=null&&l.stat))return 0;const x=v.value.stat.match(/(\d+)\s+files?\s+changed/);return x?Number.parseInt(x[1],10):$.value.length});async function ie(){y.value=!0,b.value=null,F.value=!1;try{await p.approveBranch(h.value),b.value={type:"success",message:a["branch-detail.branch-merged-successfully"]},D.success(a["branch-detail.branch-merged-successfully"]),setTimeout(()=>i.push("/branches"),1500)}catch{b.value={type:"error",message:a["branch-detail.failed-to-merge-branch"]},D.error(a["branch-detail.failed-to-merge-branch"])}finally{y.value=!1}}async function ce(){y.value=!0,b.value=null,q.value=!1;try{await p.rejectBranch(h.value),b.value={type:"success",message:a["branch-detail.branch-rejected-and-deleted"]},D.success(a["branch-detail.branch-rejected-and-deleted"]),setTimeout(()=>i.push("/branches"),1500)}catch{b.value={type:"error",message:a["branch-detail.failed-to-delete-branch"]},D.error(a["branch-detail.failed-to-delete-branch"])}finally{y.value=!1}}return te(async()=>{try{await p.fetchBranchDiff(h.value)}catch{D.error("Failed to load branch data.")}}),(x,l)=>(n(),f("div",null,[t(fe,{title:I.value.target||I.value.scope,description:e(a)["branch-detail.branch-review-and-diff"]},{actions:s(()=>[t(e(C),{variant:"ghost",size:"sm",onClick:l[0]||(l[0]=r=>e(i).push("/branches"))},{default:s(()=>[t(e(Be),{class:"mr-1.5 size-4"}),d(" "+o(e(a)["branch-detail.back"]),1)]),_:1}),t(e(U),{open:F.value,"onUpdate:open":l[2]||(l[2]=r=>F.value=r)},{default:s(()=>[t(e(ee),{"as-child":""},{default:s(()=>[t(e(C),{variant:"default",size:"sm",disabled:y.value||!v.value},{default:s(()=>[t(e(J),{class:"mr-1.5 size-4"}),d(" "+o(e(a)["branch-detail.approve-merge"]),1)]),_:1},8,["disabled"])]),_:1}),t(e(X),null,{default:s(()=>[t(e(H),null,{default:s(()=>[t(e(Z),null,{default:s(()=>[d(o(e(a)["branch-detail.confirm-merge"]),1)]),_:1}),t(e(Q),null,{default:s(()=>{var r;return[d(o(e(a)["branch-detail.this-will-merge"])+" ",1),u("code",Le,o(h.value),1),d(" "+o(e(a)["branch-detail.into"])+" ",1),u("code",Me,o(((r=v.value)==null?void 0:r.base)??"main"),1),d(" "+o(e(a)["branch-detail.and-delete-the-source"]),1)]}),_:1})]),_:1}),t(e(Y),null,{default:s(()=>[t(e(C),{variant:"outline",size:"sm",onClick:l[1]||(l[1]=r=>F.value=!1)},{default:s(()=>[d(o(e(a)["branch-detail.cancel"]),1)]),_:1}),t(e(C),{variant:"default",size:"sm",disabled:y.value,onClick:ie},{default:s(()=>[y.value?(n(),m(e(R),{key:0,class:"mr-1.5 size-4 animate-spin"})):(n(),m(e(_e),{key:1,class:"mr-1.5 size-4"})),d(" "+o(e(a)["branch-detail.merge"]),1)]),_:1},8,["disabled"])]),_:1})]),_:1})]),_:1},8,["open"]),t(e(U),{open:q.value,"onUpdate:open":l[4]||(l[4]=r=>q.value=r)},{default:s(()=>[t(e(ee),{"as-child":""},{default:s(()=>[t(e(C),{variant:"destructive",size:"sm",disabled:y.value||!v.value},{default:s(()=>[t(e(V),{class:"mr-1.5 size-4"}),d(" "+o(e(a)["branch-detail.reject"]),1)]),_:1},8,["disabled"])]),_:1}),t(e(X),null,{default:s(()=>[t(e(H),null,{default:s(()=>[t(e(Z),null,{default:s(()=>[d(o(e(a)["branch-detail.confirm-rejection"]),1)]),_:1}),t(e(Q),null,{default:s(()=>[d(o(e(a)["branch-detail.this-will-permanently-delete"])+" ",1),u("code",Oe,o(h.value),1),l[5]||(l[5]=d(". All changes in this branch will be lost. ",-1))]),_:1})]),_:1}),t(e(Y),null,{default:s(()=>[t(e(C),{variant:"outline",size:"sm",onClick:l[3]||(l[3]=r=>q.value=!1)},{default:s(()=>[d(o(e(a)["branch-detail.cancel"]),1)]),_:1}),t(e(C),{variant:"destructive",size:"sm",disabled:y.value,onClick:ce},{default:s(()=>[y.value?(n(),m(e(R),{key:0,class:"mr-1.5 size-4 animate-spin"})):(n(),m(e(V),{key:1,class:"mr-1.5 size-4"})),d(" "+o(e(a)["branch-detail.delete-branch"]),1)]),_:1},8,["disabled"])]),_:1})]),_:1})]),_:1},8,["open"])]),_:1},8,["title","description"]),u("div",Se,[b.value?(n(),f("div",{key:0,class:L(e(O)("flex items-center gap-3 rounded-lg border p-4",b.value.type==="success"?"border-status-success/30 bg-status-success/5":"border-status-error/30 bg-status-error/5"))},[b.value.type==="success"?(n(),m(e(qe),{key:0,class:"size-5 text-status-success shrink-0"})):(n(),m(e(Ie),{key:1,class:"size-5 text-status-error shrink-0"})),u("span",Ee,o(b.value.message),1)],2)):z("",!0),e(p).loading?(n(),f("div",Ve,[t(e(R),{class:"size-6 animate-spin text-primary"})])):v.value?(n(),f(T,{key:2},[t(e(G),null,{default:s(()=>[t(e(ve),{class:"p-4"},{default:s(()=>[u("div",Ge,[u("div",Ue,[t(e(K),{class:"size-4 text-muted-foreground"}),u("code",Xe,o(v.value.base),1)]),t(e(J),{class:"size-4 text-primary"}),u("div",He,[t(e(K),{class:"size-4 text-primary"}),u("code",Ze,o(h.value.replace("contentrain/","")),1)]),u("div",Je,[t(e(he),{status:I.value.scope==="normalize"?"pending":"partial",reason:I.value.scope==="normalize"?"Review required":void 0},null,8,["status","reason"]),u("span",Ke,[t(e(Pe),{class:"size-3"}),d(" "+o(S.value)+" "+o(e(a)["branch-detail.file"])+o(S.value!==1?"s":""),1)]),u("span",Qe,[t(e(De),{class:"size-3"}),d(" "+o(re.value),1)]),u("span",Ye,[t(e(je),{class:"size-3"}),d(" "+o(oe.value),1)])])])]),_:1})]),_:1}),v.value.stat?(n(),f("pre",et,o(v.value.stat),1)):z("",!0),$.value.length>0?(n(),f("div",tt,[(n(!0),f(T,null,E($.value,(r,P)=>(n(),m(e(be),{key:P,"default-open":!0},{default:s(()=>[t(e(G),{class:"overflow-hidden"},{default:s(()=>[t(e(ge),{class:"flex w-full items-center gap-3 p-3 hover:bg-muted/50 transition-colors text-left"},{default:s(()=>[t(e(Fe),{class:"size-4 text-muted-foreground shrink-0"}),u("span",st,o(r.path),1),u("div",at,[r.additions>0?(n(),f("span",lt,"+"+o(r.additions),1)):z("",!0),r.deletions>0?(n(),f("span",rt,"-"+o(r.deletions),1)):z("",!0)])]),_:2},1024),t(e(ye),null,{default:s(()=>[t(e(xe)),u("div",ot,[u("pre",nt,[u("code",it,[(n(!0),f(T,null,E(r.lines,(c,B)=>(n(),f(T,{key:B},[c.type!=="header"?(n(),f("span",{key:0,class:L([{"bg-status-success/10 text-status-success":c.type==="add","bg-status-error/10 text-status-error":c.type==="remove","bg-primary/5 text-primary font-medium":c.type==="hunk","text-muted-foreground":c.type==="context"},"block px-4 font-mono"])},o(c.text),3)):z("",!0)],64))),128))])])])]),_:2},1024)]),_:2},1024)]),_:2},1024))),128)),t(me,{title:e(a)["branch-detail.ask-your-agent"],class:"mt-4"},{default:s(()=>[t(W,{prompt:e(a)["branch-detail.review-the-changes-on"]},null,8,["prompt"]),t(W,{prompt:e(a)["branch-detail.check-the-content-quality"]},null,8,["prompt"]),ne.value?(n(),m(W,{key:0,prompt:e(a)["branch-detail.continue-with-phase-2"]},null,8,["prompt"])):z("",!0)]),_:1},8,["title"])])):(n(),f("div",ct,[l[6]||(l[6]=u("img",{src:We,alt:"",class:"empty-illustration mb-4"},null,-1)),u("p",ut,o(e(a)["branch-detail.no-diff-available-for"]),1)]))],64)):z("",!0)])]))}});export{Ft as default};
|
package/dist/serve-ui/assets/CollapsibleTrigger.vue_vue_type_script_setup_true_lang-BRzXVXDG.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as d,t as N,o as u,b as m,e as c,f as p,u as e,r as v,w as F,i as I,j as M,m as y,g as D,h as w,K as E,p as R,y as x,z as P,I as H,J as j}from"./index-RDdffBTh.js";import{b as S,a as V}from"./useId-CPFWZ4Bo.js";import{f as z,u as B,c as J,k as K,P as L}from"./Presence-BXKCIfUk.js";import{P as $}from"./useWatch-B2FLRWr8.js";const[T,G]=J("CollapsibleRoot");var Q=d({__name:"CollapsibleRoot",props:{defaultOpen:{type:Boolean,required:!1,default:!1},open:{type:Boolean,required:!1,default:void 0},disabled:{type:Boolean,required:!1},unmountOnHide:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["update:open"],setup(n,{expose:l,emit:a}){const o=n,r=z(o,"open",a,{defaultValue:o.defaultOpen,passive:o.open===void 0}),{disabled:i,unmountOnHide:f}=N(o);return G({contentId:"",disabled:i,open:r,unmountOnHide:f,onOpenToggle:()=>{i.value||(r.value=!r.value)}}),l({open:r}),B(),(_,C)=>(u(),m(e($),{as:_.as,"as-child":o.asChild,"data-state":e(r)?"open":"closed","data-disabled":e(i)?"":void 0},{default:c(()=>[p(_.$slots,"default",{open:e(r)})]),_:3},8,["as","as-child","data-state","data-disabled"]))}}),U=Q,W=d({inheritAttrs:!1,__name:"CollapsibleContent",props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["contentFound"],setup(n,{emit:l}){const a=n,o=l,s=T();s.contentId||(s.contentId=S(void 0,"reka-collapsible-content"));const r=v(),{forwardRef:i,currentElement:f}=B(),_=v(0),C=v(0),O=w(()=>s.open.value),h=v(O.value),b=v();F(()=>{var t;return[O.value,(t=r.value)==null?void 0:t.present]},async()=>{await E();const t=f.value;if(!t)return;b.value=b.value||{transitionDuration:t.style.transitionDuration,animationName:t.style.animationName},t.style.transitionDuration="0s",t.style.animationName="none";const g=t.getBoundingClientRect();C.value=g.height,_.value=g.width,h.value||(t.style.transitionDuration=b.value.transitionDuration,t.style.animationName=b.value.animationName)},{immediate:!0});const A=w(()=>h.value&&s.open.value);return I(()=>{requestAnimationFrame(()=>{h.value=!1})}),K(f,"beforematch",t=>{requestAnimationFrame(()=>{s.onOpenToggle(),o("contentFound")})}),(t,g)=>(u(),m(e(L),{ref_key:"presentRef",ref:r,present:t.forceMount||e(s).open.value,"force-mount":!0},{default:c(({present:k})=>{var q;return[M(e($),y(t.$attrs,{id:e(s).contentId,ref:e(i),"as-child":a.asChild,as:t.as,hidden:k?void 0:e(s).unmountOnHide.value?"":"until-found","data-state":A.value?void 0:e(s).open.value?"open":"closed","data-disabled":(q=e(s).disabled)!=null&&q.value?"":void 0,style:{"--reka-collapsible-content-height":`${C.value}px`,"--reka-collapsible-content-width":`${_.value}px`}}),{default:c(()=>[!e(s).unmountOnHide.value||k?p(t.$slots,"default",{key:0}):D("v-if",!0)]),_:2},1040,["id","as-child","as","hidden","data-state","data-disabled","style"])]}),_:3},8,["present"]))}}),X=W,Y=d({__name:"CollapsibleTrigger",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(n){const l=n;B();const a=T();return(o,s)=>{var r,i;return u(),m(e($),{type:o.as==="button"?"button":void 0,as:o.as,"as-child":l.asChild,"aria-controls":e(a).contentId,"aria-expanded":e(a).open.value,"data-state":e(a).open.value?"open":"closed","data-disabled":(r=e(a).disabled)!=null&&r.value?"":void 0,disabled:(i=e(a).disabled)==null?void 0:i.value,onClick:e(a).onOpenToggle},{default:c(()=>[p(o.$slots,"default")]),_:3},8,["type","as","as-child","aria-controls","aria-expanded","data-state","data-disabled","disabled","onClick"])}}}),Z=Y;const se=d({__name:"Card",props:{class:{type:[Boolean,null,String,Object,Array]}},setup(n){const l=n;return(a,o)=>(u(),R("div",{"data-slot":"card",class:x(e(P)("bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",l.class))},[p(a.$slots,"default")],2))}}),ne=d({__name:"CardContent",props:{class:{type:[Boolean,null,String,Object,Array]}},setup(n){const l=n;return(a,o)=>(u(),R("div",{"data-slot":"card-content",class:x(e(P)("px-6",l.class))},[p(a.$slots,"default")],2))}}),le=d({__name:"Collapsible",props:{defaultOpen:{type:Boolean},open:{type:Boolean},disabled:{type:Boolean},unmountOnHide:{type:Boolean},asChild:{type:Boolean},as:{}},emits:["update:open"],setup(n,{emit:l}){const s=V(n,l);return(r,i)=>(u(),m(e(U),y({"data-slot":"collapsible"},e(s)),{default:c(f=>[p(r.$slots,"default",H(j(f)))]),_:3},16))}}),re=d({__name:"CollapsibleContent",props:{forceMount:{type:Boolean},asChild:{type:Boolean},as:{}},setup(n){const l=n;return(a,o)=>(u(),m(e(X),y({"data-slot":"collapsible-content"},l),{default:c(()=>[p(a.$slots,"default")]),_:3},16))}}),ie=d({__name:"CollapsibleTrigger",props:{asChild:{type:Boolean},as:{}},setup(n){const l=n;return(a,o)=>(u(),m(e(Z),y({"data-slot":"collapsible-trigger"},l),{default:c(()=>[p(a.$slots,"default")]),_:3},16))}});export{se as _,ne as a,ie as b,re as c,le as d};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as o}from"./Presence-BXKCIfUk.js";const[e]=o("ConfigProvider");export{e as i};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as $,p as l,j as d,u as t,q as s,B as n,F as p,x as C,g as w,r as F,h as z,o as a,y as B,z as V,b as L,A as N,e as x,s as _,C as S}from"./index-RDdffBTh.js";import{u as q}from"./project-BlZcHJw6.js";import{_ as P}from"./PageHeader.vue_vue_type_script_setup_true_lang-CEnjONvd.js";import{_ as g}from"./index-De_z0714.js";import{S as T,_ as A}from"./Input.vue_vue_type_script_setup_true_lang-BveqfZsR.js";import{d as E}from"./useWatch-B2FLRWr8.js";import{F as h}from"./file-text-J3Wzwieh.js";import{L as K}from"./languages-CQqNMim-.js";import{B as O}from"./book-open-DnH5T78M.js";import{D as R}from"./database-Wd_i2bM1.js";const U={class:"px-6 py-6"},G={key:0,class:"flex flex-col items-center py-16 text-center"},H={class:"mb-4 flex size-14 items-center justify-center rounded-full bg-muted"},I={class:"text-lg font-semibold"},J={class:"mt-2 max-w-sm text-sm text-muted-foreground"},M={class:"relative mb-6 max-w-sm"},Q={class:"mb-3 text-xs font-medium uppercase tracking-wider text-muted-foreground"},W={class:"space-y-1.5"},X=["onClick"],Y={class:"min-w-0 flex-1"},Z={class:"font-medium text-foreground"},tt={class:"flex items-center gap-2 shrink-0"},et={key:0,class:"py-12 text-center text-sm text-muted-foreground"},pt=$({__name:"ContentPage",setup(st){const e=E("serve-ui-texts").locale("en").get(),v=q(),j=S(),u=F(""),b=z(()=>{var r;const o=((r=v.status)==null?void 0:r.models)??[];if(!u.value)return o;const i=u.value.toLowerCase();return o.filter(m=>m.id.toLowerCase().includes(i)||m.domain.toLowerCase().includes(i))}),D=z(()=>{const o={};for(const i of b.value){const r=i.domain||"default";o[r]||(o[r]=[]),o[r].push(i)}return o}),y={collection:{icon:R,color:"bg-primary/10 text-primary",label:e["content.collection"]},singleton:{icon:h,color:"bg-status-info/10 text-status-info",label:e["content.singleton"]},document:{icon:O,color:"bg-status-success/10 text-status-success",label:e["content.document"]},dictionary:{icon:h,color:"bg-status-warning/10 text-status-warning",label:e["content.dictionary"]}};function f(o){return y[o]??y.collection}return(o,i)=>{var r;return a(),l("div",null,[d(P,{title:t(e)["content.content"],description:t(e)["content.browse-and-inspect-content"]},null,8,["title","description"]),s("div",U,[(((r=t(v).status)==null?void 0:r.models)??[]).length===0?(a(),l("div",G,[s("div",H,[d(t(h),{class:"size-6 text-muted-foreground"})]),s("h2",I,n(t(e)["content.no-models-yet"]),1),s("p",J,n(t(e)["content.create-models-using-your"]),1)])):(a(),l(p,{key:1},[s("div",M,[d(t(T),{class:"absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground"}),d(t(A),{modelValue:u.value,"onUpdate:modelValue":i[0]||(i[0]=m=>u.value=m),placeholder:t(e)["content.filter-models"],class:"h-9 pl-9 text-sm"},null,8,["modelValue","placeholder"])]),(a(!0),l(p,null,C(D.value,(m,k)=>(a(),l("div",{key:k,class:"mb-8 last:mb-0"},[s("h3",Q,n(k),1),s("div",W,[(a(!0),l(p,null,C(m,c=>(a(),l("button",{key:c.id,class:B(t(V)("group flex w-full items-center gap-3 rounded-lg border border-border bg-card px-4 py-3 text-left transition-all","hover:border-primary/30 hover:shadow-sm")),onClick:ot=>t(j).push(`/content/${c.id}`)},[s("div",{class:B(t(V)("flex size-8 shrink-0 items-center justify-center rounded-md",f(c.kind).color))},[(a(),L(N(f(c.kind).icon),{class:"size-4"}))],2),s("div",Y,[s("span",Z,n(c.id),1)]),s("div",tt,[d(t(g),{variant:"secondary",class:"text-[10px]"},{default:x(()=>[_(n(f(c.kind).label),1)]),_:2},1024),d(t(g),{variant:"outline",class:"text-[10px]"},{default:x(()=>[_(n(c.fields)+" "+n(t(e)["content.fields"]),1)]),_:2},1024),c.i18n?(a(),L(t(g),{key:0,variant:"outline",class:"text-[10px] text-status-info border-status-info/30"},{default:x(()=>[d(t(K),{class:"mr-0.5 size-3"}),_(" "+n(t(e)["content.i18n"]),1)]),_:1})):w("",!0)])],10,X))),128))])]))),128)),b.value.length===0&&u.value?(a(),l("div",et,n(t(e)["content.no-models-matching"])+n(u.value)+'" ',1)):w("",!0)],64))])])}}});export{pt as default};
|