@cat-factory/contracts 0.319.0 → 0.322.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/debug-api.d.ts +1 -1
- package/dist/debug-api.d.ts.map +1 -1
- package/dist/debug-api.js +3 -7
- package/dist/debug-api.js.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +7 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/kaizen.d.ts +74 -0
- package/dist/kaizen.d.ts.map +1 -1
- package/dist/kaizen.js +37 -0
- package/dist/kaizen.js.map +1 -1
- package/dist/public-api.d.ts +31 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +33 -21
- package/dist/public-api.js.map +1 -1
- package/dist/public-kaizen.d.ts +316 -0
- package/dist/public-kaizen.d.ts.map +1 -0
- package/dist/public-kaizen.js +218 -0
- package/dist/public-kaizen.js.map +1 -0
- package/dist/public-paging.d.ts +24 -0
- package/dist/public-paging.d.ts.map +1 -0
- package/dist/public-paging.js +41 -0
- package/dist/public-paging.js.map +1 -0
- package/dist/public-provisioning.d.ts +193 -0
- package/dist/public-provisioning.d.ts.map +1 -1
- package/dist/public-provisioning.js +161 -0
- package/dist/public-provisioning.js.map +1 -1
- package/dist/routes/index.d.ts +1 -0
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +1 -0
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/kaizen.d.ts +6 -0
- package/dist/routes/kaizen.d.ts.map +1 -1
- package/dist/routes/public-api.d.ts +4 -0
- package/dist/routes/public-api.d.ts.map +1 -1
- package/dist/routes/public-board.d.ts +4 -0
- package/dist/routes/public-board.d.ts.map +1 -1
- package/dist/routes/public-kaizen.d.ts +240 -0
- package/dist/routes/public-kaizen.d.ts.map +1 -0
- package/dist/routes/public-kaizen.js +64 -0
- package/dist/routes/public-kaizen.js.map +1 -0
- package/dist/routes/public-provisioning.d.ts +147 -0
- package/dist/routes/public-provisioning.d.ts.map +1 -1
- package/dist/routes/public-provisioning.js +60 -2
- package/dist/routes/public-provisioning.js.map +1 -1
- package/dist/routes/sandbox.d.ts +20 -10
- package/dist/routes/sandbox.d.ts.map +1 -1
- package/dist/routes/sandbox.js +12 -2
- package/dist/routes/sandbox.js.map +1 -1
- package/dist/routes/tasks.d.ts +1 -1
- package/dist/sandbox.d.ts +70 -13
- package/dist/sandbox.d.ts.map +1 -1
- package/dist/sandbox.js +41 -2
- package/dist/sandbox.js.map +1 -1
- package/dist/tasks.d.ts +11 -2
- package/dist/tasks.d.ts.map +1 -1
- package/dist/tasks.js +10 -0
- package/dist/tasks.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
import { kaizenGradingStatusSchema } from './kaizen.js';
|
|
3
|
+
import { publicTaskStatusSchema } from './public-api.js';
|
|
4
|
+
import { booleanQuerySchema, cursorSchema, epochMsQuerySchema, pageLimitSchema, } from './public-paging.js';
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Public KAIZEN-ENTRY wire shapes (`/api/v1/kaizen/entries`, `…/{entryId}`, `…/acknowledge`).
|
|
7
|
+
//
|
|
8
|
+
// A Kaizen entry is one post-run grading of one agent step: how smooth or chaotic that
|
|
9
|
+
// interaction was, and what the grader recommends changing (`KaizenService`). Inside
|
|
10
|
+
// the app they are read one board at a time — the Kaizen screen's bounded history, and the
|
|
11
|
+
// per-run status strip in the run window — which is enough for a person browsing, and useless
|
|
12
|
+
// for the thing this surface exists for: a continuous-improvement loop that has to consume EVERY
|
|
13
|
+
// entry exactly once, file the recommendations somewhere, and come back for what is new.
|
|
14
|
+
//
|
|
15
|
+
// Three rules shape these shapes:
|
|
16
|
+
//
|
|
17
|
+
// 1. **The list is workspace-wide and keyset-paginated, with NO run or task required up front.**
|
|
18
|
+
// An improvement loop does not know which runs produced recommendations; that is what it is
|
|
19
|
+
// asking. Every other Kaizen read makes the caller name a run first, which is the one thing
|
|
20
|
+
// it cannot supply.
|
|
21
|
+
// 2. **An entry carries the investigative context, not just the grade.** The point of reading
|
|
22
|
+
// one is deciding whether to act on it, and that decision needs to know WHAT was graded
|
|
23
|
+
// (agent kind, resolved model, prompt version), WHERE (run, step index, task, service) and
|
|
24
|
+
// whether the combo it names is already verified and therefore no longer being graded.
|
|
25
|
+
// Everything here is either on the grading row or one batched lookup away; the run's own
|
|
26
|
+
// detail stays behind `GET /api/v1/debug/runs/{runId}`, which the `runId` joins onto.
|
|
27
|
+
// 3. **Acknowledgement is the entry's own state**, written only through this surface and never
|
|
28
|
+
// by the grading sweep. It is what makes the loop incremental: `?acknowledged=false` is the
|
|
29
|
+
// backlog, and acknowledging is what takes an entry out of it.
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
/** Machine-readable `details.reason` for an entry id this workspace does not hold. */
|
|
32
|
+
export const KAIZEN_ENTRY_NOT_FOUND_REASON = 'kaizen_entry_not_found';
|
|
33
|
+
/**
|
|
34
|
+
* Machine-readable `details.reason` for acknowledging an entry that has not settled yet.
|
|
35
|
+
*
|
|
36
|
+
* Distinct from a 404 because it is about TIMING rather than identity: the entry exists, the
|
|
37
|
+
* grader has simply not finished with it, and a caller that acknowledged it now would be marking
|
|
38
|
+
* recommendations triaged before they were written. Retry once the entry reaches `complete` or
|
|
39
|
+
* `failed`.
|
|
40
|
+
*/
|
|
41
|
+
export const KAIZEN_ENTRY_NOT_SETTLED_REASON = 'kaizen_entry_not_settled';
|
|
42
|
+
/**
|
|
43
|
+
* The board coordinates of the graded run, resolved at read time — null when the task block has
|
|
44
|
+
* since been deleted.
|
|
45
|
+
*
|
|
46
|
+
* Separate from the entry's own `taskId` on purpose: the id is a fact the grading row RECORDED
|
|
47
|
+
* and always answers, while this is what the board says about it NOW. Collapsing the two would
|
|
48
|
+
* make a deleted task read as an entry that never had one.
|
|
49
|
+
*/
|
|
50
|
+
export const publicKaizenEntryTaskSchema = v.object({
|
|
51
|
+
title: v.string(),
|
|
52
|
+
/**
|
|
53
|
+
* The task's board lifecycle status, in the SAME vocabulary `/api/v1/tasks` speaks
|
|
54
|
+
* (`publicTaskStatusSchema`) rather than the internal block one it happens to mirror today.
|
|
55
|
+
*
|
|
56
|
+
* Typed against the public picklist on purpose: the two are separate closed vocabularies
|
|
57
|
+
* precisely so the board can gain a status without that widening `/api/v1` by accident. Reading
|
|
58
|
+
* the internal one here would publish the new member with no version decision, and would let two
|
|
59
|
+
* endpoints answer differently about the same task. Adding a member internally now fails to
|
|
60
|
+
* compile until somebody decides what the public surface says about it.
|
|
61
|
+
*/
|
|
62
|
+
status: publicTaskStatusSchema,
|
|
63
|
+
/**
|
|
64
|
+
* The enclosing service frame (`GET /api/v1/services/{serviceId}`), or null for a task outside
|
|
65
|
+
* one — a headless job's anchor, or a board block that predates services.
|
|
66
|
+
*
|
|
67
|
+
* Resolved by walking the block's parent chain to its service frame, which is how every other
|
|
68
|
+
* `/api/v1` surface answers the same question (`GET /api/v1/services/{serviceId}/tasks`,
|
|
69
|
+
* `GET /api/v1/tasks/{taskId}`). Deriving it any other way would let one task report a service
|
|
70
|
+
* here and a different answer (or none) there, for the same board.
|
|
71
|
+
*/
|
|
72
|
+
serviceId: v.nullable(v.string()),
|
|
73
|
+
/**
|
|
74
|
+
* That service's title. Non-null exactly when `serviceId` is: both are read off the SAME
|
|
75
|
+
* resolved frame block, so a caller never receives an id that `GET /api/v1/services/{serviceId}`
|
|
76
|
+
* cannot answer for.
|
|
77
|
+
*/
|
|
78
|
+
serviceTitle: v.nullable(v.string()),
|
|
79
|
+
});
|
|
80
|
+
/**
|
|
81
|
+
* Where the entry's `(agentKind, model, promptVersion)` combo stands in the verification streak,
|
|
82
|
+
* or null when nothing has been recorded for it yet.
|
|
83
|
+
*
|
|
84
|
+
* Carried because it decides whether an entry is worth acting on: a VERIFIED combo is one the
|
|
85
|
+
* engine has stopped grading, so its recommendations are historical, and a long streak says the
|
|
86
|
+
* pairing is behaving even if this one run was not.
|
|
87
|
+
*/
|
|
88
|
+
export const publicKaizenEntryComboSchema = v.object({
|
|
89
|
+
/** Consecutive high grades (4 or 5, no recommendations) recorded for the combo. */
|
|
90
|
+
consecutiveHighGrades: v.number(),
|
|
91
|
+
/** Whether it crossed the streak threshold and is no longer graded. */
|
|
92
|
+
verified: v.boolean(),
|
|
93
|
+
/** Epoch ms it crossed, else null. */
|
|
94
|
+
verifiedAt: v.nullable(v.number()),
|
|
95
|
+
});
|
|
96
|
+
/**
|
|
97
|
+
* One Kaizen entry as `/api/v1` speaks it: the grading, what produced it, and its triage state.
|
|
98
|
+
*
|
|
99
|
+
* The id vocabulary is the public one — `entryId` for the grading, `runId` and `taskId` for the
|
|
100
|
+
* run and board block the stored row calls `executionId` and `blockId` — so every id here
|
|
101
|
+
* addresses something on this API. Nothing the row holds is dropped.
|
|
102
|
+
*/
|
|
103
|
+
export const publicKaizenEntrySchema = v.object({
|
|
104
|
+
/** The id to pass to `GET /api/v1/kaizen/entries/{entryId}` and the acknowledge route. */
|
|
105
|
+
entryId: v.string(),
|
|
106
|
+
/** The run whose step was graded (`GET /api/v1/debug/runs/{runId}` for its own detail). */
|
|
107
|
+
runId: v.string(),
|
|
108
|
+
/** Index of the graded step within that run's pipeline. */
|
|
109
|
+
stepIndex: v.number(),
|
|
110
|
+
/** The board task the run was started on, as the row recorded it. */
|
|
111
|
+
taskId: v.string(),
|
|
112
|
+
/** What the board says about that task now, or null when it has been deleted. */
|
|
113
|
+
task: v.nullable(publicKaizenEntryTaskSchema),
|
|
114
|
+
/** The graded step's agent kind (`coder`, `architect`, a deployment's own kind, …). */
|
|
115
|
+
agentKind: v.string(),
|
|
116
|
+
/** The model the step actually dispatched on, as resolved at dispatch. */
|
|
117
|
+
model: v.string(),
|
|
118
|
+
/** The shipped prompt version the step ran, from the agents prompt-version registry. */
|
|
119
|
+
promptVersion: v.number(),
|
|
120
|
+
/** `agentKind|model|promptVersion(|revision|variant)` — what the streak is kept against. */
|
|
121
|
+
comboKey: v.string(),
|
|
122
|
+
/** The combo's verification progress, or null when nothing has been recorded for it. */
|
|
123
|
+
combo: v.nullable(publicKaizenEntryComboSchema),
|
|
124
|
+
/** Where the grading itself got to (`scheduled` / `running` / `complete` / `failed`). */
|
|
125
|
+
status: kaizenGradingStatusSchema,
|
|
126
|
+
/** 1..5 once `complete` (5 = smooth, guided, efficient); null while pending or failed. */
|
|
127
|
+
grade: v.nullable(v.number()),
|
|
128
|
+
/** The grader's prose account of how the interaction went; empty until it completes. */
|
|
129
|
+
summary: v.string(),
|
|
130
|
+
/** What the grader recommends changing. Empty ⇒ it found nothing to improve. */
|
|
131
|
+
recommendations: v.array(v.string()),
|
|
132
|
+
/** `provider:model` that produced the grade, so a reader can weigh the grader itself. */
|
|
133
|
+
graderModel: v.nullable(v.string()),
|
|
134
|
+
/**
|
|
135
|
+
* Why the grading `failed`, else null. A failure is a real entry rather than a hidden one: it
|
|
136
|
+
* usually names a deployment-level problem (prompt recording off, no grader model wired) that
|
|
137
|
+
* nothing else reports, and it is acknowledgeable for exactly that reason.
|
|
138
|
+
*/
|
|
139
|
+
error: v.nullable(v.string()),
|
|
140
|
+
/** Whether somebody has triaged it — the same fact `acknowledgedAt` carries, as the filter. */
|
|
141
|
+
acknowledged: v.boolean(),
|
|
142
|
+
/** Epoch ms it was acknowledged, else null. */
|
|
143
|
+
acknowledgedAt: v.nullable(v.number()),
|
|
144
|
+
/** The user (`usr_*`) or API key (`pak_*`) that acknowledged it, else null. */
|
|
145
|
+
acknowledgedBy: v.nullable(v.string()),
|
|
146
|
+
/** The note left with the acknowledgement, else null. */
|
|
147
|
+
acknowledgementNote: v.nullable(v.string()),
|
|
148
|
+
/** Epoch ms the grading was scheduled (also what the list orders and pages on). */
|
|
149
|
+
createdAt: v.number(),
|
|
150
|
+
/** Epoch ms the row last changed (a grader transition or an acknowledgement). */
|
|
151
|
+
updatedAt: v.number(),
|
|
152
|
+
});
|
|
153
|
+
export const publicKaizenEntryListSchema = v.object({
|
|
154
|
+
entries: v.array(publicKaizenEntrySchema),
|
|
155
|
+
/**
|
|
156
|
+
* Cursor to pass as `?cursor=` for the next page, or null when this was the last page. A
|
|
157
|
+
* non-null cursor means "there may be more", so a client pages until it comes back null.
|
|
158
|
+
*/
|
|
159
|
+
nextCursor: v.nullable(v.string()),
|
|
160
|
+
});
|
|
161
|
+
/**
|
|
162
|
+
* Query params for `GET /api/v1/kaizen/entries`. Ordering is newest-first on the grading's
|
|
163
|
+
* `createdAt`, keyset-paged on `(createdAt, entryId)` so a burst of gradings sharing a
|
|
164
|
+
* millisecond cannot lose rows between pages.
|
|
165
|
+
*
|
|
166
|
+
* The filters are the questions an improvement loop actually asks, each pushed into SQL: what is
|
|
167
|
+
* untriaged, what the grader has finished with, what one agent kind is being told, and what is new
|
|
168
|
+
* since the last sweep. They compose, and `?acknowledged=false&settled=true` is the working
|
|
169
|
+
* backlog: every entry in it is one the acknowledge route accepts.
|
|
170
|
+
*/
|
|
171
|
+
export const listPublicKaizenEntriesQuerySchema = v.object({
|
|
172
|
+
/** Rows per page (1..100); omitted → 25. */
|
|
173
|
+
limit: v.optional(pageLimitSchema),
|
|
174
|
+
/** Opaque cursor from a previous page's `nextCursor`. */
|
|
175
|
+
cursor: v.optional(cursorSchema),
|
|
176
|
+
/** `false` for the untriaged backlog, `true` for what has been handled; omitted → both. */
|
|
177
|
+
acknowledged: v.optional(booleanQuerySchema),
|
|
178
|
+
/**
|
|
179
|
+
* `true` for entries the grader has FINISHED with (whatever it concluded), `false` for those
|
|
180
|
+
* still scheduled or running; omitted → both.
|
|
181
|
+
*
|
|
182
|
+
* The filter that makes `?acknowledged=false&settled=true` an actionable backlog: every row it
|
|
183
|
+
* returns is one the acknowledge route will accept, where `?acknowledged=false` alone also
|
|
184
|
+
* returns gradings mid-flight that it refuses with `409 kaizen_entry_not_settled`. It is a
|
|
185
|
+
* separate question from `status` because the settled SET is what the write is gated on, and
|
|
186
|
+
* spelling it as `status=complete` drops the `failed` entries (which usually name a deployment
|
|
187
|
+
* problem, and are the ones most worth acting on) while a client-side union of the two would
|
|
188
|
+
* silently miss any settled state added later.
|
|
189
|
+
*/
|
|
190
|
+
settled: v.optional(booleanQuerySchema),
|
|
191
|
+
/** Return only entries whose grading is in this exact state. */
|
|
192
|
+
status: v.optional(kaizenGradingStatusSchema),
|
|
193
|
+
/** Return only entries grading this agent kind. */
|
|
194
|
+
agentKind: v.optional(v.pipe(v.string(), v.trim(), v.minLength(1), v.maxLength(120))),
|
|
195
|
+
/** Return only entries created at or after this epoch-ms stamp (the incremental-poll filter). */
|
|
196
|
+
since: v.optional(epochMsQuerySchema),
|
|
197
|
+
});
|
|
198
|
+
/** Longest acknowledgement note the surface stores. */
|
|
199
|
+
export const KAIZEN_ACKNOWLEDGEMENT_NOTE_MAX = 2_000;
|
|
200
|
+
/**
|
|
201
|
+
* Body for `POST /api/v1/kaizen/entries/{entryId}/acknowledge`.
|
|
202
|
+
*
|
|
203
|
+
* `acknowledged` is optional and defaults to `true`, so the ordinary call is an empty body; pass
|
|
204
|
+
* `false` to put an entry back on the backlog after acknowledging it by mistake. Acknowledging an
|
|
205
|
+
* already-acknowledged entry is a no-op that returns the row unchanged, which keeps
|
|
206
|
+
* `acknowledgedAt` naming when it was FIRST triaged rather than when a retrying client last
|
|
207
|
+
* repeated itself.
|
|
208
|
+
*/
|
|
209
|
+
export const acknowledgeKaizenEntrySchema = v.object({
|
|
210
|
+
/** `true` (the default) records the acknowledgement; `false` clears it. */
|
|
211
|
+
acknowledged: v.optional(v.boolean()),
|
|
212
|
+
/**
|
|
213
|
+
* What the next reader should know: a ticket id, a decision, why it was dismissed. Stored only
|
|
214
|
+
* with the acknowledgement that lands, and cleared along with it.
|
|
215
|
+
*/
|
|
216
|
+
note: v.optional(v.nullable(v.pipe(v.string(), v.trim(), v.maxLength(KAIZEN_ACKNOWLEDGEMENT_NOTE_MAX)))),
|
|
217
|
+
});
|
|
218
|
+
//# sourceMappingURL=public-kaizen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-kaizen.js","sourceRoot":"","sources":["../src/public-kaizen.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,EAClB,eAAe,GAChB,MAAM,oBAAoB,CAAA;AAE3B,8EAA8E;AAC9E,8FAA8F;AAC9F,EAAE;AACF,uFAAuF;AACvF,qFAAqF;AACrF,2FAA2F;AAC3F,8FAA8F;AAC9F,iGAAiG;AACjG,yFAAyF;AACzF,EAAE;AACF,kCAAkC;AAClC,EAAE;AACF,kGAAkG;AAClG,gGAAgG;AAChG,gGAAgG;AAChG,wBAAwB;AACxB,+FAA+F;AAC/F,4FAA4F;AAC5F,+FAA+F;AAC/F,2FAA2F;AAC3F,6FAA6F;AAC7F,0FAA0F;AAC1F,gGAAgG;AAChG,gGAAgG;AAChG,mEAAmE;AACnE,8EAA8E;AAE9E,sFAAsF;AACtF,MAAM,CAAC,MAAM,6BAA6B,GAAG,wBAAwB,CAAA;AAErE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,0BAA0B,CAAA;AAEzE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB;;;;;;;;;OASG;IACH,MAAM,EAAE,sBAAsB;IAC9B;;;;;;;;OAQG;IACH,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACjC;;;;OAIG;IACH,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CACrC,CAAC,CAAA;AAGF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IACnD,mFAAmF;IACnF,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE;IACjC,uEAAuE;IACvE,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;IACrB,sCAAsC;IACtC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CACnC,CAAC,CAAA;AAGF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,0FAA0F;IAC1F,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,2FAA2F;IAC3F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,2DAA2D;IAC3D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,qEAAqE;IACrE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,iFAAiF;IACjF,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IAC7C,uFAAuF;IACvF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,0EAA0E;IAC1E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,wFAAwF;IACxF,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IACzB,4FAA4F;IAC5F,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,wFAAwF;IACxF,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IAC/C,yFAAyF;IACzF,MAAM,EAAE,yBAAyB;IACjC,0FAA0F;IAC1F,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC7B,wFAAwF;IACxF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,gFAAgF;IAChF,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACpC,yFAAyF;IACzF,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACnC;;;;OAIG;IACH,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC7B,+FAA+F;IAC/F,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE;IACzB,+CAA+C;IAC/C,cAAc,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACtC,+EAA+E;IAC/E,cAAc,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACtC,yDAAyD;IACzD,mBAAmB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC3C,mFAAmF;IACnF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,iFAAiF;IACjF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAA;AAGF,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC;IACzC;;;OAGG;IACH,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CACnC,CAAC,CAAA;AAGF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC,CAAC,MAAM,CAAC;IACzD,4CAA4C;IAC5C,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC;IAClC,yDAAyD;IACzD,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;IAChC,2FAA2F;IAC3F,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IAC5C;;;;;;;;;;;OAWG;IACH,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IACvC,gEAAgE;IAChE,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAC7C,mDAAmD;IACnD,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACrF,iGAAiG;IACjG,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;CACtC,CAAC,CAAA;AAGF,uDAAuD;AACvD,MAAM,CAAC,MAAM,+BAA+B,GAAG,KAAK,CAAA;AAEpD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IACnD,2EAA2E;IAC3E,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACrC;;;OAGG;IACH,IAAI,EAAE,CAAC,CAAC,QAAQ,CACd,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC,CAAC,CACvF;CACF,CAAC,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
/** Hard ceiling on rows one page may return, wherever a list is paginated. */
|
|
3
|
+
export declare const PUBLIC_MAX_PAGE_LIMIT = 100;
|
|
4
|
+
/**
|
|
5
|
+
* An OPAQUE keyset pagination cursor. Callers must treat it as a black box and echo it back
|
|
6
|
+
* verbatim — its encoding is an implementation detail (today a base64url `<sortKey>|<id>` pair)
|
|
7
|
+
* that may change. Keyset, not offset: an offset page shifts under concurrent inserts, silently
|
|
8
|
+
* skipping or repeating rows, which is exactly what a polling integration must never see.
|
|
9
|
+
*/
|
|
10
|
+
export declare const cursorSchema: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>;
|
|
11
|
+
/** Rows one page may return (1..{@link PUBLIC_MAX_PAGE_LIMIT}); each list documents its default. */
|
|
12
|
+
export declare const pageLimitSchema: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "Must be a whole number">, v.TransformAction<any, number>, v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 100, undefined>]>;
|
|
13
|
+
/** An epoch-ms query filter: digits only, for the same reason as {@link pageLimitSchema}. */
|
|
14
|
+
export declare const epochMsQuerySchema: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "Must be a whole number of epoch milliseconds">, v.TransformAction<any, number>, v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
|
|
15
|
+
/**
|
|
16
|
+
* A boolean query filter, spelled `true` / `false`.
|
|
17
|
+
*
|
|
18
|
+
* A closed picklist rather than "anything that is not `false` is true": on a tri-state filter
|
|
19
|
+
* (omitted / true / false) a typo has to refuse, because coercing `?acknowledged=yes` to `true`
|
|
20
|
+
* would serve a caller the confident opposite of what it asked for on a `false` typo, with no
|
|
21
|
+
* way to notice.
|
|
22
|
+
*/
|
|
23
|
+
export declare const booleanQuerySchema: v.SchemaWithPipe<readonly [v.PicklistSchema<["true", "false"], undefined>, v.TransformAction<"false" | "true", boolean>]>;
|
|
24
|
+
//# sourceMappingURL=public-paging.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-paging.d.ts","sourceRoot":"","sources":["../src/public-paging.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAoB5B,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB,MAAM,CAAA;AAExC;;;;;GAKG;AACH,eAAO,MAAM,YAAY,0JAAiE,CAAA;AAE1F,oGAAoG;AACpG,eAAO,MAAM,eAAe,0RAQ3B,CAAA;AAED,6FAA6F;AAC7F,eAAO,MAAM,kBAAkB,sQAO9B,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,2HAG9B,CAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// The query-parameter primitives every bounded `/api/v1` list shares: the opaque keyset
|
|
4
|
+
// cursor, the page limit, an epoch-ms lower bound and a boolean flag.
|
|
5
|
+
//
|
|
6
|
+
// One module rather than a private copy per contract file, because these ARE the surface's
|
|
7
|
+
// pagination contract (`backend/docs/public-api.md`, "Pagination") rather than four
|
|
8
|
+
// independent local details: a list whose `limit` ceiling or cursor length drifted from its
|
|
9
|
+
// siblings would be a difference a caller discovers by getting a 400 from one endpoint and
|
|
10
|
+
// not another. `/jobs`, the task list, the whole `/debug` surface and the Kaizen entries all
|
|
11
|
+
// read them from here.
|
|
12
|
+
//
|
|
13
|
+
// Query params arrive as STRINGS, so each numeric one is digit-checked BEFORE the coercion:
|
|
14
|
+
// `Number()` alone also accepts `1e9`, `0x64` and `' '`, which would read as plausible values
|
|
15
|
+
// rather than the 400 a malformed request deserves. The `maxValue` ceilings are what make the
|
|
16
|
+
// bounds real backstops rather than suggestions (a caller cannot ask for the whole table back
|
|
17
|
+
// by passing a huge limit).
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
/** Hard ceiling on rows one page may return, wherever a list is paginated. */
|
|
20
|
+
export const PUBLIC_MAX_PAGE_LIMIT = 100;
|
|
21
|
+
/**
|
|
22
|
+
* An OPAQUE keyset pagination cursor. Callers must treat it as a black box and echo it back
|
|
23
|
+
* verbatim — its encoding is an implementation detail (today a base64url `<sortKey>|<id>` pair)
|
|
24
|
+
* that may change. Keyset, not offset: an offset page shifts under concurrent inserts, silently
|
|
25
|
+
* skipping or repeating rows, which is exactly what a polling integration must never see.
|
|
26
|
+
*/
|
|
27
|
+
export const cursorSchema = v.pipe(v.string(), v.trim(), v.minLength(1), v.maxLength(200));
|
|
28
|
+
/** Rows one page may return (1..{@link PUBLIC_MAX_PAGE_LIMIT}); each list documents its default. */
|
|
29
|
+
export const pageLimitSchema = v.pipe(v.string(), v.regex(/^\d+$/, 'Must be a whole number'), v.transform(Number), v.number(), v.integer(), v.minValue(1), v.maxValue(PUBLIC_MAX_PAGE_LIMIT));
|
|
30
|
+
/** An epoch-ms query filter: digits only, for the same reason as {@link pageLimitSchema}. */
|
|
31
|
+
export const epochMsQuerySchema = v.pipe(v.string(), v.regex(/^\d+$/, 'Must be a whole number of epoch milliseconds'), v.transform(Number), v.number(), v.integer(), v.minValue(0));
|
|
32
|
+
/**
|
|
33
|
+
* A boolean query filter, spelled `true` / `false`.
|
|
34
|
+
*
|
|
35
|
+
* A closed picklist rather than "anything that is not `false` is true": on a tri-state filter
|
|
36
|
+
* (omitted / true / false) a typo has to refuse, because coercing `?acknowledged=yes` to `true`
|
|
37
|
+
* would serve a caller the confident opposite of what it asked for on a `false` typo, with no
|
|
38
|
+
* way to notice.
|
|
39
|
+
*/
|
|
40
|
+
export const booleanQuerySchema = v.pipe(v.picklist(['true', 'false']), v.transform((value) => value === 'true'));
|
|
41
|
+
//# sourceMappingURL=public-paging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-paging.js","sourceRoot":"","sources":["../src/public-paging.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B,8EAA8E;AAC9E,wFAAwF;AACxF,sEAAsE;AACtE,EAAE;AACF,2FAA2F;AAC3F,oFAAoF;AACpF,4FAA4F;AAC5F,2FAA2F;AAC3F,6FAA6F;AAC7F,uBAAuB;AACvB,EAAE;AACF,4FAA4F;AAC5F,8FAA8F;AAC9F,8FAA8F;AAC9F,8FAA8F;AAC9F,4BAA4B;AAC5B,8EAA8E;AAE9E,8EAA8E;AAC9E,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAA;AAExC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAA;AAE1F,oGAAoG;AACpG,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,CACnC,CAAC,CAAC,MAAM,EAAE,EACV,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,wBAAwB,CAAC,EAC1C,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,EACnB,CAAC,CAAC,MAAM,EAAE,EACV,CAAC,CAAC,OAAO,EAAE,EACX,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EACb,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAClC,CAAA;AAED,6FAA6F;AAC7F,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,CACtC,CAAC,CAAC,MAAM,EAAE,EACV,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,8CAA8C,CAAC,EAChE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,EACnB,CAAC,CAAC,MAAM,EAAE,EACV,CAAC,CAAC,OAAO,EAAE,EACX,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CACd,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,CACtC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAC7B,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,MAAM,CAAC,CACzC,CAAA"}
|
|
@@ -240,6 +240,83 @@ export declare const linkPublicRepoSchema: v.ObjectSchema<{
|
|
|
240
240
|
readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.RegexAction<string, "Only letters, digits, '.', '_' and '-' are allowed">, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 100, undefined>]>;
|
|
241
241
|
}, undefined>;
|
|
242
242
|
export type LinkPublicRepoInput = v.InferOutput<typeof linkPublicRepoSchema>;
|
|
243
|
+
/**
|
|
244
|
+
* Characters ONE file read may answer with, past which it is REFUSED rather than truncated.
|
|
245
|
+
*
|
|
246
|
+
* A caller reading a file to grade what an agent committed is joining on its exact bytes, and a
|
|
247
|
+
* silently shortened answer is indistinguishable from an agent that wrote a shorter file. So the
|
|
248
|
+
* cap refuses (`422`, `details.reason: 'file_too_large'`) and names the size, which is a fact the
|
|
249
|
+
* caller can act on where a truncation is not. Generous enough for source: 256 KiB is past any
|
|
250
|
+
* hand-written manifest, workflow or module.
|
|
251
|
+
*
|
|
252
|
+
* It is not the only ceiling in play, and the refusal is deliberately the SAME one either way: a
|
|
253
|
+
* provider's own contents API stops serving a blob at a limit of its own (1 MB on GitHub), which
|
|
254
|
+
* arrives here as a `403` that says nothing about the file. That is mapped to this reason too, with
|
|
255
|
+
* the provider's limit in `details` and no `size`, because nothing measured one.
|
|
256
|
+
*/
|
|
257
|
+
export declare const MAX_REPO_FILE_CHARS = 262144;
|
|
258
|
+
/**
|
|
259
|
+
* A repo-root-relative file path, refused here rather than left to the provider's 404.
|
|
260
|
+
*
|
|
261
|
+
* The provider would answer "no such file" for a traversal or an absolute path anyway, so this is
|
|
262
|
+
* not a security boundary and does not claim to be one: the resolution is already scoped to a
|
|
263
|
+
* repository this workspace LINKED, which is what actually bounds the read. What it buys is an
|
|
264
|
+
* honest refusal. `..` and a leading `/` are the two ways a caller means something other than what
|
|
265
|
+
* it typed, and answering both as `file_not_found` sends someone hunting for a file that is right
|
|
266
|
+
* where they left it.
|
|
267
|
+
*/
|
|
268
|
+
export declare const publicRepoFilePathSchema: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 1000, undefined>, v.CheckAction<string, "A path is relative to the repository root">, v.CheckAction<string, "No path segment may be '..'">]>;
|
|
269
|
+
/**
|
|
270
|
+
* ONE file from a repository this workspace has LINKED, at a ref.
|
|
271
|
+
*
|
|
272
|
+
* The read that closes the loop on everything else this surface can start: a caller can create a
|
|
273
|
+
* repository, adopt one, file work against it and watch a run merge, and then had no way to see WHAT
|
|
274
|
+
* the run committed. The only alternative was grepping the agent's final reply, which is asserting on
|
|
275
|
+
* model prose (swap the model and it goes red having found nothing wrong), so anything that wanted a
|
|
276
|
+
* real answer had to hold a VCS credential of its own: a second token in an operator's config, with
|
|
277
|
+
* its own scopes to get right, for data the workspace's own connection can already read.
|
|
278
|
+
*
|
|
279
|
+
* **A single file, deliberately, and no directory listing.** A listing is a separate decision with
|
|
280
|
+
* its own frozen-forever questions (pagination, recursion, what a large tree does), and this surface
|
|
281
|
+
* may not answer one badly and then keep answering it. `GET /api/v1/services/:id/spec` remains the
|
|
282
|
+
* structured read for the one tree the platform itself understands.
|
|
283
|
+
*
|
|
284
|
+
* **Only what the workspace has LINKED.** The scope is the same one every other read here takes, so
|
|
285
|
+
* this publishes nothing a caller could not already reach through the board, and a repository the
|
|
286
|
+
* connection can see but this workspace has not adopted is a `404` exactly as it is everywhere else.
|
|
287
|
+
*/
|
|
288
|
+
export declare const publicRepoFileSchema: v.ObjectSchema<{
|
|
289
|
+
readonly owner: v.StringSchema<undefined>;
|
|
290
|
+
readonly name: v.StringSchema<undefined>;
|
|
291
|
+
/** The repo-root-relative path that was read, as the request gave it. */
|
|
292
|
+
readonly path: v.StringSchema<undefined>;
|
|
293
|
+
/**
|
|
294
|
+
* The ref the read was pinned to, or `null` when the request named none and the PROVIDER resolved
|
|
295
|
+
* the repository's own default branch.
|
|
296
|
+
*
|
|
297
|
+
* Null rather than the branch name, because this read does not learn which branch that was and the
|
|
298
|
+
* platform's own idea of it is a value it may have INVENTED: a projection row that carries no
|
|
299
|
+
* default branch is defaulted to `main` for the benefit of clone targets, and reporting that as the
|
|
300
|
+
* ref graded would name a branch the repository may not have. `sha` is the value to record either
|
|
301
|
+
* way, being the one identifier that cannot drift.
|
|
302
|
+
*/
|
|
303
|
+
readonly ref: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
304
|
+
/**
|
|
305
|
+
* The file's blob sha: the byte-exact handle, for a caller comparing two reads without diffing
|
|
306
|
+
* their bodies, or joining what it graded to what the repository holds.
|
|
307
|
+
*/
|
|
308
|
+
readonly sha: v.StringSchema<undefined>;
|
|
309
|
+
/**
|
|
310
|
+
* The file's content, decoded as UTF-8.
|
|
311
|
+
*
|
|
312
|
+
* Text only. A file whose bytes are not valid UTF-8 is REFUSED (`422`,
|
|
313
|
+
* `details.reason: 'file_not_text'`, carrying the `sha`) rather than answered as the replacement
|
|
314
|
+
* characters a lossy decode produces: mojibake presented as a file's content is the same lie a
|
|
315
|
+
* truncation would be, and a caller hashing it would be hashing the decoder's output.
|
|
316
|
+
*/
|
|
317
|
+
readonly content: v.StringSchema<undefined>;
|
|
318
|
+
}, undefined>;
|
|
319
|
+
export type PublicRepoFile = v.InferOutput<typeof publicRepoFileSchema>;
|
|
243
320
|
/**
|
|
244
321
|
* How the manifests at `path` are rendered. `raw` (the default) treats the path as a manifest file
|
|
245
322
|
* or a flat directory of valid YAML; `kustomize` treats it as an overlay directory, which only the
|
|
@@ -620,12 +697,106 @@ export declare const publicEnvironmentConnectionViewSchema: v.ObjectSchema<{
|
|
|
620
697
|
readonly secretKeys: v.ArraySchema<v.StringSchema<undefined>, undefined>;
|
|
621
698
|
}, undefined>;
|
|
622
699
|
export type PublicEnvironmentConnectionView = v.InferOutput<typeof publicEnvironmentConnectionViewSchema>;
|
|
700
|
+
/**
|
|
701
|
+
* One registered handler as the LIST reports it, whatever engine services it.
|
|
702
|
+
*
|
|
703
|
+
* Its own shape rather than a reuse of {@link publicEnvironmentConnectionViewSchema}, and the reason
|
|
704
|
+
* is the difference between the two calls. That one answers a `POST` this surface only ever makes
|
|
705
|
+
* with `engine: 'kubernetes'`, so its literal is exactly true. A list has to report every handler a
|
|
706
|
+
* workspace holds, including the `remote-custom` ones a deployment SEEDS from its composition root,
|
|
707
|
+
* and widening the shipped literal to a string would retype a field a released client already
|
|
708
|
+
* narrows on. Additive beats a retype (ADR 0034), so the list gets its own view.
|
|
709
|
+
*
|
|
710
|
+
* `endpoint` and not `apiServerUrl`: the noun is only true of Kubernetes, and the same mistake in a
|
|
711
|
+
* shared reduction is what makes an operator whose environment is a VM go looking for an apiserver.
|
|
712
|
+
*
|
|
713
|
+
* The write is what makes this read worth having. Handlers are the one half of provisioning a
|
|
714
|
+
* headless caller could WRITE and never READ, so a deployment that seeds them programmatically (the
|
|
715
|
+
* documented path for a multi-tenant Node deployment, and the one local mode takes) had no way for
|
|
716
|
+
* any caller to confirm the seed landed. "Kargo accepts our token" and "this workspace has a Kargo
|
|
717
|
+
* handler" are different failures with different fixes, and only one of them was checkable.
|
|
718
|
+
*/
|
|
719
|
+
export declare const publicEnvironmentHandlerSchema: v.ObjectSchema<{
|
|
720
|
+
/** The provision type this handler serves (`kubernetes`, `docker-compose`, `custom`, …). */
|
|
721
|
+
readonly provisionType: v.StringSchema<undefined>;
|
|
722
|
+
/**
|
|
723
|
+
* For a `custom` handler, the manifest id it is KEYED to; null for every other type.
|
|
724
|
+
*
|
|
725
|
+
* Both this and {@link acceptsManifestId} are reported because the engine's own resolution matches
|
|
726
|
+
* a service's pinned `manifestId` against EITHER, and only one of the two is set by either way of
|
|
727
|
+
* registering a handler: a seed that keys a handler to `kargo` sets this one and leaves the other
|
|
728
|
+
* null, while a `remote-custom` connection sets the other. Publishing one of them made the
|
|
729
|
+
* commonest seed shape indistinguishable from a handler that serves nothing, which is the exact
|
|
730
|
+
* question this read exists to answer.
|
|
731
|
+
*/
|
|
732
|
+
readonly manifestId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
733
|
+
/** For a `custom` handler, the manifest id it declares it ACCEPTS; null for every other type. */
|
|
734
|
+
readonly acceptsManifestId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
735
|
+
/** The internal engine servicing it, as an open string: a deployment may register its own. */
|
|
736
|
+
readonly engine: v.StringSchema<undefined>;
|
|
737
|
+
/** The registry backend kind that builds this handler's provider. */
|
|
738
|
+
readonly backendKind: v.StringSchema<undefined>;
|
|
739
|
+
readonly label: v.StringSchema<undefined>;
|
|
740
|
+
/** The connection's own endpoint (an apiserver for Kubernetes, the management API otherwise). */
|
|
741
|
+
readonly endpoint: v.StringSchema<undefined>;
|
|
742
|
+
/** The secret-bundle keys this handler holds, never their values. */
|
|
743
|
+
readonly secretKeys: v.ArraySchema<v.StringSchema<undefined>, undefined>;
|
|
744
|
+
readonly connectedAt: v.NumberSchema<undefined>;
|
|
745
|
+
}, undefined>;
|
|
746
|
+
export type PublicEnvironmentHandler = v.InferOutput<typeof publicEnvironmentHandlerSchema>;
|
|
747
|
+
export declare const publicEnvironmentHandlerListSchema: v.ObjectSchema<{
|
|
748
|
+
readonly connections: v.ArraySchema<v.ObjectSchema<{
|
|
749
|
+
/** The provision type this handler serves (`kubernetes`, `docker-compose`, `custom`, …). */
|
|
750
|
+
readonly provisionType: v.StringSchema<undefined>;
|
|
751
|
+
/**
|
|
752
|
+
* For a `custom` handler, the manifest id it is KEYED to; null for every other type.
|
|
753
|
+
*
|
|
754
|
+
* Both this and {@link acceptsManifestId} are reported because the engine's own resolution matches
|
|
755
|
+
* a service's pinned `manifestId` against EITHER, and only one of the two is set by either way of
|
|
756
|
+
* registering a handler: a seed that keys a handler to `kargo` sets this one and leaves the other
|
|
757
|
+
* null, while a `remote-custom` connection sets the other. Publishing one of them made the
|
|
758
|
+
* commonest seed shape indistinguishable from a handler that serves nothing, which is the exact
|
|
759
|
+
* question this read exists to answer.
|
|
760
|
+
*/
|
|
761
|
+
readonly manifestId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
762
|
+
/** For a `custom` handler, the manifest id it declares it ACCEPTS; null for every other type. */
|
|
763
|
+
readonly acceptsManifestId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
764
|
+
/** The internal engine servicing it, as an open string: a deployment may register its own. */
|
|
765
|
+
readonly engine: v.StringSchema<undefined>;
|
|
766
|
+
/** The registry backend kind that builds this handler's provider. */
|
|
767
|
+
readonly backendKind: v.StringSchema<undefined>;
|
|
768
|
+
readonly label: v.StringSchema<undefined>;
|
|
769
|
+
/** The connection's own endpoint (an apiserver for Kubernetes, the management API otherwise). */
|
|
770
|
+
readonly endpoint: v.StringSchema<undefined>;
|
|
771
|
+
/** The secret-bundle keys this handler holds, never their values. */
|
|
772
|
+
readonly secretKeys: v.ArraySchema<v.StringSchema<undefined>, undefined>;
|
|
773
|
+
readonly connectedAt: v.NumberSchema<undefined>;
|
|
774
|
+
}, undefined>, undefined>;
|
|
775
|
+
}, undefined>;
|
|
776
|
+
export type PublicEnvironmentHandlerList = v.InferOutput<typeof publicEnvironmentHandlerListSchema>;
|
|
623
777
|
/**
|
|
624
778
|
* Where ONE service's per-run manifests live: the half the engine connection does not carry.
|
|
625
779
|
*
|
|
626
780
|
* The platform keeps these two apart deliberately (one cluster, many services, each with its own
|
|
627
781
|
* manifests), and this surface keeps the same seam rather than collapsing them into one call, so a
|
|
628
782
|
* caller adding a second service to an existing cluster changes one thing.
|
|
783
|
+
*
|
|
784
|
+
* **`custom` is here because a deployment that ships its OWN environment backend could not say so.**
|
|
785
|
+
* The registry model exists precisely so one can (`EnvironmentBackendRegistry`,
|
|
786
|
+
* `CustomManifestTypeRegistry`, `seedEnvironmentHandlers`), and everything such a backend needs is
|
|
787
|
+
* reachable from a composition root; none of it was reachable from this surface. A Kargo-backed or
|
|
788
|
+
* Nomad-backed service could therefore neither be pinned nor READ BACK here, and that second half is
|
|
789
|
+
* the one that hurts: the projection omitted what it could not describe, so a pinned service and an
|
|
790
|
+
* unpinned one answered identically (`provisioning: undefined`) and a headless caller could not
|
|
791
|
+
* report the state, let alone check it.
|
|
792
|
+
*
|
|
793
|
+
* **It pins by `manifestId` and carries no backend config**, and that is deliberate rather than
|
|
794
|
+
* partial. The engine side of a custom backend is an `environmentManifest` whose `providerConfig` is
|
|
795
|
+
* an open `Record<string, unknown>` by design, so publishing it would freeze a shape this repo
|
|
796
|
+
* evolves freely onto a surface that may never be reshaped (ADR 0034). What a caller pins here is an
|
|
797
|
+
* id the DEPLOYMENT already registered, which is a closed, stable value; registering the handler
|
|
798
|
+
* behind it stays a composition-root act, and `GET /api/v1/environments/connections` is how a caller
|
|
799
|
+
* confirms one landed.
|
|
629
800
|
*/
|
|
630
801
|
export declare const publicServiceProvisioningSchema: v.VariantSchema<"type", [v.ObjectSchema<{
|
|
631
802
|
readonly type: v.LiteralSchema<"kubernetes", undefined>;
|
|
@@ -646,6 +817,15 @@ export declare const publicServiceProvisioningSchema: v.VariantSchema<"type", [v
|
|
|
646
817
|
/** Omitted ⇒ `raw`. */
|
|
647
818
|
readonly renderer: v.OptionalSchema<v.PicklistSchema<["raw", "kustomize"], undefined>, undefined>;
|
|
648
819
|
}, undefined>], undefined>;
|
|
820
|
+
}, undefined>, v.ObjectSchema<{
|
|
821
|
+
readonly type: v.LiteralSchema<"custom", undefined>;
|
|
822
|
+
/**
|
|
823
|
+
* The custom-manifest-type id this service produces, matched to a `remote-custom` handler that
|
|
824
|
+
* declares it accepts the same one.
|
|
825
|
+
*/
|
|
826
|
+
readonly manifestId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.RegexAction<string, "Only lowercase letters, digits and hyphens are allowed">, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
|
|
827
|
+
/** Where the manifest lives in the repository; omitted ⇒ the manifest type's own default. */
|
|
828
|
+
readonly manifestPath: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
|
|
649
829
|
}, undefined>], undefined>;
|
|
650
830
|
export type PublicServiceProvisioning = v.InferOutput<typeof publicServiceProvisioningSchema>;
|
|
651
831
|
/**
|
|
@@ -680,6 +860,15 @@ export declare const updatePublicServiceSchema: v.SchemaWithPipe<readonly [v.Obj
|
|
|
680
860
|
/** Omitted ⇒ `raw`. */
|
|
681
861
|
readonly renderer: v.OptionalSchema<v.PicklistSchema<["raw", "kustomize"], undefined>, undefined>;
|
|
682
862
|
}, undefined>], undefined>;
|
|
863
|
+
}, undefined>, v.ObjectSchema<{
|
|
864
|
+
readonly type: v.LiteralSchema<"custom", undefined>;
|
|
865
|
+
/**
|
|
866
|
+
* The custom-manifest-type id this service produces, matched to a `remote-custom` handler that
|
|
867
|
+
* declares it accepts the same one.
|
|
868
|
+
*/
|
|
869
|
+
readonly manifestId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.RegexAction<string, "Only lowercase letters, digits and hyphens are allowed">, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 64, undefined>]>;
|
|
870
|
+
/** Where the manifest lives in the repository; omitted ⇒ the manifest type's own default. */
|
|
871
|
+
readonly manifestPath: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 500, undefined>]>, undefined>;
|
|
683
872
|
}, undefined>], undefined>, undefined>;
|
|
684
873
|
}, undefined>, v.CheckAction<{
|
|
685
874
|
title?: string | undefined;
|
|
@@ -697,6 +886,10 @@ export declare const updatePublicServiceSchema: v.SchemaWithPipe<readonly [v.Obj
|
|
|
697
886
|
path: string;
|
|
698
887
|
renderer?: "kustomize" | "raw" | undefined;
|
|
699
888
|
};
|
|
889
|
+
} | {
|
|
890
|
+
type: "custom";
|
|
891
|
+
manifestId: string;
|
|
892
|
+
manifestPath?: string | undefined;
|
|
700
893
|
} | undefined;
|
|
701
894
|
}, "Supply at least one of title, description or provisioning.">]>;
|
|
702
895
|
export type UpdatePublicServiceInput = v.InferOutput<typeof updatePublicServiceSchema>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public-provisioning.d.ts","sourceRoot":"","sources":["../src/public-provisioning.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"public-provisioning.d.ts","sourceRoot":"","sources":["../src/public-provisioning.ts"],"names":[],"mappings":"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"}
|