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.
Files changed (121) hide show
  1. package/dist/api/delivery-assurance.d.ts.map +1 -1
  2. package/dist/api/delivery-assurance.js +14 -3
  3. package/dist/api/delivery-assurance.js.map +1 -1
  4. package/dist/api/discovery-source.d.ts +4 -4
  5. package/dist/api/discovery-source.d.ts.map +1 -1
  6. package/dist/api/discovery-source.js +14 -8
  7. package/dist/api/discovery-source.js.map +1 -1
  8. package/dist/api/eval-sample.d.ts +12 -12
  9. package/dist/api/governance-steering.d.ts +2 -2
  10. package/dist/api/governance-steering.js +2 -2
  11. package/dist/api/governance-steering.js.map +1 -1
  12. package/dist/api/mcp.d.ts +4 -4
  13. package/dist/api/onboarding-capture.d.ts +1 -1
  14. package/dist/api/onboarding-capture.d.ts.map +1 -1
  15. package/dist/api/onboarding-capture.js +1 -1
  16. package/dist/api/onboarding-capture.js.map +1 -1
  17. package/dist/api/routes.d.ts +133 -131
  18. package/dist/api/routes.d.ts.map +1 -1
  19. package/dist/api/routes.js +37 -34
  20. package/dist/api/routes.js.map +1 -1
  21. package/dist/api/server.d.ts +6 -0
  22. package/dist/api/server.d.ts.map +1 -1
  23. package/dist/api/server.js +36 -1
  24. package/dist/api/server.js.map +1 -1
  25. package/dist/api/testing.js +1 -1
  26. package/dist/api/testing.js.map +1 -1
  27. package/dist/campaigns/plan.d.ts +8 -1
  28. package/dist/campaigns/plan.d.ts.map +1 -1
  29. package/dist/campaigns/plan.js +15 -3
  30. package/dist/campaigns/plan.js.map +1 -1
  31. package/dist/campaigns/routes.d.ts +8 -8
  32. package/dist/core/adapter.d.ts +29 -89
  33. package/dist/core/adapter.d.ts.map +1 -1
  34. package/dist/core/adapter.js +86 -609
  35. package/dist/core/adapter.js.map +1 -1
  36. package/dist/core/builtin-catalog.d.ts +24 -0
  37. package/dist/core/builtin-catalog.d.ts.map +1 -0
  38. package/dist/core/builtin-catalog.js +54 -0
  39. package/dist/core/builtin-catalog.js.map +1 -0
  40. package/dist/core/council-settings.d.ts +18 -0
  41. package/dist/core/council-settings.d.ts.map +1 -0
  42. package/dist/core/council-settings.js +37 -0
  43. package/dist/core/council-settings.js.map +1 -0
  44. package/dist/core/deliver-text.d.ts +1 -1
  45. package/dist/core/deliver-text.d.ts.map +1 -1
  46. package/dist/core/deliver-text.js +3 -2
  47. package/dist/core/deliver-text.js.map +1 -1
  48. package/dist/core/deliver.d.ts +0 -6
  49. package/dist/core/deliver.d.ts.map +1 -1
  50. package/dist/core/deliver.js +0 -6
  51. package/dist/core/deliver.js.map +1 -1
  52. package/dist/core/run-identity.d.ts +1 -1
  53. package/dist/core/run-identity.d.ts.map +1 -1
  54. package/dist/core/run-identity.js +7 -3
  55. package/dist/core/run-identity.js.map +1 -1
  56. package/dist/editors/csp.js +2 -2
  57. package/dist/editors/csp.js.map +1 -1
  58. package/dist/editors/pack-install.d.ts +35 -14
  59. package/dist/editors/pack-install.d.ts.map +1 -1
  60. package/dist/editors/pack-install.js +171 -24
  61. package/dist/editors/pack-install.js.map +1 -1
  62. package/dist/editors/registry.d.ts +151 -13
  63. package/dist/editors/registry.d.ts.map +1 -1
  64. package/dist/editors/registry.js +257 -20
  65. package/dist/editors/registry.js.map +1 -1
  66. package/dist/editors/routes.d.ts +10 -5
  67. package/dist/editors/routes.d.ts.map +1 -1
  68. package/dist/editors/routes.js +30 -20
  69. package/dist/editors/routes.js.map +1 -1
  70. package/dist/learn/routes.d.ts +42 -0
  71. package/dist/learn/routes.d.ts.map +1 -0
  72. package/dist/learn/routes.js +87 -0
  73. package/dist/learn/routes.js.map +1 -0
  74. package/dist/learn/schedule-store.d.ts +41 -0
  75. package/dist/learn/schedule-store.d.ts.map +1 -0
  76. package/dist/learn/schedule-store.js +137 -0
  77. package/dist/learn/schedule-store.js.map +1 -0
  78. package/dist/learn/scheduler.d.ts +71 -0
  79. package/dist/learn/scheduler.d.ts.map +1 -0
  80. package/dist/learn/scheduler.js +222 -0
  81. package/dist/learn/scheduler.js.map +1 -0
  82. package/dist/learn/topics.d.ts +14 -0
  83. package/dist/learn/topics.d.ts.map +1 -0
  84. package/dist/learn/topics.js +95 -0
  85. package/dist/learn/topics.js.map +1 -0
  86. package/dist/projects/graph.d.ts +14 -0
  87. package/dist/projects/graph.d.ts.map +1 -1
  88. package/dist/projects/graph.js +41 -2
  89. package/dist/projects/graph.js.map +1 -1
  90. package/dist/projects/routes.d.ts +2 -2
  91. package/dist/projects/state-home-registry.d.ts.map +1 -1
  92. package/dist/projects/state-home-registry.js +2 -0
  93. package/dist/projects/state-home-registry.js.map +1 -1
  94. package/dist/qe/acceptance.d.ts +5 -0
  95. package/dist/qe/acceptance.d.ts.map +1 -1
  96. package/dist/qe/acceptance.js +4 -2
  97. package/dist/qe/acceptance.js.map +1 -1
  98. package/dist/qe/author-workflow.d.ts +6 -83
  99. package/dist/qe/author-workflow.d.ts.map +1 -1
  100. package/dist/qe/author-workflow.js +6 -300
  101. package/dist/qe/author-workflow.js.map +1 -1
  102. package/dist/qe/ledger.d.ts +20 -0
  103. package/dist/qe/ledger.d.ts.map +1 -1
  104. package/dist/qe/ledger.js +28 -2
  105. package/dist/qe/ledger.js.map +1 -1
  106. package/dist/skills/core-closure.d.ts +3 -5
  107. package/dist/skills/core-closure.d.ts.map +1 -1
  108. package/dist/skills/core-closure.js +3 -5
  109. package/dist/skills/core-closure.js.map +1 -1
  110. package/dist/standing-orders/routes.d.ts +4 -4
  111. package/dist/standing-orders/store.d.ts +2 -2
  112. package/dist/studio/assets/index-C0ZMi_8d.js +583 -0
  113. package/dist/studio/assets/index-DYLo25MW.css +32 -0
  114. package/dist/studio/editors/wicked-page/editor.json +1 -1
  115. package/dist/studio/editors/wicked-page/index.html +1 -1
  116. package/dist/studio/index.html +2 -2
  117. package/dist/studio/testid-inventory.json +566 -36
  118. package/endpoint-manifest.json +59 -2
  119. package/package.json +4 -4
  120. package/dist/studio/assets/index-BGfFmWw4.css +0 -32
  121. package/dist/studio/assets/index-BMRUMU4X.js +0 -567
