opencode-swarm 7.162.0 → 7.162.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/background/pr-review-contract.d.ts +1 -24
  2. package/dist/cli/authorization-vstrh7ra.js +23 -0
  3. package/dist/cli/{coder-settlement-s8cskxk7.js → coder-settlement-zrda71k0.js} +9 -9
  4. package/dist/cli/{config-doctor-636h188h.js → config-doctor-gjw4hdvt.js} +2 -2
  5. package/dist/cli/{core-h3hsczyq.js → core-q5j5a7fh.js} +1 -1
  6. package/dist/cli/{curation-policy-ayq5kmnf.js → curation-policy-nv31cr6t.js} +5 -5
  7. package/dist/cli/{curator-llm-factory-g65xmh8f.js → curator-llm-factory-8d6kqsj1.js} +32 -30
  8. package/dist/cli/{curator-p0dwpn2x.js → curator-njskp28b.js} +32 -30
  9. package/dist/cli/{evidence-summary-service-hvbqyb4g.js → evidence-summary-service-5rry81jm.js} +12 -12
  10. package/dist/cli/{gate-evidence-dhgmnsh0.js → gate-evidence-b6k9wng8.js} +5 -5
  11. package/dist/cli/{guardrail-explain-s0dzn8c6.js → guardrail-explain-5yw549sm.js} +33 -31
  12. package/dist/cli/{guardrail-log-qc7rfhv2.js → guardrail-log-nrnx87ac.js} +7 -7
  13. package/dist/cli/{guardrail-reset-cxkf5h0x.js → guardrail-reset-zm5an5bw.js} +32 -30
  14. package/dist/cli/{hive-promoter-ppbrv8m1.js → hive-promoter-zzgnfhxr.js} +32 -30
  15. package/dist/cli/{index-vcv9m2q5.js → index-0myjf1y2.js} +2 -2
  16. package/dist/cli/{index-jw7z3gem.js → index-1eqbnwm6.js} +1 -1
  17. package/dist/cli/{index-q87ht62k.js → index-3b762978.js} +5 -2
  18. package/dist/cli/{index-r7rn6e5f.js → index-3fs3p6ck.js} +5 -5
  19. package/dist/cli/{index-4wmpv2kn.js → index-3gym3fjj.js} +6 -6
  20. package/dist/cli/{index-7z9gyts0.js → index-3nsewz46.js} +1 -1
  21. package/dist/cli/{index-77syzssw.js → index-5a8nk165.js} +4 -4
  22. package/dist/cli/{index-db520vnn.js → index-63s6t3z4.js} +1 -1
  23. package/dist/cli/{index-8vwe2qjh.js → index-7322jr05.js} +8 -8
  24. package/dist/cli/{index-z4n60b0a.js → index-9cvfa8p8.js} +1 -1
  25. package/dist/cli/{index-80pmq6q2.js → index-9m1ze4z4.js} +1 -1
  26. package/dist/cli/{index-qw893zqp.js → index-a1bh2e4f.js} +6 -6
  27. package/dist/cli/{index-6w468bjy.js → index-bgzdwkpe.js} +1 -1
  28. package/dist/cli/{index-tnj464kq.js → index-cjjcey0h.js} +1 -1
  29. package/dist/cli/{index-tjaawnws.js → index-f18bqg18.js} +5 -3
  30. package/dist/cli/{index-9wrmzsnk.js → index-fckfgptr.js} +1 -1
  31. package/dist/cli/{index-3gwkmq53.js → index-gss86tj3.js} +2 -2
  32. package/dist/cli/{index-vkaqrrsc.js → index-gwbxeh8j.js} +14 -643
  33. package/dist/cli/{index-1mbwgw4p.js → index-hq1gdz0g.js} +2 -2
  34. package/dist/cli/{index-0h63swrc.js → index-j1gq4qm8.js} +5 -5
  35. package/dist/cli/{index-mfewnd7j.js → index-m24pv3f4.js} +4 -4
  36. package/dist/cli/{index-5wq0dd30.js → index-m516tpxe.js} +2 -2
  37. package/dist/cli/index-mmngnxev.js +883 -0
  38. package/dist/cli/{index-acnwj4pc.js → index-nbfpnb0w.js} +1 -1
  39. package/dist/cli/{index-kk9yk7an.js → index-rkr19fdv.js} +1 -1
  40. package/dist/cli/{index-1wapt173.js → index-ttdjphep.js} +3 -3
  41. package/dist/cli/{index-ydbd41sv.js → index-v0t8z5ab.js} +1 -1
  42. package/dist/cli/{index-2ze7yqm8.js → index-vcen0ne4.js} +1 -1
  43. package/dist/cli/{index-bdmg6yvj.js → index-w1sfjffe.js} +2 -2
  44. package/dist/cli/index-w7ekntej.js +643 -0
  45. package/dist/cli/{index-pde4zn7j.js → index-wvfgkms6.js} +1 -1
  46. package/dist/cli/{index-25xvw7hq.js → index-xsv6zv7n.js} +34 -32
  47. package/dist/cli/{index-2rhs7j4r.js → index-xtjvg1wx.js} +2149 -2619
  48. package/dist/cli/{index-qn4w0gar.js → index-y3fgbx8g.js} +1 -1
  49. package/dist/cli/{index-sjkxrf06.js → index-z74stz9p.js} +4 -4
  50. package/dist/cli/index.js +32 -30
  51. package/dist/cli/{knowledge-escalator-nyeg4ndw.js → knowledge-escalator-8y3adkn0.js} +11 -11
  52. package/dist/cli/{knowledge-events-z7smbnff.js → knowledge-events-mnexhwe2.js} +9 -9
  53. package/dist/cli/{knowledge-link-0byjmj0w.js → knowledge-link-jr8rqr39.js} +4 -4
  54. package/dist/cli/{knowledge-store-p14t72y5.js → knowledge-store-cp42ccd1.js} +5 -5
  55. package/dist/cli/{knowledge-validator-jg6zhx9s.js → knowledge-validator-hwp1t6x3.js} +7 -7
  56. package/dist/cli/{pending-delegations-0111ywd2.js → pending-delegations-jj5vaq9q.js} +5 -4
  57. package/dist/cli/{pr-subscriptions-4e64sbwg.js → pr-subscriptions-mm6kyyv0.js} +4 -4
  58. package/dist/cli/{runner-rddddxmq.js → runner-d402vnq3.js} +5 -5
  59. package/dist/cli/{scan-cursor-wjad4yd7.js → scan-cursor-d75dh3hv.js} +6 -6
  60. package/dist/cli/{schema-9ebqj7mv.js → schema-djm1bhb8.js} +1 -1
  61. package/dist/cli/{scope-persistence-j5hz4mnd.js → scope-persistence-g0yc6dfa.js} +8 -8
  62. package/dist/cli/{skill-generator-x6b05jz6.js → skill-generator-9ppgxz4j.js} +13 -13
  63. package/dist/cli/{worktree-collision-ownership-g5n5xbqy.js → worktree-collision-ownership-061zmyyp.js} +6 -5
  64. package/dist/cli/{worktree-isolation-ha70bwes.js → worktree-isolation-vk82698z.js} +32 -30
  65. package/dist/hooks/pr-workflow-gate.d.ts +20 -245
  66. package/dist/index.js +374 -374
  67. package/dist/{hooks/pr-review-reentry-authorization.d.ts → pr-review/authorization.d.ts} +32 -10
  68. package/dist/{hooks/pr-review-resilience-circuit.d.ts → pr-review/circuit.d.ts} +60 -3
  69. package/dist/pr-review/completion.d.ts +373 -0
  70. package/dist/pr-review/critic-routing.d.ts +37 -0
  71. package/dist/pr-review/guardrails.d.ts +67 -0
  72. package/dist/pr-review/legacy-transcript-adapter.d.ts +276 -0
  73. package/dist/pr-review/persistence.d.ts +107 -0
  74. package/dist/pr-review/reducer.d.ts +54 -0
  75. package/dist/pr-review/types.d.ts +225 -0
  76. package/package.json +1 -1
  77. package/dist/cli/pr-review-reentry-authorization-b7ceja9y.js +0 -301
