@skillkit/tui 1.14.0 → 1.15.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.
package/dist/index.d.ts CHANGED
@@ -22,7 +22,7 @@ interface FetchedSkill {
22
22
  repoName: string;
23
23
  description?: string;
24
24
  }
25
- type Screen = 'home' | 'browse' | 'installed' | 'marketplace' | 'recommend' | 'translate' | 'context' | 'memory' | 'team' | 'plugins' | 'methodology' | 'plan' | 'workflow' | 'execute' | 'history' | 'sync' | 'settings' | 'help' | 'mesh' | 'message';
25
+ type Screen = 'home' | 'browse' | 'installed' | 'marketplace' | 'recommend' | 'translate' | 'context' | 'memory' | 'team' | 'plugins' | 'methodology' | 'plan' | 'workflow' | 'execute' | 'history' | 'sync' | 'settings' | 'help' | 'mesh' | 'message' | 'scan';
26
26
  declare const NAV_KEYS: Record<string, Screen>;
27
27
  declare const STATUS_BAR_SHORTCUTS = "b browse m market i installed s sync / help q quit";
28
28
  interface ScreenMeta {
@@ -1208,7 +1208,14 @@ interface MessageProps {
1208
1208
  }
1209
1209
  declare function Message(props: MessageProps): any;
1210
1210
 
1211
+ interface ScanProps {
1212
+ onNavigate: (screen: Screen) => void;
1213
+ cols?: number;
1214
+ rows?: number;
1215
+ }
1216
+ declare function Scan(props: ScanProps): any;
1217
+
1211
1218
  declare function exitTUI(code?: number): void;
1212
1219
  declare function startTUI(): Promise<never>;
1213
1220
 
1214
- export { AGENT_LOGOS, AgentGrid, type AgentLogo, type AgentStatus, type AgentsState, AnimatedText, type AnimationPreset, App, BlinkingText, BottomStatusBar, Breadcrumb, type BreadcrumbItem, Browse, Button, ButtonGroup, type ButtonSize, type ButtonVariant, Clickable, ClickableRow, ClickableText, CodeBlock, type ColorName, type ColorValue, Context, CountUpText, DEFAULT_REPOS, DEFAULT_SCRAMBLE_CONFIG, type DetailField, DetailPane, type EasingFunction, EmptyState, ErrorBoundary, ErrorState, Execute, FEATURES, type Feature, FeatureList, type FetchedSkill, FocusRing, FormField, Header, Help, HighlightableListItem, History, Home, HoverHighlight, IconButton, InlineCode, InlineStatus, Installed, InteractiveArea, LoadingState, Marketplace, type MarketplaceState, Memory, Mesh, Message, Methodology, NAV_KEYS, type NavigationState, NavigationTrail, type PaginationResult, PathBreadcrumb, Plan, Plugins, PressEffect, ProgressBar, PulsingText, Recommend, type RepoInfo, RightSidebar, SCRAMBLE_CHARS, SIDEBAR_NAV, STATUS_BAR_SHORTCUTS, type ScrambleConfig, type Screen, type ScreenMeta, SearchInput, SelectField, SelectList, type SelectListItem, Settings, Sidebar, type SidebarSection, type SkillItem, SkillList, type SkillWithDetails, type SkillsState, Spinner, Splash, SplitPane, StatsCard, StatusBadge, StatusBar, StatusIndicator, type StatusType, type SymbolName, Sync, TOTAL_AGENTS, type Tab, TabBar, Team, TextAreaField, ThreePaneLayout, Translate, Try, VerticalTabBar, Workflow, animations, calculateMaxVisible, calculatePagination, clampIndex, cleanupTempRoot, colors, createAgentsState, createMarketplaceState, createNavigationState, createSkillsState, exitTUI, fetchRepoSkills, filterMarketplaceSkills, filterSkills, formatAgentDisplay, getAgentAdapter, getAgentLogo, getAgentTypes, getColor, getDetectedAgentCount, getDetectedAgents, getInstallDir, getMarketplaceRepos, getScreenFromKey, getSearchDirs, getStaggerDelay, getVersion, goBack, isNavKey, loadAgents, loadSkills, loadSkillsWithDetails, moveDown, moveUp, navigateTo, readSkillDescription, removeSkill, saveSkillMetadata, scrambleText, sortSkillsByName, startTUI, symbols, terminalColors, toSkillItems };
1221
+ export { AGENT_LOGOS, AgentGrid, type AgentLogo, type AgentStatus, type AgentsState, AnimatedText, type AnimationPreset, App, BlinkingText, BottomStatusBar, Breadcrumb, type BreadcrumbItem, Browse, Button, ButtonGroup, type ButtonSize, type ButtonVariant, Clickable, ClickableRow, ClickableText, CodeBlock, type ColorName, type ColorValue, Context, CountUpText, DEFAULT_REPOS, DEFAULT_SCRAMBLE_CONFIG, type DetailField, DetailPane, type EasingFunction, EmptyState, ErrorBoundary, ErrorState, Execute, FEATURES, type Feature, FeatureList, type FetchedSkill, FocusRing, FormField, Header, Help, HighlightableListItem, History, Home, HoverHighlight, IconButton, InlineCode, InlineStatus, Installed, InteractiveArea, LoadingState, Marketplace, type MarketplaceState, Memory, Mesh, Message, Methodology, NAV_KEYS, type NavigationState, NavigationTrail, type PaginationResult, PathBreadcrumb, Plan, Plugins, PressEffect, ProgressBar, PulsingText, Recommend, type RepoInfo, RightSidebar, SCRAMBLE_CHARS, SIDEBAR_NAV, STATUS_BAR_SHORTCUTS, Scan, type ScrambleConfig, type Screen, type ScreenMeta, SearchInput, SelectField, SelectList, type SelectListItem, Settings, Sidebar, type SidebarSection, type SkillItem, SkillList, type SkillWithDetails, type SkillsState, Spinner, Splash, SplitPane, StatsCard, StatusBadge, StatusBar, StatusIndicator, type StatusType, type SymbolName, Sync, TOTAL_AGENTS, type Tab, TabBar, Team, TextAreaField, ThreePaneLayout, Translate, Try, VerticalTabBar, Workflow, animations, calculateMaxVisible, calculatePagination, clampIndex, cleanupTempRoot, colors, createAgentsState, createMarketplaceState, createNavigationState, createSkillsState, exitTUI, fetchRepoSkills, filterMarketplaceSkills, filterSkills, formatAgentDisplay, getAgentAdapter, getAgentLogo, getAgentTypes, getColor, getDetectedAgentCount, getDetectedAgents, getInstallDir, getMarketplaceRepos, getScreenFromKey, getSearchDirs, getStaggerDelay, getVersion, goBack, isNavKey, loadAgents, loadSkills, loadSkillsWithDetails, moveDown, moveUp, navigateTo, readSkillDescription, removeSkill, saveSkillMetadata, scrambleText, sortSkillsByName, startTUI, symbols, terminalColors, toSkillItems };
package/dist/index.js CHANGED
@@ -1721,7 +1721,7 @@ var render = async (node, rendererOrConfig = {}) => {
1721
1721
  import { createCliRenderer as createCliRenderer2 } from "@opentui/core";
1722
1722
 
1723
1723
  // src/App.tsx
1724
- import { execFile } from "child_process";
1724
+ import { execFile as execFile2 } from "child_process";
1725
1725
 
1726
1726
  // src/state/types.ts
1727
1727
  var NAV_KEYS = {
@@ -1744,7 +1744,8 @@ var NAV_KEYS = {
1744
1744
  ",": "settings",
1745
1745
  "/": "help",
1746
1746
  "g": "mesh",
1747
- "j": "message"
1747
+ "j": "message",
1748
+ "z": "scan"
1748
1749
  };
1749
1750
  var STATUS_BAR_SHORTCUTS = "b browse m market i installed s sync / help q quit";
1750
1751
  var SIDEBAR_NAV = [
@@ -1762,7 +1763,8 @@ var SIDEBAR_NAV = [
1762
1763
  items: [
1763
1764
  { key: "i", label: "Installed", screen: "installed" },
1764
1765
  { key: "s", label: "Sync", screen: "sync" },
1765
- { key: "t", label: "Translate", screen: "translate" }
1766
+ { key: "t", label: "Translate", screen: "translate" },
1767
+ { key: "z", label: "Scan", screen: "scan" }
1766
1768
  ]
1767
1769
  },
1768
1770
  {
@@ -10409,6 +10411,9 @@ var SHORTCUTS = [{
10409
10411
  }, {
10410
10412
  key: "u",
10411
10413
  desc: "Publish"
10414
+ }, {
10415
+ key: "z",
10416
+ desc: "Security scan"
10412
10417
  }]
10413
10418
  }, {
10414
10419
  section: "Team & Config",
@@ -10864,14 +10869,339 @@ function Message(props) {
10864
10869
  })();
10865
10870
  }
10866
10871
 
10872
+ // src/screens/Scan.tsx
10873
+ import { execFile } from "child_process";
10874
+ function getSeverityColor(severity) {
10875
+ switch (severity.toLowerCase()) {
10876
+ case "critical":
10877
+ return "#ff5555";
10878
+ case "high":
10879
+ return "#ff4444";
10880
+ case "medium":
10881
+ return "#ffaa00";
10882
+ case "low":
10883
+ return "#00bbcc";
10884
+ case "info":
10885
+ return "#888888";
10886
+ default:
10887
+ return terminalColors.textMuted;
10888
+ }
10889
+ }
10890
+ function getVerdictColor(verdict) {
10891
+ switch (verdict) {
10892
+ case "pass":
10893
+ return "#22cc44";
10894
+ case "warn":
10895
+ return "#ffaa00";
10896
+ case "fail":
10897
+ return "#ff5555";
10898
+ default:
10899
+ return terminalColors.textMuted;
10900
+ }
10901
+ }
10902
+ function Scan(props) {
10903
+ const [scanning, setScanning] = createSignal(false);
10904
+ const [result, setResult] = createSignal(null);
10905
+ const [error, setError] = createSignal(null);
10906
+ const [scanPath] = createSignal(".");
10907
+ const [selectedIndex, setSelectedIndex] = createSignal(0);
10908
+ const rows = () => props.rows ?? 24;
10909
+ const visibleCount = () => Math.max(1, rows() - 14);
10910
+ const runScan = (path) => {
10911
+ setScanning(true);
10912
+ setError(null);
10913
+ setResult(null);
10914
+ try {
10915
+ execFile("npx", ["skillkit", "scan", path, "--format", "json"], {
10916
+ timeout: 3e4,
10917
+ maxBuffer: 1024 * 1024
10918
+ }, (err, stdout, stderr) => {
10919
+ setScanning(false);
10920
+ if (err && !stdout) {
10921
+ setError(stderr || err.message || "Scan failed");
10922
+ return;
10923
+ }
10924
+ try {
10925
+ const parsed = JSON.parse(stdout);
10926
+ setResult(parsed);
10927
+ } catch {
10928
+ setError("Failed to parse scan results");
10929
+ }
10930
+ });
10931
+ } catch (err) {
10932
+ setScanning(false);
10933
+ setError(err instanceof Error ? err.message : "Failed to start scan");
10934
+ }
10935
+ };
10936
+ createEffect(() => {
10937
+ runScan(scanPath());
10938
+ });
10939
+ const findings = createMemo(() => result()?.findings ?? []);
10940
+ const windowStart = createMemo(() => Math.max(0, selectedIndex() - visibleCount() + 1));
10941
+ const visibleFindings = createMemo(() => findings().slice(windowStart(), windowStart() + visibleCount()));
10942
+ useKeyboard((key) => {
10943
+ if (key.name === "k" || key.name === "up") {
10944
+ setSelectedIndex((i) => Math.max(0, i - 1));
10945
+ } else if (key.name === "j" || key.name === "down") {
10946
+ setSelectedIndex((i) => Math.min(findings().length - 1, i + 1));
10947
+ } else if (key.name === "r") {
10948
+ runScan(scanPath());
10949
+ }
10950
+ });
10951
+ return (() => {
10952
+ var _el$ = createElement("box"), _el$29 = createElement("text"), _el$31 = createElement("text");
10953
+ insertNode(_el$, _el$29);
10954
+ insertNode(_el$, _el$31);
10955
+ setProp(_el$, "flexDirection", "column");
10956
+ setProp(_el$, "padding", 1);
10957
+ insert(_el$, createComponent2(Header, {
10958
+ title: "Security Scan",
10959
+ subtitle: "detect vulnerabilities in skills",
10960
+ icon: "\\u25D0"
10961
+ }), _el$29);
10962
+ insert(_el$, createComponent2(Show, {
10963
+ get when() {
10964
+ return scanning();
10965
+ },
10966
+ get children() {
10967
+ var _el$2 = createElement("box"), _el$3 = createElement("text"), _el$4 = createTextNode(`Scanning `), _el$5 = createTextNode(`...`);
10968
+ insertNode(_el$2, _el$3);
10969
+ setProp(_el$2, "flexDirection", "row");
10970
+ setProp(_el$2, "gap", 1);
10971
+ insert(_el$2, createComponent2(Spinner, {}), _el$3);
10972
+ insertNode(_el$3, _el$4);
10973
+ insertNode(_el$3, _el$5);
10974
+ insert(_el$3, scanPath, _el$5);
10975
+ effect((_$p) => setProp(_el$3, "fg", terminalColors.textMuted, _$p));
10976
+ return _el$2;
10977
+ }
10978
+ }), _el$29);
10979
+ insert(_el$, createComponent2(Show, {
10980
+ get when() {
10981
+ return error();
10982
+ },
10983
+ get children() {
10984
+ var _el$6 = createElement("box"), _el$7 = createElement("text"), _el$8 = createTextNode(`Scan error: `), _el$9 = createElement("text");
10985
+ insertNode(_el$6, _el$7);
10986
+ insertNode(_el$6, _el$9);
10987
+ setProp(_el$6, "flexDirection", "column");
10988
+ insertNode(_el$7, _el$8);
10989
+ setProp(_el$7, "fg", "#ff5555");
10990
+ insert(_el$7, error, null);
10991
+ insertNode(_el$9, createTextNode(`Press r to retry`));
10992
+ effect((_$p) => setProp(_el$9, "fg", terminalColors.textMuted, _$p));
10993
+ return _el$6;
10994
+ }
10995
+ }), _el$29);
10996
+ insert(_el$, createComponent2(Show, {
10997
+ get when() {
10998
+ return memo2(() => !!result())() && !scanning();
10999
+ },
11000
+ get children() {
11001
+ var _el$1 = createElement("box"), _el$10 = createElement("box"), _el$11 = createElement("text"), _el$12 = createElement("text"), _el$13 = createElement("text"), _el$14 = createTextNode(`ms`), _el$15 = createElement("box"), _el$28 = createElement("text");
11002
+ insertNode(_el$1, _el$10);
11003
+ insertNode(_el$1, _el$15);
11004
+ insertNode(_el$1, _el$28);
11005
+ setProp(_el$1, "flexDirection", "column");
11006
+ insertNode(_el$10, _el$11);
11007
+ insertNode(_el$10, _el$12);
11008
+ insertNode(_el$10, _el$13);
11009
+ setProp(_el$10, "flexDirection", "row");
11010
+ setProp(_el$10, "gap", 2);
11011
+ insert(_el$11, () => result().skillName);
11012
+ insert(_el$12, () => result().verdict.toUpperCase());
11013
+ insertNode(_el$13, _el$14);
11014
+ insert(_el$13, () => result().duration, _el$14);
11015
+ setProp(_el$15, "flexDirection", "row");
11016
+ setProp(_el$15, "gap", 2);
11017
+ insert(_el$15, createComponent2(Show, {
11018
+ get when() {
11019
+ return result().stats.critical > 0;
11020
+ },
11021
+ get children() {
11022
+ var _el$16 = createElement("text"), _el$17 = createTextNode(` critical`);
11023
+ insertNode(_el$16, _el$17);
11024
+ setProp(_el$16, "fg", "#ff5555");
11025
+ insert(_el$16, () => result().stats.critical, _el$17);
11026
+ return _el$16;
11027
+ }
11028
+ }), null);
11029
+ insert(_el$15, createComponent2(Show, {
11030
+ get when() {
11031
+ return result().stats.high > 0;
11032
+ },
11033
+ get children() {
11034
+ var _el$18 = createElement("text"), _el$19 = createTextNode(` high`);
11035
+ insertNode(_el$18, _el$19);
11036
+ setProp(_el$18, "fg", "#ff4444");
11037
+ insert(_el$18, () => result().stats.high, _el$19);
11038
+ return _el$18;
11039
+ }
11040
+ }), null);
11041
+ insert(_el$15, createComponent2(Show, {
11042
+ get when() {
11043
+ return result().stats.medium > 0;
11044
+ },
11045
+ get children() {
11046
+ var _el$20 = createElement("text"), _el$21 = createTextNode(` medium`);
11047
+ insertNode(_el$20, _el$21);
11048
+ setProp(_el$20, "fg", "#ffaa00");
11049
+ insert(_el$20, () => result().stats.medium, _el$21);
11050
+ return _el$20;
11051
+ }
11052
+ }), null);
11053
+ insert(_el$15, createComponent2(Show, {
11054
+ get when() {
11055
+ return result().stats.low > 0;
11056
+ },
11057
+ get children() {
11058
+ var _el$22 = createElement("text"), _el$23 = createTextNode(` low`);
11059
+ insertNode(_el$22, _el$23);
11060
+ setProp(_el$22, "fg", "#00bbcc");
11061
+ insert(_el$22, () => result().stats.low, _el$23);
11062
+ return _el$22;
11063
+ }
11064
+ }), null);
11065
+ insert(_el$15, createComponent2(Show, {
11066
+ get when() {
11067
+ return result().stats.info > 0;
11068
+ },
11069
+ get children() {
11070
+ var _el$24 = createElement("text"), _el$25 = createTextNode(` info`);
11071
+ insertNode(_el$24, _el$25);
11072
+ setProp(_el$24, "fg", "#888888");
11073
+ insert(_el$24, () => result().stats.info, _el$25);
11074
+ return _el$24;
11075
+ }
11076
+ }), null);
11077
+ insert(_el$15, createComponent2(Show, {
11078
+ get when() {
11079
+ return findings().length === 0;
11080
+ },
11081
+ get children() {
11082
+ var _el$26 = createElement("text");
11083
+ insertNode(_el$26, createTextNode(`No findings`));
11084
+ setProp(_el$26, "fg", "#22cc44");
11085
+ return _el$26;
11086
+ }
11087
+ }), null);
11088
+ insert(_el$28, () => "\u2500".repeat(Math.min(60, (props.cols ?? 80) - 4)));
11089
+ insert(_el$1, createComponent2(Show, {
11090
+ get when() {
11091
+ return findings().length === 0;
11092
+ },
11093
+ get children() {
11094
+ return createComponent2(EmptyState, {
11095
+ title: "No security findings detected"
11096
+ });
11097
+ }
11098
+ }), null);
11099
+ insert(_el$1, createComponent2(Show, {
11100
+ get when() {
11101
+ return findings().length > 0;
11102
+ },
11103
+ get children() {
11104
+ return createComponent2(For, {
11105
+ get each() {
11106
+ return visibleFindings();
11107
+ },
11108
+ children: (finding, idx) => {
11109
+ const absoluteIdx = () => windowStart() + idx();
11110
+ const isSelected = () => absoluteIdx() === selectedIndex();
11111
+ return (() => {
11112
+ var _el$33 = createElement("box"), _el$34 = createElement("box"), _el$35 = createElement("text"), _el$36 = createElement("text"), _el$37 = createElement("text"), _el$38 = createTextNode(`[`), _el$39 = createTextNode(`]`), _el$40 = createElement("text");
11113
+ insertNode(_el$33, _el$34);
11114
+ setProp(_el$33, "flexDirection", "column");
11115
+ insertNode(_el$34, _el$35);
11116
+ insertNode(_el$34, _el$36);
11117
+ insertNode(_el$34, _el$37);
11118
+ insertNode(_el$34, _el$40);
11119
+ setProp(_el$34, "flexDirection", "row");
11120
+ setProp(_el$34, "gap", 1);
11121
+ insert(_el$35, () => isSelected() ? ">" : " ");
11122
+ insert(_el$36, () => finding.severity.toUpperCase().padEnd(8));
11123
+ insertNode(_el$37, _el$38);
11124
+ insertNode(_el$37, _el$39);
11125
+ insert(_el$37, () => finding.ruleId, _el$39);
11126
+ insert(_el$40, () => finding.title);
11127
+ insert(_el$33, createComponent2(Show, {
11128
+ get when() {
11129
+ return memo2(() => !!isSelected())() && finding.filePath;
11130
+ },
11131
+ get children() {
11132
+ var _el$41 = createElement("text"), _el$42 = createTextNode(` `);
11133
+ insertNode(_el$41, _el$42);
11134
+ insert(_el$41, () => finding.filePath, null);
11135
+ insert(_el$41, (() => {
11136
+ var _c$ = memo2(() => !!finding.lineNumber);
11137
+ return () => _c$() ? `:${finding.lineNumber}` : "";
11138
+ })(), null);
11139
+ effect((_$p) => setProp(_el$41, "fg", terminalColors.textMuted, _$p));
11140
+ return _el$41;
11141
+ }
11142
+ }), null);
11143
+ insert(_el$33, createComponent2(Show, {
11144
+ get when() {
11145
+ return memo2(() => !!isSelected())() && finding.remediation;
11146
+ },
11147
+ get children() {
11148
+ var _el$43 = createElement("text"), _el$44 = createTextNode(` Fix: `);
11149
+ insertNode(_el$43, _el$44);
11150
+ insert(_el$43, () => finding.remediation, null);
11151
+ effect((_$p) => setProp(_el$43, "fg", terminalColors.accent, _$p));
11152
+ return _el$43;
11153
+ }
11154
+ }), null);
11155
+ effect((_p$) => {
11156
+ var _v$5 = isSelected() ? terminalColors.accent : terminalColors.textMuted, _v$6 = getSeverityColor(finding.severity), _v$7 = terminalColors.textMuted, _v$8 = isSelected() ? terminalColors.text : terminalColors.textMuted;
11157
+ _v$5 !== _p$.e && (_p$.e = setProp(_el$35, "fg", _v$5, _p$.e));
11158
+ _v$6 !== _p$.t && (_p$.t = setProp(_el$36, "fg", _v$6, _p$.t));
11159
+ _v$7 !== _p$.a && (_p$.a = setProp(_el$37, "fg", _v$7, _p$.a));
11160
+ _v$8 !== _p$.o && (_p$.o = setProp(_el$40, "fg", _v$8, _p$.o));
11161
+ return _p$;
11162
+ }, {
11163
+ e: void 0,
11164
+ t: void 0,
11165
+ a: void 0,
11166
+ o: void 0
11167
+ });
11168
+ return _el$33;
11169
+ })();
11170
+ }
11171
+ });
11172
+ }
11173
+ }), null);
11174
+ effect((_p$) => {
11175
+ var _v$ = terminalColors.text, _v$2 = getVerdictColor(result().verdict), _v$3 = terminalColors.textMuted, _v$4 = terminalColors.textMuted;
11176
+ _v$ !== _p$.e && (_p$.e = setProp(_el$11, "fg", _v$, _p$.e));
11177
+ _v$2 !== _p$.t && (_p$.t = setProp(_el$12, "fg", _v$2, _p$.t));
11178
+ _v$3 !== _p$.a && (_p$.a = setProp(_el$13, "fg", _v$3, _p$.a));
11179
+ _v$4 !== _p$.o && (_p$.o = setProp(_el$28, "fg", _v$4, _p$.o));
11180
+ return _p$;
11181
+ }, {
11182
+ e: void 0,
11183
+ t: void 0,
11184
+ a: void 0,
11185
+ o: void 0
11186
+ });
11187
+ return _el$1;
11188
+ }
11189
+ }), _el$29);
11190
+ insertNode(_el$29, createTextNode(` `));
11191
+ insertNode(_el$31, createTextNode(`j/k navigate r rescan esc back`));
11192
+ effect((_$p) => setProp(_el$31, "fg", terminalColors.textMuted, _$p));
11193
+ return _el$;
11194
+ })();
11195
+ }
11196
+
10867
11197
  // src/App.tsx
10868
11198
  var DOCS_URL = "https://agenstskills.com/docs";
10869
11199
  function openUrl(url) {
10870
11200
  if (process.platform === "win32") {
10871
- execFile("cmd", ["/c", "start", "", url]);
11201
+ execFile2("cmd", ["/c", "start", "", url]);
10872
11202
  } else {
10873
11203
  const cmd = process.platform === "darwin" ? "open" : "xdg-open";
10874
- execFile(cmd, [url]);
11204
+ execFile2(cmd, [url]);
10875
11205
  }
10876
11206
  }
10877
11207
  function App(props) {
@@ -11117,6 +11447,13 @@ function App(props) {
11117
11447
  get children() {
11118
11448
  return createComponent2(Message, mergeProps3(screenProps));
11119
11449
  }
11450
+ }), createComponent2(Match, {
11451
+ get when() {
11452
+ return currentScreen() === "scan";
11453
+ },
11454
+ get children() {
11455
+ return createComponent2(Scan, mergeProps3(screenProps));
11456
+ }
11120
11457
  })];
11121
11458
  }
11122
11459
  }));
@@ -11540,7 +11877,8 @@ var SCREEN_LABELS = {
11540
11877
  sync: "Sync",
11541
11878
  help: "Help",
11542
11879
  mesh: "Mesh",
11543
- message: "Message"
11880
+ message: "Message",
11881
+ scan: "Security Scan"
11544
11882
  };
11545
11883
  function BottomStatusBar(props) {
11546
11884
  const version = getVersion();
@@ -13810,6 +14148,7 @@ export {
13810
14148
  SCRAMBLE_CHARS,
13811
14149
  SIDEBAR_NAV,
13812
14150
  STATUS_BAR_SHORTCUTS,
14151
+ Scan,
13813
14152
  SearchInput,
13814
14153
  SelectField,
13815
14154
  SelectList,