@almadar/shell-web 0.1.0 → 1.1.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 (131) hide show
  1. package/dist/{ArbitraryClassCompiler-Mzabq-UB.d.ts → ArbitraryClassCompiler-CO_iASBn.d.ts} +99 -4
  2. package/dist/AvlGlyph-PIXU6QH5.js +5 -0
  3. package/dist/AvlStateMachine-CKGMECMG.js +8 -0
  4. package/dist/AvlTransitionDetail-QZX6G5KJ.js +10 -0
  5. package/dist/AvlTransitionExplainer-26WLEIC6.js +11 -0
  6. package/dist/BehaviorView-JLZ4PKWY.js +10 -0
  7. package/dist/{EventBusProvider-CVwjkV_2.d.ts → EventBusProvider-BFFHfN4O.d.ts} +12 -0
  8. package/dist/{FileTree-BCFnBEuQ.d.ts → FileTree-B3GDAjaQ.d.ts} +131 -4
  9. package/dist/FlowCanvas-RPII4V24.js +23 -0
  10. package/dist/{BehaviorValueFrame-SSEMEBTG.css → FlowCanvas-VWUPMBKB.css} +189 -191
  11. package/dist/{GameAudioProvider-Cm9BnvmP.d.ts → GameAudioProvider-D7wo5ryN.d.ts} +5 -8
  12. package/dist/KernelEngineContext-CPeWQMAz.d.ts +46 -0
  13. package/dist/LayersPanel-M2LHWUFF.js +6 -0
  14. package/dist/ModuleCard-NJD6JQGD.js +6 -0
  15. package/dist/OrbInspector-OWWKPOBF.js +23 -0
  16. package/dist/{TraitValueFrame-4G3KOUBR.css → OrbInspector-VMTMZHNQ.css} +189 -191
  17. package/dist/{Select-mDZIwNqN.d.ts → Select-C2Uq6t86.d.ts} +17 -31
  18. package/dist/ServerBridge-Bqsj-lOU.d.ts +124 -0
  19. package/dist/{FlowCanvas-3JRMNJLV.css → UISlotRenderer-BIS6KT7T.css} +189 -191
  20. package/dist/UISlotRenderer-PY7FIJXN.js +23 -0
  21. package/dist/auth/browser/index.js +1 -0
  22. package/dist/auth/react/index.d.ts +8 -1
  23. package/dist/auth/react/index.js +40 -2
  24. package/dist/avl/index.css +189 -191
  25. package/dist/avl/index.d.ts +107 -85
  26. package/dist/avl/index.js +170 -39
  27. package/dist/{chunk-P4LNHAFI.js → chunk-2WGR4TDJ.js} +465 -36
  28. package/dist/{chunk-GKIFONTE.js → chunk-3S54FWRC.js} +2 -2
  29. package/dist/{chunk-KVQS4GXU.js → chunk-4YJ53G7S.js} +18 -8
  30. package/dist/{chunk-MBQAMMSE.js → chunk-4YXBKHHM.js} +269 -658
  31. package/dist/{chunk-YDNJLLG6.js → chunk-57DC34LY.js} +19 -10
  32. package/dist/{chunk-FP3WIKTC.js → chunk-7N6ZPHQ5.js} +9 -1
  33. package/dist/{chunk-AILY3XPS.js → chunk-AE7VCQB6.js} +5 -6
  34. package/dist/{chunk-L677XGY3.js → chunk-AGVSO4WY.js} +4 -5
  35. package/dist/{chunk-FAJDTHWC.js → chunk-AGXD77SL.js} +2 -2
  36. package/dist/chunk-AU7O65OX.js +66 -0
  37. package/dist/{chunk-DFNZUYX4.js → chunk-FAKU5F62.js} +273 -29
  38. package/dist/{chunk-U6QRZASX.js → chunk-ILQXJ2AR.js} +1 -1
  39. package/dist/chunk-M74BCDBQ.js +490 -0
  40. package/dist/{chunk-GYTPOFVC.js → chunk-MS4K3K2R.js} +12095 -13329
  41. package/dist/{chunk-SGM3FASH.js → chunk-OWNG4JZI.js} +13 -12
  42. package/dist/{chunk-VFF5OO47.js → chunk-PCR37T3U.js} +15 -38
  43. package/dist/{chunk-SJGJJKBY.js → chunk-PRLHKBXG.js} +5 -3
  44. package/dist/{chunk-R5O5AUPI.js → chunk-PRXQGGCO.js} +93 -86
  45. package/dist/{chunk-42FY4RYA.js → chunk-REXYVBUO.js} +2 -2
  46. package/dist/{chunk-EQAMU2ZC.js → chunk-UTDC2NEA.js} +1 -1
  47. package/dist/{chunk-73SRAB4P.js → chunk-UU57VNS2.js} +2 -2
  48. package/dist/{chunk-TESBIVUA.js → chunk-VHC2M26B.js} +2 -2
  49. package/dist/{chunk-L2DEKY4J.js → chunk-VO2TTLS5.js} +3 -6
  50. package/dist/{chunk-2PY54Z44.js → chunk-VUIACGDU.js} +4 -5
  51. package/dist/{chunk-DLZF4PVE.js → chunk-YYIHRIDH.js} +3 -3
  52. package/dist/{chunk-DYEKAA4L.js → chunk-ZDRDJKYB.js} +243 -252
  53. package/dist/components/index.css +189 -191
  54. package/dist/components/index.d.ts +739 -289
  55. package/dist/components/index.js +25 -28
  56. package/dist/context/index.d.ts +2 -3
  57. package/dist/context/index.js +4 -3
  58. package/dist/core.d.ts +95 -19
  59. package/dist/core.js +2 -1
  60. package/dist/design-classes/index.cjs +3 -1
  61. package/dist/design-classes/index.js +3 -1
  62. package/dist/{fx-CmQjnHmT.d.ts → fx-Br8zjvu9.d.ts} +6 -6
  63. package/dist/hooks/index.d.ts +40 -5
  64. package/dist/hooks/index.js +5 -4
  65. package/dist/index.d.ts +40 -114
  66. package/dist/index.js +174 -34
  67. package/dist/kernel-client-JW6OH5FX.js +537 -0
  68. package/dist/kernel-wire-DGAySGhX.d.ts +95 -0
  69. package/dist/lib/index.d.ts +3 -4
  70. package/dist/lib/index.js +4 -4
  71. package/dist/{prism-AIWGN2X5.js → prism-X5YWKXO5.js} +5 -3
  72. package/dist/providers/index.css +189 -191
  73. package/dist/providers/index.d.ts +41 -28
  74. package/dist/providers/index.js +19 -24
  75. package/dist/renderer/index.d.ts +0 -2
  76. package/dist/renderer/index.js +1 -0
  77. package/dist/runtime/index.css +189 -191
  78. package/dist/runtime/index.d.ts +57 -253
  79. package/dist/runtime/index.js +18 -24
  80. package/dist/ssr/index.cjs +2643 -535
  81. package/dist/ssr/index.d.cts +0 -23
  82. package/dist/ssr/index.d.ts +0 -23
  83. package/dist/ssr/index.js +2639 -535
  84. package/dist/storage/browser/index.js +1 -0
  85. package/dist/test-support.d.ts +15 -8
  86. package/dist/test-support.js +91 -24
  87. package/dist/{paintDispatch-ChW5mVuK.d.ts → verificationRegistry-oopV1J1n.d.ts} +132 -30
  88. package/package.json +14 -38
  89. package/src/core/lib/band-shapes.json +7 -0
  90. package/src/core/locales/ar.json +18 -5
  91. package/src/core/locales/en.json +18 -5
  92. package/src/core/locales/sl.json +18 -5
  93. package/tailwind-preset.cjs +30 -1
  94. package/dist/AvlGlyph-JKJOAH23.js +0 -6
  95. package/dist/AvlStateMachine-PI4YGREK.js +0 -8
  96. package/dist/AvlTransitionDetail-ZH7V24UG.js +0 -12
  97. package/dist/AvlTransitionExplainer-ZSRT7L6Y.js +0 -13
  98. package/dist/BehaviorValueFrame-6RUJXT4A.js +0 -29
  99. package/dist/BehaviorView-RFEE5J6E.js +0 -10
  100. package/dist/Canvas3DHost-_Y-5uLM_.d.ts +0 -552
  101. package/dist/FlowCanvas-STDC4OWK.js +0 -27
  102. package/dist/KernelEngineContext-BOCQoFwk.d.ts +0 -43
  103. package/dist/LayersPanel-BBQ54IVG.js +0 -7
  104. package/dist/ModuleCard-3TT2X7IW.js +0 -7
  105. package/dist/OrbInspector-K6T6O7GI.js +0 -27
  106. package/dist/OrbInspector-MHLJ6OEE.css +0 -1756
  107. package/dist/ServerBridge-Cm1On51b.d.ts +0 -233
  108. package/dist/TraitValueFrame-2PJGLLVI.js +0 -28
  109. package/dist/UISlotRenderer-JKFSX24W.js +0 -27
  110. package/dist/UISlotRenderer-KVFO6J7R.css +0 -1756
  111. package/dist/UserContext-DqWeZkUZ.d.ts +0 -100
  112. package/dist/avl-3d-context-BIRKWpaL.d.ts +0 -204
  113. package/dist/avl-schema-parser-CtJxJ9KU.d.ts +0 -132
  114. package/dist/avl-zoom-state-CKMVuBFg.d.ts +0 -17
  115. package/dist/chunk-2QOH2HWM.js +0 -95
  116. package/dist/chunk-6P3MWXYE.js +0 -440
  117. package/dist/chunk-B4BU77LT.js +0 -432
  118. package/dist/chunk-DJ433ET5.js +0 -1327
  119. package/dist/chunk-DZ42OJQC.js +0 -176
  120. package/dist/chunk-EOWMARUB.js +0 -16
  121. package/dist/chunk-FIW6WN23.js +0 -508
  122. package/dist/chunk-GAR5TQ5B.js +0 -199
  123. package/dist/chunk-PC7K4SK7.js +0 -1384
  124. package/dist/chunk-ZO6MXAS3.js +0 -69
  125. package/dist/kernel-client-ZH4PSMCN.js +0 -367
  126. package/dist/kernel-wire-B4S8pnP3.d.ts +0 -65
  127. package/dist/three/index.css +0 -503
  128. package/dist/three/index.d.ts +0 -1185
  129. package/dist/three/index.js +0 -3896
  130. package/dist/useKeyboardRouter-Dsq553Ur.d.ts +0 -42
  131. package/dist/verificationRegistry-CabxhfTv.d.ts +0 -122
