@quiel/cli 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +1043 -654
- package/package.json +11 -2
package/dist/cli.js
CHANGED
|
@@ -9,7 +9,7 @@ import { join } from "path";
|
|
|
9
9
|
var QUIEL_CLAUDE_MD_HEADING = "## Quiel \u2014 \u0440\u0435\u0436\u0438\u043C \u0430\u0433\u0435\u043D\u0442\u0430";
|
|
10
10
|
var SECTION_BODY = `\u041A\u043E\u0433\u0434\u0430 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u043F\u0440\u043E\u0441\u0438\u0442 \xAB\u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0440\u0435\u0436\u0438\u043C \u0430\u0433\u0435\u043D\u0442\u0430\xBB, \u0432\u044B\u0437\u043E\u0432\u0438 \`set_mode(auto)\`, \u0437\u0430\u0442\u0435\u043C \`next_task\`.
|
|
11
11
|
\u0414\u043B\u044F \u043A\u0430\u0436\u0434\u043E\u0439 \u0437\u0430\u0434\u0430\u0447\u0438:
|
|
12
|
-
1. \u0412\u044B\u0437\u043E\u0432\u0438 \`get_context\` \u0438 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043C\u043E\u0441\u0442\u0438/\u0432\u043E\u043F\u0440\u043E\u0441\u044B.
|
|
12
|
+
1. \u0412\u044B\u0437\u043E\u0432\u0438 \`get_context\` \u0438 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043C\u043E\u0441\u0442\u0438/\u0432\u043E\u043F\u0440\u043E\u0441\u044B. \u0415\u0441\u043B\u0438 \u0443 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430 \u043F\u0443\u0441\u0442\u043E\u0439 \`contentMd\`, \u043D\u043E \u0437\u0430\u043F\u043E\u043B\u043D\u0435\u043D \`file\` \u2014 \u0441\u043F\u0435\u0446\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044F \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D\u0430 \u0444\u0430\u0439\u043B\u043E\u043C: \u0441\u043A\u0430\u0447\u0430\u0439 \`file.downloadUrl\` \u0438 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0439 \u0435\u0433\u043E.
|
|
13
13
|
2. \`next_task\` \u043D\u0430\u0437\u044B\u0432\u0430\u0435\u0442 \u0440\u0430\u0431\u043E\u0447\u0438\u0439 \u043A\u0430\u0442\u0430\u043B\u043E\u0433 \u0437\u0430\u0434\u0430\u0447\u0438 \u2014 \u0432\u043E\u0439\u0434\u0438 \u0432 \u043D\u0435\u0433\u043E \u0447\u0435\u0440\u0435\u0437 \`EnterWorktree\` \u0438 \u0440\u0430\u0431\u043E\u0442\u0430\u0439 \u0442\u043E\u043B\u044C\u043A\u043E \u0442\u0430\u043C. \u0421\u0432\u043E\u0439 git worktree \u041D\u0415 \u0441\u043E\u0437\u0434\u0430\u0432\u0430\u0439: \u043E\u043D \u0443\u0436\u0435 \u0441\u043E\u0437\u0434\u0430\u043D \u043D\u0430 \u0432\u0435\u0442\u043A\u0435 \`project.branchName\`, \u0430 \u0432\u0442\u043E\u0440\u043E\u0439 \u0440\u0430\u0437\u043E\u0448\u0451\u043B\u0441\u044F \u0431\u044B \u0441 \u0442\u0435\u043C, \u043E\u0442\u043A\u0443\u0434\u0430 \`submit_work\` \u0431\u0435\u0440\u0451\u0442 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F.
|
|
14
14
|
3. \u0414\u0435\u043B\u0435\u0433\u0438\u0440\u0443\u0439 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 \u0441\u0443\u0431\u0430\u0433\u0435\u043D\u0442\u0443, \u043F\u0435\u0440\u0435\u0434\u0430\u0432 \u043F\u043E\u043B\u043D\u044B\u0439 TaskPayload. \u0421\u0430\u043C \u043D\u0435 \u043F\u0438\u0448\u0438 \u043A\u043E\u0434 \u0432 \u0433\u043B\u0430\u0432\u043D\u043E\u0439 \u0441\u0435\u0441\u0441\u0438\u0438.
|
|
15
15
|
4. \u0415\u0441\u043B\u0438 \u0447\u0435\u0433\u043E-\u0442\u043E \u043D\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043E\u0442 \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0430 \u2014 \`ask_human(blocking=true)\`. \u0415\u0441\u043B\u0438 \u043D\u0443\u0436\u043D\u0430 \u0440\u0430\u0431\u043E\u0442\u0430 \u0434\u0440\u0443\u0433\u043E\u0439 \u0440\u043E\u043B\u0438 \u2014 \`create_task\`.
|
|
@@ -267,6 +267,30 @@ var maskKeyValue = maskValueGroup(KEY_VALUE_RE);
|
|
|
267
267
|
var maskFlagSpace = maskValueGroup(FLAG_SPACE_RE);
|
|
268
268
|
var maskAuthHeader = maskValueGroup(AUTH_HEADER_RE);
|
|
269
269
|
|
|
270
|
+
// ../shared/src/docs/links.ts
|
|
271
|
+
var DocsPage = {
|
|
272
|
+
START: "start",
|
|
273
|
+
ACCESS: "access",
|
|
274
|
+
TASKS: "tasks",
|
|
275
|
+
AGENTS: "agents",
|
|
276
|
+
INTERACTION: "interaction",
|
|
277
|
+
SECURITY: "security",
|
|
278
|
+
GITHUB: "github",
|
|
279
|
+
SETTINGS: "settings",
|
|
280
|
+
REFERENCE: "reference"
|
|
281
|
+
};
|
|
282
|
+
var DOCS_PATHS = {
|
|
283
|
+
[DocsPage.START]: "/docs",
|
|
284
|
+
[DocsPage.ACCESS]: "/docs/access",
|
|
285
|
+
[DocsPage.TASKS]: "/docs/tasks",
|
|
286
|
+
[DocsPage.AGENTS]: "/docs/agents",
|
|
287
|
+
[DocsPage.INTERACTION]: "/docs/collaboration",
|
|
288
|
+
[DocsPage.SECURITY]: "/docs/security",
|
|
289
|
+
[DocsPage.GITHUB]: "/docs/github",
|
|
290
|
+
[DocsPage.SETTINGS]: "/docs/settings",
|
|
291
|
+
[DocsPage.REFERENCE]: "/docs/reference"
|
|
292
|
+
};
|
|
293
|
+
|
|
270
294
|
// ../shared/src/dto/agent.ts
|
|
271
295
|
import { z as z5 } from "zod";
|
|
272
296
|
|
|
@@ -363,6 +387,11 @@ var GitMode = {
|
|
|
363
387
|
DIRECT: "DIRECT",
|
|
364
388
|
PR: "PR"
|
|
365
389
|
};
|
|
390
|
+
var GitProvider = {
|
|
391
|
+
GITHUB: "GITHUB",
|
|
392
|
+
GITLAB: "GITLAB",
|
|
393
|
+
GENERIC: "GENERIC"
|
|
394
|
+
};
|
|
366
395
|
var DocumentKind = {
|
|
367
396
|
SPEC: "SPEC",
|
|
368
397
|
PLAN: "PLAN",
|
|
@@ -530,14 +559,51 @@ var OrganizationMembersListItemSchema = z9.discriminatedUnion("type", [
|
|
|
530
559
|
OrganizationInvitationDTOSchema
|
|
531
560
|
]);
|
|
532
561
|
|
|
562
|
+
// ../shared/src/dto/profile.ts
|
|
563
|
+
import { z as z10 } from "zod";
|
|
564
|
+
var ProfileNameSchema = z10.string().trim().min(1, "\u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u0438\u043C\u044F").max(120);
|
|
565
|
+
var UpdateProfileSchema = z10.object({
|
|
566
|
+
name: ProfileNameSchema
|
|
567
|
+
});
|
|
568
|
+
var ChangePasswordSchema = z10.object({
|
|
569
|
+
currentPassword: z10.string().min(1).max(200).optional(),
|
|
570
|
+
newPassword: PasswordSchema
|
|
571
|
+
});
|
|
572
|
+
var RequestEmailChangeSchema = z10.object({
|
|
573
|
+
newEmail: EmailSchema,
|
|
574
|
+
/** Нужен, если у аккаунта есть пароль — см. `ChangePasswordSchema`. */
|
|
575
|
+
currentPassword: z10.string().min(1).max(200).optional()
|
|
576
|
+
});
|
|
577
|
+
var ConfirmEmailChangeSchema = z10.object({
|
|
578
|
+
token: z10.string().min(1)
|
|
579
|
+
});
|
|
580
|
+
var UpdateAvatarSchema = z10.object({
|
|
581
|
+
fileKey: z10.string().min(1).max(500)
|
|
582
|
+
});
|
|
583
|
+
var ALLOWED_AVATAR_MIME_TYPES = [
|
|
584
|
+
"image/jpeg",
|
|
585
|
+
"image/png",
|
|
586
|
+
"image/webp",
|
|
587
|
+
"image/gif"
|
|
588
|
+
];
|
|
589
|
+
var MAX_AVATAR_FILE_SIZE_BYTES = 2 * 1024 * 1024;
|
|
590
|
+
var RequestAvatarUploadUrlSchema = z10.object({
|
|
591
|
+
fileName: z10.string().trim().min(1).max(200),
|
|
592
|
+
mimeType: z10.enum(ALLOWED_AVATAR_MIME_TYPES),
|
|
593
|
+
size: z10.number().int().positive().max(MAX_AVATAR_FILE_SIZE_BYTES)
|
|
594
|
+
});
|
|
595
|
+
var UnlinkAccountSchema = z10.object({
|
|
596
|
+
provider: z10.string().trim().min(1).max(50)
|
|
597
|
+
});
|
|
598
|
+
|
|
533
599
|
// ../shared/src/dto/project.ts
|
|
534
|
-
import { z as
|
|
600
|
+
import { z as z14 } from "zod";
|
|
535
601
|
|
|
536
602
|
// ../shared/src/settings/project-settings.ts
|
|
537
|
-
import { z as
|
|
603
|
+
import { z as z13 } from "zod";
|
|
538
604
|
|
|
539
605
|
// ../shared/src/dto/task-template.ts
|
|
540
|
-
import { z as
|
|
606
|
+
import { z as z12 } from "zod";
|
|
541
607
|
|
|
542
608
|
// ../shared/src/enums/task.ts
|
|
543
609
|
var TaskType = {
|
|
@@ -595,42 +661,42 @@ var EventKind = {
|
|
|
595
661
|
};
|
|
596
662
|
|
|
597
663
|
// ../shared/src/dto/task.ts
|
|
598
|
-
import { z as
|
|
664
|
+
import { z as z11 } from "zod";
|
|
599
665
|
var taskTypeValues = Object.values(TaskType);
|
|
600
666
|
var taskStatusValues = Object.values(TaskStatus);
|
|
601
667
|
var priorityValues = Object.values(Priority);
|
|
602
668
|
var executorValues = Object.values(Executor);
|
|
603
669
|
var testResultValues = Object.values(TestResult);
|
|
604
|
-
var TaskTypeSchema =
|
|
605
|
-
var TaskStatusSchema =
|
|
606
|
-
var TaskPrioritySchema =
|
|
607
|
-
var TaskExecutorSchema =
|
|
608
|
-
var TaskTestResultSchema =
|
|
609
|
-
var TaskTitleSchema =
|
|
610
|
-
var TaskDescriptionSchema =
|
|
611
|
-
var TaskLabelSchema =
|
|
612
|
-
var TaskLabelsSchema =
|
|
613
|
-
var TaskMetadataSchema =
|
|
614
|
-
var TaskAcceptanceSchema =
|
|
615
|
-
var TaskEstimateMinSchema =
|
|
616
|
-
var TaskOrderSchema =
|
|
617
|
-
var TaskResultMdSchema =
|
|
618
|
-
var TaskResultLinkKindSchema =
|
|
619
|
-
var TaskResultLinkSchema =
|
|
670
|
+
var TaskTypeSchema = z11.enum(taskTypeValues);
|
|
671
|
+
var TaskStatusSchema = z11.enum(taskStatusValues);
|
|
672
|
+
var TaskPrioritySchema = z11.enum(priorityValues);
|
|
673
|
+
var TaskExecutorSchema = z11.enum(executorValues);
|
|
674
|
+
var TaskTestResultSchema = z11.enum(testResultValues);
|
|
675
|
+
var TaskTitleSchema = z11.string().trim().min(1, "\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E").max(300, "\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0434\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u043D\u0435 \u0434\u043B\u0438\u043D\u043D\u0435\u0435 300 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432");
|
|
676
|
+
var TaskDescriptionSchema = z11.string().max(5e4, "\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u0434\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u043D\u0435 \u0434\u043B\u0438\u043D\u043D\u0435\u0435 50000 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432");
|
|
677
|
+
var TaskLabelSchema = z11.string().trim().min(1).max(40, "\u041C\u0435\u0442\u043A\u0430 \u0434\u043E\u043B\u0436\u043D\u0430 \u0431\u044B\u0442\u044C \u043D\u0435 \u0434\u043B\u0438\u043D\u043D\u0435\u0435 40 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432");
|
|
678
|
+
var TaskLabelsSchema = z11.array(TaskLabelSchema).max(30, "\u041D\u0435 \u0431\u043E\u043B\u044C\u0448\u0435 30 \u043C\u0435\u0442\u043E\u043A");
|
|
679
|
+
var TaskMetadataSchema = z11.record(z11.string(), z11.unknown());
|
|
680
|
+
var TaskAcceptanceSchema = z11.string().max(2e4, "\u041A\u0440\u0438\u0442\u0435\u0440\u0438\u0438 \u043F\u0440\u0438\u0451\u043C\u043A\u0438 \u0434\u043E\u043B\u0436\u043D\u044B \u0431\u044B\u0442\u044C \u043D\u0435 \u0434\u043B\u0438\u043D\u043D\u0435\u0435 20000 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432");
|
|
681
|
+
var TaskEstimateMinSchema = z11.number().int("\u041E\u0446\u0435\u043D\u043A\u0430 \u2014 \u0446\u0435\u043B\u043E\u0435 \u0447\u0438\u0441\u043B\u043E \u043C\u0438\u043D\u0443\u0442").positive("\u041E\u0446\u0435\u043D\u043A\u0430 \u0434\u043E\u043B\u0436\u043D\u0430 \u0431\u044B\u0442\u044C \u043F\u043E\u043B\u043E\u0436\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0439").max(1e5);
|
|
682
|
+
var TaskOrderSchema = z11.number().finite("order \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043A\u043E\u043D\u0435\u0447\u043D\u044B\u043C \u0447\u0438\u0441\u043B\u043E\u043C");
|
|
683
|
+
var TaskResultMdSchema = z11.string().max(5e4);
|
|
684
|
+
var TaskResultLinkKindSchema = z11.enum(["pr", "commit", "url"]);
|
|
685
|
+
var TaskResultLinkSchema = z11.object({
|
|
620
686
|
kind: TaskResultLinkKindSchema,
|
|
621
|
-
url:
|
|
622
|
-
label:
|
|
687
|
+
url: z11.string().url("\u041D\u0435\u043A\u043E\u0440\u0440\u0435\u043A\u0442\u043D\u044B\u0439 URL"),
|
|
688
|
+
label: z11.string().max(200).optional()
|
|
623
689
|
});
|
|
624
|
-
var TaskResultLinksSchema =
|
|
625
|
-
var TaskLastErrorSchema =
|
|
626
|
-
var IdSchema =
|
|
627
|
-
var CreateTaskSchema =
|
|
690
|
+
var TaskResultLinksSchema = z11.array(TaskResultLinkSchema).max(50);
|
|
691
|
+
var TaskLastErrorSchema = z11.string().max(5e3);
|
|
692
|
+
var IdSchema = z11.string().min(1);
|
|
693
|
+
var CreateTaskSchema = z11.object({
|
|
628
694
|
title: TaskTitleSchema,
|
|
629
695
|
descriptionMd: TaskDescriptionSchema.default(""),
|
|
630
696
|
type: TaskTypeSchema.default(TaskType.FEATURE),
|
|
631
697
|
priority: TaskPrioritySchema.default(Priority.P2),
|
|
632
698
|
executor: TaskExecutorSchema.default(Executor.ANY),
|
|
633
|
-
roleKey:
|
|
699
|
+
roleKey: z11.string().min(1).max(60).optional(),
|
|
634
700
|
assigneeId: IdSchema.optional(),
|
|
635
701
|
milestoneId: IdSchema.optional(),
|
|
636
702
|
parentId: IdSchema.optional(),
|
|
@@ -638,19 +704,19 @@ var CreateTaskSchema = z10.object({
|
|
|
638
704
|
metadata: TaskMetadataSchema.default({}),
|
|
639
705
|
acceptance: TaskAcceptanceSchema.optional(),
|
|
640
706
|
estimateMin: TaskEstimateMinSchema.optional(),
|
|
641
|
-
dueAt:
|
|
707
|
+
dueAt: z11.coerce.date().optional(),
|
|
642
708
|
/** Позиция в колонке BACKLOG; если не передан — сервер ставит в конец (apps/web/src/lib/tasks/order.ts). */
|
|
643
709
|
order: TaskOrderSchema.optional()
|
|
644
710
|
});
|
|
645
|
-
var UpdateTaskSchema =
|
|
711
|
+
var UpdateTaskSchema = z11.object({
|
|
646
712
|
title: TaskTitleSchema.optional(),
|
|
647
713
|
descriptionMd: TaskDescriptionSchema.optional(),
|
|
648
714
|
type: TaskTypeSchema.optional(),
|
|
649
715
|
status: TaskStatusSchema.optional(),
|
|
650
|
-
statusComment:
|
|
716
|
+
statusComment: z11.string().max(2e4).optional(),
|
|
651
717
|
priority: TaskPrioritySchema.optional(),
|
|
652
718
|
executor: TaskExecutorSchema.optional(),
|
|
653
|
-
roleKey:
|
|
719
|
+
roleKey: z11.string().min(1).max(60).nullable().optional(),
|
|
654
720
|
assigneeId: IdSchema.nullable().optional(),
|
|
655
721
|
milestoneId: IdSchema.nullable().optional(),
|
|
656
722
|
parentId: IdSchema.nullable().optional(),
|
|
@@ -658,7 +724,7 @@ var UpdateTaskSchema = z10.object({
|
|
|
658
724
|
metadata: TaskMetadataSchema.optional(),
|
|
659
725
|
acceptance: TaskAcceptanceSchema.nullable().optional(),
|
|
660
726
|
estimateMin: TaskEstimateMinSchema.nullable().optional(),
|
|
661
|
-
dueAt:
|
|
727
|
+
dueAt: z11.coerce.date().nullable().optional(),
|
|
662
728
|
order: TaskOrderSchema.optional(),
|
|
663
729
|
resultMd: TaskResultMdSchema.nullable().optional(),
|
|
664
730
|
resultLinks: TaskResultLinksSchema.nullable().optional(),
|
|
@@ -669,55 +735,55 @@ var UpdateTaskSchema = z10.object({
|
|
|
669
735
|
});
|
|
670
736
|
var TASK_LIST_DEFAULT_LIMIT = 25;
|
|
671
737
|
var TASK_LIST_MAX_LIMIT = 100;
|
|
672
|
-
var TaskListQuerySchema =
|
|
673
|
-
status:
|
|
674
|
-
role:
|
|
675
|
-
assignee:
|
|
676
|
-
milestone:
|
|
677
|
-
label:
|
|
738
|
+
var TaskListQuerySchema = z11.object({
|
|
739
|
+
status: z11.string().max(500).optional(),
|
|
740
|
+
role: z11.string().max(500).optional(),
|
|
741
|
+
assignee: z11.string().max(500).optional(),
|
|
742
|
+
milestone: z11.string().max(500).optional(),
|
|
743
|
+
label: z11.string().max(500).optional(),
|
|
678
744
|
// §16.3 ТЗ перечисляет приоритет и тип среди фильтров доски и списка.
|
|
679
745
|
// Без них интерфейсу пришлось бы фильтровать уже загруженную страницу —
|
|
680
746
|
// на проекте крупнее одной страницы это даёт неверный результат.
|
|
681
|
-
priority:
|
|
682
|
-
type:
|
|
683
|
-
q:
|
|
684
|
-
cursor:
|
|
685
|
-
limit:
|
|
686
|
-
});
|
|
687
|
-
var BulkTaskIdsSchema =
|
|
688
|
-
var BulkTaskActionSchema =
|
|
689
|
-
|
|
690
|
-
action:
|
|
747
|
+
priority: z11.string().max(100).optional(),
|
|
748
|
+
type: z11.string().max(200).optional(),
|
|
749
|
+
q: z11.string().trim().max(200).optional(),
|
|
750
|
+
cursor: z11.string().max(4e3).optional(),
|
|
751
|
+
limit: z11.coerce.number().int().min(1).max(TASK_LIST_MAX_LIMIT).default(TASK_LIST_DEFAULT_LIMIT)
|
|
752
|
+
});
|
|
753
|
+
var BulkTaskIdsSchema = z11.array(IdSchema).min(1, "\u041D\u0443\u0436\u043D\u043E \u043F\u0435\u0440\u0435\u0434\u0430\u0442\u044C \u0445\u043E\u0442\u044F \u0431\u044B \u043E\u0434\u043D\u0443 \u0437\u0430\u0434\u0430\u0447\u0443").max(500, "\u041D\u0435 \u0431\u043E\u043B\u044C\u0448\u0435 500 \u0437\u0430\u0434\u0430\u0447 \u0437\u0430 \u043E\u0434\u0438\u043D \u0437\u0430\u043F\u0440\u043E\u0441");
|
|
754
|
+
var BulkTaskActionSchema = z11.discriminatedUnion("action", [
|
|
755
|
+
z11.object({
|
|
756
|
+
action: z11.literal("status"),
|
|
691
757
|
taskIds: BulkTaskIdsSchema,
|
|
692
758
|
status: TaskStatusSchema,
|
|
693
|
-
comment:
|
|
759
|
+
comment: z11.string().max(2e4).optional()
|
|
694
760
|
}),
|
|
695
|
-
|
|
696
|
-
action:
|
|
761
|
+
z11.object({
|
|
762
|
+
action: z11.literal("milestone"),
|
|
697
763
|
taskIds: BulkTaskIdsSchema,
|
|
698
764
|
milestoneId: IdSchema.nullable()
|
|
699
765
|
}),
|
|
700
|
-
|
|
701
|
-
action:
|
|
766
|
+
z11.object({
|
|
767
|
+
action: z11.literal("role"),
|
|
702
768
|
taskIds: BulkTaskIdsSchema,
|
|
703
|
-
roleKey:
|
|
769
|
+
roleKey: z11.string().min(1).max(60).nullable()
|
|
704
770
|
}),
|
|
705
|
-
|
|
706
|
-
action:
|
|
771
|
+
z11.object({
|
|
772
|
+
action: z11.literal("delete"),
|
|
707
773
|
taskIds: BulkTaskIdsSchema
|
|
708
774
|
})
|
|
709
775
|
]);
|
|
710
|
-
var BulkTaskResultItemSchema =
|
|
711
|
-
taskId:
|
|
712
|
-
ok:
|
|
713
|
-
error:
|
|
776
|
+
var BulkTaskResultItemSchema = z11.object({
|
|
777
|
+
taskId: z11.string(),
|
|
778
|
+
ok: z11.boolean(),
|
|
779
|
+
error: z11.object({ code: z11.string(), message: z11.string() }).optional()
|
|
714
780
|
});
|
|
715
781
|
|
|
716
782
|
// ../shared/src/dto/task-template.ts
|
|
717
|
-
var TaskTemplateNameSchema =
|
|
718
|
-
var TaskTemplateSchema =
|
|
783
|
+
var TaskTemplateNameSchema = z12.string().trim().min(1, "\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E").max(100, "\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0434\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u043D\u0435 \u0434\u043B\u0438\u043D\u043D\u0435\u0435 100 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432");
|
|
784
|
+
var TaskTemplateSchema = z12.object({
|
|
719
785
|
/** Генерируется сервером при создании (`crypto.randomUUID()`), не вводится человеком. */
|
|
720
|
-
id:
|
|
786
|
+
id: z12.string().min(1),
|
|
721
787
|
/** Имя шаблона в списке выбора — НЕ заголовок будущей задачи (то поле — `title` ниже). */
|
|
722
788
|
name: TaskTemplateNameSchema,
|
|
723
789
|
type: TaskTypeSchema,
|
|
@@ -731,7 +797,7 @@ var TaskTemplateSchema = z11.object({
|
|
|
731
797
|
descriptionMd: TaskDescriptionSchema.default(""),
|
|
732
798
|
priority: TaskPrioritySchema.default(Priority.P2),
|
|
733
799
|
executor: TaskExecutorSchema.default(Executor.ANY),
|
|
734
|
-
roleKey:
|
|
800
|
+
roleKey: z12.string().min(1).max(60).optional(),
|
|
735
801
|
labels: TaskLabelsSchema.default([]),
|
|
736
802
|
acceptance: TaskAcceptanceSchema.optional(),
|
|
737
803
|
estimateMin: TaskEstimateMinSchema.optional()
|
|
@@ -747,30 +813,69 @@ var TaskTemplateSchema = z11.object({
|
|
|
747
813
|
// метаданные — редкий случай для многоразового шаблона, при
|
|
748
814
|
// необходимости человек добавит их на созданной задаче.
|
|
749
815
|
});
|
|
750
|
-
var TaskTemplatesSchema =
|
|
816
|
+
var TaskTemplatesSchema = z12.array(TaskTemplateSchema).max(50, "\u041D\u0435 \u0431\u043E\u043B\u044C\u0448\u0435 50 \u0448\u0430\u0431\u043B\u043E\u043D\u043E\u0432");
|
|
751
817
|
var TaskTemplateInputSchema = TaskTemplateSchema.omit({ id: true });
|
|
752
818
|
|
|
753
819
|
// ../shared/src/settings/project-settings.ts
|
|
754
820
|
var taskStatusValues2 = Object.values(TaskStatus);
|
|
755
|
-
var TaskStatusSchema2 =
|
|
756
|
-
var BoardSettingsSchema =
|
|
757
|
-
hiddenStatuses:
|
|
758
|
-
mergedColumns:
|
|
759
|
-
});
|
|
760
|
-
var NotificationSettingsSchema =
|
|
761
|
-
telegram:
|
|
762
|
-
email:
|
|
763
|
-
});
|
|
764
|
-
var ProjectSettingsSchema =
|
|
765
|
-
autoAccept:
|
|
766
|
-
requireTests:
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
821
|
+
var TaskStatusSchema2 = z13.enum(taskStatusValues2);
|
|
822
|
+
var BoardSettingsSchema = z13.object({
|
|
823
|
+
hiddenStatuses: z13.array(TaskStatusSchema2).default([]),
|
|
824
|
+
mergedColumns: z13.array(z13.array(TaskStatusSchema2)).default([])
|
|
825
|
+
});
|
|
826
|
+
var NotificationSettingsSchema = z13.object({
|
|
827
|
+
telegram: z13.boolean().default(false),
|
|
828
|
+
email: z13.boolean().default(false)
|
|
829
|
+
});
|
|
830
|
+
var ProjectSettingsSchema = z13.object({
|
|
831
|
+
autoAccept: z13.boolean().default(false),
|
|
832
|
+
requireTests: z13.boolean().default(true),
|
|
833
|
+
/**
|
|
834
|
+
* Не давать человеку принять задачу, пока проверки GitHub по последнему
|
|
835
|
+
* коммиту красные.
|
|
836
|
+
*
|
|
837
|
+
* В §7.2 ТЗ этого поля нет — добавлено по просьбе владельца 10 сентября
|
|
838
|
+
* 2026 («статус проверок → блокировка приёмки»). По духу это то же, что
|
|
839
|
+
* branch protection на стороне GitHub, только для приёмки задачи.
|
|
840
|
+
*
|
|
841
|
+
* **Дефолт `false`.** Включённым по умолчанию оно сломало бы уже
|
|
842
|
+
* работающие проекты: у проекта без подключённого GitHub проверок нет
|
|
843
|
+
* вовсе, и любая приёмка внезапно перестала бы проходить. §22.12 ТЗ
|
|
844
|
+
* велит выбирать более безопасный вариант — здесь безопаснее не менять
|
|
845
|
+
* поведение существующих проектов молча.
|
|
846
|
+
*
|
|
847
|
+
* **Касается только приёмки человеком.** Авто-приёмка по отчёту агента
|
|
848
|
+
* происходит раньше, чем проверки успевают запуститься, а авто-приёмка
|
|
849
|
+
* по merge означает, что GitHub слияние УЖЕ разрешил. Блокировать их
|
|
850
|
+
* значило бы навсегда подвесить задачи. Это записано и в подсказке к
|
|
851
|
+
* настройке — иначе получилось бы обещание, которого настройка не
|
|
852
|
+
* держит.
|
|
853
|
+
*/
|
|
854
|
+
requireGreenChecks: z13.boolean().default(false),
|
|
855
|
+
/**
|
|
856
|
+
* Заводить задачу на ревью, когда для задачи открывается pull request.
|
|
857
|
+
*
|
|
858
|
+
* В §7.2 ТЗ этого поля нет — добавлено по просьбе владельца 10 сентября
|
|
859
|
+
* 2026. Без него открытый PR висит, пока кто-нибудь не заметит: платформа
|
|
860
|
+
* знает о нём, а в списке дел он не появляется.
|
|
861
|
+
*
|
|
862
|
+
* Дефолт `false` по той же причине, что у `requireGreenChecks`: молча
|
|
863
|
+
* начать плодить задачи в уже работающих проектах — не то, чего от
|
|
864
|
+
* обновления ждут.
|
|
865
|
+
*/
|
|
866
|
+
reviewTaskOnPr: z13.boolean().default(false),
|
|
867
|
+
/**
|
|
868
|
+
* Ключ роли, на которую вешается задача ревью (`RoleDefinition.key`).
|
|
869
|
+
* Пусто — задача заводится без роли и видна всей команде проекта.
|
|
870
|
+
*/
|
|
871
|
+
reviewRoleKey: z13.string().trim().min(1).max(60).optional(),
|
|
872
|
+
maxParallelTasksPerAgent: z13.number().int().positive().default(1),
|
|
873
|
+
leaseTtlSec: z13.number().int().positive().default(120),
|
|
874
|
+
taskTimeoutMin: z13.number().int().positive().default(90),
|
|
875
|
+
contextResetAfterTasks: z13.number().int().positive().default(8),
|
|
876
|
+
branchTemplate: z13.string().min(1).default("task/{key}-{slug}"),
|
|
877
|
+
commitTemplate: z13.string().min(1).default("{key}: {title}"),
|
|
878
|
+
stopPatternsOverride: z13.array(z13.string()).optional(),
|
|
774
879
|
notifications: NotificationSettingsSchema.default({ telegram: false, email: false }),
|
|
775
880
|
board: BoardSettingsSchema.default({ hiddenStatuses: [], mergedColumns: [] }),
|
|
776
881
|
// Шаблоны задач (§16.3 ТЗ: «Шаблоны задач по типу (настраиваются в
|
|
@@ -780,55 +885,80 @@ var ProjectSettingsSchema = z12.object({
|
|
|
780
885
|
});
|
|
781
886
|
|
|
782
887
|
// ../shared/src/dto/project.ts
|
|
783
|
-
var ProjectKeySchema =
|
|
784
|
-
var ProjectNameSchema =
|
|
785
|
-
var ProjectDescriptionSchema =
|
|
888
|
+
var ProjectKeySchema = z14.string().min(2, "\u041A\u043B\u044E\u0447 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435 \u043A\u043E\u0440\u043E\u0447\u0435 2 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432").max(8, "\u041A\u043B\u044E\u0447 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435 \u0434\u043B\u0438\u043D\u043D\u0435\u0435 8 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432").regex(/^[A-Z][A-Z0-9]*$/, "\u041A\u043B\u044E\u0447: \u0437\u0430\u0433\u043B\u0430\u0432\u043D\u044B\u0435 \u043B\u0430\u0442\u0438\u043D\u0441\u043A\u0438\u0435 \u0431\u0443\u043A\u0432\u044B \u0438 \u0446\u0438\u0444\u0440\u044B, \u043D\u0430\u0447\u0438\u043D\u0430\u0435\u0442\u0441\u044F \u0441 \u0431\u0443\u043A\u0432\u044B");
|
|
889
|
+
var ProjectNameSchema = z14.string().trim().min(1, "\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E").max(100, "\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0434\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u043D\u0435 \u0434\u043B\u0438\u043D\u043D\u0435\u0435 100 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432");
|
|
890
|
+
var ProjectDescriptionSchema = z14.string().max(5e3, "\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u0434\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u043D\u0435 \u0434\u043B\u0438\u043D\u043D\u0435\u0435 5000 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432");
|
|
786
891
|
var ProjectSettingsRecordSchema = ProjectSettingsSchema.extend({
|
|
787
|
-
autonomousConfirmedAt:
|
|
892
|
+
autonomousConfirmedAt: z14.coerce.date().optional()
|
|
788
893
|
});
|
|
789
894
|
var UpdateProjectSettingsSchema = ProjectSettingsRecordSchema.partial();
|
|
790
|
-
var ProjectModeSchema =
|
|
791
|
-
var ProjectStatusSchema =
|
|
895
|
+
var ProjectModeSchema = z14.enum([ProjectMode.AUTONOMOUS, ProjectMode.APPROVAL]);
|
|
896
|
+
var ProjectStatusSchema = z14.enum([
|
|
792
897
|
ProjectStatus.ACTIVE,
|
|
793
898
|
ProjectStatus.PAUSED,
|
|
794
899
|
ProjectStatus.ARCHIVED
|
|
795
900
|
]);
|
|
796
|
-
var GitModeSchema =
|
|
797
|
-
var
|
|
901
|
+
var GitModeSchema = z14.enum([GitMode.DIRECT, GitMode.PR]);
|
|
902
|
+
var ProjectDateSchema = z14.coerce.date();
|
|
903
|
+
var NewProjectMilestoneSchema = z14.object({
|
|
904
|
+
name: z14.string().trim().min(1, "\u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435").max(200),
|
|
905
|
+
dueAt: ProjectDateSchema.optional()
|
|
906
|
+
});
|
|
907
|
+
var CreateProjectSchema = z14.object({
|
|
798
908
|
name: ProjectNameSchema,
|
|
799
909
|
key: ProjectKeySchema.optional(),
|
|
800
910
|
description: ProjectDescriptionSchema.optional(),
|
|
801
911
|
mode: ProjectModeSchema.default(ProjectMode.APPROVAL),
|
|
802
912
|
gitMode: GitModeSchema.default(GitMode.DIRECT),
|
|
803
|
-
autonomousConfirmed:
|
|
804
|
-
|
|
805
|
-
|
|
913
|
+
autonomousConfirmed: z14.boolean().optional(),
|
|
914
|
+
startAt: ProjectDateSchema.optional(),
|
|
915
|
+
targetAt: ProjectDateSchema.optional(),
|
|
916
|
+
/**
|
|
917
|
+
* Участники проекта — идентификаторы `Membership` в этой организации.
|
|
918
|
+
* Добавляются той же транзакцией, что и сам проект: иначе при сбое
|
|
919
|
+
* второго запроса проект оставался бы без людей, и человек не понял
|
|
920
|
+
* бы, создался он или нет.
|
|
921
|
+
*/
|
|
922
|
+
memberIds: z14.array(z14.string().min(1)).max(100).optional(),
|
|
923
|
+
milestones: z14.array(NewProjectMilestoneSchema).max(50).optional()
|
|
924
|
+
}).refine((data) => !data.startAt || !data.targetAt || data.startAt <= data.targetAt, {
|
|
925
|
+
// Срок раньше начала — почти всегда опечатка в одном из полей, и
|
|
926
|
+
// молча сохранённая, она потом показывается как «просрочен с первого дня».
|
|
927
|
+
message: "\u0414\u0430\u0442\u0430 \u0446\u0435\u043B\u0438 \u0440\u0430\u043D\u044C\u0448\u0435 \u0434\u0430\u0442\u044B \u043D\u0430\u0447\u0430\u043B\u0430",
|
|
928
|
+
path: ["targetAt"]
|
|
929
|
+
});
|
|
930
|
+
var UpdateProjectSchema = z14.object({
|
|
806
931
|
name: ProjectNameSchema.optional(),
|
|
807
932
|
key: ProjectKeySchema.optional(),
|
|
808
933
|
description: ProjectDescriptionSchema.nullable().optional(),
|
|
809
934
|
status: ProjectStatusSchema.optional(),
|
|
810
935
|
mode: ProjectModeSchema.optional(),
|
|
811
936
|
gitMode: GitModeSchema.optional(),
|
|
937
|
+
startAt: ProjectDateSchema.nullable().optional(),
|
|
938
|
+
targetAt: ProjectDateSchema.nullable().optional(),
|
|
812
939
|
settings: UpdateProjectSettingsSchema.optional(),
|
|
813
|
-
autonomousConfirmed:
|
|
940
|
+
autonomousConfirmed: z14.boolean().optional()
|
|
814
941
|
}).refine((data) => Object.keys(data).length > 0, {
|
|
815
942
|
message: "\u041D\u0443\u0436\u043D\u043E \u043F\u0435\u0440\u0435\u0434\u0430\u0442\u044C \u0445\u043E\u0442\u044F \u0431\u044B \u043E\u0434\u043D\u043E \u043F\u043E\u043B\u0435"
|
|
816
943
|
});
|
|
817
944
|
|
|
818
945
|
// ../shared/src/dto/repository.ts
|
|
819
|
-
import { z as
|
|
820
|
-
var RepositoryUrlSchema =
|
|
946
|
+
import { z as z15 } from "zod";
|
|
947
|
+
var RepositoryUrlSchema = z15.string().trim().min(1, "\u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u0430\u0434\u0440\u0435\u0441 \u0440\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u044F").max(500).refine(
|
|
821
948
|
(value) => /^(https?:\/\/|ssh:\/\/|git@)/.test(value),
|
|
822
949
|
"\u0410\u0434\u0440\u0435\u0441 \u0434\u043E\u043B\u0436\u0435\u043D \u043D\u0430\u0447\u0438\u043D\u0430\u0442\u044C\u0441\u044F \u0441 https://, ssh:// \u0438\u043B\u0438 git@"
|
|
950
|
+
).refine(
|
|
951
|
+
(value) => inferGitProvider(value) !== GitProvider.GITHUB,
|
|
952
|
+
"\u0420\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u0438 GitHub \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0430\u044E\u0442\u0441\u044F \u0447\u0435\u0440\u0435\u0437 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u2014 \u0432\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0438\u0437 \u0441\u043F\u0438\u0441\u043A\u0430"
|
|
823
953
|
);
|
|
824
|
-
var DefaultBranchSchema =
|
|
825
|
-
var PathHintSchema =
|
|
826
|
-
var CreateRepositorySchema =
|
|
954
|
+
var DefaultBranchSchema = z15.string().trim().min(1).max(200);
|
|
955
|
+
var PathHintSchema = z15.string().trim().max(300);
|
|
956
|
+
var CreateRepositorySchema = z15.object({
|
|
827
957
|
url: RepositoryUrlSchema,
|
|
828
958
|
defaultBranch: DefaultBranchSchema.optional(),
|
|
829
959
|
pathHint: PathHintSchema.optional()
|
|
830
960
|
});
|
|
831
|
-
var UpdateRepositorySchema =
|
|
961
|
+
var UpdateRepositorySchema = z15.object({
|
|
832
962
|
url: RepositoryUrlSchema.optional(),
|
|
833
963
|
defaultBranch: DefaultBranchSchema.optional(),
|
|
834
964
|
// `null` — «убрать путь», отличается от «поле не прислали».
|
|
@@ -836,41 +966,74 @@ var UpdateRepositorySchema = z14.object({
|
|
|
836
966
|
}).refine((data) => Object.keys(data).length > 0, {
|
|
837
967
|
message: "\u041D\u0443\u0436\u043D\u043E \u043F\u0435\u0440\u0435\u0434\u0430\u0442\u044C \u0445\u043E\u0442\u044F \u0431\u044B \u043E\u0434\u043D\u043E \u043F\u043E\u043B\u0435"
|
|
838
968
|
});
|
|
969
|
+
var ConnectGithubRepositorySchema = z15.object({
|
|
970
|
+
/** Идентификатор НАШЕЙ записи установки, а не номер установки в GitHub. */
|
|
971
|
+
installationId: z15.string().min(1, "\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0430\u043A\u043A\u0430\u0443\u043D\u0442 GitHub"),
|
|
972
|
+
/** `owner/repo` — ровно в том виде, в каком его отдал GitHub. */
|
|
973
|
+
fullName: z15.string().trim().min(3, "\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0440\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u0439").max(300).regex(/^[^/\s]+\/[^/\s]+$/, "\u041E\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044F owner/repo"),
|
|
974
|
+
pathHint: PathHintSchema.optional()
|
|
975
|
+
});
|
|
976
|
+
function extractHost(url) {
|
|
977
|
+
const authority = /^[a-z][a-z0-9+.-]*:\/\/([^/\\?#]*)/i.exec(url)?.[1];
|
|
978
|
+
if (authority === void 0) return void 0;
|
|
979
|
+
const afterUserinfo = authority.slice(authority.lastIndexOf("@") + 1);
|
|
980
|
+
const host = afterUserinfo.replace(/:\d*$/, "");
|
|
981
|
+
return host.length > 0 ? host.toLowerCase() : void 0;
|
|
982
|
+
}
|
|
983
|
+
function inferGitProvider(url) {
|
|
984
|
+
const trimmed = url.trim();
|
|
985
|
+
const scpLike = /^git@([^:/]+):/.exec(trimmed);
|
|
986
|
+
const host = scpLike?.[1] ? scpLike[1].toLowerCase() : extractHost(trimmed);
|
|
987
|
+
if (!host) return GitProvider.GENERIC;
|
|
988
|
+
if (host === "github.com" || host.endsWith(".github.com")) return GitProvider.GITHUB;
|
|
989
|
+
if (host === "gitlab.com" || host.endsWith(".gitlab.com")) return GitProvider.GITLAB;
|
|
990
|
+
return GitProvider.GENERIC;
|
|
991
|
+
}
|
|
839
992
|
|
|
840
993
|
// ../shared/src/dto/role.ts
|
|
841
|
-
import { z as
|
|
842
|
-
var RoleNameSchema =
|
|
843
|
-
var RoleColorSchema =
|
|
844
|
-
var CreateRoleSchema =
|
|
994
|
+
import { z as z16 } from "zod";
|
|
995
|
+
var RoleNameSchema = z16.string().trim().min(1, "\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E").max(60, "\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0434\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u043D\u0435 \u0434\u043B\u0438\u043D\u043D\u0435\u0435 60 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432");
|
|
996
|
+
var RoleColorSchema = z16.string().regex(/^#[0-9a-fA-F]{6}$/, "\u0426\u0432\u0435\u0442: hex-\u0444\u043E\u0440\u043C\u0430\u0442, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 #3B82F6");
|
|
997
|
+
var CreateRoleSchema = z16.object({
|
|
845
998
|
name: RoleNameSchema,
|
|
846
999
|
color: RoleColorSchema,
|
|
847
|
-
defaultTrustProfileId:
|
|
1000
|
+
defaultTrustProfileId: z16.string().optional()
|
|
848
1001
|
});
|
|
849
|
-
var UpdateRoleSchema =
|
|
1002
|
+
var UpdateRoleSchema = z16.object({
|
|
850
1003
|
name: RoleNameSchema.optional(),
|
|
851
1004
|
color: RoleColorSchema.optional(),
|
|
852
|
-
defaultTrustProfileId:
|
|
1005
|
+
defaultTrustProfileId: z16.string().nullable().optional()
|
|
853
1006
|
}).refine((data) => Object.keys(data).length > 0, {
|
|
854
1007
|
message: "\u041D\u0443\u0436\u043D\u043E \u043F\u0435\u0440\u0435\u0434\u0430\u0442\u044C \u0445\u043E\u0442\u044F \u0431\u044B \u043E\u0434\u043D\u043E \u043F\u043E\u043B\u0435"
|
|
855
1008
|
});
|
|
856
1009
|
|
|
857
1010
|
// ../shared/src/dto/saved-filter.ts
|
|
858
|
-
import { z as
|
|
859
|
-
var SavedFilterNameSchema =
|
|
860
|
-
var SavedFilterQuerySchema =
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
1011
|
+
import { z as z17 } from "zod";
|
|
1012
|
+
var SavedFilterNameSchema = z17.string().trim().min(1, "\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E").max(80, "\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0434\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u043D\u0435 \u0434\u043B\u0438\u043D\u043D\u0435\u0435 80 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432");
|
|
1013
|
+
var SavedFilterQuerySchema = z17.object({
|
|
1014
|
+
/**
|
|
1015
|
+
* Статусы задач. Появились позже остальных полей — 11 сентября 2026,
|
|
1016
|
+
* когда список и доска стали двумя видами одной страницы: у списка
|
|
1017
|
+
* фильтр по статусу был, у доски нет, и после объединения он общий.
|
|
1018
|
+
*
|
|
1019
|
+
* `.default([])` здесь обязателен, а не для красоты: записи, созданные
|
|
1020
|
+
* до этого дня, поля не содержат вовсе, и без значения по умолчанию
|
|
1021
|
+
* разбор ронял бы чужой сохранённый фильтр.
|
|
1022
|
+
*/
|
|
1023
|
+
statuses: z17.array(TaskStatusSchema).max(11).default([]),
|
|
1024
|
+
roles: z17.array(z17.string().min(1)).max(50).default([]),
|
|
1025
|
+
assignees: z17.array(z17.string().min(1)).max(50).default([]),
|
|
1026
|
+
milestones: z17.array(z17.string().min(1)).max(50).default([]),
|
|
1027
|
+
labels: z17.array(TaskLabelSchema).max(30).default([]),
|
|
1028
|
+
priorities: z17.array(TaskPrioritySchema).max(4).default([]),
|
|
1029
|
+
types: z17.array(TaskTypeSchema).max(7).default([]),
|
|
1030
|
+
q: z17.string().trim().max(200).default("")
|
|
1031
|
+
});
|
|
1032
|
+
var CreateSavedFilterSchema = z17.object({
|
|
870
1033
|
name: SavedFilterNameSchema,
|
|
871
1034
|
query: SavedFilterQuerySchema
|
|
872
1035
|
});
|
|
873
|
-
var UpdateSavedFilterSchema =
|
|
1036
|
+
var UpdateSavedFilterSchema = z17.object({
|
|
874
1037
|
name: SavedFilterNameSchema.optional(),
|
|
875
1038
|
query: SavedFilterQuerySchema.optional()
|
|
876
1039
|
}).refine((data) => Object.keys(data).length > 0, {
|
|
@@ -878,20 +1041,20 @@ var UpdateSavedFilterSchema = z16.object({
|
|
|
878
1041
|
});
|
|
879
1042
|
|
|
880
1043
|
// ../shared/src/dto/task-dependency.ts
|
|
881
|
-
import { z as
|
|
882
|
-
var TaskDependencyKindSchema =
|
|
883
|
-
var IdSchema2 =
|
|
884
|
-
var CreateTaskDependencySchema =
|
|
1044
|
+
import { z as z18 } from "zod";
|
|
1045
|
+
var TaskDependencyKindSchema = z18.enum([DepKind.BLOCKS, DepKind.RELATES]);
|
|
1046
|
+
var IdSchema2 = z18.string().min(1);
|
|
1047
|
+
var CreateTaskDependencySchema = z18.object({
|
|
885
1048
|
toId: IdSchema2,
|
|
886
1049
|
kind: TaskDependencyKindSchema.default(DepKind.BLOCKS)
|
|
887
1050
|
});
|
|
888
|
-
var DeleteTaskDependencySchema =
|
|
1051
|
+
var DeleteTaskDependencySchema = z18.object({
|
|
889
1052
|
toId: IdSchema2
|
|
890
1053
|
});
|
|
891
1054
|
|
|
892
1055
|
// ../shared/src/dto/task-event.ts
|
|
893
|
-
import { z as
|
|
894
|
-
var TaskEventKindSchema =
|
|
1056
|
+
import { z as z19 } from "zod";
|
|
1057
|
+
var TaskEventKindSchema = z19.enum([
|
|
895
1058
|
EventKind.COMMENT,
|
|
896
1059
|
EventKind.STATUS,
|
|
897
1060
|
EventKind.ASSIGN,
|
|
@@ -902,58 +1065,58 @@ var TaskEventKindSchema = z18.enum([
|
|
|
902
1065
|
EventKind.APPROVAL,
|
|
903
1066
|
EventKind.SYSTEM
|
|
904
1067
|
]);
|
|
905
|
-
var TaskCommentBodySchema =
|
|
906
|
-
var CreateTaskEventSchema =
|
|
1068
|
+
var TaskCommentBodySchema = z19.string().trim().min(1, "\u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 \u043D\u0435 \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u043F\u0443\u0441\u0442\u044B\u043C").max(2e4, "\u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435 \u0434\u043B\u0438\u043D\u043D\u0435\u0435 20000 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432");
|
|
1069
|
+
var CreateTaskEventSchema = z19.object({
|
|
907
1070
|
bodyMd: TaskCommentBodySchema
|
|
908
1071
|
});
|
|
909
|
-
var TaskCommentPayloadSchema =
|
|
910
|
-
var TaskEditPayloadSchema =
|
|
911
|
-
fields:
|
|
1072
|
+
var TaskCommentPayloadSchema = z19.object({ bodyMd: TaskCommentBodySchema });
|
|
1073
|
+
var TaskEditPayloadSchema = z19.object({
|
|
1074
|
+
fields: z19.record(z19.string(), z19.object({ from: z19.unknown(), to: z19.unknown() }))
|
|
912
1075
|
});
|
|
913
|
-
var TaskAssignPayloadSchema =
|
|
914
|
-
from:
|
|
915
|
-
to:
|
|
1076
|
+
var TaskAssignPayloadSchema = z19.object({
|
|
1077
|
+
from: z19.string().nullable(),
|
|
1078
|
+
to: z19.string().nullable()
|
|
916
1079
|
});
|
|
917
1080
|
var TASK_EVENT_LIST_DEFAULT_LIMIT = 25;
|
|
918
1081
|
var TASK_EVENT_LIST_MAX_LIMIT = 100;
|
|
919
|
-
var ListTaskEventsQuerySchema =
|
|
1082
|
+
var ListTaskEventsQuerySchema = z19.object({
|
|
920
1083
|
/** CSV нескольких kind — как остальные CSV-фильтры задач (lib/tasks/filters.ts). */
|
|
921
|
-
kind:
|
|
922
|
-
cursor:
|
|
923
|
-
limit:
|
|
1084
|
+
kind: z19.string().max(300).optional(),
|
|
1085
|
+
cursor: z19.string().max(4e3).optional(),
|
|
1086
|
+
limit: z19.coerce.number().int().min(1).max(TASK_EVENT_LIST_MAX_LIMIT).default(TASK_EVENT_LIST_DEFAULT_LIMIT)
|
|
924
1087
|
});
|
|
925
1088
|
|
|
926
1089
|
// ../shared/src/dto/task-transition.ts
|
|
927
|
-
import { z as
|
|
928
|
-
var CommentSchema =
|
|
929
|
-
var TransitionTaskSchema =
|
|
1090
|
+
import { z as z20 } from "zod";
|
|
1091
|
+
var CommentSchema = z20.string().max(2e4, "\u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435 \u0434\u043B\u0438\u043D\u043D\u0435\u0435 20000 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432");
|
|
1092
|
+
var TransitionTaskSchema = z20.object({
|
|
930
1093
|
to: TaskStatusSchema,
|
|
931
1094
|
comment: CommentSchema.optional()
|
|
932
1095
|
});
|
|
933
|
-
var AcceptTaskSchema =
|
|
1096
|
+
var AcceptTaskSchema = z20.object({
|
|
934
1097
|
comment: CommentSchema.optional()
|
|
935
1098
|
});
|
|
936
|
-
var ReturnTaskSchema =
|
|
1099
|
+
var ReturnTaskSchema = z20.object({
|
|
937
1100
|
comment: CommentSchema.min(1, "\u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 \u0441 \u043F\u0440\u0430\u0432\u043A\u0430\u043C\u0438 \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u0435\u043D")
|
|
938
1101
|
});
|
|
939
|
-
var ReopenTaskSchema =
|
|
1102
|
+
var ReopenTaskSchema = z20.object({
|
|
940
1103
|
reason: CommentSchema.optional()
|
|
941
1104
|
});
|
|
942
|
-
var RequeueTaskSchema =
|
|
1105
|
+
var RequeueTaskSchema = z20.object({
|
|
943
1106
|
reason: CommentSchema.optional()
|
|
944
1107
|
});
|
|
945
1108
|
|
|
946
1109
|
// ../shared/src/dto/trash.ts
|
|
947
|
-
import { z as
|
|
948
|
-
var CommentSchema2 =
|
|
949
|
-
var RestoreTaskSchema =
|
|
1110
|
+
import { z as z21 } from "zod";
|
|
1111
|
+
var CommentSchema2 = z21.string().max(2e4, "\u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435 \u0434\u043B\u0438\u043D\u043D\u0435\u0435 20000 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432");
|
|
1112
|
+
var RestoreTaskSchema = z21.object({
|
|
950
1113
|
comment: CommentSchema2.optional()
|
|
951
1114
|
});
|
|
952
1115
|
var TASK_TRASH_LIST_DEFAULT_LIMIT = 25;
|
|
953
1116
|
var TASK_TRASH_LIST_MAX_LIMIT = 100;
|
|
954
|
-
var TaskTrashListQuerySchema =
|
|
955
|
-
cursor:
|
|
956
|
-
limit:
|
|
1117
|
+
var TaskTrashListQuerySchema = z21.object({
|
|
1118
|
+
cursor: z21.string().max(4e3).optional(),
|
|
1119
|
+
limit: z21.coerce.number().int().min(1).max(TASK_TRASH_LIST_MAX_LIMIT).default(TASK_TRASH_LIST_DEFAULT_LIMIT)
|
|
957
1120
|
});
|
|
958
1121
|
|
|
959
1122
|
// ../shared/src/enums/collaboration.ts
|
|
@@ -980,8 +1143,25 @@ var AuditDecision = {
|
|
|
980
1143
|
ASKED: "ASKED"
|
|
981
1144
|
};
|
|
982
1145
|
|
|
1146
|
+
// ../shared/src/enums/github.ts
|
|
1147
|
+
var CheckConclusion = {
|
|
1148
|
+
SUCCESS: "SUCCESS",
|
|
1149
|
+
FAILURE: "FAILURE",
|
|
1150
|
+
NEUTRAL: "NEUTRAL",
|
|
1151
|
+
CANCELLED: "CANCELLED",
|
|
1152
|
+
TIMED_OUT: "TIMED_OUT",
|
|
1153
|
+
ACTION_REQUIRED: "ACTION_REQUIRED",
|
|
1154
|
+
SKIPPED: "SKIPPED",
|
|
1155
|
+
STALE: "STALE"
|
|
1156
|
+
};
|
|
1157
|
+
var FAILING_CHECK_CONCLUSIONS = [
|
|
1158
|
+
CheckConclusion.FAILURE,
|
|
1159
|
+
CheckConclusion.TIMED_OUT,
|
|
1160
|
+
CheckConclusion.ACTION_REQUIRED
|
|
1161
|
+
];
|
|
1162
|
+
|
|
983
1163
|
// ../shared/src/events/agent-events.ts
|
|
984
|
-
import { z as
|
|
1164
|
+
import { z as z22 } from "zod";
|
|
985
1165
|
var agentStatusValues = Object.values(AgentStatus);
|
|
986
1166
|
var agentModeValues = Object.values(AgentMode);
|
|
987
1167
|
var taskStatusValues3 = Object.values(TaskStatus);
|
|
@@ -994,552 +1174,607 @@ var gitModeValues = Object.values(GitMode);
|
|
|
994
1174
|
var questionStatusValues = Object.values(QuestionStatus);
|
|
995
1175
|
var approvalKindValues = Object.values(ApprovalKind);
|
|
996
1176
|
var approvalStatusValues = Object.values(ApprovalStatus);
|
|
997
|
-
var trustBashModeSchema =
|
|
998
|
-
var trustFilesModeSchema =
|
|
999
|
-
var trustRulesSchema =
|
|
1000
|
-
bash:
|
|
1177
|
+
var trustBashModeSchema = z22.enum(["allow", "approve", "deny"]);
|
|
1178
|
+
var trustFilesModeSchema = z22.enum(["allow", "approve"]);
|
|
1179
|
+
var trustRulesSchema = z22.object({
|
|
1180
|
+
bash: z22.object({
|
|
1001
1181
|
mode: trustBashModeSchema,
|
|
1002
1182
|
// Regex-строки (§14.3 ТЗ) — не z.instanceof(RegExp): TrustRules это Json,
|
|
1003
1183
|
// должен сериализоваться в БД/по сокету как обычные строки.
|
|
1004
|
-
stopPatterns:
|
|
1005
|
-
allowPatterns:
|
|
1184
|
+
stopPatterns: z22.array(z22.string().min(1)),
|
|
1185
|
+
allowPatterns: z22.array(z22.string().min(1)).optional()
|
|
1006
1186
|
}),
|
|
1007
|
-
files:
|
|
1187
|
+
files: z22.object({
|
|
1008
1188
|
mode: trustFilesModeSchema,
|
|
1009
|
-
protectedPaths:
|
|
1189
|
+
protectedPaths: z22.array(z22.string().min(1))
|
|
1010
1190
|
}),
|
|
1011
|
-
git:
|
|
1012
|
-
allowPushDefault:
|
|
1013
|
-
allowForcePush:
|
|
1191
|
+
git: z22.object({
|
|
1192
|
+
allowPushDefault: z22.boolean(),
|
|
1193
|
+
allowForcePush: z22.boolean()
|
|
1014
1194
|
}),
|
|
1015
|
-
network:
|
|
1016
|
-
allowSsh:
|
|
1017
|
-
sshHostsAllow:
|
|
1195
|
+
network: z22.object({
|
|
1196
|
+
allowSsh: z22.boolean(),
|
|
1197
|
+
sshHostsAllow: z22.array(z22.string().min(1)).optional()
|
|
1018
1198
|
}),
|
|
1019
|
-
approvalTtlMin:
|
|
1020
|
-
});
|
|
1021
|
-
var agentSummarySchema =
|
|
1022
|
-
id:
|
|
1023
|
-
projectId:
|
|
1024
|
-
membershipId:
|
|
1025
|
-
name:
|
|
1026
|
-
roleKeys:
|
|
1027
|
-
status:
|
|
1028
|
-
mode:
|
|
1029
|
-
lastSeenAt:
|
|
1030
|
-
clientVersion:
|
|
1031
|
-
currentTaskId:
|
|
1032
|
-
tasksCompletedInSession:
|
|
1033
|
-
});
|
|
1034
|
-
var agentCurrentTaskSummarySchema =
|
|
1035
|
-
id:
|
|
1036
|
-
number:
|
|
1037
|
-
title:
|
|
1038
|
-
status:
|
|
1039
|
-
});
|
|
1040
|
-
var agentHelloPayloadSchema =
|
|
1041
|
-
clientVersion:
|
|
1042
|
-
cwd:
|
|
1043
|
-
os:
|
|
1044
|
-
claudeVersion:
|
|
1199
|
+
approvalTtlMin: z22.number().int().positive()
|
|
1200
|
+
});
|
|
1201
|
+
var agentSummarySchema = z22.object({
|
|
1202
|
+
id: z22.string().min(1),
|
|
1203
|
+
projectId: z22.string().min(1),
|
|
1204
|
+
membershipId: z22.string().min(1),
|
|
1205
|
+
name: z22.string().min(1),
|
|
1206
|
+
roleKeys: z22.array(z22.string().min(1)),
|
|
1207
|
+
status: z22.enum(agentStatusValues),
|
|
1208
|
+
mode: z22.enum(agentModeValues),
|
|
1209
|
+
lastSeenAt: z22.string().datetime().nullable(),
|
|
1210
|
+
clientVersion: z22.string().nullable(),
|
|
1211
|
+
currentTaskId: z22.string().nullable(),
|
|
1212
|
+
tasksCompletedInSession: z22.number().int().nonnegative()
|
|
1213
|
+
});
|
|
1214
|
+
var agentCurrentTaskSummarySchema = z22.object({
|
|
1215
|
+
id: z22.string().min(1),
|
|
1216
|
+
number: z22.number().int().positive(),
|
|
1217
|
+
title: z22.string().min(1),
|
|
1218
|
+
status: z22.enum(taskStatusValues3)
|
|
1219
|
+
});
|
|
1220
|
+
var agentHelloPayloadSchema = z22.object({
|
|
1221
|
+
clientVersion: z22.string().min(1),
|
|
1222
|
+
cwd: z22.string().min(1),
|
|
1223
|
+
os: z22.string().min(1),
|
|
1224
|
+
claudeVersion: z22.string().min(1),
|
|
1045
1225
|
// Роли, которыми клиент СЕБЯ считает — информационно (лог/диагностика
|
|
1046
1226
|
// рассинхрона), не авторизация: авторизующие `Agent.roleKeys` идут из
|
|
1047
1227
|
// БД (заданы при создании агента, REST §12 ТЗ), этот payload их не
|
|
1048
1228
|
// меняет. См. блок «ВОПРОСЫ» отчёта P2-03.
|
|
1049
|
-
roleKeys:
|
|
1050
|
-
resumeToken:
|
|
1229
|
+
roleKeys: z22.array(z22.string().min(1)),
|
|
1230
|
+
resumeToken: z22.string().min(1).optional()
|
|
1051
1231
|
});
|
|
1052
|
-
var agentHelloAckSchema =
|
|
1232
|
+
var agentHelloAckSchema = z22.object({
|
|
1053
1233
|
agent: agentSummarySchema,
|
|
1054
1234
|
trust: trustRulesSchema,
|
|
1055
1235
|
currentTask: agentCurrentTaskSummarySchema.optional(),
|
|
1056
|
-
mode:
|
|
1236
|
+
mode: z22.enum(agentModeValues)
|
|
1057
1237
|
});
|
|
1058
|
-
var agentHeartbeatPayloadSchema =
|
|
1059
|
-
currentTaskId:
|
|
1060
|
-
resumeToken:
|
|
1061
|
-
status:
|
|
1238
|
+
var agentHeartbeatPayloadSchema = z22.object({
|
|
1239
|
+
currentTaskId: z22.string().min(1).optional(),
|
|
1240
|
+
resumeToken: z22.string().min(1).optional(),
|
|
1241
|
+
status: z22.enum(agentStatusValues)
|
|
1062
1242
|
});
|
|
1063
|
-
var agentHeartbeatAckSchema =
|
|
1064
|
-
ok:
|
|
1065
|
-
leaseExpiresAt:
|
|
1243
|
+
var agentHeartbeatAckSchema = z22.object({
|
|
1244
|
+
ok: z22.boolean(),
|
|
1245
|
+
leaseExpiresAt: z22.string().datetime().optional()
|
|
1066
1246
|
});
|
|
1067
|
-
var agentModePayloadSchema =
|
|
1068
|
-
mode:
|
|
1247
|
+
var agentModePayloadSchema = z22.object({
|
|
1248
|
+
mode: z22.enum(agentModeValues)
|
|
1069
1249
|
});
|
|
1070
|
-
var agentModeAckSchema =
|
|
1071
|
-
ok:
|
|
1072
|
-
mode:
|
|
1250
|
+
var agentModeAckSchema = z22.object({
|
|
1251
|
+
ok: z22.boolean(),
|
|
1252
|
+
mode: z22.enum(agentModeValues).optional()
|
|
1073
1253
|
});
|
|
1074
|
-
var taskPayloadMilestoneSchema =
|
|
1075
|
-
name:
|
|
1076
|
-
dueAt:
|
|
1254
|
+
var taskPayloadMilestoneSchema = z22.object({
|
|
1255
|
+
name: z22.string().min(1),
|
|
1256
|
+
dueAt: z22.string().datetime().nullable()
|
|
1077
1257
|
});
|
|
1078
|
-
var taskPayloadTaskSchema =
|
|
1079
|
-
id:
|
|
1258
|
+
var taskPayloadTaskSchema = z22.object({
|
|
1259
|
+
id: z22.string().min(1),
|
|
1080
1260
|
/** Человекочитаемый ключ вида `ATL-42` (§7.5 ТЗ), НЕ то же, что `id`. */
|
|
1081
|
-
key:
|
|
1082
|
-
title:
|
|
1083
|
-
descriptionMd:
|
|
1084
|
-
type:
|
|
1085
|
-
priority:
|
|
1086
|
-
acceptance:
|
|
1087
|
-
attempts:
|
|
1088
|
-
reviewNotes:
|
|
1089
|
-
metadata:
|
|
1090
|
-
labels:
|
|
1261
|
+
key: z22.string().min(1),
|
|
1262
|
+
title: z22.string().min(1),
|
|
1263
|
+
descriptionMd: z22.string(),
|
|
1264
|
+
type: z22.enum(taskTypeValues2),
|
|
1265
|
+
priority: z22.enum(priorityValues2),
|
|
1266
|
+
acceptance: z22.string(),
|
|
1267
|
+
attempts: z22.number().int().nonnegative(),
|
|
1268
|
+
reviewNotes: z22.string().optional(),
|
|
1269
|
+
metadata: z22.record(z22.string(), z22.unknown()),
|
|
1270
|
+
labels: z22.array(z22.string()),
|
|
1091
1271
|
milestone: taskPayloadMilestoneSchema.optional()
|
|
1092
1272
|
});
|
|
1093
|
-
var taskPayloadRepoSchema =
|
|
1094
|
-
url:
|
|
1095
|
-
defaultBranch:
|
|
1096
|
-
pathHint:
|
|
1097
|
-
});
|
|
1098
|
-
var taskPayloadProjectSchema =
|
|
1099
|
-
key:
|
|
1100
|
-
name:
|
|
1101
|
-
mode:
|
|
1102
|
-
gitMode:
|
|
1103
|
-
repos:
|
|
1273
|
+
var taskPayloadRepoSchema = z22.object({
|
|
1274
|
+
url: z22.string().min(1),
|
|
1275
|
+
defaultBranch: z22.string().min(1),
|
|
1276
|
+
pathHint: z22.string().nullable()
|
|
1277
|
+
});
|
|
1278
|
+
var taskPayloadProjectSchema = z22.object({
|
|
1279
|
+
key: z22.string().min(1),
|
|
1280
|
+
name: z22.string().min(1),
|
|
1281
|
+
mode: z22.enum(projectModeValues),
|
|
1282
|
+
gitMode: z22.enum(gitModeValues),
|
|
1283
|
+
repos: z22.array(taskPayloadRepoSchema),
|
|
1104
1284
|
/** Готовое имя ветки, `task/ATL-42-add-login` — считает сервер, не модель. */
|
|
1105
|
-
branchName:
|
|
1285
|
+
branchName: z22.string().min(1),
|
|
1106
1286
|
/** Префикс сообщения коммита, `ATL-42:`. */
|
|
1107
|
-
commitPrefix:
|
|
1287
|
+
commitPrefix: z22.string().min(1)
|
|
1108
1288
|
});
|
|
1109
|
-
var taskPayloadDependencySchema =
|
|
1110
|
-
key:
|
|
1111
|
-
title:
|
|
1112
|
-
status:
|
|
1113
|
-
resultMd:
|
|
1114
|
-
resultLinks:
|
|
1289
|
+
var taskPayloadDependencySchema = z22.object({
|
|
1290
|
+
key: z22.string().min(1),
|
|
1291
|
+
title: z22.string().min(1),
|
|
1292
|
+
status: z22.enum(taskStatusValues3),
|
|
1293
|
+
resultMd: z22.string().optional(),
|
|
1294
|
+
resultLinks: z22.array(z22.string()).optional()
|
|
1115
1295
|
});
|
|
1116
|
-
var taskPayloadOpenQuestionSchema =
|
|
1117
|
-
id:
|
|
1118
|
-
textMd:
|
|
1119
|
-
answerMd:
|
|
1296
|
+
var taskPayloadOpenQuestionSchema = z22.object({
|
|
1297
|
+
id: z22.string().min(1),
|
|
1298
|
+
textMd: z22.string(),
|
|
1299
|
+
answerMd: z22.string().optional()
|
|
1120
1300
|
});
|
|
1121
|
-
var taskPayloadTrustSchema =
|
|
1122
|
-
profileKey:
|
|
1123
|
-
summary:
|
|
1301
|
+
var taskPayloadTrustSchema = z22.object({
|
|
1302
|
+
profileKey: z22.string().min(1),
|
|
1303
|
+
summary: z22.string()
|
|
1124
1304
|
});
|
|
1125
|
-
var taskPayloadLeaseSchema =
|
|
1126
|
-
resumeToken:
|
|
1127
|
-
expiresAt:
|
|
1305
|
+
var taskPayloadLeaseSchema = z22.object({
|
|
1306
|
+
resumeToken: z22.string().min(1),
|
|
1307
|
+
expiresAt: z22.string().datetime()
|
|
1128
1308
|
});
|
|
1129
|
-
var taskPayloadSchema =
|
|
1309
|
+
var taskPayloadSchema = z22.object({
|
|
1130
1310
|
task: taskPayloadTaskSchema,
|
|
1131
1311
|
project: taskPayloadProjectSchema,
|
|
1132
|
-
dependencies:
|
|
1133
|
-
openQuestions:
|
|
1312
|
+
dependencies: z22.array(taskPayloadDependencySchema),
|
|
1313
|
+
openQuestions: z22.array(taskPayloadOpenQuestionSchema),
|
|
1134
1314
|
trust: taskPayloadTrustSchema,
|
|
1135
1315
|
lease: taskPayloadLeaseSchema
|
|
1136
1316
|
});
|
|
1137
|
-
var taskClaimPayloadSchema =
|
|
1317
|
+
var taskClaimPayloadSchema = z22.object({
|
|
1138
1318
|
/**
|
|
1139
1319
|
* Потолок 600 с — тот же, что §10.3 задаёт для `ask_human`
|
|
1140
1320
|
* («long-poll до 600 с»). Без верхней границы клиент может попросить
|
|
1141
1321
|
* сервер держать ack сутками, а это утечка обработчиков на сервере.
|
|
1142
1322
|
*/
|
|
1143
|
-
waitSec:
|
|
1144
|
-
});
|
|
1145
|
-
var taskClaimAckSchema =
|
|
1146
|
-
var taskStartPayloadSchema =
|
|
1147
|
-
taskId:
|
|
1148
|
-
resumeToken:
|
|
1149
|
-
});
|
|
1150
|
-
var taskStartAckSchema =
|
|
1151
|
-
var taskProgressLevelSchema =
|
|
1152
|
-
var taskProgressPayloadSchema =
|
|
1153
|
-
taskId:
|
|
1154
|
-
note:
|
|
1323
|
+
waitSec: z22.number().int().min(0).max(600)
|
|
1324
|
+
});
|
|
1325
|
+
var taskClaimAckSchema = z22.union([taskPayloadSchema, z22.object({ empty: z22.literal(true) })]);
|
|
1326
|
+
var taskStartPayloadSchema = z22.object({
|
|
1327
|
+
taskId: z22.string().min(1),
|
|
1328
|
+
resumeToken: z22.string().min(1)
|
|
1329
|
+
});
|
|
1330
|
+
var taskStartAckSchema = z22.object({ ok: z22.boolean() });
|
|
1331
|
+
var taskProgressLevelSchema = z22.enum(["debug", "info", "warn", "error"]);
|
|
1332
|
+
var taskProgressPayloadSchema = z22.object({
|
|
1333
|
+
taskId: z22.string().min(1),
|
|
1334
|
+
note: z22.string().min(1),
|
|
1155
1335
|
level: taskProgressLevelSchema.default("info")
|
|
1156
1336
|
});
|
|
1157
|
-
var taskProgressAckSchema =
|
|
1158
|
-
var taskReleasePayloadSchema =
|
|
1159
|
-
taskId:
|
|
1160
|
-
reason:
|
|
1337
|
+
var taskProgressAckSchema = z22.object({ ok: z22.boolean() });
|
|
1338
|
+
var taskReleasePayloadSchema = z22.object({
|
|
1339
|
+
taskId: z22.string().min(1),
|
|
1340
|
+
reason: z22.string().min(1)
|
|
1161
1341
|
});
|
|
1162
|
-
var taskReleaseAckSchema =
|
|
1163
|
-
var taskGetPayloadSchema =
|
|
1164
|
-
taskId:
|
|
1342
|
+
var taskReleaseAckSchema = z22.object({ ok: z22.boolean() });
|
|
1343
|
+
var taskGetPayloadSchema = z22.object({
|
|
1344
|
+
taskId: z22.string().min(1)
|
|
1165
1345
|
});
|
|
1166
1346
|
var taskGetAckSchema = taskPayloadSchema.omit({ lease: true }).extend({
|
|
1167
1347
|
lease: taskPayloadLeaseSchema.optional()
|
|
1168
1348
|
});
|
|
1169
|
-
var reportStatusSchema =
|
|
1170
|
-
var reportLinkSchema =
|
|
1171
|
-
kind:
|
|
1172
|
-
url:
|
|
1173
|
-
title:
|
|
1349
|
+
var reportStatusSchema = z22.enum(["success", "partial", "failed"]);
|
|
1350
|
+
var reportLinkSchema = z22.object({
|
|
1351
|
+
kind: z22.enum(["commit", "pr", "doc", "other"]),
|
|
1352
|
+
url: z22.string().min(1),
|
|
1353
|
+
title: z22.string().optional()
|
|
1174
1354
|
});
|
|
1175
|
-
var reportPayloadSchema =
|
|
1176
|
-
taskId:
|
|
1355
|
+
var reportPayloadSchema = z22.object({
|
|
1356
|
+
taskId: z22.string().min(1),
|
|
1177
1357
|
/**
|
|
1178
1358
|
* Ключ идемпотентности (P2-13): пара `taskId + resumeToken` однозначно
|
|
1179
1359
|
* определяет одну попытку сдачи. Повтор с тем же resumeToken обязан
|
|
1180
1360
|
* вернуть тот же `taskStatus`, а не сдать задачу дважды — модель
|
|
1181
1361
|
* ретраит вызов тула при обрыве связи, и это норма.
|
|
1182
1362
|
*/
|
|
1183
|
-
resumeToken:
|
|
1363
|
+
resumeToken: z22.string().min(1),
|
|
1184
1364
|
status: reportStatusSchema,
|
|
1185
|
-
resultMd:
|
|
1186
|
-
links:
|
|
1187
|
-
testResult:
|
|
1188
|
-
nextSteps:
|
|
1365
|
+
resultMd: z22.string().min(1),
|
|
1366
|
+
links: z22.array(reportLinkSchema),
|
|
1367
|
+
testResult: z22.enum(testResultValues2),
|
|
1368
|
+
nextSteps: z22.string().optional()
|
|
1189
1369
|
});
|
|
1190
|
-
var reportAckSchema =
|
|
1191
|
-
taskStatus:
|
|
1370
|
+
var reportAckSchema = z22.object({
|
|
1371
|
+
taskStatus: z22.enum(taskStatusValues3),
|
|
1192
1372
|
/** true, если этот ack — повтор уже принятой сдачи (идемпотентность). */
|
|
1193
|
-
duplicate:
|
|
1194
|
-
});
|
|
1195
|
-
var contextIncludeSchema =
|
|
1196
|
-
var contextGetPayloadSchema =
|
|
1197
|
-
taskId:
|
|
1198
|
-
include:
|
|
1199
|
-
});
|
|
1200
|
-
var
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1373
|
+
duplicate: z22.boolean().optional()
|
|
1374
|
+
});
|
|
1375
|
+
var contextIncludeSchema = z22.enum(["spec", "decisions", "documents", "related", "repo"]);
|
|
1376
|
+
var contextGetPayloadSchema = z22.object({
|
|
1377
|
+
taskId: z22.string().min(1).optional(),
|
|
1378
|
+
include: z22.array(contextIncludeSchema).min(1)
|
|
1379
|
+
});
|
|
1380
|
+
var contextDocumentFileSchema = z22.object({
|
|
1381
|
+
/** Имя как у человека на диске: `Спецификация v2.pdf`. */
|
|
1382
|
+
fileName: z22.string().min(1),
|
|
1383
|
+
/** Временная ссылка на скачивание — агент читает файл сам. */
|
|
1384
|
+
downloadUrl: z22.string().min(1),
|
|
1385
|
+
/** Сколько секунд ссылка живёт: успеть скачать, а не отложить на потом. */
|
|
1386
|
+
expiresInSeconds: z22.number().int().positive()
|
|
1387
|
+
});
|
|
1388
|
+
var contextDocumentSchema = z22.object({
|
|
1389
|
+
id: z22.string().min(1),
|
|
1390
|
+
title: z22.string().min(1),
|
|
1391
|
+
kind: z22.string().min(1),
|
|
1392
|
+
/** Текст документа. Пусто, если документ — файл: тогда заполнен `file`. */
|
|
1393
|
+
contentMd: z22.string(),
|
|
1394
|
+
/**
|
|
1395
|
+
* Заполнен, если документ — файл.
|
|
1396
|
+
*
|
|
1397
|
+
* `null` означает «текстовый документ», отсутствие ключа — «эта версия
|
|
1398
|
+
* платформы про файлы не знала». Различать важно: старый клиент не
|
|
1399
|
+
* должен принимать файловый документ за пустой.
|
|
1400
|
+
*/
|
|
1401
|
+
file: contextDocumentFileSchema.nullable().optional()
|
|
1205
1402
|
});
|
|
1206
|
-
var contextPayloadSchema =
|
|
1403
|
+
var contextPayloadSchema = z22.object({
|
|
1404
|
+
/**
|
|
1405
|
+
* Замечания платформы к этому контексту — для агента, словами.
|
|
1406
|
+
*
|
|
1407
|
+
* ЗАЧЕМ. `spec: null` означает «документа с типом „Спецификация“ в
|
|
1408
|
+
* проекте нет» — и неотличим от трёх разных причин: спецификацию не
|
|
1409
|
+
* приложили вовсе; приложили, но выбрали другой тип документа; агент
|
|
1410
|
+
* подключён к другому проекту. Агент видит одно и то же `null` и во
|
|
1411
|
+
* всех трёх случаях делает одно и то же — работает без спецификации.
|
|
1412
|
+
*
|
|
1413
|
+
* 14 сентября 2026 это и случилось: владелец приложил PDF, агент
|
|
1414
|
+
* отработал так, будто ничего нет, и разбирательство свелось к
|
|
1415
|
+
* гаданию. Пустой ответ, который не объясняет свою пустоту, — та же
|
|
1416
|
+
* молчаливая ошибка, что и пустая строка вместо файла.
|
|
1417
|
+
*/
|
|
1418
|
+
notes: z22.array(z22.string()).optional(),
|
|
1207
1419
|
spec: contextDocumentSchema.nullable().optional(),
|
|
1208
|
-
decisions:
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1420
|
+
decisions: z22.array(contextDocumentSchema).optional(),
|
|
1421
|
+
/** Все документы проекта — любого типа, включая спецификацию и решения. */
|
|
1422
|
+
documents: z22.array(contextDocumentSchema).optional(),
|
|
1423
|
+
related: z22.array(taskPayloadDependencySchema).optional(),
|
|
1424
|
+
repo: z22.object({
|
|
1425
|
+
repos: z22.array(taskPayloadRepoSchema),
|
|
1426
|
+
branchName: z22.string().optional(),
|
|
1427
|
+
commitPrefix: z22.string().optional()
|
|
1214
1428
|
}).optional()
|
|
1215
1429
|
});
|
|
1216
|
-
var agentRateLimitedPayloadSchema =
|
|
1217
|
-
retryAfterSec:
|
|
1218
|
-
taskId:
|
|
1430
|
+
var agentRateLimitedPayloadSchema = z22.object({
|
|
1431
|
+
retryAfterSec: z22.number().int().positive().optional(),
|
|
1432
|
+
taskId: z22.string().min(1).optional()
|
|
1219
1433
|
});
|
|
1220
|
-
var agentRateLimitedAckSchema =
|
|
1221
|
-
ok:
|
|
1434
|
+
var agentRateLimitedAckSchema = z22.object({
|
|
1435
|
+
ok: z22.boolean(),
|
|
1222
1436
|
/** Когда задача вернётся в очередь (§9.4 ТЗ: «через 2 ч»). */
|
|
1223
|
-
requeueAt:
|
|
1437
|
+
requeueAt: z22.string().datetime().optional()
|
|
1224
1438
|
});
|
|
1225
|
-
var projectStatePayloadSchema =
|
|
1226
|
-
projectId:
|
|
1227
|
-
paused:
|
|
1228
|
-
mode:
|
|
1439
|
+
var projectStatePayloadSchema = z22.object({
|
|
1440
|
+
projectId: z22.string().min(1),
|
|
1441
|
+
paused: z22.boolean(),
|
|
1442
|
+
mode: z22.enum(projectModeValues),
|
|
1229
1443
|
/** Причина паузы для модели; при `paused: false` не заполняется. */
|
|
1230
|
-
reason:
|
|
1231
|
-
});
|
|
1232
|
-
var questionSummarySchema =
|
|
1233
|
-
id:
|
|
1234
|
-
taskId:
|
|
1235
|
-
textMd:
|
|
1236
|
-
options:
|
|
1237
|
-
blocking:
|
|
1238
|
-
status:
|
|
1239
|
-
answerMd:
|
|
1240
|
-
answeredAt:
|
|
1241
|
-
createdAt:
|
|
1242
|
-
});
|
|
1243
|
-
var questionAskPayloadSchema =
|
|
1244
|
-
taskId:
|
|
1245
|
-
textMd:
|
|
1246
|
-
targetRole:
|
|
1247
|
-
targetMemberId:
|
|
1248
|
-
options:
|
|
1249
|
-
blocking:
|
|
1444
|
+
reason: z22.string().optional()
|
|
1445
|
+
});
|
|
1446
|
+
var questionSummarySchema = z22.object({
|
|
1447
|
+
id: z22.string().min(1),
|
|
1448
|
+
taskId: z22.string().min(1).nullable(),
|
|
1449
|
+
textMd: z22.string(),
|
|
1450
|
+
options: z22.array(z22.string()),
|
|
1451
|
+
blocking: z22.boolean(),
|
|
1452
|
+
status: z22.enum(questionStatusValues),
|
|
1453
|
+
answerMd: z22.string().nullable(),
|
|
1454
|
+
answeredAt: z22.string().datetime().nullable(),
|
|
1455
|
+
createdAt: z22.string().datetime()
|
|
1456
|
+
});
|
|
1457
|
+
var questionAskPayloadSchema = z22.object({
|
|
1458
|
+
taskId: z22.string().min(1).optional(),
|
|
1459
|
+
textMd: z22.string().min(1),
|
|
1460
|
+
targetRole: z22.string().min(1).optional(),
|
|
1461
|
+
targetMemberId: z22.string().min(1).optional(),
|
|
1462
|
+
options: z22.array(z22.string().min(1)).optional(),
|
|
1463
|
+
blocking: z22.boolean(),
|
|
1250
1464
|
/** Сколько ждать ответ в этом же вызове. 0 — не ждать, вернуть вопрос сразу. */
|
|
1251
|
-
waitSec:
|
|
1465
|
+
waitSec: z22.number().int().min(0).max(600).optional()
|
|
1252
1466
|
}).refine((v) => Boolean(v.targetRole) !== Boolean(v.targetMemberId), {
|
|
1253
1467
|
message: "\u041D\u0443\u0436\u0435\u043D \u0440\u043E\u0432\u043D\u043E \u043E\u0434\u0438\u043D \u0430\u0434\u0440\u0435\u0441\u0430\u0442: targetRole \u0418\u041B\u0418 targetMemberId"
|
|
1254
1468
|
});
|
|
1255
|
-
var questionAskAckSchema =
|
|
1469
|
+
var questionAskAckSchema = z22.object({
|
|
1256
1470
|
question: questionSummarySchema
|
|
1257
1471
|
});
|
|
1258
|
-
var questionWaitPayloadSchema =
|
|
1259
|
-
questionId:
|
|
1260
|
-
waitSec:
|
|
1472
|
+
var questionWaitPayloadSchema = z22.object({
|
|
1473
|
+
questionId: z22.string().min(1),
|
|
1474
|
+
waitSec: z22.number().int().min(0).max(600)
|
|
1261
1475
|
});
|
|
1262
|
-
var questionWaitAckSchema =
|
|
1476
|
+
var questionWaitAckSchema = z22.object({
|
|
1263
1477
|
question: questionSummarySchema
|
|
1264
1478
|
});
|
|
1265
|
-
var taskCreatePayloadSchema =
|
|
1266
|
-
title:
|
|
1267
|
-
descriptionMd:
|
|
1268
|
-
roleKey:
|
|
1269
|
-
assigneeId:
|
|
1270
|
-
type:
|
|
1271
|
-
priority:
|
|
1272
|
-
executor:
|
|
1273
|
-
blocksCurrent:
|
|
1274
|
-
acceptance:
|
|
1275
|
-
labels:
|
|
1479
|
+
var taskCreatePayloadSchema = z22.object({
|
|
1480
|
+
title: z22.string().min(1),
|
|
1481
|
+
descriptionMd: z22.string(),
|
|
1482
|
+
roleKey: z22.string().min(1).optional(),
|
|
1483
|
+
assigneeId: z22.string().min(1).optional(),
|
|
1484
|
+
type: z22.enum(taskTypeValues2),
|
|
1485
|
+
priority: z22.enum(priorityValues2),
|
|
1486
|
+
executor: z22.enum(executorValues2),
|
|
1487
|
+
blocksCurrent: z22.boolean(),
|
|
1488
|
+
acceptance: z22.string().optional(),
|
|
1489
|
+
labels: z22.array(z22.string().min(1)).optional()
|
|
1276
1490
|
}).refine((v) => Boolean(v.roleKey) !== Boolean(v.assigneeId), {
|
|
1277
1491
|
message: "\u041D\u0443\u0436\u0435\u043D \u0440\u043E\u0432\u043D\u043E \u043E\u0434\u0438\u043D \u0430\u0434\u0440\u0435\u0441\u0430\u0442: roleKey \u0418\u041B\u0418 assigneeId"
|
|
1278
1492
|
});
|
|
1279
|
-
var taskBriefSchema =
|
|
1280
|
-
id:
|
|
1281
|
-
key:
|
|
1282
|
-
title:
|
|
1283
|
-
type:
|
|
1284
|
-
status:
|
|
1285
|
-
priority:
|
|
1286
|
-
roleKey:
|
|
1287
|
-
assigneeId:
|
|
1288
|
-
labels:
|
|
1289
|
-
updatedAt:
|
|
1290
|
-
});
|
|
1291
|
-
var taskCreateAckSchema =
|
|
1493
|
+
var taskBriefSchema = z22.object({
|
|
1494
|
+
id: z22.string().min(1),
|
|
1495
|
+
key: z22.string().min(1),
|
|
1496
|
+
title: z22.string().min(1),
|
|
1497
|
+
type: z22.enum(taskTypeValues2),
|
|
1498
|
+
status: z22.enum(taskStatusValues3),
|
|
1499
|
+
priority: z22.enum(priorityValues2),
|
|
1500
|
+
roleKey: z22.string().min(1).nullable(),
|
|
1501
|
+
assigneeId: z22.string().min(1).nullable(),
|
|
1502
|
+
labels: z22.array(z22.string()),
|
|
1503
|
+
updatedAt: z22.string().datetime()
|
|
1504
|
+
});
|
|
1505
|
+
var taskCreateAckSchema = z22.object({
|
|
1292
1506
|
task: taskBriefSchema,
|
|
1293
1507
|
/** Во что ушла ТЕКУЩАЯ задача автора, если `blocksCurrent: true`. */
|
|
1294
|
-
currentTaskStatus:
|
|
1508
|
+
currentTaskStatus: z22.enum(taskStatusValues3).optional()
|
|
1295
1509
|
});
|
|
1296
|
-
var taskListPayloadSchema =
|
|
1297
|
-
status:
|
|
1298
|
-
roleKey:
|
|
1510
|
+
var taskListPayloadSchema = z22.object({
|
|
1511
|
+
status: z22.array(z22.enum(taskStatusValues3)).optional(),
|
|
1512
|
+
roleKey: z22.string().min(1).optional(),
|
|
1299
1513
|
/** Поиск по заголовку, без учёта регистра. */
|
|
1300
|
-
query:
|
|
1301
|
-
limit:
|
|
1302
|
-
});
|
|
1303
|
-
var taskListAckSchema =
|
|
1304
|
-
tasks:
|
|
1305
|
-
});
|
|
1306
|
-
var taskUpdatePayloadSchema =
|
|
1307
|
-
taskId:
|
|
1308
|
-
patch:
|
|
1309
|
-
progressNote:
|
|
1310
|
-
labels:
|
|
1311
|
-
estimateMin:
|
|
1514
|
+
query: z22.string().min(1).optional(),
|
|
1515
|
+
limit: z22.number().int().min(1).max(100).optional()
|
|
1516
|
+
});
|
|
1517
|
+
var taskListAckSchema = z22.object({
|
|
1518
|
+
tasks: z22.array(taskBriefSchema)
|
|
1519
|
+
});
|
|
1520
|
+
var taskUpdatePayloadSchema = z22.object({
|
|
1521
|
+
taskId: z22.string().min(1),
|
|
1522
|
+
patch: z22.object({
|
|
1523
|
+
progressNote: z22.string().min(1).optional(),
|
|
1524
|
+
labels: z22.array(z22.string().min(1)).optional(),
|
|
1525
|
+
estimateMin: z22.number().int().positive().optional()
|
|
1312
1526
|
}).refine((v) => Object.keys(v).length > 0, { message: "patch \u043D\u0435 \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u043F\u0443\u0441\u0442\u044B\u043C" })
|
|
1313
1527
|
});
|
|
1314
|
-
var taskUpdateAckSchema =
|
|
1528
|
+
var taskUpdateAckSchema = z22.object({
|
|
1315
1529
|
task: taskBriefSchema
|
|
1316
1530
|
});
|
|
1317
|
-
var modeSetPayloadSchema =
|
|
1318
|
-
mode:
|
|
1531
|
+
var modeSetPayloadSchema = z22.object({
|
|
1532
|
+
mode: z22.enum(agentModeValues)
|
|
1319
1533
|
});
|
|
1320
|
-
var agentPausePayloadSchema =
|
|
1321
|
-
reason:
|
|
1534
|
+
var agentPausePayloadSchema = z22.object({
|
|
1535
|
+
reason: z22.string().min(1)
|
|
1322
1536
|
});
|
|
1323
1537
|
var trustUpdatedPayloadSchema = trustRulesSchema;
|
|
1324
|
-
var leaseLostPayloadSchema =
|
|
1325
|
-
taskId:
|
|
1326
|
-
reason:
|
|
1327
|
-
});
|
|
1328
|
-
var taskUpdatedAgentPayloadSchema =
|
|
1329
|
-
taskId:
|
|
1330
|
-
patch:
|
|
1331
|
-
});
|
|
1332
|
-
var questionAnsweredPayloadSchema =
|
|
1333
|
-
questionId:
|
|
1334
|
-
answerMd:
|
|
1335
|
-
});
|
|
1336
|
-
var approvalSummarySchema =
|
|
1337
|
-
id:
|
|
1338
|
-
taskId:
|
|
1339
|
-
kind:
|
|
1340
|
-
summary:
|
|
1341
|
-
status:
|
|
1342
|
-
expiresAt:
|
|
1343
|
-
decidedAt:
|
|
1344
|
-
createdAt:
|
|
1345
|
-
});
|
|
1346
|
-
var approvalRequestPayloadSchema =
|
|
1347
|
-
taskId:
|
|
1348
|
-
kind:
|
|
1349
|
-
summary:
|
|
1350
|
-
command:
|
|
1351
|
-
cwd:
|
|
1352
|
-
host:
|
|
1353
|
-
diff:
|
|
1538
|
+
var leaseLostPayloadSchema = z22.object({
|
|
1539
|
+
taskId: z22.string().min(1),
|
|
1540
|
+
reason: z22.string().min(1)
|
|
1541
|
+
});
|
|
1542
|
+
var taskUpdatedAgentPayloadSchema = z22.object({
|
|
1543
|
+
taskId: z22.string().min(1),
|
|
1544
|
+
patch: z22.record(z22.string(), z22.unknown()).optional()
|
|
1545
|
+
});
|
|
1546
|
+
var questionAnsweredPayloadSchema = z22.object({
|
|
1547
|
+
questionId: z22.string().min(1),
|
|
1548
|
+
answerMd: z22.string()
|
|
1549
|
+
});
|
|
1550
|
+
var approvalSummarySchema = z22.object({
|
|
1551
|
+
id: z22.string().min(1),
|
|
1552
|
+
taskId: z22.string().min(1),
|
|
1553
|
+
kind: z22.enum(approvalKindValues),
|
|
1554
|
+
summary: z22.string(),
|
|
1555
|
+
status: z22.enum(approvalStatusValues),
|
|
1556
|
+
expiresAt: z22.string().datetime(),
|
|
1557
|
+
decidedAt: z22.string().datetime().nullable(),
|
|
1558
|
+
createdAt: z22.string().datetime()
|
|
1559
|
+
});
|
|
1560
|
+
var approvalRequestPayloadSchema = z22.object({
|
|
1561
|
+
taskId: z22.string().min(1),
|
|
1562
|
+
kind: z22.enum(approvalKindValues),
|
|
1563
|
+
summary: z22.string().min(1),
|
|
1564
|
+
command: z22.string().min(1),
|
|
1565
|
+
cwd: z22.string().min(1),
|
|
1566
|
+
host: z22.string().min(1).optional(),
|
|
1567
|
+
diff: z22.string().optional(),
|
|
1354
1568
|
/** Сколько ждать решения в этом же вызове; 0 — не ждать. Потолок — как у вопросов. */
|
|
1355
|
-
waitSec:
|
|
1569
|
+
waitSec: z22.number().int().min(0).max(600).optional()
|
|
1356
1570
|
});
|
|
1357
|
-
var approvalRequestAckSchema =
|
|
1571
|
+
var approvalRequestAckSchema = z22.object({
|
|
1358
1572
|
approval: approvalSummarySchema,
|
|
1359
1573
|
/** Приходит только при `APPROVED` — одноразовый, привязан к команде и каталогу (§14.4 ТЗ). */
|
|
1360
|
-
oneTimeToken:
|
|
1574
|
+
oneTimeToken: z22.string().min(1).optional()
|
|
1361
1575
|
});
|
|
1362
|
-
var approvalWaitPayloadSchema =
|
|
1363
|
-
approvalId:
|
|
1364
|
-
waitSec:
|
|
1576
|
+
var approvalWaitPayloadSchema = z22.object({
|
|
1577
|
+
approvalId: z22.string().min(1),
|
|
1578
|
+
waitSec: z22.number().int().min(0).max(600)
|
|
1365
1579
|
});
|
|
1366
1580
|
var approvalWaitAckSchema = approvalRequestAckSchema;
|
|
1367
|
-
var approvalDecidedPayloadSchema =
|
|
1368
|
-
approvalId:
|
|
1369
|
-
status:
|
|
1370
|
-
oneTimeToken:
|
|
1371
|
-
});
|
|
1372
|
-
var agentPresenceUiPayloadSchema =
|
|
1373
|
-
projectId:
|
|
1374
|
-
agentId:
|
|
1375
|
-
status:
|
|
1376
|
-
lastSeenAt:
|
|
1377
|
-
currentTaskId:
|
|
1581
|
+
var approvalDecidedPayloadSchema = z22.object({
|
|
1582
|
+
approvalId: z22.string().min(1),
|
|
1583
|
+
status: z22.enum([ApprovalStatus.APPROVED, ApprovalStatus.REJECTED]),
|
|
1584
|
+
oneTimeToken: z22.string().min(1).optional()
|
|
1585
|
+
});
|
|
1586
|
+
var agentPresenceUiPayloadSchema = z22.object({
|
|
1587
|
+
projectId: z22.string().min(1),
|
|
1588
|
+
agentId: z22.string().min(1),
|
|
1589
|
+
status: z22.enum(agentStatusValues),
|
|
1590
|
+
lastSeenAt: z22.string().datetime(),
|
|
1591
|
+
currentTaskId: z22.string().nullable().optional()
|
|
1592
|
+
});
|
|
1593
|
+
var taskOpenPrPayloadSchema = z22.object({
|
|
1594
|
+
taskId: z22.string().min(1),
|
|
1595
|
+
/** Ветка, которую клиент уже отправил на remote. */
|
|
1596
|
+
branchName: z22.string().min(1),
|
|
1597
|
+
/** Rebase на основную ветку не прошёл — PR помечается «conflicts» (§13.1 ТЗ). */
|
|
1598
|
+
conflicted: z22.boolean().optional(),
|
|
1599
|
+
/** Только пути файлов, никогда содержимое (§18 ТЗ). */
|
|
1600
|
+
conflictedFiles: z22.array(z22.string().min(1)).max(100).optional()
|
|
1601
|
+
});
|
|
1602
|
+
var taskOpenPrAckSchema = z22.object({
|
|
1603
|
+
url: z22.string().url(),
|
|
1604
|
+
number: z22.number().int().positive(),
|
|
1605
|
+
/** `false` — PR уже существовал для этой ветки, повторно не создавали. */
|
|
1606
|
+
created: z22.boolean()
|
|
1378
1607
|
});
|
|
1379
1608
|
|
|
1380
1609
|
// ../shared/src/events/ticket.ts
|
|
1381
|
-
import { z as
|
|
1382
|
-
var realtimeTicketPayloadSchema =
|
|
1383
|
-
sub:
|
|
1384
|
-
orgIds:
|
|
1385
|
-
projectIds:
|
|
1386
|
-
iat:
|
|
1387
|
-
exp:
|
|
1388
|
-
jti:
|
|
1389
|
-
});
|
|
1390
|
-
var roomJoinRequestSchema =
|
|
1391
|
-
room:
|
|
1392
|
-
projectId:
|
|
1610
|
+
import { z as z23 } from "zod";
|
|
1611
|
+
var realtimeTicketPayloadSchema = z23.object({
|
|
1612
|
+
sub: z23.string().min(1),
|
|
1613
|
+
orgIds: z23.array(z23.string().min(1)),
|
|
1614
|
+
projectIds: z23.array(z23.string().min(1)),
|
|
1615
|
+
iat: z23.number().int().positive(),
|
|
1616
|
+
exp: z23.number().int().positive(),
|
|
1617
|
+
jti: z23.string().min(1)
|
|
1618
|
+
});
|
|
1619
|
+
var roomJoinRequestSchema = z23.object({
|
|
1620
|
+
room: z23.string().min(1),
|
|
1621
|
+
projectId: z23.string().min(1).optional()
|
|
1393
1622
|
});
|
|
1394
1623
|
|
|
1395
1624
|
// ../shared/src/events/ui-events.ts
|
|
1396
|
-
import { z as
|
|
1625
|
+
import { z as z24 } from "zod";
|
|
1397
1626
|
var taskStatusValues4 = Object.values(TaskStatus);
|
|
1398
|
-
var taskCreatedPayloadSchema =
|
|
1399
|
-
taskId:
|
|
1400
|
-
projectId:
|
|
1401
|
-
orgId:
|
|
1402
|
-
});
|
|
1403
|
-
var taskUpdatedPayloadSchema =
|
|
1404
|
-
taskId:
|
|
1405
|
-
projectId:
|
|
1406
|
-
orgId:
|
|
1627
|
+
var taskCreatedPayloadSchema = z24.object({
|
|
1628
|
+
taskId: z24.string().min(1),
|
|
1629
|
+
projectId: z24.string().min(1),
|
|
1630
|
+
orgId: z24.string().min(1)
|
|
1631
|
+
});
|
|
1632
|
+
var taskUpdatedPayloadSchema = z24.object({
|
|
1633
|
+
taskId: z24.string().min(1),
|
|
1634
|
+
projectId: z24.string().min(1),
|
|
1635
|
+
orgId: z24.string().min(1),
|
|
1407
1636
|
// Необязательный частичный diff — подсказка для оптимистичного мерджа на
|
|
1408
1637
|
// клиенте. Не гарантирует полноты: клиент обязан доверять только REST.
|
|
1409
|
-
patch:
|
|
1638
|
+
patch: z24.record(z24.string(), z24.unknown()).optional()
|
|
1410
1639
|
});
|
|
1411
|
-
var taskDeletedPayloadSchema =
|
|
1412
|
-
taskId:
|
|
1413
|
-
projectId:
|
|
1414
|
-
orgId:
|
|
1640
|
+
var taskDeletedPayloadSchema = z24.object({
|
|
1641
|
+
taskId: z24.string().min(1),
|
|
1642
|
+
projectId: z24.string().min(1),
|
|
1643
|
+
orgId: z24.string().min(1)
|
|
1415
1644
|
});
|
|
1416
|
-
var taskMovedPayloadSchema =
|
|
1417
|
-
taskId:
|
|
1418
|
-
projectId:
|
|
1419
|
-
orgId:
|
|
1645
|
+
var taskMovedPayloadSchema = z24.object({
|
|
1646
|
+
taskId: z24.string().min(1),
|
|
1647
|
+
projectId: z24.string().min(1),
|
|
1648
|
+
orgId: z24.string().min(1),
|
|
1420
1649
|
// Новый статус/позиция — нужны доске (P1-11) для немедленного
|
|
1421
1650
|
// перемещения карточки без ожидания REST-рефетча.
|
|
1422
|
-
status:
|
|
1423
|
-
order:
|
|
1651
|
+
status: z24.enum(taskStatusValues4),
|
|
1652
|
+
order: z24.number()
|
|
1424
1653
|
});
|
|
1425
|
-
var notificationNewPayloadSchema =
|
|
1426
|
-
notificationId:
|
|
1654
|
+
var notificationNewPayloadSchema = z24.object({
|
|
1655
|
+
notificationId: z24.string().min(1),
|
|
1427
1656
|
// userId, не membershipId: `apps/realtime` адресует личную комнату
|
|
1428
1657
|
// `user:{userId}` (см. rooms.ts) — так же, как ticket.sub.
|
|
1429
|
-
userId:
|
|
1430
|
-
kind:
|
|
1431
|
-
title:
|
|
1432
|
-
body:
|
|
1433
|
-
link:
|
|
1434
|
-
});
|
|
1435
|
-
var futurePlaceholderPayloadSchema =
|
|
1436
|
-
projectId:
|
|
1658
|
+
userId: z24.string().min(1),
|
|
1659
|
+
kind: z24.string().min(1),
|
|
1660
|
+
title: z24.string().min(1),
|
|
1661
|
+
body: z24.string().optional(),
|
|
1662
|
+
link: z24.string().optional()
|
|
1663
|
+
});
|
|
1664
|
+
var futurePlaceholderPayloadSchema = z24.object({
|
|
1665
|
+
projectId: z24.string().min(1)
|
|
1437
1666
|
}).loose();
|
|
1438
|
-
var questionEventPayloadSchema =
|
|
1439
|
-
questionId:
|
|
1440
|
-
projectId:
|
|
1441
|
-
orgId:
|
|
1442
|
-
taskId:
|
|
1667
|
+
var questionEventPayloadSchema = z24.object({
|
|
1668
|
+
questionId: z24.string().min(1),
|
|
1669
|
+
projectId: z24.string().min(1),
|
|
1670
|
+
orgId: z24.string().min(1),
|
|
1671
|
+
taskId: z24.string().min(1).nullable().optional(),
|
|
1443
1672
|
/** Кому адресован — роль или конкретный участник; для фильтра «мне» в UI. */
|
|
1444
|
-
targetRole:
|
|
1445
|
-
targetMemberId:
|
|
1446
|
-
blocking:
|
|
1673
|
+
targetRole: z24.string().min(1).nullable().optional(),
|
|
1674
|
+
targetMemberId: z24.string().min(1).nullable().optional(),
|
|
1675
|
+
blocking: z24.boolean().optional()
|
|
1447
1676
|
});
|
|
1448
1677
|
var envelopeExtra = {
|
|
1449
|
-
publishedAt:
|
|
1678
|
+
publishedAt: z24.string().datetime().optional()
|
|
1450
1679
|
};
|
|
1451
|
-
var uiEventEnvelopeSchema =
|
|
1452
|
-
|
|
1453
|
-
event:
|
|
1680
|
+
var uiEventEnvelopeSchema = z24.discriminatedUnion("event", [
|
|
1681
|
+
z24.object({
|
|
1682
|
+
event: z24.literal("task:created"),
|
|
1454
1683
|
payload: taskCreatedPayloadSchema,
|
|
1455
1684
|
...envelopeExtra
|
|
1456
1685
|
}),
|
|
1457
|
-
|
|
1458
|
-
event:
|
|
1686
|
+
z24.object({
|
|
1687
|
+
event: z24.literal("task:updated"),
|
|
1459
1688
|
payload: taskUpdatedPayloadSchema,
|
|
1460
1689
|
...envelopeExtra
|
|
1461
1690
|
}),
|
|
1462
|
-
|
|
1463
|
-
event:
|
|
1691
|
+
z24.object({
|
|
1692
|
+
event: z24.literal("task:deleted"),
|
|
1464
1693
|
payload: taskDeletedPayloadSchema,
|
|
1465
1694
|
...envelopeExtra
|
|
1466
1695
|
}),
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
event:
|
|
1696
|
+
z24.object({ event: z24.literal("task:moved"), payload: taskMovedPayloadSchema, ...envelopeExtra }),
|
|
1697
|
+
z24.object({
|
|
1698
|
+
event: z24.literal("notification:new"),
|
|
1470
1699
|
payload: notificationNewPayloadSchema,
|
|
1471
1700
|
...envelopeExtra
|
|
1472
1701
|
}),
|
|
1473
1702
|
// Заготовки под фазу 2+ (§11.3 ТЗ упоминает `question:*`/`approval:*` как
|
|
1474
1703
|
// группы, а не точные имена — ниже разумное предположение, подлежит
|
|
1475
1704
|
// уточнению, см. «ВОПРОСЫ» в отчёте P1-10).
|
|
1476
|
-
|
|
1477
|
-
event:
|
|
1705
|
+
z24.object({
|
|
1706
|
+
event: z24.literal("agent:presence"),
|
|
1478
1707
|
payload: futurePlaceholderPayloadSchema,
|
|
1479
1708
|
...envelopeExtra
|
|
1480
1709
|
}),
|
|
1481
|
-
|
|
1482
|
-
event:
|
|
1710
|
+
z24.object({
|
|
1711
|
+
event: z24.literal("question:new"),
|
|
1483
1712
|
payload: questionEventPayloadSchema,
|
|
1484
1713
|
...envelopeExtra
|
|
1485
1714
|
}),
|
|
1486
|
-
|
|
1487
|
-
event:
|
|
1715
|
+
z24.object({
|
|
1716
|
+
event: z24.literal("question:answered"),
|
|
1488
1717
|
payload: questionEventPayloadSchema,
|
|
1489
1718
|
...envelopeExtra
|
|
1490
1719
|
}),
|
|
1491
|
-
|
|
1492
|
-
event:
|
|
1720
|
+
z24.object({
|
|
1721
|
+
event: z24.literal("question:dismissed"),
|
|
1493
1722
|
payload: questionEventPayloadSchema,
|
|
1494
1723
|
...envelopeExtra
|
|
1495
1724
|
}),
|
|
1496
|
-
|
|
1497
|
-
event:
|
|
1725
|
+
z24.object({
|
|
1726
|
+
event: z24.literal("approval:requested"),
|
|
1498
1727
|
payload: futurePlaceholderPayloadSchema,
|
|
1499
1728
|
...envelopeExtra
|
|
1500
1729
|
}),
|
|
1501
|
-
|
|
1502
|
-
event:
|
|
1730
|
+
z24.object({
|
|
1731
|
+
event: z24.literal("approval:decided"),
|
|
1503
1732
|
payload: futurePlaceholderPayloadSchema,
|
|
1504
1733
|
...envelopeExtra
|
|
1505
1734
|
}),
|
|
1506
|
-
|
|
1507
|
-
event:
|
|
1735
|
+
z24.object({
|
|
1736
|
+
event: z24.literal("audit:appended"),
|
|
1508
1737
|
payload: futurePlaceholderPayloadSchema,
|
|
1509
1738
|
...envelopeExtra
|
|
1510
1739
|
}),
|
|
1511
|
-
|
|
1740
|
+
z24.object({
|
|
1512
1741
|
// Состояние проекта изменилось (OQ-30). Единственное событие этого
|
|
1513
1742
|
// канала, которое realtime рассылает НЕ только в `/ui`, но и агентам
|
|
1514
1743
|
// проекта: §17 ТЗ обещает «при PAUSED агентам шлётся agent:pause», а
|
|
1515
1744
|
// одностороннего agent:pause на рукопожатии для этого мало — снятие
|
|
1516
1745
|
// паузы до подключённого агента не доходит вовсе. Веб публикует одно
|
|
1517
1746
|
// событие, realtime разводит его по обоим namespace.
|
|
1518
|
-
event:
|
|
1519
|
-
payload:
|
|
1520
|
-
projectId:
|
|
1521
|
-
paused:
|
|
1522
|
-
mode:
|
|
1523
|
-
reason:
|
|
1747
|
+
event: z24.literal("project:state"),
|
|
1748
|
+
payload: z24.object({
|
|
1749
|
+
projectId: z24.string().min(1),
|
|
1750
|
+
paused: z24.boolean(),
|
|
1751
|
+
mode: z24.string().min(1),
|
|
1752
|
+
reason: z24.string().optional()
|
|
1524
1753
|
}),
|
|
1525
1754
|
...envelopeExtra
|
|
1526
1755
|
})
|
|
1527
1756
|
]);
|
|
1528
1757
|
|
|
1758
|
+
// ../shared/src/git/trailer.ts
|
|
1759
|
+
var TASK_TRAILER_NAME = "Quiel-Task";
|
|
1760
|
+
function buildTaskTrailer(taskKey) {
|
|
1761
|
+
return `${TASK_TRAILER_NAME}: ${taskKey}`;
|
|
1762
|
+
}
|
|
1763
|
+
|
|
1529
1764
|
// ../shared/src/import/csv.ts
|
|
1530
1765
|
var TASK_TYPE_VALUES = new Set(Object.values(TaskType));
|
|
1531
1766
|
var PRIORITY_VALUES = new Set(Object.values(Priority));
|
|
1532
1767
|
var EXECUTOR_VALUES = new Set(Object.values(Executor));
|
|
1533
1768
|
|
|
1534
1769
|
// ../shared/src/import/types.ts
|
|
1535
|
-
import { z as
|
|
1536
|
-
var ImportTargetStatusSchema =
|
|
1770
|
+
import { z as z25 } from "zod";
|
|
1771
|
+
var ImportTargetStatusSchema = z25.enum([
|
|
1537
1772
|
TaskStatus.BACKLOG,
|
|
1538
1773
|
TaskStatus.READY,
|
|
1539
1774
|
TaskStatus.DONE
|
|
1540
1775
|
]);
|
|
1541
|
-
var ImportRowKeySchema =
|
|
1542
|
-
var ImportTaskInputSchema =
|
|
1776
|
+
var ImportRowKeySchema = z25.string().trim().min(1).max(100);
|
|
1777
|
+
var ImportTaskInputSchema = z25.object({
|
|
1543
1778
|
key: ImportRowKeySchema,
|
|
1544
1779
|
title: TaskTitleSchema,
|
|
1545
1780
|
descriptionMd: TaskDescriptionSchema.default(""),
|
|
@@ -1547,21 +1782,21 @@ var ImportTaskInputSchema = z24.object({
|
|
|
1547
1782
|
priority: TaskPrioritySchema.default(Priority.P2),
|
|
1548
1783
|
executor: TaskExecutorSchema.default(Executor.ANY),
|
|
1549
1784
|
status: ImportTargetStatusSchema.default(TaskStatus.BACKLOG),
|
|
1550
|
-
roleKey:
|
|
1551
|
-
milestoneId:
|
|
1785
|
+
roleKey: z25.string().trim().min(1).max(60).optional(),
|
|
1786
|
+
milestoneId: z25.string().min(1).optional(),
|
|
1552
1787
|
labels: TaskLabelsSchema.default([]),
|
|
1553
1788
|
metadata: TaskMetadataSchema.default({}),
|
|
1554
1789
|
acceptance: TaskAcceptanceSchema.optional(),
|
|
1555
1790
|
estimateMin: TaskEstimateMinSchema.optional(),
|
|
1556
1791
|
parentKey: ImportRowKeySchema.optional()
|
|
1557
1792
|
});
|
|
1558
|
-
var ImportTasksRequestSchema =
|
|
1559
|
-
tasks:
|
|
1793
|
+
var ImportTasksRequestSchema = z25.object({
|
|
1794
|
+
tasks: z25.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")
|
|
1560
1795
|
});
|
|
1561
1796
|
|
|
1562
1797
|
// ../shared/src/settings/org-settings.ts
|
|
1563
|
-
import { z as
|
|
1564
|
-
var OrgSettingsSchema =
|
|
1798
|
+
import { z as z26 } from "zod";
|
|
1799
|
+
var OrgSettingsSchema = z26.object({}).passthrough();
|
|
1565
1800
|
|
|
1566
1801
|
// ../shared/src/task-state.ts
|
|
1567
1802
|
var TASK_TRANSITIONS = [
|
|
@@ -2740,13 +2975,13 @@ function evaluateFileAccess(relativePath, rules) {
|
|
|
2740
2975
|
}
|
|
2741
2976
|
|
|
2742
2977
|
// src/state/schema.ts
|
|
2743
|
-
import { z as
|
|
2978
|
+
import { z as z27 } from "zod";
|
|
2744
2979
|
var STATE_SCHEMA_VERSION = 1;
|
|
2745
|
-
var CurrentTaskSchema =
|
|
2746
|
-
taskId:
|
|
2980
|
+
var CurrentTaskSchema = z27.object({
|
|
2981
|
+
taskId: z27.string().min(1),
|
|
2747
2982
|
/** Человекочитаемый ключ вроде `REL-42` — для текста в хуках. Необязателен: на первых порах может быть неизвестен. */
|
|
2748
|
-
taskKey:
|
|
2749
|
-
resumeToken:
|
|
2983
|
+
taskKey: z27.string().min(1).optional(),
|
|
2984
|
+
resumeToken: z27.string().min(1),
|
|
2750
2985
|
/**
|
|
2751
2986
|
* Каталог, в котором агент работает над этой задачей (`.claude/worktrees/…`).
|
|
2752
2987
|
*
|
|
@@ -2760,58 +2995,72 @@ var CurrentTaskSchema = z26.object({
|
|
|
2760
2995
|
* в чекауте), а у состояний, записанных прежними версиями клиента,
|
|
2761
2996
|
* поля просто нет.
|
|
2762
2997
|
*/
|
|
2763
|
-
worktreeDir:
|
|
2764
|
-
|
|
2765
|
-
|
|
2766
|
-
|
|
2767
|
-
|
|
2768
|
-
|
|
2769
|
-
|
|
2770
|
-
|
|
2771
|
-
|
|
2772
|
-
|
|
2998
|
+
worktreeDir: z27.string().min(1).optional(),
|
|
2999
|
+
/**
|
|
3000
|
+
* Git-режим проекта (§13.1 ТЗ) — `DIRECT` или `PR`.
|
|
3001
|
+
*
|
|
3002
|
+
* Хранится ЗДЕСЬ, а не спрашивается у модели аргументом тула, по той же
|
|
3003
|
+
* причине, по которой сервер сам считает `branchName`: это настройка
|
|
3004
|
+
* проекта, а не решение исполнителя. Приди она параметром — модель
|
|
3005
|
+
* могла бы (случайно или по «так быстрее») передать `DIRECT` там, где
|
|
3006
|
+
* проект требует ревью через PR, и работа уехала бы прямо в основную
|
|
3007
|
+
* ветку мимо человека.
|
|
3008
|
+
*
|
|
3009
|
+
* Необязательно: состояния, записанные прежними версиями клиента, поля
|
|
3010
|
+
* не имеют — тогда `submit_work` работает как раньше, в режиме DIRECT.
|
|
3011
|
+
*/
|
|
3012
|
+
gitMode: z27.enum([GitMode.DIRECT, GitMode.PR]).optional()
|
|
3013
|
+
});
|
|
3014
|
+
var TrustCacheSchema = z27.object({
|
|
3015
|
+
profileKey: z27.string().min(1),
|
|
3016
|
+
updatedAt: z27.string(),
|
|
3017
|
+
rules: z27.object({
|
|
3018
|
+
bash: z27.object({
|
|
3019
|
+
mode: z27.enum(["allow", "approve", "deny"]),
|
|
3020
|
+
stopPatterns: z27.array(z27.string()).default([]),
|
|
3021
|
+
allowPatterns: z27.array(z27.string()).optional()
|
|
2773
3022
|
}),
|
|
2774
|
-
files:
|
|
2775
|
-
mode:
|
|
2776
|
-
protectedPaths:
|
|
3023
|
+
files: z27.object({
|
|
3024
|
+
mode: z27.enum(["allow", "approve"]),
|
|
3025
|
+
protectedPaths: z27.array(z27.string()).default([])
|
|
2777
3026
|
}).optional(),
|
|
2778
|
-
git:
|
|
2779
|
-
network:
|
|
2780
|
-
approvalTtlMin:
|
|
3027
|
+
git: z27.object({ allowPushDefault: z27.boolean(), allowForcePush: z27.boolean() }).optional(),
|
|
3028
|
+
network: z27.object({ allowSsh: z27.boolean(), sshHostsAllow: z27.array(z27.string()).optional() }).optional(),
|
|
3029
|
+
approvalTtlMin: z27.number().int().positive().optional()
|
|
2781
3030
|
}).passthrough()
|
|
2782
3031
|
}).nullable();
|
|
2783
|
-
var ApprovedCommandSchema =
|
|
2784
|
-
token:
|
|
2785
|
-
command:
|
|
2786
|
-
cwd:
|
|
2787
|
-
expiresAt:
|
|
2788
|
-
createdAt:
|
|
2789
|
-
});
|
|
2790
|
-
var PendingApprovalSchema =
|
|
2791
|
-
command:
|
|
2792
|
-
cwd:
|
|
2793
|
-
createdAt:
|
|
2794
|
-
});
|
|
2795
|
-
var AgentModeSchema =
|
|
3032
|
+
var ApprovedCommandSchema = z27.object({
|
|
3033
|
+
token: z27.string().min(1),
|
|
3034
|
+
command: z27.string().min(1),
|
|
3035
|
+
cwd: z27.string().min(1),
|
|
3036
|
+
expiresAt: z27.string(),
|
|
3037
|
+
createdAt: z27.string()
|
|
3038
|
+
});
|
|
3039
|
+
var PendingApprovalSchema = z27.object({
|
|
3040
|
+
command: z27.string().min(1),
|
|
3041
|
+
cwd: z27.string().min(1),
|
|
3042
|
+
createdAt: z27.string()
|
|
3043
|
+
});
|
|
3044
|
+
var AgentModeSchema = z27.enum([AgentMode.AUTONOMOUS, AgentMode.MANUAL]);
|
|
2796
3045
|
var DEFAULT_CONTEXT_RESET_AFTER_TASKS = ProjectSettingsSchema.parse({}).contextResetAfterTasks;
|
|
2797
|
-
var ClientStateSchema =
|
|
2798
|
-
version:
|
|
3046
|
+
var ClientStateSchema = z27.object({
|
|
3047
|
+
version: z27.literal(STATE_SCHEMA_VERSION).default(STATE_SCHEMA_VERSION),
|
|
2799
3048
|
mode: AgentModeSchema.default(AgentMode.MANUAL),
|
|
2800
3049
|
currentTask: CurrentTaskSchema.nullable().default(null),
|
|
2801
3050
|
/** Счётчик сдач задач в текущей «сессии» (§10.4 ТЗ). Сбрасывается `SessionStart` при `source ∈ {startup, clear}` — см. src/hooks/session-start.ts. */
|
|
2802
|
-
tasksCompletedInSession:
|
|
3051
|
+
tasksCompletedInSession: z27.number().int().nonnegative().default(0),
|
|
2803
3052
|
/** Кэш `ProjectSettings.contextResetAfterTasks` (§7.2 ТЗ) — сколько задач подряд можно сдать, прежде чем `Stop`-хук попросит `/clear`. */
|
|
2804
|
-
contextResetAfterTasks:
|
|
3053
|
+
contextResetAfterTasks: z27.number().int().positive().default(DEFAULT_CONTEXT_RESET_AFTER_TASKS),
|
|
2805
3054
|
/** Кэш стоп-паттернов/правил доверия для `PreToolUse` фазы 4. */
|
|
2806
3055
|
trust: TrustCacheSchema.default(null),
|
|
2807
3056
|
/** Снимок задачи на момент последнего `PreCompact` — пишет src/hooks/pre-compact.ts, читает SessionStart(source="compact"), чтобы напомнить модели, чем она занималась. */
|
|
2808
|
-
lastPreCompact: CurrentTaskSchema.extend({ savedAt:
|
|
3057
|
+
lastPreCompact: CurrentTaskSchema.extend({ savedAt: z27.string() }).nullable().default(null),
|
|
2809
3058
|
/** Кэш одноразовых токенов подтверждения (§14.4 ТЗ), ключ — `hashCommandKey(command, cwd)`. Читает/жжёт `PreToolUse` (`hooks/pre-tool-use.ts`), пишут `request_approval`/`wait_approval` и пуш `approval:decided` (`socket/client.ts`). */
|
|
2810
|
-
approvedCommands:
|
|
3059
|
+
approvedCommands: z27.record(z27.string(), ApprovedCommandSchema).default({}),
|
|
2811
3060
|
/** Незавершённые запросы подтверждения, ключ — `approvalId`. См. `PendingApprovalSchema`. */
|
|
2812
|
-
pendingApprovals:
|
|
3061
|
+
pendingApprovals: z27.record(z27.string(), PendingApprovalSchema).default({}),
|
|
2813
3062
|
/** Штамп последней записи файла — выставляется в state/store.ts при каждом `writeState`. */
|
|
2814
|
-
updatedAt:
|
|
3063
|
+
updatedAt: z27.string().default(() => (/* @__PURE__ */ new Date()).toISOString())
|
|
2815
3064
|
});
|
|
2816
3065
|
function createDefaultState() {
|
|
2817
3066
|
return ClientStateSchema.parse({});
|
|
@@ -2863,18 +3112,18 @@ function updateState(patch, filePath = getStateFilePath()) {
|
|
|
2863
3112
|
}
|
|
2864
3113
|
|
|
2865
3114
|
// src/config/schema.ts
|
|
2866
|
-
import { z as
|
|
3115
|
+
import { z as z28 } from "zod";
|
|
2867
3116
|
var PROJECT_CONFIG_SCHEMA_VERSION = 1;
|
|
2868
|
-
var ProjectConfigSchema =
|
|
2869
|
-
version:
|
|
3117
|
+
var ProjectConfigSchema = z28.object({
|
|
3118
|
+
version: z28.literal(PROJECT_CONFIG_SCHEMA_VERSION).default(PROJECT_CONFIG_SCHEMA_VERSION),
|
|
2870
3119
|
/** URL платформы (§10.1 ТЗ), например `https://quiel.example.com`. */
|
|
2871
|
-
url:
|
|
3120
|
+
url: z28.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"),
|
|
2872
3121
|
/** Ключ проекта на платформе (OQ-11), например `REL`. */
|
|
2873
|
-
projectKey:
|
|
3122
|
+
projectKey: z28.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"),
|
|
2874
3123
|
/** Идентификатор агента — см. комментарий выше. */
|
|
2875
|
-
agentId:
|
|
3124
|
+
agentId: z28.string().trim().min(1, "ID \u0430\u0433\u0435\u043D\u0442\u0430 \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u0435\u043D"),
|
|
2876
3125
|
/** Человекочитаемое имя агента (§7.4 ТЗ: «odya-macbook») — необязательно, только для локального отображения. */
|
|
2877
|
-
agentName:
|
|
3126
|
+
agentName: z28.string().trim().min(1).optional(),
|
|
2878
3127
|
/** Роли, с которыми агент забирает задачи — подмножество ролей участника (§7.4 ТЗ). */
|
|
2879
3128
|
roleKeys: AgentRoleKeysSchema,
|
|
2880
3129
|
/**
|
|
@@ -2894,19 +3143,19 @@ var ProjectConfigSchema = z27.object({
|
|
|
2894
3143
|
* абсолютный путь вроде `/Users/odya/...` у коллеги на другой машине
|
|
2895
3144
|
* оказался бы битым. Режим переносим — это соглашение проекта.
|
|
2896
3145
|
*/
|
|
2897
|
-
worktrees:
|
|
3146
|
+
worktrees: z28.enum(["isolated", "checkout"]).default("isolated")
|
|
2898
3147
|
});
|
|
2899
|
-
var CredentialsEntrySchema =
|
|
2900
|
-
url:
|
|
2901
|
-
token:
|
|
2902
|
-
projectKey:
|
|
3148
|
+
var CredentialsEntrySchema = z28.object({
|
|
3149
|
+
url: z28.string().trim().url(),
|
|
3150
|
+
token: z28.string().min(1),
|
|
3151
|
+
projectKey: z28.string().min(1),
|
|
2903
3152
|
/** Когда записали — для диагностики (`quiel status`), не для логики. */
|
|
2904
|
-
savedAt:
|
|
3153
|
+
savedAt: z28.string()
|
|
2905
3154
|
});
|
|
2906
3155
|
var CREDENTIALS_SCHEMA_VERSION = 1;
|
|
2907
|
-
var CredentialsFileSchema =
|
|
2908
|
-
version:
|
|
2909
|
-
agents:
|
|
3156
|
+
var CredentialsFileSchema = z28.object({
|
|
3157
|
+
version: z28.literal(CREDENTIALS_SCHEMA_VERSION).default(CREDENTIALS_SCHEMA_VERSION),
|
|
3158
|
+
agents: z28.record(z28.string(), CredentialsEntrySchema).default({})
|
|
2910
3159
|
});
|
|
2911
3160
|
function createEmptyCredentialsFile() {
|
|
2912
3161
|
return CredentialsFileSchema.parse({});
|
|
@@ -2987,13 +3236,13 @@ function ensureWorktreesIgnored(dir) {
|
|
|
2987
3236
|
// src/config/mcp-json.ts
|
|
2988
3237
|
import { existsSync as existsSync6, readFileSync as readFileSync6, writeFileSync as writeFileSync6 } from "fs";
|
|
2989
3238
|
import { join as join6 } from "path";
|
|
2990
|
-
import { z as
|
|
2991
|
-
var McpServerEntrySchema2 =
|
|
2992
|
-
command:
|
|
2993
|
-
args:
|
|
3239
|
+
import { z as z29 } from "zod";
|
|
3240
|
+
var McpServerEntrySchema2 = z29.object({
|
|
3241
|
+
command: z29.string().min(1).optional(),
|
|
3242
|
+
args: z29.array(z29.string()).optional()
|
|
2994
3243
|
}).passthrough();
|
|
2995
|
-
var McpJsonSchema =
|
|
2996
|
-
mcpServers:
|
|
3244
|
+
var McpJsonSchema = z29.object({
|
|
3245
|
+
mcpServers: z29.record(z29.string(), McpServerEntrySchema2).optional()
|
|
2997
3246
|
}).passthrough();
|
|
2998
3247
|
var MCP_JSON_RELATIVE_PATH = ".mcp.json";
|
|
2999
3248
|
function getMcpJsonPath(dir) {
|
|
@@ -3872,12 +4121,21 @@ ${question.answerMd ?? ""}`;
|
|
|
3872
4121
|
// package.json
|
|
3873
4122
|
var package_default = {
|
|
3874
4123
|
name: "@quiel/cli",
|
|
3875
|
-
version: "0.
|
|
3876
|
-
description: "CLI \u0438 MCP-\u0441\u0435\u0440\u0432\u0435\u0440
|
|
4124
|
+
version: "0.3.0",
|
|
4125
|
+
description: "CLI \u0438 MCP-\u0441\u0435\u0440\u0432\u0435\u0440 Quiel: \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0430\u0435\u0442 Claude Code \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0430 \u043A \u043F\u043B\u0430\u0442\u0444\u043E\u0440\u043C\u0435",
|
|
4126
|
+
homepage: "https://quiel.ai",
|
|
4127
|
+
keywords: [
|
|
4128
|
+
"quiel",
|
|
4129
|
+
"claude-code",
|
|
4130
|
+
"mcp",
|
|
4131
|
+
"mcp-server",
|
|
4132
|
+
"ai-agents",
|
|
4133
|
+
"task-tracker"
|
|
4134
|
+
],
|
|
3877
4135
|
license: "UNLICENSED",
|
|
3878
4136
|
type: "module",
|
|
3879
4137
|
bin: {
|
|
3880
|
-
quiel: "
|
|
4138
|
+
quiel: "dist/cli.js"
|
|
3881
4139
|
},
|
|
3882
4140
|
files: [
|
|
3883
4141
|
"dist"
|
|
@@ -3919,7 +4177,17 @@ var MCP_SERVER_NAME = "quiel";
|
|
|
3919
4177
|
var MCP_SERVER_VERSION = VERSION;
|
|
3920
4178
|
|
|
3921
4179
|
// src/mcp/get-context.ts
|
|
3922
|
-
var ALL_CONTEXT_INCLUDES = [
|
|
4180
|
+
var ALL_CONTEXT_INCLUDES = [
|
|
4181
|
+
"spec",
|
|
4182
|
+
"decisions",
|
|
4183
|
+
// ВСЕ документы проекта — по умолчанию, а не по особому запросу.
|
|
4184
|
+
// `spec`/`decisions` покрывают два типа из пяти, и человек, положивший
|
|
4185
|
+
// контекст под типом `DATA` или `PLAN`, вправе ожидать, что агент его
|
|
4186
|
+
// увидит. 14 сентября 2026 ровно этого и не случилось.
|
|
4187
|
+
"documents",
|
|
4188
|
+
"related",
|
|
4189
|
+
"repo"
|
|
4190
|
+
];
|
|
3923
4191
|
var getContextInputShape = {
|
|
3924
4192
|
taskId: contextGetPayloadSchema.shape.taskId.describe(
|
|
3925
4193
|
"ID \u0437\u0430\u0434\u0430\u0447\u0438, \u0434\u043B\u044F \u043A\u043E\u0442\u043E\u0440\u043E\u0439 \u043D\u0443\u0436\u0435\u043D \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442. \u0415\u0441\u043B\u0438 \u043D\u0435 \u043F\u0435\u0440\u0435\u0434\u0430\u043D \u2014 \u0431\u0435\u0440\u0451\u0442\u0441\u044F \u0442\u0435\u043A\u0443\u0449\u0430\u044F \u0437\u0430\u0434\u0430\u0447\u0430 \u0430\u0433\u0435\u043D\u0442\u0430 (\u0435\u0441\u043B\u0438 \u0435\u0441\u0442\u044C)."
|
|
@@ -4130,7 +4398,7 @@ function buildCommitMessage(params) {
|
|
|
4130
4398
|
const subject = `${params.commitPrefix} ${params.title}`.trim();
|
|
4131
4399
|
return `${subject}
|
|
4132
4400
|
|
|
4133
|
-
|
|
4401
|
+
${buildTaskTrailer(params.taskKey)}
|
|
4134
4402
|
`;
|
|
4135
4403
|
}
|
|
4136
4404
|
async function commitAll(params) {
|
|
@@ -4383,6 +4651,77 @@ async function submitDirectTask(params) {
|
|
|
4383
4651
|
};
|
|
4384
4652
|
}
|
|
4385
4653
|
|
|
4654
|
+
// src/git/submit-pr.ts
|
|
4655
|
+
async function pushTaskBranch(params) {
|
|
4656
|
+
const remote = params.remote ?? "origin";
|
|
4657
|
+
const branchCheck = requireValidBranchName(params.branchName, "\u0418\u043C\u044F \u0432\u0435\u0442\u043A\u0438 \u0437\u0430\u0434\u0430\u0447\u0438");
|
|
4658
|
+
if (!branchCheck.ok) return branchCheck;
|
|
4659
|
+
const ready = await assertReadyToPush(params);
|
|
4660
|
+
if (!ready.ok) return ready;
|
|
4661
|
+
const pushResult = await runGit(
|
|
4662
|
+
["push", "--set-upstream", remote, `HEAD:refs/heads/${params.branchName}`],
|
|
4663
|
+
{ cwd: params.worktreeDir }
|
|
4664
|
+
);
|
|
4665
|
+
if (!pushResult.ok) {
|
|
4666
|
+
return gitErr(
|
|
4667
|
+
describeGitFailure(`git push ${remote} HEAD:refs/heads/${params.branchName}`, pushResult)
|
|
4668
|
+
);
|
|
4669
|
+
}
|
|
4670
|
+
return gitOk({ pushedTo: `${remote}/${params.branchName}` });
|
|
4671
|
+
}
|
|
4672
|
+
async function submitPullRequestTask(params) {
|
|
4673
|
+
const remote = params.remote ?? "origin";
|
|
4674
|
+
let worktreeDir;
|
|
4675
|
+
if (params.worktreeDir) {
|
|
4676
|
+
worktreeDir = params.worktreeDir;
|
|
4677
|
+
} else {
|
|
4678
|
+
const worktree = await ensureWorktree({
|
|
4679
|
+
repoRoot: params.repoRoot,
|
|
4680
|
+
branchName: params.branchName,
|
|
4681
|
+
defaultBranch: params.defaultBranch,
|
|
4682
|
+
remote,
|
|
4683
|
+
worktreesRoot: params.worktreesRoot
|
|
4684
|
+
});
|
|
4685
|
+
if (!worktree.ok) return { status: "refused", message: worktree.message };
|
|
4686
|
+
worktreeDir = worktree.data.worktreeDir;
|
|
4687
|
+
}
|
|
4688
|
+
const commit = await commitAll({
|
|
4689
|
+
worktreeDir,
|
|
4690
|
+
commitPrefix: params.commitPrefix,
|
|
4691
|
+
title: params.taskTitle,
|
|
4692
|
+
taskKey: params.taskKey
|
|
4693
|
+
});
|
|
4694
|
+
if (!commit.ok) return { status: "refused", worktreeDir, message: commit.message };
|
|
4695
|
+
const rebase = await rebaseOntoDefault({
|
|
4696
|
+
worktreeDir,
|
|
4697
|
+
defaultBranch: params.defaultBranch,
|
|
4698
|
+
remote
|
|
4699
|
+
});
|
|
4700
|
+
if (!rebase.ok) return { status: "refused", worktreeDir, message: rebase.message };
|
|
4701
|
+
const conflicted = rebase.data.outcome === "conflict";
|
|
4702
|
+
const push = await pushTaskBranch({ worktreeDir, branchName: params.branchName, remote });
|
|
4703
|
+
if (!push.ok) return { status: "refused", worktreeDir, message: push.message };
|
|
4704
|
+
const sha = await getHeadSha(worktreeDir);
|
|
4705
|
+
let worktreeRemoved = false;
|
|
4706
|
+
if (params.removeWorktreeOnSuccess !== false) {
|
|
4707
|
+
const removed = await removeWorktree(params.repoRoot, worktreeDir);
|
|
4708
|
+
if (removed.ok) {
|
|
4709
|
+
await runGit(["branch", "-D", params.branchName], { cwd: params.repoRoot });
|
|
4710
|
+
worktreeRemoved = true;
|
|
4711
|
+
}
|
|
4712
|
+
}
|
|
4713
|
+
return {
|
|
4714
|
+
status: "pushed",
|
|
4715
|
+
worktreeDir,
|
|
4716
|
+
branchName: params.branchName,
|
|
4717
|
+
commitSha: sha.ok ? sha.data : null,
|
|
4718
|
+
pushedTo: push.data.pushedTo,
|
|
4719
|
+
conflicted,
|
|
4720
|
+
conflictedFiles: rebase.data.conflictedFiles,
|
|
4721
|
+
worktreeRemoved
|
|
4722
|
+
};
|
|
4723
|
+
}
|
|
4724
|
+
|
|
4386
4725
|
// src/mcp/task-worktree.ts
|
|
4387
4726
|
function planTaskWorktree(project, mode = "isolated") {
|
|
4388
4727
|
if (mode === "checkout") {
|
|
@@ -4454,7 +4793,8 @@ async function nextTaskHandler(args, runtime) {
|
|
|
4454
4793
|
currentTask: {
|
|
4455
4794
|
taskId: task.task.id,
|
|
4456
4795
|
taskKey: task.task.key,
|
|
4457
|
-
resumeToken: task.lease.resumeToken
|
|
4796
|
+
resumeToken: task.lease.resumeToken,
|
|
4797
|
+
gitMode: task.project.gitMode
|
|
4458
4798
|
}
|
|
4459
4799
|
},
|
|
4460
4800
|
stateFilePath
|
|
@@ -4476,6 +4816,7 @@ async function nextTaskHandler(args, runtime) {
|
|
|
4476
4816
|
taskId: task.task.id,
|
|
4477
4817
|
taskKey: task.task.key,
|
|
4478
4818
|
resumeToken: task.lease.resumeToken,
|
|
4819
|
+
gitMode: task.project.gitMode,
|
|
4479
4820
|
worktreeDir: worktree.data.worktreeDir
|
|
4480
4821
|
}
|
|
4481
4822
|
},
|
|
@@ -4738,7 +5079,7 @@ async function settleApproval(ack, commandCwd, runtime, waitSecUsed) {
|
|
|
4738
5079
|
}
|
|
4739
5080
|
|
|
4740
5081
|
// src/mcp/set-mode.ts
|
|
4741
|
-
import { z as
|
|
5082
|
+
import { z as z30 } from "zod";
|
|
4742
5083
|
|
|
4743
5084
|
// src/cli/mode.ts
|
|
4744
5085
|
function parseModeArg(raw) {
|
|
@@ -4779,7 +5120,7 @@ async function requestModeChange(modeArg, options = {}) {
|
|
|
4779
5120
|
|
|
4780
5121
|
// src/mcp/set-mode.ts
|
|
4781
5122
|
var setModeInputShape = {
|
|
4782
|
-
mode:
|
|
5123
|
+
mode: z30.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)")
|
|
4783
5124
|
};
|
|
4784
5125
|
async function setModeHandler(args, runtime) {
|
|
4785
5126
|
const result = await requestModeChange(args.mode, {
|
|
@@ -4794,20 +5135,20 @@ async function setModeHandler(args, runtime) {
|
|
|
4794
5135
|
}
|
|
4795
5136
|
|
|
4796
5137
|
// src/mcp/submit-work.ts
|
|
4797
|
-
import { z as
|
|
5138
|
+
import { z as z31 } from "zod";
|
|
4798
5139
|
var submitWorkInputShape = {
|
|
4799
|
-
branchName:
|
|
5140
|
+
branchName: z31.string().min(1).describe(
|
|
4800
5141
|
"\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."
|
|
4801
5142
|
),
|
|
4802
|
-
defaultBranch:
|
|
4803
|
-
commitPrefix:
|
|
4804
|
-
taskKey:
|
|
4805
|
-
taskTitle:
|
|
4806
|
-
repoRoot:
|
|
4807
|
-
testsPassed:
|
|
5143
|
+
defaultBranch: z31.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."),
|
|
5144
|
+
commitPrefix: z31.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:".'),
|
|
5145
|
+
taskKey: z31.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."),
|
|
5146
|
+
taskTitle: z31.string().min(1).describe("\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u0437\u0430\u0434\u0430\u0447\u0438 \u2014 \u0438\u0437 task.title."),
|
|
5147
|
+
repoRoot: z31.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."),
|
|
5148
|
+
testsPassed: z31.boolean().optional().describe(
|
|
4808
5149
|
"\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."
|
|
4809
5150
|
),
|
|
4810
|
-
requireTestsPassed:
|
|
5151
|
+
requireTestsPassed: z31.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.")
|
|
4811
5152
|
};
|
|
4812
5153
|
async function submitWorkHandler(args, runtime) {
|
|
4813
5154
|
const state = readState(runtime.stateFilePath);
|
|
@@ -4819,6 +5160,9 @@ async function submitWorkHandler(args, runtime) {
|
|
|
4819
5160
|
);
|
|
4820
5161
|
}
|
|
4821
5162
|
}
|
|
5163
|
+
if (state.currentTask?.gitMode === GitMode.PR) {
|
|
5164
|
+
return submitViaPullRequest(args, runtime, state.currentTask);
|
|
5165
|
+
}
|
|
4822
5166
|
const result = await submitDirectTask({
|
|
4823
5167
|
repoRoot: args.repoRoot ?? runtime.cwd,
|
|
4824
5168
|
...state.currentTask?.worktreeDir ? { worktreeDir: state.currentTask.worktreeDir } : {},
|
|
@@ -4848,6 +5192,51 @@ async function submitWorkHandler(args, runtime) {
|
|
|
4848
5192
|
\u041D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E. \u0420\u0430\u0437\u0431\u0435\u0440\u0438\u0441\u044C \u0441 \u043F\u0440\u0438\u0447\u0438\u043D\u043E\u0439 \u0438\u043B\u0438 \u0432\u044B\u0437\u043E\u0432\u0438 report("partial"), \u0435\u0441\u043B\u0438 \u0441\u0430\u043C \u043D\u0435 \u043C\u043E\u0436\u0435\u0448\u044C.`
|
|
4849
5193
|
);
|
|
4850
5194
|
}
|
|
5195
|
+
async function submitViaPullRequest(args, runtime, currentTask) {
|
|
5196
|
+
const result = await submitPullRequestTask({
|
|
5197
|
+
repoRoot: args.repoRoot ?? runtime.cwd,
|
|
5198
|
+
...currentTask.worktreeDir ? { worktreeDir: currentTask.worktreeDir } : {},
|
|
5199
|
+
branchName: args.branchName,
|
|
5200
|
+
defaultBranch: args.defaultBranch,
|
|
5201
|
+
taskKey: args.taskKey,
|
|
5202
|
+
taskTitle: args.taskTitle,
|
|
5203
|
+
commitPrefix: args.commitPrefix
|
|
5204
|
+
});
|
|
5205
|
+
if (result.status !== "pushed") {
|
|
5206
|
+
return errorResult(
|
|
5207
|
+
`${result.message}
|
|
5208
|
+
|
|
5209
|
+
\u041D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E. \u0420\u0430\u0437\u0431\u0435\u0440\u0438\u0441\u044C \u0441 \u043F\u0440\u0438\u0447\u0438\u043D\u043E\u0439 \u0438\u043B\u0438 \u0432\u044B\u0437\u043E\u0432\u0438 report("partial"), \u0435\u0441\u043B\u0438 \u0441\u0430\u043C \u043D\u0435 \u043C\u043E\u0436\u0435\u0448\u044C.`
|
|
5210
|
+
);
|
|
5211
|
+
}
|
|
5212
|
+
const conflictNote = result.conflicted ? `
|
|
5213
|
+
|
|
5214
|
+
\u0412\u041D\u0418\u041C\u0410\u041D\u0418\u0415: rebase \u043D\u0430 ${args.defaultBranch} \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u0443\u0435\u0442 (${result.conflictedFiles.join(", ")}). \u0412\u0435\u0442\u043A\u0430 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0430 \u043A\u0430\u043A \u0435\u0441\u0442\u044C \u2014 \u0442\u0430\u043A \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0422\u0417 \u0434\u043B\u044F PR-\u0440\u0435\u0436\u0438\u043C\u0430. \u041A\u043E\u043D\u0444\u043B\u0438\u043A\u0442 \u0442\u044B \u041D\u0415 \u0440\u0435\u0448\u0430\u0435\u0448\u044C \u0441\u0430\u043C, PR \u0431\u0443\u0434\u0435\u0442 \u043F\u043E\u043C\u0435\u0447\u0435\u043D \xABconflicts\xBB, \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044F \u0447\u0435\u043B\u043E\u0432\u0435\u043A. \u0423\u043F\u043E\u043C\u044F\u043D\u0438 \u044D\u0442\u043E \u0432 report.` : "";
|
|
5215
|
+
const opened = await callServerOrError(
|
|
5216
|
+
runtime.client,
|
|
5217
|
+
"task:open_pr",
|
|
5218
|
+
taskOpenPrPayloadSchema.parse({
|
|
5219
|
+
taskId: currentTask.taskId,
|
|
5220
|
+
branchName: args.branchName,
|
|
5221
|
+
conflicted: result.conflicted,
|
|
5222
|
+
...result.conflictedFiles.length > 0 ? { conflictedFiles: [...result.conflictedFiles] } : {}
|
|
5223
|
+
}),
|
|
5224
|
+
taskOpenPrAckSchema
|
|
5225
|
+
);
|
|
5226
|
+
if (!opened.ok) {
|
|
5227
|
+
return textResult(
|
|
5228
|
+
`\u0412\u0435\u0442\u043A\u0430 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0430 \u0432 ${result.pushedTo}. \u041A\u043E\u043C\u043C\u0438\u0442: ${result.commitSha ?? "\u0431\u0435\u0437 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439"}.` + conflictNote + `
|
|
5229
|
+
|
|
5230
|
+
\u041D\u043E PR \u043F\u043B\u0430\u0442\u0444\u043E\u0440\u043C\u0430 \u043D\u0435 \u043E\u0442\u043A\u0440\u044B\u043B\u0430: ${opened.message}. \u0420\u0430\u0431\u043E\u0442\u0430 \u041D\u0415 \u043F\u043E\u0442\u0435\u0440\u044F\u043D\u0430 \u2014 \u043E\u043D\u0430 \u0432 \u0432\u0435\u0442\u043A\u0435 "${args.branchName}" \u043D\u0430 remote. \u0412\u044B\u0437\u043E\u0432\u0438 report \u0441\u043E \u0441\u0441\u044B\u043B\u043A\u043E\u0439 \u043D\u0430 \u0432\u0435\u0442\u043A\u0443 \u0438 \u0443\u043F\u043E\u043C\u044F\u043D\u0438, \u0447\u0442\u043E PR \u043D\u0435 \u0441\u043E\u0437\u0434\u0430\u043D.`
|
|
5231
|
+
);
|
|
5232
|
+
}
|
|
5233
|
+
const createdNote = opened.data.created ? "PR \u0441\u043E\u0437\u0434\u0430\u043D" : "PR \u0434\u043B\u044F \u044D\u0442\u043E\u0439 \u0432\u0435\u0442\u043A\u0438 \u0443\u0436\u0435 \u0431\u044B\u043B \u043E\u0442\u043A\u0440\u044B\u0442";
|
|
5234
|
+
return textResult(
|
|
5235
|
+
`\u0412\u0435\u0442\u043A\u0430 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0430 \u0432 ${result.pushedTo}. \u041A\u043E\u043C\u043C\u0438\u0442: ${result.commitSha ?? "\u0431\u0435\u0437 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439"}. ${createdNote}: ${opened.data.url}` + conflictNote + `
|
|
5236
|
+
|
|
5237
|
+
\u0422\u0435\u043F\u0435\u0440\u044C \u0432\u044B\u0437\u043E\u0432\u0438 report \u0438 \u043F\u0435\u0440\u0435\u0434\u0430\u0439 \u0432 links \u0441\u0441\u044B\u043B\u043A\u0443 \u043D\u0430 PR (${opened.data.url}).`
|
|
5238
|
+
);
|
|
5239
|
+
}
|
|
4851
5240
|
|
|
4852
5241
|
// src/mcp/tasks.ts
|
|
4853
5242
|
var createTaskInputShape = {
|
|
@@ -5026,7 +5415,7 @@ function registerTools(server, runtime) {
|
|
|
5026
5415
|
"get_context",
|
|
5027
5416
|
{
|
|
5028
5417
|
title: "\u041F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442 \u0437\u0430\u0434\u0430\u0447\u0438",
|
|
5029
|
-
description: "\u0421\
|
|
5418
|
+
description: "\u0412\u0421\u0415 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u044B \u043F\u0440\u043E\u0435\u043A\u0442\u0430 (\u043F\u043E\u043B\u0435 `documents`, \u043B\u044E\u0431\u043E\u0433\u043E \u0442\u0438\u043F\u0430), \u0441\u043F\u0435\u0446\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044F \u0438 \u0440\u0435\u0448\u0435\u043D\u0438\u044F \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u043E, \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0435/\u0437\u0430\u0432\u0438\u0441\u0438\u043C\u044B\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0430\u043C\u0438, \u0441\u0441\u044B\u043B\u043A\u0438 \u043D\u0430 \u0440\u0435\u043F\u043E\u0437\u0438\u0442\u043E\u0440\u0438\u0439 \u0438 \u0432\u0435\u0442\u043A\u0443 (\xA710.3 \u0422\u0417). \u0412\u0410\u0416\u041D\u041E: \u0443 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430 \u043C\u043E\u0436\u0435\u0442 \u043D\u0435 \u0431\u044B\u0442\u044C \u0442\u0435\u043A\u0441\u0442\u0430 \u2014 \u0442\u043E\u0433\u0434\u0430 \u0437\u0430\u043F\u043E\u043B\u043D\u0435\u043D\u043E \u043F\u043E\u043B\u0435 `file` (\u0441\u043F\u0435\u0446\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044F \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D\u0430 \u0444\u0430\u0439\u043B\u043E\u043C, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 PDF). \u0412 \u044D\u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435 \u0441\u043A\u0430\u0447\u0430\u0439 `file.downloadUrl` \u0438 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0439 \u0444\u0430\u0439\u043B: \u043F\u0443\u0441\u0442\u043E\u0439 `contentMd` \u0440\u044F\u0434\u043E\u043C \u0441 \u043D\u0435\u043F\u0443\u0441\u0442\u044B\u043C `file` \u041D\u0415 \u043E\u0437\u043D\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043E \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430 \u043D\u0435\u0442. \u0421\u0441\u044B\u043B\u043A\u0430 \u0436\u0438\u0432\u0451\u0442 `file.expiresInSeconds` \u0441\u0435\u043A\u0443\u043D\u0434 \u2014 \u0441\u043A\u0430\u0447\u0438\u0432\u0430\u0439 \u0441\u0440\u0430\u0437\u0443, \u0430 \u043D\u0435 \u043E\u0442\u043A\u043B\u0430\u0434\u044B\u0432\u0430\u0439. \u041F\u0443\u0441\u0442\u0430\u044F `downloadUrl` \u043E\u0437\u043D\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043E \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E: \u0442\u043E\u0433\u0434\u0430 \u0441\u043F\u0440\u043E\u0441\u0438 \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0430 \u0447\u0435\u0440\u0435\u0437 `ask_human`, \u0430 \u043D\u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u0439 \u0431\u0435\u0437 \u0441\u043F\u0435\u0446\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u0438.",
|
|
5030
5419
|
inputSchema: getContextInputShape
|
|
5031
5420
|
},
|
|
5032
5421
|
(args) => getContextHandler(args, runtime)
|
|
@@ -5230,13 +5619,13 @@ function formatConnectResult(result) {
|
|
|
5230
5619
|
}
|
|
5231
5620
|
|
|
5232
5621
|
// src/hooks/pre-compact.ts
|
|
5233
|
-
import { z as
|
|
5234
|
-
var PreCompactInputSchema =
|
|
5235
|
-
hook_event_name:
|
|
5236
|
-
session_id:
|
|
5237
|
-
cwd:
|
|
5238
|
-
trigger:
|
|
5239
|
-
custom_instructions:
|
|
5622
|
+
import { z as z32 } from "zod";
|
|
5623
|
+
var PreCompactInputSchema = z32.object({
|
|
5624
|
+
hook_event_name: z32.literal("PreCompact"),
|
|
5625
|
+
session_id: z32.string(),
|
|
5626
|
+
cwd: z32.string(),
|
|
5627
|
+
trigger: z32.enum(["manual", "auto"]),
|
|
5628
|
+
custom_instructions: z32.string().nullable()
|
|
5240
5629
|
}).passthrough();
|
|
5241
5630
|
function preCompactHook(_input, state, now = () => (/* @__PURE__ */ new Date()).toISOString()) {
|
|
5242
5631
|
const lastPreCompact = state.currentTask ? { ...state.currentTask, savedAt: now() } : null;
|
|
@@ -5245,14 +5634,14 @@ function preCompactHook(_input, state, now = () => (/* @__PURE__ */ new Date()).
|
|
|
5245
5634
|
|
|
5246
5635
|
// src/hooks/pre-tool-use.ts
|
|
5247
5636
|
import { isAbsolute as isAbsolute2, relative as relative2, resolve as resolve3 } from "path";
|
|
5248
|
-
import { z as
|
|
5249
|
-
var PreToolUseInputSchema =
|
|
5250
|
-
hook_event_name:
|
|
5251
|
-
session_id:
|
|
5252
|
-
cwd:
|
|
5253
|
-
tool_name:
|
|
5254
|
-
tool_input:
|
|
5255
|
-
tool_use_id:
|
|
5637
|
+
import { z as z33 } from "zod";
|
|
5638
|
+
var PreToolUseInputSchema = z33.object({
|
|
5639
|
+
hook_event_name: z33.literal("PreToolUse"),
|
|
5640
|
+
session_id: z33.string(),
|
|
5641
|
+
cwd: z33.string(),
|
|
5642
|
+
tool_name: z33.string(),
|
|
5643
|
+
tool_input: z33.record(z33.string(), z33.unknown()),
|
|
5644
|
+
tool_use_id: z33.string()
|
|
5256
5645
|
}).passthrough();
|
|
5257
5646
|
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.";
|
|
5258
5647
|
var BOOTSTRAP_COMMAND_RE = /^quiel\s+(connect|status)\b/;
|
|
@@ -5397,16 +5786,16 @@ function handleFileWrite(input, state, now) {
|
|
|
5397
5786
|
}
|
|
5398
5787
|
|
|
5399
5788
|
// src/hooks/run.ts
|
|
5400
|
-
import { z as
|
|
5789
|
+
import { z as z37 } from "zod";
|
|
5401
5790
|
|
|
5402
5791
|
// src/hooks/session-start.ts
|
|
5403
|
-
import { z as
|
|
5404
|
-
var SessionStartInputSchema =
|
|
5405
|
-
hook_event_name:
|
|
5406
|
-
session_id:
|
|
5407
|
-
cwd:
|
|
5408
|
-
source:
|
|
5409
|
-
model:
|
|
5792
|
+
import { z as z34 } from "zod";
|
|
5793
|
+
var SessionStartInputSchema = z34.object({
|
|
5794
|
+
hook_event_name: z34.literal("SessionStart"),
|
|
5795
|
+
session_id: z34.string(),
|
|
5796
|
+
cwd: z34.string(),
|
|
5797
|
+
source: z34.enum(["startup", "resume", "clear", "compact", "fork"]),
|
|
5798
|
+
model: z34.string().optional()
|
|
5410
5799
|
}).passthrough();
|
|
5411
5800
|
var SESSION_RESET_SOURCES = /* @__PURE__ */ new Set([
|
|
5412
5801
|
"startup",
|
|
@@ -5445,13 +5834,13 @@ function sessionStartHook(input, state) {
|
|
|
5445
5834
|
}
|
|
5446
5835
|
|
|
5447
5836
|
// src/hooks/stop.ts
|
|
5448
|
-
import { z as
|
|
5449
|
-
var StopInputSchema =
|
|
5450
|
-
hook_event_name:
|
|
5451
|
-
session_id:
|
|
5452
|
-
cwd:
|
|
5453
|
-
stop_hook_active:
|
|
5454
|
-
last_assistant_message:
|
|
5837
|
+
import { z as z35 } from "zod";
|
|
5838
|
+
var StopInputSchema = z35.object({
|
|
5839
|
+
hook_event_name: z35.literal("Stop"),
|
|
5840
|
+
session_id: z35.string(),
|
|
5841
|
+
cwd: z35.string(),
|
|
5842
|
+
stop_hook_active: z35.boolean(),
|
|
5843
|
+
last_assistant_message: z35.string().optional()
|
|
5455
5844
|
}).passthrough();
|
|
5456
5845
|
function taskLabel(state) {
|
|
5457
5846
|
if (!state.currentTask) return "";
|
|
@@ -5495,8 +5884,8 @@ function stopHook(input, state) {
|
|
|
5495
5884
|
}
|
|
5496
5885
|
|
|
5497
5886
|
// src/hooks/stop-failure.ts
|
|
5498
|
-
import { z as
|
|
5499
|
-
var StopFailureErrorTypeSchema =
|
|
5887
|
+
import { z as z36 } from "zod";
|
|
5888
|
+
var StopFailureErrorTypeSchema = z36.enum([
|
|
5500
5889
|
"rate_limit",
|
|
5501
5890
|
"overloaded",
|
|
5502
5891
|
"authentication_failed",
|
|
@@ -5509,13 +5898,13 @@ var StopFailureErrorTypeSchema = z35.enum([
|
|
|
5509
5898
|
"max_output_tokens",
|
|
5510
5899
|
"unknown"
|
|
5511
5900
|
]);
|
|
5512
|
-
var StopFailureInputSchema =
|
|
5513
|
-
hook_event_name:
|
|
5514
|
-
session_id:
|
|
5515
|
-
cwd:
|
|
5901
|
+
var StopFailureInputSchema = z36.object({
|
|
5902
|
+
hook_event_name: z36.literal("StopFailure"),
|
|
5903
|
+
session_id: z36.string(),
|
|
5904
|
+
cwd: z36.string(),
|
|
5516
5905
|
error: StopFailureErrorTypeSchema,
|
|
5517
|
-
error_details:
|
|
5518
|
-
last_assistant_message:
|
|
5906
|
+
error_details: z36.unknown().optional(),
|
|
5907
|
+
last_assistant_message: z36.string().optional()
|
|
5519
5908
|
}).passthrough();
|
|
5520
5909
|
function extractRetryAfterSec(errorDetails) {
|
|
5521
5910
|
if (typeof errorDetails === "number" && Number.isFinite(errorDetails) && errorDetails >= 0) {
|
|
@@ -5544,7 +5933,7 @@ function stopFailureHook(input, _state) {
|
|
|
5544
5933
|
}
|
|
5545
5934
|
|
|
5546
5935
|
// src/hooks/run.ts
|
|
5547
|
-
var HookInputSchema =
|
|
5936
|
+
var HookInputSchema = z37.discriminatedUnion("hook_event_name", [
|
|
5548
5937
|
SessionStartInputSchema,
|
|
5549
5938
|
StopInputSchema,
|
|
5550
5939
|
StopFailureInputSchema,
|