@nio-cli/cli 0.3.7 → 0.6.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.
- package/.env.example +88 -12
- package/Dockerfile.gateway +13 -5
- package/README.md +186 -78
- package/dist/adapters/lang/vendor.js +5 -10
- package/dist/adapters/lang/vendor.js.map +1 -1
- package/dist/adapters/pg/auth-event-repository.js +30 -0
- package/dist/adapters/pg/auth-event-repository.js.map +1 -0
- package/dist/adapters/pg/client.js +24 -4
- package/dist/adapters/pg/client.js.map +1 -1
- package/dist/adapters/pg/login-challenge-repository.js.map +1 -1
- package/dist/adapters/pg/login-ip-repository.js +26 -0
- package/dist/adapters/pg/login-ip-repository.js.map +1 -0
- package/dist/adapters/pg/user-repository.js +47 -18
- package/dist/adapters/pg/user-repository.js.map +1 -1
- package/dist/adapters/sms/whatsapp.js +83 -0
- package/dist/adapters/sms/whatsapp.js.map +1 -0
- package/dist/app/ai-client.js +2 -2
- package/dist/app/ai-client.js.map +1 -1
- package/dist/brand.js +1 -1
- package/dist/brand.js.map +1 -1
- package/dist/cli/commands/ai.js +2 -2
- package/dist/cli/commands/ai.js.map +1 -1
- package/dist/cli/commands/auth.js +27 -20
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/config.js +17 -7
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/docker.js +4 -4
- package/dist/cli/commands/docker.js.map +1 -1
- package/dist/cli/commands/docs/content.js +80 -11
- package/dist/cli/commands/docs/content.js.map +1 -1
- package/dist/cli/commands/exec.js +1 -12
- package/dist/cli/commands/exec.js.map +1 -1
- package/dist/cli/commands/init/index.js +1 -2
- package/dist/cli/commands/init/index.js.map +1 -1
- package/dist/cli/commands/init/provision-step.js +2 -20
- package/dist/cli/commands/init/provision-step.js.map +1 -1
- package/dist/cli/commands/plan.js +1 -12
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/security.js +82 -11
- package/dist/cli/commands/security.js.map +1 -1
- package/dist/cli/commands/sync.js +9 -19
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/commands/validate-plan.js +1 -10
- package/dist/cli/commands/validate-plan.js.map +1 -1
- package/dist/cli/copy/flows.json +1 -2
- package/dist/cli/copy.js.map +1 -1
- package/dist/cli/flows/dependencies.js +0 -4
- package/dist/cli/flows/dependencies.js.map +1 -1
- package/dist/cli/help-guide.js +69 -0
- package/dist/cli/help-guide.js.map +1 -0
- package/dist/cli/program.js +3 -3
- package/dist/cli/program.js.map +1 -1
- package/dist/cli/ui/render.js +0 -27
- package/dist/cli/ui/render.js.map +1 -1
- package/dist/cli.js +10 -2
- package/dist/cli.js.map +1 -1
- package/dist/gateway/config.js +23 -1
- package/dist/gateway/config.js.map +1 -1
- package/dist/gateway/edge-filter.js +20 -3
- package/dist/gateway/edge-filter.js.map +1 -1
- package/dist/gateway/index.js +145 -22
- package/dist/gateway/index.js.map +1 -1
- package/dist/gateway/middleware/auth.js +15 -3
- package/dist/gateway/middleware/auth.js.map +1 -1
- package/dist/gateway/services/login.js +52 -17
- package/dist/gateway/services/login.js.map +1 -1
- package/dist/gateway/services/register.js +20 -0
- package/dist/gateway/services/register.js.map +1 -0
- package/dist/gateway/services/security.js +69 -16
- package/dist/gateway/services/security.js.map +1 -1
- package/dist/gateway/throttle.js +57 -0
- package/dist/gateway/throttle.js.map +1 -0
- package/dist/lib/auth/backup-codes.js +4 -4
- package/dist/lib/auth/backup-codes.js.map +1 -1
- package/dist/lib/auth/breach-check.js +58 -0
- package/dist/lib/auth/breach-check.js.map +1 -0
- package/dist/lib/auth/gateway-client.js +17 -2
- package/dist/lib/auth/gateway-client.js.map +1 -1
- package/dist/lib/auth/gateway-process.js +17 -2
- package/dist/lib/auth/gateway-process.js.map +1 -1
- package/dist/lib/auth/gateway-token.js +5 -2
- package/dist/lib/auth/gateway-token.js.map +1 -1
- package/dist/lib/auth/nio-config.js +57 -7
- package/dist/lib/auth/nio-config.js.map +1 -1
- package/dist/lib/auth/otp.js +3 -3
- package/dist/lib/auth/otp.js.map +1 -1
- package/dist/lib/auth/password.js +33 -10
- package/dist/lib/auth/password.js.map +1 -1
- package/dist/lib/auth/secrets.js +96 -0
- package/dist/lib/auth/secrets.js.map +1 -0
- package/dist/lib/auth/session-store.js +2 -2
- package/dist/lib/auth/session-store.js.map +1 -1
- package/dist/lib/clients/client-configs.js +81 -86
- package/dist/lib/clients/client-configs.js.map +1 -1
- package/dist/lib/clients/client-install.js +22 -4
- package/dist/lib/clients/client-install.js.map +1 -1
- package/dist/lib/deps/dependencies.js +0 -25
- package/dist/lib/deps/dependencies.js.map +1 -1
- package/dist/lib/deps/dependency-install.js +3 -23
- package/dist/lib/deps/dependency-install.js.map +1 -1
- package/dist/lib/exec/exec-delegate.js +69 -48
- package/dist/lib/exec/exec-delegate.js.map +1 -1
- package/dist/lib/exec/plan-delegate.js +25 -34
- package/dist/lib/exec/plan-delegate.js.map +1 -1
- package/dist/lib/exec/qwen-client.js +74 -0
- package/dist/lib/exec/qwen-client.js.map +1 -0
- package/dist/lib/exec/validate-plan-delegate.js +13 -30
- package/dist/lib/exec/validate-plan-delegate.js.map +1 -1
- package/dist/lib/fetch-zipball.js +59 -0
- package/dist/lib/fetch-zipball.js.map +1 -0
- package/dist/lib/load-env.js +17 -5
- package/dist/lib/load-env.js.map +1 -1
- package/dist/lib/open-url.js +5 -2
- package/dist/lib/open-url.js.map +1 -1
- package/dist/lib/proc.js +27 -0
- package/dist/lib/proc.js.map +1 -1
- package/dist/lib/provision/provision.js +2 -2
- package/dist/lib/provision/provision.js.map +1 -1
- package/dist/lib/skills/patterns.js +15 -24
- package/dist/lib/skills/patterns.js.map +1 -1
- package/dist/lib/skills/skills-cache.js +25 -12
- package/dist/lib/skills/skills-cache.js.map +1 -1
- package/dist/lib/skills/skills.js +1 -1
- package/dist/lib/skills/skills.js.map +1 -1
- package/dist/lib/version-check.js +1 -11
- package/dist/lib/version-check.js.map +1 -1
- package/dist/mcp-server.js +5 -17
- package/dist/mcp-server.js.map +1 -1
- package/dist/tools/delegate-exec.js +3 -10
- package/dist/tools/delegate-exec.js.map +1 -1
- package/dist/tools/plan.js +6 -13
- package/dist/tools/plan.js.map +1 -1
- package/dist/tools/validate-plan.js +6 -14
- package/dist/tools/validate-plan.js.map +1 -1
- package/dist/tui/app.js +102 -18
- package/dist/tui/app.js.map +1 -1
- package/dist/tui/components.js +161 -88
- package/dist/tui/components.js.map +1 -1
- package/dist/tui/launch.js +6 -1
- package/dist/tui/launch.js.map +1 -1
- package/dist/tui/opencode.js +27 -0
- package/dist/tui/opencode.js.map +1 -1
- package/dist/tui/palette.js +12 -5
- package/dist/tui/palette.js.map +1 -1
- package/dist/tui/prompt-input.js +168 -0
- package/dist/tui/prompt-input.js.map +1 -0
- package/dist/tui/state.js +252 -20
- package/dist/tui/state.js.map +1 -1
- package/dist/tui/test-utils.js +24 -0
- package/dist/tui/test-utils.js.map +1 -0
- package/dist/version.js +17 -6
- package/dist/version.js.map +1 -1
- package/docker/docker-compose.yml +56 -26
- package/docker/kong.yml +10 -0
- package/package.json +21 -12
- package/dist/adapters/sms/http-generic.js +0 -50
- package/dist/adapters/sms/http-generic.js.map +0 -1
- package/dist/cli/commands/clean.js +0 -108
- package/dist/cli/commands/clean.js.map +0 -1
- package/dist/lib/clients/hooks.js +0 -191
- package/dist/lib/clients/hooks.js.map +0 -1
- package/dist/lib/exec/exec-engines.js +0 -63
- package/dist/lib/exec/exec-engines.js.map +0 -1
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
2
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
3
|
-
import { join } from 'node:path';
|
|
3
|
+
import { dirname, join, resolve, sep } from 'node:path';
|
|
4
4
|
import { randomUUID } from 'node:crypto';
|
|
5
5
|
import { skillsDir } from '../skills/skills.js';
|
|
6
6
|
import { homePath } from '../../brand.js';
|
|
7
7
|
import { HARNESS_RULES_REL, HARNESS_PATTERNS_REL } from '../clients/harness.js';
|
|
8
|
-
import {
|
|
8
|
+
import { QWEN_ENGINE, qwenComplete, parseFileBlocks, } from './qwen-client.js';
|
|
9
9
|
const jobs = new Map();
|
|
10
10
|
function jobsDir() {
|
|
11
11
|
return homePath('exec-jobs');
|
|
@@ -36,12 +36,22 @@ export function getJob(id) {
|
|
|
36
36
|
}
|
|
37
37
|
function buildPrompt(instruction) {
|
|
38
38
|
return [
|
|
39
|
-
'Implemente a tarefa abaixo NESTE worktree.',
|
|
39
|
+
'Implemente a tarefa abaixo NESTE worktree (pastas e arquivos relativos à raiz do trabalho).',
|
|
40
40
|
`Antes de codar: leia AGENTS.md, ${HARNESS_RULES_REL} e ${HARNESS_PATTERNS_REL} e SIGA-OS.`,
|
|
41
41
|
'Regras: mudança mínima; nada de libs/estilos fora do harness.',
|
|
42
42
|
'Limites: arquivo <300 linhas, função <30 linhas, comentário <=1 linha.',
|
|
43
43
|
'Rode lint/build/testes do repo. NÃO commite — deixe o trabalho staged.',
|
|
44
44
|
'',
|
|
45
|
+
'Você NÃO tem acesso ao filesystem: devolva APENAS os arquivos a criar/alterar, cada um ' +
|
|
46
|
+
'neste formato exato, nessa ordem (sem texto fora dos blocos, sem cercas de código):',
|
|
47
|
+
'',
|
|
48
|
+
'<<<FILE caminho/relativo.ext>>>',
|
|
49
|
+
'<conteúdo completo do arquivo>',
|
|
50
|
+
'<<<END_FILE>>>',
|
|
51
|
+
'',
|
|
52
|
+
'Se a tarefa não exigir código, responda com texto puro explicando o porquê.',
|
|
53
|
+
'',
|
|
54
|
+
'## Tarefa',
|
|
45
55
|
instruction,
|
|
46
56
|
].join('\n');
|
|
47
57
|
}
|
|
@@ -95,36 +105,61 @@ function runChecks(worktree) {
|
|
|
95
105
|
function finish(job) {
|
|
96
106
|
return save({ ...job, finishedAt: new Date().toISOString() });
|
|
97
107
|
}
|
|
98
|
-
function
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
108
|
+
function resolveRel(worktree, rel) {
|
|
109
|
+
const dest = resolve(worktree, rel);
|
|
110
|
+
if (dest !== worktree && !dest.startsWith(worktree + sep)) {
|
|
111
|
+
throw new Error(`caminho fora do worktree: ${rel}`);
|
|
112
|
+
}
|
|
113
|
+
return dest;
|
|
114
|
+
}
|
|
115
|
+
function applyBlocks(worktree, text) {
|
|
116
|
+
const blocks = parseFileBlocks(text);
|
|
117
|
+
if (blocks.length === 0) {
|
|
118
|
+
throw new Error('resposta sem blocos <<<FILE>>> — nada aplicado');
|
|
119
|
+
}
|
|
120
|
+
const written = [];
|
|
121
|
+
for (const b of blocks) {
|
|
122
|
+
const dest = resolveRel(worktree, b.path);
|
|
123
|
+
mkdirSync(dirname(dest), { recursive: true });
|
|
124
|
+
writeFileSync(dest, b.content, 'utf8');
|
|
125
|
+
written.push(b.path);
|
|
126
|
+
}
|
|
127
|
+
return written;
|
|
128
|
+
}
|
|
129
|
+
async function runEngine(job, prompt, opts = {}) {
|
|
130
|
+
try {
|
|
131
|
+
const text = await qwenComplete(prompt);
|
|
107
132
|
if (opts.echo)
|
|
108
|
-
process.stderr.write(
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
|
|
133
|
+
process.stderr.write(text);
|
|
134
|
+
applyBlocks(job.worktree, text);
|
|
135
|
+
const done = finish({
|
|
136
|
+
...job,
|
|
137
|
+
state: 'done',
|
|
138
|
+
exitCode: 0,
|
|
139
|
+
summary: text.trim().slice(-2000),
|
|
140
|
+
checks: runChecks(job.worktree),
|
|
141
|
+
changed: changedFiles(job.worktree),
|
|
142
|
+
});
|
|
143
|
+
opts.onDone?.(done);
|
|
144
|
+
return done;
|
|
145
|
+
}
|
|
146
|
+
catch (e) {
|
|
147
|
+
const failed = finish({
|
|
148
|
+
...job,
|
|
149
|
+
state: 'failed',
|
|
150
|
+
exitCode: 1,
|
|
151
|
+
error: e.message,
|
|
152
|
+
});
|
|
153
|
+
opts.onDone?.(failed);
|
|
154
|
+
return failed;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function newJob(worktree) {
|
|
123
158
|
return {
|
|
124
159
|
id: randomUUID().slice(0, 8),
|
|
125
160
|
state: 'running',
|
|
126
161
|
worktree,
|
|
127
|
-
engine,
|
|
162
|
+
engine: QWEN_ENGINE,
|
|
128
163
|
exitCode: null,
|
|
129
164
|
summary: '',
|
|
130
165
|
checks: {},
|
|
@@ -132,27 +167,13 @@ function newJob(worktree, engine) {
|
|
|
132
167
|
startedAt: new Date().toISOString(),
|
|
133
168
|
};
|
|
134
169
|
}
|
|
135
|
-
function prepare(worktree, engine) {
|
|
136
|
-
const job = newJob(worktree, engine);
|
|
137
|
-
const bin = resolveEngineBin(engine);
|
|
138
|
-
if (!bin) {
|
|
139
|
-
return finish({ ...job, state: 'failed', error: engineMissingError(engine) });
|
|
140
|
-
}
|
|
141
|
-
return { job, bin: save(job) && bin };
|
|
142
|
-
}
|
|
143
170
|
export function startExec(opts) {
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
spawnEngine(p.job, p.bin, buildPrompt(opts.instruction), { onDone: () => undefined });
|
|
148
|
-
return p.job;
|
|
171
|
+
const job = save(newJob(opts.worktree));
|
|
172
|
+
void runEngine(job, buildPrompt(opts.instruction));
|
|
173
|
+
return job;
|
|
149
174
|
}
|
|
150
175
|
export function runExec(opts) {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
if ('state' in p)
|
|
154
|
-
return resolve(p);
|
|
155
|
-
spawnEngine(p.job, p.bin, buildPrompt(opts.instruction), { echo: opts.echo, onDone: resolve });
|
|
156
|
-
});
|
|
176
|
+
const job = save(newJob(opts.worktree));
|
|
177
|
+
return runEngine(job, buildPrompt(opts.instruction), { echo: opts.echo });
|
|
157
178
|
}
|
|
158
179
|
//# sourceMappingURL=exec-delegate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec-delegate.js","sourceRoot":"","sources":["../../../src/lib/exec/exec-delegate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"exec-delegate.js","sourceRoot":"","sources":["../../../src/lib/exec/exec-delegate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
2
1
|
import { readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
3
2
|
import { join } from 'node:path';
|
|
4
|
-
import {
|
|
3
|
+
import { QWEN_ENGINE, qwenComplete } from './qwen-client.js';
|
|
5
4
|
import { HARNESS_RULES_REL } from '../clients/harness.js';
|
|
6
5
|
export const PLAN_TEMPLATE = [
|
|
7
6
|
'# Plano',
|
|
@@ -60,41 +59,33 @@ function writeAtomic(project, content) {
|
|
|
60
59
|
renameSync(tmp, target);
|
|
61
60
|
return target;
|
|
62
61
|
}
|
|
63
|
-
function
|
|
64
|
-
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
62
|
+
async function apiPlan(prompt, project, echo) {
|
|
63
|
+
try {
|
|
64
|
+
const markdown = await qwenComplete(prompt);
|
|
65
|
+
if (echo)
|
|
66
|
+
process.stderr.write(markdown);
|
|
67
|
+
const content = stripFence(markdown);
|
|
68
|
+
if (!content) {
|
|
69
|
+
return {
|
|
70
|
+
ok: false,
|
|
71
|
+
path: planPath(project),
|
|
72
|
+
engine: QWEN_ENGINE,
|
|
73
|
+
error: 'engine não devolveu markdown',
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
return { ok: true, path: writeAtomic(project, content), engine: QWEN_ENGINE };
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
return {
|
|
80
|
+
ok: false,
|
|
81
|
+
path: planPath(project),
|
|
82
|
+
engine: QWEN_ENGINE,
|
|
83
|
+
error: e.message,
|
|
74
84
|
};
|
|
75
|
-
|
|
76
|
-
child.on('close', (code) => {
|
|
77
|
-
if (code !== 0)
|
|
78
|
-
return fail(`engine ${engine} falhou (exit ${code})`);
|
|
79
|
-
const content = stripFence(markdown);
|
|
80
|
-
if (!content)
|
|
81
|
-
return fail(`engine ${engine} não devolveu markdown`);
|
|
82
|
-
resolve({ ok: true, path: writeAtomic(project, content), engine });
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
+
}
|
|
85
86
|
}
|
|
86
87
|
export function runPlan(opts) {
|
|
87
|
-
const engine = opts.engine ?? PLAN_ENGINE;
|
|
88
|
-
const bin = resolveEngineBin(engine);
|
|
89
|
-
if (!bin) {
|
|
90
|
-
return Promise.resolve({
|
|
91
|
-
ok: false,
|
|
92
|
-
path: planPath(opts.project),
|
|
93
|
-
engine,
|
|
94
|
-
error: engineMissingError(engine),
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
88
|
const prompt = buildPlanPrompt(opts.instruction, planBase(opts.project));
|
|
98
|
-
return
|
|
89
|
+
return apiPlan(prompt, opts.project, opts.echo === true);
|
|
99
90
|
}
|
|
100
91
|
//# sourceMappingURL=plan-delegate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-delegate.js","sourceRoot":"","sources":["../../../src/lib/exec/plan-delegate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"plan-delegate.js","sourceRoot":"","sources":["../../../src/lib/exec/plan-delegate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { NIO_AI_BASE_URL, NIO_AI_MAX_INPUT, NIO_AI_MODEL_ID, NIO_AI_OUTPUT, } from '../clients/client-configs.js';
|
|
2
|
+
export const QWEN_ENGINE = 'qwen-3.0/vllm';
|
|
3
|
+
export class QwenError extends Error {
|
|
4
|
+
status;
|
|
5
|
+
constructor(message, status) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'QwenError';
|
|
8
|
+
this.status = status;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
const DEFAULT_TIMEOUT_MS = 120_000;
|
|
12
|
+
export function estimateInputTokens(system, prompt) {
|
|
13
|
+
return Math.ceil(((system?.length ?? 0) + prompt.length) / 4);
|
|
14
|
+
}
|
|
15
|
+
export async function qwenComplete(prompt, opts = {}) {
|
|
16
|
+
if (NIO_AI_MAX_INPUT > 0) {
|
|
17
|
+
const est = estimateInputTokens(opts.system, prompt);
|
|
18
|
+
if (est > NIO_AI_MAX_INPUT) {
|
|
19
|
+
throw new QwenError(`Prompt com ~${est} tokens de input excede o teto NIO_AI_MAX_INPUT=${NIO_AI_MAX_INPUT}. ` +
|
|
20
|
+
`Enxugue o prompt (menos MCPs/skills no contexto) ou suba o teto via NIO_AI_MAX_INPUT.`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const url = `${NIO_AI_BASE_URL.replace(/\/+$/, '')}/chat/completions`;
|
|
24
|
+
const controller = new AbortController();
|
|
25
|
+
const timer = setTimeout(() => controller.abort(), opts.timeoutMs ?? DEFAULT_TIMEOUT_MS);
|
|
26
|
+
try {
|
|
27
|
+
const res = await fetch(url, {
|
|
28
|
+
method: 'POST',
|
|
29
|
+
headers: { 'content-type': 'application/json' },
|
|
30
|
+
body: JSON.stringify({
|
|
31
|
+
model: NIO_AI_MODEL_ID,
|
|
32
|
+
messages: [
|
|
33
|
+
...(opts.system ? [{ role: 'system', content: opts.system }] : []),
|
|
34
|
+
{ role: 'user', content: prompt },
|
|
35
|
+
],
|
|
36
|
+
max_tokens: opts.maxTokens ?? NIO_AI_OUTPUT,
|
|
37
|
+
temperature: opts.temperature ?? 0.2,
|
|
38
|
+
stream: false,
|
|
39
|
+
}),
|
|
40
|
+
signal: controller.signal,
|
|
41
|
+
});
|
|
42
|
+
if (!res.ok) {
|
|
43
|
+
const detail = (await res.text()).slice(0, 500);
|
|
44
|
+
throw new QwenError(`vLLM respondeu ${res.status}: ${detail}`, res.status);
|
|
45
|
+
}
|
|
46
|
+
const data = (await res.json());
|
|
47
|
+
const content = data.choices?.[0]?.message?.content;
|
|
48
|
+
if (typeof content !== 'string' || !content.trim()) {
|
|
49
|
+
throw new QwenError('vLLM devolveu resposta vazia');
|
|
50
|
+
}
|
|
51
|
+
return content;
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
if (e instanceof QwenError)
|
|
55
|
+
throw e;
|
|
56
|
+
const cause = e instanceof Error ? e.message : String(e);
|
|
57
|
+
throw new QwenError(`vLLM indisponível em ${NIO_AI_BASE_URL}: ${cause}`);
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
clearTimeout(timer);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const FILE_BLOCK_RE = /<<<FILE\s+([^\r\n>]+)>>>\r?\n?([\s\S]*?)<<<END_FILE>>>/g;
|
|
64
|
+
export function parseFileBlocks(text) {
|
|
65
|
+
const blocks = [];
|
|
66
|
+
for (const m of text.matchAll(FILE_BLOCK_RE)) {
|
|
67
|
+
const path = m[1].trim();
|
|
68
|
+
if (!path)
|
|
69
|
+
continue;
|
|
70
|
+
blocks.push({ path, content: m[2] });
|
|
71
|
+
}
|
|
72
|
+
return blocks;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=qwen-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qwen-client.js","sourceRoot":"","sources":["../../../src/lib/exec/qwen-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
2
1
|
import { brand } from '../../brand.js';
|
|
3
2
|
import { readFileSync } from 'node:fs';
|
|
4
3
|
import { planPath, stripFence } from './plan-delegate.js';
|
|
5
|
-
import {
|
|
4
|
+
import { QWEN_ENGINE, qwenComplete } from './qwen-client.js';
|
|
6
5
|
import { HARNESS_RULES_REL } from '../clients/harness.js';
|
|
7
6
|
const SLUG_MAX = 50;
|
|
8
7
|
const SLUG_FALLBACK = 'plan';
|
|
@@ -59,42 +58,26 @@ export function parseVerdict(text) {
|
|
|
59
58
|
throw new Error('veredito ambíguo: sem justificativa (reason vazio)');
|
|
60
59
|
return { needsSpec, reason };
|
|
61
60
|
}
|
|
62
|
-
function
|
|
63
|
-
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
child.on('error', (e) => fail(e.message));
|
|
73
|
-
child.on('close', (code) => {
|
|
74
|
-
if (code !== 0)
|
|
75
|
-
return fail(`engine ${engine} falhou (exit ${code})`);
|
|
76
|
-
try {
|
|
77
|
-
resolve({ ok: true, engine, ...parseVerdict(out) });
|
|
78
|
-
}
|
|
79
|
-
catch (e) {
|
|
80
|
-
fail(e.message);
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
});
|
|
61
|
+
async function apiValidate(prompt, project, echo) {
|
|
62
|
+
try {
|
|
63
|
+
const out = await qwenComplete(prompt);
|
|
64
|
+
if (echo)
|
|
65
|
+
process.stderr.write(out);
|
|
66
|
+
return { ok: true, engine: QWEN_ENGINE, ...parseVerdict(out) };
|
|
67
|
+
}
|
|
68
|
+
catch (e) {
|
|
69
|
+
return { ok: false, engine: QWEN_ENGINE, error: e.message };
|
|
70
|
+
}
|
|
84
71
|
}
|
|
85
72
|
export async function runValidatePlan(opts) {
|
|
86
|
-
const engine = opts.engine ?? PLAN_ENGINE;
|
|
87
73
|
let plan;
|
|
88
74
|
try {
|
|
89
75
|
plan = readPlan(opts.project);
|
|
90
76
|
}
|
|
91
77
|
catch {
|
|
92
|
-
return { ok: false, engine, error: planMissingError(opts.project) };
|
|
78
|
+
return { ok: false, engine: QWEN_ENGINE, error: planMissingError(opts.project) };
|
|
93
79
|
}
|
|
94
|
-
const
|
|
95
|
-
if (!bin)
|
|
96
|
-
return { ok: false, engine, error: engineMissingError(engine) };
|
|
97
|
-
const result = await spawnValidate(bin, engine, buildValidatePrompt(plan), opts.project, opts.echo === true);
|
|
80
|
+
const result = await apiValidate(buildValidatePrompt(plan), opts.project, opts.echo === true);
|
|
98
81
|
if (result.ok && result.needsSpec)
|
|
99
82
|
result.suggestedSlug = suggestSlug(plan);
|
|
100
83
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-plan-delegate.js","sourceRoot":"","sources":["../../../src/lib/exec/validate-plan-delegate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"validate-plan-delegate.js","sourceRoot":"","sources":["../../../src/lib/exec/validate-plan-delegate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { readdirSync, lstatSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
export const DEFAULT_MAX_ZIP_BYTES = 64 * 1024 * 1024;
|
|
4
|
+
export async function fetchZipball(url, opts) {
|
|
5
|
+
const maxBytes = opts.maxBytes ?? DEFAULT_MAX_ZIP_BYTES;
|
|
6
|
+
const ac = new AbortController();
|
|
7
|
+
let timedOut = false;
|
|
8
|
+
const timer = setTimeout(() => {
|
|
9
|
+
timedOut = true;
|
|
10
|
+
ac.abort();
|
|
11
|
+
}, opts.timeoutMs);
|
|
12
|
+
try {
|
|
13
|
+
const res = await fetch(url, { signal: ac.signal, redirect: 'follow' });
|
|
14
|
+
if (!res.ok)
|
|
15
|
+
throw new Error(`HTTP ${res.status} ao baixar ${url}`);
|
|
16
|
+
const declared = Number(res.headers.get('content-length'));
|
|
17
|
+
if (Number.isFinite(declared) && declared > maxBytes) {
|
|
18
|
+
throw new Error(`zipball grande demais (${declared} bytes > ${maxBytes})`);
|
|
19
|
+
}
|
|
20
|
+
if (!res.body)
|
|
21
|
+
return Buffer.from(await res.arrayBuffer());
|
|
22
|
+
const chunks = [];
|
|
23
|
+
let total = 0;
|
|
24
|
+
for await (const chunk of res.body) {
|
|
25
|
+
total += chunk.length;
|
|
26
|
+
if (total > maxBytes) {
|
|
27
|
+
ac.abort();
|
|
28
|
+
throw new Error(`zipball excedeu o teto de ${maxBytes} bytes durante o download`);
|
|
29
|
+
}
|
|
30
|
+
chunks.push(chunk);
|
|
31
|
+
}
|
|
32
|
+
return Buffer.concat(chunks);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
if (timedOut)
|
|
36
|
+
throw new Error(`timeout após ${opts.timeoutMs}ms baixando ${url}`);
|
|
37
|
+
throw err;
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
clearTimeout(timer);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function codeloadZipUrl(repo, ref) {
|
|
44
|
+
return `https://codeload.github.com/${repo}/zip/${encodeURIComponent(ref)}`;
|
|
45
|
+
}
|
|
46
|
+
export function isPinnedRef(ref) {
|
|
47
|
+
return /^[0-9a-f]{40}$/i.test(ref.trim());
|
|
48
|
+
}
|
|
49
|
+
export function rejectSymlinks(dir) {
|
|
50
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
51
|
+
const full = join(dir, entry.name);
|
|
52
|
+
if (entry.isSymbolicLink() || lstatSync(full).isSymbolicLink()) {
|
|
53
|
+
throw new Error(`entrada symlink recusada no bundle: ${entry.name}`);
|
|
54
|
+
}
|
|
55
|
+
if (entry.isDirectory())
|
|
56
|
+
rejectSymlinks(full);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=fetch-zipball.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-zipball.js","sourceRoot":"","sources":["../../src/lib/fetch-zipball.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/load-env.js
CHANGED
|
@@ -2,8 +2,14 @@ import { homedir } from 'node:os';
|
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { existsSync, readFileSync } from 'node:fs';
|
|
4
4
|
const debug = /^(1|true|yes|on)$/i.test((process.env.NIO_DEBUG ?? '').trim());
|
|
5
|
+
const CWD_ALLOWLIST = new Set([
|
|
6
|
+
'NIO_DEBUG',
|
|
7
|
+
'NIO_NO_ANIM',
|
|
8
|
+
'NIO_TELEMETRY',
|
|
9
|
+
'NIO_NO_TELEMETRY',
|
|
10
|
+
]);
|
|
5
11
|
const nodeLoad = process.loadEnvFile;
|
|
6
|
-
function parseAndApply(text) {
|
|
12
|
+
function parseAndApply(text, allow) {
|
|
7
13
|
for (const raw of text.split('\n')) {
|
|
8
14
|
const line = raw.trim();
|
|
9
15
|
if (!line || line.startsWith('#'))
|
|
@@ -12,22 +18,27 @@ function parseAndApply(text) {
|
|
|
12
18
|
if (eq < 1)
|
|
13
19
|
continue;
|
|
14
20
|
const key = line.slice(0, eq).trim();
|
|
21
|
+
if (allow && !allow.has(key)) {
|
|
22
|
+
if (debug)
|
|
23
|
+
console.error(`[nio:debug] env ignorada (fora do allowlist do cwd): ${key}`);
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
15
26
|
if (process.env[key] === undefined) {
|
|
16
27
|
process.env[key] = line.slice(eq + 1).trim();
|
|
17
28
|
}
|
|
18
29
|
}
|
|
19
30
|
}
|
|
20
|
-
function tryLoad(path) {
|
|
31
|
+
function tryLoad(path, allow) {
|
|
21
32
|
if (!existsSync(path)) {
|
|
22
33
|
if (debug)
|
|
23
34
|
console.error(`[nio:debug] env ausente: ${path}`);
|
|
24
35
|
return;
|
|
25
36
|
}
|
|
26
37
|
try {
|
|
27
|
-
if (nodeLoad)
|
|
38
|
+
if (nodeLoad && !allow)
|
|
28
39
|
nodeLoad(path);
|
|
29
40
|
else
|
|
30
|
-
parseAndApply(readFileSync(path, 'utf8'));
|
|
41
|
+
parseAndApply(readFileSync(path, 'utf8'), allow);
|
|
31
42
|
if (debug)
|
|
32
43
|
console.error(`[nio:debug] env carregado: ${path}`);
|
|
33
44
|
}
|
|
@@ -39,6 +50,7 @@ function tryLoad(path) {
|
|
|
39
50
|
const explicit = process.env.NIO_ENV_FILE?.trim();
|
|
40
51
|
if (explicit)
|
|
41
52
|
tryLoad(explicit);
|
|
42
|
-
tryLoad(join(process.cwd(), '.env'));
|
|
53
|
+
tryLoad(join(process.cwd(), '.env'), CWD_ALLOWLIST);
|
|
43
54
|
tryLoad(join(homedir(), '.nio', 'config.env'));
|
|
55
|
+
export { CWD_ALLOWLIST, parseAndApply };
|
|
44
56
|
//# sourceMappingURL=load-env.js.map
|
package/dist/lib/load-env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-env.js","sourceRoot":"","sources":["../../src/lib/load-env.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"load-env.js","sourceRoot":"","sources":["../../src/lib/load-env.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEnD,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAG9E,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,WAAW;IACX,aAAa;IACb,eAAe;IACf,kBAAkB;CACnB,CAAC,CAAC;AAGH,MAAM,QAAQ,GAAI,OAAiD,CAAC,WAAW,CAAC;AAMhF,SAAS,aAAa,CAAC,IAAY,EAAE,KAAmB;IACtD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,EAAE,GAAG,CAAC;YAAE,SAAS;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,IAAI,KAAK;gBAAE,OAAO,CAAC,KAAK,CAAC,wDAAwD,GAAG,EAAE,CAAC,CAAC;YACxF,SAAS;QACX,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/C,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,IAAY,EAAE,KAAmB;IAChD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,IAAI,KAAK;YAAE,OAAO,CAAC,KAAK,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC;QAC7D,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QAGH,IAAI,QAAQ,IAAI,CAAC,KAAK;YAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;;YAClC,aAAa,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;QACtD,IAAI,KAAK;YAAE,OAAO,CAAC,KAAK,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,KAAK;YAAE,OAAO,CAAC,KAAK,CAAC,2BAA4B,GAAa,CAAC,OAAO,MAAM,IAAI,EAAE,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC;AAED,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;AAClD,IAAI,QAAQ;IAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;AAChC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,aAAa,CAAC,CAAC;AACpD,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC"}
|
package/dist/lib/open-url.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
2
|
export function openUrl(target) {
|
|
3
|
-
const bin = process.platform === 'darwin'
|
|
4
|
-
|
|
3
|
+
const [bin, args] = process.platform === 'darwin'
|
|
4
|
+
? ['open', [target]]
|
|
5
|
+
: process.platform === 'win32'
|
|
6
|
+
? ['rundll32.exe', ['url.dll,FileProtocolHandler', target]]
|
|
7
|
+
: ['xdg-open', [target]];
|
|
5
8
|
const child = spawn(bin, args, { detached: true, stdio: 'ignore' });
|
|
6
9
|
child.on('error', () => { });
|
|
7
10
|
child.unref();
|
package/dist/lib/open-url.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open-url.js","sourceRoot":"","sources":["../../src/lib/open-url.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,UAAU,OAAO,CAAC,MAAc;
|
|
1
|
+
{"version":3,"file":"open-url.js","sourceRoot":"","sources":["../../src/lib/open-url.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,UAAU,OAAO,CAAC,MAAc;IAKpC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GACf,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAC3B,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC5B,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAE/B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAa,EAAE,IAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1F,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC5B,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC"}
|