@runfusion/fusion 0.2.2 → 0.2.4

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 (2) hide show
  1. package/dist/bin.js +52 -55
  2. package/package.json +3 -3
package/dist/bin.js CHANGED
@@ -136878,30 +136878,32 @@ function UtilitiesPanel({ isFocused }) {
136878
136878
  }
136879
136879
  function HelpOverlay() {
136880
136880
  const shortcuts = [
136881
- ["[b]", "Board view (interactive mode)"],
136881
+ ["[m] / [s]", "Main (status mode)"],
136882
+ ["[b]", "Board view"],
136882
136883
  ["[a]", "Agents view"],
136883
136884
  ["[g]", "Settings view"],
136884
136885
  ["[t]", "Git view"],
136885
- ["[s]", "Status mode"],
136886
- ["[1] / [2] / [3]", "Board / Agents / Settings (interactive)"],
136887
- ["[Tab]", "Cycle focused panel forward"],
136888
- ["[Shift+Tab]", "Cycle focused panel backward"],
136889
- ["[1-5]", "Jump to panel by number (status mode)"],
136890
- ["[\u2192] / [n]", "Next panel (status mode)"],
136891
- ["[\u2190] / [p]", "Previous panel (status mode)"],
136886
+ ["[e]", "Explorer (file browser)"],
136887
+ ["[Tab]", "Cycle focused panel / pane forward"],
136888
+ ["[Shift+Tab]", "Cycle focused panel / pane backward"],
136889
+ ["[1-5]", "Jump to panel (Main: System/Logs/Utilities/Stats/Settings)"],
136890
+ ["[\u2190 / \u2192]", "Switch pane (Agents, Settings, Files, Git)"],
136891
+ ["[\u2192] / [n]", "Next panel (Main)"],
136892
+ ["[\u2190] / [p]", "Previous panel (Main)"],
136892
136893
  ["[r]", "Refresh stats (Utilities)"],
136893
136894
  ["[c]", "Clear logs (Utilities)"],
136894
- ["[t]", "Toggle engine pause (Utilities)"],
136895
- ["[\u2191/\u2193/k/j]", "Navigate log entries (Logs)"],
136896
- ["[Home/End]", "First/last log entry (Logs)"],
136897
- ["[Enter/Space/e]", "Expand log entry (Logs)"],
136898
- ["[w]", "Toggle word wrap (Logs)"],
136899
- ["[f]", "Cycle severity filter (Logs)"],
136900
- ["[s/x]", "Start/stop agent (Agents view)"],
136901
- ["[D]", "Delete agent \u2014 requires confirm (Agents view)"],
136902
- ["[r]", "Refresh agent detail (Agents view)"],
136903
- ["[Space]", "Toggle boolean (Settings view)"],
136904
- ["[+/-]", "Adjust number (Settings view)"],
136895
+ ["[\u2191/\u2193/k/j]", "Navigate list / log entries"],
136896
+ ["[Home / G]", "First / last log entry (Logs)"],
136897
+ ["[Enter/Space]", "Expand log entry (Logs)"],
136898
+ ["[w]", "Toggle word wrap (Logs / Files)"],
136899
+ ["[f]", "Cycle severity filter (Main, any panel)"],
136900
+ ["[Space]", "Toggle boolean (Settings)"],
136901
+ ["[+/-]", "Adjust number (Settings)"],
136902
+ ["[p]", "Project picker (Board, Files)"],
136903
+ ["[n]", "New task (Board)"],
136904
+ ["[D]", "Delete agent \u2014 requires confirm (Agents)"],
136905
+ ["[P] / [F]", "Push / fetch (Git)"],
136906
+ ["[.]", "Toggle hidden files (Files)"],
136905
136907
  ["[?] / [h]", "Toggle help"],
136906
136908
  ["[q]", "Quit"],
136907
136909
  ["[Ctrl+C]", "Force quit"]
@@ -136913,13 +136915,13 @@ function HelpOverlay() {
136913
136915
  return /* @__PURE__ */ jsxs(Box, { borderStyle: "round", borderColor: "cyanBright", flexDirection: "column", backgroundColor: "black", children: [
136914
136916
  /* @__PURE__ */ jsx(Text, { backgroundColor: "black", bold: true, color: "white", children: titleRow }),
136915
136917
  /* @__PURE__ */ jsx(Text, { backgroundColor: "black", children: " " }),
136916
- shortcuts.map(([key, desc]) => {
136918
+ shortcuts.map(([key, desc], i) => {
136917
136919
  const keyCell = ` ${key.padEnd(rowKeyWidth - 1)} `;
136918
136920
  const descCell = ` ${desc.padEnd(rowDescWidth)} `;
136919
136921
  return /* @__PURE__ */ jsxs(Box, { flexDirection: "row", children: [
136920
136922
  /* @__PURE__ */ jsx(Text, { backgroundColor: "black", color: "yellow", children: keyCell }),
136921
136923
  /* @__PURE__ */ jsx(Text, { backgroundColor: "black", color: "white", children: descCell })
136922
- ] }, key);
136924
+ ] }, i);
136923
136925
  })
136924
136926
  ] });
136925
136927
  }
@@ -136932,7 +136934,7 @@ function StatusModeGrid({
136932
136934
  const bodyRows = Math.max(8, rows - 7);
136933
136935
  const logsAvailableRows = Math.max(4, bodyRows - 4);
136934
136936
  return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [
136935
- /* @__PURE__ */ jsx(MainHeader, { state }),
136937
+ /* @__PURE__ */ jsx(Box, { flexShrink: 0, children: /* @__PURE__ */ jsx(MainHeader, { state }) }),
136936
136938
  /* @__PURE__ */ jsxs(Box, { flexDirection: "row", flexGrow: 1, overflow: "hidden", children: [
136937
136939
  /* @__PURE__ */ jsxs(Box, { flexDirection: "column", flexGrow: 5, overflow: "hidden", children: [
136938
136940
  /* @__PURE__ */ jsx(SystemPanel, { state, isFocused: focused === "system" }),
@@ -136953,7 +136955,7 @@ function StatusModeGrid({
136953
136955
  ] })
136954
136956
  ] })
136955
136957
  ] }),
136956
- /* @__PURE__ */ jsx(StatusBar, { state, controller })
136958
+ /* @__PURE__ */ jsx(Box, { flexShrink: 0, children: /* @__PURE__ */ jsx(StatusBar, { state, controller }) })
136957
136959
  ] });
