wicked-crew 0.11.0 → 0.12.0
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/capture.d.ts +2 -2
- package/dist/api/delivery-assurance.d.ts +1 -6
- package/dist/api/delivery-assurance.d.ts.map +1 -1
- package/dist/api/delivery-assurance.js +4 -14
- package/dist/api/delivery-assurance.js.map +1 -1
- package/dist/api/governance-steering.d.ts +2 -2
- package/dist/api/mcp.d.ts +4 -4
- package/dist/api/recording.d.ts +29 -3
- package/dist/api/recording.d.ts.map +1 -1
- package/dist/api/recording.js +188 -0
- package/dist/api/recording.js.map +1 -1
- package/dist/api/roster-standing.d.ts +3 -2
- package/dist/api/roster-standing.d.ts.map +1 -1
- package/dist/api/roster-standing.js +3 -1
- package/dist/api/roster-standing.js.map +1 -1
- package/dist/api/routes.d.ts +112 -112
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +66 -5
- package/dist/api/routes.js.map +1 -1
- package/dist/api/seat-probe.d.ts +7 -0
- package/dist/api/seat-probe.d.ts.map +1 -1
- package/dist/api/seat-probe.js +27 -5
- package/dist/api/seat-probe.js.map +1 -1
- package/dist/api/seat-version.d.ts +8 -0
- package/dist/api/seat-version.d.ts.map +1 -1
- package/dist/api/seat-version.js +36 -4
- package/dist/api/seat-version.js.map +1 -1
- package/dist/api/testing.d.ts +4 -4
- package/dist/campaigns/routes.d.ts +2 -2
- package/dist/core/adapter.d.ts.map +1 -1
- package/dist/core/adapter.js +20 -0
- package/dist/core/adapter.js.map +1 -1
- package/dist/core/builtin-catalog.d.ts.map +1 -1
- package/dist/core/builtin-catalog.js +6 -1
- package/dist/core/builtin-catalog.js.map +1 -1
- package/dist/core/qe-acceptance-setting.d.ts +65 -0
- package/dist/core/qe-acceptance-setting.d.ts.map +1 -0
- package/dist/core/qe-acceptance-setting.js +93 -0
- package/dist/core/qe-acceptance-setting.js.map +1 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -1
- package/dist/editors/pack-install.d.ts +30 -3
- package/dist/editors/pack-install.d.ts.map +1 -1
- package/dist/editors/pack-install.js +59 -4
- package/dist/editors/pack-install.js.map +1 -1
- package/dist/events/terminals.d.ts +42 -2
- package/dist/events/terminals.d.ts.map +1 -1
- package/dist/events/terminals.js +136 -3
- package/dist/events/terminals.js.map +1 -1
- package/dist/studio/assets/index-1Ucvzihb.js +770 -0
- package/dist/studio/assets/index-B0u_f6HD.css +32 -0
- package/dist/studio/editors/wicked-deck/editor.json +56 -3
- package/dist/studio/editors/wicked-deck/index.html +53 -7
- package/dist/studio/editors/wicked-doc/editor.json +91 -0
- package/dist/studio/editors/wicked-doc/index.html +161 -0
- package/dist/studio/editors/wicked-page/editor.json +42 -4
- package/dist/studio/editors/wicked-page/index.html +24 -7
- package/dist/studio/editors/wicked-video/editor.json +271 -0
- package/dist/studio/editors/wicked-video/index.html +28 -0
- package/dist/studio/index.html +2 -2
- package/dist/studio/testid-inventory.json +660 -94
- package/dist/team/routes.d.ts +2 -2
- package/endpoint-manifest.json +14 -1
- package/package.json +3 -3
- package/dist/studio/assets/index-BSPM1fFW.css +0 -32
- package/dist/studio/assets/index-R8uK_NlG.js +0 -848
package/dist/api/routes.js
CHANGED
|
@@ -48,7 +48,8 @@ import { isSteeringAuthorRun, landSteeringProposal } from './steering-landing.js
|
|
|
48
48
|
import { inventoryComplete, parseInventoryClaims } from '../core/inventory-claim.js';
|
|
49
49
|
import { ApproveEditSchema, approveEdited, captureLaunchRoots, editInFlight, FileProposalSchema, registerCaptureRoutes } from './capture.js';
|
|
50
50
|
import { registerTestingRoutes } from './testing.js';
|
|
51
|
-
import { DEMO_PRESET, demoLaunchRoots, registerDemoRoutes, registerWalkthroughRoutes, walkthroughAcceptance } from './recording.js';
|
|
51
|
+
import { DEMO_PRESET, demoLaunchRoots, registerDemoDocumentRoute, registerDemoRoutes, registerWalkthroughRoutes, walkthroughAcceptance } from './recording.js';
|
|
52
|
+
import { projectDocsRoot } from '../interactive/project-root.js';
|
|
52
53
|
import { registerSkillsRoutes } from './skills.js';
|
|
53
54
|
import { registerMcpRoutes } from './mcp.js';
|
|
54
55
|
import { McpPolicies } from '../mcp/policies.js';
|
|
@@ -59,7 +60,8 @@ import { BASE_SKILL_POLICIES, BASE_SKILL_REF_SHAPE, baseSkillRemedy } from '../s
|
|
|
59
60
|
import { REQUIRED_GARDEN_VERSION } from '../skills/plugin-source.js';
|
|
60
61
|
import { engineRosterJson, noEligibleSeatBody, parseNoEligibleSeat } from '../core/engine-roster.js';
|
|
61
62
|
import { launchAssuranceNotice } from '../core/assurance.js';
|
|
62
|
-
import {
|
|
63
|
+
import { launchRequiresQe, mayRequireQe, qeAcceptanceMode, qeSettingSkipReason } from '../core/qe-acceptance-setting.js';
|
|
64
|
+
import { aggregateReceipt, postHocDeliveryAssurance, qeAcceptanceFromView, qeAcceptanceRefusal, receiptOf, qeAcceptanceNotRequired, qeDecisionBypasses, qeDecisionOf, unreadableQeAcceptance, } from './delivery-assurance.js';
|
|
63
65
|
import { ProjectSettingsStore } from '../projects/settings.js';
|
|
64
66
|
import { isHumanOperator } from './watch-routes.js';
|
|
65
67
|
import { boundOrigin, InteractiveBridgePool } from '../interactive/bridge-pool.js';
|
|
@@ -1079,6 +1081,9 @@ runtime = {}) {
|
|
|
1079
1081
|
// spellings where the contract has no name, statusCodes list every code the route answers on
|
|
1080
1082
|
// purpose. Declared on the highest-traffic run-lifecycle routes first; the manifest records
|
|
1081
1083
|
// null / [] for the rest ("where declared", never invented). See src/api/endpoint-manifest.ts.
|
|
1084
|
+
// The daemon's QE acceptance setting as read now ('required' when the settings cannot be read:
|
|
1085
|
+
// fail closed, never off by accident).
|
|
1086
|
+
const qeAcceptanceNow = async () => qeAcceptanceMode(await Promise.resolve().then(() => adapter.getSettings()).catch(() => null));
|
|
1082
1087
|
app.get(`${V}/health`, { config: { manifest: { statusCodes: [200] } } }, async () => {
|
|
1083
1088
|
const ping = await enginePing();
|
|
1084
1089
|
// F-E2E-030: what this deployment can keep. A composer reads `capabilities.deliverGate`
|
|
@@ -1105,6 +1110,9 @@ runtime = {}) {
|
|
|
1105
1110
|
// QE-IN-APP-WORKFLOWS: `LaunchRunBody.skipQeAcceptance` / `forceQeAcceptance` reach an addon
|
|
1106
1111
|
// that carries the QE decision; never an invented capability.
|
|
1107
1112
|
qeAcceptanceOverride: typeof adapter.engineCapabilities === 'function' && addonSupportsQeOverride(),
|
|
1113
|
+
// api-types 0.120.0: the daemon's QE acceptance setting, read per probe ('off' = every launch
|
|
1114
|
+
// that requires QE acceptance skips it, labelled with the setting).
|
|
1115
|
+
qeAcceptance: await qeAcceptanceNow(),
|
|
1108
1116
|
};
|
|
1109
1117
|
// wicked-core#411 / crew#497: the state-home blocker rides the health probe as a WARNING. The
|
|
1110
1118
|
// daemon still SERVES (status stays ok — studio must load and show the blocker) but refuses to
|
|
@@ -1823,15 +1831,23 @@ runtime = {}) {
|
|
|
1823
1831
|
// F-E2E-030: only the explicit `'auto'` opts out of the engine's deliver gate. `'human'` and
|
|
1824
1832
|
// an omitted field both leave `autoDeliver` off the input — the gate is the engine's default,
|
|
1825
1833
|
// so the wire never has to say "gate me" to be gated.
|
|
1834
|
+
// The daemon's QE acceptance setting, read ONCE for this launch: the deliverGate check below and
|
|
1835
|
+
// the skip handed to the engine come from the same reading (core/qe-acceptance-setting.ts).
|
|
1836
|
+
// An addon without the QE decision enforces none, so the setting has nothing to skip on it.
|
|
1837
|
+
const qeMode = addonSupportsQeOverride() ? await qeAcceptanceNow() : 'required';
|
|
1838
|
+
const qeRequired = b.deliverGate === 'auto' || qeMode === 'off' ? await launchRequiresQe(adapter, b.workflow, b.projectId) : false;
|
|
1839
|
+
const settingSkip = qeSettingSkipReason(qeMode, { skipQeAcceptanceReason: b.skipQeAcceptance?.reason, forceQeAcceptance: b.forceQeAcceptance }, qeRequired);
|
|
1826
1840
|
if (b.deliverGate === 'auto') {
|
|
1827
1841
|
// wicked-core#850 EX-03: a workflow that requires QE acceptance delivers only through the deliver
|
|
1828
1842
|
// gate, where crew checks the verdict. Unattended delivery would push before anyone could.
|
|
1829
1843
|
// QE-IN-APP-WORKFLOWS: an explicit operator skip leaves no verdict to check, so it may. A name
|
|
1830
1844
|
// the engine resolves to a built-in preset that requires QE acceptance is judged by that preset
|
|
1831
1845
|
// (the engine resolves a preset before any def, so a def of the same name never speaks for it).
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1846
|
+
// The daemon's `qeAcceptance: 'off'` setting skips it the same way (resolved once, above, and
|
|
1847
|
+
// handed to the engine with this launch), unless this launch forces QE acceptance.
|
|
1848
|
+
// Refused on the CONSERVATIVE reading (a built-in QE name or a QE def counts even when a project
|
|
1849
|
+
// preset shadows it now): only an explicit or setting skip lets QE work deliver unattended.
|
|
1850
|
+
if (mayRequireQe(adapter, b.workflow, qeRequired) && b.skipQeAcceptance === undefined && settingSkip === undefined) {
|
|
1835
1851
|
return reply.code(400).send({
|
|
1836
1852
|
error: `workflow ${b.workflow} requires QE acceptance (required_instruments: qe_acceptance), so it delivers only ` +
|
|
1837
1853
|
'through the deliver gate, where the verdict is checked — deliverGate: "auto" cannot apply to it ' +
|
|
@@ -1913,6 +1929,8 @@ runtime = {}) {
|
|
|
1913
1929
|
// when sent, never inferred.
|
|
1914
1930
|
if (b.skipQeAcceptance !== undefined)
|
|
1915
1931
|
input.skipQeAcceptanceReason = b.skipQeAcceptance.reason;
|
|
1932
|
+
else if (settingSkip !== undefined)
|
|
1933
|
+
input.skipQeAcceptanceReason = settingSkip;
|
|
1916
1934
|
if (b.forceQeAcceptance === true)
|
|
1917
1935
|
input.forceQeAcceptance = true;
|
|
1918
1936
|
// DES-L9 / crew#550 — REVISION: `revisesPr` names an OPEN same-repository pull request whose
|
|
@@ -5438,6 +5456,19 @@ runtime = {}) {
|
|
|
5438
5456
|
.send({ error: "deliverDefault must be 'pr' or 'none'" });
|
|
5439
5457
|
}
|
|
5440
5458
|
}
|
|
5459
|
+
// qeAcceptance (api-types 0.120.0): 'required' | 'off' only. 'off' skips QE acceptance on every
|
|
5460
|
+
// launch that requires it (labelled with the setting), so a typo must be a 400, never a dropped key.
|
|
5461
|
+
// Turning it off waives an assurance instrument on every launch after it, so only a PERSON may
|
|
5462
|
+
// change it (the predicate the watch switches use); a worker's bearer gets 403.
|
|
5463
|
+
if (Object.hasOwn(patch, 'qeAcceptance')) {
|
|
5464
|
+
const q = patch.qeAcceptance;
|
|
5465
|
+
if (q !== 'required' && q !== 'off') {
|
|
5466
|
+
return reply.code(400).send({ error: "qeAcceptance must be 'required' or 'off'" });
|
|
5467
|
+
}
|
|
5468
|
+
if (!isHumanOperator(actorOf(req))) {
|
|
5469
|
+
return reply.code(403).send({ error: 'Only a person can change QE acceptance (qeAcceptance); a worker or system actor cannot' });
|
|
5470
|
+
}
|
|
5471
|
+
}
|
|
5441
5472
|
// onboardingAutoCapture (crew#552): whether a completed onboarding chains capture-learnings.
|
|
5442
5473
|
if (Object.hasOwn(patch, 'onboardingAutoCapture') && typeof patch.onboardingAutoCapture !== 'boolean') {
|
|
5443
5474
|
return reply.code(400).send({ error: 'onboardingAutoCapture must be true or false' });
|
|
@@ -5522,6 +5553,7 @@ runtime = {}) {
|
|
|
5522
5553
|
'workerStallEscalateAction',
|
|
5523
5554
|
'workerStallMaxEscalations',
|
|
5524
5555
|
'deliverDefault',
|
|
5556
|
+
'qeAcceptance',
|
|
5525
5557
|
'onboardingAutoCapture',
|
|
5526
5558
|
'deliverIdentityLogin',
|
|
5527
5559
|
'deliverIdentityByRepo',
|
|
@@ -6195,6 +6227,35 @@ runtime = {}) {
|
|
|
6195
6227
|
dropDocLedgerRows: runtime.dropDocLedgerRows ?? (() => ({ ok: true, removed_keys: [] })),
|
|
6196
6228
|
log: (m) => app.log.warn(m),
|
|
6197
6229
|
});
|
|
6230
|
+
// ── A demo run's video as an editable document (the video editor re-cuts it through E1's per-doc API) ──
|
|
6231
|
+
registerDemoDocumentRoute(app, adapter, {
|
|
6232
|
+
bridgeFor: async (projectId) => {
|
|
6233
|
+
const root = await projectDocsRoot(adapter, projectSettings, projectId);
|
|
6234
|
+
if (root === null)
|
|
6235
|
+
return null;
|
|
6236
|
+
const bridge = await interactiveBridges.ensure(root);
|
|
6237
|
+
return async (method, path, body) => {
|
|
6238
|
+
const raw = Buffer.isBuffer(body);
|
|
6239
|
+
const res = await fetch(`http://${bridge.host}:${bridge.port}${path}`, {
|
|
6240
|
+
method,
|
|
6241
|
+
headers: { 'content-type': raw ? 'application/octet-stream' : 'application/json' },
|
|
6242
|
+
body: raw ? new Uint8Array(body) : JSON.stringify(body),
|
|
6243
|
+
// A segment upload or the import's render (ffmpeg) can take minutes on a loaded host.
|
|
6244
|
+
signal: AbortSignal.timeout(600_000),
|
|
6245
|
+
});
|
|
6246
|
+
let parsed = {};
|
|
6247
|
+
try {
|
|
6248
|
+
const j = await res.json();
|
|
6249
|
+
if (j !== null && typeof j === 'object' && !Array.isArray(j))
|
|
6250
|
+
parsed = j;
|
|
6251
|
+
}
|
|
6252
|
+
catch {
|
|
6253
|
+
parsed = {};
|
|
6254
|
+
}
|
|
6255
|
+
return { status: res.status, body: parsed };
|
|
6256
|
+
};
|
|
6257
|
+
},
|
|
6258
|
+
});
|
|
6198
6259
|
// ── Project-attributed docs list (crew#472) ──
|
|
6199
6260
|
// `GET /projects/:id/interactive/api/docs` relays the bridge's list and stamps each row with
|
|
6200
6261
|
// the mount's `projectId` — the attribution the bridge cannot know. Same static-over-wildcard
|