@fuzdev/fuz_app 0.101.1 → 0.103.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 (58) hide show
  1. package/dist/auth/CLAUDE.md +29 -17
  2. package/dist/auth/cell_action_specs.d.ts +35 -34
  3. package/dist/auth/cell_action_specs.d.ts.map +1 -1
  4. package/dist/auth/cell_action_specs.js +23 -8
  5. package/dist/auth/cell_actions.d.ts +28 -0
  6. package/dist/auth/cell_actions.d.ts.map +1 -1
  7. package/dist/auth/cell_actions.js +52 -20
  8. package/dist/auth/cell_data_schema.d.ts +14 -16
  9. package/dist/auth/cell_data_schema.d.ts.map +1 -1
  10. package/dist/auth/cell_data_schema.js +14 -16
  11. package/dist/auth/role_grant_offer_action_specs.d.ts +56 -3
  12. package/dist/auth/role_grant_offer_action_specs.d.ts.map +1 -1
  13. package/dist/auth/role_grant_offer_action_specs.js +48 -3
  14. package/dist/auth/role_grant_offer_actions.d.ts +9 -19
  15. package/dist/auth/role_grant_offer_actions.d.ts.map +1 -1
  16. package/dist/auth/role_grant_offer_actions.js +91 -36
  17. package/dist/db/CLAUDE.md +8 -5
  18. package/dist/db/cell_ddl.d.ts +11 -2
  19. package/dist/db/cell_ddl.d.ts.map +1 -1
  20. package/dist/db/cell_ddl.js +13 -1
  21. package/dist/db/cell_queries.d.ts +14 -8
  22. package/dist/db/cell_queries.d.ts.map +1 -1
  23. package/dist/db/cell_queries.js +12 -11
  24. package/dist/testing/CLAUDE.md +66 -7
  25. package/dist/testing/cross_backend/capabilities.d.ts +14 -0
  26. package/dist/testing/cross_backend/capabilities.d.ts.map +1 -1
  27. package/dist/testing/cross_backend/capabilities.js +3 -0
  28. package/dist/testing/cross_backend/cell_crud.d.ts.map +1 -1
  29. package/dist/testing/cross_backend/cell_crud.js +55 -13
  30. package/dist/testing/cross_backend/cell_gated_create.d.ts +4 -0
  31. package/dist/testing/cross_backend/cell_gated_create.d.ts.map +1 -0
  32. package/dist/testing/cross_backend/cell_gated_create.js +71 -0
  33. package/dist/testing/cross_backend/cell_grant_role.js +4 -4
  34. package/dist/testing/cross_backend/cell_relations.d.ts.map +1 -1
  35. package/dist/testing/cross_backend/cell_relations.js +30 -24
  36. package/dist/testing/cross_backend/default_backend_configs.d.ts.map +1 -1
  37. package/dist/testing/cross_backend/default_backend_configs.js +7 -0
  38. package/dist/testing/cross_backend/default_spine_surface.d.ts +9 -5
  39. package/dist/testing/cross_backend/default_spine_surface.d.ts.map +1 -1
  40. package/dist/testing/cross_backend/default_spine_surface.js +12 -6
  41. package/dist/testing/cross_backend/expected_schema.json +1 -0
  42. package/dist/testing/cross_backend/fact_serving.js +2 -2
  43. package/dist/testing/cross_backend/full_spine_mount.d.ts.map +1 -1
  44. package/dist/testing/cross_backend/full_spine_mount.js +6 -1
  45. package/dist/testing/cross_backend/role_grant_participation.d.ts +11 -0
  46. package/dist/testing/cross_backend/role_grant_participation.d.ts.map +1 -0
  47. package/dist/testing/cross_backend/role_grant_participation.js +73 -0
  48. package/dist/testing/cross_backend/rust_spine_stub_backend_config.d.ts.map +1 -1
  49. package/dist/testing/cross_backend/rust_spine_stub_backend_config.js +6 -3
  50. package/dist/testing/cross_backend/spine_surface_constants.d.ts +12 -0
  51. package/dist/testing/cross_backend/spine_surface_constants.d.ts.map +1 -1
  52. package/dist/testing/cross_backend/spine_surface_constants.js +12 -0
  53. package/dist/testing/cross_backend/test_cell_gated_create_authorize.d.ts +17 -0
  54. package/dist/testing/cross_backend/test_cell_gated_create_authorize.d.ts.map +1 -0
  55. package/dist/testing/cross_backend/test_cell_gated_create_authorize.js +36 -0
  56. package/dist/testing/cross_backend/ts_spine_backend_config.d.ts.map +1 -1
  57. package/dist/testing/cross_backend/ts_spine_backend_config.js +5 -2
  58. package/package.json +1 -1
