@iola_adm/iola-cli 0.1.61 → 0.1.63

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/README.md CHANGED
@@ -90,6 +90,7 @@ iola gosuslugi whoami
90
90
  iola gosuslugi debt
91
91
  iola gosuslugi notifications --unread
92
92
  iola gosuslugi keepalive
93
+ iola gosuslugi install-keepalive
93
94
  ```
94
95
 
95
96
  Локальная модель через Ollama:
@@ -139,7 +140,8 @@ iola version --check
139
140
  - браузерный runtime через Playwright: чтение страниц, скриншоты, PDF, клики, ввод и eval;
140
141
  - личное локальное подключение Госуслуг через отдельный браузерный профиль на ПК пользователя;
141
142
  - read-only tools Госуслуг для агента: ФИО, дата рождения, задолженности и уведомления;
142
- - keepalive-проверка сессии Госуслуг каждые 30 минут без обхода 2FA;
143
+ - keepalive-проверка сессии Госуслуг каждые 30 минут через Windows Task Scheduler без висящего окна терминала;
144
+ - мастер настройки автоматически включает keepalive после подключения Госуслуг;
143
145
  - управляемые локальные файловые операции с режимами `locked`, `read-only`, `workspace-write`, `full-access`;
144
146
  - планы выполнения, traces, tasks, artifacts, snapshots и policy-профили;
145
147
  - экспорт отчетов в Excel/Word-совместимые файлы;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iola_adm/iola-cli",
3
- "version": "0.1.61",
3
+ "version": "0.1.63",
4
4
  "description": "CLI и AI-агент городского округа Йошкар-Ола.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/adm-iola/iola-cli#readme",
package/src/cli.js CHANGED
@@ -524,7 +524,7 @@ Usage:
524
524
  iola fork SESSION_ID [TEXT]
525
525
  iola features list|enable|disable
526
526
  iola settings list|get|validate|doctor|init
527
- iola gosuslugi terms|consent|status|check|keepalive|install-keepalive|connect|open|text|screenshot|whoami|debt|notifications|mark-read|logout|configure|login|userinfo
527
+ iola gosuslugi terms|consent|status|check|keepalive|install-keepalive|keepalive-status|uninstall-keepalive|connect|open|text|screenshot|whoami|debt|notifications|mark-read|logout|configure|login|userinfo
528
528
  iola wiki [open|links]
529
529
  iola context list|show|init
530
530
  iola skills list|show|paths|enable|disable|bundles|bundle|doctor
@@ -2026,25 +2026,6 @@ async function handleDb(args) {
2026
2026
  return;
2027
2027
  }
2028
2028
 
2029
- if (action === "check") {
2030
- const result = await gosuslugiCheck(options);
2031
- if (options.json) printJson(result);
2032
- else printKeyValue(result);
2033
- return;
2034
- }
2035
-
2036
- if (action === "keepalive") {
2037
- await gosuslugiKeepalive(options);
2038
- return;
2039
- }
2040
-
2041
- if (action === "install-keepalive") {
2042
- const id = addCronJob("каждые 30 минут", "gosuslugi check --silent");
2043
- console.log(`Keepalive-задача добавлена: ${id}`);
2044
- console.log("Для выполнения запускайте периодически: iola cron tick");
2045
- return;
2046
- }
2047
-
2048
2029
  if (action === "reset") {
2049
2030
  const shouldReset = await confirm("Удалить локальную SQLite-БД iola.db? [y/N] ");
2050
2031
  if (!shouldReset) {
@@ -2319,9 +2300,17 @@ async function handleGosuslugi(args) {
2319
2300
  }
2320
2301
 
2321
2302
  if (action === "install-keepalive") {
2322
- const id = addCronJob("каждые 30 минут", "gosuslugi check --silent");
2323
- console.log(`Keepalive-задача добавлена: ${id}`);
2324
- console.log("Для выполнения запускайте периодически: iola cron tick");
2303
+ await installGosuslugiKeepaliveTask(options);
2304
+ return;
2305
+ }
2306
+
2307
+ if (action === "uninstall-keepalive") {
2308
+ await uninstallGosuslugiKeepaliveTask(options);
2309
+ return;
2310
+ }
2311
+
2312
+ if (action === "keepalive-status") {
2313
+ await printGosuslugiKeepaliveTaskStatus(options);
2325
2314
  return;
2326
2315
  }
2327
2316
 
@@ -2428,7 +2417,7 @@ async function handleGosuslugi(args) {
2428
2417
  return;
2429
2418
  }
2430
2419
 
2431
- throw new Error("Команды gosuslugi: terms, consent, status, check, keepalive, install-keepalive, connect, open, text, screenshot, whoami, debt, notifications, mark-read, logout, configure, login, userinfo.");
2420
+ throw new Error("Команды gosuslugi: terms, consent, status, check, keepalive, install-keepalive, keepalive-status, uninstall-keepalive, connect, open, text, screenshot, whoami, debt, notifications, mark-read, logout, configure, login, userinfo.");
2432
2421
  }
2433
2422
 
2434
2423
  function targetOrDefault(args, options = {}) {
@@ -7137,6 +7126,7 @@ async function onboard(args = []) {
7137
7126
  await ensureBrowserRuntimeForGosuslugi();
7138
7127
  if (process.stdin.isTTY && await confirm("Открыть Госуслуги для входа сейчас? [Y/n] ")) {
7139
7128
  await gosuslugiBrowserConnect({ yes: true });
7129
+ await installGosuslugiKeepaliveTask({ interval: "30m" });
7140
7130
  } else {
7141
7131
  console.log("Подключить личные Госуслуги позже: iola gosuslugi connect");
7142
7132
  }
@@ -7885,6 +7875,78 @@ async function gosuslugiKeepalive(options = {}) {
7885
7875
  }
7886
7876
  }
7887
7877
 
7878
+ function gosuslugiKeepaliveTaskName() {
7879
+ return "iola-gosuslugi-keepalive";
7880
+ }
7881
+
7882
+ function gosuslugiKeepaliveLogFile() {
7883
+ return path.join(CONFIG_DIR, "gosuslugi-keepalive.log");
7884
+ }
7885
+
7886
+ function cliEntrypointFile() {
7887
+ return path.resolve(__dirname, "..", "bin", "iola.js");
7888
+ }
7889
+
7890
+ async function installGosuslugiKeepaliveTask(options = {}) {
7891
+ const intervalMinutes = Math.max(1, Math.round(parseDurationMs(options.interval || "30m") / 60000));
7892
+ if (process.platform === "win32") {
7893
+ await installWindowsGosuslugiKeepaliveTask(intervalMinutes);
7894
+ return;
7895
+ }
7896
+ const id = addCronJob(`каждые ${intervalMinutes} минут`, "gosuslugi check --silent");
7897
+ console.log(`Локальная cron-задача добавлена: ${id}`);
7898
+ console.log("Для автоматического выполнения настройте системный планировщик на запуск: iola cron tick");
7899
+ }
7900
+
7901
+ async function installWindowsGosuslugiKeepaliveTask(intervalMinutes) {
7902
+ await mkdir(CONFIG_DIR, { recursive: true });
7903
+ const taskName = gosuslugiKeepaliveTaskName();
7904
+ const logFile = gosuslugiKeepaliveLogFile();
7905
+ const script = path.join(CONFIG_DIR, "gosuslugi-keepalive-task.cmd");
7906
+ const command = `"${process.execPath}" --no-warnings "${cliEntrypointFile()}" gosuslugi check --silent >> "${logFile}" 2>&1`;
7907
+ await writeFile(script, `@echo off\r\n${command}\r\n`, "utf8");
7908
+ await runCommand("schtasks.exe", [
7909
+ "/Create",
7910
+ "/TN", taskName,
7911
+ "/SC", "MINUTE",
7912
+ "/MO", String(intervalMinutes),
7913
+ "/TR", script,
7914
+ "/F",
7915
+ ]);
7916
+ console.log(`Windows Task Scheduler задача создана: ${taskName}`);
7917
+ console.log(`Интервал: ${intervalMinutes} мин.`);
7918
+ console.log(`Лог: ${logFile}`);
7919
+ console.log("Проверить: iola gosuslugi keepalive-status");
7920
+ }
7921
+
7922
+ async function uninstallGosuslugiKeepaliveTask() {
7923
+ if (process.platform === "win32") {
7924
+ await runCommand("schtasks.exe", ["/Delete", "/TN", gosuslugiKeepaliveTaskName(), "/F"]).catch(() => {});
7925
+ console.log(`Windows Task Scheduler задача удалена: ${gosuslugiKeepaliveTaskName()}`);
7926
+ return;
7927
+ }
7928
+ console.log("Для не-Windows удалите локальную cron-задачу вручную: iola cron list, затем iola cron delete ID.");
7929
+ }
7930
+
7931
+ async function printGosuslugiKeepaliveTaskStatus(options = {}) {
7932
+ if (process.platform === "win32") {
7933
+ try {
7934
+ const { stdout } = await runCommand("schtasks.exe", ["/Query", "/TN", gosuslugiKeepaliveTaskName(), "/FO", "LIST"]);
7935
+ console.log(stdout.trim());
7936
+ } catch {
7937
+ console.log(`Задача не найдена: ${gosuslugiKeepaliveTaskName()}`);
7938
+ }
7939
+ if (existsSync(gosuslugiKeepaliveLogFile())) {
7940
+ console.log("");
7941
+ console.log(`Лог: ${gosuslugiKeepaliveLogFile()}`);
7942
+ }
7943
+ return;
7944
+ }
7945
+ const rows = listCronJobs().filter((job) => String(job.command).includes("gosuslugi check"));
7946
+ if (options.json) printJson(rows);
7947
+ else printTable(rows, [["id", "ID"], ["enabled", "Вкл"], ["schedule_text", "Расписание"], ["command", "Команда"], ["last_run_at", "Последний запуск"]]);
7948
+ }
7949
+
7888
7950
  function parseDurationMs(value) {
7889
7951
  const text = String(value || "30m").trim().toLocaleLowerCase("ru-RU");
7890
7952
  const match = text.match(/^(\d+(?:[.,]\d+)?)(ms|s|m|h|мин|минут|час|часа|часов)?$/u);
@@ -34,9 +34,9 @@ iola cron delete 1
34
34
 
35
35
  `cron tick` проверяет задачи, которые пора выполнить. Его можно запускать вручную, через Windows Task Scheduler или другой планировщик.
36
36
 
37
- Пример проверки сессии Госуслуг каждые 30 минут:
37
+ Для Госуслуг на Windows лучше использовать готовую системную задачу без висящего окна терминала:
38
38
 
39
39
  ```bash
