@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.
Files changed (163) hide show
  1. package/.env.example +88 -12
  2. package/Dockerfile.gateway +13 -5
  3. package/README.md +186 -78
  4. package/dist/adapters/lang/vendor.js +5 -10
  5. package/dist/adapters/lang/vendor.js.map +1 -1
  6. package/dist/adapters/pg/auth-event-repository.js +30 -0
  7. package/dist/adapters/pg/auth-event-repository.js.map +1 -0
  8. package/dist/adapters/pg/client.js +24 -4
  9. package/dist/adapters/pg/client.js.map +1 -1
  10. package/dist/adapters/pg/login-challenge-repository.js.map +1 -1
  11. package/dist/adapters/pg/login-ip-repository.js +26 -0
  12. package/dist/adapters/pg/login-ip-repository.js.map +1 -0
  13. package/dist/adapters/pg/user-repository.js +47 -18
  14. package/dist/adapters/pg/user-repository.js.map +1 -1
  15. package/dist/adapters/sms/whatsapp.js +83 -0
  16. package/dist/adapters/sms/whatsapp.js.map +1 -0
  17. package/dist/app/ai-client.js +2 -2
  18. package/dist/app/ai-client.js.map +1 -1
  19. package/dist/brand.js +1 -1
  20. package/dist/brand.js.map +1 -1
  21. package/dist/cli/commands/ai.js +2 -2
  22. package/dist/cli/commands/ai.js.map +1 -1
  23. package/dist/cli/commands/auth.js +27 -20
  24. package/dist/cli/commands/auth.js.map +1 -1
  25. package/dist/cli/commands/config.js +17 -7
  26. package/dist/cli/commands/config.js.map +1 -1
  27. package/dist/cli/commands/docker.js +4 -4
  28. package/dist/cli/commands/docker.js.map +1 -1
  29. package/dist/cli/commands/docs/content.js +80 -11
  30. package/dist/cli/commands/docs/content.js.map +1 -1
  31. package/dist/cli/commands/exec.js +1 -12
  32. package/dist/cli/commands/exec.js.map +1 -1
  33. package/dist/cli/commands/init/index.js +1 -2
  34. package/dist/cli/commands/init/index.js.map +1 -1
  35. package/dist/cli/commands/init/provision-step.js +2 -20
  36. package/dist/cli/commands/init/provision-step.js.map +1 -1
  37. package/dist/cli/commands/plan.js +1 -12
  38. package/dist/cli/commands/plan.js.map +1 -1
  39. package/dist/cli/commands/security.js +82 -11
  40. package/dist/cli/commands/security.js.map +1 -1
  41. package/dist/cli/commands/sync.js +9 -19
  42. package/dist/cli/commands/sync.js.map +1 -1
  43. package/dist/cli/commands/validate-plan.js +1 -10
  44. package/dist/cli/commands/validate-plan.js.map +1 -1
  45. package/dist/cli/copy/flows.json +1 -2
  46. package/dist/cli/copy.js.map +1 -1
  47. package/dist/cli/flows/dependencies.js +0 -4
  48. package/dist/cli/flows/dependencies.js.map +1 -1
  49. package/dist/cli/help-guide.js +69 -0
  50. package/dist/cli/help-guide.js.map +1 -0
  51. package/dist/cli/program.js +3 -3
  52. package/dist/cli/program.js.map +1 -1
  53. package/dist/cli/ui/render.js +0 -27
  54. package/dist/cli/ui/render.js.map +1 -1
  55. package/dist/cli.js +10 -2
  56. package/dist/cli.js.map +1 -1
  57. package/dist/gateway/config.js +23 -1
  58. package/dist/gateway/config.js.map +1 -1
  59. package/dist/gateway/edge-filter.js +20 -3
  60. package/dist/gateway/edge-filter.js.map +1 -1
  61. package/dist/gateway/index.js +145 -22
  62. package/dist/gateway/index.js.map +1 -1
  63. package/dist/gateway/middleware/auth.js +15 -3
  64. package/dist/gateway/middleware/auth.js.map +1 -1
  65. package/dist/gateway/services/login.js +52 -17
  66. package/dist/gateway/services/login.js.map +1 -1
  67. package/dist/gateway/services/register.js +20 -0
  68. package/dist/gateway/services/register.js.map +1 -0
  69. package/dist/gateway/services/security.js +69 -16
  70. package/dist/gateway/services/security.js.map +1 -1
  71. package/dist/gateway/throttle.js +57 -0
  72. package/dist/gateway/throttle.js.map +1 -0
  73. package/dist/lib/auth/backup-codes.js +4 -4
  74. package/dist/lib/auth/backup-codes.js.map +1 -1
  75. package/dist/lib/auth/breach-check.js +58 -0
  76. package/dist/lib/auth/breach-check.js.map +1 -0
  77. package/dist/lib/auth/gateway-client.js +17 -2
  78. package/dist/lib/auth/gateway-client.js.map +1 -1
  79. package/dist/lib/auth/gateway-process.js +17 -2
  80. package/dist/lib/auth/gateway-process.js.map +1 -1
  81. package/dist/lib/auth/gateway-token.js +5 -2
  82. package/dist/lib/auth/gateway-token.js.map +1 -1
  83. package/dist/lib/auth/nio-config.js +57 -7
  84. package/dist/lib/auth/nio-config.js.map +1 -1
  85. package/dist/lib/auth/otp.js +3 -3
  86. package/dist/lib/auth/otp.js.map +1 -1
  87. package/dist/lib/auth/password.js +33 -10
  88. package/dist/lib/auth/password.js.map +1 -1
  89. package/dist/lib/auth/secrets.js +96 -0
  90. package/dist/lib/auth/secrets.js.map +1 -0
  91. package/dist/lib/auth/session-store.js +2 -2
  92. package/dist/lib/auth/session-store.js.map +1 -1
  93. package/dist/lib/clients/client-configs.js +81 -86
  94. package/dist/lib/clients/client-configs.js.map +1 -1
  95. package/dist/lib/clients/client-install.js +22 -4
  96. package/dist/lib/clients/client-install.js.map +1 -1
  97. package/dist/lib/deps/dependencies.js +0 -25
  98. package/dist/lib/deps/dependencies.js.map +1 -1
  99. package/dist/lib/deps/dependency-install.js +3 -23
  100. package/dist/lib/deps/dependency-install.js.map +1 -1
  101. package/dist/lib/exec/exec-delegate.js +69 -48
  102. package/dist/lib/exec/exec-delegate.js.map +1 -1
  103. package/dist/lib/exec/plan-delegate.js +25 -34
  104. package/dist/lib/exec/plan-delegate.js.map +1 -1
  105. package/dist/lib/exec/qwen-client.js +74 -0
  106. package/dist/lib/exec/qwen-client.js.map +1 -0
  107. package/dist/lib/exec/validate-plan-delegate.js +13 -30
  108. package/dist/lib/exec/validate-plan-delegate.js.map +1 -1
  109. package/dist/lib/fetch-zipball.js +59 -0
  110. package/dist/lib/fetch-zipball.js.map +1 -0
  111. package/dist/lib/load-env.js +17 -5
  112. package/dist/lib/load-env.js.map +1 -1
  113. package/dist/lib/open-url.js +5 -2
  114. package/dist/lib/open-url.js.map +1 -1
  115. package/dist/lib/proc.js +27 -0
  116. package/dist/lib/proc.js.map +1 -1
  117. package/dist/lib/provision/provision.js +2 -2
  118. package/dist/lib/provision/provision.js.map +1 -1
  119. package/dist/lib/skills/patterns.js +15 -24
  120. package/dist/lib/skills/patterns.js.map +1 -1
  121. package/dist/lib/skills/skills-cache.js +25 -12
  122. package/dist/lib/skills/skills-cache.js.map +1 -1
  123. package/dist/lib/skills/skills.js +1 -1
  124. package/dist/lib/skills/skills.js.map +1 -1
  125. package/dist/lib/version-check.js +1 -11
  126. package/dist/lib/version-check.js.map +1 -1
  127. package/dist/mcp-server.js +5 -17
  128. package/dist/mcp-server.js.map +1 -1
  129. package/dist/tools/delegate-exec.js +3 -10
  130. package/dist/tools/delegate-exec.js.map +1 -1
  131. package/dist/tools/plan.js +6 -13
  132. package/dist/tools/plan.js.map +1 -1
  133. package/dist/tools/validate-plan.js +6 -14
  134. package/dist/tools/validate-plan.js.map +1 -1
  135. package/dist/tui/app.js +102 -18
  136. package/dist/tui/app.js.map +1 -1
  137. package/dist/tui/components.js +161 -88
  138. package/dist/tui/components.js.map +1 -1
  139. package/dist/tui/launch.js +6 -1
  140. package/dist/tui/launch.js.map +1 -1
  141. package/dist/tui/opencode.js +27 -0
  142. package/dist/tui/opencode.js.map +1 -1
  143. package/dist/tui/palette.js +12 -5
  144. package/dist/tui/palette.js.map +1 -1
  145. package/dist/tui/prompt-input.js +168 -0
  146. package/dist/tui/prompt-input.js.map +1 -0
  147. package/dist/tui/state.js +252 -20
  148. package/dist/tui/state.js.map +1 -1
  149. package/dist/tui/test-utils.js +24 -0
  150. package/dist/tui/test-utils.js.map +1 -0
  151. package/dist/version.js +17 -6
  152. package/dist/version.js.map +1 -1
  153. package/docker/docker-compose.yml +56 -26
  154. package/docker/kong.yml +10 -0
  155. package/package.json +21 -12
  156. package/dist/adapters/sms/http-generic.js +0 -50
  157. package/dist/adapters/sms/http-generic.js.map +0 -1
  158. package/dist/cli/commands/clean.js +0 -108
  159. package/dist/cli/commands/clean.js.map +0 -1
  160. package/dist/lib/clients/hooks.js +0 -191
  161. package/dist/lib/clients/hooks.js.map +0 -1
  162. package/dist/lib/exec/exec-engines.js +0 -63
  163. package/dist/lib/exec/exec-engines.js.map +0 -1
