@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 +9 -9
- package/dist/cli_terminal.js +94 -36
- package/dist/types.js +1 -1
- package/package.json +1 -1
- package/scripts/postinstall.mjs +1 -1
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.
|
|
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.
|
|
41
|
+
npm install -g ./leg3ndy-otto-bridge-1.1.2.tgz
|
|
42
42
|
```
|
|
43
43
|
|
|
44
|
-
Na linha `1.1.
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
188
|
+
## Handoff rapido da linha 1.1.2
|
|
189
189
|
|
|
190
190
|
Ja fechado no codigo:
|
|
191
191
|
|
package/dist/cli_terminal.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
962
|
+
function printHubScreen(runtimeSession) {
|
|
920
963
|
clearScreen();
|
|
921
964
|
console.log(renderBanner());
|
|
922
965
|
console.log("");
|
|
923
|
-
console.log(renderInfoCard(buildWelcomeCard(runtimeSession,
|
|
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
|
|
973
|
+
function printConsoleScreen(runtimeSession) {
|
|
931
974
|
clearScreen();
|
|
932
|
-
console.log(
|
|
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
|
|
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
|
-
|
|
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
|
|
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({
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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
package/scripts/postinstall.mjs
CHANGED
|
@@ -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.
|
|
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"], {
|