@exponential_app/engine 0.0.0-stage → 0.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 (84) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +54 -0
  3. package/README.md +35 -2
  4. package/dist/capabilities.js +29 -0
  5. package/dist/capabilities.js.map +9 -0
  6. package/dist/chunks/index-4ntgtkmb.js +6783 -0
  7. package/dist/chunks/index-4ntgtkmb.js.map +13 -0
  8. package/dist/chunks/index-ans80t68.js +382 -0
  9. package/dist/chunks/index-ans80t68.js.map +9 -0
  10. package/dist/chunks/index-ax4aay30.js +315 -0
  11. package/dist/chunks/index-ax4aay30.js.map +10 -0
  12. package/dist/chunks/index-e49v2qpf.js +2177 -0
  13. package/dist/chunks/index-e49v2qpf.js.map +9 -0
  14. package/dist/chunks/index-m2845dn6.js +72 -0
  15. package/dist/chunks/index-m2845dn6.js.map +10 -0
  16. package/dist/chunks/index-md3hz6r2.js +3015 -0
  17. package/dist/chunks/index-md3hz6r2.js.map +19 -0
  18. package/dist/chunks/index-n0acffvs.js +366 -0
  19. package/dist/chunks/index-n0acffvs.js.map +10 -0
  20. package/dist/chunks/index-nrr8x2kq.js +259 -0
  21. package/dist/chunks/index-nrr8x2kq.js.map +10 -0
  22. package/dist/chunks/index-s3xjr701.js +170 -0
  23. package/dist/chunks/index-s3xjr701.js.map +10 -0
  24. package/dist/chunks/index-t89cvabm.js +2301 -0
  25. package/dist/chunks/index-t89cvabm.js.map +10 -0
  26. package/dist/chunks/index-zw0575tv.js +126 -0
  27. package/dist/chunks/index-zw0575tv.js.map +10 -0
  28. package/dist/consent.js +24 -0
  29. package/dist/consent.js.map +9 -0
  30. package/dist/index.js +526 -0
  31. package/dist/index.js.map +11 -0
  32. package/dist/lifecycle.js +11 -0
  33. package/dist/lifecycle.js.map +9 -0
  34. package/dist/outbox.js +27 -0
  35. package/dist/outbox.js.map +9 -0
  36. package/dist/pdf.js +15 -0
  37. package/dist/pdf.js.map +9 -0
  38. package/dist/providers.js +26 -0
  39. package/dist/providers.js.map +9 -0
  40. package/dist/runner.js +24 -0
  41. package/dist/runner.js.map +9 -0
  42. package/dist/tools.js +38 -0
  43. package/dist/tools.js.map +9 -0
  44. package/dist/types/domain-contract/src/app-records.d.ts +3148 -0
  45. package/dist/types/domain-contract/src/app-share.d.ts +222 -0
  46. package/dist/types/domain-contract/src/apps.d.ts +594 -0
  47. package/dist/types/eengine/fixtures/providers.json +55 -0
  48. package/dist/types/eengine/src/broker.d.ts +80 -0
  49. package/dist/types/eengine/src/capabilities.d.ts +86 -0
  50. package/dist/types/eengine/src/consent.d.ts +50 -0
  51. package/dist/types/eengine/src/index.d.ts +11 -0
  52. package/dist/types/eengine/src/instance.d.ts +122 -0
  53. package/dist/types/eengine/src/lifecycle.d.ts +64 -0
  54. package/dist/types/eengine/src/outbox.d.ts +3 -0
  55. package/dist/types/eengine/src/pdf.d.ts +36 -0
  56. package/dist/types/eengine/src/providers.d.ts +38 -0
  57. package/dist/types/eengine/src/runner.d.ts +82 -0
  58. package/dist/types/eengine/src/stores.d.ts +125 -0
  59. package/dist/types/eengine/src/tools.d.ts +79 -0
  60. package/dist/types/eengine/src/web/index.d.ts +20 -0
  61. package/dist/types/eengine/src/web/mcp.d.ts +27 -0
  62. package/dist/types/eengine/src/web/platform.d.ts +91 -0
  63. package/dist/types/eengine/src/web/stores.d.ts +125 -0
  64. package/dist/types/emcp/fixtures/automations.json +521 -0
  65. package/dist/types/emcp/fixtures/hub.json +498 -0
  66. package/dist/types/emcp/src/access.d.ts +55 -0
  67. package/dist/types/emcp/src/audit.d.ts +22 -0
  68. package/dist/types/emcp/src/automations.d.ts +111 -0
  69. package/dist/types/emcp/src/exposes.d.ts +242 -0
  70. package/dist/types/emcp/src/hub.d.ts +63 -0
  71. package/dist/types/emcp/src/index.d.ts +7 -0
  72. package/dist/types/emcp/src/pure.d.ts +11 -0
  73. package/dist/types/emcp/src/upstream.d.ts +288 -0
  74. package/dist/types/emcp/src/vault.d.ts +34 -0
  75. package/dist/web/index.js +791 -0
  76. package/dist/web/index.js.map +13 -0
  77. package/fixtures/bundle.json +1165 -0
  78. package/fixtures/capabilities.json +373 -0
  79. package/fixtures/consent.json +146 -0
  80. package/fixtures/lifecycle.json +125 -0
  81. package/fixtures/outbox.json +8 -0
  82. package/fixtures/providers.json +55 -0
  83. package/fixtures/runner.json +2167 -0
  84. package/package.json +92 -4
