@astrale-os/shell-react 0.4.0-beta.16 → 0.4.0-beta.18

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.
@@ -1,5 +1,7 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
- import { createContext, useContext, useEffect, useMemo, useState } from 'react';
2
+ import { createContext, useContext, useEffect, useState } from 'react';
3
+ import { GraphContext } from '../graph/graph.context.js';
4
+ import { resolveGraphStoreScope, retainStore, storeFor } from '../graph/store.js';
3
5
  import { ShellContext } from '../session/session.context.js';
4
6
  export const IdentityContext = createContext(null);
5
7
  IdentityContext.displayName = 'AstraleIdentityContext';
@@ -19,22 +21,34 @@ export function ActAs({ client, fallback, children }) {
19
21
  const [state, setState] = useState({ status: 'pending' });
20
22
  useEffect(() => {
21
23
  let active = true;
24
+ let release;
22
25
  setState({ status: 'pending' });
23
- void client.auth.whoami().then((self) => {
24
- if (active)
25
- setState({ status: 'ready', self });
26
- }, (error) => {
27
- if (active)
28
- setState({ status: 'failed', error });
29
- });
26
+ void (async () => {
27
+ try {
28
+ const self = await client.auth.whoami();
29
+ if (!active)
30
+ return;
31
+ const scope = await resolveGraphStoreScope(client, self);
32
+ if (!active)
33
+ return;
34
+ const entry = storeFor(client, scope);
35
+ release = retainStore(entry);
36
+ setState({ status: 'ready', binding: { kernel: client, self }, store: entry.store });
37
+ }
38
+ catch (error) {
39
+ if (active)
40
+ setState({ status: 'failed', client, error });
41
+ }
42
+ })();
30
43
  return () => {
31
44
  active = false;
45
+ release?.();
32
46
  };
33
47
  }, [client]);
34
- const value = useMemo(() => (state.status === 'ready' ? { kernel: client, self: state.self } : null), [client, state]);
35
- if (state.status === 'failed')
48
+ if (state.status === 'failed' && state.client === client)
36
49
  throw state.error;
37
- if (value === null)
50
+ if (state.status !== 'ready' || state.binding.kernel !== client) {
38
51
  return fallback === undefined ? null : _jsx(_Fragment, { children: fallback });
39
- return _jsx(IdentityContext.Provider, { value: value, children: children });
52
+ }
53
+ return (_jsx(IdentityContext.Provider, { value: state.binding, children: _jsx(GraphContext.Provider, { value: state.store, children: children }) }));
40
54
  }
@@ -183,7 +183,7 @@ function combine(snapshots) {
183
183
  return 'ready';
184
184
  }
185
185
  function stableIdentity(value) {
186
- const seen = new WeakSet();
186
+ const ancestors = new WeakSet();
187
187
  const encode = (input) => {
188
188
  if (input === null)
189
189
  return ['null'];
@@ -198,17 +198,22 @@ function stableIdentity(value) {
198
198
  }
199
199
  return [typeof input, input];
200
200
  }
201
- if (seen.has(input))
201
+ if (ancestors.has(input))
202
202
  throw new TypeError('Query input cannot contain cycles.');
203
- seen.add(input);
204
- if (Array.isArray(input))
205
- return ['array', input.map(encode)];
206
- return [
207
- 'object',
208
- Object.fromEntries(Object.keys(input)
209
- .sort()
210
- .map((key) => [key, encode(input[key])])),
211
- ];
203
+ ancestors.add(input);
204
+ try {
205
+ if (Array.isArray(input))
206
+ return ['array', input.map(encode)];
207
+ return [
208
+ 'object',
209
+ Object.fromEntries(Object.keys(input)
210
+ .sort()
211
+ .map((key) => [key, encode(input[key])])),
212
+ ];
213
+ }
214
+ finally {
215
+ ancestors.delete(input);
216
+ }
212
217
  };
213
218
  return JSON.stringify(encode(value));
214
219
  }
@@ -227,19 +227,27 @@ export function retainRefreshScheduler(store, identity, refresh, interval, when)
227
227
  };
228
228
  }
229
229
  function schedulePoll(scheduler, immediate = false) {
230
- if (scheduler.timer !== undefined)
231
- clearTimeout(scheduler.timer);
232
230
  const subscribers = [...scheduler.subscribers.values()];
233
231
  if (subscribers.length === 0)
234
232
  return;
235
233
  const interval = Math.min(...subscribers.map((subscriber) => subscriber.interval));
234
+ const delay = immediate ? 0 : interval;
235
+ const dueAt = Date.now() + delay;
236
+ // Observer changes may advance a refresh, but must not postpone pending work.
237
+ if (scheduler.timer !== undefined) {
238
+ if (scheduler.dueAt !== undefined && scheduler.dueAt <= dueAt)
239
+ return;
240
+ clearTimeout(scheduler.timer);
241
+ }
242
+ scheduler.dueAt = dueAt;
236
243
  scheduler.timer = setTimeout(() => {
237
244
  scheduler.timer = undefined;
245
+ scheduler.dueAt = undefined;
238
246
  const visible = typeof document === 'undefined' || document.visibilityState !== 'hidden';
239
247
  const eligible = [...scheduler.subscribers.values()].filter((subscriber) => subscriber.when === 'always' || visible);
240
248
  eligible.forEach((subscriber) => void subscriber.refresh().catch(() => { }));
241
249
  schedulePoll(scheduler);
242
- }, immediate ? 0 : interval);
250
+ }, delay);
243
251
  }
