@astrale-os/shell 0.3.3 → 0.3.5

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,6 +1,6 @@
1
1
  /**
2
2
  * The OS-plane namespaces on the Shell — `shell.user` / `shell.spaces` /
3
- * `shell.apps`. Framework-free: the shell-react hooks (§12.2) layer over
3
+ * `shell.apps` / `shell.views`. Framework-free: the shell-react hooks (§12.2) layer over
4
4
  * exactly these. Pure closures over a lazy typed view — constructing this
5
5
  * touches no kernel (safe before a sandboxed shell's `init()`).
6
6
  */
@@ -8,10 +8,12 @@ import type { KernelClient } from '../kernel/client.js';
8
8
  import type { AppsNamespace } from './apps.js';
9
9
  import type { SpacesNamespace } from './spaces.js';
10
10
  import type { UserNamespace } from './user.js';
11
+ import type { ViewsNamespace } from './views.js';
11
12
  export interface OsNamespaces {
12
13
  readonly user: UserNamespace;
13
14
  readonly spaces: SpacesNamespace;
14
15
  readonly apps: AppsNamespace;
16
+ readonly views: ViewsNamespace;
15
17
  }
16
18
  export interface CreateOsNamespacesDeps {
17
19
  /** Injected clock, threaded into opened `AppSession`s (tests). */
@@ -1 +1 @@
1
- {"version":3,"file":"namespaces.d.ts","sourceRoot":"","sources":["../../src/application/namespaces.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAO9C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;IAC5B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAA;IAChC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;CAC7B;AAED,MAAM,WAAW,sBAAsB;IACrC,kEAAkE;IAClE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAC5B;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,YAAY,EACpB,IAAI,CAAC,EAAE,sBAAsB,GAC5B,YAAY,CAOd"}
1
+ {"version":3,"file":"namespaces.d.ts","sourceRoot":"","sources":["../../src/application/namespaces.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAQhD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;IAC5B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAA;IAChC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;IAC5B,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAA;CAC/B;AAED,MAAM,WAAW,sBAAsB;IACrC,kEAAkE;IAClE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAC5B;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,YAAY,EACpB,IAAI,CAAC,EAAE,sBAAsB,GAC5B,YAAY,CAQd"}
@@ -2,11 +2,13 @@ import { createAppsNamespace } from './apps.js';
2
2
  import { createSpacesNamespace } from './spaces.js';
3
3
  import { createUserNamespace } from './user.js';
4
4
  import { createShellDomainView } from './view.js';
5
+ import { createViewsNamespace } from './views.js';
5
6
  export function createOsNamespaces(kernel, deps) {
6
7
  const v = createShellDomainView(kernel);
7
8
  return {
8
9
  user: createUserNamespace(kernel, v),
9
10
  spaces: createSpacesNamespace(kernel, v),
10
11
  apps: createAppsNamespace(kernel, v, deps),
12
+ views: createViewsNamespace(kernel),
11
13
  };
12
14
  }
@@ -0,0 +1,17 @@
1
+ import type { NodeRefInput } from '@astrale-os/kernel-client';
2
+ import type { KernelClient } from '../kernel/client.js';
3
+ /** One caller-visible View resolved for a concrete graph node. */
4
+ export interface ResolvedView {
5
+ readonly id: string;
6
+ readonly path: string;
7
+ readonly url: string;
8
+ readonly name?: string;
9
+ readonly handshake?: 'shell' | 'none';
10
+ readonly origin: 'self' | 'class';
11
+ }
12
+ export interface ViewsNamespace {
13
+ /** Resolve the Views that can render `node`, ordered by kernel preference. */
14
+ resolve(node: NodeRefInput): Promise<readonly ResolvedView[]>;
15
+ }
16
+ export declare function createViewsNamespace(kernel: KernelClient): ViewsNamespace;
17
+ //# sourceMappingURL=views.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/application/views.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAK7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAEvD,kEAAkE;AAClE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,8EAA8E;IAC9E,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC,CAAA;CAC9D;AAKD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CASzE"}
@@ -0,0 +1,14 @@
1
+ import { normalizeRef } from '@astrale-os/kernel-client';
2
+ import { K } from '@astrale-os/kernel-core';
3
+ const VIEW_RESOLVE_METHOD = K.View.resolve.path.method.raw;
4
+ const NO_VIEWS = Object.freeze([]);
5
+ export function createViewsNamespace(kernel) {
6
+ return {
7
+ async resolve(node) {
8
+ const rows = (await kernel.call(VIEW_RESOLVE_METHOD, {
9
+ node: normalizeRef(node),
10
+ }));
11
+ return rows === null || rows === undefined || rows.length === 0 ? NO_VIEWS : rows;
12
+ },
13
+ };
14
+ }
package/dist/index.d.ts CHANGED
@@ -32,7 +32,7 @@ export type { IntentMiddleware, IntentPipeline } from './intent/pipeline.js';
32
32
  export type { IntentDecision, IntentOrigin, IntentPolicy, IntentContext } from './intent/policy.js';
33
33
  export { createIntentRouter } from './intent/router.js';
34
34
  export type { IntentRouter, IntentRouterController, IntentRouterConfig, LocalIntentHandler, } from './intent/router.js';
35
- export { requestIntent, replyToIntent } from './intent/request.js';
35
+ export { IntentRequestError, rejectIntent, requestIntent, replyToIntent } from './intent/request.js';
36
36
  export { loggingMiddleware } from './intent/middleware/logging.js';
37
37
  export type { LoggingConfig, LoggingEntry, LoggingSink } from './intent/middleware/logging.js';
38
38
  export { capabilitiesMiddleware } from './intent/middleware/capabilities.js';
@@ -44,6 +44,7 @@ export type { OsNamespaces, CreateOsNamespacesDeps } from './application/namespa
44
44
  export type { UserNamespace, UserNode, RoleNode } from './application/user.js';
45
45
  export type { SpacesNamespace, SpaceNode } from './application/spaces.js';
46
46
  export type { AppsNamespace, ApplicationNode } from './application/apps.js';
47
+ export type { ViewsNamespace, ResolvedView } from './application/views.js';
47
48
  export { openAppSession } from './application/session/open.js';
48
49
  export type { OpenAppSessionDeps } from './application/session/open.js';
49
50
  export { AppSessionRefreshError } from './application/session/session.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -9,7 +9,7 @@ export { runParentHandshake } from './window/mount/handshake.js';
9
9
  // ─── intent ─────────────────────────────────────────────────────────────────
10
10
  export { createIntentPipeline } from './intent/pipeline.js';
11
11
  export { createIntentRouter } from './intent/router.js';
12
- export { requestIntent, replyToIntent } from './intent/request.js';
12
+ export { IntentRequestError, rejectIntent, requestIntent, replyToIntent } from './intent/request.js';
13
13
  export { loggingMiddleware } from './intent/middleware/logging.js';
14
14
  export { capabilitiesMiddleware } from './intent/middleware/capabilities.js';
15
15
  export { rateLimitMiddleware } from './intent/middleware/rate-limit.js';
@@ -15,6 +15,10 @@ import type { IntentMessage, IntentRegistry, PayloadOf, ReplyOf } from '../messa
15
15
  * gone too, so a never-resolving promise cannot strand a live view.
16
16
  */
17
17
  export declare function requestIntent<K extends keyof IntentRegistry>(parent: ParentChannel, name: K, payload: PayloadOf<K>): Promise<ReplyOf<K>>;
18
+ /** A remote intent handler rejected a correlated request. */
19
+ export declare class IntentRequestError extends Error {
20
+ constructor(message: string);
21
+ }
18
22
  /**
19
23
  * Parent-side counterpart to `requestIntent`: deliver `result` back to the
20
24
  * originating child window, keyed by the request's `correlationId`. No-op for
@@ -22,4 +26,6 @@ export declare function requestIntent<K extends keyof IntentRegistry>(parent: Pa
22
26
  * the child window has since detached (best-effort, drops silently).
23
27
  */
24
28
  export declare function replyToIntent<K extends keyof IntentRegistry>(children: ChildrenChannel, windowId: string, request: IntentMessage<K>, result: ReplyOf<K>): void;
29
+ /** Reject a correlated request at its originating child; fire-and-forget is a no-op. */
30
+ export declare function rejectIntent(children: ChildrenChannel, windowId: string, request: IntentMessage, error: unknown): void;
25
31
  //# sourceMappingURL=request.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/intent/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAE7F;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,cAAc,EAC1D,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,GACpB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAoBrB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,cAAc,EAC1D,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,EACzB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GACjB,IAAI,CAYN"}
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/intent/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAE7F;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,cAAc,EAC1D,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,GACpB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAwBrB;AAED,6DAA6D;AAC7D,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,cAAc,EAC1D,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,EACzB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GACjB,IAAI,CAYN;AAED,wFAAwF;AACxF,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,OAAO,GACb,IAAI,CAeN"}
@@ -13,7 +13,7 @@
13
13
  */
14
14
  export function requestIntent(parent, name, payload) {
15
15
  const correlationId = crypto.randomUUID();
16
- return new Promise((resolve) => {
16
+ return new Promise((resolve, reject) => {
17
17
  const off = parent.on('intent', (message) => {
18
18
  if (message.envelope.name !== 'intentReply')
19
19
  return;
@@ -21,6 +21,10 @@ export function requestIntent(parent, name, payload) {
21
21
  if (reply.correlationId !== correlationId)
22
22
  return;
23
23
  off();
24
+ if (reply.error) {
25
+ reject(new IntentRequestError(reply.error.message));
26
+ return;
27
+ }
24
28
  resolve(reply.result);
25
29
  });
26
30
  // `PayloadOf<K>` is a deferred conditional TS can't reconcile with the
@@ -34,6 +38,13 @@ export function requestIntent(parent, name, payload) {
34
38
  parent.send(message);
35
39
  });
36
40
  }
41
+ /** A remote intent handler rejected a correlated request. */
42
+ export class IntentRequestError extends Error {
43
+ constructor(message) {
44
+ super(message);
45
+ this.name = 'IntentRequestError';
46
+ }
47
+ }
37
48
  /**
38
49
  * Parent-side counterpart to `requestIntent`: deliver `result` back to the
39
50
  * originating child window, keyed by the request's `correlationId`. No-op for
@@ -54,3 +65,21 @@ export function replyToIntent(children, windowId, request, result) {
54
65
  },
55
66
  });
56
67
  }
68
+ /** Reject a correlated request at its originating child; fire-and-forget is a no-op. */
69
+ export function rejectIntent(children, windowId, request, error) {
70
+ const correlationId = request.envelope.correlationId;
71
+ if (!correlationId)
72
+ return;
73
+ children.send(windowId, {
74
+ type: 'intent',
75
+ version: 1,
76
+ envelope: {
77
+ name: 'intentReply',
78
+ payload: {
79
+ correlationId,
80
+ error: { message: error instanceof Error ? error.message : String(error) },
81
+ },
82
+ sender: { windowId: 'root' },
83
+ },
84
+ });
85
+ }
@@ -114,7 +114,10 @@ export interface IntentRegistry {
114
114
  intentReply: {
115
115
  payload: {
116
116
  correlationId: string;
117
- result: unknown;
117
+ result?: unknown;
118
+ error?: {
119
+ message: string;
120
+ };
118
121
  };
119
122
  reply: void;
120
123
  };
@@ -1 +1 @@
1
- {"version":3,"file":"intent.d.ts","sourceRoot":"","sources":["../../src/message/intent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"intent.d.ts","sourceRoot":"","sources":["../../src/message/intent.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/shell/build.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAIvC,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;IAC5B,eAAe,EAAE,yBAAyB,CAAA;IAC1C,MAAM,EAAE,YAAY,CAAA;IACpB,QAAQ,EAAE,cAAc,CAAA;IACxB,QAAQ,EAAE,eAAe,CAAA;IACzB,SAAS,EAAE,mBAAmB,CAAA;IAC9B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,kBAAkB,EAAE,MAAM,eAAe,CAAA;IACzC,QAAQ,EAAE,CAAC,CAAC,SAAS,MAAM,cAAc,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI,CAAA;IACjG,YAAY,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;IACvC,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC/B,CAAA;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,KAAK,CA+DxD"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/shell/build.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAIvC,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;IAC5B,eAAe,EAAE,yBAAyB,CAAA;IAC1C,MAAM,EAAE,YAAY,CAAA;IACpB,QAAQ,EAAE,cAAc,CAAA;IACxB,QAAQ,EAAE,eAAe,CAAA;IACzB,SAAS,EAAE,mBAAmB,CAAA;IAC9B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,kBAAkB,EAAE,MAAM,eAAe,CAAA;IACzC,QAAQ,EAAE,CAAC,CAAC,SAAS,MAAM,cAAc,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI,CAAA;IACjG,YAAY,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;IACvC,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC/B,CAAA;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,KAAK,CAkExD"}
@@ -26,6 +26,9 @@ export function buildShellFacade(deps) {
26
26
  get apps() {
27
27
  return osNamespaces().apps;
28
28
  },
29
+ get views() {
30
+ return osNamespaces().views;
31
+ },
29
32
  use(middleware) {
30
33
  deps.pipeline.use(middleware);
31
34
  return shell;
@@ -1,6 +1,7 @@
1
1
  import type { AppsNamespace } from '../application/apps.js';
2
2
  import type { SpacesNamespace } from '../application/spaces.js';
3
3
  import type { UserNamespace } from '../application/user.js';
4
+ import type { ViewsNamespace } from '../application/views.js';
4
5
  import type { ChildrenChannel } from '../channel/children.js';
5
6
  import type { ObserverHandler } from '../channel/observer.js';
6
7
  import type { ParentChannel } from '../channel/parent.js';
@@ -22,6 +23,8 @@ export interface Shell {
22
23
  readonly spaces: SpacesNamespace;
23
24
  /** OS plane: apps — install, list per space, open (returns an `AppSession`). */
24
25
  readonly apps: AppsNamespace;
26
+ /** Kernel-backed View discovery for arbitrary graph nodes. */
27
+ readonly views: ViewsNamespace;
25
28
  use(middleware: IntentMiddleware): Shell;
26
29
  onMessage(handler: ObserverHandler): () => void;
27
30
  onIntent<K extends keyof IntentRegistry>(name: K, handler: LocalIntentHandler<K>): () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/shell/shell.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACxF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAEjD,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;IACrC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAA;IAClC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAE9B,kFAAkF;IAClF,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;IAC5B,kEAAkE;IAClE,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAA;IAChC,gFAAgF;IAChF,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;IAE5B,GAAG,CAAC,UAAU,EAAE,gBAAgB,GAAG,KAAK,CAAA;IACxC,SAAS,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,IAAI,CAAA;IAC/C,QAAQ,CAAC,CAAC,SAAS,MAAM,cAAc,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAA;IAE7F,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;IAClD,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IAE7F,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,CAAA;IACtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACzB"}
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/shell/shell.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACxF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAEjD,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;IACrC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAA;IAClC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAE9B,kFAAkF;IAClF,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;IAC5B,kEAAkE;IAClE,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAA;IAChC,gFAAgF;IAChF,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;IAC5B,8DAA8D;IAC9D,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAA;IAE9B,GAAG,CAAC,UAAU,EAAE,gBAAgB,GAAG,KAAK,CAAA;IACxC,SAAS,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,IAAI,CAAA;IAC/C,QAAQ,CAAC,CAAC,SAAS,MAAM,cAAc,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAA;IAE7F,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;IAClD,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IAE7F,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,CAAA;IACtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACzB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astrale-os/shell",
3
- "version": "0.3.3",
3
+ "version": "0.3.5",
4
4
  "description": "Astrale Shell SDK — parent/child/kernel communication",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -26,7 +26,7 @@
26
26
  },
27
27
  "dependencies": {
28
28
  "@astrale-domains/shell-schema": ">=0.3.2 <1.0.0",
29
- "@astrale-os/kernel-client": ">=0.4.6 <1.0.0",
29
+ "@astrale-os/kernel-client": ">=0.4.7 <1.0.0",
30
30
  "@astrale-os/kernel-core": ">=0.7.5 <1.0.0",
31
31
  "@astrale-os/kernel-dsl": ">=0.1.4 <1.0.0",
32
32
  "jose": "^6.2.3",
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * The OS-plane namespaces on the Shell — `shell.user` / `shell.spaces` /
3
- * `shell.apps`. Framework-free: the shell-react hooks (§12.2) layer over
3
+ * `shell.apps` / `shell.views`. Framework-free: the shell-react hooks (§12.2) layer over
4
4
  * exactly these. Pure closures over a lazy typed view — constructing this
5
5
  * touches no kernel (safe before a sandboxed shell's `init()`).
6
6
  */
@@ -8,16 +8,19 @@ import type { KernelClient } from '../kernel/client.js'
8
8
  import type { AppsNamespace } from './apps.js'
9
9
  import type { SpacesNamespace } from './spaces.js'
10
10
  import type { UserNamespace } from './user.js'
11
+ import type { ViewsNamespace } from './views.js'
11
12
 
12
13
  import { createAppsNamespace } from './apps.js'
13
14
  import { createSpacesNamespace } from './spaces.js'
14
15
  import { createUserNamespace } from './user.js'
15
16
  import { createShellDomainView } from './view.js'
17
+ import { createViewsNamespace } from './views.js'
16
18
 
17
19
  export interface OsNamespaces {
18
20
  readonly user: UserNamespace
19
21
  readonly spaces: SpacesNamespace
20
22
  readonly apps: AppsNamespace
23
+ readonly views: ViewsNamespace
21
24
  }
22
25
 
23
26
  export interface CreateOsNamespacesDeps {
@@ -34,5 +37,6 @@ export function createOsNamespaces(
34
37
  user: createUserNamespace(kernel, v),
35
38
  spaces: createSpacesNamespace(kernel, v),
36
39
  apps: createAppsNamespace(kernel, v, deps),
40
+ views: createViewsNamespace(kernel),
37
41
  }
38
42
  }
@@ -0,0 +1,35 @@
1
+ import type { NodeRefInput } from '@astrale-os/kernel-client'
2
+
3
+ import { normalizeRef } from '@astrale-os/kernel-client'
4
+ import { K } from '@astrale-os/kernel-core'
5
+
6
+ import type { KernelClient } from '../kernel/client.js'
7
+
8
+ /** One caller-visible View resolved for a concrete graph node. */
9
+ export interface ResolvedView {
10
+ readonly id: string
11
+ readonly path: string
12
+ readonly url: string
13
+ readonly name?: string
14
+ readonly handshake?: 'shell' | 'none'
15
+ readonly origin: 'self' | 'class'
16
+ }
17
+
18
+ export interface ViewsNamespace {
19
+ /** Resolve the Views that can render `node`, ordered by kernel preference. */
20
+ resolve(node: NodeRefInput): Promise<readonly ResolvedView[]>
21
+ }
22
+
23
+ const VIEW_RESOLVE_METHOD = K.View.resolve.path.method.raw
24
+ const NO_VIEWS: readonly ResolvedView[] = Object.freeze([])
25
+
26
+ export function createViewsNamespace(kernel: KernelClient): ViewsNamespace {
27
+ return {
28
+ async resolve(node) {
29
+ const rows = (await kernel.call(VIEW_RESOLVE_METHOD, {
30
+ node: normalizeRef(node),
31
+ })) as ResolvedView[] | null | undefined
32
+ return rows === null || rows === undefined || rows.length === 0 ? NO_VIEWS : rows
33
+ },
34
+ }
35
+ }
package/src/index.ts CHANGED
@@ -63,7 +63,7 @@ export type {
63
63
  IntentRouterConfig,
64
64
  LocalIntentHandler,
65
65
  } from './intent/router.js'
66
- export { requestIntent, replyToIntent } from './intent/request.js'
66
+ export { IntentRequestError, rejectIntent, requestIntent, replyToIntent } from './intent/request.js'
67
67
  export { loggingMiddleware } from './intent/middleware/logging.js'
68
68
  export type { LoggingConfig, LoggingEntry, LoggingSink } from './intent/middleware/logging.js'
69
69
  export { capabilitiesMiddleware } from './intent/middleware/capabilities.js'
@@ -81,6 +81,7 @@ export type { OsNamespaces, CreateOsNamespacesDeps } from './application/namespa
81
81
  export type { UserNamespace, UserNode, RoleNode } from './application/user.js'
82
82
  export type { SpacesNamespace, SpaceNode } from './application/spaces.js'
83
83
  export type { AppsNamespace, ApplicationNode } from './application/apps.js'
84
+ export type { ViewsNamespace, ResolvedView } from './application/views.js'
84
85
  export { openAppSession } from './application/session/open.js'
85
86
  export type { OpenAppSessionDeps } from './application/session/open.js'
86
87
  export { AppSessionRefreshError } from './application/session/session.js'
@@ -21,12 +21,16 @@ export function requestIntent<K extends keyof IntentRegistry>(
21
21
  payload: PayloadOf<K>,
22
22
  ): Promise<ReplyOf<K>> {
23
23
  const correlationId = crypto.randomUUID()
24
- return new Promise((resolve) => {
24
+ return new Promise((resolve, reject) => {
25
25
  const off = parent.on('intent', (message) => {
26
26
  if (message.envelope.name !== 'intentReply') return
27
27
  const reply = message.envelope.payload as PayloadOf<'intentReply'>
28
28
  if (reply.correlationId !== correlationId) return
29
29
  off()
30
+ if (reply.error) {
31
+ reject(new IntentRequestError(reply.error.message))
32
+ return
33
+ }
30
34
  resolve(reply.result as ReplyOf<K>)
31
35
  })
32
36
  // `PayloadOf<K>` is a deferred conditional TS can't reconcile with the
@@ -41,6 +45,14 @@ export function requestIntent<K extends keyof IntentRegistry>(
41
45
  })
42
46
  }
43
47
 
48
+ /** A remote intent handler rejected a correlated request. */
49
+ export class IntentRequestError extends Error {
50
+ constructor(message: string) {
51
+ super(message)
52
+ this.name = 'IntentRequestError'
53
+ }
54
+ }
55
+
44
56
  /**
45
57
  * Parent-side counterpart to `requestIntent`: deliver `result` back to the
46
58
  * originating child window, keyed by the request's `correlationId`. No-op for
@@ -65,3 +77,26 @@ export function replyToIntent<K extends keyof IntentRegistry>(
65
77
  },
66
78
  })
67
79
  }
80
+
81
+ /** Reject a correlated request at its originating child; fire-and-forget is a no-op. */
82
+ export function rejectIntent(
83
+ children: ChildrenChannel,
84
+ windowId: string,
85
+ request: IntentMessage,
86
+ error: unknown,
87
+ ): void {
88
+ const correlationId = request.envelope.correlationId
89
+ if (!correlationId) return
90
+ children.send(windowId, {
91
+ type: 'intent',
92
+ version: 1,
93
+ envelope: {
94
+ name: 'intentReply',
95
+ payload: {
96
+ correlationId,
97
+ error: { message: error instanceof Error ? error.message : String(error) },
98
+ },
99
+ sender: { windowId: 'root' },
100
+ },
101
+ })
102
+ }
@@ -57,7 +57,14 @@ export interface IntentRegistry {
57
57
  * with the handler's `result`. Routed to the resolver purely by
58
58
  * `correlationId` — it intentionally matches no local handler.
59
59
  */
60
- intentReply: { payload: { correlationId: string; result: unknown }; reply: void }
60
+ intentReply: {
61
+ payload: {
62
+ correlationId: string
63
+ result?: unknown
64
+ error?: { message: string }
65
+ }
66
+ reply: void
67
+ }
61
68
  }
62
69
 
63
70
  /**
@@ -57,6 +57,9 @@ export function buildShellFacade(deps: FacadeDeps): Shell {
57
57
  get apps() {
58
58
  return osNamespaces().apps
59
59
  },
60
+ get views() {
61
+ return osNamespaces().views
62
+ },
60
63
 
61
64
  use(middleware) {
62
65
  deps.pipeline.use(middleware)
@@ -1,6 +1,7 @@
1
1
  import type { AppsNamespace } from '../application/apps.js'
2
2
  import type { SpacesNamespace } from '../application/spaces.js'
3
3
  import type { UserNamespace } from '../application/user.js'
4
+ import type { ViewsNamespace } from '../application/views.js'
4
5
  import type { ChildrenChannel } from '../channel/children.js'
5
6
  import type { ObserverHandler } from '../channel/observer.js'
6
7
  import type { ParentChannel } from '../channel/parent.js'
@@ -24,6 +25,8 @@ export interface Shell {
24
25
  readonly spaces: SpacesNamespace
25
26
  /** OS plane: apps — install, list per space, open (returns an `AppSession`). */
26
27
  readonly apps: AppsNamespace
28
+ /** Kernel-backed View discovery for arbitrary graph nodes. */
29
+ readonly views: ViewsNamespace
27
30
 
28
31
  use(middleware: IntentMiddleware): Shell
29
32
  onMessage(handler: ObserverHandler): () => void