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.
Files changed (109) hide show
  1. package/README.md +112 -34
  2. package/dist/{activity-CbkxcfDf.mjs → activity-B8j9gfsK.mjs} +3 -3
  3. package/dist/{branches-D2UWex1N.mjs → branches-CvpFbyrJ.mjs} +3 -3
  4. package/dist/{cdn-build-BzC2QPNi.mjs → cdn-build-DS9FprWU.mjs} +3 -3
  5. package/dist/{cdn-init-CsmqJIaQ.mjs → cdn-init-Bm4dpEJn.mjs} +3 -3
  6. package/dist/{connect-DJo9PSiw.mjs → connect-Bb0BrZsx.mjs} +3 -3
  7. package/dist/describe-DJ5H9Cxm.mjs +106 -0
  8. package/dist/describe-format-CUAqB0C4.mjs +50 -0
  9. package/dist/{diff--halNUpG.mjs → diff-ov1j9bAb.mjs} +67 -59
  10. package/dist/doctor-MOf_LQEL.mjs +95 -0
  11. package/dist/{generate-DrUojrk8.mjs → generate-ByscV5SN.mjs} +26 -9
  12. package/dist/index.mjs +50 -12
  13. package/dist/{init-CqoDCSV5.mjs → init-540qiNQJ.mjs} +6 -6
  14. package/dist/{login-DCXkOrQV.mjs → login-xvzL-UvR.mjs} +3 -3
  15. package/dist/{logout-nPt2UAeQ.mjs → logout-DzspSatR.mjs} +2 -2
  16. package/dist/mcp-client-DVWTex2i.mjs +44 -0
  17. package/dist/merge-DdPRttF-.mjs +82 -0
  18. package/dist/{resolve-context-Cg6JoVZt.mjs → resolve-context-hKVYPniC.mjs} +1 -1
  19. package/dist/scaffold-iuvrMh78.mjs +115 -0
  20. package/dist/{serve-CNeFIQ1i.mjs → serve-CxA2pKbp.mjs} +58 -5
  21. 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
  22. package/dist/serve-ui/assets/AppLayout-B-fbrfMk.js +21 -0
  23. package/dist/serve-ui/assets/BranchDetailPage-B3PL9PGp.js +17 -0
  24. package/dist/serve-ui/assets/{BranchesPage-CSwikNkd.js → BranchesPage-4YpE_szf.js} +2 -2
  25. package/dist/serve-ui/assets/CardContent.vue_vue_type_script_setup_true_lang-D1L2MnBU.js +1 -0
  26. package/dist/serve-ui/assets/CollapsibleTrigger.vue_vue_type_script_setup_true_lang-B4uDtllm.js +1 -0
  27. package/dist/serve-ui/assets/{Collection-DTB4xCCE.js → Collection-9URFko-Y.js} +2 -2
  28. package/dist/serve-ui/assets/ConfigProvider-CwkmRpT5.js +1 -0
  29. package/dist/serve-ui/assets/{ContentListPage-DF-LjAaS.js → ContentListPage-BMfSfg8x.js} +2 -2
  30. package/dist/serve-ui/assets/ContentPage-BXUnNJlB.js +1 -0
  31. package/dist/serve-ui/assets/DashboardPage-1UyYgg5J.js +21 -0
  32. 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
  33. package/dist/serve-ui/assets/DoctorPage-WnQ8xYWy.js +1 -0
  34. package/dist/serve-ui/assets/FormatReferencePage-DoKEaawl.js +1 -0
  35. 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
  36. package/dist/serve-ui/assets/{ModelDetailPage-_TIV9itx.js → ModelDetailPage-BysqN8IL.js} +3 -3
  37. package/dist/serve-ui/assets/ModelsPage-DFZrdBIi.js +1 -0
  38. package/dist/serve-ui/assets/{NormalizePage-Cde8vdk2.js → NormalizePage-4f5Ib_ES.js} +2 -2
  39. 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
  40. package/dist/serve-ui/assets/Presence-CA3xTrht.js +3 -0
  41. 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
  42. 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
  43. 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
  44. package/dist/serve-ui/assets/ValidatePage-BMTpV2KL.js +16 -0
  45. package/dist/serve-ui/assets/{arrow-down-BAJwpryD.js → arrow-down-IJu6H7Es.js} +1 -1
  46. package/dist/serve-ui/assets/{arrow-left-DANf_wrK.js → arrow-left-D8ZjVYAI.js} +1 -1
  47. package/dist/serve-ui/assets/{book-marked-DS8FXgjz.js → book-marked-BNyyZrq3.js} +1 -1
  48. package/dist/serve-ui/assets/{book-open-DnH5T78M.js → book-open-Dw1fQtSI.js} +1 -1
  49. package/dist/serve-ui/assets/{box-UJk5SvJJ.js → box-BoGMZDZR.js} +1 -1
  50. package/dist/serve-ui/assets/{chevron-down-C1nYx5Eu.js → chevron-down-UcXxhyyY.js} +1 -1
  51. package/dist/serve-ui/assets/{chevron-right-XnJVrezx.js → chevron-right-SpdM5LBc.js} +1 -1
  52. package/dist/serve-ui/assets/circle-alert-CEwKJpYl.js +6 -0
  53. package/dist/serve-ui/assets/{content-Ctqretwl.js → content-BQEzysvq.js} +1 -1
  54. package/dist/serve-ui/assets/{database-Wd_i2bM1.js → database-U6JU8oc9.js} +1 -1
  55. package/dist/serve-ui/assets/{file-code-ScWZN40B.js → file-code-_sq1QHQo.js} +1 -1
  56. package/dist/serve-ui/assets/{file-text-J3Wzwieh.js → file-text-BiMGJckO.js} +1 -1
  57. package/dist/serve-ui/assets/{git-branch-DqEFTZDt.js → git-branch-CdZMOuSP.js} +1 -1
  58. package/dist/serve-ui/assets/{git-merge-Bmz-MVBm.js → git-merge-D8Y-BwIh.js} +1 -1
  59. package/dist/serve-ui/assets/{hash-pCwLSzjB.js → hash-CrXakbCy.js} +1 -1
  60. package/dist/serve-ui/assets/index-DL_dw3XX.js +80 -0
  61. package/dist/serve-ui/assets/index-KZ2rT4mJ.css +1 -0
  62. package/dist/serve-ui/assets/{languages-CQqNMim-.js → languages-DvyMGPwy.js} +1 -1
  63. package/dist/serve-ui/assets/{plus-Cw1OnTR2.js → plus-Ddujj7Qx.js} +1 -1
  64. package/dist/serve-ui/assets/project-Dg2BVay_.js +1 -0
  65. package/dist/serve-ui/assets/{scan-search-UJ-_oiOR.js → scan-search-CsPYGmEs.js} +1 -1
  66. package/dist/serve-ui/assets/{settings-Dnm4yTIj.js → settings-IQvevsKM.js} +1 -1
  67. package/dist/serve-ui/assets/{shield-check-B67ELGUT.js → shield-check-BmSBU8Ai.js} +1 -1
  68. package/dist/serve-ui/assets/stethoscope-DgCa_7BL.js +6 -0
  69. package/dist/serve-ui/assets/{trash-2-B1QgZW1G.js → trash-2-CNTkluuz.js} +1 -1
  70. package/dist/serve-ui/assets/useDirection-DfPL7a9d.js +1 -0
  71. package/dist/serve-ui/assets/{useId-CPFWZ4Bo.js → useId-B-RTM02R.js} +1 -1
  72. package/dist/serve-ui/assets/{useNonce-BffIzuhE.js → useNonce-DR6M3tLq.js} +1 -1
  73. package/dist/serve-ui/assets/useWatch-D4Y-epQR.js +1 -0
  74. package/dist/serve-ui/index.html +2 -2
  75. package/dist/{server-DTdmutjb.mjs → server-B1PSjXbu.mjs} +313 -112
  76. package/dist/{setup-Y1LFQ9rZ.mjs → setup-BMqKibZt.mjs} +3 -3
  77. package/dist/{skills-Cp8KF1af.mjs → skills-CZ54F-97.mjs} +3 -3
  78. package/dist/{status-Cyv-jo1y.mjs → status-BJ6Lu3J4.mjs} +3 -3
  79. package/dist/{status-CoHgz6HN.mjs → status-Bmjfrk-B.mjs} +24 -11
  80. package/dist/studio-DPVJ-2oG.mjs +24 -0
  81. package/dist/{submissions-bIG-MWvv.mjs → submissions-zH_S7JIQ.mjs} +3 -3
  82. package/dist/{usage-B2xuc2DT.mjs → usage-z6eyT64a.mjs} +3 -3
  83. package/dist/{validate-B10L7RL7.mjs → validate-BG0X5g09.mjs} +102 -4
  84. package/dist/{webhooks-Dq3zFLP7.mjs → webhooks-CBG2Bs9P.mjs} +3 -3
  85. package/dist/{whoami-Ub5RznbU.mjs → whoami-CXVfvo7x.mjs} +2 -2
  86. package/package.json +7 -6
  87. package/dist/doctor-DyKjAIKH.mjs +0 -187
  88. package/dist/serve-ui/assets/AppLayout-C91DN08z.js +0 -21
  89. package/dist/serve-ui/assets/BranchDetailPage-BokOnhE7.js +0 -17
  90. package/dist/serve-ui/assets/CollapsibleTrigger.vue_vue_type_script_setup_true_lang-BRzXVXDG.js +0 -1
  91. package/dist/serve-ui/assets/ConfigProvider-Dvd7YoEV.js +0 -1
  92. package/dist/serve-ui/assets/ContentPage-BABg8pgn.js +0 -1
  93. package/dist/serve-ui/assets/DashboardPage-BFLFEJNZ.js +0 -21
  94. package/dist/serve-ui/assets/ModelsPage-DrQemHQ-.js +0 -1
  95. package/dist/serve-ui/assets/Presence-BXKCIfUk.js +0 -3
  96. package/dist/serve-ui/assets/ValidatePage-DRFAySNR.js +0 -21
  97. package/dist/serve-ui/assets/index-CG5NtNtt.css +0 -1
  98. package/dist/serve-ui/assets/index-De_z0714.js +0 -1
  99. package/dist/serve-ui/assets/index-RDdffBTh.js +0 -80
  100. package/dist/serve-ui/assets/project-BlZcHJw6.js +0 -1
  101. package/dist/serve-ui/assets/useDirection-B4S5kPsI.js +0 -1
  102. package/dist/serve-ui/assets/useWatch-B2FLRWr8.js +0 -1
  103. package/dist/studio-CJUGiIMd.mjs +0 -24
  104. package/dist/{client-C400qHcL.mjs → client-C9E9D4mb.mjs} +1 -1
  105. package/dist/{context-An3xrvcP.mjs → context-OskMGy8y.mjs} +1 -1
  106. package/dist/{demo-DcBt6fw8.mjs → demo-BOUcAoFZ.mjs} +3 -3
  107. package/dist/{ide-_C2gUPbQ.mjs → ide-DPDVYiaq.mjs} +1 -1
  108. package/dist/{oauth-server-Beppljfz.mjs → oauth-server-smSxDoH5.mjs} +1 -1
  109. /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-B5mXontH.mjs";