package/dist/tui/state.js CHANGED
@@ -1,11 +1,83 @@
1
1
  import { tlog } from './debug.js';
2
- export const emptyChat = { messages: [], busy: false, permission: null };
2
+ export function permGroupLabel(kind) {
3
+ const g = {
4
+ bash: 'shell',
5
+ edit: 'editar arquivo',
6
+ read: 'ler arquivo',
7
+ glob: 'listar arquivos',
8
+ grep: 'buscar no código',
9
+ webfetch: 'baixar URL',
10
+ websearch: 'buscar na web',
11
+ external_directory: 'acessar fora do projeto',
12
+ doom_loop: 'continuar (possível loop)',
13
+ task: 'sub-agente',
14
+ skill: 'rodar skill',
15
+ todowrite: 'atualizar checklist',
16
+ };
17
+ return g[kind] ?? (kind.includes('_') ? `MCP · ${kind}` : kind);
18
+ }
19
+ export function toPermissionReq(raw) {
20
+ const perm = raw;
21
+ if (!perm.id || !perm.sessionID)
22
+ return null;
23
+ const kind = perm.permission ?? perm.type ?? perm.tool?.name ?? 'ação';
24
+ const patterns = perm.patterns ??
25
+ (Array.isArray(perm.pattern) ? perm.pattern : perm.pattern ? [perm.pattern] : []);
26
+ return {
27
+ id: perm.id,
28
+ sessionId: perm.sessionID,
29
+ kind,
30
+ patterns,
31
+ command: perm.metadata?.command,
32
+ always: perm.always ?? [],
33
+ title: perm.title ?? permGroupLabel(kind),
34
+ };
35
+ }
36
+ export function reconcilePendingPermissions(prev, rawList) {
37
+ const live = rawList.map(toPermissionReq).filter((r) => r !== null);
38
+ const liveIds = new Set(live.map((r) => r.id));
39
+ const kept = prev.permissions.filter((r) => liveIds.has(r.id));
40
+ const known = new Set(kept.map((r) => r.id));
41
+ const added = live.filter((r) => !known.has(r.id));
42
+ if (added.length === 0 && kept.length === prev.permissions.length)
43
+ return prev;
44
+ return { ...prev, permissions: [...kept, ...added] };
45
+ }
46
+ function errorHint(name) {
47
+ switch (name) {
48
+ case 'ProviderAuthError':
49
+ return 'credencial do provedor inválida — rode `opencode auth login`';
50
+ case 'MessageOutputLengthError':
51
+ return 'a resposta ficou longa demais — peça em partes menores';
52
+ case 'APIError':
53
+ return 'erro na API do provedor';
54
+ default:
55
+ return 'erro no motor';
56
+ }
57
+ }
58
+ export const emptyChat = {
59
+ messages: [],
60
+ busy: false,
61
+ permissions: [],
62
+ toasts: [],
63
+ todos: [],
64
+ files: [],
65
+ retry: null,
66
+ error: null,
67
+ diff: [],
68
+ };
3
69
  const PENDING_USER = 'pending-user';
