@cat-factory/contracts 0.278.0 → 0.280.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/index.d.ts +2 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +2 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/mergeTrackRecord.d.ts +14 -0
  6. package/dist/mergeTrackRecord.d.ts.map +1 -1
  7. package/dist/mergeTrackRecord.js +15 -0
  8. package/dist/mergeTrackRecord.js.map +1 -1
  9. package/dist/public-merge-evidence.d.ts +94 -0
  10. package/dist/public-merge-evidence.d.ts.map +1 -0
  11. package/dist/public-merge-evidence.js +106 -0
  12. package/dist/public-merge-evidence.js.map +1 -0
  13. package/dist/public-spec.d.ts +232 -0
  14. package/dist/public-spec.d.ts.map +1 -0
  15. package/dist/public-spec.js +208 -0
  16. package/dist/public-spec.js.map +1 -0
  17. package/dist/routes/index.d.ts +2 -0
  18. package/dist/routes/index.d.ts.map +1 -1
  19. package/dist/routes/index.js +2 -0
  20. package/dist/routes/index.js.map +1 -1
  21. package/dist/routes/public-api.d.ts +19 -2
  22. package/dist/routes/public-api.d.ts.map +1 -1
  23. package/dist/routes/public-api.js +23 -3
  24. package/dist/routes/public-api.js.map +1 -1
  25. package/dist/routes/public-merge-evidence.d.ts +248 -0
  26. package/dist/routes/public-merge-evidence.d.ts.map +1 -0
  27. package/dist/routes/public-merge-evidence.js +80 -0
  28. package/dist/routes/public-merge-evidence.js.map +1 -0
  29. package/dist/routes/public-spec.d.ts +110 -0
  30. package/dist/routes/public-spec.d.ts.map +1 -0
  31. package/dist/routes/public-spec.js +31 -0
  32. package/dist/routes/public-spec.js.map +1 -0
  33. package/dist/routes/spec.d.ts +18 -2
  34. package/dist/routes/spec.d.ts.map +1 -1
  35. package/dist/spec.d.ts +172 -3
  36. package/dist/spec.d.ts.map +1 -1
  37. package/dist/spec.js +90 -4
  38. package/dist/spec.js.map +1 -1
  39. package/package.json +1 -1
