@nio-cli/cli 0.2.0 → 0.3.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.
Files changed (77) hide show
  1. package/README.md +68 -26
  2. package/dist/app/ai-client.js +44 -0
  3. package/dist/app/ai-client.js.map +1 -0
  4. package/dist/app/docker-manager.js +12 -9
  5. package/dist/app/docker-manager.js.map +1 -1
  6. package/dist/cli/commands/ai.js +61 -0
  7. package/dist/cli/commands/ai.js.map +1 -0
  8. package/dist/cli/commands/auth.js +91 -70
  9. package/dist/cli/commands/auth.js.map +1 -1
  10. package/dist/cli/commands/config.js +4 -2
  11. package/dist/cli/commands/config.js.map +1 -1
  12. package/dist/cli/commands/debug.js +9 -0
  13. package/dist/cli/commands/debug.js.map +1 -1
  14. package/dist/cli/commands/docker.js +25 -0
  15. package/dist/cli/commands/docker.js.map +1 -1
  16. package/dist/cli/commands/docs/content.js +26 -6
  17. package/dist/cli/commands/docs/content.js.map +1 -1
  18. package/dist/cli/commands/init/auth-step.js +2 -1
  19. package/dist/cli/commands/init/auth-step.js.map +1 -1
  20. package/dist/cli/commands/init/handoff.js +20 -0
  21. package/dist/cli/commands/init/handoff.js.map +1 -0
  22. package/dist/cli/commands/init/index.js +24 -38
  23. package/dist/cli/commands/init/index.js.map +1 -1
  24. package/dist/cli/commands/open.js +8 -0
  25. package/dist/cli/commands/open.js.map +1 -1
  26. package/dist/cli/commands/start.js +8 -0
  27. package/dist/cli/commands/start.js.map +1 -0
  28. package/dist/cli/flows/onboarding.js +116 -0
  29. package/dist/cli/flows/onboarding.js.map +1 -0
  30. package/dist/cli/program.js +58 -0
  31. package/dist/cli/program.js.map +1 -0
  32. package/dist/cli.js +26 -53
  33. package/dist/cli.js.map +1 -1
  34. package/dist/gateway/config.js +1 -2
  35. package/dist/gateway/config.js.map +1 -1
  36. package/dist/lib/auth/gateway-client.js +22 -42
  37. package/dist/lib/auth/gateway-client.js.map +1 -1
  38. package/dist/lib/auth/gateway-process.js +54 -0
  39. package/dist/lib/auth/gateway-process.js.map +1 -0
  40. package/dist/lib/auth/nio-config.js +10 -1
  41. package/dist/lib/auth/nio-config.js.map +1 -1
  42. package/dist/lib/clients/client-configs.js +24 -10
  43. package/dist/lib/clients/client-configs.js.map +1 -1
  44. package/dist/lib/debug.js +6 -0
  45. package/dist/lib/debug.js.map +1 -0
  46. package/dist/lib/headroom.js +44 -0
  47. package/dist/lib/headroom.js.map +1 -0
  48. package/dist/lib/ide-tasks.js +54 -0
  49. package/dist/lib/ide-tasks.js.map +1 -0
  50. package/dist/lib/load-env.js +31 -2
  51. package/dist/lib/load-env.js.map +1 -1
  52. package/dist/matrix-logo.js +43 -11
  53. package/dist/matrix-logo.js.map +1 -1
  54. package/dist/tui/app.js +155 -0
  55. package/dist/tui/app.js.map +1 -0
  56. package/dist/tui/components.js +137 -0
  57. package/dist/tui/components.js.map +1 -0
  58. package/dist/tui/debug.js +17 -0
  59. package/dist/tui/debug.js.map +1 -0
  60. package/dist/tui/index.js +2 -0
  61. package/dist/tui/index.js.map +1 -0
  62. package/dist/tui/launch.js +64 -0
  63. package/dist/tui/launch.js.map +1 -0
  64. package/dist/tui/markdown.js +40 -0
  65. package/dist/tui/markdown.js.map +1 -0
  66. package/dist/tui/opencode.js +33 -0
  67. package/dist/tui/opencode.js.map +1 -0
  68. package/dist/tui/palette-source.js +71 -0
  69. package/dist/tui/palette-source.js.map +1 -0
  70. package/dist/tui/palette.js +58 -0
  71. package/dist/tui/palette.js.map +1 -0
  72. package/dist/tui/state.js +132 -0
  73. package/dist/tui/state.js.map +1 -0
  74. package/dist/tui/theme.js +14 -0
  75. package/dist/tui/theme.js.map +1 -0
  76. package/headroom/docker-compose.yml +27 -0
  77. package/package.json +11 -1
