@nio-cli/cli 0.2.0 → 0.3.0

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 +116 -0
  55. package/dist/tui/app.js.map +1 -0
  56. package/dist/tui/components.js +0 -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 +28 -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 +100 -0
  71. package/dist/tui/palette.js.map +1 -0
  72. package/dist/tui/state.js +105 -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,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,28 @@
1
+ import { createOpencodeServer, createOpencodeClient, } from '@opencode-ai/sdk';
2
+ import { dlog } from '../lib/debug.js';
3
+ export async function startOpencode(cwd) {
4
+ const server = await createOpencodeServer({ hostname: '127.0.0.1', port: 0 });
5
+ dlog('tui: 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
+ export async function* subscribeEvents(client, signal) {
10
+ for (let attempt = 0; attempt < 2; attempt++) {
11
+ try {
12
+ const res = await client.event.subscribe();
13
+ for await (const evt of res.stream) {
14
+ if (signal?.aborted)
15
+ return;
16
+ yield evt;
17
+ }
18
+ return;
19
+ }
20
+ catch (err) {
21
+ dlog('tui: event stream caiu', err.message);
22
+ if (signal?.aborted)
23
+ return;
24
+ await new Promise((r) => setTimeout(r, 500));
25
+ }
26
+ }
27
+ }
28
+ //# 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,iBAAiB,CAAC;AASvC,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,wBAAwB,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3C,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;AAMD,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,eAAe,CACpC,MAAsB,EACtB,MAAoB;IAEpB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YAC3C,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACnC,IAAI,MAAM,EAAE,OAAO;oBAAE,OAAO;gBAC5B,MAAM,GAAY,CAAC;YACrB,CAAC;YACD,OAAO;QACT,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,wBAAwB,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;YACvD,IAAI,MAAM,EAAE,OAAO;gBAAE,OAAO;YAC5B,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/C,CAAC;IACH,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,100 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useMemo, 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
+ import { buildPalette, filterPalette } from './palette-source.js';
7
+ const KIND_LABEL = {
8
+ command: 'cmd',
9
+ capability: 'agente',
10
+ help: 'ajuda',
11
+ };
12
+ export function Palette({ program, onClose, onInfo, onRun, onPrompt, }) {
13
+ const all = useMemo(() => buildPalette(program), [program]);
14
+ const [q, setQ] = useState('');
15
+ const [i, setI] = useState(0);
16
+ const items = useMemo(() => filterPalette(all, q).slice(0, 40), [all, q]);
17
+ const sel = items[Math.min(i, items.length - 1)];
18
+ useInput((input, key) => {
19
+ if (key.escape)
20
+ return onClose();
21
+ if (key.upArrow)
22
+ return setI((n) => Math.max(0, n - 1));
23
+ if (key.downArrow)
24
+ return setI((n) => Math.min(items.length - 1, n + 1));
25
+ if (key.return) {
26
+ if (!sel)
27
+ return;
28
+ if (sel.kind === 'capability') {
29
+ onPrompt(sel.prompt);
30
+ onClose();
31
+ return;
32
+ }
33
+ onInfo(sel);
34
+ return;
35
+ }
36
+ if (key.ctrl && input === 'r' && sel?.kind === 'command') {
37
+ onRun(sel);
38
+ onClose();
39
+ return;
40
+ }
41
+ if (key.backspace || key.delete)
42
+ return setQ((v) => v.slice(0, -1));
43
+ if (input && !key.ctrl && !key.meta)
44
+ setQ((v) => v + input);
45
+ });
46
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.accent, paddingX: 1, children: [_jsxs(Text, { children: [_jsx(Text, { color: theme.accent, children: "/" }), q, _jsx(Text, { color: theme.dim, children: "\u2588" })] }), items.map((it, n) => (_jsxs(Text, { color: n === i ? theme.accentBright : undefined, inverse: n === i, 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 mover \u00B7 Enter ", sel?.kind === 'capability' ? 'manda pro agente' : 'info', " \u00B7", sel?.kind === 'command' ? ' Ctrl-R roda ·' : '', " Esc fecha"] })] }));
47
+ }
48
+ export function InfoPanel({ item, onClose }) {
49
+ useInput((_i, key) => {
50
+ if (key.escape || key.return)
51
+ onClose();
52
+ });
53
+ 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" })] }));
54
+ }
55
+ export function CommandRunner({ item, cwd, onClose, }) {
56
+ const [confirmed, setConfirmed] = useState(!item.destructive);
57
+ const [out, setOut] = useState('');
58
+ const [done, setDone] = useState(null);
59
+ useEffect(() => {
60
+ if (!confirmed)
61
+ return;
62
+ const parts = item.name.split(' ');
63
+ const child = spawn('nio', parts, { cwd });
64
+ child.stdout.on('data', (d) => setOut((o) => (o + d).slice(-4000)));
65
+ child.stderr.on('data', (d) => setOut((o) => (o + d).slice(-4000)));
66
+ child.on('exit', (code) => setDone(code ?? 1));
67
+ child.on('error', (e) => { setOut((o) => o + '\n' + e.message); setDone(127); });
68
+ return () => {
69
+ child.kill();
70
+ };
71
+ }, [confirmed, item.name, cwd]);
72
+ useInput((input, key) => {
73
+ if (!confirmed) {
74
+ if (input.toLowerCase() === 's')
75
+ setConfirmed(true);
76
+ else if (key.escape || input.toLowerCase() === 'n')
77
+ onClose();
78
+ return;
79
+ }
80
+ if (done !== null && (key.escape || key.return))
81
+ onClose();
82
+ });
83
+ if (!confirmed) {
84
+ 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]"] }) }));
85
+ }
86
+ 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"] }))] }));
87
+ }
88
+ export function PermissionModal({ title, onRespond, }) {
89
+ useInput((input) => {
90
+ const k = input.toLowerCase();
91
+ if (k === 'a')
92
+ onRespond('once');
93
+ else if (k === 's')
94
+ onRespond('always');
95
+ else if (k === 'd')
96
+ onRespond('reject');
97
+ });
98
+ 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" })] }));
99
+ }
100
+ //# 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,105 @@
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 part = raw;
37
+ if (!part.messageID || !part.id)
38
+ return;
39
+ const type = part.type ?? 'text';
40
+ if (type === 'step-start' || type === 'step-finish')
41
+ return;
42
+ reconcilePending(state, part.messageID);
43
+ const msg = upsertMessage(state, part.messageID, 'assistant');
44
+ if (type === 'tool') {
45
+ const cp = upsertPart(msg, part.id, 'tool');
46
+ cp.text = part.state?.title ?? part.tool ?? 'tool';
47
+ cp.tool = {
48
+ status: part.state?.status ?? 'running',
49
+ output: String(part.state?.output ?? part.state?.error ?? ''),
50
+ };
51
+ }
52
+ else if (typeof part.text === 'string') {
53
+ upsertPart(msg, part.id, type === 'reasoning' ? 'reasoning' : 'text').text = part.text;
54
+ }
55
+ }
56
+ export function applyEvent(prev, evt) {
57
+ const state = clone(prev);
58
+ const p = evt.properties ?? {};
59
+ tlog('event', evt.type, JSON.stringify(p).slice(0, 200));
60
+ switch (evt.type) {
61
+ case 'message.updated': {
62
+ const info = (p.info ?? p);
63
+ if (info.id) {
64
+ reconcilePending(state, info.id);
65
+ upsertMessage(state, info.id, info.role === 'user' ? 'user' : 'assistant');
66
+ }
67
+ break;
68
+ }
69
+ case 'message.part.updated':
70
+ applyPart(state, (p.part ?? p));
71
+ break;
72
+ case 'permission.updated': {
73
+ const perm = p;
74
+ if (perm.id && perm.sessionID) {
75
+ state.permission = { id: perm.id, sessionId: perm.sessionID, title: perm.title ?? 'permissão' };
76
+ }
77
+ break;
78
+ }
79
+ case 'permission.replied':
80
+ state.permission = null;
81
+ break;
82
+ case 'session.idle':
83
+ case 'session.error':
84
+ state.busy = false;
85
+ break;
86
+ case 'session.status':
87
+ if (p.status?.type === 'idle')
88
+ state.busy = false;
89
+ break;
90
+ default:
91
+ break;
92
+ }
93
+ return state;
94
+ }
95
+ export function pushUserMessage(prev, text) {
96
+ return {
97
+ messages: [
98
+ ...prev.messages.filter((m) => m.id !== PENDING_USER),
99
+ { id: PENDING_USER, role: 'user', parts: [{ id: 'p0', kind: 'text', text }] },
100
+ ],
101
+ busy: true,
102
+ permission: prev.permission,
103
+ };
104
+ }
105
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/tui/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { sym } from '../lib/colors.js';
2
+ export const theme = {
3
+ accent: 'green',
4
+ accentBright: 'greenBright',
5
+ dim: 'gray',
6
+ text: 'white',
7
+ warn: 'yellow',
8
+ err: 'red',
9
+ user: 'cyan',
10
+ border: 'gray',
11
+ };
12
+ export { sym };
13
+ export const NIO_WORDMARK = 'N I O';
14
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/tui/theme.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvC,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,MAAM,EAAE,OAAO;IACf,YAAY,EAAE,aAAa;IAC3B,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,QAAQ;IACd,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,MAAM;CACN,CAAC;AAEX,OAAO,EAAE,GAAG,EAAE,CAAC;AAGf,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC"}
@@ -0,0 +1,27 @@
1
+ # Headroom — proxy de compressão de contexto entre o client de IA e o LLM.
2
+ # Obrigatório pro `nio ai` (ADR 0007). Mesmo padrão do `docker/docker-compose.yml`:
3
+ # porta pinada em 127.0.0.1, `restart: unless-stopped`, `extra_hosts` p/ Linux.
4
+ #
5
+ # O entrypoint da imagem já é `headroom proxy` — `command` passa só flags.
6
+ # `OPENAI_TARGET_API_URL` roteia as chamadas OpenAI-compatíveis (o operador usa
7
+ # OpenCode Zen) pro Zen; o header Authorization do OpenCode passa transparente,
8
+ # então o Headroom não precisa de API key própria.
9
+ services:
10
+ headroom:
11
+ image: ghcr.io/headroomlabs-ai/headroom:latest
12
+ container_name: nio-headroom
13
+ restart: unless-stopped
14
+ command: ["--host", "0.0.0.0", "--port", "8787"]
15
+ environment:
16
+ OPENAI_TARGET_API_URL: "${NIO_HEADROOM_OPENAI_TARGET:-https://opencode.ai/zen/v1}"
17
+ HEADROOM_UPDATE_CHECK: "off"
18
+ ports:
19
+ - "127.0.0.1:${NIO_HEADROOM_PORT:-8787}:8787"
20
+ extra_hosts:
21
+ - "host.docker.internal:host-gateway"
22
+ volumes:
23
+ - nio_headroom_cache:/root/.headroom
24
+
25
+ volumes:
26
+ nio_headroom_cache:
27
+ name: nio_headroom_cache
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nio-cli/cli",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Orquestrador de ambientes de desenvolvimento: escolhe um perfil, responde um wizard e a CLI (com auxílio de IA via MCP) materializa toolchains, linguagens, frameworks, dotfiles e IDE.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
@@ -13,6 +13,7 @@
13
13
  "files": [
14
14
  "dist",
15
15
  "docker/docker-compose.yml",
16
+ "headroom/docker-compose.yml",
16
17
  "README.md"
17
18
  ],
18
19
  "engines": {
@@ -37,6 +38,9 @@
37
38
  "dev-environment",
38
39
  "environment-orchestration",
39
40
  "opencode",
41
+ "ai-agent",
42
+ "tui",
43
+ "ink",
40
44
  "postgres",
41
45
  "nio"
42
46
  ],
@@ -51,18 +55,22 @@
51
55
  "dev:lang": "bun run src/mcp-server-lang.ts",
52
56
  "dev:kong": "docker compose -f kong/docker-compose.yml --env-file .env up",
53
57
  "dev:docker": "docker compose -f docker/docker-compose.yml up",
58
+ "dev:headroom": "docker compose -f headroom/docker-compose.yml up",
54
59
  "prepublishOnly": "npm run build"
55
60
  },
56
61
  "dependencies": {
57
62
  "@clack/prompts": "^1.6.0",
58
63
  "@modelcontextprotocol/sdk": "^1.0.4",
59
64
  "@node-rs/argon2": "^2.1.0",
65
+ "@opencode-ai/sdk": "1.18.25",
60
66
  "adm-zip": "^0.5.17",
61
67
  "boxen": "^7.1.1",
62
68
  "chalk": "^5.6.2",
63
69
  "commander": "^12.1.0",
70
+ "ink": "^5.2.1",
64
71
  "jsonwebtoken": "^9.0.3",
65
72
  "pg": "^8.23.0",
73
+ "react": "^18.3.1",
66
74
  "smol-toml": "^1.6.1",
67
75
  "update-notifier": "^7.3.1",
68
76
  "zod": "^4.4.3"
@@ -72,7 +80,9 @@
72
80
  "@types/jsonwebtoken": "^9.0.10",
73
81
  "@types/node": "^22.10.5",
74
82
  "@types/pg": "^8.23.1",
83
+ "@types/react": "^18.3",
75
84
  "@types/update-notifier": "^6.0.8",
85
+ "ink-testing-library": "^4",
76
86
  "typescript": "^5.4.5"
77
87
  }
78
88
  }