@@ -0,0 +1,73 @@
1
+ import '../assert_dev_env.js';
2
+ /**
3
+ * Cross-backend parity suite for **role-gated participation conferral — the
4
+ * success paths**. The imperative escape hatch beneath the declarative
5
+ * `conformance_participation_cases.ts`: the multi-step flows that need a real
6
+ * recipient account (so a static conformance row can't express them) — an
7
+ * admin assigns the `participant` app-role, and an admin offers it through the
8
+ * consent flow and the recipient accepts.
9
+ *
10
+ * Proves the two conferral *write* paths agree on both spines (TS spine binary
11
+ * + Rust `testing_spine_stub`):
12
+ *
13
+ * - **immediate assign** — `role_grant_assign` of the admin-grantable
14
+ * `participant` role lands a grant and returns `{ok, role_grant_id}`;
15
+ * re-assigning the active grant is idempotent (same id).
16
+ * - **consent flow** — `role_grant_offer_create` of `participant` (admin-only)
17
+ * → the recipient `role_grant_offer_accept`s → a role_grant lands.
18
+ *
19
+ * The single-request gate/denial matrix (grantability refusal, admin-only
20
+ * conferral, dispatcher admin gate, auth) lives in the declarative table
21
+ * (`conformance_participation_cases.ts`) — keep new single-request assertions
22
+ * there; this suite is only for flows the table cannot carry.
23
+ *
24
+ * The `participant` role is registered admin-grantable on both spines
25
+ * (`spine_roles` / the Rust stub's `RoleRegistry`), so the suite is ungated;
26
+ * every spine mounts the standard RPC surface it drives.
27
+ *
28
+ * `$lib`-free by contract (relative specifiers only), like the sibling
29
+ * cross-backend suites.
30
+ *
31
+ * @module
32
+ */
33
+ import { describe, test, assert } from 'vitest';
34
+ import { rpc_call } from '../rpc_helpers.js';
35
+ import { SPINE_PARTICIPANT_ROLE, SPINE_RPC_PATH } from './spine_surface_constants.js';
36
+ export const describe_role_grant_participation_cross_tests = (options) => {
37
+ const { setup_test } = options;
38
+ const rpc_path = options.rpc_path ?? SPINE_RPC_PATH;
39
+ const rpc = (transport, method, params, headers) => rpc_call({ app: transport, path: rpc_path, method, params, headers });
40
+ describe('role-gated participation conferral (success paths)', () => {
41
+ test('admin assigns the participant app-role to a fresh account (idempotent)', async () => {
42
+ const fixture = await setup_test();
43
+ const recipient = await fixture.create_account({ username: 'participation_assignee' });
44
+ // The keeper holds ROLE_ADMIN (seeded via extra_keeper_roles), so it
45
+ // clears the dispatcher admin gate; `participant` is admin-grantable, so
46
+ // it clears the grant-path gate; the recipient is single-actor, so the
47
+ // target actor resolves without `to_actor_id`.
48
+ const first = await rpc(fixture.transport, 'role_grant_assign', { to_account_id: recipient.account.id, role: SPINE_PARTICIPANT_ROLE }, fixture.create_session_headers());
49
+ assert.ok(first.ok, `assign must succeed: ${JSON.stringify(first)}`);
50
+ const assigned = first.result;
51
+ assert.strictEqual(assigned.ok, true);
52
+ assert.ok(typeof assigned.role_grant_id === 'string' && assigned.role_grant_id.length > 0, 'assign returns the new role_grant id');
53
+ // Idempotent — re-assigning the active grant returns the existing id.
54
+ const second = await rpc(fixture.transport, 'role_grant_assign', { to_account_id: recipient.account.id, role: SPINE_PARTICIPANT_ROLE }, fixture.create_session_headers());
55
+ assert.ok(second.ok, `re-assign must succeed: ${JSON.stringify(second)}`);
56
+ assert.strictEqual(second.result.role_grant_id, assigned.role_grant_id, 're-assigning an active grant returns the existing role_grant id');
57
+ });
58
+ test('admin offers the participant app-role and the recipient accepts', async () => {
59
+ const fixture = await setup_test();
60
+ const recipient = await fixture.create_account({ username: 'participation_offeree' });
61
+ // Admin-only conferral via the consent flow: the keeper (admin) offers
62
+ // the app-role, proving the widened grant-path gate admits it through
63
+ // the offer path too.
64
+ const created = await rpc(fixture.transport, 'role_grant_offer_create', { to_account_id: recipient.account.id, role: SPINE_PARTICIPANT_ROLE }, fixture.create_session_headers());
65
+ assert.ok(created.ok, `offer create must succeed: ${JSON.stringify(created)}`);
66
+ const offer_id = created.result.offer.id;
67
+ // The recipient accepts → a role_grant lands.
68
+ const accepted = await rpc(fixture.fresh_transport(), 'role_grant_offer_accept', { offer_id }, recipient.create_session_headers());
69
+ assert.ok(accepted.ok, `accept must succeed: ${JSON.stringify(accepted)}`);
70
+ assert.ok(typeof accepted.result.role_grant_id === 'string', 'accept lands a role_grant for the app-role');
71
+ });
72
+ });
73
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"rust_spine_stub_backend_config.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/rust_spine_stub_backend_config.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAuC9B,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AASvD,uGAAuG;AACvG,eAAO,MAAM,uBAAuB,oCAAoC,CAAC;AAEzE;;;;;GAKG;AACH,eAAO,MAAM,wCAAwC,6CAA6C,CAAC;AAenG,kGAAkG;AAClG,eAAO,MAAM,4BAA4B,OAAO,CAAC;AAEjD,0FAA0F;AAC1F,eAAO,MAAM,oCAAoC,sDACG,CAAC;AAErD,MAAM,WAAW,6BAA6B;IAC7C,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,+EAA+E;IAC/E,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;;;;OAOG;IACH,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAC3C;;;;;;OAMG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CAClC;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,8BAA8B,GAC1C,UAAS,6BAAkC,KACzC,aAiDF,CAAC"}
1
+ {"version":3,"file":"rust_spine_stub_backend_config.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/rust_spine_stub_backend_config.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAuC9B,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AASvD,uGAAuG;AACvG,eAAO,MAAM,uBAAuB,oCAAoC,CAAC;AAEzE;;;;;GAKG;AACH,eAAO,MAAM,wCAAwC,6CAA6C,CAAC;AAkBnG,kGAAkG;AAClG,eAAO,MAAM,4BAA4B,OAAO,CAAC;AAEjD,0FAA0F;AAC1F,eAAO,MAAM,oCAAoC,sDACG,CAAC;AAErD,MAAM,WAAW,6BAA6B;IAC7C,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,+EAA+E;IAC/E,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;;;;OAOG;IACH,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAC3C;;;;;;OAMG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CAClC;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,8BAA8B,GAC1C,UAAS,6BAAkC,KACzC,aAiDF,CAAC"}
@@ -49,14 +49,17 @@ export const RUST_SPINE_STUB_EXPECTED_SCHEMA_PATH_ENV = 'FUZ_RUST_SPINE_STUB_EXP
49
49
  /**
50
50
  * Capabilities for the Rust `testing_spine_stub` — `rust_default_capabilities`
51
51
  * plus `sse` (the stub serves `GET /api/admin/audit/stream` over the spine
52
- * `fuz_realtime::SseRegistry` + audit listener) and `ready` (it live-mounts
53
- * `/ready` over the env-supplied fixture path). Named (not inline) so every
54
- * spine preset is greppable, mirroring `ts_spine_capabilities`.
52
+ * `fuz_realtime::SseRegistry` + audit listener), `ready` (it live-mounts
53
+ * `/ready` over the env-supplied fixture path), and `cell_gated_create` (it
54
+ * mounts the `TestCellGatedCreateAuthorize` policy on its cell layer). Named
55
+ * (not inline) so every spine preset is greppable, mirroring
56
+ * `ts_spine_capabilities`.
55
57
  */