@@ -0,0 +1,248 @@
1
+ /**
2
+ * The merge decision a RUN left behind: its change class, the merger's scores, what happened,
3
+ * and the effort tag if one has been recorded.
4
+ *
5
+ * The entry point of the loop for a caller that started the run and holds its id, and the read
6
+ * that hands it the `recordId` the tag route takes. A run whose pipeline had no `merger` step
7
+ * (or whose merge path never got far enough to classify) has no record, and that is a `404`
8
+ * rather than an empty object: "this run made no merge decision" is a fact about the run.
9
+ */
10
+ export declare const getPublicRunMergeRecordContract: {
11
+ readonly method: "get";
12
+ readonly requestPathParamsSchema: import("valibot").ObjectSchema<{
13
+ runId: import("valibot").StringSchema<undefined>;
14
+ }, undefined> & import("@toad-contracts/core").StandardObjectKeysV1<unknown, unknown>;
15
+ readonly pathResolver: ({ runId }: {
16
+ runId: string;
17
+ }) => string;
18
+ readonly responsesByStatusCode: {
19
+ readonly '4xx': import("valibot").ObjectSchema<{
20
+ readonly error: import("valibot").ObjectSchema<{
21
+ readonly code: import("valibot").StringSchema<undefined>;
22
+ readonly message: import("valibot").StringSchema<undefined>;
23
+ readonly details: import("valibot").OptionalSchema<import("valibot").UnknownSchema, undefined>;
24
+ readonly issues: import("valibot").OptionalSchema<import("valibot").ArraySchema<import("valibot").ObjectSchema<{
25
+ readonly path: import("valibot").OptionalSchema<import("valibot").StringSchema<undefined>, undefined>;
26
+ readonly message: import("valibot").StringSchema<undefined>;
27
+ }, undefined>, undefined>, undefined>;
28
+ }, undefined>;
29
+ }, undefined>;
30
+ readonly '5xx': import("valibot").ObjectSchema<{
31
+ readonly error: import("valibot").ObjectSchema<{
32
+ readonly code: import("valibot").StringSchema<undefined>;
33
+ readonly message: import("valibot").StringSchema<undefined>;
34
+ readonly details: import("valibot").OptionalSchema<import("valibot").UnknownSchema, undefined>;
35
+ readonly issues: import("valibot").OptionalSchema<import("valibot").ArraySchema<import("valibot").ObjectSchema<{
36
+ readonly path: import("valibot").OptionalSchema<import("valibot").StringSchema<undefined>, undefined>;
37
+ readonly message: import("valibot").StringSchema<undefined>;
38
+ }, undefined>, undefined>, undefined>;
39
+ }, undefined>;
40
+ }, undefined>;
41
+ readonly 200: import("valibot").ObjectSchema<{
42
+ readonly recordId: import("valibot").StringSchema<undefined>;
43
+ readonly taskId: import("valibot").StringSchema<undefined>;
44
+ readonly runId: import("valibot").NullableSchema<import("valibot").StringSchema<undefined>, undefined>;
45
+ readonly changeClass: import("valibot").PicklistSchema<["docs", "test", "dependency", "config", "source", "schema", "unknown"], undefined>;
46
+ readonly changedFileCount: import("valibot").NullableSchema<import("valibot").NumberSchema<undefined>, undefined>;
47
+ readonly complexity: import("valibot").NullableSchema<import("valibot").NumberSchema<undefined>, undefined>;
48
+ readonly risk: import("valibot").NullableSchema<import("valibot").NumberSchema<undefined>, undefined>;
49
+ readonly impact: import("valibot").NullableSchema<import("valibot").NumberSchema<undefined>, undefined>;
50
+ readonly mergePresetId: import("valibot").NullableSchema<import("valibot").StringSchema<undefined>, undefined>;
51
+ readonly mergePresetName: import("valibot").NullableSchema<import("valibot").StringSchema<undefined>, undefined>;
52
+ readonly decision: import("valibot").PicklistSchema<["pending_review", "auto_merged", "human_merged", "external_merged", "rejected"], undefined>;
53
+ readonly reviewEffort: import("valibot").NullableSchema<import("valibot").PicklistSchema<["none", "minor", "major"], undefined>, undefined>;
54
+ readonly prNumber: import("valibot").NullableSchema<import("valibot").NumberSchema<undefined>, undefined>;
55
+ readonly prUrl: import("valibot").NullableSchema<import("valibot").StringSchema<undefined>, undefined>;
56
+ readonly repoId: import("valibot").NullableSchema<import("valibot").StringSchema<undefined>, undefined>;
57
+ readonly provider: import("valibot").NullableSchema<import("valibot").PicklistSchema<["github", "gitlab"], undefined>, undefined>;
58
+ readonly createdAt: import("valibot").NumberSchema<undefined>;
59
+ readonly resolvedAt: import("valibot").NullableSchema<import("valibot").NumberSchema<undefined>, undefined>;
60
+ readonly taggedAt: import("valibot").NullableSchema<import("valibot").NumberSchema<undefined>, undefined>;
61
+ }, undefined>;
62
+ };
63
+ } & {
64
+ readonly minScope: "read";
65
+ };
66
+ /**
67
+ * Every change class's accumulated track record for the key's workspace, as ONE aggregate.
68
+ *
69
+ * Registered ahead of the point read below so `rollups` cannot be taken for a record id. It
70
+ * cannot be one today (record ids are `mtr_*`), but the ordering is what keeps that true of a
71
+ * future id scheme rather than of this one.
72
+ */
73
+ export declare const listPublicMergeClassRollupsContract: {
74
+ readonly method: "get";
75
+ readonly pathResolver: () => string;
76
+ readonly responsesByStatusCode: {
77
+ readonly '4xx': import("valibot").ObjectSchema<{
78
+ readonly error: import("valibot").ObjectSchema<{
79
+ readonly code: import("valibot").StringSchema<undefined>;
80
+ readonly message: import("valibot").StringSchema<undefined>;
81
+ readonly details: import("valibot").OptionalSchema<import("valibot").UnknownSchema, undefined>;
82
+ readonly issues: import("valibot").OptionalSchema<import("valibot").ArraySchema<import("valibot").ObjectSchema<{
83
+ readonly path: import("valibot").OptionalSchema<import("valibot").StringSchema<undefined>, undefined>;
84
+ readonly message: import("valibot").StringSchema<undefined>;
85
+ }, undefined>, undefined>, undefined>;
86
+ }, undefined>;
87
+ }, undefined>;
88
+ readonly '5xx': import("valibot").ObjectSchema<{
89
+ readonly error: import("valibot").ObjectSchema<{
90
+ readonly code: import("valibot").StringSchema<undefined>;
91
+ readonly message: import("valibot").StringSchema<undefined>;
92
+ readonly details: import("valibot").OptionalSchema<import("valibot").UnknownSchema, undefined>;
93
+ readonly issues: import("valibot").OptionalSchema<import("valibot").ArraySchema<import("valibot").ObjectSchema<{
94
+ readonly path: import("valibot").OptionalSchema<import("valibot").StringSchema<undefined>, undefined>;
95
+ readonly message: import("valibot").StringSchema<undefined>;
96
+ }, undefined>, undefined>, undefined>;
97
+ }, undefined>;
98
+ }, undefined>;
99
+ readonly 200: import("valibot").ObjectSchema<{
100
+ readonly rollups: import("valibot").ArraySchema<import("valibot").ObjectSchema<{
101
+ readonly changeClass: import("valibot").PicklistSchema<["docs", "test", "dependency", "config", "source", "schema", "unknown"], undefined>;
102
+ readonly total: import("valibot").NumberSchema<undefined>;
103
+ readonly merged: import("valibot").NumberSchema<undefined>;
104
+ readonly autoMerged: import("valibot").NumberSchema<undefined>;
105
+ readonly humanMerged: import("valibot").NumberSchema<undefined>;
106
+ readonly externalMerged: import("valibot").NumberSchema<undefined>;
107
+ readonly rejected: import("valibot").NumberSchema<undefined>;
108
+ readonly pendingReview: import("valibot").NumberSchema<undefined>;
109
+ readonly effort: import("valibot").ObjectSchema<{
110
+ readonly none: import("valibot").NumberSchema<undefined>;
111
+ readonly minor: import("valibot").NumberSchema<undefined>;
112
+ readonly major: import("valibot").NumberSchema<undefined>;
113
+ readonly untagged: import("valibot").NumberSchema<undefined>;
114
+ }, undefined>;
115
+ }, undefined>, undefined>;
116
+ }, undefined>;
117
+ };
118
+ } & {
119
+ readonly minScope: "read";
120
+ };
121
+ /**
122
+ * One record by id: the read-back beside the tag write, so a caller holding a `recordId` (from
123
+ * a `merge_tag_request` card's payload, say) can see WHAT it is about to tag rather than tagging
124
+ * an opaque id.
125
+ */
126
+ export declare const getPublicMergeRecordContract: {
127
+ readonly method: "get";
128
+ readonly requestPathParamsSchema: import("valibot").ObjectSchema<{
129
+ recordId: import("valibot").StringSchema<undefined>;
130
+ }, undefined> & import("@toad-contracts/core").StandardObjectKeysV1<unknown, unknown>;
131
+ readonly pathResolver: ({ recordId }: {
132
+ recordId: string;
133
+ }) => string;
134
+ readonly responsesByStatusCode: {
135
+ readonly '4xx': import("valibot").ObjectSchema<{
136
+ readonly error: import("valibot").ObjectSchema<{
137
+ readonly code: import("valibot").StringSchema<undefined>;
138
+ readonly message: import("valibot").StringSchema<undefined>;
139
+ readonly details: import("valibot").OptionalSchema<import("valibot").UnknownSchema, undefined>;
140
+ readonly issues: import("valibot").OptionalSchema<import("valibot").ArraySchema<import("valibot").ObjectSchema<{
141
+ readonly path: import("valibot").OptionalSchema<import("valibot").StringSchema<undefined>, undefined>;
142
+ readonly message: import("valibot").StringSchema<undefined>;
143
+ }, undefined>, undefined>, undefined>;
144
+ }, undefined>;
145
+ }, undefined>;
146
+ readonly '5xx': import("valibot").ObjectSchema<{
147
+ readonly error: import("valibot").ObjectSchema<{
148
+ readonly code: import("valibot").StringSchema<undefined>;
149
+ readonly message: import("valibot").StringSchema<undefined>;
150
+ readonly details: import("valibot").OptionalSchema<import("valibot").UnknownSchema, undefined>;
151
+ readonly issues: import("valibot").OptionalSchema<import("valibot").ArraySchema<import("valibot").ObjectSchema<{
152
+ readonly path: import("valibot").OptionalSchema<import("valibot").StringSchema<undefined>, undefined>;
153
+ readonly message: import("valibot").StringSchema<undefined>;
154
+ }, undefined>, undefined>, undefined>;
155
+ }, undefined>;
156
+ }, undefined>;
157
+ readonly 200: import("valibot").ObjectSchema<{
158
+ readonly recordId: import("valibot").StringSchema<undefined>;
159
+ readonly taskId: import("valibot").StringSchema<undefined>;
160
+ readonly runId: import("valibot").NullableSchema<import("valibot").StringSchema<undefined>, undefined>;
161
+ readonly changeClass: import("valibot").PicklistSchema<["docs", "test", "dependency", "config", "source", "schema", "unknown"], undefined>;
162
+ readonly changedFileCount: import("valibot").NullableSchema<import("valibot").NumberSchema<undefined>, undefined>;
163
+ readonly complexity: import("valibot").NullableSchema<import("valibot").NumberSchema<undefined>, undefined>;
164
+ readonly risk: import("valibot").NullableSchema<import("valibot").NumberSchema<undefined>, undefined>;
165
+ readonly impact: import("valibot").NullableSchema<import("valibot").NumberSchema<undefined>, undefined>;
166
+ readonly mergePresetId: import("valibot").NullableSchema<import("valibot").StringSchema<undefined>, undefined>;
167
+ readonly mergePresetName: import("valibot").NullableSchema<import("valibot").StringSchema<undefined>, undefined>;
168
+ readonly decision: import("valibot").PicklistSchema<["pending_review", "auto_merged", "human_merged", "external_merged", "rejected"], undefined>;
169
+ readonly reviewEffort: import("valibot").NullableSchema<import("valibot").PicklistSchema<["none", "minor", "major"], undefined>, undefined>;
170
+ readonly prNumber: import("valibot").NullableSchema<import("valibot").NumberSchema<undefined>, undefined>;
171
+ readonly prUrl: import("valibot").NullableSchema<import("valibot").StringSchema<undefined>, undefined>;
172
+ readonly repoId: import("valibot").NullableSchema<import("valibot").StringSchema<undefined>, undefined>;
173
+ readonly provider: import("valibot").NullableSchema<import("valibot").PicklistSchema<["github", "gitlab"], undefined>, undefined>;
174
+ readonly createdAt: import("valibot").NumberSchema<undefined>;
175
+ readonly resolvedAt: import("valibot").NullableSchema<import("valibot").NumberSchema<undefined>, undefined>;
176
+ readonly taggedAt: import("valibot").NullableSchema<import("valibot").NumberSchema<undefined>, undefined>;
177
+ }, undefined>;
178
+ };
179
+ } & {
180
+ readonly minScope: "read";
181
+ };
182
+ /**
183
+ * Tag (or clear, with `null`) the reviewer effort a human spent on the pull request a record
184
+ * covers. `write`, not `admin`: this records evidence about a decision that already happened.
185
+ *
186
+ * Idempotent (the same tag applied twice leaves the same row) and orthogonal to the decision, so
187
+ * a record may be tagged whenever the effort becomes known, including long after the merge.
188
+ */
189
+ export declare const tagPublicMergeReviewEffortContract: {
190
+ readonly method: "post";
191
+ readonly requestPathParamsSchema: import("valibot").ObjectSchema<{
192
+ recordId: import("valibot").StringSchema<undefined>;
193
+ }, undefined> & import("@toad-contracts/core").StandardObjectKeysV1<unknown, unknown>;
194
+ readonly pathResolver: ({ recordId }: {
195
+ recordId: string;
196
+ }) => string;
197
+ readonly requestBodySchema: import("valibot").ObjectSchema<{
198
+ readonly reviewEffort: import("valibot").NullableSchema<import("valibot").PicklistSchema<["none", "minor", "major"], undefined>, undefined>;
199
+ }, undefined>;
200
+ readonly responsesByStatusCode: {
201
+ readonly '4xx': import("valibot").ObjectSchema<{
202
+ readonly error: import("valibot").ObjectSchema<{
203
+ readonly code: import("valibot").StringSchema<undefined>;
204
+ readonly message: import("valibot").StringSchema<undefined>;
205
+ readonly details: import("valibot").OptionalSchema<import("valibot").UnknownSchema, undefined>;
206
+ readonly issues: import("valibot").OptionalSchema<import("valibot").ArraySchema<import("valibot").ObjectSchema<{
207
+ readonly path: import("valibot").OptionalSchema<import("valibot").StringSchema<undefined>, undefined>;
208
+ readonly message: import("valibot").StringSchema<undefined>;
209
+ }, undefined>, undefined>, undefined>;
210
+ }, undefined>;
211
+ }, undefined>;
212
+ readonly '5xx': import("valibot").ObjectSchema<{
213
+ readonly error: import("valibot").ObjectSchema<{
214
+ readonly code: import("valibot").StringSchema<undefined>;
215
+ readonly message: import("valibot").StringSchema<undefined>;
216
+ readonly details: import("valibot").OptionalSchema<import("valibot").UnknownSchema, undefined>;
217
+ readonly issues: import("valibot").OptionalSchema<import("valibot").ArraySchema<import("valibot").ObjectSchema<{
218
+ readonly path: import("valibot").OptionalSchema<import("valibot").StringSchema<undefined>, undefined>;
219
+ readonly message: import("valibot").StringSchema<undefined>;
220
+ }, undefined>, undefined>, undefined>;
221
+ }, undefined>;
222
+ }, undefined>;
223
+ readonly 200: import("valibot").ObjectSchema<{
224
+ readonly recordId: import("valibot").StringSchema<undefined>;
225
+ readonly taskId: import("valibot").StringSchema<undefined>;
226
+ readonly runId: import("valibot").NullableSchema<import("valibot").StringSchema<undefined>, undefined>;
227
+ readonly changeClass: import("valibot").PicklistSchema<["docs", "test", "dependency", "config", "source", "schema", "unknown"], undefined>;
228
+ readonly changedFileCount: import("valibot").NullableSchema<import("valibot").NumberSchema<undefined>, undefined>;
229
+ readonly complexity: import("valibot").NullableSchema<import("valibot").NumberSchema<undefined>, undefined>;
230
+ readonly risk: import("valibot").NullableSchema<import("valibot").NumberSchema<undefined>, undefined>;
231
+ readonly impact: import("valibot").NullableSchema<import("valibot").NumberSchema<undefined>, undefined>;
232
+ readonly mergePresetId: import("valibot").NullableSchema<import("valibot").StringSchema<undefined>, undefined>;
233
+ readonly mergePresetName: import("valibot").NullableSchema<import("valibot").StringSchema<undefined>, undefined>;
234
+ readonly decision: import("valibot").PicklistSchema<["pending_review", "auto_merged", "human_merged", "external_merged", "rejected"], undefined>;
235
+ readonly reviewEffort: import("valibot").NullableSchema<import("valibot").PicklistSchema<["none", "minor", "major"], undefined>, undefined>;
236
+ readonly prNumber: import("valibot").NullableSchema<import("valibot").NumberSchema<undefined>, undefined>;
237
+ readonly prUrl: import("valibot").NullableSchema<import("valibot").StringSchema<undefined>, undefined>;
238
+ readonly repoId: import("valibot").NullableSchema<import("valibot").StringSchema<undefined>, undefined>;
239
+ readonly provider: import("valibot").NullableSchema<import("valibot").PicklistSchema<["github", "gitlab"], undefined>, undefined>;
240
+ readonly createdAt: import("valibot").NumberSchema<undefined>;
241
+ readonly resolvedAt: import("valibot").NullableSchema<import("valibot").NumberSchema<undefined>, undefined>;
242
+ readonly taggedAt: import("valibot").NullableSchema<import("valibot").NumberSchema<undefined>, undefined>;
243
+ }, undefined>;
244
+ };
245
+ } & {
246
+ readonly minScope: "write";
247
+ };
248
+ //# sourceMappingURL=public-merge-evidence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-merge-evidence.d.ts","sourceRoot":"","sources":["../../src/routes/public-merge-evidence.ts"],"names":[],"mappings":"AAiCA;;;;;;;;GAQG;AACH,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQ3C,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAO/C,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQxC,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAS9C,CAAA"}
@@ -0,0 +1,80 @@
1
+ import { defineApiContract } from '@toad-contracts/valibot';
2
+ import { tagReviewEffortSchema } from '../mergeTrackRecord.js';
3
+ import { publicMergeClassRollupListSchema, publicMergeRecordSchema, } from '../public-merge-evidence.js';
4
+ import { errorResponses, singleStringParam, withMinScope } from './_shared.js';
5
+ // ---------------------------------------------------------------------------
6
+ // Route contracts for the public MERGE-EVIDENCE surface: absolute `/api/v1` paths,
7
+ // authenticated in-controller by a public-API key. The wire shapes and the reasoning behind
8
+ // them live in `../public-merge-evidence.ts`; the feature itself is
9
+ // `backend/docs/adr/0046-merge-track-record.md`.
10
+ //
11
+ // The scope split is the whole point of the surface, and it is deliberately NOT the one `act`
12
+ // carries. `POST /api/v1/notifications/:id/act` is `admin` because it MERGES a pull request for
13
+ // real; TAGGING how much review an already-landed pull request needed performs no external
14
+ // side-effect and cannot merge anything, so it is `write`, and the reads are `read` like every
15
+ // other read on this API. An integration that watches a board and records review effort
16
+ // therefore needs neither merge rights nor the ability to delete a task, where before the only
17
+ // way to record a tag at all was through the `admin`-scoped `act`.
18
+ //
19
+ // The two workspace-scoped point routes are addressed by RECORD id and re-apply the key's
20
+ // workspace to the row they load, which is the rule every point read on this API follows
21
+ // (`/api/v1/debug/llm-calls/:callId`, `/api/v1/artifacts/:artifactId/blob`). The run-scoped read
22
+ // is under `/api/v1/runs/:runId/*` and therefore carries that prefix's ONE access semantic
23
+ // instead: a run this key could already reach through `GET /jobs/:id` or
24
+ // `GET /tasks/:taskId/run`. See `PublicEvidenceController` for why a prefix may carry only one.
25
+ // ---------------------------------------------------------------------------
26
+ const runIdParams = singleStringParam('runId');
27
+ const recordIdParams = singleStringParam('recordId');
28
+ /**
29
+ * The merge decision a RUN left behind: its change class, the merger's scores, what happened,
30
+ * and the effort tag if one has been recorded.
31
+ *
32
+ * The entry point of the loop for a caller that started the run and holds its id, and the read
33
+ * that hands it the `recordId` the tag route takes. A run whose pipeline had no `merger` step
34
+ * (or whose merge path never got far enough to classify) has no record, and that is a `404`
35
+ * rather than an empty object: "this run made no merge decision" is a fact about the run.
36
+ */
37
+ export const getPublicRunMergeRecordContract = withMinScope('read', defineApiContract({
38
+ method: 'get',
39
+ requestPathParamsSchema: runIdParams,
40
+ pathResolver: ({ runId }) => `/api/v1/runs/${runId}/merge-record`,
41
+ responsesByStatusCode: { 200: publicMergeRecordSchema, ...errorResponses },
42
+ }));
43
+ /**
44
+ * Every change class's accumulated track record for the key's workspace, as ONE aggregate.
45
+ *
46
+ * Registered ahead of the point read below so `rollups` cannot be taken for a record id. It
47
+ * cannot be one today (record ids are `mtr_*`), but the ordering is what keeps that true of a
48
+ * future id scheme rather than of this one.
49
+ */
50
+ export const listPublicMergeClassRollupsContract = withMinScope('read', defineApiContract({
51
+ method: 'get',
52
+ pathResolver: () => '/api/v1/merge-records/rollups',
53
+ responsesByStatusCode: { 200: publicMergeClassRollupListSchema, ...errorResponses },
54
+ }));
55
+ /**
56
+ * One record by id: the read-back beside the tag write, so a caller holding a `recordId` (from
57
+ * a `merge_tag_request` card's payload, say) can see WHAT it is about to tag rather than tagging
58
+ * an opaque id.
59
+ */
60
+ export const getPublicMergeRecordContract = withMinScope('read', defineApiContract({
61
+ method: 'get',
62
+ requestPathParamsSchema: recordIdParams,
63
+ pathResolver: ({ recordId }) => `/api/v1/merge-records/${recordId}`,
64
+ responsesByStatusCode: { 200: publicMergeRecordSchema, ...errorResponses },
65
+ }));
66
+ /**
67
+ * Tag (or clear, with `null`) the reviewer effort a human spent on the pull request a record
68
+ * covers. `write`, not `admin`: this records evidence about a decision that already happened.
69
+ *
70
+ * Idempotent (the same tag applied twice leaves the same row) and orthogonal to the decision, so
71
+ * a record may be tagged whenever the effort becomes known, including long after the merge.
72
+ */
73
+ export const tagPublicMergeReviewEffortContract = withMinScope('write', defineApiContract({
74
+ method: 'post',
75
+ requestPathParamsSchema: recordIdParams,
76
+ pathResolver: ({ recordId }) => `/api/v1/merge-records/${recordId}/effort`,
77
+ requestBodySchema: tagReviewEffortSchema,
78
+ responsesByStatusCode: { 200: publicMergeRecordSchema, ...errorResponses },
79
+ }));
80
+ //# sourceMappingURL=public-merge-evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-merge-evidence.js","sourceRoot":"","sources":["../../src/routes/public-merge-evidence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,EACL,gCAAgC,EAChC,uBAAuB,GACxB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE9E,8EAA8E;AAC9E,mFAAmF;AACnF,4FAA4F;AAC5F,oEAAoE;AACpE,iDAAiD;AACjD,EAAE;AACF,8FAA8F;AAC9F,gGAAgG;AAChG,2FAA2F;AAC3F,+FAA+F;AAC/F,wFAAwF;AACxF,+FAA+F;AAC/F,mEAAmE;AACnE,EAAE;AACF,0FAA0F;AAC1F,yFAAyF;AACzF,iGAAiG;AACjG,2FAA2F;AAC3F,yEAAyE;AACzE,gGAAgG;AAChG,8EAA8E;AAE9E,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAA;AAC9C,MAAM,cAAc,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAA;AAEpD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,YAAY,CACzD,MAAM,EACN,iBAAiB,CAAC;IAChB,MAAM,EAAE,KAAK;IACb,uBAAuB,EAAE,WAAW;IACpC,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,gBAAgB,KAAK,eAAe;IACjE,qBAAqB,EAAE,EAAE,GAAG,EAAE,uBAAuB,EAAE,GAAG,cAAc,EAAE;CAC3E,CAAC,CACH,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mCAAmC,GAAG,YAAY,CAC7D,MAAM,EACN,iBAAiB,CAAC;IAChB,MAAM,EAAE,KAAK;IACb,YAAY,EAAE,GAAG,EAAE,CAAC,+BAA+B;IACnD,qBAAqB,EAAE,EAAE,GAAG,EAAE,gCAAgC,EAAE,GAAG,cAAc,EAAE;CACpF,CAAC,CACH,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,YAAY,CACtD,MAAM,EACN,iBAAiB,CAAC;IAChB,MAAM,EAAE,KAAK;IACb,uBAAuB,EAAE,cAAc;IACvC,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,yBAAyB,QAAQ,EAAE;IACnE,qBAAqB,EAAE,EAAE,GAAG,EAAE,uBAAuB,EAAE,GAAG,cAAc,EAAE;CAC3E,CAAC,CACH,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG,YAAY,CAC5D,OAAO,EACP,iBAAiB,CAAC;IAChB,MAAM,EAAE,MAAM;IACd,uBAAuB,EAAE,cAAc;IACvC,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,yBAAyB,QAAQ,SAAS;IAC1E,iBAAiB,EAAE,qBAAqB;IACxC,qBAAqB,EAAE,EAAE,GAAG,EAAE,uBAAuB,EAAE,GAAG,cAAc,EAAE;CAC3E,CAAC,CACH,CAAA"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * The service's in-repo specification: the structured requirement tree, the rendered Gherkin, and
3
+ * the ref + commit both were read at.
4
+ *
5
+ * `read` scope, like every other discovery and evidence read here. It is a read of what the
6
+ * service is committed to honouring, and an integration reviewing a run's outcome must be able to
7
+ * see the criteria it was scored against without holding a key that could also merge a pull
8
+ * request.
9
+ *
10
+ * Read-only by design, not by omission: see the note at the top of `../public-spec.ts`.
11
+ */
12
+ export declare const getPublicServiceSpecContract: {
13
+ readonly method: "get";
14
+ readonly requestPathParamsSchema: import("valibot").ObjectSchema<{
15
+ serviceId: import("valibot").StringSchema<undefined>;
16
+ }, undefined> & import("@toad-contracts/core").StandardObjectKeysV1<unknown, unknown>;
17
+ readonly pathResolver: ({ serviceId }: {
18
+ serviceId: string;
19
+ }) => string;
20
+ readonly responsesByStatusCode: {
21
+ readonly '4xx': import("valibot").ObjectSchema<{
22
+ readonly error: import("valibot").ObjectSchema<{
23
+ readonly code: import("valibot").StringSchema<undefined>;
24
+ readonly message: import("valibot").StringSchema<undefined>;
25
+ readonly details: import("valibot").OptionalSchema<import("valibot").UnknownSchema, undefined>;
26
+ readonly issues: import("valibot").OptionalSchema<import("valibot").ArraySchema<import("valibot").ObjectSchema<{
27
+ readonly path: import("valibot").OptionalSchema<import("valibot").StringSchema<undefined>, undefined>;
28
+ readonly message: import("valibot").StringSchema<undefined>;
29
+ }, undefined>, undefined>, undefined>;
30
+ }, undefined>;
31
+ }, undefined>;
32
+ readonly '5xx': import("valibot").ObjectSchema<{
33
+ readonly error: import("valibot").ObjectSchema<{
34
+ readonly code: import("valibot").StringSchema<undefined>;
35
+ readonly message: import("valibot").StringSchema<undefined>;
36
+ readonly details: import("valibot").OptionalSchema<import("valibot").UnknownSchema, undefined>;
37
+ readonly issues: import("valibot").OptionalSchema<import("valibot").ArraySchema<import("valibot").ObjectSchema<{
38
+ readonly path: import("valibot").OptionalSchema<import("valibot").StringSchema<undefined>, undefined>;
39
+ readonly message: import("valibot").StringSchema<undefined>;
40
+ }, undefined>, undefined>, undefined>;
41
+ }, undefined>;
42
+ }, undefined>;
43
+ readonly 200: import("valibot").ObjectSchema<{
44
+ readonly serviceId: import("valibot").StringSchema<undefined>;
45
+ readonly anchor: import("valibot").PicklistSchema<["present", "absent", "unparsed"], undefined>;
46
+ readonly spec: import("valibot").NullableSchema<import("valibot").ObjectSchema<{
47
+ readonly summary: import("valibot").OptionalSchema<import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").MaxLengthAction<string, 2000, undefined>]>, "">;
48
+ readonly modules: import("valibot").OptionalSchema<import("valibot").ArraySchema<import("valibot").ObjectSchema<{
49
+ readonly name: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").TrimAction, import("valibot").MinLengthAction<string, 1, undefined>, import("valibot").MaxLengthAction<string, 120, undefined>]>;
50
+ readonly summary: import("valibot").OptionalSchema<import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").MaxLengthAction<string, 2000, undefined>]>, "">;
51
+ readonly groups: import("valibot").OptionalSchema<import("valibot").ArraySchema<import("valibot").ObjectSchema<{
52
+ readonly name: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").TrimAction, import("valibot").MinLengthAction<string, 1, undefined>, import("valibot").MaxLengthAction<string, 120, undefined>]>;
53
+ readonly summary: import("valibot").OptionalSchema<import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").MaxLengthAction<string, 2000, undefined>]>, "">;
54
+ readonly requirements: import("valibot").OptionalSchema<import("valibot").ArraySchema<import("valibot").ObjectSchema<{
55
+ readonly id: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").TrimAction, import("valibot").MinLengthAction<string, 1, undefined>, import("valibot").MaxLengthAction<string, 200, undefined>]>;
56
+ readonly title: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").TrimAction, import("valibot").MinLengthAction<string, 1, undefined>, import("valibot").MaxLengthAction<string, 120, undefined>]>;
57
+ readonly statement: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").TrimAction, import("valibot").MinLengthAction<string, 1, undefined>, import("valibot").MaxLengthAction<string, 4000, undefined>]>;
58
+ readonly kind: import("valibot").PicklistSchema<["functional", "nonfunctional", "constraint"], undefined>;
59
+ readonly priority: import("valibot").PicklistSchema<["must", "should", "could"], undefined>;
60
+ readonly state: import("valibot").OptionalSchema<import("valibot").PicklistSchema<["aspirational", "established"], undefined>, "aspirational">;
61
+ readonly sourceBlockIds: import("valibot").OptionalSchema<import("valibot").ArraySchema<import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").TrimAction, import("valibot").MinLengthAction<string, 1, undefined>, import("valibot").MaxLengthAction<string, 200, undefined>]>, undefined>, readonly []>;
62
+ readonly acceptance: import("valibot").OptionalSchema<import("valibot").ArraySchema<import("valibot").ObjectSchema<{
63
+ readonly id: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").TrimAction, import("valibot").MinLengthAction<string, 1, undefined>, import("valibot").MaxLengthAction<string, 200, undefined>]>;
64
+ readonly given: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").MaxLengthAction<string, 2000, undefined>]>;
65
+ readonly when: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").MaxLengthAction<string, 2000, undefined>]>;
66
+ readonly outcome: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").MaxLengthAction<string, 2000, undefined>]>;
67
+ }, undefined>, undefined>, readonly []>;
68
+ }, undefined>, undefined>, readonly []>;
69
+ readonly rules: import("valibot").OptionalSchema<import("valibot").ArraySchema<import("valibot").ObjectSchema<{
70
+ readonly id: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").TrimAction, import("valibot").MinLengthAction<string, 1, undefined>, import("valibot").MaxLengthAction<string, 200, undefined>]>;
71
+ readonly rule: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").TrimAction, import("valibot").MinLengthAction<string, 1, undefined>, import("valibot").MaxLengthAction<string, 4000, undefined>]>;
72
+ readonly rationale: import("valibot").OptionalSchema<import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").MaxLengthAction<string, 2000, undefined>]>, "">;
73
+ readonly sourceBlockIds: import("valibot").OptionalSchema<import("valibot").ArraySchema<import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").TrimAction, import("valibot").MinLengthAction<string, 1, undefined>, import("valibot").MaxLengthAction<string, 200, undefined>]>, undefined>, readonly []>;
74
+ }, undefined>, undefined>, readonly []>;
75
+ }, undefined>, undefined>, readonly []>;
76
+ }, undefined>, undefined>, readonly []>;
77
+ readonly service: import("valibot").OptionalSchema<import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").TrimAction, import("valibot").MaxLengthAction<string, 120, undefined>]>, "">;
78
+ }, undefined>, undefined>;
79
+ readonly features: import("valibot").ArraySchema<import("valibot").ObjectSchema<{
80
+ readonly module: import("valibot").StringSchema<undefined>;
81
+ readonly group: import("valibot").StringSchema<undefined>;
82
+ readonly path: import("valibot").StringSchema<undefined>;
83
+ readonly content: import("valibot").StringSchema<undefined>;
84
+ readonly chars: import("valibot").NumberSchema<undefined>;
85
+ readonly totalChars: import("valibot").NumberSchema<undefined>;
86
+ readonly truncated: import("valibot").BooleanSchema<undefined>;
87
+ }, undefined>, undefined>;
88
+ readonly provenance: import("valibot").ObjectSchema<{
89
+ readonly provider: import("valibot").PicklistSchema<["github", "gitlab"], undefined>;
90
+ readonly owner: import("valibot").StringSchema<undefined>;
91
+ readonly repo: import("valibot").StringSchema<undefined>;
92
+ readonly ref: import("valibot").StringSchema<undefined>;
93
+ readonly commit: import("valibot").NullableSchema<import("valibot").StringSchema<undefined>, undefined>;
94
+ }, undefined>;
95
+ readonly issues: import("valibot").ArraySchema<import("valibot").ObjectSchema<{
96
+ readonly path: import("valibot").StringSchema<undefined>;
97
+ readonly kind: import("valibot").PicklistSchema<["read_failed", "unparsed", "partial", "unread"], undefined>;
98
+ readonly dropped: import("valibot").OptionalSchema<import("valibot").NullableSchema<import("valibot").NumberSchema<undefined>, undefined>, 0>;
99
+ }, undefined>, undefined>;
100
+ readonly truncations: import("valibot").ArraySchema<import("valibot").ObjectSchema<{
101
+ readonly section: import("valibot").PicklistSchema<["requirements", "rules", "acceptance", "features", "issues"], undefined>;
102
+ readonly shown: import("valibot").NumberSchema<undefined>;
103
+ readonly total: import("valibot").NumberSchema<undefined>;
104
+ }, undefined>, undefined>;
105
+ }, undefined>;
106
+ };
107
+ } & {
108
+ readonly minScope: "read";
109
+ };
110
+ //# sourceMappingURL=public-spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-spec.d.ts","sourceRoot":"","sources":["../../src/routes/public-spec.ts"],"names":[],"mappings":"AAeA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQxC,CAAA"}
@@ -0,0 +1,31 @@
1
+ import { defineApiContract } from '@toad-contracts/valibot';
2
+ import { publicServiceSpecSchema } from '../public-spec.js';
3
+ import { errorResponses, singleStringParam, withMinScope } from './_shared.js';
4
+ // ---------------------------------------------------------------------------
5
+ // The public SPEC read: absolute `/api/v1` path, authenticated in-controller by a public-API key.
6
+ // The wire shape and the reasoning behind it live in `../public-spec.ts`; the honesty contract the
7
+ // controller implements (four outcomes, never folded) is in `PublicSpecController`.
8
+ //
9
+ // Addressed under `/api/v1/services/:serviceId/*`, beside `…/tasks`, because a spec is a fact about
10
+ // a SERVICE. The `serviceId` is the board service-frame id every other endpoint on this surface
11
+ // already uses, and it resolves through the same board read, so a key can only ever name a service
12
+ // of its own workspace.
13
+ // ---------------------------------------------------------------------------
14
+ /**
15
+ * The service's in-repo specification: the structured requirement tree, the rendered Gherkin, and
16
+ * the ref + commit both were read at.
17
+ *
18
+ * `read` scope, like every other discovery and evidence read here. It is a read of what the
19
+ * service is committed to honouring, and an integration reviewing a run's outcome must be able to
20
+ * see the criteria it was scored against without holding a key that could also merge a pull
21
+ * request.
22
+ *
23
+ * Read-only by design, not by omission: see the note at the top of `../public-spec.ts`.
24
+ */
25
+ export const getPublicServiceSpecContract = withMinScope('read', defineApiContract({
26
+ method: 'get',
27
+ requestPathParamsSchema: singleStringParam('serviceId'),
28
+ pathResolver: ({ serviceId }) => `/api/v1/services/${serviceId}/spec`,
29
+ responsesByStatusCode: { 200: publicServiceSpecSchema, ...errorResponses },
30
+ }));
31
+ //# sourceMappingURL=public-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-spec.js","sourceRoot":"","sources":["../../src/routes/public-spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE9E,8EAA8E;AAC9E,kGAAkG;AAClG,mGAAmG;AACnG,oFAAoF;AACpF,EAAE;AACF,oGAAoG;AACpG,gGAAgG;AAChG,mGAAmG;AACnG,wBAAwB;AACxB,8EAA8E;AAE9E;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,YAAY,CACtD,MAAM,EACN,iBAAiB,CAAC;IAChB,MAAM,EAAE,KAAK;IACb,uBAAuB,EAAE,iBAAiB,CAAC,WAAW,CAAC;IACvD,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,oBAAoB,SAAS,OAAO;IACrE,qBAAqB,EAAE,EAAE,GAAG,EAAE,uBAAuB,EAAE,GAAG,cAAc,EAAE;CAC3E,CAAC,CACH,CAAA"}
@@ -32,7 +32,6 @@ export declare const getServiceSpecContract: {
32
32
  readonly 200: import("valibot").ObjectSchema<{
33
33
  readonly present: import("valibot").BooleanSchema<undefined>;
34
34
  readonly spec: import("valibot").NullableSchema<import("valibot").ObjectSchema<{
35
- readonly service: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").TrimAction, import("valibot").MinLengthAction<string, 1, undefined>, import("valibot").MaxLengthAction<string, 120, undefined>]>;
36
35
  readonly summary: import("valibot").OptionalSchema<import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").MaxLengthAction<string, 2000, undefined>]>, "">;
37
36
  readonly modules: import("valibot").OptionalSchema<import("valibot").ArraySchema<import("valibot").ObjectSchema<{
38
37
  readonly name: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").TrimAction, import("valibot").MinLengthAction<string, 1, undefined>, import("valibot").MaxLengthAction<string, 120, undefined>]>;
@@ -63,6 +62,7 @@ export declare const getServiceSpecContract: {
63
62
  }, undefined>, undefined>, readonly []>;
64
63
  }, undefined>, undefined>, readonly []>;
65
64
  }, undefined>, undefined>, readonly []>;
65
+ readonly service: import("valibot").OptionalSchema<import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").TrimAction, import("valibot").MaxLengthAction<string, 120, undefined>]>, "">;
66
66
  }, undefined>, undefined>;
67
67
  readonly features: import("valibot").ArraySchema<import("valibot").ObjectSchema<{
68
68
  readonly module: import("valibot").StringSchema<undefined>;
@@ -70,6 +70,14 @@ export declare const getServiceSpecContract: {
70
70
  readonly path: import("valibot").StringSchema<undefined>;
71
71
  readonly content: import("valibot").StringSchema<undefined>;
72
72
  }, undefined>, undefined>;
73
+ readonly diagnostics: import("valibot").OptionalSchema<import("valibot").ObjectSchema<{
74
+ readonly anchor: import("valibot").PicklistSchema<["present", "absent", "read_failed", "unparsed"], undefined>;
75
+ readonly issues: import("valibot").ArraySchema<import("valibot").ObjectSchema<{
76
+ readonly path: import("valibot").StringSchema<undefined>;
77
+ readonly kind: import("valibot").PicklistSchema<["read_failed", "unparsed", "partial", "unread"], undefined>;
78
+ readonly dropped: import("valibot").OptionalSchema<import("valibot").NullableSchema<import("valibot").NumberSchema<undefined>, undefined>, 0>;
79
+ }, undefined>, undefined>;
80
+ }, undefined>, undefined>;
73
81
  }, undefined>;
74
82
  };
