@sjawhar/opencode-legion-envoy 3.17.1 → 3.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/server.js +64 -3
- package/package.json +1 -1
package/dist/src/server.js
CHANGED
|
@@ -14363,6 +14363,8 @@ var EnvelopeSchema = exports_external.object({
|
|
|
14363
14363
|
// ../contracts/src/handoff-schema.ts
|
|
14364
14364
|
var HANDOFF_SCHEMA_VERSION = 1;
|
|
14365
14365
|
var HANDOFF_PHASES = ["architect", "plan", "implement", "test", "review"];
|
|
14366
|
+
var PLAN_REVIEW_MAX_ROUNDS = 3;
|
|
14367
|
+
var PLAN_REVIEW_VERDICTS = ["approved", "rejected", "failed"];
|
|
14366
14368
|
var isoTimestamp = exports_external.string().regex(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/);
|
|
14367
14369
|
var handoffPhase = exports_external.enum(HANDOFF_PHASES);
|
|
14368
14370
|
var nonEmpty = exports_external.string().trim().min(1);
|
|
@@ -14399,6 +14401,16 @@ var requiredSkillsSchema = exports_external.object({
|
|
|
14399
14401
|
test: exports_external.array(exports_external.string()).optional(),
|
|
14400
14402
|
review: exports_external.array(exports_external.string()).optional()
|
|
14401
14403
|
}).passthrough().optional();
|
|
14404
|
+
var gapAnalysisSchema = exports_external.object({
|
|
14405
|
+
findings: exports_external.array(exports_external.object({ finding: exports_external.string(), answer: exports_external.string() }).passthrough()).optional(),
|
|
14406
|
+
error: exports_external.string().optional()
|
|
14407
|
+
}).passthrough().optional();
|
|
14408
|
+
var planReviewSchema = exports_external.object({
|
|
14409
|
+
verdict: exports_external.enum(PLAN_REVIEW_VERDICTS),
|
|
14410
|
+
rounds: exports_external.number(),
|
|
14411
|
+
remainingIssues: exports_external.array(exports_external.object({ issue: exports_external.string(), evidence: exports_external.string() }).passthrough()).optional(),
|
|
14412
|
+
error: exports_external.string().optional()
|
|
14413
|
+
}).passthrough().optional();
|
|
14402
14414
|
var planSchema = baseHandoffSchema.extend({
|
|
14403
14415
|
phase: exports_external.literal("plan"),
|
|
14404
14416
|
taskCount: exports_external.number().optional(),
|
|
@@ -14406,7 +14418,9 @@ var planSchema = baseHandoffSchema.extend({
|
|
|
14406
14418
|
routingHints: routingHintsSchema,
|
|
14407
14419
|
concerns: exports_external.array(exports_external.string()).optional(),
|
|
14408
14420
|
workflowRecommendation: exports_external.string().optional(),
|
|
14409
|
-
requiredSkills: requiredSkillsSchema
|
|
14421
|
+
requiredSkills: requiredSkillsSchema,
|
|
14422
|
+
gapAnalysis: gapAnalysisSchema,
|
|
14423
|
+
planReview: planReviewSchema
|
|
14410
14424
|
});
|
|
14411
14425
|
var implementSchema = baseHandoffSchema.extend({
|
|
14412
14426
|
phase: exports_external.literal("implement"),
|
|
@@ -14446,13 +14460,60 @@ var reviewSchema = baseHandoffSchema.extend({
|
|
|
14446
14460
|
verdict: exports_external.enum(["approved", "changes_requested"]).optional(),
|
|
14447
14461
|
keyFindings: exports_external.array(exports_external.object({ severity: exports_external.string(), file: exports_external.string(), description: exports_external.string() }).passthrough()).optional()
|
|
14448
14462
|
});
|
|
14449
|
-
var nonEmptySkillList = exports_external.array(
|
|
14463
|
+
var nonEmptySkillList = exports_external.array(nonEmpty).min(1);
|
|
14464
|
+
var recorded = (shape, whatToRecord) => exports_external.object(shape, {
|
|
14465
|
+
error: (issue2) => issue2.input === undefined ? `missing \u2014 record ${whatToRecord}` : undefined
|
|
14466
|
+
}).passthrough();
|
|
14467
|
+
var gapAnalysisWriteSchema = recorded({
|
|
14468
|
+
findings: exports_external.array(exports_external.object({ finding: nonEmpty, answer: nonEmpty }).passthrough()).optional(),
|
|
14469
|
+
error: nonEmpty.optional()
|
|
14470
|
+
}, "the gap analyst's `findings`, each with how the plan answers it (`[]` when it found none), or its failed call's `error`").refine((analysis) => analysis.findings === undefined !== (analysis.error === undefined), {
|
|
14471
|
+
message: "record exactly one of `findings` or the failed call's `error`"
|
|
14472
|
+
});
|
|
14473
|
+
var planReviewWriteSchema = recorded({
|
|
14474
|
+
verdict: exports_external.enum(PLAN_REVIEW_VERDICTS),
|
|
14475
|
+
rounds: exports_external.number().int().min(1).max(PLAN_REVIEW_MAX_ROUNDS),
|
|
14476
|
+
remainingIssues: exports_external.array(exports_external.object({ issue: nonEmpty, evidence: nonEmpty }).passthrough()).optional(),
|
|
14477
|
+
error: nonEmpty.optional()
|
|
14478
|
+
}, "the plan review's `verdict` and `rounds`, with `remainingIssues` when it was rejected or `error` when a review's call failed").superRefine((review, ctx) => {
|
|
14479
|
+
const remaining = review.remainingIssues?.length ?? 0;
|
|
14480
|
+
if (review.verdict === "rejected" && remaining === 0) {
|
|
14481
|
+
ctx.addIssue({
|
|
14482
|
+
code: "custom",
|
|
14483
|
+
path: ["remainingIssues"],
|
|
14484
|
+
message: "a rejected review records the blocking issues its last round named"
|
|
14485
|
+
});
|
|
14486
|
+
}
|
|
14487
|
+
if (review.verdict === "rejected" && review.rounds < PLAN_REVIEW_MAX_ROUNDS) {
|
|
14488
|
+
ctx.addIssue({
|
|
14489
|
+
code: "custom",
|
|
14490
|
+
path: ["rounds"],
|
|
14491
|
+
message: `a review still rejecting after ${review.rounds} of ${PLAN_REVIEW_MAX_ROUNDS} rounds is revised and reviewed again, not recorded`
|
|
14492
|
+
});
|
|
14493
|
+
}
|
|
14494
|
+
if (review.verdict === "approved" && remaining > 0) {
|
|
14495
|
+
ctx.addIssue({
|
|
14496
|
+
code: "custom",
|
|
14497
|
+
path: ["remainingIssues"],
|
|
14498
|
+
message: "an approved review leaves no blocking issue standing"
|
|
14499
|
+
});
|
|
14500
|
+
}
|
|
14501
|
+
if (review.verdict === "failed" !== (review.error !== undefined)) {
|
|
14502
|
+
ctx.addIssue({
|
|
14503
|
+
code: "custom",
|
|
14504
|
+
path: ["error"],
|
|
14505
|
+
message: "a failed review records its call's error, and only a failed review does"
|
|
14506
|
+
});
|
|
14507
|
+
}
|
|
14508
|
+
});
|
|
14450
14509
|
var planWriteSchema = planSchema.extend({
|
|
14451
14510
|
requiredSkills: exports_external.object({
|
|
14452
14511
|
implement: nonEmptySkillList,
|
|
14453
14512
|
test: nonEmptySkillList,
|
|
14454
14513
|
review: nonEmptySkillList
|
|
14455
|
-
}).passthrough()
|
|
14514
|
+
}).passthrough(),
|
|
14515
|
+
gapAnalysis: gapAnalysisWriteSchema,
|
|
14516
|
+
planReview: planReviewWriteSchema
|
|
14456
14517
|
});
|
|
14457
14518
|
var phaseHandoffSchema = exports_external.discriminatedUnion("phase", [
|
|
14458
14519
|
architectSchema,
|