@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,19 @@
1
+ /**
2
+ * @lokvis/runtime
3
+ *
4
+ * Lokvis Runtime - Browser-local workflow execution engine.
5
+ * 所有核心工作流在浏览器执行,Cloudflare 只承担边缘服务。
6
+ */
7
+ export * from './types.js';
8
+ export * from './event-bus.js';
9
+ export * from './asset-store.js';
10
+ export * from './opfs-asset-store.js';
11
+ export * from './idb-asset-store.js';
12
+ export * from './capability-registry.js';
13
+ export * from './executor.js';
14
+ export * from './worker-protocol.js';
15
+ export * from './worker-host.js';
16
+ export * from './history.js';
17
+ export * from './runtime.js';
18
+ export { RUNTIME_VERSION } from './runtime.js';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAE7B,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @lokvis/runtime
3
+ *
4
+ * Lokvis Runtime - Browser-local workflow execution engine.
5
+ * 所有核心工作流在浏览器执行,Cloudflare 只承担边缘服务。
6
+ */
7
+ export * from './types.js';
8
+ export * from './event-bus.js';
9
+ export * from './asset-store.js';
10
+ export * from './opfs-asset-store.js';
11
+ export * from './idb-asset-store.js';
12
+ export * from './capability-registry.js';
13
+ export * from './executor.js';
14
+ export * from './worker-protocol.js';
15
+ export * from './worker-host.js';
16
+ export * from './history.js';
17
+ export * from './runtime.js';
18
+ export { RUNTIME_VERSION } from './runtime.js';
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAE7B,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * OPFS Asset Store
3
+ *
4
+ * 大文件(blob)存 OPFS(Origin Private File System),元数据存内存 Map。
5
+ * OPFS 是浏览器私有文件系统,blob 持久化(刷新后文件仍在),但元数据仅在内存 ——
6
+ * 刷新后 list() 会返回空、get(id) 返回 undefined(除非元数据由上层持久化)。
7
+ * 完整元数据持久化建议叠加 IdbAssetStore 或在 W3 补强。
8
+ *
9
+ * 注:任务规格提及 FileSystemSyncAccessHandle(Worker 内同步句柄),
10
+ * 但 AssetStore 接口本身为 async,主线程仅可使用 FileSystemFileHandle 异步 API,
11
+ * 因此本实现采用异步文件句柄,语义等价且兼容主线程与 Worker。
12
+ *
13
+ * 降级链(W2.8 工厂):OPFS → IndexedDB → Memory
14
+ */
15
+ import type { AssetStore } from './asset-store.js';
16
+ /** OPFS 不可用或初始化失败时抛出 */
17
+ export declare class OpfsUnavailableError extends Error {
18
+ constructor(message: string);
19
+ }
20
+ /** OPFS 文件存储路径前缀(出现在 BlobHandle.path 中) */
21
+ export declare const OPFS_PATH_PREFIX = "opfs";
22
+ /** OPFS AssetStore 配置 */
23
+ export interface OpfsAssetStoreOptions {
24
+ /** OPFS 根目录下的命名空间目录名(默认 'lokvis') */
25
+ rootDirName?: string;
26
+ /** 资产子目录名(默认 'assets') */
27
+ assetsDirName?: string;
28
+ /**
29
+ * 测试注入:自定义 OPFS 根目录句柄。
30
+ * 默认使用 navigator.storage.getDirectory()。
31
+ */
32
+ rootHandle?: FileSystemDirectoryHandle;
33
+ }
34
+ /** 检测当前环境是否支持 OPFS */
35
+ export declare function isOpfsSupported(): boolean;
36
+ /** 创建 OPFS 版 AssetStore */
37
+ export declare function createOpfsAssetStore(options?: OpfsAssetStoreOptions): Promise<AssetStore>;
38
+ //# sourceMappingURL=opfs-asset-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opfs-asset-store.d.ts","sourceRoot":"","sources":["../src/opfs-asset-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAQnD,wBAAwB;AACxB,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED,2CAA2C;AAC3C,eAAO,MAAM,gBAAgB,SAAS,CAAC;AAKvC,yBAAyB;AACzB,MAAM,WAAW,qBAAqB;IACpC,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,UAAU,CAAC,EAAE,yBAAyB,CAAC;CACxC;AAED,sBAAsB;AACtB,wBAAgB,eAAe,IAAI,OAAO,CAMzC;AA0CD,2BAA2B;AAC3B,wBAAsB,oBAAoB,CACxC,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,UAAU,CAAC,CA+DrB"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * OPFS Asset Store
3
+ *
4
+ * 大文件(blob)存 OPFS(Origin Private File System),元数据存内存 Map。
5
+ * OPFS 是浏览器私有文件系统,blob 持久化(刷新后文件仍在),但元数据仅在内存 ——
6
+ * 刷新后 list() 会返回空、get(id) 返回 undefined(除非元数据由上层持久化)。
7
+ * 完整元数据持久化建议叠加 IdbAssetStore 或在 W3 补强。
8
+ *
9
+ * 注:任务规格提及 FileSystemSyncAccessHandle(Worker 内同步句柄),
10
+ * 但 AssetStore 接口本身为 async,主线程仅可使用 FileSystemFileHandle 异步 API,
11
+ * 因此本实现采用异步文件句柄,语义等价且兼容主线程与 Worker。
12
+ *
13
+ * 降级链(W2.8 工厂):OPFS → IndexedDB → Memory
14
+ */
15
+ import { buildAsset, generateId, parseBlobPath, prepareImport, } from './asset-store.js';
16
+ /** OPFS 不可用或初始化失败时抛出 */
17
+ export class OpfsUnavailableError extends Error {
18
+ constructor(message) {
19
+ super(message);
20
+ this.name = 'OpfsUnavailableError';
21
+ }
22
+ }
23
+ /** OPFS 文件存储路径前缀(出现在 BlobHandle.path 中) */
24
+ export const OPFS_PATH_PREFIX = 'opfs';
25
+ /** OPFS 文件名后缀 */
26
+ const OPFS_FILE_SUFFIX = '.bin';
27
+ /** 检测当前环境是否支持 OPFS */
28
+ export function isOpfsSupported() {
29
+ return (typeof navigator !== 'undefined' &&
30
+ typeof navigator.storage !== 'undefined' &&
31
+ typeof navigator.storage.getDirectory === 'function');
32
+ }
33
+ /** 获取 OPFS 根目录句柄(自动创建命名空间目录) */
34
+ async function resolveAssetsDir(options) {
35
+ let root;
36
+ if (options.rootHandle) {
37
+ root = options.rootHandle;
38
+ }
39
+ else {
40
+ if (!isOpfsSupported()) {
41
+ throw new OpfsUnavailableError('OPFS is not available: navigator.storage.getDirectory is undefined');
42
+ }
43
+ root = await navigator.storage.getDirectory();
44
+ }
45
+ const lokvisDir = await root.getDirectoryHandle(options.rootDirName ?? 'lokvis', { create: true });
46
+ return lokvisDir.getDirectoryHandle(options.assetsDirName ?? 'assets', {
47
+ create: true,
48
+ });
49
+ }
50
+ /** 将 Blob 写入 OPFS 文件 */
51
+ async function writeOpfsFile(dir, fileName, blob) {
52
+ const fileHandle = await dir.getFileHandle(fileName, { create: true });
53
+ const writable = await fileHandle.createWritable();
54
+ try {
55
+ await writable.write(blob);
56
+ }
57
+ finally {
58
+ await writable.close();
59
+ }
60
+ return fileHandle;
61
+ }
62
+ /** 创建 OPFS 版 AssetStore */
63
+ export async function createOpfsAssetStore(options = {}) {
64
+ const assetsDir = await resolveAssetsDir(options);
65
+ /** 元数据缓存(内存中;持久化由 IdbAssetStore 负责) */
66
+ const assets = new Map();
67
+ /** id → 文件句柄(用于 getBlob/remove) */
68
+ const fileHandles = new Map();
69
+ /** 从 id 派生 OPFS 文件名 */
70
+ const fileName = (id) => `${id}${OPFS_FILE_SUFFIX}`;
71
+ return {
72
+ async import(source) {
73
+ const { id, blob, metadata, type } = prepareImport(source);
74
+ const handle = await writeOpfsFile(assetsDir, fileName(id), blob);
75
+ fileHandles.set(id, handle);
76
+ const asset = buildAsset(id, blob, metadata, type, OPFS_PATH_PREFIX);
77
+ assets.set(id, asset);
78
+ return asset;
79
+ },
80
+ async get(id) {
81
+ return assets.get(id);
82
+ },
83
+ async getBlob(handle) {
84
+ const id = parseBlobPath(handle.path, OPFS_PATH_PREFIX);
85
+ let fileHandle = fileHandles.get(id);
86
+ if (!fileHandle) {
87
+ // 可能是进程重启后元数据丢失但句柄仍可恢复
88
+ try {
89
+ fileHandle = await assetsDir.getFileHandle(fileName(id));
90
+ fileHandles.set(id, fileHandle);
91
+ }
92
+ catch {
93
+ throw new Error(`Blob not found in OPFS for path: ${handle.path}`);
94
+ }
95
+ }
96
+ const file = await fileHandle.getFile();
97
+ return file;
98
+ },
99
+ async remove(id) {
100
+ assets.delete(id);
101
+ fileHandles.delete(id);
102
+ try {
103
+ await assetsDir.removeEntry(fileName(id));
104
+ }
105
+ catch {
106
+ // 文件不存在视为已删除,静默忽略
107
+ }
108
+ },
109
+ async list() {
110
+ return Array.from(assets.values());
111
+ },
112
+ async create(blob, metadata, type) {
113
+ const id = generateId();
114
+ const handle = await writeOpfsFile(assetsDir, fileName(id), blob);
115
+ fileHandles.set(id, handle);
116
+ const asset = buildAsset(id, blob, metadata, type, OPFS_PATH_PREFIX);
117
+ assets.set(id, asset);
118
+ return asset;
119
+ },
120
+ };
121
+ }
122
+ //# sourceMappingURL=opfs-asset-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opfs-asset-store.js","sourceRoot":"","sources":["../src/opfs-asset-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Lokvis Runtime Implementation
3
+ *
4
+ * Runtime 是整个系统的"浏览器操作系统",唯一职责:Input → Run → Output。
5
+ */
6
+ import type { Asset, AssetId, AssetSource, Capability, HistoryEntry, McpManifest } from '@lokvis/schema';
7
+ import type { Workflow, WorkflowResult } from '@lokvis/schema';
8
+ import type { LokvisRuntime, RuntimeConfig, RuntimeStatus, ToMcpManifestOptions } from './types.js';
9
+ import type { EventBus } from '@lokvis/schema';
10
+ import { type AssetStore } from './asset-store.js';
11
+ import { CapabilityRegistry } from './capability-registry.js';
12
+ export declare const RUNTIME_VERSION = "0.1.0";
13
+ /** 存储配额超限时抛出(W2.9) */
14
+ export declare class QuotaExceededError extends Error {
15
+ readonly usage: number;
16
+ readonly delta: number;
17
+ readonly quota: number;
18
+ constructor(usage: number, delta: number, quota: number);
19
+ }
20
+ /** Runtime 实现类 */
21
+ export declare class LokvisRuntimeImpl implements LokvisRuntime {
22
+ readonly version = "0.1.0";
23
+ readonly eventBus: EventBus;
24
+ private config;
25
+ private _status;
26
+ private assetStore;
27
+ private capabilityRegistry;
28
+ private executor;
29
+ /**
30
+ * 每个工作流独立的 HistoryStack。
31
+ * 注意:历史栈仅在内存中,刷新页面后丢失(资产可能仍存于 OPFS/IDB,
32
+ * 但因元数据/索引未持久化而无法恢复)—— 跨会话恢复属 W3 范畴。
33
+ */
34
+ private historyStacks;
35
+ /** 记录每个工作流的初始输入 AssetId(undo 回到初始时使用) */
36
+ private initialInputsMap;
37
+ /** 记录每个工作流当前的输出 AssetId(undo/redo 后切换"当前") */
38
+ private currentOutputsMap;
39
+ constructor(config?: RuntimeConfig);
40
+ get status(): RuntimeStatus;
41
+ run(workflow: Workflow, inputs: AssetId[] | Asset[]): Promise<WorkflowResult>;
42
+ cancel(workflowId: string): Promise<void>;
43
+ pause(workflowId: string): Promise<void>;
44
+ resume(workflowId: string): Promise<void>;
45
+ history(workflowId: string): Promise<HistoryEntry[]>;
46
+ undo(workflowId: string): Promise<void>;
47
+ redo(workflowId: string): Promise<void>;
48
+ importAsset(source: AssetSource): Promise<AssetId>;
49
+ getAsset(id: AssetId): Promise<Asset>;
50
+ exportAsset(id: AssetId, format?: string): Promise<Blob>;
51
+ removeAsset(id: AssetId): Promise<void>;
52
+ listAssets(): Promise<Asset[]>;
53
+ capabilities(): Promise<Capability[]>;
54
+ hasCapability(name: string): Promise<boolean>;
55
+ /**
56
+ * 生成 MCP server manifest(不启动 server,仅描述当前可被 MCP 暴露的能力)。
57
+ * - `mcpExposure='private'`:任何模式都不暴露
58
+ * - `mcpExposure='batch-only'`:仅在 `options.batchMode=true` 时暴露
59
+ * (避免单文件误用)
60
+ * - 其余(默认 'public'):总是暴露
61
+ * - tool 名取 capability.mcpToolName 或 `lokvis_${name.replace(/\./g, '_')}`
62
+ * - resource 固定为 capabilities 与 workflows 两个清单
63
+ */
64
+ toMcpManifest(options?: ToMcpManifestOptions): McpManifest;
65
+ /** 获取 AssetStore(内部用) */
66
+ _getAssetStore(): AssetStore;
67
+ /** 获取 CapabilityRegistry(内部用) */
68
+ _getCapabilityRegistry(): CapabilityRegistry;
69
+ /** 获取工作流当前输出 AssetId(undo/redo 后的"当前"状态,内部用) */
70
+ _getCurrentOutputs(workflowId: string): AssetId[];
71
+ /** 获取或创建工作流对应的 HistoryStack */
72
+ private getOrCreateHistoryStack;
73
+ /** 将输入归一化为 AssetId[](run() 入参可为 AssetId[] 或 Asset[]) */
74
+ private collectInputAssetIds;
75
+ /** 监听 node:finished 事件,自动 append 到对应工作流的 HistoryStack */
76
+ private recordHistoryFromNodeEvent;
77
+ }
78
+ /**
79
+ * 创建 Runtime 实例(W2.8 + W2.9)。
80
+ *
81
+ * 默认通过 createAssetStore 工厂按 OPFS → IndexedDB → Memory 降级创建 AssetStore,
82
+ * 并用配额校验包裹。也可通过 config.assetStore 注入自定义 store。
83
+ *
84
+ * 注:此函数为 async(工厂需异步探测环境)。SDK 的 createLokvis 已是 async。
85
+ */
86
+ export declare function createRuntime(config?: RuntimeConfig): Promise<LokvisRuntime>;
87
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}