@almadar/shell-web 0.1.0 → 1.0.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 (118) hide show
  1. package/dist/{ArbitraryClassCompiler-Mzabq-UB.d.ts → ArbitraryClassCompiler-CO_iASBn.d.ts} +99 -4
  2. package/dist/AvlGlyph-EPJKFEO3.js +6 -0
  3. package/dist/AvlStateMachine-RKZIKNGC.js +9 -0
  4. package/dist/AvlTransitionDetail-63SD6GZF.js +11 -0
  5. package/dist/AvlTransitionExplainer-ZBTLOM3T.js +12 -0
  6. package/dist/BehaviorView-YS5G4GNB.js +11 -0
  7. package/dist/{Canvas3DHost-_Y-5uLM_.d.ts → Canvas3DHost-BkZQB5l2.d.ts} +1 -1
  8. package/dist/{EventBusProvider-CVwjkV_2.d.ts → EventBusProvider-BFFHfN4O.d.ts} +12 -0
  9. package/dist/FlowCanvas-AUMTWMNG.js +26 -0
  10. package/dist/{GameAudioProvider-Cm9BnvmP.d.ts → GameAudioProvider-ceM_n0ey.d.ts} +4 -7
  11. package/dist/KernelEngineContext-CcxGYtlr.d.ts +33 -0
  12. package/dist/LayersPanel-M2LHWUFF.js +6 -0
  13. package/dist/ModuleCard-QHDGK5XK.js +7 -0
  14. package/dist/OrbInspector-QCPEPUPH.js +26 -0
  15. package/dist/{Select-mDZIwNqN.d.ts → Select-B-iDdnvE.d.ts} +16 -30
  16. package/dist/ServerBridge-Bqsj-lOU.d.ts +124 -0
  17. package/dist/UISlotRenderer-C7WWOK43.js +26 -0
  18. package/dist/auth/browser/index.js +1 -0
  19. package/dist/auth/react/index.d.ts +8 -1
  20. package/dist/auth/react/index.js +40 -2
  21. package/dist/avl/index.d.ts +89 -79
  22. package/dist/avl/index.js +38 -38
  23. package/dist/{avl-3d-context-BIRKWpaL.d.ts → avl-3d-context-BycmO6tG.d.ts} +9 -12
  24. package/dist/{chunk-GKIFONTE.js → chunk-3S54FWRC.js} +2 -2
  25. package/dist/{chunk-DYEKAA4L.js → chunk-3VZ36ZKO.js} +240 -252
  26. package/dist/{chunk-PC7K4SK7.js → chunk-4T3P43NS.js} +18 -269
  27. package/dist/{chunk-MBQAMMSE.js → chunk-4YXBKHHM.js} +269 -658
  28. package/dist/{chunk-YDNJLLG6.js → chunk-57DC34LY.js} +19 -10
  29. package/dist/{chunk-SJGJJKBY.js → chunk-AB3X7QTE.js} +6 -3
  30. package/dist/{chunk-AILY3XPS.js → chunk-AE7VCQB6.js} +5 -6
  31. package/dist/{chunk-FAJDTHWC.js → chunk-AGXD77SL.js} +2 -2
  32. package/dist/chunk-AU7O65OX.js +66 -0
  33. package/dist/{chunk-L677XGY3.js → chunk-CPLN6NBQ.js} +5 -5
  34. package/dist/{chunk-DZ42OJQC.js → chunk-DZBQA2OW.js} +1 -1
  35. package/dist/{chunk-2PY54Z44.js → chunk-E6KA4J6N.js} +5 -5
  36. package/dist/{chunk-DJ433ET5.js → chunk-GFXCPUMX.js} +11 -4
  37. package/dist/{chunk-FP3WIKTC.js → chunk-HH5KSMH5.js} +9 -1
  38. package/dist/{chunk-U6QRZASX.js → chunk-ILQXJ2AR.js} +1 -1
  39. package/dist/{chunk-B4BU77LT.js → chunk-ILZ7ORX7.js} +1 -1
  40. package/dist/{chunk-SGM3FASH.js → chunk-K4MOPSEL.js} +14 -12
  41. package/dist/{chunk-GYTPOFVC.js → chunk-LHP2TK7O.js} +7402 -6970
  42. package/dist/{chunk-VFF5OO47.js → chunk-PCR37T3U.js} +15 -38
  43. package/dist/{chunk-R5O5AUPI.js → chunk-PRXQGGCO.js} +93 -86
  44. package/dist/{chunk-42FY4RYA.js → chunk-REXYVBUO.js} +2 -2
  45. package/dist/{chunk-DLZF4PVE.js → chunk-ROICKAU7.js} +3 -3
  46. package/dist/{chunk-KVQS4GXU.js → chunk-SP5CDJ6K.js} +18 -8
  47. package/dist/{chunk-P4LNHAFI.js → chunk-TUPZWTRE.js} +2 -2
  48. package/dist/chunk-TXAUOLWZ.js +490 -0
  49. package/dist/{chunk-EQAMU2ZC.js → chunk-UTDC2NEA.js} +1 -1
  50. package/dist/{chunk-73SRAB4P.js → chunk-UU57VNS2.js} +2 -2
  51. package/dist/{chunk-DFNZUYX4.js → chunk-UXLE3IPR.js} +70 -27
  52. package/dist/{chunk-L2DEKY4J.js → chunk-VO2TTLS5.js} +3 -6
  53. package/dist/{chunk-TESBIVUA.js → chunk-X3DMMX27.js} +2 -2
  54. package/dist/components/index.d.ts +331 -125
  55. package/dist/components/index.js +28 -28
  56. package/dist/context/index.d.ts +2 -3
  57. package/dist/context/index.js +4 -3
  58. package/dist/core.d.ts +93 -17
  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/hooks/index.d.ts +40 -5
  63. package/dist/hooks/index.js +5 -4
  64. package/dist/index.d.ts +36 -114
  65. package/dist/index.js +174 -34
  66. package/dist/kernel-client-TZKGHJRY.js +516 -0
  67. package/dist/kernel-wire-wNdAPfhJ.d.ts +88 -0
  68. package/dist/lib/index.d.ts +3 -3
  69. package/dist/lib/index.js +5 -4
  70. package/dist/{paintDispatch-ChW5mVuK.d.ts → paintDispatch-CuJLsr9Y.d.ts} +5 -15
  71. package/dist/{prism-AIWGN2X5.js → prism-X5YWKXO5.js} +5 -3
  72. package/dist/providers/index.d.ts +42 -27
  73. package/dist/providers/index.js +22 -23
  74. package/dist/renderer/index.d.ts +0 -2
  75. package/dist/renderer/index.js +1 -0
  76. package/dist/runtime/index.d.ts +52 -253
  77. package/dist/runtime/index.js +21 -24
  78. package/dist/ssr/index.cjs +2643 -535
  79. package/dist/ssr/index.d.cts +0 -23
  80. package/dist/ssr/index.d.ts +0 -23
  81. package/dist/ssr/index.js +2639 -535
  82. package/dist/storage/browser/index.js +1 -0
  83. package/dist/test-support.d.ts +15 -8
  84. package/dist/test-support.js +91 -24
  85. package/dist/three/index.d.ts +6 -6
  86. package/dist/three/index.js +49 -37
  87. package/dist/{verificationRegistry-CabxhfTv.d.ts → verificationRegistry-CVrcxG1s.d.ts} +3 -3
  88. package/package.json +13 -9
  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/BehaviorValueFrame-SSEMEBTG.css +0 -1756
  100. package/dist/BehaviorView-RFEE5J6E.js +0 -10
  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/ServerBridge-Cm1On51b.d.ts +0 -233
  107. package/dist/TraitValueFrame-2PJGLLVI.js +0 -28
  108. package/dist/TraitValueFrame-4G3KOUBR.css +0 -1756
  109. package/dist/UISlotRenderer-JKFSX24W.js +0 -27
  110. package/dist/UserContext-DqWeZkUZ.d.ts +0 -100
  111. package/dist/chunk-2QOH2HWM.js +0 -95
  112. package/dist/chunk-6P3MWXYE.js +0 -440
  113. package/dist/chunk-FIW6WN23.js +0 -508
  114. package/dist/chunk-GAR5TQ5B.js +0 -199
  115. package/dist/chunk-ZO6MXAS3.js +0 -69
  116. package/dist/kernel-client-ZH4PSMCN.js +0 -367
  117. package/dist/kernel-wire-B4S8pnP3.d.ts +0 -65
  118. package/dist/useKeyboardRouter-Dsq553Ur.d.ts +0 -42
