wicked-crew 0.9.4 → 0.9.6
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/delivery-assurance.d.ts.map +1 -1
- package/dist/api/delivery-assurance.js +14 -3
- package/dist/api/delivery-assurance.js.map +1 -1
- package/dist/api/discovery-source.d.ts +4 -4
- package/dist/api/discovery-source.d.ts.map +1 -1
- package/dist/api/discovery-source.js +14 -8
- package/dist/api/discovery-source.js.map +1 -1
- package/dist/api/eval-sample.d.ts +12 -12
- package/dist/api/governance-steering.d.ts +2 -2
- package/dist/api/governance-steering.js +2 -2
- package/dist/api/governance-steering.js.map +1 -1
- package/dist/api/mcp.d.ts +4 -4
- package/dist/api/onboarding-capture.d.ts +1 -1
- package/dist/api/onboarding-capture.d.ts.map +1 -1
- package/dist/api/onboarding-capture.js +1 -1
- package/dist/api/onboarding-capture.js.map +1 -1
- package/dist/api/routes.d.ts +133 -131
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +37 -34
- package/dist/api/routes.js.map +1 -1
- package/dist/api/server.d.ts +6 -0
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +36 -1
- package/dist/api/server.js.map +1 -1
- package/dist/api/testing.js +1 -1
- package/dist/api/testing.js.map +1 -1
- package/dist/campaigns/plan.d.ts +8 -1
- package/dist/campaigns/plan.d.ts.map +1 -1
- package/dist/campaigns/plan.js +15 -3
- package/dist/campaigns/plan.js.map +1 -1
- package/dist/campaigns/routes.d.ts +8 -8
- package/dist/core/adapter.d.ts +29 -89
- package/dist/core/adapter.d.ts.map +1 -1
- package/dist/core/adapter.js +86 -609
- package/dist/core/adapter.js.map +1 -1
- package/dist/core/builtin-catalog.d.ts +24 -0
- package/dist/core/builtin-catalog.d.ts.map +1 -0
- package/dist/core/builtin-catalog.js +54 -0
- package/dist/core/builtin-catalog.js.map +1 -0
- package/dist/core/council-settings.d.ts +18 -0
- package/dist/core/council-settings.d.ts.map +1 -0
- package/dist/core/council-settings.js +37 -0
- package/dist/core/council-settings.js.map +1 -0
- package/dist/core/deliver-text.d.ts +1 -1
- package/dist/core/deliver-text.d.ts.map +1 -1
- package/dist/core/deliver-text.js +3 -2
- package/dist/core/deliver-text.js.map +1 -1
- package/dist/core/deliver.d.ts +0 -6
- package/dist/core/deliver.d.ts.map +1 -1
- package/dist/core/deliver.js +0 -6
- package/dist/core/deliver.js.map +1 -1
- package/dist/core/run-identity.d.ts +1 -1
- package/dist/core/run-identity.d.ts.map +1 -1
- package/dist/core/run-identity.js +7 -3
- package/dist/core/run-identity.js.map +1 -1
- package/dist/editors/csp.js +2 -2
- package/dist/editors/csp.js.map +1 -1
- package/dist/editors/pack-install.d.ts +35 -14
- package/dist/editors/pack-install.d.ts.map +1 -1
- package/dist/editors/pack-install.js +171 -24
- package/dist/editors/pack-install.js.map +1 -1
- package/dist/editors/registry.d.ts +151 -13
- package/dist/editors/registry.d.ts.map +1 -1
- package/dist/editors/registry.js +257 -20
- package/dist/editors/registry.js.map +1 -1
- package/dist/editors/routes.d.ts +10 -5
- package/dist/editors/routes.d.ts.map +1 -1
- package/dist/editors/routes.js +30 -20
- package/dist/editors/routes.js.map +1 -1
- package/dist/learn/routes.d.ts +42 -0
- package/dist/learn/routes.d.ts.map +1 -0
- package/dist/learn/routes.js +87 -0
- package/dist/learn/routes.js.map +1 -0
- package/dist/learn/schedule-store.d.ts +41 -0
- package/dist/learn/schedule-store.d.ts.map +1 -0
- package/dist/learn/schedule-store.js +137 -0
- package/dist/learn/schedule-store.js.map +1 -0
- package/dist/learn/scheduler.d.ts +71 -0
- package/dist/learn/scheduler.d.ts.map +1 -0
- package/dist/learn/scheduler.js +222 -0
- package/dist/learn/scheduler.js.map +1 -0
- package/dist/learn/topics.d.ts +14 -0
- package/dist/learn/topics.d.ts.map +1 -0
- package/dist/learn/topics.js +95 -0
- package/dist/learn/topics.js.map +1 -0
- package/dist/projects/graph.d.ts +14 -0
- package/dist/projects/graph.d.ts.map +1 -1
- package/dist/projects/graph.js +41 -2
- package/dist/projects/graph.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 +5 -0
- package/dist/qe/acceptance.d.ts.map +1 -1
- package/dist/qe/acceptance.js +4 -2
- package/dist/qe/acceptance.js.map +1 -1
- package/dist/qe/author-workflow.d.ts +6 -83
- package/dist/qe/author-workflow.d.ts.map +1 -1
- package/dist/qe/author-workflow.js +6 -300
- package/dist/qe/author-workflow.js.map +1 -1
- package/dist/qe/ledger.d.ts +20 -0
- package/dist/qe/ledger.d.ts.map +1 -1
- package/dist/qe/ledger.js +28 -2
- package/dist/qe/ledger.js.map +1 -1
- package/dist/skills/core-closure.d.ts +3 -5
- package/dist/skills/core-closure.d.ts.map +1 -1
- package/dist/skills/core-closure.js +3 -5
- package/dist/skills/core-closure.js.map +1 -1
- package/dist/standing-orders/routes.d.ts +4 -4
- package/dist/standing-orders/store.d.ts +2 -2
- package/dist/studio/assets/index-C0ZMi_8d.js +583 -0
- package/dist/studio/assets/index-DYLo25MW.css +32 -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 -36
- package/endpoint-manifest.json +59 -2
- package/package.json +4 -4
- package/dist/studio/assets/index-BGfFmWw4.css +0 -32
- package/dist/studio/assets/index-BMRUMU4X.js +0 -567
package/dist/editors/registry.js
CHANGED
|
@@ -1,33 +1,39 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The artifact-editor registry (DES-artifact-editor-plugins §5.2, §8.6, §9.1; EP-C1).
|
|
3
3
|
*
|
|
4
|
-
* Two kinds of editor exist
|
|
4
|
+
* Two kinds of editor exist:
|
|
5
5
|
*
|
|
6
6
|
* - **First-party** editors ship INSIDE studio's bundle (§8.6): `<studio dist>/editors/<id>/editor.json`
|
|
7
7
|
* beside the ONE self-contained `index.html` entry. Crew discovers them at boot, pins each entry's
|
|
8
8
|
* sha256 and byte size, and serves the entry through the hashed bundle route (`routes.ts`) with
|
|
9
9
|
* the §8.2 headers. Their ids are `wicked-*` — the reserved first-party namespace every pack is
|
|
10
10
|
* refused (garden `wicked-pack.schema.json`).
|
|
11
|
-
* - **Third-party** editors arrive as garden packs (spec 2 `editors[]`)
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
11
|
+
* - **Third-party** editors arrive as garden packs (spec 2 `editors[]`), installed by the operator
|
|
12
|
+
* (`POST /editors {packRoot}`, human-only) once garden's fail-closed `pack check` AND the
|
|
13
|
+
* install-time conformance run (garden `scripts/editor/conformance.py`, run by crew against its
|
|
14
|
+
* own conformance host page, §12.1 / EP-C8) both pass (`pack-install.ts`). The registry records
|
|
15
|
+
* the pack directory and each editor's pinned entry hash; it never writes into the pack. A pack
|
|
16
|
+
* that also ships skills or blocks is refused: their own "Add these" approval (§3.2) is not built.
|
|
15
17
|
*
|
|
16
|
-
* Persisted state is ONE file, `<state home>/daemon-editors.json
|
|
17
|
-
* operator sets in Settings
|
|
18
|
-
* crew's state-home registry and the engine's worker fence already classify (crew#756),
|
|
19
|
-
* top-level entry is introduced
|
|
20
|
-
*
|
|
18
|
+
* Persisted state is ONE file, `<state home>/daemon-editors.json`: the enable/disable flags the
|
|
19
|
+
* operator sets in Settings (§6.4, human-only) and the installed packs. It sits under the `daemon-`
|
|
20
|
+
* prefix both crew's state-home registry and the engine's worker fence already classify (crew#756),
|
|
21
|
+
* so no new top-level entry is introduced. The packs themselves live where the installer staged
|
|
22
|
+
* them (garden's default `~/.wicked/editors/<name>/current`, program-owned, outside the state home);
|
|
23
|
+
* a bundle is re-hashed against the recorded pin on every serve, so a copy changed after install is
|
|
24
|
+
* refused, never served.
|
|
21
25
|
*/
|
|
22
26
|
import { createHash } from 'node:crypto';
|
|
23
|
-
import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
24
|
-
import { join } from 'node:path';
|
|
27
|
+
import { closeSync, existsSync, fstatSync, lstatSync, mkdirSync, openSync, readdirSync, readFileSync, readSync, renameSync, writeFileSync } from 'node:fs';
|
|
28
|
+
import { isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
25
29
|
import { z } from 'zod';
|
|
26
30
|
import { crewStateHome } from '../projects/state-home.js';
|
|
27
31
|
/** The persisted flags file, under the registered `daemon-` prefix. */
|
|
28
32
|
export const EDITORS_STATE_FILENAME = 'daemon-editors.json';
|
|
29
33
|
/** Where first-party manifests live inside the studio bundle. */
|
|
30
34
|
export const STUDIO_EDITORS_DIRNAME = 'editors';
|
|
35
|
+
/** The most of an installed pack's `wicked-pack.json` the registry reads (a manifest is a few KB). */
|
|
36
|
+
export const PACK_MANIFEST_CAP_BYTES = 1024 * 1024;
|
|
31
37
|
/** The host's bundle cap (§8.5); a pack's `limits.bundleBytes` may only be lower. */
|
|
32
38
|
export const HOST_BUNDLE_CAP_BYTES = 5 * 1024 * 1024;
|
|
33
39
|
export const EDITOR_PERMISSIONS = [
|
|
@@ -61,9 +67,45 @@ export const EditorManifestSchema = z.object({
|
|
|
61
67
|
permissions: z.array(z.object({ id: z.enum(EDITOR_PERMISSIONS), why: z.string().min(1) })),
|
|
62
68
|
limits: z.object({ bundleBytes: z.number().int().min(1).max(HOST_BUNDLE_CAP_BYTES) }).optional(),
|
|
63
69
|
});
|
|
70
|
+
/** An install the registry refuses: the id is taken, or the pack did not read back. */
|
|
71
|
+
export class EditorInstallConflict extends Error {
|
|
72
|
+
constructor(message) {
|
|
73
|
+
super(message);
|
|
74
|
+
this.name = 'EditorInstallConflict';
|
|
75
|
+
}
|
|
76
|
+
}
|
|
64
77
|
export function sha256Of(buf) {
|
|
65
78
|
return createHash('sha256').update(buf).digest('hex');
|
|
66
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* Read a file holding at most `cap` bytes, never allocating more than `cap + 1` (codex r1 on X3: a
|
|
82
|
+
* file swapped for a huge one is refused before it is read whole). `null` = over the cap.
|
|
83
|
+
*/
|
|
84
|
+
export function readCapped(path, cap) {
|
|
85
|
+
const fd = openSync(path, 'r');
|
|
86
|
+
try {
|
|
87
|
+
if (fstatSync(fd).size > cap)
|
|
88
|
+
return null;
|
|
89
|
+
const buf = Buffer.alloc(cap + 1);
|
|
90
|
+
let n = 0;
|
|
91
|
+
for (;;) {
|
|
92
|
+
const got = readSync(fd, buf, n, buf.length - n, null);
|
|
93
|
+
if (got === 0)
|
|
94
|
+
break;
|
|
95
|
+
n += got;
|
|
96
|
+
if (n > cap)
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
return buf.subarray(0, n);
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
closeSync(fd);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/** The digest of a pack editor's admitted manifest entry: a manifest edited after install is a new install. */
|
|
106
|
+
export function editorEntryDigest(entry) {
|
|
107
|
+
return createHash('sha256').update(JSON.stringify(entry)).digest('hex');
|
|
108
|
+
}
|
|
67
109
|
/**
|
|
68
110
|
* A path is served from the bundle only if it IS what it looks like: a real directory or a real
|
|
69
111
|
* file, never a link (codex r1 — a link under `editors/` could point outside the bundle and be
|
|
@@ -151,17 +193,17 @@ export function discoverStudioEditors(studioRoot, log) {
|
|
|
151
193
|
log?.(`[editors] ${manifest.id}: entry ${manifest.entry} is ${entryProblem}; skipped`);
|
|
152
194
|
continue;
|
|
153
195
|
}
|
|
196
|
+
const cap = manifest.limits?.bundleBytes ?? HOST_BUNDLE_CAP_BYTES;
|
|
154
197
|
let buf;
|
|
155
198
|
try {
|
|
156
|
-
buf =
|
|
199
|
+
buf = readCapped(entryPath, cap);
|
|
157
200
|
}
|
|
158
201
|
catch (err) {
|
|
159
202
|
log?.(`[editors] ${manifest.id}: entry unreadable (${err instanceof Error ? err.message : String(err)})`);
|
|
160
203
|
continue;
|
|
161
204
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
log?.(`[editors] ${manifest.id}: entry is ${buf.byteLength} bytes, over its ${cap}-byte cap`);
|
|
205
|
+
if (buf === null) {
|
|
206
|
+
log?.(`[editors] ${manifest.id}: entry is over its ${cap}-byte cap`);
|
|
165
207
|
continue;
|
|
166
208
|
}
|
|
167
209
|
const outside = externalReferences(buf.toString('utf8'));
|
|
@@ -173,6 +215,95 @@ export function discoverStudioEditors(studioRoot, log) {
|
|
|
173
215
|
}
|
|
174
216
|
return out;
|
|
175
217
|
}
|
|
218
|
+
/** A pack editor's manifest entry: the shared shape plus its pinned hash and a pack-relative entry. */
|
|
219
|
+
export const PackEditorSchema = EditorManifestSchema.extend({
|
|
220
|
+
entry: z.string().regex(/\.html$/u),
|
|
221
|
+
sha256: z.string().regex(/^[0-9a-f]{64}$/u),
|
|
222
|
+
});
|
|
223
|
+
/**
|
|
224
|
+
* Read one pack editor at serve-time quality: the manifest entry for `id` in `<root>/wicked-pack.json`,
|
|
225
|
+
* its entry a real file inside the pack, within its caps, loading nothing from outside, and hashing to
|
|
226
|
+
* `pin`. `null` + a logged reason when any of it fails — an installed editor whose pack changed is
|
|
227
|
+
* skipped until it is installed again, never served half-right.
|
|
228
|
+
*/
|
|
229
|
+
export function readPackEditor(pack, id, log) {
|
|
230
|
+
const why = (m) => {
|
|
231
|
+
log?.(`[editors] ${id} (pack ${pack.name}): ${m}; skipped — install it again`);
|
|
232
|
+
return null;
|
|
233
|
+
};
|
|
234
|
+
const manifestPath = join(pack.root, 'wicked-pack.json');
|
|
235
|
+
const manifestProblem = notRealEntry(manifestPath, 'file');
|
|
236
|
+
if (manifestProblem !== null)
|
|
237
|
+
return why(`wicked-pack.json is ${manifestProblem}`);
|
|
238
|
+
let entries;
|
|
239
|
+
try {
|
|
240
|
+
// Bounded before it is parsed (codex r3): a manifest swapped for a huge one never reaches JSON.parse.
|
|
241
|
+
const raw = readCapped(manifestPath, PACK_MANIFEST_CAP_BYTES);
|
|
242
|
+
if (raw === null)
|
|
243
|
+
return why(`wicked-pack.json is over ${PACK_MANIFEST_CAP_BYTES} bytes`);
|
|
244
|
+
entries = JSON.parse(raw.toString('utf8')).editors;
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
return why(`wicked-pack.json is unreadable (${err instanceof Error ? err.message : String(err)})`);
|
|
248
|
+
}
|
|
249
|
+
const raw = Array.isArray(entries) ? entries.find((e) => typeof e === 'object' && e !== null && e.id === id) : undefined;
|
|
250
|
+
const parsed = PackEditorSchema.safeParse(raw);
|
|
251
|
+
if (!parsed.success)
|
|
252
|
+
return why(`its manifest entry is refused (${parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; ')})`);
|
|
253
|
+
const m = parsed.data;
|
|
254
|
+
if (FIRST_PARTY_ID.test(m.id) || m.id === 'wicked')
|
|
255
|
+
return why('a pack may not declare a wicked-* editor');
|
|
256
|
+
if (editorEntryDigest(m) !== pack.manifestSha256)
|
|
257
|
+
return why('its manifest entry changed since it was installed');
|
|
258
|
+
if (m.entry !== pack.entry)
|
|
259
|
+
return why(`its entry moved (${pack.entry} → ${m.entry})`);
|
|
260
|
+
const entryPath = resolve(pack.root, m.entry);
|
|
261
|
+
const rel = relative(resolve(pack.root), entryPath);
|
|
262
|
+
if (rel === '' || rel.startsWith('..') || isAbsolute(rel))
|
|
263
|
+
return why(`entry ${m.entry} is outside the pack`);
|
|
264
|
+
// Every directory on the way and the file itself are real, never links.
|
|
265
|
+
let at = resolve(pack.root);
|
|
266
|
+
for (const part of rel.split(sep).slice(0, -1)) {
|
|
267
|
+
at = join(at, part);
|
|
268
|
+
const p = notRealEntry(at, 'dir');
|
|
269
|
+
if (p !== null)
|
|
270
|
+
return why(`entry directory ${part} is ${p}`);
|
|
271
|
+
}
|
|
272
|
+
const entryProblem = notRealEntry(entryPath, 'file');
|
|
273
|
+
if (entryProblem !== null)
|
|
274
|
+
return why(`entry ${m.entry} is ${entryProblem}`);
|
|
275
|
+
const cap = m.limits?.bundleBytes ?? HOST_BUNDLE_CAP_BYTES;
|
|
276
|
+
let buf;
|
|
277
|
+
try {
|
|
278
|
+
buf = readCapped(entryPath, cap);
|
|
279
|
+
}
|
|
280
|
+
catch (err) {
|
|
281
|
+
return why(`entry unreadable (${err instanceof Error ? err.message : String(err)})`);
|
|
282
|
+
}
|
|
283
|
+
if (buf === null)
|
|
284
|
+
return why(`entry is over its ${cap}-byte cap`);
|
|
285
|
+
const outside = externalReferences(buf.toString('utf8'));
|
|
286
|
+
if (outside.length > 0)
|
|
287
|
+
return why(`entry loads from outside itself (${outside.slice(0, 3).join(', ')})`);
|
|
288
|
+
const sha = sha256Of(buf);
|
|
289
|
+
if (sha !== m.sha256 || sha !== pack.sha256)
|
|
290
|
+
return why('its entry no longer matches the hash it was installed with');
|
|
291
|
+
const manifest = { id: m.id, title: m.title, version: m.version, protocol: m.protocol, kinds: m.kinds, entry: m.entry, sizes: m.sizes, permissions: m.permissions, ...(m.panels !== undefined ? { panels: m.panels } : {}), ...(m.limits !== undefined ? { limits: m.limits } : {}) };
|
|
292
|
+
return { manifest, sha256: sha, bytes: buf.byteLength, entryPath, firstParty: false, source: 'pack', pack };
|
|
293
|
+
}
|
|
294
|
+
const InstalledPackSchema = z.object({
|
|
295
|
+
root: z.string().min(1),
|
|
296
|
+
name: z.string().regex(EDITOR_ID),
|
|
297
|
+
entry: z.string().regex(/\.html$/u),
|
|
298
|
+
sha256: z.string().regex(/^[0-9a-f]{64}$/u),
|
|
299
|
+
manifestSha256: z.string().regex(/^[0-9a-f]{64}$/u),
|
|
300
|
+
installedAt: z.string(),
|
|
301
|
+
conformance: z.object({ ok: z.literal(true), at: z.string(), cases: z.array(z.string()) }),
|
|
302
|
+
});
|
|
303
|
+
/** An operator flag by editor id: own properties only (an id like `constructor` is not an inherited key, codex r5). */
|
|
304
|
+
function flagOf(flags, id) {
|
|
305
|
+
return Object.hasOwn(flags, id) && typeof flags[id] === 'boolean' ? flags[id] : undefined;
|
|
306
|
+
}
|
|
176
307
|
export class EditorRegistry {
|
|
177
308
|
records = new Map();
|
|
178
309
|
stateFile;
|
|
@@ -181,12 +312,27 @@ export class EditorRegistry {
|
|
|
181
312
|
this.stateFile = join(opts.stateHome ?? crewStateHome(), EDITORS_STATE_FILENAME);
|
|
182
313
|
this.log = opts.log ?? (() => undefined);
|
|
183
314
|
const state = this.readState();
|
|
315
|
+
this.persistedFlags = state.enabled;
|
|
184
316
|
if (opts.studioRoot !== undefined) {
|
|
185
317
|
for (const r of discoverStudioEditors(opts.studioRoot, this.log)) {
|
|
186
|
-
this.records.set(r.manifest.id, { ...r, enabled: state.enabled
|
|
318
|
+
this.records.set(r.manifest.id, { ...r, enabled: flagOf(state.enabled, r.manifest.id) ?? true });
|
|
187
319
|
}
|
|
188
320
|
}
|
|
321
|
+
for (const [id, pack] of Object.entries(state.installed ?? {})) {
|
|
322
|
+
this.installed.set(id, pack);
|
|
323
|
+
if (this.records.has(id)) {
|
|
324
|
+
this.log(`[editors] ${id} (pack ${pack.name}): a first-party editor holds the id; skipped`);
|
|
325
|
+
continue;
|
|
326
|
+
}
|
|
327
|
+
const r = readPackEditor(pack, id, this.log);
|
|
328
|
+
if (r !== null)
|
|
329
|
+
this.records.set(id, { ...r, enabled: flagOf(state.enabled, id) ?? true });
|
|
330
|
+
}
|
|
189
331
|
}
|
|
332
|
+
/** Every installed pack editor as recorded, including one skipped at boot (so an install can replace it). */
|
|
333
|
+
installed = new Map();
|
|
334
|
+
/** The flags as read at boot: kept for an installed editor skipped at boot, so a write never drops its "off". */
|
|
335
|
+
persistedFlags = {};
|
|
190
336
|
readState() {
|
|
191
337
|
try {
|
|
192
338
|
const raw = JSON.parse(readFileSync(this.stateFile, 'utf8'));
|
|
@@ -194,7 +340,15 @@ export class EditorRegistry {
|
|
|
194
340
|
for (const [k, v] of Object.entries(raw.enabled ?? {}))
|
|
195
341
|
if (typeof v === 'boolean' && EDITOR_ID.test(k))
|
|
196
342
|
enabled[k] = v;
|
|
197
|
-
|
|
343
|
+
const installed = {};
|
|
344
|
+
for (const [k, v] of Object.entries(raw.installed ?? {})) {
|
|
345
|
+
const parsed = InstalledPackSchema.safeParse(v);
|
|
346
|
+
if (EDITOR_ID.test(k) && parsed.success)
|
|
347
|
+
installed[k] = parsed.data;
|
|
348
|
+
else
|
|
349
|
+
this.log(`[editors] ${k}: its install record in ${EDITORS_STATE_FILENAME} is malformed; ignored`);
|
|
350
|
+
}
|
|
351
|
+
return { v: 1, enabled, installed };
|
|
198
352
|
}
|
|
199
353
|
catch {
|
|
200
354
|
return { v: 1, enabled: {} };
|
|
@@ -205,7 +359,12 @@ export class EditorRegistry {
|
|
|
205
359
|
for (const r of this.records.values())
|
|
206
360
|
if (!r.enabled)
|
|
207
361
|
enabled[r.manifest.id] = false;
|
|
362
|
+
for (const id of this.installed.keys())
|
|
363
|
+
if (!this.records.has(id) && flagOf(this.persistedFlags, id) === false)
|
|
364
|
+
enabled[id] = false;
|
|
208
365
|
const state = { v: 1, enabled };
|
|
366
|
+
if (this.installed.size > 0)
|
|
367
|
+
state.installed = Object.fromEntries([...this.installed].sort(([a], [b]) => a.localeCompare(b)));
|
|
209
368
|
mkdirSync(join(this.stateFile, '..'), { recursive: true });
|
|
210
369
|
const tmp = `${this.stateFile}.${process.pid}.tmp`;
|
|
211
370
|
writeFileSync(tmp, `${JSON.stringify(state, null, 2)}\n`, { mode: 0o600 });
|
|
@@ -227,10 +386,88 @@ export class EditorRegistry {
|
|
|
227
386
|
if (r === undefined)
|
|
228
387
|
return null;
|
|
229
388
|
const next = { ...r, enabled };
|
|
230
|
-
this.records.set(id, next);
|
|
231
|
-
this.writeState();
|
|
389
|
+
this.commit(() => this.records.set(id, next));
|
|
232
390
|
return next;
|
|
233
391
|
}
|
|
392
|
+
/**
|
|
393
|
+
* Apply `change` to the in-memory maps and persist; a failed write restores the maps as they were
|
|
394
|
+
* and rethrows, so memory never holds what the file does not (codex r1 on X3).
|
|
395
|
+
*/
|
|
396
|
+
commit(change) {
|
|
397
|
+
const records = new Map(this.records);
|
|
398
|
+
const installed = new Map(this.installed);
|
|
399
|
+
const flags = { ...this.persistedFlags };
|
|
400
|
+
change();
|
|
401
|
+
try {
|
|
402
|
+
this.writeState();
|
|
403
|
+
}
|
|
404
|
+
catch (err) {
|
|
405
|
+
this.records.clear();
|
|
406
|
+
for (const [k, v] of records)
|
|
407
|
+
this.records.set(k, v);
|
|
408
|
+
this.installed.clear();
|
|
409
|
+
for (const [k, v] of installed)
|
|
410
|
+
this.installed.set(k, v);
|
|
411
|
+
this.persistedFlags = flags;
|
|
412
|
+
throw err;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Record a pack's editors, already checked and conformance-run by the caller (`pack-install.ts`):
|
|
417
|
+
* each is read back from disk exactly as boot reads it, and only then recorded. All or nothing — a
|
|
418
|
+
* pack editor that does not read back leaves the registry as it was. An editor id another pack
|
|
419
|
+
* holds is refused; the same pack re-installed (an update) replaces its own editors, keeping the
|
|
420
|
+
* operator's on/off choice unless `enabled` says otherwise.
|
|
421
|
+
*/
|
|
422
|
+
installPack(packs, enabled) {
|
|
423
|
+
const read = [];
|
|
424
|
+
let updated = false;
|
|
425
|
+
for (const { id, pack } of packs) {
|
|
426
|
+
const existing = this.records.get(id);
|
|
427
|
+
if (existing?.firstParty === true)
|
|
428
|
+
throw new EditorInstallConflict(`${id} is a first-party editor's id`);
|
|
429
|
+
const held = this.installed.get(id);
|
|
430
|
+
if (held !== undefined && held.name !== pack.name)
|
|
431
|
+
throw new EditorInstallConflict(`${id} is already installed from the pack ${held.name}; remove it first`);
|
|
432
|
+
if (held !== undefined)
|
|
433
|
+
updated = true;
|
|
434
|
+
const r = readPackEditor(pack, id, this.log);
|
|
435
|
+
if (r === null)
|
|
436
|
+
throw new EditorInstallConflict(`${id} did not read back from ${pack.root} (see the daemon log)`);
|
|
437
|
+
read.push(r);
|
|
438
|
+
}
|
|
439
|
+
const out = read.map((r) => {
|
|
440
|
+
const id = r.manifest.id;
|
|
441
|
+
// An update keeps the operator's switch: the live record's, else the one persisted for a record
|
|
442
|
+
// skipped at boot (codex r1), else on.
|
|
443
|
+
return { ...r, enabled: enabled ?? this.records.get(id)?.enabled ?? flagOf(this.persistedFlags, id) ?? true };
|
|
444
|
+
});
|
|
445
|
+
this.commit(() => {
|
|
446
|
+
for (const r of out) {
|
|
447
|
+
this.records.set(r.manifest.id, r);
|
|
448
|
+
this.installed.set(r.manifest.id, r.pack);
|
|
449
|
+
}
|
|
450
|
+
});
|
|
451
|
+
return { records: out, updated };
|
|
452
|
+
}
|
|
453
|
+
/** Remove an installed pack editor (the pack's files are the installer's to delete). `false` when it is not one. */
|
|
454
|
+
removeInstalled(id) {
|
|
455
|
+
if (!this.installed.has(id))
|
|
456
|
+
return false;
|
|
457
|
+
this.commit(() => {
|
|
458
|
+
this.installed.delete(id);
|
|
459
|
+
// A removed editor's boot-time "off" does not follow a later install of the id (codex r2).
|
|
460
|
+
delete this.persistedFlags[id];
|
|
461
|
+
const r = this.records.get(id);
|
|
462
|
+
if (r !== undefined && !r.firstParty)
|
|
463
|
+
this.records.delete(id);
|
|
464
|
+
});
|
|
465
|
+
return true;
|
|
466
|
+
}
|
|
467
|
+
/** Whether `id` is an installed pack editor (served or skipped at boot). */
|
|
468
|
+
isInstalled(id) {
|
|
469
|
+
return this.installed.has(id);
|
|
470
|
+
}
|
|
234
471
|
/** The wire view: no paths, the hashed entry URL instead. */
|
|
235
472
|
static view(r) {
|
|
236
473
|
const m = r.manifest;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/editors/registry.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/editors/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/editors/routes.d.ts
CHANGED
|
@@ -2,10 +2,13 @@
|
|
|
2
2
|
* `/api/v1/editors` (DES-artifact-editor-plugins §6, §8.2, §9.1; EP-C1).
|
|
3
3
|
*
|
|
4
4
|
* - `GET /editors` (operator+): the registry, as Settings → Editors renders it.
|
|
5
|
-
* - `POST /editors {packRoot}` (HUMAN-only):
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* - `POST /editors {packRoot, enabled?}` (HUMAN-only): install or update a pack's editors — garden's
|
|
6
|
+
* fail-closed gate, then crew's own conformance run, then the registry (`pack-install.ts`). 200 with
|
|
7
|
+
* the installed editors; 422 with the verdict or the conformance report; 501 with the approval list
|
|
8
|
+
* for a pack that also ships skills or blocks; 409 for an id another pack or a first-party editor holds.
|
|
9
|
+
* - `DELETE /editors/:id` (HUMAN-only): an installed pack editor is removed from the registry (the
|
|
10
|
+
* installer deletes its files); a first-party editor ships with studio and cannot be removed (409;
|
|
11
|
+
* disable it instead).
|
|
9
12
|
* - `POST /editors/:id/enabled {enabled}` (HUMAN-only): the operator's switch.
|
|
10
13
|
* - `GET /editors/:id/grants?project=` (operator+): the engine's decided set
|
|
11
14
|
* (`evaluate_editor_grants`: EDITOR-GRANTS ledger + EDITOR-BUILTIN posture, deny dominates), with
|
|
@@ -20,7 +23,7 @@
|
|
|
20
23
|
*/
|
|
21
24
|
import type { FastifyInstance, FastifyReply } from 'fastify';
|
|
22
25
|
import type { EditorGrantsResponse } from '../core/types.js';
|
|
23
|
-
import { type PackCheckRunner } from './pack-install.js';
|
|
26
|
+
import { type ConformanceRunner, type PackCheckRunner } from './pack-install.js';
|
|
24
27
|
import { EditorRegistry, type EditorRecord } from './registry.js';
|
|
25
28
|
/** The slice of the adapter the grants route needs; every method optional so a stub never throws. */
|
|
26
29
|
export interface EditorGrantsAdapter {
|
|
@@ -38,6 +41,8 @@ export interface EditorRoutesDeps {
|
|
|
38
41
|
registry: EditorRegistry;
|
|
39
42
|
adapter: EditorGrantsAdapter;
|
|
40
43
|
packCheck: PackCheckRunner;
|
|
44
|
+
/** The install-time conformance run (garden's runner against this daemon's conformance host page). */
|
|
45
|
+
conformance: ConformanceRunner;
|
|
41
46
|
log?: (msg: string) => void;
|
|
42
47
|
}
|
|
43
48
|
export declare function registerEditorRoutes(app: FastifyInstance, deps: EditorRoutesDeps): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/editors/routes.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/editors/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAkB,MAAM,SAAS,CAAC;AAI7E,OAAO,KAAK,EAAS,oBAAoB,EAAuB,MAAM,kBAAkB,CAAC;AAEzF,OAAO,EAAiC,KAAK,iBAAiB,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAChH,OAAO,EAA6B,cAAc,EAAmD,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAI9I,qGAAqG;AACrG,MAAM,WAAW,mBAAmB;IAClC,qBAAqB,CAAC,IAAI,OAAO,CAAC;IAClC,oBAAoB,CAAC,CAAC,OAAO,EAAE;QAC7B,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,OAAO,CAAC;KACrB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,SAAS,EAAE,eAAe,CAAC;IAC3B,sGAAsG;IACtG,WAAW,EAAE,iBAAiB,CAAC;IAC/B,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI,CA8HvF;AAED,sFAAsF;AACtF,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,YAAY,CA0BhH"}
|
package/dist/editors/routes.js
CHANGED
|
@@ -2,10 +2,13 @@
|
|
|
2
2
|
* `/api/v1/editors` (DES-artifact-editor-plugins §6, §8.2, §9.1; EP-C1).
|
|
3
3
|
*
|
|
4
4
|
* - `GET /editors` (operator+): the registry, as Settings → Editors renders it.
|
|
5
|
-
* - `POST /editors {packRoot}` (HUMAN-only):
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* - `POST /editors {packRoot, enabled?}` (HUMAN-only): install or update a pack's editors — garden's
|
|
6
|
+
* fail-closed gate, then crew's own conformance run, then the registry (`pack-install.ts`). 200 with
|
|
7
|
+
* the installed editors; 422 with the verdict or the conformance report; 501 with the approval list
|
|
8
|
+
* for a pack that also ships skills or blocks; 409 for an id another pack or a first-party editor holds.
|
|
9
|
+
* - `DELETE /editors/:id` (HUMAN-only): an installed pack editor is removed from the registry (the
|
|
10
|
+
* installer deletes its files); a first-party editor ships with studio and cannot be removed (409;
|
|
11
|
+
* disable it instead).
|
|
9
12
|
* - `POST /editors/:id/enabled {enabled}` (HUMAN-only): the operator's switch.
|
|
10
13
|
* - `GET /editors/:id/grants?project=` (operator+): the engine's decided set
|
|
11
14
|
* (`evaluate_editor_grants`: EDITOR-GRANTS ledger + EDITOR-BUILTIN posture, deny dominates), with
|
|
@@ -19,12 +22,11 @@
|
|
|
19
22
|
* is a tripwire, not a control.
|
|
20
23
|
*/
|
|
21
24
|
import { createHash } from 'node:crypto';
|
|
22
|
-
import { readFileSync } from 'node:fs';
|
|
23
25
|
import { z } from 'zod';
|
|
24
26
|
import { LOCAL_ACTOR, trustAtLeast } from '../api/auth.js';
|
|
25
27
|
import { bundleHeaders } from './csp.js';
|
|
26
|
-
import {
|
|
27
|
-
import { EDITOR_ID, EDITOR_VERSION, EditorRegistry, notRealEntry } from './registry.js';
|
|
28
|
+
import { installPack, PackInstallError } from './pack-install.js';
|
|
29
|
+
import { EDITOR_ID, EDITOR_VERSION, EditorRegistry, HOST_BUNDLE_CAP_BYTES, notRealEntry, readCapped } from './registry.js';
|
|
28
30
|
const V = '/api/v1';
|
|
29
31
|
export function registerEditorRoutes(app, deps) {
|
|
30
32
|
const { registry } = deps;
|
|
@@ -49,36 +51,40 @@ export function registerEditorRoutes(app, deps) {
|
|
|
49
51
|
app.get(`${V}/editors`, { config: { manifest: { responseType: 'ListEditorsResponse', statusCodes: [200, 403] } } }, async (req, reply) => {
|
|
50
52
|
if (!operatorOnly(req, reply))
|
|
51
53
|
return reply;
|
|
52
|
-
const body = { editors: registry.list().map((r) => EditorRegistry.view(r)), installs: '
|
|
54
|
+
const body = { editors: registry.list().map((r) => EditorRegistry.view(r)), installs: 'conformance_required' };
|
|
53
55
|
return body;
|
|
54
56
|
});
|
|
55
|
-
const InstallSchema = z.object({ packRoot: z.string().min(1) }).strict();
|
|
56
|
-
app.post(`${V}/editors`, { config: { manifest: { responseType: '
|
|
57
|
+
const InstallSchema = z.object({ packRoot: z.string().min(1), enabled: z.boolean().optional() }).strict();
|
|
58
|
+
app.post(`${V}/editors`, { config: { manifest: { responseType: 'InstallEditorResponse', statusCodes: [200, 400, 403, 404, 409, 422, 501] } } }, async (req, reply) => {
|
|
57
59
|
if (!humanOnly(req, reply))
|
|
58
60
|
return reply;
|
|
59
61
|
const parsed = InstallSchema.safeParse(req.body);
|
|
60
62
|
if (!parsed.success)
|
|
61
|
-
return reply.code(400).send({ error: 'body must be { packRoot: <absolute path
|
|
63
|
+
return reply.code(400).send({ error: 'body must be { packRoot: <absolute path>, enabled?: boolean }' });
|
|
62
64
|
try {
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
+
const installed = await installPack(parsed.data.packRoot, parsed.data.enabled, { check: deps.packCheck, conformance: deps.conformance, registry });
|
|
66
|
+
deps.log?.(`[editors] installed ${installed.editors.map((e) => `${e.id}@${e.version}`).join(', ')}${installed.updated ? ' (update)' : ''}`);
|
|
67
|
+
return installed;
|
|
65
68
|
}
|
|
66
69
|
catch (err) {
|
|
67
70
|
if (err instanceof PackInstallError) {
|
|
68
|
-
return reply.code(err.status).send({ error: err.message, ...(err.check !== undefined ? { check: err.check } : {}) });
|
|
71
|
+
return reply.code(err.status).send({ error: err.message, ...(err.check !== undefined ? { check: err.check } : {}), ...(err.body ?? {}) });
|
|
69
72
|
}
|
|
70
73
|
throw err;
|
|
71
74
|
}
|
|
72
75
|
});
|
|
73
|
-
app.delete(`${V}/editors/:id`, { config: { manifest: { statusCodes: [403, 404, 409] } } }, async (req, reply) => {
|
|
76
|
+
app.delete(`${V}/editors/:id`, { config: { manifest: { statusCodes: [200, 403, 404, 409] } } }, async (req, reply) => {
|
|
74
77
|
if (!humanOnly(req, reply))
|
|
75
78
|
return reply;
|
|
76
79
|
const id = idOf(req);
|
|
77
|
-
|
|
78
|
-
|
|
80
|
+
if (!EDITOR_ID.test(id))
|
|
81
|
+
return reply.code(404).send({ error: `no editor '${id}' is installed` });
|
|
82
|
+
if (registry.get(id)?.firstParty === true) {
|
|
83
|
+
return reply.code(409).send({ error: `${id} ships with studio and cannot be removed — disable it instead (POST /editors/${id}/enabled)` });
|
|
84
|
+
}
|
|
85
|
+
if (!registry.removeInstalled(id))
|
|
79
86
|
return reply.code(404).send({ error: `no editor '${id}' is installed` });
|
|
80
|
-
|
|
81
|
-
return reply.code(409).send({ error: `${id} ships with studio and cannot be removed — disable it instead (POST /editors/${id}/enabled)` });
|
|
87
|
+
return { removed: true, id };
|
|
82
88
|
});
|
|
83
89
|
const EnabledSchema = z.object({ enabled: z.boolean() }).strict();
|
|
84
90
|
app.post(`${V}/editors/:id/enabled`, { config: { manifest: { responseType: 'EditorView', statusCodes: [200, 400, 403, 404] } } }, async (req, reply) => {
|
|
@@ -148,12 +154,16 @@ export function serveBundle(record, reply, log) {
|
|
|
148
154
|
}
|
|
149
155
|
let buf;
|
|
150
156
|
try {
|
|
151
|
-
buf =
|
|
157
|
+
buf = readCapped(record.entryPath, record.manifest.limits?.bundleBytes ?? HOST_BUNDLE_CAP_BYTES);
|
|
152
158
|
}
|
|
153
159
|
catch (err) {
|
|
154
160
|
log?.(`[editors] ${record.manifest.id}: entry unreadable at serve time (${err instanceof Error ? err.message : String(err)})`);
|
|
155
161
|
return reply.code(404).send({ error: 'no such editor bundle' });
|
|
156
162
|
}
|
|
163
|
+
if (buf === null) {
|
|
164
|
+
log?.(`[editors] ${record.manifest.id}@${record.manifest.version}: entry grew over its cap on disk; refused`);
|
|
165
|
+
return reply.code(409).send({ code: 'bundle_hash_mismatch', error: `the ${record.manifest.id} bundle on disk no longer matches its pinned hash; restart the daemon to re-pin it` });
|
|
166
|
+
}
|
|
157
167
|
const actual = createHash('sha256').update(buf).digest('hex');
|
|
158
168
|
if (actual !== record.sha256) {
|
|
159
169
|
log?.(`[editors] ${record.manifest.id}@${record.manifest.version}: bundle hash changed on disk (pinned ${record.sha256.slice(0, 12)}…, found ${actual.slice(0, 12)}…); refused`);
|