@leg3ndy/otto-bridge 1.1.1 → 1.1.2

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/README.md CHANGED
@@ -15,7 +15,7 @@ Para o estado atual da arquitetura, capacidades entregues, limitacoes e roadmap
15
15
 
16
16
  Para o corte de arquitetura do `0.9.0`, veja [`leg3ndy-ai-backend/docs/otto-bridge/releases/OTTO_BRIDGE_0_9_0_RELEASE.md`](../leg3ndy-ai-backend/docs/otto-bridge/releases/OTTO_BRIDGE_0_9_0_RELEASE.md).
17
17
 
18
- Para o patch atual `1.1.1`, veja [`leg3ndy-ai-backend/docs/otto-bridge/releases/OTTO_BRIDGE_1_1_1_PATCH.md`](../leg3ndy-ai-backend/docs/otto-bridge/releases/OTTO_BRIDGE_1_1_1_PATCH.md). Para o corte funcional da linha `1.1.0`, veja [`leg3ndy-ai-backend/docs/otto-bridge/releases/OTTO_BRIDGE_1_1_0_RELEASE.md`](../leg3ndy-ai-backend/docs/otto-bridge/releases/OTTO_BRIDGE_1_1_0_RELEASE.md).
18
+ Para o patch atual `1.1.2`, veja [`leg3ndy-ai-backend/docs/otto-bridge/releases/OTTO_BRIDGE_1_1_2_PATCH.md`](../leg3ndy-ai-backend/docs/otto-bridge/releases/OTTO_BRIDGE_1_1_2_PATCH.md). Para o corte funcional da linha `1.1.0`, veja [`leg3ndy-ai-backend/docs/otto-bridge/releases/OTTO_BRIDGE_1_1_0_RELEASE.md`](../leg3ndy-ai-backend/docs/otto-bridge/releases/OTTO_BRIDGE_1_1_0_RELEASE.md).
19
19
 
20
20
  ## Distribuicao
21
21
 
@@ -38,14 +38,14 @@ Enquanto o pacote nao estiver publicado, voce pode gerar um tarball local:
38
38
 
39
39
  ```bash
40
40
  npm pack
41
- npm install -g ./leg3ndy-otto-bridge-1.1.1.tgz
41
+ npm install -g ./leg3ndy-otto-bridge-1.1.2.tgz
42
42
  ```
43
43
 
44
- Na linha `1.1.1`, `playwright` segue como dependencia obrigatoria no `otto-bridge`. O primeiro `npm install -g @leg3ndy/otto-bridge` pode demorar mais porque instala o browser persistente usado pelo WhatsApp Web e pelos fluxos web em background do bridge.
44
+ Na linha `1.1.2`, `playwright` segue como dependencia obrigatoria no `otto-bridge`. O primeiro `npm install -g @leg3ndy/otto-bridge` pode demorar mais porque instala o browser persistente usado pelo WhatsApp Web e pelos fluxos web em background do bridge.
45
45
 
46
- No macOS, a linha `1.1.1` usa o provider `macos-helper`, um helper `WKWebView` sem Dock para o WhatsApp Web. O helper sobe com user-agent de Chrome moderno para evitar o bloqueio do WhatsApp ao detectar Safari/WebKit. O runtime antigo com Chromium/Playwright fica disponivel apenas como override explicito via `OTTO_BRIDGE_WHATSAPP_RUNTIME_PROVIDER=embedded-playwright`.
46
+ No macOS, a linha `1.1.2` usa o provider `macos-helper`, um helper `WKWebView` sem Dock para o WhatsApp Web. O helper sobe com user-agent de Chrome moderno para evitar o bloqueio do WhatsApp ao detectar Safari/WebKit. O runtime antigo com Chromium/Playwright fica disponivel apenas como override explicito via `OTTO_BRIDGE_WHATSAPP_RUNTIME_PROVIDER=embedded-playwright`.
47
47
 