@@ -3,24 +3,13 @@ import { NativeMemoryPersistenceAdapter } from '@almadar/shell-runtime/persisten
3
3
  import * as local_store_transport_star from '@almadar/shell-runtime/runtime/evaluation/local-store-transport';
4
4
  import { openLocalKernel as openLocalKernel$1 } from '@almadar/shell-runtime/runtime/evaluation/local-store-transport';
5
5
  import { readPageFacts } from '@almadar/shell-browser/page-facts';
6
- import * as std_mock_seed_star from '@almadar/shell-runtime/runtime/entities/std-mock-seed';
7
- import { orbitalInlineEntities, storesRowsInBrowser, parseOrbitalSchema, isRoutePage, applyRowAccess, readableEntitiesOf, externalInputsOf, tickEventKey } from '@almadar/core';
8
- import { entityAccessPolicies } from '@almadar/core/mock';
6
+ import { instancesForLocale, orbitalInlineEntities, storesRowsInBrowser, isRoutePage, tickEventKey, isJsonObject } from '@almadar/core';
7
+ import { createLogger, isLogLevelEnabled } from '@almadar/logger';
8
+ import { HostAskError, consentFromRedirect, performHostAnswer, hostAskReturn } from '@almadar/shell-runtime/kernel/host';
9
9
  import { dispatchDeclaredInput } from '@almadar/shell-runtime/client/declared-input-dispatch';
