wicked-crew 0.8.10 → 0.9.1
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/README.md +11 -8
- package/dist/api/auth.d.ts +6 -5
- package/dist/api/auth.d.ts.map +1 -1
- package/dist/api/auth.js +7 -5
- package/dist/api/auth.js.map +1 -1
- package/dist/api/capture.d.ts +10 -6
- package/dist/api/capture.d.ts.map +1 -1
- package/dist/api/capture.js +6 -1
- package/dist/api/capture.js.map +1 -1
- package/dist/api/chat-freshness.d.ts +37 -0
- package/dist/api/chat-freshness.d.ts.map +1 -0
- package/dist/api/chat-freshness.js +130 -0
- package/dist/api/chat-freshness.js.map +1 -0
- package/dist/api/chat-scope.d.ts +15 -0
- package/dist/api/chat-scope.d.ts.map +1 -1
- package/dist/api/chat-scope.js +55 -1
- package/dist/api/chat-scope.js.map +1 -1
- package/dist/api/codebase-archive.d.ts +88 -0
- package/dist/api/codebase-archive.d.ts.map +1 -0
- package/dist/api/codebase-archive.js +282 -0
- package/dist/api/codebase-archive.js.map +1 -0
- package/dist/api/delivery-assurance.d.ts +48 -0
- package/dist/api/delivery-assurance.d.ts.map +1 -0
- package/dist/api/delivery-assurance.js +118 -0
- package/dist/api/delivery-assurance.js.map +1 -0
- package/dist/api/delivery-index.d.ts +14 -6
- package/dist/api/delivery-index.d.ts.map +1 -1
- package/dist/api/delivery-index.js +42 -9
- package/dist/api/delivery-index.js.map +1 -1
- package/dist/api/mcp.d.ts +8 -8
- package/dist/api/product.d.ts +67 -0
- package/dist/api/product.d.ts.map +1 -0
- package/dist/api/product.js +169 -0
- package/dist/api/product.js.map +1 -0
- package/dist/api/project-aggregates.d.ts +61 -0
- package/dist/api/project-aggregates.d.ts.map +1 -0
- package/dist/api/project-aggregates.js +296 -0
- package/dist/api/project-aggregates.js.map +1 -0
- package/dist/api/recording.d.ts +4 -0
- package/dist/api/recording.d.ts.map +1 -1
- package/dist/api/recording.js +6 -1
- package/dist/api/recording.js.map +1 -1
- package/dist/api/routes.d.ts +50 -19
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +295 -42
- package/dist/api/routes.js.map +1 -1
- package/dist/api/run-files.d.ts.map +1 -1
- package/dist/api/run-files.js +11 -2
- package/dist/api/run-files.js.map +1 -1
- package/dist/api/server.d.ts +2 -0
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +42 -1
- package/dist/api/server.js.map +1 -1
- package/dist/api/stall-watchdog.d.ts.map +1 -1
- package/dist/api/stall-watchdog.js +6 -1
- package/dist/api/stall-watchdog.js.map +1 -1
- package/dist/api/steering-landing.d.ts +1 -1
- package/dist/api/steering-landing.d.ts.map +1 -1
- package/dist/api/steering-landing.js +65 -29
- package/dist/api/steering-landing.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +22 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/core/adapter.d.ts +3 -0
- package/dist/core/adapter.d.ts.map +1 -1
- package/dist/core/adapter.js +36 -6
- package/dist/core/adapter.js.map +1 -1
- package/dist/core/ado-deliver-helper.d.ts +22 -0
- package/dist/core/ado-deliver-helper.d.ts.map +1 -0
- package/dist/core/ado-deliver-helper.js +139 -0
- package/dist/core/ado-deliver-helper.js.map +1 -0
- package/dist/core/assurance.d.ts +60 -0
- package/dist/core/assurance.d.ts.map +1 -0
- package/dist/core/assurance.js +88 -0
- package/dist/core/assurance.js.map +1 -0
- package/dist/core/deliver-credentials.d.ts +88 -0
- package/dist/core/deliver-credentials.d.ts.map +1 -0
- package/dist/core/deliver-credentials.js +231 -0
- package/dist/core/deliver-credentials.js.map +1 -0
- package/dist/core/deliver-exclusions.d.ts +9 -1
- package/dist/core/deliver-exclusions.d.ts.map +1 -1
- package/dist/core/deliver-exclusions.js +37 -2
- package/dist/core/deliver-exclusions.js.map +1 -1
- package/dist/core/deliver.d.ts +36 -1
- package/dist/core/deliver.d.ts.map +1 -1
- package/dist/core/deliver.js +185 -13
- package/dist/core/deliver.js.map +1 -1
- package/dist/core/deliverable-floor.d.ts.map +1 -1
- package/dist/core/deliverable-floor.js +6 -1
- package/dist/core/deliverable-floor.js.map +1 -1
- package/dist/core/inventory-claim.d.ts +28 -0
- package/dist/core/inventory-claim.d.ts.map +1 -0
- package/dist/core/inventory-claim.js +138 -0
- package/dist/core/inventory-claim.js.map +1 -0
- package/dist/core/types.d.ts +7 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/editors/registry.d.ts +3 -3
- package/dist/interactive/bridge-pool.d.ts +8 -2
- package/dist/interactive/bridge-pool.d.ts.map +1 -1
- package/dist/interactive/bridge-pool.js +7 -1
- package/dist/interactive/bridge-pool.js.map +1 -1
- package/dist/interactive/docs-index.d.ts +8 -0
- package/dist/interactive/docs-index.d.ts.map +1 -1
- package/dist/interactive/docs-index.js +5 -2
- package/dist/interactive/docs-index.js.map +1 -1
- package/dist/projects/routes.d.ts +2 -2
- package/dist/projects/state-home-registry.d.ts.map +1 -1
- package/dist/projects/state-home-registry.js +2 -0
- package/dist/projects/state-home-registry.js.map +1 -1
- package/dist/qe/acceptance.d.ts.map +1 -1
- package/dist/qe/acceptance.js +49 -1
- package/dist/qe/acceptance.js.map +1 -1
- package/dist/studio/assets/index-BLYKfepE.css +32 -0
- package/dist/studio/assets/index-BbXtfDnB.js +567 -0
- package/dist/studio/editors/wicked-page/editor.json +1 -1
- package/dist/studio/editors/wicked-page/index.html +1 -1
- package/dist/studio/index.html +2 -2
- package/dist/studio/testid-inventory.json +566 -6
- package/endpoint-manifest.json +73 -2
- package/package.json +8 -8
- package/skills/wicked-crew/SKILL.md +2 -1
- package/dist/studio/assets/index-Djg8MmkU.js +0 -563
- package/dist/studio/assets/index-gyu6tvrW.css +0 -32
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* crew#372 slice 2: `POST /api/v1/projects/:id/product/compose` — draft epics → features → stories
|
|
3
|
+
* from a project's selected requirements, as a GOVERNED RUN (design: DES-W4-CR5, posted on the
|
|
4
|
+
* issue). There is no new execution path: the route re-reads every selected requirement on the
|
|
5
|
+
* server (client text is never trusted), composes a two-step plan over the phase catalog —
|
|
6
|
+
* `produce` (creator: the draft) then `review` (evaluator, a human gate before anything leaves) —
|
|
7
|
+
* and launches it through `POST /runs` itself, so the run gets the same roster, project filing,
|
|
8
|
+
* audit and launch policy as any other run. `deliver: "none"`: nothing is published here.
|
|
9
|
+
*
|
|
10
|
+
* Publish (the second half of #372) is NOT registered: it is a remote write whose "published" must
|
|
11
|
+
* be re-derived from a deterministic created-issue manifest plus a read-back, which does not exist
|
|
12
|
+
* yet. An absent route is the honest answer until it does.
|
|
13
|
+
*/
|
|
14
|
+
import { z } from 'zod';
|
|
15
|
+
import { AggregateHttpError, membersOf } from './project-aggregates.js';
|
|
16
|
+
import { getRequirement } from './requirements.js';
|
|
17
|
+
const V = '/api/v1';
|
|
18
|
+
/** At most this many requirements per compose: the step instructions ride `plan.proposed`, which
|
|
19
|
+
* the engine caps at 8 KB, and every line here must reach the drafting seat whole. */
|
|
20
|
+
export const COMPOSE_MAX_REQUIREMENTS = 40;
|
|
21
|
+
/** The draft step's instructions stay under this many UTF-8 bytes (the engine caps a step's
|
|
22
|
+
* instructions at 8 KB on `plan.proposed`, and a cut there would lose the artifact shape). */
|
|
23
|
+
export const COMPOSE_INSTRUCTIONS_MAX_BYTES = 7600;
|
|
24
|
+
export const ProductComposeSchema = z
|
|
25
|
+
.object({
|
|
26
|
+
requirements: z
|
|
27
|
+
.array(z.object({ repoId: z.string().min(1), key: z.string().min(1) }).strict())
|
|
28
|
+
.min(1)
|
|
29
|
+
.max(COMPOSE_MAX_REQUIREMENTS),
|
|
30
|
+
/** The operator's own steer for the draft (grouping, scope, tone). */
|
|
31
|
+
instructions: z.string().max(500).optional(),
|
|
32
|
+
})
|
|
33
|
+
.strict();
|
|
34
|
+
const oneLine = (s) => s.replace(/\s+/gu, ' ').trim();
|
|
35
|
+
/** `s` cut to at most `max` UTF-8 bytes on a character boundary, `…` marking a cut. */
|
|
36
|
+
function clipBytes(s, max) {
|
|
37
|
+
if (Buffer.byteLength(s, 'utf8') <= max)
|
|
38
|
+
return s;
|
|
39
|
+
let out = '';
|
|
40
|
+
for (const ch of s) {
|
|
41
|
+
if (Buffer.byteLength(out + ch, 'utf8') > max - 3)
|
|
42
|
+
break;
|
|
43
|
+
out += ch;
|
|
44
|
+
}
|
|
45
|
+
return `${out}…`;
|
|
46
|
+
}
|
|
47
|
+
/** The selection does not fit the step cap even with every description cut: its refs alone are
|
|
48
|
+
* too long. The route answers 400 (smaller selection) rather than hand a seat clipped refs. */
|
|
49
|
+
export class ComposeSelectionTooLargeError extends Error {
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The step's instructions: `head`, the requirement list, `tail`, under the byte budget. Every
|
|
53
|
+
* requirement keeps its line with its ref WHOLE (`- <repoId> <key>: `, codex review of the compose PR): only the
|
|
54
|
+
* descriptive text shares what is left, equally. Throws {@link ComposeSelectionTooLargeError} when
|
|
55
|
+
* the refs alone do not fit.
|
|
56
|
+
*/
|
|
57
|
+
function withRequirements(head, rows, tail) {
|
|
58
|
+
const fixed = Buffer.byteLength([head, ...tail].join('\n'), 'utf8') + rows.length;
|
|
59
|
+
const prefixes = rows.map((r) => `- ${r.repoId} ${r.key}: `);
|
|
60
|
+
const refBytes = prefixes.reduce((n, p) => n + Buffer.byteLength(p, 'utf8'), 0);
|
|
61
|
+
const spare = COMPOSE_INSTRUCTIONS_MAX_BYTES - fixed - refBytes;
|
|
62
|
+
if (spare < rows.length * 8)
|
|
63
|
+
throw new ComposeSelectionTooLargeError('the selected requirement refs alone exceed the step instructions budget');
|
|
64
|
+
const perText = Math.floor(spare / Math.max(1, rows.length));
|
|
65
|
+
const lines = rows.map((r, i) => prefixes[i] + clipBytes(oneLine(`${r.title} — ${r.statement}`), perText));
|
|
66
|
+
return [head, ...lines, ...tail].join('\n');
|
|
67
|
+
}
|
|
68
|
+
/** The draft step's instructions: the requirements as the server read them, and the artifact. */
|
|
69
|
+
export function composeInstructions(projectId, rows, steer) {
|
|
70
|
+
const head = `Compose a product plan for project ${projectId} from these ${rows.length} requirement(s):`;
|
|
71
|
+
return withRequirements(head, rows, [
|
|
72
|
+
...(steer !== undefined && steer.trim() !== '' ? ['', `Operator's steer: ${oneLine(steer)}`] : []),
|
|
73
|
+
'',
|
|
74
|
+
'Group them into epics, each epic into features, each feature into user stories with acceptance',
|
|
75
|
+
'criteria. Every feature names the requirement refs it covers ({"repoId","key"}, exactly as listed);',
|
|
76
|
+
'every listed requirement is covered at least once, and nothing is invented that no requirement asks for.',
|
|
77
|
+
'Do not create issues or change any repository. End with ONE fenced ```json block, the plan:',
|
|
78
|
+
'{"epics":[{"title":"","features":[{"title":"","requirementRefs":[{"repoId":"","key":""}],',
|
|
79
|
+
'"stories":[{"title":"","acceptance":[""]}]}]}]}',
|
|
80
|
+
]);
|
|
81
|
+
}
|
|
82
|
+
/** The review step's instructions: the SAME requirement list (codex review of the compose PR: the engine hands the
|
|
83
|
+
* evaluator the draft's output, not the draft's instructions), so a gap or an invented ref is
|
|
84
|
+
* checkable against what was selected. */
|
|
85
|
+
export function reviewInstructions(projectId, rows) {
|
|
86
|
+
return withRequirements(`Review the drafted product plan for project ${projectId} against the ${rows.length} requirement(s) it was drafted from:`, rows, [
|
|
87
|
+
'',
|
|
88
|
+
"Every listed requirement is covered at least once; every feature's requirementRefs are refs from this list,",
|
|
89
|
+
'exactly; nothing is invented that no requirement asks for; the stories are testable; the plan is ONE',
|
|
90
|
+
'well-formed fenced JSON block. A gap, an unknown ref or an invented item is a FAIL naming it.',
|
|
91
|
+
]);
|
|
92
|
+
}
|
|
93
|
+
export function registerProductRoutes(app, adapter) {
|
|
94
|
+
app.post(`${V}/projects/:id/product/compose`, { config: { manifest: { requestType: 'ProductComposeBody', responseType: 'ProductComposeResponse', statusCodes: [202, 400, 404, 409, 422, 501] } } }, async (req, reply) => {
|
|
95
|
+
const { id } = req.params;
|
|
96
|
+
const parsed = ProductComposeSchema.safeParse(req.body);
|
|
97
|
+
if (!parsed.success)
|
|
98
|
+
return reply.code(400).send({ error: 'Invalid body', issues: parsed.error.issues });
|
|
99
|
+
let members;
|
|
100
|
+
try {
|
|
101
|
+
members = await membersOf(adapter, id);
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
if (err instanceof AggregateHttpError)
|
|
105
|
+
return reply.code(err.status).send({ error: err.message });
|
|
106
|
+
throw err;
|
|
107
|
+
}
|
|
108
|
+
// Every selected requirement is re-read HERE, from its repo's artifact: an unknown repo, a
|
|
109
|
+
// repo that is not this project's, or a key the artifact does not hold is refused before
|
|
110
|
+
// anything launches, and named.
|
|
111
|
+
const rows = [];
|
|
112
|
+
const unknown = [];
|
|
113
|
+
for (const ref of parsed.data.requirements) {
|
|
114
|
+
const repo = members.find((m) => m.ref === ref.repoId)?.repo ?? null;
|
|
115
|
+
if (repo === null) {
|
|
116
|
+
unknown.push({ ...ref, reason: 'not a registered repository of this project' });
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
const detail = await getRequirement(repo, ref.key);
|
|
120
|
+
if (detail === null)
|
|
121
|
+
unknown.push({ ...ref, reason: 'no such requirement in the repository' });
|
|
122
|
+
else
|
|
123
|
+
rows.push({ ...ref, title: detail.title, statement: detail.statement });
|
|
124
|
+
}
|
|
125
|
+
if (unknown.length > 0) {
|
|
126
|
+
return reply.code(400).send({ error: 'Unknown requirements: nothing was launched', unknown });
|
|
127
|
+
}
|
|
128
|
+
let draft;
|
|
129
|
+
let review;
|
|
130
|
+
try {
|
|
131
|
+
draft = composeInstructions(id, rows, parsed.data.instructions);
|
|
132
|
+
review = reviewInstructions(id, rows);
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
if (err instanceof ComposeSelectionTooLargeError) {
|
|
136
|
+
return reply.code(400).send({ error: `${err.message}: select fewer requirements; nothing was launched` });
|
|
137
|
+
}
|
|
138
|
+
throw err;
|
|
139
|
+
}
|
|
140
|
+
const launch = await app.inject({
|
|
141
|
+
method: 'POST',
|
|
142
|
+
url: `${V}/runs`,
|
|
143
|
+
// The caller's own credentials: the launch is THEIR run, audited as theirs.
|
|
144
|
+
headers: {
|
|
145
|
+
'content-type': 'application/json',
|
|
146
|
+
...(req.headers.authorization !== undefined ? { authorization: req.headers.authorization } : {}),
|
|
147
|
+
...(req.headers.cookie !== undefined ? { cookie: req.headers.cookie } : {}),
|
|
148
|
+
},
|
|
149
|
+
payload: {
|
|
150
|
+
problem: `Compose the product plan for project ${id} (${rows.length} requirement(s))`,
|
|
151
|
+
projectId: id,
|
|
152
|
+
deliver: 'none',
|
|
153
|
+
plan: {
|
|
154
|
+
steps: [
|
|
155
|
+
{ catalog: 'produce', id: 'draft', instructions: draft },
|
|
156
|
+
{ catalog: 'review', id: 'review', gate: { human_confirm: { unconditional: true } }, instructions: review },
|
|
157
|
+
],
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
// POST /runs' own refusal (no eligible seat, a busy engine, an archived project, …) is
|
|
162
|
+
// relayed as it answered; its 201 `{runId}` becomes this route's 202.
|
|
163
|
+
const body = launch.json();
|
|
164
|
+
if (launch.statusCode !== 201)
|
|
165
|
+
return reply.code(launch.statusCode).send(body);
|
|
166
|
+
return reply.code(202).send({ runId: body['runId'], requirements: rows.length });
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=product.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product.js","sourceRoot":"","sources":["../../src/api/product.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* crew#371: a PROJECT's requirements, domain and coverage, as FOLDS over the per-repo reads that
|
|
3
|
+
* already exist (design: program-2026-09 design/DES-W4-CR5-PRODUCT-AGGREGATES.md, posted on the
|
|
4
|
+
* issue). No new source:
|
|
5
|
+
*
|
|
6
|
+
* - requirements: `listRequirements` over each repo's `requirements_graph.json` artifact (the one
|
|
7
|
+
* source, crew#548);
|
|
8
|
+
* - domain: the same artifact, summarised per domain (full graphs stay on
|
|
9
|
+
* `GET /repos/:id/domain-graph`; N 15k-requirement graphs in one body is not a view);
|
|
10
|
+
* - coverage: `adapter.getCoverageReportForRepo` per repo, never the vacuous store-wide report.
|
|
11
|
+
*
|
|
12
|
+
* Every `crew.repo` member is a ROW, never dropped: `ok`, `absent` (nothing generated or indexed
|
|
13
|
+
* yet), `error` (with its status and message), or `dangling` (the member's registry record is
|
|
14
|
+
* gone). The studio Product view (wicked-studio#157 / #158) reads these.
|
|
15
|
+
*/
|
|
16
|
+
import type { FastifyInstance } from 'fastify';
|
|
17
|
+
import { z } from 'zod';
|
|
18
|
+
import type { CoreAdapter } from '../core/adapter.js';
|
|
19
|
+
import type { ProjectCoverageResponse, ProjectDomainResponse, ProjectRequirementsResponse, RepoEntry } from '../core/types.js';
|
|
20
|
+
/** At most this many repos are read at once. */
|
|
21
|
+
export declare const AGGREGATE_CONCURRENCY = 4;
|
|
22
|
+
/** A repo's coverage read that takes longer than this is that row's `error`. */
|
|
23
|
+
export declare const COVERAGE_TIMEOUT_MS = 15000;
|
|
24
|
+
/** The project's repos, in membership order: registered ones, and the refs whose record is gone. */
|
|
25
|
+
export type Member = {
|
|
26
|
+
ref: string;
|
|
27
|
+
repo: RepoEntry | null;
|
|
28
|
+
};
|
|
29
|
+
export declare class AggregateHttpError extends Error {
|
|
30
|
+
readonly status: number;
|
|
31
|
+
constructor(status: number, message: string);
|
|
32
|
+
}
|
|
33
|
+
export declare function membersOf(adapter: CoreAdapter, projectId: string): Promise<Member[]>;
|
|
34
|
+
export declare const ProjectRequirementsQuerySchema: z.ZodObject<{
|
|
35
|
+
q: z.ZodOptional<z.ZodString>;
|
|
36
|
+
risk: z.ZodOptional<z.ZodEnum<["risk", "no-risk"]>>;
|
|
37
|
+
category: z.ZodOptional<z.ZodEnum<["functional", "config-data"]>>;
|
|
38
|
+
domain: z.ZodOptional<z.ZodString>;
|
|
39
|
+
offset: z.ZodDefault<z.ZodNumber>;
|
|
40
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
41
|
+
}, "strict", z.ZodTypeAny, {
|
|
42
|
+
limit: number;
|
|
43
|
+
offset: number;
|
|
44
|
+
domain?: string | undefined;
|
|
45
|
+
risk?: "risk" | "no-risk" | undefined;
|
|
46
|
+
category?: "functional" | "config-data" | undefined;
|
|
47
|
+
q?: string | undefined;
|
|
48
|
+
}, {
|
|
49
|
+
domain?: string | undefined;
|
|
50
|
+
limit?: number | undefined;
|
|
51
|
+
risk?: "risk" | "no-risk" | undefined;
|
|
52
|
+
offset?: number | undefined;
|
|
53
|
+
category?: "functional" | "config-data" | undefined;
|
|
54
|
+
q?: string | undefined;
|
|
55
|
+
}>;
|
|
56
|
+
export declare function projectRequirements(adapter: CoreAdapter, projectId: string, query: z.output<typeof ProjectRequirementsQuerySchema>): Promise<ProjectRequirementsResponse>;
|
|
57
|
+
export declare function projectDomain(adapter: CoreAdapter, projectId: string): Promise<ProjectDomainResponse>;
|
|
58
|
+
export declare function projectCoverage(adapter: CoreAdapter, projectId: string, timeoutMs?: number): Promise<ProjectCoverageResponse>;
|
|
59
|
+
/** `GET /projects/:id/{requirements,domain,coverage}`. */
|
|
60
|
+
export declare function registerProjectAggregateRoutes(app: FastifyInstance, adapter: CoreAdapter): void;
|
|
61
|
+
//# sourceMappingURL=project-aggregates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-aggregates.d.ts","sourceRoot":"","sources":["../../src/api/project-aggregates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGtD,OAAO,KAAK,EAGV,uBAAuB,EAEvB,qBAAqB,EAGrB,2BAA2B,EAG3B,SAAS,EACV,MAAM,kBAAkB,CAAC;AAM1B,gDAAgD;AAChD,eAAO,MAAM,qBAAqB,IAAI,CAAC;AACvC,gFAAgF;AAChF,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAM1C,oGAAoG;AACpG,MAAM,MAAM,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAAA;CAAE,CAAC;AAE7D,qBAAa,kBAAmB,SAAQ,KAAK;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAGrD;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmB1F;AAoCD,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;EAShC,CAAC;AAOZ,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,8BAA8B,CAAC,GACrD,OAAO,CAAC,2BAA2B,CAAC,CA0CtC;AAqBD,wBAAsB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAmC3G;AA2BD,wBAAsB,eAAe,CACnC,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,MAA4B,GACtC,OAAO,CAAC,uBAAuB,CAAC,CAwBlC;AAED,0DAA0D;AAC1D,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CA2C/F"}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* crew#371: a PROJECT's requirements, domain and coverage, as FOLDS over the per-repo reads that
|
|
3
|
+
* already exist (design: program-2026-09 design/DES-W4-CR5-PRODUCT-AGGREGATES.md, posted on the
|
|
4
|
+
* issue). No new source:
|
|
5
|
+
*
|
|
6
|
+
* - requirements: `listRequirements` over each repo's `requirements_graph.json` artifact (the one
|
|
7
|
+
* source, crew#548);
|
|
8
|
+
* - domain: the same artifact, summarised per domain (full graphs stay on
|
|
9
|
+
* `GET /repos/:id/domain-graph`; N 15k-requirement graphs in one body is not a view);
|
|
10
|
+
* - coverage: `adapter.getCoverageReportForRepo` per repo, never the vacuous store-wide report.
|
|
11
|
+
*
|
|
12
|
+
* Every `crew.repo` member is a ROW, never dropped: `ok`, `absent` (nothing generated or indexed
|
|
13
|
+
* yet), `error` (with its status and message), or `dangling` (the member's registry record is
|
|
14
|
+
* gone). The studio Product view (wicked-studio#157 / #158) reads these.
|
|
15
|
+
*/
|
|
16
|
+
import { readFile } from 'node:fs/promises';
|
|
17
|
+
import { z } from 'zod';
|
|
18
|
+
import { ProjectsUnsupportedError } from '../core/adapter.js';
|
|
19
|
+
import { requirementsGraph } from '../core/repoPaths.js';
|
|
20
|
+
import { DEFAULT_PROJECT_ID } from '../projects/default-project.js';
|
|
21
|
+
import { listRequirements } from './requirements.js';
|
|
22
|
+
const V = '/api/v1';
|
|
23
|
+
/** At most this many repos are read at once. */
|
|
24
|
+
export const AGGREGATE_CONCURRENCY = 4;
|
|
25
|
+
/** A repo's coverage read that takes longer than this is that row's `error`. */
|
|
26
|
+
export const COVERAGE_TIMEOUT_MS = 15_000;
|
|
27
|
+
export class AggregateHttpError extends Error {
|
|
28
|
+
status;
|
|
29
|
+
constructor(status, message) {
|
|
30
|
+
super(message);
|
|
31
|
+
this.status = status;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export async function membersOf(adapter, projectId) {
|
|
35
|
+
if (projectId === DEFAULT_PROJECT_ID)
|
|
36
|
+
return []; // synthesized, never stored: it has no members
|
|
37
|
+
let project;
|
|
38
|
+
try {
|
|
39
|
+
project = await adapter.projectGet(projectId);
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
if (err instanceof ProjectsUnsupportedError)
|
|
43
|
+
throw new AggregateHttpError(501, err.message);
|
|
44
|
+
throw err;
|
|
45
|
+
}
|
|
46
|
+
if (project === null)
|
|
47
|
+
throw new AggregateHttpError(404, `Project ${projectId} not found`);
|
|
48
|
+
try {
|
|
49
|
+
const refs = (await adapter.projectMembers(projectId)).filter((m) => m.member_kind === 'crew.repo').map((m) => m.member_ref);
|
|
50
|
+
const repos = await adapter.listRepos();
|
|
51
|
+
return [...new Set(refs)].map((ref) => ({ ref, repo: repos.find((r) => r.id === ref) ?? null }));
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
// codex on #907: the member/registry reads fail the same ways the project read does.
|
|
55
|
+
if (err instanceof ProjectsUnsupportedError)
|
|
56
|
+
throw new AggregateHttpError(501, err.message);
|
|
57
|
+
throw err;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** Map with at most {@link AGGREGATE_CONCURRENCY} in flight, results in input order. */
|
|
61
|
+
async function mapBounded(items, fn) {
|
|
62
|
+
const out = new Array(items.length);
|
|
63
|
+
let next = 0;
|
|
64
|
+
const worker = async () => {
|
|
65
|
+
while (next < items.length) {
|
|
66
|
+
const i = next++;
|
|
67
|
+
out[i] = await fn(items[i]);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
await Promise.all(Array.from({ length: Math.min(AGGREGATE_CONCURRENCY, items.length) }, worker));
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
function message(err) {
|
|
74
|
+
return err instanceof Error ? err.message : String(err);
|
|
75
|
+
}
|
|
76
|
+
function repoOf(m) {
|
|
77
|
+
return { id: m.ref, name: m.repo?.name ?? null };
|
|
78
|
+
}
|
|
79
|
+
function totalsOf(rows) {
|
|
80
|
+
return {
|
|
81
|
+
repos: rows.length,
|
|
82
|
+
ok: rows.filter((r) => r.state === 'ok').length,
|
|
83
|
+
absent: rows.filter((r) => r.state === 'absent').length,
|
|
84
|
+
errors: rows.filter((r) => r.state === 'error').length,
|
|
85
|
+
dangling: rows.filter((r) => r.state === 'dangling').length,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
const DANGLING = 'the repository is a project member but is no longer registered';
|
|
89
|
+
export const ProjectRequirementsQuerySchema = z
|
|
90
|
+
.object({
|
|
91
|
+
q: z.string().optional(),
|
|
92
|
+
risk: z.enum(['risk', 'no-risk']).optional(),
|
|
93
|
+
category: z.enum(['functional', 'config-data']).optional(),
|
|
94
|
+
domain: z.string().optional(),
|
|
95
|
+
offset: z.coerce.number().int().min(0).default(0),
|
|
96
|
+
limit: z.coerce.number().int().min(1).max(200).default(50),
|
|
97
|
+
})
|
|
98
|
+
.strict();
|
|
99
|
+
/** A row the second read downgraded: no counts of a read that no longer stands (codex on #907). */
|
|
100
|
+
function cleared(row) {
|
|
101
|
+
return { ...row, total: 0, corpus: 0, orphanedOverrides: 0, items: [] };
|
|
102
|
+
}
|
|
103
|
+
export async function projectRequirements(adapter, projectId, query) {
|
|
104
|
+
const members = await membersOf(adapter, projectId);
|
|
105
|
+
const filters = { q: query.q, risk: query.risk, category: query.category, domain: query.domain };
|
|
106
|
+
// Pass 1: each repo's matching count (the index is cached per artifact mtime).
|
|
107
|
+
const counted = await mapBounded(members, async (m) => {
|
|
108
|
+
const base = { repo: repoOf(m), total: 0, corpus: 0, orphanedOverrides: 0, items: [] };
|
|
109
|
+
if (m.repo === null)
|
|
110
|
+
return { ...base, state: 'dangling', reason: DANGLING };
|
|
111
|
+
try {
|
|
112
|
+
const page = await listRequirements(m.repo, { ...filters, offset: 0, limit: 0 });
|
|
113
|
+
if (page === null)
|
|
114
|
+
return { ...base, state: 'absent', reason: 'requirements_graph.json not generated for this repo yet' };
|
|
115
|
+
return { ...base, state: 'ok', total: page.total, corpus: page.corpus, orphanedOverrides: page.orphanedOverrides };
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
return { ...base, state: 'error', reason: message(err) };
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
// Pass 2: fill the GLOBAL window [offset, offset + limit) across the repos in membership order.
|
|
122
|
+
let skip = query.offset;
|
|
123
|
+
let want = query.limit;
|
|
124
|
+
const rows = await Promise.all(counted.map((row, i) => {
|
|
125
|
+
if (row.state !== 'ok' || want === 0)
|
|
126
|
+
return Promise.resolve(row);
|
|
127
|
+
if (skip >= row.total) {
|
|
128
|
+
skip -= row.total;
|
|
129
|
+
return Promise.resolve(row);
|
|
130
|
+
}
|
|
131
|
+
const offset = skip;
|
|
132
|
+
const limit = Math.min(want, row.total - skip);
|
|
133
|
+
skip = 0;
|
|
134
|
+
want -= limit;
|
|
135
|
+
return listRequirements(members[i].repo, { ...filters, offset, limit })
|
|
136
|
+
.then((page) => (page === null ? { ...cleared(row), state: 'absent', reason: 'requirements_graph.json disappeared while reading' } : { ...row, items: page.items }))
|
|
137
|
+
.catch((err) => ({ ...cleared(row), state: 'error', reason: message(err) }));
|
|
138
|
+
}));
|
|
139
|
+
const ok = rows.filter((r) => r.state === 'ok');
|
|
140
|
+
return {
|
|
141
|
+
projectId,
|
|
142
|
+
totals: { ...totalsOf(rows), total: ok.reduce((n, r) => n + r.total, 0), corpus: ok.reduce((n, r) => n + r.corpus, 0) },
|
|
143
|
+
offset: query.offset,
|
|
144
|
+
limit: query.limit,
|
|
145
|
+
rows,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/** The artifact's domains, summarised. `null` when the artifact is absent. */
|
|
149
|
+
async function domainsOf(repo) {
|
|
150
|
+
let raw;
|
|
151
|
+
try {
|
|
152
|
+
raw = await readFile(requirementsGraph(repo), 'utf8');
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
if (err.code === 'ENOENT')
|
|
156
|
+
return null;
|
|
157
|
+
throw err;
|
|
158
|
+
}
|
|
159
|
+
const graph = JSON.parse(raw);
|
|
160
|
+
const count = (v) => (typeof v === 'object' && v !== null ? Object.keys(v).length : 0);
|
|
161
|
+
return Object.entries(graph.domains ?? {}).map(([name, d]) => ({
|
|
162
|
+
name,
|
|
163
|
+
description: typeof d.description === 'string' ? d.description : null,
|
|
164
|
+
requirements: count(d.requirements),
|
|
165
|
+
entities: count(d.entities),
|
|
166
|
+
}));
|
|
167
|
+
}
|
|
168
|
+
export async function projectDomain(adapter, projectId) {
|
|
169
|
+
const members = await membersOf(adapter, projectId);
|
|
170
|
+
const rows = await mapBounded(members, async (m) => {
|
|
171
|
+
if (m.repo === null)
|
|
172
|
+
return { repo: repoOf(m), state: 'dangling', reason: DANGLING, domains: [] };
|
|
173
|
+
try {
|
|
174
|
+
const domains = await domainsOf(m.repo);
|
|
175
|
+
return domains === null
|
|
176
|
+
? { repo: repoOf(m), state: 'absent', reason: 'requirements_graph.json not generated for this repo yet', domains: [] }
|
|
177
|
+
: { repo: repoOf(m), state: 'ok', domains };
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
return { repo: repoOf(m), state: 'error', reason: message(err), domains: [] };
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
const merged = new Map();
|
|
184
|
+
for (const row of rows) {
|
|
185
|
+
for (const d of row.domains) {
|
|
186
|
+
const m = merged.get(d.name) ?? { name: d.name, repoIds: [], requirements: 0, entities: 0 };
|
|
187
|
+
m.repoIds.push(row.repo.id);
|
|
188
|
+
m.requirements += d.requirements;
|
|
189
|
+
m.entities += d.entities;
|
|
190
|
+
merged.set(d.name, m);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
const all = rows.flatMap((r) => r.domains);
|
|
194
|
+
return {
|
|
195
|
+
projectId,
|
|
196
|
+
totals: {
|
|
197
|
+
...totalsOf(rows),
|
|
198
|
+
domains: merged.size,
|
|
199
|
+
requirements: all.reduce((n, d) => n + d.requirements, 0),
|
|
200
|
+
entities: all.reduce((n, d) => n + d.entities, 0),
|
|
201
|
+
},
|
|
202
|
+
merged: [...merged.values()].sort((a, b) => a.name.localeCompare(b.name)),
|
|
203
|
+
rows,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
function withTimeout(p, ms, what) {
|
|
207
|
+
let timer;
|
|
208
|
+
const timeout = new Promise((_, reject) => {
|
|
209
|
+
timer = setTimeout(() => reject(new Error(`${what} did not answer within ${ms / 1000} s`)), ms);
|
|
210
|
+
});
|
|
211
|
+
return Promise.race([p, timeout]).finally(() => clearTimeout(timer));
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* One coverage read per repo at a time, across requests (codex on #907): a timed-out read cannot be
|
|
215
|
+
* cancelled (it is an engine call), so a later request JOINS the read still in flight instead of
|
|
216
|
+
* starting another — a hung repo holds one engine call, not one per page load.
|
|
217
|
+
*/
|
|
218
|
+
const coverageInFlight = new WeakMap();
|
|
219
|
+
function coverageOnce(adapter, ref) {
|
|
220
|
+
let reads = coverageInFlight.get(adapter);
|
|
221
|
+
if (reads === undefined)
|
|
222
|
+
coverageInFlight.set(adapter, (reads = new Map()));
|
|
223
|
+
const running = reads.get(ref);
|
|
224
|
+
if (running !== undefined)
|
|
225
|
+
return running;
|
|
226
|
+
const read = adapter.getCoverageReportForRepo(ref).finally(() => reads.delete(ref));
|
|
227
|
+
reads.set(ref, read);
|
|
228
|
+
return read;
|
|
229
|
+
}
|
|
230
|
+
export async function projectCoverage(adapter, projectId, timeoutMs = COVERAGE_TIMEOUT_MS) {
|
|
231
|
+
const members = await membersOf(adapter, projectId);
|
|
232
|
+
const rows = await mapBounded(members, async (m) => {
|
|
233
|
+
if (m.repo === null)
|
|
234
|
+
return { repo: repoOf(m), state: 'dangling', reason: DANGLING, report: null };
|
|
235
|
+
try {
|
|
236
|
+
const report = await withTimeout(coverageOnce(adapter, m.ref), timeoutMs, 'the coverage read');
|
|
237
|
+
if (report === null)
|
|
238
|
+
return { repo: repoOf(m), state: 'absent', reason: "the repo's code graph holds no nodes yet", report: null };
|
|
239
|
+
// The node list stays on the per-repo read (`GET /governance/coverage?repo=`): N repos' full
|
|
240
|
+
// `unaccounted_nodes` in one body is not a view (codex on #907). Its size is `unaccounted`.
|
|
241
|
+
const { unaccounted_nodes, ...summary } = report;
|
|
242
|
+
void unaccounted_nodes;
|
|
243
|
+
return { repo: repoOf(m), state: 'ok', report: summary };
|
|
244
|
+
}
|
|
245
|
+
catch (err) {
|
|
246
|
+
return { repo: repoOf(m), state: 'error', reason: message(err), report: null };
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
const ok = rows.filter((r) => r.report !== null).map((r) => r.report);
|
|
250
|
+
const behavior = ok.reduce((n, r) => n + r.behavior_bearing, 0);
|
|
251
|
+
const resolved = ok.reduce((n, r) => n + r.resolved, 0);
|
|
252
|
+
return {
|
|
253
|
+
projectId,
|
|
254
|
+
totals: { ...totalsOf(rows), behavior_bearing: behavior, resolved, coverage: behavior > 0 ? resolved / behavior : null },
|
|
255
|
+
rows,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
/** `GET /projects/:id/{requirements,domain,coverage}`. */
|
|
259
|
+
export function registerProjectAggregateRoutes(app, adapter) {
|
|
260
|
+
const fail = (reply, err) => {
|
|
261
|
+
if (err instanceof AggregateHttpError)
|
|
262
|
+
return reply.code(err.status).send({ error: err.message });
|
|
263
|
+
throw err;
|
|
264
|
+
};
|
|
265
|
+
app.get(`${V}/projects/:id/requirements`, { config: { manifest: { responseType: 'ProjectRequirementsResponse', statusCodes: [200, 400, 404, 500, 501] } } }, async (req, reply) => {
|
|
266
|
+
const { id } = req.params;
|
|
267
|
+
const parsed = ProjectRequirementsQuerySchema.safeParse(req.query);
|
|
268
|
+
if (!parsed.success)
|
|
269
|
+
return reply.code(400).send({ error: 'Invalid query', issues: parsed.error.issues });
|
|
270
|
+
try {
|
|
271
|
+
return await projectRequirements(adapter, id, parsed.data);
|
|
272
|
+
}
|
|
273
|
+
catch (err) {
|
|
274
|
+
return fail(reply, err);
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
app.get(`${V}/projects/:id/domain`, { config: { manifest: { responseType: 'ProjectDomainResponse', statusCodes: [200, 404, 500, 501] } } }, async (req, reply) => {
|
|
278
|
+
const { id } = req.params;
|
|
279
|
+
try {
|
|
280
|
+
return await projectDomain(adapter, id);
|
|
281
|
+
}
|
|
282
|
+
catch (err) {
|
|
283
|
+
return fail(reply, err);
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
app.get(`${V}/projects/:id/coverage`, { config: { manifest: { responseType: 'ProjectCoverageResponse', statusCodes: [200, 404, 500, 501] } } }, async (req, reply) => {
|
|
287
|
+
const { id } = req.params;
|
|
288
|
+
try {
|
|
289
|
+
return await projectCoverage(adapter, id);
|
|
290
|
+
}
|
|
291
|
+
catch (err) {
|
|
292
|
+
return fail(reply, err);
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=project-aggregates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-aggregates.js","sourceRoot":"","sources":["../../src/api/project-aggregates.ts"],"names":[],"mappings":"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"}
|
package/dist/api/recording.d.ts
CHANGED
|
@@ -107,15 +107,19 @@ export declare const DemoLaunchSchema: z.ZodObject<{
|
|
|
107
107
|
audience: z.ZodString;
|
|
108
108
|
show: z.ZodString;
|
|
109
109
|
clisJson: z.ZodOptional<z.ZodString>;
|
|
110
|
+
/** wicked-core#850 — the explicit reduced-assurance opt-in, forwarded to `POST /runs` only when `true`. */
|
|
111
|
+
reducedAssurance: z.ZodOptional<z.ZodBoolean>;
|
|
110
112
|
}, "strict", z.ZodTypeAny, {
|
|
111
113
|
url: string;
|
|
112
114
|
audience: string;
|
|
113
115
|
show: string;
|
|
116
|
+
reducedAssurance?: boolean | undefined;
|
|
114
117
|
clisJson?: string | undefined;
|
|
115
118
|
}, {
|
|
116
119
|
url: string;
|
|
117
120
|
audience: string;
|
|
118
121
|
show: string;
|
|
122
|
+
reducedAssurance?: boolean | undefined;
|
|
119
123
|
clisJson?: string | undefined;
|
|
120
124
|
}>;
|
|
121
125
|
export declare const DemoScriptSchema: z.ZodObject<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recording.d.ts","sourceRoot":"","sources":["../../src/api/recording.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAEhB,WAAW,EACX,UAAU,EACV,SAAS,EACT,QAAQ,EAMR,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAA+B,WAAW,EAA4B,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAOrH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAyE,KAAK,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAC9I,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAIlE,sEAAsE;AACtE,eAAO,MAAM,WAAW,SAAS,CAAC;AAKlC,oFAAoF;AACpF,eAAO,MAAM,qBAAqB,QAAa,CAAC;AAYhD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED;4BAC4B;AAC5B,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED;iGACiG;AACjG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOxE;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,qBAA4B,CAAC;AAEzD,eAAO,MAAM,gBAAgB
|
|
1
|
+
{"version":3,"file":"recording.d.ts","sourceRoot":"","sources":["../../src/api/recording.ts"],"names":[],"mappings":"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"}
|
package/dist/api/recording.js
CHANGED
|
@@ -146,6 +146,8 @@ export const DemoLaunchSchema = z
|
|
|
146
146
|
audience: z.string().trim().min(1).max(2000),
|
|
147
147
|
show: z.string().trim().min(1).max(4000),
|
|
148
148
|
clisJson: z.string().optional(),
|
|
149
|
+
/** wicked-core#850 — the explicit reduced-assurance opt-in, forwarded to `POST /runs` only when `true`. */
|
|
150
|
+
reducedAssurance: z.boolean().optional(),
|
|
149
151
|
})
|
|
150
152
|
.strict();
|
|
151
153
|
export const DemoScriptSchema = z.object({ content: z.string().min(1) }).strict();
|
|
@@ -645,6 +647,7 @@ export function registerDemoRoutes(app, adapter) {
|
|
|
645
647
|
workflow: DEMO_PRESET,
|
|
646
648
|
deliver: 'none',
|
|
647
649
|
...(parsed.data.clisJson !== undefined ? { clisJson: parsed.data.clisJson } : {}),
|
|
650
|
+
...(parsed.data.reducedAssurance === true ? { reducedAssurance: true } : {}),
|
|
648
651
|
},
|
|
649
652
|
})
|
|
650
653
|
.finally(() => demoLaunchRoots.delete(runId));
|
|
@@ -652,7 +655,9 @@ export function registerDemoRoutes(app, adapter) {
|
|
|
652
655
|
await fsp.rm(root, { recursive: true, force: true });
|
|
653
656
|
return reply.code(launched.statusCode).type('application/json').send(launched.body);
|
|
654
657
|
}
|
|
655
|
-
|
|
658
|
+
// wicked-core#850: the launch's one-CLI assurance notice reaches the caller (codex r2 on crew#923).
|
|
659
|
+
const { assuranceNotice } = launched.json();
|
|
660
|
+
return reply.code(201).send({ runId, ...(assuranceNotice !== undefined ? { assuranceNotice } : {}) });
|
|
656
661
|
});
|
|
657
662
|
app.get(`${V}/runs/:id/demo`, { config: { manifest: { responseType: 'DemoView', statusCodes: [200, 404] } } }, async (req, reply) => {
|
|
658
663
|
const run = await demoRun(req.params.id);
|