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
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* A pack install
|
|
2
|
+
* A pack install (DES-artifact-editor-plugins §3.2, §5.2, §9.2, §12.1; EP-C1 + the install-time
|
|
3
|
+
* conformance run of EP-C8, operator ruling X3).
|
|
3
4
|
*
|
|
4
|
-
* Install is human-only (§6.4) and
|
|
5
|
-
* pack root (schema, every editor's entry inside the pack, its
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
5
|
+
* Install is human-only (§6.4) and fail closed at every step, in this order:
|
|
6
|
+
* 1. garden's `pack check --json` on the pack root (schema, every editor's entry inside the pack, its
|
|
7
|
+
* hash, its size, nothing loaded from outside);
|
|
8
|
+
* 2. the pack ships editors only: one that also ships skills or blocks is refused with the approval
|
|
9
|
+
* list (501 `pack_ships_skills_or_blocks`), since their own "Add these" step (§3.2) is not built;
|
|
10
|
+
* 3. the **conformance run**, done by crew itself: garden's `scripts/editor/conformance.py --pack
|
|
11
|
+
* <root> --host-url <this daemon>` drives studio's conformance host page (served by this daemon)
|
|
12
|
+
* in headless Chromium against each editor. A failed case, no browser or no runner is a 422 with
|
|
13
|
+
* the report — an unverified editor is never installed. Only crew's run counts (§12.1, review S13);
|
|
14
|
+
* an author's own run is not consulted;
|
|
15
|
+
* 4. the registry reads every editor back from disk at its pinned hash and records it.
|
|
16
|
+
* Nothing is written into the pack. The registry file is `daemon-editors.json`.
|
|
12
17
|
*/
|
|
13
|
-
import type {
|
|
18
|
+
import type { EditorConformanceSummary, InstallEditorResponse, PackCheckResult } from '../core/types.js';
|
|
19
|
+
import { EditorRegistry } from './registry.js';
|
|
14
20
|
export type PackCheckRunner = (packRoot: string) => Promise<PackCheckResult>;
|
|
15
21
|
/**
|
|
16
22
|
* Garden's gate, run as a child: `python3 <garden>/scripts/pack/check.py <pack> --json --garden-root <garden>`
|
|
@@ -19,10 +25,25 @@ export type PackCheckRunner = (packRoot: string) => Promise<PackCheckResult>;
|
|
|
19
25
|
*/
|
|
20
26
|
export declare function gardenPackCheck(gardenRoot: string | null): PackCheckRunner;
|
|
21
27
|
export declare class PackInstallError extends Error {
|
|
22
|
-
readonly status: 400 | 404 | 422;
|
|
28
|
+
readonly status: 400 | 404 | 409 | 422 | 501;
|
|
23
29
|
readonly check?: PackCheckResult | undefined;
|
|
24
|
-
|
|
30
|
+
readonly body?: Record<string, unknown> | undefined;
|
|
31
|
+
constructor(status: 400 | 404 | 409 | 422 | 501, message: string, check?: PackCheckResult | undefined, body?: Record<string, unknown> | undefined);
|
|
25
32
|
}
|
|
26
|
-
/**
|
|
27
|
-
export
|
|
33
|
+
/** The install-time conformance run: the pack root in, garden's report out. */
|
|
34
|
+
export type ConformanceRunner = (packRoot: string) => Promise<EditorConformanceSummary>;
|
|
35
|
+
/** The cases a conformance run must report passing for every editor (garden's runner: 0-6 and 8-12). */
|
|
36
|
+
export declare const CONFORMANCE_CASES: readonly ["0-manifest", "1-handshake", "2-sizes", "3-no-network", "4-permissions", "5-typing", "6-forwarding", "8-strict-input", "9-liveness", "10-keyboard", "11-theme", "12-hash-pinned"];
|
|
37
|
+
/**
|
|
38
|
+
* Garden's conformance runner as a child: `python3 <garden>/scripts/editor/conformance.py --pack <root>
|
|
39
|
+
* --host-url <this daemon> --json`. A missing garden or runner, no daemon URL, no browser, or an
|
|
40
|
+
* unreadable report is a FAILED run with the reason — never a pass.
|
|
41
|
+
*/
|
|
42
|
+
export declare function gardenConformance(gardenRoot: string | null, hostUrl: () => string | null): ConformanceRunner;
|
|
43
|
+
/** `POST /editors {packRoot, enabled?}`: the gate, the conformance run, then the registry. */
|
|
44
|
+
export declare function installPack(packRootRaw: string, enabled: boolean | undefined, deps: {
|
|
45
|
+
check: PackCheckRunner;
|
|
46
|
+
conformance: ConformanceRunner;
|
|
47
|
+
registry: EditorRegistry;
|
|
48
|
+
}): Promise<InstallEditorResponse>;
|
|
28
49
|
//# sourceMappingURL=pack-install.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pack-install.d.ts","sourceRoot":"","sources":["../../src/editors/pack-install.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"pack-install.d.ts","sourceRoot":"","sources":["../../src/editors/pack-install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAAE,wBAAwB,EAAwB,qBAAqB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE/H,OAAO,EAAyB,cAAc,EAA2D,MAAM,eAAe,CAAC;AAE/H,MAAM,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;AAiB7E;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,eAAe,CAiC1E;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IAEvC,QAAQ,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;IAE5C,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe;IAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAH9B,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAC5C,OAAO,EAAE,MAAM,EACN,KAAK,CAAC,EAAE,eAAe,YAAA,EACvB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;CAK1C;AAED,+EAA+E;AAC/E,MAAM,MAAM,iBAAiB,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;AAExF,wGAAwG;AACxG,eAAO,MAAM,iBAAiB,6LAA8L,CAAC;AAE7N;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,iBAAiB,CAkD5G;AA0FD,8FAA8F;AAC9F,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,GAAG,SAAS,EAC5B,IAAI,EAAE;IAAE,KAAK,EAAE,eAAe,CAAC;IAAC,WAAW,EAAE,iBAAiB,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAA;CAAE,GACzF,OAAO,CAAC,qBAAqB,CAAC,CA2DhC"}
|
|
@@ -1,18 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* A pack install
|
|
2
|
+
* A pack install (DES-artifact-editor-plugins §3.2, §5.2, §9.2, §12.1; EP-C1 + the install-time
|
|
3
|
+
* conformance run of EP-C8, operator ruling X3).
|
|
3
4
|
*
|
|
4
|
-
* Install is human-only (§6.4) and
|
|
5
|
-
* pack root (schema, every editor's entry inside the pack, its
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
5
|
+
* Install is human-only (§6.4) and fail closed at every step, in this order:
|
|
6
|
+
* 1. garden's `pack check --json` on the pack root (schema, every editor's entry inside the pack, its
|
|
7
|
+
* hash, its size, nothing loaded from outside);
|
|
8
|
+
* 2. the pack ships editors only: one that also ships skills or blocks is refused with the approval
|
|
9
|
+
* list (501 `pack_ships_skills_or_blocks`), since their own "Add these" step (§3.2) is not built;
|
|
10
|
+
* 3. the **conformance run**, done by crew itself: garden's `scripts/editor/conformance.py --pack
|
|
11
|
+
* <root> --host-url <this daemon>` drives studio's conformance host page (served by this daemon)
|
|
12
|
+
* in headless Chromium against each editor. A failed case, no browser or no runner is a 422 with
|
|
13
|
+
* the report — an unverified editor is never installed. Only crew's run counts (§12.1, review S13);
|
|
14
|
+
* an author's own run is not consulted;
|
|
15
|
+
* 4. the registry reads every editor back from disk at its pinned hash and records it.
|
|
16
|
+
* Nothing is written into the pack. The registry file is `daemon-editors.json`.
|
|
12
17
|
*/
|
|
13
18
|
import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
|
|
14
19
|
import { isAbsolute, join, resolve } from 'node:path';
|
|
15
20
|
import { execCapped } from '../core/exec.js';
|
|
21
|
+
import { EditorInstallConflict, EditorRegistry, PackEditorSchema, editorEntryDigest } from './registry.js';
|
|
16
22
|
/** The verdict shape garden's `scripts/pack/check.py --json` prints. */
|
|
17
23
|
function parseCheckOutput(stdout) {
|
|
18
24
|
try {
|
|
@@ -72,15 +78,83 @@ export function gardenPackCheck(gardenRoot) {
|
|
|
72
78
|
export class PackInstallError extends Error {
|
|
73
79
|
status;
|
|
74
80
|
check;
|
|
75
|
-
|
|
81
|
+
body;
|
|
82
|
+
constructor(status, message, check, body) {
|
|
76
83
|
super(message);
|
|
77
84
|
this.status = status;
|
|
78
85
|
this.check = check;
|
|
86
|
+
this.body = body;
|
|
79
87
|
this.name = 'PackInstallError';
|
|
80
88
|
}
|
|
81
89
|
}
|
|
82
|
-
/**
|
|
83
|
-
export
|
|
90
|
+
/** The cases a conformance run must report passing for every editor (garden's runner: 0-6 and 8-12). */
|
|
91
|
+
export const CONFORMANCE_CASES = ['0-manifest', '1-handshake', '2-sizes', '3-no-network', '4-permissions', '5-typing', '6-forwarding', '8-strict-input', '9-liveness', '10-keyboard', '11-theme', '12-hash-pinned'];
|
|
92
|
+
/**
|
|
93
|
+
* Garden's conformance runner as a child: `python3 <garden>/scripts/editor/conformance.py --pack <root>
|
|
94
|
+
* --host-url <this daemon> --json`. A missing garden or runner, no daemon URL, no browser, or an
|
|
95
|
+
* unreadable report is a FAILED run with the reason — never a pass.
|
|
96
|
+
*/
|
|
97
|
+
export function gardenConformance(gardenRoot, hostUrl) {
|
|
98
|
+
const failed = (error) => ({ ok: false, at: new Date().toISOString(), editors: [], error });
|
|
99
|
+
return async (packRoot) => {
|
|
100
|
+
if (gardenRoot === null)
|
|
101
|
+
return failed('no wicked-garden plugin found to run the editor conformance cases');
|
|
102
|
+
const script = join(gardenRoot, 'scripts', 'editor', 'conformance.py');
|
|
103
|
+
if (!existsSync(script))
|
|
104
|
+
return failed('this wicked-garden has no scripts/editor/conformance.py (needs the release with the editor-scaffold skill)');
|
|
105
|
+
const host = hostUrl();
|
|
106
|
+
if (host === null)
|
|
107
|
+
return failed('this daemon does not know its own URL to serve the conformance host page');
|
|
108
|
+
const args = [script, '--pack', packRoot, '--host-url', host, '--json'];
|
|
109
|
+
let stdout = '';
|
|
110
|
+
for (const bin of ['python3', 'python']) {
|
|
111
|
+
try {
|
|
112
|
+
stdout = (await execCapped(bin, args, { timeout: 240_000, windowsHide: true })).stdout;
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
const e = err;
|
|
117
|
+
if (e.code === 'ENOENT')
|
|
118
|
+
continue;
|
|
119
|
+
// A failing run exits 1 (a case failed) or 3 (no browser) with the JSON report on stdout.
|
|
120
|
+
if (typeof e.stdout === 'string' && e.stdout.trim() !== '') {
|
|
121
|
+
stdout = e.stdout;
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
return failed(`the conformance run did not finish: ${e.message}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (stdout === '')
|
|
128
|
+
return failed('no python interpreter found (python3 / python)');
|
|
129
|
+
try {
|
|
130
|
+
const raw = JSON.parse(stdout);
|
|
131
|
+
const editors = Array.isArray(raw.editors)
|
|
132
|
+
? raw.editors.flatMap((e) => {
|
|
133
|
+
if (typeof e !== 'object' || e === null)
|
|
134
|
+
return [];
|
|
135
|
+
const r = e;
|
|
136
|
+
const cases = {};
|
|
137
|
+
if (typeof r.cases === 'object' && r.cases !== null) {
|
|
138
|
+
for (const [k, v] of Object.entries(r.cases))
|
|
139
|
+
cases[k] = { ok: typeof v === 'object' && v !== null && v.ok === true };
|
|
140
|
+
}
|
|
141
|
+
const gaps = Array.isArray(r.gaps) ? r.gaps.filter((g) => typeof g === 'string') : [];
|
|
142
|
+
return [{ id: String(r.id), version: typeof r.version === 'string' ? r.version : '', sha256: typeof r.sha256 === 'string' ? r.sha256 : '', ok: r.ok === true, cases, gaps }];
|
|
143
|
+
})
|
|
144
|
+
: [];
|
|
145
|
+
return {
|
|
146
|
+
ok: raw.ok === true,
|
|
147
|
+
at: new Date().toISOString(),
|
|
148
|
+
editors,
|
|
149
|
+
...(typeof raw.error === 'string' ? { error: raw.error } : {}),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return failed('the conformance run printed no readable report');
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
async function readCheckedPack(packRootRaw, check) {
|
|
84
158
|
if (typeof packRootRaw !== 'string' || packRootRaw.trim() === '' || !isAbsolute(packRootRaw)) {
|
|
85
159
|
throw new PackInstallError(400, '`packRoot` must be an absolute path to a directory holding wicked-pack.json');
|
|
86
160
|
}
|
|
@@ -124,19 +198,24 @@ export async function previewPackInstall(packRootRaw, check) {
|
|
|
124
198
|
catch {
|
|
125
199
|
skills = [];
|
|
126
200
|
}
|
|
127
|
-
|
|
128
|
-
|
|
201
|
+
return { pack: { root: packRoot, manifest, editors, blocks, skills }, verdict };
|
|
202
|
+
}
|
|
203
|
+
const str = (v) => (typeof v === 'string' ? v : '');
|
|
204
|
+
const strs = (v) => (Array.isArray(v) ? v.filter((x) => typeof x === 'string') : []);
|
|
205
|
+
/** The approval list a pack with skills or blocks would need (§3.2): the 501 body. */
|
|
206
|
+
function approvalList(pack, verdict) {
|
|
207
|
+
const m = pack.manifest;
|
|
129
208
|
return {
|
|
130
|
-
code: '
|
|
131
|
-
error: '
|
|
132
|
-
'
|
|
133
|
-
'
|
|
209
|
+
code: 'pack_ships_skills_or_blocks',
|
|
210
|
+
error: 'this pack also ships skills or blocks, and their own approval step (DES-artifact-editor-plugins §3.2 ' +
|
|
211
|
+
'"Add these") is not built yet, so it cannot be installed. An editor-only pack can be. ' +
|
|
212
|
+
'This is what the install would ask you to approve.',
|
|
134
213
|
check: verdict,
|
|
135
214
|
pack: {
|
|
136
|
-
name: str(
|
|
137
|
-
vendor: str(
|
|
138
|
-
version: str(
|
|
139
|
-
editors: editors.map((e) => ({
|
|
215
|
+
name: str(m['name']),
|
|
216
|
+
vendor: str(m['vendor']),
|
|
217
|
+
version: str(m['version']),
|
|
218
|
+
editors: pack.editors.map((e) => ({
|
|
140
219
|
id: str(e['id']),
|
|
141
220
|
title: str(e['title']),
|
|
142
221
|
version: str(e['version']),
|
|
@@ -145,9 +224,77 @@ export async function previewPackInstall(packRootRaw, check) {
|
|
|
145
224
|
? e['permissions'].map((p) => ({ id: str(p['id']), why: str(p['why']) }))
|
|
146
225
|
: [],
|
|
147
226
|
})),
|
|
148
|
-
blocks: blocks.map((b) => ({ id: str(b['id']), label: str(b['label']), produces_kind: str(b['produces_kind']), skills: strs(b['skills']) })),
|
|
149
|
-
skills,
|
|
227
|
+
blocks: pack.blocks.map((b) => ({ id: str(b['id']), label: str(b['label']), produces_kind: str(b['produces_kind']), skills: strs(b['skills']) })),
|
|
228
|
+
skills: pack.skills,
|
|
150
229
|
},
|
|
151
230
|
};
|
|
152
231
|
}
|
|
232
|
+
/** The admitted manifest entry's digest, over the same parse the registry reads it back with. */
|
|
233
|
+
function digestOf(entry) {
|
|
234
|
+
const parsed = PackEditorSchema.safeParse(entry);
|
|
235
|
+
if (!parsed.success)
|
|
236
|
+
throw new PackInstallError(400, `editor ${str(entry['id'])}: manifest entry refused (${parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; ')})`);
|
|
237
|
+
return editorEntryDigest(parsed.data);
|
|
238
|
+
}
|
|
239
|
+
/** `POST /editors {packRoot, enabled?}`: the gate, the conformance run, then the registry. */
|
|
240
|
+
export async function installPack(packRootRaw, enabled, deps) {
|
|
241
|
+
const { pack, verdict } = await readCheckedPack(packRootRaw, deps.check);
|
|
242
|
+
if (pack.blocks.length > 0 || pack.skills.length > 0) {
|
|
243
|
+
throw new PackInstallError(501, 'the pack ships skills or blocks', verdict, approvalList(pack, verdict));
|
|
244
|
+
}
|
|
245
|
+
const name = str(pack.manifest['name']);
|
|
246
|
+
const ids = pack.editors.map((e) => str(e['id']));
|
|
247
|
+
for (const id of ids) {
|
|
248
|
+
if (deps.registry.get(id)?.firstParty === true)
|
|
249
|
+
throw new PackInstallError(409, `${id} is a first-party editor's id`, verdict);
|
|
250
|
+
}
|
|
251
|
+
const conformance = await deps.conformance(pack.root);
|
|
252
|
+
// The report counts only for the bytes being installed (codex r1): the run's own version and entry
|
|
253
|
+
// hash must be the manifest's, which the registry then re-reads at that same hash.
|
|
254
|
+
const missing = (e) => {
|
|
255
|
+
const r = conformance.editors.find((x) => x.id === str(e['id']));
|
|
256
|
+
if (r === undefined)
|
|
257
|
+
return ['not in the report'];
|
|
258
|
+
if (r.sha256 !== str(e['sha256']) || r.version !== str(e['version']))
|
|
259
|
+
return [`ran against ${r.version || '?'}#${(r.sha256 || '?').slice(0, 12)}, not this entry`];
|
|
260
|
+
return CONFORMANCE_CASES.filter((c) => r.cases[c]?.ok !== true);
|
|
261
|
+
};
|
|
262
|
+
const failures = pack.editors.map((e) => ({ id: str(e['id']), missing: missing(e) })).filter((f) => f.missing.length > 0);
|
|
263
|
+
if (!conformance.ok || failures.length > 0) {
|
|
264
|
+
const unavailable = conformance.editors.length === 0;
|
|
265
|
+
throw new PackInstallError(422, unavailable
|
|
266
|
+
? `the conformance run could not run, so nothing was installed: ${conformance.error ?? 'no report'}`
|
|
267
|
+
: `the editor failed its conformance run (${failures.map((f) => `${f.id}: ${f.missing.join(', ')}`).join('; ')}); nothing was installed`, verdict, { code: unavailable ? 'conformance_unavailable' : 'editor_not_conformant', conformance });
|
|
268
|
+
}
|
|
269
|
+
const now = new Date().toISOString();
|
|
270
|
+
const packs = pack.editors.map((e) => {
|
|
271
|
+
const entry = str(e['entry']);
|
|
272
|
+
const record = {
|
|
273
|
+
root: pack.root,
|
|
274
|
+
name,
|
|
275
|
+
entry,
|
|
276
|
+
sha256: str(e['sha256']),
|
|
277
|
+
manifestSha256: digestOf(e),
|
|
278
|
+
installedAt: now,
|
|
279
|
+
conformance: { ok: true, at: conformance.at, cases: [...CONFORMANCE_CASES] },
|
|
280
|
+
};
|
|
281
|
+
return { id: str(e['id']), pack: record };
|
|
282
|
+
});
|
|
283
|
+
let installed;
|
|
284
|
+
try {
|
|
285
|
+
installed = deps.registry.installPack(packs, enabled);
|
|
286
|
+
}
|
|
287
|
+
catch (err) {
|
|
288
|
+
if (err instanceof EditorInstallConflict)
|
|
289
|
+
throw new PackInstallError(409, err.message, verdict);
|
|
290
|
+
throw err;
|
|
291
|
+
}
|
|
292
|
+
return {
|
|
293
|
+
installed: true,
|
|
294
|
+
updated: installed.updated,
|
|
295
|
+
editors: installed.records.map((r) => EditorRegistry.view(r)),
|
|
296
|
+
check: verdict,
|
|
297
|
+
conformance,
|
|
298
|
+
};
|
|
299
|
+
}
|
|
153
300
|
//# sourceMappingURL=pack-install.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pack-install.js","sourceRoot":"","sources":["../../src/editors/pack-install.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pack-install.js","sourceRoot":"","sources":["../../src/editors/pack-install.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +1,27 @@
|
|
|
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 { z } from 'zod';
|
|
23
27
|
import type { EditorView } from '../core/types.js';
|
|
@@ -25,6 +29,8 @@ import type { EditorView } from '../core/types.js';
|
|
|
25
29
|
export declare const EDITORS_STATE_FILENAME = "daemon-editors.json";
|
|
26
30
|
/** Where first-party manifests live inside the studio bundle. */
|
|
27
31
|
export declare const STUDIO_EDITORS_DIRNAME = "editors";
|
|
32
|
+
/** The most of an installed pack's `wicked-pack.json` the registry reads (a manifest is a few KB). */
|
|
33
|
+
export declare const PACK_MANIFEST_CAP_BYTES: number;
|
|
28
34
|
/** The host's bundle cap (§8.5); a pack's `limits.bundleBytes` may only be lower. */
|
|
29
35
|
export declare const HOST_BUNDLE_CAP_BYTES: number;
|
|
30
36
|
export declare const EDITOR_PERMISSIONS: readonly ["artifact.read", "artifact.write", "selection.chip", "composer.draft", "checks.read", "checks.contribute", "sources.read", "media.read", "artifact.export", "ui.fullscreen", "network.media"];
|
|
@@ -61,10 +67,10 @@ export declare const EditorManifestSchema: z.ZodObject<{
|
|
|
61
67
|
}>>;
|
|
62
68
|
}, "strip", z.ZodTypeAny, {
|
|
63
69
|
id: string;
|
|
64
|
-
title: string;
|
|
65
70
|
version: string;
|
|
66
71
|
entry: string;
|
|
67
72
|
protocol: number[];
|
|
73
|
+
title: string;
|
|
68
74
|
kinds: string[];
|
|
69
75
|
sizes: ("full" | "inline" | "pane")[];
|
|
70
76
|
permissions: {
|
|
@@ -77,9 +83,9 @@ export declare const EditorManifestSchema: z.ZodObject<{
|
|
|
77
83
|
} | undefined;
|
|
78
84
|
}, {
|
|
79
85
|
id: string;
|
|
80
|
-
title: string;
|
|
81
86
|
version: string;
|
|
82
87
|
protocol: number[];
|
|
88
|
+
title: string;
|
|
83
89
|
kinds: string[];
|
|
84
90
|
sizes: ("full" | "inline" | "pane")[];
|
|
85
91
|
permissions: {
|
|
@@ -101,10 +107,44 @@ export interface EditorRecord {
|
|
|
101
107
|
/** Absolute path of the entry file. Never on the wire. */
|
|
102
108
|
entryPath: string;
|
|
103
109
|
firstParty: boolean;
|
|
104
|
-
|
|
110
|
+
/** `studio-bundle`: first-party, shipped in studio's dist. `pack`: a third-party pack the operator installed. */
|
|
111
|
+
source: 'studio-bundle' | 'pack';
|
|
105
112
|
enabled: boolean;
|
|
113
|
+
/** For a pack editor: the pack it came from. Never on the wire. */
|
|
114
|
+
pack?: InstalledPack;
|
|
115
|
+
}
|
|
116
|
+
/** One installed pack editor, as `daemon-editors.json` records it. */
|
|
117
|
+
export interface InstalledPack {
|
|
118
|
+
/** Absolute path of the pack directory (holding `wicked-pack.json`). */
|
|
119
|
+
root: string;
|
|
120
|
+
/** The pack's `name` (the installer's key). */
|
|
121
|
+
name: string;
|
|
122
|
+
/** The editor's entry path, relative to the pack root. */
|
|
123
|
+
entry: string;
|
|
124
|
+
/** The entry's sha256 when it was installed (and passed the conformance run). */
|
|
125
|
+
sha256: string;
|
|
126
|
+
/** {@link editorEntryDigest} of its manifest entry as admitted: permissions, kinds, version, … */
|
|
127
|
+
manifestSha256: string;
|
|
128
|
+
installedAt: string;
|
|
129
|
+
/** The conformance run that admitted it: when, and which cases ran. */
|
|
130
|
+
conformance: {
|
|
131
|
+
ok: true;
|
|
132
|
+
at: string;
|
|
133
|
+
cases: string[];
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/** An install the registry refuses: the id is taken, or the pack did not read back. */
|
|
137
|
+
export declare class EditorInstallConflict extends Error {
|
|
138
|
+
constructor(message: string);
|
|
106
139
|
}
|
|
107
140
|
export declare function sha256Of(buf: Buffer): string;
|
|
141
|
+
/**
|
|
142
|
+
* Read a file holding at most `cap` bytes, never allocating more than `cap + 1` (codex r1 on X3: a
|
|
143
|
+
* file swapped for a huge one is refused before it is read whole). `null` = over the cap.
|
|
144
|
+
*/
|
|
145
|
+
export declare function readCapped(path: string, cap: number): Buffer | null;
|
|
146
|
+
/** The digest of a pack editor's admitted manifest entry: a manifest edited after install is a new install. */
|
|
147
|
+
export declare function editorEntryDigest(entry: unknown): string;
|
|
108
148
|
/**
|
|
109
149
|
* A path is served from the bundle only if it IS what it looks like: a real directory or a real
|
|
110
150
|
* file, never a link (codex r1 — a link under `editors/` could point outside the bundle and be
|
|
@@ -119,6 +159,77 @@ export declare function externalReferences(html: string): string[];
|
|
|
119
159
|
* served half-right.
|
|
120
160
|
*/
|
|
121
161
|
export declare function discoverStudioEditors(studioRoot: string, log?: (msg: string) => void): Array<Omit<EditorRecord, 'enabled'>>;
|
|
162
|
+
/** A pack editor's manifest entry: the shared shape plus its pinned hash and a pack-relative entry. */
|
|
163
|
+
export declare const PackEditorSchema: z.ZodObject<{
|
|
164
|
+
id: z.ZodString;
|
|
165
|
+
title: z.ZodString;
|
|
166
|
+
version: z.ZodString;
|
|
167
|
+
protocol: z.ZodArray<z.ZodNumber, "many">;
|
|
168
|
+
kinds: z.ZodArray<z.ZodString, "many">;
|
|
169
|
+
sizes: z.ZodEffects<z.ZodArray<z.ZodEnum<["inline", "pane", "full"]>, "many">, ("full" | "inline" | "pane")[], ("full" | "inline" | "pane")[]>;
|
|
170
|
+
panels: z.ZodOptional<z.ZodArray<z.ZodEnum<["checks"]>, "many">>;
|
|
171
|
+
permissions: z.ZodArray<z.ZodObject<{
|
|
172
|
+
id: z.ZodEnum<["artifact.read", "artifact.write", "selection.chip", "composer.draft", "checks.read", "checks.contribute", "sources.read", "media.read", "artifact.export", "ui.fullscreen", "network.media"]>;
|
|
173
|
+
why: z.ZodString;
|
|
174
|
+
}, "strip", z.ZodTypeAny, {
|
|
175
|
+
id: "artifact.read" | "artifact.write" | "selection.chip" | "composer.draft" | "checks.read" | "checks.contribute" | "sources.read" | "media.read" | "artifact.export" | "ui.fullscreen" | "network.media";
|
|
176
|
+
why: string;
|
|
177
|
+
}, {
|
|
178
|
+
id: "artifact.read" | "artifact.write" | "selection.chip" | "composer.draft" | "checks.read" | "checks.contribute" | "sources.read" | "media.read" | "artifact.export" | "ui.fullscreen" | "network.media";
|
|
179
|
+
why: string;
|
|
180
|
+
}>, "many">;
|
|
181
|
+
limits: z.ZodOptional<z.ZodObject<{
|
|
182
|
+
bundleBytes: z.ZodNumber;
|
|
183
|
+
}, "strip", z.ZodTypeAny, {
|
|
184
|
+
bundleBytes: number;
|
|
185
|
+
}, {
|
|
186
|
+
bundleBytes: number;
|
|
187
|
+
}>>;
|
|
188
|
+
} & {
|
|
189
|
+
entry: z.ZodString;
|
|
190
|
+
sha256: z.ZodString;
|
|
191
|
+
}, "strip", z.ZodTypeAny, {
|
|
192
|
+
id: string;
|
|
193
|
+
sha256: string;
|
|
194
|
+
version: string;
|
|
195
|
+
entry: string;
|
|
196
|
+
protocol: number[];
|
|
197
|
+
title: string;
|
|
198
|
+
kinds: string[];
|
|
199
|
+
sizes: ("full" | "inline" | "pane")[];
|
|
200
|
+
permissions: {
|
|
201
|
+
id: "artifact.read" | "artifact.write" | "selection.chip" | "composer.draft" | "checks.read" | "checks.contribute" | "sources.read" | "media.read" | "artifact.export" | "ui.fullscreen" | "network.media";
|
|
202
|
+
why: string;
|
|
203
|
+
}[];
|
|
204
|
+
panels?: "checks"[] | undefined;
|
|
205
|
+
limits?: {
|
|
206
|
+
bundleBytes: number;
|
|
207
|
+
} | undefined;
|
|
208
|
+
}, {
|
|
209
|
+
id: string;
|
|
210
|
+
sha256: string;
|
|
211
|
+
version: string;
|
|
212
|
+
entry: string;
|
|
213
|
+
protocol: number[];
|
|
214
|
+
title: string;
|
|
215
|
+
kinds: string[];
|
|
216
|
+
sizes: ("full" | "inline" | "pane")[];
|
|
217
|
+
permissions: {
|
|
218
|
+
id: "artifact.read" | "artifact.write" | "selection.chip" | "composer.draft" | "checks.read" | "checks.contribute" | "sources.read" | "media.read" | "artifact.export" | "ui.fullscreen" | "network.media";
|
|
219
|
+
why: string;
|
|
220
|
+
}[];
|
|
221
|
+
panels?: "checks"[] | undefined;
|
|
222
|
+
limits?: {
|
|
223
|
+
bundleBytes: number;
|
|
224
|
+
} | undefined;
|
|
225
|
+
}>;
|
|
226
|
+
/**
|
|
227
|
+
* Read one pack editor at serve-time quality: the manifest entry for `id` in `<root>/wicked-pack.json`,
|
|
228
|
+
* its entry a real file inside the pack, within its caps, loading nothing from outside, and hashing to
|
|
229
|
+
* `pin`. `null` + a logged reason when any of it fails — an installed editor whose pack changed is
|
|
230
|
+
* skipped until it is installed again, never served half-right.
|
|
231
|
+
*/
|
|
232
|
+
export declare function readPackEditor(pack: InstalledPack, id: string, log?: (msg: string) => void): Omit<EditorRecord, 'enabled'> | null;
|
|
122
233
|
export declare class EditorRegistry {
|
|
123
234
|
private readonly records;
|
|
124
235
|
private readonly stateFile;
|
|
@@ -128,6 +239,10 @@ export declare class EditorRegistry {
|
|
|
128
239
|
studioRoot?: string;
|
|
129
240
|
log?: (msg: string) => void;
|
|
130
241
|
});
|
|
242
|
+
/** Every installed pack editor as recorded, including one skipped at boot (so an install can replace it). */
|
|
243
|
+
private readonly installed;
|
|
244
|
+
/** The flags as read at boot: kept for an installed editor skipped at boot, so a write never drops its "off". */
|
|
245
|
+
private persistedFlags;
|
|
131
246
|
private readState;
|
|
132
247
|
private writeState;
|
|
133
248
|
/** Where the flags live (diagnostics / tests). */
|
|
@@ -136,6 +251,29 @@ export declare class EditorRegistry {
|
|
|
136
251
|
get(id: string): EditorRecord | null;
|
|
137
252
|
/** Enable or disable (§6.4: the operator's click). Returns the record, or `null` for an unknown id. */
|
|
138
253
|
setEnabled(id: string, enabled: boolean): EditorRecord | null;
|
|
254
|
+
/**
|
|
255
|
+
* Apply `change` to the in-memory maps and persist; a failed write restores the maps as they were
|
|
256
|
+
* and rethrows, so memory never holds what the file does not (codex r1 on X3).
|
|
257
|
+
*/
|
|
258
|
+
private commit;
|
|
259
|
+
/**
|
|
260
|
+
* Record a pack's editors, already checked and conformance-run by the caller (`pack-install.ts`):
|
|
261
|
+
* each is read back from disk exactly as boot reads it, and only then recorded. All or nothing — a
|
|
262
|
+
* pack editor that does not read back leaves the registry as it was. An editor id another pack
|
|
263
|
+
* holds is refused; the same pack re-installed (an update) replaces its own editors, keeping the
|
|
264
|
+
* operator's on/off choice unless `enabled` says otherwise.
|
|
265
|
+
*/
|
|
266
|
+
installPack(packs: Array<{
|
|
267
|
+
id: string;
|
|
268
|
+
pack: InstalledPack;
|
|
269
|
+
}>, enabled: boolean | undefined): {
|
|
270
|
+
records: EditorRecord[];
|
|
271
|
+
updated: boolean;
|
|
272
|
+
};
|
|
273
|
+
/** Remove an installed pack editor (the pack's files are the installer's to delete). `false` when it is not one. */
|
|
274
|
+
removeInstalled(id: string): boolean;
|
|
275
|
+
/** Whether `id` is an installed pack editor (served or skipped at boot). */
|
|
276
|
+
isInstalled(id: string): boolean;
|
|
139
277
|
/** The wire view: no paths, the hashed entry URL instead. */
|
|
140
278
|
static view(r: EditorRecord): EditorView;
|
|
141
279
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/editors/registry.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/editors/registry.ts"],"names":[],"mappings":"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"}
|