@@ -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,217 +25,271 @@ __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
+ }),
236
+ ...options.locale !== void 0 ? { locale: () => options.locale } : {}
130
237
  });
131
238
  }
132
- function openBundledBrowserStore(bundled, kernel, language, loadSeedProgram, locale, callService, messages, http) {
133
- const schema = parseOrbitalSchema(bundled);
239
+ function openBundledBrowserStore(schema, kernel, locale, callService, secretPorts, os) {
134
240
  return openBrowserStoreTransport({
135
241
  databaseName: browserStoreName(schema.name, locale),
136
242
  schema,
137
- kernel,
138
- language,
139
- loadSeedProgram,
140
243
  ...locale !== void 0 ? { locale } : {},
244
+ kernel,
141
245
  ...callService !== void 0 ? { callService } : {},
142
- ...http !== void 0 ? { http } : {},
143
- ...messages !== void 0 ? { messages } : {}
246
+ ...secretPorts !== void 0 ? { secretPorts } : {},
247
+ ...os !== void 0 ? { os } : {}
144
248
  });
145
249
  }
146
250
  var tickLog = createLogger("almadar:runtime:browser-host:ticks");
147
251
  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
- }
252
+ var TICK_PASS_MS = 16;
157
253
  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);
254
+ const browserStore = await openBrowserStore(options.databaseName, options.schema.orbitals, options.factory);
159
255
  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);
