@astrale-os/shell 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/LICENSE +202 -0
  2. package/dist/application/apps.d.ts +18 -0
  3. package/dist/application/apps.d.ts.map +1 -0
  4. package/dist/application/apps.js +35 -0
  5. package/dist/application/namespaces.d.ts +21 -0
  6. package/dist/application/namespaces.d.ts.map +1 -0
  7. package/dist/application/namespaces.js +12 -0
  8. package/dist/application/session/open.d.ts +19 -0
  9. package/dist/application/session/open.d.ts.map +1 -0
  10. package/dist/application/session/open.js +46 -0
  11. package/dist/application/session/session.d.ts +41 -0
  12. package/dist/application/session/session.d.ts.map +1 -0
  13. package/dist/application/session/session.js +9 -0
  14. package/dist/application/session/token.d.ts +24 -0
  15. package/dist/application/session/token.d.ts.map +1 -0
  16. package/dist/application/session/token.js +51 -0
  17. package/dist/application/spaces.d.ts +17 -0
  18. package/dist/application/spaces.d.ts.map +1 -0
  19. package/dist/application/spaces.js +30 -0
  20. package/dist/application/user.d.ts +20 -0
  21. package/dist/application/user.d.ts.map +1 -0
  22. package/dist/application/user.js +26 -0
  23. package/dist/application/view.d.ts +20 -0
  24. package/dist/application/view.d.ts.map +1 -0
  25. package/dist/application/view.js +18 -0
  26. package/dist/{application/channels/children-channel.d.ts → channel/children.d.ts} +4 -4
  27. package/dist/channel/children.d.ts.map +1 -0
  28. package/dist/channel/listeners.d.ts +8 -0
  29. package/dist/channel/listeners.d.ts.map +1 -0
  30. package/dist/{adapters/message-port.transport.d.ts → channel/message-port.d.ts} +2 -2
  31. package/dist/channel/message-port.d.ts.map +1 -0
  32. package/dist/{application/channels → channel}/observer.d.ts +2 -1
  33. package/dist/channel/observer.d.ts.map +1 -0
  34. package/dist/{application/channels/parent-channel.d.ts → channel/parent.d.ts} +4 -4
  35. package/dist/channel/parent.d.ts.map +1 -0
  36. package/dist/{application/channels/parent-channel.js → channel/parent.js} +1 -1
  37. package/dist/channel/transport.d.ts +8 -0
  38. package/dist/channel/transport.d.ts.map +1 -0
  39. package/dist/index.d.ts +56 -41
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +23 -20
  42. package/dist/{domain/intent → intent}/middleware/capabilities.d.ts +2 -2
  43. package/dist/intent/middleware/capabilities.d.ts.map +1 -0
  44. package/dist/intent/middleware/logging.d.ts.map +1 -0
  45. package/dist/{domain/intent → intent}/middleware/rate-limit.d.ts +1 -1
  46. package/dist/intent/middleware/rate-limit.d.ts.map +1 -0
  47. package/dist/{application/intent/pipeline-runner.d.ts → intent/pipeline.d.ts} +3 -3
  48. package/dist/intent/pipeline.d.ts.map +1 -0
  49. package/dist/intent/policy.d.ts +40 -0
  50. package/dist/intent/policy.d.ts.map +1 -0
  51. package/dist/intent/policy.js +15 -0
  52. package/dist/{application/intent → intent}/request.d.ts +5 -14
  53. package/dist/intent/request.d.ts.map +1 -0
  54. package/dist/{application/intent → intent}/request.js +6 -20
  55. package/dist/intent/router.d.ts +31 -0
  56. package/dist/intent/router.d.ts.map +1 -0
  57. package/dist/{application/intent → intent}/router.js +1 -15
  58. package/dist/kernel/client.d.ts +33 -0
  59. package/dist/kernel/client.d.ts.map +1 -0
  60. package/dist/kernel/credential.d.ts +35 -0
  61. package/dist/kernel/credential.d.ts.map +1 -0
  62. package/dist/kernel/credential.js +43 -0
  63. package/dist/kernel/delegated.d.ts +17 -0
  64. package/dist/kernel/delegated.d.ts.map +1 -0
  65. package/dist/kernel/delegated.js +29 -0
  66. package/dist/{application/windowing/token-refresh.d.ts → kernel/delegation/refresh.d.ts} +2 -2
  67. package/dist/kernel/delegation/refresh.d.ts.map +1 -0
  68. package/dist/{application/windowing/token-refresh.js → kernel/delegation/refresh.js} +1 -1
  69. package/dist/{domain/identity/delegation.d.ts → kernel/delegation/token.d.ts} +1 -1
  70. package/dist/kernel/delegation/token.d.ts.map +1 -0
  71. package/dist/{adapters/kernel-client.adapter.d.ts → kernel/session.d.ts} +15 -12
  72. package/dist/kernel/session.d.ts.map +1 -0
  73. package/dist/{adapters/kernel-client.adapter.js → kernel/session.js} +10 -15
  74. package/dist/message/ctrl.d.ts +34 -0
  75. package/dist/message/ctrl.d.ts.map +1 -0
  76. package/dist/message/error.d.ts +9 -0
  77. package/dist/message/error.d.ts.map +1 -0
  78. package/dist/{application/windowing/protocol.d.ts → message/init.d.ts} +1 -1
  79. package/dist/message/init.d.ts.map +1 -0
  80. package/dist/{domain/message/registries.d.ts → message/intent.d.ts} +45 -37
  81. package/dist/message/intent.d.ts.map +1 -0
  82. package/dist/message/message.d.ts +10 -0
  83. package/dist/message/message.d.ts.map +1 -0
  84. package/dist/shell/access.d.ts +10 -0
  85. package/dist/shell/access.d.ts.map +1 -0
  86. package/dist/shell/access.js +19 -0
  87. package/dist/shell/build.d.ts +28 -0
  88. package/dist/shell/build.d.ts.map +1 -0
  89. package/dist/shell/build.js +58 -0
  90. package/dist/shell/config.d.ts +29 -0
  91. package/dist/shell/config.d.ts.map +1 -0
  92. package/dist/shell/create.d.ts +4 -0
  93. package/dist/shell/create.d.ts.map +1 -0
  94. package/dist/shell/create.js +5 -0
  95. package/dist/{application/windowing/child-init.d.ts → shell/sandboxed/boot.d.ts} +5 -5
  96. package/dist/shell/sandboxed/boot.d.ts.map +1 -0
  97. package/dist/{application/windowing/child-init.js → shell/sandboxed/boot.js} +5 -6
  98. package/dist/shell/sandboxed/guarded.d.ts +13 -0
  99. package/dist/shell/sandboxed/guarded.d.ts.map +1 -0
  100. package/dist/shell/sandboxed/guarded.js +28 -0
  101. package/dist/shell/sandboxed/pending.d.ts +14 -0
  102. package/dist/shell/sandboxed/pending.d.ts.map +1 -0
  103. package/dist/shell/sandboxed/pending.js +30 -0
  104. package/dist/shell/sandboxed/sandboxed.d.ts +4 -0
  105. package/dist/shell/sandboxed/sandboxed.d.ts.map +1 -0
  106. package/dist/shell/sandboxed/sandboxed.js +100 -0
  107. package/dist/shell/shell.d.ts +36 -0
  108. package/dist/shell/shell.d.ts.map +1 -0
  109. package/dist/shell/standalone.d.ts +4 -0
  110. package/dist/shell/standalone.d.ts.map +1 -0
  111. package/dist/shell/standalone.js +85 -0
  112. package/dist/{domain/window/config.d.ts → window/capabilities.d.ts} +3 -3
  113. package/dist/window/capabilities.d.ts.map +1 -0
  114. package/dist/{ports/shell-adapter.d.ts → window/embed/adapter.d.ts} +3 -2
  115. package/dist/window/embed/adapter.d.ts.map +1 -0
  116. package/dist/{adapters/iframe.shell-adapter.d.ts → window/embed/iframe.d.ts} +2 -2
  117. package/dist/window/embed/iframe.d.ts.map +1 -0
  118. package/dist/{application/windowing/lifecycle-controller.d.ts → window/lifecycle/states.d.ts} +4 -3
  119. package/dist/window/lifecycle/states.d.ts.map +1 -0
  120. package/dist/{application/windowing/lifecycle-controller.js → window/lifecycle/states.js} +1 -1
  121. package/dist/{domain/window/lifecycle.d.ts → window/lifecycle/transition.d.ts} +3 -3
  122. package/dist/window/lifecycle/transition.d.ts.map +1 -0
  123. package/dist/{domain/window/lifecycle.js → window/lifecycle/transition.js} +1 -1
  124. package/dist/window/mount/close.d.ts +27 -0
  125. package/dist/window/mount/close.d.ts.map +1 -0
  126. package/dist/window/mount/close.js +74 -0
  127. package/dist/window/mount/credential.d.ts +41 -0
  128. package/dist/window/mount/credential.d.ts.map +1 -0
  129. package/dist/window/mount/credential.js +74 -0
  130. package/dist/window/mount/handshake.d.ts.map +1 -0
  131. package/dist/{application/windowing → window/mount}/handshake.js +1 -1
  132. package/dist/{application/windowing/mount-controller.d.ts → window/mount/mount.d.ts} +7 -7
  133. package/dist/window/mount/mount.d.ts.map +1 -0
  134. package/dist/window/mount/mount.js +143 -0
  135. package/dist/window/mount/params.d.ts +73 -0
  136. package/dist/window/mount/params.d.ts.map +1 -0
  137. package/dist/window/mount/params.js +1 -0
  138. package/dist/window/mount/plain.d.ts +20 -0
  139. package/dist/window/mount/plain.d.ts.map +1 -0
  140. package/dist/window/mount/plain.js +46 -0
  141. package/dist/{domain/window → window}/window.d.ts +1 -1
  142. package/dist/window/window.d.ts.map +1 -0
  143. package/dist/window/window.js +1 -0
  144. package/package.json +11 -6
  145. package/src/application/apps.ts +60 -0
  146. package/src/application/namespaces.ts +38 -0
  147. package/src/application/session/open.ts +73 -0
  148. package/src/application/session/session.ts +46 -0
  149. package/src/application/session/token.ts +87 -0
  150. package/src/application/spaces.ts +52 -0
  151. package/src/application/user.ts +54 -0
  152. package/src/application/view.ts +42 -0
  153. package/src/{application/channels/children-channel.ts → channel/children.ts} +3 -3
  154. package/src/{application/channels/types.ts → channel/listeners.ts} +2 -7
  155. package/src/{adapters/message-port.transport.ts → channel/message-port.ts} +2 -2
  156. package/src/{application/channels → channel}/observer.ts +2 -1
  157. package/src/{application/channels/parent-channel.ts → channel/parent.ts} +4 -4
  158. package/src/{ports → channel}/transport.ts +2 -1
  159. package/src/index.ts +80 -88
  160. package/src/{domain/intent → intent}/middleware/capabilities.ts +2 -3
  161. package/src/{domain/intent → intent}/middleware/logging.ts +1 -1
  162. package/src/{domain/intent → intent}/middleware/rate-limit.ts +1 -1
  163. package/src/{application/intent/pipeline-runner.ts → intent/pipeline.ts} +3 -2
  164. package/src/intent/policy.ts +46 -0
  165. package/src/{application/intent → intent}/request.ts +14 -34
  166. package/src/{application/intent → intent}/router.ts +12 -49
  167. package/src/kernel/client.ts +33 -0
  168. package/src/kernel/credential.ts +78 -0
  169. package/src/kernel/delegated.ts +49 -0
  170. package/src/{application/windowing/token-refresh.ts → kernel/delegation/refresh.ts} +2 -2
  171. package/src/{adapters/kernel-client.adapter.ts → kernel/session.ts} +26 -33
  172. package/src/message/ctrl.ts +25 -0
  173. package/src/{domain/message/errors.ts → message/error.ts} +8 -0
  174. package/src/message/intent.ts +98 -0
  175. package/src/message/message.ts +11 -0
  176. package/src/shell/access.ts +26 -0
  177. package/src/shell/build.ts +95 -0
  178. package/src/shell/config.ts +32 -0
  179. package/src/shell/create.ts +9 -0
  180. package/src/{application/windowing/child-init.ts → shell/sandboxed/boot.ts} +10 -11
  181. package/src/shell/sandboxed/guarded.ts +32 -0
  182. package/src/shell/sandboxed/pending.ts +52 -0
  183. package/src/shell/sandboxed/sandboxed.ts +131 -0
  184. package/src/shell/shell.ts +37 -0
  185. package/src/shell/standalone.ts +97 -0
  186. package/src/{domain/window/config.ts → window/capabilities.ts} +2 -2
  187. package/src/{ports/shell-adapter.ts → window/embed/adapter.ts} +2 -1
  188. package/src/{adapters/iframe.shell-adapter.ts → window/embed/iframe.ts} +2 -2
  189. package/src/{application/windowing/lifecycle-controller.ts → window/lifecycle/states.ts} +3 -2
  190. package/src/{domain/window/lifecycle.ts → window/lifecycle/transition.ts} +2 -2
  191. package/src/window/mount/close.ts +111 -0
  192. package/src/window/mount/credential.ts +101 -0
  193. package/src/{application/windowing → window/mount}/handshake.ts +3 -2
  194. package/src/window/mount/mount.ts +185 -0
  195. package/src/window/mount/params.ts +64 -0
  196. package/src/window/mount/plain.ts +68 -0
  197. package/src/{domain/window → window}/window.ts +1 -1
  198. package/dist/adapters/iframe.shell-adapter.d.ts.map +0 -1
  199. package/dist/adapters/kernel-client.adapter.d.ts.map +0 -1
  200. package/dist/adapters/message-port.transport.d.ts.map +0 -1
  201. package/dist/application/channels/children-channel.d.ts.map +0 -1
  202. package/dist/application/channels/observer.d.ts.map +0 -1
  203. package/dist/application/channels/parent-channel.d.ts.map +0 -1
  204. package/dist/application/channels/types.d.ts +0 -12
  205. package/dist/application/channels/types.d.ts.map +0 -1
  206. package/dist/application/intent/pipeline-runner.d.ts.map +0 -1
  207. package/dist/application/intent/request.d.ts.map +0 -1
  208. package/dist/application/intent/router.d.ts +0 -56
  209. package/dist/application/intent/router.d.ts.map +0 -1
  210. package/dist/application/kernel-facade.d.ts +0 -33
  211. package/dist/application/kernel-facade.d.ts.map +0 -1
  212. package/dist/application/kernel-facade.js +0 -77
  213. package/dist/application/shell.d.ts +0 -100
  214. package/dist/application/shell.d.ts.map +0 -1
  215. package/dist/application/shell.js +0 -256
  216. package/dist/application/windowing/child-init.d.ts.map +0 -1
  217. package/dist/application/windowing/handshake.d.ts.map +0 -1
  218. package/dist/application/windowing/lifecycle-controller.d.ts.map +0 -1
  219. package/dist/application/windowing/mount-controller.d.ts.map +0 -1
  220. package/dist/application/windowing/mount-controller.js +0 -277
  221. package/dist/application/windowing/protocol.d.ts.map +0 -1
  222. package/dist/application/windowing/token-refresh.d.ts.map +0 -1
  223. package/dist/domain/identity/delegation.d.ts.map +0 -1
  224. package/dist/domain/identity/path.d.ts +0 -11
  225. package/dist/domain/identity/path.d.ts.map +0 -1
  226. package/dist/domain/identity/path.js +0 -13
  227. package/dist/domain/identity/resolve-self.d.ts +0 -21
  228. package/dist/domain/identity/resolve-self.d.ts.map +0 -1
  229. package/dist/domain/identity/resolve-self.js +0 -36
  230. package/dist/domain/intent/middleware/capabilities.d.ts.map +0 -1
  231. package/dist/domain/intent/middleware/logging.d.ts.map +0 -1
  232. package/dist/domain/intent/middleware/rate-limit.d.ts.map +0 -1
  233. package/dist/domain/intent/pipeline.d.ts +0 -3
  234. package/dist/domain/intent/pipeline.d.ts.map +0 -1
  235. package/dist/domain/intent/router.d.ts +0 -6
  236. package/dist/domain/intent/router.d.ts.map +0 -1
  237. package/dist/domain/message/errors.d.ts +0 -2
  238. package/dist/domain/message/errors.d.ts.map +0 -1
  239. package/dist/domain/message/registries.d.ts.map +0 -1
  240. package/dist/domain/message/types.d.ts +0 -30
  241. package/dist/domain/message/types.d.ts.map +0 -1
  242. package/dist/domain/window/config.d.ts.map +0 -1
  243. package/dist/domain/window/lifecycle.d.ts.map +0 -1
  244. package/dist/domain/window/window.d.ts.map +0 -1
  245. package/dist/ports/kernel-client.d.ts +0 -33
  246. package/dist/ports/kernel-client.d.ts.map +0 -1
  247. package/dist/ports/shell-adapter.d.ts.map +0 -1
  248. package/dist/ports/transport.d.ts +0 -7
  249. package/dist/ports/transport.d.ts.map +0 -1
  250. package/src/application/kernel-facade.ts +0 -143
  251. package/src/application/shell.ts +0 -433
  252. package/src/application/windowing/mount-controller.ts +0 -335
  253. package/src/domain/identity/path.ts +0 -14
  254. package/src/domain/identity/resolve-self.ts +0 -38
  255. package/src/domain/intent/pipeline.ts +0 -3
  256. package/src/domain/intent/router.ts +0 -6
  257. package/src/domain/message/registries.ts +0 -76
  258. package/src/domain/message/types.ts +0 -32
  259. package/src/ports/kernel-client.ts +0 -32
  260. /package/dist/{application/channels/children-channel.js → channel/children.js} +0 -0
  261. /package/dist/{application/channels/types.js → channel/listeners.js} +0 -0
  262. /package/dist/{adapters/message-port.transport.js → channel/message-port.js} +0 -0
  263. /package/dist/{application/channels → channel}/observer.js +0 -0
  264. /package/dist/{ports → channel}/transport.js +0 -0
  265. /package/dist/{domain/intent → intent}/middleware/capabilities.js +0 -0
  266. /package/dist/{domain/intent → intent}/middleware/logging.d.ts +0 -0
  267. /package/dist/{domain/intent → intent}/middleware/logging.js +0 -0
  268. /package/dist/{domain/intent → intent}/middleware/rate-limit.js +0 -0
  269. /package/dist/{application/intent/pipeline-runner.js → intent/pipeline.js} +0 -0
  270. /package/dist/{domain/intent/pipeline.js → kernel/client.js} +0 -0
  271. /package/dist/{domain/identity/delegation.js → kernel/delegation/token.js} +0 -0
  272. /package/dist/{domain/intent/router.js → message/ctrl.js} +0 -0
  273. /package/dist/{domain/message/errors.js → message/error.js} +0 -0
  274. /package/dist/{application/windowing/protocol.js → message/init.js} +0 -0
  275. /package/dist/{domain/message/registries.js → message/intent.js} +0 -0
  276. /package/dist/{domain/message/types.js → message/message.js} +0 -0
  277. /package/dist/{domain/window → shell}/config.js +0 -0
  278. /package/dist/{domain/window/window.js → shell/shell.js} +0 -0
  279. /package/dist/{ports/kernel-client.js → window/capabilities.js} +0 -0
  280. /package/dist/{ports/shell-adapter.js → window/embed/adapter.js} +0 -0
  281. /package/dist/{adapters/iframe.shell-adapter.js → window/embed/iframe.js} +0 -0
  282. /package/dist/{application/windowing → window/mount}/handshake.d.ts +0 -0
  283. /package/src/{domain/identity/delegation.ts → kernel/delegation/token.ts} +0 -0
  284. /package/src/{application/windowing/protocol.ts → message/init.ts} +0 -0