40
40
  iola gosuslugi install-keepalive
41
- iola cron tick
41
+ iola gosuslugi keepalive-status
42
42
  ```
@@ -98,6 +98,8 @@ iola gosuslugi status
98
98
  iola gosuslugi check
99
99
  iola gosuslugi keepalive
100
100
  iola gosuslugi install-keepalive
101
+ iola gosuslugi keepalive-status
102
+ iola gosuslugi uninstall-keepalive
101
103
  iola gosuslugi terms
102
104
  iola gosuslugi consent
103
105
  iola gosuslugi connect
@@ -18,6 +18,7 @@ iola gosuslugi connect
18
18
  4. Пользователь сам проходит вход.
19
19
  5. После завершения пользователь закрывает окно браузера.
20
20
  6. CLI сохраняет локальное состояние профиля.
21
+ 7. При подключении через мастер настройки CLI автоматически создает keepalive-задачу на 30 минут.
21
22
 
22
23
  Профиль хранится в:
23
24
 
@@ -99,14 +100,22 @@ iola gosuslugi keepalive
99
100
  iola gosuslugi keepalive --once
100
101
  ```
101
102
 
102
- Добавить локальную cron-задачу CLI:
103
+ Полностью автоматический режим через системный планировщик Windows:
103
104
 
104
105
  ```bash
105
106
  iola gosuslugi install-keepalive
106
- iola cron tick
107
+ iola gosuslugi keepalive-status
107
108
  ```
108
109
 
109
- `cron tick` нужно запускать системным планировщиком или вручную. Если сессия протухла, CLI попросит выполнить `iola gosuslugi connect`.
110
+ На Windows создается задача Task Scheduler `iola-gosuslugi-keepalive`, которая каждые 30 минут выполняет `iola gosuslugi check --silent` без постоянно открытого окна терминала.
111
+
112
+ Удалить задачу:
113
+
114
+ ```bash
115
+ iola gosuslugi uninstall-keepalive
116
+ ```
117
+
118
+ Если сессия протухла, CLI запишет это в лог и при следующей ручной команде попросит выполнить `iola gosuslugi connect`.
110
119
 
111
120
  ## Отключение
112
121