@dailephd/my-dev-kit-lab 0.4.2 → 0.4.3

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 (92) hide show
  1. package/README.md +23 -113
  2. package/benchmarks/contracts/todo-behavior.md +1 -1
  3. package/benchmarks/projects/task-analytics-large-mixed/README.md +2 -0
  4. package/benchmarks/projects/task-workflow-medium-ts/README.md +3 -1
  5. package/dist/src/evaluation/stageContextDeterminism/calculateStageContextDeterminism.js +52 -0
  6. package/dist/src/evaluation/stageContextDeterminism/canonicalizeStageContextRun.js +53 -0
  7. package/dist/src/evaluation/stageContextDeterminism/index.js +2 -0
  8. package/dist/src/evaluation/stageContextDeterminism/types.js +1 -0
  9. package/dist/src/evaluation/stageContextExpectations/index.js +2 -0
  10. package/dist/src/evaluation/stageContextExpectations/readStageContextExpectationFixtureV1.js +50 -0
  11. package/dist/src/evaluation/stageContextExpectations/readTypes.js +1 -0
  12. package/dist/src/evaluation/stageContextExpectations/types.js +1 -0
  13. package/dist/src/evaluation/stageContextExpectations/validation.js +568 -0
  14. package/dist/src/evaluation/stageContextMetrics/calculateArtifactStateMetrics.js +130 -0
  15. package/dist/src/evaluation/stageContextMetrics/calculateContextSizeMetrics.js +85 -0
  16. package/dist/src/evaluation/stageContextMetrics/calculateExpectationMetrics.js +103 -0
  17. package/dist/src/evaluation/stageContextMetrics/calculateResponsibilityMappingMetrics.js +36 -0
  18. package/dist/src/evaluation/stageContextMetrics/collectContextCapsuleEvidence.js +312 -0
  19. package/dist/src/evaluation/stageContextMetrics/collectRetrievalAuditEvidence.js +35 -0
  20. package/dist/src/evaluation/stageContextMetrics/collectWorkflowInstructionEvidence.js +137 -0
  21. package/dist/src/evaluation/stageContextMetrics/evaluateV043StageContextExecution.js +247 -0
  22. package/dist/src/evaluation/stageContextMetrics/index.js +10 -0
  23. package/dist/src/evaluation/stageContextMetrics/matchStageContextExpectations.js +38 -0
  24. package/dist/src/evaluation/stageContextMetrics/targetKeys.js +35 -0
  25. package/dist/src/evaluation/stageContextMetrics/types.js +1 -0
  26. package/dist/src/evaluation/stageContextSelectors/contextArtifactConsistency.js +79 -0
  27. package/dist/src/evaluation/stageContextSelectors/contextCapsuleSelectors.js +126 -0
  28. package/dist/src/evaluation/stageContextSelectors/index.js +4 -0
  29. package/dist/src/evaluation/stageContextSelectors/retrievalAuditRecordSelectors.js +54 -0
  30. package/dist/src/evaluation/stageContextSelectors/workflowInstructionPacketSelectors.js +51 -0
  31. package/dist/src/evaluation/targetImmutability/captureTargetSnapshot.js +208 -0
  32. package/dist/src/evaluation/targetImmutability/compareTargetSnapshots.js +56 -0
  33. package/dist/src/evaluation/targetImmutability/index.js +3 -0
  34. package/dist/src/evaluation/targetImmutability/types.js +1 -0
  35. package/dist/src/evaluation/targetImmutability/validateTargetImmutabilityConfig.js +130 -0
  36. package/dist/src/evaluation/upstreamArtifacts/artifactReadTypes.js +1 -0
  37. package/dist/src/evaluation/upstreamArtifacts/index.js +3 -0
  38. package/dist/src/evaluation/upstreamArtifacts/jsonTypes.js +1 -0
  39. package/dist/src/evaluation/upstreamArtifacts/myDevKitClassificationTypesV1.js +1 -0
  40. package/dist/src/evaluation/upstreamArtifacts/myDevKitContextArtifactsV1.js +1 -0
  41. package/dist/src/evaluation/upstreamArtifacts/myDevKitSemanticTypesV1.js +1 -0
  42. package/dist/src/evaluation/upstreamArtifacts/orchestratorWorkflowInstructionPacketV1.js +1 -0
  43. package/dist/src/evaluation/upstreamArtifacts/readJsonArtifact.js +53 -0
  44. package/dist/src/evaluation/upstreamArtifacts/readMyDevKitContextCapsuleV1.js +9 -0
  45. package/dist/src/evaluation/upstreamArtifacts/readMyDevKitRetrievalAuditRecordV1.js +9 -0
  46. package/dist/src/evaluation/upstreamArtifacts/readOrchestratorWorkflowInstructionPacketV1.js +9 -0
  47. package/dist/src/evaluation/upstreamArtifacts/runtimeValidation.js +131 -0
  48. package/dist/src/evaluation/upstreamArtifacts/schemaVersion.js +32 -0
  49. package/dist/src/evaluation/upstreamArtifacts/validateMyDevKitContextCapsuleV1.js +1208 -0
  50. package/dist/src/evaluation/upstreamArtifacts/validateMyDevKitRetrievalAuditRecordV1.js +105 -0
  51. package/dist/src/evaluation/upstreamArtifacts/validateOrchestratorWorkflowInstructionPacketV1.js +235 -0
  52. package/dist/src/experiments/plugins/contextStrategyComparison/executeV043StageContextStrategy.js +46 -0
  53. package/dist/src/experiments/plugins/contextStrategyComparison/index.js +9 -0
  54. package/dist/src/experiments/plugins/contextStrategyComparison/loadV043StrategyArtifacts.js +286 -0
  55. package/dist/src/experiments/plugins/contextStrategyComparison/plugin.js +39 -1
  56. package/dist/src/experiments/plugins/contextStrategyComparison/readV043FullWorkflowLibraryFixture.js +162 -0
  57. package/dist/src/experiments/plugins/contextStrategyComparison/resolveV043StrategyInputs.js +43 -0
  58. package/dist/src/experiments/plugins/contextStrategyComparison/resultMapping.js +3 -0
  59. package/dist/src/experiments/plugins/contextStrategyComparison/runV043StageContextStrategyWithAssurance.js +190 -0
  60. package/dist/src/experiments/plugins/contextStrategyComparison/v043FullWorkflowLibraryFixture.js +1 -0
  61. package/dist/src/experiments/plugins/contextStrategyComparison/v043RunAssuranceTypes.js +1 -0
  62. package/dist/src/experiments/plugins/contextStrategyComparison/v043StrategyExecutionTypes.js +1 -0
  63. package/dist/src/experiments/plugins/contextStrategyComparison/v043StrategyIds.js +13 -0
  64. package/dist/src/experiments/plugins/contextStrategyComparison/v043StrategyInputContracts.js +1 -0
  65. package/dist/src/experiments/plugins/contextStrategyComparison/validateV043RunAssuranceConfig.js +59 -0
  66. package/dist/src/experiments/plugins/contextStrategyComparison/validateV043StrategyInput.js +252 -0
  67. package/dist/src/report/experiments/buildContextStrategyComparisonV043Report.js +398 -0
  68. package/dist/src/report/experiments/buildPluginExperimentReport.js +21 -6
  69. package/dist/src/report/experiments/contextStrategyComparisonV043ReportModel.js +1 -0
  70. package/dist/src/report/experiments/index.js +4 -0
  71. package/dist/src/report/experiments/renderContextStrategyComparisonV043Html.js +234 -0
  72. package/dist/src/report/experiments/renderPluginExperimentReportHtml.js +3 -0
  73. package/dist/src/report/experiments/renderPluginExperimentReportText.js +225 -0
  74. package/dist/src/report/experiments/writePluginExperimentReports.js +3 -0
  75. package/dist/src/securityValidation/attackScenarios/scenarios/secretLeakageScenario.js +215 -9
  76. package/docs/METRICS.md +56 -10
  77. package/package.json +1 -1
  78. package/tests/fixtures/full-workflow-library/complete-v1.0.0.json +24 -0
  79. package/tests/fixtures/full-workflow-library/future-minor-v1.1.0-additive.json +25 -0
  80. package/tests/fixtures/stage-context-expectations/complete-v1.0.0.json +230 -0
  81. package/tests/fixtures/stage-context-expectations/future-minor-v1.1.0-additive.json +232 -0
  82. package/tests/fixtures/stage-context-expectations/invalid/malformed-json.txt +1 -0
  83. package/tests/fixtures/stage-context-expectations/invalid/non-object-root.json +1 -0
  84. package/tests/fixtures/stage-context-expectations/minimal-v1.0.0.json +18 -0
  85. package/tests/fixtures/upstream-artifacts/invalid/malformed-json.txt +1 -0
  86. package/tests/fixtures/upstream-artifacts/invalid/non-object-root.json +1 -0
  87. package/tests/fixtures/upstream-artifacts/my-dev-kit/1.10.2/context-capsule/complete-v1.0.0.json +504 -0
  88. package/tests/fixtures/upstream-artifacts/my-dev-kit/1.10.2/context-capsule/future-minor-v1.1.0-additive.json +955 -0
  89. package/tests/fixtures/upstream-artifacts/my-dev-kit/1.10.2/retrieval-audit-record/complete-v1.0.0.json +190 -0
  90. package/tests/fixtures/upstream-artifacts/my-dev-kit/1.10.2/retrieval-audit-record/future-minor-v1.1.0-additive.json +327 -0
  91. package/tests/fixtures/upstream-artifacts/my-dev-kit-orchestrator/1.2.1/workflow-instruction-packet/complete-v1.0.0.json +160 -0
  92. package/tests/fixtures/upstream-artifacts/my-dev-kit-orchestrator/1.2.1/workflow-instruction-packet/future-minor-v1.1.0-additive.json +186 -0