@@ -1,256 +0,0 @@
1
- import { createKernelClientAdapter } from '../adapters/kernel-client.adapter';
2
- import { createChildrenChannel } from './channels/children-channel';
3
- import { createMessageObserver } from './channels/observer';
4
- import { createIntentPipeline } from './intent/pipeline-runner';
5
- import { createIntentRouter } from './intent/router';
6
- import { createKernelFacade } from './kernel-facade';
7
- import { performChildInit } from './windowing/child-init';
8
- import { createLifecycleController } from './windowing/lifecycle-controller';
9
- import { createMountController } from './windowing/mount-controller';
10
- const DEFAULT_ROOT_WINDOW_ID = 'root';
11
- /** Trusted sender id stamped on intents arriving from the parent channel. */
12
- const PARENT_SENDER_ID = '<parent>';
13
- // ─── Factory ────────────────────────────────────────────────────────────────
14
- export function createShell(config) {
15
- return config.mode === 'standalone' ? createStandaloneShell(config) : createSandboxedShell(config);
16
- }
17
- // ─── Standalone ─────────────────────────────────────────────────────────────
18
- function createStandaloneShell(config) {
19
- const windowId = config.windowId ?? DEFAULT_ROOT_WINDOW_ID;
20
- const observer = createMessageObserver();
21
- const getCredential = config.getCredential ??
22
- (() => {
23
- if (config.credential === undefined) {
24
- throw new Error('Standalone shell requires credential or getCredential');
25
- }
26
- return config.credential;
27
- });
28
- const adapter = createKernelClientAdapter({
29
- url: config.kernelUrl,
30
- schema: config.schema,
31
- getCredential,
32
- mintIdentity: config.mintIdentity,
33
- fetch: config.fetch,
34
- });
35
- const kernel = createKernelFacade({
36
- adapter,
37
- getCredential,
38
- url: config.kernelUrl,
39
- mintIdentity: config.mintIdentity,
40
- });
41
- const lifecycle = createLifecycleController();
42
- const windows = new Map();
43
- const childrenChannel = createChildrenChannel({
44
- observer,
45
- onDeliveryFailed: (toWindowId) => lifecycle.markCrashed(toWindowId),
46
- });
47
- const pipeline = createIntentPipeline();
48
- const router = createIntentRouter({
49
- selfWindowId: windowId,
50
- pipeline,
51
- parent: null,
52
- children: childrenChannel,
53
- windows,
54
- });
55
- childrenChannel.on('intent', (windowId, message) => {
56
- void router.handleInbound('child', message, windowId);
57
- });
58
- let mountController = null;
59
- function getMountController() {
60
- if (mountController)
61
- return mountController;
62
- if (!config.adapter) {
63
- throw new Error('Shell.mount() requires a ShellAdapter in the config');
64
- }
65
- mountController = createMountController({
66
- adapter: config.adapter,
67
- kernel,
68
- kernelUrl: config.kernelUrl,
69
- mintIdentity: config.mintIdentity,
70
- childrenChannel,
71
- windows,
72
- lifecycle,
73
- });
74
- return mountController;
75
- }
76
- return buildShellFacade({
77
- parent: null,
78
- childrenChannel,
79
- kernel,
80
- pipeline,
81
- observer,
82
- lifecycle,
83
- windows,
84
- getMountController,
85
- onIntent: (name, handler) => router.onLocal(name, handler),
86
- onDispose: async () => {
87
- if (mountController)
88
- await mountController.dispose();
89
- childrenChannel.dispose();
90
- adapter.disconnect();
91
- },
92
- });
93
- }
94
- function createSandboxedShell(config) {
95
- const observer = createMessageObserver();
96
- const lifecycle = createLifecycleController();
97
- const windows = new Map();
98
- const childrenChannel = createChildrenChannel({
99
- observer,
100
- onDeliveryFailed: (toWindowId) => lifecycle.markCrashed(toWindowId),
101
- });
102
- const pipeline = createIntentPipeline();
103
- let state = null;
104
- let router = null;
105
- let mountController = null;
106
- const pendingIntentSubs = [];
107
- function subscribeIntent(name, handler) {
108
- if (router)
109
- return router.onLocal(name, handler);
110
- const entry = {
111
- name: name,
112
- handler: handler,
113
- unsubscribed: false,
114
- };
115
- pendingIntentSubs.push(entry);
116
- return () => {
117
- entry.unsubscribed = true;
118
- // After init, `off` is the router's real disposer (set during replay);
119
- // before init, flipping `unsubscribed` is enough (replay skips it).
120
- entry.off?.();
121
- };
122
- }
123
- const requireState = () => {
124
- if (!state)
125
- throw new Error('Sandboxed shell not initialized — call shell.init() first');
126
- return state;
127
- };
128
- const kernelProxy = {
129
- call: (path, params) => requireState().kernel.call(path, params),
130
- mintDelegation: () => requireState().kernel.mintDelegation(),
131
- authToken: () => requireState().kernel.authToken(),
132
- get url() {
133
- return requireState().kernel.url;
134
- },
135
- };
136
- const parentProxy = {
137
- send: (message) => requireState().parent.send(message),
138
- on: (type, handler) => requireState().parent.on(type, handler),
139
- };
140
- function getMountController() {
141
- if (mountController)
142
- return mountController;
143
- if (!config.adapter) {
144
- throw new Error('Shell.mount() requires a ShellAdapter in the config');
145
- }
146
- const current = requireState();
147
- mountController = createMountController({
148
- adapter: config.adapter,
149
- kernel: kernelProxy,
150
- kernelUrl: current.kernelUrl,
151
- mintIdentity: current.mintIdentity,
152
- childrenChannel,
153
- windows,
154
- lifecycle,
155
- });
156
- return mountController;
157
- }
158
- return buildShellFacade({
159
- parent: parentProxy,
160
- childrenChannel,
161
- kernel: kernelProxy,
162
- pipeline,
163
- observer,
164
- lifecycle,
165
- windows,
166
- getMountController,
167
- targetNodeId: () => state?.targetNodeId,
168
- onIntent: subscribeIntent,
169
- init: async () => {
170
- const result = await performChildInit({
171
- parent: config.parentWindow ?? window.parent,
172
- timeoutMs: config.initTimeoutMs,
173
- schema: config.schema,
174
- });
175
- state = {
176
- windowId: result.windowId,
177
- kernelUrl: result.kernelUrl,
178
- targetNodeId: result.targetNodeId,
179
- mintIdentity: result.mintIdentity,
180
- kernel: result.kernel,
181
- parent: result.parentChannel(observer),
182
- };
183
- router = createIntentRouter({
184
- selfWindowId: state.windowId,
185
- pipeline,
186
- parent: state.parent,
187
- children: childrenChannel,
188
- windows,
189
- });
190
- childrenChannel.on('intent', (windowId, message) => {
191
- void router.handleInbound('child', message, windowId);
192
- });
193
- state.parent.on('intent', (message) => {
194
- void router.handleInbound('parent', message, PARENT_SENDER_ID);
195
- });
196
- // Replay subscriptions registered before init. Capture each real disposer
197
- // so a post-init unsubscribe (via the closure returned at subscribe time)
198
- // actually removes the handler from the router instead of no-op'ing.
199
- for (const entry of pendingIntentSubs) {
200
- if (entry.unsubscribed)
201
- continue;
202
- entry.off = router.onLocal(entry.name, entry.handler);
203
- }
204
- pendingIntentSubs.length = 0;
205
- },
206
- onDispose: async () => {
207
- if (mountController)
208
- await mountController.dispose();
209
- childrenChannel.dispose();
210
- state?.parent.dispose();
211
- state?.kernel.dispose();
212
- },
213
- });
214
- }
215
- function buildShellFacade(deps) {
216
- let disposed = false;
217
- const shell = {
218
- get parent() {
219
- return deps.parent;
220
- },
221
- children: deps.childrenChannel,
222
- kernel: deps.kernel,
223
- windows: deps.windows,
224
- get targetNodeId() {
225
- return deps.targetNodeId?.();
226
- },
227
- use(middleware) {
228
- deps.pipeline.use(middleware);
229
- return shell;
230
- },
231
- onMessage(handler) {
232
- return deps.observer.subscribe(handler);
233
- },
234
- onIntent(name, handler) {
235
- return deps.onIntent(name, handler);
236
- },
237
- mount(params) {
238
- return deps.getMountController().mount(params);
239
- },
240
- close(windowId, opts) {
241
- return deps.getMountController().close(windowId, opts);
242
- },
243
- async init() {
244
- if (deps.init)
245
- await deps.init();
246
- return shell;
247
- },
248
- async dispose() {
249
- if (disposed)
250
- return;
251
- disposed = true;
252
- await deps.onDispose();
253
- },
254
- };
255
- return shell;
256
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"child-init.d.ts","sourceRoot":"","sources":["../../../src/application/windowing/child-init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAE/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAEvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAA;AAKzE,OAAO,EAEL,KAAK,gCAAgC,EACtC,MAAM,kBAAkB,CAAA;AAGzB,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,aAAa,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,uBAAuB,CAAA;IAC9E,QAAQ,CAAC,MAAM,EAAE,gCAAgC,CAAA;IACjD,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAA;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAC/B,CAAA;AAID,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAoGlF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"handshake.d.ts","sourceRoot":"","sources":["../../../src/application/windowing/handshake.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAA;IAClC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC9E;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAEjD,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAC3B,CAAA;AAED,qGAAqG;AACrG,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAsEpF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"lifecycle-controller.d.ts","sourceRoot":"","sources":["../../../src/application/windowing/lifecycle-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAE7D,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAE/E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;IACvD,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,WAAW,GAAG,IAAI,CAAA;IAClE,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAC/B;AAED,wBAAgB,yBAAyB,IAAI,mBAAmB,CA4B/D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"mount-controller.d.ts","sourceRoot":"","sources":["../../../src/application/windowing/mount-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,2BAA2B,CAAA;AAC3E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAA;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAWjE,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,YAAY,CAAA;IACrB,MAAM,EAAE,YAAY,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,yBAAyB,CAAA;IAC1C,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,SAAS,EAAE,mBAAmB,CAAA;CAC/B,CAAA;AAED,MAAM,WAAW,eAAe;IAC9B,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;IAC7F,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACzB;AAiBD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,eAAe,CAqPpF"}
@@ -1,277 +0,0 @@
1
- import { createMessagePortTransport } from '../../adapters/message-port.transport';
2
- import { runParentHandshake } from './handshake';
3
- import { createTokenRefresher } from './token-refresh';
4
- const DEFAULT_HANDSHAKE_TIMEOUT = 5_000;
5
- const DEFAULT_DELEGATION_TTL = 3_600;
6
- const DEFAULT_CLOSE_TIMEOUT = 3_000;
7
- const PARENT_SENDER_ID = '<parent>';
8
- /** No-op refresher for plain mounts (no token to refresh). */
9
- const NOOP_REFRESHER = {
10
- start: () => { },
11
- stop: () => { },
12
- forceRefreshNow: () => Promise.resolve(),
13
- };
14
- export function createMountController(config) {
15
- const { adapter, kernel, kernelUrl, mintIdentity, childrenChannel, windows, lifecycle } = config;
16
- // The child iframe is always a DIFFERENT origin from this parent window, so a
17
- // relative kernelUrl (e.g. the SPA's same-origin `/api/`) handed across the
18
- // handshake would resolve against the iframe's OWN origin and POST to the
19
- // wrong host. Absolutize it against the parent's location once so every child
20
- // calls THIS origin's kernel. (The parent's own calls keep using the relative
21
- // form via its kernel client / fetch.)
22
- const childKernelUrl = new URL(kernelUrl, window.location.href).href;
23
- const entries = new Map();
24
- let seq = 0;
25
- let disposed = false;
26
- function nextWindowId(functionId) {
27
- seq += 1;
28
- const slug = functionId.replace(/[^a-z0-9]/gi, '').slice(-8) || 'fn';
29
- return `win-${slug}-${seq}`;
30
- }
31
- async function mint(ttlSeconds) {
32
- const credential = await kernel.mintDelegation();
33
- return { credential, expiresAt: Date.now() + ttlSeconds * 1_000 };
34
- }
35
- function originOf(url) {
36
- try {
37
- return new URL(url, window.location.href).origin;
38
- }
39
- catch {
40
- throw new Error(`Invalid mount url: ${url}`);
41
- }
42
- }
43
- // Plain-iframe mount path — for hosted views that don't speak the shell
44
- // protocol. No handshake, no transport, no delegation token, no refresher;
45
- // the iframe just renders. `close()` skips the ack request (no channel) and
46
- // falls straight to dispose.
47
- async function mountPlain(params) {
48
- const windowId = nextWindowId(params.functionId);
49
- const { handle, dispose: disposeHandle } = adapter.mount({
50
- functionId: params.functionId,
51
- isolation: 'sandboxed',
52
- capabilities: params.capabilities,
53
- sandbox: params.sandbox,
54
- });
55
- if (!(handle.element instanceof HTMLIFrameElement)) {
56
- disposeHandle();
57
- throw new Error('Shell adapter did not produce an HTMLIFrameElement');
58
- }
59
- params.host.appendChild(handle.element);
60
- handle.element.src = params.url;
61
- windows.set(windowId, {
62
- windowId,
63
- functionId: params.functionId,
64
- targetNodeId: params.targetNodeId,
65
- isolation: 'sandboxed',
66
- state: 'active',
67
- delegationToken: null,
68
- capabilities: params.capabilities,
69
- });
70
- lifecycle.register(windowId, 'active');
71
- entries.set(windowId, {
72
- handle,
73
- dispose: disposeHandle,
74
- refresher: NOOP_REFRESHER,
75
- plain: true,
76
- });
77
- return {
78
- windowId,
79
- get window() {
80
- return windows.get(windowId);
81
- },
82
- handle: { element: handle.element },
83
- close: (opts) => controller.close(windowId, opts),
84
- };
85
- }
86
- const controller = {
87
- async mount(params) {
88
- if (disposed)
89
- throw new Error('MountController is disposed');
90
- // Plain (no-handshake) path: hosted views that don't speak the shell
91
- // protocol. Skip mint/handshake/transport/refresher; the iframe still
92
- // renders and `close()` falls through to dispose.
93
- if (params.handshake === 'none')
94
- return mountPlain(params);
95
- const ttlSeconds = params.delegationTtlSeconds ?? DEFAULT_DELEGATION_TTL;
96
- const handshakeTimeout = params.handshakeTimeoutMs ?? DEFAULT_HANDSHAKE_TIMEOUT;
97
- const expectedOrigin = originOf(params.url);
98
- const windowId = nextWindowId(params.functionId);
99
- // Mint the token and create the iframe in parallel — the iframe
100
- // doesn't need the credential until the handshake fires.
101
- const [{ credential, expiresAt }, mounted] = await Promise.all([
102
- mint(ttlSeconds),
103
- Promise.resolve(adapter.mount({
104
- functionId: params.functionId,
105
- isolation: 'sandboxed',
106
- capabilities: params.capabilities,
107
- sandbox: params.sandbox,
108
- })),
109
- ]);
110
- const { handle, dispose: disposeHandle } = mounted;
111
- if (!(handle.element instanceof HTMLIFrameElement)) {
112
- disposeHandle();
113
- throw new Error('Shell adapter did not produce an HTMLIFrameElement');
114
- }
115
- params.host.appendChild(handle.element);
116
- handle.element.src = params.url;
117
- let handshakeResult;
118
- try {
119
- handshakeResult = await runParentHandshake({
120
- iframe: handle.element,
121
- expectedOrigin,
122
- windowId,
123
- delegationToken: credential,
124
- tokenExpiresAt: expiresAt,
125
- kernelUrl: childKernelUrl,
126
- functionId: params.functionId,
127
- targetNodeId: params.targetNodeId,
128
- mintIdentity,
129
- timeoutMs: handshakeTimeout,
130
- });
131
- }
132
- catch (err) {
133
- disposeHandle();
134
- throw err;
135
- }
136
- const transport = createMessagePortTransport({
137
- port: handshakeResult.port,
138
- onClose: () => {
139
- if (!entries.has(windowId))
140
- return;
141
- lifecycle.markCrashed(windowId);
142
- void controller.close(windowId, { force: true }).catch(() => { });
143
- },
144
- });
145
- childrenChannel.attach(windowId, transport);
146
- windows.set(windowId, {
147
- windowId,
148
- functionId: params.functionId,
149
- targetNodeId: params.targetNodeId,
150
- isolation: 'sandboxed',
151
- state: 'active',
152
- delegationToken: credential,
153
- capabilities: params.capabilities,
154
- });
155
- lifecycle.register(windowId, 'active');
156
- // The live expiry advances on every refresh. The Window store only keeps
157
- // the credential, so track expiry here — otherwise `token()` keeps
158
- // returning the original expiry and `schedule()` collapses its lead time
159
- // to 0, busy-looping `mint()` forever after the first refresh.
160
- let currentExpiresAt = expiresAt;
161
- const refresher = createTokenRefresher({
162
- functionId: params.functionId,
163
- token: () => {
164
- const stored = windows.get(windowId);
165
- return {
166
- credential: stored?.delegationToken ?? credential,
167
- expiresAt: currentExpiresAt,
168
- issuedAt: 0,
169
- scope: { functionId: params.functionId },
170
- };
171
- },
172
- setToken: (next) => {
173
- currentExpiresAt = next.expiresAt;
174
- const stored = windows.get(windowId);
175
- if (stored) {
176
- windows.set(windowId, { ...stored, delegationToken: next.credential });
177
- }
178
- childrenChannel.send(windowId, {
179
- type: 'ctrl',
180
- version: 1,
181
- action: 'tokenRefresh',
182
- data: { delegationToken: next.credential, tokenExpiresAt: next.expiresAt },
183
- });
184
- },
185
- mint: () => mint(ttlSeconds),
186
- onFailure: () => {
187
- void controller.close(windowId, { force: false }).catch(() => { });
188
- },
189
- });
190
- refresher.start();
191
- entries.set(windowId, { handle, dispose: disposeHandle, refresher });
192
- return {
193
- windowId,
194
- get window() {
195
- return windows.get(windowId);
196
- },
197
- handle: { element: handle.element },
198
- close: (opts) => controller.close(windowId, opts),
199
- };
200
- },
201
- async close(windowId, opts) {
202
- const entry = entries.get(windowId);
203
- if (!entry)
204
- return { kind: 'noop' };
205
- const timeoutMs = opts?.timeoutMs ?? DEFAULT_CLOSE_TIMEOUT;
206
- // Plain mounts have no channel to ack a close; always force.
207
- if (!opts?.force && !entry.plain) {
208
- // Move the window into `closing` so the state machine accepts the
209
- // subsequent `closeRefuse`/`forceClose` transition (both are only valid
210
- // from `closing`).
211
- lifecycle.apply(windowId, { kind: 'requestClose' });
212
- const accepted = await requestCloseAck(childrenChannel, windowId, timeoutMs);
213
- if (accepted.kind === 'refused') {
214
- lifecycle.apply(windowId, { kind: 'closeRefuse' });
215
- return { kind: 'refused', reason: accepted.reason };
216
- }
217
- }
218
- lifecycle.apply(windowId, { kind: 'forceClose' });
219
- entry.refresher.stop();
220
- // Drop the entry before detaching: `detach` synchronously closes the
221
- // transport, whose `onClose` re-enters `close()`. Removing the entry first
222
- // makes that re-entrant call's `entries.has(windowId)` guard short-circuit,
223
- // so `entry.dispose()` runs exactly once (adapters need not be idempotent).
224
- entries.delete(windowId);
225
- childrenChannel.detach(windowId);
226
- windows.delete(windowId);
227
- entry.dispose();
228
- lifecycle.remove(windowId);
229
- return { kind: 'closed' };
230
- },
231
- async dispose() {
232
- if (disposed)
233
- return;
234
- disposed = true;
235
- const ids = [...entries.keys()];
236
- await Promise.all(ids.map((id) => controller.close(id, { force: true })));
237
- },
238
- };
239
- return controller;
240
- }
241
- async function requestCloseAck(children, windowId, timeoutMs) {
242
- return new Promise((resolve) => {
243
- let settled = false;
244
- const off = children.on('intent', (from, message) => {
245
- if (from !== windowId)
246
- return;
247
- if (message.envelope.name === 'closeAck') {
248
- settled = true;
249
- off();
250
- clearTimeout(timer);
251
- resolve({ kind: 'ack' });
252
- }
253
- else if (message.envelope.name === 'closeRefuse') {
254
- settled = true;
255
- off();
256
- clearTimeout(timer);
257
- const reason = message.envelope.payload.reason;
258
- resolve({ kind: 'refused', reason });
259
- }
260
- });
261
- const timer = setTimeout(() => {
262
- if (settled)
263
- return;
264
- off();
265
- resolve({ kind: 'timeout' });
266
- }, timeoutMs);
267
- children.send(windowId, {
268
- type: 'intent',
269
- version: 1,
270
- envelope: {
271
- name: 'willClose',
272
- payload: {},
273
- sender: { windowId: PARENT_SENDER_ID },
274
- },
275
- });
276
- });
277
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../src/application/windowing/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,iBAAiB,+BAA+B,CAAA;AAC7D,eAAO,MAAM,kBAAkB,gCAAgC,CAAA;AAE/D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,IAAI,EAAE,OAAO,iBAAiB,CAAA;IACvC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,IAAI,EAAE,OAAO,kBAAkB,CAAA;IACxC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;IACnB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAMzE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAM3E"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"token-refresh.d.ts","sourceRoot":"","sources":["../../../src/application/windowing/token-refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAIvE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,eAAe,CAAA;IACrC,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACvE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAC7C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAC5B,CAAA;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,IAAI,IAAI,CAAA;IACb,IAAI,IAAI,IAAI,CAAA;IACZ,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACjC;AAID,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,GAAG,cAAc,CAoD/E"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"delegation.d.ts","sourceRoot":"","sources":["../../../src/domain/identity/delegation.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAA;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,YAAY,GAAG,QAAQ,CAAA;AAEnF,kEAAkE;AAClE,eAAO,MAAM,iBAAiB,SAAU,CAAA;AAExC,wBAAgB,OAAO,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,SAAa,GAAG,UAAU,CAI5E;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,SAAa,GAAG,OAAO,CAE3E"}
@@ -1,11 +0,0 @@
1
- /**
2
- * Built-in kernel root identity, used as the default mint subject when no
3
- * explicit `mintIdentity` is configured.
4
- */
5
- export declare const SYSTEM_IDENTITY = "__system__";
6
- /**
7
- * Address a method on an identity or path: `@<id>::method` for a bare node id,
8
- * `<path>::method` for an absolute path (one starting with `/`).
9
- */
10
- export declare function identityMethod(identity: string, method: string): string;
11
- //# sourceMappingURL=path.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../src/domain/identity/path.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,eAAe,eAAe,CAAA;AAE3C;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGvE"}
@@ -1,13 +0,0 @@
1
- /**
2
- * Built-in kernel root identity, used as the default mint subject when no
3
- * explicit `mintIdentity` is configured.
4
- */
5
- export const SYSTEM_IDENTITY = '__system__';
6
- /**
7
- * Address a method on an identity or path: `@<id>::method` for a bare node id,
8
- * `<path>::method` for an absolute path (one starting with `/`).
9
- */
10
- export function identityMethod(identity, method) {
11
- const target = identity.startsWith('/') ? identity : `@${identity}`;
12
- return `${target}::${method}`;
13
- }
@@ -1,21 +0,0 @@
1
- /** Kernel path that returns the AUTHENTICATED caller's own identity node. */
2
- export declare const WHOAMI_PATH = "/:kernel.astrale.ai:interface.Identity:whoami";
3
- /**
4
- * Resolve the mint SUBJECT — the identity node a delegation/credential should be
5
- * minted for. It MUST be the principal the kernel actually authenticates this
6
- * caller as, otherwise the minted token impersonates someone else.
7
- *
8
- * Why a kernel round-trip and not the local credential: a cookie-fronted SPA
9
- * holds an EMPTY credential string (the session token lives in an httpOnly
10
- * cookie it can't read), so the subject cannot be derived locally. We ask the
11
- * kernel via `whoami`; that request carries the cookie, so the router unseals it
12
- * and the kernel answers with the logged-in user's node. Without this the shell
13
- * defaulted every mint to `__system__`, so a View iframe mounted by a logged-in
14
- * user acted as the kernel ROOT instead of as that user.
15
- *
16
- * `fallback` (the configured `mintIdentity`, default `__system__`) is used when
17
- * whoami can't be resolved — a genuinely system/dev caller, or an unauthenticated
18
- * boot. The result is cached: the principal is stable for a session.
19
- */
20
- export declare function createSelfResolver(fallback?: string): (whoami: () => Promise<unknown>) => Promise<string>;
21
- //# sourceMappingURL=resolve-self.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolve-self.d.ts","sourceRoot":"","sources":["../../../src/domain/identity/resolve-self.ts"],"names":[],"mappings":"AAEA,6EAA6E;AAC7E,eAAO,MAAM,WAAW,kDAAkD,CAAA;AAE1E;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,GAAE,MAAwB,GACjC,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAarD"}
@@ -1,36 +0,0 @@
1
- import { SYSTEM_IDENTITY } from './path';
2
- /** Kernel path that returns the AUTHENTICATED caller's own identity node. */
3
- export const WHOAMI_PATH = '/:kernel.astrale.ai:interface.Identity:whoami';
4
- /**
5
- * Resolve the mint SUBJECT — the identity node a delegation/credential should be
6
- * minted for. It MUST be the principal the kernel actually authenticates this
7
- * caller as, otherwise the minted token impersonates someone else.
8
- *
9
- * Why a kernel round-trip and not the local credential: a cookie-fronted SPA
10
- * holds an EMPTY credential string (the session token lives in an httpOnly
11
- * cookie it can't read), so the subject cannot be derived locally. We ask the
12
- * kernel via `whoami`; that request carries the cookie, so the router unseals it
13
- * and the kernel answers with the logged-in user's node. Without this the shell
14
- * defaulted every mint to `__system__`, so a View iframe mounted by a logged-in
15
- * user acted as the kernel ROOT instead of as that user.
16
- *
17
- * `fallback` (the configured `mintIdentity`, default `__system__`) is used when
18
- * whoami can't be resolved — a genuinely system/dev caller, or an unauthenticated
19
- * boot. The result is cached: the principal is stable for a session.
20
- */
21
- export function createSelfResolver(fallback = SYSTEM_IDENTITY) {
22
- let cached;
23
- return async (whoami) => {
24
- if (cached !== undefined)
25
- return cached;
26
- try {
27
- const me = (await whoami());
28
- const id = me && typeof me.id === 'string' && me.id.length > 0 ? me.id : undefined;
29
- cached = id ?? fallback;
30
- }
31
- catch {
32
- cached = fallback;
33
- }
34
- return cached;
35
- };
36
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../../src/domain/intent/middleware/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAE9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAEnD,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAA;AAEjF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,cAAc,CAAA;CACtC,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAA;IAEjC;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,mBAAmB,KAAK,IAAI,CAAA;IAE/D;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAE5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAC/B,CAAA;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,GAAG,gBAAgB,CAkBnF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../../../src/domain/intent/middleware/logging.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAEnD,MAAM,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAA;AAEvD,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,KAAK,EAAE,IAAI,GAAG,KAAK,CAAA;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,CAAA;CAC5B,CAAA;AAED,wBAAgB,iBAAiB,CAAC,MAAM,GAAE,aAAkB,GAAG,gBAAgB,CAQ9E"}