@crewhaus/hangar-ui 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +309 -0
  2. package/assets/hangar.css +1726 -0
  3. package/assets/index.html +21 -0
  4. package/assets/js/api.js +368 -0
  5. package/assets/js/app.js +734 -0
  6. package/assets/js/dom.js +228 -0
  7. package/assets/js/keys.js +159 -0
  8. package/assets/js/markdown.js +131 -0
  9. package/assets/js/notify.js +152 -0
  10. package/assets/js/omnibox.js +307 -0
  11. package/assets/js/router.js +280 -0
  12. package/assets/js/routes.js +793 -0
  13. package/assets/js/shapes.js +36 -0
  14. package/assets/js/supervision.js +1334 -0
  15. package/assets/js/util.js +426 -0
  16. package/assets/js/views/activity.js +140 -0
  17. package/assets/js/views/approvals.js +155 -0
  18. package/assets/js/views/channels.js +455 -0
  19. package/assets/js/views/control.js +253 -0
  20. package/assets/js/views/costs.js +103 -0
  21. package/assets/js/views/creds.js +610 -0
  22. package/assets/js/views/data.js +456 -0
  23. package/assets/js/views/deploy.js +106 -0
  24. package/assets/js/views/evals-lab.js +1029 -0
  25. package/assets/js/views/evals.js +342 -0
  26. package/assets/js/views/feedback.js +555 -0
  27. package/assets/js/views/health.js +176 -0
  28. package/assets/js/views/inbox.js +103 -0
  29. package/assets/js/views/inspect.js +751 -0
  30. package/assets/js/views/jobs.js +110 -0
  31. package/assets/js/views/library.js +605 -0
  32. package/assets/js/views/memory-fabric.js +2026 -0
  33. package/assets/js/views/memory.js +228 -0
  34. package/assets/js/views/onboarding.js +253 -0
  35. package/assets/js/views/overview.js +196 -0
  36. package/assets/js/views/panes.js +132 -0
  37. package/assets/js/views/proc.js +280 -0
  38. package/assets/js/views/review.js +164 -0
  39. package/assets/js/views/runs.js +452 -0
  40. package/assets/js/views/runtime.js +450 -0
  41. package/assets/js/views/schedulers.js +133 -0
  42. package/assets/js/views/security.js +925 -0
  43. package/assets/js/views/sessions.js +265 -0
  44. package/assets/js/views/settings.js +489 -0
  45. package/assets/js/views/spec-edit.js +1289 -0
  46. package/assets/js/views/spec.js +66 -0
  47. package/assets/js/views/thredz.js +1853 -0
  48. package/assets/js/views/token.js +49 -0
  49. package/dist/index.d.ts +15 -0
  50. package/dist/index.js +145 -0
  51. package/package.json +36 -0
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Spec tab — read-only. The server masks credential-shaped values before
3
+ * the YAML ever reaches this client; this view renders the masked text in a
4
+ * line-numbered pane plus the env-ref presence checklist (KEY set/unset —
5
+ * names and booleans only, never values) and any parse issues.
6
+ */
7
+
8
+ import { api } from "../api.js";
9
+ import { clear, copyBtn, dot, el, emptyState, numberedCode, skeleton } from "../dom.js";
10
+
11
+ export async function renderSpec(root, ctx) {
12
+ clear(root).appendChild(skeleton(8));
13
+ const data = await api.spec(ctx.id);
14
+ clear(root);
15
+ if (data === null) {
16
+ root.appendChild(emptyState("No spec found here yet", "crewhaus init"));
17
+ return;
18
+ }
19
+ const yaml = typeof data.yaml === "string" ? data.yaml : "";
20
+ const issues = Array.isArray(data.issues) ? data.issues : [];
21
+ const envRefs = Array.isArray(data.envRefs) ? data.envRefs : [];
22
+
23
+ const side = el("aside", { class: "spec-side" });
24
+ side.appendChild(el("h3", { class: "card-title", text: "Env refs" }));
25
+ if (envRefs.length === 0) {
26
+ side.appendChild(el("p", { class: "muted", text: "No $ENV references in this spec." }));
27
+ } else {
28
+ side.appendChild(
29
+ el(
30
+ "ul",
31
+ { class: "check-list" },
32
+ envRefs.map((ref) =>
33
+ el("li", null, [
34
+ dot(ref.set === true ? "ok" : "bad", ref.set === true ? "set" : "unset"),
35
+ el("code", { text: String(ref.key ?? "") }),
36
+ ]),
37
+ ),
38
+ ),
39
+ );
40
+ }
41
+ if (issues.length > 0) {
42
+ side.appendChild(el("h3", { class: "card-title", text: "Parse issues" }));
43
+ side.appendChild(
44
+ el(
45
+ "ul",
46
+ { class: "issue-list" },
47
+ issues.map((i) =>
48
+ el("li", null, [dot("warn", typeof i === "string" ? i : String(i.message ?? "issue"))]),
49
+ ),
50
+ ),
51
+ );
52
+ }
53
+
54
+ const pane = el("div", { class: "spec-pane" });
55
+ pane.appendChild(
56
+ el("div", { class: "spec-head" }, [
57
+ el("span", { class: "muted", text: "crewhaus.yaml (values masked server-side)" }),
58
+ copyBtn(yaml, "copy yaml"),
59
+ ]),
60
+ );
61
+ pane.appendChild(
62
+ yaml === "" ? emptyState("Spec is empty", "crewhaus init") : numberedCode(yaml, "spec yaml"),
63
+ );
64
+
65
+ root.appendChild(el("div", { class: "spec-layout" }, [pane, side]));
66
+ }