@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.
- package/dist/application/namespaces.d.ts +3 -1
- package/dist/application/namespaces.d.ts.map +1 -1
- package/dist/application/namespaces.js +2 -0
- package/dist/application/views.d.ts +17 -0
- package/dist/application/views.d.ts.map +1 -0
- package/dist/application/views.js +14 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/intent/request.d.ts +6 -0
- package/dist/intent/request.d.ts.map +1 -1
- package/dist/intent/request.js +30 -1
- package/dist/message/intent.d.ts +4 -1
- package/dist/message/intent.d.ts.map +1 -1
- package/dist/shell/build.d.ts.map +1 -1
- package/dist/shell/build.js +3 -0
- package/dist/shell/shell.d.ts +3 -0
- package/dist/shell/shell.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/application/namespaces.ts +5 -1
- package/src/application/views.ts +35 -0
- package/src/index.ts +2 -1
- package/src/intent/request.ts +36 -1
- package/src/message/intent.ts +8 -1
- package/src/shell/build.ts +3 -0
- package/src/shell/shell.ts +3 -0
|
@@ -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;
|
|
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';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,cAAc,EACd,OAAO,EACP,SAAS,EACT,OAAO,EACP,cAAc,EACd,aAAa,GACd,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAClE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACxE,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,cAAc,GACf,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAGhF,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,YAAY,EAAE,mBAAmB,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAA;AAC7F,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAChG,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AACrE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAGxF,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAA;AACtE,YAAY,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAA;AAC3E,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxD,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAG9E,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAC7D,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAChG,OAAO,EAAE,UAAU,IAAI,mBAAmB,EAAE,MAAM,kCAAkC,CAAA;AACpF,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACxF,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AACnE,YAAY,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AACxE,YAAY,EACV,WAAW,EACX,eAAe,EACf,aAAa,EACb,WAAW,GACZ,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAGnG,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC3D,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC5E,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACnG,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,YAAY,EACV,YAAY,EACZ,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;
|
|
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';
|
package/dist/intent/request.d.ts
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/intent/request.js
CHANGED
|
@@ -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
|
+
}
|
package/dist/message/intent.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intent.d.ts","sourceRoot":"","sources":["../../src/message/intent.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE;QAAE,OAAO,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,KAAK,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAA;IACnF,KAAK,EAAE;QAAE,OAAO,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,KAAK,EAAE,IAAI,CAAA;KAAE,CAAA;IACrD,KAAK,EAAE;QAAE,OAAO,EAAE;YAAE,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,KAAK,EAAE,IAAI,CAAA;KAAE,CAAA;IACnD,SAAS,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAAC,KAAK,EAAE,IAAI,CAAA;KAAE,CAAA;IAC1D,QAAQ,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAAC,KAAK,EAAE,IAAI,CAAA;KAAE,CAAA;IACzD,WAAW,EAAE;QAAE,OAAO,EAAE;YAAE,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,KAAK,EAAE,IAAI,CAAA;KAAE,CAAA;IACzD,QAAQ,EAAE;QAAE,OAAO,EAAE;YAAE,KAAK,EAAE,OAAO,EAAE,CAAA;SAAE,CAAC;QAAC,KAAK,EAAE;YAAE,MAAM,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAA;IACtE,OAAO,EAAE;QAAE,OAAO,EAAE;YAAE,IAAI,EAAE,OAAO,CAAC;YAAC,YAAY,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,KAAK,EAAE,IAAI,CAAA;KAAE,CAAA;IAC1E;;;;;OAKG;IACH,SAAS,EAAE;QAAE,OAAO,EAAE;YAAE,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,KAAK,EAAE,IAAI,CAAA;KAAE,CAAA;IACvD;;;;;;;;;;;;;OAaG;IACH,aAAa,EAAE;QACb,OAAO,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;QAC3E,KAAK,EAAE;YAAE,OAAO,EAAE,OAAO,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAA;KAC3C,CAAA;IACD;;;;;;OAMG;IACH,WAAW,EAAE;
|
|
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,
|
|
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"}
|
package/dist/shell/build.js
CHANGED
package/dist/shell/shell.d.ts
CHANGED
|
@@ -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;
|
|
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
|
+
"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.
|
|
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'
|
package/src/intent/request.ts
CHANGED
|
@@ -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
|
+
}
|
package/src/message/intent.ts
CHANGED
|
@@ -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: {
|
|
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
|
/**
|
package/src/shell/build.ts
CHANGED
package/src/shell/shell.ts
CHANGED
|
@@ -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
|