244
252
  function positivePage(input) {
245
253
  if (!Number.isSafeInteger(input) || input < 1) {
@@ -1,8 +1,8 @@
1
1
  import type { GraphApi } from '@astrale-os/sdk/client';
2
2
  import type { GraphStore as GraphStoreValue } from '@astrale-os/sdk/client/store';
3
- import type { Shell } from '@astrale-os/shell';
3
+ import type { KernelClient } from '@astrale-os/shell';
4
4
  interface StoreEntry {
5
- readonly shell: Shell;
5
+ readonly client: KernelClient;
6
6
  readonly graph: GraphApi;
7
7
  readonly scope: string;
8
8
  readonly store: GraphStoreValue;
@@ -15,9 +15,9 @@ export interface GraphStoreScope {
15
15
  readonly authority: string;
16
16
  readonly schemaRevision: string;
17
17
  }
18
- type StoreIdentity = Awaited<ReturnType<Shell['kernel']['auth']['whoami']>>;
19
- export declare function resolveGraphStoreScope(shell: Shell, knownIdentity?: StoreIdentity | null): Promise<GraphStoreScope>;
20
- export declare function storeFor(shell: Shell, scope: GraphStoreScope): StoreEntry;
18
+ type StoreIdentity = Awaited<ReturnType<KernelClient['auth']['whoami']>>;
19
+ export declare function resolveGraphStoreScope(client: KernelClient, knownIdentity?: StoreIdentity | null): Promise<GraphStoreScope>;
20
+ export declare function storeFor(client: KernelClient, scope: GraphStoreScope): StoreEntry;
21
21
  export declare function retainStore(entry: StoreEntry): () => void;
22
22
  /** The exact caller/schema-scoped GraphStore for the current View subtree. */
23
23
  export declare function useGraphStore(): GraphStoreValue;
@@ -2,39 +2,39 @@ import { GraphStore } from '@astrale-os/sdk/client/store';
2
2
  import { useContext } from 'react';
3
3
  import { GraphContext } from './graph.context.js';
4
4
  const entries = new WeakMap();
5
- export async function resolveGraphStoreScope(shell, knownIdentity) {
5
+ export async function resolveGraphStoreScope(client, knownIdentity) {
6
6
  const [identity, snapshot] = await Promise.all([
7
7
  knownIdentity === undefined
8
- ? shell.kernel.auth.whoami().catch(() => null)
8
+ ? client.auth.whoami().catch(() => null)
9
9
  : Promise.resolve(knownIdentity),
10
- shell.kernel.snapshot(),
10
+ client.snapshot(),
11
11
  ]);
12
12
  return Object.freeze({
13
13
  authority: identity === null ? 'anonymous' : `${identity.iss}\u0000${identity.sub}\u0000${identity.id}`,
14
14
  schemaRevision: snapshot.publication.schema.revision,
15
15
  });
16
16
  }
17
- export function storeFor(shell, scope) {
18
- const current = entries.get(shell);
17
+ export function storeFor(client, scope) {
18
+ const current = entries.get(client);
19
19
  const scopeKey = `${scope.authority}\u0000${scope.schemaRevision}`;
20
- if (current !== undefined && current.graph === shell.kernel.graph && current.scope === scopeKey) {
20
+ if (current !== undefined && current.graph === client.graph && current.scope === scopeKey) {
21
21
  return current;
22
22
  }
23
- const supplied = shell.kernel.store;
23
+ const supplied = client.store;
24
24
  const created = {
25
- shell,
26
- graph: shell.kernel.graph,
25
+ client,
26
+ graph: client.graph,
27
27
  scope: scopeKey,
28
28
  // A supplied Store is trusted only for the KernelClient's first declared scope. A later
29
29
  // authority/revision/GraphApi replacement gets a new Store and cannot inherit old memory.
30
30
  store: current === undefined && supplied !== undefined
31
31
  ? supplied
32
- : new GraphStore({ graph: shell.kernel.graph }),
32
+ : new GraphStore({ graph: client.graph }),
33
33
  owned: current !== undefined || supplied === undefined,
34
34
  retained: 0,
35
35
  generation: 0,
36
36
  };
37
- entries.set(shell, created);
37
+ entries.set(client, created);
38
38
  if (current !== undefined && current.retained === 0 && current.owned)
39
39
  current.store.close();
40
40
  return created;
@@ -52,8 +52,8 @@ export function retainStore(entry) {
52
52
  queueMicrotask(() => {
53
53
  if (entry.retained !== 0 || entry.generation !== generation || !entry.owned)
54
54
  return;
55
- if (entries.get(entry.shell) === entry)
56
- entries.delete(entry.shell);
55
+ if (entries.get(entry.client) === entry)
56
+ entries.delete(entry.client);
57
57
  entry.store.close();
58
58
  });
59
59
  };
@@ -2,9 +2,9 @@ import type { SessionRequestOptions } from '@astrale-os/sdk/client/session';
2
2
  import type { NodeId } from '@astrale-os/sdk/graph/node';
3
3
  import type { QueryAST, QueryDefinition } from '@astrale-os/sdk/query';
4
4
  import type { Domain } from '@astrale-os/sdk/schema';
5
- import type { CallableInputOf, CallableResultOf, ClassKey, ResolvedFunction, ResolvedMethod } from '@astrale-os/sdk/schema';
6
- type InstanceMethod = ResolvedMethod<unknown, unknown, false, false>;
7
- type StaticMethod = ResolvedMethod<unknown, unknown, true, false>;
5
+ import type { CallableInputOf, CallableResultOf, ClassKey, ResolvedFunction, ExecutableMethod } from '@astrale-os/sdk/schema';
6
+ type InstanceMethod = ExecutableMethod<unknown, unknown, false>;
7
+ type StaticMethod = ExecutableMethod<unknown, unknown, true>;
8
8
  type Callable = ResolvedFunction | InstanceMethod | StaticMethod;
9
9
  /** Receiver identity with optional observed Class for early rejection; the Kernel checks live Class. */
10
10
  export interface ActionReceiver {
@@ -45,10 +45,10 @@ export function ShellProvider(props) {
45
45
  await primeUser(shell);
46
46
  if (generation !== ref.generation)
47
47
  return;
48
- const storeScope = await resolveGraphStoreScope(shell, self);
48
+ const storeScope = await resolveGraphStoreScope(shell.kernel, self);
49
49
  if (generation !== ref.generation)
50
50
  return;
51
- const graph = storeFor(shell, storeScope);
51
+ const graph = storeFor(shell.kernel, storeScope);
52
52
  dispatch({
53
53
  type: 'ready',
54
54
  runtime: { shell, self, storeScope, store: graph.store, ownsStore: graph.owned },
@@ -105,7 +105,7 @@ export function ShellProvider(props) {
105
105
  useEffect(() => {
106
106
  if (shell === null || store === null || storeScope === null)
107
107
  return;
108
- return retainStore(storeFor(shell, storeScope));
108
+ return retainStore(storeFor(shell.kernel, storeScope));
109
109
  }, [shell, store, storeScope]);
110
110
  if (state.status === 'error') {
111
111
  if (errorFallback !== undefined)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astrale-os/shell-react",
3
- "version": "0.4.0-beta.16",
3
+ "version": "0.4.0-beta.18",
4
4
  "description": "Astrale shell-react — the React face of the shell (provider, hooks, view components)",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -31,7 +31,7 @@
31
31
  "zod": "4.4.3"
32
32
  },
33
33
  "devDependencies": {
34
- "@astrale-os/sdk": "0.5.0-beta.128",
34
+ "@astrale-os/sdk": "0.5.0-beta.136",
35
35
  "@testing-library/dom": "^10.4.0",
36
36
  "@testing-library/react": "^16.3.0",
37
37
  "@types/node": "^26.2.0",
@@ -46,7 +46,7 @@
46
46
  "vitest": "4.1.10"
47
47
  },
48
48
  "peerDependencies": {
49
- "@astrale-os/sdk": ">=0.5.0-beta.123 <1.0.0",
49
+ "@astrale-os/sdk": ">=0.5.0-beta.136 <1.0.0",
50
50
  "react": ">=18",
51
51
  "react-dom": ">=18"
52
52
  },
@@ -2,8 +2,10 @@ import type { Identity } from '@astrale-os/sdk/auth'
2
2
  import type { KernelClient } from '@astrale-os/shell'
3
3
  import type { ReactElement, ReactNode } from 'react'
4
4
 
5
- import { createContext, useContext, useEffect, useMemo, useState } from 'react'
5
+ import { createContext, useContext, useEffect, useState } from 'react'
6
6
 
7
+ import { GraphContext } from '../graph/graph.context.js'
8
+ import { resolveGraphStoreScope, retainStore, storeFor } from '../graph/store.js'
7
9
  import { ShellContext } from '../session/session.context.js'
8
10
 
9
11
  export type NodeValue = Identity
@@ -40,31 +42,44 @@ export interface ActAsProps {
40
42
  export function ActAs({ client, fallback, children }: ActAsProps): ReactElement | null {
41
43
  const [state, setState] = useState<
42
44
  | { readonly status: 'pending' }
43
- | { readonly status: 'ready'; readonly self: Identity }
44
- | { readonly status: 'failed'; readonly error: unknown }
45
+ | {
46
+ readonly status: 'ready'
47
+ readonly binding: IdentityBinding
48
+ readonly store: ReturnType<typeof storeFor>['store']
49
+ }
50
+ | { readonly status: 'failed'; readonly client: KernelClient; readonly error: unknown }
45
51
  >({ status: 'pending' })
46
52
 
47
53
  useEffect(() => {
48
54
  let active = true
55
+ let release: (() => void) | undefined
49
56
  setState({ status: 'pending' })
50
- void client.auth.whoami().then(
51
- (self) => {
52
- if (active) setState({ status: 'ready', self })
53
- },
54
- (error: unknown) => {
55
- if (active) setState({ status: 'failed', error })
56
- },
57
- )
57
+ void (async () => {
58
+ try {
59
+ const self = await client.auth.whoami()
60
+ if (!active) return
61
+ const scope = await resolveGraphStoreScope(client, self)
62
+ if (!active) return
63
+ const entry = storeFor(client, scope)
64
+ release = retainStore(entry)
65
+ setState({ status: 'ready', binding: { kernel: client, self }, store: entry.store })
66
+ } catch (error) {
67
+ if (active) setState({ status: 'failed', client, error })
68
+ }
69
+ })()
58
70
  return () => {
59
71
  active = false
72
+ release?.()
60
73
  }
61
74
  }, [client])
62
75
 
63
- const value = useMemo<IdentityBinding | null>(
64
- () => (state.status === 'ready' ? { kernel: client, self: state.self } : null),
65
- [client, state],
76
+ if (state.status === 'failed' && state.client === client) throw state.error
77
+ if (state.status !== 'ready' || state.binding.kernel !== client) {
78
+ return fallback === undefined ? null : <>{fallback}</>
79
+ }
80
+ return (
81
+ <IdentityContext.Provider value={state.binding}>
82
+ <GraphContext.Provider value={state.store}>{children}</GraphContext.Provider>
83
+ </IdentityContext.Provider>
66
84
  )
67
- if (state.status === 'failed') throw state.error
68
- if (value === null) return fallback === undefined ? null : <>{fallback}</>
69
- return <IdentityContext.Provider value={value}>{children}</IdentityContext.Provider>
70
85
  }
@@ -251,7 +251,7 @@ function combine(snapshots: readonly StoreSnapshot[]): GraphResourceState {
251
251
  }
252
252
 
253
253
  function stableIdentity(value: unknown): string {
254
- const seen = new WeakSet<object>()
254
+ const ancestors = new WeakSet<object>()
255
255
  const encode = (input: unknown): unknown => {
256
256
  if (input === null) return ['null']
257
257
  if (typeof input !== 'object') {
@@ -264,17 +264,21 @@ function stableIdentity(value: unknown): string {
264
264
  }
265
265
  return [typeof input, input]
266
266
  }
267
- if (seen.has(input)) throw new TypeError('Query input cannot contain cycles.')
268
- seen.add(input)
269
- if (Array.isArray(input)) return ['array', input.map(encode)]
270
- return [
271
- 'object',
272
- Object.fromEntries(
273
- Object.keys(input as Record<string, unknown>)
274
- .sort()
275
- .map((key) => [key, encode((input as Record<string, unknown>)[key])]),
276
- ),
277
- ]
267
+ if (ancestors.has(input)) throw new TypeError('Query input cannot contain cycles.')
268
+ ancestors.add(input)
269
+ try {
270
+ if (Array.isArray(input)) return ['array', input.map(encode)]
271
+ return [
272
+ 'object',
273
+ Object.fromEntries(
274
+ Object.keys(input as Record<string, unknown>)
275
+ .sort()
276
+ .map((key) => [key, encode((input as Record<string, unknown>)[key])]),
277
+ ),
278
+ ]
279
+ } finally {
280
+ ancestors.delete(input)
281
+ }
278
282
  }
279
283
  return JSON.stringify(encode(value))
280
284
  }
@@ -176,6 +176,7 @@ interface PollSubscriber {
176
176
  interface PollScheduler {
177
177
  readonly subscribers: Map<symbol, PollSubscriber>
178
178
  timer: ReturnType<typeof setTimeout> | undefined
179
+ dueAt?: number
179
180
  onVisibility?: () => void
180
181
  }
181
182
 
@@ -344,22 +345,27 @@ export function retainRefreshScheduler(
344
345
  }
345
346
 
346
347
  function schedulePoll(scheduler: PollScheduler, immediate = false): void {
347
- if (scheduler.timer !== undefined) clearTimeout(scheduler.timer)
348
348
  const subscribers = [...scheduler.subscribers.values()]
349
349
  if (subscribers.length === 0) return
350
350
  const interval = Math.min(...subscribers.map((subscriber) => subscriber.interval))
351
- scheduler.timer = setTimeout(
352
- () => {
353
- scheduler.timer = undefined
354
- const visible = typeof document === 'undefined' || document.visibilityState !== 'hidden'
355
- const eligible = [...scheduler.subscribers.values()].filter(
356
- (subscriber) => subscriber.when === 'always' || visible,
357
- )
358
- eligible.forEach((subscriber) => void subscriber.refresh().catch(() => {}))
359
- schedulePoll(scheduler)
360
- },
361
- immediate ? 0 : interval,
362
- )
351
+ const delay = immediate ? 0 : interval
352
+ const dueAt = Date.now() + delay
353
+ // Observer changes may advance a refresh, but must not postpone pending work.
354
+ if (scheduler.timer !== undefined) {
355
+ if (scheduler.dueAt !== undefined && scheduler.dueAt <= dueAt) return
356
+ clearTimeout(scheduler.timer)
357
+ }
358
+ scheduler.dueAt = dueAt
359
+ scheduler.timer = setTimeout(() => {
360
+ scheduler.timer = undefined
361
+ scheduler.dueAt = undefined
362
+ const visible = typeof document === 'undefined' || document.visibilityState !== 'hidden'
363
+ const eligible = [...scheduler.subscribers.values()].filter(
364
+ (subscriber) => subscriber.when === 'always' || visible,
365
+ )
366
+ eligible.forEach((subscriber) => void subscriber.refresh().catch(() => {}))
367
+ schedulePoll(scheduler)
368
+ }, delay)
363
369
  }
364
370
 
365
371
  function positivePage(input: number): number {
@@ -1,6 +1,6 @@
1
1
  import type { GraphApi } from '@astrale-os/sdk/client'
2
2
  import type { GraphStore as GraphStoreValue } from '@astrale-os/sdk/client/store'
3
- import type { Shell } from '@astrale-os/shell'
3
+ import type { KernelClient } from '@astrale-os/shell'
4
4
 
5
5
  import { GraphStore } from '@astrale-os/sdk/client/store'
6
6
  import { useContext } from 'react'
@@ -8,7 +8,7 @@ import { useContext } from 'react'
8
8
  import { GraphContext } from './graph.context.js'
9
9
 
10
10
  interface StoreEntry {
11
- readonly shell: Shell
11
+ readonly client: KernelClient
12
12
  readonly graph: GraphApi
13
13
  readonly scope: string
14
14
  readonly store: GraphStoreValue
@@ -17,7 +17,7 @@ interface StoreEntry {
17
17
  generation: number
18
18
  }
19
19
 
20
- const entries = new WeakMap<Shell, StoreEntry>()
20
+ const entries = new WeakMap<KernelClient, StoreEntry>()
21
21
 
22
22
  /** Authority/schema identity. Session ids and Publication ETags are deliberately absent. */
23
23
  export interface GraphStoreScope {
@@ -25,17 +25,17 @@ export interface GraphStoreScope {
25
25
  readonly schemaRevision: string
26
26
  }
27
27
 
28
- type StoreIdentity = Awaited<ReturnType<Shell['kernel']['auth']['whoami']>>
28
+ type StoreIdentity = Awaited<ReturnType<KernelClient['auth']['whoami']>>
29
29
 
30
30
  export async function resolveGraphStoreScope(
31
- shell: Shell,
31
+ client: KernelClient,
32
32
  knownIdentity?: StoreIdentity | null,
33
33
  ): Promise<GraphStoreScope> {
34
34
  const [identity, snapshot] = await Promise.all([
35
35
  knownIdentity === undefined
36
- ? shell.kernel.auth.whoami().catch(() => null)
36
+ ? client.auth.whoami().catch(() => null)
37
37
  : Promise.resolve(knownIdentity),
38
- shell.kernel.snapshot(),
38
+ client.snapshot(),
39
39
  ])
40
40
  return Object.freeze({
41
41
  authority:
@@ -44,28 +44,28 @@ export async function resolveGraphStoreScope(
44
44
  })
45
45
  }
46
46
 
47
- export function storeFor(shell: Shell, scope: GraphStoreScope): StoreEntry {
48
- const current = entries.get(shell)
47
+ export function storeFor(client: KernelClient, scope: GraphStoreScope): StoreEntry {
48
+ const current = entries.get(client)
49
49
  const scopeKey = `${scope.authority}\u0000${scope.schemaRevision}`
50
- if (current !== undefined && current.graph === shell.kernel.graph && current.scope === scopeKey) {
50
+ if (current !== undefined && current.graph === client.graph && current.scope === scopeKey) {
51
51
  return current
52
52
  }
53
- const supplied = shell.kernel.store
53
+ const supplied = client.store
54
54
  const created: StoreEntry = {
55
- shell,
56
- graph: shell.kernel.graph,
55
+ client,
56
+ graph: client.graph,
57
57
  scope: scopeKey,
58
58
  // A supplied Store is trusted only for the KernelClient's first declared scope. A later
59
59
  // authority/revision/GraphApi replacement gets a new Store and cannot inherit old memory.
60
60
  store:
61
61
  current === undefined && supplied !== undefined
62
62
  ? supplied
63
- : new GraphStore({ graph: shell.kernel.graph }),
63
+ : new GraphStore({ graph: client.graph }),
64
64
  owned: current !== undefined || supplied === undefined,
65
65
  retained: 0,
66
66
  generation: 0,
67
67
  }
68
- entries.set(shell, created)
68
+ entries.set(client, created)
69
69
  if (current !== undefined && current.retained === 0 && current.owned) current.store.close()
70
70
  return created
71
71
  }
@@ -81,7 +81,7 @@ export function retainStore(entry: StoreEntry): () => void {
81
81
  const generation = ++entry.generation
82
82
  queueMicrotask(() => {
83
83
  if (entry.retained !== 0 || entry.generation !== generation || !entry.owned) return
84
- if (entries.get(entry.shell) === entry) entries.delete(entry.shell)
84
+ if (entries.get(entry.client) === entry) entries.delete(entry.client)
85
85
  entry.store.close()
86
86
  })
87
87
  }
@@ -7,7 +7,7 @@ import type {
7
7
  CallableResultOf,
8
8
  ClassKey,
9
9
  ResolvedFunction,
10
- ResolvedMethod,
10
+ ExecutableMethod,
11
11
  } from '@astrale-os/sdk/schema'
12
12
 
13
13
  import { reference } from '@astrale-os/sdk/client/session'
@@ -22,8 +22,8 @@ import { useAction as useAsyncAction } from '../graph/action.js'
22
22
  import { useGraphStore } from '../graph/store.js'
23
23
  import { bindingFor } from './domain.hook.js'
24
24
 
25
- type InstanceMethod = ResolvedMethod<unknown, unknown, false, false>
26
- type StaticMethod = ResolvedMethod<unknown, unknown, true, false>
25
+ type InstanceMethod = ExecutableMethod<unknown, unknown, false>
26
+ type StaticMethod = ExecutableMethod<unknown, unknown, true>
27
27
  type Callable = ResolvedFunction | InstanceMethod | StaticMethod
28
28
 
29
29
  /** Receiver identity with optional observed Class for early rejection; the Kernel checks live Class. */
@@ -61,9 +61,9 @@ export function ShellProvider(props: ShellProviderProps): ReactElement | null {
61
61
  if (generation !== ref.generation) return
62
62
  await primeUser(shell)
63
63
  if (generation !== ref.generation) return
64
- const storeScope = await resolveGraphStoreScope(shell, self)
64
+ const storeScope = await resolveGraphStoreScope(shell.kernel, self)
65
65
  if (generation !== ref.generation) return
66
- const graph = storeFor(shell, storeScope)
66
+ const graph = storeFor(shell.kernel, storeScope)
67
67
  dispatch({
68
68
  type: 'ready',
69
69
  runtime: { shell, self, storeScope, store: graph.store, ownsStore: graph.owned },
@@ -117,7 +117,7 @@ export function ShellProvider(props: ShellProviderProps): ReactElement | null {
117
117
  const storeScope = state.runtime?.storeScope ?? null
118
118
  useEffect(() => {
119
119
  if (shell === null || store === null || storeScope === null) return
120
- return retainStore(storeFor(shell, storeScope))
120
+ return retainStore(storeFor(shell.kernel, storeScope))
121
121
  }, [shell, store, storeScope])
122
122
 
123
123
  if (state.status === 'error') {
package/CHANGELOG.md DELETED
@@ -1,303 +0,0 @@
1
- # Changelog
2
-
3
- ## [0.4.0-beta.16](https://github.com/astrale-os/shell/compare/shell-react-v0.4.0-beta.15...shell-react-v0.4.0-beta.16) (2026-09-08)
4
-
5
-
6
- ### Bug Fixes
7
-
8
- * **domain:** infer public schema and class declarations ([#198](https://github.com/astrale-os/shell/issues/198)) ([d0741db](https://github.com/astrale-os/shell/commit/d0741db4c39c7144d2d93556edf253e277c6113b))
9
- * **domain:** publish compact inferred Kernel references ([#203](https://github.com/astrale-os/shell/issues/203)) ([ab2d0d9](https://github.com/astrale-os/shell/commit/ab2d0d9170ba7cd688f30cae6ece94b140d29ffd))
10
-
11
- ## [0.4.0-beta.15](https://github.com/astrale-os/shell/compare/shell-react-v0.4.0-beta.14...shell-react-v0.4.0-beta.15) (2026-09-07)
12
-
13
-
14
- ### ⚠ BREAKING CHANGES
15
-
16
- * **react:** preflight exact-class instance method targets ([#182](https://github.com/astrale-os/shell/issues/182))
17
- * **runtime:** simplify Shell users, groups and invitations ([#187](https://github.com/astrale-os/shell/issues/187))
18
-
19
- ### Features
20
-
21
- * **domain:** migrate Shell to project environments ([#183](https://github.com/astrale-os/shell/issues/183)) ([ec72b5d](https://github.com/astrale-os/shell/commit/ec72b5d11fea5ff3266d1fd0a823c4eff5cc6d3e))
22
- * **react:** preflight exact-class instance method targets ([#182](https://github.com/astrale-os/shell/issues/182)) ([305e92f](https://github.com/astrale-os/shell/commit/305e92f0578309e5e94d8fd78d874f7c5a60ee46))
23
- * **runtime:** simplify Shell users, groups and invitations ([#187](https://github.com/astrale-os/shell/issues/187)) ([7f00279](https://github.com/astrale-os/shell/commit/7f002791edae81944e6e80940834dee49212aa26))
24
-
25
-
26
- ### Bug Fixes
27
-
28
- * **react:** require the Shell User and Group API release ([#196](https://github.com/astrale-os/shell/issues/196)) ([df34749](https://github.com/astrale-os/shell/commit/df3474972a54c30816a02fc3510b478299bea4f1))
29
-
30
- ## [0.4.0-beta.14](https://github.com/astrale-os/shell/compare/shell-react-v0.4.0-beta.13...shell-react-v0.4.0-beta.14) (2026-09-04)
31
-
32
-
33
- ### Bug Fixes
34
-
35
- * **deps:** align SDK and Kernel release cohort ([#177](https://github.com/astrale-os/shell/issues/177)) ([294ec8f](https://github.com/astrale-os/shell/commit/294ec8f6f7a908afb608a1078e03a84ff2cc09ca))
36
-
37
- ## [0.4.0-beta.13](https://github.com/astrale-os/shell/compare/shell-react-v0.4.0-beta.12...shell-react-v0.4.0-beta.13) (2026-09-03)
38
-
39
-
40
- ### Bug Fixes
41
-
42
- * **deps:** require Shell beta.13 producer ([#172](https://github.com/astrale-os/shell/issues/172)) ([4b8755a](https://github.com/astrale-os/shell/commit/4b8755a086f1fc73beb4affb893d4f23a85308b1))
43
-
44
- ## [0.4.0-beta.12](https://github.com/astrale-os/shell/compare/shell-react-v0.4.0-beta.11...shell-react-v0.4.0-beta.12) (2026-09-03)
45
-
46
-
47
- ### Features
48
-
49
- * **core:** declare required node class icons ([#163](https://github.com/astrale-os/shell/issues/163)) ([2114424](https://github.com/astrale-os/shell/commit/2114424dc1295d978e49536aea76ace897917987))
50
-
51
- ## [0.4.0-beta.11](https://github.com/astrale-os/shell/compare/shell-react-v0.4.0-beta.10...shell-react-v0.4.0-beta.11) (2026-09-03)
52
-
53
-
54
- ### Bug Fixes
55
-
56
- * **react:** allow id-only action receivers ([#167](https://github.com/astrale-os/shell/issues/167)) ([7f75975](https://github.com/astrale-os/shell/commit/7f759753864033e9593bb70080fa8b8c5a5157c0))
57
-
58
- ## [0.4.0-beta.10](https://github.com/astrale-os/shell/compare/shell-react-v0.4.0-beta.9...shell-react-v0.4.0-beta.10) (2026-09-01)
59
-
60
-
61
- ### Bug Fixes
62
-
63
- * **runtime:** admit current Shell prerelease producer ([#160](https://github.com/astrale-os/shell/issues/160)) ([eb4699b](https://github.com/astrale-os/shell/commit/eb4699b891ca1a0561cd841be5e12193cff2a342))
64
-
65
- ## [0.4.0-beta.9](https://github.com/astrale-os/shell/compare/shell-react-v0.3.2-beta.9...shell-react-v0.4.0-beta.9) (2026-09-01)
66
-
67
-
68
- ### ⚠ BREAKING CHANGES
69
-
70
- * adopt unified Domain functions layer ([#157](https://github.com/astrale-os/shell/issues/157))
71
-
72
- ### Features
73
-
74
- * adopt unified Domain functions layer ([#157](https://github.com/astrale-os/shell/issues/157)) ([ae73910](https://github.com/astrale-os/shell/commit/ae739107da4b3827ff06f09a1bf86958135a2a5a))
75
-
76
- ## [0.3.2-beta.9](https://github.com/astrale-os/shell/compare/shell-react-v0.3.2-beta.8...shell-react-v0.3.2-beta.9) (2026-08-31)
77
-
78
-
79
- ### Bug Fixes
80
-
81
- * **domain:** preserve caller-owned Shell authority ([#143](https://github.com/astrale-os/shell/issues/143)) ([7150ce0](https://github.com/astrale-os/shell/commit/7150ce0890546b6c605f9192aa78177b95af3615))
82
-
83
- ## [0.3.2-beta.8](https://github.com/astrale-os/shell/compare/shell-react-v0.3.2-beta.7...shell-react-v0.3.2-beta.8) (2026-08-30)
84
-
85
-
86
- ### Features
87
-
88
- * grant trusted Shell exchange authority ([#140](https://github.com/astrale-os/shell/issues/140)) ([349c4b5](https://github.com/astrale-os/shell/commit/349c4b593b20245a8cb836f2370807b372faf23f))
89
-
90
-
91
- ### Bug Fixes
92
-
93
- * **deps:** consume Zod-coherent SDK cohort ([#145](https://github.com/astrale-os/shell/issues/145)) ([2d2027c](https://github.com/astrale-os/shell/commit/2d2027c749f83c1e35a5b4a28696761b1f8e71e1))
94
- * **domain:** adopt function and authority requirements ([#144](https://github.com/astrale-os/shell/issues/144)) ([016e306](https://github.com/astrale-os/shell/commit/016e30603591c32a2c8cf0073fe75995c67ae004))
95
-
96
- ## [0.3.2-beta.7](https://github.com/astrale-os/shell/compare/shell-react-v0.3.2-beta.6...shell-react-v0.3.2-beta.7) (2026-08-29)
97
-
98
-
99
- ### Features
100
-
101
- * **runtime:** enforce declared iframe requirements ([#129](https://github.com/astrale-os/shell/issues/129)) ([7b8d84a](https://github.com/astrale-os/shell/commit/7b8d84a1189e95c94c2de9f1759b6510a5467813))
102
- * **shell:** adopt flat identity authentication ([#114](https://github.com/astrale-os/shell/issues/114)) ([f267a79](https://github.com/astrale-os/shell/commit/f267a79cd8bd58c29379c4be91b481c5dd20f1cf))
103
-
104
-
105
- ### Bug Fixes
106
-
107
- * **domain:** publish visibility-free Shell bundle ([#131](https://github.com/astrale-os/shell/issues/131)) ([61f48e5](https://github.com/astrale-os/shell/commit/61f48e56f9b18a0b83d395ce1bae648d2470140c))
108
-
109
- ## [0.3.2-beta.6](https://github.com/astrale-os/shell/compare/shell-react-v0.3.2-beta.5...shell-react-v0.3.2-beta.6) (2026-08-28)
110
-
111
-
112
- ### Bug Fixes
113
-
114
- * **domain:** align canonical SDK contracts ([#117](https://github.com/astrale-os/shell/issues/117)) ([78df43d](https://github.com/astrale-os/shell/commit/78df43df4b2878221c7bfc83b32944264b3835e8))
115
- * surface Domain binding diagnostics ([#125](https://github.com/astrale-os/shell/issues/125)) ([e37b6ca](https://github.com/astrale-os/shell/commit/e37b6ca1634ea5655dafbb2386af2c7198a55fe9))
116
-
117
- ## [0.3.2-beta.5](https://github.com/astrale-os/shell/compare/shell-react-v0.3.2-beta.4...shell-react-v0.3.2-beta.5) (2026-08-27)
118
-
119
-
120
- ### Bug Fixes
121
-
122
- * **react:** publish against Shell beta.7 ([#115](https://github.com/astrale-os/shell/issues/115)) ([2e2ad9e](https://github.com/astrale-os/shell/commit/2e2ad9e471b6c39413260f76954432a53be2cb23))
123
-
124
- ## [0.3.2-beta.4](https://github.com/astrale-os/shell/compare/shell-react-v0.3.2-beta.3...shell-react-v0.3.2-beta.4) (2026-08-26)
125
-
126
-
127
- ### Bug Fixes
128
-
129
- * **react:** preserve in-flight queries through StrictMode ([#112](https://github.com/astrale-os/shell/issues/112)) ([e5b7cd7](https://github.com/astrale-os/shell/commit/e5b7cd75e001be393d94e168089eb66a1da4bfb2))
130
- * **shell:** align the published Shell cohort ([#109](https://github.com/astrale-os/shell/issues/109)) ([6c79cb6](https://github.com/astrale-os/shell/commit/6c79cb6f0370aad84565dda27d2af1a5579c18ff))
131
-
132
- ## [0.3.2-beta.3](https://github.com/astrale-os/shell/compare/shell-react-v0.3.2-beta.2...shell-react-v0.3.2-beta.3) (2026-08-26)
133
-
134
-
135
- ### Bug Fixes
136
-
137
- * **deploy:** consume current SDK toolchain ([#96](https://github.com/astrale-os/shell/issues/96)) ([73956a0](https://github.com/astrale-os/shell/commit/73956a05a2c9e107afedfa7b1878716644074bc1))
138
- * **deps:** consume cloudflare adapter beta.44 ([#101](https://github.com/astrale-os/shell/issues/101)) ([7e9f214](https://github.com/astrale-os/shell/commit/7e9f214fe06979d5e1a7f4ca3b00cf431ab50944))
139
-
140
- ## [0.3.2-beta.2](https://github.com/astrale-os/shell/compare/shell-react-v0.3.2-beta.1...shell-react-v0.3.2-beta.2) (2026-08-25)
141
-
142
-
143
- ### Bug Fixes
144
-
145
- * retain sandboxed View proof boundaries ([#80](https://github.com/astrale-os/shell/issues/80)) ([7de8800](https://github.com/astrale-os/shell/commit/7de8800dc42106bd4aa0f8a6340117d17c51d195))
146
-
147
- ## [0.3.2-beta.1](https://github.com/astrale-os/shell/compare/shell-react-v0.3.2-beta...shell-react-v0.3.2-beta.1) (2026-08-25)
148
-
149
-
150
- ### Features
151
-
152
- * **react:** bind projected recipes to domain context ([#72](https://github.com/astrale-os/shell/issues/72)) ([1d963dc](https://github.com/astrale-os/shell/commit/1d963dc33e98ec7c4b1cece467c9b2428e07aeea))
153
-
154
-
155
- ### Bug Fixes
156
-
157
- * **packages:** keep install guards private ([#71](https://github.com/astrale-os/shell/issues/71)) ([20a34ee](https://github.com/astrale-os/shell/commit/20a34eeafea868f31663b3076928c3528f4e1aec))
158
-
159
- ## [0.3.2-beta](https://github.com/astrale-os/shell/compare/shell-react-v0.3.1...shell-react-v0.3.2-beta) (2026-08-24)
160
-
161
-
162
- ### Bug Fixes
163
-
164
- * **deps:** align Shell packages with SDK beta.22 ([#65](https://github.com/astrale-os/shell/issues/65)) ([18db939](https://github.com/astrale-os/shell/commit/18db93958e64678f9c000e258c12a97525fa95ef))
165
- * **deps:** require Shell 0.4.2 beta ([#70](https://github.com/astrale-os/shell/issues/70)) ([b6ec3b3](https://github.com/astrale-os/shell/commit/b6ec3b39cd8ab571e7a3e64092e896ac8e14cd62))
166
- * qualify the Shell release cohort ([8f837e1](https://github.com/astrale-os/shell/commit/8f837e1bf14600db18b96da6de7878f34321332c))
167
- * qualify the Shell release cohort ([efb23d7](https://github.com/astrale-os/shell/commit/efb23d71088a407209a01cec33e5571d86ecde51))
168
- * **release:** preserve SDK dependency ownership ([#62](https://github.com/astrale-os/shell/issues/62)) ([5199f73](https://github.com/astrale-os/shell/commit/5199f7358a64cfb1163ebb6d13c94a8b8080bcc1))
169
-
170
- ## [0.3.1](https://github.com/astrale-os/shell/compare/shell-react-v0.3.0...shell-react-v0.3.1) (2026-08-24)
171
-
172
-
173
- ### Bug Fixes
174
-
175
- * **release:** qualify published sdk runtime context ([b1411a0](https://github.com/astrale-os/shell/commit/b1411a01710bab785b31c02c81ea09bc902f4e42))
176
-
177
- ## [0.3.0](https://github.com/astrale-os/shell/compare/shell-react-v0.2.9...shell-react-v0.3.0) (2026-08-24)
178
-
179
-
180
- ### ⚠ BREAKING CHANGES
181
-
182
- * adopt path-only invocation
183
-
184
- ### Features
185
-
186
- * adopt kernel client session vocabulary ([95877b2](https://github.com/astrale-os/shell/commit/95877b25e6d672fe69f14b28ac9fa712b0649a76))
187
- * adopt Kernel Client Session vocabulary ([ac61164](https://github.com/astrale-os/shell/commit/ac61164bba8540931ad7c0c2cf68be95fb3336c0))
188
- * adopt Kernel V2 at the Shell client boundary ([6654ef7](https://github.com/astrale-os/shell/commit/6654ef7989691664af777824be2c97a2906b4008))
189
- * adopt path-only invocation ([afef6f4](https://github.com/astrale-os/shell/commit/afef6f4c970b3b01bb69f758f163cc9fa2b14641))
190
- * complete kernel v2 shell migration ([82a2d36](https://github.com/astrale-os/shell/commit/82a2d36ae804ddbfd06fa59afb6a290128c28a82))
191
- * **domain:** deploy Shell through default adapter ([43bc418](https://github.com/astrale-os/shell/commit/43bc418952666d7aac26194134c2776b58c355e7))
192
- * **domain:** publish @astrale-domains/shell ([905488b](https://github.com/astrale-os/shell/commit/905488b647e73793eb18ec50e5b06f763b7630e8))
193
- * migrate shell packages to kernel beta.2 ([62ea4a2](https://github.com/astrale-os/shell/commit/62ea4a2ff5c1b149a94a3969985debd8d791e3f3))
194
- * **runtime:** add graph-first React view runtime ([40ed99f](https://github.com/astrale-os/shell/commit/40ed99f03b2c2067f209b1be85d1667e6dc904f2))
195
- * **runtime:** add graph-first React View runtime ([702fe44](https://github.com/astrale-os/shell/commit/702fe44a1687af992a46afac16efed87dfc6e057))
196
- * **shell:** author graph operations with direct node targets ([a189028](https://github.com/astrale-os/shell/commit/a189028cee3d5f14678325c713b9439487c9e224))
197
- * **shell:** author graph operations with node targets ([97f0599](https://github.com/astrale-os/shell/commit/97f05997bb34e8935349dbb6f5b9e55a2432cca3))
198
-
199
-
200
- ### Bug Fixes
201
-
202
- * adopt current Shell domain bindings ([121c7be](https://github.com/astrale-os/shell/commit/121c7bea57ad1bf4cedbab90ed8cba8f59955f06))
203
- * adopt source cohort domain bindings ([bf79155](https://github.com/astrale-os/shell/commit/bf7915555d7152b2e70127b54a1e8b4fdc269b04))
204
- * adopt the official kernel cohort ([#47](https://github.com/astrale-os/shell/issues/47)) ([c15a5b0](https://github.com/astrale-os/shell/commit/c15a5b0d8c9f4c3f6dd49bf122cfea09c4af42da))
205
- * align shell with current kernel client ([5351dc8](https://github.com/astrale-os/shell/commit/5351dc85beafdcca8f74817e032e3aab0edf0397))
206
- * align Shell with current Kernel cohort ([d1abeaf](https://github.com/astrale-os/shell/commit/d1abeaf2a418e7e6bf89ea85512cd0e8942d407b))
207
- * **domain:** align deployment with current SDK ([7a5fbae](https://github.com/astrale-os/shell/commit/7a5fbae7283aac0bb9f1aebd7b7bb0a753a1ba15))
208
- * **domain:** use the published SDK boundary ([2e494c6](https://github.com/astrale-os/shell/commit/2e494c6f8b4d3d25c71bbe51b37436fd35d6c42a))
209
- * lock shell to current beta cohort ([8350423](https://github.com/astrale-os/shell/commit/8350423f2be37208396bd6ab37e43c102d73bb9e))
210
-
211
- ## [0.2.9](https://github.com/astrale-os/shell/compare/shell-react-v0.2.8...shell-react-v0.2.9) (2026-07-18)
212
-
213
-
214
- ### Features
215
-
216
- * **windows:** support resolved iframe sandbox policies ([#30](https://github.com/astrale-os/shell/issues/30)) ([9c6c2e9](https://github.com/astrale-os/shell/commit/9c6c2e999115819227c7400bbb4f1edaf7b7b40d))
217
-
218
-
219
- ### Bug Fixes
220
-
221
- * **core:** keep managed iframes above workspace surfaces ([#28](https://github.com/astrale-os/shell/issues/28)) ([2ab656a](https://github.com/astrale-os/shell/commit/2ab656a46bcb342850a5703c82d82eea9bfbd958))
222
-
223
- ## [0.2.8](https://github.com/astrale-os/shell/compare/shell-react-v0.2.7...shell-react-v0.2.8) (2026-07-15)
224
-
225
-
226
- ### Features
227
-
228
- * **shell:** expose domain search through useDomains ([13dbe0c](https://github.com/astrale-os/shell/commit/13dbe0c769886080fbc0da62dbe82868d27e8aaf))
229
- * **shell:** expose domain search through useDomains ([bb3076a](https://github.com/astrale-os/shell/commit/bb3076aa1788ec8d1e6f4155014bac3ed0f93783))
230
-
231
-
232
- ### Bug Fixes
233
-
234
- * **react:** resolve canonical function bindings ([52be852](https://github.com/astrale-os/shell/commit/52be8529ca37aeac3878dfd198f76e3b81d37d25))
235
- * **react:** resolve canonical function bindings ([db8f0ab](https://github.com/astrale-os/shell/commit/db8f0abbc6b3d43063a9450a1bfbb911f1d7aa1d))
236
-
237
- ## [0.2.7](https://github.com/astrale-os/shell/compare/shell-react-v0.2.6...shell-react-v0.2.7) (2026-07-12)
238
-
239
-
240
- ### Features
241
-
242
- * **shell:** resolve views and reject failed intents ([0cf741e](https://github.com/astrale-os/shell/commit/0cf741ec5279ca003b97f39b4b5cbe5c71099ab3))
243
-
244
- ## [0.2.6](https://github.com/astrale-os/shell/compare/shell-react-v0.2.5...shell-react-v0.2.6) (2026-07-12)
245
-
246
-
247
- ### Features
248
-
249
- * **shell-react:** add fire-and-forget intent emitter ([850e0e2](https://github.com/astrale-os/shell/commit/850e0e20f44e2475c0859c6690ea8f6f24131768))
250
-
251
- ## [0.2.5](https://github.com/astrale-os/shell/compare/shell-react-v0.2.4...shell-react-v0.2.5) (2026-07-12)
252
-
253
-
254
- ### Bug Fixes
255
-
256
- * preserve virtual session capabilities ([#19](https://github.com/astrale-os/shell/issues/19)) ([792993f](https://github.com/astrale-os/shell/commit/792993f070e0f07069876068a14e324e2d446589))
257
-
258
- ## [0.2.4](https://github.com/astrale-os/shell/compare/shell-react-v0.2.3...shell-react-v0.2.4) (2026-07-12)
259
-
260
-
261
- ### Bug Fixes
262
-
263
- * **react:** keep endpoint envelopes cardinality-stable ([432dd7e](https://github.com/astrale-os/shell/commit/432dd7eb3b495b305bec6acedbcb888fe96e627c))
264
-
265
- ## [0.2.3](https://github.com/astrale-os/shell/compare/shell-react-v0.2.2...shell-react-v0.2.3) (2026-07-12)
266
-
267
-
268
- ### Bug Fixes
269
-
270
- * **deps:** require edge-cardinality kernel client ([83283a9](https://github.com/astrale-os/shell/commit/83283a9c794427946e527d549f5346eacc787c19))
271
-
272
- ## [0.2.2](https://github.com/astrale-os/shell/compare/shell-react-v0.2.1...shell-react-v0.2.2) (2026-07-12)
273
-
274
-
275
- ### Features
276
-
277
- * **react:** adopt typed domain class handles ([c63ab05](https://github.com/astrale-os/shell/commit/c63ab053e0fa48a54e2690a58b932b54029afd8b))
278
-
279
- ## [0.2.1](https://github.com/astrale-os/shell/compare/shell-react-v0.2.0...shell-react-v0.2.1) (2026-07-11)
280
-
281
-
282
- ### Bug Fixes
283
-
284
- * explicit .js specifiers + nodenext so dist loads under Node's native ESM loader ([#10](https://github.com/astrale-os/shell/issues/10)) ([2f8616f](https://github.com/astrale-os/shell/commit/2f8616ff8b5bf00e2dab9229fd6afd3dbfdce8ce))
285
-
286
- ## [0.2.0](https://github.com/astrale-os/shell/compare/shell-react-v0.1.0...shell-react-v0.2.0) (2026-07-09)
287
-
288
-
289
- ### ⚠ BREAKING CHANGES
290
-
291
- * **core:** removed CreateKernelClientAdapterOpts.mintIdentity — the delegation mint is always self per the kernel invariant, so delegationMintVia covers it. createShell({ mintIdentity }) is unchanged (the facade still honors it for the identity-credential mint subject).
292
-
293
- * **core:** legacy-ops cutover — get/mutate doors, bounded contexts, auth collapse, shell-react ([#7](https://github.com/astrale-os/shell/issues/7)) ([0119b0f](https://github.com/astrale-os/shell/commit/0119b0f64e152bd1765facce880a533401a3e65e))
294
-
295
-
296
- ### Features
297
-
298
- * use shell domain schema ([6ca1be8](https://github.com/astrale-os/shell/commit/6ca1be82aece4cd2925c1b4587e65b797686e804))
299
-
300
-
301
- ### Bug Fixes
302
-
303
- * require published shell schema entrypoints ([92aa701](https://github.com/astrale-os/shell/commit/92aa70117dbfa10bc4dc2133e1c0c322a21a571e))