10
10
  import { IndexedDbPersistence } from '@almadar/shell-browser/storage';
11
- import * as seedBrowserStore_star from '@almadar/shell-runtime/runtime/entities/seedBrowserStore';
12
- import * as trait_index_star from '@almadar/shell-runtime/runtime/traits/trait-index';
13
- import * as TickScheduler_star from '@almadar/shell-runtime/runtime/time/TickScheduler';
14
- import { createLogger, isLogLevelEnabled } from '@almadar/logger';
15
- import * as cron_star from '@almadar/shell-runtime/runtime/time/cron';
16
- import * as duration_star from '@almadar/shell-runtime/runtime/time/duration';
17
- import * as composition_star from '@almadar/shell-runtime/runtime/effects/composition/index';
18
- import * as types_star from '@almadar/shell-runtime/runtime/types';
19
- import * as routing_star from '@almadar/shell-runtime/runtime/events/identity/routing';
20
- import * as listen_targets_star from '@almadar/shell-runtime/runtime/traits/listen-targets';
21
- import * as OrbitalTraitParsing_star from '@almadar/shell-runtime/runtime/traits/OrbitalTraitParsing';
22
- import * as mockStoreSeed_star from '@almadar/shell-runtime/runtime/entities/mockStoreSeed';
23
- import * as residence_transport_star from '@almadar/shell-runtime/runtime/evaluation/residence-transport';
11
+ export { eventRouteKey } from '@almadar/shell-runtime/runtime/events/identity/routing';
12
+ export { createResidenceTransport } from '@almadar/shell-runtime/runtime/evaluation/residence-transport';
24
13
 
