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.
Files changed (67) hide show
  1. package/dist/api/capture.d.ts +2 -2
  2. package/dist/api/delivery-assurance.d.ts +1 -6
  3. package/dist/api/delivery-assurance.d.ts.map +1 -1
  4. package/dist/api/delivery-assurance.js +4 -14
  5. package/dist/api/delivery-assurance.js.map +1 -1
  6. package/dist/api/governance-steering.d.ts +2 -2
  7. package/dist/api/mcp.d.ts +4 -4
  8. package/dist/api/recording.d.ts +29 -3
  9. package/dist/api/recording.d.ts.map +1 -1
  10. package/dist/api/recording.js +188 -0
  11. package/dist/api/recording.js.map +1 -1
  12. package/dist/api/roster-standing.d.ts +3 -2
  13. package/dist/api/roster-standing.d.ts.map +1 -1
  14. package/dist/api/roster-standing.js +3 -1
  15. package/dist/api/roster-standing.js.map +1 -1
  16. package/dist/api/routes.d.ts +112 -112
  17. package/dist/api/routes.d.ts.map +1 -1
  18. package/dist/api/routes.js +66 -5
  19. package/dist/api/routes.js.map +1 -1
  20. package/dist/api/seat-probe.d.ts +7 -0
  21. package/dist/api/seat-probe.d.ts.map +1 -1
  22. package/dist/api/seat-probe.js +27 -5
  23. package/dist/api/seat-probe.js.map +1 -1
  24. package/dist/api/seat-version.d.ts +8 -0
  25. package/dist/api/seat-version.d.ts.map +1 -1
  26. package/dist/api/seat-version.js +36 -4
  27. package/dist/api/seat-version.js.map +1 -1
  28. package/dist/api/testing.d.ts +4 -4
  29. package/dist/campaigns/routes.d.ts +2 -2
  30. package/dist/core/adapter.d.ts.map +1 -1
  31. package/dist/core/adapter.js +20 -0
  32. package/dist/core/adapter.js.map +1 -1
  33. package/dist/core/builtin-catalog.d.ts.map +1 -1
  34. package/dist/core/builtin-catalog.js +6 -1
  35. package/dist/core/builtin-catalog.js.map +1 -1
  36. package/dist/core/qe-acceptance-setting.d.ts +65 -0
  37. package/dist/core/qe-acceptance-setting.d.ts.map +1 -0
  38. package/dist/core/qe-acceptance-setting.js +93 -0
  39. package/dist/core/qe-acceptance-setting.js.map +1 -0
  40. package/dist/core/types.d.ts.map +1 -1
  41. package/dist/core/types.js +3 -0
  42. package/dist/core/types.js.map +1 -1
  43. package/dist/editors/pack-install.d.ts +30 -3
  44. package/dist/editors/pack-install.d.ts.map +1 -1
  45. package/dist/editors/pack-install.js +59 -4
  46. package/dist/editors/pack-install.js.map +1 -1
  47. package/dist/events/terminals.d.ts +42 -2
  48. package/dist/events/terminals.d.ts.map +1 -1
  49. package/dist/events/terminals.js +136 -3
  50. package/dist/events/terminals.js.map +1 -1
  51. package/dist/studio/assets/index-1Ucvzihb.js +770 -0
  52. package/dist/studio/assets/index-B0u_f6HD.css +32 -0
  53. package/dist/studio/editors/wicked-deck/editor.json +56 -3
  54. package/dist/studio/editors/wicked-deck/index.html +53 -7
  55. package/dist/studio/editors/wicked-doc/editor.json +91 -0
  56. package/dist/studio/editors/wicked-doc/index.html +161 -0
  57. package/dist/studio/editors/wicked-page/editor.json +42 -4
  58. package/dist/studio/editors/wicked-page/index.html +24 -7
  59. package/dist/studio/editors/wicked-video/editor.json +271 -0
  60. package/dist/studio/editors/wicked-video/index.html +28 -0
  61. package/dist/studio/index.html +2 -2
  62. package/dist/studio/testid-inventory.json +660 -94
  63. package/dist/team/routes.d.ts +2 -2
  64. package/endpoint-manifest.json +14 -1
  65. package/package.json +3 -3
  66. package/dist/studio/assets/index-BSPM1fFW.css +0 -32
  67. package/dist/studio/assets/index-R8uK_NlG.js +0 -848
@@ -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 { QE_ACCEPTANCE, QE_PRESETS, aggregateReceipt, postHocDeliveryAssurance, qeAcceptanceFromView, qeAcceptanceRefusal, receiptOf, qeAcceptanceNotRequired, qeDecisionBypasses, qeDecisionOf, unreadableQeAcceptance, } from './delivery-assurance.js';
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
- const required = b.workflow !== undefined ? adapter.getWorkflow(b.workflow)?.required_instruments : undefined;
1833
- const qeRequired = required?.includes(QE_ACCEPTANCE) === true || (b.workflow !== undefined && QE_PRESETS.has(b.workflow));
1834
- if (qeRequired && b.skipQeAcceptance === undefined) {
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