@cat-factory/contracts 0.161.0 → 0.163.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/execution.d.ts +20 -0
- package/dist/execution.d.ts.map +1 -1
- package/dist/execution.js +19 -0
- package/dist/execution.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/notification-webhooks.d.ts +115 -0
- package/dist/notification-webhooks.d.ts.map +1 -0
- package/dist/notification-webhooks.js +86 -0
- package/dist/notification-webhooks.js.map +1 -0
- package/dist/pr-report.d.ts +346 -0
- package/dist/pr-report.d.ts.map +1 -0
- package/dist/pr-report.js +206 -0
- package/dist/pr-report.js.map +1 -0
- package/dist/public-api-keys.d.ts +31 -13
- package/dist/public-api-keys.d.ts.map +1 -1
- package/dist/public-api-keys.js +26 -8
- package/dist/public-api-keys.js.map +1 -1
- package/dist/public-decisions.d.ts +254 -0
- package/dist/public-decisions.d.ts.map +1 -0
- package/dist/public-decisions.js +150 -0
- package/dist/public-decisions.js.map +1 -0
- package/dist/routes/agent-runs.d.ts +2 -0
- package/dist/routes/agent-runs.d.ts.map +1 -1
- package/dist/routes/execution.d.ts +8 -0
- package/dist/routes/execution.d.ts.map +1 -1
- package/dist/routes/human-review.d.ts +1 -0
- package/dist/routes/human-review.d.ts.map +1 -1
- package/dist/routes/human-test.d.ts +5 -0
- package/dist/routes/human-test.d.ts.map +1 -1
- package/dist/routes/index.d.ts +2 -0
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +2 -0
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/notification-webhooks.d.ts +111 -0
- package/dist/routes/notification-webhooks.d.ts.map +1 -0
- package/dist/routes/notification-webhooks.js +33 -0
- package/dist/routes/notification-webhooks.js.map +1 -0
- package/dist/routes/public-api.d.ts +59 -3
- package/dist/routes/public-api.d.ts.map +1 -1
- package/dist/routes/public-api.js +15 -0
- package/dist/routes/public-api.js.map +1 -1
- package/dist/routes/public-decisions.d.ts +602 -0
- package/dist/routes/public-decisions.d.ts.map +1 -0
- package/dist/routes/public-decisions.js +90 -0
- package/dist/routes/public-decisions.js.map +1 -0
- package/dist/routes/visual-confirm.d.ts +3 -0
- package/dist/routes/visual-confirm.d.ts.map +1 -1
- package/dist/routes/workspace-settings.d.ts +3 -0
- package/dist/routes/workspace-settings.d.ts.map +1 -1
- package/dist/routes/workspaces.d.ts +4 -0
- package/dist/routes/workspaces.d.ts.map +1 -1
- package/dist/snapshot.d.ts +2 -0
- package/dist/snapshot.d.ts.map +1 -1
- package/dist/workspace-settings.d.ts +14 -0
- package/dist/workspace-settings.d.ts.map +1 -1
- package/dist/workspace-settings.js +14 -0
- package/dist/workspace-settings.js.map +1 -1
- package/package.json +1 -1
|
@@ -3,17 +3,34 @@ import * as v from 'valibot';
|
|
|
3
3
|
* The permission a key carries on the `/api/v1` surface. An ordered ladder — each level
|
|
4
4
|
* INCLUDES the ones below it (`admin` ⊃ `write` ⊃ `read`), so an endpoint gates on a MINIMUM:
|
|
5
5
|
*
|
|
6
|
-
* - `read`
|
|
7
|
-
* - `write`
|
|
6
|
+
* - `read` — read-only reads/streams (list services/tasks/pipelines, poll a run, SSE).
|
|
7
|
+
* - `write` — everything `read` can do, PLUS non-destructive mutations (create/start/stop/
|
|
8
8
|
* retry/edit a task, start an initiative run).
|
|
9
|
-
* - `
|
|
10
|
-
* (
|
|
9
|
+
* - `decide` — everything `write` can do, PLUS answering a run's PARKED human decisions
|
|
10
|
+
* (requirement-review findings, implementation-fork choices) — and, because of that,
|
|
11
|
+
* starting a headless run on a pipeline that can park at all. Answering a decision injects
|
|
12
|
+
* caller-supplied prose into the requirements every downstream agent then implements and
|
|
13
|
+
* un-parks the run, so it is deliberately a rung above ordinary task authoring: a plain
|
|
14
|
+
* `write` integration sees exactly the pre-existing behaviour, including the refusal of
|
|
15
|
+
* parking pipelines. Minting a `decide` key is the operator asserting "this integration is
|
|
16
|
+
* the headless overseer for these runs".
|
|
17
|
+
*
|
|
18
|
+
* **The grant is WORKSPACE-WIDE, not limited to runs the key started.** The decision surface
|
|
19
|
+
* is keyed by run id and resolves any run in the key's workspace — including a board task a
|
|
20
|
+
* human started in the SPA — because a headless overseer that could only answer its own runs
|
|
21
|
+
* would be useless for the case it exists for (an integration watching a team's board). That
|
|
22
|
+
* is the same reach a `write` key already has over board runs (start/stop/retry), one rung
|
|
23
|
+
* up. Scope a key to a workspace accordingly, and prefer `write` for an integration that
|
|
24
|
+
* only needs to author and launch.
|
|
25
|
+
* - `admin` — everything `decide` can do, PLUS destructive / merge-adjacent operations
|
|
26
|
+
* (delete a task, act on a notification — which can perform a real merge).
|
|
11
27
|
*
|
|
12
28
|
* The canonical rank order lives beside this schema (`PUBLIC_API_SCOPES`) so both the wire
|
|
13
|
-
* validation and the server-side `scope ≥ required` check read from one source of truth
|
|
29
|
+
* validation and the server-side `scope ≥ required` check read from one source of truth —
|
|
30
|
+
* the ARRAY ORDER *is* the ladder, and `scopeSatisfies` derives its ranks from it.
|
|
14
31
|
*/
|
|
15
|
-
export declare const PUBLIC_API_SCOPES: readonly ['read', 'write', 'admin'];
|
|
16
|
-
export declare const publicApiScopeSchema: v.PicklistSchema<readonly ["read", "write", "admin"], undefined>;
|
|
32
|
+
export declare const PUBLIC_API_SCOPES: readonly ['read', 'write', 'decide', 'admin'];
|
|
33
|
+
export declare const publicApiScopeSchema: v.PicklistSchema<readonly ["read", "write", "decide", "admin"], undefined>;
|
|
17
34
|
export type PublicApiScope = v.InferOutput<typeof publicApiScopeSchema>;
|
|
18
35
|
/** One public-API key as exposed to clients — metadata only, never the secret. */
|
|
19
36
|
export declare const publicApiKeySchema: v.ObjectSchema<{
|
|
@@ -23,7 +40,7 @@ export declare const publicApiKeySchema: v.ObjectSchema<{
|
|
|
23
40
|
readonly workspaceId: v.StringSchema<undefined>;
|
|
24
41
|
readonly label: v.StringSchema<undefined>;
|
|
25
42
|
/** What the key is allowed to do on `/api/v1` (read ⊂ write ⊂ admin). */
|
|
26
|
-
readonly scope: v.PicklistSchema<readonly ["read", "write", "admin"], undefined>;
|
|
43
|
+
readonly scope: v.PicklistSchema<readonly ["read", "write", "decide", "admin"], undefined>;
|
|
27
44
|
/** The user who minted the key (`usr_*`), for audit/UI attribution; `null` when unknown. */
|
|
28
45
|
readonly createdByUserId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
29
46
|
readonly createdAt: v.NumberSchema<undefined>;
|
|
@@ -40,7 +57,7 @@ export declare const publicApiKeyListResultSchema: v.ObjectSchema<{
|
|
|
40
57
|
readonly workspaceId: v.StringSchema<undefined>;
|
|
41
58
|
readonly label: v.StringSchema<undefined>;
|
|
42
59
|
/** What the key is allowed to do on `/api/v1` (read ⊂ write ⊂ admin). */
|
|
43
|
-
readonly scope: v.PicklistSchema<readonly ["read", "write", "admin"], undefined>;
|
|
60
|
+
readonly scope: v.PicklistSchema<readonly ["read", "write", "decide", "admin"], undefined>;
|
|
44
61
|
/** The user who minted the key (`usr_*`), for audit/UI attribution; `null` when unknown. */
|
|
45
62
|
readonly createdByUserId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
46
63
|
readonly createdAt: v.NumberSchema<undefined>;
|
|
@@ -53,12 +70,13 @@ export type PublicApiKeyListResult = v.InferOutput<typeof publicApiKeyListResult
|
|
|
53
70
|
/**
|
|
54
71
|
* Mint a new key. A label plus an optional `scope` (the account/workspace scope comes from the
|
|
55
72
|
* mounting route). `scope` defaults to `write` — the safe middle of the ladder: a fresh key can
|
|
56
|
-
* create/start/manage tasks but NOT
|
|
57
|
-
* `admin` explicitly. Pass `read` for a
|
|
73
|
+
* create/start/manage tasks but NOT answer a parked run's decisions, delete, or perform a
|
|
74
|
+
* merge-adjacent action until it is minted `decide` / `admin` explicitly. Pass `read` for a
|
|
75
|
+
* monitor-only integration.
|
|
58
76
|
*/
|
|
59
77
|
export declare const createPublicApiKeySchema: v.ObjectSchema<{
|
|
60
78
|
readonly label: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 120, undefined>]>;
|
|
61
|
-
readonly scope: v.OptionalSchema<v.PicklistSchema<readonly ["read", "write", "admin"], undefined>, "write">;
|
|
79
|
+
readonly scope: v.OptionalSchema<v.PicklistSchema<readonly ["read", "write", "decide", "admin"], undefined>, "write">;
|
|
62
80
|
}, undefined>;
|
|
63
81
|
export type CreatePublicApiKeyInput = v.InferOutput<typeof createPublicApiKeySchema>;
|
|
64
82
|
/**
|
|
@@ -73,7 +91,7 @@ export declare const createdPublicApiKeySchema: v.ObjectSchema<{
|
|
|
73
91
|
readonly workspaceId: v.StringSchema<undefined>;
|
|
74
92
|
readonly label: v.StringSchema<undefined>;
|
|
75
93
|
/** What the key is allowed to do on `/api/v1` (read ⊂ write ⊂ admin). */
|
|
76
|
-
readonly scope: v.PicklistSchema<readonly ["read", "write", "admin"], undefined>;
|
|
94
|
+
readonly scope: v.PicklistSchema<readonly ["read", "write", "decide", "admin"], undefined>;
|
|
77
95
|
/** The user who minted the key (`usr_*`), for audit/UI attribution; `null` when unknown. */
|
|
78
96
|
readonly createdByUserId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
79
97
|
readonly createdAt: v.NumberSchema<undefined>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public-api-keys.d.ts","sourceRoot":"","sources":["../src/public-api-keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAiB5B
|
|
1
|
+
{"version":3,"file":"public-api-keys.d.ts","sourceRoot":"","sources":["../src/public-api-keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAiB5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,iBAAiB,YAAI,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAA;AAC9E,eAAO,MAAM,oBAAoB,4EAAgC,CAAA;AACjE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAEvE,kFAAkF;AAClF,eAAO,MAAM,kBAAkB;IAC7B,uEAAuE;;;;;IAKvE,yEAAyE;;IAEzE,4FAA4F;;;;IAI5F,mFAAmF;;aAEnF,CAAA;AACF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAEnE,eAAO,MAAM,4BAA4B;;QAhBvC,uEAAuE;;;;;QAKvE,yEAAyE;;QAEzE,4FAA4F;;;;QAI5F,mFAAmF;;;aAKM,CAAA;AAC3F,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,4BAA4B,CAAC,CAAA;AAEvF;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB;;;aAGnC,CAAA;AACF,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,wBAAwB,CAAC,CAAA;AAEpF;;;GAGG;AACH,eAAO,MAAM,yBAAyB;;QApCpC,uEAAuE;;;;;QAKvE,yEAAyE;;QAEzE,4FAA4F;;;;QAI5F,mFAAmF;;;IA2BnF,sEAAsE;;aAEtE,CAAA;AACF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,yBAAyB,CAAC,CAAA"}
|
package/dist/public-api-keys.js
CHANGED
|
@@ -17,16 +17,33 @@ import * as v from 'valibot';
|
|
|
17
17
|
* The permission a key carries on the `/api/v1` surface. An ordered ladder — each level
|
|
18
18
|
* INCLUDES the ones below it (`admin` ⊃ `write` ⊃ `read`), so an endpoint gates on a MINIMUM:
|
|
19
19
|
*
|
|
20
|
-
* - `read`
|
|
21
|
-
* - `write`
|
|
20
|
+
* - `read` — read-only reads/streams (list services/tasks/pipelines, poll a run, SSE).
|
|
21
|
+
* - `write` — everything `read` can do, PLUS non-destructive mutations (create/start/stop/
|
|
22
22
|
* retry/edit a task, start an initiative run).
|
|
23
|
-
* - `
|
|
24
|
-
* (
|
|
23
|
+
* - `decide` — everything `write` can do, PLUS answering a run's PARKED human decisions
|
|
24
|
+
* (requirement-review findings, implementation-fork choices) — and, because of that,
|
|
25
|
+
* starting a headless run on a pipeline that can park at all. Answering a decision injects
|
|
26
|
+
* caller-supplied prose into the requirements every downstream agent then implements and
|
|
27
|
+
* un-parks the run, so it is deliberately a rung above ordinary task authoring: a plain
|
|
28
|
+
* `write` integration sees exactly the pre-existing behaviour, including the refusal of
|
|
29
|
+
* parking pipelines. Minting a `decide` key is the operator asserting "this integration is
|
|
30
|
+
* the headless overseer for these runs".
|
|
31
|
+
*
|
|
32
|
+
* **The grant is WORKSPACE-WIDE, not limited to runs the key started.** The decision surface
|
|
33
|
+
* is keyed by run id and resolves any run in the key's workspace — including a board task a
|
|
34
|
+
* human started in the SPA — because a headless overseer that could only answer its own runs
|
|
35
|
+
* would be useless for the case it exists for (an integration watching a team's board). That
|
|
36
|
+
* is the same reach a `write` key already has over board runs (start/stop/retry), one rung
|
|
37
|
+
* up. Scope a key to a workspace accordingly, and prefer `write` for an integration that
|
|
38
|
+
* only needs to author and launch.
|
|
39
|
+
* - `admin` — everything `decide` can do, PLUS destructive / merge-adjacent operations
|
|
40
|
+
* (delete a task, act on a notification — which can perform a real merge).
|
|
25
41
|
*
|
|
26
42
|
* The canonical rank order lives beside this schema (`PUBLIC_API_SCOPES`) so both the wire
|
|
27
|
-
* validation and the server-side `scope ≥ required` check read from one source of truth
|
|
43
|
+
* validation and the server-side `scope ≥ required` check read from one source of truth —
|
|
44
|
+
* the ARRAY ORDER *is* the ladder, and `scopeSatisfies` derives its ranks from it.
|
|
28
45
|
*/
|
|
29
|
-
export const PUBLIC_API_SCOPES = ['read', 'write', 'admin'];
|
|
46
|
+
export const PUBLIC_API_SCOPES = ['read', 'write', 'decide', 'admin'];
|
|
30
47
|
export const publicApiScopeSchema = v.picklist(PUBLIC_API_SCOPES);
|
|
31
48
|
/** One public-API key as exposed to clients — metadata only, never the secret. */
|
|
32
49
|
export const publicApiKeySchema = v.object({
|
|
@@ -48,8 +65,9 @@ export const publicApiKeyListResultSchema = v.object({ keys: v.array(publicApiKe
|
|
|
48
65
|
/**
|
|
49
66
|
* Mint a new key. A label plus an optional `scope` (the account/workspace scope comes from the
|
|
50
67
|
* mounting route). `scope` defaults to `write` — the safe middle of the ladder: a fresh key can
|
|
51
|
-
* create/start/manage tasks but NOT
|
|
52
|
-
* `admin` explicitly. Pass `read` for a
|
|
68
|
+
* create/start/manage tasks but NOT answer a parked run's decisions, delete, or perform a
|
|
69
|
+
* merge-adjacent action until it is minted `decide` / `admin` explicitly. Pass `read` for a
|
|
70
|
+
* monitor-only integration.
|
|
53
71
|
*/
|
|
54
72
|
export const createPublicApiKeySchema = v.object({
|
|
55
73
|
label: v.pipe(v.string(), v.trim(), v.minLength(1), v.maxLength(120)),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public-api-keys.js","sourceRoot":"","sources":["../src/public-api-keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B,8EAA8E;AAC9E,yCAAyC;AACzC,EAAE;AACF,+EAA+E;AAC/E,8EAA8E;AAC9E,2EAA2E;AAC3E,8EAA8E;AAC9E,wEAAwE;AACxE,gFAAgF;AAChF,gEAAgE;AAChE,EAAE;AACF,+EAA+E;AAC/E,2BAA2B;AAC3B,8EAA8E;AAE9E
|
|
1
|
+
{"version":3,"file":"public-api-keys.js","sourceRoot":"","sources":["../src/public-api-keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B,8EAA8E;AAC9E,yCAAyC;AACzC,EAAE;AACF,+EAA+E;AAC/E,8EAA8E;AAC9E,2EAA2E;AAC3E,8EAA8E;AAC9E,wEAAwE;AACxE,gFAAgF;AAChF,gEAAgE;AAChE,EAAE;AACF,+EAA+E;AAC/E,2BAA2B;AAC3B,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAA;AAC9E,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAA;AAGjE,kFAAkF;AAClF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,uEAAuE;IACvE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,yEAAyE;IACzE,KAAK,EAAE,oBAAoB;IAC3B,4FAA4F;IAC5F,eAAe,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACvC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,mFAAmF;IACnF,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CAClC,CAAC,CAAA;AAGF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAA;AAG3F;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,KAAK,EAAE,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;IACrE,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;CACjD,CAAC,CAAA;AAGF;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,GAAG,EAAE,kBAAkB;IACvB,sEAAsE;IACtE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;CACnB,CAAC,CAAA"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
/** Which parked decision a `publicDecision` entry describes. */
|
|
3
|
+
export declare const publicDecisionKindSchema: v.PicklistSchema<["requirements-review", "fork"], undefined>;
|
|
4
|
+
export type PublicDecisionKind = v.InferOutput<typeof publicDecisionKindSchema>;
|
|
5
|
+
/**
|
|
6
|
+
* One reviewer finding as exposed externally — the question, how serious it is, and where it
|
|
7
|
+
* stands. `itemId` is the STABLE anchor a reply addresses (and, in slice 2, the id rendered into
|
|
8
|
+
* the tracker-issue comment so a ticket reply can target a finding). The internal item's
|
|
9
|
+
* `autoAnswerable` classification and the Requirement-Writer recommendation machinery are
|
|
10
|
+
* deliberately not exposed: they drive in-app affordances a headless caller has no use for.
|
|
11
|
+
*/
|
|
12
|
+
export declare const publicReviewFindingSchema: v.ObjectSchema<{
|
|
13
|
+
readonly itemId: v.StringSchema<undefined>;
|
|
14
|
+
/** What kind of concern this raises (gap / clarification / assumption / risk / question). */
|
|
15
|
+
readonly category: v.PicklistSchema<["gap", "clarification", "assumption", "risk", "question"], undefined>;
|
|
16
|
+
/** How important resolving it is before implementation proceeds. */
|
|
17
|
+
readonly severity: v.PicklistSchema<["low", "medium", "high"], undefined>;
|
|
18
|
+
/** Short headline of the concern. */
|
|
19
|
+
readonly title: v.StringSchema<undefined>;
|
|
20
|
+
/** The full question / gap / challenge, in plain prose. */
|
|
21
|
+
readonly detail: v.StringSchema<undefined>;
|
|
22
|
+
/** `open` until answered or dismissed; only `open` findings block incorporation. */
|
|
23
|
+
readonly status: v.PicklistSchema<["open", "answered", "resolved", "dismissed", "recommend_requested"], undefined>;
|
|
24
|
+
/** The recorded answer, or null while unanswered. */
|
|
25
|
+
readonly reply: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
26
|
+
}, undefined>;
|
|
27
|
+
export type PublicReviewFinding = v.InferOutput<typeof publicReviewFindingSchema>;
|
|
28
|
+
/**
|
|
29
|
+
* A parked requirements review as exposed externally. The loop a caller drives: answer or dismiss
|
|
30
|
+
* every `open` finding, then `incorporate` (which folds the answers into one standard-format
|
|
31
|
+
* document and re-reviews it in the background). The review converges (`incorporated` — the run
|
|
32
|
+
* advances), comes back with a fresh round (`ready`), or hits its iteration cap (`exceeded`, where
|
|
33
|
+
* `resolve-exceeded` picks one more round / proceed anyway / stop).
|
|
34
|
+
*/
|
|
35
|
+
export declare const publicRequirementsDecisionSchema: v.ObjectSchema<{
|
|
36
|
+
readonly kind: v.LiteralSchema<"requirements-review", undefined>;
|
|
37
|
+
readonly reviewId: v.StringSchema<undefined>;
|
|
38
|
+
/** The board task the review belongs to. */
|
|
39
|
+
readonly taskId: v.StringSchema<undefined>;
|
|
40
|
+
readonly status: v.PicklistSchema<["ready", "incorporating", "reviewing", "merged", "exceeded", "incorporated"], undefined>;
|
|
41
|
+
/** Which reviewer pass this is (the initial review is 1). */
|
|
42
|
+
readonly iteration: v.NumberSchema<undefined>;
|
|
43
|
+
/** The reviewer-pass budget, from the task's merge preset. */
|
|
44
|
+
readonly maxIterations: v.NumberSchema<undefined>;
|
|
45
|
+
readonly findings: v.ArraySchema<v.ObjectSchema<{
|
|
46
|
+
readonly itemId: v.StringSchema<undefined>;
|
|
47
|
+
/** What kind of concern this raises (gap / clarification / assumption / risk / question). */
|
|
48
|
+
readonly category: v.PicklistSchema<["gap", "clarification", "assumption", "risk", "question"], undefined>;
|
|
49
|
+
/** How important resolving it is before implementation proceeds. */
|
|
50
|
+
readonly severity: v.PicklistSchema<["low", "medium", "high"], undefined>;
|
|
51
|
+
/** Short headline of the concern. */
|
|
52
|
+
readonly title: v.StringSchema<undefined>;
|
|
53
|
+
/** The full question / gap / challenge, in plain prose. */
|
|
54
|
+
readonly detail: v.StringSchema<undefined>;
|
|
55
|
+
/** `open` until answered or dismissed; only `open` findings block incorporation. */
|
|
56
|
+
readonly status: v.PicklistSchema<["open", "answered", "resolved", "dismissed", "recommend_requested"], undefined>;
|
|
57
|
+
/** The recorded answer, or null while unanswered. */
|
|
58
|
+
readonly reply: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
59
|
+
}, undefined>, undefined>;
|
|
60
|
+
/**
|
|
61
|
+
* The standardized requirements document the last incorporation produced; null until one
|
|
62
|
+
* exists. Once the review settles, this is what every downstream agent implements — so a
|
|
63
|
+
* caller can read exactly what its answers turned into before proceeding.
|
|
64
|
+
*/
|
|
65
|
+
readonly incorporatedRequirements: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
66
|
+
}, undefined>;
|
|
67
|
+
export type PublicRequirementsDecision = v.InferOutput<typeof publicRequirementsDecisionSchema>;
|
|
68
|
+
/**
|
|
69
|
+
* A parked implementation-fork choice as exposed externally: the materially different ways to
|
|
70
|
+
* implement the task, surfaced before any code is written. A caller picks a `forkId` or submits
|
|
71
|
+
* its own `custom` approach; the Coder then runs with the choice folded in as a binding directive.
|
|
72
|
+
* The grounded chat is deliberately NOT exposed — it is an interactive deliberation affordance,
|
|
73
|
+
* and a headless caller that wants to reason about the forks has the full `approach`/`tradeoffs`
|
|
74
|
+
* text right here.
|
|
75
|
+
*/
|
|
76
|
+
export declare const publicForkDecisionSchema: v.ObjectSchema<{
|
|
77
|
+
readonly kind: v.LiteralSchema<"fork", undefined>;
|
|
78
|
+
/** The run's fork-decision lifecycle state; only `awaiting_choice` accepts a choice. */
|
|
79
|
+
readonly status: v.PicklistSchema<["proposing", "awaiting_choice", "answering", "chosen", "single_path", "skipped"], undefined>;
|
|
80
|
+
/** The proposer's read of where the change lands (grounding for the choice). */
|
|
81
|
+
readonly seamSummary: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
82
|
+
/** The proposed approaches, each with its id, plan, trade-offs and risk notes. */
|
|
83
|
+
readonly forks: v.ArraySchema<v.ObjectSchema<{
|
|
84
|
+
readonly id: v.StringSchema<undefined>;
|
|
85
|
+
readonly title: v.StringSchema<undefined>;
|
|
86
|
+
readonly summary: v.StringSchema<undefined>;
|
|
87
|
+
readonly approach: v.StringSchema<undefined>;
|
|
88
|
+
readonly tradeoffs: v.ArraySchema<v.StringSchema<undefined>, undefined>;
|
|
89
|
+
readonly riskNotes: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
|
|
90
|
+
readonly recommended: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
|
|
91
|
+
}, undefined>, undefined>;
|
|
92
|
+
}, undefined>;
|
|
93
|
+
export type PublicForkDecision = v.InferOutput<typeof publicForkDecisionSchema>;
|
|
94
|
+
export declare const publicDecisionSchema: v.VariantSchema<"kind", [v.ObjectSchema<{
|
|
95
|
+
readonly kind: v.LiteralSchema<"requirements-review", undefined>;
|
|
96
|
+
readonly reviewId: v.StringSchema<undefined>;
|
|
97
|
+
/** The board task the review belongs to. */
|
|
98
|
+
readonly taskId: v.StringSchema<undefined>;
|
|
99
|
+
readonly status: v.PicklistSchema<["ready", "incorporating", "reviewing", "merged", "exceeded", "incorporated"], undefined>;
|
|
100
|
+
/** Which reviewer pass this is (the initial review is 1). */
|
|
101
|
+
readonly iteration: v.NumberSchema<undefined>;
|
|
102
|
+
/** The reviewer-pass budget, from the task's merge preset. */
|
|
103
|
+
readonly maxIterations: v.NumberSchema<undefined>;
|
|
104
|
+
readonly findings: v.ArraySchema<v.ObjectSchema<{
|
|
105
|
+
readonly itemId: v.StringSchema<undefined>;
|
|
106
|
+
/** What kind of concern this raises (gap / clarification / assumption / risk / question). */
|
|
107
|
+
readonly category: v.PicklistSchema<["gap", "clarification", "assumption", "risk", "question"], undefined>;
|
|
108
|
+
/** How important resolving it is before implementation proceeds. */
|
|
109
|
+
readonly severity: v.PicklistSchema<["low", "medium", "high"], undefined>;
|
|
110
|
+
/** Short headline of the concern. */
|
|
111
|
+
readonly title: v.StringSchema<undefined>;
|
|
112
|
+
/** The full question / gap / challenge, in plain prose. */
|
|
113
|
+
readonly detail: v.StringSchema<undefined>;
|
|
114
|
+
/** `open` until answered or dismissed; only `open` findings block incorporation. */
|
|
115
|
+
readonly status: v.PicklistSchema<["open", "answered", "resolved", "dismissed", "recommend_requested"], undefined>;
|
|
116
|
+
/** The recorded answer, or null while unanswered. */
|
|
117
|
+
readonly reply: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
118
|
+
}, undefined>, undefined>;
|
|
119
|
+
/**
|
|
120
|
+
* The standardized requirements document the last incorporation produced; null until one
|
|
121
|
+
* exists. Once the review settles, this is what every downstream agent implements — so a
|
|
122
|
+
* caller can read exactly what its answers turned into before proceeding.
|
|
123
|
+
*/
|
|
124
|
+
readonly incorporatedRequirements: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
125
|
+
}, undefined>, v.ObjectSchema<{
|
|
126
|
+
readonly kind: v.LiteralSchema<"fork", undefined>;
|
|
127
|
+
/** The run's fork-decision lifecycle state; only `awaiting_choice` accepts a choice. */
|
|
128
|
+
readonly status: v.PicklistSchema<["proposing", "awaiting_choice", "answering", "chosen", "single_path", "skipped"], undefined>;
|
|
129
|
+
/** The proposer's read of where the change lands (grounding for the choice). */
|
|
130
|
+
readonly seamSummary: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
131
|
+
/** The proposed approaches, each with its id, plan, trade-offs and risk notes. */
|
|
132
|
+
readonly forks: v.ArraySchema<v.ObjectSchema<{
|
|
133
|
+
readonly id: v.StringSchema<undefined>;
|
|
134
|
+
readonly title: v.StringSchema<undefined>;
|
|
135
|
+
readonly summary: v.StringSchema<undefined>;
|
|
136
|
+
readonly approach: v.StringSchema<undefined>;
|
|
137
|
+
readonly tradeoffs: v.ArraySchema<v.StringSchema<undefined>, undefined>;
|
|
138
|
+
readonly riskNotes: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
|
|
139
|
+
readonly recommended: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
|
|
140
|
+
}, undefined>, undefined>;
|
|
141
|
+
}, undefined>], undefined>;
|
|
142
|
+
export type PublicDecision = v.InferOutput<typeof publicDecisionSchema>;
|
|
143
|
+
/**
|
|
144
|
+
* A run's currently-parked decisions. `parked` is the single flag a caller polls or reacts to:
|
|
145
|
+
* true when the run is `blocked` awaiting one of the decisions listed. An empty list with
|
|
146
|
+
* `parked: false` is the ordinary case for a run that is simply still working.
|
|
147
|
+
*/
|
|
148
|
+
export declare const publicDecisionListSchema: v.ObjectSchema<{
|
|
149
|
+
readonly runId: v.StringSchema<undefined>;
|
|
150
|
+
readonly taskId: v.StringSchema<undefined>;
|
|
151
|
+
/** The run's raw status — `blocked` is the parked state. */
|
|
152
|
+
readonly status: v.PicklistSchema<["running", "blocked", "paused", "done", "failed"], undefined>;
|
|
153
|
+
/** Whether the run is currently parked awaiting a human decision. */
|
|
154
|
+
readonly parked: v.BooleanSchema<undefined>;
|
|
155
|
+
readonly decisions: v.ArraySchema<v.VariantSchema<"kind", [v.ObjectSchema<{
|
|
156
|
+
readonly kind: v.LiteralSchema<"requirements-review", undefined>;
|
|
157
|
+
readonly reviewId: v.StringSchema<undefined>;
|
|
158
|
+
/** The board task the review belongs to. */
|
|
159
|
+
readonly taskId: v.StringSchema<undefined>;
|
|
160
|
+
readonly status: v.PicklistSchema<["ready", "incorporating", "reviewing", "merged", "exceeded", "incorporated"], undefined>;
|
|
161
|
+
/** Which reviewer pass this is (the initial review is 1). */
|
|
162
|
+
readonly iteration: v.NumberSchema<undefined>;
|
|
163
|
+
/** The reviewer-pass budget, from the task's merge preset. */
|
|
164
|
+
readonly maxIterations: v.NumberSchema<undefined>;
|
|
165
|
+
readonly findings: v.ArraySchema<v.ObjectSchema<{
|
|
166
|
+
readonly itemId: v.StringSchema<undefined>;
|
|
167
|
+
/** What kind of concern this raises (gap / clarification / assumption / risk / question). */
|
|
168
|
+
readonly category: v.PicklistSchema<["gap", "clarification", "assumption", "risk", "question"], undefined>;
|
|
169
|
+
/** How important resolving it is before implementation proceeds. */
|
|
170
|
+
readonly severity: v.PicklistSchema<["low", "medium", "high"], undefined>;
|
|
171
|
+
/** Short headline of the concern. */
|
|
172
|
+
readonly title: v.StringSchema<undefined>;
|
|
173
|
+
/** The full question / gap / challenge, in plain prose. */
|
|
174
|
+
readonly detail: v.StringSchema<undefined>;
|
|
175
|
+
/** `open` until answered or dismissed; only `open` findings block incorporation. */
|
|
176
|
+
readonly status: v.PicklistSchema<["open", "answered", "resolved", "dismissed", "recommend_requested"], undefined>;
|
|
177
|
+
/** The recorded answer, or null while unanswered. */
|
|
178
|
+
readonly reply: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
179
|
+
}, undefined>, undefined>;
|
|
180
|
+
/**
|
|
181
|
+
* The standardized requirements document the last incorporation produced; null until one
|
|
182
|
+
* exists. Once the review settles, this is what every downstream agent implements — so a
|
|
183
|
+
* caller can read exactly what its answers turned into before proceeding.
|
|
184
|
+
*/
|
|
185
|
+
readonly incorporatedRequirements: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
186
|
+
}, undefined>, v.ObjectSchema<{
|
|
187
|
+
readonly kind: v.LiteralSchema<"fork", undefined>;
|
|
188
|
+
/** The run's fork-decision lifecycle state; only `awaiting_choice` accepts a choice. */
|
|
189
|
+
readonly status: v.PicklistSchema<["proposing", "awaiting_choice", "answering", "chosen", "single_path", "skipped"], undefined>;
|
|
190
|
+
/** The proposer's read of where the change lands (grounding for the choice). */
|
|
191
|
+
readonly seamSummary: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
192
|
+
/** The proposed approaches, each with its id, plan, trade-offs and risk notes. */
|
|
193
|
+
readonly forks: v.ArraySchema<v.ObjectSchema<{
|
|
194
|
+
readonly id: v.StringSchema<undefined>;
|
|
195
|
+
readonly title: v.StringSchema<undefined>;
|
|
196
|
+
readonly summary: v.StringSchema<undefined>;
|
|
197
|
+
readonly approach: v.StringSchema<undefined>;
|
|
198
|
+
readonly tradeoffs: v.ArraySchema<v.StringSchema<undefined>, undefined>;
|
|
199
|
+
readonly riskNotes: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
|
|
200
|
+
readonly recommended: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
|
|
201
|
+
}, undefined>, undefined>;
|
|
202
|
+
}, undefined>], undefined>, undefined>;
|
|
203
|
+
}, undefined>;
|
|
204
|
+
export type PublicDecisionList = v.InferOutput<typeof publicDecisionListSchema>;
|
|
205
|
+
/** Answer one reviewer finding. Mirrors the SPA's `replyReviewItemSchema` bounds. */
|
|
206
|
+
export declare const publicReplyFindingSchema: v.ObjectSchema<{
|
|
207
|
+
readonly reply: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 4000, undefined>]>;
|
|
208
|
+
}, undefined>;
|
|
209
|
+
export type PublicReplyFindingInput = v.InferOutput<typeof publicReplyFindingSchema>;
|
|
210
|
+
/**
|
|
211
|
+
* Set a finding's status. Deliberately narrower than the SPA's full item-status patch: a headless
|
|
212
|
+
* caller may `dismiss` a finding as not applicable or `reopen` one it dismissed by mistake.
|
|
213
|
+
* `answered` is reached by REPLYING (which is what records the answer the incorporation folds in),
|
|
214
|
+
* and `recommend_requested` drives an in-app-only affordance, so neither is settable here.
|
|
215
|
+
*/
|
|
216
|
+
export declare const publicSetFindingStatusSchema: v.ObjectSchema<{
|
|
217
|
+
readonly status: v.PicklistSchema<["dismissed", "open"], undefined>;
|
|
218
|
+
}, undefined>;
|
|
219
|
+
export type PublicSetFindingStatusInput = v.InferOutput<typeof publicSetFindingStatusSchema>;
|
|
220
|
+
/**
|
|
221
|
+
* Incorporate the recorded answers. Optional `feedback` is the "do it differently" lever when
|
|
222
|
+
* redoing a merge, exactly as in the SPA. Asynchronous: the durable driver folds and re-reviews in
|
|
223
|
+
* the background, so the response is the `incorporating` review, not the finished document.
|
|
224
|
+
*/
|
|
225
|
+
export declare const publicIncorporateSchema: v.ObjectSchema<{
|
|
226
|
+
readonly feedback: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 4000, undefined>]>, undefined>;
|
|
227
|
+
}, undefined>;
|
|
228
|
+
export type PublicIncorporateInput = v.InferOutput<typeof publicIncorporateSchema>;
|
|
229
|
+
/**
|
|
230
|
+
* Resolve a review that hit its iteration cap: one more reviewer pass, proceed with the last
|
|
231
|
+
* incorporated document, or stop and reset the task to an editable state. The same three choices
|
|
232
|
+
* the SPA offers — there is deliberately no timed default (a parked run waits for an answer
|
|
233
|
+
* indefinitely, so a silent auto-proceed would ship requirements nobody approved).
|
|
234
|
+
*/
|
|
235
|
+
export declare const publicResolveExceededSchema: v.ObjectSchema<{
|
|
236
|
+
readonly choice: v.PicklistSchema<["extra-round", "proceed", "stop-reset"], undefined>;
|
|
237
|
+
}, undefined>;
|
|
238
|
+
export type PublicResolveExceededInput = v.InferOutput<typeof publicResolveExceededSchema>;
|
|
239
|
+
/**
|
|
240
|
+
* Choose an implementation approach: EXACTLY one of a proposed `forkId` or a free-text `custom`
|
|
241
|
+
* approach, optionally with a steering `note` on a picked fork. Mirrors the SPA's `chooseForkSchema`
|
|
242
|
+
* (same xor rule and bounds) so both surfaces accept identical input.
|
|
243
|
+
*/
|
|
244
|
+
export declare const publicChooseForkSchema: v.SchemaWithPipe<readonly [v.ObjectSchema<{
|
|
245
|
+
readonly forkId: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
|
|
246
|
+
readonly custom: v.OptionalSchema<v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 8000, undefined>]>, undefined>, undefined>;
|
|
247
|
+
readonly note: v.OptionalSchema<v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 4000, undefined>]>, undefined>, undefined>;
|
|
248
|
+
}, undefined>, v.CheckAction<{
|
|
249
|
+
forkId?: string | null | undefined;
|
|
250
|
+
custom?: string | null | undefined;
|
|
251
|
+
note?: string | null | undefined;
|
|
252
|
+
}, "Provide exactly one of forkId or custom.">]>;
|
|
253
|
+
export type PublicChooseForkInput = v.InferOutput<typeof publicChooseForkSchema>;
|
|
254
|
+
//# sourceMappingURL=public-decisions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-decisions.d.ts","sourceRoot":"","sources":["../src/public-decisions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
import { forkDecisionStatusSchema, forkOptionSchema } from './forkDecision.js';
|
|
3
|
+
import { publicRunStatusSchema } from './public-api.js';
|
|
4
|
+
import { requirementReviewStatusSchema, reviewItemCategorySchema, reviewItemSeveritySchema, reviewItemStatusSchema, } from './requirements.js';
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Public-API wire contracts for a run's PARKED HUMAN DECISIONS (`/api/v1/runs/:runId/decisions`).
|
|
7
|
+
//
|
|
8
|
+
// The requirements-review loop is the platform's clarification machinery: the reviewer raises
|
|
9
|
+
// findings, the run parks on a durable decision-wait, a human answers/dismisses, an incorporation
|
|
10
|
+
// pass folds the answers in, and the run advances. Until now that loop was reachable only through
|
|
11
|
+
// the SPA, so a headless (`/api/v1`) run could not include clarification at all — the public
|
|
12
|
+
// surface refused any pipeline that could park.
|
|
13
|
+
//
|
|
14
|
+
// These resources are the external counterpart of that loop. Two decision kinds are exposed today:
|
|
15
|
+
// the requirements review (findings + the iteration loop) and the implementation-fork choice. Both
|
|
16
|
+
// are deliberately SMALL projections of the internal entities, following the `publicTask` /
|
|
17
|
+
// `publicService` pattern: a caller sees the findings and their stable ids, never the engine's
|
|
18
|
+
// step/approval internals, the recommendation machinery, or the reviewer's model plumbing.
|
|
19
|
+
//
|
|
20
|
+
// Answering rides the SAME service methods the SPA controllers call, so the park's CAS/approval-id
|
|
21
|
+
// arbitration and the task's merge-preset knobs (iteration cap, tolerated severity) apply
|
|
22
|
+
// identically whichever surface answers first. See
|
|
23
|
+
// `docs/initiatives/headless-clarification-loop.md`.
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
/** Which parked decision a `publicDecision` entry describes. */
|
|
26
|
+
export const publicDecisionKindSchema = v.picklist(['requirements-review', 'fork']);
|
|
27
|
+
/**
|
|
28
|
+
* One reviewer finding as exposed externally — the question, how serious it is, and where it
|
|
29
|
+
* stands. `itemId` is the STABLE anchor a reply addresses (and, in slice 2, the id rendered into
|
|
30
|
+
* the tracker-issue comment so a ticket reply can target a finding). The internal item's
|
|
31
|
+
* `autoAnswerable` classification and the Requirement-Writer recommendation machinery are
|
|
32
|
+
* deliberately not exposed: they drive in-app affordances a headless caller has no use for.
|
|
33
|
+
*/
|
|
34
|
+
export const publicReviewFindingSchema = v.object({
|
|
35
|
+
itemId: v.string(),
|
|
36
|
+
/** What kind of concern this raises (gap / clarification / assumption / risk / question). */
|
|
37
|
+
category: reviewItemCategorySchema,
|
|
38
|
+
/** How important resolving it is before implementation proceeds. */
|
|
39
|
+
severity: reviewItemSeveritySchema,
|
|
40
|
+
/** Short headline of the concern. */
|
|
41
|
+
title: v.string(),
|
|
42
|
+
/** The full question / gap / challenge, in plain prose. */
|
|
43
|
+
detail: v.string(),
|
|
44
|
+
/** `open` until answered or dismissed; only `open` findings block incorporation. */
|
|
45
|
+
status: reviewItemStatusSchema,
|
|
46
|
+
/** The recorded answer, or null while unanswered. */
|
|
47
|
+
reply: v.nullable(v.string()),
|
|
48
|
+
});
|
|
49
|
+
/**
|
|
50
|
+
* A parked requirements review as exposed externally. The loop a caller drives: answer or dismiss
|
|
51
|
+
* every `open` finding, then `incorporate` (which folds the answers into one standard-format
|
|
52
|
+
* document and re-reviews it in the background). The review converges (`incorporated` — the run
|
|
53
|
+
* advances), comes back with a fresh round (`ready`), or hits its iteration cap (`exceeded`, where
|
|
54
|
+
* `resolve-exceeded` picks one more round / proceed anyway / stop).
|
|
55
|
+
*/
|
|
56
|
+
export const publicRequirementsDecisionSchema = v.object({
|
|
57
|
+
kind: v.literal('requirements-review'),
|
|
58
|
+
reviewId: v.string(),
|
|
59
|
+
/** The board task the review belongs to. */
|
|
60
|
+
taskId: v.string(),
|
|
61
|
+
status: requirementReviewStatusSchema,
|
|
62
|
+
/** Which reviewer pass this is (the initial review is 1). */
|
|
63
|
+
iteration: v.number(),
|
|
64
|
+
/** The reviewer-pass budget, from the task's merge preset. */
|
|
65
|
+
maxIterations: v.number(),
|
|
66
|
+
findings: v.array(publicReviewFindingSchema),
|
|
67
|
+
/**
|
|
68
|
+
* The standardized requirements document the last incorporation produced; null until one
|
|
69
|
+
* exists. Once the review settles, this is what every downstream agent implements — so a
|
|
70
|
+
* caller can read exactly what its answers turned into before proceeding.
|
|
71
|
+
*/
|
|
72
|
+
incorporatedRequirements: v.nullable(v.string()),
|
|
73
|
+
});
|
|
74
|
+
/**
|
|
75
|
+
* A parked implementation-fork choice as exposed externally: the materially different ways to
|
|
76
|
+
* implement the task, surfaced before any code is written. A caller picks a `forkId` or submits
|
|
77
|
+
* its own `custom` approach; the Coder then runs with the choice folded in as a binding directive.
|
|
78
|
+
* The grounded chat is deliberately NOT exposed — it is an interactive deliberation affordance,
|
|
79
|
+
* and a headless caller that wants to reason about the forks has the full `approach`/`tradeoffs`
|
|
80
|
+
* text right here.
|
|
81
|
+
*/
|
|
82
|
+
export const publicForkDecisionSchema = v.object({
|
|
83
|
+
kind: v.literal('fork'),
|
|
84
|
+
/** The run's fork-decision lifecycle state; only `awaiting_choice` accepts a choice. */
|
|
85
|
+
status: forkDecisionStatusSchema,
|
|
86
|
+
/** The proposer's read of where the change lands (grounding for the choice). */
|
|
87
|
+
seamSummary: v.nullable(v.string()),
|
|
88
|
+
/** The proposed approaches, each with its id, plan, trade-offs and risk notes. */
|
|
89
|
+
forks: v.array(forkOptionSchema),
|
|
90
|
+
});
|
|
91
|
+
export const publicDecisionSchema = v.variant('kind', [
|
|
92
|
+
publicRequirementsDecisionSchema,
|
|
93
|
+
publicForkDecisionSchema,
|
|
94
|
+
]);
|
|
95
|
+
/**
|
|
96
|
+
* A run's currently-parked decisions. `parked` is the single flag a caller polls or reacts to:
|
|
97
|
+
* true when the run is `blocked` awaiting one of the decisions listed. An empty list with
|
|
98
|
+
* `parked: false` is the ordinary case for a run that is simply still working.
|
|
99
|
+
*/
|
|
100
|
+
export const publicDecisionListSchema = v.object({
|
|
101
|
+
runId: v.string(),
|
|
102
|
+
taskId: v.string(),
|
|
103
|
+
/** The run's raw status — `blocked` is the parked state. */
|
|
104
|
+
status: publicRunStatusSchema,
|
|
105
|
+
/** Whether the run is currently parked awaiting a human decision. */
|
|
106
|
+
parked: v.boolean(),
|
|
107
|
+
decisions: v.array(publicDecisionSchema),
|
|
108
|
+
});
|
|
109
|
+
// ---- Request bodies -------------------------------------------------------
|
|
110
|
+
/** Answer one reviewer finding. Mirrors the SPA's `replyReviewItemSchema` bounds. */
|
|
111
|
+
export const publicReplyFindingSchema = v.object({
|
|
112
|
+
reply: v.pipe(v.string(), v.trim(), v.minLength(1), v.maxLength(4000)),
|
|
113
|
+
});
|
|
114
|
+
/**
|
|
115
|
+
* Set a finding's status. Deliberately narrower than the SPA's full item-status patch: a headless
|
|
116
|
+
* caller may `dismiss` a finding as not applicable or `reopen` one it dismissed by mistake.
|
|
117
|
+
* `answered` is reached by REPLYING (which is what records the answer the incorporation folds in),
|
|
118
|
+
* and `recommend_requested` drives an in-app-only affordance, so neither is settable here.
|
|
119
|
+
*/
|
|
120
|
+
export const publicSetFindingStatusSchema = v.object({
|
|
121
|
+
status: v.picklist(['dismissed', 'open']),
|
|
122
|
+
});
|
|
123
|
+
/**
|
|
124
|
+
* Incorporate the recorded answers. Optional `feedback` is the "do it differently" lever when
|
|
125
|
+
* redoing a merge, exactly as in the SPA. Asynchronous: the durable driver folds and re-reviews in
|
|
126
|
+
* the background, so the response is the `incorporating` review, not the finished document.
|
|
127
|
+
*/
|
|
128
|
+
export const publicIncorporateSchema = v.object({
|
|
129
|
+
feedback: v.optional(v.pipe(v.string(), v.trim(), v.maxLength(4000))),
|
|
130
|
+
});
|
|
131
|
+
/**
|
|
132
|
+
* Resolve a review that hit its iteration cap: one more reviewer pass, proceed with the last
|
|
133
|
+
* incorporated document, or stop and reset the task to an editable state. The same three choices
|
|
134
|
+
* the SPA offers — there is deliberately no timed default (a parked run waits for an answer
|
|
135
|
+
* indefinitely, so a silent auto-proceed would ship requirements nobody approved).
|
|
136
|
+
*/
|
|
137
|
+
export const publicResolveExceededSchema = v.object({
|
|
138
|
+
choice: v.picklist(['extra-round', 'proceed', 'stop-reset']),
|
|
139
|
+
});
|
|
140
|
+
/**
|
|
141
|
+
* Choose an implementation approach: EXACTLY one of a proposed `forkId` or a free-text `custom`
|
|
142
|
+
* approach, optionally with a steering `note` on a picked fork. Mirrors the SPA's `chooseForkSchema`
|
|
143
|
+
* (same xor rule and bounds) so both surfaces accept identical input.
|
|
144
|
+
*/
|
|
145
|
+
export const publicChooseForkSchema = v.pipe(v.object({
|
|
146
|
+
forkId: v.optional(v.nullable(v.string())),
|
|
147
|
+
custom: v.optional(v.nullable(v.pipe(v.string(), v.trim(), v.minLength(1), v.maxLength(8000)))),
|
|
148
|
+
note: v.optional(v.nullable(v.pipe(v.string(), v.trim(), v.maxLength(4000)))),
|
|
149
|
+
}), v.check((c) => (c.forkId != null && c.forkId.length > 0) !== (c.custom != null && c.custom.length > 0), 'Provide exactly one of forkId or custom.'));
|
|
150
|
+
//# sourceMappingURL=public-decisions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-decisions.js","sourceRoot":"","sources":["../src/public-decisions.ts"],"names":[],"mappings":"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"}
|
|
@@ -853,6 +853,7 @@ export declare const retryAgentRunContract: {
|
|
|
853
853
|
readonly serviceUrl: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
854
854
|
}, undefined>, undefined>, undefined>;
|
|
855
855
|
readonly initiatedBy: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
|
|
856
|
+
readonly intakeOrigin: v.OptionalSchema<v.PicklistSchema<["ui", "public-api"], undefined>, undefined>;
|
|
856
857
|
readonly createdAt: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
|
|
857
858
|
readonly rev: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
|
|
858
859
|
readonly diagnostics: v.OptionalSchema<v.ObjectSchema<{
|
|
@@ -1773,6 +1774,7 @@ export declare const stopAgentRunContract: {
|
|
|
1773
1774
|
readonly serviceUrl: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
1774
1775
|
}, undefined>, undefined>, undefined>;
|
|
1775
1776
|
readonly initiatedBy: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
|
|
1777
|
+
readonly intakeOrigin: v.OptionalSchema<v.PicklistSchema<["ui", "public-api"], undefined>, undefined>;
|
|
1776
1778
|
readonly createdAt: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
|
|
1777
1779
|
readonly rev: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
|
|
1778
1780
|
readonly diagnostics: v.OptionalSchema<v.ObjectSchema<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-runs.d.ts","sourceRoot":"","sources":["../../src/routes/agent-runs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAqB,MAAM,yBAAyB,CAAA;AAC3E,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAsB5B,eAAO,MAAM,qBAAqB
|
|
1
|
+
{"version":3,"file":"agent-runs.d.ts","sourceRoot":"","sources":["../../src/routes/agent-runs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAqB,MAAM,yBAAyB,CAAA;AAC3E,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAsB5B,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAMhC,CAAA;AAEF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAM/B,CAAA"}
|