56
58
  const rust_spine_stub_capabilities = Object.freeze({
57
59
  ...rust_default_capabilities,
58
60
  sse: true,
59
61
  ready: true,
62
+ cell_gated_create: true,
60
63
  });
61
64
  /** Default listening port — slots beside zzz's 1175/1176; matches the binary's `DEFAULT_PORT`. */
62
65
  export const RUST_SPINE_STUB_DEFAULT_PORT = 1177;
@@ -32,6 +32,18 @@ export declare const SPINE_SSE_PATH = "/api/admin/audit/stream";
32
32
  * Rust `testing_spine_stub`'s `known_roles` (cross-language test contract).
33
33
  */
34
34
  export declare const SPINE_CELL_EDITOR_ROLE = "cell_editor";
35
+ /**
36
+ * Admin-grantable app role the role-gated-participation cross suite exercises.
37
+ * Registered with `grant_paths: ['admin']` so it enters the admin grant flow —
38
+ * the cross-backend proof that an app-defined role is conferrable (offer /
39
+ * `role_grant_assign`) admin-only on **both** spines. Must match the
40
+ * `participant` entry in the Rust `testing_spine_stub`'s `RoleRegistry`
41
+ * **and** its `known_roles` (the registry feeds the cell vocabulary too) — a
42
+ * cross-language test contract. Distinct from `SPINE_CELL_EDITOR_ROLE`
43
+ * (no grant path): this one is the *grantable* role, that one is the
44
+ * bootstrap-seed-only cell role.
45
+ */
46
+ export declare const SPINE_PARTICIPANT_ROLE = "participant";
35
47
  /**
36
48
  * Committed expected-schema fixture for the spine `/ready` deploy gate — the
37
49
  * column map a fresh full spine bootstrap (auth + cell + cell_history + fact)
@@ -1 +1 @@
1
- {"version":3,"file":"spine_surface_constants.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/spine_surface_constants.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;GAcG;AAEH,iEAAiE;AACjE,eAAO,MAAM,cAAc,aAAa,CAAC;AAEzC;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,4BAA4B,CAAC;AAExD;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,gBAAgB,CAAC;AAEpD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,yBAAyB,EAAE,GAAwD,CAAC"}
1
+ {"version":3,"file":"spine_surface_constants.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/spine_surface_constants.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;GAcG;AAEH,iEAAiE;AACjE,eAAO,MAAM,cAAc,aAAa,CAAC;AAEzC;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,4BAA4B,CAAC;AAExD;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,gBAAgB,CAAC;AAEpD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,gBAAgB,CAAC;AAEpD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,yBAAyB,EAAE,GAAwD,CAAC"}
@@ -32,6 +32,18 @@ export const SPINE_SSE_PATH = '/api/admin/audit/stream';
32
32
  * Rust `testing_spine_stub`'s `known_roles` (cross-language test contract).
33
33
  */