@@ -0,0 +1,137 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { Box, Text, useInput } from 'ink';
4
+ import { theme, sym } from './theme.js';
5
+ import { Markdown } from './markdown.js';
6
+ import { filterPalette } from './palette-source.js';
7
+ const stripControl = (s) => Array.from(s).filter((ch) => ch >= ' ' && ch !== '').join('');
8
+ const splitOnEnter = (s) => s.split(/\r|\n/);
9
+ const KIND_LABEL = {
10
+ command: 'cmd',
11
+ capability: 'agente',
12
+ help: 'ajuda',
13
+ };
14
+ export function Header({ url }) {
15
+ return (_jsxs(Box, { justifyContent: "space-between", paddingX: 1, children: [_jsx(Text, { bold: true, color: theme.accentBright, children: '▞ N I O' }), _jsxs(Text, { color: theme.dim, children: ["opencode/big-pickle \u00B7 ", url.replace(/^https?:\/\//, '')] })] }));
16
+ }
17
+ function Desc({ children }) {
18
+ return _jsx(Text, { color: theme.accent, children: children });
19
+ }
20
+ export const Sidebar = React.memo(function Sidebar({ session, sessions, }) {
21
+ return (_jsxs(Box, { flexDirection: "column", width: 26, flexShrink: 0, borderStyle: "round", borderColor: theme.border, paddingX: 1, children: [_jsx(Text, { bold: true, children: "Sess\u00E3o" }), session ? (_jsxs(_Fragment, { children: [_jsx(Text, { wrap: "truncate-end", children: session.name }), _jsxs(Desc, { children: [session.profile, " \u00B7 ", session.id.slice(0, 8)] })] })) : (_jsx(Desc, { children: "nenhuma vinculada" })), sessions.length > 1 && (_jsxs(_Fragment, { children: [_jsx(Box, { marginTop: 1, children: _jsx(Text, { bold: true, children: "Outras sess\u00F5es" }) }), sessions.slice(0, 3).map((s) => (_jsxs(Text, { color: theme.dim, wrap: "truncate-end", children: [sym.bullet, " ", s.title || s.id.slice(0, 8)] }, s.id)))] })), _jsx(Box, { marginTop: 1, children: _jsx(Text, { bold: true, children: "Atalhos" }) }), _jsxs(Text, { children: [_jsx(Text, { color: theme.accentBright, children: "/" }), " ", _jsx(Desc, { children: "paleta" })] }), _jsxs(Text, { children: [_jsx(Text, { color: theme.accentBright, children: "Esc" }), " ", _jsx(Desc, { children: "abortar" })] }), _jsxs(Text, { children: [_jsx(Text, { color: theme.accentBright, children: "^C" }), " ", _jsx(Desc, { children: "sair" })] })] }));
22
+ });
23
+ function ToolLine({ part }) {
24
+ const running = part.tool?.status === 'running' || part.tool?.status === 'pending';
25
+ const color = running ? theme.warn : part.tool?.status === 'error' ? theme.err : theme.dim;
26
+ return (_jsxs(Text, { wrap: "truncate-end", children: [_jsxs(Text, { color: theme.accent, children: [sym.chevron, " "] }), _jsx(Text, { color: theme.text, children: part.text }), ' ', _jsx(Text, { color: color, children: part.tool?.status ?? '' })] }));
27
+ }
28
+ function Author({ role }) {
29
+ return (_jsx(Text, { bold: true, color: role === 'user' ? theme.user : theme.accentBright, children: role === 'user' ? `${sym.chevron} você` : `${sym.dot} nio` }));
30
+ }
31
+ function Part({ part }) {
32
+ if (part.kind === 'tool')
33
+ return _jsx(ToolLine, { part: part });
34
+ if (part.kind === 'reasoning') {
35
+ const t = part.text.replace(/\s+/g, ' ').trim();
36
+ return t ? _jsxs(Text, { color: theme.dim, wrap: "truncate-end", children: [' ', sym.bullet, " ", t] }) : null;
37
+ }
38
+ return part.text.trim() ? _jsx(Markdown, { text: part.text }) : null;
39
+ }
40
+ export function MessageView({ message }) {
41
+ return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, paddingX: 1, children: [_jsx(Author, { role: message.role }), message.parts.map((p) => (_jsx(Part, { part: p }, p.id)))] }));
42
+ }
43
+ export function LiveMessage({ message, maxLines, }) {
44
+ const text = message.parts.filter((p) => p.kind === 'text').map((p) => p.text).join('');
45
+ const reasoning = message.parts
46
+ .filter((p) => p.kind === 'reasoning')
47
+ .map((p) => p.text)
48
+ .join(' ')
49
+ .replace(/\s+/g, ' ')
50
+ .trim();
51
+ const tools = message.parts.filter((p) => p.kind === 'tool');
52
+ const lines = text.split('\n');
53
+ const shown = lines.slice(-Math.max(2, maxLines));
54
+ const clipped = lines.length > shown.length;
55
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 1, children: [_jsx(Author, { role: message.role }), reasoning && !text && (_jsxs(Text, { color: theme.dim, wrap: "truncate-end", children: [' ', sym.bullet, " ", reasoning.slice(-160)] })), tools.map((t) => (_jsx(ToolLine, { part: t }, t.id))), clipped && _jsx(Text, { color: theme.dim, children: " \u2026 (rolagem acima)" }), shown.map((l, i) => (_jsx(Text, { wrap: "truncate-end", children: l || ' ' }, i)))] }));
56
+ }
57
+ const FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
58
+ export function StatusLine({ busy, frame }) {
59
+ if (!busy)
60
+ return null;
61
+ return (_jsx(Box, { paddingX: 1, children: _jsxs(Text, { color: theme.warn, children: [FRAMES[frame % FRAMES.length], " processando\u2026 ", _jsx(Text, { color: theme.dim, children: "Esc aborta" })] }) }));
62
+ }
63
+ function SlashList({ items, sel }) {
64
+ const cur = items[sel];
65
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.accent, paddingX: 1, children: [items.length === 0 && _jsx(Text, { color: theme.dim, children: "nenhum comando casa" }), items.map((it, n) => (_jsxs(Text, { inverse: n === sel, color: n === sel ? theme.accentBright : undefined, wrap: "truncate-end", children: [' ', _jsxs(Text, { color: theme.dim, children: ["[", KIND_LABEL[it.kind], "]"] }), " ", it.name, " ", _jsx(Text, { color: theme.dim, children: it.desc })] }, `${it.kind}:${it.name}`))), _jsxs(Text, { color: theme.dim, children: ["\u2191\u2193 \u00B7 Enter ", cur?.kind === 'capability' ? 'manda pro agente' : 'abre info', cur?.kind === 'command' ? ' · Ctrl-R roda' : '', " \u00B7 Esc sai"] })] }));
66
+ }
67
+ export function InputBox({ disabled, palette, onSubmit, onDispatch, defaultValue = '', }) {
68
+ const valueRef = React.useRef(defaultValue);
69
+ const [value, setValue] = React.useState(defaultValue);
70
+ const [sel, setSel] = React.useState(0);
71
+ const set = (fn) => {
72
+ valueRef.current = fn(valueRef.current);
73
+ setValue(valueRef.current);
74
+ };
75
+ const inPalette = value.startsWith('/');
76
+ const matches = React.useMemo(() => (inPalette ? filterPalette(palette, value.slice(1)).slice(0, 8) : []), [inPalette, value, palette]);
77
+ const selC = Math.min(sel, Math.max(0, matches.length - 1));
78
+ const submit = () => {
79
+ if (disabled)
80
+ return;
81
+ const v = valueRef.current.trim();
82
+ set(() => '');
83
+ setSel(0);
84
+ if (v)
85
+ onSubmit(v);
86
+ };
87
+ const dispatch = (action) => {
88
+ const it = matches[selC];
89
+ if (!it)
90
+ return;
91
+ set(() => '');
92
+ setSel(0);
93
+ onDispatch(it, action);
94
+ };
95
+ useInput((input, key) => {
96
+ if (key.ctrl && input === 'r') {
97
+ if (inPalette && matches[selC]?.kind === 'command')
98
+ dispatch('run');
99
+ return;
100
+ }
101
+ if (key.ctrl || key.meta || key.tab || key.leftArrow || key.rightArrow)
102
+ return;
103
+ if (key.escape) {
104
+ if (inPalette) {
105
+ set(() => '');
106
+ setSel(0);
107
+ }
108
+ return;
109
+ }
110
+ if (key.upArrow)
111
+ return setSel((n) => Math.max(0, n - 1));
112
+ if (key.downArrow) {
113
+ if (inPalette)
114
+ setSel((n) => Math.min(matches.length - 1, n + 1));
115
+ return;
116
+ }
117
+ if (key.return) {
118
+ if (inPalette)
119
+ return dispatch(matches[selC]?.kind === 'capability' ? 'prompt' : 'info');
120
+ return submit();
121
+ }
122
+ if (key.backspace || key.delete) {
123
+ setSel(0);
124
+ return set((v) => v.slice(0, -1));
125
+ }
126
+ const [head, ...rest] = splitOnEnter(input);
127
+ const clean = stripControl(head ?? '');
128
+ if (clean) {
129
+ setSel(0);
130
+ set((v) => v + clean);
131
+ }
132
+ if (rest.length > 0 && !inPalette)
133
+ submit();
134
+ }, { isActive: true });
135
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { borderStyle: "round", borderColor: disabled ? theme.dim : inPalette ? theme.accentBright : theme.accent, paddingX: 1, children: _jsxs(Text, { wrap: "truncate-start", children: [_jsxs(Text, { color: disabled ? theme.dim : theme.accent, children: [sym.chevron, " "] }), value, _jsx(Text, { color: theme.dim, children: "\u258C" }), disabled && !value && _jsx(Text, { color: theme.dim, children: "(pode digitar; envia quando a resposta terminar)" })] }) }), inPalette && _jsx(SlashList, { items: matches, sel: selC })] }));
136
+ }
137
+ //# sourceMappingURL=components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.js","sourceRoot":"","sources":["../../src/tui/components.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { appendFileSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { DEBUG } from '../lib/debug.js';
5
+ const FILE = join(homedir(), '.nio', 'tui.log');
6
+ export function tlog(...args) {
7
+ if (!DEBUG)
8
+ return;
9
+ try {
10
+ const line = args.map((a) => (typeof a === 'string' ? a : JSON.stringify(a))).join(' ');
11
+ appendFileSync(FILE, `${new Date().toISOString()} ${line}\n`);
12
+ }
13
+ catch {
14
+ }
15
+ }
16
+ export const TUI_LOG_FILE = FILE;
17
+ //# sourceMappingURL=debug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/tui/debug.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAExC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AAEhD,MAAM,UAAU,IAAI,CAAC,GAAG,IAAe;IACrC,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxF,cAAc,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;IAET,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { launchNioTui } from './launch.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,64 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { spawn } from 'node:child_process';
3
+ import { render } from 'ink';
4
+ import { ensureHeadroomAndWire } from '../app/ai-client.js';
5
+ import { isBinaryInstalled } from '../lib/clients/client-install.js';
6
+ import { loadSession } from '../lib/auth/session-store.js';
7
+ import { createSessionRepository } from '../adapters/pg/session-repository.js';
8
+ import { buildProgram } from '../cli/program.js';
9
+ import { c, sym } from '../lib/colors.js';
10
+ import { startOpencode } from './opencode.js';
11
+ import { App } from './app.js';
12
+ async function resolveSessionMeta() {
13
+ try {
14
+ const stored = await loadSession();
15
+ if (!stored)
16
+ return null;
17
+ const active = await createSessionRepository().findActiveByUser(stored.userId);
18
+ return active ? { name: active.name, profile: active.profile, id: active.id } : null;
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ }
24
+ function fallbackToOpencodeTui(cwd) {
25
+ console.log(c.dim(' (interface NIO indisponível — abrindo a TUI do OpenCode)'));
26
+ return new Promise((resolve) => {
27
+ const child = spawn('opencode', [], { stdio: 'inherit', cwd });
28
+ child.on('exit', (code) => resolve(code ?? 0));
29
+ child.on('error', () => resolve(127));
30
+ });
31
+ }
32
+ export async function launchNioTui({ cwd }) {
33
+ await ensureHeadroomAndWire();
34
+ if (!process.stdout.isTTY || !process.stdin.isTTY) {
35
+ console.error(' `nio ai` precisa de um terminal interativo.');
36
+ return 1;
37
+ }
38
+ if (!isBinaryInstalled('opencode')) {
39
+ console.log(` ${c.yellow(sym.warn)} OpenCode não está no PATH. Instale com \`npm i -g opencode-ai\`.`);
40
+ return 127;
41
+ }
42
+ let handle;
43
+ try {
44
+ handle = await startOpencode(cwd);
45
+ }
46
+ catch (err) {
47
+ console.error(` ${c.yellow(sym.warn)} opencode serve não subiu: ${err.message}`);
48
+ return fallbackToOpencodeTui(cwd);
49
+ }
50
+ const program = buildProgram();
51
+ const session = await resolveSessionMeta();
52
+ const app = render(_jsx(App, { handle: handle, program: program, cwd: cwd, session: session }), {
53
+ patchConsole: false,
54
+ exitOnCtrlC: true,
55
+ });
56
+ try {
57
+ await app.waitUntilExit();
58
+ }
59
+ finally {
60
+ handle.close();
61
+ }
62
+ return 0;
63
+ }
64
+ //# sourceMappingURL=launch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch.js","sourceRoot":"","sources":["../../src/tui/launch.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import { theme } from './theme.js';
4
+ function inline(text, key) {
5
+ const parts = text.split(/(\*\*[^*]+\*\*|`[^`]+`)/g);
6
+ return (_jsx(Text, { children: parts.map((p, i) => {
7
+ if (p.startsWith('**') && p.endsWith('**'))
8
+ return _jsx(Text, { bold: true, children: p.slice(2, -2) }, i);
9
+ if (p.startsWith('`') && p.endsWith('`'))
10
+ return _jsx(Text, { color: theme.accent, children: p.slice(1, -1) }, i);
11
+ return _jsx(Text, { children: p }, i);
12
+ }) }, key));
13
+ }
14
+ export function Markdown({ text }) {
15
+ const blocks = [];
16
+ const segments = text.split(/```/g);
17
+ segments.forEach((seg, i) => {
18
+ if (i % 2 === 1) {
19
+ const lines = seg.replace(/^\n/, '').split('\n');
20
+ if (lines.length && /^[a-z0-9+-]*$/i.test(lines[0].trim()) && lines[0].trim().length < 12)
21
+ lines.shift();
22
+ blocks.push(_jsx(Box, { borderStyle: "round", borderColor: theme.dim, paddingX: 1, flexDirection: "column", children: lines.map((l, j) => (_jsx(Text, { color: theme.dim, children: l || ' ' }, j))) }, `c${i}`));
23
+ return;
24
+ }
25
+ seg.split('\n').forEach((line, j) => {
26
+ if (!line.trim()) {
27
+ blocks.push(_jsx(Text, { children: " " }, `b${i}-${j}`));
28
+ return;
29
+ }
30
+ const h = /^(#{1,3})\s+(.*)/.exec(line);
31
+ if (h) {
32
+ blocks.push(_jsx(Text, { bold: true, color: theme.accentBright, children: h[2] }, `h${i}-${j}`));
33
+ return;
34
+ }
35
+ blocks.push(inline(line, i * 1000 + j));
36
+ });
37
+ });
38
+ return _jsx(Box, { flexDirection: "column", children: blocks });
39
+ }
40
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/tui/markdown.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { createOpencodeServer, createOpencodeClient, } from '@opencode-ai/sdk';
2
+ import { tlog } from './debug.js';
3
+ export async function startOpencode(cwd) {
4
+ const server = await createOpencodeServer({ hostname: '127.0.0.1', port: 0 });
5
+ tlog('opencode serve em', server.url);
6
+ const client = createOpencodeClient({ baseUrl: server.url, directory: cwd });
7
+ return { client, url: server.url, close: () => server.close() };
8
+ }
9
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
10
+ export async function* subscribeEvents(client, signal) {
11
+ let backoff = 500;
12
+ while (!signal.aborted) {
13
+ try {
14
+ const res = await client.event.subscribe();
15
+ yield null;
16
+ backoff = 500;
17
+ for await (const evt of res.stream) {
18
+ if (signal.aborted)
19
+ return;
20
+ yield evt;
21
+ }
22
+ tlog('event stream terminou — reconectando');
23
+ }
24
+ catch (err) {
25
+ tlog('event stream erro', err.message);
26
+ }
27
+ if (signal.aborted)
28
+ return;
29
+ await sleep(backoff);
30
+ backoff = Math.min(backoff * 2, 5000);
31
+ }
32
+ }
33
+ //# sourceMappingURL=opencode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/tui/opencode.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GAGrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAQlC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW;IAC7C,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9E,IAAI,CAAC,mBAAmB,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7E,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;AAClE,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAOnF,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,eAAe,CACpC,MAAsB,EACtB,MAAmB;IAEnB,IAAI,OAAO,GAAG,GAAG,CAAC;IAClB,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YAC3C,MAAM,IAAI,CAAC;YACX,OAAO,GAAG,GAAG,CAAC;YACd,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACnC,IAAI,MAAM,CAAC,OAAO;oBAAE,OAAO;gBAC3B,MAAM,GAAY,CAAC;YACrB,CAAC;YACD,IAAI,CAAC,sCAAsC,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,mBAAmB,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO;QAC3B,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
@@ -0,0 +1,71 @@
1
+ import { toolDefinitions } from '../tools/index.js';
2
+ import { SECTIONS, TAGLINE } from '../cli/commands/docs/content.js';
3
+ const DESTRUCTIVE = /\b(delete|clean|clean-legacy|logout|disable-2fa|down)\b/;
4
+ const CAPABILITY_PROMPTS = {
5
+ nio_session_create: 'Crie uma nova sessão de ambiente para este projeto.',
6
+ nio_session_activate: 'Ative a sessão de ambiente que eu indicar.',
7
+ nio_session_list: 'Liste as minhas sessões de ambiente.',
8
+ nio_env_materialize: 'Materialize (re-aplique) o ambiente da sessão ativa.',
9
+ nio_env_detect_deps: 'Verifique as dependências deste projeto e o que falta instalar.',
10
+ nio_profile_get: 'Mostre o perfil e a recipe da sessão ativa.',
11
+ nio_delegate_exec: 'Delegue a implementação da tarefa a um agente headless num worktree.',
12
+ nio_plan: 'Rode o motor de planejamento sobre este projeto e escreva o plan.md.',
13
+ nio_validate_plan: 'Valide o plan.md da raiz e diga se precisa de uma spec antes de implementar.',
14
+ nio_exec_status: 'Mostre o estado dos jobs de execução (nio exec).',
15
+ };
16
+ function firstSentence(text) {
17
+ const flat = text.replace(/\s+/g, ' ').trim();
18
+ const stop = flat.search(/\.(\s|$)/);
19
+ return stop > 0 ? flat.slice(0, stop + 1) : flat;
20
+ }
21
+ function walkCommands(cmd, prefix) {
22
+ const out = [];
23
+ for (const sub of cmd.commands) {
24
+ const nm = sub.name();
25
+ if (nm === 'help')
26
+ continue;
27
+ const full = prefix ? `${prefix} ${nm}` : nm;
28
+ const args = sub.commands.length > 0 ? '' : sub.usage().replace(/^\[options\]\s*/, '').trim();
29
+ const desc = sub.description();
30
+ if (desc) {
31
+ out.push({
32
+ kind: 'command',
33
+ name: full,
34
+ desc: firstSentence(desc),
35
+ line: `nio ${full}${args ? ' ' + args : ''}`,
36
+ destructive: DESTRUCTIVE.test(full),
37
+ });
38
+ }
39
+ out.push(...walkCommands(sub, full));
40
+ }
41
+ return out;
42
+ }
43
+ export function buildPalette(program) {
44
+ const commands = walkCommands(program, '').sort((a, b) => a.name.localeCompare(b.name));
45
+ const capabilities = toolDefinitions.map((t) => ({
46
+ kind: 'capability',
47
+ name: t.name,
48
+ desc: firstSentence(t.description ?? ''),
49
+ prompt: CAPABILITY_PROMPTS[t.name] ?? t.description ?? t.name,
50
+ }));
51
+ const help = [
52
+ { kind: 'help', name: 'sobre o nio', desc: 'O que é a NIO-CLI', body: TAGLINE },
53
+ ...SECTIONS.map((s) => ({
54
+ kind: 'help',
55
+ name: s.title.toLowerCase(),
56
+ desc: s.blurb ?? s.title,
57
+ body: s.blocks
58
+ .filter((b) => b.kind === 'p')
59
+ .map((b) => b.text)
60
+ .join('\n\n'),
61
+ })),
62
+ ];
63
+ return [...commands, ...capabilities, ...help];
64
+ }
65
+ export function filterPalette(items, q) {
66
+ const s = q.trim().toLowerCase();
67
+ if (!s)
68
+ return items;
69
+ return items.filter((i) => `${i.name} ${i.desc}`.toLowerCase().includes(s));
70
+ }
71
+ //# sourceMappingURL=palette-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"palette-source.js","sourceRoot":"","sources":["../../src/tui/palette-source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect } from 'react';
3
+ import { Box, Text, useInput } from 'ink';
4
+ import { spawn } from 'node:child_process';
5
+ import { theme, sym } from './theme.js';
6
+ export function InfoPanel({ item, onClose }) {
7
+ useInput((_i, key) => {
8
+ if (key.escape || key.return)
9
+ onClose();
10
+ });
11
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.accent, paddingX: 1, children: [_jsx(Text, { bold: true, color: theme.accentBright, children: item.name }), _jsx(Text, { children: item.desc }), item.kind === 'command' && (_jsxs(Box, { marginTop: 1, children: [_jsx(Text, { color: theme.dim, children: "rode: " }), _jsx(Text, { color: theme.accent, children: item.line })] })), item.kind === 'help' && _jsx(Box, { marginTop: 1, children: _jsx(Text, { children: item.body }) }), _jsx(Text, { color: theme.dim, children: "Esc fecha" })] }));
12
+ }
13
+ export function CommandRunner({ item, cwd, onClose, }) {
14
+ const [confirmed, setConfirmed] = useState(!item.destructive);
15
+ const [out, setOut] = useState('');
16
+ const [done, setDone] = useState(null);
17
+ useEffect(() => {
18
+ if (!confirmed)
19
+ return;
20
+ const parts = item.name.split(' ');
21
+ const child = spawn('nio', parts, { cwd });
22
+ child.stdout.on('data', (d) => setOut((o) => (o + d).slice(-4000)));
23
+ child.stderr.on('data', (d) => setOut((o) => (o + d).slice(-4000)));
24
+ child.on('exit', (code) => setDone(code ?? 1));
25
+ child.on('error', (e) => { setOut((o) => o + '\n' + e.message); setDone(127); });
26
+ return () => {
27
+ child.kill();
28
+ };
29
+ }, [confirmed, item.name, cwd]);
30
+ useInput((input, key) => {
31
+ if (!confirmed) {
32
+ if (input.toLowerCase() === 's')
33
+ setConfirmed(true);
34
+ else if (key.escape || input.toLowerCase() === 'n')
35
+ onClose();
36
+ return;
37
+ }
38
+ if (done !== null && (key.escape || key.return))
39
+ onClose();
40
+ });
41
+ if (!confirmed) {
42
+ return (_jsx(Box, { borderStyle: "round", borderColor: theme.warn, paddingX: 1, children: _jsxs(Text, { color: theme.warn, children: [sym.warn, " `", item.line, "` pode alterar/apagar coisas. Rodar? [s/N]"] }) }));
43
+ }
44
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.accent, paddingX: 1, children: [_jsxs(Text, { color: theme.accent, children: ["$ ", item.line] }), _jsx(Text, { color: theme.dim, children: out.split('\n').slice(-12).join('\n') || '…' }), done !== null && (_jsxs(Text, { color: done === 0 ? theme.accent : theme.err, children: ["exit ", done, " \u00B7 Esc fecha"] }))] }));
45
+ }
46
+ export function PermissionModal({ title, onRespond, }) {
47
+ useInput((input) => {
48
+ const k = input.toLowerCase();
49
+ if (k === 'a')
50
+ onRespond('once');
51
+ else if (k === 's')
52
+ onRespond('always');
53
+ else if (k === 'd')
54
+ onRespond('reject');
55
+ });
56
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.warn, paddingX: 1, children: [_jsxs(Text, { color: theme.warn, children: [sym.warn, " O operador pede permiss\u00E3o:"] }), _jsx(Text, { children: title }), _jsx(Text, { color: theme.dim, children: "[a] permitir \u00B7 [s] sempre \u00B7 [d] negar" })] }));
57
+ }
58
+ //# sourceMappingURL=palette.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"palette.js","sourceRoot":"","sources":["../../src/tui/palette.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,132 @@
1
+ import { tlog } from './debug.js';
2
+ export const emptyChat = { messages: [], busy: false, permission: null };
3
+ const PENDING_USER = 'pending-user';
4
+ function clone(prev) {
5
+ return {
6
+ messages: prev.messages.map((m) => ({ ...m, parts: m.parts.map((p) => ({ ...p })) })),
7
+ busy: prev.busy,
8
+ permission: prev.permission,
9
+ };
10
+ }
11
+ function upsertMessage(state, id, role) {
12
+ let msg = state.messages.find((m) => m.id === id);
13
+ if (!msg) {
14
+ msg = { id, role, parts: [] };
15
+ state.messages.push(msg);
16
+ }
17
+ return msg;
18
+ }
19
+ function upsertPart(msg, id, kind) {
20
+ let part = msg.parts.find((p) => p.id === id);
21
+ if (!part) {
22
+ part = { id, kind, text: '' };
23
+ msg.parts.push(part);
24
+ }
25
+ part.kind = kind;
26
+ return part;
27
+ }
28
+ function reconcilePending(state, realId) {
29
+ if (realId === PENDING_USER)
30
+ return;
31
+ const i = state.messages.findIndex((m) => m.id === PENDING_USER);
32
+ if (i >= 0)
33
+ state.messages.splice(i, 1);
34
+ }
35
+ function applyPart(state, raw) {
36
+ const messageID = raw.messageID;
37
+ if (!messageID || !raw.id)
38
+ return;
39
+ reconcilePending(state, messageID);
40
+ applyPartInto(upsertMessage(state, messageID, 'assistant'), raw);
41
+ }
42
+ export function applyEvent(prev, evt) {
43
+ const state = clone(prev);
44
+ const p = evt.properties ?? {};
45
+ tlog('event', evt.type, JSON.stringify(p).slice(0, 200));
46
+ const etype = evt.type;
47
+ if (etype === 'permission.asked' || etype === 'permission.updated') {
48
+ const perm = p;
49
+ if (perm.id && perm.sessionID) {
50
+ const what = perm.patterns?.length ? ` ${perm.patterns.join(', ')}` : '';
51
+ state.permission = {
52
+ id: perm.id,
53
+ sessionId: perm.sessionID,
54
+ title: perm.title ?? `${perm.permission ?? perm.tool?.name ?? 'ação'}${what}`,
55
+ };
56
+ }
57
+ return state;
58
+ }
59
+ switch (evt.type) {
60
+ case 'message.updated': {
61
+ const info = (p.info ?? p);
62
+ if (info.id) {
63
+ reconcilePending(state, info.id);
64
+ upsertMessage(state, info.id, info.role === 'user' ? 'user' : 'assistant');
65
+ }
66
+ break;
67
+ }
68
+ case 'message.part.updated':
69
+ applyPart(state, (p.part ?? p));
70
+ break;
71
+ case 'permission.replied':
72
+ state.permission = null;
73
+ break;
74
+ case 'session.idle':
75
+ case 'session.error':
76
+ state.busy = false;
77
+ break;
78
+ case 'session.status':
79
+ if (p.status?.type === 'idle')
80
+ state.busy = false;
81
+ break;
82
+ default:
83
+ break;
84
+ }
85
+ return state;
86
+ }
87
+ export function syncMessages(prev, raw, busy) {
88
+ const state = { messages: [], busy, permission: prev.permission };
89
+ for (const m of raw) {
90
+ if (!m.info?.id)
91
+ continue;
92
+ const msg = upsertMessage(state, m.info.id, m.info.role === 'user' ? 'user' : 'assistant');
93
+ for (const raw of m.parts ?? [])
94
+ applyPartInto(msg, raw);
95
+ }
96
+ const pending = prev.messages.find((x) => x.id === PENDING_USER);
97
+ if (pending && !state.messages.some((x) => x.role === 'user' && sameText(x, pending))) {
98
+ state.messages.push(pending);
99
+ }
100
+ return state;
101
+ }
102
+ function sameText(a, b) {
103
+ const t = (m) => m.parts.map((p) => p.text).join('').trim();
104
+ return t(a) === t(b);
105
+ }
106
+ function applyPartInto(msg, raw) {
107
+ const part = raw;
108
+ if (!part.id)
109
+ return;
110
+ const type = part.type ?? 'text';
111
+ if (type === 'step-start' || type === 'step-finish')
112
+ return;
113
+ if (type === 'tool') {
114
+ const cp = upsertPart(msg, part.id, 'tool');
115
+ cp.text = part.state?.title ?? part.tool ?? 'tool';
116
+ cp.tool = { status: part.state?.status ?? 'running', output: String(part.state?.output ?? part.state?.error ?? '') };
117
+ }
118
+ else if (typeof part.text === 'string') {
119
+ upsertPart(msg, part.id, type === 'reasoning' ? 'reasoning' : 'text').text = part.text;
120
+ }
121
+ }
122
+ export function pushUserMessage(prev, text) {
123
+ return {
124
+ messages: [
125
+ ...prev.messages.filter((m) => m.id !== PENDING_USER),
126
+ { id: PENDING_USER, role: 'user', parts: [{ id: 'p0', kind: 'text', text }] },
127
+ ],
128
+ busy: true,
129
+ permission: prev.permission,
130
+ };
131
+ }
132
+ //# sourceMappingURL=state.js.map