25
14
  function hasMemoryStore(kernel) {
26
15
  return "MemoryStore" in kernel;
@@ -36,281 +25,334 @@ __export(local_store_transport_exports, {
36
25
  openLocalKernel: () => openLocalKernel
37
26
  });
38
27
  __reExport(local_store_transport_exports, local_store_transport_star);
39
- function openLocalKernel(options) {
40
- return openLocalKernel$1({ ...options, pageFacts: options.pageFacts ?? readPageFacts });
28
+ var POLL_MS = 250;
29
+ function consentByPopup(env) {
30
+ return async (request) => {
31
+ const popup = env.open(request.authorizeUrl);
32
+ if (popup === null) throw new HostAskError("unavailable", "the browser blocked the consent window");
33
+ for (; ; ) {
34
+ if (popup.closed) throw new HostAskError("cancelled", "the viewer closed the consent window");
35
+ let href;
36
+ try {
37
+ href = popup.location.href;
38
+ } catch {
39
+ href = void 0;
40
+ }
41
+ if (href !== void 0 && href !== "about:blank" && new URL(href).origin === env.origin) {
42
+ popup.close();
43
+ return consentFromRedirect(href);
44
+ }
45
+ await env.wait(POLL_MS);
46
+ }
47
+ };
48
+ }
49
+ function browserConsentEnv(win) {
50
+ return {
51
+ origin: win.location.origin,
52
+ open: (url) => win.open(url, "almadar-consent", "popup,width=520,height=720"),
53
+ wait: (ms) => new Promise((resolve) => win.setTimeout(resolve, ms))
54
+ };
41
55
  }
42
56
 
43
- // src/runtime/entities/std-mock-seed.ts
44
- var std_mock_seed_exports = {};
45
- __reExport(std_mock_seed_exports, std_mock_seed_star);
46
-
47
- // src/runtime/entities/seed-host.ts
48
- async function withBrowserSeeder(seeding, use) {
49
- const program = await seeding.loadSeedProgram();
50
- let opened;
51
- const engine = {
52
- evaluate: async (orbital, request, scope) => {
53
- opened ??= openLocalKernel({
54
- kernel: seeding.kernel,
55
- language: seeding.language,
56
- schema: program,
57
- persistence: nativeMemoryPersistence(seeding.kernel)
58
- });
59
- return opened.evaluate(orbital, request, scope);
60
- }
57
+ // src/lib/host-actions.ts
58
+ var log = createLogger("almadar:ui:host-actions");
59
+ var audioHost;
60
+ var signOutHost;
61
+ var signInHost;
62
+ var consentHost;
63
+ function registerHostAudio(host) {
64
+ audioHost = host;
65
+ return () => {
66
+ if (audioHost === host) audioHost = void 0;
61
67
  };
62
- try {
63
- return await use({ seeder: new std_mock_seed_exports.StdMockSeed(engine, (0, std_mock_seed_exports.declaredSeedConfig)(program, seeding.app)), nowMs: Date.now() });
64
- } finally {
65
- opened?.dispose();
68
+ }
69
+ function registerHostSignOut(host) {
70
+ signOutHost = host;
71
+ return () => {
72
+ if (signOutHost === host) signOutHost = void 0;
73
+ };
74
+ }
75
+ function registerHostSignIn(host) {
76
+ signInHost = host;
77
+ return () => {
78
+ if (signInHost === host) signInHost = void 0;
79
+ };
80
+ }
81
+ function registerHostConsent(host) {
82
+ consentHost = host;
83
+ return () => {
84
+ if (consentHost === host) consentHost = void 0;
85
+ };
86
+ }
87
+ var webHostActions = {
88
+ get audio() {
89
+ return audioHost;
90
+ },
91
+ get signOut() {
92
+ return signOutHost;
93
+ },
94
+ get signIn() {
95
+ return signInHost;
96
+ },
97
+ get consent() {
98
+ return consentHost ?? (typeof window === "undefined" ? void 0 : consentByPopup(browserConsentEnv(window)));
66
99
  }
100
+ };
101
+ var traceStreams = /* @__PURE__ */ new Map();
102
+ function streamTrace(args, completion, dispatch, source) {
103
+ const { key, onMessage, failure, trait } = completion;
104
+ if (key === void 0 || onMessage === void 0) return;
105
+ const refuse = (error) => {
106
+ log.error("trace stream refused", { trait, key, error });
107
+ if (failure !== void 0 && dispatch !== void 0) void dispatch(trait, failure, { error, key, ...completion.entityId !== void 0 ? { entityId: completion.entityId } : {} });
108
+ };
109
+ const options = args[0];
110
+ const named = options !== void 0 && options !== null && isJsonObject(options) ? options["traits"] : void 0;
111
+ const traits = Array.isArray(named) ? named.flatMap((t) => typeof t === "string" ? [t] : []) : [];
112
+ if (traits.length === 0) return refuse("program/live trace: name the traits it observes in `traits`");
113
+ if (source === void 0 || dispatch === void 0) return refuse("program/live trace: this host has no kernel trace to stream");
114
+ if (traceStreams.has(key)) return refuse(`key ${key} already has a stream open`);
115
+ traceStreams.set(key, source(traits, (item) => {
116
+ void dispatch(trait, onMessage, { ...item, key, ...completion.entityId !== void 0 ? { entityId: completion.entityId } : {} }).catch((error) => log.error("trace item return failed", { trait, key, error: error.message }));
117
+ }));
67
118
  }
68
- async function withForkedSeeder(app, appSchema, loadSeedProgram, persistence, user, use) {
69
- const program = await loadSeedProgram();
70
- const fork = app.forkProgram(program);
71
- try {
72
- return await use({ seeder: new std_mock_seed_exports.StdMockSeed(fork, (0, std_mock_seed_exports.declaredSeedConfig)(program, appSchema), user), persistence, nowMs: Date.now() });
73
- } finally {
74
- fork.dispose();
119
+ function cancelStreams(args) {
120
+ const named = args[0];
121
+ const keys = typeof named === "string" ? [named] : Array.isArray(named) ? named.flatMap((k) => typeof k === "string" ? [k] : []) : [];
122
+ for (const key of keys) {
123
+ traceStreams.get(key)?.();
124
+ traceStreams.delete(key);
125
+ }
126
+ }
127
+ async function answerHostAsk(op, args, completion, dispatch, trace) {
128
+ if (op === "cancel-call") return cancelStreams(args);
129
+ if (op === "program/live" && completion?.onMessage !== void 0) return streamTrace(args, completion, dispatch, trace);
130
+ const outcome = await performHostAnswer(webHostActions, op, args);
131
+ if ("error" in outcome) log.error("host-ask refused", { op, error: outcome.error, kind: outcome.kind });
132
+ if (completion === void 0) return;
133
+ const returned = hostAskReturn(completion, outcome);
134
+ if (returned === void 0) return;
135
+ if (dispatch === void 0) {
136
+ log.error("host-ask has no dispatch to return its answer to", { op, trait: returned.trait, event: returned.event });
137
+ return;
75
138
  }
139
+ await dispatch(returned.trait, returned.event, returned.entityId !== void 0 ? { ...returned.payload, entityId: returned.entityId } : returned.payload);
76
140
  }
77
141
 
78
- // src/runtime/entities/seedBrowserStore.ts
79
- var seedBrowserStore_exports = {};
80
- __reExport(seedBrowserStore_exports, seedBrowserStore_star);
81
-
82
- // src/runtime/traits/trait-index.ts
83
- var trait_index_exports = {};
84
- __reExport(trait_index_exports, trait_index_star);
85
-
86
- // src/runtime/time/TickScheduler.ts
87
- var TickScheduler_exports = {};
88
- __reExport(TickScheduler_exports, TickScheduler_star);
89
-
90
- // src/runtime/time/cron.ts
91
- var cron_exports = {};
92
- __reExport(cron_exports, cron_star);
93
-
94
- // src/runtime/time/duration.ts
95
- var duration_exports = {};
96
- __reExport(duration_exports, duration_star);
97
-
98
- // src/runtime/evaluation/browser-store-transport.ts
142
+ // src/runtime/evaluation/local-store-transport.ts
143
+ function openLocalKernel(options) {
144
+ return openLocalKernel$1({ ...options, pageFacts: options.pageFacts ?? readPageFacts, hostActions: options.hostActions ?? webHostActions });
145
+ }
146
+ async function persistedMemory(kernel, database, entities, locale) {
147
+ const memory = nativeMemoryPersistence(kernel);
148
+ const firstVisit = (await database.changes()).length === 0;
149
+ for (const entity of entities) {
150
+ if (firstVisit) {
151
+ for (const row of instancesForLocale(entity, locale)) await database.create(entity.name, row);
152
+ }
153
+ for (const row of await database.list(entity.name)) {
154
+ await memory.writeWhere({ kind: "upsert", entityType: entity.name, data: row });
155
+ }
156
+ }
157
+ const keep = async (entityType, row) => {
158
+ await database.create(entityType, row);
159
+ };
160
+ const mirror = async (op, outcome) => {
161
+ if (outcome.kind === "created") await keep(op.entityType, outcome.row);
162
+ else if (outcome.kind === "updated") {
163
+ if (op.kind === "rekey") await database.delete(op.entityType, op.id);
164
+ await keep(op.entityType, outcome.row);
165
+ } else if (outcome.kind === "deleted" && op.kind !== "create" && op.kind !== "upsert") await database.delete(op.entityType, op.id);
166
+ };
167
+ return {
168
+ getById: (entityType, id) => memory.getById(entityType, id),
169
+ list: (entityType) => memory.list(entityType),
170
+ queryPage: (entityType, query) => memory.queryPage(entityType, query),
171
+ queryIds: (entityType, query) => memory.queryIds(entityType, query),
172
+ queryCapabilities: (entityType) => memory.queryCapabilities(entityType),
173
+ writeCapabilities: (entityType) => memory.writeCapabilities(entityType),
174
+ bindCollection: (entityType, collection) => memory.bindCollection(entityType, collection),
175
+ async create(entityType, data) {
176
+ const { id } = await memory.create(entityType, data);
177
+ const row = await memory.getById(entityType, id);
178
+ if (row !== null) await keep(entityType, row);
179
+ return { id };
180
+ },
181
+ async update(entityType, id, data) {
182
+ await memory.update(entityType, id, data);
183
+ const row = await memory.getById(entityType, id);
184
+ if (row !== null) await keep(entityType, row);
185
+ },
186
+ async delete(entityType, id) {
187
+ await memory.delete(entityType, id);
188
+ await database.delete(entityType, id);
189
+ },
190
+ async writeWhere(op) {
191
+ const outcome = await memory.writeWhere(op);
192
+ await mirror(op, outcome);
193
+ return outcome;
194
+ },
195
+ async writeBatch(batch) {
196
+ const outcomes = await memory.writeBatch(batch);
197
+ for (const [index, op] of batch.ops.entries()) {
198
+ const outcome = outcomes[index];
199
+ if (outcome !== void 0) await mirror(op, outcome);
200
+ }
201
+ return outcomes;
202
+ }
203
+ };
204
+ }
99
205
  function browserStoreName(appName, locale) {
100
206
  return locale !== void 0 ? `almadar:${appName}:${locale}` : `almadar:${appName}`;
101
207
  }
102
- async function openBrowserStore(databaseName, orbitals, seeding, factory, locale) {
208
+ async function openBrowserStore(databaseName, orbitals, factory) {
103
209
  const entities = orbitals.flatMap(orbitalInlineEntities).filter(storesRowsInBrowser);
104
210
  if (entities.length === 0) return null;
105
- const store = await IndexedDbPersistence.open({
211
+ return IndexedDbPersistence.open({
106
212
  databaseName,
107
213
  entityTypes: entities.map((e) => e.name),
108
214
  ...factory !== void 0 ? { factory } : {}
109
215
  });
110
- await withBrowserSeeder(seeding, (host) => (0, seedBrowserStore_exports.seedBrowserStore)(store, entities, locale, host));
111
- return store;
216
+ }
217
+ function browserEntities(orbitals) {
218
+ return orbitals.flatMap(orbitalInlineEntities).filter(storesRowsInBrowser);
112
219
  }
113
220
  async function openBrowserStoreTransport(options) {
114
- const stored = await openBrowserStore(options.databaseName, options.schema.orbitals, { kernel: options.kernel, language: options.language, loadSeedProgram: options.loadSeedProgram, app: options.schema }, options.factory, options.locale);
221
+ const stored = await openBrowserStore(options.databaseName, options.schema.orbitals, options.factory);
115
222
  if (stored === null && options.callService === void 0) {
116
223
  throw new Error(`openBrowserStoreTransport: schema "${options.schema.name}" declares no browser-stored entity`);
117
224
  }
118
225
  const memory = nativeMemoryPersistence(options.kernel);
119
- const persistence = (0, local_store_transport_exports.localStorePersistence)(options.schema, stored ?? memory, memory);
226
+ const persistence = (0, local_store_transport_exports.localStorePersistence)(options.schema, stored === null ? memory : await persistedMemory(options.kernel, stored, browserEntities(options.schema.orbitals), options.locale), memory);
120
227
  return (0, local_store_transport_exports.createLocalStoreTransport)({
121
228
  kernelEngine: openLocalKernel({
122
229
  kernel: options.kernel,
123
- language: options.language,
124
230
  schema: options.schema,
125
231
  persistence,
126
232
  ...options.callService !== void 0 ? { callService: options.callService } : {},
127
- ...options.http !== void 0 ? { http: options.http } : {},
128
- ...options.messages !== void 0 ? { messages: options.messages } : {}
129
- })
233
+ ...options.secretPorts !== void 0 ? { secretPorts: options.secretPorts } : {},
234
+ ...options.os !== void 0 ? { os: options.os } : {},
235
+ ...options.gpu !== void 0 ? { gpu: options.gpu } : {}
236
+ }),
237
+ ...options.locale !== void 0 ? { locale: () => options.locale } : {}
130
238
  });
131
239
  }
132
- function openBundledBrowserStore(bundled, kernel, language, loadSeedProgram, locale, callService, messages, http) {
133
- const schema = parseOrbitalSchema(bundled);
240
+ function openBundledBrowserStore(schema, kernel, locale, callService, secretPorts, os) {
134
241
  return openBrowserStoreTransport({
135
242
  databaseName: browserStoreName(schema.name, locale),
136
243
  schema,
137
- kernel,
138
- language,
139
- loadSeedProgram,
140
244
  ...locale !== void 0 ? { locale } : {},
245
+ kernel,
141
246
  ...callService !== void 0 ? { callService } : {},
142
- ...http !== void 0 ? { http } : {},
143
- ...messages !== void 0 ? { messages } : {}
247
+ ...secretPorts !== void 0 ? { secretPorts } : {},
248
+ ...os !== void 0 ? { os } : {}
144
249
  });
145
250
  }
146
251
  var tickLog = createLogger("almadar:runtime:browser-host:ticks");
147
252
  var queueLog = createLogger("almadar:runtime:browser-host:queue");
148
- function refuseUnhostedTicks(traitIndex) {
149
- for (const entry of traitIndex.byName.values()) {
150
- for (const tick of entry.irTrait.ticks ?? []) {
151
- if (tick.interval === "frame") {
152
- throw new Error(`openBrowserHost has no frame clock; ${entry.orbitalName}.${entry.traitDef.name} tick '${tick.name}' runs every frame`);
153
- }
154
- }
155
- }
156
- }
253
+ var TICK_PASS_MS = 16;
157
254
  async function openBrowserHost(options) {
158
- const browserStore = await openBrowserStore(options.databaseName, options.schema.orbitals, { kernel: options.kernel, language: options.language, loadSeedProgram: options.loadSeedProgram, app: options.schema }, options.factory, options.locale);
255
+ const browserStore = await openBrowserStore(options.databaseName, options.schema.orbitals, options.factory);
159
256
  const memory = nativeMemoryPersistence(options.kernel);
160
- const persistence = (0, local_store_transport_exports.localStorePersistence)(options.schema, browserStore ?? memory, memory);
161
- const traitIndex = (0, trait_index_exports.buildTraitIndex)(options.schema.orbitals);
162
- refuseUnhostedTicks(traitIndex);
257
+ const persistence = (0, local_store_transport_exports.localStorePersistence)(options.schema, browserStore === null ? memory : await persistedMemory(options.kernel, browserStore, browserEntities(options.schema.orbitals), options.locale), memory);
163
258
  const { schema } = options;
164
259
  let transport;
165
260
  const listeners = /* @__PURE__ */ new Set();
166
- let turns = 0;
167
- const lane = [];
168
- let pumping = false;
169
- let running;
170
- const pump = async () => {
171
- if (pumping) return;
172
- pumping = true;
173
- for (let grant = lane.shift(); grant !== void 0; grant = lane.shift()) {
174
- await new Promise(grant);
175
- }
176
- pumping = false;
177
- };
178
- const take = (turn) => new Promise((taken) => {
179
- queueLog.debug("queue:wait", { turn: turn.id, running: running?.id });
180
- turn.lane.push((free) => {
181
- turn.held = true;
182
- running = turn;
183
- queueLog.debug("queue:take", { turn: turn.id });
184
- turn.release = () => {
185
- queueLog.debug("queue:release", { turn: turn.id });
186
- turn.held = false;
187
- if (running === turn) running = void 0;
188
- free();
189
- };
190
- taken();
191
- });
192
- void pump();
193
- });
194
- const enqueue = async (lane2, work) => {
195
- const turn = { id: ++turns, lane: lane2, held: false, done: false, release: () => void 0 };
196
- await take(turn);
197
- try {
198
- return await work();
199
- } finally {
200
- turn.done = true;
201
- if (turn.held) turn.release();
202
- }
203
- };
204
- const serially = (work) => enqueue(lane, work);
205
- const outsideEventQueue = async (work) => {
206
- const turn = running;
207
- queueLog.debug("queue:outside", { turn: turn?.id, held: turn?.held });
208
- if (turn === void 0 || !turn.held) return work();
209
- turn.release();
210
- try {
211
- return await work();
212
- } finally {
213
- await take(turn);
214
- }
215
- };
216
- const servicePorts = (caller, user, message) => {
217
- const lentBy = running;
261
+ const servicePorts = (caller, user, message, assertReentry) => {
218
262
  return {
219
263
  caller,
220
- inputs: () => externalInputsOf(schema),
221
- readableEntities: () => readableEntitiesOf(schema),
264
+ inputs: () => kernelEngine.externalInputs(),
265
+ readableEntities: () => kernelEngine.readableEntities(),
222
266
  dispatchInput: (orbital, request) => {
223
267
  const host = transport;
224
268
  if (!host) return Promise.reject(new Error("openBrowserHost: the host is not open yet"));
225
- const send = (o, r) => lentBy !== void 0 && lentBy.held && !lentBy.done ? host.send(o, r) : serially(() => host.send(o, r));
226
- return dispatchDeclaredInput(schema, orbital, { ...request, ...user !== void 0 ? { user } : {} }, async (o, r) => {
227
- const response = await send(o, r);
269
+ assertReentry?.();
270
+ return dispatchDeclaredInput(kernelEngine, orbital, request, async (o, r) => {
271
+ const response = await host.send(o, r);
228
272
  for (const listener of listeners) listener(o, r, response);
229
273
  return response;
230
274
  });
231
275
  },
232
- read: async (entity) => applyRowAccess(await persistence.list(entity), entityAccessPolicies(schema, entity)?.read, void 0, { user }, entity),
276
+ read: async (entity) => kernelEngine.readRows(entity, await persistence.list(entity), user),
233
277
  message
234
278
  };
235
279
  };
236
280
  let deferred;
237
281
  const kernelEngine = openLocalKernel({
238
282
  kernel: options.kernel,
239
- language: options.language,
240
283
  schema,
241
284
  persistence,
242
285
  callService: options.callService,
243
286
  servicePorts,
244
287
  deferCallOutcome: () => deferred,
245
- ...options.http !== void 0 ? { http: options.http } : {},
288
+ ...options.secretPorts !== void 0 ? { secretPorts: options.secretPorts } : {},
246
289
  ...options.onDevice !== void 0 ? { onDevice: options.onDevice } : {},
247
- ...options.tabs !== void 0 ? { tabs: options.tabs } : {}
290
+ ...options.tabs !== void 0 ? { tabs: options.tabs } : {},
291
+ ...options.os !== void 0 ? { os: options.os } : {},
292
+ ...options.gpu !== void 0 ? { gpu: options.gpu } : {}
248
293
  });
249
- const local = (0, local_store_transport_exports.createLocalStoreTransport)({ kernelEngine, outsideEventQueue });
294
+ const local = (0, local_store_transport_exports.createLocalStoreTransport)({ kernelEngine });
250
295
  transport = local;
251
296
  deferred = (call) => {
252
297
  const request = {
253
298
  event: call.event,
254
299
  ...call.payload !== void 0 ? { payload: call.payload } : {},
300
+ ...call.heldPayload !== void 0 ? { heldPayload: call.heldPayload } : {},
255
301
  targetTrait: call.traitName,
256
302
  ...call.entityId !== void 0 ? { entityId: call.entityId } : {},
257
303
  ...call.originClientId !== void 0 ? { clientId: call.originClientId } : {},
258
- ...call.user !== void 0 ? { user: call.user } : {},
259
304
  ...call.locale !== void 0 ? { locale: call.locale } : {}
260
305
  };
261
- void serially(async () => {
262
- const response = await local.send(call.orbital, request);
306
+ void local.send(call.orbital, request).then((response) => {
263
307
  for (const listener of listeners) listener(call.orbital, request, response);
264
308
  }).catch((error) => {
265
309
  queueLog.error("deferred-outcome:failed", { orbital: call.orbital, event: call.event, trait: call.traitName, error: error.message });
266
310
  });
267
311
  };
268
- const scheduler = (0, TickScheduler_exports.createTickScheduler)();
269
- const tickHandles = [];
270
- for (const entry of traitIndex.byName.values()) {
271
- for (const tick of entry.irTrait.ticks ?? []) {
272
- let firing = false;
273
- const fire = () => {
274
- if (firing) return;
275
- firing = true;
276
- const request = {
277
- event: tickEventKey(tick.name),
278
- runTick: { trait: entry.traitDef.name, tick: tick.name },
279
- targetTrait: entry.traitDef.name,
280
- tick: tick.name
281
- };
282
- void serially(async () => {
283
- const response = await local.send(entry.orbitalName, request);
284
- if (response.transitioned) for (const listener of listeners) listener(entry.orbitalName, request, response);
285
- }).catch((error) => {
286
- tickLog.error("tick:failed", { orbital: entry.orbitalName, trait: entry.traitDef.name, tick: tick.name, error: error.message });
287
- }).finally(() => {
288
- firing = false;
289
- });
290
- };
291
- tickHandles.push(
292
- typeof tick.interval === "string" && (0, cron_exports.isValidCronExpression)(tick.interval) ? scheduler.addCron(tick.interval, fire) : scheduler.add(typeof tick.interval === "number" ? tick.interval : (0, duration_exports.parseDurationString)(tick.interval), fire)
293
- );
312
+ const runnable = /* @__PURE__ */ new Map();
313
+ for (const trait of kernelEngine.programSurface().traits) {
314
+ for (const tick of trait.ticks) {
315
+ runnable.set(`${trait.name}::${tick.name}`, { orbitalName: trait.orbital, traitName: trait.name, tickName: tick.name });
294
316
  }
295
317
  }
318
+ const firing = /* @__PURE__ */ new Set();
319
+ const fire = (key, tick) => {
320
+ if (firing.has(key)) return;
321
+ firing.add(key);
322
+ const request = {
323
+ event: tickEventKey(tick.tickName),
324
+ runTick: { trait: tick.traitName, tick: tick.tickName },
325
+ targetTrait: tick.traitName,
326
+ tick: tick.tickName
327
+ };
328
+ void local.send(tick.orbitalName, request).then((response) => {
329
+ if (response.transitioned) for (const listener of listeners) listener(tick.orbitalName, request, response);
330
+ }).catch((error) => {
331
+ tickLog.error("tick:failed", { orbital: tick.orbitalName, trait: tick.traitName, tick: tick.tickName, error: error.message });
332
+ }).finally(() => {
333
+ firing.delete(key);
334
+ });
335
+ };
336
+ const timer = runnable.size === 0 ? void 0 : setInterval(() => {
337
+ for (const due of Object.values(kernelEngine.tickPass(performance.now())).flat()) {
338
+ const key = `${due.trait}::${due.tick}`;
339
+ const tick = runnable.get(key);
340
+ if (tick !== void 0) fire(key, tick);
341
+ }
342
+ }, TICK_PASS_MS);
296
343
  return {
297
344
  ...local,
298
- send: (orbitalName, request) => serially(() => local.send(orbitalName, request)),
299
345
  onInputDispatched(listener) {
300
346
  listeners.add(listener);
301
347
  return () => listeners.delete(listener);
302
348
  },
303
349
  routeMounts: (routePath) => kernelEngine.routeMounts(routePath),
304
350
  close() {
305
- for (const handle of tickHandles) handle.stop();
351
+ if (timer !== void 0) clearInterval(timer);
306
352
  }
307
353
  };
308
354
  }
309
355
 
310
- // src/runtime/effects/composition/index.ts
311
- var composition_exports = {};
312
- __reExport(composition_exports, composition_star);
313
-
314
356
  // src/runtime/ui/contract-errors.ts
315
357
  var RendererContractViolationError = class extends Error {
316
358
  constructor(message) {
@@ -447,20 +489,6 @@ function buildOrbitalsByTrait(schema, resolvedPages = []) {
447
489
  return map;
448
490
  }
449
491
 
450
- // src/runtime/ui/traitLinkedEntities.ts
451
- function buildTraitLinkedEntities(ir) {
452
- const map = /* @__PURE__ */ new Map();
453
- for (const page of ir.pages.values()) {
454
- for (const binding of page.traits) {
455
- if (binding.linkedEntity) map.set(binding.trait.name, binding.linkedEntity);
456
- }
457
- }
458
- for (const trait of ir.traits.values()) {
459
- if (trait.linkedEntity && !map.has(trait.name)) map.set(trait.name, trait.linkedEntity);
460
- }
461
- return map;
462
- }
463
-
464
492
  // src/runtime/ui/embedded-traits.ts
465
493
  var TRAIT_BINDING_PREFIX = "@trait.";
466
494
  function collectTraitRefsFromValue(value, into) {
@@ -499,19 +527,6 @@ function collectTraitRefsFromEffects(effects, into) {
499
527
  }
500
528
  }
501
529
  }
502
- function collectTraitRefsFromResolvedTrait(trait) {
503
- const out = /* @__PURE__ */ new Set();
504
- for (const transition of trait.transitions ?? []) {
505
- collectTraitRefsFromEffects(transition.effects, out);
506
- }
507
- for (const tick of trait.ticks ?? []) {
508
- collectTraitRefsFromEffects(tick.effects, out);
509
- }
510
- for (const field of Object.values(trait.config ?? {})) {
511
- if (field.default !== void 0) collectTraitRefsFromValue(field.default, out);
512
- }
513
- return out;
514
- }
515
530
  function collectEmbeddedTraits(schema) {
516
531
  const out = /* @__PURE__ */ new Set();
517
532
  if (!schema?.orbitals) return out;
@@ -545,7 +560,7 @@ function collectEmbeddedTraits(schema) {
545
560
  return out;
546
561
  }
547
562
  var PERF_NAMESPACE = "almadar:perf:canvas";
548
- var log = createLogger(PERF_NAMESPACE);
563
+ var log2 = createLogger(PERF_NAMESPACE);
549
564
  var RING_SIZE = 50;
550
565
  var ring = [];
551
566
  var writeIdx = 0;
@@ -604,7 +619,7 @@ function perfEnd(name, startToken, detail) {
604
619
  }
605
620
  push({ name, durationMs, ts: endTs, detail });
606
621
  aggregate(name, durationMs);
607
- if (isVerbose()) log.debug(name, () => ({ durationMs, ...detail ?? {} }));
622
+ if (isVerbose()) log2.debug(name, () => ({ durationMs, ...detail ?? {} }));
608
623
  }
609
624
  function perfTime(name, fn, detail) {
610
625
  const t = perfStart(name);
@@ -651,7 +666,7 @@ function dumpSummary() {
651
666
  avgMs: Math.round(b.totalMs / b.count * 100) / 100,
652
667
  maxMs: Math.round(b.maxMs * 10) / 10
653
668
  })).sort((a, b) => b.totalMs - a.totalMs);
654
- log.warn("[PROFILE] summary", { phases: JSON.stringify(rows) });
669
+ log2.warn("[PROFILE] summary", { phases: JSON.stringify(rows) });
655
670
  buckets.clear();
656
671
  }
657
672
  function getPerfSnapshot() {
@@ -684,7 +699,7 @@ var perfStore = {
684
699
  subscribe,
685
700
  getSnapshot
686
701
  };
687
- var log2 = createLogger("almadar:runtime:verify");
702
+ var log3 = createLogger("almadar:runtime:verify");
688
703
  var MAX_EVENT_LOG = 200;
689
704
  var EMPTY_SUMMARY = {
690
705
  totalChecks: 0,
@@ -726,7 +741,7 @@ function bindEventBus(eventBus) {
726
741
  if (!api) return;
727
742
  api.sendEvent = (event, payload, traitScope) => {
728
743
  const prefixed = event.startsWith("UI:") ? event : traitScope ? `UI:${traitScope}.${event}` : `UI:${event}`;
729
- log2.debug("sendEvent", {
744
+ log3.debug("sendEvent", {
730
745
  event: prefixed,
731
746
  traitScope,
732
747
  payloadKeys: payload ? Object.keys(payload) : []
@@ -760,28 +775,4 @@ function bindTraitStateGetter(getter) {
760
775
  api.getTraitState = getter;
761
776
  }
762
777
 
763
- // src/runtime/types.ts
764
- var types_exports = {};
765
- __reExport(types_exports, types_star);
766
-
767
- // src/runtime/events/identity/routing.ts
768
- var routing_exports = {};
769
- __reExport(routing_exports, routing_star);
770
-
771
- // src/runtime/traits/listen-targets.ts
772
- var listen_targets_exports = {};
773
- __reExport(listen_targets_exports, listen_targets_star);
774
-
775
- // src/runtime/traits/OrbitalTraitParsing.ts
776
- var OrbitalTraitParsing_exports = {};
777
- __reExport(OrbitalTraitParsing_exports, OrbitalTraitParsing_star);
778
-
779
- // src/runtime/entities/mockStoreSeed.ts
780
- var mockStoreSeed_exports = {};
781
- __reExport(mockStoreSeed_exports, mockStoreSeed_star);
782
-
783
- // src/runtime/evaluation/residence-transport.ts
784
- var residence_transport_exports = {};
785
- __reExport(residence_transport_exports, residence_transport_star);
786
-
787
- export { OrbitalTraitParsing_exports, PERF_NAMESPACE, RendererContractViolationError, TickScheduler_exports, aggregateSlotContent, assertIsMultiSourceSlotManager, assertIsSlotManager, bindEventBus, bindTraitStateGetter, browserStoreName, buildOrbitalsByTrait, buildTraitLinkedEntities, clearPerf, collectEmbeddedTraits, collectTraitRefsFromResolvedTrait, composition_exports, createSlotSetter, cron_exports, duration_exports, ensureVerificationApi, getOrbitalVerification, listen_targets_exports, local_store_transport_exports, mockStoreSeed_exports, nativeMemoryPersistence, openBrowserHost, openBrowserStore, openBrowserStoreTransport, openBundledBrowserStore, openLocalKernel, perfEnd, perfGauge, perfStart, perfStore, perfTime, perfTimeAsync, pushPerfEntry, residence_transport_exports, routing_exports, seedBrowserStore_exports, std_mock_seed_exports, trait_index_exports, types_exports, validateSlotContent, withBrowserSeeder, withForkedSeeder, wrapCallbackForEvent };
778
+ export { PERF_NAMESPACE, RendererContractViolationError, aggregateSlotContent, answerHostAsk, assertIsMultiSourceSlotManager, assertIsSlotManager, bindEventBus, bindTraitStateGetter, browserStoreName, buildOrbitalsByTrait, clearPerf, collectEmbeddedTraits, createSlotSetter, ensureVerificationApi, getOrbitalVerification, local_store_transport_exports, nativeMemoryPersistence, openBrowserHost, openBrowserStore, openBrowserStoreTransport, openBundledBrowserStore, openLocalKernel, perfEnd, perfGauge, perfStart, perfStore, perfTime, perfTimeAsync, persistedMemory, pushPerfEntry, registerHostAudio, registerHostConsent, registerHostSignIn, registerHostSignOut, validateSlotContent, webHostActions, wrapCallbackForEvent };