@nectarcrm/ccx 0.5.4 → 0.5.5

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 (2) hide show
  1. package/bin/ccx.js +20 -2
  2. package/package.json +1 -1
package/bin/ccx.js CHANGED
@@ -17,7 +17,7 @@
17
17
  // A conta escolhida vai pro settings.json do Claude Code, então qualquer `claude` aberto
18
18
  // (terminal, VS Code, JetBrains) usa essa conta. Claudes já abertos continuam na anterior.
19
19
  // O vigia roda sozinho a cada 5 min: avisa o app, atualiza o token se o admin trocou
20
- // e tira a conta se o acesso for removido. Os tokens gastos vão pro app pela telemetria.
20
+ // e tira a conta se o acesso for removido. Conta em 100%: troca sozinho pra uma com folga e avisa.
21
21
  // O resumo dos projetos vai sozinho depois das 12h00 e das 17h30; ccx sync manda na hora.
22
22
  // Uma vez por dia o vigia confere se há ccx novo no npm e se atualiza.
23
23
 
@@ -237,7 +237,16 @@ function uninstallAgent() {
237
237
  catch {}
238
238
  }
239
239
 
240
- // Uma passada do vigia: avisa o app, atualiza o token ou tira a conta
240
+ // Aviso do sistema: o vigia roda sem terminal. Windows: fica só no vigia.log.
241
+ function notify(msg) {
242
+ try {
243
+ if (MAC) execFileSync('osascript', ['-e', `display notification ${JSON.stringify(msg)} with title "ccx"`], { stdio: 'ignore' })
244
+ else if (!WIN) execFileSync('notify-send', ['ccx', msg], { stdio: 'ignore' })
245
+ }
246
+ catch {}
247
+ }
248
+
249
+ // Uma passada do vigia: avisa o app, atualiza o token, troca a conta que chegou em 100% ou tira a conta
241
250
  async function agentOnce() {
242
251
  const app = readJson(APP, null)
243
252
  const key = app && secretGet()
@@ -259,6 +268,15 @@ async function agentOnce() {
259
268
  writeJson(APP, removeAccount(app))
260
269
  return log(`conta ${app.account.label} não está mais liberada: tirada deste computador`)
261
270
  }
271
+ if (r.data.switch_to) {
272
+ const s = await api(app, key, 'POST', '/api/cli/session', { account: r.data.switch_to, auto: true }, 30_000)
273
+ if (s.status === 200) {
274
+ writeJson(APP, applyAccount(app, key, s.data.account, s.data.token))
275
+ log(`conta ${app.account.label} chegou em 100%: trocada para ${s.data.account.label}`)
276
+ notify(`A conta ${app.account.label} chegou em 100%. Troquei para ${s.data.account.label}. Feche o claude e abra de novo com: claude --continue`)
277
+ return
278
+ }
279
+ }
262
280
  if (r.data.token_fp !== app.token_fp) {
263
281
  const s = await api(app, key, 'POST', '/api/cli/session', { account: app.account.slug }, 30_000)
264
282
  if (s.status === 200) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nectarcrm/ccx",
3
- "version": "0.5.4",
3
+ "version": "0.5.5",
4
4
  "description": "Escolhe qual conta Claude este computador usa, conectado ao app Contas Claude da Nectar.",
5
5
  "type": "module",
6
6
  "bin": { "ccx": "bin/ccx.js" },