package/dist/index.js ADDED
@@ -0,0 +1,526 @@
1
+ import {
2
+ CAPABILITIES2,
3
+ RESERVED_CAPABILITY_NAMES2,
4
+ scopeIdValid2,
5
+ capabilityNameValid2,
6
+ capabilityDef2,
7
+ scopeDef2,
8
+ parseCapabilityCall2,
9
+ urlOrigin2,
10
+ brokerDecide2,
11
+ agentToolList2,
12
+ brokerAuditRow2
13
+ } from "./chunks/index-md3hz6r2.js";
14
+ import {
15
+ CONSENT_COPY2,
16
+ GRANTS_RECORD_VERSION2,
17
+ consentAnswer2,
18
+ grantWrite2,
19
+ grantsRecord2,
20
+ grantsOnPackage2,
21
+ consentSheet2,
22
+ manageSheet2
23
+ } from "./chunks/index-nrr8x2kq.js";
24
+ import {
25
+ STOPPED2,
26
+ lifecycleStep2
27
+ } from "./chunks/index-m2845dn6.js";
28
+ import {
29
+ PROVIDER_KEYS2,
30
+ FORBIDDEN_HOST_KEYS2,
31
+ NETWORK_POLICIES2,
32
+ IDENTITY_KINDS2,
33
+ AGENT_PROVIDERS2,
34
+ validateHostConfig2,
35
+ engineViewer2,
36
+ engineRecordRefusal2,
37
+ networkAllows2
38
+ } from "./chunks/index-zw0575tv.js";
39
+ import {
40
+ outboxWrites2,
41
+ outboxRequest2,
42
+ outboxRows2,
43
+ outboxOutcome2,
44
+ outboxVerb2,
45
+ outboxFlush2,
46
+ outboxReflected2,
47
+ outboxPrune2,
48
+ outboxPendingLabel2,
49
+ outboxMode2
50
+ } from "./chunks/index-4ntgtkmb.js";
51
+ import {
52
+ wrapLines2,
53
+ pdfNumber2,
54
+ pdfImage2,
55
+ renderPdf2
56
+ } from "./chunks/index-ax4aay30.js";
57
+ import {
58
+ CAPABILITY_TOOLS2,
59
+ MIME_BY_EXTENSION2,
60
+ toolDef2,
61
+ nativeCaller2,
62
+ schemaViolation2,
63
+ validateToolArguments2,
64
+ base64Encode2,
65
+ base64Decode2,
66
+ sniffMime2,
67
+ mimeFor2,
68
+ newNotificationId2,
69
+ toolResult2,
70
+ toolError2,
71
+ bridgeCall2,
72
+ pdfFileName2
73
+ } from "./chunks/index-n0acffvs.js";
74
+ import {
75
+ RUNNER_COPY2,
76
+ RUNNER_BUNDLE2,
77
+ RUNNER_SHELL2,
78
+ runnerConfig2,
79
+ runnerHasPermissions2,
80
+ runnerPackage2,
81
+ runnerFailure2,
82
+ runnerToast2
83
+ } from "./chunks/index-t89cvabm.js";
84
+ import {
85
+ StoreError2,
86
+ applyBatch2,
87
+ LocalRecordStore2,
88
+ MemoryPersistence2,
89
+ MemoryRecordStore2,
90
+ MemoryVault2,
91
+ MemoryBlobStore2,
92
+ localDeviceId2
93
+ } from "./chunks/index-s3xjr701.js";
94
+ // packages/eengine/src/broker.ts
95
+ var refused = (verdict) => ({ refused: { code: verdict.verdict === `unknown` ? `UNKNOWN_TOOL` : `FORBIDDEN`, message: verdict.reason ?? `` } });
96
+
97
+ class Broker {
98
+ setup;
99
+ grantsNow;
100
+ foreground = false;
101
+ persisted = Promise.resolve();
102
+ constructor(setup) {
103
+ this.setup = setup;
104
+ this.grantsNow = { ...setup.grants };
105
+ }
106
+ get appId() {
107
+ return this.setup.appId;
108
+ }
109
+ get manifest() {
110
+ return this.setup.manifest;
111
+ }
112
+ get capabilities() {
113
+ return this.setup.capabilities;
114
+ }
115
+ grants() {
116
+ return { ...this.grantsNow };
117
+ }
118
+ setForeground(foreground) {
119
+ this.foreground = foreground;
120
+ }
121
+ provided() {
122
+ return this.setup.capabilities.map((c) => c.name);
123
+ }
124
+ record(client, call, verdict, outcome) {
125
+ this.setup.audit?.record(brokerAuditRow2({ appId: this.setup.appId, client, call, verdict, outcome }));
126
+ }
127
+ async run(client, call, verdict) {
128
+ const capability = this.setup.capabilities.find((c) => c.name === verdict.capability);
129
+ if (!capability || !verdict.tool) {
130
+ this.record(client, call, verdict, `unreachable`);
131
+ return { refused: { code: `FORBIDDEN`, message: `unavailable` } };
132
+ }
133
+ const { result, outcome } = await bridgeCall2({
134
+ tool: `${capability.name}_${verdict.tool}`,
135
+ arguments: call.arguments ?? {},
136
+ context: { app: this.setup.appId, screens: this.setup.screens },
137
+ blobs: this.setup.blobs,
138
+ native: (tool, args) => capability.call(tool.slice(tool.indexOf(`_`) + 1), args)
139
+ });
140
+ this.record(client, call, verdict, outcome);
141
+ return { result };
142
+ }
143
+ call(from, client, name, args) {
144
+ const call = { from, name, arguments: args };
145
+ const verdict = brokerDecide2({ manifest: this.setup.manifest, grants: this.grantsNow, provided: this.provided(), foreground: this.foreground, call });
146
+ if (verdict.verdict === `call`)
147
+ return this.run(client, call, verdict);
148
+ if (verdict.verdict === `ask`) {
149
+ const entry = this.setup.manifest.find((m) => m.id === verdict.scope) ?? { id: verdict.scope ?? ``, why: `` };
150
+ const { components, data } = consentSheet2(this.setup.appName, entry);
151
+ return Promise.resolve({ ask: verdict, sheet: { scope: entry.id, components, data } });
152
+ }
153
+ this.record(client, call, verdict, null);
154
+ return Promise.resolve(refused(verdict));
155
+ }
156
+ answer(from, client, name, args, verdict, answer) {
157
+ const call = { from, name, arguments: args };
158
+ if (!verdict.scope)
159
+ return Promise.resolve(refused(verdict));
160
+ const next = consentAnswer2(this.grantsNow, verdict.scope, answer);
161
+ this.grantsNow = next.grants;
162
+ this.persist(next.grants);
163
+ const decided = { ...verdict, verdict: next.verdict, reason: next.reason };
164
+ if (next.verdict === `call`)
165
+ return this.run(client, call, decided);
166
+ this.record(client, call, decided, null);
167
+ return Promise.resolve(refused(decided));
168
+ }
169
+ setGrant(via, gesture, scope, value) {
170
+ const next = grantWrite2(this.setup.manifest, this.grantsNow, { via, gesture, scope, value });
171
+ if (next.refused)
172
+ return next.refused;
173
+ this.grantsNow = next.grants;
174
+ this.persist(next.grants);
175
+ return null;
176
+ }
177
+ permissionsSheet() {
178
+ return manageSheet2(this.setup.manifest, this.grantsNow);
179
+ }
180
+ persist(grants) {
181
+ const { key, value } = grantsRecord2(this.setup.appId, this.setup.signer, this.setup.manifest, grants);
182
+ this.persisted = this.persisted.then(() => this.setup.vault.write(key, value)).catch(() => {});
183
+ }
184
+ }
185
+ // packages/eengine/src/instance.ts
186
+ import {
187
+ kindComputed,
188
+ kindRefs,
189
+ kindTransitions,
190
+ navigateTarget,
191
+ packageScreens,
192
+ parseRecordsSource,
193
+ parseSource,
194
+ recordPolicy,
195
+ recordsValue,
196
+ bridgePackage,
197
+ validatePackage,
198
+ verifyPackageFile
199
+ } from "@exponential_app/eui/host";
200
+ class LoadError extends Error {
201
+ kind;
202
+ issues;
203
+ constructor(kind, issues) {
204
+ super(`${kind}: ${issues.map((i) => `${i.path || `/`} ${i.message}`).join(`; `)}`);
205
+ this.kind = kind;
206
+ this.issues = issues;
207
+ this.name = `LoadError`;
208
+ }
209
+ }
210
+ var screenKey = (app) => `eengine/screen/${app}`;
211
+ var isObject = (v) => !!v && typeof v === `object` && !Array.isArray(v);
212
+ var packageOf = (file) => isObject(file) && isObject(file.package) ? file.package : file;
213
+ var brokered = (answer) => {
214
+ if (!(`result` in answer))
215
+ return answer;
216
+ const { result } = answer;
217
+ if (result.isError)
218
+ return { refused: { code: `failed`, message: result.content[0]?.text ?? `failed` } };
219
+ return { value: result.structuredContent ?? null };
220
+ };
221
+ var failure = (code, error) => isObject(error) && typeof error.code === `string` && typeof error.message === `string` ? { code: error.code, message: error.message } : { code, message: error instanceof Error ? error.message : String(error) };
222
+ var parseLast = (stored) => {
223
+ if (!stored)
224
+ return null;
225
+ try {
226
+ const v = JSON.parse(stored);
227
+ return isObject(v) && typeof v.screen === `string` && isObject(v.params) ? { screen: v.screen, params: v.params } : null;
228
+ } catch {
229
+ return null;
230
+ }
231
+ };
232
+
233
+ class AppInstance {
234
+ config;
235
+ pkg;
236
+ appId;
237
+ signer;
238
+ broker;
239
+ stateNow = STOPPED2;
240
+ outboxNow = [];
241
+ lastScreen;
242
+ constructor(config, pkg, appId, signer, broker, lastScreen) {
243
+ this.config = config;
244
+ this.pkg = pkg;
245
+ this.appId = appId;
246
+ this.signer = signer;
247
+ this.broker = broker;
248
+ this.lastScreen = lastScreen;
249
+ }
250
+ static async load(config, file) {
251
+ const verification = await verifyPackageFile(file);
252
+ if (verification.status === `invalid`)
253
+ throw new LoadError(`signature`, verification.issues);
254
+ const pkg = bridgePackage(packageOf(file));
255
+ const issues = validatePackage(pkg);
256
+ if (issues.length)
257
+ throw new LoadError(`invalid`, issues);
258
+ const p = pkg;
259
+ const appId = typeof p.id === `string` ? p.id : ``;
260
+ const signer = verification.status === `valid` ? verification.author.key : null;
261
+ const manifest = Array.isArray(p.capabilities) ? p.capabilities : [];
262
+ const key = grantsRecord2(appId, signer ?? ``, manifest, {}).key;
263
+ const [storedGrants, lastScreen] = await Promise.all([config.vault.read(key).catch(() => null), config.vault.read(screenKey(appId)).catch(() => null)]);
264
+ const broker = new Broker({
265
+ appId,
266
+ appName: typeof p.name === `string` ? p.name : appId,
267
+ signer: signer ?? ``,
268
+ manifest,
269
+ grants: grantsOnPackage2(storedGrants, signer ?? ``, manifest),
270
+ capabilities: config.capabilities,
271
+ vault: config.vault,
272
+ blobs: config.blobs,
273
+ screens: packageScreens(p).map((s) => s.template),
274
+ audit: config.audit ?? null
275
+ });
276
+ return new AppInstance(config, p, appId, signer, broker, lastScreen);
277
+ }
278
+ get manifest() {
279
+ return this.broker.manifest;
280
+ }
281
+ grants() {
282
+ return this.broker.grants();
283
+ }
284
+ get state() {
285
+ return this.stateNow;
286
+ }
287
+ get outbox() {
288
+ return this.outboxNow;
289
+ }
290
+ get mode() {
291
+ return outboxMode2(!!this.config.sync);
292
+ }
293
+ me() {
294
+ return engineViewer2(this.config.identity).id ?? ``;
295
+ }
296
+ now() {
297
+ return this.config.clock?.() ?? new Date().toISOString();
298
+ }
299
+ async answerConsent(name, args, verdict, answer) {
300
+ return brokered(await this.broker.answer(`ui`, null, name, args, verdict, answer));
301
+ }
302
+ setGrant(via, gesture, scope, value) {
303
+ return this.broker.setGrant(via, gesture, scope, value);
304
+ }
305
+ permissionsSheet() {
306
+ return this.broker.permissionsSheet();
307
+ }
308
+ async event(event) {
309
+ const { state, effects } = lifecycleStep2(this.stateNow, event, { pkg: { id: this.appId, screens: this.pkg.screens }, lastScreen: parseLast(this.lastScreen) });
310
+ this.stateNow = state;
311
+ this.broker.setForeground(state.phase === `foreground`);
312
+ for (const effect of effects) {
313
+ if (effect.effect === `open`)
314
+ this.config.window.open(this.appId, effect.screen, effect.params, `replace`);
315
+ else if (effect.effect === `persist`) {
316
+ this.lastScreen = JSON.stringify({ screen: effect.screen, params: effect.params });
317
+ await this.config.vault.write(screenKey(this.appId), this.lastScreen).catch(() => {});
318
+ } else if (effect.effect === `flush`)
319
+ await this.flush();
320
+ }
321
+ return effects;
322
+ }
323
+ async recordsValue(source) {
324
+ const parsed = parseSource(source);
325
+ const query = parsed ? parseRecordsSource(parsed) : null;
326
+ if (!query)
327
+ return;
328
+ if (query.app !== null)
329
+ return null;
330
+ let rows = await this.config.storage.rows(this.appId);
331
+ if (this.outboxNow.length)
332
+ rows = outboxRows2(rows, this.outboxNow, this.me());
333
+ const records = this.pkg.records;
334
+ const def = query.from && isObject(records) ? records[query.from] : undefined;
335
+ const viewer = engineViewer2(this.config.identity);
336
+ return recordsValue(rows, query, {
337
+ me: viewer.id,
338
+ now: this.now(),
339
+ names: {},
340
+ computed: kindComputed(records, query.from),
341
+ refs: kindRefs(records, query.from),
342
+ transitions: kindTransitions(def),
343
+ role: viewer.role
344
+ });
345
+ }
346
+ subscribe(on) {
347
+ return this.config.storage.subscribe(this.appId, () => on());
348
+ }
349
+ async call(name, args, newIds = []) {
350
+ const a = isObject(args) ? args : {};
351
+ switch (name) {
352
+ case `records_upsert`:
353
+ return this.write(`upsert`, a, newIds);
354
+ case `records_delete`:
355
+ return this.write(`delete`, a, newIds);
356
+ case `records_batch`:
357
+ return this.write(`batch`, a, newIds);
358
+ case `app_navigate`: {
359
+ const target = navigateTarget(this.pkg, args);
360
+ if (`error` in target)
361
+ return { refused: { code: `BAD_REQUEST`, message: target.error } };
362
+ this.config.window.open(this.appId, target.screen, target.params, `replace`);
363
+ this.stateNow = { ...this.stateNow, screen: target.screen, params: target.params };
364
+ return { value: null };
365
+ }
366
+ default:
367
+ return brokered(await this.broker.call(`ui`, null, name, args));
368
+ }
369
+ }
370
+ async refusal(writes) {
371
+ const rows = await this.config.storage.rows(this.appId).catch(() => []);
372
+ const records = isObject(this.pkg.records) ? this.pkg.records : {};
373
+ for (const w of writes) {
374
+ const row = rows.find((r) => r.id === w.id);
375
+ const op = w.op;
376
+ const kind = w.op === `delete` ? row?.kind : w.kind;
377
+ const policy = recordPolicy(kind ? records[kind] : undefined);
378
+ const refusal = engineRecordRefusal2(this.config.identity, policy, op, w.op === `create` ? null : row ? { authorId: row.authorId ?? null, createdBy: row.createdBy } : null);
379
+ if (refusal)
380
+ return refusal;
381
+ }
382
+ return null;
383
+ }
384
+ async write(call, args, newIds) {
385
+ const writes = outboxWrites2(call, args, newIds);
386
+ const refusal = await this.refusal(writes);
387
+ if (refusal)
388
+ return { refused: { code: `FORBIDDEN`, message: refusal } };
389
+ const entry = { writeId: this.config.newId?.() ?? crypto.randomUUID(), appId: this.appId, call, writes, at: this.now(), state: `pending` };
390
+ const answer = call === `upsert` ? { id: writes[0]?.id } : call === `delete` ? null : { ids: writes.map((w) => w.id) };
391
+ if (this.mode === `direct`) {
392
+ try {
393
+ await this.config.storage.write(this.appId, batchOf(entry), this.me());
394
+ return { value: answer };
395
+ } catch (error) {
396
+ return { refused: failure(`STORE`, error) };
397
+ }
398
+ }
399
+ this.outboxNow = [...this.outboxNow, entry];
400
+ if (this.stateNow.phase === `foreground`)
401
+ await this.flush();
402
+ return { value: answer };
403
+ }
404
+ async flush() {
405
+ const sync = this.config.sync;
406
+ if (!sync)
407
+ return;
408
+ const results = {};
409
+ for (const entry of this.outboxNow.filter((e) => e.state === `pending`)) {
410
+ const { call, input } = outboxRequest2(entry);
411
+ const result = await sync.push(this.appId, call, input).catch(() => ({ transport: true }));
412
+ results[entry.writeId] = result;
413
+ if (outboxOutcome2(entry, result) === `retry`)
414
+ break;
415
+ }
416
+ if (!Object.keys(results).length)
417
+ return;
418
+ const now = this.now();
419
+ const after = outboxFlush2(this.outboxNow, results, now).after;
420
+ const rows = await this.config.storage.rows(this.appId).catch(() => []);
421
+ this.outboxNow = outboxPrune2(after, rows, now);
422
+ }
423
+ }
424
+ function batchOf(entry) {
425
+ return {
426
+ writeId: entry.writeId,
427
+ writes: entry.writes.map((w) => w.op === `delete` ? { op: `delete`, id: w.id } : { op: `upsert`, id: w.id, kind: w.kind, data: w.data, create: w.op === `create` }),
428
+ at: entry.at
429
+ };
430
+ }
431
+ function createsOf(name, args) {
432
+ if (!isObject(args))
433
+ return 0;
434
+ if (name === `records_upsert`)
435
+ return typeof args.id === `string` ? 0 : 1;
436
+ if (name === `records_batch` && Array.isArray(args.writes))
437
+ return args.writes.filter((w) => isObject(w) && w.op !== `delete` && typeof w.id !== `string`).length;
438
+ return 0;
439
+ }
440
+ export {
441
+ AGENT_PROVIDERS2 as AGENT_PROVIDERS,
442
+ AppInstance,
443
+ Broker,
444
+ CAPABILITIES2 as CAPABILITIES,
445
+ CAPABILITY_TOOLS2 as CAPABILITY_TOOLS,
446
+ CONSENT_COPY2 as CONSENT_COPY,
447
+ FORBIDDEN_HOST_KEYS2 as FORBIDDEN_HOST_KEYS,
448
+ GRANTS_RECORD_VERSION2 as GRANTS_RECORD_VERSION,
449
+ IDENTITY_KINDS2 as IDENTITY_KINDS,
450
+ LoadError,
451
+ LocalRecordStore2 as LocalRecordStore,
452
+ MIME_BY_EXTENSION2 as MIME_BY_EXTENSION,
453
+ MemoryBlobStore2 as MemoryBlobStore,
454
+ MemoryPersistence2 as MemoryPersistence,
455
+ MemoryRecordStore2 as MemoryRecordStore,
456
+ MemoryVault2 as MemoryVault,
457
+ NETWORK_POLICIES2 as NETWORK_POLICIES,
458
+ PROVIDER_KEYS2 as PROVIDER_KEYS,
459
+ RESERVED_CAPABILITY_NAMES2 as RESERVED_CAPABILITY_NAMES,
460
+ RUNNER_BUNDLE2 as RUNNER_BUNDLE,
461
+ RUNNER_COPY2 as RUNNER_COPY,
462
+ RUNNER_SHELL2 as RUNNER_SHELL,
463
+ STOPPED2 as STOPPED,
464
+ StoreError2 as StoreError,
465
+ agentToolList2 as agentToolList,
466
+ applyBatch2 as applyBatch,
467
+ base64Decode2 as base64Decode,
468
+ base64Encode2 as base64Encode,
469
+ batchOf,
470
+ bridgeCall2 as bridgeCall,
471
+ brokerAuditRow2 as brokerAuditRow,
472
+ brokerDecide2 as brokerDecide,
473
+ capabilityDef2 as capabilityDef,
474
+ capabilityNameValid2 as capabilityNameValid,
475
+ consentAnswer2 as consentAnswer,
476
+ consentSheet2 as consentSheet,
477
+ createsOf,
478
+ engineRecordRefusal2 as engineRecordRefusal,
479
+ engineViewer2 as engineViewer,
480
+ grantWrite2 as grantWrite,
481
+ grantsOnPackage2 as grantsOnPackage,
482
+ grantsRecord2 as grantsRecord,
483
+ lifecycleStep2 as lifecycleStep,
484
+ localDeviceId2 as localDeviceId,
485
+ manageSheet2 as manageSheet,
486
+ mimeFor2 as mimeFor,
487
+ nativeCaller2 as nativeCaller,
488
+ networkAllows2 as networkAllows,
489
+ newNotificationId2 as newNotificationId,
490
+ outboxFlush2 as outboxFlush,
491
+ outboxMode2 as outboxMode,
492
+ outboxOutcome2 as outboxOutcome,
493
+ outboxPendingLabel2 as outboxPendingLabel,
494
+ outboxPrune2 as outboxPrune,
495
+ outboxReflected2 as outboxReflected,
496
+ outboxRequest2 as outboxRequest,
497
+ outboxRows2 as outboxRows,
498
+ outboxVerb2 as outboxVerb,
499
+ outboxWrites2 as outboxWrites,
500
+ packageOf,
501
+ parseCapabilityCall2 as parseCapabilityCall,
502
+ pdfFileName2 as pdfFileName,
503
+ pdfImage2 as pdfImage,
504
+ pdfNumber2 as pdfNumber,
505
+ renderPdf2 as renderPdf,
506
+ runnerConfig2 as runnerConfig,
507
+ runnerFailure2 as runnerFailure,
508
+ runnerHasPermissions2 as runnerHasPermissions,
509
+ runnerPackage2 as runnerPackage,
510
+ runnerToast2 as runnerToast,
511
+ schemaViolation2 as schemaViolation,
512
+ scopeDef2 as scopeDef,
513
+ scopeIdValid2 as scopeIdValid,
514
+ screenKey,
515
+ sniffMime2 as sniffMime,
516
+ toolDef2 as toolDef,
517
+ toolError2 as toolError,
518
+ toolResult2 as toolResult,
519
+ urlOrigin2 as urlOrigin,
520
+ validateHostConfig2 as validateHostConfig,
521
+ validateToolArguments2 as validateToolArguments,
522
+ wrapLines2 as wrapLines
523
+ };
524
+
525
+ //# debugId=D9EDE6EA8C5E519264756E2164756E21
526
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,11 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../packages/eengine/src/broker.ts", "../../../packages/eengine/src/instance.ts"],
4
+ "sourcesContent": [
5
+ "// VAPP-269: the capability runtime, the twin of the crate's `capability.rs`.\n// ONE `Broker` per app instance answers app UI calls (`photos_pick`) and\n// agent calls (`photos__pick`) the same way: the package's manifest is the\n// ceiling, the person's consent next (the host paints the sheet and answers\n// through `answer`), then one audit row. Grants persist in the Vault and\n// change ONLY through `setGrant` with `consentUi` after a gesture.\n//\n// USER ACTIVATION (the web): `call` and `answer` reach the native provider\n// without awaiting anything but microtasks (the grants live in memory, the\n// Vault write runs after), so a picker opens inside the click's task.\n\nimport type { HubOutcome } from \"@exp/emcp\"\n\nimport { brokerAuditRow, brokerDecide, type BrokerAuditRow, type BrokerCall, type BrokerVerdict, type CallFrom, type Grants, type GrantValue, type ManifestEntry } from \"./capabilities\"\nimport { consentAnswer, consentSheet, grantsRecord, grantWrite, manageSheet, type ConsentAnswer, type GrantVia, type SurfaceComponent } from \"./consent\"\nimport { bridgeCall, type BlobStore, type McpCallResult, type NativeCapability } from \"./tools\"\n\n/** A refusal or a failure (eCore's shape: a code + a message). */\nexport interface Failure {\n code: string\n message: string\n}\n\n/** Where secrets live (Keychain, Keystore, libsecret; the web: IndexedDB). */\nexport interface Vault {\n read(key: string): Promise<string | null>\n write(key: string, value: string): Promise<void>\n delete(key: string): Promise<void>\n}\n\n/** Where the broker's audit rows go. */\nexport interface CallAudit {\n record(row: BrokerAuditRow): void\n}\n\n/** The ask sheet the person answers (consent.json `consentSheet`): a genUI surface. */\nexport interface ConsentSheet {\n scope: string\n components: SurfaceComponent[]\n data: Record<string, unknown>\n}\n\n/** What a brokered call answers. */\nexport type BrokerAnswer =\n | { result: McpCallResult }\n /** The person decides first: paint the sheet, then `answer`. */\n | { ask: BrokerVerdict; sheet: ConsentSheet }\n /** `code` = `UNKNOWN_TOOL` for unknown, else `FORBIDDEN`; `message` = the reason. */\n | { refused: Failure }\n\nexport interface BrokerSetup {\n appId: string\n appName: string\n signer: string\n manifest: readonly ManifestEntry[]\n grants: Grants\n capabilities: readonly NativeCapability[]\n vault: Vault\n /** The app's files: what capabilities read (`fileId`) and store. */\n blobs: BlobStore\n /** The package's screen names (a notification's tap opens one). */\n screens: readonly string[]\n audit?: CallAudit | null\n}\n\nconst refused = (verdict: BrokerVerdict): BrokerAnswer => ({ refused: { code: verdict.verdict === `unknown` ? `UNKNOWN_TOOL` : `FORBIDDEN`, message: verdict.reason ?? `` } })\n\n/** One app instance's broker. */\nexport class Broker {\n private grantsNow: Grants\n private foreground = false\n /** The last grants write (tests and a closing page await it). */\n persisted: Promise<void> = Promise.resolve()\n\n constructor(private readonly setup: BrokerSetup) {\n this.grantsNow = { ...setup.grants }\n }\n\n get appId(): string {\n return this.setup.appId\n }\n\n get manifest(): readonly ManifestEntry[] {\n return this.setup.manifest\n }\n\n get capabilities(): readonly NativeCapability[] {\n return this.setup.capabilities\n }\n\n grants(): Grants {\n return { ...this.grantsNow }\n }\n\n /** The lifecycle tells the broker whether a sheet may show. */\n setForeground(foreground: boolean): void {\n this.foreground = foreground\n }\n\n private provided(): string[] {\n return this.setup.capabilities.map((c) => c.name)\n }\n\n private record(client: string | null, call: BrokerCall, verdict: BrokerVerdict, outcome: HubOutcome | null): void {\n this.setup.audit?.record(brokerAuditRow({ appId: this.setup.appId, client, call, verdict, outcome }))\n }\n\n private async run(client: string | null, call: BrokerCall, verdict: BrokerVerdict): Promise<BrokerAnswer> {\n const capability = this.setup.capabilities.find((c) => c.name === verdict.capability)\n if (!capability || !verdict.tool) {\n this.record(client, call, verdict, `unreachable`)\n return { refused: { code: `FORBIDDEN`, message: `unavailable` } }\n }\n const { result, outcome } = await bridgeCall({\n tool: `${capability.name}_${verdict.tool}`,\n arguments: call.arguments ?? {},\n context: { app: this.setup.appId, screens: this.setup.screens },\n blobs: this.setup.blobs,\n native: (tool, args) => capability.call(tool.slice(tool.indexOf(`_`) + 1), args),\n })\n this.record(client, call, verdict, outcome)\n return { result }\n }\n\n /** One call from app UI (`client` = null) or an agent run (`client` = its run id). */\n call(from: CallFrom, client: string | null, name: string, args: unknown): Promise<BrokerAnswer> {\n const call: BrokerCall = { from, name, arguments: args }\n const verdict = brokerDecide({ manifest: this.setup.manifest, grants: this.grantsNow, provided: this.provided(), foreground: this.foreground, call })\n if (verdict.verdict === `call`) return this.run(client, call, verdict)\n if (verdict.verdict === `ask`) {\n const entry = this.setup.manifest.find((m) => m.id === verdict.scope) ?? { id: verdict.scope ?? ``, why: `` }\n const { components, data } = consentSheet(this.setup.appName, entry)\n return Promise.resolve({ ask: verdict, sheet: { scope: entry.id, components, data } })\n }\n this.record(client, call, verdict, null)\n return Promise.resolve(refused(verdict))\n }\n\n /** The person's answer to the sheet for `verdict` (an Ask): store it per\n * consent.json, then run or refuse the call. The answer is the gesture. */\n answer(from: CallFrom, client: string | null, name: string, args: unknown, verdict: BrokerVerdict, answer: ConsentAnswer): Promise<BrokerAnswer> {\n const call: BrokerCall = { from, name, arguments: args }\n if (!verdict.scope) return Promise.resolve(refused(verdict))\n const next = consentAnswer(this.grantsNow, verdict.scope, answer)\n this.grantsNow = next.grants\n this.persist(next.grants)\n const decided: BrokerVerdict = { ...verdict, verdict: next.verdict, reason: next.reason }\n if (next.verdict === `call`) return this.run(client, call, decided)\n this.record(client, call, decided, null)\n return Promise.resolve(refused(decided))\n }\n\n /** Change a grant (the Permissions sheet's Switch). Only the ConsentUi\n * after a gesture; `value` null = revoke. Answers consent.json's refusal, or null. */\n setGrant(via: GrantVia, gesture: boolean, scope: string, value: GrantValue | null): string | null {\n const next = grantWrite(this.setup.manifest, this.grantsNow, { via, gesture, scope, value })\n if (next.refused) return next.refused\n this.grantsNow = next.grants\n this.persist(next.grants)\n return null\n }\n\n /** The Permissions sheet (consent.json `manageSheet`). */\n permissionsSheet(): SurfaceComponent[] {\n return manageSheet(this.setup.manifest, this.grantsNow)\n }\n\n private persist(grants: Grants): void {\n const { key, value } = grantsRecord(this.setup.appId, this.setup.signer, this.setup.manifest, grants)\n // A failed write only means the person is asked again next launch.\n this.persisted = this.persisted.then(() => this.setup.vault.write(key, value)).catch(() => {})\n }\n}\n",
6
+ "// VAPP-269: an `AppInstance`, one running app over a host's providers, the\n// twin of the crate's `instance.rs`: load and verify its package file,\n// drive its lifecycle (lifecycle.json) and carry out the effects, resolve\n// `records:<kind>` sources with genUI's one records query, dispatch\n// `records_*`, `app_navigate` and capability calls (the broker, the E5\n// bridge), and keep O1's outbox when the host has a sync provider\n// (outbox.json: direct writes otherwise).\n\nimport {\n kindComputed,\n kindRefs,\n kindTransitions,\n navigateTarget,\n packageScreens,\n parseRecordsSource,\n parseSource,\n recordPolicy,\n recordsValue,\n bridgePackage,\n validatePackage,\n verifyPackageFile,\n type PackageIssue,\n type RecordOp,\n type RecordRow,\n type RecordsValue,\n} from \"@exponential_app/eui/host\"\n\nimport { Broker, type BrokerAnswer, type CallAudit, type ConsentSheet, type Failure, type Vault } from \"./broker\"\nimport type { BrokerVerdict, Grants, GrantValue, ManifestEntry } from \"./capabilities\"\nimport { grantsOnPackage, grantsRecord, type ConsentAnswer, type GrantVia, type SurfaceComponent } from \"./consent\"\nimport { lifecycleStep, STOPPED, type LifecycleEffect, type LifecycleEvent, type LifecycleState } from \"./lifecycle\"\nimport { outboxFlush, outboxMode, outboxOutcome, outboxPrune, outboxRequest, outboxRows, outboxWrites, type OutboxCall, type OutboxEntry, type OutboxResult, type OutboxWrite } from \"./outbox\"\nimport { engineRecordRefusal, engineViewer, type EngineIdentity, type NetworkPolicy } from \"./providers\"\nimport type { EngineRecordStore, WriteBatch } from \"./stores\"\nimport type { BlobStore, NativeCapability } from \"./tools\"\n\nexport type Presentation = `replace` | `push` | `sheet`\n\n/** Maps screens to windows (desktop), nav stacks and sheets (phones), the page (the web). */\nexport interface WindowHost {\n open(app: string, screen: string, params: Record<string, string>, how: Presentation): void\n}\n\n/** An optional transport to an authority; absent = the store is the authority, no outbox. */\nexport interface SyncTransport {\n push(app: string, call: OutboxCall, input: Record<string, unknown>): Promise<OutboxResult>\n}\n\n/** What a host hands the Engine (providers.json; no telemetry or update key: none exists). */\nexport interface EngineHostConfig {\n host: { kind: string; platform: string; formFactor: string; locale: string }\n storage: EngineRecordStore\n blobs: BlobStore\n identity: EngineIdentity\n vault: Vault\n window: WindowHost\n /** ISO 8601 UTC with milliseconds (tests pin it). */\n clock?: () => string\n network: NetworkPolicy\n sync?: SyncTransport | null\n capabilities: readonly NativeCapability[]\n audit?: CallAudit | null\n newId?: () => string\n}\n\n/** Why a package could not load: `signature` (signed, does not verify) or `invalid` (genUI refuses it). */\nexport class LoadError extends Error {\n constructor(\n readonly kind: `signature` | `invalid`,\n readonly issues: PackageIssue[],\n ) {\n super(`${kind}: ${issues.map((i) => `${i.path || `/`} ${i.message}`).join(`; `)}`)\n this.name = `LoadError`\n }\n}\n\n/** What a host function call answers. */\nexport type CallResult =\n | { value: unknown }\n /** The person decides first: paint the sheet, then `answerConsent` with the same call. */\n | { ask: BrokerVerdict; sheet: ConsentSheet }\n /** Refused (the failed-action toast's reason). */\n | { refused: Failure }\n\n/** Where the instance keeps its last screen (lifecycle.json `persist`). */\nexport const screenKey = (app: string): string => `eengine/screen/${app}`\n\ntype Pkg = Record<string, unknown> & { id?: unknown; name?: unknown; records?: unknown; capabilities?: unknown; screens?: unknown }\n\nconst isObject = (v: unknown): v is Record<string, unknown> => !!v && typeof v === `object` && !Array.isArray(v)\n\n/** The package a file carries (`package`), or the value itself when it is a bare package. */\nexport const packageOf = (file: unknown): unknown => (isObject(file) && isObject(file.package) ? file.package : file)\n\n/** VAPP-271: app UI reads a capability's answer as its `structuredContent`\n * (an action step's `results.<name>`); an `isError` result is the call's\n * refusal, its text the toast. */\nconst brokered = (answer: BrokerAnswer): CallResult => {\n if (!(`result` in answer)) return answer\n const { result } = answer\n if (result.isError) return { refused: { code: `failed`, message: result.content[0]?.text ?? `failed` } }\n return { value: result.structuredContent ?? null }\n}\n\nconst failure = (code: string, error: unknown): Failure =>\n isObject(error) && typeof error.code === `string` && typeof error.message === `string` ? { code: error.code, message: error.message } : { code, message: error instanceof Error ? error.message : String(error) }\n\nconst parseLast = (stored: string | null): { screen: string; params: Record<string, unknown> } | null => {\n if (!stored) return null\n try {\n const v = JSON.parse(stored)\n return isObject(v) && typeof v.screen === `string` && isObject(v.params) ? { screen: v.screen, params: v.params } : null\n } catch {\n return null\n }\n}\n\n/** One running app. */\nexport class AppInstance {\n private stateNow: LifecycleState = STOPPED\n private outboxNow: OutboxEntry[] = []\n private lastScreen: string | null\n\n private constructor(\n private readonly config: EngineHostConfig,\n readonly pkg: Pkg,\n readonly appId: string,\n readonly signer: string | null,\n readonly broker: Broker,\n lastScreen: string | null,\n ) {\n this.lastScreen = lastScreen\n }\n\n /** Load a package file (or a bare package): verify its signature when it\n * carries one, validate the package, reconcile its grants. */\n static async load(config: EngineHostConfig, file: unknown): Promise<AppInstance> {\n const verification = await verifyPackageFile(file)\n if (verification.status === `invalid`) throw new LoadError(`signature`, verification.issues)\n // Round 9 §12: format 5 through the bridge while ACCEPT_V09 holds.\n const pkg = bridgePackage(packageOf(file))\n const issues = validatePackage(pkg)\n if (issues.length) throw new LoadError(`invalid`, issues)\n const p = pkg as Pkg\n const appId = typeof p.id === `string` ? p.id : ``\n const signer = verification.status === `valid` ? verification.author.key : null\n const manifest: ManifestEntry[] = Array.isArray(p.capabilities) ? (p.capabilities as ManifestEntry[]) : []\n const key = grantsRecord(appId, signer ?? ``, manifest, {}).key\n const [storedGrants, lastScreen] = await Promise.all([config.vault.read(key).catch(() => null), config.vault.read(screenKey(appId)).catch(() => null)])\n const broker = new Broker({\n appId,\n appName: typeof p.name === `string` ? p.name : appId,\n signer: signer ?? ``,\n manifest,\n grants: grantsOnPackage(storedGrants, signer ?? ``, manifest),\n capabilities: config.capabilities,\n vault: config.vault,\n blobs: config.blobs,\n screens: packageScreens(p).map((s) => s.template),\n audit: config.audit ?? null,\n })\n return new AppInstance(config, p, appId, signer, broker, lastScreen)\n }\n\n get manifest(): readonly ManifestEntry[] {\n return this.broker.manifest\n }\n\n grants(): Grants {\n return this.broker.grants()\n }\n\n get state(): LifecycleState {\n return this.stateNow\n }\n\n /** The outbox entries still pending or acked (queue mode). */\n get outbox(): readonly OutboxEntry[] {\n return this.outboxNow\n }\n\n get mode(): `queue` | `direct` {\n return outboxMode(!!this.config.sync)\n }\n\n private me(): string {\n return engineViewer(this.config.identity).id ?? ``\n }\n\n private now(): string {\n return this.config.clock?.() ?? new Date().toISOString()\n }\n\n /** The person answered the sheet of an Ask for this call (the answer is the gesture). */\n async answerConsent(name: string, args: unknown, verdict: BrokerVerdict, answer: ConsentAnswer): Promise<CallResult> {\n return brokered(await this.broker.answer(`ui`, null, name, args, verdict, answer))\n }\n\n /** The Permissions sheet's Switch: only the ConsentUi, after a gesture. Answers the refusal, or null. */\n setGrant(via: GrantVia, gesture: boolean, scope: string, value: GrantValue | null): string | null {\n return this.broker.setGrant(via, gesture, scope, value)\n }\n\n /** The Permissions sheet (a genUI surface). */\n permissionsSheet(): SurfaceComponent[] {\n return this.broker.permissionsSheet()\n }\n\n /** One lifecycle event: the next state, with its effects carried out\n * (open → the WindowHost, persist → the Vault, flush → the outbox).\n * Answers the effects (sources and automations are the host's). */\n async event(event: LifecycleEvent): Promise<LifecycleEffect[]> {\n const { state, effects } = lifecycleStep(this.stateNow, event, { pkg: { id: this.appId, screens: this.pkg.screens }, lastScreen: parseLast(this.lastScreen) })\n this.stateNow = state\n this.broker.setForeground(state.phase === `foreground`)\n for (const effect of effects) {\n if (effect.effect === `open`) this.config.window.open(this.appId, effect.screen, effect.params, `replace`)\n else if (effect.effect === `persist`) {\n this.lastScreen = JSON.stringify({ screen: effect.screen, params: effect.params })\n await this.config.vault.write(screenKey(this.appId), this.lastScreen).catch(() => {})\n } else if (effect.effect === `flush`) await this.flush()\n }\n return effects\n }\n\n /** A `records:<kind>?…` source's value (genUI's records query over the\n * store's rows with the outbox laid over them); undefined = not a records source. */\n async recordsValue(source: string): Promise<RecordsValue | null | undefined> {\n const parsed = parseSource(source)\n const query = parsed ? parseRecordsSource(parsed) : null\n if (!query) return undefined\n if (query.app !== null) return null\n let rows: RecordRow[] = await this.config.storage.rows(this.appId)\n if (this.outboxNow.length) rows = outboxRows(rows, this.outboxNow, this.me())\n const records = this.pkg.records\n const def = query.from && isObject(records) ? records[query.from] : undefined\n const viewer = engineViewer(this.config.identity)\n return recordsValue(rows, query, {\n me: viewer.id,\n now: this.now(),\n names: {},\n computed: kindComputed(records, query.from),\n refs: kindRefs(records, query.from),\n transitions: kindTransitions(def),\n role: viewer.role,\n })\n }\n\n /** Called with every change to the app's rows (re-resolve the bound sources). */\n subscribe(on: () => void): () => void {\n return this.config.storage.subscribe(this.appId, () => on())\n }\n\n /** A host function call from the app's UI: `records_upsert` /\n * `records_delete` / `records_batch`, `app_navigate`, or a capability\n * (`<capability>.<tool>`, through the broker). `newIds` = the client ids of\n * its creates, in order. */\n async call(name: string, args: unknown, newIds: readonly string[] = []): Promise<CallResult> {\n const a = isObject(args) ? args : {}\n switch (name) {\n case `records_upsert`:\n return this.write(`upsert`, a, newIds)\n case `records_delete`:\n return this.write(`delete`, a, newIds)\n case `records_batch`:\n return this.write(`batch`, a, newIds)\n case `app_navigate`: {\n const target = navigateTarget(this.pkg, args)\n if (`error` in target) return { refused: { code: `BAD_REQUEST`, message: target.error } }\n this.config.window.open(this.appId, target.screen, target.params, `replace`)\n this.stateNow = { ...this.stateNow, screen: target.screen, params: target.params }\n return { value: null }\n }\n default:\n return brokered(await this.broker.call(`ui`, null, name, args))\n }\n }\n\n /** The kind policy check for a write, as the identity sees it. */\n private async refusal(writes: OutboxWrite[]): Promise<string | null> {\n const rows = await this.config.storage.rows(this.appId).catch(() => [] as RecordRow[])\n const records = isObject(this.pkg.records) ? this.pkg.records : {}\n for (const w of writes) {\n const row = rows.find((r) => r.id === w.id)\n const op: RecordOp = w.op\n const kind = w.op === `delete` ? row?.kind : w.kind\n const policy = recordPolicy(kind ? records[kind] : undefined)\n const refusal = engineRecordRefusal(this.config.identity, policy, op, w.op === `create` ? null : row ? { authorId: row.authorId ?? null, createdBy: row.createdBy } : null)\n if (refusal) return refusal\n }\n return null\n }\n\n private async write(call: OutboxCall, args: Record<string, unknown>, newIds: readonly string[]): Promise<CallResult> {\n const writes = outboxWrites(call, args, newIds)\n const refusal = await this.refusal(writes)\n if (refusal) return { refused: { code: `FORBIDDEN`, message: refusal } }\n const entry: OutboxEntry = { writeId: this.config.newId?.() ?? crypto.randomUUID(), appId: this.appId, call, writes, at: this.now(), state: `pending` }\n const answer = call === `upsert` ? { id: writes[0]?.id } : call === `delete` ? null : { ids: writes.map((w) => w.id) }\n if (this.mode === `direct`) {\n try {\n await this.config.storage.write(this.appId, batchOf(entry), this.me())\n return { value: answer }\n } catch (error) {\n return { refused: failure(`STORE`, error) }\n }\n }\n this.outboxNow = [...this.outboxNow, entry]\n if (this.stateNow.phase === `foreground`) await this.flush()\n return { value: answer }\n }\n\n /** Flush the outbox through the sync provider (FIFO, a retry stops it). */\n async flush(): Promise<void> {\n const sync = this.config.sync\n if (!sync) return\n const results: Record<string, OutboxResult> = {}\n for (const entry of this.outboxNow.filter((e) => e.state === `pending`)) {\n const { call, input } = outboxRequest(entry)\n const result = await sync.push(this.appId, call, input).catch((): OutboxResult => ({ transport: true }))\n results[entry.writeId] = result\n if (outboxOutcome(entry, result) === `retry`) break\n }\n if (!Object.keys(results).length) return\n const now = this.now()\n const after = outboxFlush(this.outboxNow, results, now).after\n // Acked entries keep overlaying until the store reflects them (outboxPrune).\n const rows = await this.config.storage.rows(this.appId).catch(() => [] as RecordRow[])\n this.outboxNow = outboxPrune(after, rows, now)\n }\n}\n\n/** An outbox entry as one store batch. */\nexport function batchOf(entry: OutboxEntry): WriteBatch {\n return {\n writeId: entry.writeId,\n writes: entry.writes.map((w) => (w.op === `delete` ? { op: `delete`, id: w.id } : { op: `upsert`, id: w.id, kind: w.kind, data: w.data, create: w.op === `create` })),\n at: entry.at,\n }\n}\n\n/** How many client ids a call's creates take (the runner generates them). */\nexport function createsOf(name: string, args: unknown): number {\n if (!isObject(args)) return 0\n if (name === `records_upsert`) return typeof args.id === `string` ? 0 : 1\n if (name === `records_batch` && Array.isArray(args.writes)) return args.writes.filter((w) => isObject(w) && w.op !== `delete` && typeof w.id !== `string`).length\n return 0\n}\n"
7
+ ],
8
+ "mappings": "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",
9
+ "debugId": "D9EDE6EA8C5E519264756E2164756E21",
10
+ "names": []
11
+ }
@@ -0,0 +1,11 @@
1
+ import {
2
+ STOPPED2,
3
+ lifecycleStep2
4
+ } from "./chunks/index-m2845dn6.js";
5
+ export {
6
+ STOPPED2 as STOPPED,
7
+ lifecycleStep2 as lifecycleStep
8
+ };
9
+
10
+ //# debugId=955508557E6A53D264756E2164756E21
11
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [
5
+ ],
6
+ "mappings": "",
7
+ "debugId": "955508557E6A53D264756E2164756E21",
8
+ "names": []
9
+ }
package/dist/outbox.js ADDED
@@ -0,0 +1,27 @@
1
+ import {
2
+ outboxWrites2,
3
+ outboxRequest2,
4
+ outboxRows2,
5
+ outboxOutcome2,
6
+ outboxVerb2,
7
+ outboxFlush2,
8
+ outboxReflected2,
9
+ outboxPrune2,
10
+ outboxPendingLabel2,
11
+ outboxMode2
12
+ } from "./chunks/index-4ntgtkmb.js";
13
+ export {
14
+ outboxFlush2 as outboxFlush,
15
+ outboxMode2 as outboxMode,
16
+ outboxOutcome2 as outboxOutcome,
17
+ outboxPendingLabel2 as outboxPendingLabel,
18
+ outboxPrune2 as outboxPrune,
19
+ outboxReflected2 as outboxReflected,
20
+ outboxRequest2 as outboxRequest,
21
+ outboxRows2 as outboxRows,
22
+ outboxVerb2 as outboxVerb,
23
+ outboxWrites2 as outboxWrites
24
+ };
25
+
26
+ //# debugId=8976AFB03DE36DC164756E2164756E21
27
+ //# sourceMappingURL=outbox.js.map
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [
5
+ ],
6
+ "mappings": "",
7
+ "debugId": "8976AFB03DE36DC164756E2164756E21",
8
+ "names": []
9
+ }
package/dist/pdf.js ADDED
@@ -0,0 +1,15 @@
1
+ import {
2
+ wrapLines2,
3
+ pdfNumber2,
4
+ pdfImage2,
5
+ renderPdf2
6
+ } from "./chunks/index-ax4aay30.js";
7
+ export {
8
+ pdfImage2 as pdfImage,
9
+ pdfNumber2 as pdfNumber,
10
+ renderPdf2 as renderPdf,
11
+ wrapLines2 as wrapLines
12
+ };
13
+
14
+ //# debugId=17B1C0D8E0B4B30F64756E2164756E21
15
+ //# sourceMappingURL=pdf.js.map