@@ -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 in the design; one exists today:
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[]`). Their install is REFUSED
12
- * until the install-time conformance run ships (EP-C8, LATER): `pack-install.ts` still runs
13
- * garden's fail-closed `pack check` and lists what the operator would be asked to approve, then
14
- * answers 501. Nothing of a pack is ever written by this registry.
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` — the enable/disable flags the
17
- * operator sets in Settings → Editors (§6.4, human-only). It sits under the `daemon-` prefix both
18
- * crew's state-home registry and the engine's worker fence already classify (crew#756), so no new
19
- * top-level entry is introduced; a pack install (EP-C8) will need a registered `editors/` subtree in
20
- * both repos first.
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 = readFileSync(entryPath);
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
- const cap = manifest.limits?.bundleBytes ?? HOST_BUNDLE_CAP_BYTES;
163
- if (buf.byteLength > cap) {
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[r.manifest.id] ?? true });
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
- return { v: 1, enabled };
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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"}
@@ -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): garden's fail-closed gate, the approval list, then 501
6
- * `third_party_editors_not_available` — every pack editor is third-party and EP-C8 has not shipped.
7
- * - `DELETE /editors/:id` (HUMAN-only): a first-party editor ships with studio and cannot be removed
8
- * (409; disable it instead); no other editor can exist before EP-C8 (404).
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;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAkB,MAAM,SAAS,CAAC;AAI7E,OAAO,KAAK,EAAS,oBAAoB,EAAuB,MAAM,kBAAkB,CAAC;AAEzF,OAAO,EAAwC,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAA6B,cAAc,EAAgB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAI3G,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,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI,CA2HvF;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,CAsBhH"}
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"}
@@ -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): garden's fail-closed gate, the approval list, then 501
6
- * `third_party_editors_not_available` — every pack editor is third-party and EP-C8 has not shipped.
7
- * - `DELETE /editors/:id` (HUMAN-only): a first-party editor ships with studio and cannot be removed
8
- * (409; disable it instead); no other editor can exist before EP-C8 (404).
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 { PackInstallError, previewPackInstall } from './pack-install.js';
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: 'refused_until_conformance' };
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: 'InstallEditorRefusal', statusCodes: [400, 403, 404, 422, 501] } } }, async (req, reply) => {
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 refusal = await previewPackInstall(parsed.data.packRoot, deps.packCheck);
64
- return reply.code(501).send(refusal);
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
- const record = EDITOR_ID.test(id) ? registry.get(id) : null;
78
- if (record === null)
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
- // The only editors that can exist before EP-C8 ship inside studio's bundle.
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 = readFileSync(record.entryPath);
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`);