34
34
  export const SPINE_CELL_EDITOR_ROLE = 'cell_editor';
35
+ /**
36
+ * Admin-grantable app role the role-gated-participation cross suite exercises.
37
+ * Registered with `grant_paths: ['admin']` so it enters the admin grant flow —
38
+ * the cross-backend proof that an app-defined role is conferrable (offer /
39
+ * `role_grant_assign`) admin-only on **both** spines. Must match the
40
+ * `participant` entry in the Rust `testing_spine_stub`'s `RoleRegistry`
41
+ * **and** its `known_roles` (the registry feeds the cell vocabulary too) — a
42
+ * cross-language test contract. Distinct from `SPINE_CELL_EDITOR_ROLE`
43
+ * (no grant path): this one is the *grantable* role, that one is the
44
+ * bootstrap-seed-only cell role.
45
+ */
46
+ export const SPINE_PARTICIPANT_ROLE = 'participant';
35
47
  /**
36
48
  * Committed expected-schema fixture for the spine `/ready` deploy gate — the
37
49
  * column map a fresh full spine bootstrap (auth + cell + cell_history + fact)
@@ -0,0 +1,17 @@
1
+ import '../assert_dev_env.js';
2
+ import type { CellCreateAuthorize } from '../../auth/cell_actions.js';
3
+ /** The single kind the test policy gates (shared with the driving suite). */
4
+ export declare const GATED_CELL_KIND = "gated";
5
+ /**
6
+ * The app-role that unlocks creating the gated kind (besides admin) — the
7
+ * `participant` role both reference spines register. Mirrors the Rust policy's
8
+ * `"participant"` literal.
9
+ */
10
+ export declare const GATED_CELL_ROLE = "participant";
11
+ /**
12
+ * Allow unless the cell's `kind` is `'gated'`, in which case the actor must
13
+ * hold the `participant` role or be a (scope-agnostic) admin. Mirrors the Rust
14
+ * `TestCellGatedCreateAuthorize` exactly.
15
+ */
16
+ export declare const test_cell_gated_create_authorize: CellCreateAuthorize;
17
+ //# sourceMappingURL=test_cell_gated_create_authorize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_cell_gated_create_authorize.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/test_cell_gated_create_authorize.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAuB9B,OAAO,KAAK,EAAC,mBAAmB,EAA2B,MAAM,4BAA4B,CAAC;AAG9F,6EAA6E;AAC7E,eAAO,MAAM,eAAe,UAAU,CAAC;AAEvC;;;;GAIG;AACH,eAAO,MAAM,eAAe,gBAAyB,CAAC;AAEtD;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,EAAE,mBAIiD,CAAC"}
@@ -0,0 +1,36 @@
1
+ import '../assert_dev_env.js';
2
+ /**
3
+ * Test `CellCreateAuthorize` policy mounted on **both** reference spines — the
4
+ * TS spine binary's full mount (`full_spine_mount.ts`) and the Rust
5
+ * `testing_spine_stub` — so the cross-backend `cell_gated_create` suite proves
6
+ * the cell-creation authorizer agrees TS↔Rust. The twin of the Rust
7
+ * `TestCellGatedCreateAuthorize`.
8
+ *
9
+ * The policy gates exactly one kind: creating a `kind: 'gated'` cell requires
10
+ * the `participant` app-role (registered on both spines, `grant_paths:
11
+ * ['admin']`) or admin. Every other kind — and a typeless cell — is open, so
12
+ * the existing cell suites (which use `note` / `collection` kinds) are
13
+ * unaffected, exactly as on the Rust stub.
14
+ *
15
+ * **`$lib`-free by contract** — reached by the spawned TS spine binary under
16
+ * Gro's loader (no `$lib` alias). Keep every import relative.
17
+ *
18
+ * @module
19
+ */
20
+ import { has_role } from '../../auth/request_context.js';
21
+ import { ROLE_ADMIN } from '../../auth/role_schema.js';
22
+ import { SPINE_PARTICIPANT_ROLE } from './spine_surface_constants.js';
23
+ /** The single kind the test policy gates (shared with the driving suite). */
24
+ export const GATED_CELL_KIND = 'gated';
25
+ /**
26
+ * The app-role that unlocks creating the gated kind (besides admin) — the
27
+ * `participant` role both reference spines register. Mirrors the Rust policy's
28
+ * `"participant"` literal.
29
+ */
30
+ export const GATED_CELL_ROLE = SPINE_PARTICIPANT_ROLE;
31
+ /**
32
+ * Allow unless the cell's `kind` is `'gated'`, in which case the actor must
33
+ * hold the `participant` role or be a (scope-agnostic) admin. Mirrors the Rust
34
+ * `TestCellGatedCreateAuthorize` exactly.
35
+ */
36
+ export const test_cell_gated_create_authorize = (auth, input) => input.kind !== GATED_CELL_KIND || has_role(auth, GATED_CELL_ROLE) || has_role(auth, ROLE_ADMIN);
@@ -1 +1 @@
1
- {"version":3,"file":"ts_spine_backend_config.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/ts_spine_backend_config.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AASvD,8GAA8G;AAC9G,eAAO,MAAM,gBAAgB,6BAA6B,CAAC;AA+B3D,6FAA6F;AAC7F,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAE/C,iDAAiD;AACjD,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAE/C,gDAAgD;AAChD,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,yDAAyD;AACzD,eAAO,MAAM,mBAAmB,wDAAwD,CAAC;AAEzF,yDAAyD;AACzD,eAAO,MAAM,mBAAmB,wDAAwD,CAAC;AAEzF,wDAAwD;AACxD,eAAO,MAAM,kBAAkB,uDAAuD,CAAC;AAEvF,MAAM,WAAW,2BAA2B;IAC3C,mFAAmF;IACnF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,8DAA8D;IAC9D,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;;;;;OASG;IACH,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,CAAC;CAC3C;AAWD;;;GAGG;AACH,eAAO,MAAM,4BAA4B,GACxC,UAAS,2BAAgC,KACvC,aAmBF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,GACvC,UAAS,2BAAgC,KACvC,aAmBF,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,4BAA4B,GACxC,UAAS,2BAAgC,KACvC,aAgCF,CAAC"}
1
+ {"version":3,"file":"ts_spine_backend_config.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/ts_spine_backend_config.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AASvD,8GAA8G;AAC9G,eAAO,MAAM,gBAAgB,6BAA6B,CAAC;AAkC3D,6FAA6F;AAC7F,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAE/C,iDAAiD;AACjD,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAE/C,gDAAgD;AAChD,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,yDAAyD;AACzD,eAAO,MAAM,mBAAmB,wDAAwD,CAAC;AAEzF,yDAAyD;AACzD,eAAO,MAAM,mBAAmB,wDAAwD,CAAC;AAEzF,wDAAwD;AACxD,eAAO,MAAM,kBAAkB,uDAAuD,CAAC;AAEvF,MAAM,WAAW,2BAA2B;IAC3C,mFAAmF;IACnF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,8DAA8D;IAC9D,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;;;;;OASG;IACH,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,CAAC;CAC3C;AAWD;;;GAGG;AACH,eAAO,MAAM,4BAA4B,GACxC,UAAS,2BAAgC,KACvC,aAmBF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,GACvC,UAAS,2BAAgC,KACvC,aAmBF,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,4BAA4B,GACxC,UAAS,2BAAgC,KACvC,aAgCF,CAAC"}
@@ -7,14 +7,17 @@ export const TS_SPINE_DIR_ENV = 'FUZ_TESTING_TS_SPINE_DIR';
7
7
  /**
8
8
  * Capabilities for the TS spine binary — `ts_default_capabilities` plus `sse`
9
9
  * (the binary wires `audit_log_sse`), `ready` (the binary live-mounts the
10
- * `/ready` deploy gate in `build_spine_app`), and `peer_request` (the backend
11
- * WS transport's `request_connection` path drives server→client `peer/ping`).
10
+ * `/ready` deploy gate in `build_spine_app`), `peer_request` (the backend
11
+ * WS transport's `request_connection` path drives server→client `peer/ping`),
12
+ * and `cell_gated_create` (the binary's `full_spine_mount` mounts the
13
+ * `test_cell_gated_create_authorize` policy).
12
14
  */
13
15
  const ts_spine_capabilities = Object.freeze({
14
16
  ...ts_default_capabilities,
15
17
  sse: true,
16
18
  ready: true,
17
19
  peer_request: true,
20
+ cell_gated_create: true,
18
21
  });
19
22
  /**
20
23
  * Capabilities for the **Bun** spine binary — `ts_spine_capabilities` with
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fuzdev/fuz_app",
3
- "version": "0.101.1",
3
+ "version": "0.103.0",
4
4
  "description": "fullstack app library",
5
5
  "glyph": "🗝",
6
6
  "logo": "logo.svg",