@kenkaiiii/gg-boss 4.3.150 → 4.3.152

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/cli.js CHANGED
@@ -43,7 +43,7 @@ import {
43
43
  use_app_default,
44
44
  use_input_default,
45
45
  use_stdout_default
46
- } from "./chunk-ZNVFGIDI.js";
46
+ } from "./chunk-SFFLLX2R.js";
47
47
  import "./chunk-QT366Y52.js";
48
48
  import {
49
49
  source_default
@@ -336,7 +336,7 @@ init_esm_shims();
336
336
  // package.json
337
337
  var package_default = {
338
338
  name: "@kenkaiiii/gg-boss",
339
- version: "4.3.150",
339
+ version: "4.3.152",
340
340
  type: "module",
341
341
  description: "Orchestrator agent that drives multiple ggcoder sessions across projects from a single chat",
342
342
  license: "MIT",
@@ -1574,7 +1574,7 @@ function BossAppInner({ boss, resetUI }) {
1574
1574
  const state = useBossState();
1575
1575
  const { exit } = use_app_default();
1576
1576
  const { stdout } = use_stdout_default();
1577
- const { resizeKey, columns } = useTerminalSize();
1577
+ const { resizeKey, columns, rows } = useTerminalSize();
1578
1578
  const runStartRef = (0, import_react11.useRef)(null);
1579
1579
  runStartRef.current = state.runStartMs;
1580
1580
  const charCountRef = (0, import_react11.useRef)(0);
@@ -1582,11 +1582,8 @@ function BossAppInner({ boss, resetUI }) {
1582
1582
  const realTokensAccumRef = (0, import_react11.useRef)(0);
1583
1583
  realTokensAccumRef.current = state.bossInputTokens;
1584
1584
  const [lastUserMessage, setLastUserMessage] = (0, import_react11.useState)("");
1585
- const [overlay, setOverlay] = (0, import_react11.useState)(
1586
- null
1587
- );
1585
+ const overlay = state.overlay;
1588
1586
  const [currentRadio, setCurrentRadio] = (0, import_react11.useState)(() => getCurrentStation());
1589
- const [staticKey, setStaticKey] = (0, import_react11.useState)(0);
1590
1587
  const [updatePending, setUpdatePending] = (0, import_react11.useState)(
1591
1588
  () => getPendingUpdate(VERSION) !== null
1592
1589
  );
@@ -1626,13 +1623,15 @@ function BossAppInner({ boss, resetUI }) {
1626
1623
  );
1627
1624
  const openOverlay = (0, import_react11.useCallback)(
1628
1625
  (next) => {
1629
- setOverlay(next);
1626
+ bossStore.setOverlay(next);
1627
+ if (resetUI) resetUI();
1630
1628
  },
1631
- []
1629
+ [resetUI]
1632
1630
  );
1633
1631
  const closeOverlay = (0, import_react11.useCallback)(() => {
1634
- setOverlay(null);
1635
- }, []);
1632
+ bossStore.setOverlay(null);
1633
+ if (resetUI) resetUI();
1634
+ }, [resetUI]);
1636
1635
  void stdout;
1637
1636
  const handleDoubleExit = useDoublePress(
1638
1637
  (pending) => bossStore.setExitPending(pending),
@@ -1667,10 +1666,9 @@ function BossAppInner({ boss, resetUI }) {
1667
1666
  bossStore.appendInfo(buildHelpText(), "info");
1668
1667
  return true;
1669
1668
  case "clear":
1670
- resetUI?.();
1671
1669
  bossStore.clearHistory();
1670
+ resetUI?.();
1672
1671
  await boss.resetConversation();
1673
- setStaticKey((k) => k + 1);
1674
1672
  bossStore.appendInfo("Session cleared.", "info");
1675
1673
  return true;
1676
1674
  case "model-boss":
@@ -1726,8 +1724,14 @@ function BossAppInner({ boss, resetUI }) {
1726
1724
  }
1727
1725
  handleDoubleExit();
1728
1726
  };
1727
+ if (rows < 14) {
1728
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(Box_default, { flexDirection: "column", width: columns, paddingX: 1, marginTop: 1, children: [
1729
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Text, { bold: true, color: COLORS.accent, children: "Terminal too small" }),
1730
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Text, { color: COLORS.primary, children: `Resize to at least 14 rows to use GG Boss (currently ${rows}).` })
1731
+ ] });
1732
+ }
1729
1733
  return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(Box_default, { flexDirection: "column", width: columns, children: [
1730
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Static, { items: staticItems, style: { width: "100%" }, children: (item) => /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Box_default, { flexDirection: "column", paddingRight: 1, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(StaticRowView, { row: item }) }, item.id) }, `${resizeKey}-${staticKey}`),
1734
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Static, { items: staticItems, style: { width: "100%" }, children: (item) => /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Box_default, { flexDirection: "column", paddingRight: 1, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(StaticRowView, { row: item }) }, item.id) }, resizeKey),
1731
1735
  overlay === "tasks" ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(BossTasksOverlay, { boss, workers: state.workers, onClose: closeOverlay }) : /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_jsx_runtime11.Fragment, { children: [
1732
1736
  state.streaming && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(StreamingTurnView, { turn: state.streaming, isRunning: state.phase === "working" }),
1733
1737
  state.phase === "working" && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
@@ -1879,6 +1883,7 @@ function WorkerStatusBar({
1879
1883
  pendingMessages
1880
1884
  }) {
1881
1885
  const theme = useTheme();
1886
+ const { columns } = useTerminalSize();
1882
1887
  const working = workers.filter((w) => w.status === "working");
1883
1888
  const errored = workers.filter((w) => w.status === "error");
1884
1889
  const idleCount = workers.length - working.length - errored.length;
@@ -1917,19 +1922,21 @@ function WorkerStatusBar({
1917
1922
  ] }) }, "idle")