48
- No nivel arquitetural, o `0.9.0` marcou a mudanca de papel do bridge: ele publica tools e resultados estruturados para o Otto, em vez de injetar resposta pronta como caminho principal do chat. O `1.0.0` oficializou isso como runtime agentico; o `1.1.1` adiciona a camada workspace-first com rail de coding, trust/policy por workspace, source control first-class, working set persistido e grounding remoto por repositório.
48
+ No nivel arquitetural, o `0.9.0` marcou a mudanca de papel do bridge: ele publica tools e resultados estruturados para o Otto, em vez de injetar resposta pronta como caminho principal do chat. O `1.0.0` oficializou isso como runtime agentico; o `1.1.2` mantem a camada workspace-first com rail de coding, trust/policy por workspace, source control first-class, working set persistido e grounding remoto por repositório, enquanto estabiliza o `Otto Console` com header fixo, intro card sem `model:` e redraw limpo no resize.
49
49
 
50
50
  ## Publicacao
51
51
 
@@ -153,7 +153,7 @@ Dentro do console, use:
153
153
  - `/workspace use <id|n>` para fixar um workspace anexado na sessão atual
154
154
  - `/workspace clear` para limpar o binding atual do chat/sessão
155
155
 
156
- No TTY, o composer agora fica ancorado no rodapé com placeholder `Peça algo ao Otto`, quebra por largura real do terminal e deixa o transcript do Otto sempre visível acima. Logo abaixo do input, o console mostra o modelo ativo, a barra de uso de contexto/tokens e o modo de aprovação atual; `Shift+Tab` alterna esse modo sem sair do console.
156
+ No TTY, o console agora usa buffer alternativo com header fixo no topo: banner, card azul com `cwd`/`bridge` e linha de comandos continuam visíveis enquanto o transcript cresce. O composer fica ancorado no rodapé com placeholder `Peça algo ao Otto`, quebra por largura real do terminal e mantém o transcript do Otto sempre acima sem duplicar a viewport no resize. O intro card não repete `model:`, o footer mostra o modelo ativo em cinza claro, e as mensagens renderizam o usuário com `>` e o assistente com bolinha azul, com espaçamento entre os blocos; `Shift+Tab` alterna o modo de aprovação sem sair do console.
157
157
 
158
158
  No modo `OttoAI Thinking`, o terminal agora marca explicitamente o trecho de raciocínio com `Pensando (OttoAI Thinking)` e separa esse bloco da resposta final do Otto.
159
159
 
@@ -169,7 +169,7 @@ Esse comando abre um shell local interativo para instalar extensoes, rodar coman
169
169
 
170
170
  ### WhatsApp Web em background
171
171
 
172
- Fluxo recomendado na linha `1.1.1`:
172
+ Fluxo recomendado na linha `1.1.2`:
173
173
 
