@aotui/runtime 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/aotui-driven-source.d.ts +106 -0
- package/dist/adapters/aotui-driven-source.js +549 -0
- package/dist/adapters/aotui-driven-source.js.map +1 -0
- package/dist/adapters/bridge/index.d.ts +94 -0
- package/dist/adapters/bridge/index.js +199 -0
- package/dist/adapters/bridge/index.js.map +1 -0
- package/dist/adapters/index.d.ts +7 -0
- package/dist/adapters/index.js +8 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/session/index.d.ts +7 -0
- package/dist/adapters/session/index.js +2 -0
- package/dist/adapters/session/index.js.map +1 -0
- package/dist/adapters/session/session.d.ts +46 -0
- package/dist/adapters/session/session.js +76 -0
- package/dist/adapters/session/session.js.map +1 -0
- package/dist/adapters/session/types.d.ts +52 -0
- package/dist/adapters/session/types.js +7 -0
- package/dist/adapters/session/types.js.map +1 -0
- package/dist/adapters/system-instruction.d.ts +9 -0
- package/dist/adapters/system-instruction.js +434 -0
- package/dist/adapters/system-instruction.js.map +1 -0
- package/dist/benchmarks/dom-engine-comparison.d.ts +1 -0
- package/dist/benchmarks/dom-engine-comparison.js +84 -0
- package/dist/benchmarks/dom-engine-comparison.js.map +1 -0
- package/dist/benchmarks/shadow-dom-check.d.ts +1 -0
- package/dist/benchmarks/shadow-dom-check.js +44 -0
- package/dist/benchmarks/shadow-dom-check.js.map +1 -0
- package/dist/cli.d.ts +17 -0
- package/dist/cli.js +314 -0
- package/dist/cli.js.map +1 -0
- package/dist/engine/app/config.d.ts +81 -0
- package/dist/engine/app/config.js +32 -0
- package/dist/engine/app/config.js.map +1 -0
- package/dist/engine/app/index.d.ts +14 -0
- package/dist/engine/app/index.js +33 -0
- package/dist/engine/app/index.js.map +1 -0
- package/dist/engine/app/manager.d.ts +194 -0
- package/dist/engine/app/manager.js +340 -0
- package/dist/engine/app/manager.js.map +1 -0
- package/dist/engine/app/registry.d.ts +138 -0
- package/dist/engine/app/registry.js +473 -0
- package/dist/engine/app/registry.js.map +1 -0
- package/dist/engine/app/worker-app-host.service.d.ts +62 -0
- package/dist/engine/app/worker-app-host.service.js +189 -0
- package/dist/engine/app/worker-app-host.service.js.map +1 -0
- package/dist/engine/app/worker-host.d.ts +139 -0
- package/dist/engine/app/worker-host.js +397 -0
- package/dist/engine/app/worker-host.js.map +1 -0
- package/dist/engine/app/worker-pool.d.ts +45 -0
- package/dist/engine/app/worker-pool.js +122 -0
- package/dist/engine/app/worker-pool.js.map +1 -0
- package/dist/engine/app/worker-sandbox.d.ts +152 -0
- package/dist/engine/app/worker-sandbox.js +290 -0
- package/dist/engine/app/worker-sandbox.js.map +1 -0
- package/dist/engine/core/desktop-logger.d.ts +69 -0
- package/dist/engine/core/desktop-logger.js +124 -0
- package/dist/engine/core/desktop-logger.js.map +1 -0
- package/dist/engine/core/desktop.d.ts +208 -0
- package/dist/engine/core/desktop.js +351 -0
- package/dist/engine/core/desktop.js.map +1 -0
- package/dist/engine/core/index.d.ts +12 -0
- package/dist/engine/core/index.js +28 -0
- package/dist/engine/core/index.js.map +1 -0
- package/dist/engine/core/llm-output-channel.d.ts +45 -0
- package/dist/engine/core/llm-output-channel.js +122 -0
- package/dist/engine/core/llm-output-channel.js.map +1 -0
- package/dist/engine/core/manager.d.ts +59 -0
- package/dist/engine/core/manager.js +131 -0
- package/dist/engine/core/manager.js.map +1 -0
- package/dist/engine/core/operation-log-buffer.d.ts +79 -0
- package/dist/engine/core/operation-log-buffer.js +108 -0
- package/dist/engine/core/operation-log-buffer.js.map +1 -0
- package/dist/engine/core/operation-log-formatter.d.ts +44 -0
- package/dist/engine/core/operation-log-formatter.js +180 -0
- package/dist/engine/core/operation-log-formatter.js.map +1 -0
- package/dist/engine/core/services/lock.service.d.ts +33 -0
- package/dist/engine/core/services/lock.service.js +99 -0
- package/dist/engine/core/services/lock.service.js.map +1 -0
- package/dist/engine/core/signal-bus.d.ts +84 -0
- package/dist/engine/core/signal-bus.js +160 -0
- package/dist/engine/core/signal-bus.js.map +1 -0
- package/dist/engine/core/signal-service.d.ts +42 -0
- package/dist/engine/core/signal-service.js +58 -0
- package/dist/engine/core/signal-service.js.map +1 -0
- package/dist/engine/system/dispatcher.d.ts +18 -0
- package/dist/engine/system/dispatcher.js +48 -0
- package/dist/engine/system/dispatcher.js.map +1 -0
- package/dist/engine/system/index.d.ts +10 -0
- package/dist/engine/system/index.js +20 -0
- package/dist/engine/system/index.js.map +1 -0
- package/dist/engine/system/operations/index.d.ts +26 -0
- package/dist/engine/system/operations/index.js +38 -0
- package/dist/engine/system/operations/index.js.map +1 -0
- package/dist/engine/system/operations/registry.d.ts +62 -0
- package/dist/engine/system/operations/registry.js +101 -0
- package/dist/engine/system/operations/registry.js.map +1 -0
- package/dist/engine/system/operations/system/close-app.d.ts +13 -0
- package/dist/engine/system/operations/system/close-app.js +43 -0
- package/dist/engine/system/operations/system/close-app.js.map +1 -0
- package/dist/engine/system/operations/system/dismount-view.d.ts +13 -0
- package/dist/engine/system/operations/system/dismount-view.js +48 -0
- package/dist/engine/system/operations/system/dismount-view.js.map +1 -0
- package/dist/engine/system/operations/system/index.d.ts +6 -0
- package/dist/engine/system/operations/system/index.js +7 -0
- package/dist/engine/system/operations/system/index.js.map +1 -0
- package/dist/engine/system/operations/system/open-app.d.ts +13 -0
- package/dist/engine/system/operations/system/open-app.js +43 -0
- package/dist/engine/system/operations/system/open-app.js.map +1 -0
- package/dist/engine/system/registry.d.ts +36 -0
- package/dist/engine/system/registry.js +101 -0
- package/dist/engine/system/registry.js.map +1 -0
- package/dist/engine/view/index.d.ts +13 -0
- package/dist/engine/view/index.js +20 -0
- package/dist/engine/view/index.js.map +1 -0
- package/dist/engine/view/manager.d.ts +42 -0
- package/dist/engine/view/manager.js +57 -0
- package/dist/engine/view/manager.js.map +1 -0
- package/dist/engine/view/snapshot/builder.d.ts +34 -0
- package/dist/engine/view/snapshot/builder.js +119 -0
- package/dist/engine/view/snapshot/builder.js.map +1 -0
- package/dist/engine/view/snapshot/formatter.d.ts +76 -0
- package/dist/engine/view/snapshot/formatter.js +297 -0
- package/dist/engine/view/snapshot/formatter.js.map +1 -0
- package/dist/engine/view/snapshot/index.d.ts +8 -0
- package/dist/engine/view/snapshot/index.js +8 -0
- package/dist/engine/view/snapshot/index.js.map +1 -0
- package/dist/engine/view/snapshot/templates.d.ts +41 -0
- package/dist/engine/view/snapshot/templates.js +317 -0
- package/dist/engine/view/snapshot/templates.js.map +1 -0
- package/dist/engine/view/transformer/__tests__/visitors/test-utils.d.ts +1 -0
- package/dist/engine/view/transformer/__tests__/visitors/test-utils.js +14 -0
- package/dist/engine/view/transformer/__tests__/visitors/test-utils.js.map +1 -0
- package/dist/engine/view/transformer/helpers.d.ts +19 -0
- package/dist/engine/view/transformer/helpers.js +32 -0
- package/dist/engine/view/transformer/helpers.js.map +1 -0
- package/dist/engine/view/transformer/index.d.ts +40 -0
- package/dist/engine/view/transformer/index.js +38 -0
- package/dist/engine/view/transformer/index.js.map +1 -0
- package/dist/engine/view/transformer/pure.d.ts +17 -0
- package/dist/engine/view/transformer/pure.js +124 -0
- package/dist/engine/view/transformer/pure.js.map +1 -0
- package/dist/engine/view/transformer/types.d.ts +31 -0
- package/dist/engine/view/transformer/types.js +16 -0
- package/dist/engine/view/transformer/types.js.map +1 -0
- package/dist/engine/view/transformer/visitors/application.visitor.d.ts +8 -0
- package/dist/engine/view/transformer/visitors/application.visitor.js +37 -0
- package/dist/engine/view/transformer/visitors/application.visitor.js.map +1 -0
- package/dist/engine/view/transformer/visitors/html.visitor.d.ts +8 -0
- package/dist/engine/view/transformer/visitors/html.visitor.js +161 -0
- package/dist/engine/view/transformer/visitors/html.visitor.js.map +1 -0
- package/dist/engine/view/transformer/visitors/index.d.ts +12 -0
- package/dist/engine/view/transformer/visitors/index.js +27 -0
- package/dist/engine/view/transformer/visitors/index.js.map +1 -0
- package/dist/engine/view/transformer/visitors/interface.d.ts +53 -0
- package/dist/engine/view/transformer/visitors/interface.js +8 -0
- package/dist/engine/view/transformer/visitors/interface.js.map +1 -0
- package/dist/engine/view/transformer/visitors/operation.visitor.d.ts +9 -0
- package/dist/engine/view/transformer/visitors/operation.visitor.js +122 -0
- package/dist/engine/view/transformer/visitors/operation.visitor.js.map +1 -0
- package/dist/engine/view/transformer/visitors/view-link.visitor.d.ts +15 -0
- package/dist/engine/view/transformer/visitors/view-link.visitor.js +98 -0
- package/dist/engine/view/transformer/visitors/view-link.visitor.js.map +1 -0
- package/dist/engine/view/transformer/visitors/view.visitor.d.ts +8 -0
- package/dist/engine/view/transformer/visitors/view.visitor.js +43 -0
- package/dist/engine/view/transformer/visitors/view.visitor.js.map +1 -0
- package/dist/engine/view/types.d.ts +70 -0
- package/dist/engine/view/types.js +17 -0
- package/dist/engine/view/types.js.map +1 -0
- package/dist/facades/facades.d.ts +40 -0
- package/dist/facades/facades.js +66 -0
- package/dist/facades/facades.js.map +1 -0
- package/dist/facades/index.d.ts +13 -0
- package/dist/facades/index.js +15 -0
- package/dist/facades/index.js.map +1 -0
- package/dist/factory/createKernel.d.ts +37 -0
- package/dist/factory/createKernel.js +42 -0
- package/dist/factory/createKernel.js.map +1 -0
- package/dist/factory/index.d.ts +9 -0
- package/dist/factory/index.js +10 -0
- package/dist/factory/index.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.js +69 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/browser.d.ts +20 -0
- package/dist/internal/browser.js +20 -0
- package/dist/internal/browser.js.map +1 -0
- package/dist/kernel/index.d.ts +120 -0
- package/dist/kernel/index.js +328 -0
- package/dist/kernel/index.js.map +1 -0
- package/dist/spi/app/aoapp.d.ts +86 -0
- package/dist/spi/app/aoapp.js +39 -0
- package/dist/spi/app/aoapp.js.map +1 -0
- package/dist/spi/app/app-config.interface.d.ts +9 -0
- package/dist/spi/app/app-config.interface.js +2 -0
- package/dist/spi/app/app-config.interface.js.map +1 -0
- package/dist/spi/app/app-factory.interface.d.ts +78 -0
- package/dist/spi/app/app-factory.interface.js +49 -0
- package/dist/spi/app/app-factory.interface.js.map +1 -0
- package/dist/spi/app/app-kernel.interface.d.ts +139 -0
- package/dist/spi/app/app-kernel.interface.js +2 -0
- package/dist/spi/app/app-kernel.interface.js.map +1 -0
- package/dist/spi/app/app.interface.d.ts +84 -0
- package/dist/spi/app/app.interface.js +8 -0
- package/dist/spi/app/app.interface.js.map +1 -0
- package/dist/spi/app/index.d.ts +26 -0
- package/dist/spi/app/index.js +13 -0
- package/dist/spi/app/index.js.map +1 -0
- package/dist/spi/app/public-types.d.ts +309 -0
- package/dist/spi/app/public-types.js +17 -0
- package/dist/spi/app/public-types.js.map +1 -0
- package/dist/spi/app/ref-exporter.interface.d.ts +23 -0
- package/dist/spi/app/ref-exporter.interface.js +10 -0
- package/dist/spi/app/ref-exporter.interface.js.map +1 -0
- package/dist/spi/app/store.interface.d.ts +45 -0
- package/dist/spi/app/store.interface.js +11 -0
- package/dist/spi/app/store.interface.js.map +1 -0
- package/dist/spi/app/view-context-core.interface.d.ts +50 -0
- package/dist/spi/app/view-context-core.interface.js +8 -0
- package/dist/spi/app/view-context-core.interface.js.map +1 -0
- package/dist/spi/app/view-context-ext.interface.d.ts +79 -0
- package/dist/spi/app/view-context-ext.interface.js +19 -0
- package/dist/spi/app/view-context-ext.interface.js.map +1 -0
- package/dist/spi/app/view-factory.interface.d.ts +46 -0
- package/dist/spi/app/view-factory.interface.js +2 -0
- package/dist/spi/app/view-factory.interface.js.map +1 -0
- package/dist/spi/app/view-link.types.d.ts +136 -0
- package/dist/spi/app/view-link.types.js +19 -0
- package/dist/spi/app/view-link.types.js.map +1 -0
- package/dist/spi/app/view-tree.interface.d.ts +254 -0
- package/dist/spi/app/view-tree.interface.js +13 -0
- package/dist/spi/app/view-tree.interface.js.map +1 -0
- package/dist/spi/app/view.interface.d.ts +122 -0
- package/dist/spi/app/view.interface.js +15 -0
- package/dist/spi/app/view.interface.js.map +1 -0
- package/dist/spi/bridge/bridge.interface.d.ts +118 -0
- package/dist/spi/bridge/bridge.interface.js +32 -0
- package/dist/spi/bridge/bridge.interface.js.map +1 -0
- package/dist/spi/bridge/index.d.ts +8 -0
- package/dist/spi/bridge/index.js +9 -0
- package/dist/spi/bridge/index.js.map +1 -0
- package/dist/spi/component-factory.interface.d.ts +123 -0
- package/dist/spi/component-factory.interface.js +15 -0
- package/dist/spi/component-factory.interface.js.map +1 -0
- package/dist/spi/config/define-config.d.ts +31 -0
- package/dist/spi/config/define-config.js +72 -0
- package/dist/spi/config/define-config.js.map +1 -0
- package/dist/spi/config/domains/bridge.config.d.ts +21 -0
- package/dist/spi/config/domains/bridge.config.js +10 -0
- package/dist/spi/config/domains/bridge.config.js.map +1 -0
- package/dist/spi/config/domains/lock.config.d.ts +20 -0
- package/dist/spi/config/domains/lock.config.js +10 -0
- package/dist/spi/config/domains/lock.config.js.map +1 -0
- package/dist/spi/config/domains/logger.config.d.ts +28 -0
- package/dist/spi/config/domains/logger.config.js +11 -0
- package/dist/spi/config/domains/logger.config.js.map +1 -0
- package/dist/spi/config/domains/snapshot.config.d.ts +20 -0
- package/dist/spi/config/domains/snapshot.config.js +10 -0
- package/dist/spi/config/domains/snapshot.config.js.map +1 -0
- package/dist/spi/config/domains/transform.config.d.ts +28 -0
- package/dist/spi/config/domains/transform.config.js +11 -0
- package/dist/spi/config/domains/transform.config.js.map +1 -0
- package/dist/spi/config/domains/worker.config.d.ts +54 -0
- package/dist/spi/config/domains/worker.config.js +15 -0
- package/dist/spi/config/domains/worker.config.js.map +1 -0
- package/dist/spi/config/index.d.ts +16 -0
- package/dist/spi/config/index.js +18 -0
- package/dist/spi/config/index.js.map +1 -0
- package/dist/spi/config/types.d.ts +38 -0
- package/dist/spi/config/types.js +7 -0
- package/dist/spi/config/types.js.map +1 -0
- package/dist/spi/config/validate.d.ts +12 -0
- package/dist/spi/config/validate.js +90 -0
- package/dist/spi/config/validate.js.map +1 -0
- package/dist/spi/core/errors.d.ts +117 -0
- package/dist/spi/core/errors.js +233 -0
- package/dist/spi/core/errors.js.map +1 -0
- package/dist/spi/core/id-factory.d.ts +85 -0
- package/dist/spi/core/id-factory.js +119 -0
- package/dist/spi/core/id-factory.js.map +1 -0
- package/dist/spi/core/index.d.ts +21 -0
- package/dist/spi/core/index.js +25 -0
- package/dist/spi/core/index.js.map +1 -0
- package/dist/spi/core/llm-output.d.ts +74 -0
- package/dist/spi/core/llm-output.js +12 -0
- package/dist/spi/core/llm-output.js.map +1 -0
- package/dist/spi/core/operation-log.d.ts +133 -0
- package/dist/spi/core/operation-log.js +13 -0
- package/dist/spi/core/operation-log.js.map +1 -0
- package/dist/spi/core/operations.d.ts +198 -0
- package/dist/spi/core/operations.js +13 -0
- package/dist/spi/core/operations.js.map +1 -0
- package/dist/spi/core/signals.d.ts +16 -0
- package/dist/spi/core/signals.js +7 -0
- package/dist/spi/core/signals.js.map +1 -0
- package/dist/spi/core/snapshot.d.ts +77 -0
- package/dist/spi/core/snapshot.js +18 -0
- package/dist/spi/core/snapshot.js.map +1 -0
- package/dist/spi/core/tool-call.d.ts +60 -0
- package/dist/spi/core/tool-call.js +10 -0
- package/dist/spi/core/tool-call.js.map +1 -0
- package/dist/spi/core/types.d.ts +68 -0
- package/dist/spi/core/types.js +8 -0
- package/dist/spi/core/types.js.map +1 -0
- package/dist/spi/index.d.ts +31 -0
- package/dist/spi/index.js +57 -0
- package/dist/spi/index.js.map +1 -0
- package/dist/spi/runtime/app-host.interface.d.ts +142 -0
- package/dist/spi/runtime/app-host.interface.js +10 -0
- package/dist/spi/runtime/app-host.interface.js.map +1 -0
- package/dist/spi/runtime/app-installer.interface.d.ts +33 -0
- package/dist/spi/runtime/app-installer.interface.js +2 -0
- package/dist/spi/runtime/app-installer.interface.js.map +1 -0
- package/dist/spi/runtime/context.interface.d.ts +10 -0
- package/dist/spi/runtime/context.interface.js +2 -0
- package/dist/spi/runtime/context.interface.js.map +1 -0
- package/dist/spi/runtime/desktop-context.interface.d.ts +45 -0
- package/dist/spi/runtime/desktop-context.interface.js +10 -0
- package/dist/spi/runtime/desktop-context.interface.js.map +1 -0
- package/dist/spi/runtime/desktop-dom.interface.d.ts +48 -0
- package/dist/spi/runtime/desktop-dom.interface.js +13 -0
- package/dist/spi/runtime/desktop-dom.interface.js.map +1 -0
- package/dist/spi/runtime/desktop-lifecycle.interface.d.ts +23 -0
- package/dist/spi/runtime/desktop-lifecycle.interface.js +2 -0
- package/dist/spi/runtime/desktop-lifecycle.interface.js.map +1 -0
- package/dist/spi/runtime/desktop-lock.interface.d.ts +50 -0
- package/dist/spi/runtime/desktop-lock.interface.js +2 -0
- package/dist/spi/runtime/desktop-lock.interface.js.map +1 -0
- package/dist/spi/runtime/desktop-manager.interface.d.ts +22 -0
- package/dist/spi/runtime/desktop-manager.interface.js +13 -0
- package/dist/spi/runtime/desktop-manager.interface.js.map +1 -0
- package/dist/spi/runtime/desktop-repository.interface.d.ts +8 -0
- package/dist/spi/runtime/desktop-repository.interface.js +2 -0
- package/dist/spi/runtime/desktop-repository.interface.js.map +1 -0
- package/dist/spi/runtime/desktop-state-accessor.interface.d.ts +22 -0
- package/dist/spi/runtime/desktop-state-accessor.interface.js +2 -0
- package/dist/spi/runtime/desktop-state-accessor.interface.js.map +1 -0
- package/dist/spi/runtime/dispatcher.interface.d.ts +34 -0
- package/dist/spi/runtime/dispatcher.interface.js +10 -0
- package/dist/spi/runtime/dispatcher.interface.js.map +1 -0
- package/dist/spi/runtime/index.d.ts +28 -0
- package/dist/spi/runtime/index.js +11 -0
- package/dist/spi/runtime/index.js.map +1 -0
- package/dist/spi/runtime/kernel.interface.d.ts +221 -0
- package/dist/spi/runtime/kernel.interface.js +7 -0
- package/dist/spi/runtime/kernel.interface.js.map +1 -0
- package/dist/spi/runtime/llm-output-channel.interface.d.ts +81 -0
- package/dist/spi/runtime/llm-output-channel.interface.js +12 -0
- package/dist/spi/runtime/llm-output-channel.interface.js.map +1 -0
- package/dist/spi/runtime/signal.interface.d.ts +80 -0
- package/dist/spi/runtime/signal.interface.js +9 -0
- package/dist/spi/runtime/signal.interface.js.map +1 -0
- package/dist/spi/runtime/snapshot.interface.d.ts +126 -0
- package/dist/spi/runtime/snapshot.interface.js +14 -0
- package/dist/spi/runtime/snapshot.interface.js.map +1 -0
- package/dist/spi/runtime/transformer.interface.d.ts +47 -0
- package/dist/spi/runtime/transformer.interface.js +10 -0
- package/dist/spi/runtime/transformer.interface.js.map +1 -0
- package/dist/spi/runtime/worker-message.interface.d.ts +80 -0
- package/dist/spi/runtime/worker-message.interface.js +49 -0
- package/dist/spi/runtime/worker-message.interface.js.map +1 -0
- package/dist/spi/runtime/worker-runtime.interface.d.ts +177 -0
- package/dist/spi/runtime/worker-runtime.interface.js +14 -0
- package/dist/spi/runtime/worker-runtime.interface.js.map +1 -0
- package/dist/spi/worker-protocol/index.d.ts +26 -0
- package/dist/spi/worker-protocol/index.js +29 -0
- package/dist/spi/worker-protocol/index.js.map +1 -0
- package/dist/spi/worker-protocol/messages.d.ts +257 -0
- package/dist/spi/worker-protocol/messages.js +42 -0
- package/dist/spi/worker-protocol/messages.js.map +1 -0
- package/dist/spi/worker-protocol/types.d.ts +12 -0
- package/dist/spi/worker-protocol/types.js +16 -0
- package/dist/spi/worker-protocol/types.js.map +1 -0
- package/dist/worker-runtime/app-kernel/AppKernel.d.ts +178 -0
- package/dist/worker-runtime/app-kernel/AppKernel.js +622 -0
- package/dist/worker-runtime/app-kernel/AppKernel.js.map +1 -0
- package/dist/worker-runtime/app-kernel/index.d.ts +23 -0
- package/dist/worker-runtime/app-kernel/index.js +23 -0
- package/dist/worker-runtime/app-kernel/index.js.map +1 -0
- package/dist/worker-runtime/app-kernel/view-registry.d.ts +85 -0
- package/dist/worker-runtime/app-kernel/view-registry.js +119 -0
- package/dist/worker-runtime/app-kernel/view-registry.js.map +1 -0
- package/dist/worker-runtime/app-kernel/view-tree.d.ts +222 -0
- package/dist/worker-runtime/app-kernel/view-tree.js +682 -0
- package/dist/worker-runtime/app-kernel/view-tree.js.map +1 -0
- package/dist/worker-runtime/index.d.ts +16 -0
- package/dist/worker-runtime/index.js +731 -0
- package/dist/worker-runtime/index.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,731 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AOTUI Runtime - Worker Runtime
|
|
3
|
+
*
|
|
4
|
+
* 运行在 Worker Thread 中的 App 运行环境。
|
|
5
|
+
*
|
|
6
|
+
* [C1 修复] 此文件从 SDK 迁移到 Runtime,因为它执行的是 Runtime 职责:
|
|
7
|
+
* - 初始化 LinkedOM (globalThis.document)
|
|
8
|
+
* - 动态加载 App 模块
|
|
9
|
+
* - 处理 IPC 消息
|
|
10
|
+
* - 管理 App 生命周期
|
|
11
|
+
*
|
|
12
|
+
* SDK 只负责"构建" App,Runtime 负责"运行" App。
|
|
13
|
+
*
|
|
14
|
+
* @module @aotui/runtime/worker-runtime
|
|
15
|
+
*/
|
|
16
|
+
import { parentPort } from 'worker_threads';
|
|
17
|
+
import { parseHTML } from 'linkedom';
|
|
18
|
+
// [RFC-001] Transformer for Worker-Side Transformation
|
|
19
|
+
import { transformElement } from '../engine/view/transformer/pure.js';
|
|
20
|
+
import { createAppId, createDesktopId } from '../spi/index.js';
|
|
21
|
+
import { AOTUIError } from '../spi/core/errors.js';
|
|
22
|
+
// [方案 B] AppKernel from worker-runtime
|
|
23
|
+
import { AppKernel } from './app-kernel/index.js';
|
|
24
|
+
// [RFC-002] Global Ref Registry from SDK -> REMOVED
|
|
25
|
+
// Ref data is now exported via AppKernel (explicit dependency)
|
|
26
|
+
// ============================================================================
|
|
27
|
+
// Worker 状态
|
|
28
|
+
// ============================================================================
|
|
29
|
+
let app = null;
|
|
30
|
+
let appId = ''; // Will be set by INIT message
|
|
31
|
+
let desktopId = ''; // Will be set by INIT message
|
|
32
|
+
let appContainer = null;
|
|
33
|
+
// ============================================================================
|
|
34
|
+
// DOM 观察与推送 (Worker-Only 架构)
|
|
35
|
+
// ============================================================================
|
|
36
|
+
let domObserver = null;
|
|
37
|
+
let domUpdateTimer = null;
|
|
38
|
+
const DOM_UPDATE_THROTTLE_MS = 16; // ~60fps 节流
|
|
39
|
+
// Dirty 标记 - App 调用 markDirty() 后设为 true,DOM_UPDATE 后重置
|
|
40
|
+
let isDirty = false;
|
|
41
|
+
// View 级时间戳缓存:仅在 View markup 发生变化时更新时间
|
|
42
|
+
const viewDigestCache = new Map();
|
|
43
|
+
const viewTimestampCache = new Map();
|
|
44
|
+
// [RFC-012] Signal Policy - 控制何时触发 UpdateSignal
|
|
45
|
+
let signalPolicy = 'auto';
|
|
46
|
+
// [RFC-001] Worker-Side Transformation is now enforced.
|
|
47
|
+
// ============================================================================
|
|
48
|
+
// 初始化 LinkedOM (每个 Worker 独立)
|
|
49
|
+
// ============================================================================
|
|
50
|
+
let document;
|
|
51
|
+
let window;
|
|
52
|
+
let hasLoggedLinkedOM = false;
|
|
53
|
+
function initLinkedOM() {
|
|
54
|
+
const dom = parseHTML('<!DOCTYPE html><html><head></head><body></body></html>');
|
|
55
|
+
document = dom.document;
|
|
56
|
+
window = dom.window;
|
|
57
|
+
// 设置 globalThis
|
|
58
|
+
globalThis.document = document;
|
|
59
|
+
globalThis.window = window;
|
|
60
|
+
// 暴露 MutationObserver 到 globalThis
|
|
61
|
+
globalThis.MutationObserver = window.MutationObserver;
|
|
62
|
+
}
|
|
63
|
+
// 首次初始化
|
|
64
|
+
initLinkedOM();
|
|
65
|
+
// ============================================================================
|
|
66
|
+
// IPC 消息处理
|
|
67
|
+
// ============================================================================
|
|
68
|
+
parentPort?.on('message', async (msg) => {
|
|
69
|
+
try {
|
|
70
|
+
switch (msg.type) {
|
|
71
|
+
case 'INIT':
|
|
72
|
+
await handleInit(msg);
|
|
73
|
+
break;
|
|
74
|
+
case 'APP_OPEN':
|
|
75
|
+
await handleAppOpen(msg.requestId);
|
|
76
|
+
break;
|
|
77
|
+
case 'APP_PAUSE':
|
|
78
|
+
await handleAppPause(msg.requestId);
|
|
79
|
+
break;
|
|
80
|
+
case 'APP_RESUME':
|
|
81
|
+
await handleAppResume(msg.requestId);
|
|
82
|
+
break;
|
|
83
|
+
case 'APP_SHUTDOWN':
|
|
84
|
+
await handleAppShutdown(msg.requestId);
|
|
85
|
+
break;
|
|
86
|
+
case 'APP_CLOSE':
|
|
87
|
+
await handleAppClose(msg.requestId);
|
|
88
|
+
break;
|
|
89
|
+
case 'APP_DELETE':
|
|
90
|
+
await handleAppDelete(msg.requestId);
|
|
91
|
+
break;
|
|
92
|
+
case 'VIEW_DISMOUNT':
|
|
93
|
+
await handleViewDismount(msg.requestId, msg.viewId);
|
|
94
|
+
break;
|
|
95
|
+
case 'VIEW_MOUNT_BY_LINK':
|
|
96
|
+
await handleViewMountByLink(msg.requestId, msg.parentViewId, msg.linkId);
|
|
97
|
+
break;
|
|
98
|
+
case 'APP_OPERATION':
|
|
99
|
+
case 'VIEW_OPERATION':
|
|
100
|
+
await handleOperation(msg.requestId, msg.operation, msg.args, msg.snapshotId, msg.viewId);
|
|
101
|
+
break;
|
|
102
|
+
case 'EXTERNAL_EVENT':
|
|
103
|
+
await handleExternalEvent(msg.requestId, msg.viewId, msg.eventType, msg.data);
|
|
104
|
+
break;
|
|
105
|
+
case 'TERMINATE':
|
|
106
|
+
process.exit(0);
|
|
107
|
+
break;
|
|
108
|
+
case 'RESET':
|
|
109
|
+
await handleReset(msg.requestId);
|
|
110
|
+
break;
|
|
111
|
+
case 'LLM_OUTPUT_PUSH':
|
|
112
|
+
// [RFC-011] Handle LLM text push from main thread
|
|
113
|
+
handleLLMTextPush(msg);
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
sendError(msg.requestId || 'unknown', 'E_HANDLER_ERROR', error instanceof Error ? error.message : String(error));
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
// ============================================================================
|
|
122
|
+
// 消息处理函数
|
|
123
|
+
// ============================================================================
|
|
124
|
+
async function handleReset(requestId) {
|
|
125
|
+
console.log(`[Worker] Resetting worker state for reuse...`);
|
|
126
|
+
// 1. 停止 DOM 观察
|
|
127
|
+
if (domObserver) {
|
|
128
|
+
domObserver.disconnect();
|
|
129
|
+
domObserver = null;
|
|
130
|
+
}
|
|
131
|
+
if (domUpdateTimer) {
|
|
132
|
+
clearTimeout(domUpdateTimer);
|
|
133
|
+
domUpdateTimer = null;
|
|
134
|
+
}
|
|
135
|
+
// 2. 调用 App 清理
|
|
136
|
+
if (app) {
|
|
137
|
+
try {
|
|
138
|
+
await app.onClose();
|
|
139
|
+
}
|
|
140
|
+
catch (e) {
|
|
141
|
+
console.error('[Worker] Error closing app during reset:', e);
|
|
142
|
+
}
|
|
143
|
+
app = null;
|
|
144
|
+
}
|
|
145
|
+
// 3. 重置 DOM 环境 (完全重建 LinkedOM 以清除 head/events)
|
|
146
|
+
if (appContainer) {
|
|
147
|
+
appContainer.remove();
|
|
148
|
+
appContainer = null;
|
|
149
|
+
}
|
|
150
|
+
// Re-initialize LinkedOM to get a fresh document/window
|
|
151
|
+
initLinkedOM();
|
|
152
|
+
// 4. 重置状态
|
|
153
|
+
appId = createAppId('');
|
|
154
|
+
desktopId = createDesktopId('');
|
|
155
|
+
isDirty = false;
|
|
156
|
+
console.log(`[Worker] Worker state reset complete`);
|
|
157
|
+
// 发送响应
|
|
158
|
+
parentPort?.postMessage({
|
|
159
|
+
type: 'RESET_RESPONSE',
|
|
160
|
+
requestId,
|
|
161
|
+
success: true,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
async function handleInit(msg) {
|
|
165
|
+
// 如果已经初始化过 (从池中获取但未重置? 理论上不应发生),先重置
|
|
166
|
+
if (appId && appId !== msg.appId) {
|
|
167
|
+
console.warn(`[Worker] Re-initializing worker (prev: ${appId}, new: ${msg.appId})`);
|
|
168
|
+
await handleReset('internal_reset');
|
|
169
|
+
}
|
|
170
|
+
appId = msg.appId;
|
|
171
|
+
desktopId = msg.desktopId;
|
|
172
|
+
if (!hasLoggedLinkedOM) {
|
|
173
|
+
console.log('[Worker] LinkedOM initialized');
|
|
174
|
+
hasLoggedLinkedOM = true;
|
|
175
|
+
}
|
|
176
|
+
// [重构] 不再使用 globalThis,config 将通过 AppKernel 构造函数传递
|
|
177
|
+
const launchConfig = msg.config;
|
|
178
|
+
if (launchConfig) {
|
|
179
|
+
console.log(`[Worker] App config received:`, launchConfig);
|
|
180
|
+
}
|
|
181
|
+
console.log(`[Worker] Initializing app ${appId} from ${msg.appModulePath}`);
|
|
182
|
+
// 动态加载 App 模块
|
|
183
|
+
try {
|
|
184
|
+
// [RFC-005] Configuration Injection
|
|
185
|
+
// Runtime Config is handled via AppWorkerHost passing it to Worker,
|
|
186
|
+
// but here we focus on App Config.
|
|
187
|
+
const appModule = await import(msg.appModulePath);
|
|
188
|
+
// [方案 B] 支持多种导出方式,优先使用 kernelConfig
|
|
189
|
+
const factory = appModule.default;
|
|
190
|
+
if (factory?.kernelConfig) {
|
|
191
|
+
// 新模式: 使用 kernelConfig 在 Worker Runtime 中实例化 AppKernel
|
|
192
|
+
// [重构] 将 launchConfig 注入到 kernelConfig 中
|
|
193
|
+
console.log('[Worker] Using kernelConfig mode (方案 B)');
|
|
194
|
+
const configWithLaunch = {
|
|
195
|
+
...factory.kernelConfig,
|
|
196
|
+
launchConfig, // 注入运行时配置
|
|
197
|
+
};
|
|
198
|
+
// [RFC-012] 读取 signalPolicy
|
|
199
|
+
if (factory.kernelConfig.signalPolicy) {
|
|
200
|
+
signalPolicy = factory.kernelConfig.signalPolicy;
|
|
201
|
+
console.log(`[Worker] SignalPolicy set to: ${signalPolicy}`);
|
|
202
|
+
}
|
|
203
|
+
app = new AppKernel(configWithLaunch);
|
|
204
|
+
}
|
|
205
|
+
else if (factory) {
|
|
206
|
+
// 向后兼容: TUIAppFactory { create: () => ... }
|
|
207
|
+
// 注意:旧模式无法注入 launchConfig,需要保留 globalThis 作为 fallback
|
|
208
|
+
if (launchConfig) {
|
|
209
|
+
console.warn('[Worker] Legacy factory mode - using globalThis fallback for config');
|
|
210
|
+
globalThis.__AOTUI_APP_CONFIG__ = launchConfig;
|
|
211
|
+
}
|
|
212
|
+
if (typeof factory.create === 'function') {
|
|
213
|
+
app = factory.create();
|
|
214
|
+
}
|
|
215
|
+
else if (typeof factory === 'function') {
|
|
216
|
+
app = factory();
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
app = factory;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
else if (appModule.app) {
|
|
223
|
+
app = appModule.app;
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
throw new AOTUIError('APP_INVALID_EXPORT', { modulePath: msg.appModulePath });
|
|
227
|
+
}
|
|
228
|
+
// 创建 App 容器
|
|
229
|
+
appContainer = document.createElement('div');
|
|
230
|
+
appContainer.id = `app-root-${appId}`;
|
|
231
|
+
document.body.appendChild(appContainer);
|
|
232
|
+
// [RFC-002] Global ref registry loading removed in favor of AppKernel export
|
|
233
|
+
console.log('[Worker] App initialized via AppKernel');
|
|
234
|
+
sendResponse(msg.requestId, 'INIT_RESPONSE', true);
|
|
235
|
+
console.log(`[Worker] App ${appId} initialized`);
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
sendError(msg.requestId, 'E_INIT_FAILED', String(error));
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
async function handleAppOpen(requestId) {
|
|
242
|
+
if (!app || !appContainer) {
|
|
243
|
+
sendError(requestId, 'E_NOT_INITIALIZED', 'App not initialized');
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
// 渲染回调 - ViewBasedApp 注册,markDirty 调用
|
|
247
|
+
let renderCallback = null;
|
|
248
|
+
// Render Phase Flag + Deferred Scheduling
|
|
249
|
+
// 防止无限渲染循环。如果在渲染期间调用 markDirty,不会立即触发新渲染,
|
|
250
|
+
// 而是设置 needsRerender 标志,等当前渲染结束后通过 queueMicrotask 调度。
|
|
251
|
+
let isRendering = false;
|
|
252
|
+
let needsRerender = false;
|
|
253
|
+
function scheduleRender() {
|
|
254
|
+
if (!renderCallback)
|
|
255
|
+
return;
|
|
256
|
+
isRendering = true;
|
|
257
|
+
try {
|
|
258
|
+
renderCallback();
|
|
259
|
+
}
|
|
260
|
+
finally {
|
|
261
|
+
isRendering = false;
|
|
262
|
+
// Check if a deferred render was requested during the render phase
|
|
263
|
+
if (needsRerender) {
|
|
264
|
+
needsRerender = false;
|
|
265
|
+
console.log('[Worker] Deferred render scheduled (update during render)');
|
|
266
|
+
// Use queueMicrotask to break the synchronous call chain
|
|
267
|
+
queueMicrotask(() => scheduleRender());
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
const context = {
|
|
272
|
+
appId,
|
|
273
|
+
desktopId,
|
|
274
|
+
markDirty: () => {
|
|
275
|
+
console.log('[Worker] AppContext.markDirty() called, isRendering:', isRendering);
|
|
276
|
+
isDirty = true;
|
|
277
|
+
// If currently rendering, defer the re-render
|
|
278
|
+
if (isRendering) {
|
|
279
|
+
needsRerender = true;
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
// Not in render phase - schedule render normally
|
|
283
|
+
if (renderCallback) {
|
|
284
|
+
console.log('[Worker] Calling scheduleRender()');
|
|
285
|
+
scheduleRender();
|
|
286
|
+
}
|
|
287
|
+
},
|
|
288
|
+
onRender: (callback) => {
|
|
289
|
+
console.log('[Worker] onRender callback registered');
|
|
290
|
+
renderCallback = callback;
|
|
291
|
+
},
|
|
292
|
+
};
|
|
293
|
+
await app.onOpen(context, appContainer);
|
|
294
|
+
console.log('[Worker] After onOpen, appContainer.innerHTML:', appContainer.innerHTML.slice(0, 200));
|
|
295
|
+
// [Worker-Only] 启动 DOM 观察并推送初始状态
|
|
296
|
+
startDomObserver();
|
|
297
|
+
// [RFC-001] Enforce Worker-Side Transformation
|
|
298
|
+
pushSnapshotFragment();
|
|
299
|
+
sendResponse(requestId, 'LIFECYCLE_RESPONSE', true);
|
|
300
|
+
}
|
|
301
|
+
async function handleAppPause(requestId) {
|
|
302
|
+
if (app?.onPause) {
|
|
303
|
+
await app.onPause();
|
|
304
|
+
}
|
|
305
|
+
sendResponse(requestId, 'LIFECYCLE_RESPONSE', true);
|
|
306
|
+
}
|
|
307
|
+
async function handleAppResume(requestId) {
|
|
308
|
+
if (app?.onResume) {
|
|
309
|
+
await app.onResume();
|
|
310
|
+
}
|
|
311
|
+
sendResponse(requestId, 'LIFECYCLE_RESPONSE', true);
|
|
312
|
+
}
|
|
313
|
+
async function handleAppClose(requestId) {
|
|
314
|
+
if (app) {
|
|
315
|
+
await app.onClose();
|
|
316
|
+
}
|
|
317
|
+
sendResponse(requestId, 'LIFECYCLE_RESPONSE', true);
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* 处理 APP_SHUTDOWN 消息
|
|
321
|
+
* 触发SDK的持久化flush操作
|
|
322
|
+
*/
|
|
323
|
+
async function handleAppShutdown(requestId) {
|
|
324
|
+
try {
|
|
325
|
+
// 触发 window 上的 'aotui:shutdown' 事件,让 SDK 层执行 persistence flush
|
|
326
|
+
const shutdownPromise = new Promise((resolve, reject) => {
|
|
327
|
+
const win = globalThis.window;
|
|
328
|
+
if (!win || typeof win.dispatchEvent !== 'function') {
|
|
329
|
+
resolve();
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
let settled = false;
|
|
333
|
+
const settleResolve = () => {
|
|
334
|
+
if (settled)
|
|
335
|
+
return;
|
|
336
|
+
settled = true;
|
|
337
|
+
resolve();
|
|
338
|
+
};
|
|
339
|
+
const settleReject = (error) => {
|
|
340
|
+
if (settled)
|
|
341
|
+
return;
|
|
342
|
+
settled = true;
|
|
343
|
+
reject(error);
|
|
344
|
+
};
|
|
345
|
+
// 防止无监听器时卡住 shutdown(best effort)
|
|
346
|
+
const fallbackTimer = setTimeout(() => {
|
|
347
|
+
console.warn('[Worker] APP_SHUTDOWN flush timeout fallback');
|
|
348
|
+
settleResolve();
|
|
349
|
+
}, 1000);
|
|
350
|
+
try {
|
|
351
|
+
const CustomEventCtor = win.CustomEvent ?? CustomEvent;
|
|
352
|
+
const event = new CustomEventCtor('aotui:shutdown', {
|
|
353
|
+
detail: {
|
|
354
|
+
resolve: () => {
|
|
355
|
+
clearTimeout(fallbackTimer);
|
|
356
|
+
settleResolve();
|
|
357
|
+
},
|
|
358
|
+
reject: (error) => {
|
|
359
|
+
clearTimeout(fallbackTimer);
|
|
360
|
+
settleReject(error);
|
|
361
|
+
},
|
|
362
|
+
}
|
|
363
|
+
});
|
|
364
|
+
win.dispatchEvent(event);
|
|
365
|
+
}
|
|
366
|
+
catch (error) {
|
|
367
|
+
clearTimeout(fallbackTimer);
|
|
368
|
+
settleReject(error);
|
|
369
|
+
}
|
|
370
|
+
});
|
|
371
|
+
// 等待持久化完成
|
|
372
|
+
await shutdownPromise;
|
|
373
|
+
}
|
|
374
|
+
catch (error) {
|
|
375
|
+
console.error('[Worker] Error during shutdown persistence:', error);
|
|
376
|
+
// 持久化失败不应该阻塞shutdown流程,best effort
|
|
377
|
+
}
|
|
378
|
+
sendResponse(requestId, 'LIFECYCLE_RESPONSE', true);
|
|
379
|
+
}
|
|
380
|
+
async function handleAppDelete(requestId) {
|
|
381
|
+
if (app && app.onDelete) {
|
|
382
|
+
try {
|
|
383
|
+
await app.onDelete();
|
|
384
|
+
}
|
|
385
|
+
catch (error) {
|
|
386
|
+
console.error('[Worker] Error in app.onDelete:', error);
|
|
387
|
+
// Delete should try best effort, but ensure we return execution
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
// Delete implies Close (Runtime will call Close separately, but App might rely on onDelete -> Close flow)
|
|
391
|
+
// Actually, AppManager calls delete() then close().
|
|
392
|
+
// Here we just handle the delete hook.
|
|
393
|
+
sendResponse(requestId, 'LIFECYCLE_RESPONSE', true);
|
|
394
|
+
}
|
|
395
|
+
async function handleViewDismount(requestId, viewId) {
|
|
396
|
+
// Dispatch aotui:system event to appContainer for AppRuntime to handle
|
|
397
|
+
if (appContainer) {
|
|
398
|
+
const event = new window.CustomEvent('aotui:system', {
|
|
399
|
+
bubbles: true,
|
|
400
|
+
detail: { type: 'dismount_view', viewId }
|
|
401
|
+
});
|
|
402
|
+
appContainer.dispatchEvent(event);
|
|
403
|
+
}
|
|
404
|
+
sendResponse(requestId, 'LIFECYCLE_RESPONSE', true);
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* [RFC-006] Handle VIEW_MOUNT_BY_LINK message
|
|
408
|
+
*
|
|
409
|
+
* Mount a view via ViewLink (V2 API)
|
|
410
|
+
*/
|
|
411
|
+
async function handleViewMountByLink(requestId, parentViewId, linkId) {
|
|
412
|
+
// Dispatch aotui:system event with new V2 payload
|
|
413
|
+
if (appContainer) {
|
|
414
|
+
const event = new window.CustomEvent('aotui:system', {
|
|
415
|
+
bubbles: true,
|
|
416
|
+
detail: { type: 'mount_view_by_link', parentViewId, linkId }
|
|
417
|
+
});
|
|
418
|
+
appContainer.dispatchEvent(event);
|
|
419
|
+
}
|
|
420
|
+
sendResponse(requestId, 'LIFECYCLE_RESPONSE', true);
|
|
421
|
+
}
|
|
422
|
+
async function handleOperation(requestId, operation, args, snapshotId, viewId) {
|
|
423
|
+
if (!app) {
|
|
424
|
+
sendError(requestId, 'E_NOT_INITIALIZED', 'App not initialized');
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
const context = {
|
|
428
|
+
appId,
|
|
429
|
+
viewId,
|
|
430
|
+
snapshotId: snapshotId,
|
|
431
|
+
};
|
|
432
|
+
const result = await app.onOperation(context, operation, args);
|
|
433
|
+
parentPort?.postMessage({
|
|
434
|
+
type: 'OPERATION_RESPONSE',
|
|
435
|
+
requestId,
|
|
436
|
+
success: true,
|
|
437
|
+
result,
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
async function handleExternalEvent(requestId, viewId, eventType, data) {
|
|
441
|
+
if (!appContainer) {
|
|
442
|
+
sendError(requestId, 'E_NOT_INITIALIZED', 'App container not initialized');
|
|
443
|
+
return;
|
|
444
|
+
}
|
|
445
|
+
// [Milestone 1] Dispatch external event to appContainer
|
|
446
|
+
// This allows SDK hooks (useExternalEvent) to listen for system events
|
|
447
|
+
const event = new window.CustomEvent('aotui:external-event', {
|
|
448
|
+
bubbles: true,
|
|
449
|
+
detail: {
|
|
450
|
+
type: eventType,
|
|
451
|
+
viewId,
|
|
452
|
+
data,
|
|
453
|
+
timestamp: Date.now()
|
|
454
|
+
}
|
|
455
|
+
});
|
|
456
|
+
appContainer.dispatchEvent(event);
|
|
457
|
+
sendResponse(requestId, 'LIFECYCLE_RESPONSE', true);
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* [RFC-011] Handle LLM text push from main thread
|
|
461
|
+
* [RFC-020] Now supports structured payload { reasoning?, content? }
|
|
462
|
+
*
|
|
463
|
+
* Dispatches a custom event to appContainer for SDK's useLLMTextChannel hook.
|
|
464
|
+
*/
|
|
465
|
+
function handleLLMTextPush(msg) {
|
|
466
|
+
const totalLength = (msg.reasoning?.length ?? 0) + (msg.content?.length ?? 0);
|
|
467
|
+
console.log(`[Worker] Received LLM_OUTPUT_PUSH, total length: ${totalLength}`);
|
|
468
|
+
if (!appContainer) {
|
|
469
|
+
console.warn('[Worker] Cannot dispatch LLM text: appContainer not initialized');
|
|
470
|
+
return;
|
|
471
|
+
}
|
|
472
|
+
// Dispatch custom event for SDK hooks to listen
|
|
473
|
+
// [RFC-020] Include reasoning in event detail
|
|
474
|
+
const event = new window.CustomEvent('aotui:llm-text', {
|
|
475
|
+
bubbles: true,
|
|
476
|
+
detail: {
|
|
477
|
+
type: msg.eventType,
|
|
478
|
+
content: msg.content,
|
|
479
|
+
reasoning: msg.reasoning,
|
|
480
|
+
timestamp: msg.timestamp,
|
|
481
|
+
id: `llm_${msg.timestamp}`,
|
|
482
|
+
meta: msg.meta
|
|
483
|
+
}
|
|
484
|
+
});
|
|
485
|
+
appContainer.dispatchEvent(event);
|
|
486
|
+
console.log('[Worker] LLM text event dispatched');
|
|
487
|
+
}
|
|
488
|
+
// ============================================================================
|
|
489
|
+
// 辅助函数
|
|
490
|
+
// ============================================================================
|
|
491
|
+
/**
|
|
492
|
+
* 启动 DOM 观察器
|
|
493
|
+
*
|
|
494
|
+
* 监听 appContainer 的 DOM 变化,节流后推送到主线程
|
|
495
|
+
*
|
|
496
|
+
* [RFC-012] 根据 signalPolicy 决定行为:
|
|
497
|
+
* - 'auto': 正常触发
|
|
498
|
+
* - 'never': 仍然推送 snapshot (保持数据鲜度) 但带 suppressSignal 标志
|
|
499
|
+
* - 'manual': 只设置 dirty 标志
|
|
500
|
+
*/
|
|
501
|
+
function startDomObserver() {
|
|
502
|
+
if (!appContainer || domObserver)
|
|
503
|
+
return;
|
|
504
|
+
// [RFC-012] 'never' 策略仍然需要 observer 来推送数据
|
|
505
|
+
// suppressSignal 标志会在 pushSnapshotFragment 中设置
|
|
506
|
+
// LinkedOM 支持 MutationObserver
|
|
507
|
+
domObserver = new MutationObserver(() => {
|
|
508
|
+
// [RFC-012] manual 模式下只更新 dirty 标记,不推送
|
|
509
|
+
if (signalPolicy === 'manual') {
|
|
510
|
+
isDirty = true;
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
scheduleDomUpdate();
|
|
514
|
+
});
|
|
515
|
+
domObserver.observe(appContainer, {
|
|
516
|
+
childList: true,
|
|
517
|
+
subtree: true,
|
|
518
|
+
attributes: true,
|
|
519
|
+
characterData: true,
|
|
520
|
+
});
|
|
521
|
+
console.log(`[Worker] DOM observer started for ${appId}, signalPolicy: ${signalPolicy}`);
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* 节流调度 DOM 更新
|
|
525
|
+
*/
|
|
526
|
+
function scheduleDomUpdate() {
|
|
527
|
+
if (domUpdateTimer)
|
|
528
|
+
return; // 已有计划中的更新
|
|
529
|
+
domUpdateTimer = setTimeout(() => {
|
|
530
|
+
domUpdateTimer = null;
|
|
531
|
+
// [RFC-001] Enforce Worker-Side Transformation
|
|
532
|
+
pushSnapshotFragment();
|
|
533
|
+
}, DOM_UPDATE_THROTTLE_MS);
|
|
534
|
+
}
|
|
535
|
+
// [RFC-001 Phase 3] Removed legacy pushDomUpdate
|
|
536
|
+
/**
|
|
537
|
+
* [RFC-001] 推送 Snapshot Fragment 到主线程 (新协议)
|
|
538
|
+
*
|
|
539
|
+
* 在 Worker 内直接执行 Transform,推送 Markdown + IndexMap,
|
|
540
|
+
* 避免主线程 HTML 解析开销。
|
|
541
|
+
*
|
|
542
|
+
* [RFC-002] Phase 2: 合并两个数据源的 IndexMap:
|
|
543
|
+
* 1. Transformer 解析的 indexMap (来自 data-value,向后兼容)
|
|
544
|
+
* 2. GlobalRefRegistry 导出的 indexMap (新 Ref 系统,无序列化)
|
|
545
|
+
*/
|
|
546
|
+
function pushSnapshotFragment() {
|
|
547
|
+
if (!appContainer)
|
|
548
|
+
return;
|
|
549
|
+
const now = Date.now();
|
|
550
|
+
// 在 Worker 内执行 Transform (传入 appId 以支持 operation 路径生成)
|
|
551
|
+
const { markup, indexMap: transformerIndexMap } = transformElement(appContainer, appId);
|
|
552
|
+
// [RFC-002] Ref Registry: Use AppKernel Explicit Export
|
|
553
|
+
let finalIndexMap = transformerIndexMap;
|
|
554
|
+
const kernel = app;
|
|
555
|
+
if (kernel?.exportRefsToIndexMap) {
|
|
556
|
+
const refIndexMap = kernel.exportRefsToIndexMap();
|
|
557
|
+
const refCount = Object.keys(refIndexMap).length;
|
|
558
|
+
if (refCount > 0) {
|
|
559
|
+
finalIndexMap = { ...transformerIndexMap, ...refIndexMap };
|
|
560
|
+
console.log(`[Worker] Merged ${refCount} refs from Registry into IndexMap`);
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
const viewFragments = extractViewFragments(appContainer, now);
|
|
564
|
+
// [RFC-007] Get App View Tree if available
|
|
565
|
+
let viewTree;
|
|
566
|
+
if (app && typeof app.renderViewTree === 'function') {
|
|
567
|
+
viewTree = app.renderViewTree();
|
|
568
|
+
}
|
|
569
|
+
// [View Type Aggregation] Extract Type Instructions from DOM
|
|
570
|
+
const typeInstructions = extractTypeInstructions(appContainer);
|
|
571
|
+
// [View Type Aggregation] Get Type Tools from AppKernel
|
|
572
|
+
let typeToolsMarkdown;
|
|
573
|
+
if (kernel?.getAllTypeTools) {
|
|
574
|
+
const allTypeTools = kernel.getAllTypeTools();
|
|
575
|
+
console.log('[Worker] Type Tools from AppKernel:', Array.from(allTypeTools.entries()).map(([type, tools]) => `${type}: ${tools.length} tools`));
|
|
576
|
+
typeToolsMarkdown = renderTypeTools(allTypeTools);
|
|
577
|
+
console.log('[Worker] Type Tools Markdown length:', typeToolsMarkdown?.length || 0);
|
|
578
|
+
// [RFC-020] Export Type Tools to IndexMap for AgentDriver discovery
|
|
579
|
+
// AgentDriver uses generateToolsFromIndexMap to find tools
|
|
580
|
+
// Format: tool:{app_name}-{viewType}-{toolName} (使用连字符以符合 API 工具名规范)
|
|
581
|
+
const semanticAppName = kernel?.getToolAppName?.() ?? appId;
|
|
582
|
+
for (const [viewType, tools] of allTypeTools) {
|
|
583
|
+
for (const tool of tools) {
|
|
584
|
+
// Construct App-scoped ID: appName-viewType-toolName
|
|
585
|
+
// Note: IndexMap key must start with "tool:"
|
|
586
|
+
// 使用连字符 '-' 而非点 '.' 以符合 LLM API 工具名要求 ^[a-zA-Z0-9_-]+$
|
|
587
|
+
const toolKey = `tool:${semanticAppName}-${viewType}-${tool.name}`;
|
|
588
|
+
// AgentDriver expects: description, params
|
|
589
|
+
const transformedParams = Object.entries(tool.params || {}).map(([name, def]) => {
|
|
590
|
+
// SDK uses 'desc', Runtime/AgentDriver uses 'description'
|
|
591
|
+
const d = def;
|
|
592
|
+
return {
|
|
593
|
+
name,
|
|
594
|
+
type: d.type || 'string', // 提供默认值防止 undefined
|
|
595
|
+
required: d.required,
|
|
596
|
+
description: d.desc || d.description || '',
|
|
597
|
+
itemType: d.itemType, // 保留 itemType 用于 array 类型
|
|
598
|
+
options: d.options // 保留 options 用于 enum 类型
|
|
599
|
+
};
|
|
600
|
+
});
|
|
601
|
+
finalIndexMap[toolKey] = {
|
|
602
|
+
description: tool.description,
|
|
603
|
+
params: transformedParams,
|
|
604
|
+
appId,
|
|
605
|
+
appName: semanticAppName,
|
|
606
|
+
viewType,
|
|
607
|
+
toolName: tool.name,
|
|
608
|
+
};
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
console.log(`[Worker] Exported ${Object.keys(finalIndexMap).length - Object.keys(transformerIndexMap).length} tools/refs to IndexMap`);
|
|
612
|
+
}
|
|
613
|
+
else {
|
|
614
|
+
console.log('[Worker] ⚠️ AppKernel.getAllTypeTools not available');
|
|
615
|
+
}
|
|
616
|
+
console.log('[Worker] pushSnapshotFragment, markup length:', markup.length, 'indexMap keys:', Object.keys(finalIndexMap).length);
|
|
617
|
+
parentPort?.postMessage({
|
|
618
|
+
type: 'SNAPSHOT_FRAGMENT',
|
|
619
|
+
appId,
|
|
620
|
+
timestamp: now,
|
|
621
|
+
markup,
|
|
622
|
+
indexMap: finalIndexMap,
|
|
623
|
+
views: viewFragments,
|
|
624
|
+
viewTree, // [RFC-007] Push View Tree
|
|
625
|
+
// [RFC-012] 根据 signalPolicy 决定是否抑制信号
|
|
626
|
+
suppressSignal: signalPolicy === 'never',
|
|
627
|
+
});
|
|
628
|
+
isDirty = false;
|
|
629
|
+
}
|
|
630
|
+
function computeViewDigest(markup) {
|
|
631
|
+
let hash = 2166136261;
|
|
632
|
+
for (let i = 0; i < markup.length; i++) {
|
|
633
|
+
hash ^= markup.charCodeAt(i);
|
|
634
|
+
hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);
|
|
635
|
+
}
|
|
636
|
+
return `v_${(hash >>> 0).toString(16)}`;
|
|
637
|
+
}
|
|
638
|
+
function extractViewFragments(container, now) {
|
|
639
|
+
const result = [];
|
|
640
|
+
const viewNodes = Array.from(container.querySelectorAll('[data-view-id]'));
|
|
641
|
+
const aliveKeys = new Set();
|
|
642
|
+
for (const node of viewNodes) {
|
|
643
|
+
const rawViewId = node.getAttribute('data-view-id') || node.getAttribute('id');
|
|
644
|
+
if (!rawViewId)
|
|
645
|
+
continue;
|
|
646
|
+
const viewId = rawViewId;
|
|
647
|
+
const viewType = node.getAttribute('data-view-type') || rawViewId;
|
|
648
|
+
const viewName = node.getAttribute('data-view-name') || undefined;
|
|
649
|
+
const transformed = transformElement(node, appId);
|
|
650
|
+
const viewMarkup = transformed.markup?.trim();
|
|
651
|
+
if (!viewMarkup)
|
|
652
|
+
continue;
|
|
653
|
+
const key = `${appId}:${rawViewId}`;
|
|
654
|
+
aliveKeys.add(key);
|
|
655
|
+
const digest = computeViewDigest(viewMarkup);
|
|
656
|
+
const prevDigest = viewDigestCache.get(key);
|
|
657
|
+
if (prevDigest !== digest) {
|
|
658
|
+
viewDigestCache.set(key, digest);
|
|
659
|
+
viewTimestampCache.set(key, now);
|
|
660
|
+
}
|
|
661
|
+
result.push({
|
|
662
|
+
viewId,
|
|
663
|
+
viewType,
|
|
664
|
+
viewName,
|
|
665
|
+
markup: viewMarkup,
|
|
666
|
+
timestamp: viewTimestampCache.get(key) ?? now,
|
|
667
|
+
});
|
|
668
|
+
}
|
|
669
|
+
for (const key of Array.from(viewDigestCache.keys())) {
|
|
670
|
+
if (!aliveKeys.has(key)) {
|
|
671
|
+
viewDigestCache.delete(key);
|
|
672
|
+
viewTimestampCache.delete(key);
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
return result;
|
|
676
|
+
}
|
|
677
|
+
function sendResponse(requestId, type, success) {
|
|
678
|
+
parentPort?.postMessage({
|
|
679
|
+
type,
|
|
680
|
+
requestId,
|
|
681
|
+
success,
|
|
682
|
+
});
|
|
683
|
+
}
|
|
684
|
+
function sendError(requestID, code, message) {
|
|
685
|
+
parentPort?.postMessage({
|
|
686
|
+
type: 'ERROR_RESPONSE',
|
|
687
|
+
requestId: requestID,
|
|
688
|
+
success: false,
|
|
689
|
+
error: { code, message },
|
|
690
|
+
});
|
|
691
|
+
}
|
|
692
|
+
// ────────────────────────────────────────────────────────────────────────────
|
|
693
|
+
// View Type Aggregation - Helper Functions
|
|
694
|
+
// ────────────────────────────────────────────────────────────────────────────
|
|
695
|
+
/**
|
|
696
|
+
* Extract Type Instructions from DOM
|
|
697
|
+
* Searches for elements with data-role="type-instruction"
|
|
698
|
+
*/
|
|
699
|
+
function extractTypeInstructions(container) {
|
|
700
|
+
const typeInstructions = new Map();
|
|
701
|
+
const elements = container.querySelectorAll('[data-role="type-instruction"]');
|
|
702
|
+
elements.forEach((el) => {
|
|
703
|
+
const viewType = el.getAttribute('data-type');
|
|
704
|
+
if (viewType && el.textContent) {
|
|
705
|
+
typeInstructions.set(viewType, el.textContent.trim());
|
|
706
|
+
}
|
|
707
|
+
});
|
|
708
|
+
return typeInstructions;
|
|
709
|
+
}
|
|
710
|
+
/**
|
|
711
|
+
* Render Type Tools to Markdown
|
|
712
|
+
* @param typeToolsMap - Map from viewType to Array of TypeTool
|
|
713
|
+
*/
|
|
714
|
+
function renderTypeTools(typeToolsMap) {
|
|
715
|
+
if (typeToolsMap.size === 0) {
|
|
716
|
+
return '';
|
|
717
|
+
}
|
|
718
|
+
let markdown = '## Type-level Tools\n\n';
|
|
719
|
+
for (const [viewType, tools] of typeToolsMap) {
|
|
720
|
+
if (tools.length === 0)
|
|
721
|
+
continue;
|
|
722
|
+
markdown += `### ${viewType} Tools\n\n`;
|
|
723
|
+
for (const tool of tools) {
|
|
724
|
+
markdown += `- **${tool.id}**: ${tool.description}\n`;
|
|
725
|
+
}
|
|
726
|
+
markdown += '\n';
|
|
727
|
+
}
|
|
728
|
+
return markdown;
|
|
729
|
+
}
|
|
730
|
+
console.log('[Worker] Runtime started, waiting for messages...');
|
|
731
|
+
//# sourceMappingURL=index.js.map
|