136958
136960
  }
136959
136961
  function StatusModeSingle({
@@ -136976,9 +136978,9 @@ function StatusModeSingle({
136976
136978
  }
136977
136979
  };
136978
136980
  return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [
136979
- /* @__PURE__ */ jsx(MainHeader, { state }),
136981
+ /* @__PURE__ */ jsx(Box, { flexShrink: 0, children: /* @__PURE__ */ jsx(MainHeader, { state }) }),
136980
136982
  /* @__PURE__ */ jsx(Box, { flexGrow: 1, flexDirection: "column", overflow: "hidden", children: activePanel() }),
136981
- /* @__PURE__ */ jsx(StatusBar, { state, controller })
136983
+ /* @__PURE__ */ jsx(Box, { flexShrink: 0, children: /* @__PURE__ */ jsx(StatusBar, { state, controller }) })
136982
136984
  ] });
136983
136985
  }
136984
136986
  function StatusBar({ state, controller: _controller }) {
@@ -137003,48 +137005,35 @@ function StatusBar({ state, controller: _controller }) {
137003
137005
  }
137004
137006
  function MainHeader({ state }) {
137005
137007
  const inInteractive = state.mode === "interactive";
137006
- const focused = state.activeSection;
137007
137008
  const interactiveView = state.interactiveView;
137008
137009
  const { stdout } = useStdout();
137009
137010
  const cols = stdout?.columns ?? 80;
137010
- const rows = stdout?.rows ?? 24;
137011
- const interactiveTabs = [
137012
- { key: "b", label: "Board", view: "board" },
137013
- { key: "a", label: "Agents", view: "agents" },
137014
- { key: "g", label: "Settings", view: "settings" },
137015
- { key: "t", label: "Git", view: "git" },
137016
- { key: "e", label: "Explorer", view: "files" }
137011
+ const tabs = [
137012
+ { key: "m", label: "Main", kind: "main" },
137013
+ { key: "b", label: "Board", kind: "interactive", view: "board" },
137014
+ { key: "a", label: "Agents", kind: "interactive", view: "agents" },
137015
+ { key: "g", label: "Settings", kind: "interactive", view: "settings" },
137016
+ { key: "t", label: "Git", kind: "interactive", view: "git" },
137017
+ { key: "e", label: "Explorer", kind: "interactive", view: "files" }
137017
137018
  ];
137018
- if (rows < 10) return null;
137019
137019
  const showHelpHint = cols >= 110;
137020
- const compactInteractive = cols < 100;
137021
- const compactSections = cols < 90;
137022
- const minimal = cols < 70;
137020
+ const fullLabels = cols >= 90;
137023
137021
  const tiny = cols < 50;
137022
+ const compact = !fullLabels && !tiny;
137023
+ const isActive = (t) => t.kind === "main" ? !inInteractive : inInteractive && t.view === interactiveView;
137024
137024
  if (tiny) {
137025
- const activeSectionIdx = inInteractive ? -1 : SECTION_ORDER.indexOf(focused);
137026
- const activeSectionLabel = activeSectionIdx >= 0 ? SECTION_ORDER[activeSectionIdx].charAt(0).toUpperCase() + SECTION_ORDER[activeSectionIdx].slice(1) : null;
137027
- const activeInteractive = inInteractive ? interactiveTabs.find((t) => t.view === interactiveView) ?? null : null;
137025
+ const active = tabs.find(isActive);
137028
137026
  return /* @__PURE__ */ jsxs(Box, { flexDirection: "row", gap: 1, paddingX: 1, children: [
137029
137027
  /* @__PURE__ */ jsx(MiniLogo, {}),
137030
- activeSectionLabel && /* @__PURE__ */ jsx(Box, { flexShrink: 0, children: /* @__PURE__ */ jsx(Text, { backgroundColor: "cyan", color: "black", bold: true, children: ` ${activeSectionIdx + 1} ${activeSectionLabel} ` }) }),
137031
- activeInteractive && /* @__PURE__ */ jsx(Box, { flexShrink: 0, children: /* @__PURE__ */ jsx(Text, { backgroundColor: "cyan", color: "black", bold: true, children: ` ${activeInteractive.key} ${activeInteractive.label} ` }) })
137028
+ active && /* @__PURE__ */ jsx(Box, { flexShrink: 0, children: /* @__PURE__ */ jsx(Text, { backgroundColor: "cyan", color: "black", bold: true, children: ` ${active.key} ${active.label} ` }) })
137032
137029
  ] });
137033
137030
  }
137034
137031
  return /* @__PURE__ */ jsxs(Box, { flexDirection: "row", gap: 1, paddingX: 1, paddingY: 0, children: [
137035
137032
  /* @__PURE__ */ jsx(MiniLogo, {}),
137036
- !minimal && /* @__PURE__ */ jsx(Box, { flexShrink: 0, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "\u2502" }) }),
137037
- SECTION_ORDER.map((section, i) => {
137038
- const isActive = !inInteractive && section === focused;
137039
- const label = section.charAt(0).toUpperCase() + section.slice(1);
137040
- if (minimal && !isActive) return null;
137041
- return /* @__PURE__ */ jsx(Box, { marginRight: 1, flexShrink: 0, children: isActive ? /* @__PURE__ */ jsx(Text, { backgroundColor: "cyan", color: "black", bold: true, children: compactSections ? ` ${i + 1} ${label} ` : ` [${i + 1}] ${label} ` }) : compactSections ? /* @__PURE__ */ jsx(Text, { dimColor: true, children: `[${i + 1}]` }) : /* @__PURE__ */ jsx(Text, { dimColor: true, children: `[${i + 1}] ${label}` }) }, section);
137042
- }),
137043
- !minimal && /* @__PURE__ */ jsx(Box, { flexShrink: 0, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "\u2502" }) }),
137044
- interactiveTabs.map(({ key, label, view }) => {
137045
- const isActive = inInteractive && view === interactiveView;
137046
- if (minimal && !isActive) return null;
137047
- return /* @__PURE__ */ jsx(Box, { marginRight: 1, flexShrink: 0, children: isActive ? /* @__PURE__ */ jsx(Text, { backgroundColor: "cyan", color: "black", bold: true, children: compactInteractive ? ` ${key} ${label} ` : ` [${key}] ${label} ` }) : compactInteractive ? /* @__PURE__ */ jsx(Text, { dimColor: true, children: `[${key}]` }) : /* @__PURE__ */ jsx(Text, { dimColor: true, children: `[${key}] ${label}` }) }, view);
137033
+ /* @__PURE__ */ jsx(Box, { flexShrink: 0, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "\u2502" }) }),
137034
+ tabs.map((t) => {
137035
+ const active = isActive(t);
137036
+ return /* @__PURE__ */ jsx(Box, { marginRight: 1, flexShrink: 0, children: active ? /* @__PURE__ */ jsx(Text, { backgroundColor: "cyan", color: "black", bold: true, children: compact ? ` ${t.key} ` : ` [${t.key}] ${t.label} ` }) : compact ? /* @__PURE__ */ jsx(Text, { dimColor: true, children: `[${t.key}]` }) : /* @__PURE__ */ jsx(Text, { dimColor: true, children: `[${t.key}] ${t.label}` }) }, t.key);
137048
137037
  }),
137049
137038
  /* @__PURE__ */ jsx(Box, { flexGrow: 1 }),
137050
137039
  showHelpHint && /* @__PURE__ */ jsx(Box, { flexShrink: 0, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "[?] help [q] quit" }) })
