@elizaos/app-core 2.0.0-alpha.54 → 2.0.0-alpha.56

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 (41) hide show
  1. package/.turbo/turbo-build.log +0 -1
  2. package/dist/components/AdvancedPageView.d.ts.map +1 -1
  3. package/dist/components/AdvancedPageView.js +20 -1
  4. package/dist/components/CustomActionsView.d.ts.map +1 -1
  5. package/dist/components/CustomActionsView.js +1 -1
  6. package/dist/components/OnboardingWizard.d.ts.map +1 -1
  7. package/dist/components/OnboardingWizard.js +5 -1
  8. package/dist/components/RuntimeView.js +1 -1
  9. package/dist/components/SecurityPageView.d.ts +2 -0
  10. package/dist/components/SecurityPageView.d.ts.map +1 -0
  11. package/dist/components/SecurityPageView.js +81 -0
  12. package/dist/components/StreamView.js +1 -1
  13. package/dist/components/TrajectoriesView.js +1 -1
  14. package/dist/components/index.d.ts +1 -0
  15. package/dist/components/index.d.ts.map +1 -1
  16. package/dist/components/index.js +1 -0
  17. package/dist/config/config-field.js +1 -1
  18. package/dist/config/config-renderer.js +1 -1
  19. package/dist/i18n/locales/en.json +1193 -1193
  20. package/dist/i18n/locales/es.json +1193 -1193
  21. package/dist/i18n/locales/ko.json +1193 -1193
  22. package/dist/i18n/locales/pt.json +1193 -1193
  23. package/dist/i18n/locales/zh-CN.json +1193 -1193
  24. package/dist/package.json +187 -0
  25. package/dist/styles/anime.css +6324 -0
  26. package/dist/styles/base.css +204 -0
  27. package/dist/styles/onboarding-game.css +738 -0
  28. package/dist/styles/styles.css +2087 -0
  29. package/dist/styles/xterm.css +241 -0
  30. package/package.json +4 -4
  31. package/src/ambient.d.ts +1 -0
  32. package/src/components/AdvancedPageView.tsx +21 -1
  33. package/src/components/CustomActionsView.tsx +4 -1
  34. package/src/components/OnboardingWizard.tsx +24 -9
  35. package/src/components/RuntimeView.tsx +1 -1
  36. package/src/components/SecurityPageView.tsx +235 -0
  37. package/src/components/StreamView.tsx +1 -1
  38. package/src/components/TrajectoriesView.tsx +1 -1
  39. package/src/components/index.ts +1 -0
  40. package/src/config/config-field.tsx +1 -1
  41. package/src/config/config-renderer.tsx +1 -1
@@ -1,3 +1,2 @@
1
1
  $ bun run build:dist
2
2
  $ test -f ../ui/dist/index.d.ts || (cd ../ui && bun run build) && rm -rf dist && tsc -p tsconfig.build.json && node ../../scripts/copy-package-assets.mjs packages/app-core src/styles src/i18n/locales && node ../../scripts/prepare-package-dist.mjs packages/app-core