174
174
  ```bash
175
175
  otto-bridge extensions --install whatsappweb
@@ -179,13 +179,13 @@ otto-bridge extensions --status whatsappweb
179
179
 
180
180
  O setup agora abre o login do WhatsApp Web no helper/background browser do proprio bridge. Depois do QR code, o Otto usa a sessao local em background, sem depender de aba visivel no Safari.
181
181
 
182
- Contrato da linha `1.1.1`:
182
+ Contrato da linha `1.1.2`:
183
183
 
184
184
  - `otto-bridge extensions --setup whatsappweb`: autentica a sessao uma vez
185
185
  - `otto-bridge`: mantem o browser persistente do WhatsApp vivo em background enquanto o runtime do hub estiver ativo, sem depender de uma aba aberta no Safari
186
186
  - ao fechar o `otto-bridge`: o browser em background e desligado, mas a sessao local fica lembrada para o proximo boot
187
187
 
188
- ## Handoff rapido da linha 1.1.1
188
+ ## Handoff rapido da linha 1.1.2
189
189
 
190
190
  Ja fechado no codigo:
191
191
 
@@ -238,6 +238,9 @@ function renderBanner() {
238
238
  `${style(subtitle, ANSI.slate, enabled)}`,
239
239
  ].join("\n");
240
240
  }
241
+ function getCardMaxContentWidth() {
242
+ return Math.max(24, Number(output.columns || 96) - 4);
243
+ }
241
244
  function createCliExitError() {
242
245
  return new Error(CLI_EXIT_SENTINEL);
243
246
  }
@@ -425,16 +428,30 @@ function buildConsoleFooterStatusLine(width, modelMode, usageTokens, enabled) {
425
428
  const usageRatio = contextLimit > 0 ? usageTokens / contextLimit : 0;
426
429
  const percent = Math.round(Math.max(0, Math.min(usageRatio, 1)) * 100);
427
430
  const barWidth = Math.max(12, Math.min(28, Math.floor(width * 0.18)));
428
- return `${getCliModelLabel(modelMode)} | ${buildConsoleUsageBar(barWidth, usageRatio, enabled)} ${percent}% | ${formatCompactTokenCount(usageTokens)} tokens`;
431
+ const modelLabel = style(getCliModelLabel(modelMode), ANSI.slate, enabled);
432
+ return `${modelLabel} | ${buildConsoleUsageBar(barWidth, usageRatio, enabled)} ${percent}% | ${formatCompactTokenCount(usageTokens)} tokens`;
429
433
  }
430
434
  function buildConsoleFooterApprovalLine(mode, enabled, statusSuffix) {
431
435
  const state = getConsoleApprovalFooterState(mode);
432
436
  const hint = statusSuffix || "Shift+Tab para alternar";
433
437
  return style(`${state.label} (${hint})`, state.tone === "warning" ? ANSI.red : state.tone === "primary" ? ANSI.amber : ANSI.slate, enabled);
434
438
  }
439
+ function styleTranscriptPrefix(text, tone, enabled) {
440
+ if (!enabled || !text) {
441
+ return text;
442
+ }
443
+ if (tone === "assistant") {
444
+ return `${ANSI.bold}${ANSI.brandBlue}${text}${ANSI.reset}`;
445
+ }
446
+ if (tone === "user") {
447
+ return `${ANSI.bold}${ANSI.white}${text}${ANSI.reset}`;
448
+ }
449
+ return text;
450
+ }
435
451
  class ConsoleScreenRenderer {
436
452
  modelMode;
437
453
  approvalMode;
454
+ headerFactory;
438
455
  transcript = [];
439
456
  onResize = () => {
440
457
  this.render();
@@ -444,15 +461,19 @@ class ConsoleScreenRenderer {
444
461
  draftValue = "";
445
462
  conversationMessages = [];
446
463
  approvalStatusSuffix = null;
447
- constructor(modelMode, approvalMode) {
464
+ usingAlternateBuffer = false;
465
+ constructor(modelMode, approvalMode, headerFactory = () => []) {
448
466
  this.modelMode = modelMode;
449
467
  this.approvalMode = approvalMode;
468
+ this.headerFactory = headerFactory;
450
469
  }
451
470
  activate() {
452
471
  if (this.active || !supportsAnsi() || !input.isTTY || !output.isTTY) {
453
472
  return;
454
473
  }
455
474
  this.active = true;
475
+ output.write("\u001b[?1049h");
476
+ this.usingAlternateBuffer = true;
456
477
  output.on("resize", this.onResize);
457
478
  this.render();
458
479
  }
@@ -463,6 +484,10 @@ class ConsoleScreenRenderer {
463
484
  output.off("resize", this.onResize);
464
485
  this.active = false;
465
486
  output.write("\u001b[?25h");
487
+ if (this.usingAlternateBuffer) {
488
+ output.write("\u001b[?1049l");
489
+ this.usingAlternateBuffer = false;
490
+ }
466
491
  }
467
492
  isActive() {
468
493
  return this.active;
@@ -523,7 +548,8 @@ class ConsoleScreenRenderer {
523
548
  const wrapped = sliceByWidth(logicalLine, Math.max(1, width - currentPrefix.length));
524
549
  wrapped.forEach((segment, index) => {
525
550
  const linePrefix = isFirstVisualLine && index === 0 ? prefix : continuationPrefix;
526
- rendered.push(styleTranscriptLine(`${linePrefix}${segment}`, entry.tone, supportsAnsi()));
551
+ const prefixTone = isFirstVisualLine && index === 0 ? entry.prefixTone : undefined;
552
+ rendered.push(`${styleTranscriptPrefix(linePrefix, prefixTone, supportsAnsi())}${styleTranscriptLine(segment, entry.tone, supportsAnsi())}`);
527
553
  });
528
554
  if (logicalLine.length === 0 && wrapped.length === 0) {
529
555
  rendered.push("");
@@ -539,6 +565,7 @@ class ConsoleScreenRenderer {
539
565
  const enabled = supportsAnsi();
540
566
  const width = Math.max(48, Number(output.columns || 96));
541
567
  const height = Math.max(12, Number(output.rows || 24));
568
+ const headerLines = this.headerFactory();
542
569
  const separator = style("─".repeat(width), ANSI.brandBlue, enabled);
543
570
  const composer = renderConsoleComposerLines(this.draftValue, width, enabled);
544
571
  const usageTokens = Math.min(estimateConsoleContextTokens(this.conversationMessages, this.draftValue), getCliModelContextWindowTokens(this.modelMode));
@@ -549,7 +576,8 @@ class ConsoleScreenRenderer {
549
576
  buildConsoleFooterStatusLine(width, this.modelMode, usageTokens, enabled),
550
577
  buildConsoleFooterApprovalLine(this.approvalMode, enabled, this.approvalStatusSuffix),
551
578
  ];
552
- const transcriptHeight = Math.max(0, height - footerLines.length);
579
+ const visibleHeader = headerLines.slice(0, Math.max(0, height - footerLines.length));
580
+ const transcriptHeight = Math.max(0, height - visibleHeader.length - footerLines.length);
553
581
  const transcriptLines = this.transcript.flatMap((entry) => this.buildEntryLines(entry, width));
554
582
  const visibleTranscript = transcriptLines.slice(-transcriptHeight);
555
583
  const paddedTranscript = [
@@ -558,8 +586,8 @@ class ConsoleScreenRenderer {
558
586
  ];
559
587
  output.write("\u001b[?25l");
560
588
  output.write("\u001b[H\u001b[2J");
561
- output.write([...paddedTranscript, ...footerLines].join("\n"));
562
- cursorTo(output, Math.min(width - 1, CONSOLE_COMPOSER_CURSOR_COLUMN + composer.cursorColumn), transcriptHeight + 1 + composer.cursorLineIndex);
589
+ output.write([...visibleHeader, ...paddedTranscript, ...footerLines].join("\n"));
590
+ cursorTo(output, Math.min(width - 1, CONSOLE_COMPOSER_CURSOR_COLUMN + composer.cursorColumn), visibleHeader.length + transcriptHeight + 1 + composer.cursorLineIndex);
563
591
  output.write("\u001b[?25h");
564
592
  }
565
593
  }
@@ -797,13 +825,14 @@ function styleCardLine(line, tone, enabled) {
797
825
  }
798
826
  return `${ANSI.white}${line}${ANSI.reset}`;
799
827
  }
800
- function renderInfoCard(lines) {
828
+ export function renderInfoCard(lines, maxContentWidth = 82) {
801
829
  const enabled = supportsAnsi();
830
+ const safeMaxContentWidth = Math.max(20, maxContentWidth);
802
831
  const normalized = lines.map((line) => ({
803
- text: truncate(line.text, 82),
832
+ text: truncate(line.text, safeMaxContentWidth),
804
833
  tone: line.tone,
805
834
  }));
806
- const width = Math.max(44, ...normalized.map((line) => line.text.length));
835
+ const width = Math.max(Math.min(44, safeMaxContentWidth), ...normalized.map((line) => line.text.length));
807
836
  const top = style(`┌${"─".repeat(width + 2)}┐`, ANSI.brandBlue, enabled);
808
837
  const bottom = style(`└${"─".repeat(width + 2)}┘`, ANSI.brandBlue, enabled);
809
838
  return [
@@ -816,17 +845,31 @@ function renderInfoCard(lines) {
816
845
  bottom,
817
846
  ].join("\n");
818
847
  }
819
- function buildWelcomeCard(runtimeSession, modelMode) {
848
+ export function buildWelcomeCard(runtimeSession) {
820
849
  return [
821
850
  { text: "Welcome to OttoAI", tone: "title" },
822
851
  { text: "", tone: "muted" },
823
852
  { text: "/help inside the console, /status for bridge details", tone: "muted" },
824
853
  { text: "", tone: "muted" },
825
- { text: `model: ${getCliModelLabel(modelMode)}`, tone: "muted" },
826
854
  { text: `cwd: ${process.cwd()}`, tone: "muted" },
827
855
  { text: renderRuntimeHeadline(runtimeSession), tone: "muted" },
828
856
  ];
829
857
  }
858
+ function buildConsoleHeaderLines(runtimeSession) {
859
+ const lines = [
860
+ ...renderBanner().split("\n"),
861
+ "",
862
+ ...renderInfoCard(buildWelcomeCard(runtimeSession), getCardMaxContentWidth()).split("\n"),
863
+ ];
864
+ const releaseNotice = runtimeSession.getReleaseNotice();
865
+ if (releaseNotice) {
866
+ lines.push("");
867
+ lines.push(...renderInfoCard(buildBridgeReleaseCard(releaseNotice), getCardMaxContentWidth()).split("\n"));
868
+ }
869
+ lines.push("");
870
+ lines.push(style(`Comandos: ${CONSOLE_COMMAND_HINT}`, ANSI.slateItalic, supportsAnsi()));
871
+ return lines;
872
+ }
830
873
  function buildBridgeReleaseCard(notice) {
831
874
  const isRequired = notice.kind === "required";
832
875
  return [
@@ -916,29 +959,20 @@ async function buildExtensionsCard(config) {
916
959
  }
917
960
  return lines;
918
961
  }
919
- function printHubScreen(runtimeSession, modelMode) {
962
+ function printHubScreen(runtimeSession) {
920
963
  clearScreen();
921
964
  console.log(renderBanner());
922
965
  console.log("");
923
- console.log(renderInfoCard(buildWelcomeCard(runtimeSession, modelMode)));
966
+ console.log(renderInfoCard(buildWelcomeCard(runtimeSession), getCardMaxContentWidth()));
924
967
  const releaseNotice = runtimeSession?.getReleaseNotice();
925
968
  if (releaseNotice) {
926
969
  console.log("");
927
- console.log(renderInfoCard(buildBridgeReleaseCard(releaseNotice)));
970
+ console.log(renderInfoCard(buildBridgeReleaseCard(releaseNotice), getCardMaxContentWidth()));
928
971
  }
929
972
  }
930
- function printConsoleScreen(runtimeSession, modelMode) {
973
+ function printConsoleScreen(runtimeSession) {
931
974
  clearScreen();
932
- console.log(renderBanner());
933
- console.log("");
934
- console.log(renderInfoCard(buildWelcomeCard(runtimeSession, modelMode)));
935
- const releaseNotice = runtimeSession.getReleaseNotice();
936
- if (releaseNotice) {
937
- console.log("");
938
- console.log(renderInfoCard(buildBridgeReleaseCard(releaseNotice)));
939
- }
940
- console.log("");
941
- printSoft(`Comandos: ${CONSOLE_COMMAND_HINT}`);
975
+ console.log(buildConsoleHeaderLines(runtimeSession).join("\n"));
942
976
  console.log("");
943
977
  }
944
978
  function formatConsoleWorkspaceLine(workspace, options) {
@@ -1652,11 +1686,11 @@ async function runOttoConsole(rl, config, runtimeSession, options) {
1652
1686
  const sessionId = randomUUID();
1653
1687
  const conversation = [];
1654
1688
  const ui = supportsAnsi() && typeof input.setRawMode === "function" && input.isTTY && output.isTTY
1655
- ? new ConsoleScreenRenderer(activeModel, config.approvalMode)
1689
+ ? new ConsoleScreenRenderer(activeModel, config.approvalMode, () => buildConsoleHeaderLines(runtimeSession))
1656
1690
  : null;
1657
1691
  ui?.activate();
1658
1692
  if (!ui) {
1659
- printConsoleScreen(runtimeSession, activeModel);
1693
+ printConsoleScreen(runtimeSession);
1660
1694
  }
1661
1695
  const renderConversationState = () => {
1662
1696
  ui?.setConversationMessages(conversation);
@@ -1669,12 +1703,13 @@ async function runOttoConsole(rl, config, runtimeSession, options) {
1669
1703
  text,
1670
1704
  tone,
1671
1705
  prefix: options?.prefix,
1706
+ prefixTone: options?.prefixTone,
1672
1707
  continuationPrefix: options?.continuationPrefix,
1673
1708
  });
1674
1709
  return;
1675
1710
  }
1676
1711
  if (options?.prefix) {
1677
- console.log(`${options.prefix}${text}`);
1712
+ console.log(`${styleTranscriptPrefix(options.prefix, options.prefixTone, supportsAnsi())}${styleTranscriptLine(text, tone, supportsAnsi())}`);
1678
1713
  return;
1679
1714
  }
1680
1715
  if (tone === "warning") {
@@ -1698,6 +1733,14 @@ async function runOttoConsole(rl, config, runtimeSession, options) {
1698
1733
  const emitUserPrompt = (text) => {
1699
1734
  emitConsoleEntry(text, "user", {
1700
1735
  prefix: "> ",
1736
+ prefixTone: "user",
1737
+ continuationPrefix: " ",
1738
+ });
1739
+ };
1740
+ const emitAssistantPrompt = (text) => {
1741
+ emitConsoleEntry(text, "assistant", {
1742
+ prefix: "• ",
1743
+ prefixTone: "assistant",
1701
1744
  continuationPrefix: " ",
1702
1745
  });
1703
1746
  };
@@ -1886,7 +1929,12 @@ async function runOttoConsole(rl, config, runtimeSession, options) {
1886
1929
  : status === "failed"
1887
1930
  ? "Execução local falhou."
1888
1931
  : "Execução local cancelada.");
1889
- emitConsoleEntry(summary, status === "failed" ? "error" : status === "cancelled" ? "warning" : "assistant");
1932
+ if (status === "completed") {
1933
+ emitAssistantPrompt(summary);
1934
+ }
1935
+ else {
1936
+ emitConsoleEntry(summary, status === "failed" ? "error" : "warning");
1937
+ }
1890
1938
  const rendered = renderStructuredOutcome(job);
1891
1939
  if (rendered) {
1892
1940
  emitConsoleEntry(rendered, "muted");
@@ -1910,7 +1958,7 @@ async function runOttoConsole(rl, config, runtimeSession, options) {
1910
1958
  ui?.clearTranscript();
1911
1959
  renderConversationState();
1912
1960
  if (!ui) {
1913
- printConsoleScreen(runtimeSession, activeModel);
1961
+ printConsoleScreen(runtimeSession);
1914
1962
  }
1915
1963
  emitConsoleEntry("Contexto local do console limpo.", "muted");
1916
1964
  return;
@@ -1978,6 +2026,7 @@ async function runOttoConsole(rl, config, runtimeSession, options) {
1978
2026
  throw createCliExitError();
1979
2027
  }
1980
2028
  emitUserPrompt(normalizedPrompt);
2029
+ emitConsoleEntry("", "muted");
1981
2030
  conversation.push({ role: "user", content: normalizedPrompt });
1982
2031
  while (conversation.length > 18) {
1983
2032
  conversation.shift();
@@ -2041,8 +2090,17 @@ async function runOttoConsole(rl, config, runtimeSession, options) {
2041
2090
  }
2042
2091
  if (!assistantPrefixPrinted) {
2043
2092
  assistantEntryId = ui
2044
- ? ui.pushEntry({ text: "", tone: "assistant" })
2093
+ ? ui.pushEntry({
2094
+ text: "",
2095
+ tone: "assistant",
2096
+ prefix: "• ",
2097
+ prefixTone: "assistant",
2098
+ continuationPrefix: " ",
2099
+ })
2045
2100
  : null;
2101
+ if (!ui) {
2102
+ output.write(styleTranscriptPrefix("• ", "assistant", supportsAnsi()));
2103
+ }
2046
2104
  assistantPrefixPrinted = true;
2047
2105
  }
2048
2106
  if (ui && assistantEntryId) {
@@ -2065,7 +2123,7 @@ async function runOttoConsole(rl, config, runtimeSession, options) {
2065
2123
  : null;
2066
2124
  const jobId = normalizeText(job?.id);
2067
2125
  if (bridgeSummary && !jobId) {
2068
- emitConsoleEntry(bridgeSummary, "assistant");
2126
+ emitAssistantPrompt(bridgeSummary);
2069
2127
  }
2070
2128
  if (jobId) {
2071
2129
  finalAssistantSummary = await followConsoleJobUi(jobId);
@@ -2188,7 +2246,7 @@ export async function launchInteractiveCli(options) {
2188
2246
  try {
2189
2247
  let config = await loadBridgeConfig();
2190
2248
  if (!config) {
2191
- printHubScreen(null, "fast");
2249
+ printHubScreen(null);
2192
2250
  const setup = await runSetupWizard(rl, options);
2193
2251
  config = setup.config;
2194
2252
  if (config && setup.openConsole) {
@@ -2205,7 +2263,7 @@ export async function launchInteractiveCli(options) {
2205
2263
  await runtimeSession.ensureStarted();
2206
2264
  await runtimeSession.waitForReady();
2207
2265
  for (;;) {
2208
- printHubScreen(runtimeSession, "fast");
2266
+ printHubScreen(runtimeSession);
2209
2267
  const choice = await pickHomeChoice(rl, true);
2210
2268
  if (choice === "exit") {
2211
2269
  break;
@@ -2303,7 +2361,7 @@ export async function runSetupCommand(options) {
2303
2361
  const rl = await createPromptInterface();
2304
2362
  let runtimeSession = null;
2305
2363
  try {
2306
- printHubScreen(null, "fast");
2364
+ printHubScreen(null);
2307
2365
  const setup = await runSetupWizard(rl, options);
2308
2366
  if (setup.config && setup.openConsole) {
2309
2367
  runtimeSession = new CliRuntimeSession(setup.config);
@@ -2326,7 +2384,7 @@ export async function runConsoleCommand(initialPrompt) {
2326
2384
  const rl = await createPromptInterface();
2327
2385
  let runtimeSession = null;
2328
2386
  try {
2329
- printHubScreen(null, "fast");
2387
+ printHubScreen(null);
2330
2388
  let config = await loadBridgeConfig();
2331
2389
  if (!config) {
2332
2390
  const setup = await runSetupWizard(rl);
package/dist/types.js CHANGED
@@ -1,5 +1,5 @@
1
1
  export const BRIDGE_CONFIG_VERSION = 1;
2
- export const BRIDGE_VERSION = "1.1.1";
2
+ export const BRIDGE_VERSION = "1.1.2";
3
3
  export const BRIDGE_PACKAGE_NAME = "@leg3ndy/otto-bridge";
4
4
  export const DEFAULT_API_BASE_URL = "http://localhost:8000";
5
5
  export const DEFAULT_POLL_INTERVAL_MS = 3000;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leg3ndy/otto-bridge",
3
- "version": "1.1.1",
3
+ "version": "1.1.2",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Local companion for Otto Bridge device pairing and WebSocket runtime.",
@@ -24,7 +24,7 @@ if (!existsSync(mainPath)) {
24
24
  process.exit(0);
25
25
  }
26
26
 
27
- console.log("\n[otto-bridge] Welcome to OTTOAI 1.1.1");
27
+ console.log("\n[otto-bridge] Welcome to OTTOAI 1.1.2");
28
28
  console.log("[otto-bridge] Vamos iniciar o setup interativo do bridge.\n");
29
29
 
30
30
  const result = spawnSync(process.execPath, [mainPath, "setup", "--postinstall"], {