@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.
- package/README.md +68 -26
- package/dist/app/ai-client.js +44 -0
- package/dist/app/ai-client.js.map +1 -0
- package/dist/app/docker-manager.js +12 -9
- package/dist/app/docker-manager.js.map +1 -1
- package/dist/cli/commands/ai.js +61 -0
- package/dist/cli/commands/ai.js.map +1 -0
- package/dist/cli/commands/auth.js +91 -70
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/config.js +4 -2
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/debug.js +9 -0
- package/dist/cli/commands/debug.js.map +1 -1
- package/dist/cli/commands/docker.js +25 -0
- package/dist/cli/commands/docker.js.map +1 -1
- package/dist/cli/commands/docs/content.js +26 -6
- package/dist/cli/commands/docs/content.js.map +1 -1
- package/dist/cli/commands/init/auth-step.js +2 -1
- package/dist/cli/commands/init/auth-step.js.map +1 -1
- package/dist/cli/commands/init/handoff.js +20 -0
- package/dist/cli/commands/init/handoff.js.map +1 -0
- package/dist/cli/commands/init/index.js +24 -38
- package/dist/cli/commands/init/index.js.map +1 -1
- package/dist/cli/commands/open.js +8 -0
- package/dist/cli/commands/open.js.map +1 -1
- package/dist/cli/commands/start.js +8 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/flows/onboarding.js +116 -0
- package/dist/cli/flows/onboarding.js.map +1 -0
- package/dist/cli/program.js +58 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/cli.js +26 -53
- package/dist/cli.js.map +1 -1
- package/dist/gateway/config.js +1 -2
- package/dist/gateway/config.js.map +1 -1
- package/dist/lib/auth/gateway-client.js +22 -42
- package/dist/lib/auth/gateway-client.js.map +1 -1
- package/dist/lib/auth/gateway-process.js +54 -0
- package/dist/lib/auth/gateway-process.js.map +1 -0
- package/dist/lib/auth/nio-config.js +10 -1
- package/dist/lib/auth/nio-config.js.map +1 -1
- package/dist/lib/clients/client-configs.js +24 -10
- package/dist/lib/clients/client-configs.js.map +1 -1
- package/dist/lib/debug.js +6 -0
- package/dist/lib/debug.js.map +1 -0
- package/dist/lib/headroom.js +44 -0
- package/dist/lib/headroom.js.map +1 -0
- package/dist/lib/ide-tasks.js +54 -0
- package/dist/lib/ide-tasks.js.map +1 -0
- package/dist/lib/load-env.js +31 -2
- package/dist/lib/load-env.js.map +1 -1
- package/dist/matrix-logo.js +43 -11
- package/dist/matrix-logo.js.map +1 -1
- package/dist/tui/app.js +155 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/components.js +137 -0
- package/dist/tui/components.js.map +1 -0
- package/dist/tui/debug.js +17 -0
- package/dist/tui/debug.js.map +1 -0
- package/dist/tui/index.js +2 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/launch.js +64 -0
- package/dist/tui/launch.js.map +1 -0
- package/dist/tui/markdown.js +40 -0
- package/dist/tui/markdown.js.map +1 -0
- package/dist/tui/opencode.js +33 -0
- package/dist/tui/opencode.js.map +1 -0
- package/dist/tui/palette-source.js +71 -0
- package/dist/tui/palette-source.js.map +1 -0
- package/dist/tui/palette.js +58 -0
- package/dist/tui/palette.js.map +1 -0
- package/dist/tui/state.js +132 -0
- package/dist/tui/state.js.map +1 -0
- package/dist/tui/theme.js +14 -0
- package/dist/tui/theme.js.map +1 -0
- package/headroom/docker-compose.yml +27 -0
- 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 @@
|
|
|
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
|