@@ -0,0 +1,1208 @@
1
+ import { parseSupportedMajorOneSchemaVersion } from "./schemaVersion.js";
2
+ import { ArtifactValidationError, arrayFieldPath, joinFieldPath, optionalBoolean, optionalField, optionalLiteral, optionalNullableString, optionalNumber, optionalString, requiredArray, requiredBoolean, requiredField, requiredLiteral, requiredNonnegativeInteger, requiredNullableLiteral, requiredNullableNumber, requiredNullableString, requiredNumber, requiredObject, requiredRecord, requiredScalarLike, requiredScalarOrStringArrayLike, requiredString, requiredStringArray } from "./runtimeValidation.js";
3
+ const ARTIFACT_KIND = "my-dev-kit-context-capsule-v1";
4
+ const CONTEXT_CAPSULE_MODES = ["general", "feature-add", "subsystem"];
5
+ const CONTEXT_ROLES = ["architecture", "implementation", "test-implementation"];
6
+ const CONTEXT_ENTRY_KINDS = [
7
+ "request-summary",
8
+ "index-summary",
9
+ "artifact-summary",
10
+ "placeholder",
11
+ "focus-summary",
12
+ "selected-graph-summary",
13
+ "selected-source-summary",
14
+ "semantic-summary",
15
+ "classification-summary",
16
+ "conflict-summary"
17
+ ];
18
+ const CONTEXT_ADEQUACY_STATUSES = [
19
+ "context sufficient for implementation",
20
+ "context sufficient with listed assumptions",
21
+ "context insufficient and more retrieval required",
22
+ "context conflict found and user or upstream stage decision required"
23
+ ];
24
+ const CHANGED_SURFACE_STATUSES = ["added", "modified", "removed", "unknown"];
25
+ const CHANGED_SURFACE_PROVENANCES = ["caller", "graph-diff", "both"];
26
+ const FOCUS_SELECTION_MODES = ["none", "single-best", "best-effort-ambiguous"];
27
+ const FOCUS_CONFIDENCES = ["high", "medium", "low", "none"];
28
+ const SOURCE_RETRIEVAL_METHODS = [
29
+ "node",
30
+ "symbol",
31
+ "line-range",
32
+ "contains",
33
+ "react-region",
34
+ "local-component-tree",
35
+ "local-dependency-expansion",
36
+ "continuation"
37
+ ];
38
+ const SOURCE_INCLUDED_BY = ["primary-focus", "selected-graph"];
39
+ const REQUESTED_EVIDENCE_KINDS = [
40
+ "owner",
41
+ "dependencies",
42
+ "contracts",
43
+ "validators",
44
+ "constants",
45
+ "errors",
46
+ "schemas",
47
+ "callers",
48
+ "callees",
49
+ "closest-tests",
50
+ "test-infrastructure",
51
+ "test-commands",
52
+ "changed-surface",
53
+ "responsibility-mappings"
54
+ ];
55
+ const EVIDENCE_GROUP_KINDS = [
56
+ "owners",
57
+ "extension-points",
58
+ "contracts",
59
+ "graph-neighborhood",
60
+ "architecture-tests",
61
+ "dependencies",
62
+ "callers-and-callees",
63
+ "validators-and-constants",
64
+ "errors",
65
+ "schemas-and-serializers",
66
+ "compatibility-surfaces",
67
+ "closest-tests",
68
+ "changed-surface",
69
+ "production-symbols",
70
+ "validators-and-boundaries",
71
+ "errors-and-side-effects",
72
+ "related-tests",
73
+ "fixtures",
74
+ "factories",
75
+ "mocks",
76
+ "setup-and-configuration",
77
+ "test-commands",
78
+ "unresolved-evidence"
79
+ ];
80
+ const EVIDENCE_ITEM_KINDS = [
81
+ "file",
82
+ "symbol",
83
+ "test-file",
84
+ "fixture",
85
+ "factory",
86
+ "mock",
87
+ "setup-file",
88
+ "config-file",
89
+ "package-script",
90
+ "command"
91
+ ];
92
+ const TEST_COMMAND_SCOPES = ["file", "directory", "suite", "full-project"];
93
+ const RESPONSIBILITY_CRITICALITIES = ["critical", "noncritical"];
94
+ const RESPONSIBILITY_MAPPING_STATUSES = ["mapped", "partially-mapped", "unmapped", "not-applicable"];
95
+ const FRESHNESS_STATES = ["fresh", "stale", "unknown"];
96
+ const PROVENANCE_CATEGORIES = [
97
+ "request",
98
+ "cli",
99
+ "request-file",
100
+ "focus-file",
101
+ "focus-symbol",
102
+ "caller-changed-file",
103
+ "caller-changed-symbol",
104
+ "graph-diff",
105
+ "active-index",
106
+ "before-index",
107
+ "after-index",
108
+ "code-graph",
109
+ "symbol-index",
110
+ "source-scan",
111
+ "test-directory-walk",
112
+ "import-scan",
113
+ "package-json",
114
+ "test-configuration",
115
+ "upstream-artifact-ref"
116
+ ];
117
+ const EDIT_GUIDANCES = [
118
+ "safe-primary-edit-target",
119
+ "inspect-before-edit",
120
+ "avoid-primary-edit-target",
121
+ "read-only-reference",
122
+ "generated-do-not-edit",
123
+ "test-only",
124
+ "docs-only",
125
+ "uncertain"
126
+ ];
127
+ const READINESSES = ["ready", "needs-more-context", "risky-assumption"];
128
+ const RISK_LABELS = [
129
+ "wrong-layer-risk",
130
+ "unreachable-ui-risk",
131
+ "requires-test-validation",
132
+ "requires-browser-validation",
133
+ "generated-file-risk",
134
+ "public-contract-risk",
135
+ "migration-risk"
136
+ ];
137
+ const UNCERTAINTY_TIERS = ["certain", "likely", "possible", "unknown"];
138
+ function validateContextRole(ctx, value, fieldPath) {
139
+ return requiredNullableLiteral(ctx, value, fieldPath, CONTEXT_ROLES);
140
+ }
141
+ function validateSemanticArtifactRef(ctx, value, fieldPath) {
142
+ const obj = requiredObject(ctx, value, fieldPath);
143
+ return {
144
+ artifact: requiredString(ctx, requiredField(ctx, obj, "artifact", joinFieldPath(fieldPath, "artifact")), joinFieldPath(fieldPath, "artifact")),
145
+ ...(optionalField(obj, "artifactKind") !== undefined
146
+ ? { artifactKind: optionalNullableString(ctx, optionalField(obj, "artifactKind"), joinFieldPath(fieldPath, "artifactKind")) }
147
+ : {}),
148
+ id: requiredString(ctx, requiredField(ctx, obj, "id", joinFieldPath(fieldPath, "id")), joinFieldPath(fieldPath, "id")),
149
+ ...(optionalField(obj, "path") !== undefined
150
+ ? { path: optionalNullableString(ctx, optionalField(obj, "path"), joinFieldPath(fieldPath, "path")) }
151
+ : {})
152
+ };
153
+ }
154
+ function validateSemanticEvidenceRef(ctx, value, fieldPath) {
155
+ const obj = requiredObject(ctx, value, fieldPath);
156
+ const result = {
157
+ filePath: requiredString(ctx, requiredField(ctx, obj, "filePath", joinFieldPath(fieldPath, "filePath")), joinFieldPath(fieldPath, "filePath"))
158
+ };
159
+ if (optionalField(obj, "symbolId") !== undefined)
160
+ result.symbolId = optionalNullableString(ctx, obj.symbolId, joinFieldPath(fieldPath, "symbolId"));
161
+ if (optionalField(obj, "line") !== undefined)
162
+ result.line = obj.line === null ? null : requiredNumber(ctx, obj.line, joinFieldPath(fieldPath, "line"));
163
+ if (optionalField(obj, "endLine") !== undefined)
164
+ result.endLine = obj.endLine === null ? null : requiredNumber(ctx, obj.endLine, joinFieldPath(fieldPath, "endLine"));
165
+ if (optionalField(obj, "source") !== undefined)
166
+ result.source = optionalNullableString(ctx, obj.source, joinFieldPath(fieldPath, "source"));
167
+ if (optionalField(obj, "analyzer") !== undefined)
168
+ result.analyzer = optionalNullableString(ctx, obj.analyzer, joinFieldPath(fieldPath, "analyzer"));
169
+ return result;
170
+ }
171
+ function validateSemanticRoleWarning(ctx, value, fieldPath) {
172
+ const obj = requiredObject(ctx, value, fieldPath);
173
+ const result = {
174
+ kind: requiredString(ctx, requiredField(ctx, obj, "kind", joinFieldPath(fieldPath, "kind")), joinFieldPath(fieldPath, "kind")),
175
+ message: requiredString(ctx, requiredField(ctx, obj, "message", joinFieldPath(fieldPath, "message")), joinFieldPath(fieldPath, "message"))
176
+ };
177
+ if (optionalField(obj, "artifactRefs") !== undefined) {
178
+ result.artifactRefs = requiredArray(ctx, obj.artifactRefs, joinFieldPath(fieldPath, "artifactRefs")).map((item, i) => validateSemanticArtifactRef(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "artifactRefs"), i)));
179
+ }
180
+ if (optionalField(obj, "evidenceRefs") !== undefined) {
181
+ result.evidenceRefs = requiredArray(ctx, obj.evidenceRefs, joinFieldPath(fieldPath, "evidenceRefs")).map((item, i) => validateSemanticEvidenceRef(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "evidenceRefs"), i)));
182
+ }
183
+ return result;
184
+ }
185
+ function validateSemanticRole(ctx, value, fieldPath) {
186
+ const obj = requiredObject(ctx, value, fieldPath);
187
+ const result = {
188
+ role: requiredString(ctx, requiredField(ctx, obj, "role", joinFieldPath(fieldPath, "role")), joinFieldPath(fieldPath, "role")),
189
+ confidence: requiredString(ctx, requiredField(ctx, obj, "confidence", joinFieldPath(fieldPath, "confidence")), joinFieldPath(fieldPath, "confidence")),
190
+ source: requiredString(ctx, requiredField(ctx, obj, "source", joinFieldPath(fieldPath, "source")), joinFieldPath(fieldPath, "source"))
191
+ };
192
+ if (optionalField(obj, "subtype") !== undefined)
193
+ result.subtype = optionalNullableString(ctx, obj.subtype, joinFieldPath(fieldPath, "subtype"));
194
+ if (optionalField(obj, "artifactRefs") !== undefined) {
195
+ result.artifactRefs = requiredArray(ctx, obj.artifactRefs, joinFieldPath(fieldPath, "artifactRefs")).map((item, i) => validateSemanticArtifactRef(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "artifactRefs"), i)));
196
+ }
197
+ if (optionalField(obj, "evidenceRefs") !== undefined) {
198
+ result.evidenceRefs = requiredArray(ctx, obj.evidenceRefs, joinFieldPath(fieldPath, "evidenceRefs")).map((item, i) => validateSemanticEvidenceRef(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "evidenceRefs"), i)));
199
+ }
200
+ if (optionalField(obj, "warnings") !== undefined) {
201
+ result.warnings = requiredArray(ctx, obj.warnings, joinFieldPath(fieldPath, "warnings")).map((item, i) => validateSemanticRoleWarning(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "warnings"), i)));
202
+ }
203
+ return result;
204
+ }
205
+ function validateClassificationRole(ctx, value, fieldPath) {
206
+ const obj = requiredObject(ctx, value, fieldPath);
207
+ const result = {
208
+ role: requiredString(ctx, requiredField(ctx, obj, "role", joinFieldPath(fieldPath, "role")), joinFieldPath(fieldPath, "role")),
209
+ confidence: requiredLiteral(ctx, requiredField(ctx, obj, "confidence", joinFieldPath(fieldPath, "confidence")), joinFieldPath(fieldPath, "confidence"), UNCERTAINTY_TIERS)
210
+ };
211
+ if (optionalField(obj, "subtype") !== undefined)
212
+ result.subtype = optionalNullableString(ctx, obj.subtype, joinFieldPath(fieldPath, "subtype"));
213
+ return result;
214
+ }
215
+ function validateClassificationRoleRef(ctx, value, fieldPath) {
216
+ const obj = requiredObject(ctx, value, fieldPath);
217
+ return {
218
+ role: requiredString(ctx, requiredField(ctx, obj, "role", joinFieldPath(fieldPath, "role")), joinFieldPath(fieldPath, "role")),
219
+ editGuidance: requiredLiteral(ctx, requiredField(ctx, obj, "editGuidance", joinFieldPath(fieldPath, "editGuidance")), joinFieldPath(fieldPath, "editGuidance"), EDIT_GUIDANCES),
220
+ readiness: requiredLiteral(ctx, requiredField(ctx, obj, "readiness", joinFieldPath(fieldPath, "readiness")), joinFieldPath(fieldPath, "readiness"), READINESSES),
221
+ uncertainty: requiredLiteral(ctx, requiredField(ctx, obj, "uncertainty", joinFieldPath(fieldPath, "uncertainty")), joinFieldPath(fieldPath, "uncertainty"), UNCERTAINTY_TIERS)
222
+ };
223
+ }
224
+ function validateContextEntryEvidenceRef(ctx, value, fieldPath) {
225
+ const obj = requiredObject(ctx, value, fieldPath);
226
+ return { path: requiredString(ctx, requiredField(ctx, obj, "path", joinFieldPath(fieldPath, "path")), joinFieldPath(fieldPath, "path")) };
227
+ }
228
+ function validateContextEntry(ctx, value, fieldPath) {
229
+ const obj = requiredObject(ctx, value, fieldPath);
230
+ const result = {
231
+ id: requiredString(ctx, requiredField(ctx, obj, "id", joinFieldPath(fieldPath, "id")), joinFieldPath(fieldPath, "id")),
232
+ kind: requiredLiteral(ctx, requiredField(ctx, obj, "kind", joinFieldPath(fieldPath, "kind")), joinFieldPath(fieldPath, "kind"), CONTEXT_ENTRY_KINDS),
233
+ title: requiredString(ctx, requiredField(ctx, obj, "title", joinFieldPath(fieldPath, "title")), joinFieldPath(fieldPath, "title")),
234
+ reason: requiredString(ctx, requiredField(ctx, obj, "reason", joinFieldPath(fieldPath, "reason")), joinFieldPath(fieldPath, "reason")),
235
+ evidenceRefs: requiredArray(ctx, requiredField(ctx, obj, "evidenceRefs", joinFieldPath(fieldPath, "evidenceRefs")), joinFieldPath(fieldPath, "evidenceRefs")).map((item, i) => validateContextEntryEvidenceRef(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "evidenceRefs"), i))),
236
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings"))
237
+ };
238
+ if (optionalField(obj, "classificationRefs") !== undefined) {
239
+ result.classificationRefs = requiredArray(ctx, obj.classificationRefs, joinFieldPath(fieldPath, "classificationRefs")).map((item, i) => validateSemanticEvidenceRef(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "classificationRefs"), i)));
240
+ }
241
+ if (optionalField(obj, "classificationRoles") !== undefined) {
242
+ result.classificationRoles = requiredArray(ctx, obj.classificationRoles, joinFieldPath(fieldPath, "classificationRoles")).map((item, i) => validateClassificationRole(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "classificationRoles"), i)));
243
+ }
244
+ return result;
245
+ }
246
+ function validateDroppedContextEntry(ctx, value, fieldPath) {
247
+ const obj = requiredObject(ctx, value, fieldPath);
248
+ return {
249
+ id: requiredString(ctx, requiredField(ctx, obj, "id", joinFieldPath(fieldPath, "id")), joinFieldPath(fieldPath, "id")),
250
+ kind: requiredLiteral(ctx, requiredField(ctx, obj, "kind", joinFieldPath(fieldPath, "kind")), joinFieldPath(fieldPath, "kind"), CONTEXT_ENTRY_KINDS),
251
+ title: requiredString(ctx, requiredField(ctx, obj, "title", joinFieldPath(fieldPath, "title")), joinFieldPath(fieldPath, "title")),
252
+ reason: requiredString(ctx, requiredField(ctx, obj, "reason", joinFieldPath(fieldPath, "reason")), joinFieldPath(fieldPath, "reason"))
253
+ };
254
+ }
255
+ export function validateContextAdequacyStatement(ctx, value, fieldPath) {
256
+ const obj = requiredObject(ctx, value, fieldPath);
257
+ return {
258
+ status: requiredLiteral(ctx, requiredField(ctx, obj, "status", joinFieldPath(fieldPath, "status")), joinFieldPath(fieldPath, "status"), CONTEXT_ADEQUACY_STATUSES),
259
+ summary: requiredString(ctx, requiredField(ctx, obj, "summary", joinFieldPath(fieldPath, "summary")), joinFieldPath(fieldPath, "summary")),
260
+ assumptions: requiredStringArray(ctx, requiredField(ctx, obj, "assumptions", joinFieldPath(fieldPath, "assumptions")), joinFieldPath(fieldPath, "assumptions")),
261
+ gaps: requiredStringArray(ctx, requiredField(ctx, obj, "gaps", joinFieldPath(fieldPath, "gaps")), joinFieldPath(fieldPath, "gaps"))
262
+ };
263
+ }
264
+ function validateQueryTerms(ctx, value, fieldPath) {
265
+ const obj = requiredObject(ctx, value, fieldPath);
266
+ const req = (key) => requiredStringArray(ctx, requiredField(ctx, obj, key, joinFieldPath(fieldPath, key)), joinFieldPath(fieldPath, key));
267
+ return {
268
+ raw: req("raw"),
269
+ quotedPhrases: req("quotedPhrases"),
270
+ pathLike: req("pathLike"),
271
+ symbolLike: req("symbolLike"),
272
+ routeLike: req("routeLike"),
273
+ commandLike: req("commandLike"),
274
+ artifactLike: req("artifactLike"),
275
+ classificationLike: req("classificationLike")
276
+ };
277
+ }
278
+ function validateQueryPlan(ctx, value, fieldPath) {
279
+ const obj = requiredObject(ctx, value, fieldPath);
280
+ return {
281
+ originalQuery: requiredString(ctx, requiredField(ctx, obj, "originalQuery", joinFieldPath(fieldPath, "originalQuery")), joinFieldPath(fieldPath, "originalQuery")),
282
+ normalizedQuery: requiredString(ctx, requiredField(ctx, obj, "normalizedQuery", joinFieldPath(fieldPath, "normalizedQuery")), joinFieldPath(fieldPath, "normalizedQuery")),
283
+ mode: requiredLiteral(ctx, requiredField(ctx, obj, "mode", joinFieldPath(fieldPath, "mode")), joinFieldPath(fieldPath, "mode"), CONTEXT_CAPSULE_MODES),
284
+ searchQueries: requiredStringArray(ctx, requiredField(ctx, obj, "searchQueries", joinFieldPath(fieldPath, "searchQueries")), joinFieldPath(fieldPath, "searchQueries")),
285
+ terms: validateQueryTerms(ctx, requiredField(ctx, obj, "terms", joinFieldPath(fieldPath, "terms")), joinFieldPath(fieldPath, "terms"))
286
+ };
287
+ }
288
+ function validateCandidateFile(ctx, value, fieldPath) {
289
+ const obj = requiredObject(ctx, value, fieldPath);
290
+ const result = {
291
+ path: requiredString(ctx, requiredField(ctx, obj, "path", joinFieldPath(fieldPath, "path")), joinFieldPath(fieldPath, "path")),
292
+ score: requiredNumber(ctx, requiredField(ctx, obj, "score", joinFieldPath(fieldPath, "score")), joinFieldPath(fieldPath, "score")),
293
+ reasons: requiredStringArray(ctx, requiredField(ctx, obj, "reasons", joinFieldPath(fieldPath, "reasons")), joinFieldPath(fieldPath, "reasons")),
294
+ matchedTerms: requiredStringArray(ctx, requiredField(ctx, obj, "matchedTerms", joinFieldPath(fieldPath, "matchedTerms")), joinFieldPath(fieldPath, "matchedTerms")),
295
+ retained: requiredBoolean(ctx, requiredField(ctx, obj, "retained", joinFieldPath(fieldPath, "retained")), joinFieldPath(fieldPath, "retained"))
296
+ };
297
+ if (optionalField(obj, "baseScore") !== undefined)
298
+ result.baseScore = optionalNumber(ctx, obj.baseScore, joinFieldPath(fieldPath, "baseScore"));
299
+ if (optionalField(obj, "modeAdjustment") !== undefined)
300
+ result.modeAdjustment = optionalNumber(ctx, obj.modeAdjustment, joinFieldPath(fieldPath, "modeAdjustment"));
301
+ if (optionalField(obj, "semanticRoles") !== undefined) {
302
+ result.semanticRoles = requiredArray(ctx, obj.semanticRoles, joinFieldPath(fieldPath, "semanticRoles")).map((item, i) => validateSemanticRole(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "semanticRoles"), i)));
303
+ }
304
+ if (optionalField(obj, "artifactRefs") !== undefined) {
305
+ result.artifactRefs = requiredArray(ctx, obj.artifactRefs, joinFieldPath(fieldPath, "artifactRefs")).map((item, i) => validateSemanticArtifactRef(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "artifactRefs"), i)));
306
+ }
307
+ if (optionalField(obj, "classificationRoles") !== undefined) {
308
+ result.classificationRoles = requiredArray(ctx, obj.classificationRoles, joinFieldPath(fieldPath, "classificationRoles")).map((item, i) => validateClassificationRoleRef(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "classificationRoles"), i)));
309
+ }
310
+ if (optionalField(obj, "classificationRefs") !== undefined) {
311
+ result.classificationRefs = requiredArray(ctx, obj.classificationRefs, joinFieldPath(fieldPath, "classificationRefs")).map((item, i) => validateSemanticArtifactRef(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "classificationRefs"), i)));
312
+ }
313
+ if (optionalField(obj, "droppedReason") !== undefined)
314
+ result.droppedReason = optionalString(ctx, obj.droppedReason, joinFieldPath(fieldPath, "droppedReason"));
315
+ if (optionalField(obj, "roleScoreAdjustment") !== undefined)
316
+ result.roleScoreAdjustment = optionalNumber(ctx, obj.roleScoreAdjustment, joinFieldPath(fieldPath, "roleScoreAdjustment"));
317
+ if (optionalField(obj, "contextRole") !== undefined)
318
+ result.contextRole = optionalLiteral(ctx, obj.contextRole, joinFieldPath(fieldPath, "contextRole"), CONTEXT_ROLES);
319
+ if (optionalField(obj, "focusMatch") !== undefined)
320
+ result.focusMatch = optionalBoolean(ctx, obj.focusMatch, joinFieldPath(fieldPath, "focusMatch"));
321
+ if (optionalField(obj, "changedSurfaceMatch") !== undefined)
322
+ result.changedSurfaceMatch = optionalBoolean(ctx, obj.changedSurfaceMatch, joinFieldPath(fieldPath, "changedSurfaceMatch"));
323
+ if (optionalField(obj, "changedStatus") !== undefined)
324
+ result.changedStatus = optionalLiteral(ctx, obj.changedStatus, joinFieldPath(fieldPath, "changedStatus"), CHANGED_SURFACE_STATUSES);
325
+ return result;
326
+ }
327
+ function validateCandidateNode(ctx, value, fieldPath) {
328
+ const obj = requiredObject(ctx, value, fieldPath);
329
+ const result = {
330
+ nodeId: requiredString(ctx, requiredField(ctx, obj, "nodeId", joinFieldPath(fieldPath, "nodeId")), joinFieldPath(fieldPath, "nodeId")),
331
+ kind: requiredString(ctx, requiredField(ctx, obj, "kind", joinFieldPath(fieldPath, "kind")), joinFieldPath(fieldPath, "kind")),
332
+ label: requiredString(ctx, requiredField(ctx, obj, "label", joinFieldPath(fieldPath, "label")), joinFieldPath(fieldPath, "label")),
333
+ score: requiredNumber(ctx, requiredField(ctx, obj, "score", joinFieldPath(fieldPath, "score")), joinFieldPath(fieldPath, "score")),
334
+ reasons: requiredStringArray(ctx, requiredField(ctx, obj, "reasons", joinFieldPath(fieldPath, "reasons")), joinFieldPath(fieldPath, "reasons")),
335
+ matchedTerms: requiredStringArray(ctx, requiredField(ctx, obj, "matchedTerms", joinFieldPath(fieldPath, "matchedTerms")), joinFieldPath(fieldPath, "matchedTerms")),
336
+ retained: requiredBoolean(ctx, requiredField(ctx, obj, "retained", joinFieldPath(fieldPath, "retained")), joinFieldPath(fieldPath, "retained"))
337
+ };
338
+ if (optionalField(obj, "filePath") !== undefined)
339
+ result.filePath = optionalString(ctx, obj.filePath, joinFieldPath(fieldPath, "filePath"));
340
+ if (optionalField(obj, "baseScore") !== undefined)
341
+ result.baseScore = optionalNumber(ctx, obj.baseScore, joinFieldPath(fieldPath, "baseScore"));
342
+ if (optionalField(obj, "modeAdjustment") !== undefined)
343
+ result.modeAdjustment = optionalNumber(ctx, obj.modeAdjustment, joinFieldPath(fieldPath, "modeAdjustment"));
344
+ if (optionalField(obj, "semanticRoles") !== undefined) {
345
+ result.semanticRoles = requiredArray(ctx, obj.semanticRoles, joinFieldPath(fieldPath, "semanticRoles")).map((item, i) => validateSemanticRole(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "semanticRoles"), i)));
346
+ }
347
+ if (optionalField(obj, "artifactRefs") !== undefined) {
348
+ result.artifactRefs = requiredArray(ctx, obj.artifactRefs, joinFieldPath(fieldPath, "artifactRefs")).map((item, i) => validateSemanticArtifactRef(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "artifactRefs"), i)));
349
+ }
350
+ if (optionalField(obj, "classificationRoles") !== undefined) {
351
+ result.classificationRoles = requiredArray(ctx, obj.classificationRoles, joinFieldPath(fieldPath, "classificationRoles")).map((item, i) => validateClassificationRoleRef(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "classificationRoles"), i)));
352
+ }
353
+ if (optionalField(obj, "classificationRefs") !== undefined) {
354
+ result.classificationRefs = requiredArray(ctx, obj.classificationRefs, joinFieldPath(fieldPath, "classificationRefs")).map((item, i) => validateSemanticArtifactRef(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "classificationRefs"), i)));
355
+ }
356
+ if (optionalField(obj, "androidArtifactId") !== undefined)
357
+ result.androidArtifactId = optionalString(ctx, obj.androidArtifactId, joinFieldPath(fieldPath, "androidArtifactId"));
358
+ if (optionalField(obj, "androidMetadata") !== undefined) {
359
+ const recordObj = requiredRecord(ctx, obj.androidMetadata, joinFieldPath(fieldPath, "androidMetadata"));
360
+ const record = {};
361
+ for (const [key, val] of Object.entries(recordObj)) {
362
+ record[key] = requiredScalarLike(ctx, val, joinFieldPath(joinFieldPath(fieldPath, "androidMetadata"), key));
363
+ }
364
+ result.androidMetadata = record;
365
+ }
366
+ if (optionalField(obj, "droppedReason") !== undefined)
367
+ result.droppedReason = optionalString(ctx, obj.droppedReason, joinFieldPath(fieldPath, "droppedReason"));
368
+ if (optionalField(obj, "roleScoreAdjustment") !== undefined)
369
+ result.roleScoreAdjustment = optionalNumber(ctx, obj.roleScoreAdjustment, joinFieldPath(fieldPath, "roleScoreAdjustment"));
370
+ if (optionalField(obj, "contextRole") !== undefined)
371
+ result.contextRole = optionalLiteral(ctx, obj.contextRole, joinFieldPath(fieldPath, "contextRole"), CONTEXT_ROLES);
372
+ if (optionalField(obj, "focusMatch") !== undefined)
373
+ result.focusMatch = optionalBoolean(ctx, obj.focusMatch, joinFieldPath(fieldPath, "focusMatch"));
374
+ if (optionalField(obj, "changedSurfaceMatch") !== undefined)
375
+ result.changedSurfaceMatch = optionalBoolean(ctx, obj.changedSurfaceMatch, joinFieldPath(fieldPath, "changedSurfaceMatch"));
376
+ if (optionalField(obj, "changedStatus") !== undefined)
377
+ result.changedStatus = optionalLiteral(ctx, obj.changedStatus, joinFieldPath(fieldPath, "changedStatus"), CHANGED_SURFACE_STATUSES);
378
+ if (optionalField(obj, "synthesized") !== undefined)
379
+ result.synthesized = optionalBoolean(ctx, obj.synthesized, joinFieldPath(fieldPath, "synthesized"));
380
+ return result;
381
+ }
382
+ function validateContextFocus(ctx, value, fieldPath) {
383
+ const obj = requiredObject(ctx, value, fieldPath);
384
+ return {
385
+ focusNodeId: requiredNullableString(ctx, requiredField(ctx, obj, "focusNodeId", joinFieldPath(fieldPath, "focusNodeId")), joinFieldPath(fieldPath, "focusNodeId")),
386
+ focusFilePath: requiredNullableString(ctx, requiredField(ctx, obj, "focusFilePath", joinFieldPath(fieldPath, "focusFilePath")), joinFieldPath(fieldPath, "focusFilePath")),
387
+ selectionMode: requiredLiteral(ctx, requiredField(ctx, obj, "selectionMode", joinFieldPath(fieldPath, "selectionMode")), joinFieldPath(fieldPath, "selectionMode"), FOCUS_SELECTION_MODES),
388
+ confidence: requiredLiteral(ctx, requiredField(ctx, obj, "confidence", joinFieldPath(fieldPath, "confidence")), joinFieldPath(fieldPath, "confidence"), FOCUS_CONFIDENCES),
389
+ reasons: requiredStringArray(ctx, requiredField(ctx, obj, "reasons", joinFieldPath(fieldPath, "reasons")), joinFieldPath(fieldPath, "reasons")),
390
+ ambiguityNotes: requiredStringArray(ctx, requiredField(ctx, obj, "ambiguityNotes", joinFieldPath(fieldPath, "ambiguityNotes")), joinFieldPath(fieldPath, "ambiguityNotes")),
391
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings"))
392
+ };
393
+ }
394
+ function validateSelectedGraphNode(ctx, value, fieldPath) {
395
+ const obj = requiredObject(ctx, value, fieldPath);
396
+ const result = {
397
+ nodeId: requiredString(ctx, requiredField(ctx, obj, "nodeId", joinFieldPath(fieldPath, "nodeId")), joinFieldPath(fieldPath, "nodeId")),
398
+ kind: requiredString(ctx, requiredField(ctx, obj, "kind", joinFieldPath(fieldPath, "kind")), joinFieldPath(fieldPath, "kind")),
399
+ label: requiredString(ctx, requiredField(ctx, obj, "label", joinFieldPath(fieldPath, "label")), joinFieldPath(fieldPath, "label")),
400
+ reasons: requiredStringArray(ctx, requiredField(ctx, obj, "reasons", joinFieldPath(fieldPath, "reasons")), joinFieldPath(fieldPath, "reasons"))
401
+ };
402
+ if (optionalField(obj, "filePath") !== undefined)
403
+ result.filePath = optionalString(ctx, obj.filePath, joinFieldPath(fieldPath, "filePath"));
404
+ return result;
405
+ }
406
+ function validateSelectedGraphEdge(ctx, value, fieldPath) {
407
+ const obj = requiredObject(ctx, value, fieldPath);
408
+ return {
409
+ from: requiredString(ctx, requiredField(ctx, obj, "from", joinFieldPath(fieldPath, "from")), joinFieldPath(fieldPath, "from")),
410
+ to: requiredString(ctx, requiredField(ctx, obj, "to", joinFieldPath(fieldPath, "to")), joinFieldPath(fieldPath, "to")),
411
+ kind: requiredString(ctx, requiredField(ctx, obj, "kind", joinFieldPath(fieldPath, "kind")), joinFieldPath(fieldPath, "kind")),
412
+ reasons: requiredStringArray(ctx, requiredField(ctx, obj, "reasons", joinFieldPath(fieldPath, "reasons")), joinFieldPath(fieldPath, "reasons"))
413
+ };
414
+ }
415
+ function validateSelectedGraph(ctx, value, fieldPath) {
416
+ const obj = requiredObject(ctx, value, fieldPath);
417
+ return {
418
+ nodes: requiredArray(ctx, requiredField(ctx, obj, "nodes", joinFieldPath(fieldPath, "nodes")), joinFieldPath(fieldPath, "nodes")).map((item, i) => validateSelectedGraphNode(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "nodes"), i))),
419
+ edges: requiredArray(ctx, requiredField(ctx, obj, "edges", joinFieldPath(fieldPath, "edges")), joinFieldPath(fieldPath, "edges")).map((item, i) => validateSelectedGraphEdge(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "edges"), i))),
420
+ omittedNodeCount: requiredNonnegativeInteger(ctx, requiredField(ctx, obj, "omittedNodeCount", joinFieldPath(fieldPath, "omittedNodeCount")), joinFieldPath(fieldPath, "omittedNodeCount")),
421
+ omittedEdgeCount: requiredNonnegativeInteger(ctx, requiredField(ctx, obj, "omittedEdgeCount", joinFieldPath(fieldPath, "omittedEdgeCount")), joinFieldPath(fieldPath, "omittedEdgeCount")),
422
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings"))
423
+ };
424
+ }
425
+ function validateRetentionCapSettings(ctx, value, fieldPath) {
426
+ const obj = requiredObject(ctx, value, fieldPath);
427
+ return {
428
+ maxCandidateFiles: requiredNullableNumber(ctx, requiredField(ctx, obj, "maxCandidateFiles", joinFieldPath(fieldPath, "maxCandidateFiles")), joinFieldPath(fieldPath, "maxCandidateFiles")),
429
+ maxGraphNodes: requiredNullableNumber(ctx, requiredField(ctx, obj, "maxGraphNodes", joinFieldPath(fieldPath, "maxGraphNodes")), joinFieldPath(fieldPath, "maxGraphNodes")),
430
+ maxGraphEdges: requiredNullableNumber(ctx, requiredField(ctx, obj, "maxGraphEdges", joinFieldPath(fieldPath, "maxGraphEdges")), joinFieldPath(fieldPath, "maxGraphEdges"))
431
+ };
432
+ }
433
+ function validateRetentionSummary(ctx, value, fieldPath) {
434
+ const obj = requiredObject(ctx, value, fieldPath);
435
+ const reqInt = (key) => requiredNonnegativeInteger(ctx, requiredField(ctx, obj, key, joinFieldPath(fieldPath, key)), joinFieldPath(fieldPath, key));
436
+ return {
437
+ retainedCandidateCount: reqInt("retainedCandidateCount"),
438
+ droppedCandidateCount: reqInt("droppedCandidateCount"),
439
+ retainedGraphNodeCount: reqInt("retainedGraphNodeCount"),
440
+ droppedGraphNodeCount: reqInt("droppedGraphNodeCount"),
441
+ retainedGraphEdgeCount: reqInt("retainedGraphEdgeCount"),
442
+ droppedGraphEdgeCount: reqInt("droppedGraphEdgeCount"),
443
+ capSettings: validateRetentionCapSettings(ctx, requiredField(ctx, obj, "capSettings", joinFieldPath(fieldPath, "capSettings")), joinFieldPath(fieldPath, "capSettings"))
444
+ };
445
+ }
446
+ function validateSelectedSourceSlice(ctx, value, fieldPath) {
447
+ const obj = requiredObject(ctx, value, fieldPath);
448
+ const result = {
449
+ id: requiredString(ctx, requiredField(ctx, obj, "id", joinFieldPath(fieldPath, "id")), joinFieldPath(fieldPath, "id")),
450
+ kind: requiredString(ctx, requiredField(ctx, obj, "kind", joinFieldPath(fieldPath, "kind")), joinFieldPath(fieldPath, "kind")),
451
+ filePath: requiredString(ctx, requiredField(ctx, obj, "filePath", joinFieldPath(fieldPath, "filePath")), joinFieldPath(fieldPath, "filePath")),
452
+ startLine: requiredNumber(ctx, requiredField(ctx, obj, "startLine", joinFieldPath(fieldPath, "startLine")), joinFieldPath(fieldPath, "startLine")),
453
+ endLine: requiredNumber(ctx, requiredField(ctx, obj, "endLine", joinFieldPath(fieldPath, "endLine")), joinFieldPath(fieldPath, "endLine")),
454
+ reason: requiredString(ctx, requiredField(ctx, obj, "reason", joinFieldPath(fieldPath, "reason")), joinFieldPath(fieldPath, "reason")),
455
+ sourceRetrievalMethod: requiredLiteral(ctx, requiredField(ctx, obj, "sourceRetrievalMethod", joinFieldPath(fieldPath, "sourceRetrievalMethod")), joinFieldPath(fieldPath, "sourceRetrievalMethod"), SOURCE_RETRIEVAL_METHODS),
456
+ includedBy: requiredLiteral(ctx, requiredField(ctx, obj, "includedBy", joinFieldPath(fieldPath, "includedBy")), joinFieldPath(fieldPath, "includedBy"), SOURCE_INCLUDED_BY),
457
+ truncated: requiredBoolean(ctx, requiredField(ctx, obj, "truncated", joinFieldPath(fieldPath, "truncated")), joinFieldPath(fieldPath, "truncated")),
458
+ continuationUsed: requiredBoolean(ctx, requiredField(ctx, obj, "continuationUsed", joinFieldPath(fieldPath, "continuationUsed")), joinFieldPath(fieldPath, "continuationUsed")),
459
+ localExpansionUsed: requiredBoolean(ctx, requiredField(ctx, obj, "localExpansionUsed", joinFieldPath(fieldPath, "localExpansionUsed")), joinFieldPath(fieldPath, "localExpansionUsed")),
460
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings"))
461
+ };
462
+ if (optionalField(obj, "nodeId") !== undefined)
463
+ result.nodeId = optionalString(ctx, obj.nodeId, joinFieldPath(fieldPath, "nodeId"));
464
+ if (optionalField(obj, "symbolName") !== undefined)
465
+ result.symbolName = optionalNullableString(ctx, obj.symbolName, joinFieldPath(fieldPath, "symbolName"));
466
+ if (optionalField(obj, "continuationAvailable") !== undefined)
467
+ result.continuationAvailable = optionalBoolean(ctx, obj.continuationAvailable, joinFieldPath(fieldPath, "continuationAvailable"));
468
+ if (optionalField(obj, "classificationRefs") !== undefined) {
469
+ result.classificationRefs = requiredArray(ctx, obj.classificationRefs, joinFieldPath(fieldPath, "classificationRefs")).map((item, i) => validateSemanticArtifactRef(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "classificationRefs"), i)));
470
+ }
471
+ if (optionalField(obj, "semanticRefs") !== undefined) {
472
+ result.semanticRefs = requiredArray(ctx, obj.semanticRefs, joinFieldPath(fieldPath, "semanticRefs")).map((item, i) => validateSemanticArtifactRef(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "semanticRefs"), i)));
473
+ }
474
+ return result;
475
+ }
476
+ function validateSkippedSourceEntry(ctx, value, fieldPath) {
477
+ const obj = requiredObject(ctx, value, fieldPath);
478
+ const result = {
479
+ id: requiredString(ctx, requiredField(ctx, obj, "id", joinFieldPath(fieldPath, "id")), joinFieldPath(fieldPath, "id")),
480
+ kind: requiredString(ctx, requiredField(ctx, obj, "kind", joinFieldPath(fieldPath, "kind")), joinFieldPath(fieldPath, "kind")),
481
+ reason: requiredString(ctx, requiredField(ctx, obj, "reason", joinFieldPath(fieldPath, "reason")), joinFieldPath(fieldPath, "reason"))
482
+ };
483
+ if (optionalField(obj, "filePath") !== undefined)
484
+ result.filePath = optionalString(ctx, obj.filePath, joinFieldPath(fieldPath, "filePath"));
485
+ if (optionalField(obj, "capType") !== undefined)
486
+ result.capType = optionalString(ctx, obj.capType, joinFieldPath(fieldPath, "capType"));
487
+ if (optionalField(obj, "candidateScore") !== undefined)
488
+ result.candidateScore = optionalNumber(ctx, obj.candidateScore, joinFieldPath(fieldPath, "candidateScore"));
489
+ return result;
490
+ }
491
+ function validateSelectedSource(ctx, value, fieldPath) {
492
+ const obj = requiredObject(ctx, value, fieldPath);
493
+ return {
494
+ slices: requiredArray(ctx, requiredField(ctx, obj, "slices", joinFieldPath(fieldPath, "slices")), joinFieldPath(fieldPath, "slices")).map((item, i) => validateSelectedSourceSlice(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "slices"), i))),
495
+ omittedSliceCount: requiredNonnegativeInteger(ctx, requiredField(ctx, obj, "omittedSliceCount", joinFieldPath(fieldPath, "omittedSliceCount")), joinFieldPath(fieldPath, "omittedSliceCount")),
496
+ totalSelectedLines: requiredNonnegativeInteger(ctx, requiredField(ctx, obj, "totalSelectedLines", joinFieldPath(fieldPath, "totalSelectedLines")), joinFieldPath(fieldPath, "totalSelectedLines")),
497
+ maxSourceSlices: requiredNonnegativeInteger(ctx, requiredField(ctx, obj, "maxSourceSlices", joinFieldPath(fieldPath, "maxSourceSlices")), joinFieldPath(fieldPath, "maxSourceSlices")),
498
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings")),
499
+ skipped: requiredArray(ctx, requiredField(ctx, obj, "skipped", joinFieldPath(fieldPath, "skipped")), joinFieldPath(fieldPath, "skipped")).map((item, i) => validateSkippedSourceEntry(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "skipped"), i)))
500
+ };
501
+ }
502
+ function validateSelectedSourceBundleBlock(ctx, value, fieldPath) {
503
+ const obj = requiredObject(ctx, value, fieldPath);
504
+ const result = {
505
+ id: requiredString(ctx, requiredField(ctx, obj, "id", joinFieldPath(fieldPath, "id")), joinFieldPath(fieldPath, "id")),
506
+ kind: requiredString(ctx, requiredField(ctx, obj, "kind", joinFieldPath(fieldPath, "kind")), joinFieldPath(fieldPath, "kind")),
507
+ filePath: requiredString(ctx, requiredField(ctx, obj, "filePath", joinFieldPath(fieldPath, "filePath")), joinFieldPath(fieldPath, "filePath")),
508
+ startLine: requiredNumber(ctx, requiredField(ctx, obj, "startLine", joinFieldPath(fieldPath, "startLine")), joinFieldPath(fieldPath, "startLine")),
509
+ endLine: requiredNumber(ctx, requiredField(ctx, obj, "endLine", joinFieldPath(fieldPath, "endLine")), joinFieldPath(fieldPath, "endLine")),
510
+ reason: requiredString(ctx, requiredField(ctx, obj, "reason", joinFieldPath(fieldPath, "reason")), joinFieldPath(fieldPath, "reason")),
511
+ includedBy: requiredString(ctx, requiredField(ctx, obj, "includedBy", joinFieldPath(fieldPath, "includedBy")), joinFieldPath(fieldPath, "includedBy")),
512
+ truncated: requiredBoolean(ctx, requiredField(ctx, obj, "truncated", joinFieldPath(fieldPath, "truncated")), joinFieldPath(fieldPath, "truncated")),
513
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings"))
514
+ };
515
+ if (optionalField(obj, "symbolName") !== undefined)
516
+ result.symbolName = optionalNullableString(ctx, obj.symbolName, joinFieldPath(fieldPath, "symbolName"));
517
+ return result;
518
+ }
519
+ function validateSelectedSourceBundleSkippedBlock(ctx, value, fieldPath) {
520
+ const obj = requiredObject(ctx, value, fieldPath);
521
+ const result = {
522
+ id: requiredString(ctx, requiredField(ctx, obj, "id", joinFieldPath(fieldPath, "id")), joinFieldPath(fieldPath, "id")),
523
+ kind: requiredString(ctx, requiredField(ctx, obj, "kind", joinFieldPath(fieldPath, "kind")), joinFieldPath(fieldPath, "kind")),
524
+ reason: requiredString(ctx, requiredField(ctx, obj, "reason", joinFieldPath(fieldPath, "reason")), joinFieldPath(fieldPath, "reason"))
525
+ };
526
+ if (optionalField(obj, "filePath") !== undefined)
527
+ result.filePath = optionalString(ctx, obj.filePath, joinFieldPath(fieldPath, "filePath"));
528
+ if (optionalField(obj, "capType") !== undefined)
529
+ result.capType = optionalString(ctx, obj.capType, joinFieldPath(fieldPath, "capType"));
530
+ if (optionalField(obj, "candidateScore") !== undefined)
531
+ result.candidateScore = optionalNumber(ctx, obj.candidateScore, joinFieldPath(fieldPath, "candidateScore"));
532
+ return result;
533
+ }
534
+ function validateSelectedSourceBundle(ctx, value, fieldPath) {
535
+ const obj = requiredObject(ctx, value, fieldPath);
536
+ const result = {
537
+ id: requiredString(ctx, requiredField(ctx, obj, "id", joinFieldPath(fieldPath, "id")), joinFieldPath(fieldPath, "id")),
538
+ title: requiredString(ctx, requiredField(ctx, obj, "title", joinFieldPath(fieldPath, "title")), joinFieldPath(fieldPath, "title")),
539
+ focusFilePath: requiredNullableString(ctx, requiredField(ctx, obj, "focusFilePath", joinFieldPath(fieldPath, "focusFilePath")), joinFieldPath(fieldPath, "focusFilePath")),
540
+ reason: requiredString(ctx, requiredField(ctx, obj, "reason", joinFieldPath(fieldPath, "reason")), joinFieldPath(fieldPath, "reason")),
541
+ blocks: requiredArray(ctx, requiredField(ctx, obj, "blocks", joinFieldPath(fieldPath, "blocks")), joinFieldPath(fieldPath, "blocks")).map((item, i) => validateSelectedSourceBundleBlock(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "blocks"), i))),
542
+ totalLines: requiredNumber(ctx, requiredField(ctx, obj, "totalLines", joinFieldPath(fieldPath, "totalLines")), joinFieldPath(fieldPath, "totalLines")),
543
+ maxLines: requiredNumber(ctx, requiredField(ctx, obj, "maxLines", joinFieldPath(fieldPath, "maxLines")), joinFieldPath(fieldPath, "maxLines")),
544
+ skippedBlocks: requiredArray(ctx, requiredField(ctx, obj, "skippedBlocks", joinFieldPath(fieldPath, "skippedBlocks")), joinFieldPath(fieldPath, "skippedBlocks")).map((item, i) => validateSelectedSourceBundleSkippedBlock(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "skippedBlocks"), i))),
545
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings"))
546
+ };
547
+ if (optionalField(obj, "focusNodeId") !== undefined)
548
+ result.focusNodeId = optionalString(ctx, obj.focusNodeId, joinFieldPath(fieldPath, "focusNodeId"));
549
+ return result;
550
+ }
551
+ function validateSelectedSourceBundles(ctx, value, fieldPath) {
552
+ const obj = requiredObject(ctx, value, fieldPath);
553
+ return {
554
+ bundles: requiredArray(ctx, requiredField(ctx, obj, "bundles", joinFieldPath(fieldPath, "bundles")), joinFieldPath(fieldPath, "bundles")).map((item, i) => validateSelectedSourceBundle(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "bundles"), i))),
555
+ omittedBundleCount: requiredNonnegativeInteger(ctx, requiredField(ctx, obj, "omittedBundleCount", joinFieldPath(fieldPath, "omittedBundleCount")), joinFieldPath(fieldPath, "omittedBundleCount")),
556
+ totalSelectedLines: requiredNonnegativeInteger(ctx, requiredField(ctx, obj, "totalSelectedLines", joinFieldPath(fieldPath, "totalSelectedLines")), joinFieldPath(fieldPath, "totalSelectedLines")),
557
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings"))
558
+ };
559
+ }
560
+ function validateSemanticSummaryEntry(ctx, value, fieldPath) {
561
+ const obj = requiredObject(ctx, value, fieldPath);
562
+ return {
563
+ roles: requiredArray(ctx, requiredField(ctx, obj, "roles", joinFieldPath(fieldPath, "roles")), joinFieldPath(fieldPath, "roles")).map((item, i) => validateSemanticRole(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "roles"), i))),
564
+ artifactRefs: requiredArray(ctx, requiredField(ctx, obj, "artifactRefs", joinFieldPath(fieldPath, "artifactRefs")), joinFieldPath(fieldPath, "artifactRefs")).map((item, i) => validateSemanticArtifactRef(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "artifactRefs"), i))),
565
+ evidenceRefs: requiredArray(ctx, requiredField(ctx, obj, "evidenceRefs", joinFieldPath(fieldPath, "evidenceRefs")), joinFieldPath(fieldPath, "evidenceRefs")).map((item, i) => validateSemanticEvidenceRef(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "evidenceRefs"), i)))
566
+ };
567
+ }
568
+ function validateRecordOf(ctx, value, fieldPath, elementValidator) {
569
+ const obj = requiredRecord(ctx, value, fieldPath);
570
+ const result = {};
571
+ for (const [key, val] of Object.entries(obj)) {
572
+ result[key] = elementValidator(ctx, val, joinFieldPath(fieldPath, key));
573
+ }
574
+ return result;
575
+ }
576
+ function validateSemanticSummary(ctx, value, fieldPath) {
577
+ const obj = requiredObject(ctx, value, fieldPath);
578
+ return {
579
+ available: requiredBoolean(ctx, requiredField(ctx, obj, "available", joinFieldPath(fieldPath, "available")), joinFieldPath(fieldPath, "available")),
580
+ roles: requiredArray(ctx, requiredField(ctx, obj, "roles", joinFieldPath(fieldPath, "roles")), joinFieldPath(fieldPath, "roles")).map((item, i) => validateSemanticRole(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "roles"), i))),
581
+ artifactRefs: requiredArray(ctx, requiredField(ctx, obj, "artifactRefs", joinFieldPath(fieldPath, "artifactRefs")), joinFieldPath(fieldPath, "artifactRefs")).map((item, i) => validateSemanticArtifactRef(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "artifactRefs"), i))),
582
+ evidenceRefs: requiredArray(ctx, requiredField(ctx, obj, "evidenceRefs", joinFieldPath(fieldPath, "evidenceRefs")), joinFieldPath(fieldPath, "evidenceRefs")).map((item, i) => validateSemanticEvidenceRef(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "evidenceRefs"), i))),
583
+ summariesByNode: validateRecordOf(ctx, requiredField(ctx, obj, "summariesByNode", joinFieldPath(fieldPath, "summariesByNode")), joinFieldPath(fieldPath, "summariesByNode"), validateSemanticSummaryEntry),
584
+ summariesByFile: validateRecordOf(ctx, requiredField(ctx, obj, "summariesByFile", joinFieldPath(fieldPath, "summariesByFile")), joinFieldPath(fieldPath, "summariesByFile"), validateSemanticSummaryEntry),
585
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings"))
586
+ };
587
+ }
588
+ function validateClassificationSummaryEntry(ctx, value, fieldPath) {
589
+ const obj = requiredObject(ctx, value, fieldPath);
590
+ return {
591
+ classifications: requiredArray(ctx, requiredField(ctx, obj, "classifications", joinFieldPath(fieldPath, "classifications")), joinFieldPath(fieldPath, "classifications")).map((item, i) => validateClassificationRole(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "classifications"), i))),
592
+ editGuidance: requiredLiteral(ctx, requiredField(ctx, obj, "editGuidance", joinFieldPath(fieldPath, "editGuidance")), joinFieldPath(fieldPath, "editGuidance"), EDIT_GUIDANCES),
593
+ readiness: requiredLiteral(ctx, requiredField(ctx, obj, "readiness", joinFieldPath(fieldPath, "readiness")), joinFieldPath(fieldPath, "readiness"), READINESSES),
594
+ risks: requiredArray(ctx, requiredField(ctx, obj, "risks", joinFieldPath(fieldPath, "risks")), joinFieldPath(fieldPath, "risks")).map((item, i) => requiredLiteral(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "risks"), i), RISK_LABELS)),
595
+ uncertainty: requiredLiteral(ctx, requiredField(ctx, obj, "uncertainty", joinFieldPath(fieldPath, "uncertainty")), joinFieldPath(fieldPath, "uncertainty"), UNCERTAINTY_TIERS),
596
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings"))
597
+ };
598
+ }
599
+ function validateClassificationSummary(ctx, value, fieldPath) {
600
+ const obj = requiredObject(ctx, value, fieldPath);
601
+ return {
602
+ available: requiredBoolean(ctx, requiredField(ctx, obj, "available", joinFieldPath(fieldPath, "available")), joinFieldPath(fieldPath, "available")),
603
+ classificationArtifactPath: requiredNullableString(ctx, requiredField(ctx, obj, "classificationArtifactPath", joinFieldPath(fieldPath, "classificationArtifactPath")), joinFieldPath(fieldPath, "classificationArtifactPath")),
604
+ roles: requiredArray(ctx, requiredField(ctx, obj, "roles", joinFieldPath(fieldPath, "roles")), joinFieldPath(fieldPath, "roles")).map((item, i) => validateClassificationRole(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "roles"), i))),
605
+ refs: requiredArray(ctx, requiredField(ctx, obj, "refs", joinFieldPath(fieldPath, "refs")), joinFieldPath(fieldPath, "refs")).map((item, i) => validateSemanticEvidenceRef(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "refs"), i))),
606
+ editGuidance: requiredArray(ctx, requiredField(ctx, obj, "editGuidance", joinFieldPath(fieldPath, "editGuidance")), joinFieldPath(fieldPath, "editGuidance")).map((item, i) => requiredLiteral(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "editGuidance"), i), EDIT_GUIDANCES)),
607
+ readiness: requiredArray(ctx, requiredField(ctx, obj, "readiness", joinFieldPath(fieldPath, "readiness")), joinFieldPath(fieldPath, "readiness")).map((item, i) => requiredLiteral(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "readiness"), i), READINESSES)),
608
+ riskLabels: requiredArray(ctx, requiredField(ctx, obj, "riskLabels", joinFieldPath(fieldPath, "riskLabels")), joinFieldPath(fieldPath, "riskLabels")).map((item, i) => requiredLiteral(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "riskLabels"), i), RISK_LABELS)),
609
+ uncertainty: requiredArray(ctx, requiredField(ctx, obj, "uncertainty", joinFieldPath(fieldPath, "uncertainty")), joinFieldPath(fieldPath, "uncertainty")).map((item, i) => requiredLiteral(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "uncertainty"), i), UNCERTAINTY_TIERS)),
610
+ summariesByNode: validateRecordOf(ctx, requiredField(ctx, obj, "summariesByNode", joinFieldPath(fieldPath, "summariesByNode")), joinFieldPath(fieldPath, "summariesByNode"), validateClassificationSummaryEntry),
611
+ summariesByFile: validateRecordOf(ctx, requiredField(ctx, obj, "summariesByFile", joinFieldPath(fieldPath, "summariesByFile")), joinFieldPath(fieldPath, "summariesByFile"), validateClassificationSummaryEntry),
612
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings"))
613
+ };
614
+ }
615
+ function validateArtifactReferenceSummaryEntry(ctx, value, fieldPath) {
616
+ const obj = requiredObject(ctx, value, fieldPath);
617
+ return {
618
+ artifactKind: requiredString(ctx, requiredField(ctx, obj, "artifactKind", joinFieldPath(fieldPath, "artifactKind")), joinFieldPath(fieldPath, "artifactKind")),
619
+ artifactPath: requiredNullableString(ctx, requiredField(ctx, obj, "artifactPath", joinFieldPath(fieldPath, "artifactPath")), joinFieldPath(fieldPath, "artifactPath")),
620
+ available: requiredBoolean(ctx, requiredField(ctx, obj, "available", joinFieldPath(fieldPath, "available")), joinFieldPath(fieldPath, "available")),
621
+ reason: requiredString(ctx, requiredField(ctx, obj, "reason", joinFieldPath(fieldPath, "reason")), joinFieldPath(fieldPath, "reason")),
622
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings"))
623
+ };
624
+ }
625
+ function validatePruningCounts(ctx, value, fieldPath) {
626
+ const obj = requiredObject(ctx, value, fieldPath);
627
+ const reqInt = (key) => requiredNonnegativeInteger(ctx, requiredField(ctx, obj, key, joinFieldPath(fieldPath, key)), joinFieldPath(fieldPath, key));
628
+ return {
629
+ candidateFiles: reqInt("candidateFiles"),
630
+ candidateNodes: reqInt("candidateNodes"),
631
+ graphNodes: reqInt("graphNodes"),
632
+ graphEdges: reqInt("graphEdges"),
633
+ sourceSlices: reqInt("sourceSlices"),
634
+ sourceBundles: reqInt("sourceBundles")
635
+ };
636
+ }
637
+ function validatePruningCapSettings(ctx, value, fieldPath) {
638
+ const obj = requiredObject(ctx, value, fieldPath);
639
+ return {
640
+ maxCandidateFiles: requiredNullableNumber(ctx, requiredField(ctx, obj, "maxCandidateFiles", joinFieldPath(fieldPath, "maxCandidateFiles")), joinFieldPath(fieldPath, "maxCandidateFiles")),
641
+ maxGraphNodes: requiredNullableNumber(ctx, requiredField(ctx, obj, "maxGraphNodes", joinFieldPath(fieldPath, "maxGraphNodes")), joinFieldPath(fieldPath, "maxGraphNodes")),
642
+ maxGraphEdges: requiredNullableNumber(ctx, requiredField(ctx, obj, "maxGraphEdges", joinFieldPath(fieldPath, "maxGraphEdges")), joinFieldPath(fieldPath, "maxGraphEdges")),
643
+ maxSourceSlices: requiredNumber(ctx, requiredField(ctx, obj, "maxSourceSlices", joinFieldPath(fieldPath, "maxSourceSlices")), joinFieldPath(fieldPath, "maxSourceSlices"))
644
+ };
645
+ }
646
+ function validatePruningSummary(ctx, value, fieldPath) {
647
+ const obj = requiredObject(ctx, value, fieldPath);
648
+ return {
649
+ policyVersion: requiredLiteral(ctx, requiredField(ctx, obj, "policyVersion", joinFieldPath(fieldPath, "policyVersion")), joinFieldPath(fieldPath, "policyVersion"), ["1.0.0"]),
650
+ retainedCounts: validatePruningCounts(ctx, requiredField(ctx, obj, "retainedCounts", joinFieldPath(fieldPath, "retainedCounts")), joinFieldPath(fieldPath, "retainedCounts")),
651
+ droppedCounts: validatePruningCounts(ctx, requiredField(ctx, obj, "droppedCounts", joinFieldPath(fieldPath, "droppedCounts")), joinFieldPath(fieldPath, "droppedCounts")),
652
+ capSettings: validatePruningCapSettings(ctx, requiredField(ctx, obj, "capSettings", joinFieldPath(fieldPath, "capSettings")), joinFieldPath(fieldPath, "capSettings")),
653
+ retainedReasons: requiredStringArray(ctx, requiredField(ctx, obj, "retainedReasons", joinFieldPath(fieldPath, "retainedReasons")), joinFieldPath(fieldPath, "retainedReasons")),
654
+ droppedReasons: requiredStringArray(ctx, requiredField(ctx, obj, "droppedReasons", joinFieldPath(fieldPath, "droppedReasons")), joinFieldPath(fieldPath, "droppedReasons")),
655
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings"))
656
+ };
657
+ }
658
+ function validateModeEffect(ctx, value, fieldPath) {
659
+ const obj = requiredObject(ctx, value, fieldPath);
660
+ return {
661
+ candidateId: requiredString(ctx, requiredField(ctx, obj, "candidateId", joinFieldPath(fieldPath, "candidateId")), joinFieldPath(fieldPath, "candidateId")),
662
+ adjustment: requiredNumber(ctx, requiredField(ctx, obj, "adjustment", joinFieldPath(fieldPath, "adjustment")), joinFieldPath(fieldPath, "adjustment")),
663
+ reasons: requiredStringArray(ctx, requiredField(ctx, obj, "reasons", joinFieldPath(fieldPath, "reasons")), joinFieldPath(fieldPath, "reasons"))
664
+ };
665
+ }
666
+ function validateModeEffects(ctx, value, fieldPath) {
667
+ const obj = requiredObject(ctx, value, fieldPath);
668
+ return {
669
+ mode: requiredLiteral(ctx, requiredField(ctx, obj, "mode", joinFieldPath(fieldPath, "mode")), joinFieldPath(fieldPath, "mode"), CONTEXT_CAPSULE_MODES),
670
+ applied: requiredBoolean(ctx, requiredField(ctx, obj, "applied", joinFieldPath(fieldPath, "applied")), joinFieldPath(fieldPath, "applied")),
671
+ effects: requiredArray(ctx, requiredField(ctx, obj, "effects", joinFieldPath(fieldPath, "effects")), joinFieldPath(fieldPath, "effects")).map((item, i) => validateModeEffect(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "effects"), i))),
672
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings"))
673
+ };
674
+ }
675
+ function validateSourceControl(ctx, value, fieldPath) {
676
+ const obj = requiredObject(ctx, value, fieldPath);
677
+ return {
678
+ enabled: requiredBoolean(ctx, requiredField(ctx, obj, "enabled", joinFieldPath(fieldPath, "enabled")), joinFieldPath(fieldPath, "enabled")),
679
+ reason: requiredString(ctx, requiredField(ctx, obj, "reason", joinFieldPath(fieldPath, "reason")), joinFieldPath(fieldPath, "reason"))
680
+ };
681
+ }
682
+ function validateContextConflictCandidate(ctx, value, fieldPath) {
683
+ const obj = requiredObject(ctx, value, fieldPath);
684
+ return {
685
+ nodeId: requiredString(ctx, requiredField(ctx, obj, "nodeId", joinFieldPath(fieldPath, "nodeId")), joinFieldPath(fieldPath, "nodeId")),
686
+ filePath: requiredNullableString(ctx, requiredField(ctx, obj, "filePath", joinFieldPath(fieldPath, "filePath")), joinFieldPath(fieldPath, "filePath")),
687
+ score: requiredNumber(ctx, requiredField(ctx, obj, "score", joinFieldPath(fieldPath, "score")), joinFieldPath(fieldPath, "score")),
688
+ editGuidance: requiredArray(ctx, requiredField(ctx, obj, "editGuidance", joinFieldPath(fieldPath, "editGuidance")), joinFieldPath(fieldPath, "editGuidance")).map((item, i) => requiredLiteral(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "editGuidance"), i), EDIT_GUIDANCES))
689
+ };
690
+ }
691
+ function validateContextConflict(ctx, value, fieldPath) {
692
+ const obj = requiredObject(ctx, value, fieldPath);
693
+ return {
694
+ id: requiredString(ctx, requiredField(ctx, obj, "id", joinFieldPath(fieldPath, "id")), joinFieldPath(fieldPath, "id")),
695
+ status: requiredLiteral(ctx, requiredField(ctx, obj, "status", joinFieldPath(fieldPath, "status")), joinFieldPath(fieldPath, "status"), [
696
+ "conflict"
697
+ ]),
698
+ reason: requiredString(ctx, requiredField(ctx, obj, "reason", joinFieldPath(fieldPath, "reason")), joinFieldPath(fieldPath, "reason")),
699
+ evidenceRefs: requiredStringArray(ctx, requiredField(ctx, obj, "evidenceRefs", joinFieldPath(fieldPath, "evidenceRefs")), joinFieldPath(fieldPath, "evidenceRefs")),
700
+ affectedFiles: requiredStringArray(ctx, requiredField(ctx, obj, "affectedFiles", joinFieldPath(fieldPath, "affectedFiles")), joinFieldPath(fieldPath, "affectedFiles")),
701
+ affectedNodes: requiredStringArray(ctx, requiredField(ctx, obj, "affectedNodes", joinFieldPath(fieldPath, "affectedNodes")), joinFieldPath(fieldPath, "affectedNodes")),
702
+ candidates: requiredArray(ctx, requiredField(ctx, obj, "candidates", joinFieldPath(fieldPath, "candidates")), joinFieldPath(fieldPath, "candidates")).map((item, i) => validateContextConflictCandidate(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "candidates"), i))),
703
+ recommendedNextAction: requiredString(ctx, requiredField(ctx, obj, "recommendedNextAction", joinFieldPath(fieldPath, "recommendedNextAction")), joinFieldPath(fieldPath, "recommendedNextAction"))
704
+ };
705
+ }
706
+ function validateContextConflictSummary(ctx, value, fieldPath) {
707
+ const obj = requiredObject(ctx, value, fieldPath);
708
+ return {
709
+ status: requiredLiteral(ctx, requiredField(ctx, obj, "status", joinFieldPath(fieldPath, "status")), joinFieldPath(fieldPath, "status"), [
710
+ "none",
711
+ "conflict"
712
+ ]),
713
+ conflicts: requiredArray(ctx, requiredField(ctx, obj, "conflicts", joinFieldPath(fieldPath, "conflicts")), joinFieldPath(fieldPath, "conflicts")).map((item, i) => validateContextConflict(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "conflicts"), i))),
714
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings"))
715
+ };
716
+ }
717
+ function validateFocusFileResolution(ctx, value, fieldPath) {
718
+ const obj = requiredObject(ctx, value, fieldPath);
719
+ return {
720
+ path: requiredString(ctx, requiredField(ctx, obj, "path", joinFieldPath(fieldPath, "path")), joinFieldPath(fieldPath, "path")),
721
+ resolved: requiredBoolean(ctx, requiredField(ctx, obj, "resolved", joinFieldPath(fieldPath, "resolved")), joinFieldPath(fieldPath, "resolved")),
722
+ matchedFilePaths: requiredStringArray(ctx, requiredField(ctx, obj, "matchedFilePaths", joinFieldPath(fieldPath, "matchedFilePaths")), joinFieldPath(fieldPath, "matchedFilePaths")),
723
+ containedSymbolIds: requiredStringArray(ctx, requiredField(ctx, obj, "containedSymbolIds", joinFieldPath(fieldPath, "containedSymbolIds")), joinFieldPath(fieldPath, "containedSymbolIds"))
724
+ };
725
+ }
726
+ function validateFocusSymbolResolution(ctx, value, fieldPath) {
727
+ const obj = requiredObject(ctx, value, fieldPath);
728
+ return {
729
+ symbol: requiredString(ctx, requiredField(ctx, obj, "symbol", joinFieldPath(fieldPath, "symbol")), joinFieldPath(fieldPath, "symbol")),
730
+ resolved: requiredBoolean(ctx, requiredField(ctx, obj, "resolved", joinFieldPath(fieldPath, "resolved")), joinFieldPath(fieldPath, "resolved")),
731
+ ambiguous: requiredBoolean(ctx, requiredField(ctx, obj, "ambiguous", joinFieldPath(fieldPath, "ambiguous")), joinFieldPath(fieldPath, "ambiguous")),
732
+ matchedNodeIds: requiredStringArray(ctx, requiredField(ctx, obj, "matchedNodeIds", joinFieldPath(fieldPath, "matchedNodeIds")), joinFieldPath(fieldPath, "matchedNodeIds"))
733
+ };
734
+ }
735
+ function validateContextFocusIntake(ctx, value, fieldPath) {
736
+ const obj = requiredObject(ctx, value, fieldPath);
737
+ return {
738
+ focusFiles: requiredArray(ctx, requiredField(ctx, obj, "focusFiles", joinFieldPath(fieldPath, "focusFiles")), joinFieldPath(fieldPath, "focusFiles")).map((item, i) => validateFocusFileResolution(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "focusFiles"), i))),
739
+ focusSymbols: requiredArray(ctx, requiredField(ctx, obj, "focusSymbols", joinFieldPath(fieldPath, "focusSymbols")), joinFieldPath(fieldPath, "focusSymbols")).map((item, i) => validateFocusSymbolResolution(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "focusSymbols"), i))),
740
+ unresolvedFocusFiles: requiredStringArray(ctx, requiredField(ctx, obj, "unresolvedFocusFiles", joinFieldPath(fieldPath, "unresolvedFocusFiles")), joinFieldPath(fieldPath, "unresolvedFocusFiles")),
741
+ unresolvedFocusSymbols: requiredStringArray(ctx, requiredField(ctx, obj, "unresolvedFocusSymbols", joinFieldPath(fieldPath, "unresolvedFocusSymbols")), joinFieldPath(fieldPath, "unresolvedFocusSymbols")),
742
+ ambiguousFocusSymbols: requiredStringArray(ctx, requiredField(ctx, obj, "ambiguousFocusSymbols", joinFieldPath(fieldPath, "ambiguousFocusSymbols")), joinFieldPath(fieldPath, "ambiguousFocusSymbols")),
743
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings"))
744
+ };
745
+ }
746
+ function validateChangedFileEntry(ctx, value, fieldPath) {
747
+ const obj = requiredObject(ctx, value, fieldPath);
748
+ return {
749
+ path: requiredString(ctx, requiredField(ctx, obj, "path", joinFieldPath(fieldPath, "path")), joinFieldPath(fieldPath, "path")),
750
+ status: requiredLiteral(ctx, requiredField(ctx, obj, "status", joinFieldPath(fieldPath, "status")), joinFieldPath(fieldPath, "status"), CHANGED_SURFACE_STATUSES),
751
+ provenance: requiredLiteral(ctx, requiredField(ctx, obj, "provenance", joinFieldPath(fieldPath, "provenance")), joinFieldPath(fieldPath, "provenance"), CHANGED_SURFACE_PROVENANCES)
752
+ };
753
+ }
754
+ function validateChangedSymbolEntry(ctx, value, fieldPath) {
755
+ const obj = requiredObject(ctx, value, fieldPath);
756
+ const result = {
757
+ symbolId: requiredString(ctx, requiredField(ctx, obj, "symbolId", joinFieldPath(fieldPath, "symbolId")), joinFieldPath(fieldPath, "symbolId")),
758
+ status: requiredLiteral(ctx, requiredField(ctx, obj, "status", joinFieldPath(fieldPath, "status")), joinFieldPath(fieldPath, "status"), CHANGED_SURFACE_STATUSES),
759
+ provenance: requiredLiteral(ctx, requiredField(ctx, obj, "provenance", joinFieldPath(fieldPath, "provenance")), joinFieldPath(fieldPath, "provenance"), CHANGED_SURFACE_PROVENANCES)
760
+ };
761
+ if (optionalField(obj, "filePath") !== undefined)
762
+ result.filePath = optionalString(ctx, obj.filePath, joinFieldPath(fieldPath, "filePath"));
763
+ if (optionalField(obj, "name") !== undefined)
764
+ result.name = optionalString(ctx, obj.name, joinFieldPath(fieldPath, "name"));
765
+ if (optionalField(obj, "kind") !== undefined)
766
+ result.kind = optionalString(ctx, obj.kind, joinFieldPath(fieldPath, "kind"));
767
+ return result;
768
+ }
769
+ function validateChangedSurface(ctx, value, fieldPath) {
770
+ const obj = requiredObject(ctx, value, fieldPath);
771
+ return {
772
+ available: requiredBoolean(ctx, requiredField(ctx, obj, "available", joinFieldPath(fieldPath, "available")), joinFieldPath(fieldPath, "available")),
773
+ diffRequested: requiredBoolean(ctx, requiredField(ctx, obj, "diffRequested", joinFieldPath(fieldPath, "diffRequested")), joinFieldPath(fieldPath, "diffRequested")),
774
+ files: requiredArray(ctx, requiredField(ctx, obj, "files", joinFieldPath(fieldPath, "files")), joinFieldPath(fieldPath, "files")).map((item, i) => validateChangedFileEntry(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "files"), i))),
775
+ symbols: requiredArray(ctx, requiredField(ctx, obj, "symbols", joinFieldPath(fieldPath, "symbols")), joinFieldPath(fieldPath, "symbols")).map((item, i) => validateChangedSymbolEntry(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "symbols"), i))),
776
+ conflicts: requiredStringArray(ctx, requiredField(ctx, obj, "conflicts", joinFieldPath(fieldPath, "conflicts")), joinFieldPath(fieldPath, "conflicts")),
777
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings"))
778
+ };
779
+ }
780
+ export function validateRoleContextSummary(ctx, value, fieldPath) {
781
+ const obj = requiredObject(ctx, value, fieldPath);
782
+ return {
783
+ role: validateContextRole(ctx, requiredField(ctx, obj, "role", joinFieldPath(fieldPath, "role")), joinFieldPath(fieldPath, "role")),
784
+ focus: validateContextFocusIntake(ctx, requiredField(ctx, obj, "focus", joinFieldPath(fieldPath, "focus")), joinFieldPath(fieldPath, "focus")),
785
+ changedSurface: validateChangedSurface(ctx, requiredField(ctx, obj, "changedSurface", joinFieldPath(fieldPath, "changedSurface")), joinFieldPath(fieldPath, "changedSurface")),
786
+ requestedEvidenceKinds: requiredArray(ctx, requiredField(ctx, obj, "requestedEvidenceKinds", joinFieldPath(fieldPath, "requestedEvidenceKinds")), joinFieldPath(fieldPath, "requestedEvidenceKinds")).map((item, i) => requiredLiteral(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "requestedEvidenceKinds"), i), REQUESTED_EVIDENCE_KINDS)),
787
+ unsupportedRequestedEvidenceKinds: requiredArray(ctx, requiredField(ctx, obj, "unsupportedRequestedEvidenceKinds", joinFieldPath(fieldPath, "unsupportedRequestedEvidenceKinds")), joinFieldPath(fieldPath, "unsupportedRequestedEvidenceKinds")).map((item, i) => requiredLiteral(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "unsupportedRequestedEvidenceKinds"), i), REQUESTED_EVIDENCE_KINDS)),
788
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings"))
789
+ };
790
+ }
791
+ function validateEvidenceItemSourceLocation(ctx, value, fieldPath) {
792
+ const obj = requiredObject(ctx, value, fieldPath);
793
+ const result = {
794
+ filePath: requiredString(ctx, requiredField(ctx, obj, "filePath", joinFieldPath(fieldPath, "filePath")), joinFieldPath(fieldPath, "filePath"))
795
+ };
796
+ if (optionalField(obj, "line") !== undefined)
797
+ result.line = optionalNumber(ctx, obj.line, joinFieldPath(fieldPath, "line"));
798
+ return result;
799
+ }
800
+ function validateEvidenceItemRef(ctx, value, fieldPath) {
801
+ const obj = requiredObject(ctx, value, fieldPath);
802
+ const result = {
803
+ id: requiredString(ctx, requiredField(ctx, obj, "id", joinFieldPath(fieldPath, "id")), joinFieldPath(fieldPath, "id")),
804
+ itemKind: requiredLiteral(ctx, requiredField(ctx, obj, "itemKind", joinFieldPath(fieldPath, "itemKind")), joinFieldPath(fieldPath, "itemKind"), EVIDENCE_ITEM_KINDS),
805
+ relationship: requiredString(ctx, requiredField(ctx, obj, "relationship", joinFieldPath(fieldPath, "relationship")), joinFieldPath(fieldPath, "relationship")),
806
+ basis: requiredString(ctx, requiredField(ctx, obj, "basis", joinFieldPath(fieldPath, "basis")), joinFieldPath(fieldPath, "basis")),
807
+ provenance: requiredString(ctx, requiredField(ctx, obj, "provenance", joinFieldPath(fieldPath, "provenance")), joinFieldPath(fieldPath, "provenance"))
808
+ };
809
+ if (optionalField(obj, "path") !== undefined)
810
+ result.path = optionalString(ctx, obj.path, joinFieldPath(fieldPath, "path"));
811
+ if (optionalField(obj, "symbolId") !== undefined)
812
+ result.symbolId = optionalString(ctx, obj.symbolId, joinFieldPath(fieldPath, "symbolId"));
813
+ if (optionalField(obj, "nodeId") !== undefined)
814
+ result.nodeId = optionalString(ctx, obj.nodeId, joinFieldPath(fieldPath, "nodeId"));
815
+ if (optionalField(obj, "sourceLocation") !== undefined)
816
+ result.sourceLocation = validateEvidenceItemSourceLocation(ctx, obj.sourceLocation, joinFieldPath(fieldPath, "sourceLocation"));
817
+ if (optionalField(obj, "metadata") !== undefined) {
818
+ const recordObj = requiredRecord(ctx, obj.metadata, joinFieldPath(fieldPath, "metadata"));
819
+ const record = {};
820
+ for (const [key, val] of Object.entries(recordObj)) {
821
+ record[key] = requiredScalarLike(ctx, val, joinFieldPath(joinFieldPath(fieldPath, "metadata"), key));
822
+ }
823
+ result.metadata = record;
824
+ }
825
+ return result;
826
+ }
827
+ function validateUnresolvedEvidenceItem(ctx, value, fieldPath) {
828
+ const obj = requiredObject(ctx, value, fieldPath);
829
+ return {
830
+ evidenceKind: requiredString(ctx, requiredField(ctx, obj, "evidenceKind", joinFieldPath(fieldPath, "evidenceKind")), joinFieldPath(fieldPath, "evidenceKind")),
831
+ role: validateContextRole(ctx, requiredField(ctx, obj, "role", joinFieldPath(fieldPath, "role")), joinFieldPath(fieldPath, "role")),
832
+ basis: requiredString(ctx, requiredField(ctx, obj, "basis", joinFieldPath(fieldPath, "basis")), joinFieldPath(fieldPath, "basis")),
833
+ reason: requiredString(ctx, requiredField(ctx, obj, "reason", joinFieldPath(fieldPath, "reason")), joinFieldPath(fieldPath, "reason")),
834
+ blocking: requiredBoolean(ctx, requiredField(ctx, obj, "blocking", joinFieldPath(fieldPath, "blocking")), joinFieldPath(fieldPath, "blocking"))
835
+ };
836
+ }
837
+ function validateEvidenceGroup(ctx, value, fieldPath) {
838
+ const obj = requiredObject(ctx, value, fieldPath);
839
+ return {
840
+ id: requiredString(ctx, requiredField(ctx, obj, "id", joinFieldPath(fieldPath, "id")), joinFieldPath(fieldPath, "id")),
841
+ kind: requiredLiteral(ctx, requiredField(ctx, obj, "kind", joinFieldPath(fieldPath, "kind")), joinFieldPath(fieldPath, "kind"), EVIDENCE_GROUP_KINDS),
842
+ role: validateContextRole(ctx, requiredField(ctx, obj, "role", joinFieldPath(fieldPath, "role")), joinFieldPath(fieldPath, "role")),
843
+ title: requiredString(ctx, requiredField(ctx, obj, "title", joinFieldPath(fieldPath, "title")), joinFieldPath(fieldPath, "title")),
844
+ required: requiredBoolean(ctx, requiredField(ctx, obj, "required", joinFieldPath(fieldPath, "required")), joinFieldPath(fieldPath, "required")),
845
+ items: requiredArray(ctx, requiredField(ctx, obj, "items", joinFieldPath(fieldPath, "items")), joinFieldPath(fieldPath, "items")).map((item, i) => validateEvidenceItemRef(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "items"), i))),
846
+ unresolved: requiredArray(ctx, requiredField(ctx, obj, "unresolved", joinFieldPath(fieldPath, "unresolved")), joinFieldPath(fieldPath, "unresolved")).map((item, i) => validateUnresolvedEvidenceItem(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "unresolved"), i))),
847
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings")),
848
+ limit: requiredNullableNumber(ctx, requiredField(ctx, obj, "limit", joinFieldPath(fieldPath, "limit")), joinFieldPath(fieldPath, "limit")),
849
+ availableCount: requiredNonnegativeInteger(ctx, requiredField(ctx, obj, "availableCount", joinFieldPath(fieldPath, "availableCount")), joinFieldPath(fieldPath, "availableCount")),
850
+ usedCount: requiredNonnegativeInteger(ctx, requiredField(ctx, obj, "usedCount", joinFieldPath(fieldPath, "usedCount")), joinFieldPath(fieldPath, "usedCount")),
851
+ truncated: requiredBoolean(ctx, requiredField(ctx, obj, "truncated", joinFieldPath(fieldPath, "truncated")), joinFieldPath(fieldPath, "truncated")),
852
+ droppedCount: requiredNonnegativeInteger(ctx, requiredField(ctx, obj, "droppedCount", joinFieldPath(fieldPath, "droppedCount")), joinFieldPath(fieldPath, "droppedCount")),
853
+ provenance: requiredString(ctx, requiredField(ctx, obj, "provenance", joinFieldPath(fieldPath, "provenance")), joinFieldPath(fieldPath, "provenance"))
854
+ };
855
+ }
856
+ function validateTestConfigurationEvidenceEntry(ctx, value, fieldPath) {
857
+ const obj = requiredObject(ctx, value, fieldPath);
858
+ const fieldsObj = requiredRecord(ctx, requiredField(ctx, obj, "fields", joinFieldPath(fieldPath, "fields")), joinFieldPath(fieldPath, "fields"));
859
+ const fields = {};
860
+ for (const [key, val] of Object.entries(fieldsObj)) {
861
+ fields[key] = requiredScalarOrStringArrayLike(ctx, val, joinFieldPath(joinFieldPath(fieldPath, "fields"), key));
862
+ }
863
+ return {
864
+ path: requiredString(ctx, requiredField(ctx, obj, "path", joinFieldPath(fieldPath, "path")), joinFieldPath(fieldPath, "path")),
865
+ framework: requiredString(ctx, requiredField(ctx, obj, "framework", joinFieldPath(fieldPath, "framework")), joinFieldPath(fieldPath, "framework")),
866
+ supported: requiredBoolean(ctx, requiredField(ctx, obj, "supported", joinFieldPath(fieldPath, "supported")), joinFieldPath(fieldPath, "supported")),
867
+ fields,
868
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings"))
869
+ };
870
+ }
871
+ function validatePackageScriptEvidenceEntry(ctx, value, fieldPath) {
872
+ const obj = requiredObject(ctx, value, fieldPath);
873
+ return {
874
+ name: requiredString(ctx, requiredField(ctx, obj, "name", joinFieldPath(fieldPath, "name")), joinFieldPath(fieldPath, "name")),
875
+ command: requiredString(ctx, requiredField(ctx, obj, "command", joinFieldPath(fieldPath, "command")), joinFieldPath(fieldPath, "command")),
876
+ reason: requiredString(ctx, requiredField(ctx, obj, "reason", joinFieldPath(fieldPath, "reason")), joinFieldPath(fieldPath, "reason")),
877
+ packageJsonPath: requiredString(ctx, requiredField(ctx, obj, "packageJsonPath", joinFieldPath(fieldPath, "packageJsonPath")), joinFieldPath(fieldPath, "packageJsonPath"))
878
+ };
879
+ }
880
+ function validateTestCommandEvidenceEntry(ctx, value, fieldPath) {
881
+ const obj = requiredObject(ctx, value, fieldPath);
882
+ const result = {
883
+ commandText: requiredNullableString(ctx, requiredField(ctx, obj, "commandText", joinFieldPath(fieldPath, "commandText")), joinFieldPath(fieldPath, "commandText")),
884
+ commandSource: requiredString(ctx, requiredField(ctx, obj, "commandSource", joinFieldPath(fieldPath, "commandSource")), joinFieldPath(fieldPath, "commandSource")),
885
+ testFiles: requiredStringArray(ctx, requiredField(ctx, obj, "testFiles", joinFieldPath(fieldPath, "testFiles")), joinFieldPath(fieldPath, "testFiles")),
886
+ framework: requiredNullableString(ctx, requiredField(ctx, obj, "framework", joinFieldPath(fieldPath, "framework")), joinFieldPath(fieldPath, "framework")),
887
+ scope: requiredLiteral(ctx, requiredField(ctx, obj, "scope", joinFieldPath(fieldPath, "scope")), joinFieldPath(fieldPath, "scope"), TEST_COMMAND_SCOPES),
888
+ basis: requiredString(ctx, requiredField(ctx, obj, "basis", joinFieldPath(fieldPath, "basis")), joinFieldPath(fieldPath, "basis"))
889
+ };
890
+ if (optionalField(obj, "unresolvedReason") !== undefined)
891
+ result.unresolvedReason = optionalString(ctx, obj.unresolvedReason, joinFieldPath(fieldPath, "unresolvedReason"));
892
+ return result;
893
+ }
894
+ function validateTestInfrastructureSummary(ctx, value, fieldPath) {
895
+ const obj = requiredObject(ctx, value, fieldPath);
896
+ const reqRefArray = (key) => requiredArray(ctx, requiredField(ctx, obj, key, joinFieldPath(fieldPath, key)), joinFieldPath(fieldPath, key)).map((item, i) => validateEvidenceItemRef(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, key), i)));
897
+ return {
898
+ relatedTests: reqRefArray("relatedTests"),
899
+ fixtures: reqRefArray("fixtures"),
900
+ factories: reqRefArray("factories"),
901
+ mocks: reqRefArray("mocks"),
902
+ setupFiles: reqRefArray("setupFiles"),
903
+ testConfigurations: requiredArray(ctx, requiredField(ctx, obj, "testConfigurations", joinFieldPath(fieldPath, "testConfigurations")), joinFieldPath(fieldPath, "testConfigurations")).map((item, i) => validateTestConfigurationEvidenceEntry(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "testConfigurations"), i))),
904
+ packageScripts: requiredArray(ctx, requiredField(ctx, obj, "packageScripts", joinFieldPath(fieldPath, "packageScripts")), joinFieldPath(fieldPath, "packageScripts")).map((item, i) => validatePackageScriptEvidenceEntry(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "packageScripts"), i))),
905
+ testCommands: requiredArray(ctx, requiredField(ctx, obj, "testCommands", joinFieldPath(fieldPath, "testCommands")), joinFieldPath(fieldPath, "testCommands")).map((item, i) => validateTestCommandEvidenceEntry(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "testCommands"), i))),
906
+ unresolved: requiredArray(ctx, requiredField(ctx, obj, "unresolved", joinFieldPath(fieldPath, "unresolved")), joinFieldPath(fieldPath, "unresolved")).map((item, i) => validateUnresolvedEvidenceItem(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "unresolved"), i))),
907
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings"))
908
+ };
909
+ }
910
+ function validateGroupTruncationEntry(ctx, value, fieldPath) {
911
+ const obj = requiredObject(ctx, value, fieldPath);
912
+ return {
913
+ groupId: requiredString(ctx, requiredField(ctx, obj, "groupId", joinFieldPath(fieldPath, "groupId")), joinFieldPath(fieldPath, "groupId")),
914
+ limit: requiredNullableNumber(ctx, requiredField(ctx, obj, "limit", joinFieldPath(fieldPath, "limit")), joinFieldPath(fieldPath, "limit")),
915
+ availableCount: requiredNonnegativeInteger(ctx, requiredField(ctx, obj, "availableCount", joinFieldPath(fieldPath, "availableCount")), joinFieldPath(fieldPath, "availableCount")),
916
+ usedCount: requiredNonnegativeInteger(ctx, requiredField(ctx, obj, "usedCount", joinFieldPath(fieldPath, "usedCount")), joinFieldPath(fieldPath, "usedCount")),
917
+ truncated: requiredBoolean(ctx, requiredField(ctx, obj, "truncated", joinFieldPath(fieldPath, "truncated")), joinFieldPath(fieldPath, "truncated")),
918
+ droppedCount: requiredNonnegativeInteger(ctx, requiredField(ctx, obj, "droppedCount", joinFieldPath(fieldPath, "droppedCount")), joinFieldPath(fieldPath, "droppedCount"))
919
+ };
920
+ }
921
+ export function validateProvenanceRecord(ctx, value, fieldPath) {
922
+ const obj = requiredObject(ctx, value, fieldPath);
923
+ return {
924
+ id: requiredString(ctx, requiredField(ctx, obj, "id", joinFieldPath(fieldPath, "id")), joinFieldPath(fieldPath, "id")),
925
+ category: requiredLiteral(ctx, requiredField(ctx, obj, "category", joinFieldPath(fieldPath, "category")), joinFieldPath(fieldPath, "category"), PROVENANCE_CATEGORIES),
926
+ sourcePath: requiredNullableString(ctx, requiredField(ctx, obj, "sourcePath", joinFieldPath(fieldPath, "sourcePath")), joinFieldPath(fieldPath, "sourcePath")),
927
+ sourceId: requiredNullableString(ctx, requiredField(ctx, obj, "sourceId", joinFieldPath(fieldPath, "sourceId")), joinFieldPath(fieldPath, "sourceId")),
928
+ evidenceId: requiredString(ctx, requiredField(ctx, obj, "evidenceId", joinFieldPath(fieldPath, "evidenceId")), joinFieldPath(fieldPath, "evidenceId")),
929
+ relationshipBasis: requiredString(ctx, requiredField(ctx, obj, "relationshipBasis", joinFieldPath(fieldPath, "relationshipBasis")), joinFieldPath(fieldPath, "relationshipBasis")),
930
+ role: validateContextRole(ctx, requiredField(ctx, obj, "role", joinFieldPath(fieldPath, "role")), joinFieldPath(fieldPath, "role")),
931
+ requestField: requiredNullableString(ctx, requiredField(ctx, obj, "requestField", joinFieldPath(fieldPath, "requestField")), joinFieldPath(fieldPath, "requestField")),
932
+ derivedByModule: requiredString(ctx, requiredField(ctx, obj, "derivedByModule", joinFieldPath(fieldPath, "derivedByModule")), joinFieldPath(fieldPath, "derivedByModule"))
933
+ };
934
+ }
935
+ function validateResponsibilityMapping(ctx, value, fieldPath) {
936
+ const obj = requiredObject(ctx, value, fieldPath);
937
+ const reqRefArray = (key) => requiredArray(ctx, requiredField(ctx, obj, key, joinFieldPath(fieldPath, key)), joinFieldPath(fieldPath, key)).map((item, i) => validateEvidenceItemRef(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, key), i)));
938
+ return {
939
+ responsibilityId: requiredString(ctx, requiredField(ctx, obj, "responsibilityId", joinFieldPath(fieldPath, "responsibilityId")), joinFieldPath(fieldPath, "responsibilityId")),
940
+ behavior: requiredNullableString(ctx, requiredField(ctx, obj, "behavior", joinFieldPath(fieldPath, "behavior")), joinFieldPath(fieldPath, "behavior")),
941
+ invariant: requiredNullableString(ctx, requiredField(ctx, obj, "invariant", joinFieldPath(fieldPath, "invariant")), joinFieldPath(fieldPath, "invariant")),
942
+ criticality: requiredLiteral(ctx, requiredField(ctx, obj, "criticality", joinFieldPath(fieldPath, "criticality")), joinFieldPath(fieldPath, "criticality"), RESPONSIBILITY_CRITICALITIES),
943
+ productionSymbols: reqRefArray("productionSymbols"),
944
+ contracts: reqRefArray("contracts"),
945
+ validators: reqRefArray("validators"),
946
+ constants: reqRefArray("constants"),
947
+ errors: reqRefArray("errors"),
948
+ sideEffectEvidence: reqRefArray("sideEffectEvidence"),
949
+ proposedOrExistingTestFiles: reqRefArray("proposedOrExistingTestFiles"),
950
+ reusableHelpers: reqRefArray("reusableHelpers"),
951
+ oracleEvidence: reqRefArray("oracleEvidence"),
952
+ testCommands: reqRefArray("testCommands"),
953
+ mappingStatus: requiredLiteral(ctx, requiredField(ctx, obj, "mappingStatus", joinFieldPath(fieldPath, "mappingStatus")), joinFieldPath(fieldPath, "mappingStatus"), RESPONSIBILITY_MAPPING_STATUSES),
954
+ unresolvedReasons: requiredStringArray(ctx, requiredField(ctx, obj, "unresolvedReasons", joinFieldPath(fieldPath, "unresolvedReasons")), joinFieldPath(fieldPath, "unresolvedReasons")),
955
+ provenance: requiredArray(ctx, requiredField(ctx, obj, "provenance", joinFieldPath(fieldPath, "provenance")), joinFieldPath(fieldPath, "provenance")).map((item, i) => validateProvenanceRecord(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "provenance"), i))),
956
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings"))
957
+ };
958
+ }
959
+ export function validateResponsibilityMappingSummary(ctx, value, fieldPath) {
960
+ const obj = requiredObject(ctx, value, fieldPath);
961
+ return {
962
+ requested: requiredBoolean(ctx, requiredField(ctx, obj, "requested", joinFieldPath(fieldPath, "requested")), joinFieldPath(fieldPath, "requested")),
963
+ operational: requiredBoolean(ctx, requiredField(ctx, obj, "operational", joinFieldPath(fieldPath, "operational")), joinFieldPath(fieldPath, "operational")),
964
+ mappings: requiredArray(ctx, requiredField(ctx, obj, "mappings", joinFieldPath(fieldPath, "mappings")), joinFieldPath(fieldPath, "mappings")).map((item, i) => validateResponsibilityMapping(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "mappings"), i))),
965
+ unknownResponsibilityIds: requiredStringArray(ctx, requiredField(ctx, obj, "unknownResponsibilityIds", joinFieldPath(fieldPath, "unknownResponsibilityIds")), joinFieldPath(fieldPath, "unknownResponsibilityIds")),
966
+ duplicateResponsibilityIds: requiredStringArray(ctx, requiredField(ctx, obj, "duplicateResponsibilityIds", joinFieldPath(fieldPath, "duplicateResponsibilityIds")), joinFieldPath(fieldPath, "duplicateResponsibilityIds")),
967
+ limit: requiredNullableNumber(ctx, requiredField(ctx, obj, "limit", joinFieldPath(fieldPath, "limit")), joinFieldPath(fieldPath, "limit")),
968
+ availableCount: requiredNonnegativeInteger(ctx, requiredField(ctx, obj, "availableCount", joinFieldPath(fieldPath, "availableCount")), joinFieldPath(fieldPath, "availableCount")),
969
+ usedCount: requiredNonnegativeInteger(ctx, requiredField(ctx, obj, "usedCount", joinFieldPath(fieldPath, "usedCount")), joinFieldPath(fieldPath, "usedCount")),
970
+ truncated: requiredBoolean(ctx, requiredField(ctx, obj, "truncated", joinFieldPath(fieldPath, "truncated")), joinFieldPath(fieldPath, "truncated")),
971
+ droppedCount: requiredNonnegativeInteger(ctx, requiredField(ctx, obj, "droppedCount", joinFieldPath(fieldPath, "droppedCount")), joinFieldPath(fieldPath, "droppedCount")),
972
+ criticalDropped: requiredBoolean(ctx, requiredField(ctx, obj, "criticalDropped", joinFieldPath(fieldPath, "criticalDropped")), joinFieldPath(fieldPath, "criticalDropped")),
973
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings"))
974
+ };
975
+ }
976
+ function validateFreshnessComparedIdentity(ctx, value, fieldPath) {
977
+ const obj = requiredObject(ctx, value, fieldPath);
978
+ return {
979
+ label: requiredString(ctx, requiredField(ctx, obj, "label", joinFieldPath(fieldPath, "label")), joinFieldPath(fieldPath, "label")),
980
+ value: requiredNullableString(ctx, requiredField(ctx, obj, "value", joinFieldPath(fieldPath, "value")), joinFieldPath(fieldPath, "value"))
981
+ };
982
+ }
983
+ export function validateFreshnessSummary(ctx, value, fieldPath) {
984
+ const obj = requiredObject(ctx, value, fieldPath);
985
+ return {
986
+ state: requiredLiteral(ctx, requiredField(ctx, obj, "state", joinFieldPath(fieldPath, "state")), joinFieldPath(fieldPath, "state"), FRESHNESS_STATES),
987
+ role: validateContextRole(ctx, requiredField(ctx, obj, "role", joinFieldPath(fieldPath, "role")), joinFieldPath(fieldPath, "role")),
988
+ evidenceUsed: requiredStringArray(ctx, requiredField(ctx, obj, "evidenceUsed", joinFieldPath(fieldPath, "evidenceUsed")), joinFieldPath(fieldPath, "evidenceUsed")),
989
+ evidenceUnavailable: requiredStringArray(ctx, requiredField(ctx, obj, "evidenceUnavailable", joinFieldPath(fieldPath, "evidenceUnavailable")), joinFieldPath(fieldPath, "evidenceUnavailable")),
990
+ comparedIdentities: requiredArray(ctx, requiredField(ctx, obj, "comparedIdentities", joinFieldPath(fieldPath, "comparedIdentities")), joinFieldPath(fieldPath, "comparedIdentities")).map((item, i) => validateFreshnessComparedIdentity(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "comparedIdentities"), i))),
991
+ reason: requiredString(ctx, requiredField(ctx, obj, "reason", joinFieldPath(fieldPath, "reason")), joinFieldPath(fieldPath, "reason")),
992
+ relevantChangedPaths: requiredStringArray(ctx, requiredField(ctx, obj, "relevantChangedPaths", joinFieldPath(fieldPath, "relevantChangedPaths")), joinFieldPath(fieldPath, "relevantChangedPaths")),
993
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings"))
994
+ };
995
+ }
996
+ function validateBudgetLimitUsage(ctx, value, fieldPath) {
997
+ const obj = requiredObject(ctx, value, fieldPath);
998
+ return {
999
+ name: requiredString(ctx, requiredField(ctx, obj, "name", joinFieldPath(fieldPath, "name")), joinFieldPath(fieldPath, "name")),
1000
+ declaredValue: requiredNullableNumber(ctx, requiredField(ctx, obj, "declaredValue", joinFieldPath(fieldPath, "declaredValue")), joinFieldPath(fieldPath, "declaredValue")),
1001
+ usedValue: requiredNumber(ctx, requiredField(ctx, obj, "usedValue", joinFieldPath(fieldPath, "usedValue")), joinFieldPath(fieldPath, "usedValue")),
1002
+ availableCount: requiredNullableNumber(ctx, requiredField(ctx, obj, "availableCount", joinFieldPath(fieldPath, "availableCount")), joinFieldPath(fieldPath, "availableCount")),
1003
+ droppedCount: requiredNullableNumber(ctx, requiredField(ctx, obj, "droppedCount", joinFieldPath(fieldPath, "droppedCount")), joinFieldPath(fieldPath, "droppedCount")),
1004
+ truncated: requiredBoolean(ctx, requiredField(ctx, obj, "truncated", joinFieldPath(fieldPath, "truncated")), joinFieldPath(fieldPath, "truncated")),
1005
+ requiredEvidenceAffected: requiredBoolean(ctx, requiredField(ctx, obj, "requiredEvidenceAffected", joinFieldPath(fieldPath, "requiredEvidenceAffected")), joinFieldPath(fieldPath, "requiredEvidenceAffected")),
1006
+ adequacyImpact: requiredNullableString(ctx, requiredField(ctx, obj, "adequacyImpact", joinFieldPath(fieldPath, "adequacyImpact")), joinFieldPath(fieldPath, "adequacyImpact"))
1007
+ };
1008
+ }
1009
+ function validateBudgetCharacterUsage(ctx, value, fieldPath) {
1010
+ const obj = requiredObject(ctx, value, fieldPath);
1011
+ return {
1012
+ measured: requiredNumber(ctx, requiredField(ctx, obj, "measured", joinFieldPath(fieldPath, "measured")), joinFieldPath(fieldPath, "measured")),
1013
+ limit: requiredNullableNumber(ctx, requiredField(ctx, obj, "limit", joinFieldPath(fieldPath, "limit")), joinFieldPath(fieldPath, "limit")),
1014
+ truncated: requiredBoolean(ctx, requiredField(ctx, obj, "truncated", joinFieldPath(fieldPath, "truncated")), joinFieldPath(fieldPath, "truncated"))
1015
+ };
1016
+ }
1017
+ export function validateBudgetSummary(ctx, value, fieldPath) {
1018
+ const obj = requiredObject(ctx, value, fieldPath);
1019
+ const charactersValue = requiredField(ctx, obj, "characters", joinFieldPath(fieldPath, "characters"));
1020
+ return {
1021
+ limits: requiredArray(ctx, requiredField(ctx, obj, "limits", joinFieldPath(fieldPath, "limits")), joinFieldPath(fieldPath, "limits")).map((item, i) => validateBudgetLimitUsage(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "limits"), i))),
1022
+ characters: charactersValue === null ? null : validateBudgetCharacterUsage(ctx, charactersValue, joinFieldPath(fieldPath, "characters")),
1023
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings"))
1024
+ };
1025
+ }
1026
+ function validateCapsuleTruncationRecord(ctx, value, fieldPath) {
1027
+ const obj = requiredObject(ctx, value, fieldPath);
1028
+ return {
1029
+ id: requiredString(ctx, requiredField(ctx, obj, "id", joinFieldPath(fieldPath, "id")), joinFieldPath(fieldPath, "id")),
1030
+ affectedGroup: requiredString(ctx, requiredField(ctx, obj, "affectedGroup", joinFieldPath(fieldPath, "affectedGroup")), joinFieldPath(fieldPath, "affectedGroup")),
1031
+ limit: requiredNullableNumber(ctx, requiredField(ctx, obj, "limit", joinFieldPath(fieldPath, "limit")), joinFieldPath(fieldPath, "limit")),
1032
+ used: requiredNumber(ctx, requiredField(ctx, obj, "used", joinFieldPath(fieldPath, "used")), joinFieldPath(fieldPath, "used")),
1033
+ available: requiredNumber(ctx, requiredField(ctx, obj, "available", joinFieldPath(fieldPath, "available")), joinFieldPath(fieldPath, "available")),
1034
+ droppedCount: requiredNonnegativeInteger(ctx, requiredField(ctx, obj, "droppedCount", joinFieldPath(fieldPath, "droppedCount")), joinFieldPath(fieldPath, "droppedCount")),
1035
+ droppedEvidenceIds: requiredStringArray(ctx, requiredField(ctx, obj, "droppedEvidenceIds", joinFieldPath(fieldPath, "droppedEvidenceIds")), joinFieldPath(fieldPath, "droppedEvidenceIds")),
1036
+ requiredEvidenceLost: requiredBoolean(ctx, requiredField(ctx, obj, "requiredEvidenceLost", joinFieldPath(fieldPath, "requiredEvidenceLost")), joinFieldPath(fieldPath, "requiredEvidenceLost")),
1037
+ adequacyImpact: requiredNullableString(ctx, requiredField(ctx, obj, "adequacyImpact", joinFieldPath(fieldPath, "adequacyImpact")), joinFieldPath(fieldPath, "adequacyImpact")),
1038
+ reason: requiredString(ctx, requiredField(ctx, obj, "reason", joinFieldPath(fieldPath, "reason")), joinFieldPath(fieldPath, "reason"))
1039
+ };
1040
+ }
1041
+ export function validateTruncationSummary(ctx, value, fieldPath) {
1042
+ const obj = requiredObject(ctx, value, fieldPath);
1043
+ return {
1044
+ truncated: requiredBoolean(ctx, requiredField(ctx, obj, "truncated", joinFieldPath(fieldPath, "truncated")), joinFieldPath(fieldPath, "truncated")),
1045
+ records: requiredArray(ctx, requiredField(ctx, obj, "records", joinFieldPath(fieldPath, "records")), joinFieldPath(fieldPath, "records")).map((item, i) => validateCapsuleTruncationRecord(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "records"), i))),
1046
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings"))
1047
+ };
1048
+ }
1049
+ function validateFullFileFallbackRecord(ctx, value, fieldPath) {
1050
+ const obj = requiredObject(ctx, value, fieldPath);
1051
+ return {
1052
+ id: requiredString(ctx, requiredField(ctx, obj, "id", joinFieldPath(fieldPath, "id")), joinFieldPath(fieldPath, "id")),
1053
+ filePath: requiredString(ctx, requiredField(ctx, obj, "filePath", joinFieldPath(fieldPath, "filePath")), joinFieldPath(fieldPath, "filePath")),
1054
+ reason: requiredString(ctx, requiredField(ctx, obj, "reason", joinFieldPath(fieldPath, "reason")), joinFieldPath(fieldPath, "reason")),
1055
+ requestedEvidenceKind: requiredNullableString(ctx, requiredField(ctx, obj, "requestedEvidenceKind", joinFieldPath(fieldPath, "requestedEvidenceKind")), joinFieldPath(fieldPath, "requestedEvidenceKind")),
1056
+ boundedRetrievalAttempted: requiredBoolean(ctx, requiredField(ctx, obj, "boundedRetrievalAttempted", joinFieldPath(fieldPath, "boundedRetrievalAttempted")), joinFieldPath(fieldPath, "boundedRetrievalAttempted")),
1057
+ sourceRangesAttempted: requiredNonnegativeInteger(ctx, requiredField(ctx, obj, "sourceRangesAttempted", joinFieldPath(fieldPath, "sourceRangesAttempted")), joinFieldPath(fieldPath, "sourceRangesAttempted")),
1058
+ includedLineCount: requiredNonnegativeInteger(ctx, requiredField(ctx, obj, "includedLineCount", joinFieldPath(fieldPath, "includedLineCount")), joinFieldPath(fieldPath, "includedLineCount")),
1059
+ includedCharacterCount: requiredNonnegativeInteger(ctx, requiredField(ctx, obj, "includedCharacterCount", joinFieldPath(fieldPath, "includedCharacterCount")), joinFieldPath(fieldPath, "includedCharacterCount")),
1060
+ role: validateContextRole(ctx, requiredField(ctx, obj, "role", joinFieldPath(fieldPath, "role")), joinFieldPath(fieldPath, "role")),
1061
+ responsibilityIdsAffected: requiredStringArray(ctx, requiredField(ctx, obj, "responsibilityIdsAffected", joinFieldPath(fieldPath, "responsibilityIdsAffected")), joinFieldPath(fieldPath, "responsibilityIdsAffected")),
1062
+ allowed: requiredBoolean(ctx, requiredField(ctx, obj, "allowed", joinFieldPath(fieldPath, "allowed")), joinFieldPath(fieldPath, "allowed")),
1063
+ provenance: requiredString(ctx, requiredField(ctx, obj, "provenance", joinFieldPath(fieldPath, "provenance")), joinFieldPath(fieldPath, "provenance"))
1064
+ };
1065
+ }
1066
+ export function validateFullFileFallbackSummary(ctx, value, fieldPath) {
1067
+ const obj = requiredObject(ctx, value, fieldPath);
1068
+ return {
1069
+ enabled: requiredBoolean(ctx, requiredField(ctx, obj, "enabled", joinFieldPath(fieldPath, "enabled")), joinFieldPath(fieldPath, "enabled")),
1070
+ limit: requiredNullableNumber(ctx, requiredField(ctx, obj, "limit", joinFieldPath(fieldPath, "limit")), joinFieldPath(fieldPath, "limit")),
1071
+ used: requiredNonnegativeInteger(ctx, requiredField(ctx, obj, "used", joinFieldPath(fieldPath, "used")), joinFieldPath(fieldPath, "used")),
1072
+ fallbacks: requiredArray(ctx, requiredField(ctx, obj, "fallbacks", joinFieldPath(fieldPath, "fallbacks")), joinFieldPath(fieldPath, "fallbacks")).map((item, i) => validateFullFileFallbackRecord(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "fallbacks"), i))),
1073
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings"))
1074
+ };
1075
+ }
1076
+ export function validateRoleAdequacyStatement(ctx, value, fieldPath) {
1077
+ const obj = requiredObject(ctx, value, fieldPath);
1078
+ return {
1079
+ role: validateContextRole(ctx, requiredField(ctx, obj, "role", joinFieldPath(fieldPath, "role")), joinFieldPath(fieldPath, "role")),
1080
+ status: requiredLiteral(ctx, requiredField(ctx, obj, "status", joinFieldPath(fieldPath, "status")), joinFieldPath(fieldPath, "status"), CONTEXT_ADEQUACY_STATUSES),
1081
+ requiredConditions: requiredStringArray(ctx, requiredField(ctx, obj, "requiredConditions", joinFieldPath(fieldPath, "requiredConditions")), joinFieldPath(fieldPath, "requiredConditions")),
1082
+ satisfiedConditions: requiredStringArray(ctx, requiredField(ctx, obj, "satisfiedConditions", joinFieldPath(fieldPath, "satisfiedConditions")), joinFieldPath(fieldPath, "satisfiedConditions")),
1083
+ missingConditions: requiredStringArray(ctx, requiredField(ctx, obj, "missingConditions", joinFieldPath(fieldPath, "missingConditions")), joinFieldPath(fieldPath, "missingConditions")),
1084
+ blockingConditions: requiredStringArray(ctx, requiredField(ctx, obj, "blockingConditions", joinFieldPath(fieldPath, "blockingConditions")), joinFieldPath(fieldPath, "blockingConditions")),
1085
+ warnings: requiredStringArray(ctx, requiredField(ctx, obj, "warnings", joinFieldPath(fieldPath, "warnings")), joinFieldPath(fieldPath, "warnings")),
1086
+ supportingEvidence: requiredStringArray(ctx, requiredField(ctx, obj, "supportingEvidence", joinFieldPath(fieldPath, "supportingEvidence")), joinFieldPath(fieldPath, "supportingEvidence")),
1087
+ affectedResponsibilityIds: requiredStringArray(ctx, requiredField(ctx, obj, "affectedResponsibilityIds", joinFieldPath(fieldPath, "affectedResponsibilityIds")), joinFieldPath(fieldPath, "affectedResponsibilityIds")),
1088
+ truncationImpact: requiredBoolean(ctx, requiredField(ctx, obj, "truncationImpact", joinFieldPath(fieldPath, "truncationImpact")), joinFieldPath(fieldPath, "truncationImpact")),
1089
+ freshnessImpact: requiredBoolean(ctx, requiredField(ctx, obj, "freshnessImpact", joinFieldPath(fieldPath, "freshnessImpact")), joinFieldPath(fieldPath, "freshnessImpact"))
1090
+ };
1091
+ }
1092
+ function validateContextCapsuleArtifactRef(ctx, value, fieldPath) {
1093
+ const obj = requiredObject(ctx, value, fieldPath);
1094
+ return {
1095
+ name: requiredString(ctx, requiredField(ctx, obj, "name", joinFieldPath(fieldPath, "name")), joinFieldPath(fieldPath, "name")),
1096
+ path: requiredString(ctx, requiredField(ctx, obj, "path", joinFieldPath(fieldPath, "path")), joinFieldPath(fieldPath, "path"))
1097
+ };
1098
+ }
1099
+ function validateContextCapsuleIndex(ctx, value, fieldPath) {
1100
+ const obj = requiredObject(ctx, value, fieldPath);
1101
+ const result = {
1102
+ indexPath: requiredString(ctx, requiredField(ctx, obj, "indexPath", joinFieldPath(fieldPath, "indexPath")), joinFieldPath(fieldPath, "indexPath")),
1103
+ manifestPath: requiredString(ctx, requiredField(ctx, obj, "manifestPath", joinFieldPath(fieldPath, "manifestPath")), joinFieldPath(fieldPath, "manifestPath")),
1104
+ artifactRefs: requiredArray(ctx, requiredField(ctx, obj, "artifactRefs", joinFieldPath(fieldPath, "artifactRefs")), joinFieldPath(fieldPath, "artifactRefs")).map((item, i) => validateContextCapsuleArtifactRef(ctx, item, arrayFieldPath(joinFieldPath(fieldPath, "artifactRefs"), i)))
1105
+ };
1106
+ if (optionalField(obj, "manifestSchemaVersion") !== undefined)
1107
+ result.manifestSchemaVersion = optionalString(ctx, obj.manifestSchemaVersion, joinFieldPath(fieldPath, "manifestSchemaVersion"));
1108
+ if (optionalField(obj, "projectRoot") !== undefined)
1109
+ result.projectRoot = optionalString(ctx, obj.projectRoot, joinFieldPath(fieldPath, "projectRoot"));
1110
+ return result;
1111
+ }
1112
+ function validateContextCapsuleLimits(ctx, value, fieldPath) {
1113
+ const obj = requiredObject(ctx, value, fieldPath);
1114
+ return {
1115
+ maxCandidateFiles: requiredNullableNumber(ctx, requiredField(ctx, obj, "maxCandidateFiles", joinFieldPath(fieldPath, "maxCandidateFiles")), joinFieldPath(fieldPath, "maxCandidateFiles")),
1116
+ maxSourceSlices: requiredNullableNumber(ctx, requiredField(ctx, obj, "maxSourceSlices", joinFieldPath(fieldPath, "maxSourceSlices")), joinFieldPath(fieldPath, "maxSourceSlices")),
1117
+ maxGraphNodes: requiredNullableNumber(ctx, requiredField(ctx, obj, "maxGraphNodes", joinFieldPath(fieldPath, "maxGraphNodes")), joinFieldPath(fieldPath, "maxGraphNodes")),
1118
+ maxGraphEdges: requiredNullableNumber(ctx, requiredField(ctx, obj, "maxGraphEdges", joinFieldPath(fieldPath, "maxGraphEdges")), joinFieldPath(fieldPath, "maxGraphEdges"))
1119
+ };
1120
+ }
1121
+ export function validateContextCapsuleRequest(ctx, value, fieldPath) {
1122
+ const obj = requiredObject(ctx, value, fieldPath);
1123
+ return {
1124
+ originalQuery: requiredString(ctx, requiredField(ctx, obj, "originalQuery", joinFieldPath(fieldPath, "originalQuery")), joinFieldPath(fieldPath, "originalQuery")),
1125
+ normalizedQuery: requiredString(ctx, requiredField(ctx, obj, "normalizedQuery", joinFieldPath(fieldPath, "normalizedQuery")), joinFieldPath(fieldPath, "normalizedQuery")),
1126
+ mode: requiredLiteral(ctx, requiredField(ctx, obj, "mode", joinFieldPath(fieldPath, "mode")), joinFieldPath(fieldPath, "mode"), CONTEXT_CAPSULE_MODES),
1127
+ requestedOutputPath: requiredString(ctx, requiredField(ctx, obj, "requestedOutputPath", joinFieldPath(fieldPath, "requestedOutputPath")), joinFieldPath(fieldPath, "requestedOutputPath")),
1128
+ role: validateContextRole(ctx, requiredField(ctx, obj, "role", joinFieldPath(fieldPath, "role")), joinFieldPath(fieldPath, "role")),
1129
+ requestFilePath: requiredNullableString(ctx, requiredField(ctx, obj, "requestFilePath", joinFieldPath(fieldPath, "requestFilePath")), joinFieldPath(fieldPath, "requestFilePath"))
1130
+ };
1131
+ }
1132
+ function validateContextCapsuleTool(ctx, value, fieldPath) {
1133
+ const obj = requiredObject(ctx, value, fieldPath);
1134
+ return {
1135
+ name: requiredString(ctx, requiredField(ctx, obj, "name", joinFieldPath(fieldPath, "name")), joinFieldPath(fieldPath, "name")),
1136
+ version: requiredString(ctx, requiredField(ctx, obj, "version", joinFieldPath(fieldPath, "version")), joinFieldPath(fieldPath, "version"))
1137
+ };
1138
+ }
1139
+ export function validateMyDevKitContextCapsuleV1(value, sourcePath) {
1140
+ const ctx = { artifactKind: ARTIFACT_KIND, sourcePath };
1141
+ try {
1142
+ const schemaVersionResult = parseSupportedMajorOneSchemaVersion(requiredField(ctx, value, "schemaVersion", "schemaVersion"), ARTIFACT_KIND, sourcePath);
1143
+ if ("ok" in schemaVersionResult)
1144
+ return schemaVersionResult;
1145
+ const capsule = {
1146
+ schemaVersion: requiredString(ctx, value.schemaVersion, "schemaVersion"),
1147
+ generatedAt: requiredString(ctx, requiredField(ctx, value, "generatedAt", "generatedAt"), "generatedAt"),
1148
+ tool: validateContextCapsuleTool(ctx, requiredField(ctx, value, "tool", "tool"), "tool"),
1149
+ request: validateContextCapsuleRequest(ctx, requiredField(ctx, value, "request", "request"), "request"),
1150
+ index: validateContextCapsuleIndex(ctx, requiredField(ctx, value, "index", "index"), "index"),
1151
+ limits: validateContextCapsuleLimits(ctx, requiredField(ctx, value, "limits", "limits"), "limits"),
1152
+ requiredContext: requiredArray(ctx, requiredField(ctx, value, "requiredContext", "requiredContext"), "requiredContext").map((item, i) => validateContextEntry(ctx, item, arrayFieldPath("requiredContext", i))),
1153
+ optionalSupportContext: requiredArray(ctx, requiredField(ctx, value, "optionalSupportContext", "optionalSupportContext"), "optionalSupportContext").map((item, i) => validateContextEntry(ctx, item, arrayFieldPath("optionalSupportContext", i))),
1154
+ droppedContext: requiredArray(ctx, requiredField(ctx, value, "droppedContext", "droppedContext"), "droppedContext").map((item, i) => validateDroppedContextEntry(ctx, item, arrayFieldPath("droppedContext", i))),
1155
+ warnings: requiredStringArray(ctx, requiredField(ctx, value, "warnings", "warnings"), "warnings"),
1156
+ contextAdequacy: validateContextAdequacyStatement(ctx, requiredField(ctx, value, "contextAdequacy", "contextAdequacy"), "contextAdequacy"),
1157
+ queryPlan: validateQueryPlan(ctx, requiredField(ctx, value, "queryPlan", "queryPlan"), "queryPlan"),
1158
+ candidateFiles: requiredArray(ctx, requiredField(ctx, value, "candidateFiles", "candidateFiles"), "candidateFiles").map((item, i) => validateCandidateFile(ctx, item, arrayFieldPath("candidateFiles", i))),
1159
+ candidateNodes: requiredArray(ctx, requiredField(ctx, value, "candidateNodes", "candidateNodes"), "candidateNodes").map((item, i) => validateCandidateNode(ctx, item, arrayFieldPath("candidateNodes", i))),
1160
+ focus: validateContextFocus(ctx, requiredField(ctx, value, "focus", "focus"), "focus"),
1161
+ selectedGraph: validateSelectedGraph(ctx, requiredField(ctx, value, "selectedGraph", "selectedGraph"), "selectedGraph"),
1162
+ retention: validateRetentionSummary(ctx, requiredField(ctx, value, "retention", "retention"), "retention"),
1163
+ selectedSource: validateSelectedSource(ctx, requiredField(ctx, value, "selectedSource", "selectedSource"), "selectedSource"),
1164
+ selectedSourceBundles: validateSelectedSourceBundles(ctx, requiredField(ctx, value, "selectedSourceBundles", "selectedSourceBundles"), "selectedSourceBundles"),
1165
+ semanticSummary: validateSemanticSummary(ctx, requiredField(ctx, value, "semanticSummary", "semanticSummary"), "semanticSummary"),
1166
+ classificationSummary: validateClassificationSummary(ctx, requiredField(ctx, value, "classificationSummary", "classificationSummary"), "classificationSummary"),
1167
+ artifactReferenceSummary: requiredArray(ctx, requiredField(ctx, value, "artifactReferenceSummary", "artifactReferenceSummary"), "artifactReferenceSummary").map((item, i) => validateArtifactReferenceSummaryEntry(ctx, item, arrayFieldPath("artifactReferenceSummary", i))),
1168
+ pruning: validatePruningSummary(ctx, requiredField(ctx, value, "pruning", "pruning"), "pruning"),
1169
+ conflicts: validateContextConflictSummary(ctx, requiredField(ctx, value, "conflicts", "conflicts"), "conflicts"),
1170
+ modeEffects: validateModeEffects(ctx, requiredField(ctx, value, "modeEffects", "modeEffects"), "modeEffects"),
1171
+ sourceControl: validateSourceControl(ctx, requiredField(ctx, value, "sourceControl", "sourceControl"), "sourceControl"),
1172
+ deferredRequestFields: requiredStringArray(ctx, requiredField(ctx, value, "deferredRequestFields", "deferredRequestFields"), "deferredRequestFields"),
1173
+ roleContext: validateRoleContextSummary(ctx, requiredField(ctx, value, "roleContext", "roleContext"), "roleContext"),
1174
+ evidenceGroups: requiredArray(ctx, requiredField(ctx, value, "evidenceGroups", "evidenceGroups"), "evidenceGroups").map((item, i) => validateEvidenceGroup(ctx, item, arrayFieldPath("evidenceGroups", i))),
1175
+ selectedOwners: requiredArray(ctx, requiredField(ctx, value, "selectedOwners", "selectedOwners"), "selectedOwners").map((item, i) => validateEvidenceItemRef(ctx, item, arrayFieldPath("selectedOwners", i))),
1176
+ selectedContracts: requiredArray(ctx, requiredField(ctx, value, "selectedContracts", "selectedContracts"), "selectedContracts").map((item, i) => validateEvidenceItemRef(ctx, item, arrayFieldPath("selectedContracts", i))),
1177
+ selectedTests: requiredArray(ctx, requiredField(ctx, value, "selectedTests", "selectedTests"), "selectedTests").map((item, i) => validateEvidenceItemRef(ctx, item, arrayFieldPath("selectedTests", i))),
1178
+ testInfrastructure: validateTestInfrastructureSummary(ctx, requiredField(ctx, value, "testInfrastructure", "testInfrastructure"), "testInfrastructure"),
1179
+ unresolvedItems: requiredArray(ctx, requiredField(ctx, value, "unresolvedItems", "unresolvedItems"), "unresolvedItems").map((item, i) => validateUnresolvedEvidenceItem(ctx, item, arrayFieldPath("unresolvedItems", i))),
1180
+ groupTruncation: requiredArray(ctx, requiredField(ctx, value, "groupTruncation", "groupTruncation"), "groupTruncation").map((item, i) => validateGroupTruncationEntry(ctx, item, arrayFieldPath("groupTruncation", i))),
1181
+ responsibilityMappings: validateResponsibilityMappingSummary(ctx, requiredField(ctx, value, "responsibilityMappings", "responsibilityMappings"), "responsibilityMappings"),
1182
+ roleAdequacy: validateRoleAdequacyStatement(ctx, requiredField(ctx, value, "roleAdequacy", "roleAdequacy"), "roleAdequacy"),
1183
+ freshness: validateFreshnessSummary(ctx, requiredField(ctx, value, "freshness", "freshness"), "freshness"),
1184
+ budget: validateBudgetSummary(ctx, requiredField(ctx, value, "budget", "budget"), "budget"),
1185
+ truncation: validateTruncationSummary(ctx, requiredField(ctx, value, "truncation", "truncation"), "truncation"),
1186
+ fullFileFallback: validateFullFileFallbackSummary(ctx, requiredField(ctx, value, "fullFileFallback", "fullFileFallback"), "fullFileFallback"),
1187
+ provenance: requiredArray(ctx, requiredField(ctx, value, "provenance", "provenance"), "provenance").map((item, i) => validateProvenanceRecord(ctx, item, arrayFieldPath("provenance", i)))
1188
+ };
1189
+ // Kit artifact writers do not generically reject duplicate IDs (report section 27); the
1190
+ // capsule reconstruction above exists only to walk and type-check every field. The
1191
+ // returned artifact must be the original parsed reference, never a rebuilt object.
1192
+ void capsule;
1193
+ return {
1194
+ ok: true,
1195
+ artifactKind: ARTIFACT_KIND,
1196
+ sourcePath,
1197
+ schemaVersion: value.schemaVersion,
1198
+ schemaMajor: 1,
1199
+ artifact: value,
1200
+ rawArtifact: value
1201
+ };
1202
+ }
1203
+ catch (error) {
1204
+ if (error instanceof ArtifactValidationError)
1205
+ return error.failure;
1206
+ throw error;
1207
+ }
1208
+ }