75
83
  };
@@ -116,7 +124,6 @@ export declare const getRunSpecContract: {
116
124
  readonly 200: import("valibot").ObjectSchema<{
117
125
  readonly present: import("valibot").BooleanSchema<undefined>;
118
126
  readonly spec: import("valibot").NullableSchema<import("valibot").ObjectSchema<{
119
- readonly service: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").TrimAction, import("valibot").MinLengthAction<string, 1, undefined>, import("valibot").MaxLengthAction<string, 120, undefined>]>;
120
127
  readonly summary: import("valibot").OptionalSchema<import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").MaxLengthAction<string, 2000, undefined>]>, "">;
121
128
  readonly modules: import("valibot").OptionalSchema<import("valibot").ArraySchema<import("valibot").ObjectSchema<{
122
129
  readonly name: import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").TrimAction, import("valibot").MinLengthAction<string, 1, undefined>, import("valibot").MaxLengthAction<string, 120, undefined>]>;
@@ -147,6 +154,7 @@ export declare const getRunSpecContract: {
147
154
  }, undefined>, undefined>, readonly []>;
148
155
  }, undefined>, undefined>, readonly []>;
149
156
  }, undefined>, undefined>, readonly []>;
157
+ readonly service: import("valibot").OptionalSchema<import("valibot").SchemaWithPipe<readonly [import("valibot").StringSchema<undefined>, import("valibot").TrimAction, import("valibot").MaxLengthAction<string, 120, undefined>]>, "">;
150
158
  }, undefined>, undefined>;
151
159
  readonly features: import("valibot").ArraySchema<import("valibot").ObjectSchema<{
152
160
  readonly module: import("valibot").StringSchema<undefined>;
@@ -154,6 +162,14 @@ export declare const getRunSpecContract: {
154
162
  readonly path: import("valibot").StringSchema<undefined>;
155
163
  readonly content: import("valibot").StringSchema<undefined>;
156
164
  }, undefined>, undefined>;
165
+ readonly diagnostics: import("valibot").OptionalSchema<import("valibot").ObjectSchema<{
166
+ readonly anchor: import("valibot").PicklistSchema<["present", "absent", "read_failed", "unparsed"], undefined>;
167
+ readonly issues: import("valibot").ArraySchema<import("valibot").ObjectSchema<{
168
+ readonly path: import("valibot").StringSchema<undefined>;
169
+ readonly kind: import("valibot").PicklistSchema<["read_failed", "unparsed", "partial", "unread"], undefined>;
170
+ readonly dropped: import("valibot").OptionalSchema<import("valibot").NullableSchema<import("valibot").NumberSchema<undefined>, undefined>, 0>;
171
+ }, undefined>, undefined>;
172
+ }, undefined>, undefined>;
157
173
  }, undefined>;
158
174
  };
159
175
  };
@@ -1 +1 @@
1
- {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../src/routes/spec.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAKjC,CAAA;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAK7B,CAAA"}
1
+ {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../src/routes/spec.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAKjC,CAAA;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAK7B,CAAA"}