4
70
  function clone(prev) {
5
71
  return {
6
72
  messages: prev.messages.map((m) => ({ ...m, parts: m.parts.map((p) => ({ ...p })) })),
7
73
  busy: prev.busy,
8
- permission: prev.permission,
74
+ permissions: prev.permissions,
75
+ toasts: prev.toasts,
76
+ todos: prev.todos,
77
+ files: prev.files,
78
+ retry: prev.retry,
79
+ error: prev.error,
80
+ diff: prev.diff,
9
81
  };
10
82
  }
11
83
  function upsertMessage(state, id, role) {
@@ -45,14 +117,9 @@ export function applyEvent(prev, evt) {
45
117
  tlog('event', evt.type, JSON.stringify(p).slice(0, 200));
46
118
  const etype = evt.type;
47
119
  if (etype === 'permission.asked' || etype === 'permission.updated') {
48
- const perm = p;
49
- if (perm.id && perm.sessionID) {
50
- const what = perm.patterns?.length ? ` ${perm.patterns.join(', ')}` : '';
51
- state.permission = {
52
- id: perm.id,
53
- sessionId: perm.sessionID,
54
- title: perm.title ?? `${perm.permission ?? perm.tool?.name ?? 'ação'}${what}`,
55
- };
120
+ const req = toPermissionReq(p);
121
+ if (req && !state.permissions.some((x) => x.id === req.id)) {
122
+ state.permissions = [...state.permissions, req];
56
123
  }
57
124
  return state;
58
125
  }
@@ -68,24 +135,111 @@ export function applyEvent(prev, evt) {
68
135
  case 'message.part.updated':
69
136
  applyPart(state, (p.part ?? p));
70
137
  break;
71
- case 'permission.replied':
72
- state.permission = null;
138
+ case 'permission.replied': {
139
+ const id = p.permissionID;
140
+ state.permissions = id ? state.permissions.filter((x) => x.id !== id) : [];
141
+ break;
142
+ }
143
+ case 'todo.updated': {
144
+ const todos = (p.todos ?? []).map((t) => ({
145
+ content: String(t.content ?? ''),
146
+ status: String(t.status ?? 'pending'),
147
+ }));
148
+ state.todos = todos;
149
+ break;
150
+ }
151
+ case 'file.edited': {
152
+ const f = p.file;
153
+ if (f && !state.files.includes(f))
154
+ state.files = [...state.files, f];
155
+ break;
156
+ }
157
+ case 'tui.toast.show': {
158
+ const t = p;
159
+ const message = [t.title, t.message].filter(Boolean).join(' — ') || 'aviso';
160
+ const variant = (['info', 'success', 'warning', 'error'].includes(t.variant ?? '')
161
+ ? t.variant
162
+ : 'info');
163
+ state.toasts = [
164
+ ...state.toasts.slice(-4),
165
+ { id: `toast-${Date.now()}-${state.toasts.length}`, message, variant, until: Date.now() + Math.max(1500, t.duration ?? 4000) },
166
+ ];
73
167
  break;
168
+ }
74
169
  case 'session.idle':
75
- case 'session.error':
76
170
  state.busy = false;
171
+ state.retry = null;
77
172
  break;
78
- case 'session.status':
79
- if (p.status?.type === 'idle')
173
+ case 'session.error': {
174
+ state.busy = false;
175
+ state.retry = null;
176
+ const err = p.error;
177
+ if (err?.name && err.name !== 'MessageAbortedError') {
178
+ const data = err.data ?? {};
179
+ const raw = typeof data.message === 'string' ? data.message : '';
180
+ const hint = errorHint(err.name);
181
+ const useHint = err.name === 'ProviderAuthError' || err.name === 'MessageOutputLengthError' || !raw;
182
+ state.error = {
183
+ name: err.name,
184
+ message: useHint ? hint : raw,
185
+ retryable: err.name === 'APIError' && Boolean(data.isRetryable),
186
+ };
187
+ }
188
+ break;
189
+ }
190
+ case 'session.diff': {
191
+ const files = p.diff ?? [];
192
+ state.diff = files
193
+ .filter((d) => d.file)
194
+ .map((d) => ({ file: String(d.file), added: d.additions ?? 0, removed: d.deletions ?? 0 }));
195
+ break;
196
+ }
197
+ case 'session.compacted':
198
+ state.toasts = [
199
+ ...state.toasts.slice(-4),
200
+ { id: `toast-${Date.now()}`, message: '✂ contexto compactado', variant: 'info', until: Date.now() + 4000 },
201
+ ];
202
+ break;
203
+ case 'installation.update-available': {
204
+ const v = p.version;
205
+ state.toasts = [
206
+ ...state.toasts.slice(-4),
207
+ { id: `toast-${Date.now()}`, message: `nova versão do opencode: ${v ?? '?'}`, variant: 'info', until: Date.now() + 6000 },
208
+ ];
209
+ break;
210
+ }
211
+ case 'session.status': {
212
+ const st = p.status;
213
+ if (st?.type === 'idle') {
80
214
  state.busy = false;
215
+ state.retry = null;
216
+ }
217
+ else if (st?.type === 'busy') {
218
+ state.busy = true;
219
+ }
220
+ else if (st?.type === 'retry') {
221
+ state.busy = true;
222
+ state.retry = { attempt: st.attempt ?? 1, note: st.message ?? 'tentando de novo' };
223
+ }
81
224
  break;
225
+ }
82
226
  default:
83
227
  break;
84
228
  }
85
229
  return state;
86
230
  }
87
231
  export function syncMessages(prev, raw, busy) {
88
- const state = { messages: [], busy, permission: prev.permission };
232
+ const state = {
233
+ messages: [],
234
+ busy,
235
+ permissions: prev.permissions,
236
+ toasts: prev.toasts,
237
+ todos: prev.todos,
238
+ files: prev.files,
239
+ retry: busy ? prev.retry : null,
240
+ error: prev.error,
241
+ diff: prev.diff,
242
+ };
89
243
  for (const m of raw) {
90
244
  if (!m.info?.id)
91
245
  continue;
@@ -108,14 +262,29 @@ function applyPartInto(msg, raw) {
108
262
  if (!part.id)
109
263
  return;
110
264
  const type = part.type ?? 'text';
111
- if (type === 'step-start' || type === 'step-finish')
265
+ if (type === 'step-start')
112
266
  return;
267
+ if (type === 'step-finish') {
268
+ const cp = upsertPart(msg, part.id, 'step');
269
+ cp.step = {
270
+ tokensIn: part.tokens?.input ?? 0,
271
+ tokensOut: part.tokens?.output ?? 0,
272
+ cost: part.cost ?? 0,
273
+ };
274
+ return;
275
+ }
113
276
  if (type === 'tool') {
114
277
  const cp = upsertPart(msg, part.id, 'tool');
115
278
  cp.text = part.state?.title ?? part.tool ?? 'tool';
116
- cp.tool = { status: part.state?.status ?? 'running', output: String(part.state?.output ?? part.state?.error ?? '') };
279
+ cp.tool = {
280
+ name: part.tool ?? 'tool',
281
+ status: part.state?.status ?? 'running',
282
+ input: part.state?.input,
283
+ output: String(part.state?.output ?? part.state?.error ?? ''),
284
+ };
285
+ return;
117
286
  }
118
- else if (typeof part.text === 'string') {
287
+ if (typeof part.text === 'string') {
119
288
  upsertPart(msg, part.id, type === 'reasoning' ? 'reasoning' : 'text').text = part.text;
120
289
  }
121
290
  }
@@ -126,7 +295,70 @@ export function pushUserMessage(prev, text) {
126
295
  { id: PENDING_USER, role: 'user', parts: [{ id: 'p0', kind: 'text', text }] },
127
296
  ],
128
297
  busy: true,
129
- permission: prev.permission,
298
+ permissions: prev.permissions,
299
+ toasts: prev.toasts,
300
+ todos: [],
301
+ files: [],
302
+ retry: null,
303
+ error: null,
304
+ diff: [],
130
305
  };
131
306
  }
307
+ export function summarizeToolInput(input) {
308
+ if (!input)
309
+ return '';
310
+ const keys = ['filePath', 'file_path', 'command', 'pattern', 'query', 'url', 'path', 'prompt', 'description'];
311
+ for (const k of keys)
312
+ if (typeof input[k] === 'string' && input[k])
313
+ return String(input[k]);
314
+ const first = Object.values(input).find((v) => typeof v === 'string' && v);
315
+ return first ? String(first) : '';
316
+ }
317
+ export function messageUsage(msg) {
318
+ const steps = msg.parts.filter((p) => !!p.step);
319
+ if (steps.length === 0)
320
+ return null;
321
+ return steps.reduce((acc, s) => ({
322
+ tokensIn: acc.tokensIn + s.step.tokensIn,
323
+ tokensOut: acc.tokensOut + s.step.tokensOut,
324
+ cost: acc.cost + s.step.cost,
325
+ }), { tokensIn: 0, tokensOut: 0, cost: 0 });
326
+ }
327
+ function idleAssistantText(state) {
328
+ if (state.busy || state.permissions.length > 0)
329
+ return null;
330
+ const last = state.messages[state.messages.length - 1];
331
+ if (!last || last.role !== 'assistant')
332
+ return null;
333
+ const text = last.parts
334
+ .filter((p) => p.kind === 'text')
335
+ .map((p) => p.text)
336
+ .join('')
337
+ .replace(/```[\s\S]*?```/g, '')
338
+ .trim();
339
+ return text || null;
340
+ }
341
+ export function pendingQuestion(state) {
342
+ const text = idleAssistantText(state);
343
+ if (!text)
344
+ return null;
345
+ const lines = text.split('\n').map((l) => l.trim()).filter(Boolean);
346
+ const lastLine = lines.at(-1) ?? '';
347
+ if (/\?["'`)\]]*$/.test(lastLine))
348
+ return lastLine;
349
+ const qLine = [...lines].reverse().find((l) => /\?["'`)\]]*$/.test(l));
350
+ return qLine ?? null;
351
+ }
352
+ export function questionOptions(state) {
353
+ const text = idleAssistantText(state);
354
+ if (!text || !text.includes('?'))
355
+ return [];
356
+ const opts = [];
357
+ for (const raw of text.split('\n')) {
358
+ const m = /^\s*(?:\d{1,2}[.)]|[-*]\s*\[[ xX]?\]|[a-zA-Z][.)])\s+(.{2,120}?)\s*$/.exec(raw);
359
+ if (m?.[1])
360
+ opts.push(m[1].trim());
361
+ }
362
+ return opts.length >= 2 ? opts.slice(0, 8) : [];
363
+ }
132
364
  //# sourceMappingURL=state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/tui/state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/tui/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { render } from 'ink-testing-library';
2
+ const ANSI = /\x1b\[[0-9;]*m/g;
3
+ export const stripAnsi = (s) => (s ?? '').replace(ANSI, '');
4
+ export async function waitForFrame(frame, predicate, { timeoutMs = 2000, intervalMs = 10 } = {}) {
5
+ const deadline = Date.now() + timeoutMs;
6
+ let last = stripAnsi(frame());
7
+ while (Date.now() < deadline) {
8
+ last = stripAnsi(frame());
9
+ if (predicate(last))
10
+ return last;
11
+ await new Promise((r) => setTimeout(r, intervalMs));
12
+ }
13
+ throw new Error(`waitForFrame: condição não bateu em ${timeoutMs}ms.\n─── último frame ───\n${last}\n────────────────────`);
14
+ }
15
+ export function waitForText(frame, needles, opts) {
16
+ const list = Array.isArray(needles) ? needles : [needles];
17
+ return waitForFrame(frame, (f) => list.every((n) => f.includes(n)), opts);
18
+ }
19
+ export async function frameOf(el) {
20
+ const { lastFrame } = render(el);
21
+ await new Promise((r) => setTimeout(r, 25));
22
+ return stripAnsi(lastFrame());
23
+ }
24
+ //# sourceMappingURL=test-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../../src/tui/test-utils.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAS7C,MAAM,IAAI,GAAG,iBAAiB,CAAC;AAC/B,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAqB,EAAU,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAGxF,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAA+B,EAC/B,SAAiC,EACjC,EAAE,SAAS,GAAG,IAAI,EAAE,UAAU,GAAG,EAAE,KAAkD,EAAE;IAEvF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,IAAI,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;IAC9B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1B,IAAI,SAAS,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACjC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,IAAI,KAAK,CACb,uCAAuC,SAAS,8BAA8B,IAAI,wBAAwB,CAC3G,CAAC;AACJ,CAAC;AAGD,MAAM,UAAU,WAAW,CACzB,KAA+B,EAC/B,OAA0B,EAC1B,IAAkD;IAElD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC1D,OAAO,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC5E,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAsB;IAClD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IAEjC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC5C,OAAO,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;AAChC,CAAC"}
package/dist/version.js CHANGED
@@ -1,16 +1,27 @@
1
1
  import { readFileSync } from 'node:fs';
2
2
  import { fileURLToPath } from 'node:url';
3
3
  import { dirname, join } from 'node:path';
4
- function loadVersion() {
4
+ function loadPkg() {
5
5
  try {
6
6
  const here = dirname(fileURLToPath(import.meta.url));
7
- const pkgPath = join(here, '..', 'package.json');
8
- const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
9
- return pkg.version;
7
+ return JSON.parse(readFileSync(join(here, '..', 'package.json'), 'utf-8'));
10
8
  }
11
9
  catch {
12
- return '0.0.0';
10
+ return { version: '0.0.0' };
13
11
  }
14
12
  }
15
- export const VERSION = loadVersion();
13
+ const pkg = loadPkg();
14
+ export const VERSION = pkg.version;
15
+ export function semverGt(a, b) {
16
+ const pa = a.split('-')[0].split('.').map((n) => parseInt(n, 10) || 0);
17
+ const pb = b.split('-')[0].split('.').map((n) => parseInt(n, 10) || 0);
18
+ for (let i = 0; i < 3; i++) {
19
+ if ((pa[i] ?? 0) > (pb[i] ?? 0))
20
+ return true;
21
+ if ((pa[i] ?? 0) < (pb[i] ?? 0))
22
+ return false;
23
+ }
24
+ return false;
25
+ }
26
+ export const OPENCODE_SDK_VERSION = pkg.dependencies?.['@opencode-ai/sdk']?.replace(/^[\^~]/, '') ?? null;
16
27
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,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;AAE1C,SAAS,WAAW;IAClB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAwB,CAAC;QAC9E,OAAO,GAAG,CAAC,OAAO,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,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;AAO1C,SAAS,OAAO;IACd,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAQ,CAAC;IACpF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;AAEtB,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;AAGnC,MAAM,UAAU,QAAQ,CAAC,CAAS,EAAE,CAAS;IAC3C,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7C,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAChD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAQD,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC"}
@@ -1,13 +1,13 @@
1
- # Stack NIO unificado 1 compose, 1 rede (`nio-net`), 1 stack no Portainer.
2
- # Substitui os 3 composes antigos (docker/ + kong/ + headroom/). O gateway agora
3
- # é container (Dockerfile.gateway) e o Kong o alcança por NOME na rede, sem
4
- # host.docker.internal. Ver docs/container-architecture.md.
1
+ # Compose file for NIO CLI (dockerized) - T3
5
2
  name: nio
6
3
 
7
4
  networks:
8
5
  nio-net:
9
6
  name: nio-net
10
7
  driver: bridge
8
+ nio-infra:
9
+ name: nio-infra
10
+ driver: bridge
11
11
 
12
12
  volumes:
13
13
  nio_portainer_data: { name: nio_portainer_data }
@@ -16,8 +16,8 @@ volumes:
16
16
  services:
17
17
  nio-gateway:
18
18
  build:
19
- context: .. # raiz do repo (onde estão dist/ e package.json)
20
- dockerfile: Dockerfile.gateway # relativo ao context (raiz)
19
+ context: ..
20
+ dockerfile: Dockerfile.gateway
21
21
  image: nio-gateway:local
22
22
  container_name: nio-gateway
23
23
  restart: unless-stopped
@@ -47,38 +47,68 @@ services:
47
47
  volumes: [ "nio_headroom_cache:/root/.headroom" ]
48
48
  networks: [ nio-net ]
49
49
 
50
+ kong:
51
+ image: kong@sha256:2a8cf3b110cdaba1cb00adc665b8635ed1fc75c907f7a4298613c68e4976de0a # kong:3.9, pinado 2026-09-03
52
+ container_name: nio-kong
53
+ restart: unless-stopped
54
+ environment:
55
+ KONG_DATABASE: "off"
56
+ KONG_DECLARATIVE_CONFIG: /kong/kong.yml
57
+ KONG_PROXY_LISTEN: "0.0.0.0:8000"
58
+ # Admin API desligada (auditoria M-7) — config é declarativa (kong.yml),
59
+ # nada chama o admin em runtime.
60
+ KONG_ADMIN_LISTEN: "off"
61
+ volumes: [ "./kong.yml:/kong/kong.yml:ro" ] # docker/kong.yml (T3)
62
+ ports:
63
+ - "127.0.0.1:${NIO_KONG_PROXY_PORT:-8000}:8000" # sem colisão: Portainer largou :8000
64
+ depends_on:
65
+ nio-gateway: { condition: service_healthy }
66
+ networks: [ nio-net ]
67
+
68
+ # ── plano de infra (toca o docker.sock) — rede nio-infra ─────────────
69
+
50
70
  mcp-gateway:
51
71
  image: docker/mcp-gateway@sha256:f5a679a05fc39022a046167bef92aeeb01bcd59485ad27843ae5227db7950688 # docker/mcp-gateway:latest, pinado 2026-09-03
52
72
  container_name: nio-mcp-gateway
53
73
  restart: unless-stopped
54
74
  command: ["--transport=streaming", "--port=8811", "--servers=docker"]
55
75
  ports: [ "127.0.0.1:8811:8811" ]
76
+ # Mount DIRETO de propósito: o `--servers=docker` existe pra CRIAR containers
77
+ # (tools de Docker pro operador de IA). Um proxy que permita isso é a própria
78
+ # fuga — então a contenção aqui é: rede isolada + rodar opt-in
79
+ # (`nio docker toolkit up/down`). Contenção real = daemon dedicado (backlog).
56
80
  volumes: [ "/var/run/docker.sock:/var/run/docker.sock" ]
57
- networks: [ nio-net ]
81
+ networks: [ nio-infra ]
82
+
83
+ docker-socket-proxy:
84
+ image: ghcr.io/tecnativa/docker-socket-proxy:0.3.0@sha256:9e4b9e7517a6b660f2cc903a19b257b1852d5b3344794e3ea334ff00ae677ac2
85
+ container_name: nio-docker-proxy
86
+ restart: unless-stopped
87
+ environment:
88
+ # GET-only: sem POST → ninguém cria/inicia/exec container através dele.
89
+ CONTAINERS: 1
90
+ IMAGES: 1
91
+ NETWORKS: 1
92
+ VOLUMES: 1
93
+ INFO: 1
94
+ VERSION: 1
95
+ PING: 1
96
+ # POST/EXEC/AUTH/SECRETS/CONFIGS/SWARM/SERVICES/SYSTEM/PLUGINS: 0 (default).
97
+ volumes: [ "/var/run/docker.sock:/var/run/docker.sock:ro" ]
98
+ networks: [ nio-infra ]
58
99
 
59
100
  portainer:
60
101
  image: portainer/portainer-ce@sha256:511f3f06c96fe3b993ebeaafde311c1959cae73a7ef825dba6397d51b450dffa # portainer-ce:lts, pinado 2026-09-03
61
102
  container_name: nio-portainer
62
103
  restart: unless-stopped
104
+ # Fala com o daemon SÓ pelo proxy GET-only (auditoria M-8) — não monta o
105
+ # docker.sock. Efeito: dashboard read-mostly (vê containers/logs/stats/redes;
106
+ # não sobe/derruba pela UI). Se o time precisar gerenciar pela UI, ligue
107
+ # `POST: 1` no docker-socket-proxy — mas aí Portainer volta a poder criar
108
+ # container = root no host.
109
+ command: -H tcp://docker-socket-proxy:2375
63
110
  ports: [ "127.0.0.1:9443:9443" ] # UI (edge :8000 REMOVIDO — libera p/ Kong)
64
111
  volumes:
65
- - "/var/run/docker.sock:/var/run/docker.sock"
66
112
  - "nio_portainer_data:/data"
67
- networks: [ nio-net ]
68
-
69
- kong:
70
- image: kong@sha256:2a8cf3b110cdaba1cb00adc665b8635ed1fc75c907f7a4298613c68e4976de0a # kong:3.9, pinado 2026-09-03
71
- container_name: nio-kong
72
- restart: unless-stopped
73
- environment:
74
- KONG_DATABASE: "off"
75
- KONG_DECLARATIVE_CONFIG: /kong/kong.yml
76
- KONG_PROXY_LISTEN: "0.0.0.0:8000"
77
- KONG_ADMIN_LISTEN: "0.0.0.0:8001"
78
- volumes: [ "./kong.yml:/kong/kong.yml:ro" ] # docker/kong.yml (T3)
79
- ports:
80
- - "127.0.0.1:${NIO_KONG_PROXY_PORT:-8000}:8000" # sem colisão: Portainer largou :8000
81
- - "127.0.0.1:${NIO_KONG_ADMIN_PORT:-8001}:8001"
82
- depends_on:
83
- nio-gateway: { condition: service_healthy }
84
- networks: [ nio-net ]
113
+ depends_on: [ docker-socket-proxy ]
114
+ networks: [ nio-infra ]
package/docker/kong.yml CHANGED
@@ -5,6 +5,16 @@ services:
5
5
  - name: nio-gateway
6
6
  url: http://nio-gateway:3000
7
7
  routes:
8
+ # /register (TP-1) — cria usuário; rate-limit apertado.
9
+ - name: nio-gateway-register
10
+ paths:
11
+ - /register
12
+ strip_path: false
13
+ plugins:
14
+ - name: rate-limiting
15
+ config:
16
+ minute: 5
17
+ policy: local
8
18
  # /login — alvo de brute-force; rate-limit apertado.
9
19
  - name: nio-gateway-login
10
20
  paths:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nio-cli/cli",
3
- "version": "0.3.7",
3
+ "version": "0.6.0",
4
4
  "description": "Orquestrador de ambientes de desenvolvimento: escolhe um perfil, responde um wizard e a CLI (com auxílio de IA via MCP) materializa toolchains, linguagens, frameworks, dotfiles e IDE.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
@@ -50,7 +50,10 @@
50
50
  "build": "rm -rf dist && tsc && node --input-type=commonjs -e \"const fs=require('fs');fs.cpSync('src/cli/copy','dist/cli/copy',{recursive:true});for(const f of ['cli.js','mcp-server.js','gateway/index.js','mcp-server-lang.js'])fs.chmodSync('dist/'+f,0o755)\"",
51
51
  "gen:docs": "bun run scripts/gen-reference.ts",
52
52
  "db:ping": "bun run scripts/db-ping.ts",
53
- "dev:sms-echo": "bun run scripts/sms-echo.ts",
53
+ "db:tls": "bash scripts/db-tls-setup.sh",
54
+ "db:migrate": "bun run scripts/migrate.ts",
55
+ "argon2:calibrate": "node scripts/argon2-calibrate.mjs",
56
+ "dev:whatsapp-echo": "bun run scripts/whatsapp-echo.ts",
54
57
  "dev:cli": "bun run src/cli.ts",
55
58
  "dev:mcp": "bun run src/mcp-server.ts",
56
59
  "dev:gateway": "bun run src/gateway/index.ts",
@@ -59,11 +62,11 @@
59
62
  "prepublishOnly": "npm run build"
60
63
  },
61
64
  "dependencies": {
62
- "@clack/prompts": "^1.6.0",
63
- "@modelcontextprotocol/sdk": "^1.0.4",
64
- "@node-rs/argon2": "^2.1.0",
65
+ "@clack/prompts": "^1.7.0",
66
+ "@modelcontextprotocol/sdk": "^1.30.0",
67
+ "@node-rs/argon2": "^2.2.0",
65
68
  "@opencode-ai/sdk": "1.18.25",
66
- "adm-zip": "^0.5.17",
69
+ "adm-zip": "^0.6.0",
67
70
  "boxen": "^7.1.1",
68
71
  "chalk": "^5.6.2",
69
72
  "commander": "^12.1.0",
@@ -71,18 +74,24 @@
71
74
  "jsonwebtoken": "^9.0.3",
72
75
  "pg": "^8.23.0",
73
76
  "react": "^18.3.1",
74
- "smol-toml": "^1.6.1",
77
+ "smol-toml": "^1.8.0",
75
78
  "update-notifier": "^7.3.1",
76
- "zod": "^4.4.3"
79
+ "zod": "^4.5.4"
80
+ },
81
+ "//overrides": "transitivas de @modelcontextprotocol/sdk (transporte HTTP — NIO usa só stdio). Força as versões corrigidas p/ deixar o `bun audit` limpo; ranges compatíveis com os pais.",
82
+ "overrides": {
83
+ "fast-uri": "^3.1.7",
84
+ "hono": "^4.13.7",
85
+ "qs": "^6.16.0"
77
86
  },
78
87
  "devDependencies": {
79
88
  "@types/adm-zip": "^0.5.8",
80
89
  "@types/jsonwebtoken": "^9.0.10",
81
- "@types/node": "^22.10.5",
90
+ "@types/node": "^22.20.1",
82
91
  "@types/pg": "^8.23.1",
83
- "@types/react": "^18.3",
92
+ "@types/react": "^18.3.31",
84
93
  "@types/update-notifier": "^6.0.8",
85
- "ink-testing-library": "^4",
86
- "typescript": "^5.4.5"
94
+ "ink-testing-library": "^4.0.0",
95
+ "typescript": "^5.9.3"
87
96
  }
88
97
  }