@quiel/cli 0.5.0 → 0.5.1

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/dist/cli.js +417 -167
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -115,6 +115,51 @@ var maskKeyValue = maskValueGroup(KEY_VALUE_RE);
115
115
  var maskFlagSpace = maskValueGroup(FLAG_SPACE_RE);
116
116
  var maskAuthHeader = maskValueGroup(AUTH_HEADER_RE);
117
117
 
118
+ // ../shared/src/deploy/affected-services.ts
119
+ var RULES = [
120
+ // Приложения — каждое только в свой образ.
121
+ { prefix: "apps/web/", services: ["web"] },
122
+ { prefix: "apps/realtime/", services: ["realtime"] },
123
+ { prefix: "apps/worker/", services: ["worker"] },
124
+ { prefix: "apps/docs/", services: ["docs"] },
125
+ // Клиент публикуется в npm и на стенде не работает.
126
+ //
127
+ // ПУТЬ — `packages/mcp-client/`, и это не придирка: раньше здесь стояло
128
+ // `packages/cli/`, каталога с таким именем в репозитории нет никогда не
129
+ // было, и правило не совпадало ни с чем. Правка клиента молча
130
+ // проваливалась в «закрыто по умолчанию» и пересобирала все образы.
131
+ // Тест это подтверждал — он спрашивал про такой же выдуманный путь.
132
+ { prefix: "packages/mcp-client/", services: [] },
133
+ // Схема и клиент БД: три сервиса ходят в базу, плюс сам мигратор.
134
+ { prefix: "packages/db/", services: ["web", "realtime", "worker", "migrate"] },
135
+ // Клиент GitHub App: веб (подключение, список репозиториев) и realtime
136
+ // (открытие pull request диспетчером).
137
+ { prefix: "packages/github/", services: ["web", "realtime"] },
138
+ // Письма: веб шлёт magic link и подтверждения, воркер — уведомления и
139
+ // дайджест. Realtime почту не трогает.
140
+ { prefix: "packages/mail/", services: ["web", "worker"] },
141
+ // Общие типы и общий конфиг — под ними все.
142
+ { prefix: "packages/shared/", services: "all" },
143
+ { prefix: "packages/config/", services: "all" },
144
+ // Сборка и окружение — тоже все.
145
+ { prefix: "docker/", services: "all" },
146
+ // Комплект логотипа: аватар для GitHub и правила использования. Сам
147
+ // логотип в продукте живёт не здесь — разметка встроена в компоненты
148
+ // (`apps/*/src/components/brand/`), иконки лежат в `apps/*/public/`, и
149
+ // оба пути закрыты правилами приложений выше. Тут только справочные
150
+ // файлы для людей.
151
+ { prefix: "brand/", services: [] },
152
+ // Вспомогательные скрипты выкладки исполняются в CI, из проверенного
153
+ // коммита, и ни в один образ не попадают. Их правка меняет то, КАК
154
+ // считается список сервисов, но не содержимое стенда.
155
+ { prefix: "scripts/", services: [] },
156
+ // Документы проекта и настройки CI стенда не касаются.
157
+ { prefix: "docs/", services: [] },
158
+ { prefix: ".github/", services: [] },
159
+ { prefix: ".claude/", services: [] }
160
+ ];
161
+ var RULE_PREFIXES = RULES.map((rule) => rule.prefix);
162
+
118
163
  // ../shared/src/docs/links.ts
