@cosmicdrift/kumiko-framework 0.73.0 → 0.75.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cosmicdrift/kumiko-framework",
3
- "version": "0.73.0",
3
+ "version": "0.75.0",
4
4
  "description": "Framework core — engine, pipeline, API, DB, and every other bit that makes Kumiko go.",
5
5
  "license": "BUSL-1.1",
6
6
  "author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
@@ -181,7 +181,7 @@
181
181
  "zod": "^4.4.3"
182
182
  },
183
183
  "devDependencies": {
184
- "@cosmicdrift/kumiko-dispatcher-live": "0.73.0",
184
+ "@cosmicdrift/kumiko-dispatcher-live": "0.75.0",
185
185
  "bun-types": "^1.3.13",
186
186
  "pino-pretty": "^13.1.3"
187
187
  },
@@ -259,9 +259,8 @@ describe("auth-routes cookieDomain", () => {
259
259
  });
260
260
  expect(res.status).toBe(200);
261
261
  expect(getSetCookieRaw(res, AUTH_COOKIE_NAME)).toMatch(/Domain=example\.eu/i);
262
- // Das CSRF-Cookie wird via denselben common-Optionen rotiert wie das Auth-
263
- // Cookie. Ohne Domain-Attribut bliebe es host-only neben dem Domain-Auth-
264
- // Cookie → der Double-Submit-Check läse umgebungsabhängig das falsche.
262
+ // CSRF cookie is rotated with the same common options as the auth cookie:
263
+ // without a Domain attribute it would be host-only and the double-submit check could read the wrong one.
265
264
  expect(getSetCookieRaw(res, CSRF_COOKIE_NAME)).toMatch(/Domain=example\.eu/i);
266
265
  });
267
266
 
@@ -201,10 +201,10 @@ describe("buildAppSchema — Settings-Hub inline placement", () => {
201
201
  });
202
202
 
203
203
  describe("buildAppSchema — dangling audience-ref dev-warning (#408/3)", () => {
204
- // billing registriert nur system+tenant-Keys → audience-user wird NIE
205
- // generiert. Eine Workspace, die config:nav:audience-user referenziert, boot't
206
- // (Boot-Validator exempt't die Audience-QNs), aber der Eintrag rendert
207
- // unsichtbarder Dev muss eine Warnung sehen, nicht still nichts.
204
+ // billing registers only system+tenant keys → audience-user is NEVER
205
+ // generated. A workspace referencing config:nav:audience-user still boots
206
+ // (the boot-validator exempts the audience QNs), but the entry renders
207
+ // invisiblythe dev must see a warning, not silently nothing.
208
208
  function warnsFor(scopes: string[]): string[] {
209
209
  const prevEnv = process.env.NODE_ENV;
210
210
  process.env.NODE_ENV = "development";
@@ -240,7 +240,7 @@ describe("buildConfigFeatureSchema — access + workspace", () => {
240
240
 
241
241
  test("a screen mixing an openToAll key with role-restricted keys collapses to openToAll", () => {
242
242
  // unionAccessRules short-circuits: one openToAll writer opens the whole gate,
243
- // even next to role-restricted keys — the mixed case the all-or-nothing tests miss.
243
+ // even next to role-restricted keys.
244
244
  const mixedWrite = defineFeature("mixedwrite", (r) => {
245
245
  r.config({
246
246
  keys: {
@@ -156,10 +156,10 @@ function placeSettingsHub(
156
156
  }
157
157
 
158
158
  const placedAudiences = new Set<string>();
159
- // Config-Hub-Navs, die eine Workspace referenziert, die aber nie generiert
160
- // wurden (weder Audience noch bekanntes Kind) — z.B. `config:nav:audience-user`
161
- // ohne registrierte User-Scope-Config-Keys. Sonst verschwindet die Referenz
162
- // lautlos (silent-skip).
159
+ // Config-hub navs a workspace references but that were never generated (no
160
+ // audience and no known child) — e.g. `config:nav:audience-user` without any
161
+ // registered user-scope config keys. Otherwise the reference vanishes
162
+ // silently (silent-skip).
163
163
  const danglingRefs = new Set<string>();
164
164
  const workspaces = appWorkspaces.map((ws) => {
165
165
  const additions: string[] = [];
@@ -135,15 +135,15 @@ export function buildConfigFeatureSchema(registry: Registry): ConfigFeatureSchem
135
135
  return { screens, navs, workspace: buildSettingsWorkspace(navs) };
136
136
  }
137
137
 
138
- // Keys, die an `scope` sichtbar sind, gepaart mit ihren effektiven Schreib-
139
- // Rollen AN diesem Scope (Home = volles write; breiter = elevated ∩ write).
138
+ // Keys visible at `scope`, paired with their effective write roles AT that
139
+ // scope (Home = full write; broader = elevated ∩ write).
140
140
  function scopedKeysAt(masked: readonly MaskedKey[], scope: ConfigScope): ScopedKey[] {
141
141
  const out: ScopedKey[] = [];
142
142
  for (const key of masked) {
143
143
  const roles = effectiveWriteRoles(key.def, scope);
144
- // MACHINE_WRITE_ROLE aus den Screen-Rollen strippen: ein gemischter
145
- // write-Set (z.B. ["system", "SystemAdmin"]) darf "system" nicht ins
146
- // Screen-Access-Gate leakenanalog zum machine-gefilterten Workspace-Gate.
144
+ // Strip MACHINE_WRITE_ROLE from the screen roles: a mixed write set
145
+ // (e.g. ["system", "SystemAdmin"]) must not leak "system" into the
146
+ // screen access gate mirrors the machine-filtered workspace gate.
147
147
  const humanRoles = roles.filter((r) => r !== MACHINE_WRITE_ROLE);
148
148
  if (humanRoles.length > 0) out.push({ key, roles: humanRoles });
149
149
  }
@@ -296,7 +296,7 @@ describe("enqueueProjectionRebuild — inline fallback (no jobs feature)", () =>
296
296
  });
297
297
  });
298
298
 
299
- // #391/2: jobRunner present but the projection-rebuild job not registered (a
299
+ // jobRunner present but the projection-rebuild job not registered (a
300
300
  // caller that wired a jobRunner yet forgot to compose createJobsFeature()). The
301
301
  // getJob-capability guard must still fall to the inline rebuild — NOT dispatch
302
302
  // onto a runner whose queue has no handler for the job (silent no-op forever).