wicked-crew 0.7.26 → 0.7.28
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/api/routes.d.ts +8 -0
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +9 -2
- package/dist/api/routes.js.map +1 -1
- package/dist/api/server.d.ts +13 -0
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +14 -0
- package/dist/api/server.js.map +1 -1
- package/dist/cli/index.js +46 -18
- package/dist/cli/index.js.map +1 -1
- package/dist/core/adapter.d.ts.map +1 -1
- package/dist/core/adapter.js +22 -18
- package/dist/core/adapter.js.map +1 -1
- package/dist/core/deliver.d.ts +26 -10
- package/dist/core/deliver.d.ts.map +1 -1
- package/dist/core/deliver.js +27 -11
- package/dist/core/deliver.js.map +1 -1
- package/dist/core/deliverable-floor.d.ts.map +1 -1
- package/dist/core/deliverable-floor.js +5 -4
- package/dist/core/deliverable-floor.js.map +1 -1
- package/dist/interactive/bridge-pool.d.ts +130 -2
- package/dist/interactive/bridge-pool.d.ts.map +1 -1
- package/dist/interactive/bridge-pool.js +281 -8
- package/dist/interactive/bridge-pool.js.map +1 -1
- package/dist/interactive/bus-location.d.ts +65 -0
- package/dist/interactive/bus-location.d.ts.map +1 -0
- package/dist/interactive/bus-location.js +75 -0
- package/dist/interactive/bus-location.js.map +1 -0
- package/dist/interactive/chat-events.d.ts.map +1 -1
- package/dist/interactive/chat-events.js +29 -23
- package/dist/interactive/chat-events.js.map +1 -1
- package/dist/interactive/demo-events.d.ts +16 -1
- package/dist/interactive/demo-events.d.ts.map +1 -1
- package/dist/interactive/demo-events.js +262 -43
- package/dist/interactive/demo-events.js.map +1 -1
- package/dist/interactive/doc-grounding.d.ts +202 -0
- package/dist/interactive/doc-grounding.d.ts.map +1 -0
- package/dist/interactive/doc-grounding.js +647 -0
- package/dist/interactive/doc-grounding.js.map +1 -0
- package/dist/interactive/draft-events.d.ts +54 -1
- package/dist/interactive/draft-events.d.ts.map +1 -1
- package/dist/interactive/draft-events.js +234 -117
- package/dist/interactive/draft-events.js.map +1 -1
- package/dist/interactive/edit-events.d.ts.map +1 -1
- package/dist/interactive/edit-events.js +27 -21
- package/dist/interactive/edit-events.js.map +1 -1
- package/dist/interactive/proxy-routes.d.ts +78 -0
- package/dist/interactive/proxy-routes.d.ts.map +1 -1
- package/dist/interactive/proxy-routes.js +355 -14
- package/dist/interactive/proxy-routes.js.map +1 -1
- package/dist/interactive/repo-snapshot.d.ts +31 -0
- package/dist/interactive/repo-snapshot.d.ts.map +1 -1
- package/dist/interactive/repo-snapshot.js +56 -1
- package/dist/interactive/repo-snapshot.js.map +1 -1
- package/dist/qe/conformance.d.ts +10 -1
- package/dist/qe/conformance.d.ts.map +1 -1
- package/dist/qe/conformance.js +57 -4
- package/dist/qe/conformance.js.map +1 -1
- package/dist/skills/plugin-source.d.ts +149 -32
- package/dist/skills/plugin-source.d.ts.map +1 -1
- package/dist/skills/plugin-source.js +303 -108
- package/dist/skills/plugin-source.js.map +1 -1
- package/dist/skills/root-fence.d.ts +2 -2
- package/dist/skills/root-fence.js +4 -4
- package/dist/skills/root-fence.js.map +1 -1
- package/dist/skills/runtime.d.ts +19 -2
- package/dist/skills/runtime.d.ts.map +1 -1
- package/dist/skills/runtime.js +82 -8
- package/dist/skills/runtime.js.map +1 -1
- package/dist/skills/store.d.ts +2 -2
- package/dist/skills/store.d.ts.map +1 -1
- package/dist/skills/store.js +30 -9
- package/dist/skills/store.js.map +1 -1
- package/dist/studio/assets/index-CdmCMh2f.js +539 -0
- package/dist/studio/index.html +1 -1
- package/dist/studio/testid-inventory.json +125 -5
- package/endpoint-manifest.json +16 -1
- package/package.json +3 -3
- package/dist/studio/assets/index-FcZg3WDR.js +0 -539
|
@@ -18,11 +18,30 @@
|
|
|
18
18
|
* sockets keeps every chunk flowing as it arrives, in both directions.
|
|
19
19
|
* 2. VERBATIM FORWARDING. The path remainder and query string are taken from `req.raw.url`,
|
|
20
20
|
* not from Fastify's decoded wildcard param, so percent-encoding survives the hop intact.
|
|
21
|
+
*
|
|
22
|
+
* THE ONE EXCEPTION TO PURE TRANSPORT — the doc CREATE (acceptance finding F-046). `POST
|
|
23
|
+
* <prefix>/api/docs` is read before it is forwarded, because two things the bridge cannot do have
|
|
24
|
+
* to happen at the daemon: (a) a document may name the repository (or repositories) it is ABOUT
|
|
25
|
+
* (`repo_ref` / `repo_refs`), which only crew can validate against the project's members and
|
|
26
|
+
* only crew can remember — the bridge's create wire builds `doc.created` explicitly and never
|
|
27
|
+
* echoes a field it does not know; and (b) a print/A4 brief with no `style` must reach the
|
|
28
|
+
* bridge's print instructions, so an absent style is inferred from the brief's format words. A
|
|
29
|
+
* named repo the project does not have is a 400 with nothing created (the bridge never sees the
|
|
30
|
+
* request); the refs are stripped from the forwarded body; the binding is recorded from the
|
|
31
|
+
* bridge's create answer (`name`) as a `crew-grounding.json` sidecar beside the new doc's
|
|
32
|
+
* `versions.json` under this project's docs root, for the draft/demo seams (`doc-grounding.ts`).
|
|
33
|
+
* The create response is small JSON, so it is buffered — SSE never rides this route.
|
|
21
34
|
*/
|
|
22
35
|
import { request as httpRequest } from 'node:http';
|
|
23
36
|
import { API_PREFIX } from '../api/api-prefix.js';
|
|
37
|
+
import { DEFAULT_PROJECT_ID } from '../projects/default-project.js';
|
|
24
38
|
import { BridgeUnavailableError } from './bridge-pool.js';
|
|
39
|
+
import { inferDocStyle, isDocStyle, matchingRepos, parseRepoRefs, projectRepoCandidates, spelledRefs, } from './doc-grounding.js';
|
|
25
40
|
import { projectDocsRoot } from './project-root.js';
|
|
41
|
+
/** The bridge route whose request crew reads before forwarding (F-046) — exact path, any query. */
|
|
42
|
+
export const DOC_CREATE_PATH = '/api/docs';
|
|
43
|
+
/** Create bodies are a brief plus a few fields; anything bigger is not a create crew should buffer. */
|
|
44
|
+
export const DOC_CREATE_BODY_MAX = 4 * 1024 * 1024;
|
|
26
45
|
/** Per-hop headers that must never be forwarded across a proxy (RFC 9110 §7.6.1). */
|
|
27
46
|
const HOP_BY_HOP = new Set([
|
|
28
47
|
'connection',
|
|
@@ -65,6 +84,209 @@ export function rewriteLocation(location, bridge, prefix) {
|
|
|
65
84
|
return `${prefix}${location}`;
|
|
66
85
|
return location;
|
|
67
86
|
}
|
|
87
|
+
/** The 502 a create earns when the bridge dropped the connection AFTER the request was sent: the
|
|
88
|
+
* doc may or may not exist, so the proxy never replays a non-idempotent POST (codex on crew#506). */
|
|
89
|
+
export const CREATE_UNDETERMINED = {
|
|
90
|
+
code: 'create_undetermined',
|
|
91
|
+
error: 'the interactive bridge dropped the connection after the create was sent — the document may already ' +
|
|
92
|
+
'exist; list the project\'s documents before creating it again',
|
|
93
|
+
};
|
|
94
|
+
/** `true` for the bridge's doc-create request (method + exact path, query ignored). */
|
|
95
|
+
export function isDocCreate(method, target) {
|
|
96
|
+
const path = target.split('?')[0] ?? target;
|
|
97
|
+
return method === 'POST' && path === DOC_CREATE_PATH;
|
|
98
|
+
}
|
|
99
|
+
async function readBody(stream, max) {
|
|
100
|
+
const chunks = [];
|
|
101
|
+
let total = 0;
|
|
102
|
+
for await (const chunk of stream) {
|
|
103
|
+
const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
104
|
+
total += buf.length;
|
|
105
|
+
if (total > max)
|
|
106
|
+
return null;
|
|
107
|
+
chunks.push(buf);
|
|
108
|
+
}
|
|
109
|
+
return Buffer.concat(chunks);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* The create's daemon-side half (F-046): read the body, validate `repo_ref(s)` against the
|
|
113
|
+
* project's repositories, infer a missing `style` from the brief, strip what the bridge must not
|
|
114
|
+
* see, and say what to record once the bridge names the doc. Pure over its inputs — the route
|
|
115
|
+
* decides what to do with a refusal; exported so the rule is unit-testable without a bridge.
|
|
116
|
+
*/
|
|
117
|
+
export async function prepareDocCreate(raw, contentType, adapter, projectId, log) {
|
|
118
|
+
const passthrough = { body: raw, contentType: contentType ?? 'application/json' };
|
|
119
|
+
let parsed;
|
|
120
|
+
try {
|
|
121
|
+
parsed = JSON.parse(raw.toString('utf8'));
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return passthrough; // not JSON — the bridge answers its own 400
|
|
125
|
+
}
|
|
126
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed))
|
|
127
|
+
return passthrough;
|
|
128
|
+
const body = { ...parsed };
|
|
129
|
+
// THE PROJECT IS THE ROUTE'S (codex on crew#506): the proxy validates and records the binding
|
|
130
|
+
// against `projectId`, so the body's `project` — which the bridge registers the doc under — must
|
|
131
|
+
// be the same project or absent. An omitted value is canonicalized from the route; a different
|
|
132
|
+
// one is refused, never forwarded to file the doc somewhere else. The Unfiled mount creates
|
|
133
|
+
// UNBOUND, so a `project` there is a mismatch too.
|
|
134
|
+
// Every refusal carries the refs AS SPELLED — the project mismatches too (Copilot on crew#506).
|
|
135
|
+
const requested = spelledRefs(body);
|
|
136
|
+
// A non-string `project` is a mismatch too — never coerced, never forwarded.
|
|
137
|
+
if (body['project'] !== undefined && body['project'] !== null && typeof body['project'] !== 'string') {
|
|
138
|
+
return {
|
|
139
|
+
...passthrough,
|
|
140
|
+
refusal: { error: `the create's "project" must be the project id as a string`, code: 'project_mismatch', requested },
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
const bodyProject = typeof body['project'] === 'string' ? body['project'].trim() : '';
|
|
144
|
+
if (projectId === DEFAULT_PROJECT_ID) {
|
|
145
|
+
if (bodyProject !== '') {
|
|
146
|
+
return {
|
|
147
|
+
...passthrough,
|
|
148
|
+
refusal: {
|
|
149
|
+
error: `this create is on the Unfiled mount but names project "${bodyProject}" — create it under /projects/${bodyProject}/interactive instead`,
|
|
150
|
+
code: 'project_mismatch',
|
|
151
|
+
requested,
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
delete body['project'];
|
|
156
|
+
}
|
|
157
|
+
else if (bodyProject !== '' && bodyProject !== projectId) {
|
|
158
|
+
return {
|
|
159
|
+
...passthrough,
|
|
160
|
+
refusal: {
|
|
161
|
+
error: `the create names project "${bodyProject}" but was sent to project ${projectId} — one document, one project; nothing was created`,
|
|
162
|
+
code: 'project_mismatch',
|
|
163
|
+
requested,
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
// Always the EXACT route id — a matching-but-untrimmed spelling (" p-a ") is never forwarded
|
|
169
|
+
// as sent (codex on crew#506).
|
|
170
|
+
body['project'] = projectId;
|
|
171
|
+
}
|
|
172
|
+
const refs = parseRepoRefs(body);
|
|
173
|
+
if (!refs.ok) {
|
|
174
|
+
return { ...passthrough, refusal: { error: refs.error, code: 'invalid_repo_ref', requested: refs.requested } };
|
|
175
|
+
}
|
|
176
|
+
const repoRefs = [];
|
|
177
|
+
if (refs.refs.length > 0) {
|
|
178
|
+
if (projectId === DEFAULT_PROJECT_ID) {
|
|
179
|
+
return {
|
|
180
|
+
...passthrough,
|
|
181
|
+
refusal: {
|
|
182
|
+
error: 'an Unfiled document cannot name a repository — create it inside a project that has the ' +
|
|
183
|
+
'repository as a member (attach it with POST /projects/:id/members {kind:"crew.repo"})',
|
|
184
|
+
code: 'unfiled_doc_repo',
|
|
185
|
+
requested: refs.refs,
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
const candidates = await projectRepoCandidates(adapter, projectId, log);
|
|
190
|
+
const missing = [];
|
|
191
|
+
const ambiguous = [];
|
|
192
|
+
for (const ref of refs.refs) {
|
|
193
|
+
const hits = matchingRepos(ref, candidates);
|
|
194
|
+
if (hits.length === 0)
|
|
195
|
+
missing.push(ref);
|
|
196
|
+
else if (hits.length > 1)
|
|
197
|
+
ambiguous.push({ ref, candidates: hits.map((h) => ({ id: h.repoRef, name: h.name })) });
|
|
198
|
+
else if (!repoRefs.includes(hits[0].repoRef))
|
|
199
|
+
repoRefs.push(hits[0].repoRef);
|
|
200
|
+
}
|
|
201
|
+
if (ambiguous.length > 0) {
|
|
202
|
+
// Two member repos share the spelling (two checkouts of one name under different parents):
|
|
203
|
+
// never the first match — the request must say which, by id (codex on crew#506).
|
|
204
|
+
return {
|
|
205
|
+
...passthrough,
|
|
206
|
+
refusal: {
|
|
207
|
+
error: ambiguous
|
|
208
|
+
.map((a) => `"${a.ref}" names ${a.candidates.length} repositories in project ${projectId} (${a.candidates.map((c) => `${c.name} = ${c.id}`).join(', ')})`)
|
|
209
|
+
.join('; ') + ' — name the repository by id. Nothing was created.',
|
|
210
|
+
code: 'ambiguous_repo_ref',
|
|
211
|
+
requested: refs.refs,
|
|
212
|
+
ambiguous,
|
|
213
|
+
available: candidates.map((c) => ({ id: c.repoRef, name: c.name })),
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
if (missing.length > 0) {
|
|
218
|
+
const available = candidates.map((c) => ({ id: c.repoRef, name: c.name }));
|
|
219
|
+
const pick = available.length > 0
|
|
220
|
+
? `pick one of: ${available.map((a) => a.name).join(', ')}`
|
|
221
|
+
: 'this project has no repository members yet';
|
|
222
|
+
return {
|
|
223
|
+
...passthrough,
|
|
224
|
+
refusal: {
|
|
225
|
+
error: `${missing.length === 1 ? 'repository' : 'repositories'} ${missing.map((m) => `"${m}"`).join(', ')} ` +
|
|
226
|
+
`${missing.length === 1 ? 'is' : 'are'} not a member of project ${projectId} — attach ` +
|
|
227
|
+
`${missing.length === 1 ? 'it' : 'them'} (POST /projects/${projectId}/members {kind:"crew.repo", ref:<repo id>}) ` +
|
|
228
|
+
`or ${pick}. Nothing was created.`,
|
|
229
|
+
code: 'repo_not_in_project',
|
|
230
|
+
requested: refs.refs,
|
|
231
|
+
missing,
|
|
232
|
+
available,
|
|
233
|
+
},
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// Style: pass a valid one through; infer an absent/unknown one from the brief's format words so
|
|
238
|
+
// a print brief reaches the bridge's print instructions instead of its `web` default.
|
|
239
|
+
const brief = typeof body['brief'] === 'string' ? body['brief'] : undefined;
|
|
240
|
+
let style = isDocStyle(body['style']) ? body['style'] : undefined;
|
|
241
|
+
if (style === undefined) {
|
|
242
|
+
const inferred = inferDocStyle(brief ?? '');
|
|
243
|
+
if (inferred !== undefined) {
|
|
244
|
+
style = inferred;
|
|
245
|
+
log?.(`interactive create for project ${projectId}: no style given — inferred "${inferred}" from the brief's format words`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// The forwarded create IS the published contract — built field by field from what validated,
|
|
249
|
+
// never by spreading the untrusted body: `repo_ref`/`repo_refs` were consumed above, and a field
|
|
250
|
+
// the contract does not know is not forwarded.
|
|
251
|
+
const str = (k) => (typeof body[k] === 'string' ? body[k] : undefined);
|
|
252
|
+
const name = str('name');
|
|
253
|
+
const html = str('html');
|
|
254
|
+
const url = str('url');
|
|
255
|
+
const sourceMessageId = str('source_message_id');
|
|
256
|
+
const kind = body['kind'] === 'source' || body['kind'] === 'demo' ? body['kind'] : undefined;
|
|
257
|
+
const sourcePaths = Array.isArray(body['source_paths'])
|
|
258
|
+
? body['source_paths'].filter((p) => typeof p === 'string')
|
|
259
|
+
: undefined;
|
|
260
|
+
const demoSteps = Array.isArray(body['demo_steps'])
|
|
261
|
+
? body['demo_steps'].flatMap((d) => {
|
|
262
|
+
if (typeof d !== 'object' || d === null)
|
|
263
|
+
return [];
|
|
264
|
+
const r = d;
|
|
265
|
+
return typeof r['index'] === 'number' && typeof r['subject'] === 'string' && typeof r['action'] === 'string'
|
|
266
|
+
? [{ index: r['index'], subject: r['subject'], action: r['action'] }]
|
|
267
|
+
: [];
|
|
268
|
+
})
|
|
269
|
+
: undefined;
|
|
270
|
+
const project = typeof body['project'] === 'string' ? body['project'] : undefined;
|
|
271
|
+
const normalized = {
|
|
272
|
+
...(name !== undefined ? { name } : {}),
|
|
273
|
+
...(kind !== undefined ? { kind } : {}),
|
|
274
|
+
...(html !== undefined ? { html } : {}),
|
|
275
|
+
...(brief !== undefined ? { brief } : {}),
|
|
276
|
+
...(sourcePaths !== undefined ? { source_paths: sourcePaths } : {}),
|
|
277
|
+
...(url !== undefined ? { url } : {}),
|
|
278
|
+
...(demoSteps !== undefined ? { demo_steps: demoSteps } : {}),
|
|
279
|
+
...(style !== undefined ? { style } : {}),
|
|
280
|
+
...(project !== undefined ? { project } : {}),
|
|
281
|
+
...(sourceMessageId !== undefined ? { source_message_id: sourceMessageId } : {}),
|
|
282
|
+
};
|
|
283
|
+
return {
|
|
284
|
+
body: Buffer.from(JSON.stringify(normalized), 'utf8'),
|
|
285
|
+
contentType: 'application/json',
|
|
286
|
+
normalized,
|
|
287
|
+
...(repoRefs.length > 0 ? { binding: { projectId, repoRefs, style } } : {}),
|
|
288
|
+
};
|
|
289
|
+
}
|
|
68
290
|
export function registerInteractiveProxy(app, adapter, deps) {
|
|
69
291
|
const { settings, pool } = deps;
|
|
70
292
|
// Strips exactly the mount prefix off the RAW url, leaving the remainder + query untouched.
|
|
@@ -80,7 +302,8 @@ export function registerInteractiveProxy(app, adapter, deps) {
|
|
|
80
302
|
scope.addContentTypeParser('*', (_req, payload, done) => {
|
|
81
303
|
done(null, payload);
|
|
82
304
|
});
|
|
83
|
-
|
|
305
|
+
/** One proxied request — the wildcard and the typed create route share it. */
|
|
306
|
+
const serve = async (req, reply) => {
|
|
84
307
|
const { projectId } = req.params;
|
|
85
308
|
const prefix = `${API_PREFIX}/projects/${encodeURIComponent(projectId)}/interactive`;
|
|
86
309
|
const root = await rootFor(projectId);
|
|
@@ -94,26 +317,144 @@ export function registerInteractiveProxy(app, adapter, deps) {
|
|
|
94
317
|
return unavailable(reply, err, deps.log);
|
|
95
318
|
}
|
|
96
319
|
const target = (req.raw.url ?? '').replace(prefixRe, '') || '/';
|
|
97
|
-
|
|
98
|
-
|
|
320
|
+
// F-046: the doc create is read and validated HERE before the bridge sees it (module doc).
|
|
321
|
+
// Everything else stays socket-to-socket transport.
|
|
322
|
+
let create = null;
|
|
323
|
+
let createToken;
|
|
324
|
+
const grounding = deps.grounding;
|
|
325
|
+
if (grounding !== undefined && isDocCreate(req.method, target)) {
|
|
326
|
+
const raw = await readBody(req.raw, DOC_CREATE_BODY_MAX);
|
|
327
|
+
if (raw === null)
|
|
328
|
+
return reply.code(413).send({ error: `create body exceeds ${DOC_CREATE_BODY_MAX} bytes` });
|
|
329
|
+
create = await prepareDocCreate(raw, req.headers['content-type'], adapter, projectId, deps.log);
|
|
330
|
+
if (create.refusal !== undefined)
|
|
331
|
+
return reply.code(400).send(create.refusal);
|
|
332
|
+
// The seams may see this doc's `doc.created` before the bridge has answered with its
|
|
333
|
+
// name: mark the create in flight so they wait for the binding (doc-grounding.ts).
|
|
334
|
+
if (create.binding !== undefined)
|
|
335
|
+
createToken = grounding.beginCreate(projectId);
|
|
99
336
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
if (!isConnectionRefused(err) || reply.raw.headersSent)
|
|
105
|
-
throw err;
|
|
106
|
-
pool.invalidate(root);
|
|
337
|
+
const send = (b) => create !== null
|
|
338
|
+
? forwardCreate(req, reply, b, target, prefix, create, grounding, root, deps.log)
|
|
339
|
+
: forward(req, reply, b, target, prefix);
|
|
340
|
+
try {
|
|
107
341
|
try {
|
|
108
|
-
|
|
342
|
+
await send(bridge);
|
|
109
343
|
}
|
|
110
|
-
catch (
|
|
111
|
-
|
|
344
|
+
catch (err) {
|
|
345
|
+
// A create that already REACHED the bridge is never replayed (codex on crew#506): the
|
|
346
|
+
// bridge may have created and announced the doc before the connection dropped, and a
|
|
347
|
+
// second POST would 409 (or mint a duplicate) while the first doc carries no sidecar.
|
|
348
|
+
// Say what is known — the outcome is undetermined — and let the client look.
|
|
349
|
+
if (create !== null && err.createDispatched === true && !reply.raw.headersSent) {
|
|
350
|
+
deps.log?.(`interactive create for project ${projectId} was dispatched but the bridge dropped the connection: ${err.message}`);
|
|
351
|
+
return reply.code(502).send(CREATE_UNDETERMINED);
|
|
352
|
+
}
|
|
353
|
+
// The cached bridge died between the pid check and the connect (an operator killed it,
|
|
354
|
+
// a crash). Invalidate and let `ensure` restart it — ONE retry, so a genuinely broken
|
|
355
|
+
// bridge fails fast to a 503 instead of looping.
|
|
356
|
+
if (!isConnectionRefused(err) || reply.raw.headersSent)
|
|
357
|
+
throw err;
|
|
358
|
+
pool.invalidate(root);
|
|
359
|
+
try {
|
|
360
|
+
bridge = await pool.ensure(root);
|
|
361
|
+
}
|
|
362
|
+
catch (startErr) {
|
|
363
|
+
return unavailable(reply, startErr, deps.log);
|
|
364
|
+
}
|
|
365
|
+
await send(bridge);
|
|
112
366
|
}
|
|
113
|
-
|
|
367
|
+
}
|
|
368
|
+
finally {
|
|
369
|
+
if (createToken !== undefined)
|
|
370
|
+
grounding?.settleCreate(createToken);
|
|
114
371
|
}
|
|
115
372
|
return reply;
|
|
373
|
+
};
|
|
374
|
+
// The doc CREATE is the one bridge route crew reads (F-046), so it is PUBLISHED as a typed
|
|
375
|
+
// endpoint (endpoint-manifest.json: request `InteractiveDocCreateRequest`, answer the bridge's
|
|
376
|
+
// `InteractiveDocCreateResult`, crew's own 400 `InteractiveDocCreateRefusal` / 502
|
|
377
|
+
// `InteractiveDocCreateUndetermined`) instead of hiding behind the untyped wildcard. Fastify
|
|
378
|
+
// prefers the static route over the wildcard; both run the same `serve`.
|
|
379
|
+
scope.post(`${API_PREFIX}/projects/:projectId/interactive/api/docs`, {
|
|
380
|
+
config: {
|
|
381
|
+
manifest: {
|
|
382
|
+
requestType: 'InteractiveDocCreateRequest',
|
|
383
|
+
responseType: 'InteractiveDocCreateResult',
|
|
384
|
+
statusCodes: [200, 400, 404, 409, 413, 502, 503],
|
|
385
|
+
},
|
|
386
|
+
},
|
|
387
|
+
}, serve);
|
|
388
|
+
scope.all(`${API_PREFIX}/projects/:projectId/interactive/*`, serve);
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* The create's forwarding half (F-046): send the prepared body, BUFFER the bridge's answer (small
|
|
393
|
+
* JSON), record the binding under the doc name it carries when the create succeeded, then relay
|
|
394
|
+
* status/headers/body to the client with the same header discipline as `forward`.
|
|
395
|
+
*/
|
|
396
|
+
function forwardCreate(req, reply, bridge, target, prefix, create, grounding, docsRoot, log) {
|
|
397
|
+
return new Promise((resolvePromise, rejectPromise) => {
|
|
398
|
+
const headers = forwardableRequestHeaders(req.headers, bridge);
|
|
399
|
+
headers['content-type'] = create.contentType;
|
|
400
|
+
headers['content-length'] = String(create.body.length);
|
|
401
|
+
delete headers['transfer-encoding'];
|
|
402
|
+
// Once the request body has been flushed to the socket the bridge may have acted on it: from
|
|
403
|
+
// here on a failure is UNDETERMINED, not retryable (see the route's catch).
|
|
404
|
+
let dispatched = false;
|
|
405
|
+
const fail = (err) => {
|
|
406
|
+
err.createDispatched = dispatched;
|
|
407
|
+
rejectPromise(err);
|
|
408
|
+
};
|
|
409
|
+
const upstream = httpRequest({ host: bridge.host, port: bridge.port, method: 'POST', path: target, headers }, (res) => {
|
|
410
|
+
dispatched = true;
|
|
411
|
+
const chunks = [];
|
|
412
|
+
res.on('data', (c) => chunks.push(c));
|
|
413
|
+
res.on('error', (err) => fail(err));
|
|
414
|
+
res.on('end', () => {
|
|
415
|
+
const body = Buffer.concat(chunks);
|
|
416
|
+
const status = res.statusCode ?? 502;
|
|
417
|
+
if (create.binding !== undefined && grounding !== undefined && status >= 200 && status < 300) {
|
|
418
|
+
try {
|
|
419
|
+
const answer = JSON.parse(body.toString('utf8'));
|
|
420
|
+
if (typeof answer.name === 'string' && answer.name.length > 0) {
|
|
421
|
+
grounding.record(docsRoot, answer.name, {
|
|
422
|
+
project_id: create.binding.projectId,
|
|
423
|
+
repo_refs: create.binding.repoRefs,
|
|
424
|
+
...(create.binding.style !== undefined ? { style: create.binding.style } : {}),
|
|
425
|
+
});
|
|
426
|
+
log?.(`interactive doc ${answer.name} (project ${create.binding.projectId}) is about ${create.binding.repoRefs.join(', ')} — grounding binding recorded`);
|
|
427
|
+
}
|
|
428
|
+
else {
|
|
429
|
+
log?.(`interactive create for project ${create.binding.projectId} answered ${status} without a doc name — no grounding binding recorded`);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
catch (err) {
|
|
433
|
+
log?.(`interactive create for project ${create.binding.projectId}: grounding binding NOT recorded (${err instanceof Error ? err.message : String(err)}) — the document will be grounded by its brief / the project's sole repo instead`);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
reply.hijack();
|
|
437
|
+
const out = {};
|
|
438
|
+
for (const [name, value] of Object.entries(res.headers)) {
|
|
439
|
+
if (HOP_BY_HOP.has(name) || value === undefined || name === 'content-length')
|
|
440
|
+
continue;
|
|
441
|
+
out[name] = name === 'location' && typeof value === 'string' ? rewriteLocation(value, bridge, prefix) : value;
|
|
442
|
+
}
|
|
443
|
+
out['content-length'] = String(body.length);
|
|
444
|
+
reply.raw.writeHead(status, out);
|
|
445
|
+
reply.raw.end(body);
|
|
446
|
+
resolvePromise();
|
|
447
|
+
});
|
|
448
|
+
});
|
|
449
|
+
upstream.on('finish', () => {
|
|
450
|
+
dispatched = true;
|
|
451
|
+
});
|
|
452
|
+
upstream.on('error', (err) => {
|
|
453
|
+
if (reply.raw.headersSent)
|
|
454
|
+
reply.raw.destroy();
|
|
455
|
+
fail(err);
|
|
116
456
|
});
|
|
457
|
+
upstream.end(create.body);
|
|
117
458
|
});
|
|
118
459
|
}
|
|
119
460
|
function isConnectionRefused(err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-routes.js","sourceRoot":"","sources":["../../src/interactive/proxy-routes.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"proxy-routes.js","sourceRoot":"","sources":["../../src/interactive/proxy-routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
* the daemon's capped exec chokepoint (`execCapped`, FINDING-016).
|
|
47
47
|
*/
|
|
48
48
|
import path from 'node:path';
|
|
49
|
+
import type { CoreAdapter } from '../core/adapter.js';
|
|
49
50
|
/** Default snapshot budget (~200MB). A repo whose working tree exceeds this is not
|
|
50
51
|
* snapshotted — the launch proceeds ungrounded, honestly narrated. */
|
|
51
52
|
export declare const REPO_SNAPSHOT_MAX_BYTES: number;
|
|
@@ -70,6 +71,13 @@ export type SnapshotResult = {
|
|
|
70
71
|
ok: false;
|
|
71
72
|
reason: SnapshotFailureReason;
|
|
72
73
|
};
|
|
74
|
+
/** Resolve `p` through its nearest EXISTING ancestor's realpath (the path itself may not exist
|
|
75
|
+
* yet — a fresh dest usually does not), so symlinked parents cannot hide an overlap. Only
|
|
76
|
+
* ENOENT falls to the ancestor walk (the `api/open-path.ts` rule, Copilot round 2): any OTHER
|
|
77
|
+
* error (EACCES, ELOOP, …) means an EXISTING component could not be resolved — a lexical
|
|
78
|
+
* reconstruction there could miss an overlap through the unresolved link, so it THROWS and
|
|
79
|
+
* the caller's overlap-check catch fails closed (no snapshot, degrade). */
|
|
80
|
+
export declare function realpathNearest(p: string): Promise<string>;
|
|
73
81
|
/** The subset of `node:path` {@link pathsOverlap} needs — injectable so the win32 drive-root
|
|
74
82
|
* behavior is unit-testable on any host (`path.win32`). */
|
|
75
83
|
type PathImpl = Pick<typeof path, 'relative' | 'isAbsolute' | 'sep'>;
|
|
@@ -96,5 +104,28 @@ export interface SnapshotRepoOptions {
|
|
|
96
104
|
* the copy fallback takes the working tree as-is minus `.git`/`node_modules`/symlinks.
|
|
97
105
|
*/
|
|
98
106
|
export declare function snapshotRepo(rootPath: string, dest: string, opts?: SnapshotRepoOptions): Promise<SnapshotResult>;
|
|
107
|
+
/** The registry could not be enumerated or a registered root could not be resolved — the inbox
|
|
108
|
+
* cannot be PROVEN clear, so the caller refuses the launch (codex on crew#506: fail closed). */
|
|
109
|
+
export declare class RunDirUnverifiableError extends Error {
|
|
110
|
+
constructor(message: string);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* The registered repository whose root a run's inbox would sit INSIDE (or contain), or `null` when
|
|
114
|
+
* the inbox is PROVABLY clear of every registered repo (codex on crew#506, CRITICAL). A seam
|
|
115
|
+
* declares its per-run directory as the worker's extra write root, so an inbox configured inside a
|
|
116
|
+
* live repository — `--interactive-*-dir` pointing into a checkout, or a repo registered AT the
|
|
117
|
+
* inbox — would hand the unbound worker write access to live source no matter what the run is
|
|
118
|
+
* about. The per-repo snapshot check catches only the repo being snapshotted; this walks the WHOLE
|
|
119
|
+
* registry BEFORE anything is created, realpath'd both sides (symlinked parents cannot hide an
|
|
120
|
+
* overlap).
|
|
121
|
+
*
|
|
122
|
+
* FAIL CLOSED: a registry that cannot be listed (engine/addon hiccup) or a root that cannot be
|
|
123
|
+
* resolved for any reason but plain ENOENT THROWS {@link RunDirUnverifiableError} — "could not
|
|
124
|
+
* check" is never read as "clear". A root that does not exist (ENOENT — a stale registration) is
|
|
125
|
+
* CANONICALIZED through its nearest existing ancestor (`realpathNearest`, codex on crew#506): a
|
|
126
|
+
* missing root beneath a symlinked ancestor then compares in the same namespace as the run dir,
|
|
127
|
+
* so an inbox configured inside the registered path is still caught.
|
|
128
|
+
*/
|
|
129
|
+
export declare function runDirInsideRepo(adapter: CoreAdapter, runDir: string): Promise<string | null>;
|
|
99
130
|
export {};
|
|
100
131
|
//# sourceMappingURL=repo-snapshot.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-snapshot.d.ts","sourceRoot":"","sources":["../../src/interactive/repo-snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAGH,OAAO,IAA0C,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"repo-snapshot.d.ts","sourceRoot":"","sources":["../../src/interactive/repo-snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAGH,OAAO,IAA0C,MAAM,WAAW,CAAC;AAGnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD;uEACuE;AACvE,eAAO,MAAM,uBAAuB,QAAoB,CAAC;AAMzD;;2BAE2B;AAC3B,MAAM,MAAM,qBAAqB;AAC/B,uDAAuD;AACrD,iBAAiB;AACnB,wFAAwF;GACtF,WAAW;AACb,+FAA+F;GAC7F,cAAc;AAChB,6CAA6C;GAC3C,kBAAkB;AACpB,4DAA4D;GAC1D,aAAa,CAAC;AAElB,gGAAgG;AAChG,MAAM,MAAM,cAAc,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,qBAAqB,CAAA;CAAE,CAAC;AAiEzF;;;;;4EAK4E;AAC5E,wBAAsB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBhE;AAED;4DAC4D;AAC5D,KAAK,QAAQ,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,UAAU,GAAG,YAAY,GAAG,KAAK,CAAC,CAAC;AAYrE;2FAC2F;AAC3F,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,GAAE,QAAe,GAAG,OAAO,CAE9E;AAED,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IAClC,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,uEAAuE;IACvE,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC/C;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,mBAAwB,GAC7B,OAAO,CAAC,cAAc,CAAC,CA0HzB;AAED;iGACiG;AACjG,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiCnG"}
|
|
@@ -132,7 +132,7 @@ async function sweepSnapshot(root) {
|
|
|
132
132
|
* error (EACCES, ELOOP, …) means an EXISTING component could not be resolved — a lexical
|
|
133
133
|
* reconstruction there could miss an overlap through the unresolved link, so it THROWS and
|
|
134
134
|
* the caller's overlap-check catch fails closed (no snapshot, degrade). */
|
|
135
|
-
async function realpathNearest(p) {
|
|
135
|
+
export async function realpathNearest(p) {
|
|
136
136
|
let existing = resolve(p);
|
|
137
137
|
const tail = [];
|
|
138
138
|
// Walk up until something exists; dirname() at the root returns itself, which always exists.
|
|
@@ -286,4 +286,59 @@ export async function snapshotRepo(rootPath, dest, opts = {}) {
|
|
|
286
286
|
return { ok: false, reason: 'copy-failed' };
|
|
287
287
|
}
|
|
288
288
|
}
|
|
289
|
+
/** The registry could not be enumerated or a registered root could not be resolved — the inbox
|
|
290
|
+
* cannot be PROVEN clear, so the caller refuses the launch (codex on crew#506: fail closed). */
|
|
291
|
+
export class RunDirUnverifiableError extends Error {
|
|
292
|
+
constructor(message) {
|
|
293
|
+
super(message);
|
|
294
|
+
this.name = 'RunDirUnverifiableError';
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* The registered repository whose root a run's inbox would sit INSIDE (or contain), or `null` when
|
|
299
|
+
* the inbox is PROVABLY clear of every registered repo (codex on crew#506, CRITICAL). A seam
|
|
300
|
+
* declares its per-run directory as the worker's extra write root, so an inbox configured inside a
|
|
301
|
+
* live repository — `--interactive-*-dir` pointing into a checkout, or a repo registered AT the
|
|
302
|
+
* inbox — would hand the unbound worker write access to live source no matter what the run is
|
|
303
|
+
* about. The per-repo snapshot check catches only the repo being snapshotted; this walks the WHOLE
|
|
304
|
+
* registry BEFORE anything is created, realpath'd both sides (symlinked parents cannot hide an
|
|
305
|
+
* overlap).
|
|
306
|
+
*
|
|
307
|
+
* FAIL CLOSED: a registry that cannot be listed (engine/addon hiccup) or a root that cannot be
|
|
308
|
+
* resolved for any reason but plain ENOENT THROWS {@link RunDirUnverifiableError} — "could not
|
|
309
|
+
* check" is never read as "clear". A root that does not exist (ENOENT — a stale registration) is
|
|
310
|
+
* CANONICALIZED through its nearest existing ancestor (`realpathNearest`, codex on crew#506): a
|
|
311
|
+
* missing root beneath a symlinked ancestor then compares in the same namespace as the run dir,
|
|
312
|
+
* so an inbox configured inside the registered path is still caught.
|
|
313
|
+
*/
|
|
314
|
+
export async function runDirInsideRepo(adapter, runDir) {
|
|
315
|
+
let repos;
|
|
316
|
+
try {
|
|
317
|
+
repos = await adapter.listRepos();
|
|
318
|
+
}
|
|
319
|
+
catch (err) {
|
|
320
|
+
throw new RunDirUnverifiableError(`the repository registry could not be listed (${err instanceof Error ? err.message : String(err)})`);
|
|
321
|
+
}
|
|
322
|
+
const realRun = await realpathNearest(runDir);
|
|
323
|
+
for (const repo of repos) {
|
|
324
|
+
let realRoot;
|
|
325
|
+
try {
|
|
326
|
+
realRoot = await realpath(repo.root_path);
|
|
327
|
+
}
|
|
328
|
+
catch (err) {
|
|
329
|
+
if (err.code !== 'ENOENT') {
|
|
330
|
+
throw new RunDirUnverifiableError(`registered repository ${repo.root_path} could not be resolved (${err instanceof Error ? err.message : String(err)})`);
|
|
331
|
+
}
|
|
332
|
+
try {
|
|
333
|
+
realRoot = await realpathNearest(repo.root_path);
|
|
334
|
+
}
|
|
335
|
+
catch (nearest) {
|
|
336
|
+
throw new RunDirUnverifiableError(`registered repository ${repo.root_path} could not be resolved through its ancestors (${nearest instanceof Error ? nearest.message : String(nearest)})`);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
if (pathsOverlap(realRoot, realRun))
|
|
340
|
+
return repo.root_path;
|
|
341
|
+
}
|
|
342
|
+
return null;
|
|
343
|
+
}
|
|
289
344
|
//# sourceMappingURL=repo-snapshot.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-snapshot.js","sourceRoot":"","sources":["../../src/interactive/repo-snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAEH,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACjF,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"repo-snapshot.js","sourceRoot":"","sources":["../../src/interactive/repo-snapshot.ts"],"names":[],"mappings":"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"}
|