@osolmaz/pi-workflows 0.11.1 → 0.12.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 +15 -6
- package/dist/builtins/autoimplement-command-batches.d.ts +52 -0
- package/dist/builtins/autoimplement-command-batches.js +258 -0
- package/dist/builtins/autoimplement-command-batches.js.map +1 -0
- package/dist/builtins/autoimplement.workflow.d.ts +29 -3
- package/dist/builtins/autoimplement.workflow.js +876 -231
- package/dist/builtins/autoimplement.workflow.js.map +1 -1
- package/dist/builtins/catalog.js +3 -1
- package/dist/builtins/catalog.js.map +1 -1
- package/dist/builtins/index.d.ts +2 -0
- package/dist/builtins/index.js +1 -0
- package/dist/builtins/index.js.map +1 -1
- package/dist/builtins/sanity-check-session.d.ts +17 -0
- package/dist/builtins/sanity-check-session.js +168 -0
- package/dist/builtins/sanity-check-session.js.map +1 -0
- package/dist/builtins/sanity-check.workflow.d.ts +83 -0
- package/dist/builtins/sanity-check.workflow.js +398 -0
- package/dist/builtins/sanity-check.workflow.js.map +1 -0
- package/dist/controllers/sqlite.d.ts +141 -5
- package/dist/controllers/sqlite.js +568 -46
- package/dist/controllers/sqlite.js.map +1 -1
- package/dist/extension/decision-channels.js +7 -7
- package/dist/extension/deferred-turn-coordinator.d.ts +32 -0
- package/dist/extension/deferred-turn-coordinator.js +143 -0
- package/dist/extension/deferred-turn-coordinator.js.map +1 -0
- package/dist/extension/deferred-turn.d.ts +44 -0
- package/dist/extension/deferred-turn.js +110 -0
- package/dist/extension/deferred-turn.js.map +1 -0
- package/dist/extension/index.js +515 -84
- package/dist/extension/index.js.map +1 -1
- package/dist/extension/step-message.d.ts +1 -0
- package/dist/extension/step-message.js.map +1 -1
- package/dist/herdr/setup.js +4 -4
- package/dist/host/runner.js +3 -0
- package/dist/host/runner.js.map +1 -1
- package/dist/workflows/command-batch.d.ts +38 -0
- package/dist/workflows/command-batch.js +176 -0
- package/dist/workflows/command-batch.js.map +1 -0
- package/dist/workflows/engine.js +8 -4
- package/dist/workflows/engine.js.map +1 -1
- package/dist/workflows/index.d.ts +1 -0
- package/dist/workflows/index.js +1 -0
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/migrate-sources.d.ts +1 -1
- package/dist/workflows/migrate-sources.js.map +1 -1
- package/dist/workflows/schema.js +2 -1
- package/dist/workflows/schema.js.map +1 -1
- package/dist/workflows/shell.d.ts +4 -0
- package/dist/workflows/shell.js +6 -0
- package/dist/workflows/shell.js.map +1 -1
- package/dist/workflows/store.js +3 -1
- package/dist/workflows/store.js.map +1 -1
- package/dist/workflows/tool-input.d.ts +1 -0
- package/dist/workflows/tool-input.js +2 -2
- package/dist/workflows/tool-input.js.map +1 -1
- package/dist/workflows/types.d.ts +4 -3
- package/docs/2026-08-18-herdr-piw-plan.md +1 -1
- package/docs/2026-08-20-durable-workflow-launch-plan.md +445 -0
- package/docs/CONTROLLERS.md +2 -2
- package/docs/DEFERRED_TURNS.md +298 -0
- package/docs/DESIGN_PHILOSOPHY.md +1 -1
- package/docs/HUMAN_DECISIONS.md +7 -7
- package/docs/HUMAN_DECISION_PRESENTATIONS.md +3 -3
- package/docs/MONITOR.md +2 -2
- package/docs/WORKFLOW_COMPOSITION.md +2 -2
- package/docs/WORKFLOW_STEP_MESSAGES.md +5 -5
- package/docs/WORKFLOW_UPDATES.md +28 -5
- package/docs/plans/2026-08-04-controller-runtime-plan.md +1 -1
- package/docs/plans/2026-08-05-always-on-workflows-plan.md +1 -1
- package/docs/plans/2026-08-10-agent-managed-monitor-workflows-plan.md +9 -9
- package/docs/plans/2026-08-13-built-in-workflow-catalog-plan.md +1 -1
- package/docs/plans/2026-08-13-session-addressed-workflow-notifications-plan.md +1 -1
- package/docs/plans/2026-08-16-workflow-updates-plan.md +3 -3
- package/docs/plans/2026-08-17-bundled-skills-plan.md +6 -6
- package/docs/plans/2026-08-19-human-decision-gates-plan.md +5 -5
- package/docs/plans/2026-08-19-human-decision-presentations-plan.md +1 -1
- package/docs/plans/2026-08-19-provider-compatible-workflow-tool-schema-plan.md +1 -1
- package/docs/plans/2026-08-19-workflow-composition-plan.md +6 -6
- package/docs/plans/2026-08-20-autoimplement-blocker-challenge-plan.md +3 -3
- package/docs/plans/2026-08-20-bounded-command-batches-plan.md +206 -0
- package/docs/plans/2026-08-20-herdr-plugin-sync-plan.md +9 -9
- package/docs/plans/2026-08-21-autoimplement-timeout-fallback-plan.md +242 -0
- package/docs/plans/2026-08-21-deferred-turn-intents-plan.md +324 -0
- package/docs/plans/2026-08-21-sanity-check-plan.md +175 -0
- package/docs/run-bundles.md +3 -1
- package/docs/workflows.md +67 -17
- package/examples/workflows/command-batch.workflow.ts +50 -0
- package/examples/workflows/sanity-check.workflow.ts +1 -0
- package/herdr-plugin.toml +3 -3
- package/package.json +1 -1
- package/schemas/decision-presentation-v1.schema.json +1 -1
- package/schemas/human-decision-accepted-v1.schema.json +1 -1
- package/schemas/human-decision-accepted-v2.schema.json +1 -1
- package/schemas/human-decision-answer-attempt-v1.schema.json +1 -1
- package/schemas/human-decision-cancellation-v1.schema.json +1 -1
- package/schemas/human-decision-continuation-v1.schema.json +1 -1
- package/schemas/human-decision-delivery-v1.schema.json +1 -1
- package/schemas/human-decision-delivery-v2.schema.json +1 -1
- package/schemas/human-decision-receipt-v1.schema.json +1 -1
- package/schemas/human-decision-receipt-v2.schema.json +1 -1
- package/schemas/human-decision-request-v1.schema.json +1 -1
- package/schemas/human-decision-request-v2.schema.json +1 -1
- package/schemas/human-decision-resolution-v1.schema.json +1 -1
- package/schemas/human-decision-resolution-v2.schema.json +1 -1
- package/schemas/human-decision-settlement-v1.schema.json +1 -1
- package/skills/autodoc/SKILL.md +33 -2
- package/skills/autoimplement/SKILL.md +66 -12
- package/skills/autoplan/SKILL.md +26 -2
- package/skills/monitor/SKILL.md +35 -21
- package/skills/pi-workflows/SKILL.md +19 -5
- package/src/builtins/autoimplement-command-batches.ts +364 -0
- package/src/builtins/autoimplement.workflow.ts +1065 -261
- package/src/builtins/catalog.ts +3 -1
- package/src/builtins/index.ts +13 -0
- package/src/builtins/sanity-check-session.ts +205 -0
- package/src/builtins/sanity-check.workflow.ts +624 -0
- package/src/controllers/sqlite.ts +878 -51
- package/src/extension/decision-channels.ts +7 -7
- package/src/extension/deferred-turn-coordinator.ts +171 -0
- package/src/extension/deferred-turn.ts +166 -0
- package/src/extension/index.ts +646 -91
- package/src/extension/step-message.ts +1 -0
- package/src/herdr/setup.ts +4 -4
- package/src/host/runner.ts +3 -0
- package/src/workflows/command-batch.ts +254 -0
- package/src/workflows/engine.ts +8 -5
- package/src/workflows/index.ts +15 -0
- package/src/workflows/migrate-sources.ts +5 -1
- package/src/workflows/schema.ts +2 -1
- package/src/workflows/shell.ts +10 -0
- package/src/workflows/store.ts +3 -1
- package/src/workflows/tool-input.ts +5 -2
- package/src/workflows/types.ts +4 -3
package/README.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# pi-workflows
|
|
2
2
|
|
|
3
|
+
<p align="center">
|
|
4
|
+
<img src="assets/cover.svg" alt="pi-workflows: a representative multi-step workflow graph with plan, implement, verify, review, a fix loop, and a clean finish" width="880">
|
|
5
|
+
</p>
|
|
6
|
+
|
|
3
7
|
pi-workflows is a workflow extension for the [pi coding agent](https://pi.dev).
|
|
4
8
|
It lets you define multi-step agent workflows as TypeScript graphs, trigger
|
|
5
9
|
them at any point in a pi conversation with `/workflow`, and watch them run
|
|
@@ -76,14 +80,14 @@ or run it in place with `npx tsx src/viewer/cli.ts`.
|
|
|
76
80
|
|
|
77
81
|
## Herdr integration
|
|
78
82
|
|
|
79
|
-
|
|
80
|
-
`piw` and
|
|
83
|
+
pi-workflows also ships as a [Herdr](https://herdr.dev) plugin. After installing
|
|
84
|
+
`piw` and pi-workflows, synchronize the bundled plugin:
|
|
81
85
|
|
|
82
86
|
```bash
|
|
83
87
|
pi-workflows herdr sync
|
|
84
88
|
```
|
|
85
89
|
|
|
86
|
-
Run the same command after a
|
|
90
|
+
Run the same command after a pi-workflows update. It finds the package that
|
|
87
91
|
provides the running CLI and repairs a Herdr link when npm moved that package.
|
|
88
92
|
`pi-workflows herdr setup` remains an alias for existing installations. Use
|
|
89
93
|
`--json` for versioned machine-readable output. The [Herdr plugin sync
|
|
@@ -94,7 +98,7 @@ When Pi runs inside Herdr, a workflow widget shows `Ctrl+Shift+R piw`. When the
|
|
|
94
98
|
The shortcut opens the exact run bundle and lets you choose a split, tab, or new
|
|
95
99
|
workspace. `/piw` opens the same menu, and `/piw right`, `/piw below`, `/piw
|
|
96
100
|
left`, `/piw above`, `/piw tab`, or `/piw workspace` selects a placement
|
|
97
|
-
directly. If a viewer for that run already exists,
|
|
101
|
+
directly. If a viewer for that run already exists, pi-workflows focuses it
|
|
98
102
|
instead of opening a duplicate.
|
|
99
103
|
|
|
100
104
|
The plugin uses Herdr's public pane APIs and runs no service or polling loop. It
|
|
@@ -129,6 +133,11 @@ Then, from any pi conversation:
|
|
|
129
133
|
/workflow echo summarize this repository
|
|
130
134
|
```
|
|
131
135
|
|
|
136
|
+
A model-started workflow is saved before the tool reports it as queued. The returned run ID works
|
|
137
|
+
with `workflow status` and `workflow cancel` before execution starts. pi-workflows waits for the
|
|
138
|
+
current agent turn to settle before activation. If activation fails, it saves the failure and sends
|
|
139
|
+
one follow-up turn so the model can correct the cause and start a new run.
|
|
140
|
+
|
|
132
141
|
`/workflow` with no arguments lists discovered workflows. `/workflow pause`
|
|
133
142
|
lets the current step finish and then holds the run before the next node. This
|
|
134
143
|
is useful when you want to interject in the conversation mid-workflow.
|
|
@@ -186,7 +195,7 @@ The model can use the same `workflow` tool to list, start, inspect, pause,
|
|
|
186
195
|
resume, cancel, and answer workflows. Step contracts use the tool's `submit`
|
|
187
196
|
action. Slash commands and model actions share one lifecycle implementation.
|
|
188
197
|
|
|
189
|
-
|
|
198
|
+
pi-workflows includes a `monitor` workflow for plain-language requests such as:
|
|
190
199
|
|
|
191
200
|
> Monitor PR 123 every 30 minutes. Report failed checks. Stop when it is merged or closed.
|
|
192
201
|
|
|
@@ -347,7 +356,7 @@ example set. Copy any of them into `.pi/workflows/` to use them:
|
|
|
347
356
|
a detailed implementation plan, using the ideal end state as guidance rather
|
|
348
357
|
than an out-of-scope requirement.
|
|
349
358
|
- `autoimplement` finds a clear existing plan, documents it when needed,
|
|
350
|
-
implements and verifies it, writes and runs the exact
|
|
359
|
+
implements and verifies it, writes and runs the exact pi-reviewer command,
|
|
351
360
|
tracks P0 through P2, handles PR comments and CI, and
|
|
352
361
|
finalizes the PR. P0 and P1 fixes require another review. P2-only work is
|
|
353
362
|
verified without another reviewer round. A five-minute CI wait routes to
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type CommandBatchItem } from "../workflows/command-batch.js";
|
|
2
|
+
export declare const REVIEW_TIMEOUT_MS: number;
|
|
3
|
+
export declare const CI_WATCH_TIMEOUT_MS: number;
|
|
4
|
+
export declare const VERIFICATION_TIMEOUT_MS: number;
|
|
5
|
+
export declare const AUTOIMPLEMENT_BATCH_MAX_OUTPUT_CHARS = 1000000;
|
|
6
|
+
export declare const AUTOIMPLEMENT_MAX_CONCURRENCY = 8;
|
|
7
|
+
export type AutoimplementConcurrency = {
|
|
8
|
+
reviewer: number;
|
|
9
|
+
ciWatch: number;
|
|
10
|
+
verification: number;
|
|
11
|
+
};
|
|
12
|
+
export type PublishedRepository = {
|
|
13
|
+
id: string;
|
|
14
|
+
repository: string;
|
|
15
|
+
branch: string;
|
|
16
|
+
baseBranch: string;
|
|
17
|
+
headRevision: string;
|
|
18
|
+
pr: string;
|
|
19
|
+
dependencyFingerprint?: string;
|
|
20
|
+
};
|
|
21
|
+
export type PublishedRepositories = {
|
|
22
|
+
repositories: PublishedRepository[];
|
|
23
|
+
};
|
|
24
|
+
export type VerificationCommandPlan = {
|
|
25
|
+
commands: CommandBatchItem[];
|
|
26
|
+
untested: string[];
|
|
27
|
+
};
|
|
28
|
+
export type CiTargetInspection = {
|
|
29
|
+
id: string;
|
|
30
|
+
repository: string;
|
|
31
|
+
headRevision: string;
|
|
32
|
+
pr: string;
|
|
33
|
+
route: "green" | "failed" | "pending" | "unavailable";
|
|
34
|
+
reason: string;
|
|
35
|
+
relatedFailures: string[];
|
|
36
|
+
unrelatedFailures: string[];
|
|
37
|
+
trackingCommand?: CommandBatchItem;
|
|
38
|
+
};
|
|
39
|
+
export type CiInspectionBatch = {
|
|
40
|
+
route: "green" | "failed" | "pending" | "unavailable";
|
|
41
|
+
reason: string;
|
|
42
|
+
relatedFailures: string[];
|
|
43
|
+
unrelatedFailures: string[];
|
|
44
|
+
targets: CiTargetInspection[];
|
|
45
|
+
};
|
|
46
|
+
export declare function parseAutoimplementConcurrency(value: unknown): AutoimplementConcurrency;
|
|
47
|
+
export declare function parsePublishedRepositories(value: unknown): PublishedRepositories;
|
|
48
|
+
export declare function reviewerCommand(repository: PublishedRepository): CommandBatchItem;
|
|
49
|
+
export declare function parseVerificationCommandPlan(value: unknown): VerificationCommandPlan;
|
|
50
|
+
export declare function parseCiInspectionBatch(value: unknown): CiInspectionBatch;
|
|
51
|
+
export declare function parseCiCommand(value: unknown, id: string, repository: string, pr: string): CommandBatchItem;
|
|
52
|
+
export declare function repositoryId(repository: string): string;
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { MAX_COMMAND_BATCH_ITEMS, validateCommandBatchRequest, } from "../workflows/command-batch.js";
|
|
4
|
+
export const REVIEW_TIMEOUT_MS = 10 * 60_000;
|
|
5
|
+
export const CI_WATCH_TIMEOUT_MS = 5 * 60_000;
|
|
6
|
+
export const VERIFICATION_TIMEOUT_MS = 45 * 60_000;
|
|
7
|
+
export const AUTOIMPLEMENT_BATCH_MAX_OUTPUT_CHARS = 1_000_000;
|
|
8
|
+
export const AUTOIMPLEMENT_MAX_CONCURRENCY = 8;
|
|
9
|
+
export function parseAutoimplementConcurrency(value) {
|
|
10
|
+
if (value === undefined)
|
|
11
|
+
return { reviewer: 4, ciWatch: 4, verification: 2 };
|
|
12
|
+
const input = requireRecord(value, "autoimplement concurrency");
|
|
13
|
+
for (const key of Object.keys(input)) {
|
|
14
|
+
if (key !== "reviewer" && key !== "ciWatch" && key !== "verification") {
|
|
15
|
+
throw new Error(`autoimplement concurrency.${key} is not supported`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
reviewer: concurrencyValue(input.reviewer ?? 4, "reviewer"),
|
|
20
|
+
ciWatch: concurrencyValue(input.ciWatch ?? 4, "ciWatch"),
|
|
21
|
+
verification: concurrencyValue(input.verification ?? 2, "verification"),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function parsePublishedRepositories(value) {
|
|
25
|
+
const result = requireRecord(value, "publication result");
|
|
26
|
+
if (!Array.isArray(result.repositories) || result.repositories.length === 0) {
|
|
27
|
+
throw new Error("publication result repositories must be a non-empty array");
|
|
28
|
+
}
|
|
29
|
+
if (result.repositories.length > MAX_COMMAND_BATCH_ITEMS) {
|
|
30
|
+
throw new Error(`publication result repositories must contain at most ${MAX_COMMAND_BATCH_ITEMS} entries`);
|
|
31
|
+
}
|
|
32
|
+
const ids = new Set();
|
|
33
|
+
const repositories = result.repositories.map((entry, index) => {
|
|
34
|
+
const raw = requireRecord(entry, `publication repositories[${index}]`);
|
|
35
|
+
const repository = requireAbsolutePath(raw.repository, `publication repositories[${index}].repository`);
|
|
36
|
+
const id = repositoryId(repository);
|
|
37
|
+
if (ids.has(id))
|
|
38
|
+
throw new Error(`publication repository is duplicated: ${repository}`);
|
|
39
|
+
ids.add(id);
|
|
40
|
+
const dependencyFingerprint = optionalString(raw.dependencyFingerprint, `publication repositories[${index}].dependencyFingerprint`);
|
|
41
|
+
if (raw.pushed !== true) {
|
|
42
|
+
throw new Error(`publication repositories[${index}].pushed must be true`);
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
id,
|
|
46
|
+
repository,
|
|
47
|
+
branch: requireString(raw.branch, `publication repositories[${index}].branch`),
|
|
48
|
+
baseBranch: requireString(raw.baseBranch, `publication repositories[${index}].baseBranch`),
|
|
49
|
+
headRevision: requireString(raw.headRevision, `publication repositories[${index}].headRevision`),
|
|
50
|
+
pr: requireString(raw.pr, `publication repositories[${index}].pr`),
|
|
51
|
+
...(dependencyFingerprint !== undefined ? { dependencyFingerprint } : {}),
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
return { repositories };
|
|
55
|
+
}
|
|
56
|
+
export function reviewerCommand(repository) {
|
|
57
|
+
return {
|
|
58
|
+
id: repository.id,
|
|
59
|
+
command: "pi-reviewer",
|
|
60
|
+
args: ["--base", repository.baseBranch],
|
|
61
|
+
cwd: repository.repository,
|
|
62
|
+
timeoutMs: REVIEW_TIMEOUT_MS,
|
|
63
|
+
maxOutputChars: AUTOIMPLEMENT_BATCH_MAX_OUTPUT_CHARS,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export function parseVerificationCommandPlan(value) {
|
|
67
|
+
const result = requireRecord(value, "verification command plan");
|
|
68
|
+
if (!Array.isArray(result.commands) || result.commands.length === 0) {
|
|
69
|
+
throw new Error("verification commands must be a non-empty array");
|
|
70
|
+
}
|
|
71
|
+
const directories = new Set();
|
|
72
|
+
const commands = result.commands.map((entry, index) => {
|
|
73
|
+
const command = parseCommandItem(entry, `verification commands[${index}]`, {
|
|
74
|
+
maxTimeoutMs: VERIFICATION_TIMEOUT_MS,
|
|
75
|
+
});
|
|
76
|
+
if (directories.has(command.cwd)) {
|
|
77
|
+
throw new Error(`verification commands must use distinct working directories: ${command.cwd}`);
|
|
78
|
+
}
|
|
79
|
+
directories.add(command.cwd);
|
|
80
|
+
validateVerificationCommand(command, index);
|
|
81
|
+
return command;
|
|
82
|
+
});
|
|
83
|
+
const validated = validateCommandBatchRequest({ items: commands, maxConcurrency: 1 });
|
|
84
|
+
return {
|
|
85
|
+
commands: validated.items,
|
|
86
|
+
untested: stringArray(result.untested ?? [], "verification untested"),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
export function parseCiInspectionBatch(value) {
|
|
90
|
+
const result = requireRecord(value, "CI inspection");
|
|
91
|
+
if (!Array.isArray(result.targets) || result.targets.length === 0) {
|
|
92
|
+
throw new Error("CI inspection targets must be a non-empty array");
|
|
93
|
+
}
|
|
94
|
+
if (result.targets.length > MAX_COMMAND_BATCH_ITEMS) {
|
|
95
|
+
throw new Error(`CI inspection targets must contain at most ${MAX_COMMAND_BATCH_ITEMS} entries`);
|
|
96
|
+
}
|
|
97
|
+
const ids = new Set();
|
|
98
|
+
const targets = result.targets.map((entry, index) => {
|
|
99
|
+
const raw = requireRecord(entry, `CI targets[${index}]`);
|
|
100
|
+
const repository = requireAbsolutePath(raw.repository, `CI targets[${index}].repository`);
|
|
101
|
+
const id = repositoryId(repository);
|
|
102
|
+
if (ids.has(id))
|
|
103
|
+
throw new Error(`CI target is duplicated: ${repository}`);
|
|
104
|
+
ids.add(id);
|
|
105
|
+
if (raw.route !== "green" &&
|
|
106
|
+
raw.route !== "failed" &&
|
|
107
|
+
raw.route !== "pending" &&
|
|
108
|
+
raw.route !== "unavailable") {
|
|
109
|
+
throw new Error(`CI targets[${index}].route is invalid`);
|
|
110
|
+
}
|
|
111
|
+
const pr = requireString(raw.pr, `CI targets[${index}].pr`);
|
|
112
|
+
const target = {
|
|
113
|
+
id,
|
|
114
|
+
repository,
|
|
115
|
+
headRevision: requireString(raw.headRevision, `CI targets[${index}].headRevision`),
|
|
116
|
+
pr,
|
|
117
|
+
route: raw.route,
|
|
118
|
+
reason: requireString(raw.reason, `CI targets[${index}].reason`),
|
|
119
|
+
relatedFailures: stringArray(raw.relatedFailures ?? [], `CI targets[${index}].relatedFailures`),
|
|
120
|
+
unrelatedFailures: stringArray(raw.unrelatedFailures ?? [], `CI targets[${index}].unrelatedFailures`),
|
|
121
|
+
};
|
|
122
|
+
if (raw.route === "pending") {
|
|
123
|
+
target.trackingCommand = parseCiCommand(raw.trackingCommand, id, repository, pr);
|
|
124
|
+
}
|
|
125
|
+
return target;
|
|
126
|
+
});
|
|
127
|
+
const route = targets.some((target) => target.route === "failed")
|
|
128
|
+
? "failed"
|
|
129
|
+
: targets.some((target) => target.route === "pending")
|
|
130
|
+
? "pending"
|
|
131
|
+
: targets.some((target) => target.route === "unavailable")
|
|
132
|
+
? "unavailable"
|
|
133
|
+
: "green";
|
|
134
|
+
return {
|
|
135
|
+
route,
|
|
136
|
+
reason: targets.map((target) => `${target.id}: ${target.reason}`).join("; "),
|
|
137
|
+
relatedFailures: targets.flatMap((target) => target.relatedFailures),
|
|
138
|
+
unrelatedFailures: targets.flatMap((target) => target.unrelatedFailures),
|
|
139
|
+
targets,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
export function parseCiCommand(value, id, repository, pr) {
|
|
143
|
+
const raw = requireRecord(value, "CI tracking command");
|
|
144
|
+
if (raw.id !== id)
|
|
145
|
+
throw new Error("CI tracking command id must match the target repository");
|
|
146
|
+
const command = parseCommandItem(raw, "CI tracking command", {
|
|
147
|
+
id,
|
|
148
|
+
command: "gh",
|
|
149
|
+
cwd: repository,
|
|
150
|
+
maxTimeoutMs: CI_WATCH_TIMEOUT_MS,
|
|
151
|
+
});
|
|
152
|
+
const args = command.args;
|
|
153
|
+
const prWatch = (args.length === 3 && args[0] === "pr" && args[1] === "checks" && args[2] === "--watch") ||
|
|
154
|
+
(args.length === 4 &&
|
|
155
|
+
args[0] === "pr" &&
|
|
156
|
+
args[1] === "checks" &&
|
|
157
|
+
args[2] === pr &&
|
|
158
|
+
args[3] === "--watch");
|
|
159
|
+
const runWatch = args.length === 3 &&
|
|
160
|
+
args[0] === "run" &&
|
|
161
|
+
args[1] === "watch" &&
|
|
162
|
+
/^[1-9]\d*$/.test(args[2] ?? "");
|
|
163
|
+
if (!prWatch && !runWatch) {
|
|
164
|
+
throw new Error("CI tracking command args are not allowed for the target PR");
|
|
165
|
+
}
|
|
166
|
+
return { ...command, args: ["pr", "checks", pr, "--watch"] };
|
|
167
|
+
}
|
|
168
|
+
export function repositoryId(repository) {
|
|
169
|
+
const canonical = path.resolve(repository);
|
|
170
|
+
return createHash("sha256").update(canonical).digest("hex").slice(0, 16);
|
|
171
|
+
}
|
|
172
|
+
function parseCommandItem(value, label, options) {
|
|
173
|
+
const raw = requireRecord(value, label);
|
|
174
|
+
const id = options.id ?? requireString(raw.id, `${label}.id`);
|
|
175
|
+
const command = options.command ?? requireString(raw.command, `${label}.command`);
|
|
176
|
+
if (options.command !== undefined && raw.command !== options.command) {
|
|
177
|
+
throw new Error(`${label}.command must be ${options.command}`);
|
|
178
|
+
}
|
|
179
|
+
if (!Array.isArray(raw.args) || raw.args.some((arg) => typeof arg !== "string")) {
|
|
180
|
+
throw new Error(`${label}.args must be an array of strings`);
|
|
181
|
+
}
|
|
182
|
+
const cwd = options.cwd ?? requireAbsolutePath(raw.cwd, `${label}.cwd`);
|
|
183
|
+
if (options.cwd !== undefined && path.resolve(String(raw.cwd)) !== options.cwd) {
|
|
184
|
+
throw new Error(`${label}.cwd must match the target repository`);
|
|
185
|
+
}
|
|
186
|
+
const timeoutMs = positiveInteger(raw.timeoutMs, `${label}.timeoutMs`, options.maxTimeoutMs);
|
|
187
|
+
const maxOutputChars = positiveInteger(raw.maxOutputChars ?? AUTOIMPLEMENT_BATCH_MAX_OUTPUT_CHARS, `${label}.maxOutputChars`, AUTOIMPLEMENT_BATCH_MAX_OUTPUT_CHARS);
|
|
188
|
+
return { id, command, args: [...raw.args], cwd, timeoutMs, maxOutputChars };
|
|
189
|
+
}
|
|
190
|
+
function validateVerificationCommand(command, index) {
|
|
191
|
+
const forbiddenCommands = new Set([
|
|
192
|
+
"ash",
|
|
193
|
+
"bash",
|
|
194
|
+
"cmd",
|
|
195
|
+
"cmd.exe",
|
|
196
|
+
"csh",
|
|
197
|
+
"dash",
|
|
198
|
+
"fish",
|
|
199
|
+
"gh",
|
|
200
|
+
"git",
|
|
201
|
+
"ksh",
|
|
202
|
+
"powershell",
|
|
203
|
+
"powershell.exe",
|
|
204
|
+
"pwsh",
|
|
205
|
+
"pwsh.exe",
|
|
206
|
+
"rm",
|
|
207
|
+
"sh",
|
|
208
|
+
"tcsh",
|
|
209
|
+
"zsh",
|
|
210
|
+
]);
|
|
211
|
+
const executable = path.win32.basename(path.basename(command.command)).toLowerCase();
|
|
212
|
+
if (forbiddenCommands.has(executable)) {
|
|
213
|
+
throw new Error(`verification commands[${index}].command is not allowed`);
|
|
214
|
+
}
|
|
215
|
+
const joined = command.args.join(" ").toLowerCase();
|
|
216
|
+
if (/\b(publish|release|deploy|push|merge)\b/.test(joined)) {
|
|
217
|
+
throw new Error(`verification commands[${index}] contains a mutation or publication action`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
function concurrencyValue(value, field) {
|
|
221
|
+
return positiveInteger(value, `autoimplement concurrency.${field}`, AUTOIMPLEMENT_MAX_CONCURRENCY);
|
|
222
|
+
}
|
|
223
|
+
function positiveInteger(value, label, maximum) {
|
|
224
|
+
if (!Number.isSafeInteger(value) || value < 1 || value > maximum) {
|
|
225
|
+
throw new Error(`${label} must be an integer from 1 through ${maximum}`);
|
|
226
|
+
}
|
|
227
|
+
return value;
|
|
228
|
+
}
|
|
229
|
+
function stringArray(value, label) {
|
|
230
|
+
if (!Array.isArray(value) || value.some((item) => typeof item !== "string")) {
|
|
231
|
+
throw new Error(`${label} must be an array of strings`);
|
|
232
|
+
}
|
|
233
|
+
return [...value];
|
|
234
|
+
}
|
|
235
|
+
function requireRecord(value, label) {
|
|
236
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
237
|
+
throw new Error(`${label} must be an object`);
|
|
238
|
+
}
|
|
239
|
+
return value;
|
|
240
|
+
}
|
|
241
|
+
function requireString(value, label) {
|
|
242
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
243
|
+
throw new Error(`${label} must be a non-empty string`);
|
|
244
|
+
}
|
|
245
|
+
return value;
|
|
246
|
+
}
|
|
247
|
+
function optionalString(value, label) {
|
|
248
|
+
if (value === undefined)
|
|
249
|
+
return undefined;
|
|
250
|
+
return requireString(value, label);
|
|
251
|
+
}
|
|
252
|
+
function requireAbsolutePath(value, label) {
|
|
253
|
+
const resolved = requireString(value, label);
|
|
254
|
+
if (!path.isAbsolute(resolved))
|
|
255
|
+
throw new Error(`${label} must be absolute`);
|
|
256
|
+
return path.resolve(resolved);
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=autoimplement-command-batches.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoimplement-command-batches.js","sourceRoot":"","sources":["../../src/builtins/autoimplement-command-batches.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,uBAAuB,EACvB,2BAA2B,GAE5B,MAAM,+BAA+B,CAAC;AAEvC,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,GAAG,MAAM,CAAC;AAC7C,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAG,MAAM,CAAC;AAC9C,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,GAAG,MAAM,CAAC;AACnD,MAAM,CAAC,MAAM,oCAAoC,GAAG,SAAS,CAAC;AAC9D,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC;AA+C/C,MAAM,UAAU,6BAA6B,CAAC,KAAc;IAC1D,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IAC7E,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,2BAA2B,CAAC,CAAC;IAChE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,mBAAmB,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,EAAE,UAAU,CAAC;QAC3D,OAAO,EAAE,gBAAgB,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,EAAE,SAAS,CAAC;QACxD,YAAY,EAAE,gBAAgB,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,cAAc,CAAC;KACxE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACvD,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC;IAC1D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,uBAAuB,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CACb,wDAAwD,uBAAuB,UAAU,CAC1F,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC5D,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,EAAE,4BAA4B,KAAK,GAAG,CAAC,CAAC;QACvE,MAAM,UAAU,GAAG,mBAAmB,CACpC,GAAG,CAAC,UAAU,EACd,4BAA4B,KAAK,cAAc,CAChD,CAAC;QACF,MAAM,EAAE,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QACpC,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,UAAU,EAAE,CAAC,CAAC;QACxF,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACZ,MAAM,qBAAqB,GAAG,cAAc,CAC1C,GAAG,CAAC,qBAAqB,EACzB,4BAA4B,KAAK,yBAAyB,CAC3D,CAAC;QACF,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,uBAAuB,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO;YACL,EAAE;YACF,UAAU;YACV,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,4BAA4B,KAAK,UAAU,CAAC;YAC9E,UAAU,EAAE,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE,4BAA4B,KAAK,cAAc,CAAC;YAC1F,YAAY,EAAE,aAAa,CACzB,GAAG,CAAC,YAAY,EAChB,4BAA4B,KAAK,gBAAgB,CAClD;YACD,EAAE,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,4BAA4B,KAAK,MAAM,CAAC;YAClE,GAAG,CAAC,qBAAqB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1E,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,YAAY,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,UAA+B;IAC7D,OAAO;QACL,EAAE,EAAE,UAAU,CAAC,EAAE;QACjB,OAAO,EAAE,aAAa;QACtB,IAAI,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,UAAU,CAAC;QACvC,GAAG,EAAE,UAAU,CAAC,UAAU;QAC1B,SAAS,EAAE,iBAAiB;QAC5B,cAAc,EAAE,oCAAoC;KACrD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,KAAc;IACzD,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,2BAA2B,CAAC,CAAC;IACjE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACpD,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,EAAE,yBAAyB,KAAK,GAAG,EAAE;YACzE,YAAY,EAAE,uBAAuB;SACtC,CAAC,CAAC;QACH,IAAI,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CACb,gEAAgE,OAAO,CAAC,GAAG,EAAE,CAC9E,CAAC;QACJ,CAAC;QACD,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,2BAA2B,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC5C,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,2BAA2B,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC;IACtF,OAAO;QACL,QAAQ,EAAE,SAAS,CAAC,KAAK;QACzB,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE,uBAAuB,CAAC;KACtE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;IACrD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,uBAAuB,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CACb,8CAA8C,uBAAuB,UAAU,CAChF,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAClD,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,EAAE,cAAc,KAAK,GAAG,CAAC,CAAC;QACzD,MAAM,UAAU,GAAG,mBAAmB,CAAC,GAAG,CAAC,UAAU,EAAE,cAAc,KAAK,cAAc,CAAC,CAAC;QAC1F,MAAM,EAAE,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QACpC,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,UAAU,EAAE,CAAC,CAAC;QAC3E,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACZ,IACE,GAAG,CAAC,KAAK,KAAK,OAAO;YACrB,GAAG,CAAC,KAAK,KAAK,QAAQ;YACtB,GAAG,CAAC,KAAK,KAAK,SAAS;YACvB,GAAG,CAAC,KAAK,KAAK,aAAa,EAC3B,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,cAAc,KAAK,oBAAoB,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,cAAc,KAAK,MAAM,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAuB;YACjC,EAAE;YACF,UAAU;YACV,YAAY,EAAE,aAAa,CAAC,GAAG,CAAC,YAAY,EAAE,cAAc,KAAK,gBAAgB,CAAC;YAClF,EAAE;YACF,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,KAAK,UAAU,CAAC;YAChE,eAAe,EAAE,WAAW,CAC1B,GAAG,CAAC,eAAe,IAAI,EAAE,EACzB,cAAc,KAAK,mBAAmB,CACvC;YACD,iBAAiB,EAAE,WAAW,CAC5B,GAAG,CAAC,iBAAiB,IAAI,EAAE,EAC3B,cAAc,KAAK,qBAAqB,CACzC;SACF,CAAC;QACF,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,CAAC,eAAe,GAAG,cAAc,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC;QAC/D,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC;YACpD,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,aAAa,CAAC;gBACxD,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,OAAO,CAAC;IAChB,OAAO;QACL,KAAK;QACL,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5E,eAAe,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC;QACpE,iBAAiB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC;QACxE,OAAO;KACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,KAAc,EACd,EAAU,EACV,UAAkB,EAClB,EAAU;IAEV,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;IACxD,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC9F,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,EAAE,qBAAqB,EAAE;QAC3D,EAAE;QACF,OAAO,EAAE,IAAI;QACb,GAAG,EAAE,UAAU;QACf,YAAY,EAAE,mBAAmB;KAClC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,MAAM,OAAO,GACX,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;QACxF,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YAChB,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;YAChB,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ;YACpB,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE;YACd,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IAC3B,MAAM,QAAQ,GACZ,IAAI,CAAC,MAAM,KAAK,CAAC;QACjB,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK;QACjB,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO;QACnB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,UAAkB;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAc,EACd,KAAa,EACb,OAKC;IAED,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACxC,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,KAAK,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,UAAU,CAAC,CAAC;IAClF,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,GAAG,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,oBAAoB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,EAAE,CAAC;QAChF,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,mCAAmC,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,mBAAmB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC;IACxE,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;QAC/E,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,uCAAuC,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,KAAK,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7F,MAAM,cAAc,GAAG,eAAe,CACpC,GAAG,CAAC,cAAc,IAAI,oCAAoC,EAC1D,GAAG,KAAK,iBAAiB,EACzB,oCAAoC,CACrC,CAAC;IACF,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAa,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;AAC1F,CAAC;AAED,SAAS,2BAA2B,CAAC,OAAyB,EAAE,KAAa;IAC3E,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;QAChC,KAAK;QACL,MAAM;QACN,KAAK;QACL,SAAS;QACT,KAAK;QACL,MAAM;QACN,MAAM;QACN,IAAI;QACJ,KAAK;QACL,KAAK;QACL,YAAY;QACZ,gBAAgB;QAChB,MAAM;QACN,UAAU;QACV,IAAI;QACJ,IAAI;QACJ,MAAM;QACN,KAAK;KACN,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACrF,IAAI,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,0BAA0B,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD,IAAI,yCAAyC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,6CAA6C,CAAC,CAAC;IAC/F,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc,EAAE,KAAa;IACrD,OAAO,eAAe,CACpB,KAAK,EACL,6BAA6B,KAAK,EAAE,EACpC,6BAA6B,CAC9B,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,KAAc,EAAE,KAAa,EAAE,OAAe;IACrE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAK,KAAgB,GAAG,CAAC,IAAK,KAAgB,GAAG,OAAO,EAAE,CAAC;QACzF,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,sCAAsC,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,KAAe,CAAC;AACzB,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,KAAa;IAChD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,8BAA8B,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAa,CAAC;AAChC,CAAC;AAED,SAAS,aAAa,CAAC,KAAc,EAAE,KAAa;IAClD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,oBAAoB,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,KAAgC,CAAC;AAC1C,CAAC;AAED,SAAS,aAAa,CAAC,KAAc,EAAE,KAAa;IAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,6BAA6B,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,KAAc,EAAE,KAAa;IACnD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,OAAO,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc,EAAE,KAAa;IACxD,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,mBAAmB,CAAC,CAAC;IAC7E,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { WorkflowNodeContext } from "../workflows/types.js";
|
|
2
2
|
import { type AutodocInput } from "./autodoc.workflow.js";
|
|
3
|
+
import { type AutoimplementConcurrency } from "./autoimplement-command-batches.js";
|
|
3
4
|
import { type AutoplanInput } from "./autoplan.workflow.js";
|
|
4
5
|
import { type PlanApprovalInput } from "./plan-approval.workflow.js";
|
|
5
6
|
export type AutoimplementInput = {
|
|
@@ -20,6 +21,7 @@ export type AutoimplementInput = {
|
|
|
20
21
|
audience: string;
|
|
21
22
|
maxReplans: number;
|
|
22
23
|
};
|
|
24
|
+
concurrency?: Partial<AutoimplementConcurrency>;
|
|
23
25
|
};
|
|
24
26
|
export type ExistingPlanDiscovery = {
|
|
25
27
|
route: "found" | "blocked";
|
|
@@ -34,6 +36,19 @@ type ReviewFinding = {
|
|
|
34
36
|
kind: "design" | "implementation";
|
|
35
37
|
summary: string;
|
|
36
38
|
};
|
|
39
|
+
type RepositoryReviewAssessment = {
|
|
40
|
+
id: string;
|
|
41
|
+
repository: string;
|
|
42
|
+
baseBranch: string;
|
|
43
|
+
headRevision: string;
|
|
44
|
+
dependencyFingerprint?: string;
|
|
45
|
+
invocationSucceeded: boolean;
|
|
46
|
+
p0: ReviewFinding[];
|
|
47
|
+
p1: ReviewFinding[];
|
|
48
|
+
p2: ReviewFinding[];
|
|
49
|
+
lower: ReviewFinding[];
|
|
50
|
+
reason: string;
|
|
51
|
+
};
|
|
37
52
|
type ReviewAssessment = {
|
|
38
53
|
route: "critical" | "p2" | "clean" | "command_error";
|
|
39
54
|
invocationSucceeded: boolean;
|
|
@@ -42,6 +57,7 @@ type ReviewAssessment = {
|
|
|
42
57
|
p2: ReviewFinding[];
|
|
43
58
|
lower: ReviewFinding[];
|
|
44
59
|
reason: string;
|
|
60
|
+
repositories?: RepositoryReviewAssessment[];
|
|
45
61
|
};
|
|
46
62
|
export type AutoimplementCompleted = {
|
|
47
63
|
status: "completed";
|
|
@@ -195,16 +211,26 @@ export declare const autoimplementWorkflow: import("../workflows/types.js").Work
|
|
|
195
211
|
readonly adoptPlan: import("../workflows/types.js").ComputeNodeDefinition;
|
|
196
212
|
readonly maybeApproval: import("../workflows/types.js").ComputeNodeDefinition;
|
|
197
213
|
readonly replanGuard: import("../workflows/types.js").ComputeNodeDefinition;
|
|
214
|
+
readonly timeoutFallbackGuard: import("../workflows/types.js").ComputeNodeDefinition;
|
|
215
|
+
readonly timeoutFallback: import("../workflows/types.js").AgentNodeDefinition;
|
|
216
|
+
readonly routeTimeoutFallback: import("../workflows/types.js").ComputeNodeDefinition;
|
|
217
|
+
readonly propagateSupportedFailure: import("../workflows/types.js").ComputeNodeDefinition;
|
|
218
|
+
readonly routeVerifyP2Result: import("../workflows/types.js").ComputeNodeDefinition;
|
|
219
|
+
readonly routeInspectCommentsResult: import("../workflows/types.js").ComputeNodeDefinition;
|
|
220
|
+
readonly routeInspectCiResult: import("../workflows/types.js").ComputeNodeDefinition;
|
|
221
|
+
readonly routeFinalizeDeliveryResult: import("../workflows/types.js").ComputeNodeDefinition;
|
|
198
222
|
readonly implement: import("../workflows/types.js").AgentNodeDefinition;
|
|
199
223
|
readonly classifyImplementation: import("../workflows/types.js").AgentNodeDefinition;
|
|
200
224
|
readonly challengeBlockerGuard: import("../workflows/types.js").ComputeNodeDefinition;
|
|
201
225
|
readonly challengeBlocker: import("../workflows/types.js").AgentNodeDefinition;
|
|
226
|
+
readonly planVerification: import("../workflows/types.js").AgentNodeDefinition;
|
|
227
|
+
readonly runVerification: import("../workflows/types.js").FunctionActionNodeDefinition;
|
|
202
228
|
readonly verify: import("../workflows/types.js").AgentNodeDefinition;
|
|
203
229
|
readonly classifyVerification: import("../workflows/types.js").AgentNodeDefinition;
|
|
204
230
|
readonly fix: import("../workflows/types.js").AgentNodeDefinition;
|
|
205
231
|
readonly publish: import("../workflows/types.js").AgentNodeDefinition;
|
|
206
|
-
readonly
|
|
207
|
-
readonly runReview: import("../workflows/types.js").
|
|
232
|
+
readonly selectReviewCommands: import("../workflows/types.js").ComputeNodeDefinition;
|
|
233
|
+
readonly runReview: import("../workflows/types.js").FunctionActionNodeDefinition;
|
|
208
234
|
readonly repairReviewCommand: import("../workflows/types.js").AgentNodeDefinition;
|
|
209
235
|
readonly assessReview: import("../workflows/types.js").AgentNodeDefinition;
|
|
210
236
|
readonly triageReview: import("../workflows/types.js").ComputeNodeDefinition;
|
|
@@ -212,7 +238,7 @@ export declare const autoimplementWorkflow: import("../workflows/types.js").Work
|
|
|
212
238
|
readonly verifyP2: import("../workflows/types.js").AgentNodeDefinition;
|
|
213
239
|
readonly inspectComments: import("../workflows/types.js").AgentNodeDefinition;
|
|
214
240
|
readonly inspectCi: import("../workflows/types.js").AgentNodeDefinition;
|
|
215
|
-
readonly trackCi: import("../workflows/types.js").
|
|
241
|
+
readonly trackCi: import("../workflows/types.js").FunctionActionNodeDefinition;
|
|
216
242
|
readonly repairCiCommand: import("../workflows/types.js").AgentNodeDefinition;
|
|
217
243
|
readonly assessTrackedCi: import("../workflows/types.js").AgentNodeDefinition;
|
|
218
244
|
readonly opportunisticTest: import("../workflows/types.js").AgentNodeDefinition;
|