nexrall-code 0.5.82 → 0.5.83

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/index.js +38 -7
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -55925,7 +55925,7 @@ function renderBanner(info) {
55925
55925
  const PAD = 1;
55926
55926
  const CHROME = 3 + 4 * PAD;
55927
55927
  const LOGO_W = Math.max(...NEX_LOGO.map(visibleLen));
55928
- const termW = process.stdout.columns || 100;
55928
+ const termW = info.columns ?? process.stdout.columns ?? 100;
55929
55929
  const totalW = Math.max(LOGO_W + CHROME + 24, termW - 1);
55930
55930
  const headerText = `Nexrall Code v${info.version}`;
55931
55931
  const LEFT_W = Math.max(LOGO_W, visibleLen(headerText));
@@ -64945,11 +64945,14 @@ function repaintAfterResizeSettle() {
64945
64945
  if (inkInstance !== instance)
64946
64946
  return;
64947
64947
  process.stdout.write("\x1B[0J");
64948
+ forceFullRedrawRef?.();
64948
64949
  });
64949
64950
  }
64951
+ var forceFullRedrawRef = null;
64950
64952
  var DEFAULT_PROMPT = colors.primary.bold("> ");
64951
64953
  var App2 = ({ onReady }) => {
64952
64954
  const [items, setItems] = (0, import_react35.useState)([]);
64955
+ const [staticKey, setStaticKey] = (0, import_react35.useState)(0);
64953
64956
  const [footer, setFooterState] = (0, import_react35.useState)({ mode: "auto", autoApprove: false });
64954
64957
  const [busy, setBusyState] = (0, import_react35.useState)(false);
64955
64958
  const [line, setLineState] = (0, import_react35.useState)("");
@@ -64979,8 +64982,12 @@ var App2 = ({ onReady }) => {
64979
64982
  setQuitArmedState(at);
64980
64983
  }, []);
64981
64984
  const [live, setLiveState] = (0, import_react35.useState)("");
64982
- const print = (0, import_react35.useCallback)((text) => {
64983
- setItems((prev) => [...prev, { id: idCounter++, content: text }]);
64985
+ const print = (0, import_react35.useCallback)((text, opts) => {
64986
+ setItems((prev) => [...prev, { id: idCounter++, content: text, isBanner: opts?.isBanner }]);
64987
+ }, []);
64988
+ const bannerRegeneratorRef = (0, import_react35.useRef)(null);
64989
+ const setBannerRegenerator = (0, import_react35.useCallback)((fn) => {
64990
+ bannerRegeneratorRef.current = fn;
64984
64991
  }, []);
64985
64992
  const setFooter = (0, import_react35.useCallback)((info) => setFooterState(info), []);
64986
64993
  const setLive = (0, import_react35.useCallback)((text) => setLiveState(text), []);
@@ -65115,10 +65122,28 @@ var App2 = ({ onReady }) => {
65115
65122
  return s2.slice(0, pos) + char + s2.slice(pos);
65116
65123
  });
65117
65124
  });