256
+ 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
257
  const { schema } = options;
164
258
  let transport;
165
259
  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;
260
+ const servicePorts = (caller, user, message, assertReentry) => {
218
261
  return {
219
262
  caller,
220
- inputs: () => externalInputsOf(schema),
221
- readableEntities: () => readableEntitiesOf(schema),
263
+ inputs: () => kernelEngine.externalInputs(),
264
+ readableEntities: () => kernelEngine.readableEntities(),
222
265
  dispatchInput: (orbital, request) => {
223
266
  const host = transport;
224
267
  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);
268
+ assertReentry?.();
269
+ return dispatchDeclaredInput(kernelEngine, orbital, request, async (o, r) => {
270
+ const response = await host.send(o, r);
228
271
  for (const listener of listeners) listener(o, r, response);
229
272
  return response;
230
273
  });
231
274
  },
232
- read: async (entity) => applyRowAccess(await persistence.list(entity), entityAccessPolicies(schema, entity)?.read, void 0, { user }, entity),
275
+ read: async (entity) => kernelEngine.readRows(entity, await persistence.list(entity), user),
233
276
  message
234
277
  };
235
278
  };
236
279
  let deferred;
237
280
  const kernelEngine = openLocalKernel({
238
281
  kernel: options.kernel,
239
- language: options.language,
240
282
  schema,
241
283
  persistence,
242
284
  callService: options.callService,
243
285
  servicePorts,
244
286
  deferCallOutcome: () => deferred,
245
- ...options.http !== void 0 ? { http: options.http } : {},
287
+ ...options.secretPorts !== void 0 ? { secretPorts: options.secretPorts } : {},
246
288
  ...options.onDevice !== void 0 ? { onDevice: options.onDevice } : {},
247
- ...options.tabs !== void 0 ? { tabs: options.tabs } : {}
289
+ ...options.tabs !== void 0 ? { tabs: options.tabs } : {},
290
+ ...options.os !== void 0 ? { os: options.os } : {}
248
291
  });
249
- const local = (0, local_store_transport_exports.createLocalStoreTransport)({ kernelEngine, outsideEventQueue });
292
+ const local = (0, local_store_transport_exports.createLocalStoreTransport)({ kernelEngine });
250
293
  transport = local;
