@claudexor/schema 3.1.2 → 3.3.7-rc.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/agent-capabilities.d.ts +157 -129
- package/dist/agent-capabilities.d.ts.map +1 -1
- package/dist/agent-capabilities.js +3 -1
- package/dist/agent-capabilities.js.map +1 -1
- package/dist/apply-eligibility.d.ts +472 -273
- package/dist/apply-eligibility.d.ts.map +1 -1
- package/dist/apply-eligibility.js +25 -1
- package/dist/apply-eligibility.js.map +1 -1
- package/dist/attachment.d.ts +17 -17
- package/dist/attachment.d.ts.map +1 -1
- package/dist/attachment.js +1 -1
- package/dist/attachment.js.map +1 -1
- package/dist/auth.d.ts +475 -475
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +1 -1
- package/dist/auth.js.map +1 -1
- package/dist/budget.d.ts +59 -59
- package/dist/budget.d.ts.map +1 -1
- package/dist/budget.js +1 -1
- package/dist/budget.js.map +1 -1
- package/dist/config.d.ts +320 -316
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +26 -19
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +38 -38
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +1 -1
- package/dist/context.js.map +1 -1
- package/dist/control-auth-route.d.ts +46 -0
- package/dist/control-auth-route.d.ts.map +1 -0
- package/dist/control-auth-route.js +24 -0
- package/dist/control-auth-route.js.map +1 -0
- package/dist/control-gc.d.ts +15 -15
- package/dist/control-gc.d.ts.map +1 -1
- package/dist/control-gc.js +1 -1
- package/dist/control-gc.js.map +1 -1
- package/dist/control-harness-list.d.ts +896 -0
- package/dist/control-harness-list.d.ts.map +1 -0
- package/dist/control-harness-list.js +13 -0
- package/dist/control-harness-list.js.map +1 -0
- package/dist/control-operation-responses.d.ts +644 -629
- package/dist/control-operation-responses.d.ts.map +1 -1
- package/dist/control-operation-responses.js +5 -1
- package/dist/control-operation-responses.js.map +1 -1
- package/dist/control-run-detail.d.ts +2229 -1569
- package/dist/control-run-detail.d.ts.map +1 -1
- package/dist/control-run-detail.js +46 -2
- package/dist/control-run-detail.js.map +1 -1
- package/dist/control-run-failure.d.ts +57 -0
- package/dist/control-run-failure.d.ts.map +1 -0
- package/dist/control-run-failure.js +89 -0
- package/dist/control-run-failure.js.map +1 -0
- package/dist/control-run-retry.d.ts +16 -16
- package/dist/control-run-retry.d.ts.map +1 -1
- package/dist/control-run-retry.js +1 -1
- package/dist/control-run-retry.js.map +1 -1
- package/dist/control-run-scope.d.ts +19 -2
- package/dist/control-run-scope.d.ts.map +1 -1
- package/dist/control-run-scope.js +22 -1
- package/dist/control-run-scope.js.map +1 -1
- package/dist/control-secret.d.ts +7 -7
- package/dist/control-secret.d.ts.map +1 -1
- package/dist/control-secret.js +1 -1
- package/dist/control-secret.js.map +1 -1
- package/dist/control-thread-apply.d.ts +65 -65
- package/dist/control-thread-apply.d.ts.map +1 -1
- package/dist/control-thread-apply.js +1 -1
- package/dist/control-thread-apply.js.map +1 -1
- package/dist/control-trust.d.ts +23 -23
- package/dist/control-trust.d.ts.map +1 -1
- package/dist/control-trust.js +1 -1
- package/dist/control-trust.js.map +1 -1
- package/dist/control.d.ts +1551 -2385
- package/dist/control.d.ts.map +1 -1
- package/dist/control.js +29 -107
- package/dist/control.js.map +1 -1
- package/dist/credential-profile-snapshot.d.ts +3206 -0
- package/dist/credential-profile-snapshot.d.ts.map +1 -0
- package/dist/credential-profile-snapshot.js +28 -0
- package/dist/credential-profile-snapshot.js.map +1 -0
- package/dist/credential-profile.d.ts +170 -107
- package/dist/credential-profile.d.ts.map +1 -1
- package/dist/credential-profile.js +24 -7
- package/dist/credential-profile.js.map +1 -1
- package/dist/decision.d.ts +121 -121
- package/dist/decision.d.ts.map +1 -1
- package/dist/decision.js +2 -1
- package/dist/decision.js.map +1 -1
- package/dist/deep-scan.d.ts +5 -5
- package/dist/deep-scan.d.ts.map +1 -1
- package/dist/deep-scan.js +1 -1
- package/dist/deep-scan.js.map +1 -1
- package/dist/delegation.d.ts +13 -13
- package/dist/delegation.d.ts.map +1 -1
- package/dist/delegation.js +1 -1
- package/dist/delegation.js.map +1 -1
- package/dist/delivery.d.ts +32 -32
- package/dist/delivery.d.ts.map +1 -1
- package/dist/delivery.js +1 -1
- package/dist/delivery.js.map +1 -1
- package/dist/effort.d.ts +1 -1
- package/dist/effort.d.ts.map +1 -1
- package/dist/effort.js +1 -1
- package/dist/effort.js.map +1 -1
- package/dist/events.d.ts +55 -35
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +20 -1
- package/dist/events.js.map +1 -1
- package/dist/gate.d.ts +7 -7
- package/dist/gate.d.ts.map +1 -1
- package/dist/gate.js +1 -1
- package/dist/gate.js.map +1 -1
- package/dist/git-capability.d.ts +23 -0
- package/dist/git-capability.d.ts.map +1 -0
- package/dist/git-capability.js +15 -0
- package/dist/git-capability.js.map +1 -0
- package/dist/harness-confinement.d.ts +64 -0
- package/dist/harness-confinement.d.ts.map +1 -0
- package/dist/harness-confinement.js +64 -0
- package/dist/harness-confinement.js.map +1 -0
- package/dist/harness.d.ts +428 -408
- package/dist/harness.d.ts.map +1 -1
- package/dist/harness.js +15 -26
- package/dist/harness.js.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/interaction.d.ts +10 -0
- package/dist/interaction.d.ts.map +1 -0
- package/dist/interaction.js +2 -0
- package/dist/interaction.js.map +1 -0
- package/dist/operation.d.ts +113 -113
- package/dist/operation.d.ts.map +1 -1
- package/dist/operation.js +1 -1
- package/dist/operation.js.map +1 -1
- package/dist/output-schema-dialect.d.ts +1 -1
- package/dist/output-schema-dialect.d.ts.map +1 -1
- package/dist/output-schema-dialect.js +1 -1
- package/dist/output-schema-dialect.js.map +1 -1
- package/dist/output-schema.d.ts +2 -2
- package/dist/output-schema.js +2 -2
- package/dist/plan.d.ts +29 -29
- package/dist/plan.d.ts.map +1 -1
- package/dist/plan.js +2 -2
- package/dist/plan.js.map +1 -1
- package/dist/primitives.d.ts +1 -1
- package/dist/primitives.d.ts.map +1 -1
- package/dist/primitives.js +1 -1
- package/dist/primitives.js.map +1 -1
- package/dist/problem.d.ts +6 -6
- package/dist/problem.d.ts.map +1 -1
- package/dist/problem.js +1 -1
- package/dist/problem.js.map +1 -1
- package/dist/project.d.ts +87 -25
- package/dist/project.d.ts.map +1 -1
- package/dist/project.js +21 -1
- package/dist/project.js.map +1 -1
- package/dist/quota.d.ts +51 -51
- package/dist/quota.d.ts.map +1 -1
- package/dist/quota.js +6 -1
- package/dist/quota.js.map +1 -1
- package/dist/raw.d.ts +16 -16
- package/dist/raw.d.ts.map +1 -1
- package/dist/raw.js +1 -1
- package/dist/raw.js.map +1 -1
- package/dist/readiness.d.ts +242 -242
- package/dist/readiness.d.ts.map +1 -1
- package/dist/readiness.js +1 -1
- package/dist/readiness.js.map +1 -1
- package/dist/recovery.d.ts +106 -106
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +1 -1
- package/dist/recovery.js.map +1 -1
- package/dist/request-requirements.d.ts +9 -9
- package/dist/request-requirements.d.ts.map +1 -1
- package/dist/request-requirements.js +1 -1
- package/dist/request-requirements.js.map +1 -1
- package/dist/review.d.ts +29 -29
- package/dist/review.d.ts.map +1 -1
- package/dist/review.js +1 -1
- package/dist/review.js.map +1 -1
- package/dist/route.d.ts +11 -11
- package/dist/route.d.ts.map +1 -1
- package/dist/route.js +1 -1
- package/dist/route.js.map +1 -1
- package/dist/run-applicability.d.ts +764 -0
- package/dist/run-applicability.d.ts.map +1 -0
- package/dist/run-applicability.js +56 -0
- package/dist/run-applicability.js.map +1 -0
- package/dist/run-facts.d.ts +628 -0
- package/dist/run-facts.d.ts.map +1 -0
- package/dist/run-facts.js +429 -0
- package/dist/run-facts.js.map +1 -0
- package/dist/run-strategy.d.ts +40 -0
- package/dist/run-strategy.d.ts.map +1 -1
- package/dist/run-strategy.js +68 -1
- package/dist/run-strategy.js.map +1 -1
- package/dist/setup-device-code-envelope.d.ts +67 -0
- package/dist/setup-device-code-envelope.d.ts.map +1 -0
- package/dist/setup-device-code-envelope.js +25 -0
- package/dist/setup-device-code-envelope.js.map +1 -0
- package/dist/setup-login-protocol.d.ts +6 -0
- package/dist/setup-login-protocol.d.ts.map +1 -0
- package/dist/setup-login-protocol.js +12 -0
- package/dist/setup-login-protocol.js.map +1 -0
- package/dist/setup-transport.d.ts +12 -0
- package/dist/setup-transport.d.ts.map +1 -0
- package/dist/setup-transport.js +22 -0
- package/dist/setup-transport.js.map +1 -0
- package/dist/setup.d.ts +12572 -3749
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +34 -38
- package/dist/setup.js.map +1 -1
- package/dist/status-projection.d.ts +7 -5
- package/dist/status-projection.d.ts.map +1 -1
- package/dist/status-projection.js +11 -6
- package/dist/status-projection.js.map +1 -1
- package/dist/surface-run-controls.d.ts.map +1 -1
- package/dist/surface-run-controls.js +10 -1
- package/dist/surface-run-controls.js.map +1 -1
- package/dist/task.d.ts +303 -303
- package/dist/task.d.ts.map +1 -1
- package/dist/task.js +1 -1
- package/dist/task.js.map +1 -1
- package/dist/telemetry.d.ts +1157 -633
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +7 -4
- package/dist/telemetry.js.map +1 -1
- package/dist/thread.d.ts +133 -84
- package/dist/thread.d.ts.map +1 -1
- package/dist/thread.js +21 -2
- package/dist/thread.js.map +1 -1
- package/dist/tool-ref.d.ts +7 -7
- package/dist/tool-ref.d.ts.map +1 -1
- package/dist/tool-ref.js +1 -1
- package/dist/tool-ref.js.map +1 -1
- package/dist/work-report.d.ts +28 -28
- package/dist/work-report.d.ts.map +1 -1
- package/dist/work-report.js +3 -3
- package/dist/work-report.js.map +1 -1
- package/dist/workproduct.d.ts +6 -9
- package/dist/workproduct.d.ts.map +1 -1
- package/dist/workproduct.js +1 -2
- package/dist/workproduct.js.map +1 -1
- package/dist/workspace.d.ts +13 -13
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +1 -1
- package/dist/workspace.js.map +1 -1
- package/generated/AgentCapabilityCatalog.schema.json +41 -0
- package/generated/ControlCredentialProfileCreateResponse.schema.json +10 -1
- package/generated/ControlCredentialProfileUpdateResponse.schema.json +10 -1
- package/generated/ControlCredentialProfilesQueryResponse.schema.json +1343 -0
- package/generated/ControlCredentialProfilesResponse.schema.json +20 -3
- package/generated/ControlCredentialProfilesSnapshotResponse.schema.json +1322 -0
- package/generated/ControlDirectoryEntry.schema.json +36 -0
- package/generated/ControlDirectoryListing.schema.json +77 -0
- package/generated/ControlHarnessListResponse.schema.json +41 -1
- package/generated/ControlQuotaResponse.schema.json +2 -1
- package/generated/ControlRunAgainDraft.schema.json +12 -2
- package/generated/ControlRunApplicabilityResponse.schema.json +217 -0
- package/generated/ControlRunDetail.schema.json +494 -69
- package/generated/ControlRunListResponse.schema.json +30 -4
- package/generated/ControlRunStartRequest.schema.json +12 -2
- package/generated/ControlRunSummary.schema.json +30 -4
- package/generated/ControlSettingsSnapshot.schema.json +12 -3
- package/generated/ControlSettingsUpdateRequest.schema.json +12 -3
- package/generated/ControlSetupJob.schema.json +9 -0
- package/generated/ControlSetupJobCreateRequest.schema.json +9 -0
- package/generated/ControlSetupJobEvent.schema.json +858 -758
- package/generated/ControlSetupJobListResponse.schema.json +9 -0
- package/generated/ControlSetupJobSnapshot.schema.json +811 -736
- package/generated/ControlThreadCreateRequest.schema.json +5 -0
- package/generated/ControlThreadDetail.schema.json +31 -1
- package/generated/ControlThreadTurnRequest.schema.json +5 -24
- package/generated/CredentialProfileStatus.schema.json +10 -1
- package/generated/DecisionRecord.schema.json +2 -1
- package/generated/GitCapability.schema.json +46 -0
- package/generated/GlobalConfig.schema.json +13 -4
- package/generated/HarnessEvent.schema.json +2 -1
- package/generated/HarnessManifest.schema.json +1 -1
- package/generated/HarnessStatusDto.schema.json +1 -1
- package/generated/McpRunHandleResult.schema.json +182 -1
- package/generated/McpRunToolResult.schema.json +182 -1
- package/generated/OutputReadyPayload.schema.json +44 -0
- package/generated/RunFacts.schema.json +569 -0
- package/generated/RunFailure.schema.json +19 -2
- package/generated/RunTelemetry.schema.json +492 -2
- package/generated/ThreadTurn.schema.json +29 -0
- package/generated/WorkProduct.schema.json +0 -4
- package/package.json +3 -3
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
import { z } from "zod/v3";
|
|
2
|
+
import { ApplyEligibility } from "./apply-eligibility.js";
|
|
3
|
+
import { ReviewState, RunOutcomeFacts } from "./decision.js";
|
|
4
|
+
import { Id, IsoTimestamp, ModeKind, SchemaVersion } from "./primitives.js";
|
|
5
|
+
import { RequiredAction, needsDecision, requiredActionsFor } from "./status-projection.js";
|
|
6
|
+
/**
|
|
7
|
+
* Canonical role of one model invocation in a terminal run. In particular,
|
|
8
|
+
* council draft lanes are planners while the synthesis invocation is a merge;
|
|
9
|
+
* reviewer and merge invocations can therefore never inflate planner counts.
|
|
10
|
+
*/
|
|
11
|
+
export const RunParticipantRole = z
|
|
12
|
+
.enum(["planner", "merge", "candidate", "scout", "reducer", "reviewer"])
|
|
13
|
+
.describe("Canonical role of one participant in the terminal run graph.");
|
|
14
|
+
export const RunParticipantStatus = z
|
|
15
|
+
.enum(["success", "success_with_warnings", "blocked", "failed"])
|
|
16
|
+
.describe("Terminal outcome recorded for one run participant.");
|
|
17
|
+
export const RunParticipant = z
|
|
18
|
+
.object({
|
|
19
|
+
attempt_id: Id.nullable().describe("Attempt id when the participant owns an orchestrator attempt; null for reviewer-panel members."),
|
|
20
|
+
harness_id: Id.describe("Harness that served this participant role."),
|
|
21
|
+
role: RunParticipantRole,
|
|
22
|
+
deliverable_present: z
|
|
23
|
+
.boolean()
|
|
24
|
+
.default(false)
|
|
25
|
+
.describe("Whether this participant produced the deliverable its role requested."),
|
|
26
|
+
status: RunParticipantStatus.nullable()
|
|
27
|
+
.default(null)
|
|
28
|
+
.describe("Participant outcome when recorded; null for artifact-only reviewer membership."),
|
|
29
|
+
})
|
|
30
|
+
.strict()
|
|
31
|
+
.describe("One role-labelled participant in the terminal run graph.");
|
|
32
|
+
export const RunDeliverableFacts = z
|
|
33
|
+
.object({
|
|
34
|
+
present: z.boolean().describe("Whether the canonical primary deliverable exists."),
|
|
35
|
+
kind: z
|
|
36
|
+
.enum(["answer", "report", "plan", "patch", "structured_output"])
|
|
37
|
+
.nullable()
|
|
38
|
+
.describe("Kind of canonical primary deliverable; null when none exists."),
|
|
39
|
+
path: z
|
|
40
|
+
.string()
|
|
41
|
+
.nullable()
|
|
42
|
+
.describe("Run-relative path of the canonical primary deliverable; null when absent."),
|
|
43
|
+
producer_attempt_id: Id.nullable()
|
|
44
|
+
.default(null)
|
|
45
|
+
.describe("Attempt that produced the deliverable, when known."),
|
|
46
|
+
})
|
|
47
|
+
.strict()
|
|
48
|
+
.describe("Canonical primary-output presence and identity for a terminal run.");
|
|
49
|
+
export const RunParticipantsFacts = z
|
|
50
|
+
.object({
|
|
51
|
+
planners: z
|
|
52
|
+
.number()
|
|
53
|
+
.int()
|
|
54
|
+
.nonnegative()
|
|
55
|
+
.describe("Number of participants whose canonical role is planner."),
|
|
56
|
+
attempts: z.array(RunParticipant).default([]).describe("Role-labelled participant roster."),
|
|
57
|
+
})
|
|
58
|
+
.strict()
|
|
59
|
+
.describe("Terminal participant graph plus its planner-lane count.");
|
|
60
|
+
export const RunGateState = z
|
|
61
|
+
.enum(["not_configured", "passed", "failed", "skipped"])
|
|
62
|
+
.describe("Terminal state of the configured deterministic gate set.");
|
|
63
|
+
export const RunGateFacts = z
|
|
64
|
+
.object({
|
|
65
|
+
configured: z.boolean().describe("Whether the frozen task configured deterministic gates."),
|
|
66
|
+
required: z.number().int().nonnegative().describe("Number of configured required gates."),
|
|
67
|
+
total: z.number().int().nonnegative().describe("Total configured deterministic gates."),
|
|
68
|
+
executed: z.boolean().describe("Whether the terminal attempt executed the gate set."),
|
|
69
|
+
state: RunGateState,
|
|
70
|
+
receipt_attempt_id: Id.nullable()
|
|
71
|
+
.default(null)
|
|
72
|
+
.describe("Attempt whose gate receipt decides this projection; null when no gates executed."),
|
|
73
|
+
})
|
|
74
|
+
.strict()
|
|
75
|
+
.describe("Canonical gate configuration and terminal receipt projection.");
|
|
76
|
+
export const RunReviewFacts = z
|
|
77
|
+
.object({
|
|
78
|
+
state: ReviewState,
|
|
79
|
+
blocker_ids: z
|
|
80
|
+
.array(Id)
|
|
81
|
+
.default([])
|
|
82
|
+
.describe("Stable ids of accepted evidence-backed blocking findings."),
|
|
83
|
+
blockers: z.number().int().nonnegative().describe("Number of blocking findings."),
|
|
84
|
+
})
|
|
85
|
+
.strict()
|
|
86
|
+
.describe("Canonical terminal review verdict and blocking-finding identity.");
|
|
87
|
+
export const RunApplyFacts = z
|
|
88
|
+
.object({
|
|
89
|
+
eligibility: ApplyEligibility.nullable()
|
|
90
|
+
.default(null)
|
|
91
|
+
.describe("Delivery-gate eligibility at terminalization; null when nothing is applyable."),
|
|
92
|
+
operator_decision_present: z
|
|
93
|
+
.boolean()
|
|
94
|
+
.default(false)
|
|
95
|
+
.describe("Whether a valid operator decision was present when the receipt was finalized."),
|
|
96
|
+
})
|
|
97
|
+
.strict()
|
|
98
|
+
.describe("Terminal apply eligibility and operator-decision state.");
|
|
99
|
+
export const RunPresentationPrimary = z
|
|
100
|
+
.object({
|
|
101
|
+
kind: z
|
|
102
|
+
.enum(["answer", "report", "plan", "patch", "structured_output", "diagnostic"])
|
|
103
|
+
.describe("Presentation kind of the terminal primary artifact."),
|
|
104
|
+
path: z
|
|
105
|
+
.string()
|
|
106
|
+
.min(1)
|
|
107
|
+
.refine((value) => {
|
|
108
|
+
if (value.includes("\0") || value.includes("\\") || value.startsWith("/"))
|
|
109
|
+
return false;
|
|
110
|
+
const parts = value.split("/");
|
|
111
|
+
return parts.every((part) => part.length > 0 && part !== "." && part !== "..");
|
|
112
|
+
}, "must be a normalized run-relative artifact path")
|
|
113
|
+
.describe("Normalized run-relative path of the terminal primary artifact."),
|
|
114
|
+
})
|
|
115
|
+
.strict()
|
|
116
|
+
.describe("Primary user-facing artifact selected once during terminal preparation.");
|
|
117
|
+
export const RunPresentationFacts = z
|
|
118
|
+
.object({
|
|
119
|
+
state: z
|
|
120
|
+
.enum(["ready", "diagnostic"])
|
|
121
|
+
.describe("Terminal output readiness decided by the last valid output.ready receipt."),
|
|
122
|
+
primary: RunPresentationPrimary.nullable().describe("Selected terminal primary artifact, or null when the receipt announces readiness without a primary deliverable."),
|
|
123
|
+
})
|
|
124
|
+
.strict()
|
|
125
|
+
.describe("Immutable terminal presentation facts shared by every surface.");
|
|
126
|
+
/**
|
|
127
|
+
* Immutable terminal RunFacts receipt (GH #29). The orchestrator builds this
|
|
128
|
+
* once from the attempt graph and canonical artifacts, validates its cross-axis
|
|
129
|
+
* invariants, then persists the exact object consumed by machine surfaces.
|
|
130
|
+
*/
|
|
131
|
+
export const RunFacts = z
|
|
132
|
+
.object({
|
|
133
|
+
schema_version: SchemaVersion,
|
|
134
|
+
run_id: Id,
|
|
135
|
+
task_id: Id,
|
|
136
|
+
mode: ModeKind,
|
|
137
|
+
outcome: RunOutcomeFacts,
|
|
138
|
+
deliverable: RunDeliverableFacts,
|
|
139
|
+
presentation: RunPresentationFacts.optional().describe("Immutable terminal output state and primary artifact. Absent only on legacy RunFacts receipts."),
|
|
140
|
+
participants: RunParticipantsFacts,
|
|
141
|
+
gates: RunGateFacts,
|
|
142
|
+
review: RunReviewFacts,
|
|
143
|
+
apply: RunApplyFacts,
|
|
144
|
+
required_actions: z
|
|
145
|
+
.array(RequiredAction)
|
|
146
|
+
.default([])
|
|
147
|
+
.describe("Typed actions required to unblock this terminal outcome."),
|
|
148
|
+
generated_at: IsoTimestamp.describe("When this immutable terminal receipt was finalized."),
|
|
149
|
+
})
|
|
150
|
+
.strict()
|
|
151
|
+
.describe("Validated immutable terminal facts for one run.");
|
|
152
|
+
/** Typed refusal for a PRESENT-but-untrustworthy canonical receipt: wrong
|
|
153
|
+
* shape, violated cross-axis invariants, or an identity that contradicts the
|
|
154
|
+
* caller's authority. The pure core carries the stable machine fields
|
|
155
|
+
* (code/retryable/evidenceRefs); each surface adds its own transport mapping
|
|
156
|
+
* (control-api: HTTP 500 + requiredActions; CLI: renderCliFailure exit). */
|
|
157
|
+
export class RunFactsInvalidError extends Error {
|
|
158
|
+
code = "run_facts_invalid";
|
|
159
|
+
retryable = false;
|
|
160
|
+
evidenceRefs = ["final/run_facts.yaml"];
|
|
161
|
+
constructor() {
|
|
162
|
+
super("canonical RunFacts receipt is invalid; inspect final/run_facts.yaml before retrying");
|
|
163
|
+
this.name = "RunFactsInvalidError";
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* THE shared pure validation owner for reading a canonical receipt back on any
|
|
168
|
+
* surface: wire shape, cross-axis invariants, and identity binding in one
|
|
169
|
+
* place. Filesystem access, root resolution, and transport/error mapping stay
|
|
170
|
+
* with the callers — this function never touches disk.
|
|
171
|
+
*/
|
|
172
|
+
export function validateRunFactsReceipt(value, expected = {}) {
|
|
173
|
+
let facts;
|
|
174
|
+
try {
|
|
175
|
+
facts = validateRunFactsInvariants(value);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
throw new RunFactsInvalidError();
|
|
179
|
+
}
|
|
180
|
+
if ((expected.runId !== undefined && facts.run_id !== expected.runId) ||
|
|
181
|
+
(expected.taskId !== undefined && facts.task_id !== expected.taskId) ||
|
|
182
|
+
(expected.lifecycle !== undefined && facts.outcome.lifecycle !== expected.lifecycle)) {
|
|
183
|
+
throw new RunFactsInvalidError();
|
|
184
|
+
}
|
|
185
|
+
return facts;
|
|
186
|
+
}
|
|
187
|
+
/** Typed invariant refusal raised before a contradictory RunFacts receipt can
|
|
188
|
+
* be persisted. `violations` is stable diagnostic evidence for tests/logs; it
|
|
189
|
+
* is not a surface vocabulary. */
|
|
190
|
+
export class RunFactsInvariantError extends Error {
|
|
191
|
+
violations;
|
|
192
|
+
code = "run_facts_invariant";
|
|
193
|
+
constructor(violations) {
|
|
194
|
+
super(`RunFacts invariant violation: ${violations.join("; ")}`);
|
|
195
|
+
this.violations = violations;
|
|
196
|
+
this.name = "RunFactsInvariantError";
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Validate both the RunFacts wire shape and the relationships its individual
|
|
201
|
+
* Zod fields cannot express. Returns the parsed/defaulted receipt on success.
|
|
202
|
+
*/
|
|
203
|
+
export function validateRunFactsInvariants(value) {
|
|
204
|
+
const facts = RunFacts.parse(value);
|
|
205
|
+
const violations = [];
|
|
206
|
+
const { deliverable, participants, gates, review, apply, outcome } = facts;
|
|
207
|
+
if (facts.presentation?.state === "ready" && facts.presentation.primary?.kind === "diagnostic") {
|
|
208
|
+
violations.push("ready presentation cannot use a diagnostic primary kind");
|
|
209
|
+
}
|
|
210
|
+
const hasDeliverableIdentity = deliverable.kind !== null && deliverable.path !== null;
|
|
211
|
+
if (deliverable.present !== hasDeliverableIdentity) {
|
|
212
|
+
violations.push("deliverable.present must match non-null deliverable kind and path");
|
|
213
|
+
}
|
|
214
|
+
if (deliverable.present) {
|
|
215
|
+
if (deliverable.producer_attempt_id === null) {
|
|
216
|
+
if (facts.mode === "plan" && outcome.lifecycle === "succeeded") {
|
|
217
|
+
violations.push("a succeeded plan deliverable must identify its producer attempt");
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
const producer = participants.attempts.find((participant) => participant.attempt_id === deliverable.producer_attempt_id);
|
|
222
|
+
if (!producer) {
|
|
223
|
+
violations.push("deliverable producer must exist in the participant roster");
|
|
224
|
+
}
|
|
225
|
+
else if (outcome.lifecycle === "succeeded") {
|
|
226
|
+
const successfulProducer = producer.status === "success" || producer.status === "success_with_warnings";
|
|
227
|
+
const honestNonCleanProducer = (producer.status === "blocked" || producer.status === "failed") &&
|
|
228
|
+
(outcome.review === "blocked" ||
|
|
229
|
+
outcome.checks === "failed" ||
|
|
230
|
+
outcome.work_state?.state === "needs_input" ||
|
|
231
|
+
outcome.work_state?.state === "incomplete");
|
|
232
|
+
if (!successfulProducer && !honestNonCleanProducer) {
|
|
233
|
+
violations.push("deliverable producer must have a successful participant status");
|
|
234
|
+
}
|
|
235
|
+
if (!producer.deliverable_present) {
|
|
236
|
+
violations.push("deliverable producer must record deliverable_present=true");
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
else if (deliverable.producer_attempt_id !== null) {
|
|
242
|
+
violations.push("an absent deliverable cannot identify a producer attempt");
|
|
243
|
+
}
|
|
244
|
+
if (outcome.lifecycle === "succeeded" &&
|
|
245
|
+
outcome.review !== "blocked" &&
|
|
246
|
+
facts.mode === "plan" &&
|
|
247
|
+
!deliverable.present) {
|
|
248
|
+
violations.push("a succeeded plan must have a canonical deliverable");
|
|
249
|
+
}
|
|
250
|
+
const plannerCount = participants.attempts.filter((p) => p.role === "planner").length;
|
|
251
|
+
if (participants.planners !== plannerCount) {
|
|
252
|
+
violations.push(`participants.planners=${participants.planners} does not match planner roles=${plannerCount}`);
|
|
253
|
+
}
|
|
254
|
+
if (gates.required > gates.total) {
|
|
255
|
+
violations.push("gates.required cannot exceed gates.total");
|
|
256
|
+
}
|
|
257
|
+
if (!gates.configured) {
|
|
258
|
+
if (gates.total !== 0 || gates.required !== 0) {
|
|
259
|
+
violations.push("an unconfigured gate set must have zero total and required gates");
|
|
260
|
+
}
|
|
261
|
+
if (gates.executed || gates.state !== "not_configured" || gates.receipt_attempt_id !== null) {
|
|
262
|
+
violations.push("an unconfigured gate set cannot be executed or carry a receipt");
|
|
263
|
+
}
|
|
264
|
+
// outcome.checks aggregates ALL deterministic checks — configured contract
|
|
265
|
+
// gates, FinalVerifier, and the protected live apply — while gates.*
|
|
266
|
+
// describes only the CONFIGURED contract gates. With zero configured gates
|
|
267
|
+
// the checks axis may therefore still fail closed (final verify failed,
|
|
268
|
+
// live delivery refused); what it can never do is claim a green result
|
|
269
|
+
// that no configured gate produced.
|
|
270
|
+
if (outcome.checks === "passed") {
|
|
271
|
+
violations.push("unconfigured gates cannot claim outcome.checks=passed");
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
if (gates.total === 0)
|
|
276
|
+
violations.push("a configured gate set must contain at least one gate");
|
|
277
|
+
if (gates.state === "not_configured") {
|
|
278
|
+
violations.push("configured gates cannot have state=not_configured");
|
|
279
|
+
}
|
|
280
|
+
if (gates.executed !== (gates.receipt_attempt_id !== null)) {
|
|
281
|
+
violations.push("gate execution and receipt identity must be present together");
|
|
282
|
+
}
|
|
283
|
+
if (gates.state === "passed" || gates.state === "failed") {
|
|
284
|
+
if (!gates.executed || gates.receipt_attempt_id === null) {
|
|
285
|
+
violations.push("passed/failed gates require execution and a receipt attempt");
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
if (outcome.lifecycle === "succeeded" &&
|
|
289
|
+
gates.receipt_attempt_id !== null &&
|
|
290
|
+
deliverable.producer_attempt_id !== null &&
|
|
291
|
+
gates.receipt_attempt_id !== deliverable.producer_attempt_id &&
|
|
292
|
+
gates.receipt_attempt_id !== "final-verify") {
|
|
293
|
+
violations.push("a succeeded run's gate receipt must belong to its deliverable producer or final verify");
|
|
294
|
+
}
|
|
295
|
+
if (gates.state === "passed" && outcome.checks !== "passed") {
|
|
296
|
+
violations.push("passed gates require outcome.checks=passed");
|
|
297
|
+
}
|
|
298
|
+
if ((gates.state === "failed" || gates.state === "skipped") && outcome.checks !== "failed") {
|
|
299
|
+
violations.push("failed/skipped configured gates require fail-closed outcome.checks=failed");
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
if (review.state !== outcome.review) {
|
|
303
|
+
violations.push("review.state must match outcome.review");
|
|
304
|
+
}
|
|
305
|
+
if (review.blockers !== review.blocker_ids.length) {
|
|
306
|
+
violations.push("review.blockers must match review.blocker_ids length");
|
|
307
|
+
}
|
|
308
|
+
if (new Set(review.blocker_ids).size !== review.blocker_ids.length) {
|
|
309
|
+
violations.push("review.blocker_ids must be unique");
|
|
310
|
+
}
|
|
311
|
+
if (review.blockers > 0 && review.state !== "blocked") {
|
|
312
|
+
violations.push("blocking finding ids require review.state=blocked");
|
|
313
|
+
}
|
|
314
|
+
if (outcome.reason === "checks_failed" && outcome.checks !== "failed") {
|
|
315
|
+
violations.push("reason=checks_failed requires outcome.checks=failed");
|
|
316
|
+
}
|
|
317
|
+
if (outcome.reason === "review_blocked" && outcome.review !== "blocked") {
|
|
318
|
+
violations.push("reason=review_blocked requires outcome.review=blocked");
|
|
319
|
+
}
|
|
320
|
+
if (outcome.reason === "no_changes" && !outcome.noChanges) {
|
|
321
|
+
violations.push("reason=no_changes requires outcome.noChanges=true");
|
|
322
|
+
}
|
|
323
|
+
// Reason follows the documented arbitration precedence (D-16): review_blocked
|
|
324
|
+
// and checks_failed OUTRANK a work_state veto, so a vetoed winner may honestly
|
|
325
|
+
// carry either harder reason (blocked review + needs_input; delivery refusal /
|
|
326
|
+
// final-verify failure over an incomplete winner). What a veto can never do is
|
|
327
|
+
// dissolve into a clean reason (null / no_changes), and the veto reasons still
|
|
328
|
+
// require the attesting work_state they claim.
|
|
329
|
+
const needsInput = outcome.work_state?.state === "needs_input";
|
|
330
|
+
const workIncomplete = outcome.work_state?.state === "incomplete";
|
|
331
|
+
if (outcome.lifecycle === "succeeded") {
|
|
332
|
+
if (outcome.reason === "input_required" && !needsInput) {
|
|
333
|
+
violations.push("reason=input_required requires outcome.work_state.state=needs_input");
|
|
334
|
+
}
|
|
335
|
+
if (outcome.reason === "work_incomplete" && !workIncomplete) {
|
|
336
|
+
violations.push("reason=work_incomplete requires outcome.work_state.state=incomplete");
|
|
337
|
+
}
|
|
338
|
+
const outranksWorkVeto = outcome.reason === "review_blocked" || outcome.reason === "checks_failed";
|
|
339
|
+
if (needsInput && outcome.reason !== "input_required" && !outranksWorkVeto) {
|
|
340
|
+
violations.push("work_state.state=needs_input requires reason input_required, review_blocked, or checks_failed");
|
|
341
|
+
}
|
|
342
|
+
if (workIncomplete && outcome.reason !== "work_incomplete" && !outranksWorkVeto) {
|
|
343
|
+
violations.push("work_state.state=incomplete requires reason work_incomplete, review_blocked, or checks_failed");
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
const lifecycleReasons = {
|
|
347
|
+
succeeded: new Set([
|
|
348
|
+
null,
|
|
349
|
+
"no_changes",
|
|
350
|
+
"review_blocked",
|
|
351
|
+
"checks_failed",
|
|
352
|
+
"input_required",
|
|
353
|
+
"work_incomplete",
|
|
354
|
+
]),
|
|
355
|
+
failed: new Set([
|
|
356
|
+
"harness_failed",
|
|
357
|
+
"budget_exhausted",
|
|
358
|
+
"budget_overshoot",
|
|
359
|
+
"cost_unverifiable",
|
|
360
|
+
"not_converged",
|
|
361
|
+
"stuck_no_progress",
|
|
362
|
+
"work_report_contract",
|
|
363
|
+
"workspace_unavailable",
|
|
364
|
+
]),
|
|
365
|
+
cancelled: new Set(["user_cancelled", "wall_clock_exceeded"]),
|
|
366
|
+
interrupted: new Set(["crash_interrupted", "context_capacity_exhausted"]),
|
|
367
|
+
};
|
|
368
|
+
if (!lifecycleReasons[outcome.lifecycle].has(outcome.reason)) {
|
|
369
|
+
violations.push(`reason=${outcome.reason ?? "null"} is incompatible with lifecycle=${outcome.lifecycle}`);
|
|
370
|
+
}
|
|
371
|
+
if (apply.operator_decision_present && !needsDecision(outcome, false)) {
|
|
372
|
+
violations.push("an operator decision is valid only for a needs-decision outcome");
|
|
373
|
+
}
|
|
374
|
+
const actionIds = facts.required_actions.map((action) => action.id);
|
|
375
|
+
if (new Set(actionIds).size !== actionIds.length) {
|
|
376
|
+
violations.push("required_actions ids must be unique");
|
|
377
|
+
}
|
|
378
|
+
const expectedActions = requiredActionsFor(outcome, apply.operator_decision_present);
|
|
379
|
+
if (JSON.stringify(facts.required_actions) !== JSON.stringify(expectedActions)) {
|
|
380
|
+
violations.push("required_actions must equal the canonical terminal outcome projection");
|
|
381
|
+
}
|
|
382
|
+
if (apply.eligibility?.eligible) {
|
|
383
|
+
if (facts.mode !== "agent") {
|
|
384
|
+
violations.push("apply eligibility can be true only for agent mode");
|
|
385
|
+
}
|
|
386
|
+
if (!deliverable.present || deliverable.kind !== "patch") {
|
|
387
|
+
violations.push("apply eligibility can be true only for a patch deliverable");
|
|
388
|
+
}
|
|
389
|
+
if (outcome.lifecycle !== "succeeded") {
|
|
390
|
+
violations.push("apply eligibility cannot be true for a non-succeeded lifecycle");
|
|
391
|
+
}
|
|
392
|
+
if (outcome.noChanges) {
|
|
393
|
+
violations.push("apply eligibility cannot be true when outcome.noChanges=true");
|
|
394
|
+
}
|
|
395
|
+
if (outcome.work_state?.state === "needs_input" || outcome.work_state?.state === "incomplete") {
|
|
396
|
+
violations.push("apply eligibility cannot bypass an unfinished work_state");
|
|
397
|
+
}
|
|
398
|
+
if (!apply.operator_decision_present && outcome.review !== "approved") {
|
|
399
|
+
violations.push("apply eligibility without an operator decision requires outcome.review=approved");
|
|
400
|
+
}
|
|
401
|
+
if (!apply.operator_decision_present && outcome.checks === "failed") {
|
|
402
|
+
violations.push("apply eligibility without an operator decision cannot bypass failed checks");
|
|
403
|
+
}
|
|
404
|
+
if (facts.required_actions.length > 0) {
|
|
405
|
+
violations.push("apply eligibility cannot be true while required actions remain");
|
|
406
|
+
}
|
|
407
|
+
if (apply.eligibility.reason !== null || apply.eligibility.requiredAction !== null) {
|
|
408
|
+
violations.push("eligible apply projection cannot carry refusal guidance");
|
|
409
|
+
}
|
|
410
|
+
const baseEligibilityState = outcome.review === "blocked" || outcome.checks === "failed"
|
|
411
|
+
? "needs_review"
|
|
412
|
+
: outcome.review === "not_run" || outcome.checks === "not_configured"
|
|
413
|
+
? "not_verified"
|
|
414
|
+
: outcome.noChanges
|
|
415
|
+
? "no_changes"
|
|
416
|
+
: "ok";
|
|
417
|
+
const allowedEligibilityStates = apply.operator_decision_present
|
|
418
|
+
? new Set(["needs_review", "verify_pending"])
|
|
419
|
+
: new Set([baseEligibilityState]);
|
|
420
|
+
if (apply.eligibility.state === null ||
|
|
421
|
+
!allowedEligibilityStates.has(apply.eligibility.state)) {
|
|
422
|
+
violations.push("eligible apply projection must use its canonical eligibility state");
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
if (violations.length > 0)
|
|
426
|
+
throw new RunFactsInvariantError(violations);
|
|
427
|
+
return facts;
|
|
428
|
+
}
|
|
429
|
+
//# sourceMappingURL=run-facts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-facts.js","sourceRoot":"","sources":["../src/run-facts.ts"],"names":[],"mappings":"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"}
|
package/dist/run-strategy.d.ts
CHANGED
|
@@ -1,4 +1,20 @@
|
|
|
1
1
|
import type { ModeKind } from "./primitives.js";
|
|
2
|
+
export interface RunControlApplicabilityItem {
|
|
3
|
+
applicable: boolean;
|
|
4
|
+
reason?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface RunControlApplicability {
|
|
7
|
+
reviewerPanel: RunControlApplicabilityItem;
|
|
8
|
+
protectedPathApprovals: RunControlApplicabilityItem;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Focused applicability owner for the two run-control families that authorize
|
|
12
|
+
* Agent review/change behavior. Surfaces project this result; they do not
|
|
13
|
+
* independently infer mode applicability from read-only labels or UI layout.
|
|
14
|
+
*/
|
|
15
|
+
export declare function runControlApplicability(value: {
|
|
16
|
+
mode?: ModeKind;
|
|
17
|
+
}): RunControlApplicability;
|
|
2
18
|
/** Mode/strategy coherence (D11): meaningless flag combinations are refused
|
|
3
19
|
* at every wire boundary instead of being silently ignored. ONE owner — the
|
|
4
20
|
* control-api normalization funnel throws these as 400s; kept beside the
|
|
@@ -13,5 +29,29 @@ export declare function runStartStrategyViolations(value: {
|
|
|
13
29
|
n?: number;
|
|
14
30
|
delegate?: boolean;
|
|
15
31
|
reviewerPanel?: unknown;
|
|
32
|
+
reviewerModels?: unknown;
|
|
33
|
+
reviewerEfforts?: unknown;
|
|
34
|
+
protectedPathApprovals?: unknown;
|
|
35
|
+
synthesis?: unknown;
|
|
36
|
+
tests?: unknown;
|
|
37
|
+
denyPaths?: unknown;
|
|
38
|
+
outputSchema?: unknown;
|
|
16
39
|
}): string[];
|
|
40
|
+
/**
|
|
41
|
+
* Whether this run shape needs a Git-backed workspace before a provider can
|
|
42
|
+
* start. Read-only modes do not unless their durable thread itself lives in a
|
|
43
|
+
* worktree. Agent race/create/single always do; the one existing non-Git write
|
|
44
|
+
* path is live convergence, whose copy-baseline workspace is explicitly
|
|
45
|
+
* implemented by the engine.
|
|
46
|
+
*/
|
|
47
|
+
export declare function runStartRequiresGit(value: {
|
|
48
|
+
mode?: ModeKind;
|
|
49
|
+
untilClean?: boolean;
|
|
50
|
+
attempts?: number | null;
|
|
51
|
+
execution?: {
|
|
52
|
+
isolation?: "envelope" | "live";
|
|
53
|
+
};
|
|
54
|
+
}, context?: {
|
|
55
|
+
effectiveWorkspaceRequiresGit?: boolean;
|
|
56
|
+
}): boolean;
|
|
17
57
|
//# sourceMappingURL=run-strategy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-strategy.d.ts","sourceRoot":"","sources":["../src/run-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;;6EAG6E;AAC7E,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"run-strategy.d.ts","sourceRoot":"","sources":["../src/run-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,WAAW,2BAA2B;IAC1C,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,2BAA2B,CAAC;IAC3C,sBAAsB,EAAE,2BAA2B,CAAC;CACrD;AAOD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,QAAQ,CAAA;CAAE,GAAG,uBAAuB,CAU3F;AAED;;;6EAG6E;AAC7E,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,GAAG,MAAM,EAAE,CA6EX;AAYD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE;IACL,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,UAAU,GAAG,MAAM,CAAA;KAAE,CAAC;CACjD,EACD,OAAO,GAAE;IAAE,6BAA6B,CAAC,EAAE,OAAO,CAAA;CAAO,GACxD,OAAO,CAUT"}
|
package/dist/run-strategy.js
CHANGED
|
@@ -1,3 +1,21 @@
|
|
|
1
|
+
const REVIEWER_UNAVAILABLE_REASON = "Reviewer controls only apply to Agent runs; Council is the Plan critique path.";
|
|
2
|
+
const APPROVAL_UNAVAILABLE_REASON = "Protected-path approvals only apply to Agent runs; Ask and Plan are read-only.";
|
|
3
|
+
/**
|
|
4
|
+
* Focused applicability owner for the two run-control families that authorize
|
|
5
|
+
* Agent review/change behavior. Surfaces project this result; they do not
|
|
6
|
+
* independently infer mode applicability from read-only labels or UI layout.
|
|
7
|
+
*/
|
|
8
|
+
export function runControlApplicability(value) {
|
|
9
|
+
const applicable = (value.mode ?? "agent") === "agent";
|
|
10
|
+
return {
|
|
11
|
+
reviewerPanel: applicable
|
|
12
|
+
? { applicable: true }
|
|
13
|
+
: { applicable: false, reason: REVIEWER_UNAVAILABLE_REASON },
|
|
14
|
+
protectedPathApprovals: applicable
|
|
15
|
+
? { applicable: true }
|
|
16
|
+
: { applicable: false, reason: APPROVAL_UNAVAILABLE_REASON },
|
|
17
|
+
};
|
|
18
|
+
}
|
|
1
19
|
/** Mode/strategy coherence (D11): meaningless flag combinations are refused
|
|
2
20
|
* at every wire boundary instead of being silently ignored. ONE owner — the
|
|
3
21
|
* control-api normalization funnel throws these as 400s; kept beside the
|
|
@@ -39,9 +57,58 @@ export function runStartStrategyViolations(value) {
|
|
|
39
57
|
if (value.delegate === true && mode !== "agent") {
|
|
40
58
|
violations.push(`delegate is an agent strategy; mode is '${mode}'`);
|
|
41
59
|
}
|
|
42
|
-
|
|
60
|
+
const applicability = runControlApplicability({ mode });
|
|
61
|
+
if (value.reviewerPanel !== undefined && !applicability.reviewerPanel.applicable) {
|
|
43
62
|
violations.push(`reviewerPanel only applies to agent runs (plan review was retired in v3; Council is the plan critique path); mode is '${mode}'`);
|
|
44
63
|
}
|
|
64
|
+
if (hasRecordEntries(value.reviewerModels) && !applicability.reviewerPanel.applicable) {
|
|
65
|
+
violations.push(`reviewerModels only applies to agent runs (plan review was retired in v3; Council is the plan critique path); mode is '${mode}'`);
|
|
66
|
+
}
|
|
67
|
+
if (hasRecordEntries(value.reviewerEfforts) && !applicability.reviewerPanel.applicable) {
|
|
68
|
+
violations.push(`reviewerEfforts only applies to agent runs (plan review was retired in v3; Council is the plan critique path); mode is '${mode}'`);
|
|
69
|
+
}
|
|
70
|
+
if (hasArrayEntries(value.protectedPathApprovals) &&
|
|
71
|
+
!applicability.protectedPathApprovals.applicable) {
|
|
72
|
+
violations.push(`protectedPathApprovals only applies to agent runs (read-only modes do not change protected paths); mode is '${mode}'`);
|
|
73
|
+
}
|
|
74
|
+
if (value.synthesis !== undefined && mode !== "agent") {
|
|
75
|
+
violations.push(`synthesis only applies to agent best-of runs; mode is '${mode}'`);
|
|
76
|
+
}
|
|
77
|
+
if (value.tests !== undefined && mode !== "agent") {
|
|
78
|
+
violations.push(`tests only applies to agent runs; mode is '${mode}'`);
|
|
79
|
+
}
|
|
80
|
+
if (value.denyPaths !== undefined && mode !== "agent") {
|
|
81
|
+
violations.push(`denyPaths only applies to agent runs; mode is '${mode}'`);
|
|
82
|
+
}
|
|
83
|
+
if (value.outputSchema !== undefined && mode === "plan") {
|
|
84
|
+
violations.push(`outputSchema applies to agent/ask runs, not plan runs`);
|
|
85
|
+
}
|
|
45
86
|
return violations;
|
|
46
87
|
}
|
|
88
|
+
function hasRecordEntries(value) {
|
|
89
|
+
return (!!value && typeof value === "object" && !Array.isArray(value) && Object.keys(value).length > 0);
|
|
90
|
+
}
|
|
91
|
+
function hasArrayEntries(value) {
|
|
92
|
+
return Array.isArray(value) && value.length > 0;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Whether this run shape needs a Git-backed workspace before a provider can
|
|
96
|
+
* start. Read-only modes do not unless their durable thread itself lives in a
|
|
97
|
+
* worktree. Agent race/create/single always do; the one existing non-Git write
|
|
98
|
+
* path is live convergence, whose copy-baseline workspace is explicitly
|
|
99
|
+
* implemented by the engine.
|
|
100
|
+
*/
|
|
101
|
+
export function runStartRequiresGit(value, context = {}) {
|
|
102
|
+
// A thread may execute "live" *inside a worktree*: isolated threads and
|
|
103
|
+
// protected-path promotion are resolved by the daemon from durable thread /
|
|
104
|
+
// project state, not from the wire isolation flag. That effective workspace
|
|
105
|
+
// must win over the convergence exception below, because creating/reusing it
|
|
106
|
+
// requires Git before any provider can start.
|
|
107
|
+
if (context.effectiveWorkspaceRequiresGit === true)
|
|
108
|
+
return true;
|
|
109
|
+
if ((value.mode ?? "agent") !== "agent")
|
|
110
|
+
return false;
|
|
111
|
+
const convergence = value.untilClean === true || value.attempts != null;
|
|
112
|
+
return !(convergence && value.execution?.isolation === "live");
|
|
113
|
+
}
|
|
47
114
|
//# sourceMappingURL=run-strategy.js.map
|
package/dist/run-strategy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-strategy.js","sourceRoot":"","sources":["../src/run-strategy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run-strategy.js","sourceRoot":"","sources":["../src/run-strategy.ts"],"names":[],"mappings":"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"}
|