@@ -137935,6 +137924,14 @@ function SettingsInteractiveView({ state }) {
137935
137924
  setDetailFocused((f) => !f);
137936
137925
  return;
137937
137926
  }
137927
+ if (key.leftArrow) {
137928
+ setDetailFocused(false);
137929
+ return;
137930
+ }
137931
+ if (key.rightArrow) {
137932
+ setDetailFocused(true);
137933
+ return;
137934
+ }
137938
137935
  if (!detailFocused) {
137939
137936
  if (key.upArrow || input === "k") {
137940
137937
  setSelectedIndex((i) => Math.max(0, i - 1));
@@ -139112,7 +139109,7 @@ function DashboardApp({ controller }) {
139112
139109
  controller.setInteractiveView("files");
139113
139110
  return;
139114
139111
  }
139115
- if (input === "s" || input === "S") {
139112
+ if (input === "m" || input === "s") {
139116
139113
  if (state.mode === "interactive") {
139117
139114
  controller.setMode("status");
139118
139115
  return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runfusion/fusion",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "license": "MIT",
5
5
  "description": "Fusion CLI: HTTP API server, daemon, dashboard launcher, and task tooling for the Fusion AI coding agent.",
6
6
  "homepage": "https://github.com/Runfusion/Fusion#readme",
@@ -76,9 +76,9 @@
76
76
  "vitest": "^3.1.0",
77
77
  "yaml": "^2.8.3",
78
78
  "@fusion/core": "0.1.0",
79
+ "@fusion/dashboard": "0.1.0",
79
80
  "@fusion/engine": "0.1.0",
80
- "@fusion/pi-claude-cli": "0.3.1",
81
- "@fusion/dashboard": "0.1.0"
81
+ "@fusion/pi-claude-cli": "0.3.1"
82
82
  },
83
83
  "repository": {
84
84
  "type": "git",