119
164
  var DocsPage = {
120
165
  START: "start",
@@ -384,6 +429,12 @@ var ReorderMilestonesSchema = z9.object({
384
429
  import { z as z10 } from "zod";
385
430
 
386
431
  // ../shared/src/enums/organization.ts
432
+ var Plan = {
433
+ SELF_HOSTED: "SELF_HOSTED",
434
+ FREE: "FREE",
435
+ TEAM: "TEAM",
436
+ ENTERPRISE: "ENTERPRISE"
437
+ };
387
438
  var OrgRole = {
388
439
  OWNER: "OWNER",
389
440
  ADMIN: "ADMIN",
@@ -1470,6 +1521,9 @@ var taskUsagePayloadSchema = z23.object({
1470
1521
  entries: z23.array(taskUsageEntrySchema).min(1).max(10)
1471
1522
  });
1472
1523
  var taskUsageAckSchema = z23.object({ ok: z23.boolean() });
1524
+ var sessionLimitReachedPayloadSchema = z23.object({
1525
+ tasksCompletedInSession: z23.number().int().nonnegative()
1526
+ });
1473
1527
  var taskCreatePayloadSchema = z23.object({
1474
1528
  title: z23.string().min(1),
1475
1529
  descriptionMd: z23.string(),
@@ -1788,9 +1842,205 @@ var ImportTasksRequestSchema = z26.object({
1788
1842
  tasks: z26.array(ImportTaskInputSchema).min(1, "\u041D\u0443\u0436\u043D\u0430 \u0445\u043E\u0442\u044F \u0431\u044B \u043E\u0434\u043D\u0430 \u0437\u0430\u0434\u0430\u0447\u0430").max(500, "\u041D\u0435 \u0431\u043E\u043B\u044C\u0448\u0435 500 \u0437\u0430\u0434\u0430\u0447 \u0437\u0430 \u043E\u0434\u0438\u043D \u0438\u043C\u043F\u043E\u0440\u0442")
1789
1843
  });
1790
1844
 
1791
- // ../shared/src/settings/org-settings.ts
1845
+ // ../shared/src/integrations/registry.ts
1846
+ var IntegrationStatus = {
1847
+ /** Работает и проверена вживую. */
1848
+ READY: "ready",
1849
+ /** Запланирована, но ещё не сделана. Показываем, чтобы не обещать голосом. */
1850
+ PLANNED: "planned"
1851
+ };
1852
+ var IntegrationKey = {
1853
+ GITHUB: "github",
1854
+ TELEGRAM: "telegram",
1855
+ WEBHOOKS: "webhooks"
1856
+ };
1857
+ var INTEGRATIONS = [
1858
+ {
1859
+ key: IntegrationKey.GITHUB,
1860
+ status: IntegrationStatus.READY,
1861
+ scope: "org",
1862
+ requiresOrgAdmin: true
1863
+ },
1864
+ {
1865
+ // Организация может принести СВОЙ токен бота (платные тарифы), а
1866
+ // привязку чата каждый делает себе сам — отсюда `both`.
1867
+ key: IntegrationKey.TELEGRAM,
1868
+ status: IntegrationStatus.READY,
1869
+ scope: "both",
1870
+ requiresOrgAdmin: false
1871
+ },
1872
+ {
1873
+ // Одна механика вместо десяти интеграций: Zapier, n8n, Make и любой
1874
+ // свой эндпоинт. Пока не сделана — и список об этом честно говорит.
1875
+ key: IntegrationKey.WEBHOOKS,
1876
+ status: IntegrationStatus.PLANNED,
1877
+ scope: "org",
1878
+ requiresOrgAdmin: true
1879
+ }
1880
+ ];
1881
+ var PLANS_WITH_OWN_TELEGRAM_BOT = [
1882
+ Plan.SELF_HOSTED,
1883
+ Plan.TEAM,
1884
+ Plan.ENTERPRISE
1885
+ ];
1886
+ var BY_KEY = new Map(INTEGRATIONS.map((info) => [info.key, info]));
1887
+
1888
+ // ../shared/src/notifications/kinds.ts
1889
+ var NotificationChannel = {
1890
+ INAPP: "inapp",
1891
+ TELEGRAM: "telegram",
1892
+ EMAIL: "email",
1893
+ PUSH: "push"
1894
+ };
1895
+ var NOTIFICATION_CHANNELS = Object.values(NotificationChannel);
1896
+ var NotificationUrgency = {
1897
+ BLOCKING: "blocking",
1898
+ ACTIONABLE: "actionable",
1899
+ INFORMATIONAL: "informational",
1900
+ SCHEDULED: "scheduled"
1901
+ };
1902
+ var ALL = [
1903
+ NotificationChannel.INAPP,
1904
+ NotificationChannel.TELEGRAM,
1905
+ NotificationChannel.EMAIL,
1906
+ NotificationChannel.PUSH
1907
+ ];
1908
+ var FAST = [
1909
+ NotificationChannel.INAPP,
1910
+ NotificationChannel.TELEGRAM,
1911
+ NotificationChannel.PUSH
1912
+ ];
1913
+ var QUIET = [NotificationChannel.INAPP];
1914
+ var SLOW = [
1915
+ NotificationChannel.INAPP,
1916
+ NotificationChannel.TELEGRAM,
1917
+ NotificationChannel.EMAIL
1918
+ ];
1919
+ function defaultsFor(urgency) {
1920
+ if (urgency === NotificationUrgency.BLOCKING) return FAST;
1921
+ if (urgency === NotificationUrgency.ACTIONABLE) return ALL;
1922
+ if (urgency === NotificationUrgency.SCHEDULED) return SLOW;
1923
+ return QUIET;
1924
+ }
1925
+ function kind(value, label, description, urgency) {
1926
+ return { kind: value, label, description, urgency, defaultChannels: defaultsFor(urgency) };
1927
+ }
1928
+ var NOTIFICATION_KINDS = [
1929
+ kind(
1930
+ "question",
1931
+ "\u0412\u043E\u043F\u0440\u043E\u0441 \u043E\u0442 \u0430\u0433\u0435\u043D\u0442\u0430",
1932
+ "\u0410\u0433\u0435\u043D\u0442 \u0443\u043F\u0451\u0440\u0441\u044F \u0432 \u0442\u043E, \u0447\u0435\u0433\u043E \u043D\u0435 \u043C\u043E\u0436\u0435\u0442 \u0440\u0435\u0448\u0438\u0442\u044C \u0441\u0430\u043C, \u0438 \u0436\u0434\u0451\u0442 \u043E\u0442\u0432\u0435\u0442\u0430.",
1933
+ NotificationUrgency.BLOCKING
1934
+ ),
1935
+ kind(
1936
+ "approval_requested",
1937
+ "\u0417\u0430\u043F\u0440\u043E\u0441 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F",
1938
+ "\u0410\u0433\u0435\u043D\u0442 \u043F\u0440\u043E\u0441\u0438\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044C \u043E\u043F\u0430\u0441\u043D\u0443\u044E \u043A\u043E\u043C\u0430\u043D\u0434\u0443. \u041F\u043E\u043A\u0430 \u043D\u0435 \u043E\u0442\u0432\u0435\u0442\u0438\u0442\u0435 \u2014 \u043E\u043D\u0430 \u043D\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u0441\u044F.",
1939
+ NotificationUrgency.BLOCKING
1940
+ ),
1941
+ kind(
1942
+ "task_assigned",
1943
+ "\u0412\u0430\u043C \u043D\u0430\u0437\u043D\u0430\u0447\u0438\u043B\u0438 \u0437\u0430\u0434\u0430\u0447\u0443",
1944
+ "\u0417\u0430\u0434\u0430\u0447\u0443 \u043D\u0430\u0437\u043D\u0430\u0447\u0438\u043B\u0438 \u043B\u0438\u0447\u043D\u043E \u043D\u0430 \u0432\u0430\u0441.",
1945
+ NotificationUrgency.ACTIONABLE
1946
+ ),
1947
+ kind(
1948
+ "task_review",
1949
+ "\u0417\u0430\u0434\u0430\u0447\u0430 \u043D\u0430 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0435",
1950
+ "\u0420\u0430\u0431\u043E\u0442\u0430 \u0441\u0434\u0430\u043D\u0430 \u0438 \u0436\u0434\u0451\u0442 \u0432\u0430\u0448\u0435\u0439 \u043F\u0440\u0438\u0451\u043C\u043A\u0438.",
1951
+ NotificationUrgency.ACTIONABLE
1952
+ ),
1953
+ kind(
1954
+ "task_returned",
1955
+ "\u0417\u0430\u0434\u0430\u0447\u0443 \u0432\u0435\u0440\u043D\u0443\u043B\u0438 \u0441 \u043F\u0440\u0430\u0432\u043A\u0430\u043C\u0438",
1956
+ "\u0412\u0430\u0448\u0443 \u0440\u0430\u0431\u043E\u0442\u0443 \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u043B\u0438 \u043D\u0430 \u0434\u043E\u0440\u0430\u0431\u043E\u0442\u043A\u0443.",
1957
+ NotificationUrgency.ACTIONABLE
1958
+ ),
1959
+ kind(
1960
+ "task_failed",
1961
+ "\u0417\u0430\u0434\u0430\u0447\u0430 \u043F\u0440\u043E\u0432\u0430\u043B\u0435\u043D\u0430",
1962
+ "\u0422\u0440\u0435\u0442\u0438\u0439 \u0432\u043E\u0437\u0432\u0440\u0430\u0442 \u043F\u043E\u0434\u0440\u044F\u0434 \u2014 \u0437\u0430\u0434\u0430\u0447\u0430 \u0443\u0448\u043B\u0430 \u0432 \xAB\u041F\u0440\u043E\u0432\u0430\u043B\u0435\u043D\u0430\xBB.",
1963
+ NotificationUrgency.ACTIONABLE
1964
+ ),
1965
+ kind(
1966
+ "AGENT_LEASE_EXPIRED",
1967
+ "\u0410\u0433\u0435\u043D\u0442 \u043F\u043E\u0442\u0435\u0440\u044F\u043B \u0437\u0430\u0434\u0430\u0447\u0443",
1968
+ "\u0410\u0440\u0435\u043D\u0434\u0430 \u0438\u0441\u0442\u0435\u043A\u043B\u0430: \u0430\u0433\u0435\u043D\u0442 \u043E\u0442\u0432\u0430\u043B\u0438\u043B\u0441\u044F, \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u0435\u0440\u043D\u0443\u043B\u0430\u0441\u044C \u0432 \u043E\u0447\u0435\u0440\u0435\u0434\u044C.",
1969
+ NotificationUrgency.ACTIONABLE
1970
+ ),
1971
+ kind(
1972
+ "AGENT_RATE_LIMITED_REQUEUE",
1973
+ "\u0410\u0433\u0435\u043D\u0442 \u0443\u043F\u0451\u0440\u0441\u044F \u0432 \u043B\u0438\u043C\u0438\u0442",
1974
+ "\u041F\u043E\u0434\u043F\u0438\u0441\u043A\u0430 \u0430\u0433\u0435\u043D\u0442\u0430 \u0438\u0441\u0447\u0435\u0440\u043F\u0430\u043D\u0430, \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u0430 \u0432 \u043E\u0447\u0435\u0440\u0435\u0434\u044C.",
1975
+ NotificationUrgency.ACTIONABLE
1976
+ ),
1977
+ kind(
1978
+ "agent_session_limit",
1979
+ "\u0421\u0435\u0441\u0441\u0438\u044F \u0430\u0433\u0435\u043D\u0442\u0430 \u0438\u0441\u0447\u0435\u0440\u043F\u0430\u043D\u0430",
1980
+ "\u0410\u0433\u0435\u043D\u0442 \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u043B \u043F\u043E\u0434\u0440\u044F\u0434 \u0441\u0442\u043E\u043B\u044C\u043A\u043E \u0437\u0430\u0434\u0430\u0447, \u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u043E \u0434\u043E \u043E\u0447\u0438\u0441\u0442\u043A\u0438 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430.",
1981
+ NotificationUrgency.INFORMATIONAL
1982
+ ),
1983
+ kind(
1984
+ "task_auto_accepted",
1985
+ "\u0417\u0430\u0434\u0430\u0447\u0430 \u043F\u0440\u0438\u043D\u044F\u0442\u0430 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438",
1986
+ "\u041F\u0440\u043E\u0435\u043A\u0442 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043D \u043D\u0430 \u0430\u0432\u0442\u043E\u043F\u0440\u0438\u0451\u043C\u043A\u0443 \u2014 \u0440\u0430\u0431\u043E\u0442\u0430 \u0437\u0430\u0447\u0442\u0435\u043D\u0430 \u0431\u0435\u0437 \u0432\u0430\u0448\u0435\u0433\u043E \u0443\u0447\u0430\u0441\u0442\u0438\u044F.",
1987
+ NotificationUrgency.INFORMATIONAL
1988
+ ),
1989
+ kind(
1990
+ "DAILY_DIGEST",
1991
+ "\u0415\u0436\u0435\u0434\u043D\u0435\u0432\u043D\u044B\u0439 \u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442",
1992
+ "\u0421\u0432\u043E\u0434\u043A\u0430 \u0437\u0430 \u0441\u0443\u0442\u043A\u0438: \u0447\u0442\u043E \u0441\u043B\u0443\u0447\u0438\u043B\u043E\u0441\u044C \u0438 \u0447\u0442\u043E \u043E\u0442 \u0432\u0430\u0441 \u0436\u0434\u0443\u0442. \u041F\u0440\u0438\u0445\u043E\u0434\u0438\u0442 \u043F\u043E \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0435.",
1993
+ NotificationUrgency.SCHEDULED
1994
+ )
1995
+ ];
1996
+ var BY_KIND2 = new Map(NOTIFICATION_KINDS.map((info) => [info.kind, info]));
1997
+
1998
+ // ../shared/src/notifications/prefs.ts
1792
1999
  import { z as z27 } from "zod";
1793
- var OrgSettingsSchema = z27.object({}).passthrough();
2000
+ var NotificationChannelFlagsSchema = z27.object({
2001
+ inapp: z27.boolean().optional(),
2002
+ telegram: z27.boolean().optional(),
2003
+ email: z27.boolean().optional(),
2004
+ push: z27.boolean().optional()
2005
+ }).partial();
2006
+ var NotificationPrefsSchema = z27.object({
2007
+ /** Подписка на ежедневный дайджест. Ключ существует с фазы 5, читает `jobs/digest.ts`. */
2008
+ digest: z27.boolean().optional(),
2009
+ /**
2010
+ * Выключатели каналов целиком: «почту мне не слать никогда».
2011
+ * Отсутствие ключа означает «по умолчанию», а не «выключено».
2012
+ */
2013
+ channels: NotificationChannelFlagsSchema.optional(),
2014
+ /**
2015
+ * Точечно по видам: `{ task_review: { email: false } }`.
2016
+ *
2017
+ * Ключ — `Notification.kind` как строка, а не enum: в базе уже лежат
2018
+ * виды, а список будет расти. Неизвестный вид здесь никого не ломает
2019
+ * — он просто ни с чем не совпадёт.
2020
+ */
2021
+ kinds: z27.record(z27.string(), NotificationChannelFlagsSchema).optional()
2022
+ }).passthrough();
2023
+
2024
+ // ../shared/src/onboarding/steps.ts
2025
+ var OnboardingStep = {
2026
+ /** Создать организацию. Без неё в системе не работает ничего. */
2027
+ ORGANIZATION: "organization",
2028
+ PROJECT: "project",
2029
+ AGENT: "agent",
2030
+ TEAM: "team",
2031
+ NOTIFICATIONS: "notifications"
2032
+ };
2033
+ var ONBOARDING_STEPS = [
2034
+ { step: OnboardingStep.ORGANIZATION, required: true, ownerOnly: false },
2035
+ { step: OnboardingStep.PROJECT, required: false, ownerOnly: true },
2036
+ { step: OnboardingStep.AGENT, required: false, ownerOnly: false },
2037
+ { step: OnboardingStep.TEAM, required: false, ownerOnly: true },
2038
+ { step: OnboardingStep.NOTIFICATIONS, required: false, ownerOnly: false }
2039
+ ];
2040
+
2041
+ // ../shared/src/settings/org-settings.ts
2042
+ import { z as z28 } from "zod";
2043
+ var OrgSettingsSchema = z28.object({}).passthrough();
1794
2044
 
1795
2045
  // ../shared/src/task-state.ts
1796
2046
  var TASK_TRANSITIONS = [
@@ -3022,24 +3272,24 @@ function upsertClaudeMdSection(existingContent) {
3022
3272
  // src/config/claude-settings.ts
3023
3273
  import { existsSync as existsSync2, mkdirSync, readFileSync as readFileSync2, writeFileSync as writeFileSync2 } from "fs";
3024
3274
  import { join as join2 } from "path";
3025
- import { z as z28 } from "zod";
3026
- var HookCommandEntrySchema = z28.object({
3027
- type: z28.literal("command"),
3028
- command: z28.string().min(1),
3029
- timeout: z28.number().int().positive().optional()
3275
+ import { z as z29 } from "zod";
3276
+ var HookCommandEntrySchema = z29.object({
3277
+ type: z29.literal("command"),
3278
+ command: z29.string().min(1),
3279
+ timeout: z29.number().int().positive().optional()
3030
3280
  }).passthrough();
3031
- var HookMatcherGroupSchema = z28.object({
3032
- matcher: z28.string().optional(),
3033
- hooks: z28.array(HookCommandEntrySchema)
3281
+ var HookMatcherGroupSchema = z29.object({
3282
+ matcher: z29.string().optional(),
3283
+ hooks: z29.array(HookCommandEntrySchema)
3034
3284
  }).passthrough();
3035
- var McpServerEntrySchema = z28.object({
3036
- command: z28.string().min(1),
3037
- args: z28.array(z28.string()).optional()
3285
+ var McpServerEntrySchema = z29.object({
3286
+ command: z29.string().min(1),
3287
+ args: z29.array(z29.string()).optional()
3038
3288
  }).passthrough();
3039
- var ClaudeSettingsSchema = z28.object({
3040
- mcpServers: z28.record(z28.string(), McpServerEntrySchema).optional(),
3041
- hooks: z28.record(z28.string(), z28.array(HookMatcherGroupSchema)).optional(),
3042
- env: z28.record(z28.string(), z28.string()).optional()
3289
+ var ClaudeSettingsSchema = z29.object({
3290
+ mcpServers: z29.record(z29.string(), McpServerEntrySchema).optional(),
3291
+ hooks: z29.record(z29.string(), z29.array(HookMatcherGroupSchema)).optional(),
3292
+ env: z29.record(z29.string(), z29.string()).optional()
3043
3293
  }).passthrough();
3044
3294
  var CLAUDE_SETTINGS_RELATIVE_PATH = join2(".claude", "settings.json");
3045
3295
  var CLI_BIN = "quiel";
@@ -3144,13 +3394,13 @@ function clearPendingApproval(state, approvalId) {
3144
3394
  }
3145
3395
 
3146
3396
  // src/state/schema.ts
3147
- import { z as z29 } from "zod";
3397
+ import { z as z30 } from "zod";
3148
3398
  var STATE_SCHEMA_VERSION = 1;
3149
- var CurrentTaskSchema = z29.object({
3150
- taskId: z29.string().min(1),
3399
+ var CurrentTaskSchema = z30.object({
3400
+ taskId: z30.string().min(1),
3151
3401
  /** Человекочитаемый ключ вроде `REL-42` — для текста в хуках. Необязателен: на первых порах может быть неизвестен. */
3152
- taskKey: z29.string().min(1).optional(),
3153
- resumeToken: z29.string().min(1),
3402
+ taskKey: z30.string().min(1).optional(),
3403
+ resumeToken: z30.string().min(1),
3154
3404
  /**
3155
3405
  * Каталог, в котором агент работает над этой задачей (`.claude/worktrees/…`).
3156
3406
  *
@@ -3164,7 +3414,7 @@ var CurrentTaskSchema = z29.object({
3164
3414
  * в чекауте), а у состояний, записанных прежними версиями клиента,
3165
3415
  * поля просто нет.
3166
3416
  */
3167
- worktreeDir: z29.string().min(1).optional(),
3417
+ worktreeDir: z30.string().min(1).optional(),
3168
3418
  /**
3169
3419
  * Git-режим проекта (§13.1 ТЗ) — `DIRECT` или `PR`.
3170
3420
  *
@@ -3178,56 +3428,56 @@ var CurrentTaskSchema = z29.object({
3178
3428
  * Необязательно: состояния, записанные прежними версиями клиента, поля
3179
3429
  * не имеют — тогда `submit_work` работает как раньше, в режиме DIRECT.
3180
3430
  */
3181
- gitMode: z29.enum([GitMode.DIRECT, GitMode.PR]).optional()
3182
- });
3183
- var TrustCacheSchema = z29.object({
3184
- profileKey: z29.string().min(1),
3185
- updatedAt: z29.string(),
3186
- rules: z29.object({
3187
- bash: z29.object({
3188
- mode: z29.enum(["allow", "approve", "deny"]),
3189
- stopPatterns: z29.array(z29.string()).default([]),
3190
- allowPatterns: z29.array(z29.string()).optional()
3431
+ gitMode: z30.enum([GitMode.DIRECT, GitMode.PR]).optional()
3432
+ });
3433
+ var TrustCacheSchema = z30.object({
3434
+ profileKey: z30.string().min(1),
3435
+ updatedAt: z30.string(),
3436
+ rules: z30.object({
3437
+ bash: z30.object({
3438
+ mode: z30.enum(["allow", "approve", "deny"]),
3439
+ stopPatterns: z30.array(z30.string()).default([]),
3440
+ allowPatterns: z30.array(z30.string()).optional()
3191
3441
  }),
3192
- files: z29.object({
3193
- mode: z29.enum(["allow", "approve"]),
3194
- protectedPaths: z29.array(z29.string()).default([])
3442
+ files: z30.object({
3443
+ mode: z30.enum(["allow", "approve"]),
3444
+ protectedPaths: z30.array(z30.string()).default([])
3195
3445
  }).optional(),
3196
- git: z29.object({ allowPushDefault: z29.boolean(), allowForcePush: z29.boolean() }).optional(),
3197
- network: z29.object({ allowSsh: z29.boolean(), sshHostsAllow: z29.array(z29.string()).optional() }).optional(),
3198
- approvalTtlMin: z29.number().int().positive().optional()
3446
+ git: z30.object({ allowPushDefault: z30.boolean(), allowForcePush: z30.boolean() }).optional(),
3447
+ network: z30.object({ allowSsh: z30.boolean(), sshHostsAllow: z30.array(z30.string()).optional() }).optional(),
3448
+ approvalTtlMin: z30.number().int().positive().optional()
3199
3449
  }).passthrough()
3200
3450
  }).nullable();
3201
- var ApprovedCommandSchema = z29.object({
3202
- token: z29.string().min(1),
3203
- command: z29.string().min(1),
3204
- cwd: z29.string().min(1),
3205
- expiresAt: z29.string(),
3206
- createdAt: z29.string()
3451
+ var ApprovedCommandSchema = z30.object({
3452
+ token: z30.string().min(1),
3453
+ command: z30.string().min(1),
3454
+ cwd: z30.string().min(1),
3455
+ expiresAt: z30.string(),
3456
+ createdAt: z30.string()
3207
3457
  });
3208
- var PendingApprovalSchema = z29.object({
3209
- command: z29.string().min(1),
3210
- cwd: z29.string().min(1),
3211
- createdAt: z29.string()
3458
+ var PendingApprovalSchema = z30.object({
3459
+ command: z30.string().min(1),
3460
+ cwd: z30.string().min(1),
3461
+ createdAt: z30.string()
3212
3462
  });
3213
- var AgentModeSchema = z29.enum([AgentMode.AUTONOMOUS, AgentMode.MANUAL]);
3463
+ var AgentModeSchema = z30.enum([AgentMode.AUTONOMOUS, AgentMode.MANUAL]);
3214
3464
  var DEFAULT_CONTEXT_RESET_AFTER_TASKS = ProjectSettingsSchema.parse({}).contextResetAfterTasks;
3215
- var ClientStateSchema = z29.object({
3216
- version: z29.literal(STATE_SCHEMA_VERSION).default(STATE_SCHEMA_VERSION),
3465
+ var ClientStateSchema = z30.object({
3466
+ version: z30.literal(STATE_SCHEMA_VERSION).default(STATE_SCHEMA_VERSION),
3217
3467
  mode: AgentModeSchema.default(AgentMode.MANUAL),
3218
3468
  currentTask: CurrentTaskSchema.nullable().default(null),
3219
3469
  /** Счётчик сдач задач в текущей «сессии» (§10.4 ТЗ). Сбрасывается `SessionStart` при `source ∈ {startup, clear}` — см. src/hooks/session-start.ts. */
3220
- tasksCompletedInSession: z29.number().int().nonnegative().default(0),
3470
+ tasksCompletedInSession: z30.number().int().nonnegative().default(0),
3221
3471
  /** Кэш `ProjectSettings.contextResetAfterTasks` (§7.2 ТЗ) — сколько задач подряд можно сдать, прежде чем `Stop`-хук попросит `/clear`. */
3222
- contextResetAfterTasks: z29.number().int().positive().default(DEFAULT_CONTEXT_RESET_AFTER_TASKS),
3472
+ contextResetAfterTasks: z30.number().int().positive().default(DEFAULT_CONTEXT_RESET_AFTER_TASKS),
3223
3473
  /** Кэш стоп-паттернов/правил доверия для `PreToolUse` фазы 4. */
3224
3474
  trust: TrustCacheSchema.default(null),
3225
3475
  /** Снимок задачи на момент последнего `PreCompact` — пишет src/hooks/pre-compact.ts, читает SessionStart(source="compact"), чтобы напомнить модели, чем она занималась. */
3226
- lastPreCompact: CurrentTaskSchema.extend({ savedAt: z29.string() }).nullable().default(null),
3476
+ lastPreCompact: CurrentTaskSchema.extend({ savedAt: z30.string() }).nullable().default(null),
3227
3477
  /** Кэш одноразовых токенов подтверждения (§14.4 ТЗ), ключ — `hashCommandKey(command, cwd)`. Читает/жжёт `PreToolUse` (`hooks/pre-tool-use.ts`), пишут `request_approval`/`wait_approval` и пуш `approval:decided` (`socket/client.ts`). */
3228
- approvedCommands: z29.record(z29.string(), ApprovedCommandSchema).default({}),
3478
+ approvedCommands: z30.record(z30.string(), ApprovedCommandSchema).default({}),
3229
3479
  /** Незавершённые запросы подтверждения, ключ — `approvalId`. См. `PendingApprovalSchema`. */
3230
- pendingApprovals: z29.record(z29.string(), PendingApprovalSchema).default({}),
3480
+ pendingApprovals: z30.record(z30.string(), PendingApprovalSchema).default({}),
3231
3481
  /**
3232
3482
  * Сколько байтов транскрипта уже посчитано в расход токенов (вопрос
3233
3483
  * владельца 18.09.2026).
@@ -3240,9 +3490,9 @@ var ClientStateSchema = z29.object({
3240
3490
  * расход задачи рос бы квадратично — по числам это выглядело бы как
3241
3491
  * «агент потратил в сто раз больше», и проверить было бы нечем.
3242
3492
  */
3243
- usageOffsets: z29.record(z29.string(), z29.number().int().nonnegative()).default({}),
3493
+ usageOffsets: z30.record(z30.string(), z30.number().int().nonnegative()).default({}),
3244
3494
  /** Штамп последней записи файла — выставляется в state/store.ts при каждом `writeState`. */
3245
- updatedAt: z29.string().default(() => (/* @__PURE__ */ new Date()).toISOString())
3495
+ updatedAt: z30.string().default(() => (/* @__PURE__ */ new Date()).toISOString())
3246
3496
  });
3247
3497
  function createDefaultState() {
3248
3498
  return ClientStateSchema.parse({});
@@ -3294,18 +3544,18 @@ function updateState(patch, filePath = getStateFilePath()) {
3294
3544
  }
3295
3545
 
3296
3546
  // src/config/schema.ts
3297
- import { z as z30 } from "zod";
3547
+ import { z as z31 } from "zod";
3298
3548
  var PROJECT_CONFIG_SCHEMA_VERSION = 1;
3299
- var ProjectConfigSchema = z30.object({
3300
- version: z30.literal(PROJECT_CONFIG_SCHEMA_VERSION).default(PROJECT_CONFIG_SCHEMA_VERSION),
3549
+ var ProjectConfigSchema = z31.object({
3550
+ version: z31.literal(PROJECT_CONFIG_SCHEMA_VERSION).default(PROJECT_CONFIG_SCHEMA_VERSION),
3301
3551
  /** URL платформы (§10.1 ТЗ), например `https://quiel.example.com`. */
3302
- url: z30.string().trim().url("\u041D\u0443\u0436\u0435\u043D \u043F\u043E\u043B\u043D\u044B\u0439 URL, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 https://quiel.example.com"),
3552
+ url: z31.string().trim().url("\u041D\u0443\u0436\u0435\u043D \u043F\u043E\u043B\u043D\u044B\u0439 URL, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 https://quiel.example.com"),
3303
3553
  /** Ключ проекта на платформе (OQ-11), например `REL`. */
3304
- projectKey: z30.string().trim().min(1, "\u041A\u043B\u044E\u0447 \u043F\u0440\u043E\u0435\u043A\u0442\u0430 \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u0435\u043D"),
3554
+ projectKey: z31.string().trim().min(1, "\u041A\u043B\u044E\u0447 \u043F\u0440\u043E\u0435\u043A\u0442\u0430 \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u0435\u043D"),
3305
3555
  /** Идентификатор агента — см. комментарий выше. */
3306
- agentId: z30.string().trim().min(1, "ID \u0430\u0433\u0435\u043D\u0442\u0430 \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u0435\u043D"),
3556
+ agentId: z31.string().trim().min(1, "ID \u0430\u0433\u0435\u043D\u0442\u0430 \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u0435\u043D"),
3307
3557
  /** Человекочитаемое имя агента (§7.4 ТЗ: «odya-macbook») — необязательно, только для локального отображения. */
3308
- agentName: z30.string().trim().min(1).optional(),
3558
+ agentName: z31.string().trim().min(1).optional(),
3309
3559
  /** Роли, с которыми агент забирает задачи — подмножество ролей участника (§7.4 ТЗ). */
3310
3560
  roleKeys: AgentRoleKeysSchema,
3311
3561
  /**
@@ -3338,19 +3588,19 @@ var ProjectConfigSchema = z30.object({
3338
3588
  * абсолютный путь вроде `/Users/odya/...` у коллеги на другой машине
3339
3589
  * оказался бы битым. Режим переносим — это соглашение проекта.
3340
3590
  */
3341
- worktrees: z30.enum(["isolated", "checkout"]).default("isolated")
3591
+ worktrees: z31.enum(["isolated", "checkout"]).default("isolated")
3342
3592
  });
3343
- var CredentialsEntrySchema = z30.object({
3344
- url: z30.string().trim().url(),
3345
- token: z30.string().min(1),
3346
- projectKey: z30.string().min(1),
3593
+ var CredentialsEntrySchema = z31.object({
3594
+ url: z31.string().trim().url(),
3595
+ token: z31.string().min(1),
3596
+ projectKey: z31.string().min(1),
3347
3597
  /** Когда записали — для диагностики (`quiel status`), не для логики. */
3348
- savedAt: z30.string()
3598
+ savedAt: z31.string()
3349
3599
  });
3350
3600
  var CREDENTIALS_SCHEMA_VERSION = 1;
3351
- var CredentialsFileSchema = z30.object({
3352
- version: z30.literal(CREDENTIALS_SCHEMA_VERSION).default(CREDENTIALS_SCHEMA_VERSION),
3353
- agents: z30.record(z30.string(), CredentialsEntrySchema).default({})
3601
+ var CredentialsFileSchema = z31.object({
3602
+ version: z31.literal(CREDENTIALS_SCHEMA_VERSION).default(CREDENTIALS_SCHEMA_VERSION),
3603
+ agents: z31.record(z31.string(), CredentialsEntrySchema).default({})
3354
3604
  });
3355
3605
  function createEmptyCredentialsFile() {
3356
3606
  return CredentialsFileSchema.parse({});
@@ -3431,13 +3681,13 @@ function ensureWorktreesIgnored(dir) {
3431
3681
  // src/config/mcp-json.ts
3432
3682
  import { existsSync as existsSync6, readFileSync as readFileSync6, writeFileSync as writeFileSync6 } from "fs";
3433
3683
  import { join as join6 } from "path";
3434
- import { z as z31 } from "zod";
3435
- var McpServerEntrySchema2 = z31.object({
3436
- command: z31.string().min(1).optional(),
3437
- args: z31.array(z31.string()).optional()
3684
+ import { z as z32 } from "zod";
3685
+ var McpServerEntrySchema2 = z32.object({
3686
+ command: z32.string().min(1).optional(),
3687
+ args: z32.array(z32.string()).optional()
3438
3688
  }).passthrough();
3439
- var McpJsonSchema = z31.object({
3440
- mcpServers: z31.record(z31.string(), McpServerEntrySchema2).optional()
3689
+ var McpJsonSchema = z32.object({
3690
+ mcpServers: z32.record(z32.string(), McpServerEntrySchema2).optional()
3441
3691
  }).passthrough();
3442
3692
  var MCP_JSON_RELATIVE_PATH = ".mcp.json";
3443
3693
  function mergeQuielMcpJson(existing) {
@@ -3626,11 +3876,11 @@ var claudeCodeInstaller = {
3626
3876
  };
3627
3877
 
3628
3878
  // src/agents/codex.ts
3629
- import { z as z32 } from "zod";
3879
+ import { z as z33 } from "zod";
3630
3880
  var CODEX_HOOKS_PATH = ".codex/hooks.json";
3631
3881
  var CODEX_CONFIG_PATH = ".codex/config.toml";
3632
- var CodexHooksFileSchema = z32.object({
3633
- hooks: z32.record(z32.string(), z32.array(z32.object({}).passthrough())).optional()
3882
+ var CodexHooksFileSchema = z33.object({
3883
+ hooks: z33.record(z33.string(), z33.array(z33.object({}).passthrough())).optional()
3634
3884
  }).passthrough();
3635
3885
  function mcpServerTable() {
3636
3886
  return [
@@ -3680,16 +3930,16 @@ var codexInstaller = {
3680
3930
  };
3681
3931
 
3682
3932
  // src/agents/cursor.ts
3683
- import { z as z33 } from "zod";
3933
+ import { z as z34 } from "zod";
3684
3934
  var CURSOR_HOOKS_PATH = ".cursor/hooks.json";
3685
3935
  var CURSOR_MCP_PATH = ".cursor/mcp.json";
3686
- var CursorHookEntrySchema = z33.object({ command: z33.string().min(1) }).passthrough();
3687
- var CursorHooksFileSchema = z33.object({
3688
- version: z33.number().optional(),
3689
- hooks: z33.record(z33.string(), z33.array(CursorHookEntrySchema)).optional()
3936
+ var CursorHookEntrySchema = z34.object({ command: z34.string().min(1) }).passthrough();
3937
+ var CursorHooksFileSchema = z34.object({
3938
+ version: z34.number().optional(),
3939
+ hooks: z34.record(z34.string(), z34.array(CursorHookEntrySchema)).optional()
3690
3940
  }).passthrough();
3691
- var CursorMcpFileSchema = z33.object({
3692
- mcpServers: z33.record(z33.string(), z33.object({}).passthrough()).optional()
3941
+ var CursorMcpFileSchema = z34.object({
3942
+ mcpServers: z34.record(z34.string(), z34.object({}).passthrough()).optional()
3693
3943
  }).passthrough();
3694
3944
  var CURSOR_HOOKS = {
3695
3945
  sessionStart: `${CLI_BIN} hook session-start --format cursor`,
@@ -3753,7 +4003,7 @@ var cursorInstaller = {
3753
4003
  };
3754
4004
 
3755
4005
  // src/agents/opencode.ts
3756
- import { z as z34 } from "zod";
4006
+ import { z as z35 } from "zod";
3757
4007
 
3758
4008
  // src/agents/opencode-plugin.ts
3759
4009
  var OPENCODE_PLUGIN_FILENAME = "quiel.js";
@@ -3803,9 +4053,9 @@ export const QuielPlugin = async ({ directory }) => {
3803
4053
  // src/agents/opencode.ts
3804
4054
  var OPENCODE_CONFIG_PATH = "opencode.json";
3805
4055
  var OPENCODE_SCHEMA_URL = "https://opencode.ai/config.json";
3806
- var OpencodeConfigSchema = z34.object({
3807
- $schema: z34.string().optional(),
3808
- mcp: z34.record(z34.string(), z34.object({}).passthrough()).optional()
4056
+ var OpencodeConfigSchema = z35.object({
4057
+ $schema: z35.string().optional(),
4058
+ mcp: z35.record(z35.string(), z35.object({}).passthrough()).optional()
3809
4059
  }).passthrough();
3810
4060
  var opencodeInstaller = {
3811
4061
  kind: AgentKind.OPENCODE,
@@ -3850,8 +4100,8 @@ var VERSION_ENV = {
3850
4100
  [AgentKind.CLAUDE_CODE]: "CLAUDE_CODE_VERSION"
3851
4101
  };
3852
4102
  var UNKNOWN_AGENT_VERSION = "unknown";
3853
- function readAgentVersion(kind, env = process.env) {
3854
- const name = VERSION_ENV[kind];
4103
+ function readAgentVersion(kind2, env = process.env) {
4104
+ const name = VERSION_ENV[kind2];
3855
4105
  const value = name ? env[name] : void 0;
3856
4106
  return value && value.trim().length > 0 ? value.trim() : UNKNOWN_AGENT_VERSION;
3857
4107
  }
@@ -3863,12 +4113,12 @@ var INSTALLERS = [
3863
4113
  cursorInstaller,
3864
4114
  opencodeInstaller
3865
4115
  ];
3866
- var BY_KIND2 = new Map(INSTALLERS.map((i) => [i.kind, i]));
3867
- function installerFor(kind) {
3868
- const installer = BY_KIND2.get(kind);
4116
+ var BY_KIND3 = new Map(INSTALLERS.map((i) => [i.kind, i]));
4117
+ function installerFor(kind2) {
4118
+ const installer = BY_KIND3.get(kind2);
3869
4119
  if (!installer) {
3870
4120
  throw new Error(
3871
- `\u0414\u043B\u044F \u0432\u0438\u0434\u0430 \u0430\u0433\u0435\u043D\u0442\u0430 ${kind} \u043D\u0435\u0442 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0449\u0438\u043A\u0430. \u041E\u0431\u043D\u043E\u0432\u0438\u0442\u0435 @quiel/cli: \u0432\u0438\u0434\u0438\u043C\u043E, \u0440\u0435\u0435\u0441\u0442\u0440 \u043D\u043E\u0432\u0435\u0435 \u044D\u0442\u043E\u0433\u043E \u043F\u0430\u043A\u0435\u0442\u0430.`
4121
+ `\u0414\u043B\u044F \u0432\u0438\u0434\u0430 \u0430\u0433\u0435\u043D\u0442\u0430 ${kind2} \u043D\u0435\u0442 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0449\u0438\u043A\u0430. \u041E\u0431\u043D\u043E\u0432\u0438\u0442\u0435 @quiel/cli: \u0432\u0438\u0434\u0438\u043C\u043E, \u0440\u0435\u0435\u0441\u0442\u0440 \u043D\u043E\u0432\u0435\u0435 \u044D\u0442\u043E\u0433\u043E \u043F\u0430\u043A\u0435\u0442\u0430.`
3872
4122
  );
3873
4123
  }
3874
4124
  return installer;
@@ -3930,7 +4180,7 @@ var createSocket = (url, options) => io(url, {
3930
4180
  // src/hooks/audit-sender.ts
3931
4181
  var DEFAULT_CONNECT_TIMEOUT_MS = 3e3;
3932
4182
  var DEFAULT_FLUSH_GRACE_MS = 150;
3933
- var WIRE_EVENTS = /* @__PURE__ */ new Set(["audit:command", "task:usage"]);
4183
+ var WIRE_EVENTS = /* @__PURE__ */ new Set(["audit:command", "task:usage", "session-limit-reached"]);
3934
4184
  function sendHookActions(actions, options = {}) {
3935
4185
  const wireActions = actions.filter((action) => WIRE_EVENTS.has(action.type));
3936
4186
  if (wireActions.length === 0) return;
@@ -3966,7 +4216,7 @@ function trimTrailingSlash(url) {
3966
4216
  }
3967
4217
 
3968
4218
  // src/hooks/format.ts
3969
- import { z as z35 } from "zod";
4219
+ import { z as z36 } from "zod";
3970
4220
  var HOOK_FORMATS = ["claude", "cursor", "opencode"];
3971
4221
  function asHookFormat(raw) {
3972
4222
  const value = raw.trim().toLowerCase();
@@ -3979,18 +4229,18 @@ var CLAUDE_EVENT = {
3979
4229
  "pre-tool-use": "PreToolUse",
3980
4230
  "pre-compact": "PreCompact"
3981
4231
  };
3982
- var CursorShellInputSchema = z35.object({ command: z35.string(), cwd: z35.string().optional() }).passthrough();
3983
- var CursorStopInputSchema = z35.object({ status: z35.string().optional(), loop_count: z35.number().optional() }).passthrough();
4232
+ var CursorShellInputSchema = z36.object({ command: z36.string(), cwd: z36.string().optional() }).passthrough();
4233
+ var CursorStopInputSchema = z36.object({ status: z36.string().optional(), loop_count: z36.number().optional() }).passthrough();
3984
4234
  function cursorPermission(decision) {
3985
4235
  if (decision === "deny") return "deny";
3986
4236
  if (decision === "allow") return "allow";
3987
4237
  return "ask";
3988
4238
  }
3989
- var OpencodePayloadSchema = z35.object({
3990
- directory: z35.string().optional(),
3991
- input: z35.object({ tool: z35.string().optional() }).passthrough().optional(),
3992
- output: z35.object({ args: z35.record(z35.string(), z35.unknown()).optional() }).passthrough().optional(),
3993
- event: z35.object({ type: z35.string().optional() }).passthrough().optional()
4239
+ var OpencodePayloadSchema = z36.object({
4240
+ directory: z36.string().optional(),
4241
+ input: z36.object({ tool: z36.string().optional() }).passthrough().optional(),
4242
+ output: z36.object({ args: z36.record(z36.string(), z36.unknown()).optional() }).passthrough().optional(),
4243
+ event: z36.object({ type: z36.string().optional() }).passthrough().optional()
3994
4244
  }).passthrough();
3995
4245
  var OPENCODE_TOOLS = {
3996
4246
  bash: { name: "Bash", arg: "command", field: "command" },
@@ -4795,7 +5045,7 @@ ${question.answerMd ?? ""}${describeAnswerAttachments(question)}`;
4795
5045
  // package.json
4796
5046
  var package_default = {
4797
5047
  name: "@quiel/cli",
4798
- version: "0.5.0",
5048
+ version: "0.5.1",
4799
5049
  description: "CLI \u0438 MCP-\u0441\u0435\u0440\u0432\u0435\u0440 Quiel: \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0430\u0433\u0435\u043D\u0442\u0430 \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0430 (Claude Code, Codex, Cursor, OpenCode) \u043A \u043F\u043B\u0430\u0442\u0444\u043E\u0440\u043C\u0435",
4800
5050
  homepage: "https://quiel.app",
4801
5051
  repository: {
@@ -5764,7 +6014,7 @@ async function settleApproval(ack, commandCwd, runtime, waitSecUsed) {
5764
6014
  }
5765
6015
 
5766
6016
  // src/mcp/set-mode.ts
5767
- import { z as z36 } from "zod";
6017
+ import { z as z37 } from "zod";
5768
6018
 
5769
6019
  // src/cli/mode.ts
5770
6020
  function parseModeArg(raw) {
@@ -5805,7 +6055,7 @@ async function requestModeChange(modeArg, options = {}) {
5805
6055
 
5806
6056
  // src/mcp/set-mode.ts
5807
6057
  var setModeInputShape = {
5808
- mode: z36.enum(["auto", "manual"]).describe("auto \u2014 \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0430\u0432\u0442\u043E\u043D\u043E\u043C\u043D\u044B\u0439 \u0440\u0435\u0436\u0438\u043C \u0430\u0433\u0435\u043D\u0442\u0430, manual \u2014 \u0432\u044B\u043A\u043B\u044E\u0447\u0438\u0442\u044C (\xA710.2 \u0422\u0417)")
6058
+ mode: z37.enum(["auto", "manual"]).describe("auto \u2014 \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0430\u0432\u0442\u043E\u043D\u043E\u043C\u043D\u044B\u0439 \u0440\u0435\u0436\u0438\u043C \u0430\u0433\u0435\u043D\u0442\u0430, manual \u2014 \u0432\u044B\u043A\u043B\u044E\u0447\u0438\u0442\u044C (\xA710.2 \u0422\u0417)")
5809
6059
  };
5810
6060
  async function setModeHandler(args, runtime) {
5811
6061
  const result = await requestModeChange(args.mode, {
@@ -5820,20 +6070,20 @@ async function setModeHandler(args, runtime) {
5820
6070
  }
5821
6071
 
5822
6072
  // src/mcp/submit-work.ts
5823
- import { z as z37 } from "zod";
6073
+ import { z as z38 } from "zod";
5824
6074
  var submitWorkInputShape = {
5825
- branchName: z37.string().min(1).describe(
6075
+ branchName: z38.string().min(1).describe(
5826
6076
  "\u0418\u043C\u044F \u0432\u0435\u0442\u043A\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u2014 \u0431\u0435\u0440\u0438 \u0440\u043E\u0432\u043D\u043E \u0438\u0437 project.branchName \u0432 TaskPayload, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0432\u0435\u0440\u043D\u0443\u043B next_task. \u041D\u0435 \u043F\u0440\u0438\u0434\u0443\u043C\u044B\u0432\u0430\u0439 \u0441\u0432\u043E\u0451."
5827
6077
  ),
5828
- defaultBranch: z37.string().min(1).describe("\u041E\u0441\u043D\u043E\u0432\u043D\u0430\u044F \u0432\u0435\u0442\u043A\u0430 \u0440\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u044F \u2014 \u0438\u0437 project.repos[].defaultBranch."),
5829
- commitPrefix: z37.string().min(1).describe('\u041F\u0440\u0435\u0444\u0438\u043A\u0441 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u043A\u043E\u043C\u043C\u0438\u0442\u0430 \u2014 \u0438\u0437 project.commitPrefix, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 "ATL-42:".'),
5830
- taskKey: z37.string().min(1).describe("\u041A\u043B\u044E\u0447 \u0437\u0430\u0434\u0430\u0447\u0438, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 ATL-42 \u2014 \u0438\u0437 task.key."),
5831
- taskTitle: z37.string().min(1).describe("\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u0437\u0430\u0434\u0430\u0447\u0438 \u2014 \u0438\u0437 task.title."),
5832
- repoRoot: z37.string().min(1).optional().describe("\u041A\u043E\u0440\u0435\u043D\u044C git-\u0440\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u044F. \u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u2014 \u0440\u0430\u0431\u043E\u0447\u0438\u0439 \u043A\u0430\u0442\u0430\u043B\u043E\u0433 \u043F\u0440\u043E\u0435\u043A\u0442\u0430."),
5833
- testsPassed: z37.boolean().optional().describe(
6078
+ defaultBranch: z38.string().min(1).describe("\u041E\u0441\u043D\u043E\u0432\u043D\u0430\u044F \u0432\u0435\u0442\u043A\u0430 \u0440\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u044F \u2014 \u0438\u0437 project.repos[].defaultBranch."),
6079
+ commitPrefix: z38.string().min(1).describe('\u041F\u0440\u0435\u0444\u0438\u043A\u0441 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u043A\u043E\u043C\u043C\u0438\u0442\u0430 \u2014 \u0438\u0437 project.commitPrefix, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 "ATL-42:".'),
6080
+ taskKey: z38.string().min(1).describe("\u041A\u043B\u044E\u0447 \u0437\u0430\u0434\u0430\u0447\u0438, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 ATL-42 \u2014 \u0438\u0437 task.key."),
6081
+ taskTitle: z38.string().min(1).describe("\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u0437\u0430\u0434\u0430\u0447\u0438 \u2014 \u0438\u0437 task.title."),
6082
+ repoRoot: z38.string().min(1).optional().describe("\u041A\u043E\u0440\u0435\u043D\u044C git-\u0440\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u044F. \u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u2014 \u0440\u0430\u0431\u043E\u0447\u0438\u0439 \u043A\u0430\u0442\u0430\u043B\u043E\u0433 \u043F\u0440\u043E\u0435\u043A\u0442\u0430."),
6083
+ testsPassed: z38.boolean().optional().describe(
5834
6084
  "\u041F\u0440\u043E\u0448\u043B\u0438 \u043B\u0438 \u0442\u0435\u0441\u0442\u044B. \u0415\u0441\u043B\u0438 \u043F\u0440\u043E\u0435\u043A\u0442 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0437\u0435\u043B\u0451\u043D\u044B\u0445 \u0442\u0435\u0441\u0442\u043E\u0432, \u0430 \u0437\u0434\u0435\u0441\u044C false \u2014 \u0441\u0434\u0430\u0447\u0430 \u043D\u0435 \u0441\u043E\u0441\u0442\u043E\u0438\u0442\u0441\u044F, \u0438 \u044D\u0442\u043E \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E."
5835
6085
  ),
5836
- requireTestsPassed: z37.boolean().optional().describe("ProjectSettings.requireTests \u043F\u0440\u043E\u0435\u043A\u0442\u0430 \u2014 \u0438\u0437 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430 \u0437\u0430\u0434\u0430\u0447\u0438.")
6086
+ requireTestsPassed: z38.boolean().optional().describe("ProjectSettings.requireTests \u043F\u0440\u043E\u0435\u043A\u0442\u0430 \u2014 \u0438\u0437 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430 \u0437\u0430\u0434\u0430\u0447\u0438.")
5837
6087
  };
5838
6088
  async function submitWorkHandler(args, runtime) {
5839
6089
  const state = readState(runtime.stateFilePath);
@@ -6307,13 +6557,13 @@ function formatConnectResult(result) {
6307
6557
  }
6308
6558
 
6309
6559
  // src/hooks/pre-compact.ts
6310
- import { z as z38 } from "zod";
6311
- var PreCompactInputSchema = z38.object({
6312
- hook_event_name: z38.literal("PreCompact"),
6313
- session_id: z38.string(),
6314
- cwd: z38.string(),
6315
- trigger: z38.enum(["manual", "auto"]),
6316
- custom_instructions: z38.string().nullable()
6560
+ import { z as z39 } from "zod";
6561
+ var PreCompactInputSchema = z39.object({
6562
+ hook_event_name: z39.literal("PreCompact"),
6563
+ session_id: z39.string(),
6564
+ cwd: z39.string(),
6565
+ trigger: z39.enum(["manual", "auto"]),
6566
+ custom_instructions: z39.string().nullable()
6317
6567
  }).passthrough();
6318
6568
  function preCompactHook(_input, state, now = () => (/* @__PURE__ */ new Date()).toISOString()) {
6319
6569
  const lastPreCompact = state.currentTask ? { ...state.currentTask, savedAt: now() } : null;
@@ -6322,14 +6572,14 @@ function preCompactHook(_input, state, now = () => (/* @__PURE__ */ new Date()).
6322
6572
 
6323
6573
  // src/hooks/pre-tool-use.ts
6324
6574
  import { isAbsolute as isAbsolute2, relative as relative2, resolve as resolve3 } from "path";
6325
- import { z as z39 } from "zod";
6326
- var PreToolUseInputSchema = z39.object({
6327
- hook_event_name: z39.literal("PreToolUse"),
6328
- session_id: z39.string(),
6329
- cwd: z39.string(),
6330
- tool_name: z39.string(),
6331
- tool_input: z39.record(z39.string(), z39.unknown()),
6332
- tool_use_id: z39.string()
6575
+ import { z as z40 } from "zod";
6576
+ var PreToolUseInputSchema = z40.object({
6577
+ hook_event_name: z40.literal("PreToolUse"),
6578
+ session_id: z40.string(),
6579
+ cwd: z40.string(),
6580
+ tool_name: z40.string(),
6581
+ tool_input: z40.record(z40.string(), z40.unknown()),
6582
+ tool_use_id: z40.string()
6333
6583
  }).passthrough();
6334
6584
  var NO_TRUST_CACHE_REASON = "\u041A\u044D\u0448 \u043F\u0440\u0430\u0432\u0438\u043B \u0434\u043E\u0432\u0435\u0440\u0438\u044F (TrustRules) \u043F\u0443\u0441\u0442 \u2014 \u043A\u043B\u0438\u0435\u043D\u0442 \u043D\u0438 \u0440\u0430\u0437\u0443 \u043D\u0435 \u043F\u043E\u043B\u0443\u0447\u0430\u043B \u0438\u0445 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (\u043D\u0435\u0442 agent:hello/trust:updated). \u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0438\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0439 \u043F\u0440\u043E\u0444\u0438\u043B\u044C (full/guarded/approve-all) \u0431\u0435\u0437 \u043D\u0435\u0433\u043E \u043D\u0435\u043B\u044C\u0437\u044F, \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u043F\u043E \u043F\u0440\u0430\u0432\u0438\u043B\u0443 \u043F\u0440\u043E\u0435\u043A\u0442\u0430 (fail-closed \u043F\u0440\u0438 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E\u0441\u0442\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \xA710.4 \u0422\u0417) \u043A\u043E\u043C\u0430\u043D\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F. \u041F\u043E\u0434\u043D\u0438\u043C\u0438 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435: `quiel connect` (\u044D\u0442\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0430 \u0438\u043C\u0435\u043D\u043D\u043E \u0434\u043B\u044F \u0442\u0430\u043A\u043E\u0433\u043E \u0441\u043B\u0443\u0447\u0430\u044F, \u0441\u043C. isBootstrapCommand) \u2014 \u043F\u043E\u0441\u043B\u0435 \u0440\u0443\u043A\u043E\u043F\u043E\u0436\u0430\u0442\u0438\u044F \u043F\u0440\u0430\u0432\u0438\u043B\u0430 \u043F\u0440\u0438\u0434\u0443\u0442, \u0438 \u043A\u043E\u043C\u0430\u043D\u0434\u044B \u043D\u0430\u0447\u043D\u0443\u0442 \u043F\u0440\u043E\u0445\u043E\u0434\u0438\u0442\u044C. \u0415\u0441\u043B\u0438 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044C, \u0432\u044B\u0437\u043E\u0432\u0438 request_approval.";
6335
6585
  var BOOTSTRAP_COMMAND_RE = /^quiel\s+(connect|status)\b/;
@@ -6474,7 +6724,7 @@ function handleFileWrite(input, state, now) {
6474
6724
  }
6475
6725
 
6476
6726
  // src/hooks/run.ts
6477
- import { z as z43 } from "zod";
6727
+ import { z as z44 } from "zod";
6478
6728
 
6479
6729
  // src/usage/read.ts
6480
6730
  import { closeSync, openSync, readSync, statSync } from "fs";
@@ -6561,13 +6811,13 @@ function readNewUsage(transcriptPath, offset) {
6561
6811
  }
6562
6812
 
6563
6813
  // src/hooks/session-start.ts
6564
- import { z as z40 } from "zod";
6565
- var SessionStartInputSchema = z40.object({
6566
- hook_event_name: z40.literal("SessionStart"),
6567
- session_id: z40.string(),
6568
- cwd: z40.string(),
6569
- source: z40.enum(["startup", "resume", "clear", "compact", "fork"]),
6570
- model: z40.string().optional()
6814
+ import { z as z41 } from "zod";
6815
+ var SessionStartInputSchema = z41.object({
6816
+ hook_event_name: z41.literal("SessionStart"),
6817
+ session_id: z41.string(),
6818
+ cwd: z41.string(),
6819
+ source: z41.enum(["startup", "resume", "clear", "compact", "fork"]),
6820
+ model: z41.string().optional()
6571
6821
  }).passthrough();
6572
6822
  var SESSION_RESET_SOURCES = /* @__PURE__ */ new Set([
6573
6823
  "startup",
@@ -6606,13 +6856,13 @@ function sessionStartHook(input, state) {
6606
6856
  }
6607
6857
 
6608
6858
  // src/hooks/stop.ts
6609
- import { z as z41 } from "zod";
6610
- var StopInputSchema = z41.object({
6611
- hook_event_name: z41.literal("Stop"),
6612
- session_id: z41.string(),
6613
- cwd: z41.string(),
6614
- stop_hook_active: z41.boolean(),
6615
- last_assistant_message: z41.string().optional()
6859
+ import { z as z42 } from "zod";
6860
+ var StopInputSchema = z42.object({
6861
+ hook_event_name: z42.literal("Stop"),
6862
+ session_id: z42.string(),
6863
+ cwd: z42.string(),
6864
+ stop_hook_active: z42.boolean(),
6865
+ last_assistant_message: z42.string().optional()
6616
6866
  }).passthrough();
6617
6867
  function taskLabel(state) {
6618
6868
  if (!state.currentTask) return "";
@@ -6656,8 +6906,8 @@ function stopHook(input, state) {
6656
6906
  }
6657
6907
 
6658
6908
  // src/hooks/stop-failure.ts
6659
- import { z as z42 } from "zod";
6660
- var StopFailureErrorTypeSchema = z42.enum([
6909
+ import { z as z43 } from "zod";
6910
+ var StopFailureErrorTypeSchema = z43.enum([
6661
6911
  "rate_limit",
6662
6912
  "overloaded",
6663
6913
  "authentication_failed",
@@ -6670,13 +6920,13 @@ var StopFailureErrorTypeSchema = z42.enum([
6670
6920
  "max_output_tokens",
6671
6921
  "unknown"
6672
6922
  ]);
6673
- var StopFailureInputSchema = z42.object({
6674
- hook_event_name: z42.literal("StopFailure"),
6675
- session_id: z42.string(),
6676
- cwd: z42.string(),
6923
+ var StopFailureInputSchema = z43.object({
6924
+ hook_event_name: z43.literal("StopFailure"),
6925
+ session_id: z43.string(),
6926
+ cwd: z43.string(),
6677
6927
  error: StopFailureErrorTypeSchema,
6678
- error_details: z42.unknown().optional(),
6679
- last_assistant_message: z42.string().optional()
6928
+ error_details: z43.unknown().optional(),
6929
+ last_assistant_message: z43.string().optional()
6680
6930
  }).passthrough();
6681
6931
  function extractRetryAfterSec(errorDetails) {
6682
6932
  if (typeof errorDetails === "number" && Number.isFinite(errorDetails) && errorDetails >= 0) {
@@ -6705,7 +6955,7 @@ function stopFailureHook(input, _state) {
6705
6955
  }
6706
6956
 
6707
6957
  // src/hooks/run.ts
6708
- var HookInputSchema = z43.discriminatedUnion("hook_event_name", [
6958
+ var HookInputSchema = z44.discriminatedUnion("hook_event_name", [
6709
6959
  SessionStartInputSchema,
6710
6960
  StopInputSchema,
6711
6961
  StopFailureInputSchema,
@@ -6857,13 +7107,13 @@ var FIELD_PROMPTS = {
6857
7107
  async function askAgentKind(options, prompter, interactive, cwd) {
6858
7108
  const fromFlag = options.agent?.trim();
6859
7109
  if (fromFlag && fromFlag.length > 0) {
6860
- const kind = agentKindFromCliKey(fromFlag);
6861
- if (!kind) {
7110
+ const kind2 = agentKindFromCliKey(fromFlag);
7111
+ if (!kind2) {
6862
7112
  throw new Error(
6863
7113
  `\u041D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 --agent: ${fromFlag}. \u0414\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u043E: ${agentKindCliKeys().join(", ")}.`
6864
7114
  );
6865
7115
  }
6866
- return kind;
7116
+ return kind2;
6867
7117
  }
6868
7118
  if (!interactive) return DEFAULT_AGENT_KIND;
6869
7119
  const detected = detectAgentKinds((relative3) => existsSync10(join10(cwd, relative3)));
@@ -7065,9 +7315,9 @@ async function getStatus(options = {}, deps = {}) {
7065
7315
  reachability
7066
7316
  };
7067
7317
  }
7068
- function describeAgentKindLine(kind) {
7069
- const info = describeAgentKind(kind);
7070
- if (!info) return `${kind} (\u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u044B\u0439 \u0430\u0433\u0435\u043D\u0442 \u2014 \u043A\u043B\u0438\u0435\u043D\u0442 \u043D\u043E\u0432\u0435\u0435 \u0440\u0435\u0435\u0441\u0442\u0440\u0430?)`;
7318
+ function describeAgentKindLine(kind2) {
7319
+ const info = describeAgentKind(kind2);
7320
+ if (!info) return `${kind2} (\u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u044B\u0439 \u0430\u0433\u0435\u043D\u0442 \u2014 \u043A\u043B\u0438\u0435\u043D\u0442 \u043D\u043E\u0432\u0435\u0435 \u0440\u0435\u0435\u0441\u0442\u0440\u0430?)`;
7071
7321
  const beta = info.support === "documented" ? ", \u0431\u0435\u0442\u0430: \u0436\u0438\u0432\u044C\u0451\u043C \u043D\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u0435\u043D\u043E" : "";
7072
7322
  return `${info.label} \u2014 ${info.vendor}${beta}`;
7073
7323
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quiel/cli",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
4
  "description": "CLI и MCP-сервер Quiel: подключает агента участника (Claude Code, Codex, Cursor, OpenCode) к платформе",
5
5
  "homepage": "https://quiel.app",
6
6
  "repository": {