@nio-cli/cli 0.3.7 → 0.4.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 +68 -5
- package/Dockerfile.gateway +13 -5
- 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 +22 -4
- package/dist/adapters/pg/client.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/http-generic.js +21 -0
- package/dist/adapters/sms/http-generic.js.map +1 -1
- package/dist/brand.js +1 -1
- package/dist/brand.js.map +1 -1
- package/dist/cli/commands/auth.js +25 -18
- package/dist/cli/commands/auth.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/security.js +76 -5
- package/dist/cli/commands/security.js.map +1 -1
- package/dist/cli/commands/sync.js +5 -1
- package/dist/cli/commands/sync.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 +47 -11
- 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 +64 -11
- 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 +2 -2
- package/dist/lib/auth/gateway-token.js.map +1 -1
- package/dist/lib/auth/nio-config.js +29 -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-install.js +22 -4
- package/dist/lib/clients/client-install.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/skills/skills-cache.js +25 -12
- package/dist/lib/skills/skills-cache.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 -2
- package/dist/mcp-server.js.map +1 -1
- package/dist/tui/launch.js +6 -1
- package/dist/tui/launch.js.map +1 -1
- 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 +20 -11
|
@@ -1,23 +1,46 @@
|
|
|
1
1
|
import { hash, verify } from '@node-rs/argon2';
|
|
2
|
+
import { currentPepperId, pepperFor } from './secrets.js';
|
|
2
3
|
const ARGON2ID = 2;
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
export const MIN_PASSWORD_LENGTH = 8;
|
|
5
|
+
function envInt(name, fallback) {
|
|
6
|
+
const n = Number(process.env[name]);
|
|
7
|
+
return Number.isFinite(n) && n > 0 ? Math.floor(n) : fallback;
|
|
8
|
+
}
|
|
9
|
+
export function currentArgon2Options() {
|
|
10
|
+
return {
|
|
11
|
+
algorithm: ARGON2ID,
|
|
12
|
+
memoryCost: envInt('NIO_ARGON2_MEMORY_MIB', 19) * 1024,
|
|
13
|
+
timeCost: envInt('NIO_ARGON2_TIME', 2),
|
|
14
|
+
parallelism: envInt('NIO_ARGON2_PARALLELISM', 1),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export async function hashPassword(plain) {
|
|
10
18
|
if (plain.length === 0) {
|
|
11
19
|
return Promise.reject(new Error('Senha vazia não pode ser hasheada.'));
|
|
12
20
|
}
|
|
13
|
-
|
|
21
|
+
const pepperId = currentPepperId();
|
|
22
|
+
const secret = pepperFor(pepperId);
|
|
23
|
+
const phc = await hash(plain, { ...currentArgon2Options(), ...(secret ? { secret } : {}) });
|
|
24
|
+
return { phc, pepperId };
|
|
14
25
|
}
|
|
15
|
-
export async function verifyPassword(storedHash, plain) {
|
|
26
|
+
export async function verifyPassword(storedHash, plain, pepperId) {
|
|
16
27
|
try {
|
|
17
|
-
|
|
28
|
+
const secret = pepperFor(pepperId);
|
|
29
|
+
return await verify(storedHash, plain, secret ? { secret } : undefined);
|
|
18
30
|
}
|
|
19
31
|
catch {
|
|
20
32
|
return false;
|
|
21
33
|
}
|
|
22
34
|
}
|
|
35
|
+
export function needsRehash(phc, pepperId) {
|
|
36
|
+
if (pepperId !== currentPepperId())
|
|
37
|
+
return true;
|
|
38
|
+
const m = /\$m=(\d+),t=(\d+),p=(\d+)\$/.exec(phc);
|
|
39
|
+
if (!m)
|
|
40
|
+
return true;
|
|
41
|
+
const opt = currentArgon2Options();
|
|
42
|
+
return (Number(m[1]) !== opt.memoryCost ||
|
|
43
|
+
Number(m[2]) !== opt.timeCost ||
|
|
44
|
+
Number(m[3]) !== opt.parallelism);
|
|
45
|
+
}
|
|
23
46
|
//# sourceMappingURL=password.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"password.js","sourceRoot":"","sources":["../../../src/lib/auth/password.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"password.js","sourceRoot":"","sources":["../../../src/lib/auth/password.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAI1D,MAAM,QAAQ,GAAG,CAAc,CAAC;AAGhC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAGrC,SAAS,MAAM,CAAC,IAAY,EAAE,QAAgB;IAC5C,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACpC,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AAChE,CAAC;AAGD,MAAM,UAAU,oBAAoB;IAMlC,OAAO;QACL,SAAS,EAAE,QAAQ;QACnB,UAAU,EAAE,MAAM,CAAC,uBAAuB,EAAE,EAAE,CAAC,GAAG,IAAI;QACtD,QAAQ,EAAE,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACtC,WAAW,EAAE,MAAM,CAAC,wBAAwB,EAAE,CAAC,CAAC;KACjD,CAAC;AACJ,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAa;IAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;IACzE,CAAC;IACD,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,oBAAoB,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5F,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC3B,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,UAAkB,EAClB,KAAa,EACb,QAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,MAAM,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAMD,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,QAAgB;IACvD,IAAI,QAAQ,KAAK,eAAe,EAAE;QAAE,OAAO,IAAI,CAAC;IAChD,MAAM,CAAC,GAAG,6BAA6B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,GAAG,GAAG,oBAAoB,EAAE,CAAC;IACnC,OAAO,CACL,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,UAAU;QAC/B,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,QAAQ;QAC7B,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,WAAW,CACjC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { getJwtSecret, MIN_JWT_SECRET_LENGTH } from '../../gateway/config.js';
|
|
2
|
+
export const NO_PEPPER = 0;
|
|
3
|
+
let cache = null;
|
|
4
|
+
function parsePeppers() {
|
|
5
|
+
const map = new Map();
|
|
6
|
+
const raw = process.env.NIO_PEPPERS?.trim() || envSinglePepper();
|
|
7
|
+
if (!raw)
|
|
8
|
+
return map;
|
|
9
|
+
for (const entry of raw.split(',')) {
|
|
10
|
+
const trimmed = entry.trim();
|
|
11
|
+
if (!trimmed)
|
|
12
|
+
continue;
|
|
13
|
+
const sep = trimmed.indexOf(':');
|
|
14
|
+
const id = Number(sep >= 0 ? trimmed.slice(0, sep) : NaN);
|
|
15
|
+
const secret = sep >= 0 ? trimmed.slice(sep + 1) : '';
|
|
16
|
+
if (!Number.isInteger(id) || id <= 0 || !secret) {
|
|
17
|
+
throw new Error(`NIO_PEPPERS inválido: entrada "${trimmed}" (esperado "id:segredo", id inteiro > 0).`);
|
|
18
|
+
}
|
|
19
|
+
if (secret.length < MIN_JWT_SECRET_LENGTH) {
|
|
20
|
+
throw new Error(`NIO_PEPPERS: o pepper id ${id} tem ${secret.length} chars — mínimo ${MIN_JWT_SECRET_LENGTH}. ` +
|
|
21
|
+
'Gere com `openssl rand -base64 32`.');
|
|
22
|
+
}
|
|
23
|
+
map.set(id, Buffer.from(secret, 'utf8'));
|
|
24
|
+
}
|
|
25
|
+
return map;
|
|
26
|
+
}
|
|
27
|
+
function envSinglePepper() {
|
|
28
|
+
const v = process.env.NIO_PEPPER?.trim();
|
|
29
|
+
return v ? `1:${v}` : '';
|
|
30
|
+
}
|
|
31
|
+
function peppers() {
|
|
32
|
+
return (cache ??= parsePeppers());
|
|
33
|
+
}
|
|
34
|
+
export function __resetPeppers() {
|
|
35
|
+
cache = null;
|
|
36
|
+
}
|
|
37
|
+
export function pepperFor(id) {
|
|
38
|
+
return id === NO_PEPPER ? undefined : peppers().get(id);
|
|
39
|
+
}
|
|
40
|
+
export function currentPepperId() {
|
|
41
|
+
let max = NO_PEPPER;
|
|
42
|
+
for (const id of peppers().keys())
|
|
43
|
+
if (id > max)
|
|
44
|
+
max = id;
|
|
45
|
+
return max;
|
|
46
|
+
}
|
|
47
|
+
export function otpHmacSecret() {
|
|
48
|
+
return process.env.OTP_HMAC_SECRET?.trim() || getJwtSecret();
|
|
49
|
+
}
|
|
50
|
+
const KID_RE = /^[A-Za-z0-9._-]{1,32}$/;
|
|
51
|
+
let jwtCache = null;
|
|
52
|
+
function parseJwtSecrets() {
|
|
53
|
+
const map = new Map();
|
|
54
|
+
const raw = process.env.JWT_SECRETS?.trim();
|
|
55
|
+
if (!raw)
|
|
56
|
+
return map;
|
|
57
|
+
for (const entry of raw.split(',')) {
|
|
58
|
+
const trimmed = entry.trim();
|
|
59
|
+
if (!trimmed)
|
|
60
|
+
continue;
|
|
61
|
+
const sep = trimmed.indexOf(':');
|
|
62
|
+
const kid = sep >= 0 ? trimmed.slice(0, sep).trim() : '';
|
|
63
|
+
const secret = sep >= 0 ? trimmed.slice(sep + 1) : '';
|
|
64
|
+
if (!kid || !secret) {
|
|
65
|
+
throw new Error(`JWT_SECRETS inválido: entrada "${trimmed}" (esperado "kid:segredo").`);
|
|
66
|
+
}
|
|
67
|
+
if (!KID_RE.test(kid)) {
|
|
68
|
+
throw new Error(`JWT_SECRETS: kid "${kid}" inválido (use [A-Za-z0-9._-], até 32 chars).`);
|
|
69
|
+
}
|
|
70
|
+
if (secret.length < MIN_JWT_SECRET_LENGTH) {
|
|
71
|
+
throw new Error(`JWT_SECRETS: o segredo do kid "${kid}" tem ${secret.length} chars — mínimo ${MIN_JWT_SECRET_LENGTH}.`);
|
|
72
|
+
}
|
|
73
|
+
map.set(kid, secret);
|
|
74
|
+
}
|
|
75
|
+
return map;
|
|
76
|
+
}
|
|
77
|
+
function jwtSecrets() {
|
|
78
|
+
return (jwtCache ??= parseJwtSecrets());
|
|
79
|
+
}
|
|
80
|
+
export function __resetJwtSecrets() {
|
|
81
|
+
jwtCache = null;
|
|
82
|
+
}
|
|
83
|
+
export function jwtSigningKey() {
|
|
84
|
+
const m = jwtSecrets();
|
|
85
|
+
if (m.size > 0) {
|
|
86
|
+
const last = [...m.entries()].at(-1);
|
|
87
|
+
return { kid: last[0], secret: last[1] };
|
|
88
|
+
}
|
|
89
|
+
return { kid: undefined, secret: getJwtSecret() };
|
|
90
|
+
}
|
|
91
|
+
export function jwtVerifyKey(kid) {
|
|
92
|
+
if (kid)
|
|
93
|
+
return jwtSecrets().get(kid) ?? null;
|
|
94
|
+
return process.env.JWT_SECRET?.trim() || null;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../../src/lib/auth/secrets.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,8 +35,8 @@ export async function loadSession(file = SESSION_FILE) {
|
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
export async function saveSession(session, file = SESSION_FILE) {
|
|
38
|
-
await mkdir(dirname(file), { recursive: true });
|
|
39
|
-
await writeFile(file, JSON.stringify(session, null, 2) + '\n', 'utf8');
|
|
38
|
+
await mkdir(dirname(file), { recursive: true, mode: 0o700 });
|
|
39
|
+
await writeFile(file, JSON.stringify(session, null, 2) + '\n', { encoding: 'utf8', mode: 0o600 });
|
|
40
40
|
try {
|
|
41
41
|
await chmod(file, 0o600);
|
|
42
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../../src/lib/auth/session-store.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;AAYrD,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC7C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,CAAC,GAAG,GAA8B,CAAC;IACzC,IACE,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;QAC5B,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;QAC1B,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ;QAC3B,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ;QAC/B,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ;QAChC,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,EAC/B,CAAC;QACD,OAAO;YACL,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,SAAS,EAAE,CAAC,CAAC,SAAS;SACvB,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAe,YAAY;IAC3D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzC,OAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAClE,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAsB,EAAE,OAAe,YAAY;IACnF,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../../src/lib/auth/session-store.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;AAYrD,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC7C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,CAAC,GAAG,GAA8B,CAAC;IACzC,IACE,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;QAC5B,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;QAC1B,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ;QAC3B,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ;QAC/B,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ;QAChC,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,EAC/B,CAAC;QACD,OAAO;YACL,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,SAAS,EAAE,CAAC,CAAC,SAAS;SACvB,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAe,YAAY;IAC3D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzC,OAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAClE,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAsB,EAAE,OAAe,YAAY;IACnF,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAG7D,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAClG,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;IAET,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAe,YAAY;IAC5D,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { spawnSyncPortable } from '../proc.js';
|
|
1
|
+
import { binaryOnPath, spawnSyncPortable } from '../proc.js';
|
|
2
|
+
import { OPENCODE_SDK_VERSION } from '../../version.js';
|
|
2
3
|
export const CLIENTS = {
|
|
3
4
|
opencode: {
|
|
4
5
|
id: 'opencode',
|
|
@@ -9,12 +10,29 @@ export const CLIENTS = {
|
|
|
9
10
|
},
|
|
10
11
|
};
|
|
11
12
|
export function isBinaryInstalled(binary) {
|
|
13
|
+
return binaryOnPath(binary);
|
|
14
|
+
}
|
|
15
|
+
function majorMinor(v) {
|
|
16
|
+
return v.split('.').slice(0, 2).join('.');
|
|
17
|
+
}
|
|
18
|
+
export function opencodeBinaryVersion() {
|
|
12
19
|
try {
|
|
13
|
-
const res = spawnSyncPortable(
|
|
14
|
-
|
|
20
|
+
const res = spawnSyncPortable('opencode', ['--version'], { encoding: 'utf8', timeout: 5000 });
|
|
21
|
+
if (res.error)
|
|
22
|
+
return null;
|
|
23
|
+
const m = /(\d+)\.(\d+)\.(\d+)/.exec(`${res.stdout ?? ''}${res.stderr ?? ''}`);
|
|
24
|
+
return m ? m[0] : null;
|
|
15
25
|
}
|
|
16
26
|
catch {
|
|
17
|
-
return
|
|
27
|
+
return null;
|
|
18
28
|
}
|
|
19
29
|
}
|
|
30
|
+
export function opencodeVersionSkew() {
|
|
31
|
+
const binary = opencodeBinaryVersion();
|
|
32
|
+
if (!binary || !OPENCODE_SDK_VERSION)
|
|
33
|
+
return null;
|
|
34
|
+
return majorMinor(binary) === majorMinor(OPENCODE_SDK_VERSION)
|
|
35
|
+
? null
|
|
36
|
+
: { binary, sdk: OPENCODE_SDK_VERSION };
|
|
37
|
+
}
|
|
20
38
|
//# sourceMappingURL=client-install.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-install.js","sourceRoot":"","sources":["../../../src/lib/clients/client-install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"client-install.js","sourceRoot":"","sources":["../../../src/lib/clients/client-install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAoBxD,MAAM,CAAC,MAAM,OAAO,GAA+B;IACjD,QAAQ,EAAE;QACR,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,UAAU;QAClB,GAAG,EAAE,aAAa;QAClB,GAAG,EAAE,0BAA0B;KAChC;CACF,CAAC;AAOF,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAGD,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5C,CAAC;AAGD,MAAM,UAAU,qBAAqB;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,iBAAiB,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9F,IAAI,GAAG,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAC3B,MAAM,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC;QAC/E,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAOD,MAAM,UAAU,mBAAmB;IACjC,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;IACvC,IAAI,CAAC,MAAM,IAAI,CAAC,oBAAoB;QAAE,OAAO,IAAI,CAAC;IAClD,OAAO,UAAU,CAAC,MAAM,CAAC,KAAK,UAAU,CAAC,oBAAoB,CAAC;QAC5D,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,oBAAoB,EAAE,CAAC;AAC5C,CAAC"}
|
|
@@ -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"}
|
package/dist/lib/proc.js
CHANGED
|
@@ -1,5 +1,32 @@
|
|
|
1
1
|
import { spawn, spawnSync, } from 'node:child_process';
|
|
2
|
+
import { accessSync, constants, statSync } from 'node:fs';
|
|
3
|
+
import { delimiter, isAbsolute, join } from 'node:path';
|
|
2
4
|
const isWin = process.platform === 'win32';
|
|
5
|
+
function isExecutableFile(p) {
|
|
6
|
+
try {
|
|
7
|
+
if (!statSync(p).isFile())
|
|
8
|
+
return false;
|
|
9
|
+
if (!isWin)
|
|
10
|
+
accessSync(p, constants.X_OK);
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function binaryOnPath(binary) {
|
|
18
|
+
const exts = isWin
|
|
19
|
+
? ['', ...(process.env.PATHEXT ?? '.COM;.EXE;.BAT;.CMD').split(';').filter(Boolean)]
|
|
20
|
+
: [''];
|
|
21
|
+
if (isAbsolute(binary) || binary.includes('/') || (isWin && binary.includes('\\'))) {
|
|
22
|
+
return exts.some((ext) => isExecutableFile(binary + ext));
|
|
23
|
+
}
|
|
24
|
+
for (const dir of (process.env.PATH ?? '').split(delimiter).filter(Boolean)) {
|
|
25
|
+
if (exts.some((ext) => isExecutableFile(join(dir, binary + ext))))
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
3
30
|
function winQuote(arg) {
|
|
4
31
|
return /[\s"&|<>^()%]/.test(arg) ? `"${arg.replace(/"/g, '""')}"` : arg;
|
|
5
32
|
}
|
package/dist/lib/proc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proc.js","sourceRoot":"","sources":["../../src/lib/proc.ts"],"names":[],"mappings":"AAiBA,OAAO,EACL,KAAK,EACL,SAAS,GAKV,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"proc.js","sourceRoot":"","sources":["../../src/lib/proc.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,8 @@ import { tmpdir } from 'node:os';
|
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import AdmZip from 'adm-zip';
|
|
5
5
|
import { brand, env, homePath } from '../../brand.js';
|
|
6
|
+
import { codeloadZipUrl, fetchZipball, isPinnedRef, rejectSymlinks } from '../fetch-zipball.js';
|
|
7
|
+
import { VERSION, semverGt } from '../../version.js';
|
|
6
8
|
const DEFAULT_REPO = brand.skillsRepo;
|
|
7
9
|
const DEFAULT_REF = brand.skillsRef;
|
|
8
10
|
export function skillsRepo() {
|
|
@@ -48,21 +50,21 @@ export async function fetchSkills(opts = {}) {
|
|
|
48
50
|
if (!opts.force && skillsCached()) {
|
|
49
51
|
return { status: 'cached', dir, repo, ref };
|
|
50
52
|
}
|
|
51
|
-
|
|
53
|
+
if (!isPinnedRef(ref)) {
|
|
54
|
+
console.error(`[${brand.mcpBinName}] AVISO: skills vêm de "${ref}" (não é um commit SHA). ` +
|
|
55
|
+
'Fonte não-pinada = execução de código sem revisão. Pine `brand.skillsRef` a um SHA.');
|
|
56
|
+
}
|
|
57
|
+
const url = codeloadZipUrl(repo, ref);
|
|
52
58
|
const staging = join(tmpdir(), `${brand.name}-skills-${process.pid}-${Date.now()}`);
|
|
53
59
|
const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
54
|
-
const ac = new AbortController();
|
|
55
|
-
const timer = setTimeout(() => ac.abort(), timeoutMs);
|
|
56
60
|
try {
|
|
57
|
-
const
|
|
58
|
-
if (!res.ok)
|
|
59
|
-
throw new Error(`HTTP ${res.status} ao baixar ${url}`);
|
|
60
|
-
const buf = Buffer.from(await res.arrayBuffer());
|
|
61
|
+
const buf = await fetchZipball(url, { timeoutMs });
|
|
61
62
|
rmSync(staging, { recursive: true, force: true });
|
|
62
63
|
mkdirSync(staging, { recursive: true });
|
|
63
64
|
new AdmZip(buf).extractAllTo(staging, true);
|
|
64
65
|
const dirs = readdirSync(staging, { withFileTypes: true }).filter((e) => e.isDirectory());
|
|
65
66
|
const root = dirs.length === 1 ? join(staging, dirs[0].name) : staging;
|
|
67
|
+
rejectSymlinks(root);
|
|
66
68
|
rmSync(dir, { recursive: true, force: true });
|
|
67
69
|
mkdirSync(dir, { recursive: true });
|
|
68
70
|
cpSync(root, dir, { recursive: true });
|
|
@@ -71,23 +73,34 @@ export async function fetchSkills(opts = {}) {
|
|
|
71
73
|
return { status: 'fetched', dir, repo, ref };
|
|
72
74
|
}
|
|
73
75
|
catch (err) {
|
|
74
|
-
const msg =
|
|
75
|
-
? `timeout após ${timeoutMs}ms baixando ${url}`
|
|
76
|
-
: err.message;
|
|
76
|
+
const msg = err.message;
|
|
77
77
|
if (skillsCached()) {
|
|
78
78
|
return { status: 'cached', dir, repo, ref, error: msg };
|
|
79
79
|
}
|
|
80
80
|
return { status: 'failed', dir, repo, ref, error: msg };
|
|
81
81
|
}
|
|
82
82
|
finally {
|
|
83
|
-
clearTimeout(timer);
|
|
84
83
|
rmSync(staging, { recursive: true, force: true });
|
|
85
84
|
}
|
|
86
85
|
}
|
|
87
86
|
export async function ensureSkillsCache() {
|
|
88
|
-
|
|
87
|
+
const refMatches = cacheMeta()?.ref === skillsRef();
|
|
88
|
+
if (skillsCached() && refMatches && !skillsCacheStale()) {
|
|
89
89
|
return fetchSkills({ force: false });
|
|
90
90
|
}
|
|
91
91
|
return fetchSkills({ force: true });
|
|
92
92
|
}
|
|
93
|
+
export function skillsMinCliWarning(dir = skillsCacheDir(), cliVersion = VERSION) {
|
|
94
|
+
try {
|
|
95
|
+
const raw = readFileSync(join(dir, 'nio-skills.json'), 'utf8');
|
|
96
|
+
const min = JSON.parse(raw).min_cli_version;
|
|
97
|
+
if (typeof min !== 'string' || !semverGt(min, cliVersion))
|
|
98
|
+
return null;
|
|
99
|
+
return (`o bundle de skills pede a CLI >= ${min}, mas esta é ${cliVersion}. ` +
|
|
100
|
+
`Atualize: npm i -g ${brand.packageName}. Skills podem se comportar de forma inesperada.`);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
93
106
|
//# sourceMappingURL=skills-cache.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-cache.js","sourceRoot":"","sources":["../../../src/lib/skills/skills-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,SAAS,EACT,MAAM,EACN,MAAM,EACN,WAAW,EACX,YAAY,EACZ,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"skills-cache.js","sourceRoot":"","sources":["../../../src/lib/skills/skills-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { readFileSync } from 'node:fs';
|
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
4
|
import { dirname, join } from 'node:path';
|
|
5
5
|
import { brand } from '../brand.js';
|
|
6
|
+
import { semverGt } from '../version.js';
|
|
6
7
|
function loadPkg() {
|
|
7
8
|
const here = dirname(fileURLToPath(import.meta.url));
|
|
8
9
|
const pkgPath = join(here, '..', '..', 'package.json');
|
|
@@ -21,17 +22,6 @@ export function notifyCliIfUpdate() {
|
|
|
21
22
|
catch {
|
|
22
23
|
}
|
|
23
24
|
}
|
|
24
|
-
function semverGt(a, b) {
|
|
25
|
-
const pa = a.split('-')[0].split('.').map((n) => parseInt(n, 10) || 0);
|
|
26
|
-
const pb = b.split('-')[0].split('.').map((n) => parseInt(n, 10) || 0);
|
|
27
|
-
for (let i = 0; i < 3; i++) {
|
|
28
|
-
if ((pa[i] ?? 0) > (pb[i] ?? 0))
|
|
29
|
-
return true;
|
|
30
|
-
if ((pa[i] ?? 0) < (pb[i] ?? 0))
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
return false;
|
|
34
|
-
}
|
|
35
25
|
export async function checkForUpdate(timeoutMs = 3000) {
|
|
36
26
|
try {
|
|
37
27
|
const pkg = loadPkg();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/lib/version-check.ts"],"names":[],"mappings":"AAAA,OAAO,cAAmC,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/lib/version-check.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp-server.js
CHANGED
|
@@ -13,7 +13,7 @@ import { loadSkills, skillResourceDescriptors, readSkillResource, skillPromptDes
|
|
|
13
13
|
import { provision } from './lib/provision/provision.js';
|
|
14
14
|
import { provisionHooks } from './lib/clients/hooks.js';
|
|
15
15
|
import { claudeTarget } from './lib/clients/targets.js';
|
|
16
|
-
import { ensureSkillsCache } from './lib/skills/skills-cache.js';
|
|
16
|
+
import { ensureSkillsCache, skillsMinCliWarning } from './lib/skills/skills-cache.js';
|
|
17
17
|
import { shouldRunAutoPull, pickProvisionTarget } from './lib/clients/autopull.js';
|
|
18
18
|
import { brand, env } from './brand.js';
|
|
19
19
|
import { loadSession } from './lib/auth/session-store.js';
|
|
@@ -37,6 +37,9 @@ async function initSkillsCache() {
|
|
|
37
37
|
else if (r.status === 'failed') {
|
|
38
38
|
console.error(`[${brand.mcpBinName}] aviso: skills indisponíveis: ${r.error}`);
|
|
39
39
|
}
|
|
40
|
+
const w = skillsMinCliWarning();
|
|
41
|
+
if (w)
|
|
42
|
+
console.error(`[${brand.mcpBinName}] AVISO: ${w}`);
|
|
40
43
|
}
|
|
41
44
|
catch (err) {
|
|
42
45
|
console.error(`[${brand.mcpBinName}] aviso: cache de skills pulado: ${err.message}`);
|
|
@@ -54,7 +57,7 @@ async function authenticateSession() {
|
|
|
54
57
|
console.error(`[${brand.mcpBinName}] aviso: sessão inválida (${result.reason}). Rode \`${brand.name} login\` de novo.`);
|
|
55
58
|
return null;
|
|
56
59
|
}
|
|
57
|
-
const user = await createUserRepository().
|
|
60
|
+
const user = await createUserRepository().findById(result.userId);
|
|
58
61
|
if (!user) {
|
|
59
62
|
console.error(`[${brand.mcpBinName}] aviso: usuário da sessão não existe mais. Rode \`${brand.name} login\` de novo.`);
|
|
60
63
|
return null;
|