@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.
- package/dist/cli.js +417 -167
- 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/
|
|
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
|
|
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
|
|
3026
|
-
var HookCommandEntrySchema =
|
|
3027
|
-
type:
|
|
3028
|
-
command:
|
|
3029
|
-
timeout:
|
|
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 =
|
|
3032
|
-
matcher:
|
|
3033
|
-
hooks:
|
|
3281
|
+
var HookMatcherGroupSchema = z29.object({
|
|
3282
|
+
matcher: z29.string().optional(),
|
|
3283
|
+
hooks: z29.array(HookCommandEntrySchema)
|
|
3034
3284
|
}).passthrough();
|
|
3035
|
-
var McpServerEntrySchema =
|
|
3036
|
-
command:
|
|
3037
|
-
args:
|
|
3285
|
+
var McpServerEntrySchema = z29.object({
|
|
3286
|
+
command: z29.string().min(1),
|
|
3287
|
+
args: z29.array(z29.string()).optional()
|
|
3038
3288
|
}).passthrough();
|
|
3039
|
-
var ClaudeSettingsSchema =
|
|
3040
|
-
mcpServers:
|
|
3041
|
-
hooks:
|
|
3042
|
-
env:
|
|
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
|
|
3397
|
+
import { z as z30 } from "zod";
|
|
3148
3398
|
var STATE_SCHEMA_VERSION = 1;
|
|
3149
|
-
var CurrentTaskSchema =
|
|
3150
|
-
taskId:
|
|
3399
|
+
var CurrentTaskSchema = z30.object({
|
|
3400
|
+
taskId: z30.string().min(1),
|
|
3151
3401
|
/** Человекочитаемый ключ вроде `REL-42` — для текста в хуках. Необязателен: на первых порах может быть неизвестен. */
|
|
3152
|
-
taskKey:
|
|
3153
|
-
resumeToken:
|
|
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:
|
|
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:
|
|
3182
|
-
});
|
|
3183
|
-
var TrustCacheSchema =
|
|
3184
|
-
profileKey:
|
|
3185
|
-
updatedAt:
|
|
3186
|
-
rules:
|
|
3187
|
-
bash:
|
|
3188
|
-
mode:
|
|
3189
|
-
stopPatterns:
|
|
3190
|
-
allowPatterns:
|
|
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:
|
|
3193
|
-
mode:
|
|
3194
|
-
protectedPaths:
|
|
3442
|
+
files: z30.object({
|
|
3443
|
+
mode: z30.enum(["allow", "approve"]),
|
|
3444
|
+
protectedPaths: z30.array(z30.string()).default([])
|
|
3195
3445
|
}).optional(),
|
|
3196
|
-
git:
|
|
3197
|
-
network:
|
|
3198
|
-
approvalTtlMin:
|
|
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 =
|
|
3202
|
-
token:
|
|
3203
|
-
command:
|
|
3204
|
-
cwd:
|
|
3205
|
-
expiresAt:
|
|
3206
|
-
createdAt:
|
|
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 =
|
|
3209
|
-
command:
|
|
3210
|
-
cwd:
|
|
3211
|
-
createdAt:
|
|
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 =
|
|
3463
|
+
var AgentModeSchema = z30.enum([AgentMode.AUTONOMOUS, AgentMode.MANUAL]);
|
|
3214
3464
|
var DEFAULT_CONTEXT_RESET_AFTER_TASKS = ProjectSettingsSchema.parse({}).contextResetAfterTasks;
|
|
3215
|
-
var ClientStateSchema =
|
|
3216
|
-
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:
|
|
3470
|
+
tasksCompletedInSession: z30.number().int().nonnegative().default(0),
|
|
3221
3471
|
/** Кэш `ProjectSettings.contextResetAfterTasks` (§7.2 ТЗ) — сколько задач подряд можно сдать, прежде чем `Stop`-хук попросит `/clear`. */
|
|
3222
|
-
contextResetAfterTasks:
|
|
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:
|
|
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:
|
|
3478
|
+
approvedCommands: z30.record(z30.string(), ApprovedCommandSchema).default({}),
|
|
3229
3479
|
/** Незавершённые запросы подтверждения, ключ — `approvalId`. См. `PendingApprovalSchema`. */
|
|
3230
|
-
pendingApprovals:
|
|
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:
|
|
3493
|
+
usageOffsets: z30.record(z30.string(), z30.number().int().nonnegative()).default({}),
|
|
3244
3494
|
/** Штамп последней записи файла — выставляется в state/store.ts при каждом `writeState`. */
|
|
3245
|
-
updatedAt:
|
|
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
|
|
3547
|
+
import { z as z31 } from "zod";
|
|
3298
3548
|
var PROJECT_CONFIG_SCHEMA_VERSION = 1;
|
|
3299
|
-
var ProjectConfigSchema =
|
|
3300
|
-
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
3591
|
+
worktrees: z31.enum(["isolated", "checkout"]).default("isolated")
|
|
3342
3592
|
});
|
|
3343
|
-
var CredentialsEntrySchema =
|
|
3344
|
-
url:
|
|
3345
|
-
token:
|
|
3346
|
-
projectKey:
|
|
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:
|
|
3598
|
+
savedAt: z31.string()
|
|
3349
3599
|
});
|
|
3350
3600
|
var CREDENTIALS_SCHEMA_VERSION = 1;
|
|
3351
|
-
var CredentialsFileSchema =
|
|
3352
|
-
version:
|
|
3353
|
-
agents:
|
|
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
|
|
3435
|
-
var McpServerEntrySchema2 =
|
|
3436
|
-
command:
|
|
3437
|
-
args:
|
|
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 =
|
|
3440
|
-
mcpServers:
|
|
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
|
|
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 =
|
|
3633
|
-
hooks:
|
|
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
|
|
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 =
|
|
3687
|
-
var CursorHooksFileSchema =
|
|
3688
|
-
version:
|
|
3689
|
-
hooks:
|
|
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 =
|
|
3692
|
-
mcpServers:
|
|
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
|
|
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 =
|
|
3807
|
-
$schema:
|
|
3808
|
-
mcp:
|
|
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(
|
|
3854
|
-
const name = VERSION_ENV[
|
|
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
|
|
3867
|
-
function installerFor(
|
|
3868
|
-
const installer =
|
|
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 ${
|
|
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
|
|
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 =
|
|
3983
|
-
var CursorStopInputSchema =
|
|
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 =
|
|
3990
|
-
directory:
|
|
3991
|
-
input:
|
|
3992
|
-
output:
|
|
3993
|
-
event:
|
|
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.
|
|
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
|
|
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:
|
|
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
|
|
6073
|
+
import { z as z38 } from "zod";
|
|
5824
6074
|
var submitWorkInputShape = {
|
|
5825
|
-
branchName:
|
|
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:
|
|
5829
|
-
commitPrefix:
|
|
5830
|
-
taskKey:
|
|
5831
|
-
taskTitle:
|
|
5832
|
-
repoRoot:
|
|
5833
|
-
testsPassed:
|
|
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:
|
|
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
|
|
6311
|
-
var PreCompactInputSchema =
|
|
6312
|
-
hook_event_name:
|
|
6313
|
-
session_id:
|
|
6314
|
-
cwd:
|
|
6315
|
-
trigger:
|
|
6316
|
-
custom_instructions:
|
|
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
|
|
6326
|
-
var PreToolUseInputSchema =
|
|
6327
|
-
hook_event_name:
|
|
6328
|
-
session_id:
|
|
6329
|
-
cwd:
|
|
6330
|
-
tool_name:
|
|
6331
|
-
tool_input:
|
|
6332
|
-
tool_use_id:
|
|
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
|
|
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
|
|
6565
|
-
var SessionStartInputSchema =
|
|
6566
|
-
hook_event_name:
|
|
6567
|
-
session_id:
|
|
6568
|
-
cwd:
|
|
6569
|
-
source:
|
|
6570
|
-
model:
|
|
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
|
|
6610
|
-
var StopInputSchema =
|
|
6611
|
-
hook_event_name:
|
|
6612
|
-
session_id:
|
|
6613
|
-
cwd:
|
|
6614
|
-
stop_hook_active:
|
|
6615
|
-
last_assistant_message:
|
|
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
|
|
6660
|
-
var StopFailureErrorTypeSchema =
|
|
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 =
|
|
6674
|
-
hook_event_name:
|
|
6675
|
-
session_id:
|
|
6676
|
-
cwd:
|
|
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:
|
|
6679
|
-
last_assistant_message:
|
|
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 =
|
|
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
|
|
6861
|
-
if (!
|
|
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
|
|
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(
|
|
7069
|
-
const info = describeAgentKind(
|
|
7070
|
-
if (!info) return `${
|
|
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