2
- import { n as resolveStudioClient } from "./client-C400qHcL.mjs";
3
- import { t as resolveStudioContext } from "./resolve-context-Cg6JoVZt.mjs";
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-B5mXontH.mjs";
2
- import { n as resolveStudioClient } from "./client-C400qHcL.mjs";
3
- import { t as resolveStudioContext } from "./resolve-context-Cg6JoVZt.mjs";
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 { n as requireInitialized, r as resolveProjectRoot, t as loadProjectContext } from "./context-An3xrvcP.mjs";
2
- import { a as severityColor, i as pc, t as formatCount } from "./ui-B5mXontH.mjs";
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 tx = await createTransaction(projectRoot, buildBranchName("fix", "validate"));
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-B5mXontH.mjs";
2
- import { n as resolveStudioClient } from "./client-C400qHcL.mjs";
3
- import { t as resolveStudioContext } from "./resolve-context-Cg6JoVZt.mjs";
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-B5mXontH.mjs";
2
- import { i as checkPermissions, n as resolveStudioClient, r as AuthExpiredError } from "./client-C400qHcL.mjs";
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.4.4",
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
- "@contentrain/rules": "0.3.3",
50
- "@contentrain/skills": "0.3.0",
51
- "@contentrain/mcp": "1.2.1",
52
- "@contentrain/query": "5.1.4",
53
- "@contentrain/types": "0.4.2"
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",
@@ -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};
@@ -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};