65125
+ const forceFullRedraw = (0, import_react35.useCallback)(() => {
65126
+ process.stdout.write("\x1B[2J\x1B[H");
65127
+ const regen = bannerRegeneratorRef.current;
65128
+ if (regen) {
65129
+ const columns = process.stdout.columns || 80;
65130
+ setItems((prev) => prev.map(
65131
+ (it) => it.isBanner ? { ...it, content: regen(columns) } : it
65132
+ ));
65133
+ }
65134
+ setStaticKey((k) => k + 1);
65135
+ }, []);
65136
+ import_react35.default.useEffect(() => {
65137
+ forceFullRedrawRef = forceFullRedraw;
65138
+ return () => {
65139
+ forceFullRedrawRef = null;
65140
+ };
65141
+ }, [forceFullRedraw]);
65118
65142
  import_react35.default.useEffect(() => {
65119
65143
  onReady({
65120
65144
  print,
65121
65145
  setFooter,
65146
+ setBannerRegenerator,
65122
65147
  setLive,
65123
65148
  askLine,
65124
65149
  onLine,
@@ -65130,7 +65155,7 @@ var App2 = ({ onReady }) => {
65130
65155
  });
65131
65156
  }, []);
65132
65157
  const slices = renderInputSlices(line, cursorPos);
65133
- return /* @__PURE__ */ import_react35.default.createElement(Box_default, { flexDirection: "column" }, /* @__PURE__ */ import_react35.default.createElement(Static, { items }, (item) => /* @__PURE__ */ import_react35.default.createElement(Text, { key: item.id }, item.content)), live ? /* @__PURE__ */ import_react35.default.createElement(Text, null, live) : null, /* @__PURE__ */ import_react35.default.createElement(
65158
+ return /* @__PURE__ */ import_react35.default.createElement(Box_default, { flexDirection: "column" }, /* @__PURE__ */ import_react35.default.createElement(Static, { items, key: staticKey }, (item) => /* @__PURE__ */ import_react35.default.createElement(Text, { key: item.id }, item.content)), live ? /* @__PURE__ */ import_react35.default.createElement(Text, null, live) : null, /* @__PURE__ */ import_react35.default.createElement(
65134
65159
  Box_default,
65135
65160
  {
65136
65161
  borderStyle: "single",
@@ -65140,7 +65165,7 @@ var App2 = ({ onReady }) => {
65140
65165
  borderRight: false,
65141
65166
  borderDimColor: true
65142
65167
  }
65143
- ), /* @__PURE__ */ import_react35.default.createElement(Box_default, null, /* @__PURE__ */ import_react35.default.createElement(Text, null, prompt2), /* @__PURE__ */ import_react35.default.createElement(Text, null, slices.before), /* @__PURE__ */ import_react35.default.createElement(Text, { inverse: true }, slices.atCursor), /* @__PURE__ */ import_react35.default.createElement(Text, null, slices.after)), /* @__PURE__ */ import_react35.default.createElement(
65168
+ ), /* @__PURE__ */ import_react35.default.createElement(Box_default, null, /* @__PURE__ */ import_react35.default.createElement(Text, null, /* @__PURE__ */ import_react35.default.createElement(Text, null, prompt2), /* @__PURE__ */ import_react35.default.createElement(Text, null, slices.before), /* @__PURE__ */ import_react35.default.createElement(Text, { inverse: true }, slices.atCursor), /* @__PURE__ */ import_react35.default.createElement(Text, null, slices.after))), /* @__PURE__ */ import_react35.default.createElement(
65144
65169
  Box_default,
65145
65170
  {
65146
65171
  borderStyle: "single",
@@ -65986,14 +66011,20 @@ Set ${TRUST_ENV_VAR}=1 to confirm non-interactively, or run \`nex\` interactivel
65986
66011
  if (branch) {
65987
66012
  tips.push(`On branch ${branch}${changedLines > 0 ? ` (${changedLines} changed)` : ""}.`);
65988
66013
  }
65989
- console.log(renderBanner({
66014
+ const bannerInfo = {
65990
66015
  version: CLI_VERSION,
65991
66016
  userLabel: currentUserLabel(),
65992
66017
  modelLabel: resolveModelLabel(modelAlias),
65993
66018
  workDir,
65994
66019
  nexrallMdLoaded: !!nexrallMd,
65995
66020
  tips
65996
- }));
66021
+ };
66022
+ if (interactive) {
66023
+ getInkTerminal().print(renderBanner({ ...bannerInfo, columns: process.stdout.columns ?? 80 }), { isBanner: true });
66024
+ getInkTerminal().setBannerRegenerator((columns) => renderBanner({ ...bannerInfo, columns }));
66025
+ } else {
66026
+ console.log(renderBanner({ ...bannerInfo, columns: process.stdout.columns ?? 80 }));
66027
+ }
65997
66028
  console.log();
65998
66029
  }
65999
66030
  let messages = [];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nexrall-code",
3
- "version": "0.5.82",
3
+ "version": "0.5.83",
4
4
  "description": "Nexrall Code — AI coding assistant for your terminal (headless agent for scripts, CI and automation)",
5
5
  "keywords": [
6
6
  "ai",