3
- src/components/StreamView.tsx(16,29): error TS2307: Cannot find module '@elizaos/app-core/config/branding' or its corresponding type declarations.
@@ -1 +1 @@
1
- {"version":3,"file":"AdvancedPageView.d.ts","sourceRoot":"","sources":["../../src/components/AdvancedPageView.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAqOH,wBAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,2CAwHvE"}
1
+ {"version":3,"file":"AdvancedPageView.d.ts","sourceRoot":"","sources":["../../src/components/AdvancedPageView.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAqPH,wBAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,2CA4HvE"}
@@ -18,9 +18,15 @@ import { useState } from "react";
18
18
  import { CustomActionsView } from "./CustomActionsView";
19
19
  import { FineTuningView } from "./FineTuningView";
20
20
  import { LifoSandboxView } from "./LifoSandboxView";
21
+ import { SecurityPageView } from "./SecurityPageView";
21
22
  import { TrajectoriesView } from "./TrajectoriesView";
22
23
  import { TrajectoryDetailView } from "./TrajectoryDetailView";
23
24
  const SUB_TABS = [
25
+ {
26
+ id: "actions",
27
+ label: "Actions",
28
+ description: "Custom agent commands and workflows",
29
+ },
24
30
  { id: "plugins", label: "Plugins", description: "Features and connectors" },
25
31
  { id: "skills", label: "Skills", description: "Custom agent skills" },
26
32
  // {
@@ -49,6 +55,11 @@ const SUB_TABS = [
49
55
  // description: "Browser-native shell sandbox and file explorer",
50
56
  // },
51
57
  { id: "logs", label: "Logs", description: "Runtime and service logs" },
58
+ {
59
+ id: "security",
60
+ label: "Security",
61
+ description: "Audit trail for privileged runtime activity",
62
+ },
52
63
  ];
53
64
  const MODAL_SUB_TABS = SUB_TABS.filter((t) => t.id !== "plugins" && t.id !== "skills");
54
65
  const SUBTAB_ICONS = {
@@ -63,6 +74,8 @@ const SUBTAB_ICONS = {
63
74
  };
64
75
  function mapTabToSubTab(tab) {
65
76
  switch (tab) {
77
+ case "actions":
78
+ return "actions";
66
79
  case "plugins":
67
80
  return "plugins";
68
81
  case "skills":
@@ -79,6 +92,8 @@ function mapTabToSubTab(tab) {
79
92
  return "lifo";
80
93
  case "logs":
81
94
  return "logs";
95
+ case "security":
96
+ return "security";
82
97
  default:
83
98
  return "plugins";
84
99
  }
@@ -94,6 +109,8 @@ export function AdvancedPageView({ inModal } = {}) {
94
109
  };
95
110
  const renderContent = () => {
96
111
  switch (currentSubTab) {
112
+ case "actions":
113
+ return _jsx(CustomActionsView, {});
97
114
  case "plugins":
98
115
  return _jsx(PluginsPageView, {});
99
116
  case "skills":
@@ -113,8 +130,10 @@ export function AdvancedPageView({ inModal } = {}) {
113
130
  return _jsx(LifoSandboxView, {});
114
131
  case "logs":
115
132
  return _jsx(LogsPageView, {});
133
+ case "security":
134
+ return _jsx(SecurityPageView, {});
116
135
  default:
117
- return inModal ? _jsx(CustomActionsView, {}) : _jsx(PluginsPageView, {});
136
+ return _jsx(PluginsPageView, {});
118
137
  }
119
138
  };
120
139
  return (_jsxs("div", { className: inModal ? "settings-modal-layout" : "flex flex-col h-full min-h-0", children: [inModal ? (_jsx("nav", { className: "settings-icon-sidebar", children: tabs.map((subTab) => (_jsxs("button", { type: "button", className: `advanced-subtab-btn settings-icon-btn ${currentSubTab === subTab.id ? "is-active" : ""}`, onClick: () => handleSubTabChange(subTab.id), title: subTab.description, children: [SUBTAB_ICONS[subTab.id], _jsx("span", { className: "settings-icon-label", children: subTab.label })] }, subTab.id))) })) : (_jsx("div", { className: "mb-4 shrink-0", children: _jsx("div", { className: "flex gap-1 border-b border-border", children: tabs.map((subTab) => {
@@ -1 +1 @@
1
- {"version":3,"file":"CustomActionsView.d.ts","sourceRoot":"","sources":["../../src/components/CustomActionsView.tsx"],"names":[],"mappings":"AAUA,wBAAgB,iBAAiB,4CAuThC"}
1
+ {"version":3,"file":"CustomActionsView.d.ts","sourceRoot":"","sources":["../../src/components/CustomActionsView.tsx"],"names":[],"mappings":"AAUA,wBAAgB,iBAAiB,4CA0ThC"}
@@ -128,7 +128,7 @@ export function CustomActionsView() {
128
128
  if (loading) {
129
129
  return (_jsx("div", { className: "flex items-center justify-center h-full", children: _jsx("div", { className: "text-muted", children: t("customactionsview.LoadingActions") }) }));
130
130
  }
131
- return (_jsxs("div", { className: "flex flex-col h-full p-4 space-y-4", children: [_jsx("div", { className: "flex items-center justify-between", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("label", { className: "px-3 py-1.5 text-sm border border-border bg-surface text-muted rounded cursor-pointer hover:bg-card transition-colors", children: [t("knowledgeview.Import"), _jsx("input", { type: "file", accept: "application/json", onChange: handleImport, className: "hidden" })] }), _jsx(Button, { variant: "outline", size: "sm", onClick: handleExport, disabled: actions.length === 0, className: "px-3 py-1.5 h-8 text-sm text-muted bg-surface hover:bg-card shadow-sm disabled:opacity-50", children: t("customactionsview.Export") }), _jsx(Button, { variant: "default", size: "sm", onClick: handleCreate, className: "px-3 py-1.5 h-8 text-sm shadow-sm font-medium tracking-wide", children: t("customactionsview.CreateAction") })] }) }), _jsx("div", { className: "flex items-center", children: _jsx(Input, { type: "text", placeholder: t("customactionsview.SearchActionsByNa"), value: search, onChange: (e) => setSearch(e.target.value), className: "flex-1 px-3 py-2 h-9 text-sm bg-surface text-txt shadow-sm" }) }), filteredActions.length === 0 ? (_jsxs("div", { className: "flex flex-col items-center justify-center flex-1 space-y-4", children: [_jsx("p", { className: "text-muted text-center", children: search
131
+ return (_jsxs("div", { "data-testid": "custom-actions-view", className: "flex flex-col h-full p-4 space-y-4", children: [_jsx("div", { className: "flex items-center justify-between", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("label", { className: "px-3 py-1.5 text-sm border border-border bg-surface text-muted rounded cursor-pointer hover:bg-card transition-colors", children: [t("knowledgeview.Import"), _jsx("input", { type: "file", accept: "application/json", onChange: handleImport, className: "hidden" })] }), _jsx(Button, { variant: "outline", size: "sm", onClick: handleExport, disabled: actions.length === 0, className: "px-3 py-1.5 h-8 text-sm text-muted bg-surface hover:bg-card shadow-sm disabled:opacity-50", children: t("customactionsview.Export") }), _jsx(Button, { variant: "default", size: "sm", onClick: handleCreate, className: "px-3 py-1.5 h-8 text-sm shadow-sm font-medium tracking-wide", children: t("customactionsview.CreateAction") })] }) }), _jsx("div", { className: "flex items-center", children: _jsx(Input, { type: "text", placeholder: t("customactionsview.SearchActionsByNa"), value: search, onChange: (e) => setSearch(e.target.value), className: "flex-1 px-3 py-2 h-9 text-sm bg-surface text-txt shadow-sm" }) }), filteredActions.length === 0 ? (_jsxs("div", { className: "flex flex-col items-center justify-center flex-1 space-y-4", children: [_jsx("p", { className: "text-muted text-center", children: search
132
132
  ? "No actions match your search."
133
133
  : "No custom actions yet. Create one to get started." }), !search && (_jsx(Button, { variant: "default", size: "sm", onClick: handleCreate, className: "px-4 py-2 text-sm shadow-sm font-medium tracking-wide", children: t("customactionsview.CreateAction") }))] })) : (_jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-3 overflow-auto", children: filteredActions.map((action) => (_jsxs("div", { className: "border border-border bg-card rounded p-4 space-y-3 cursor-pointer hover:border-accent/50 transition-colors", children: [_jsxs("button", { type: "button", className: "w-full bg-transparent border-0 p-0 m-0 text-left cursor-pointer", onClick: () => handleEdit(action), children: [_jsxs("div", { className: "flex items-start justify-between gap-2", children: [_jsx("h3", { className: "font-bold text-sm text-txt flex-1 break-words", children: action.name }), _jsx("span", { className: `px-2 py-0.5 text-xs rounded ${getBadgeColor(action.handler.type)}`, children: action.handler.type })] }), action.description && (_jsx("p", { className: "text-xs text-muted line-clamp-3", children: action.description })), _jsxs("p", { className: "text-xs text-muted", children: [action.parameters?.length || 0, " ", t("customactionsview.parameter"), action.parameters?.length === 1 ? "" : "s"] })] }), _jsxs("div", { className: "flex items-center justify-between pt-2 border-t border-border", children: [_jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [_jsx("input", { type: "checkbox", checked: action.enabled, onChange: (e) => handleToggleEnabled(action.id, e.target.checked), className: "cursor-pointer" }), _jsx("span", { className: "text-xs text-muted", children: t("customactionsview.Enabled") })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { variant: "outline", size: "sm", onClick: () => handleEdit(action), className: "px-2 py-1 h-6 text-xs bg-surface text-muted hover:bg-card shadow-sm", children: t("triggersview.Edit") }), _jsx(Button, { variant: "outline", size: "sm", onClick: () => handleDelete(action.id, action.name), className: "px-2 py-1 h-6 text-xs bg-surface text-danger border-danger/20 hover:bg-danger/10 shadow-sm", children: t("triggersview.Delete") })] })] })] }, action.id))) })), editorOpen && (_jsx(CustomActionEditor, { open: editorOpen, action: editingAction, onClose: handleEditorClose, onSave: handleEditorSave }))] }));
134
134
  }
@@ -1 +1 @@
1
- {"version":3,"file":"OnboardingWizard.d.ts","sourceRoot":"","sources":["../../src/components/OnboardingWizard.tsx"],"names":[],"mappings":"AAoBA,wBAAgB,gBAAgB,4CAyL/B"}
1
+ {"version":3,"file":"OnboardingWizard.d.ts","sourceRoot":"","sources":["../../src/components/OnboardingWizard.tsx"],"names":[],"mappings":"AAwBA,wBAAgB,gBAAgB,4CAoM/B"}
@@ -12,6 +12,8 @@ import { OnboardingPanel } from "./onboarding/OnboardingPanel";
12
12
  import { OnboardingStepNav } from "./onboarding/OnboardingStepNav";
13
13
  import { PermissionsStep } from "./onboarding/PermissionsStep";
14
14
  import { RpcStep } from "./onboarding/RpcStep";
15
+ const DISABLE_ONBOARDING_VRM = String(import.meta.env.VITE_E2E_DISABLE_VRM ?? "").toLowerCase() === "true" ||
16
+ String(import.meta.env.VITE_E2E_DISABLE_VRM ?? "") === "1";
15
17
  export function OnboardingWizard() {
16
18
  const { onboardingStep, selectedVrmIndex, customVrmUrl, uiLanguage, uiTheme, setState, t, } = useApp();
17
19
  const setUiLanguage = (lang) => setState("uiLanguage", normalizeLanguage(lang));
@@ -48,7 +50,9 @@ export function OnboardingWizard() {
48
50
  return null;
49
51
  }
50
52
  }
51
- return (_jsxs("div", { className: "onboarding-screen", children: [_jsx("div", { className: "onboarding-bg" }), !isCharacterSelect && _jsx("div", { className: "onboarding-bg-overlay" }), _jsx(VrmStage, { vrmPath: vrmPath, worldUrl: worldUrl, fallbackPreviewUrl: fallbackPreview, cameraProfile: "companion_close", initialCompanionZoomNormalized: 1, t: t }), _jsxs("svg", { className: "onboarding-corner onboarding-corner--tl", viewBox: "0 0 36 36", fill: "none", stroke: "rgba(240,185,11,0.18)", strokeWidth: "1", "aria-hidden": "true", children: [_jsx("path", { d: "M0 18 L0 0 L18 0" }), _jsx("circle", { cx: "0", cy: "0", r: "2", fill: "rgba(240,185,11,0.25)", stroke: "none" })] }), _jsxs("svg", { className: "onboarding-corner onboarding-corner--tr", viewBox: "0 0 36 36", fill: "none", stroke: "rgba(240,185,11,0.18)", strokeWidth: "1", "aria-hidden": "true", children: [_jsx("path", { d: "M0 18 L0 0 L18 0" }), _jsx("circle", { cx: "0", cy: "0", r: "2", fill: "rgba(240,185,11,0.25)", stroke: "none" })] }), _jsxs("svg", { className: "onboarding-corner onboarding-corner--bl", viewBox: "0 0 36 36", fill: "none", stroke: "rgba(240,185,11,0.18)", strokeWidth: "1", "aria-hidden": "true", children: [_jsx("path", { d: "M0 18 L0 0 L18 0" }), _jsx("circle", { cx: "0", cy: "0", r: "2", fill: "rgba(240,185,11,0.25)", stroke: "none" })] }), _jsxs("svg", { className: "onboarding-corner onboarding-corner--br", viewBox: "0 0 36 36", fill: "none", stroke: "rgba(240,185,11,0.18)", strokeWidth: "1", "aria-hidden": "true", children: [_jsx("path", { d: "M0 18 L0 0 L18 0" }), _jsx("circle", { cx: "0", cy: "0", r: "2", fill: "rgba(240,185,11,0.25)", stroke: "none" })] }), _jsx("div", { style: {
53
+ return (_jsxs("div", { className: "onboarding-screen", children: [_jsx("div", { className: "onboarding-bg" }), !isCharacterSelect && _jsx("div", { className: "onboarding-bg-overlay" }), DISABLE_ONBOARDING_VRM ? (_jsx("div", { "aria-hidden": "true", className: "absolute inset-0 z-10 pointer-events-none", style: {
54
+ background: "radial-gradient(circle at 50% 25%, rgba(255,255,255,0.16), transparent 34%), linear-gradient(180deg, rgba(17,17,17,0.08), rgba(10,10,10,0.36))",
55
+ } })) : (_jsx(VrmStage, { vrmPath: vrmPath, worldUrl: worldUrl, fallbackPreviewUrl: fallbackPreview, cameraProfile: "companion_close", initialCompanionZoomNormalized: 1, t: t })), _jsxs("svg", { className: "onboarding-corner onboarding-corner--tl", viewBox: "0 0 36 36", fill: "none", stroke: "rgba(240,185,11,0.18)", strokeWidth: "1", "aria-hidden": "true", children: [_jsx("path", { d: "M0 18 L0 0 L18 0" }), _jsx("circle", { cx: "0", cy: "0", r: "2", fill: "rgba(240,185,11,0.25)", stroke: "none" })] }), _jsxs("svg", { className: "onboarding-corner onboarding-corner--tr", viewBox: "0 0 36 36", fill: "none", stroke: "rgba(240,185,11,0.18)", strokeWidth: "1", "aria-hidden": "true", children: [_jsx("path", { d: "M0 18 L0 0 L18 0" }), _jsx("circle", { cx: "0", cy: "0", r: "2", fill: "rgba(240,185,11,0.25)", stroke: "none" })] }), _jsxs("svg", { className: "onboarding-corner onboarding-corner--bl", viewBox: "0 0 36 36", fill: "none", stroke: "rgba(240,185,11,0.18)", strokeWidth: "1", "aria-hidden": "true", children: [_jsx("path", { d: "M0 18 L0 0 L18 0" }), _jsx("circle", { cx: "0", cy: "0", r: "2", fill: "rgba(240,185,11,0.25)", stroke: "none" })] }), _jsxs("svg", { className: "onboarding-corner onboarding-corner--br", viewBox: "0 0 36 36", fill: "none", stroke: "rgba(240,185,11,0.18)", strokeWidth: "1", "aria-hidden": "true", children: [_jsx("path", { d: "M0 18 L0 0 L18 0" }), _jsx("circle", { cx: "0", cy: "0", r: "2", fill: "rgba(240,185,11,0.25)", stroke: "none" })] }), _jsx("div", { style: {
52
56
  position: "absolute",
53
57
  top: "1rem",
54
58
  right: "1rem",
@@ -152,7 +152,7 @@ export function RuntimeView() {
152
152
  return next;
153
153
  });
154
154
  }, []);
155
- return (_jsxs("div", { className: "flex flex-col gap-4 h-full", children: [_jsxs("div", { className: "flex flex-wrap items-end gap-3 border border-[var(--border)] bg-[var(--card)] rounded-md p-3", children: [_jsxs("label", { className: "text-[11px] text-[var(--muted)] flex items-center gap-1", children: [t("runtimeview.depth"), _jsx("input", { type: "number", min: 1, max: 24, value: depth, onChange: (e) => setDepth(Math.max(1, Math.min(24, Number(e.target.value) || 1))), className: "w-16 px-1.5 py-0.5 border border-[var(--border)] bg-[var(--bg)] text-[var(--txt)] rounded-sm" })] }), _jsxs("label", { className: "text-[11px] text-[var(--muted)] flex items-center gap-1", children: [t("runtimeview.arrayCap"), _jsx("input", { type: "number", min: 1, max: 5000, value: maxArrayLength, onChange: (e) => setMaxArrayLength(Math.max(1, Math.min(5000, Number(e.target.value) || 1))), className: "w-20 px-1.5 py-0.5 border border-[var(--border)] bg-[var(--bg)] text-[var(--txt)] rounded-sm" })] }), _jsxs("label", { className: "text-[11px] text-[var(--muted)] flex items-center gap-1", children: [t("runtimeview.objectCap"), _jsx("input", { type: "number", min: 1, max: 5000, value: maxObjectEntries, onChange: (e) => setMaxObjectEntries(Math.max(1, Math.min(5000, Number(e.target.value) || 1))), className: "w-20 px-1.5 py-0.5 border border-[var(--border)] bg-[var(--bg)] text-[var(--txt)] rounded-sm" })] }), _jsx("button", { type: "button", onClick: () => void loadSnapshot(), disabled: loading, className: "px-3 py-1.5 text-xs rounded border border-[var(--border)] bg-[var(--bg)] hover:bg-[var(--bg-hover)] disabled:opacity-60", children: loading ? "Refreshing..." : "Refresh" }), _jsx("button", { type: "button", onClick: () => setExpandedPaths(new Set([rootPath])), className: "px-3 py-1.5 text-xs rounded border border-[var(--border)] bg-[var(--bg)] hover:bg-[var(--bg-hover)]", children: t("runtimeview.Collapse") }), _jsx("button", { type: "button", onClick: () => setExpandedPaths(buildInitialExpanded(rootPath, sectionData)), className: "px-3 py-1.5 text-xs rounded border border-[var(--border)] bg-[var(--bg)] hover:bg-[var(--bg-hover)]", children: t("runtimeview.ExpandTop") }), _jsx("div", { className: "text-[11px] text-[var(--muted)] ml-auto", children: snapshot
155
+ return (_jsxs("div", { "data-testid": "runtime-view", className: "flex flex-col gap-4 h-full", children: [_jsxs("div", { className: "flex flex-wrap items-end gap-3 border border-[var(--border)] bg-[var(--card)] rounded-md p-3", children: [_jsxs("label", { className: "text-[11px] text-[var(--muted)] flex items-center gap-1", children: [t("runtimeview.depth"), _jsx("input", { type: "number", min: 1, max: 24, value: depth, onChange: (e) => setDepth(Math.max(1, Math.min(24, Number(e.target.value) || 1))), className: "w-16 px-1.5 py-0.5 border border-[var(--border)] bg-[var(--bg)] text-[var(--txt)] rounded-sm" })] }), _jsxs("label", { className: "text-[11px] text-[var(--muted)] flex items-center gap-1", children: [t("runtimeview.arrayCap"), _jsx("input", { type: "number", min: 1, max: 5000, value: maxArrayLength, onChange: (e) => setMaxArrayLength(Math.max(1, Math.min(5000, Number(e.target.value) || 1))), className: "w-20 px-1.5 py-0.5 border border-[var(--border)] bg-[var(--bg)] text-[var(--txt)] rounded-sm" })] }), _jsxs("label", { className: "text-[11px] text-[var(--muted)] flex items-center gap-1", children: [t("runtimeview.objectCap"), _jsx("input", { type: "number", min: 1, max: 5000, value: maxObjectEntries, onChange: (e) => setMaxObjectEntries(Math.max(1, Math.min(5000, Number(e.target.value) || 1))), className: "w-20 px-1.5 py-0.5 border border-[var(--border)] bg-[var(--bg)] text-[var(--txt)] rounded-sm" })] }), _jsx("button", { type: "button", onClick: () => void loadSnapshot(), disabled: loading, className: "px-3 py-1.5 text-xs rounded border border-[var(--border)] bg-[var(--bg)] hover:bg-[var(--bg-hover)] disabled:opacity-60", children: loading ? "Refreshing..." : "Refresh" }), _jsx("button", { type: "button", onClick: () => setExpandedPaths(new Set([rootPath])), className: "px-3 py-1.5 text-xs rounded border border-[var(--border)] bg-[var(--bg)] hover:bg-[var(--bg-hover)]", children: t("runtimeview.Collapse") }), _jsx("button", { type: "button", onClick: () => setExpandedPaths(buildInitialExpanded(rootPath, sectionData)), className: "px-3 py-1.5 text-xs rounded border border-[var(--border)] bg-[var(--bg)] hover:bg-[var(--bg-hover)]", children: t("runtimeview.ExpandTop") }), _jsx("div", { className: "text-[11px] text-[var(--muted)] ml-auto", children: snapshot
156
156
  ? `Last updated: ${formatDateTime(snapshot.generatedAt, { fallback: "n/a" })}`
157
157
  : "No snapshot loaded" })] }), snapshot && (_jsxs("div", { className: "grid gap-3 md:grid-cols-2 xl:grid-cols-3", children: [_jsx(OrderCard, { title: t("runtimeview.Plugins"), entries: snapshot.order.plugins }), _jsx(OrderCard, { title: t("runtimeview.Actions"), entries: snapshot.order.actions }), _jsx(OrderCard, { title: t("runtimeview.Providers"), entries: snapshot.order.providers }), _jsx(OrderCard, { title: t("runtimeview.Evaluators"), entries: snapshot.order.evaluators }), _jsx(ServicesOrderCard, { entries: snapshot.order.services }), _jsxs("div", { className: "border border-[var(--border)] bg-[var(--card)] rounded-md p-3", children: [_jsx("div", { className: "text-xs font-semibold mb-2", children: t("runtimeview.Summary") }), _jsxs("div", { className: "text-[11px] font-mono leading-5", children: [_jsxs("div", { children: [t("runtimeview.runtime"), " ", snapshot.runtimeAvailable ? "available" : "offline"] }), _jsxs("div", { children: [t("runtimeview.agent"), " ", snapshot.meta.agentName] }), _jsxs("div", { children: [t("runtimeview.state"), " ", snapshot.meta.agentState] }), _jsxs("div", { children: [t("runtimeview.model"), " ", snapshot.meta.model ?? "n/a"] }), _jsxs("div", { children: [t("runtimeview.plugins"), " ", snapshot.meta.pluginCount] }), _jsxs("div", { children: [t("runtimeview.actions"), " ", snapshot.meta.actionCount] }), _jsxs("div", { children: [t("runtimeview.providers"), " ", snapshot.meta.providerCount] }), _jsxs("div", { children: [t("runtimeview.evaluators"), " ", snapshot.meta.evaluatorCount] }), _jsxs("div", { children: [t("runtimeview.services"), " ", snapshot.meta.serviceCount] })] })] })] })), _jsx("div", { className: "flex gap-1 border-b border-[var(--border)]", children: SECTION_TABS.map((tab) => {
158
158
  const active = tab.key === activeSection;
@@ -0,0 +1,2 @@
1
+ export declare function SecurityPageView(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=SecurityPageView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SecurityPageView.d.ts","sourceRoot":"","sources":["../../src/components/SecurityPageView.tsx"],"names":[],"mappings":"AAgEA,wBAAgB,gBAAgB,4CA0K/B"}
@@ -0,0 +1,81 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button } from "@elizaos/ui";
3
+ import { useCallback, useEffect, useMemo, useState } from "react";
4
+ import { client, } from "../api";
5
+ import { formatDateTime } from "./format";
6
+ const SEVERITY_OPTIONS = [
7
+ { value: "", label: "All severities" },
8
+ { value: "critical", label: "Critical" },
9
+ { value: "error", label: "Error" },
10
+ { value: "warn", label: "Warn" },
11
+ { value: "info", label: "Info" },
12
+ ];
13
+ const SEVERITY_STYLES = {
14
+ critical: {
15
+ badge: "bg-red-500/15 text-red-300 border-red-500/30",
16
+ tone: "text-red-200",
17
+ },
18
+ error: {
19
+ badge: "bg-orange-500/15 text-orange-200 border-orange-500/30",
20
+ tone: "text-orange-100",
21
+ },
22
+ warn: {
23
+ badge: "bg-amber-500/15 text-amber-200 border-amber-500/30",
24
+ tone: "text-amber-100",
25
+ },
26
+ info: {
27
+ badge: "bg-sky-500/15 text-sky-200 border-sky-500/30",
28
+ tone: "text-sky-100",
29
+ },
30
+ };
31
+ function summarizeCounts(entries) {
32
+ return entries.reduce((counts, entry) => {
33
+ counts[entry.severity] += 1;
34
+ return counts;
35
+ }, {
36
+ critical: 0,
37
+ error: 0,
38
+ warn: 0,
39
+ info: 0,
40
+ });
41
+ }
42
+ function metadataPairs(entry) {
43
+ return Object.entries(entry.metadata ?? {}).map(([key, value]) => [
44
+ key,
45
+ String(value),
46
+ ]);
47
+ }
48
+ export function SecurityPageView() {
49
+ const [entries, setEntries] = useState([]);
50
+ const [totalBuffered, setTotalBuffered] = useState(0);
51
+ const [severity, setSeverity] = useState("");
52
+ const [loading, setLoading] = useState(true);
53
+ const [error, setError] = useState(null);
54
+ const loadAudit = useCallback(async () => {
55
+ setLoading(true);
56
+ setError(null);
57
+ try {
58
+ const response = await client.getSecurityAudit({
59
+ limit: 50,
60
+ severity: severity || undefined,
61
+ });
62
+ setEntries(response.entries);
63
+ setTotalBuffered(response.totalBuffered);
64
+ }
65
+ catch (err) {
66
+ setError(err instanceof Error ? err.message : "Failed to load audit log.");
67
+ }
68
+ finally {
69
+ setLoading(false);
70
+ }
71
+ }, [severity]);
72
+ useEffect(() => {
73
+ void loadAudit();
74
+ }, [loadAudit]);
75
+ const counts = useMemo(() => summarizeCounts(entries), [entries]);
76
+ return (_jsxs("section", { "data-testid": "security-audit-view", className: "flex h-full flex-col gap-4", children: [_jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [_jsxs("div", { children: [_jsx("h2", { className: "m-0 text-lg font-bold", children: "Security Audit" }), _jsx("p", { className: "mt-1 text-sm text-[var(--muted)]", children: "Review privileged actions, policy decisions, and runtime security events." })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("select", { "aria-label": "Security severity filter", className: "h-9 min-w-40 rounded-xl border border-border bg-bg px-3 text-sm text-txt", value: severity, onChange: (event) => setSeverity(event.target.value), children: SEVERITY_OPTIONS.map((option) => (_jsx("option", { value: option.value, children: option.label }, option.label))) }), _jsx(Button, { type: "button", variant: "outline", size: "sm", className: "h-9 rounded-xl", onClick: () => void loadAudit(), disabled: loading, children: loading ? "Refreshing..." : "Refresh" })] })] }), _jsxs("div", { className: "grid gap-3 sm:grid-cols-2 xl:grid-cols-5", children: [_jsxs("div", { className: "rounded-2xl border border-border/60 bg-card/50 p-4", children: [_jsx("div", { className: "text-xs uppercase tracking-[0.16em] text-muted", children: "Buffered" }), _jsx("div", { className: "mt-2 text-2xl font-semibold", children: totalBuffered })] }), ["critical", "error", "warn", "info"].map((level) => (_jsxs("div", { className: "rounded-2xl border border-border/60 bg-card/50 p-4", children: [_jsx("div", { className: "text-xs uppercase tracking-[0.16em] text-muted", children: level }), _jsx("div", { className: `mt-2 text-2xl font-semibold ${SEVERITY_STYLES[level].tone}`, children: counts[level] })] }, level)))] }), error ? (_jsx("div", { className: "rounded-2xl border border-red-500/30 bg-red-500/10 px-4 py-3 text-sm text-red-200", children: error })) : null, _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto rounded-2xl border border-border/60 bg-card/35", children: loading && entries.length === 0 ? (_jsx("div", { className: "px-4 py-6 text-sm text-[var(--muted)]", children: "Loading security audit..." })) : entries.length === 0 ? (_jsx("div", { className: "px-4 py-6 text-sm text-[var(--muted)]", children: "No security events recorded for the current filter." })) : (_jsx("div", { className: "divide-y divide-border/50", children: entries.map((entry, index) => {
77
+ const metadata = metadataPairs(entry);
78
+ const severityStyle = SEVERITY_STYLES[entry.severity];
79
+ return (_jsxs("article", { className: "px-4 py-4", children: [_jsxs("div", { className: "flex flex-wrap items-start gap-3", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("span", { className: `rounded-full border px-2 py-0.5 text-[11px] font-semibold uppercase tracking-[0.14em] ${severityStyle.badge}`, children: entry.severity }), _jsx("span", { className: "text-xs text-[var(--muted)]", children: entry.type })] }), _jsx("div", { className: "mt-2 text-sm font-medium text-txt", children: entry.summary })] }), _jsx("div", { className: "text-right text-xs text-[var(--muted)]", children: formatDateTime(entry.timestamp) })] }), entry.traceId ? (_jsxs("div", { className: "mt-2 text-xs text-[var(--muted)]", children: ["Trace:", " ", _jsx("span", { className: "font-mono text-txt", children: entry.traceId })] })) : null, metadata.length > 0 ? (_jsx("dl", { className: "mt-3 grid gap-2 sm:grid-cols-2 xl:grid-cols-3", children: metadata.map(([key, value]) => (_jsxs("div", { className: "rounded-xl border border-border/40 bg-bg/40 px-3 py-2", children: [_jsx("dt", { className: "text-[11px] uppercase tracking-[0.12em] text-muted", children: key }), _jsx("dd", { className: "mt-1 break-all font-mono text-xs text-txt", children: value })] }, `${entry.timestamp}-${key}`))) })) : null] }, `${entry.timestamp}-${entry.type}-${index}`));
80
+ }) })) })] }));
81
+ }
@@ -13,7 +13,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
13
  */
14
14
  import { client, isApiError } from "@elizaos/app-core/api";
15
15
  import { isElectrobunRuntime } from "@elizaos/app-core/bridge";
16
- import { useBranding } from "@elizaos/app-core/config/branding";
16
+ import { useBranding } from "@elizaos/app-core/config";
17
17
  import { useApp } from "@elizaos/app-core/state";
18
18
  import { useCallback, useEffect, useMemo, useRef, useState, } from "react";
19
19
  import { ActivityFeed } from "./stream/ActivityFeed";
@@ -146,7 +146,7 @@ export function TrajectoriesView({ onSelectTrajectory, }) {
146
146
  const total = result?.total ?? 0;
147
147
  const totalPages = Math.ceil(total / pageSize);
148
148
  const sources = stats?.bySource ? Object.keys(stats.bySource) : [];
149
- return (_jsxs("div", { className: "flex flex-col h-full gap-3", children: [stats && (_jsxs("div", { className: "flex flex-wrap gap-4 text-xs", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-muted", children: t("trajectoriesview.Total") }), _jsx("span", { className: "font-semibold", children: stats.totalTrajectories.toLocaleString() })] }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-muted", children: t("trajectoriesview.LLMCalls") }), _jsx("span", { className: "font-semibold", children: stats.totalLlmCalls.toLocaleString() })] }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-muted", children: t("trajectoriesview.Tokens") }), _jsx("span", { className: "font-semibold text-txt", children: formatTrajectoryTokenCount(stats.totalPromptTokens + stats.totalCompletionTokens, { emptyLabel: "0" }) }), _jsxs("span", { className: "text-muted text-[10px]", children: ["(", formatTrajectoryTokenCount(stats.totalPromptTokens, {
149
+ return (_jsxs("div", { className: "flex flex-col h-full gap-3", "data-testid": "trajectories-view", children: [stats && (_jsxs("div", { className: "flex flex-wrap gap-4 text-xs", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-muted", children: t("trajectoriesview.Total") }), _jsx("span", { className: "font-semibold", children: stats.totalTrajectories.toLocaleString() })] }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-muted", children: t("trajectoriesview.LLMCalls") }), _jsx("span", { className: "font-semibold", children: stats.totalLlmCalls.toLocaleString() })] }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-muted", children: t("trajectoriesview.Tokens") }), _jsx("span", { className: "font-semibold text-txt", children: formatTrajectoryTokenCount(stats.totalPromptTokens + stats.totalCompletionTokens, { emptyLabel: "0" }) }), _jsxs("span", { className: "text-muted text-[10px]", children: ["(", formatTrajectoryTokenCount(stats.totalPromptTokens, {
150
150
  emptyLabel: "0",
151
151
  }), "\u2191", " ", formatTrajectoryTokenCount(stats.totalCompletionTokens, {
152
152
  emptyLabel: "0",
@@ -71,6 +71,7 @@ export * from "./RestartBanner";
71
71
  export * from "./RuntimeView";
72
72
  export * from "./SaveCommandModal";
73
73
  export * from "./SecretsView";
74
+ export * from "./SecurityPageView";
74
75
  export * from "./SettingsView";
75
76
  export * from "./ShellOverlays";
76
77
  export * from "./ShortcutsOverlay";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"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"}
@@ -71,6 +71,7 @@ export * from "./RestartBanner";
71
71
  export * from "./RuntimeView";
72
72
  export * from "./SaveCommandModal";
73
73
  export * from "./SecretsView";
74
+ export * from "./SecurityPageView";
74
75
  export * from "./SettingsView";
75
76
  export * from "./ShellOverlays";
76
77
  export * from "./ShortcutsOverlay";
@@ -11,7 +11,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
11
11
  */
12
12
  import { ChevronDown, X } from "lucide-react";
13
13
  import React, { useCallback, useRef, useState } from "react";
14
- import { useApp } from "../state";
14
+ import { useApp } from "../state/useApp";
15
15
  import { resolveDynamic } from "./config-catalog";
16
16
  // ── Action binding helper ──────────────────────────────────────────────
17
17
  /**
@@ -12,7 +12,7 @@ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
12
12
  * - Prompt generation: registry.catalog.prompt() for AI system prompts
13
13
  */
14
14
  import React, { forwardRef, useCallback, useImperativeHandle, useMemo, useState, } from "react";
15
- import { useApp } from "../state";
15
+ import { useApp } from "../state/useApp";
16
16
  import { defaultCatalog, defineRegistry, evaluateShowIf, evaluateVisibility, resolveFields, runValidation, } from "./config-catalog";
17
17
  import { ConfigField } from "./config-field";
18
18
  // ── Group icons ────────────────────────────────────────────────────────