1918
1923
  );
1919
1924
  }
1920
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(Box_default, { paddingX: 1, children: [
1925
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(Box_default, { paddingX: 1, width: columns, flexShrink: 1, children: [
1921
1926
  anyWorking && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(AnimationActiveSentinel, {}),
1922
- slots.map((slot, i) => /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react11.default.Fragment, { children: [
1923
- i > 0 && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Text, { color: theme.border, children: " \u2502 " }),
1924
- slot
1925
- ] }, i)),
1926
- pendingMessages > 0 && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_jsx_runtime11.Fragment, { children: [
1927
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Text, { color: theme.textDim, children: " " }),
1928
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(Text, { color: theme.warning, children: [
1929
- pendingMessages,
1930
- " message",
1931
- pendingMessages === 1 ? "" : "s",
1932
- " queued"
1927
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(Text, { wrap: "truncate", children: [
1928
+ slots.map((slot, i) => /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react11.default.Fragment, { children: [
1929
+ i > 0 && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Text, { color: theme.border, children: " \u2502 " }),
1930
+ slot
1931
+ ] }, i)),
1932
+ pendingMessages > 0 && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_jsx_runtime11.Fragment, { children: [
1933
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Text, { color: theme.textDim, children: " " }),
1934
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(Text, { color: theme.warning, children: [
1935
+ pendingMessages,
1936
+ " message",
1937
+ pendingMessages === 1 ? "" : "s",
1938
+ " queued"
1939
+ ] })
1933
1940
  ] })
1934
1941
  ] })
1935
1942
  ] });
@@ -2232,6 +2239,15 @@ function renderBossApp(opts) {
2232
2239
  exitOnCtrlC: false
2233
2240
  });
2234
2241
  ref.instance = instance;
2242
+ let resizeTimer = null;
2243
+ const onTerminalResize = () => {
2244
+ if (resizeTimer) clearTimeout(resizeTimer);
2245
+ resizeTimer = setTimeout(() => {
2246
+ resizeTimer = null;
2247
+ resetUI();
2248
+ }, 250);
2249
+ };
2250
+ process.stdout.on("resize", onTerminalResize);
2235
2251
  return {
2236
2252
  // Follow ref.instance through restarts: when /clear nukes the current
2237
2253
  // instance and creates a new one, this promise re-binds to whichever
@@ -2241,15 +2257,25 @@ function renderBossApp(opts) {
2241
2257
  waitUntilExit: async () => {
2242
2258
  while (true) {
2243
2259
  const current = ref.instance;
2244
- if (!current) return;
2260
+ if (!current) {
2261
+ process.stdout.off("resize", onTerminalResize);
2262
+ if (resizeTimer) clearTimeout(resizeTimer);
2263
+ return;
2264
+ }
2245
2265
  await current.waitUntilExit();
2246
2266
  if (ref.instance === current) {
2247
2267
  ref.instance = null;
2268
+ process.stdout.off("resize", onTerminalResize);
2269
+ if (resizeTimer) clearTimeout(resizeTimer);
2248
2270
  return;
2249
2271
  }
2250
2272
  }
2251
2273
  },
2252
- unmount: () => ref.instance?.unmount()
2274
+ unmount: () => {
2275
+ process.stdout.off("resize", onTerminalResize);
2276
+ if (resizeTimer) clearTimeout(resizeTimer);
2277
+ ref.instance?.unmount();
2278
+ }
2253
2279
  };
2254
2280
  }
2255
2281