@nio-cli/cli 0.3.6 → 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.
Files changed (83) hide show
  1. package/.env.example +68 -5
  2. package/Dockerfile.gateway +13 -5
  3. package/dist/adapters/lang/vendor.js +5 -10
  4. package/dist/adapters/lang/vendor.js.map +1 -1
  5. package/dist/adapters/pg/auth-event-repository.js +30 -0
  6. package/dist/adapters/pg/auth-event-repository.js.map +1 -0
  7. package/dist/adapters/pg/client.js +22 -4
  8. package/dist/adapters/pg/client.js.map +1 -1
  9. package/dist/adapters/pg/login-ip-repository.js +26 -0
  10. package/dist/adapters/pg/login-ip-repository.js.map +1 -0
  11. package/dist/adapters/pg/user-repository.js +47 -18
  12. package/dist/adapters/pg/user-repository.js.map +1 -1
  13. package/dist/adapters/sms/http-generic.js +21 -0
  14. package/dist/adapters/sms/http-generic.js.map +1 -1
  15. package/dist/brand.js +1 -1
  16. package/dist/brand.js.map +1 -1
  17. package/dist/cli/commands/auth.js +25 -18
  18. package/dist/cli/commands/auth.js.map +1 -1
  19. package/dist/cli/commands/docker.js +4 -4
  20. package/dist/cli/commands/docker.js.map +1 -1
  21. package/dist/cli/commands/security.js +76 -5
  22. package/dist/cli/commands/security.js.map +1 -1
  23. package/dist/cli/commands/sync.js +5 -1
  24. package/dist/cli/commands/sync.js.map +1 -1
  25. package/dist/gateway/config.js +23 -1
  26. package/dist/gateway/config.js.map +1 -1
  27. package/dist/gateway/edge-filter.js +20 -3
  28. package/dist/gateway/edge-filter.js.map +1 -1
  29. package/dist/gateway/index.js +145 -22
  30. package/dist/gateway/index.js.map +1 -1
  31. package/dist/gateway/middleware/auth.js +15 -3
  32. package/dist/gateway/middleware/auth.js.map +1 -1
  33. package/dist/gateway/services/login.js +47 -11
  34. package/dist/gateway/services/login.js.map +1 -1
  35. package/dist/gateway/services/register.js +20 -0
  36. package/dist/gateway/services/register.js.map +1 -0
  37. package/dist/gateway/services/security.js +64 -11
  38. package/dist/gateway/services/security.js.map +1 -1
  39. package/dist/gateway/throttle.js +57 -0
  40. package/dist/gateway/throttle.js.map +1 -0
  41. package/dist/lib/auth/backup-codes.js +4 -4
  42. package/dist/lib/auth/backup-codes.js.map +1 -1
  43. package/dist/lib/auth/breach-check.js +58 -0
  44. package/dist/lib/auth/breach-check.js.map +1 -0
  45. package/dist/lib/auth/gateway-client.js +17 -2
  46. package/dist/lib/auth/gateway-client.js.map +1 -1
  47. package/dist/lib/auth/gateway-process.js +17 -2
  48. package/dist/lib/auth/gateway-process.js.map +1 -1
  49. package/dist/lib/auth/gateway-token.js +2 -2
  50. package/dist/lib/auth/gateway-token.js.map +1 -1
  51. package/dist/lib/auth/nio-config.js +29 -7
  52. package/dist/lib/auth/nio-config.js.map +1 -1
  53. package/dist/lib/auth/otp.js +3 -3
  54. package/dist/lib/auth/otp.js.map +1 -1
  55. package/dist/lib/auth/password.js +33 -10
  56. package/dist/lib/auth/password.js.map +1 -1
  57. package/dist/lib/auth/secrets.js +96 -0
  58. package/dist/lib/auth/secrets.js.map +1 -0
  59. package/dist/lib/auth/session-store.js +2 -2
  60. package/dist/lib/auth/session-store.js.map +1 -1
  61. package/dist/lib/clients/client-install.js +22 -4
  62. package/dist/lib/clients/client-install.js.map +1 -1
  63. package/dist/lib/fetch-zipball.js +59 -0
  64. package/dist/lib/fetch-zipball.js.map +1 -0
  65. package/dist/lib/load-env.js +17 -5
  66. package/dist/lib/load-env.js.map +1 -1
  67. package/dist/lib/open-url.js +5 -2
  68. package/dist/lib/open-url.js.map +1 -1
  69. package/dist/lib/proc.js +27 -0
  70. package/dist/lib/proc.js.map +1 -1
  71. package/dist/lib/skills/skills-cache.js +25 -12
  72. package/dist/lib/skills/skills-cache.js.map +1 -1
  73. package/dist/lib/version-check.js +1 -11
  74. package/dist/lib/version-check.js.map +1 -1
  75. package/dist/mcp-server.js +5 -2
  76. package/dist/mcp-server.js.map +1 -1
  77. package/dist/tui/launch.js +6 -1
  78. package/dist/tui/launch.js.map +1 -1
  79. package/dist/version.js +17 -6
  80. package/dist/version.js.map +1 -1
  81. package/docker/docker-compose.yml +56 -26
  82. package/docker/kong.yml +10 -0
  83. 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 OPTIONS = {
4
- algorithm: ARGON2ID,
5
- memoryCost: 19_456,
6
- timeCost: 2,
7
- parallelism: 1,
8
- };
9
- export function hashPassword(plain) {
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
- return hash(plain, OPTIONS);
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
- return await verify(storedHash, plain);
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":"AASA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAK/C,MAAM,QAAQ,GAAG,CAAc,CAAC;AAEhC,MAAM,OAAO,GAAG;IACd,SAAS,EAAE,QAAQ;IACnB,UAAU,EAAE,MAAM;IAClB,QAAQ,EAAE,CAAC;IACX,WAAW,EAAE,CAAC;CACN,CAAC;AAGX,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC9B,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAkB,EAAE,KAAa;IACpE,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
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;IAChD,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IACvE,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
+ {"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(binary, ['--version'], { stdio: 'ignore', timeout: 5000 });
14
- return !res.error;
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 false;
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;AAoB/C,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;AAGF,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,IAAI,CAAC;QAEH,MAAM,GAAG,GAAG,iBAAiB,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,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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"}
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"load-env.js","sourceRoot":"","sources":["../../src/lib/load-env.ts"],"names":[],"mappings":"AAOA,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,QAAQ,GAAI,OAAiD,CAAC,WAAW,CAAC;AAGhF,SAAS,aAAa,CAAC,IAAY;IACjC,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,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;IAC3B,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;QACH,IAAI,QAAQ;YAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;;YACxB,aAAa,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAC/C,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,CAAC,CAAC;AACrC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC"}
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"}
@@ -1,7 +1,10 @@
1
1
  import { spawn } from 'node:child_process';
2
2
  export function openUrl(target) {
3
- const bin = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'cmd' : 'xdg-open';
4
- const args = process.platform === 'win32' ? ['/c', 'start', '', target] : [target];
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();
@@ -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;IACpC,MAAM,GAAG,GACP,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;IAC7F,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACnF,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC5B,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC"}
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
  }
@@ -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;AAE5B,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;AAG3C,SAAS,QAAQ,CAAC,GAAW;IAC3B,OAAO,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AAC1E,CAAC;AAGD,SAAS,cAAc,CAAC,OAAe,EAAE,IAAuB;IAC9D,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpD,CAAC;AAMD,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,OAA0B,EAAE,EAC5B,UAA4B,EAAE;IAE9B,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,SAAS,CAAC,OAAO,EAAE,IAAgB,EAAE,OAAO,CAAC,CAAC;AACvD,CAAC;AAMD,MAAM,UAAU,aAAa,CAC3B,OAAe,EACf,OAA0B,EAAE,EAC5B,UAAwB,EAAE;IAE1B,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,EAAE,IAAgB,EAAE,OAAO,CAAC,CAAC;AACnD,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
- const url = `https://codeload.github.com/${repo}/zip/refs/heads/${ref}`;
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 res = await fetch(url, { signal: ac.signal });
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 = ac.signal.aborted
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
- if (skillsCached() && !skillsCacheStale()) {
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":"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"}
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":"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"}
1
+ {"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/lib/version-check.ts"],"names":[],"mappings":"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"}
@@ -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().findByName(stored.name);
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;