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.
Files changed (124) hide show
  1. package/README.md +11 -8
  2. package/dist/api/auth.d.ts +6 -5
  3. package/dist/api/auth.d.ts.map +1 -1
  4. package/dist/api/auth.js +7 -5
  5. package/dist/api/auth.js.map +1 -1
  6. package/dist/api/capture.d.ts +10 -6
  7. package/dist/api/capture.d.ts.map +1 -1
  8. package/dist/api/capture.js +6 -1
  9. package/dist/api/capture.js.map +1 -1
  10. package/dist/api/chat-freshness.d.ts +37 -0
  11. package/dist/api/chat-freshness.d.ts.map +1 -0
  12. package/dist/api/chat-freshness.js +130 -0
  13. package/dist/api/chat-freshness.js.map +1 -0
  14. package/dist/api/chat-scope.d.ts +15 -0
  15. package/dist/api/chat-scope.d.ts.map +1 -1
  16. package/dist/api/chat-scope.js +55 -1
  17. package/dist/api/chat-scope.js.map +1 -1
  18. package/dist/api/codebase-archive.d.ts +88 -0
  19. package/dist/api/codebase-archive.d.ts.map +1 -0
  20. package/dist/api/codebase-archive.js +282 -0
  21. package/dist/api/codebase-archive.js.map +1 -0
  22. package/dist/api/delivery-assurance.d.ts +48 -0
  23. package/dist/api/delivery-assurance.d.ts.map +1 -0
  24. package/dist/api/delivery-assurance.js +118 -0
  25. package/dist/api/delivery-assurance.js.map +1 -0
  26. package/dist/api/delivery-index.d.ts +14 -6
  27. package/dist/api/delivery-index.d.ts.map +1 -1
  28. package/dist/api/delivery-index.js +42 -9
  29. package/dist/api/delivery-index.js.map +1 -1
  30. package/dist/api/mcp.d.ts +8 -8
  31. package/dist/api/product.d.ts +67 -0
  32. package/dist/api/product.d.ts.map +1 -0
  33. package/dist/api/product.js +169 -0
  34. package/dist/api/product.js.map +1 -0
  35. package/dist/api/project-aggregates.d.ts +61 -0
  36. package/dist/api/project-aggregates.d.ts.map +1 -0
  37. package/dist/api/project-aggregates.js +296 -0
  38. package/dist/api/project-aggregates.js.map +1 -0
  39. package/dist/api/recording.d.ts +4 -0
  40. package/dist/api/recording.d.ts.map +1 -1
  41. package/dist/api/recording.js +6 -1
  42. package/dist/api/recording.js.map +1 -1
  43. package/dist/api/routes.d.ts +50 -19
  44. package/dist/api/routes.d.ts.map +1 -1
  45. package/dist/api/routes.js +295 -42
  46. package/dist/api/routes.js.map +1 -1
  47. package/dist/api/run-files.d.ts.map +1 -1
  48. package/dist/api/run-files.js +11 -2
  49. package/dist/api/run-files.js.map +1 -1
  50. package/dist/api/server.d.ts +2 -0
  51. package/dist/api/server.d.ts.map +1 -1
  52. package/dist/api/server.js +42 -1
  53. package/dist/api/server.js.map +1 -1
  54. package/dist/api/stall-watchdog.d.ts.map +1 -1
  55. package/dist/api/stall-watchdog.js +6 -1
  56. package/dist/api/stall-watchdog.js.map +1 -1
  57. package/dist/api/steering-landing.d.ts +1 -1
  58. package/dist/api/steering-landing.d.ts.map +1 -1
  59. package/dist/api/steering-landing.js +65 -29
  60. package/dist/api/steering-landing.js.map +1 -1
  61. package/dist/cli/index.d.ts.map +1 -1
  62. package/dist/cli/index.js +22 -1
  63. package/dist/cli/index.js.map +1 -1
  64. package/dist/core/adapter.d.ts +3 -0
  65. package/dist/core/adapter.d.ts.map +1 -1
  66. package/dist/core/adapter.js +36 -6
  67. package/dist/core/adapter.js.map +1 -1
  68. package/dist/core/ado-deliver-helper.d.ts +22 -0
  69. package/dist/core/ado-deliver-helper.d.ts.map +1 -0
  70. package/dist/core/ado-deliver-helper.js +139 -0
  71. package/dist/core/ado-deliver-helper.js.map +1 -0
  72. package/dist/core/assurance.d.ts +60 -0
  73. package/dist/core/assurance.d.ts.map +1 -0
  74. package/dist/core/assurance.js +88 -0
  75. package/dist/core/assurance.js.map +1 -0
  76. package/dist/core/deliver-credentials.d.ts +88 -0
  77. package/dist/core/deliver-credentials.d.ts.map +1 -0
  78. package/dist/core/deliver-credentials.js +231 -0
  79. package/dist/core/deliver-credentials.js.map +1 -0
  80. package/dist/core/deliver-exclusions.d.ts +9 -1
  81. package/dist/core/deliver-exclusions.d.ts.map +1 -1
  82. package/dist/core/deliver-exclusions.js +37 -2
  83. package/dist/core/deliver-exclusions.js.map +1 -1
  84. package/dist/core/deliver.d.ts +36 -1
  85. package/dist/core/deliver.d.ts.map +1 -1
  86. package/dist/core/deliver.js +185 -13
  87. package/dist/core/deliver.js.map +1 -1
  88. package/dist/core/deliverable-floor.d.ts.map +1 -1
  89. package/dist/core/deliverable-floor.js +6 -1
  90. package/dist/core/deliverable-floor.js.map +1 -1
  91. package/dist/core/inventory-claim.d.ts +28 -0
  92. package/dist/core/inventory-claim.d.ts.map +1 -0
  93. package/dist/core/inventory-claim.js +138 -0
  94. package/dist/core/inventory-claim.js.map +1 -0
  95. package/dist/core/types.d.ts +7 -0
  96. package/dist/core/types.d.ts.map +1 -1
  97. package/dist/core/types.js.map +1 -1
  98. package/dist/editors/registry.d.ts +3 -3
  99. package/dist/interactive/bridge-pool.d.ts +8 -2
  100. package/dist/interactive/bridge-pool.d.ts.map +1 -1
  101. package/dist/interactive/bridge-pool.js +7 -1
  102. package/dist/interactive/bridge-pool.js.map +1 -1
  103. package/dist/interactive/docs-index.d.ts +8 -0
  104. package/dist/interactive/docs-index.d.ts.map +1 -1
  105. package/dist/interactive/docs-index.js +5 -2
  106. package/dist/interactive/docs-index.js.map +1 -1
  107. package/dist/projects/routes.d.ts +2 -2
  108. package/dist/projects/state-home-registry.d.ts.map +1 -1
  109. package/dist/projects/state-home-registry.js +2 -0
  110. package/dist/projects/state-home-registry.js.map +1 -1
  111. package/dist/qe/acceptance.d.ts.map +1 -1
  112. package/dist/qe/acceptance.js +49 -1
  113. package/dist/qe/acceptance.js.map +1 -1
  114. package/dist/studio/assets/index-BLYKfepE.css +32 -0
  115. package/dist/studio/assets/index-BbXtfDnB.js +567 -0
  116. package/dist/studio/editors/wicked-page/editor.json +1 -1
  117. package/dist/studio/editors/wicked-page/index.html +1 -1
  118. package/dist/studio/index.html +2 -2
  119. package/dist/studio/testid-inventory.json +566 -6
  120. package/endpoint-manifest.json +73 -2
  121. package/package.json +8 -8
  122. package/skills/wicked-crew/SKILL.md +2 -1
  123. package/dist/studio/assets/index-Djg8MmkU.js +0 -563
  124. 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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"}
@@ -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":"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"}
1
+ {"version":3,"file":"recording.d.ts","sourceRoot":"","sources":["../../src/api/recording.ts"],"names":[],"mappings":"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"}
@@ -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
- return reply.code(201).send({ runId });
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);