251
294
  deferred = (call) => {
252
295
  const request = {
@@ -255,62 +298,58 @@ async function openBrowserHost(options) {
255
298
  targetTrait: call.traitName,
256
299
  ...call.entityId !== void 0 ? { entityId: call.entityId } : {},
257
300
  ...call.originClientId !== void 0 ? { clientId: call.originClientId } : {},
258
- ...call.user !== void 0 ? { user: call.user } : {},
259
301
  ...call.locale !== void 0 ? { locale: call.locale } : {}
260
302
  };
261
- void serially(async () => {
262
- const response = await local.send(call.orbital, request);
303
+ void local.send(call.orbital, request).then((response) => {
263
304
  for (const listener of listeners) listener(call.orbital, request, response);
264
305
  }).catch((error) => {
265
306
  queueLog.error("deferred-outcome:failed", { orbital: call.orbital, event: call.event, trait: call.traitName, error: error.message });
266
307
  });
267
308
  };
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
- );
309
+ const runnable = /* @__PURE__ */ new Map();
310
+ for (const trait of kernelEngine.programSurface().traits) {
311
+ for (const tick of trait.ticks) {
312
+ runnable.set(`${trait.name}::${tick.name}`, { orbitalName: trait.orbital, traitName: trait.name, tickName: tick.name });
294
313
  }
295
314
  }
315
+ const firing = /* @__PURE__ */ new Set();
316
+ const fire = (key, tick) => {
317
+ if (firing.has(key)) return;
318
+ firing.add(key);
319
+ const request = {
320
+ event: tickEventKey(tick.tickName),
321
+ runTick: { trait: tick.traitName, tick: tick.tickName },
322
+ targetTrait: tick.traitName,
323
+ tick: tick.tickName
324
+ };
325
+ void local.send(tick.orbitalName, request).then((response) => {
326
+ if (response.transitioned) for (const listener of listeners) listener(tick.orbitalName, request, response);
327
+ }).catch((error) => {
328
+ tickLog.error("tick:failed", { orbital: tick.orbitalName, trait: tick.traitName, tick: tick.tickName, error: error.message });
329
+ }).finally(() => {
330
+ firing.delete(key);
331
+ });
332
+ };
333
+ const timer = runnable.size === 0 ? void 0 : setInterval(() => {
334
+ for (const due of Object.values(kernelEngine.tickPass(performance.now())).flat()) {
335
+ const key = `${due.trait}::${due.tick}`;
336
+ const tick = runnable.get(key);
337
+ if (tick !== void 0) fire(key, tick);
338
+ }
339
+ }, TICK_PASS_MS);
296
340
  return {
297
341
  ...local,
298
- send: (orbitalName, request) => serially(() => local.send(orbitalName, request)),
299
342
  onInputDispatched(listener) {
300
343
  listeners.add(listener);
301
344
  return () => listeners.delete(listener);
302
345
  },
303
346
  routeMounts: (routePath) => kernelEngine.routeMounts(routePath),
304
347
  close() {
305
- for (const handle of tickHandles) handle.stop();
348
+ if (timer !== void 0) clearInterval(timer);
306
349
  }
307
350
  };
308
351
  }
309
352
 
310
- // src/runtime/effects/composition/index.ts
311
- var composition_exports = {};
312
- __reExport(composition_exports, composition_star);
313
-
314
353
  // src/runtime/ui/contract-errors.ts
315
354
  var RendererContractViolationError = class extends Error {
316
355
  constructor(message) {
@@ -447,20 +486,6 @@ function buildOrbitalsByTrait(schema, resolvedPages = []) {
447
486
  return map;
448
487
  }
449
488
 
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
489
  // src/runtime/ui/embedded-traits.ts
465
490
  var TRAIT_BINDING_PREFIX = "@trait.";
466
491
  function collectTraitRefsFromValue(value, into) {
@@ -499,19 +524,6 @@ function collectTraitRefsFromEffects(effects, into) {
499
524
  }
500
525
  }
501
526
  }
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
527
  function collectEmbeddedTraits(schema) {
516
528
  const out = /* @__PURE__ */ new Set();
517
529
  if (!schema?.orbitals) return out;
@@ -545,7 +557,7 @@ function collectEmbeddedTraits(schema) {
545
557
  return out;
546
558
  }
547
559
  var PERF_NAMESPACE = "almadar:perf:canvas";
548
- var log = createLogger(PERF_NAMESPACE);
560
+ var log2 = createLogger(PERF_NAMESPACE);
549
561
  var RING_SIZE = 50;
550
562
  var ring = [];
551
563
  var writeIdx = 0;
@@ -604,7 +616,7 @@ function perfEnd(name, startToken, detail) {
604
616
  }
605
617
  push({ name, durationMs, ts: endTs, detail });
606
618
  aggregate(name, durationMs);
607
- if (isVerbose()) log.debug(name, () => ({ durationMs, ...detail ?? {} }));
619
+ if (isVerbose()) log2.debug(name, () => ({ durationMs, ...detail ?? {} }));
608
620
  }
609
621
  function perfTime(name, fn, detail) {
610
622
  const t = perfStart(name);
@@ -651,7 +663,7 @@ function dumpSummary() {
651
663
  avgMs: Math.round(b.totalMs / b.count * 100) / 100,
652
664
  maxMs: Math.round(b.maxMs * 10) / 10
653
665
  })).sort((a, b) => b.totalMs - a.totalMs);
654
- log.warn("[PROFILE] summary", { phases: JSON.stringify(rows) });
666
+ log2.warn("[PROFILE] summary", { phases: JSON.stringify(rows) });
655
667
  buckets.clear();
656
668
  }
657
669
  function getPerfSnapshot() {
@@ -684,7 +696,7 @@ var perfStore = {
684
696
  subscribe,
685
697
  getSnapshot
686
698
  };
687
- var log2 = createLogger("almadar:runtime:verify");
699
+ var log3 = createLogger("almadar:runtime:verify");
688
700
  var MAX_EVENT_LOG = 200;
689
701
  var EMPTY_SUMMARY = {
690
702
  totalChecks: 0,
@@ -726,7 +738,7 @@ function bindEventBus(eventBus) {
726
738
  if (!api) return;
727
739
  api.sendEvent = (event, payload, traitScope) => {
728
740
  const prefixed = event.startsWith("UI:") ? event : traitScope ? `UI:${traitScope}.${event}` : `UI:${event}`;
729
- log2.debug("sendEvent", {
741
+ log3.debug("sendEvent", {
730
742
  event: prefixed,
731
743
  traitScope,
732
744
  payloadKeys: payload ? Object.keys(payload) : []
@@ -760,28 +772,4 @@ function bindTraitStateGetter(getter) {
760
772
  api.getTraitState = getter;
761
773
  }
762
774
 
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 };
775
+ 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 };