@@ -0,0 +1,643 @@
1
+ // @bun
2
+ import {
3
+ exports_external,
4
+ init_zod
5
+ } from "./index-bpmtbmy9.js";
6
+
7
+ // src/background/pr-review-contract.ts
8
+ init_zod();
9
+ import { createHash } from "crypto";
10
+
11
+ // src/pr-review/critic-routing.ts
12
+ function prReviewFindingRequiresCritic(input) {
13
+ if (input.classification !== "CONFIRMED")
14
+ return false;
15
+ const impact = input.risk_impact ?? "UNKNOWN";
16
+ const tags = input.risk_tags ?? [];
17
+ if (impact === "UNKNOWN")
18
+ return true;
19
+ if (input.severity === undefined)
20
+ return true;
21
+ if (input.severity === "CRITICAL" || input.severity === "HIGH")
22
+ return true;
23
+ if (input.severity === "MEDIUM") {
24
+ return impact === "HIGH_IMPACT" || tags.length > 0;
25
+ }
26
+ return false;
27
+ }
28
+
29
+ // src/background/pr-review-contract.ts
30
+ var PR_REVIEW_REVIEWER_CLASSIFICATIONS = [
31
+ "CONFIRMED",
32
+ "DISPROVED",
33
+ "UNVERIFIED",
34
+ "PRE_EXISTING"
35
+ ];
36
+ var PR_REVIEW_REVIEWER_EVIDENCE_TYPES = [
37
+ "STRUCTURALLY_PROVEN",
38
+ "EXECUTION_PROVEN",
39
+ "STATIC_TRACE_PROVEN",
40
+ "PLAUSIBLE_BUT_UNVERIFIED"
41
+ ];
42
+ var PR_REVIEW_SEVERITIES = [
43
+ "CRITICAL",
44
+ "HIGH",
45
+ "MEDIUM",
46
+ "LOW",
47
+ "INFO",
48
+ "NONE"
49
+ ];
50
+ var PR_REVIEW_CRITIC_STATUSES = [
51
+ "UPHELD",
52
+ "DOWNGRADED",
53
+ "DISPROVED",
54
+ "NEEDS_MORE_EVIDENCE"
55
+ ];
56
+ var PR_REVIEW_FINDING_STATUSES = [
57
+ "PENDING",
58
+ "CONFIRMED",
59
+ "DISPROVED",
60
+ "PRE_EXISTING"
61
+ ];
62
+ var PR_REVIEW_FINDING_ACTIONS = [
63
+ "route_to_reviewer",
64
+ "route_to_critic",
65
+ "report",
66
+ "suppress_with_reason",
67
+ "handoff_to_feedback"
68
+ ];
69
+ var PR_REVIEW_ARTIFACT_BOUNDARIES = [
70
+ "post_explorer",
71
+ "post_reviewer",
72
+ "post_critic"
73
+ ];
74
+ var PR_REVIEW_BASE_DIMENSION_IDS = [
75
+ "intent-architecture",
76
+ "correctness-state",
77
+ "tests-falsifiability",
78
+ "security-trust",
79
+ "reliability-performance",
80
+ "compatibility-delivery"
81
+ ];
82
+ var PR_REVIEW_RISK_IMPACTS = [
83
+ "ORDINARY",
84
+ "HIGH_IMPACT",
85
+ "UNKNOWN"
86
+ ];
87
+ var PR_REVIEW_RISK_TAGS = [
88
+ "SECURITY",
89
+ "AUTH_PERMISSIONS",
90
+ "STATE_INTEGRITY",
91
+ "WRITE_PATH",
92
+ "EVIDENCE_INTEGRITY",
93
+ "GIT",
94
+ "CONFIGURATION"
95
+ ];
96
+ var PR_REVIEW_RESULT_LANE_MODES = [
97
+ "swarm-pr-review:base",
98
+ "swarm-pr-review:micro"
99
+ ];
100
+ var PR_REVIEW_RESULT_OUTCOMES = [
101
+ "CLEAN",
102
+ "FINDINGS",
103
+ "INCOMPLETE"
104
+ ];
105
+ var PR_REVIEW_RESULT_FINDING_SEVERITIES = [
106
+ "CRITICAL",
107
+ "HIGH",
108
+ "MEDIUM",
109
+ "LOW",
110
+ "INFO"
111
+ ];
112
+ var PR_REVIEW_RESULT_UNRESOLVED_REASONS = [
113
+ "NOT_EXECUTED",
114
+ "PARTIAL_OUTPUT",
115
+ "CONTRACT_FAILURE",
116
+ "RESOURCE_LIMIT",
117
+ "DEADLINE_EXCEEDED",
118
+ "STALE_BINDING",
119
+ "PARENT_CANCELLED"
120
+ ];
121
+ var MAX_PR_REVIEW_RESULT_OWNED_LANES = 11;
122
+ var MAX_PR_REVIEW_RESULT_FINDINGS = 256;
123
+ var MAX_PR_REVIEW_RESULT_RECEIPT_BYTES = 64 * 1024;
124
+ function prReviewLegacyTranscriptCompatibilityEnabled(value) {
125
+ return value === true;
126
+ }
127
+ var PrReviewResultLaneIdSchema = exports_external.string().trim().min(1).max(120);
128
+ var PrReviewResultChildSessionSchema = exports_external.string().trim().min(1).max(256);
129
+ var PrReviewResultShaSchema = exports_external.string().trim().regex(/^[0-9a-f]{6,64}$/i);
130
+ var PrReviewResultDigestSchema = exports_external.string().trim().regex(/^[0-9a-f]{64}$/i);
131
+ function addDuplicateIssue(ctx, path, label, value) {
132
+ ctx.addIssue({
133
+ code: exports_external.ZodIssueCode.custom,
134
+ path,
135
+ message: `${label} must not contain duplicate value "${value}"`
136
+ });
137
+ }
138
+ function assertUniqueStrings(values, ctx, path, label) {
139
+ const seen = new Set;
140
+ for (const value of values) {
141
+ if (seen.has(value)) {
142
+ addDuplicateIssue(ctx, path, label, value);
143
+ return;
144
+ }
145
+ seen.add(value);
146
+ }
147
+ }
148
+ var PrReviewResultLocationSchema = exports_external.discriminatedUnion("kind", [
149
+ exports_external.object({
150
+ kind: exports_external.literal("local"),
151
+ file: exports_external.string().trim().min(1).max(4096),
152
+ line: exports_external.number().int().positive().max(1e6).optional(),
153
+ endLine: exports_external.number().int().positive().max(1e6).optional(),
154
+ column: exports_external.number().int().positive().max(1e4).optional(),
155
+ endColumn: exports_external.number().int().positive().max(1e4).optional()
156
+ }).strict().superRefine((value, ctx) => {
157
+ if (value.endLine !== undefined && value.line !== undefined && value.endLine < value.line) {
158
+ ctx.addIssue({
159
+ code: exports_external.ZodIssueCode.custom,
160
+ path: ["endLine"],
161
+ message: "endLine must be greater than or equal to line"
162
+ });
163
+ }
164
+ if (value.endColumn !== undefined && value.column !== undefined && value.endColumn < value.column) {
165
+ ctx.addIssue({
166
+ code: exports_external.ZodIssueCode.custom,
167
+ path: ["endColumn"],
168
+ message: "endColumn must be greater than or equal to column"
169
+ });
170
+ }
171
+ }),
172
+ exports_external.object({
173
+ kind: exports_external.literal("non_local"),
174
+ label: exports_external.string().trim().min(1).max(200),
175
+ detail: exports_external.string().trim().min(1).max(2000)
176
+ }).strict()
177
+ ]);
178
+ var PrReviewResultFindingSchema = exports_external.object({
179
+ id: exports_external.string().trim().min(1).max(128),
180
+ workflowLane: PrReviewResultLaneIdSchema,
181
+ severity: exports_external.enum(PR_REVIEW_RESULT_FINDING_SEVERITIES),
182
+ riskImpact: exports_external.enum(PR_REVIEW_RISK_IMPACTS),
183
+ riskTags: exports_external.array(exports_external.enum(PR_REVIEW_RISK_TAGS)).max(PR_REVIEW_RISK_TAGS.length),
184
+ title: exports_external.string().trim().min(1).max(200),
185
+ body: exports_external.string().trim().min(1).max(4000),
186
+ evidence: exports_external.string().trim().min(1).max(4000),
187
+ location: PrReviewResultLocationSchema
188
+ }).strict().superRefine((value, ctx) => {
189
+ assertUniqueStrings(value.riskTags, ctx, ["riskTags"], "riskTags");
190
+ });
191
+ var PrReviewCleanAttestationSchema = exports_external.object({
192
+ workflowLane: PrReviewResultLaneIdSchema,
193
+ coverageScope: exports_external.string().trim().min(12).max(2000),
194
+ evidence: exports_external.string().trim().min(20).max(4000)
195
+ }).strict();
196
+ var PrReviewUnresolvedLaneSchema = exports_external.object({
197
+ workflowLane: PrReviewResultLaneIdSchema,
198
+ reason: exports_external.enum(PR_REVIEW_RESULT_UNRESOLVED_REASONS),
199
+ detail: exports_external.string().trim().min(1).max(4000)
200
+ }).strict();
201
+ var PrReviewLaneResultEnvelopeSchema = exports_external.object({
202
+ schemaVersion: exports_external.literal(1),
203
+ outcome: exports_external.enum(PR_REVIEW_RESULT_OUTCOMES),
204
+ creditedLanes: exports_external.array(PrReviewResultLaneIdSchema).max(MAX_PR_REVIEW_RESULT_OWNED_LANES),
205
+ findings: exports_external.array(PrReviewResultFindingSchema).max(MAX_PR_REVIEW_RESULT_FINDINGS),
206
+ cleanAttestations: exports_external.array(PrReviewCleanAttestationSchema).max(MAX_PR_REVIEW_RESULT_OWNED_LANES),
207
+ unresolved: exports_external.array(PrReviewUnresolvedLaneSchema).max(MAX_PR_REVIEW_RESULT_OWNED_LANES)
208
+ }).strict().superRefine((value, ctx) => {
209
+ assertUniqueStrings(value.creditedLanes, ctx, ["creditedLanes"], "creditedLanes");
210
+ const findingIds = value.findings.map((finding) => finding.id);
211
+ assertUniqueStrings(findingIds, ctx, ["findings"], "findings");
212
+ const findingLanes = value.findings.map((finding) => finding.workflowLane);
213
+ assertUniqueStrings(value.cleanAttestations.map((entry) => entry.workflowLane), ctx, ["cleanAttestations"], "cleanAttestations");
214
+ assertUniqueStrings(value.unresolved.map((entry) => entry.workflowLane), ctx, ["unresolved"], "unresolved");
215
+ for (const lane of findingLanes) {
216
+ if (value.cleanAttestations.some((entry) => entry.workflowLane === lane)) {
217
+ ctx.addIssue({
218
+ code: exports_external.ZodIssueCode.custom,
219
+ path: ["findings"],
220
+ message: `workflow lane "${lane}" cannot be both CLEAN and FINDINGS`
221
+ });
222
+ return;
223
+ }
224
+ }
225
+ const coveredLanes = new Set([
226
+ ...findingLanes,
227
+ ...value.cleanAttestations.map((entry) => entry.workflowLane)
228
+ ]);
229
+ for (const lane of value.creditedLanes) {
230
+ if (!coveredLanes.has(lane)) {
231
+ ctx.addIssue({
232
+ code: exports_external.ZodIssueCode.custom,
233
+ path: ["creditedLanes"],
234
+ message: `credited workflow lane "${lane}" must be backed by a finding or CLEAN attestation`
235
+ });
236
+ return;
237
+ }
238
+ }
239
+ for (const lane of coveredLanes) {
240
+ if (!value.creditedLanes.includes(lane)) {
241
+ ctx.addIssue({
242
+ code: exports_external.ZodIssueCode.custom,
243
+ path: ["creditedLanes"],
244
+ message: `covered workflow lane "${lane}" must appear in creditedLanes`
245
+ });
246
+ return;
247
+ }
248
+ }
249
+ for (const lane of value.unresolved.map((entry) => entry.workflowLane)) {
250
+ if (coveredLanes.has(lane)) {
251
+ ctx.addIssue({
252
+ code: exports_external.ZodIssueCode.custom,
253
+ path: ["unresolved"],
254
+ message: `workflow lane "${lane}" cannot be both credited and unresolved`
255
+ });
256
+ return;
257
+ }
258
+ }
259
+ const totalCovered = value.creditedLanes.length + value.unresolved.length;
260
+ if (totalCovered === 0) {
261
+ ctx.addIssue({
262
+ code: exports_external.ZodIssueCode.custom,
263
+ path: ["creditedLanes"],
264
+ message: "result envelope must cover at least one workflow lane"
265
+ });
266
+ return;
267
+ }
268
+ if (value.outcome === "CLEAN") {
269
+ if (value.findings.length > 0 || value.unresolved.length > 0) {
270
+ ctx.addIssue({
271
+ code: exports_external.ZodIssueCode.custom,
272
+ path: ["outcome"],
273
+ message: "CLEAN outcome cannot include findings or unresolved lanes"
274
+ });
275
+ }
276
+ if (value.cleanAttestations.length !== value.creditedLanes.length) {
277
+ ctx.addIssue({
278
+ code: exports_external.ZodIssueCode.custom,
279
+ path: ["cleanAttestations"],
280
+ message: "CLEAN outcome must attest every credited workflow lane exactly once"
281
+ });
282
+ }
283
+ }
284
+ if (value.outcome === "FINDINGS") {
285
+ if (value.findings.length === 0) {
286
+ ctx.addIssue({
287
+ code: exports_external.ZodIssueCode.custom,
288
+ path: ["findings"],
289
+ message: "FINDINGS outcome requires at least one finding"
290
+ });
291
+ }
292
+ if (value.unresolved.length > 0) {
293
+ ctx.addIssue({
294
+ code: exports_external.ZodIssueCode.custom,
295
+ path: ["unresolved"],
296
+ message: "FINDINGS outcome cannot include unresolved lanes"
297
+ });
298
+ }
299
+ }
300
+ if (value.outcome === "INCOMPLETE" && value.unresolved.length === 0) {
301
+ ctx.addIssue({
302
+ code: exports_external.ZodIssueCode.custom,
303
+ path: ["unresolved"],
304
+ message: "INCOMPLETE outcome requires at least one unresolved lane"
305
+ });
306
+ }
307
+ });
308
+ function serializedPrReviewResultReceiptBytes(value) {
309
+ return new TextEncoder().encode(JSON.stringify(value)).byteLength;
310
+ }
311
+ function prReviewLaneResultEnvelopeDigest(value) {
312
+ return createHash("sha256").update(JSON.stringify(value)).digest("hex");
313
+ }
314
+ var PrReviewResultReceiptSchema = exports_external.object({
315
+ schemaVersion: exports_external.literal(1),
316
+ mode: exports_external.enum(PR_REVIEW_RESULT_LANE_MODES),
317
+ workflowInstanceId: exports_external.string().trim().min(1).max(256),
318
+ workflowRevision: exports_external.number().int().nonnegative(),
319
+ batchId: exports_external.string().trim().min(1).max(120),
320
+ laneId: exports_external.string().trim().min(1).max(120),
321
+ workflowLane: PrReviewResultLaneIdSchema,
322
+ ownedWorkflowLanes: exports_external.array(PrReviewResultLaneIdSchema).min(1).max(MAX_PR_REVIEW_RESULT_OWNED_LANES),
323
+ baseSha: PrReviewResultShaSchema,
324
+ headSha: PrReviewResultShaSchema,
325
+ dispatchRevisionDigest: PrReviewResultDigestSchema,
326
+ childSessionId: PrReviewResultChildSessionSchema,
327
+ generation: exports_external.number().int().positive().max(1e6),
328
+ semanticEnvelopeDigest: PrReviewResultDigestSchema,
329
+ envelope: PrReviewLaneResultEnvelopeSchema
330
+ }).strict().superRefine((value, ctx) => {
331
+ assertUniqueStrings(value.ownedWorkflowLanes, ctx, ["ownedWorkflowLanes"], "ownedWorkflowLanes");
332
+ if (!value.ownedWorkflowLanes.includes(value.workflowLane)) {
333
+ ctx.addIssue({
334
+ code: exports_external.ZodIssueCode.custom,
335
+ path: ["workflowLane"],
336
+ message: "workflowLane must be included in ownedWorkflowLanes"
337
+ });
338
+ }
339
+ const covered = new Set([
340
+ ...value.envelope.creditedLanes,
341
+ ...value.envelope.unresolved.map((entry) => entry.workflowLane)
342
+ ]);
343
+ if (covered.size !== value.ownedWorkflowLanes.length) {
344
+ ctx.addIssue({
345
+ code: exports_external.ZodIssueCode.custom,
346
+ path: ["envelope"],
347
+ message: "envelope credited and unresolved workflow lanes must exactly partition ownedWorkflowLanes"
348
+ });
349
+ return;
350
+ }
351
+ for (const lane of value.ownedWorkflowLanes) {
352
+ if (!covered.has(lane)) {
353
+ ctx.addIssue({
354
+ code: exports_external.ZodIssueCode.custom,
355
+ path: ["ownedWorkflowLanes"],
356
+ message: `owned workflow lane "${lane}" is missing from the envelope coverage`
357
+ });
358
+ return;
359
+ }
360
+ }
361
+ const expectedDigest = prReviewLaneResultEnvelopeDigest(value.envelope);
362
+ if (value.semanticEnvelopeDigest !== expectedDigest) {
363
+ ctx.addIssue({
364
+ code: exports_external.ZodIssueCode.custom,
365
+ path: ["semanticEnvelopeDigest"],
366
+ message: "semanticEnvelopeDigest must match the canonical envelope digest"
367
+ });
368
+ }
369
+ const bytes = serializedPrReviewResultReceiptBytes(value);
370
+ if (bytes > MAX_PR_REVIEW_RESULT_RECEIPT_BYTES) {
371
+ ctx.addIssue({
372
+ code: exports_external.ZodIssueCode.custom,
373
+ path: [],
374
+ message: `receipt exceeds the ${MAX_PR_REVIEW_RESULT_RECEIPT_BYTES}-byte bound`
375
+ });
376
+ }
377
+ });
378
+ var PR_REVIEW_FINDINGS_MAX_BYTES = 10 * 1024 * 1024;
379
+ var PR_REVIEW_FINDINGS_WRITE_MAX_BYTES = 3 * 1024 * 1024;
380
+ var PR_REVIEW_HANDOFF_MAX_BYTES = 128 * 1024;
381
+ var PR_REVIEW_HANDOFF_WRITE_MAX_BYTES = 120 * 1024;
382
+ var PR_REVIEW_DISCARDED_EXAMPLE_ITEM_ID = "discarded-id";
383
+ function serializedPrReviewArtifactInputBytes(value) {
384
+ return new TextEncoder().encode(JSON.stringify(value)).byteLength;
385
+ }
386
+ var PrReviewRunIdSchema = exports_external.string().regex(/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/, "run_id must be a safe relative identifier");
387
+ var PrReviewFindingSchema = exports_external.object({
388
+ finding_id: exports_external.string().trim().min(1).max(128),
389
+ status: exports_external.enum(PR_REVIEW_FINDING_STATUSES),
390
+ file_line: exports_external.string().trim().min(1).max(1000),
391
+ evidence: exports_external.string().trim().min(1).max(20000),
392
+ next_action: exports_external.enum(PR_REVIEW_FINDING_ACTIONS),
393
+ severity: exports_external.enum(PR_REVIEW_SEVERITIES).optional(),
394
+ category: exports_external.string().trim().min(1).max(128).optional(),
395
+ risk_impact: exports_external.enum(PR_REVIEW_RISK_IMPACTS).optional(),
396
+ risk_tags: exports_external.array(exports_external.enum(PR_REVIEW_RISK_TAGS)).max(PR_REVIEW_RISK_TAGS.length).optional()
397
+ }).strict().superRefine((value, ctx) => {
398
+ if (value.status !== "CONFIRMED")
399
+ return;
400
+ if (value.risk_impact === undefined) {
401
+ ctx.addIssue({
402
+ code: "custom",
403
+ path: ["risk_impact"],
404
+ message: "is required on every newly written CONFIRMED finding (issue #2383 typed critic routing)"
405
+ });
406
+ }
407
+ if (value.risk_tags === undefined) {
408
+ ctx.addIssue({
409
+ code: "custom",
410
+ path: ["risk_tags"],
411
+ message: "is required on every newly written CONFIRMED finding (issue #2383 typed critic routing)"
412
+ });
413
+ }
414
+ });
415
+ var PrReviewHandoffSchema = exports_external.object({
416
+ pr_url: exports_external.string().url().max(2000),
417
+ finding_ids: exports_external.array(exports_external.string().trim().min(1).max(128)).min(1).max(1000),
418
+ summary: exports_external.string().trim().min(1).max(20000),
419
+ provenance: exports_external.array(exports_external.string().trim().min(1).max(4000)).min(1).max(1000)
420
+ }).strict();
421
+ var PrReviewPartialBaseCoverageSchema = exports_external.object({
422
+ unresolved_dimensions: exports_external.array(exports_external.enum(PR_REVIEW_BASE_DIMENSION_IDS)).min(1).max(PR_REVIEW_BASE_DIMENSION_IDS.length)
423
+ }).strict().superRefine((value, ctx) => {
424
+ const seen = new Set;
425
+ for (const dimension of value.unresolved_dimensions) {
426
+ if (seen.has(dimension)) {
427
+ ctx.addIssue({
428
+ code: "custom",
429
+ path: ["unresolved_dimensions"],
430
+ message: `must not contain duplicate dimension "${dimension}"`
431
+ });
432
+ return;
433
+ }
434
+ seen.add(dimension);
435
+ }
436
+ });
437
+ var WritePrReviewArtifactArgsSchema = exports_external.discriminatedUnion("kind", [
438
+ exports_external.object({
439
+ kind: exports_external.literal("findings"),
440
+ run_id: PrReviewRunIdSchema.optional(),
441
+ pr_head_sha: exports_external.string().trim().regex(/^[0-9a-f]{6,64}$/i),
442
+ boundary: exports_external.enum(PR_REVIEW_ARTIFACT_BOUNDARIES),
443
+ records: exports_external.array(PrReviewFindingSchema).min(1).max(1000),
444
+ partial_base_coverage: PrReviewPartialBaseCoverageSchema.optional()
445
+ }).strict(),
446
+ exports_external.object({
447
+ kind: exports_external.literal("handoff"),
448
+ run_id: PrReviewRunIdSchema.optional(),
449
+ pr_head_sha: exports_external.string().trim().regex(/^[0-9a-f]{6,64}$/i),
450
+ handoff: PrReviewHandoffSchema
451
+ }).strict()
452
+ ]).superRefine((value, ctx) => {
453
+ if (value.kind === "findings" && value.partial_base_coverage !== undefined && value.boundary !== "post_explorer") {
454
+ ctx.addIssue({
455
+ code: "custom",
456
+ path: ["partial_base_coverage"],
457
+ message: "is valid only for the post_explorer boundary"
458
+ });
459
+ }
460
+ const bytes = serializedPrReviewArtifactInputBytes(value);
461
+ const maxBytes = value.kind === "findings" ? PR_REVIEW_FINDINGS_WRITE_MAX_BYTES : PR_REVIEW_HANDOFF_WRITE_MAX_BYTES;
462
+ if (bytes > maxBytes) {
463
+ ctx.addIssue({
464
+ code: "custom",
465
+ path: [value.kind === "findings" ? "records" : "handoff"],
466
+ message: `serialized UTF-8 payload must be at most ${maxBytes} bytes (got ${bytes})`
467
+ });
468
+ }
469
+ });
470
+ var introducedByPrSchema = exports_external.string().regex(/^(?:introduced_by_pr\s*:\s*)?(?:YES|NO|UNKNOWN)$/i);
471
+ var PrReviewRiskTagsFieldPattern = new RegExp(`^(?:(?:${PR_REVIEW_RISK_TAGS.join("|")})(?:,(?:${PR_REVIEW_RISK_TAGS.join("|")}))*)?$`);
472
+ var PrReviewRiskTagsFieldSchema = exports_external.string().regex(PrReviewRiskTagsFieldPattern, `must be a comma-separated subset of the canonical risk tags (${PR_REVIEW_RISK_TAGS.join(", ")}), or empty`);
473
+ var PR_REVIEW_REVIEWER_LEGACY_FIELD_COUNT = 10;
474
+ function parsePrReviewRiskTagsField(field) {
475
+ const trimmed = field.trim();
476
+ if (!trimmed)
477
+ return [];
478
+ return trimmed.split(",").map((tag) => tag.trim());
479
+ }
480
+ var PrReviewReviewerVerdictFieldsSchema = exports_external.tuple([
481
+ exports_external.literal("[REVIEWED]"),
482
+ exports_external.string().min(1),
483
+ exports_external.enum(PR_REVIEW_REVIEWER_CLASSIFICATIONS),
484
+ exports_external.enum(PR_REVIEW_REVIEWER_EVIDENCE_TYPES),
485
+ exports_external.enum(PR_REVIEW_SEVERITIES),
486
+ introducedByPrSchema,
487
+ exports_external.string().min(1),
488
+ exports_external.string().min(8),
489
+ exports_external.string().min(5),
490
+ exports_external.string().min(3),
491
+ exports_external.enum(PR_REVIEW_RISK_IMPACTS),
492
+ PrReviewRiskTagsFieldSchema
493
+ ]).superRefine((fields, ctx) => {
494
+ if (fields[2] === "DISPROVED" && fields[4] !== "NONE") {
495
+ ctx.addIssue({
496
+ code: "custom",
497
+ path: [4],
498
+ message: "DISPROVED reviewer severity must be NONE"
499
+ });
500
+ }
501
+ });
502
+ var PrReviewCriticVerdictFieldsSchema = exports_external.tuple([
503
+ exports_external.literal("[CRITIC]"),
504
+ exports_external.string().min(1),
505
+ exports_external.enum(PR_REVIEW_CRITIC_STATUSES),
506
+ exports_external.enum(PR_REVIEW_SEVERITIES),
507
+ exports_external.string().min(6),
508
+ exports_external.string().min(6)
509
+ ]).superRefine((fields, ctx) => {
510
+ const status = fields[2];
511
+ const severity = fields[3];
512
+ if (status === "NEEDS_MORE_EVIDENCE") {
513
+ ctx.addIssue({
514
+ code: "custom",
515
+ path: [2],
516
+ message: "NEEDS_MORE_EVIDENCE is not a terminal transport verdict"
517
+ });
518
+ }
519
+ if (status === "DISPROVED" && severity !== "NONE") {
520
+ ctx.addIssue({
521
+ code: "custom",
522
+ path: [3],
523
+ message: "DISPROVED critic severity must be NONE"
524
+ });
525
+ }
526
+ if (status === "UPHELD" && !["CRITICAL", "HIGH", "MEDIUM"].includes(severity)) {
527
+ ctx.addIssue({
528
+ code: "custom",
529
+ path: [3],
530
+ message: "UPHELD critic severity must be CRITICAL, HIGH, or MEDIUM"
531
+ });
532
+ }
533
+ if (status === "DOWNGRADED" && severity === "CRITICAL") {
534
+ ctx.addIssue({
535
+ code: "custom",
536
+ path: [3],
537
+ message: "DOWNGRADED critic severity cannot be CRITICAL"
538
+ });
539
+ }
540
+ });
541
+ var PR_REVIEW_VERDICT_ROW_DESCRIPTORS = {
542
+ reviewer: {
543
+ marker: "[REVIEWED]",
544
+ fieldCount: 12,
545
+ fieldRoles: [
546
+ "marker",
547
+ "item_id",
548
+ "classification",
549
+ "evidence_type",
550
+ "severity",
551
+ "introduced_by_pr",
552
+ "file:line",
553
+ "rationale",
554
+ "probe",
555
+ "reviewer_notes",
556
+ "risk_impact",
557
+ "risk_tags"
558
+ ],
559
+ schema: PrReviewReviewerVerdictFieldsSchema
560
+ },
561
+ critic: {
562
+ marker: "[CRITIC]",
563
+ fieldCount: 6,
564
+ fieldRoles: [
565
+ "marker",
566
+ "item_id",
567
+ "status",
568
+ "severity",
569
+ "rationale",
570
+ "required_change"
571
+ ],
572
+ schema: PrReviewCriticVerdictFieldsSchema
573
+ }
574
+ };
575
+ function parsePrReviewVerdictRow(line, kind) {
576
+ const descriptor = PR_REVIEW_VERDICT_ROW_DESCRIPTORS[kind];
577
+ const fields = [];
578
+ let current = "";
579
+ let usedCanonicalEscape = false;
580
+ for (let index = 0;index < line.length; index++) {
581
+ const char = line[index];
582
+ if (char === "\\") {
583
+ const next = line[index + 1];
584
+ if (next === "\\") {
585
+ current += "\\";
586
+ usedCanonicalEscape = true;
587
+ index++;
588
+ continue;
589
+ }
590
+ if (next === "|") {
591
+ current += "|";
592
+ usedCanonicalEscape = true;
593
+ index++;
594
+ continue;
595
+ }
596
+ if (next === "n") {
597
+ current += `
598
+ `;
599
+ usedCanonicalEscape = true;
600
+ index++;
601
+ continue;
602
+ }
603
+ if (next === "r") {
604
+ current += "\r";
605
+ usedCanonicalEscape = true;
606
+ index++;
607
+ continue;
608
+ }
609
+ current += "\\";
610
+ continue;
611
+ }
612
+ if (char === "|") {
613
+ fields.push(current.trim());
614
+ current = "";
615
+ continue;
616
+ }
617
+ current += char;
618
+ }
619
+ fields.push(current.trim());
620
+ if (fields[0] !== descriptor.marker)
621
+ return null;
622
+ if (kind === "reviewer" && fields.length === PR_REVIEW_REVIEWER_LEGACY_FIELD_COUNT) {
623
+ fields.push("UNKNOWN", "");
624
+ }
625
+ if (fields.length > descriptor.fieldCount) {
626
+ const retained = fields.slice(0, descriptor.fieldCount - 1);
627
+ retained.push(fields.slice(descriptor.fieldCount - 1).join("|"));
628
+ return {
629
+ marker: descriptor.marker,
630
+ fields: retained,
631
+ recoveredOverflow: true,
632
+ overflowClass: fields.length === descriptor.fieldCount + 1 && fields[fields.length - 1] === "" ? "legacy-fidelity-safe" : "legacy-lossy"
633
+ };
634
+ }
635
+ return {
636
+ marker: descriptor.marker,
637
+ fields,
638
+ recoveredOverflow: false,
639
+ overflowClass: fields.length === descriptor.fieldCount ? usedCanonicalEscape ? "canonical" : "legacy-fidelity-safe" : "legacy-lossy"
640
+ };
641
+ }
642
+
643
+ export { prReviewFindingRequiresCritic, PR_REVIEW_BASE_DIMENSION_IDS, PR_REVIEW_RISK_IMPACTS, PR_REVIEW_RISK_TAGS, prReviewLegacyTranscriptCompatibilityEnabled, PrReviewResultReceiptSchema, PR_REVIEW_FINDINGS_MAX_BYTES, PR_REVIEW_HANDOFF_MAX_BYTES, PR_REVIEW_DISCARDED_EXAMPLE_ITEM_ID, PrReviewRunIdSchema, parsePrReviewRiskTagsField, PrReviewReviewerVerdictFieldsSchema, PrReviewCriticVerdictFieldsSchema, parsePrReviewVerdictRow };
@@ -4,7 +4,7 @@ import {
4
4
  PlanSchema,
5
5
  TaskStatusSchema,
6
6
  init_loader
7
- } from "./index-tnj464kq.js";
7
+ } from "./index-cjjcey0h.js";
8
8
  import {
9
9
  assertProjectRoot,
10
10
  withEvidenceLock