@lokvis/runtime 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 (61) hide show
  1. package/dist/asset-store.d.ts +72 -0
  2. package/dist/asset-store.d.ts.map +1 -0
  3. package/dist/asset-store.js +167 -0
  4. package/dist/asset-store.js.map +1 -0
  5. package/dist/capability-registry.d.ts +38 -0
  6. package/dist/capability-registry.d.ts.map +1 -0
  7. package/dist/capability-registry.js +100 -0
  8. package/dist/capability-registry.js.map +1 -0
  9. package/dist/event-bus.d.ts +9 -0
  10. package/dist/event-bus.d.ts.map +1 -0
  11. package/dist/event-bus.js +33 -0
  12. package/dist/event-bus.js.map +1 -0
  13. package/dist/executor.d.ts +42 -0
  14. package/dist/executor.d.ts.map +1 -0
  15. package/dist/executor.js +237 -0
  16. package/dist/executor.js.map +1 -0
  17. package/dist/history.d.ts +92 -0
  18. package/dist/history.d.ts.map +1 -0
  19. package/dist/history.js +171 -0
  20. package/dist/history.js.map +1 -0
  21. package/dist/idb-asset-store.d.ts +46 -0
  22. package/dist/idb-asset-store.d.ts.map +1 -0
  23. package/dist/idb-asset-store.js +76 -0
  24. package/dist/idb-asset-store.js.map +1 -0
  25. package/dist/index.d.ts +19 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +19 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/opfs-asset-store.d.ts +38 -0
  30. package/dist/opfs-asset-store.d.ts.map +1 -0
  31. package/dist/opfs-asset-store.js +122 -0
  32. package/dist/opfs-asset-store.js.map +1 -0
  33. package/dist/runtime.d.ts +87 -0
  34. package/dist/runtime.d.ts.map +1 -0
  35. package/dist/runtime.js +475 -0
  36. package/dist/runtime.js.map +1 -0
  37. package/dist/types.d.ts +99 -0
  38. package/dist/types.d.ts.map +1 -0
  39. package/dist/types.js +8 -0
  40. package/dist/types.js.map +1 -0
  41. package/dist/worker-host.d.ts +154 -0
  42. package/dist/worker-host.d.ts.map +1 -0
  43. package/dist/worker-host.js +394 -0
  44. package/dist/worker-host.js.map +1 -0
  45. package/dist/worker-protocol.d.ts +103 -0
  46. package/dist/worker-protocol.d.ts.map +1 -0
  47. package/dist/worker-protocol.js +87 -0
  48. package/dist/worker-protocol.js.map +1 -0
  49. package/package.json +49 -0
  50. package/src/asset-store.ts +222 -0
  51. package/src/capability-registry.ts +135 -0
  52. package/src/event-bus.ts +41 -0
  53. package/src/executor.ts +303 -0
  54. package/src/history.ts +229 -0
  55. package/src/idb-asset-store.ts +121 -0
  56. package/src/index.ts +20 -0
  57. package/src/opfs-asset-store.ts +167 -0
  58. package/src/runtime.ts +564 -0
  59. package/src/types.ts +121 -0
  60. package/src/worker-host.ts +531 -0
  61. package/src/worker-protocol.ts +187 -0
