@qodeca/xezar 0.13.1 → 0.14.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/README.md +45 -15
- package/dist/agent-config/account-identity.d.ts +2 -8
- package/dist/agent-config/account-identity.js +54 -10
- package/dist/agent-config/account-identity.js.map +1 -1
- package/dist/agent-config/catalog.d.ts +49 -7
- package/dist/agent-config/catalog.js +107 -0
- package/dist/agent-config/catalog.js.map +1 -1
- package/dist/agent-config/model-settings/pi.d.ts +12 -6
- package/dist/agent-config/model-settings/pi.js +12 -6
- package/dist/agent-config/model-settings/pi.js.map +1 -1
- package/dist/agent-config/seed.js +10 -0
- package/dist/agent-config/seed.js.map +1 -1
- package/dist/contract/github.d.ts +15 -0
- package/dist/contract/index.d.ts +9 -0
- package/dist/contract/index.js +1527 -895
- package/dist/contract/mcp-api-reference.d.ts +174 -0
- package/dist/contract/mcp-audit.d.ts +103 -0
- package/dist/contract/mcp-discovery.d.ts +257 -0
- package/dist/contract/mcp-event-catalog.d.ts +121 -0
- package/dist/contract/mcp-event-catalog.test.d.ts +1 -0
- package/dist/contract/mcp-idempotency.d.ts +200 -0
- package/dist/contract/mcp-journal.d.ts +268 -0
- package/dist/contract/mcp-leader.d.ts +88 -0
- package/dist/contract/mcp-ownership.d.ts +78 -0
- package/dist/contract/mcp-versioning.d.ts +139 -0
- package/dist/contract/runs.d.ts +81 -0
- package/dist/core/agent-profiles.d.ts +15 -4
- package/dist/core/agent-profiles.js +22 -8
- package/dist/core/agent-profiles.js.map +1 -1
- package/dist/core/opencode-server-runner.js +71 -11
- package/dist/core/opencode-server-runner.js.map +1 -1
- package/dist/core/secret-redaction.d.ts +7 -1
- package/dist/core/secret-redaction.js +44 -10
- package/dist/core/secret-redaction.js.map +1 -1
- package/dist/index.js +138 -27
- package/dist/index.js.map +1 -1
- package/dist/machine-identity.d.ts +66 -0
- package/dist/machine-identity.js +96 -0
- package/dist/machine-identity.js.map +1 -0
- package/dist/mcp/adapters/claude-code.d.ts +41 -0
- package/dist/mcp/adapters/claude-code.js +40 -0
- package/dist/mcp/adapters/claude-code.js.map +1 -0
- package/dist/mcp/adapters/codex.d.ts +140 -0
- package/dist/mcp/adapters/codex.js +323 -0
- package/dist/mcp/adapters/codex.js.map +1 -0
- package/dist/mcp/adapters/opencode.d.ts +148 -0
- package/dist/mcp/adapters/opencode.js +528 -0
- package/dist/mcp/adapters/opencode.js.map +1 -0
- package/dist/mcp/adapters/pi-link.d.ts +102 -0
- package/dist/mcp/adapters/pi-link.js +235 -0
- package/dist/mcp/adapters/pi-link.js.map +1 -0
- package/dist/mcp/adapters/pi.d.ts +188 -0
- package/dist/mcp/adapters/pi.js +418 -0
- package/dist/mcp/adapters/pi.js.map +1 -0
- package/dist/mcp/api-reference.d.ts +26 -0
- package/dist/mcp/api-reference.js +133 -0
- package/dist/mcp/api-reference.js.map +1 -0
- package/dist/mcp/audit-trail.d.ts +162 -0
- package/dist/mcp/audit-trail.js +306 -0
- package/dist/mcp/audit-trail.js.map +1 -0
- package/dist/mcp/bridge.d.ts +81 -0
- package/dist/mcp/bridge.js +407 -0
- package/dist/mcp/bridge.js.map +1 -0
- package/dist/mcp/connection-file.d.ts +49 -0
- package/dist/mcp/connection-file.js +63 -0
- package/dist/mcp/connection-file.js.map +1 -0
- package/dist/mcp/echo-guard.d.ts +94 -0
- package/dist/mcp/echo-guard.js +160 -0
- package/dist/mcp/echo-guard.js.map +1 -0
- package/dist/mcp/event-catalog.d.ts +120 -0
- package/dist/mcp/event-catalog.js +306 -0
- package/dist/mcp/event-catalog.js.map +1 -0
- package/dist/mcp/event-controller.d.ts +230 -0
- package/dist/mcp/event-controller.js +596 -0
- package/dist/mcp/event-controller.js.map +1 -0
- package/dist/mcp/event-journal.d.ts +57 -0
- package/dist/mcp/event-journal.js +423 -0
- package/dist/mcp/event-journal.js.map +1 -0
- package/dist/mcp/index.d.ts +63 -0
- package/dist/mcp/index.js +386 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/ipc.d.ts +202 -0
- package/dist/mcp/ipc.js +206 -0
- package/dist/mcp/ipc.js.map +1 -0
- package/dist/mcp/leader-delivery.d.ts +119 -0
- package/dist/mcp/leader-delivery.js +450 -0
- package/dist/mcp/leader-delivery.js.map +1 -0
- package/dist/mcp/operation-receipts.d.ts +210 -0
- package/dist/mcp/operation-receipts.js +723 -0
- package/dist/mcp/operation-receipts.js.map +1 -0
- package/dist/mcp/project-catalogs.d.ts +23 -0
- package/dist/mcp/project-catalogs.js +25 -0
- package/dist/mcp/project-catalogs.js.map +1 -0
- package/dist/mcp/project-leaders.d.ts +26 -0
- package/dist/mcp/project-leaders.js +17 -0
- package/dist/mcp/project-leaders.js.map +1 -0
- package/dist/mcp/protocol.d.ts +50 -0
- package/dist/mcp/protocol.js +47 -0
- package/dist/mcp/protocol.js.map +1 -0
- package/dist/mcp/reconnect.d.ts +297 -0
- package/dist/mcp/reconnect.js +465 -0
- package/dist/mcp/reconnect.js.map +1 -0
- package/dist/mcp/resource-ownership.d.ts +228 -0
- package/dist/mcp/resource-ownership.js +390 -0
- package/dist/mcp/resource-ownership.js.map +1 -0
- package/dist/mcp/service-adapter.d.ts +16488 -0
- package/dist/mcp/service-adapter.js +148 -0
- package/dist/mcp/service-adapter.js.map +1 -0
- package/dist/mcp/service.d.ts +83 -0
- package/dist/mcp/service.js +233 -0
- package/dist/mcp/service.js.map +1 -0
- package/dist/mcp/session-binding.d.ts +105 -0
- package/dist/mcp/session-binding.js +163 -0
- package/dist/mcp/session-binding.js.map +1 -0
- package/dist/mcp/stale-write.d.ts +145 -0
- package/dist/mcp/stale-write.js +219 -0
- package/dist/mcp/stale-write.js.map +1 -0
- package/dist/mcp/tool.d.ts +48 -0
- package/dist/mcp/tool.js +24 -0
- package/dist/mcp/tool.js.map +1 -0
- package/dist/mcp/tools/discovery.d.ts +40 -0
- package/dist/mcp/tools/discovery.js +232 -0
- package/dist/mcp/tools/discovery.js.map +1 -0
- package/dist/mcp/tools/execution-control.d.ts +171 -0
- package/dist/mcp/tools/execution-control.js +513 -0
- package/dist/mcp/tools/execution-control.js.map +1 -0
- package/dist/mcp/tools/handoff-git.d.ts +26 -0
- package/dist/mcp/tools/handoff-git.js +544 -0
- package/dist/mcp/tools/handoff-git.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +2 -0
- package/dist/mcp/tools/index.js +23 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/leader-events.d.ts +46 -0
- package/dist/mcp/tools/leader-events.js +126 -0
- package/dist/mcp/tools/leader-events.js.map +1 -0
- package/dist/mcp/tools/local-handoff.d.ts +102 -0
- package/dist/mcp/tools/local-handoff.js +306 -0
- package/dist/mcp/tools/local-handoff.js.map +1 -0
- package/dist/mcp/tools/project-config.d.ts +340 -0
- package/dist/mcp/tools/project-config.js +1075 -0
- package/dist/mcp/tools/project-config.js.map +1 -0
- package/dist/mcp/tools/results-evidence.d.ts +112 -0
- package/dist/mcp/tools/results-evidence.js +1045 -0
- package/dist/mcp/tools/results-evidence.js.map +1 -0
- package/dist/mcp/tools/task-create.d.ts +70 -0
- package/dist/mcp/tools/task-create.js +473 -0
- package/dist/mcp/tools/task-create.js.map +1 -0
- package/dist/mcp/tools/task-reads.d.ts +102 -0
- package/dist/mcp/tools/task-reads.js +689 -0
- package/dist/mcp/tools/task-reads.js.map +1 -0
- package/dist/mcp/tools/work-organisation.d.ts +2 -0
- package/dist/mcp/tools/work-organisation.js +502 -0
- package/dist/mcp/tools/work-organisation.js.map +1 -0
- package/dist/paths.d.ts +17 -7
- package/dist/paths.js +18 -8
- package/dist/paths.js.map +1 -1
- package/dist/runs/project-writer.js +76 -11
- package/dist/runs/project-writer.js.map +1 -1
- package/dist/runs/retention.d.ts +24 -1
- package/dist/runs/retention.js +62 -1
- package/dist/runs/retention.js.map +1 -1
- package/dist/server/forge/github.js +44 -0
- package/dist/server/forge/github.js.map +1 -1
- package/dist/server/forge/types.d.ts +16 -0
- package/dist/server/project-context.d.ts +81 -8
- package/dist/server/project-context.js +143 -35
- package/dist/server/project-context.js.map +1 -1
- package/dist/server/server.d.ts +1050 -53
- package/dist/server/server.js +326 -120
- package/dist/server/server.js.map +1 -1
- package/dist/server/validators.d.ts +26 -6
- package/dist/server/validators.js +17 -0
- package/dist/server/validators.js.map +1 -1
- package/dist/skills-remote.js +64 -6
- package/dist/skills-remote.js.map +1 -1
- package/dist/workflows/run.d.ts +277 -12
- package/dist/workflows/run.js +554 -59
- package/dist/workflows/run.js.map +1 -1
- package/dist/workspace/agent-profiles.d.ts +30 -3
- package/dist/workspace/agent-profiles.js +39 -4
- package/dist/workspace/agent-profiles.js.map +1 -1
- package/dist/workspace/config.js +25 -4
- package/dist/workspace/config.js.map +1 -1
- package/dist/workspace/project-owner.d.ts +210 -0
- package/dist/workspace/project-owner.js +518 -0
- package/dist/workspace/project-owner.js.map +1 -0
- package/package.json +5 -3
- package/scripts/pi-leader-extension.ts +420 -0
- package/scripts/sync-readme.mjs +83 -2
- package/web/dist/assets/{alert-dialog-BVsVcbFy.js → alert-dialog-D6rP6d39.js} +1 -1
- package/web/dist/assets/arrow-down-DMOfFIzW.js +1 -0
- package/web/dist/assets/arrow-left-C4Ec2BUg.js +1 -0
- package/web/dist/assets/{centered-state-Djgly6Ni.js → centered-state-B0ZqrPaa.js} +12 -12
- package/web/dist/assets/chevron-right-mHJ-crvn.js +1 -0
- package/web/dist/assets/{collapsible-DZ4D-DHG.js → collapsible-DchEHgUM.js} +1 -1
- package/web/dist/assets/{commit-list-B-z1JL9G.js → commit-list-BpMim1Rv.js} +1 -1
- package/web/dist/assets/{compare-variants-D62m4j3B.js → compare-variants-D5ItQbAq.js} +1 -1
- package/web/dist/assets/{diff-BKew9rQX.js → diff-HqqZ_WDR.js} +2 -2
- package/web/dist/assets/{diff-stat-D0mc5V6Z.js → diff-stat-NsU-3ecr.js} +1 -1
- package/web/dist/assets/{diff-view-xpIcuLIC.js → diff-view-B7c11Xux.js} +1 -1
- package/web/dist/assets/{dropdown-menu-CEQziH7X.js → dropdown-menu-CtTpnyod.js} +1 -1
- package/web/dist/assets/{editable-title-BCX3T2BY.js → editable-title-BXtuGQry.js} +1 -1
- package/web/dist/assets/{ellipsis-vertical-ByVdDc4z.js → ellipsis-vertical-MHtGZSH6.js} +1 -1
- package/web/dist/assets/{file-xBSB5hXO.js → file-DKLw5SOb.js} +1 -1
- package/web/dist/assets/{folder-CldgbZ5A.js → folder-Drw6-ufH.js} +1 -1
- package/web/dist/assets/{git-toolbar-DJANqg7Y.js → git-toolbar-BQH8bORV.js} +1 -1
- package/web/dist/assets/github-ynnpKFCJ.js +1 -0
- package/web/dist/assets/{image-preview-Cv5mZr0n.js → image-preview-DLhMN_R9.js} +1 -1
- package/web/dist/assets/index-BEsrNdXt.js +29 -0
- package/web/dist/assets/index-Da8DOBau.css +2 -0
- package/web/dist/assets/{markdown-CgEEE2ND.js → markdown-q365eN6Y.js} +1 -1
- package/web/dist/assets/{new-task-form-1r2bgsdD.js → new-task-form-CW-hNIWQ.js} +1 -1
- package/web/dist/assets/{pill-q-x22_ej.js → pill-B_TFulXa.js} +1 -1
- package/web/dist/assets/{project-router-VDN4jQM8.js → project-router-CLPc-ImZ.js} +1 -1
- package/web/dist/assets/{prompt-templates-BmZtCe-L.js → prompt-templates-CLc4RxyO.js} +1 -1
- package/web/dist/assets/{repo-git-btG0sdbO.js → repo-git-Is7R6-Tj.js} +1 -1
- package/web/dist/assets/{run-diff-vguEMJzh.js → run-diff-DHMvDlVo.js} +2 -2
- package/web/dist/assets/run-header-DvZJbQ8I.js +1 -0
- package/web/dist/assets/{search-x-QmhaAbg5.js → search-x-Ce2MMetu.js} +1 -1
- package/web/dist/assets/{skill-empty-hint-BrzUwByZ.js → skill-empty-hint-C_xCSvzB.js} +1 -1
- package/web/dist/assets/skills-CivqD4si.js +1 -0
- package/web/dist/assets/{sparkles-CP8QDOgX.js → sparkles-BCqPoj5g.js} +1 -1
- package/web/dist/assets/{square-terminal-CGypshSD.js → square-terminal-ikj5g-oK.js} +1 -1
- package/web/dist/assets/{tab-link-D4lFzzI1.js → tab-link-VsEjFV1Y.js} +1 -1
- package/web/dist/assets/{task-changes-BtZId14z.js → task-changes-CH-E81-_.js} +1 -1
- package/web/dist/assets/{task-commits-BoeyJXrv.js → task-commits-DqfkMFxp.js} +1 -1
- package/web/dist/assets/{task-files-DIy2oUnj.js → task-files-D_nkHZ_a.js} +2 -2
- package/web/dist/assets/task-thread-bxQompxJ.js +9 -0
- package/web/dist/assets/{textarea-CyBCyKIk.js → textarea-xajuW1L_.js} +1 -1
- package/web/dist/assets/{thread-loading-Cuq2jchC.js → thread-loading-C3JQZbIE.js} +1 -1
- package/web/dist/assets/{trash-2-B6Dp3ZNs.js → trash-2-hJrBhpUD.js} +1 -1
- package/web/dist/assets/{triangle-alert-xBya8FUp.js → triangle-alert-D1u82y1a.js} +1 -1
- package/web/dist/assets/{upload-D6MXEB9p.js → upload-Bn6FBZ59.js} +1 -1
- package/web/dist/assets/{use-desktop-CPBwzQ7M.js → use-desktop-DOIMfHfY.js} +1 -1
- package/web/dist/assets/{use-submit-shortcut-JTpNzU-u.js → use-submit-shortcut-Dj4DHTdE.js} +1 -1
- package/web/dist/assets/utils-YwBpOoRN.js +64 -0
- package/web/dist/assets/{workflows-DG115scU.js → workflows-CTaAKz2m.js} +3 -3
- package/web/dist/assets/{zoomable-image-GTYwLtkS.js → zoomable-image-C1-6P3tg.js} +1 -1
- package/web/dist/index.html +23 -23
- package/web/dist/assets/arrow-down-CYgAlZtW.js +0 -1
- package/web/dist/assets/arrow-left-BOqE0a3k.js +0 -1
- package/web/dist/assets/chevron-right-Cc9BWnbN.js +0 -1
- package/web/dist/assets/github-D6vK0jFn.js +0 -1
- package/web/dist/assets/index-CkmR6h7s.css +0 -2
- package/web/dist/assets/index-DVDqF4bM.js +0 -9
- package/web/dist/assets/refresh-cw-DcNCj2nu.js +0 -1
- package/web/dist/assets/run-header-DM7MiKj9.js +0 -1
- package/web/dist/assets/skills-DMfxQtrD.js +0 -1
- package/web/dist/assets/task-thread-CbMPmrWq.js +0 -9
- package/web/dist/assets/utils--z9hRtl3.js +0 -64
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
import { apiRunSchema, changesPayloadSchema, createPrResponseSchema, gitCommitResponseSchema, gitPushResponseSchema, githubMergeMethodSchema, githubMergeResponseSchema, githubPrMergeStateResponseSchema, githubPrReadyResponseSchema, mcpExpectedVersionSchema, operationIdSchema, repoBranchResponseSchema, repoResponseSchema, runIdParamSchema, } from '../../contract/index.js';
|
|
2
|
+
import { hc } from 'hono/client';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { collectSecretValues, redactDeep } from '../../core/secret-redaction.js';
|
|
5
|
+
import { staleRejectionIn } from '../stale-write.js';
|
|
6
|
+
import { resolveForge } from '../../server/forge/index.js';
|
|
7
|
+
import { getRepoInfo } from '../../server/git.js';
|
|
8
|
+
import { ownRun, ownershipScope } from '../resource-ownership.js';
|
|
9
|
+
import { defineTool, errorResult, textResult } from '../tool.js';
|
|
10
|
+
const IN_PROCESS_BASE = 'http://127.0.0.1';
|
|
11
|
+
/** The typed client over the service's own route table, exactly as #89's adapter builds it. */
|
|
12
|
+
const buildClient = (service) => hc(IN_PROCESS_BASE, {
|
|
13
|
+
fetch: async (input, init) => {
|
|
14
|
+
const headers = new Headers(init?.headers);
|
|
15
|
+
headers.set('host', '127.0.0.1');
|
|
16
|
+
headers.delete('origin');
|
|
17
|
+
const url = input instanceof Request ? input.url : String(input);
|
|
18
|
+
return service.request(url, { ...init, headers });
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
const settle = async (pending) => {
|
|
22
|
+
const res = await pending;
|
|
23
|
+
return { status: res.status, body: await res.json().catch(() => undefined) };
|
|
24
|
+
};
|
|
25
|
+
/** The service's own refusal sentence, verbatim. */
|
|
26
|
+
function serviceError(answer) {
|
|
27
|
+
const body = answer.body;
|
|
28
|
+
return typeof body?.error === 'string' ? body.error : `service answered ${answer.status}`;
|
|
29
|
+
}
|
|
30
|
+
// ---- the input -----------------------------------------------------------------------------
|
|
31
|
+
export const HANDOFF_ACTIONS = ['repo', 'commit', 'push', 'create_pr', 'merge_state', 'ready', 'merge', 'branch'];
|
|
32
|
+
/**
|
|
33
|
+
* ONE strict object: the registry takes one entry per tool, and a strict schema is what turns an
|
|
34
|
+
* invented key (`qualityException`, `approvedBy`, `force`…) into an argument error the leader sees,
|
|
35
|
+
* instead of a field silently ignored. Which fields an action needs is checked in `call`.
|
|
36
|
+
*/
|
|
37
|
+
const inputSchema = z
|
|
38
|
+
.object({
|
|
39
|
+
action: z.enum(HANDOFF_ACTIONS).describe('repo: read the main checkout (branch, branches, base, whether a remote exists, uncommitted count). ' +
|
|
40
|
+
'commit / push / create_pr: act on one task (taskId). ' +
|
|
41
|
+
'merge_state: read one pull request (number) fresh, with its quality blockers. ' +
|
|
42
|
+
'ready: mark a draft pull request ready for review (number, expectedHeadSha). ' +
|
|
43
|
+
'merge: invoke the existing merge (number, expectedHeadSha). ' +
|
|
44
|
+
'branch: switch to, or create and switch to, a branch of the main checkout (name, from).'),
|
|
45
|
+
taskId: z.string().min(1).max(128).optional().describe('The task to commit, push or publish.'),
|
|
46
|
+
expectedVersion: mcpExpectedVersionSchema
|
|
47
|
+
.optional()
|
|
48
|
+
.describe('commit / push / create_pr: the `version` task_read returned for the task. If the task changed since, nothing is done.'),
|
|
49
|
+
operationId: operationIdSchema
|
|
50
|
+
.optional()
|
|
51
|
+
.describe('Client-generated key for this operation (8–128 chars). Required by every action that hands work onward (commit, push, create_pr, ready, merge, branch); the two reads (repo, merge_state) take none. Reuse it only to repeat the same operation: a repeat returns the first answer and never commits, pushes, readies or merges twice.'),
|
|
52
|
+
message: z.string().trim().min(1).max(5_000).optional().describe('commit: the commit message.'),
|
|
53
|
+
number: z.number().int().positive().optional().describe('merge_state / ready / merge: the pull request number.'),
|
|
54
|
+
expectedHeadSha: z
|
|
55
|
+
.string()
|
|
56
|
+
.regex(/^[0-9a-f]{40}$/)
|
|
57
|
+
.optional()
|
|
58
|
+
.describe('ready / merge: the headSha of the state you reviewed. A moved head is refused, never readied or merged.'),
|
|
59
|
+
method: githubMergeMethodSchema
|
|
60
|
+
.optional()
|
|
61
|
+
.describe("merge: one of the state's methods; defaults to its defaultMethod."),
|
|
62
|
+
name: z.string().trim().min(1).max(200).optional().describe('branch: the branch to switch to or create.'),
|
|
63
|
+
from: z.string().trim().min(1).max(200).optional().describe('branch: start point when creating.'),
|
|
64
|
+
})
|
|
65
|
+
.strict()
|
|
66
|
+
// The per-action rules live IN the schema, like every other action tool's, so the schema is the one
|
|
67
|
+
// place that both enforces them and answers "which actions need expectedVersion?" for the MCP API
|
|
68
|
+
// page (#301). Each missing argument is its own issue, on its own path.
|
|
69
|
+
.superRefine((args, ctx) => {
|
|
70
|
+
const missing = REQUIRED[args.action].filter((key) => args[key] === undefined);
|
|
71
|
+
for (const key of missing)
|
|
72
|
+
ctx.addIssue({ code: 'custom', path: [key], message: `${args.action} needs ${key}` });
|
|
73
|
+
const problem = missing.length ? null : argumentProblem(args);
|
|
74
|
+
if (problem)
|
|
75
|
+
ctx.addIssue({ code: 'custom', path: [], message: problem });
|
|
76
|
+
});
|
|
77
|
+
// The three task actions require the task's `expectedVersion` (#250, N-03): a missing one is an
|
|
78
|
+
// argument error, never an effect without the check. `merge` keeps its own compare-and-swap on the
|
|
79
|
+
// pull request's head (`expectedHeadSha`); `branch` changes the main checkout, not a task.
|
|
80
|
+
//
|
|
81
|
+
// `operationId` (D-06 § 5.2, #264) is required by the six actions that DO something, and by neither
|
|
82
|
+
// of the two reads: a read has no effect to deduplicate, and a receipt over it would answer the next
|
|
83
|
+
// identical read with the receipt instead of the repository state.
|
|
84
|
+
const REQUIRED = {
|
|
85
|
+
repo: [],
|
|
86
|
+
commit: ['taskId', 'expectedVersion', 'operationId', 'message'],
|
|
87
|
+
push: ['taskId', 'expectedVersion', 'operationId'],
|
|
88
|
+
create_pr: ['taskId', 'expectedVersion', 'operationId'],
|
|
89
|
+
merge_state: ['number'],
|
|
90
|
+
ready: ['number', 'expectedHeadSha', 'operationId'],
|
|
91
|
+
merge: ['number', 'expectedHeadSha', 'operationId'],
|
|
92
|
+
branch: ['name', 'operationId'],
|
|
93
|
+
};
|
|
94
|
+
const ALLOWED = {
|
|
95
|
+
repo: ['action'],
|
|
96
|
+
commit: ['action', 'taskId', 'expectedVersion', 'operationId', 'message'],
|
|
97
|
+
push: ['action', 'taskId', 'expectedVersion', 'operationId'],
|
|
98
|
+
create_pr: ['action', 'taskId', 'expectedVersion', 'operationId'],
|
|
99
|
+
merge_state: ['action', 'number'],
|
|
100
|
+
ready: ['action', 'number', 'expectedHeadSha', 'operationId'],
|
|
101
|
+
merge: ['action', 'number', 'expectedHeadSha', 'operationId', 'method'],
|
|
102
|
+
branch: ['action', 'name', 'operationId', 'from'],
|
|
103
|
+
};
|
|
104
|
+
function argumentProblem(args) {
|
|
105
|
+
const missing = REQUIRED[args.action].filter((key) => args[key] === undefined);
|
|
106
|
+
if (missing.length > 0)
|
|
107
|
+
return `${args.action} needs ${missing.join(', ')}`;
|
|
108
|
+
const extra = Object.keys(args).filter((key) => args[key] !== undefined && !ALLOWED[args.action].includes(key));
|
|
109
|
+
if (extra.length > 0)
|
|
110
|
+
return `${args.action} does not take ${extra.join(', ')}`;
|
|
111
|
+
if (args.taskId !== undefined) {
|
|
112
|
+
const id = args.taskId;
|
|
113
|
+
if (id === '.' || id === '..' || !runIdParamSchema.safeParse({ id }).success)
|
|
114
|
+
return 'taskId is not a task id';
|
|
115
|
+
}
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
// ---- results -------------------------------------------------------------------------------
|
|
119
|
+
/** Every answer leaves through the transcript's own secret scrub (F-15). The text is authoritative
|
|
120
|
+
* (D-05 § 6.8): compact JSON, no second copy in `structuredContent`. */
|
|
121
|
+
const answer = (payload) => textResult(JSON.stringify(redactDeep(payload, collectSecretValues())));
|
|
122
|
+
/** A precondition the cockpit's policy would already have refused, in the cockpit's own words. */
|
|
123
|
+
const policyRefusal = (action, error, extra = {}) => answer({ action, status: 'failed', refusedBy: 'policy', error, ...extra });
|
|
124
|
+
/** The service refused: its status and its own text, unchanged — or, when the task changed after
|
|
125
|
+
* the leader read it (#250), D-06 § 4.4's rejection verbatim: nothing was done. */
|
|
126
|
+
const serviceRefusal = (action, res, extra = {}) => {
|
|
127
|
+
const stale = staleRejectionIn(res.body);
|
|
128
|
+
if (stale)
|
|
129
|
+
return answer({ action, ...stale, ...extra });
|
|
130
|
+
return answer({ action, status: 'failed', refusedBy: 'service', httpStatus: res.status, error: serviceError(res), ...extra });
|
|
131
|
+
};
|
|
132
|
+
const NO_TASK = 'No such task in this project.';
|
|
133
|
+
const NO_WORKTREE_REASON = 'no worktree — this task ran directly in the repo working tree';
|
|
134
|
+
/** "Active" as the engine means it — `review` is parked, not active (git-actions.ts `isActive`). */
|
|
135
|
+
const isActive = (status) => status === 'running' || status === 'queued' || status === 'waiting';
|
|
136
|
+
/** The next legitimate action after a quality blocker. It offers no waiver, to anyone (A-22). */
|
|
137
|
+
export const QUALITY_BLOCKER_NEXT_ACTION = 'This is a blocker. Required quality checks and reviews cannot be bypassed from MCP. Repair the cause on the ' +
|
|
138
|
+
'branch and read merge_state again, or report this blocker.';
|
|
139
|
+
const STALE_HEAD_NEXT_ACTION = 'The pull request head moved after the state you reviewed. Read merge_state again and review the new commits before merging.';
|
|
140
|
+
const STALE_HEAD_READY_NEXT_ACTION = 'The pull request head moved after the state you reviewed. Read merge_state again and review the new commits before marking it ready.';
|
|
141
|
+
// ---- F-22: what counts as a quality blocker ------------------------------------------------
|
|
142
|
+
/**
|
|
143
|
+
* Merge-state blocker codes that mean "quality is not proven" — never "the forge's rules". The
|
|
144
|
+
* forge reports only its FIRST blocker, and its `checks-failing` / `pending` codes do not say
|
|
145
|
+
* whether the check is required, so checks are judged one by one below instead.
|
|
146
|
+
*/
|
|
147
|
+
const QUALITY_BLOCKER_CODES = new Set(['reviews', 'rules-unknown']);
|
|
148
|
+
/**
|
|
149
|
+
* Every reason this pull request's quality is not proven, from the fresh merge state. A check the
|
|
150
|
+
* forge could not classify (`required: null`) counts as required: unknown evidence is never a
|
|
151
|
+
* pass. An empty list is the only answer that lets a merge be dispatched at all.
|
|
152
|
+
*/
|
|
153
|
+
export function qualityBlockers(state) {
|
|
154
|
+
const out = [];
|
|
155
|
+
for (const check of state.checks) {
|
|
156
|
+
if (check.required !== false && check.state !== 'passing') {
|
|
157
|
+
out.push({
|
|
158
|
+
code: `check-${check.state}`,
|
|
159
|
+
message: `Required check "${check.name}" is ${check.state}${check.required === null ? ' (requiredness unknown, so it counts as required)' : ''}.`,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (state.reviewDecision === 'changes-requested')
|
|
164
|
+
out.push({ code: 'review', message: 'Changes were requested.' });
|
|
165
|
+
if (state.reviewDecision === 'review-required')
|
|
166
|
+
out.push({ code: 'review', message: 'A required review is missing.' });
|
|
167
|
+
for (const blocker of state.blockers) {
|
|
168
|
+
if (QUALITY_BLOCKER_CODES.has(blocker.code) && !out.some((b) => b.message === blocker.message))
|
|
169
|
+
out.push(blocker);
|
|
170
|
+
}
|
|
171
|
+
return out;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Every reason a draft should NOT be marked ready yet (#262): a required check that is already
|
|
175
|
+
* failing, and a review that asked for changes. Readying such a pull request asks reviewers to look
|
|
176
|
+
* at work whose own gate says it is not done. A pending check or a review nobody has given yet is
|
|
177
|
+
* not on this list: those are exactly what "ready for review" invites, and a draft never gets them
|
|
178
|
+
* otherwise. Like `qualityBlockers`, a check the forge could not classify counts as required.
|
|
179
|
+
*/
|
|
180
|
+
export function readyBlockers(state) {
|
|
181
|
+
const out = [];
|
|
182
|
+
for (const check of state.checks) {
|
|
183
|
+
if (check.required !== false && check.state === 'failing') {
|
|
184
|
+
out.push({
|
|
185
|
+
code: 'check-failing',
|
|
186
|
+
message: `Required check "${check.name}" is failing${check.required === null ? ' (requiredness unknown, so it counts as required)' : ''}.`,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (state.reviewDecision === 'changes-requested')
|
|
191
|
+
out.push({ code: 'review', message: 'Changes were requested.' });
|
|
192
|
+
return out;
|
|
193
|
+
}
|
|
194
|
+
// ---- the actions ---------------------------------------------------------------------------
|
|
195
|
+
class Handoff {
|
|
196
|
+
project;
|
|
197
|
+
api;
|
|
198
|
+
projectId;
|
|
199
|
+
constructor(service, project) {
|
|
200
|
+
this.project = project;
|
|
201
|
+
this.api = buildClient(service).api.v1.p[':projectId'];
|
|
202
|
+
this.projectId = project.id;
|
|
203
|
+
}
|
|
204
|
+
get scope() {
|
|
205
|
+
return { projectId: this.projectId };
|
|
206
|
+
}
|
|
207
|
+
/** One task, read from the project's own route AND proved the project's by #88's `ownRun`. */
|
|
208
|
+
async task(taskId) {
|
|
209
|
+
const res = await settle(this.api.runs[':id'].$get({ param: { ...this.scope, id: taskId } }));
|
|
210
|
+
if (res.status !== 200)
|
|
211
|
+
return null;
|
|
212
|
+
const run = apiRunSchema.parse(res.body);
|
|
213
|
+
const scope = ownershipScope({
|
|
214
|
+
root: this.project.root,
|
|
215
|
+
store: { getRun: (id) => (id === run.id ? run : undefined), listRuns: () => [run] },
|
|
216
|
+
automationStore: { get: () => undefined, latestReceipts: () => new Map() },
|
|
217
|
+
});
|
|
218
|
+
return ownRun(scope, taskId).ok ? run : null;
|
|
219
|
+
}
|
|
220
|
+
async repo() {
|
|
221
|
+
const res = await settle(this.api.repo.$get({ param: this.scope }));
|
|
222
|
+
if (res.status !== 200)
|
|
223
|
+
return serviceRefusal('repo', res);
|
|
224
|
+
const repo = repoResponseSchema.parse(res.body);
|
|
225
|
+
if (!repo.info)
|
|
226
|
+
return answer({ action: 'repo', status: 'done', git: false });
|
|
227
|
+
// No log (it names commit authors) and no remote URL (it can carry credentials): whether a
|
|
228
|
+
// remote exists is what push depends on.
|
|
229
|
+
return answer({
|
|
230
|
+
action: 'repo',
|
|
231
|
+
status: 'done',
|
|
232
|
+
git: true,
|
|
233
|
+
branch: repo.info.branch,
|
|
234
|
+
branches: repo.branches,
|
|
235
|
+
baseBranch: repo.baseBranch,
|
|
236
|
+
hasRemote: repo.info.remote !== undefined,
|
|
237
|
+
uncommittedFiles: repo.status.length,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
async commit(taskId, message, expectedVersion) {
|
|
241
|
+
const run = await this.task(taskId);
|
|
242
|
+
if (!run)
|
|
243
|
+
return answer({ action: 'commit', status: 'failed', refusedBy: 'policy', error: NO_TASK });
|
|
244
|
+
const task = { id: run.id };
|
|
245
|
+
if (!run.worktreePath)
|
|
246
|
+
return policyRefusal('commit', `Commit unavailable — ${NO_WORKTREE_REASON}`, { task });
|
|
247
|
+
if (run.status === 'running') {
|
|
248
|
+
return policyRefusal('commit', 'Commit unavailable — the agent is still working in this worktree', { task });
|
|
249
|
+
}
|
|
250
|
+
// The cockpit counts changed files from `/changes`; its 409 means the worktree is gone.
|
|
251
|
+
const changes = await settle(this.api.runs[':id'].changes.$get({ param: { ...this.scope, id: run.id } }));
|
|
252
|
+
if (changes.status === 409)
|
|
253
|
+
return policyRefusal('commit', `Commit unavailable — ${NO_WORKTREE_REASON}`, { task });
|
|
254
|
+
if (changes.status !== 200)
|
|
255
|
+
return serviceRefusal('commit', changes, { task });
|
|
256
|
+
if (changesPayloadSchema.parse(changes.body).stat.files === 0) {
|
|
257
|
+
return policyRefusal('commit', 'Commit unavailable — no changes to commit', { task });
|
|
258
|
+
}
|
|
259
|
+
const res = await settle(this.api.runs[':id'].git.commit.$post({ param: { ...this.scope, id: run.id }, json: { message, expectedVersion } }));
|
|
260
|
+
if (res.status !== 200)
|
|
261
|
+
return serviceRefusal('commit', res, { task });
|
|
262
|
+
const done = gitCommitResponseSchema.parse(res.body);
|
|
263
|
+
return answer({ action: 'commit', status: 'done', task: { id: run.id, revision: done.sha }, sha: done.sha });
|
|
264
|
+
}
|
|
265
|
+
async push(taskId, expectedVersion) {
|
|
266
|
+
const run = await this.task(taskId);
|
|
267
|
+
if (!run)
|
|
268
|
+
return answer({ action: 'push', status: 'failed', refusedBy: 'policy', error: NO_TASK });
|
|
269
|
+
const task = { id: run.id };
|
|
270
|
+
if (!run.worktreePath)
|
|
271
|
+
return policyRefusal('push', `Push unavailable — ${NO_WORKTREE_REASON}`, { task });
|
|
272
|
+
// The remote is the BOUND project's (`/repo`), never `/health`'s boot project (#791).
|
|
273
|
+
const repo = await settle(this.api.repo.$get({ param: this.scope }));
|
|
274
|
+
if (repo.status !== 200)
|
|
275
|
+
return serviceRefusal('push', repo, { task });
|
|
276
|
+
if (repoResponseSchema.parse(repo.body).info?.remote === undefined) {
|
|
277
|
+
return policyRefusal('push', 'Push unavailable — no remote configured', { task });
|
|
278
|
+
}
|
|
279
|
+
if (!run.branch)
|
|
280
|
+
return policyRefusal('push', 'Push unavailable — the run has no branch to push', { task });
|
|
281
|
+
if (run.status === 'running') {
|
|
282
|
+
return policyRefusal('push', 'Push unavailable — the agent is still working in this worktree', { task });
|
|
283
|
+
}
|
|
284
|
+
const res = await settle(this.api.runs[':id'].git.push.$post({ param: { ...this.scope, id: run.id }, json: { expectedVersion } }));
|
|
285
|
+
if (res.status !== 200)
|
|
286
|
+
return serviceRefusal('push', res, { task });
|
|
287
|
+
const done = gitPushResponseSchema.parse(res.body);
|
|
288
|
+
return answer({
|
|
289
|
+
action: 'push',
|
|
290
|
+
status: 'done',
|
|
291
|
+
task,
|
|
292
|
+
branch: done.branch,
|
|
293
|
+
remote: done.remote,
|
|
294
|
+
upstreamSet: done.upstreamSet,
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
async createPr(taskId, expectedVersion) {
|
|
298
|
+
const run = await this.task(taskId);
|
|
299
|
+
if (!run)
|
|
300
|
+
return answer({ action: 'create_pr', status: 'failed', refusedBy: 'policy', error: NO_TASK });
|
|
301
|
+
const task = { id: run.id };
|
|
302
|
+
if (!run.worktreePath || !run.branch) {
|
|
303
|
+
return policyRefusal('create_pr', `Create PR unavailable — ${NO_WORKTREE_REASON}`, { task });
|
|
304
|
+
}
|
|
305
|
+
// The bound project's forge — the same resolution and probe `/health` makes for the boot one.
|
|
306
|
+
const forge = resolveForge(await getRepoInfo(this.project.root));
|
|
307
|
+
if (!forge) {
|
|
308
|
+
return policyRefusal('create_pr', 'Create PR unavailable — no supported forge remote (GitHub) detected', { task });
|
|
309
|
+
}
|
|
310
|
+
const availability = await forge.detect();
|
|
311
|
+
if (!availability.available) {
|
|
312
|
+
return policyRefusal('create_pr', `Create PR unavailable — ${availability.reason ?? 'the forge is unreachable'}`, { task });
|
|
313
|
+
}
|
|
314
|
+
if (isActive(run.status)) {
|
|
315
|
+
return policyRefusal('create_pr', 'Create PR unavailable — the run is still active; wait for the review gate', {
|
|
316
|
+
task,
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
const res = await settle(this.api.runs[':id'].pr.$post({ param: { ...this.scope, id: run.id }, json: { expectedVersion } }));
|
|
320
|
+
if (res.status !== 201) {
|
|
321
|
+
const manual = res.body?.manual;
|
|
322
|
+
return serviceRefusal('create_pr', res, { task, ...(typeof manual === 'string' ? { manual } : {}) });
|
|
323
|
+
}
|
|
324
|
+
const done = createPrResponseSchema.parse(res.body);
|
|
325
|
+
return answer({ action: 'create_pr', status: 'done', task, url: done.url, dryRun: done.dryRun });
|
|
326
|
+
}
|
|
327
|
+
/** The fresh merge state — the same read the merge box's refresh makes. */
|
|
328
|
+
async mergeState(number, action) {
|
|
329
|
+
const res = await settle(this.api.github.prs[':number']['merge-state'].$get({
|
|
330
|
+
param: { ...this.scope, number: String(number) },
|
|
331
|
+
query: { refresh: '1' },
|
|
332
|
+
}));
|
|
333
|
+
if (res.status !== 200)
|
|
334
|
+
return { ok: false, result: serviceRefusal(action, res) };
|
|
335
|
+
const parsed = githubPrMergeStateResponseSchema.parse(res.body);
|
|
336
|
+
if (!parsed.available) {
|
|
337
|
+
return {
|
|
338
|
+
ok: false,
|
|
339
|
+
result: answer({ action, status: 'failed', refusedBy: 'service', error: parsed.reason }),
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
return { ok: true, state: parsed.mergeState };
|
|
343
|
+
}
|
|
344
|
+
async readMergeState(number) {
|
|
345
|
+
const read = await this.mergeState(number, 'merge_state');
|
|
346
|
+
if (!read.ok)
|
|
347
|
+
return read.result;
|
|
348
|
+
const blockers = qualityBlockers(read.state);
|
|
349
|
+
return answer({ action: 'merge_state', status: 'done', mergeState: read.state, qualityBlockers: blockers });
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Mark a draft ready through the forge's own path (#262). The quality verdict is judged on the
|
|
353
|
+
* fresh state first and nothing any argument says changes it; a pull request that is not an open
|
|
354
|
+
* draft is left to the SERVICE, whose own words ("already ready", "closed") reach the leader.
|
|
355
|
+
*/
|
|
356
|
+
async ready(number, expectedHeadSha) {
|
|
357
|
+
const read = await this.mergeState(number, 'ready');
|
|
358
|
+
if (!read.ok)
|
|
359
|
+
return read.result;
|
|
360
|
+
const state = read.state;
|
|
361
|
+
if (state.state === 'open' && state.isDraft) {
|
|
362
|
+
const blockers = readyBlockers(state);
|
|
363
|
+
if (blockers.length > 0) {
|
|
364
|
+
return answer({
|
|
365
|
+
action: 'ready',
|
|
366
|
+
status: 'failed',
|
|
367
|
+
refusedBy: 'quality',
|
|
368
|
+
blocker: true,
|
|
369
|
+
number,
|
|
370
|
+
blockers,
|
|
371
|
+
nextAction: QUALITY_BLOCKER_NEXT_ACTION,
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
const res = await settle(this.api.github.prs[':number'].ready.$post({
|
|
376
|
+
param: { ...this.scope, number: String(number) },
|
|
377
|
+
// The head the LEADER reviewed; the service re-reads the forge and refuses a moved one.
|
|
378
|
+
json: { expectedHeadSha },
|
|
379
|
+
}));
|
|
380
|
+
if (res.status === 200) {
|
|
381
|
+
const done = githubPrReadyResponseSchema.parse(res.body);
|
|
382
|
+
return answer({ action: 'ready', status: 'done', number: done.number, url: done.url, ready: true });
|
|
383
|
+
}
|
|
384
|
+
const body = (res.body ?? {});
|
|
385
|
+
if (body.code === 'stale-head') {
|
|
386
|
+
return answer({
|
|
387
|
+
action: 'ready',
|
|
388
|
+
status: 'conflict',
|
|
389
|
+
code: 'stale-head',
|
|
390
|
+
error: serviceError(res),
|
|
391
|
+
nextAction: STALE_HEAD_READY_NEXT_ACTION,
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
return serviceRefusal('ready', res, typeof body.code === 'string' ? { code: body.code } : {});
|
|
395
|
+
}
|
|
396
|
+
async merge(args) {
|
|
397
|
+
const read = await this.mergeState(args.number, 'merge');
|
|
398
|
+
if (!read.ok)
|
|
399
|
+
return read.result;
|
|
400
|
+
const state = read.state;
|
|
401
|
+
// F-22: the quality verdict comes first, and nothing any argument says can change it.
|
|
402
|
+
const blockers = qualityBlockers(state);
|
|
403
|
+
if (blockers.length > 0) {
|
|
404
|
+
return answer({
|
|
405
|
+
action: 'merge',
|
|
406
|
+
status: 'failed',
|
|
407
|
+
refusedBy: 'quality',
|
|
408
|
+
blocker: true,
|
|
409
|
+
number: args.number,
|
|
410
|
+
blockers,
|
|
411
|
+
nextAction: QUALITY_BLOCKER_NEXT_ACTION,
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
// Anything the forge does not call ready is a blocker for the leader: an unmet requirement the
|
|
415
|
+
// forge cannot name may be a quality one (see the header), and there is no override to reach for.
|
|
416
|
+
if (!state.canMerge) {
|
|
417
|
+
return answer({
|
|
418
|
+
action: 'merge',
|
|
419
|
+
status: 'failed',
|
|
420
|
+
refusedBy: 'forge',
|
|
421
|
+
blocker: true,
|
|
422
|
+
number: args.number,
|
|
423
|
+
eligibility: state.eligibility,
|
|
424
|
+
blockers: state.blockers,
|
|
425
|
+
nextAction: QUALITY_BLOCKER_NEXT_ACTION,
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
const method = args.method ?? state.defaultMethod ?? state.methods[0];
|
|
429
|
+
if (!method) {
|
|
430
|
+
return answer({
|
|
431
|
+
action: 'merge',
|
|
432
|
+
status: 'failed',
|
|
433
|
+
refusedBy: 'policy',
|
|
434
|
+
error: 'No merge method is available.',
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
const res = await settle(this.api.github.prs[':number'].merge.$post({
|
|
438
|
+
param: { ...this.scope, number: String(args.number) },
|
|
439
|
+
json: {
|
|
440
|
+
method,
|
|
441
|
+
// The head the LEADER reviewed — never the fresh one read above. The service re-validates
|
|
442
|
+
// it against the forge, so a stale review cannot merge. No `overrideRules`, ever: without
|
|
443
|
+
// it the service's preflight demands a fresh `canMerge` at merge time.
|
|
444
|
+
expectedHeadSha: args.expectedHeadSha,
|
|
445
|
+
},
|
|
446
|
+
}));
|
|
447
|
+
if (res.status === 200) {
|
|
448
|
+
const done = githubMergeResponseSchema.parse(res.body);
|
|
449
|
+
return answer({ action: 'merge', status: 'done', ...done });
|
|
450
|
+
}
|
|
451
|
+
const body = (res.body ?? {});
|
|
452
|
+
if (body.code === 'stale-head') {
|
|
453
|
+
return answer({
|
|
454
|
+
action: 'merge',
|
|
455
|
+
status: 'conflict',
|
|
456
|
+
code: 'stale-head',
|
|
457
|
+
error: serviceError(res),
|
|
458
|
+
nextAction: STALE_HEAD_NEXT_ACTION,
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
// Refused on the forge's own eligibility: still a blocker, still the service's own words.
|
|
462
|
+
const eligibility = ['blocked', 'pending', 'unauthorized', 'terminal', 'unknown'];
|
|
463
|
+
if (typeof body.code === 'string' && eligibility.includes(body.code)) {
|
|
464
|
+
return answer({
|
|
465
|
+
action: 'merge',
|
|
466
|
+
status: 'failed',
|
|
467
|
+
refusedBy: 'service',
|
|
468
|
+
blocker: true,
|
|
469
|
+
httpStatus: res.status,
|
|
470
|
+
code: body.code,
|
|
471
|
+
error: serviceError(res),
|
|
472
|
+
nextAction: QUALITY_BLOCKER_NEXT_ACTION,
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
return serviceRefusal('merge', res, typeof body.code === 'string' ? { code: body.code } : {});
|
|
476
|
+
}
|
|
477
|
+
async branch(name, from) {
|
|
478
|
+
// M-10: a task running in the main checkout holds the repository-root lease.
|
|
479
|
+
const runs = await settle(this.api.runs.$get({ param: this.scope }));
|
|
480
|
+
if (runs.status !== 200)
|
|
481
|
+
return serviceRefusal('branch', runs);
|
|
482
|
+
const holder = z
|
|
483
|
+
.array(apiRunSchema)
|
|
484
|
+
.parse(runs.body)
|
|
485
|
+
.find((run) => !run.worktreePath && (run.status === 'running' || run.status === 'waiting'));
|
|
486
|
+
if (holder) {
|
|
487
|
+
return policyRefusal('branch', 'Branch switch unavailable — a task is running in the main checkout and holds the repository-root lease; wait for it to finish', { task: { id: holder.id } });
|
|
488
|
+
}
|
|
489
|
+
const res = await settle(this.api.repo.branch.$post({ param: this.scope, json: { name, ...(from !== undefined ? { from } : {}) } }));
|
|
490
|
+
if (res.status !== 200)
|
|
491
|
+
return serviceRefusal('branch', res);
|
|
492
|
+
const done = repoBranchResponseSchema.parse(res.body);
|
|
493
|
+
return answer({ action: 'branch', status: 'done', branch: done.branch, created: done.created });
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
export const handoffGitTool = defineTool({
|
|
497
|
+
name: 'handoff_git',
|
|
498
|
+
title: 'Hand work onward: commit, push, draft PR, ready, merge, branches',
|
|
499
|
+
description: "Hand a task's work onward through the cockpit's own operations: commit a task's worktree, push its branch, " +
|
|
500
|
+
'open its draft pull request, mark a draft pull request ready for review, read a pull request\'s merge readiness, ' +
|
|
501
|
+
'invoke the existing merge, and switch or ' +
|
|
502
|
+
'create branches of the main checkout. Every action runs at once, with the same checks the cockpit applies; ' +
|
|
503
|
+
"a refusal carries the service's own reason unchanged. commit, push and create_pr need the task's expectedVersion " +
|
|
504
|
+
'(from task_read) and do nothing, answering status "conflict" with error "stale_version", if the task changed since. ' +
|
|
505
|
+
'ready and merge need the headSha you reviewed and are refused ' +
|
|
506
|
+
'if the head moved. Failing, pending or unreadable required checks and missing reviews are merge blockers, and a ' +
|
|
507
|
+
'failing required check or a changes-requested review blocks ready; no argument bypasses a blocker: repair the ' +
|
|
508
|
+
'cause or report the blocker.',
|
|
509
|
+
inputSchema,
|
|
510
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
511
|
+
async call(args, ctx) {
|
|
512
|
+
const service = ctx.service;
|
|
513
|
+
if (!service) {
|
|
514
|
+
return errorResult('handoff_git is not connected in this xezar yet: the running service did not hand MCP its git operations. Use the cockpit.');
|
|
515
|
+
}
|
|
516
|
+
const problem = argumentProblem(args);
|
|
517
|
+
if (problem)
|
|
518
|
+
return errorResult(`Invalid arguments for handoff_git: ${problem}`);
|
|
519
|
+
const handoff = new Handoff(service, ctx.project);
|
|
520
|
+
switch (args.action) {
|
|
521
|
+
case 'repo':
|
|
522
|
+
return handoff.repo();
|
|
523
|
+
case 'commit':
|
|
524
|
+
return handoff.commit(args.taskId, args.message, args.expectedVersion);
|
|
525
|
+
case 'push':
|
|
526
|
+
return handoff.push(args.taskId, args.expectedVersion);
|
|
527
|
+
case 'create_pr':
|
|
528
|
+
return handoff.createPr(args.taskId, args.expectedVersion);
|
|
529
|
+
case 'merge_state':
|
|
530
|
+
return handoff.readMergeState(args.number);
|
|
531
|
+
case 'ready':
|
|
532
|
+
return handoff.ready(args.number, args.expectedHeadSha);
|
|
533
|
+
case 'merge':
|
|
534
|
+
return handoff.merge({
|
|
535
|
+
number: args.number,
|
|
536
|
+
expectedHeadSha: args.expectedHeadSha,
|
|
537
|
+
method: args.method,
|
|
538
|
+
});
|
|
539
|
+
case 'branch':
|
|
540
|
+
return handoff.branch(args.name, args.from);
|
|
541
|
+
}
|
|
542
|
+
},
|
|
543
|
+
});
|
|
544
|
+
//# sourceMappingURL=handoff-git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoff-git.js","sourceRoot":"","sources":["../../../src/mcp/tools/handoff-git.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,EACrB,uBAAuB,EACvB,yBAAyB,EACzB,gCAAgC,EAChC,2BAA2B,EAC3B,wBAAwB,EACxB,iBAAiB,EACjB,wBAAwB,EACxB,kBAAkB,EAClB,gBAAgB,GAGjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAA2C,MAAM,YAAY,CAAC;AAmD1G,MAAM,eAAe,GAAG,kBAAkB,CAAC;AAE3C,+FAA+F;AAC/F,MAAM,WAAW,GAAG,CAAC,OAAwB,EAAE,EAAE,CAC/C,EAAE,CAAU,eAAe,EAAE;IAC3B,KAAK,EAAE,KAAK,EAAE,KAA6B,EAAE,IAAkB,EAAqB,EAAE;QACpF,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACzB,MAAM,GAAG,GAAG,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjE,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC;CACF,CAAC,CAAC;AAUL,MAAM,MAAM,GAAG,KAAK,EAAE,OAA0B,EAAmB,EAAE;IACnE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC;IAC1B,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;AAC/E,CAAC,CAAC;AAEF,oDAAoD;AACpD,SAAS,YAAY,CAAC,MAAc;IAClC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAuC,CAAC;IAC5D,OAAO,OAAO,IAAI,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,MAAM,CAAC,MAAM,EAAE,CAAC;AAC5F,CAAC;AAED,+FAA+F;AAE/F,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAU,CAAC;AAE3H;;;;GAIG;AACH,MAAM,WAAW,GAAG,CAAC;KAClB,MAAM,CAAC;IACN,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,QAAQ,CACtC,qGAAqG;QACnG,uDAAuD;QACvD,gFAAgF;QAChF,+EAA+E;QAC/E,8DAA8D;QAC9D,yFAAyF,CAC5F;IACD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IAC9F,eAAe,EAAE,wBAAwB;SACtC,QAAQ,EAAE;SACV,QAAQ,CACP,uHAAuH,CACxH;IACH,WAAW,EAAE,iBAAiB;SAC3B,QAAQ,EAAE;SACV,QAAQ,CACP,wUAAwU,CACzU;IACH,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IAC/F,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;IAChH,eAAe,EAAE,CAAC;SACf,MAAM,EAAE;SACR,KAAK,CAAC,gBAAgB,CAAC;SACvB,QAAQ,EAAE;SACV,QAAQ,CAAC,yGAAyG,CAAC;IACtH,MAAM,EAAE,uBAAuB;SAC5B,QAAQ,EAAE;SACV,QAAQ,CAAC,mEAAmE,CAAC;IAChF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;IACzG,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;CAClG,CAAC;KACD,MAAM,EAAE;IACT,oGAAoG;IACpG,kGAAkG;IAClG,wEAAwE;KACvE,WAAW,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IACzB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC;IAC/E,KAAK,MAAM,GAAG,IAAI,OAAO;QAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,UAAU,GAAG,EAAE,EAAE,CAAC,CAAC;IACjH,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAC9D,IAAI,OAAO;QAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;AAC5E,CAAC,CAAC,CAAC;AAIL,gGAAgG;AAChG,mGAAmG;AACnG,2FAA2F;AAC3F,EAAE;AACF,oGAAoG;AACpG,qGAAqG;AACrG,mEAAmE;AACnE,MAAM,QAAQ,GAAwD;IACpE,IAAI,EAAE,EAAE;IACR,MAAM,EAAE,CAAC,QAAQ,EAAE,iBAAiB,EAAE,aAAa,EAAE,SAAS,CAAC;IAC/D,IAAI,EAAE,CAAC,QAAQ,EAAE,iBAAiB,EAAE,aAAa,CAAC;IAClD,SAAS,EAAE,CAAC,QAAQ,EAAE,iBAAiB,EAAE,aAAa,CAAC;IACvD,WAAW,EAAE,CAAC,QAAQ,CAAC;IACvB,KAAK,EAAE,CAAC,QAAQ,EAAE,iBAAiB,EAAE,aAAa,CAAC;IACnD,KAAK,EAAE,CAAC,QAAQ,EAAE,iBAAiB,EAAE,aAAa,CAAC;IACnD,MAAM,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC;CAChC,CAAC;AAEF,MAAM,OAAO,GAAwD;IACnE,IAAI,EAAE,CAAC,QAAQ,CAAC;IAChB,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,aAAa,EAAE,SAAS,CAAC;IACzE,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,aAAa,CAAC;IAC5D,SAAS,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,aAAa,CAAC;IACjE,WAAW,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACjC,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,aAAa,CAAC;IAC7D,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,aAAa,EAAE,QAAQ,CAAC;IACvE,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC;CAClD,CAAC;AAEF,SAAS,eAAe,CAAC,IAAW;IAClC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC;IAC/E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,GAAG,IAAI,CAAC,MAAM,UAAU,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC5E,MAAM,KAAK,GAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAwB,CAAC,MAAM,CAC5D,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CACxE,CAAC;IACF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,GAAG,IAAI,CAAC,MAAM,kBAAkB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAChF,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QACvB,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO;YAAE,OAAO,yBAAyB,CAAC;IACjH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+FAA+F;AAE/F;yEACyE;AACzE,MAAM,MAAM,GAAG,CAAC,OAAgC,EAAiB,EAAE,CACjE,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC,CAAC;AAEzE,kGAAkG;AAClG,MAAM,aAAa,GAAG,CAAC,MAAuB,EAAE,KAAa,EAAE,KAAK,GAA4B,EAAE,EAAiB,EAAE,CACnH,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;AAE7E;oFACoF;AACpF,MAAM,cAAc,GAAG,CAAC,MAAuB,EAAE,GAAW,EAAE,KAAK,GAA4B,EAAE,EAAiB,EAAE;IAClH,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,KAAK;QAAE,OAAO,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IACzD,OAAO,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;AAChI,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,+BAA+B,CAAC;AAChD,MAAM,kBAAkB,GAAG,+DAA+D,CAAC;AAE3F,oGAAoG;AACpG,MAAM,QAAQ,GAAG,CAAC,MAAwB,EAAW,EAAE,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS,CAAC;AAE5H,iGAAiG;AACjG,MAAM,CAAC,MAAM,2BAA2B,GACtC,8GAA8G;IAC9G,4DAA4D,CAAC;AAE/D,MAAM,sBAAsB,GAC1B,6HAA6H,CAAC;AAEhI,MAAM,4BAA4B,GAChC,sIAAsI,CAAC;AAEzI,+FAA+F;AAE/F;;;;GAIG;AACH,MAAM,qBAAqB,GAAwB,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC;AAEzF;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,KAAyB;IACvD,MAAM,GAAG,GAA6C,EAAE,CAAC;IACzD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC1D,GAAG,CAAC,IAAI,CAAC;gBACP,IAAI,EAAE,SAAS,KAAK,CAAC,KAAK,EAAE;gBAC5B,OAAO,EAAE,mBAAmB,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,mDAAmD,CAAC,CAAC,CAAC,EAAE,GAAG;aAClJ,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,cAAc,KAAK,mBAAmB;QAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;IACnH,IAAI,KAAK,CAAC,cAAc,KAAK,iBAAiB;QAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAC,CAAC;IACvH,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACrC,IAAI,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,KAAyB;IACrD,MAAM,GAAG,GAA6C,EAAE,CAAC;IACzD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC1D,GAAG,CAAC,IAAI,CAAC;gBACP,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,mBAAmB,KAAK,CAAC,IAAI,eAAe,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,mDAAmD,CAAC,CAAC,CAAC,EAAE,GAAG;aAC3I,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,cAAc,KAAK,mBAAmB;QAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;IACnH,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+FAA+F;AAE/F,MAAM,OAAO;IAMQ,OAAO;IALT,GAAG,CAAY;IACf,SAAS,CAAS;IAEnC,YACE,OAAwB,EACP,OAAkC;uBAAlC,OAAO;QAExB,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QACvD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;IAC9B,CAAC;IAED,IAAY,KAAK;QACf,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IACvC,CAAC;IAED,8FAA8F;IACtF,KAAK,CAAC,IAAI,CAAC,MAAc;QAC/B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9F,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QACpC,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,cAAc,CAAC;YAC3B,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;YACvB,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE;YACnF,eAAe,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,EAAE;SAC3E,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACpE,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9E,2FAA2F;QAC3F,yCAAyC;QACzC,OAAO,MAAM,CAAC;YACZ,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,IAAI;YACT,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;YACxB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS;YACzC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;SACrC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,OAAe,EAAE,eAAuB;QACnE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG;YAAE,OAAO,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACrG,MAAM,IAAI,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,YAAY;YAAE,OAAO,aAAa,CAAC,QAAQ,EAAE,wBAAwB,kBAAkB,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9G,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,aAAa,CAAC,QAAQ,EAAE,kEAAkE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/G,CAAC;QACD,wFAAwF;QACxF,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC1G,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,aAAa,CAAC,QAAQ,EAAE,wBAAwB,kBAAkB,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACnH,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/E,IAAI,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YAC9D,OAAO,aAAa,CAAC,QAAQ,EAAE,2CAA2C,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACxF,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,MAAM,CACtB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,CAAC,CACpH,CAAC;QACF,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,cAAc,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,uBAAuB,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrD,OAAO,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/G,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,eAAuB;QAChD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG;YAAE,OAAO,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACnG,MAAM,IAAI,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,YAAY;YAAE,OAAO,aAAa,CAAC,MAAM,EAAE,sBAAsB,kBAAkB,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1G,sFAAsF;QACtF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACrE,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,IAAI,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;YACnE,OAAO,aAAa,CAAC,MAAM,EAAE,yCAAyC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,MAAM;YAAE,OAAO,aAAa,CAAC,MAAM,EAAE,kDAAkD,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5G,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,aAAa,CAAC,MAAM,EAAE,gEAAgE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3G,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;QACnI,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,qBAAqB,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnD,OAAO,MAAM,CAAC;YACZ,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,MAAM;YACd,IAAI;YACJ,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,eAAuB;QACpD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG;YAAE,OAAO,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACxG,MAAM,IAAI,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YACrC,OAAO,aAAa,CAAC,WAAW,EAAE,2BAA2B,kBAAkB,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/F,CAAC;QACD,8FAA8F;QAC9F,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,aAAa,CAAC,WAAW,EAAE,qEAAqE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACrH,CAAC;QACD,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;QAC1C,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;YAC5B,OAAO,aAAa,CAClB,WAAW,EACX,2BAA2B,YAAY,CAAC,MAAM,IAAI,0BAA0B,EAAE,EAC9E,EAAE,IAAI,EAAE,CACT,CAAC;QACJ,CAAC;QACD,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,OAAO,aAAa,CAAC,WAAW,EAAE,2EAA2E,EAAE;gBAC7G,IAAI;aACL,CAAC,CAAC;QACL,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7H,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,MAAM,GAAI,GAAG,CAAC,IAAyC,EAAE,MAAM,CAAC;YACtE,OAAO,cAAc,CAAC,WAAW,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACvG,CAAC;QACD,MAAM,IAAI,GAAG,sBAAsB,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpD,OAAO,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACnG,CAAC;IAED,2EAA2E;IACnE,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,MAAuB;QAG9D,MAAM,GAAG,GAAG,MAAM,MAAM,CACtB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC;YACjD,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE;YAChD,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE;SACxB,CAAC,CACH,CAAC;QACF,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;QAClF,MAAM,MAAM,GAAG,gCAAgC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACtB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;aACzF,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAc;QACjC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QAC1D,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QACjC,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,OAAO,MAAM,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9G,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,MAAc,EAAE,eAAuB;QACjD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAC5C,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,OAAO,MAAM,CAAC;oBACZ,MAAM,EAAE,OAAO;oBACf,MAAM,EAAE,QAAQ;oBAChB,SAAS,EAAE,SAAS;oBACpB,OAAO,EAAE,IAAI;oBACb,MAAM;oBACN,QAAQ;oBACR,UAAU,EAAE,2BAA2B;iBACxC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,MAAM,CACtB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;YACzC,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE;YAChD,wFAAwF;YACxF,IAAI,EAAE,EAAE,eAAe,EAAE;SAC1B,CAAC,CACH,CAAC;QACF,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,2BAA2B,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACzD,OAAO,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACtG,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAuB,CAAC;QACpD,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC;gBACZ,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,UAAU;gBAClB,IAAI,EAAE,YAAY;gBAClB,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC;gBACxB,UAAU,EAAE,4BAA4B;aACzC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAA2E;QACrF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACzD,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,sFAAsF;QACtF,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,MAAM,CAAC;gBACZ,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,QAAQ;gBAChB,SAAS,EAAE,SAAS;gBACpB,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,QAAQ;gBACR,UAAU,EAAE,2BAA2B;aACxC,CAAC,CAAC;QACL,CAAC;QACD,+FAA+F;QAC/F,kGAAkG;QAClG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,OAAO,MAAM,CAAC;gBACZ,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,QAAQ;gBAChB,SAAS,EAAE,OAAO;gBAClB,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,UAAU,EAAE,2BAA2B;aACxC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,MAAM,CAAC;gBACZ,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,QAAQ;gBAChB,SAAS,EAAE,QAAQ;gBACnB,KAAK,EAAE,+BAA+B;aACvC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,MAAM,CACtB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;YACzC,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;YACrD,IAAI,EAAE;gBACJ,MAAM;gBACN,0FAA0F;gBAC1F,0FAA0F;gBAC1F,uEAAuE;gBACvE,eAAe,EAAE,IAAI,CAAC,eAAe;aACtC;SACF,CAAC,CACH,CAAC;QACF,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,yBAAyB,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACvD,OAAO,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAyD,CAAC;QACtF,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC;gBACZ,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,UAAU;gBAClB,IAAI,EAAE,YAAY;gBAClB,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC;gBACxB,UAAU,EAAE,sBAAsB;aACnC,CAAC,CAAC;QACL,CAAC;QACD,0FAA0F;QAC1F,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;QAClF,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrE,OAAO,MAAM,CAAC;gBACZ,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,QAAQ;gBAChB,SAAS,EAAE,SAAS;gBACpB,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,GAAG,CAAC,MAAM;gBACtB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC;gBACxB,UAAU,EAAE,2BAA2B;aACxC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,IAAwB;QACjD,6EAA6E;QAC7E,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACrE,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,CAAC;aACb,KAAK,CAAC,YAAY,CAAC;aACnB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;aAChB,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC;QAC9F,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,aAAa,CAClB,QAAQ,EACR,+HAA+H,EAC/H,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,CAC5B,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,MAAM,CACtB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAC3G,CAAC;QACF,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,wBAAwB,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtD,OAAO,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAClG,CAAC;CACF;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;IACvC,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,kEAAkE;IACzE,WAAW,EACT,6GAA6G;QAC7G,mHAAmH;QACnH,2CAA2C;QAC3C,6GAA6G;QAC7G,mHAAmH;QACnH,sHAAsH;QACtH,gEAAgE;QAChE,kHAAkH;QAClH,gHAAgH;QAChH,8BAA8B;IAChC,WAAW;IACX,WAAW,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;IAC3D,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG;QAClB,MAAM,OAAO,GAAI,GAAsB,CAAC,OAAO,CAAC;QAChD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,WAAW,CAChB,2HAA2H,CAC5H,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,OAAO;YAAE,OAAO,WAAW,CAAC,sCAAsC,OAAO,EAAE,CAAC,CAAC;QACjF,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QAClD,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,KAAK,MAAM;gBACT,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;YACxB,KAAK,QAAQ;gBACX,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAO,EAAE,IAAI,CAAC,OAAQ,EAAE,IAAI,CAAC,eAAgB,CAAC,CAAC;YAC5E,KAAK,MAAM;gBACT,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAO,EAAE,IAAI,CAAC,eAAgB,CAAC,CAAC;YAC3D,KAAK,WAAW;gBACd,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAO,EAAE,IAAI,CAAC,eAAgB,CAAC,CAAC;YAC/D,KAAK,aAAa;gBAChB,OAAO,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,MAAO,CAAC,CAAC;YAC9C,KAAK,OAAO;gBACV,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAO,EAAE,IAAI,CAAC,eAAgB,CAAC,CAAC;YAC5D,KAAK,OAAO;gBACV,OAAO,OAAO,CAAC,KAAK,CAAC;oBACnB,MAAM,EAAE,IAAI,CAAC,MAAO;oBACpB,eAAe,EAAE,IAAI,CAAC,eAAgB;oBACtC,MAAM,EAAE,IAAI,CAAC,MAAM;iBACpB,CAAC,CAAC;YACL,KAAK,QAAQ;gBACX,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { taskReadsTool } from './task-reads.js';
|
|
2
|
+
import { executionControlTool } from './execution-control.js';
|
|
3
|
+
import { discoverProjectTool } from './discovery.js';
|
|
4
|
+
import { organiseWorkTool } from './work-organisation.js';
|
|
5
|
+
import { taskCreateTool } from './task-create.js';
|
|
6
|
+
import { handoffGitTool } from './handoff-git.js';
|
|
7
|
+
import { resultsEvidenceTool } from './results-evidence.js';
|
|
8
|
+
import { projectConfigTool } from './project-config.js';
|
|
9
|
+
import { localHandoffTool } from './local-handoff.js';
|
|
10
|
+
import { leaderEventsTool } from './leader-events.js';
|
|
11
|
+
export const tools = [
|
|
12
|
+
taskReadsTool,
|
|
13
|
+
executionControlTool,
|
|
14
|
+
discoverProjectTool,
|
|
15
|
+
organiseWorkTool,
|
|
16
|
+
taskCreateTool,
|
|
17
|
+
handoffGitTool,
|
|
18
|
+
resultsEvidenceTool,
|
|
19
|
+
projectConfigTool,
|
|
20
|
+
localHandoffTool,
|
|
21
|
+
leaderEventsTool,
|
|
22
|
+
];
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,CAAC,MAAM,KAAK,GAAuB;IACvC,aAAa;IACb,oBAAoB;IACpB,mBAAmB;IACnB,gBAAgB;IAChB,cAAc;IACd,cAAc;IACd,mBAAmB;IACnB,iBAAiB;IACjB,gBAAgB;IAChB,gBAAgB;CACjB,CAAC"}
|