@@ -0,0 +1,475 @@
1
+ /**
2
+ * Lokvis Runtime Implementation
3
+ *
4
+ * Runtime 是整个系统的"浏览器操作系统",唯一职责:Input → Run → Output。
5
+ */
6
+ import { createEventBus } from './event-bus.js';
7
+ import { createAssetStore, createMemoryAssetStore, generateId, } from './asset-store.js';
8
+ import { CapabilityRegistry } from './capability-registry.js';
9
+ import { WorkflowExecutor } from './executor.js';
10
+ import { HistoryStack } from './history.js';
11
+ export const RUNTIME_VERSION = '0.1.0';
12
+ /** 默认历史记录上限 */
13
+ const DEFAULT_MAX_HISTORY = 10;
14
+ /** 存储配额超限时抛出(W2.9) */
15
+ export class QuotaExceededError extends Error {
16
+ usage;
17
+ delta;
18
+ quota;
19
+ constructor(usage, delta, quota) {
20
+ super(`Storage quota exceeded: usage=${usage} + delta=${delta} > quota=${quota}`);
21
+ this.name = 'QuotaExceededError';
22
+ this.usage = usage;
23
+ this.delta = delta;
24
+ this.quota = quota;
25
+ }
26
+ }
27
+ /**
28
+ * 从 AssetSource 估算导入字节数用于配额预检。
29
+ * url/opfs 源大小未知,返回 0 跳过预检 —— 真实大小在 import 完成后
30
+ * 通过 `usage += asset.metadata.size` 补记到账面,后续操作仍受配额约束。
31
+ */
32
+ function estimateSourceSize(source) {
33
+ if (source.kind === 'file')
34
+ return source.file.size;
35
+ if (source.kind === 'blob')
36
+ return source.blob.size;
37
+ return 0;
38
+ }
39
+ /**
40
+ * 用配额校验包裹 AssetStore:import/create 超限抛 QuotaExceededError(W2.9)。
41
+ * 内部维护运行中的已用字节数,remove 时回退。
42
+ *
43
+ * 并发安全:import/create/remove 通过 promise 链串行化,避免 check 与 update
44
+ * 之间的 TOCTOU 窗口导致两个并发操作都基于旧 usage 通过校验或回退。
45
+ */
46
+ function wrapAssetStoreWithQuota(inner, quota) {
47
+ let usage = 0;
48
+ let initialized = false;
49
+ /** 串行化 import/create/remove 的 chain tail,确保 check-update 原子性 */
50
+ let chain = Promise.resolve();
51
+ async function ensureInit() {
52
+ if (initialized)
53
+ return;
54
+ const all = await inner.list();
55
+ usage = all.reduce((sum, a) => sum + a.metadata.size, 0);
56
+ initialized = true;
57
+ }
58
+ function assertQuota(delta) {
59
+ if (usage + delta > quota) {
60
+ throw new QuotaExceededError(usage, delta, quota);
61
+ }
62
+ }
63
+ /** 将 import/create/remove 串行化:依次 await init → assert → inner op → update usage */
64
+ function runExclusive(op) {
65
+ const run = chain.then(op, op);
66
+ // chain 仅用于排队,不传播 rejection(避免一次失败阻塞后续)
67
+ chain = run.then(() => undefined, () => undefined);
68
+ return run;
69
+ }
70
+ return {
71
+ async import(source) {
72
+ return runExclusive(async () => {
73
+ await ensureInit();
74
+ assertQuota(estimateSourceSize(source));
75
+ const asset = await inner.import(source);
76
+ usage += asset.metadata.size;
77
+ return asset;
78
+ });
79
+ },
80
+ async get(id) {
81
+ return inner.get(id);
82
+ },
83
+ async getBlob(handle) {
84
+ return inner.getBlob(handle);
85
+ },
86
+ async remove(id) {
87
+ return runExclusive(async () => {
88
+ const existing = await inner.get(id);
89
+ await inner.remove(id);
90
+ if (existing) {
91
+ usage = Math.max(0, usage - existing.metadata.size);
92
+ }
93
+ });
94
+ },
95
+ async list() {
96
+ return inner.list();
97
+ },
98
+ async create(blob, metadata, type) {
99
+ return runExclusive(async () => {
100
+ await ensureInit();
101
+ assertQuota(blob.size);
102
+ const asset = await inner.create(blob, metadata, type);
103
+ usage += asset.metadata.size;
104
+ return asset;
105
+ });
106
+ },
107
+ };
108
+ }
109
+ /** Runtime 实现类 */
110
+ export class LokvisRuntimeImpl {
111
+ version = RUNTIME_VERSION;
112
+ eventBus;
113
+ config;
114
+ _status = 'idle';
115
+ assetStore;
116
+ capabilityRegistry;
117
+ executor;
118
+ /**
119
+ * 每个工作流独立的 HistoryStack。
120
+ * 注意:历史栈仅在内存中,刷新页面后丢失(资产可能仍存于 OPFS/IDB,
121
+ * 但因元数据/索引未持久化而无法恢复)—— 跨会话恢复属 W3 范畴。
122
+ */
123
+ historyStacks = new Map();
124
+ /** 记录每个工作流的初始输入 AssetId(undo 回到初始时使用) */
125
+ initialInputsMap = new Map();
126
+ /** 记录每个工作流当前的输出 AssetId(undo/redo 后切换"当前") */
127
+ currentOutputsMap = new Map();
128
+ constructor(config = {}) {
129
+ this.config = {
130
+ enableOpfs: config.enableOpfs ?? true,
131
+ enableIndexedDB: config.enableIndexedDB ?? true,
132
+ storageQuota: config.storageQuota ?? 1024 * 1024 * 1024, // 1GB
133
+ enableLog: config.enableLog ?? true,
134
+ engineStrategy: config.engineStrategy ?? 'first',
135
+ };
136
+ this.eventBus = createEventBus();
137
+ // 注入或降级到内存 store;随后用配额校验包裹(W2.9)
138
+ const rawStore = config.assetStore ?? createMemoryAssetStore();
139
+ this.assetStore = wrapAssetStoreWithQuota(rawStore, this.config.storageQuota);
140
+ this.capabilityRegistry = new CapabilityRegistry(this.config.engineStrategy);
141
+ this.executor = new WorkflowExecutor({
142
+ assetStore: this.assetStore,
143
+ capabilityRegistry: this.capabilityRegistry,
144
+ eventBus: this.eventBus,
145
+ enableLog: this.config.enableLog,
146
+ });
147
+ // 监听 node:finished 事件,自动 append 到 HistoryStack
148
+ this.eventBus.on('node:finished', (event) => {
149
+ this.recordHistoryFromNodeEvent(event);
150
+ });
151
+ }
152
+ get status() {
153
+ return this._status;
154
+ }
155
+ // ─── 工作流执行 ──────────────────────────────────────
156
+ async run(workflow, inputs) {
157
+ this._status = 'running';
158
+ // 重新执行同一工作流时,丢弃上一次的历史(含失败后重跑的残留条目),
159
+ // 并通过 onEvict 回收其 outputs 资产,避免 OPFS/IDB 泄漏。
160
+ // 初始输入 Asset 不在历史栈中,不受影响。
161
+ const existingStack = this.historyStacks.get(workflow.id);
162
+ if (existingStack) {
163
+ existingStack.reset();
164
+ }
165
+ // 记录初始输入 AssetId(用于 undo 回到初始状态)
166
+ const inputIds = await this.collectInputAssetIds(inputs);
167
+ this.initialInputsMap.set(workflow.id, inputIds);
168
+ // 初始当前输出 = 初始输入
169
+ this.currentOutputsMap.set(workflow.id, inputIds);
170
+ try {
171
+ const result = await this.executor.execute(workflow, inputs);
172
+ this._status = result.status === 'failed' ? 'error' : 'idle';
173
+ // 成功完成后,记录最终输出为当前
174
+ if (result.status === 'completed' && result.outputs.length > 0) {
175
+ this.currentOutputsMap.set(workflow.id, result.outputs);
176
+ }
177
+ return result;
178
+ }
179
+ catch (error) {
180
+ this._status = 'error';
181
+ throw error;
182
+ }
183
+ }
184
+ async cancel(workflowId) {
185
+ return this.executor.cancel(workflowId);
186
+ }
187
+ async pause(workflowId) {
188
+ return this.executor.pause(workflowId);
189
+ }
190
+ async resume(workflowId) {
191
+ return this.executor.resume(workflowId);
192
+ }
193
+ // ─── 历史与撤销 ──────────────────────────────────────
194
+ async history(workflowId) {
195
+ // 避免对从未运行过的工作流创建空栈:先查 Map,无则直接返回空数组
196
+ return this.historyStacks.get(workflowId)?.list() ?? [];
197
+ }
198
+ async undo(workflowId) {
199
+ const stack = this.getOrCreateHistoryStack(workflowId);
200
+ const result = stack.undo();
201
+ if (result === undefined)
202
+ return; // 无可 undo
203
+ // 更新当前输出:
204
+ // - null 表示回到初始状态,使用 initialInputs
205
+ // - entry 表示回退到该条目的 outputs
206
+ const newCurrent = result === null
207
+ ? (this.initialInputsMap.get(workflowId) ?? [])
208
+ : result.outputs;
209
+ this.currentOutputsMap.set(workflowId, newCurrent);
210
+ // history:changed 事件由 stack 的 onChanged 回调统一发射,避免双发
211
+ }
212
+ async redo(workflowId) {
213
+ const stack = this.getOrCreateHistoryStack(workflowId);
214
+ const entry = stack.redo();
215
+ if (entry === undefined)
216
+ return; // 无可 redo
217
+ this.currentOutputsMap.set(workflowId, entry.outputs);
218
+ // history:changed 事件由 stack 的 onChanged 回调统一发射,避免双发
219
+ }
220
+ // ─── Asset 管理 ──────────────────────────────────────
221
+ async importAsset(source) {
222
+ const asset = await this.assetStore.import(source);
223
+ this.eventBus.emit({
224
+ type: 'asset:imported',
225
+ assetId: asset.id,
226
+ metadata: asset.metadata,
227
+ });
228
+ return asset.id;
229
+ }
230
+ async getAsset(id) {
231
+ const asset = await this.assetStore.get(id);
232
+ if (!asset)
233
+ throw new Error(`Asset not found: ${id}`);
234
+ return asset;
235
+ }
236
+ async exportAsset(id, format) {
237
+ const asset = await this.getAsset(id);
238
+ const blob = await this.assetStore.getBlob(asset.blob);
239
+ this.eventBus.emit({
240
+ type: 'export:completed',
241
+ assetId: id,
242
+ format: format ?? asset.metadata.format,
243
+ size: blob.size,
244
+ });
245
+ return blob;
246
+ }
247
+ async removeAsset(id) {
248
+ await this.assetStore.remove(id);
249
+ this.eventBus.emit({ type: 'asset:removed', assetId: id });
250
+ }
251
+ async listAssets() {
252
+ return this.assetStore.list();
253
+ }
254
+ // ─── 能力查询 ────────────────────────────────────────
255
+ async capabilities() {
256
+ return this.capabilityRegistry.list();
257
+ }
258
+ async hasCapability(name) {
259
+ return this.capabilityRegistry.has(name);
260
+ }
261
+ // ─── MCP 暴露(见 docs/AI生态冲击调整方案.md §6) ─────
262
+ /**
263
+ * 生成 MCP server manifest(不启动 server,仅描述当前可被 MCP 暴露的能力)。
264
+ * - `mcpExposure='private'`:任何模式都不暴露
265
+ * - `mcpExposure='batch-only'`:仅在 `options.batchMode=true` 时暴露
266
+ * (避免单文件误用)
267
+ * - 其余(默认 'public'):总是暴露
268
+ * - tool 名取 capability.mcpToolName 或 `lokvis_${name.replace(/\./g, '_')}`
269
+ * - resource 固定为 capabilities 与 workflows 两个清单
270
+ */
271
+ toMcpManifest(options = {}) {
272
+ const { batchMode = false } = options;
273
+ const tools = [];
274
+ const capabilities = this.capabilityRegistry.list();
275
+ for (const cap of capabilities) {
276
+ // private 任何模式都不暴露
277
+ if (cap.mcpExposure === 'private')
278
+ continue;
279
+ // batch-only 仅在 batch 模式暴露(避免单文件误用)
280
+ if (cap.mcpExposure === 'batch-only' && !batchMode)
281
+ continue;
282
+ const toolName = cap.mcpToolName ?? `lokvis_${cap.name.replace(/\./g, '_')}`;
283
+ tools.push({
284
+ name: toolName,
285
+ description: cap.description,
286
+ inputSchema: capabilityParamsToJsonSchema(cap.params),
287
+ capabilities: [cap.name],
288
+ });
289
+ }
290
+ return {
291
+ serverName: 'lokvis',
292
+ version: RUNTIME_VERSION,
293
+ tools,
294
+ resources: [
295
+ {
296
+ uri: 'lokvis://capabilities',
297
+ name: 'Capabilities',
298
+ description: 'List all available Lokvis capabilities',
299
+ mimeType: 'application/json',
300
+ },
301
+ {
302
+ uri: 'lokvis://workflows',
303
+ name: 'Workflows',
304
+ description: 'List saved workflows',
305
+ mimeType: 'application/json',
306
+ },
307
+ ],
308
+ };
309
+ }
310
+ // ─── 内部 API(供 Plugin SDK 使用) ──────────────────
311
+ /** 获取 AssetStore(内部用) */
312
+ _getAssetStore() {
313
+ return this.assetStore;
314
+ }
315
+ /** 获取 CapabilityRegistry(内部用) */
316
+ _getCapabilityRegistry() {
317
+ return this.capabilityRegistry;
318
+ }
319
+ /** 获取工作流当前输出 AssetId(undo/redo 后的"当前"状态,内部用) */
320
+ _getCurrentOutputs(workflowId) {
321
+ return this.currentOutputsMap.get(workflowId) ?? [];
322
+ }
323
+ // ─── 私有:历史栈管理 ──────────────────────────────
324
+ /** 获取或创建工作流对应的 HistoryStack */
325
+ getOrCreateHistoryStack(workflowId) {
326
+ let stack = this.historyStacks.get(workflowId);
327
+ if (!stack) {
328
+ const stackConfig = {
329
+ maxEntries: DEFAULT_MAX_HISTORY,
330
+ onEvict: (entry) => {
331
+ // 淘汰条目时清理其 outputs 资产(避免 OPFS 泄漏)
332
+ // 注意:此时条目已从栈中移除,且 undo 不会再回到它
333
+ for (const assetId of entry.outputs) {
334
+ // 静默移除,忽略不存在的情况
335
+ this.assetStore.remove(assetId).catch(() => { });
336
+ }
337
+ },
338
+ onChanged: (wfId, entries) => {
339
+ this.eventBus.emit({
340
+ type: 'history:changed',
341
+ workflowId: wfId,
342
+ entries,
343
+ });
344
+ },
345
+ };
346
+ stack = new HistoryStack(workflowId, stackConfig);
347
+ this.historyStacks.set(workflowId, stack);
348
+ }
349
+ return stack;
350
+ }
351
+ /** 将输入归一化为 AssetId[](run() 入参可为 AssetId[] 或 Asset[]) */
352
+ async collectInputAssetIds(inputs) {
353
+ if (inputs.length === 0)
354
+ return [];
355
+ if (typeof inputs[0] === 'string') {
356
+ return inputs;
357
+ }
358
+ return inputs.map((a) => a.id);
359
+ }
360
+ /** 监听 node:finished 事件,自动 append 到对应工作流的 HistoryStack */
361
+ recordHistoryFromNodeEvent(event) {
362
+ if (!event.outputs || event.outputs.length === 0)
363
+ return;
364
+ const stack = this.getOrCreateHistoryStack(event.workflowId);
365
+ const outputs = event.outputs.map((a) => a.id);
366
+ const now = Date.now();
367
+ // node 的 inputs = 上一步的 outputs(或初始输入)
368
+ const inputs = this.currentOutputsMap.get(event.workflowId) ?? [];
369
+ const entry = {
370
+ id: generateId(),
371
+ workflowId: event.workflowId,
372
+ nodeId: event.nodeId,
373
+ capability: event.capability,
374
+ params: event.params,
375
+ inputs,
376
+ outputs,
377
+ timestamp: now,
378
+ };
379
+ stack.append(entry);
380
+ // 更新当前输出为该 node 的 outputs
381
+ this.currentOutputsMap.set(event.workflowId, outputs);
382
+ }
383
+ }
384
+ /**
385
+ * 创建 Runtime 实例(W2.8 + W2.9)。
386
+ *
387
+ * 默认通过 createAssetStore 工厂按 OPFS → IndexedDB → Memory 降级创建 AssetStore,
388
+ * 并用配额校验包裹。也可通过 config.assetStore 注入自定义 store。
389
+ *
390
+ * 注:此函数为 async(工厂需异步探测环境)。SDK 的 createLokvis 已是 async。
391
+ */
392
+ export async function createRuntime(config) {
393
+ const assetStore = config?.assetStore ??
394
+ (await createAssetStore({ preferOpfs: config?.enableOpfs ?? true }));
395
+ return new LokvisRuntimeImpl({ ...config, assetStore });
396
+ }
397
+ /**
398
+ * 把 Capability.params(CapabilityParam[])转换为 JSON Schema 对象,
399
+ * 供 MCP tool manifest 的 inputSchema 字段使用。
400
+ *
401
+ * 手写转换而非用 zod-to-json-schema:Capability.params 是数组形式
402
+ * (非 ZodSchema),直接映射即可,无需引入额外依赖。
403
+ * (见 docs/AI生态冲击调整方案.md §6.3 的依赖决策)
404
+ */
405
+ function capabilityParamsToJsonSchema(params) {
406
+ const properties = {};
407
+ const required = [];
408
+ for (const p of params) {
409
+ const prop = capabilityParamToJsonSchemaProperty(p);
410
+ properties[p.name] = prop;
411
+ if (p.required)
412
+ required.push(p.name);
413
+ }
414
+ return {
415
+ type: 'object',
416
+ properties,
417
+ ...(required.length > 0 ? { required } : {}),
418
+ };
419
+ }
420
+ /**
421
+ * 把 CapabilityParamType 映射为合法的 JSON Schema 类型片段。
422
+ *
423
+ * CapabilityParamType 含 `color` / `file` / `enum` 等 Lokvis 专属类型,
424
+ * 它们都不是合法 JSON Schema 类型,必须映射到标准类型:
425
+ * - `color` → `{ type: 'string', format: 'color' }`
426
+ * - `file` → `{ type: 'string' }`(描述里说明是文件路径)
427
+ * - `enum` → `{ type: 'string' }`(枚举值由外层追加 `enum` 字段)
428
+ * - `object`/`array`/`number`/`string`/`boolean` → 同名 JSON Schema 类型
429
+ */
430
+ function capabilityParamTypeToJsonType(type) {
431
+ switch (type) {
432
+ case 'color':
433
+ return { type: 'string', format: 'color' };
434
+ case 'file':
435
+ case 'enum':
436
+ return { type: 'string' };
437
+ case 'number':
438
+ case 'string':
439
+ case 'boolean':
440
+ case 'object':
441
+ case 'array':
442
+ return { type };
443
+ default:
444
+ // 未知类型降级为 string,避免生成非法 JSON Schema
445
+ return { type: 'string' };
446
+ }
447
+ }
448
+ /** 单个 CapabilityParam → JSON Schema property */
449
+ function capabilityParamToJsonSchemaProperty(p) {
450
+ const { type: jsonType, format } = capabilityParamTypeToJsonType(p.type);
451
+ const prop = { type: jsonType };
452
+ if (format)
453
+ prop.format = format;
454
+ if (p.description)
455
+ prop.description = p.description;
456
+ if (p.default !== undefined)
457
+ prop.default = p.default;
458
+ // minimum/maximum 仅对 number 合法;string 应使用 minLength/maxLength
459
+ // (CapabilityParam 仅定义了数值语义的 min/max,故只对 number 类型应用)
460
+ if (p.type === 'number') {
461
+ if (typeof p.min === 'number')
462
+ prop.minimum = p.min;
463
+ if (typeof p.max === 'number')
464
+ prop.maximum = p.max;
465
+ }
466
+ if (p.type === 'enum' && p.values) {
467
+ prop.enum = p.values;
468
+ }
469
+ if (p.type === 'array' && p.items) {
470
+ // 递归映射 items 类型,避免 items 为 color/file/enum 时仍是非法类型
471
+ prop.items = capabilityParamTypeToJsonType(p.items);
472
+ }
473
+ return prop;
474
+ }
475
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAsBH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,UAAU,GAEX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,YAAY,EAA2B,MAAM,cAAc,CAAC;AAErE,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC;AAEvC,eAAe;AACf,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B,sBAAsB;AACtB,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,KAAK,CAAS;IACd,KAAK,CAAS;IACd,KAAK,CAAS;IACvB,YAAY,KAAa,EAAE,KAAa,EAAE,KAAa;QACrD,KAAK,CACH,iCAAiC,KAAK,YAAY,KAAK,YAAY,KAAK,EAAE,CAC3E,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,MAAmB;IAC7C,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;IACpD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;GAMG;AACH,SAAS,uBAAuB,CAAC,KAAiB,EAAE,KAAa;IAC/D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,gEAAgE;IAChE,IAAI,KAAK,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;IAEhD,KAAK,UAAU,UAAU;QACvB,IAAI,WAAW;YAAE,OAAO;QACxB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QAC/B,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACzD,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,SAAS,WAAW,CAAC,KAAa;QAChC,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,EAAE,CAAC;YAC1B,MAAM,IAAI,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,kFAAkF;IAClF,SAAS,YAAY,CAAI,EAAoB;QAC3C,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/B,wCAAwC;QACxC,KAAK,GAAG,GAAG,CAAC,IAAI,CACd,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;QACF,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,MAAM;YACjB,OAAO,YAAY,CAAC,KAAK,IAAI,EAAE;gBAC7B,MAAM,UAAU,EAAE,CAAC;gBACnB,WAAW,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;gBACxC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBACzC,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAC7B,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,EAAE;YACV,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,MAAM;YAClB,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,EAAE;YACb,OAAO,YAAY,CAAC,KAAK,IAAI,EAAE;gBAC7B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACrC,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACvB,IAAI,QAAQ,EAAE,CAAC;oBACb,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,IAAI;YACR,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI;YAC/B,OAAO,YAAY,CAAC,KAAK,IAAI,EAAE;gBAC7B,MAAM,UAAU,EAAE,CAAC;gBACnB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACvB,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;gBACvD,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAC7B,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,kBAAkB;AAClB,MAAM,OAAO,iBAAiB;IACnB,OAAO,GAAG,eAAe,CAAC;IAC1B,QAAQ,CAAW;IAEpB,MAAM,CAA8C;IACpD,OAAO,GAAkB,MAAM,CAAC;IAChC,UAAU,CAAa;IACvB,kBAAkB,CAAqB;IACvC,QAAQ,CAAmB;IACnC;;;;OAIG;IACK,aAAa,GAAG,IAAI,GAAG,EAAwB,CAAC;IACxD,yCAAyC;IACjC,gBAAgB,GAAG,IAAI,GAAG,EAAqB,CAAC;IACxD,8CAA8C;IACtC,iBAAiB,GAAG,IAAI,GAAG,EAAqB,CAAC;IAEzD,YAAY,SAAwB,EAAE;QACpC,IAAI,CAAC,MAAM,GAAG;YACZ,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI;YACrC,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,IAAI;YAC/C,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE,MAAM;YAC/D,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI;YACnC,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,OAAO;SACjD,CAAC;QAEF,IAAI,CAAC,QAAQ,GAAG,cAAc,EAAE,CAAC;QAEjC,iCAAiC;QACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,IAAI,sBAAsB,EAAE,CAAC;QAC/D,IAAI,CAAC,UAAU,GAAG,uBAAuB,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAE9E,IAAI,CAAC,kBAAkB,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAE7E,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC;YACnC,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;SACjC,CAAC,CAAC;QAEH,+CAA+C;QAC/C,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1C,IAAI,CAAC,0BAA0B,CAAC,KAAwD,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,mDAAmD;IAEnD,KAAK,CAAC,GAAG,CACP,QAAkB,EAClB,MAA2B;QAE3B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QAEzB,oCAAoC;QACpC,6CAA6C;QAC7C,0BAA0B;QAC1B,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC1D,IAAI,aAAa,EAAE,CAAC;YAClB,aAAa,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QAED,iCAAiC;QACjC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QACjD,gBAAgB;QAChB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAElD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC7D,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;YAC7D,kBAAkB;YAClB,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/D,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YAC1D,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;YACvB,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,UAAkB;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,UAAkB;QAC5B,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,UAAkB;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IAED,mDAAmD;IAEnD,KAAK,CAAC,OAAO,CAAC,UAAkB;QAC9B,oCAAoC;QACpC,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,UAAkB;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,CAAC,UAAU;QAE5C,UAAU;QACV,qCAAqC;QACrC,8BAA8B;QAC9B,MAAM,UAAU,GAAG,MAAM,KAAK,IAAI;YAChC,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YAC/C,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QACnB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACnD,oDAAoD;IACtD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,UAAkB;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,CAAC,UAAU;QAE3C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACtD,oDAAoD;IACtD,CAAC;IAED,sDAAsD;IAEtD,KAAK,CAAC,WAAW,CAAC,MAAmB;QACnC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC,CAAC;QACH,OAAO,KAAK,CAAC,EAAE,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAW;QACxB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAW,EAAE,MAAe;QAC5C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,EAAE;YACX,MAAM,EAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM;YACvC,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAW;QAC3B,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAChC,CAAC;IAED,oDAAoD;IAEpD,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,IAAY;QAC9B,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,4CAA4C;IAE5C;;;;;;;;OAQG;IACH,aAAa,CAAC,UAAgC,EAAE;QAC9C,MAAM,EAAE,SAAS,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;QACtC,MAAM,KAAK,GAAsB,EAAE,CAAC;QACpC,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;QAEpD,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,mBAAmB;YACnB,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS;gBAAE,SAAS;YAC5C,oCAAoC;YACpC,IAAI,GAAG,CAAC,WAAW,KAAK,YAAY,IAAI,CAAC,SAAS;gBAAE,SAAS;YAC7D,MAAM,QAAQ,GACZ,GAAG,CAAC,WAAW,IAAI,UAAU,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,WAAW,EAAE,4BAA4B,CAAC,GAAG,CAAC,MAAM,CAAC;gBACrD,YAAY,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;aACzB,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,UAAU,EAAE,QAAQ;YACpB,OAAO,EAAE,eAAe;YACxB,KAAK;YACL,SAAS,EAAE;gBACT;oBACE,GAAG,EAAE,uBAAuB;oBAC5B,IAAI,EAAE,cAAc;oBACpB,WAAW,EAAE,wCAAwC;oBACrD,QAAQ,EAAE,kBAAkB;iBAC7B;gBACD;oBACE,GAAG,EAAE,oBAAoB;oBACzB,IAAI,EAAE,WAAW;oBACjB,WAAW,EAAE,sBAAsB;oBACnC,QAAQ,EAAE,kBAAkB;iBAC7B;aACF;SACF,CAAC;IACJ,CAAC;IAED,iDAAiD;IAEjD,yBAAyB;IACzB,cAAc;QACZ,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,iCAAiC;IACjC,sBAAsB;QACpB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED,gDAAgD;IAChD,kBAAkB,CAAC,UAAkB;QACnC,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IACtD,CAAC;IAED,8CAA8C;IAE9C,+BAA+B;IACvB,uBAAuB,CAAC,UAAkB;QAChD,IAAI,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,WAAW,GAAgC;gBAC/C,UAAU,EAAE,mBAAmB;gBAC/B,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBACjB,kCAAkC;oBAClC,8BAA8B;oBAC9B,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;wBACpC,gBAAgB;wBAChB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;oBAClD,CAAC;gBACH,CAAC;gBACD,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;oBAC3B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;wBACjB,IAAI,EAAE,iBAAiB;wBACvB,UAAU,EAAE,IAAI;wBAChB,OAAO;qBACR,CAAC,CAAC;gBACL,CAAC;aACF,CAAC;YACF,KAAK,GAAG,IAAI,YAAY,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;YAClD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,wDAAwD;IAChD,KAAK,CAAC,oBAAoB,CAChC,MAA2B;QAE3B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACnC,IAAI,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,MAAmB,CAAC;QAC7B,CAAC;QACD,OAAQ,MAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,yDAAyD;IACjD,0BAA0B,CAChC,KAAsD;QAEtD,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEzD,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,sCAAsC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAElE,MAAM,KAAK,GAAiB;YAC1B,EAAE,EAAE,UAAU,EAAE;YAChB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM;YACN,OAAO;YACP,SAAS,EAAE,GAAG;SACf,CAAC;QAEF,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpB,0BAA0B;QAC1B,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAsB;IAEtB,MAAM,UAAU,GACd,MAAM,EAAE,UAAU;QAClB,CAAC,MAAM,gBAAgB,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;IACvE,OAAO,IAAI,iBAAiB,CAAC,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,4BAA4B,CAAC,MAAyB;IAC7D,MAAM,UAAU,GAA4B,EAAE,CAAC;IAC/C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,mCAAmC,CAAC,CAAC,CAAC,CAAC;QACpD,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,CAAC,QAAQ;YAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,UAAU;QACV,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7C,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,6BAA6B,CACpC,IAAyB;IAEzB,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO;YACV,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAC7C,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM;YACT,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC5B,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS,CAAC;QACf,KAAK,QAAQ,CAAC;QACd,KAAK,OAAO;YACV,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB;YACE,oCAAoC;YACpC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,gDAAgD;AAChD,SAAS,mCAAmC,CAAC,CAAkB;IAC7D,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzE,MAAM,IAAI,GAA4B,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACzD,IAAI,MAAM;QAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACjC,IAAI,CAAC,CAAC,WAAW;QAAE,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC;IACpD,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS;QAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;IACtD,8DAA8D;IAC9D,sDAAsD;IACtD,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACxB,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ;YAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC;QACpD,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ;YAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC;IACtD,CAAC;IACD,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC;IACvB,CAAC;IACD,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QAClC,mDAAmD;QACnD,IAAI,CAAC,KAAK,GAAG,6BAA6B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Lokvis Runtime API
3
+ *
4
+ * Runtime 是整个系统的"浏览器操作系统",唯一职责:Input → Run → Output。
5
+ * 第一版必须克制,只暴露最小 API。
6
+ */
7
+ import type { Asset, AssetId, AssetSource, Capability, EngineSelectionStrategy, HistoryEntry, McpManifest } from '@lokvis/schema';
8
+ import type { Workflow, WorkflowResult } from '@lokvis/schema';
9
+ import type { EventBus } from '@lokvis/schema';
10
+ import type { AssetStore } from './asset-store.js';
11
+ /** Runtime 配置 */
12
+ export interface RuntimeConfig {
13
+ /** 是否启用 OPFS(默认 true,降级时关闭) */
14
+ enableOpfs?: boolean;
15
+ /** 是否启用 IndexedDB 元数据存储 */
16
+ enableIndexedDB?: boolean;
17
+ /** 存储配额(字节) */
18
+ storageQuota?: number;
19
+ /** 是否启用日志 */
20
+ enableLog?: boolean;
21
+ /**
22
+ * 引擎选择策略(默认 'first')。
23
+ * 当多个引擎实现同一能力且未显式指定 preferredEngine 时,据此选择:
24
+ * 'first'(注册顺序)/'fastest'(性能最优)/'balanced'(匹配能力声明性能,无则最快)。
25
+ */
26
+ engineStrategy?: EngineSelectionStrategy;
27
+ /**
28
+ * 注入自定义 AssetStore(测试或精细控制用)。
29
+ * 默认由 createRuntime 通过 createAssetStore 工厂自动创建,
30
+ * 按 OPFS → IndexedDB → Memory 降级。
31
+ */
32
+ assetStore?: AssetStore;
33
+ }
34
+ /** Runtime 状态 */
35
+ export type RuntimeStatus = 'idle' | 'running' | 'paused' | 'error';
36
+ /**
37
+ * `toMcpManifest()` 选项。
38
+ *
39
+ * - `batchMode`:是否为 batch 模式。`mcpExposure='batch-only'` 的能力
40
+ * 仅在 `batchMode=true` 时暴露(避免单文件误用,见方案 §7.1)。默认 false。
41
+ */
42
+ export interface ToMcpManifestOptions {
43
+ batchMode?: boolean;
44
+ }
45
+ /** 核心 Runtime API(第一版,必须克制) */
46
+ export interface LokvisRuntime {
47
+ /** Runtime 版本 */
48
+ readonly version: string;
49
+ /** 当前状态 */
50
+ readonly status: RuntimeStatus;
51
+ /** 事件总线 */
52
+ readonly eventBus: EventBus;
53
+ /** 运行工作流 */
54
+ run(workflow: Workflow, inputs: AssetId[] | Asset[]): Promise<WorkflowResult>;
55
+ /** 取消运行 */
56
+ cancel(workflowId: string): Promise<void>;
57
+ /** 暂停运行 */
58
+ pause(workflowId: string): Promise<void>;
59
+ /** 恢复运行 */
60
+ resume(workflowId: string): Promise<void>;
61
+ /** 获取工作流的执行历史 */
62
+ history(workflowId: string): Promise<HistoryEntry[]>;
63
+ /** 撤销一步 */
64
+ undo(workflowId: string): Promise<void>;
65
+ /** 重做一步 */
66
+ redo(workflowId: string): Promise<void>;
67
+ /** 导入资产 */
68
+ importAsset(source: AssetSource): Promise<AssetId>;
69
+ /** 获取资产 */
70
+ getAsset(id: AssetId): Promise<Asset>;
71
+ /** 导出资产为 Blob */
72
+ exportAsset(id: AssetId, format?: string): Promise<Blob>;
73
+ /** 删除资产 */
74
+ removeAsset(id: AssetId): Promise<void>;
75
+ /** 列出所有资产 */
76
+ listAssets(): Promise<Asset[]>;
77
+ /** 列出所有已注册能力 */
78
+ capabilities(): Promise<Capability[]>;
79
+ /** 检查能力是否可用 */
80
+ hasCapability(name: string): Promise<boolean>;
81
+ /**
82
+ * 生成 MCP server manifest(不启动 server,仅描述当前可被 MCP 暴露的能力)。
83
+ * 用于:
84
+ * 1. @lokvis/mcp-server 注册 tools 前的能力探测
85
+ * 2. Dashboard 展示"可被 AI 调用的能力"
86
+ * 3. 文档站自动生成 MCP tools 列表
87
+ *
88
+ * `options.batchMode` 控制是否暴露 `mcpExposure='batch-only'` 的能力:
89
+ * - 默认 false(单文件模式):不暴露 batch-only 能力
90
+ * - true(batch 模式):暴露 batch-only 能力
91
+ * `mcpExposure='private'` 的能力在任何模式下都不暴露。
92
+ *
93
+ * 注:本方法同步返回 —— manifest 是对 `capabilityRegistry.list()`
94
+ * (同步)的纯计算,无 I/O,故无需 async。`capabilities()` 仍为 async
95
+ * 仅为接口对称性(未来可能涉及异步加载)。
96
+ */
97
+ toMcpManifest(options?: ToMcpManifestOptions): McpManifest;
98
+ }
99
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Lokvis Runtime API
3
+ *
4
+ * Runtime 是整个系统的"浏览器操作系统",唯一职责:Input → Run → Output。
5
+ * 第一版必须克制,只暴露最小 API。
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}