@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.
Files changed (388) hide show
  1. package/dist/adapters/aotui-driven-source.d.ts +106 -0
  2. package/dist/adapters/aotui-driven-source.js +549 -0
  3. package/dist/adapters/aotui-driven-source.js.map +1 -0
  4. package/dist/adapters/bridge/index.d.ts +94 -0
  5. package/dist/adapters/bridge/index.js +199 -0
  6. package/dist/adapters/bridge/index.js.map +1 -0
  7. package/dist/adapters/index.d.ts +7 -0
  8. package/dist/adapters/index.js +8 -0
  9. package/dist/adapters/index.js.map +1 -0
  10. package/dist/adapters/session/index.d.ts +7 -0
  11. package/dist/adapters/session/index.js +2 -0
  12. package/dist/adapters/session/index.js.map +1 -0
  13. package/dist/adapters/session/session.d.ts +46 -0
  14. package/dist/adapters/session/session.js +76 -0
  15. package/dist/adapters/session/session.js.map +1 -0
  16. package/dist/adapters/session/types.d.ts +52 -0
  17. package/dist/adapters/session/types.js +7 -0
  18. package/dist/adapters/session/types.js.map +1 -0
  19. package/dist/adapters/system-instruction.d.ts +9 -0
  20. package/dist/adapters/system-instruction.js +434 -0
  21. package/dist/adapters/system-instruction.js.map +1 -0
  22. package/dist/benchmarks/dom-engine-comparison.d.ts +1 -0
  23. package/dist/benchmarks/dom-engine-comparison.js +84 -0
  24. package/dist/benchmarks/dom-engine-comparison.js.map +1 -0
  25. package/dist/benchmarks/shadow-dom-check.d.ts +1 -0
  26. package/dist/benchmarks/shadow-dom-check.js +44 -0
  27. package/dist/benchmarks/shadow-dom-check.js.map +1 -0
  28. package/dist/cli.d.ts +17 -0
  29. package/dist/cli.js +314 -0
  30. package/dist/cli.js.map +1 -0
  31. package/dist/engine/app/config.d.ts +81 -0
  32. package/dist/engine/app/config.js +32 -0
  33. package/dist/engine/app/config.js.map +1 -0
  34. package/dist/engine/app/index.d.ts +14 -0
  35. package/dist/engine/app/index.js +33 -0
  36. package/dist/engine/app/index.js.map +1 -0
  37. package/dist/engine/app/manager.d.ts +194 -0
  38. package/dist/engine/app/manager.js +340 -0
  39. package/dist/engine/app/manager.js.map +1 -0
  40. package/dist/engine/app/registry.d.ts +138 -0
  41. package/dist/engine/app/registry.js +473 -0
  42. package/dist/engine/app/registry.js.map +1 -0
  43. package/dist/engine/app/worker-app-host.service.d.ts +62 -0
  44. package/dist/engine/app/worker-app-host.service.js +189 -0
  45. package/dist/engine/app/worker-app-host.service.js.map +1 -0
  46. package/dist/engine/app/worker-host.d.ts +139 -0
  47. package/dist/engine/app/worker-host.js +397 -0
  48. package/dist/engine/app/worker-host.js.map +1 -0
  49. package/dist/engine/app/worker-pool.d.ts +45 -0
  50. package/dist/engine/app/worker-pool.js +122 -0
  51. package/dist/engine/app/worker-pool.js.map +1 -0
  52. package/dist/engine/app/worker-sandbox.d.ts +152 -0
  53. package/dist/engine/app/worker-sandbox.js +290 -0
  54. package/dist/engine/app/worker-sandbox.js.map +1 -0
  55. package/dist/engine/core/desktop-logger.d.ts +69 -0
  56. package/dist/engine/core/desktop-logger.js +124 -0
  57. package/dist/engine/core/desktop-logger.js.map +1 -0
  58. package/dist/engine/core/desktop.d.ts +208 -0
  59. package/dist/engine/core/desktop.js +351 -0
  60. package/dist/engine/core/desktop.js.map +1 -0
  61. package/dist/engine/core/index.d.ts +12 -0
  62. package/dist/engine/core/index.js +28 -0
  63. package/dist/engine/core/index.js.map +1 -0
  64. package/dist/engine/core/llm-output-channel.d.ts +45 -0
  65. package/dist/engine/core/llm-output-channel.js +122 -0
  66. package/dist/engine/core/llm-output-channel.js.map +1 -0
  67. package/dist/engine/core/manager.d.ts +59 -0
  68. package/dist/engine/core/manager.js +131 -0
  69. package/dist/engine/core/manager.js.map +1 -0
  70. package/dist/engine/core/operation-log-buffer.d.ts +79 -0
  71. package/dist/engine/core/operation-log-buffer.js +108 -0
  72. package/dist/engine/core/operation-log-buffer.js.map +1 -0
  73. package/dist/engine/core/operation-log-formatter.d.ts +44 -0
  74. package/dist/engine/core/operation-log-formatter.js +180 -0
  75. package/dist/engine/core/operation-log-formatter.js.map +1 -0
  76. package/dist/engine/core/services/lock.service.d.ts +33 -0
  77. package/dist/engine/core/services/lock.service.js +99 -0
  78. package/dist/engine/core/services/lock.service.js.map +1 -0
  79. package/dist/engine/core/signal-bus.d.ts +84 -0
  80. package/dist/engine/core/signal-bus.js +160 -0
  81. package/dist/engine/core/signal-bus.js.map +1 -0
  82. package/dist/engine/core/signal-service.d.ts +42 -0
  83. package/dist/engine/core/signal-service.js +58 -0
  84. package/dist/engine/core/signal-service.js.map +1 -0
  85. package/dist/engine/system/dispatcher.d.ts +18 -0
  86. package/dist/engine/system/dispatcher.js +48 -0
  87. package/dist/engine/system/dispatcher.js.map +1 -0
  88. package/dist/engine/system/index.d.ts +10 -0
  89. package/dist/engine/system/index.js +20 -0
  90. package/dist/engine/system/index.js.map +1 -0
  91. package/dist/engine/system/operations/index.d.ts +26 -0
  92. package/dist/engine/system/operations/index.js +38 -0
  93. package/dist/engine/system/operations/index.js.map +1 -0
  94. package/dist/engine/system/operations/registry.d.ts +62 -0
  95. package/dist/engine/system/operations/registry.js +101 -0
  96. package/dist/engine/system/operations/registry.js.map +1 -0
  97. package/dist/engine/system/operations/system/close-app.d.ts +13 -0
  98. package/dist/engine/system/operations/system/close-app.js +43 -0
  99. package/dist/engine/system/operations/system/close-app.js.map +1 -0
  100. package/dist/engine/system/operations/system/dismount-view.d.ts +13 -0
  101. package/dist/engine/system/operations/system/dismount-view.js +48 -0
  102. package/dist/engine/system/operations/system/dismount-view.js.map +1 -0
  103. package/dist/engine/system/operations/system/index.d.ts +6 -0
  104. package/dist/engine/system/operations/system/index.js +7 -0
  105. package/dist/engine/system/operations/system/index.js.map +1 -0
  106. package/dist/engine/system/operations/system/open-app.d.ts +13 -0
  107. package/dist/engine/system/operations/system/open-app.js +43 -0
  108. package/dist/engine/system/operations/system/open-app.js.map +1 -0
  109. package/dist/engine/system/registry.d.ts +36 -0
  110. package/dist/engine/system/registry.js +101 -0
  111. package/dist/engine/system/registry.js.map +1 -0
  112. package/dist/engine/view/index.d.ts +13 -0
  113. package/dist/engine/view/index.js +20 -0
  114. package/dist/engine/view/index.js.map +1 -0
  115. package/dist/engine/view/manager.d.ts +42 -0
  116. package/dist/engine/view/manager.js +57 -0
  117. package/dist/engine/view/manager.js.map +1 -0
  118. package/dist/engine/view/snapshot/builder.d.ts +34 -0
  119. package/dist/engine/view/snapshot/builder.js +119 -0
  120. package/dist/engine/view/snapshot/builder.js.map +1 -0
  121. package/dist/engine/view/snapshot/formatter.d.ts +76 -0
  122. package/dist/engine/view/snapshot/formatter.js +297 -0
  123. package/dist/engine/view/snapshot/formatter.js.map +1 -0
  124. package/dist/engine/view/snapshot/index.d.ts +8 -0
  125. package/dist/engine/view/snapshot/index.js +8 -0
  126. package/dist/engine/view/snapshot/index.js.map +1 -0
  127. package/dist/engine/view/snapshot/templates.d.ts +41 -0
  128. package/dist/engine/view/snapshot/templates.js +317 -0
  129. package/dist/engine/view/snapshot/templates.js.map +1 -0
  130. package/dist/engine/view/transformer/__tests__/visitors/test-utils.d.ts +1 -0
  131. package/dist/engine/view/transformer/__tests__/visitors/test-utils.js +14 -0
  132. package/dist/engine/view/transformer/__tests__/visitors/test-utils.js.map +1 -0
  133. package/dist/engine/view/transformer/helpers.d.ts +19 -0
  134. package/dist/engine/view/transformer/helpers.js +32 -0
  135. package/dist/engine/view/transformer/helpers.js.map +1 -0
  136. package/dist/engine/view/transformer/index.d.ts +40 -0
  137. package/dist/engine/view/transformer/index.js +38 -0
  138. package/dist/engine/view/transformer/index.js.map +1 -0
  139. package/dist/engine/view/transformer/pure.d.ts +17 -0
  140. package/dist/engine/view/transformer/pure.js +124 -0
  141. package/dist/engine/view/transformer/pure.js.map +1 -0
  142. package/dist/engine/view/transformer/types.d.ts +31 -0
  143. package/dist/engine/view/transformer/types.js +16 -0
  144. package/dist/engine/view/transformer/types.js.map +1 -0
  145. package/dist/engine/view/transformer/visitors/application.visitor.d.ts +8 -0
  146. package/dist/engine/view/transformer/visitors/application.visitor.js +37 -0
  147. package/dist/engine/view/transformer/visitors/application.visitor.js.map +1 -0
  148. package/dist/engine/view/transformer/visitors/html.visitor.d.ts +8 -0
  149. package/dist/engine/view/transformer/visitors/html.visitor.js +161 -0
  150. package/dist/engine/view/transformer/visitors/html.visitor.js.map +1 -0
  151. package/dist/engine/view/transformer/visitors/index.d.ts +12 -0
  152. package/dist/engine/view/transformer/visitors/index.js +27 -0
  153. package/dist/engine/view/transformer/visitors/index.js.map +1 -0
  154. package/dist/engine/view/transformer/visitors/interface.d.ts +53 -0
  155. package/dist/engine/view/transformer/visitors/interface.js +8 -0
  156. package/dist/engine/view/transformer/visitors/interface.js.map +1 -0
  157. package/dist/engine/view/transformer/visitors/operation.visitor.d.ts +9 -0
  158. package/dist/engine/view/transformer/visitors/operation.visitor.js +122 -0
  159. package/dist/engine/view/transformer/visitors/operation.visitor.js.map +1 -0
  160. package/dist/engine/view/transformer/visitors/view-link.visitor.d.ts +15 -0
  161. package/dist/engine/view/transformer/visitors/view-link.visitor.js +98 -0
  162. package/dist/engine/view/transformer/visitors/view-link.visitor.js.map +1 -0
  163. package/dist/engine/view/transformer/visitors/view.visitor.d.ts +8 -0
  164. package/dist/engine/view/transformer/visitors/view.visitor.js +43 -0
  165. package/dist/engine/view/transformer/visitors/view.visitor.js.map +1 -0
  166. package/dist/engine/view/types.d.ts +70 -0
  167. package/dist/engine/view/types.js +17 -0
  168. package/dist/engine/view/types.js.map +1 -0
  169. package/dist/facades/facades.d.ts +40 -0
  170. package/dist/facades/facades.js +66 -0
  171. package/dist/facades/facades.js.map +1 -0
  172. package/dist/facades/index.d.ts +13 -0
  173. package/dist/facades/index.js +15 -0
  174. package/dist/facades/index.js.map +1 -0
  175. package/dist/factory/createKernel.d.ts +37 -0
  176. package/dist/factory/createKernel.js +42 -0
  177. package/dist/factory/createKernel.js.map +1 -0
  178. package/dist/factory/index.d.ts +9 -0
  179. package/dist/factory/index.js +10 -0
  180. package/dist/factory/index.js.map +1 -0
  181. package/dist/index.d.ts +35 -0
  182. package/dist/index.js +69 -0
  183. package/dist/index.js.map +1 -0
  184. package/dist/internal/browser.d.ts +20 -0
  185. package/dist/internal/browser.js +20 -0
  186. package/dist/internal/browser.js.map +1 -0
  187. package/dist/kernel/index.d.ts +120 -0
  188. package/dist/kernel/index.js +328 -0
  189. package/dist/kernel/index.js.map +1 -0
  190. package/dist/spi/app/aoapp.d.ts +86 -0
  191. package/dist/spi/app/aoapp.js +39 -0
  192. package/dist/spi/app/aoapp.js.map +1 -0
  193. package/dist/spi/app/app-config.interface.d.ts +9 -0
  194. package/dist/spi/app/app-config.interface.js +2 -0
  195. package/dist/spi/app/app-config.interface.js.map +1 -0
  196. package/dist/spi/app/app-factory.interface.d.ts +78 -0
  197. package/dist/spi/app/app-factory.interface.js +49 -0
  198. package/dist/spi/app/app-factory.interface.js.map +1 -0
  199. package/dist/spi/app/app-kernel.interface.d.ts +139 -0
  200. package/dist/spi/app/app-kernel.interface.js +2 -0
  201. package/dist/spi/app/app-kernel.interface.js.map +1 -0
  202. package/dist/spi/app/app.interface.d.ts +84 -0
  203. package/dist/spi/app/app.interface.js +8 -0
  204. package/dist/spi/app/app.interface.js.map +1 -0
  205. package/dist/spi/app/index.d.ts +26 -0
  206. package/dist/spi/app/index.js +13 -0
  207. package/dist/spi/app/index.js.map +1 -0
  208. package/dist/spi/app/public-types.d.ts +309 -0
  209. package/dist/spi/app/public-types.js +17 -0
  210. package/dist/spi/app/public-types.js.map +1 -0
  211. package/dist/spi/app/ref-exporter.interface.d.ts +23 -0
  212. package/dist/spi/app/ref-exporter.interface.js +10 -0
  213. package/dist/spi/app/ref-exporter.interface.js.map +1 -0
  214. package/dist/spi/app/store.interface.d.ts +45 -0
  215. package/dist/spi/app/store.interface.js +11 -0
  216. package/dist/spi/app/store.interface.js.map +1 -0
  217. package/dist/spi/app/view-context-core.interface.d.ts +50 -0
  218. package/dist/spi/app/view-context-core.interface.js +8 -0
  219. package/dist/spi/app/view-context-core.interface.js.map +1 -0
  220. package/dist/spi/app/view-context-ext.interface.d.ts +79 -0
  221. package/dist/spi/app/view-context-ext.interface.js +19 -0
  222. package/dist/spi/app/view-context-ext.interface.js.map +1 -0
  223. package/dist/spi/app/view-factory.interface.d.ts +46 -0
  224. package/dist/spi/app/view-factory.interface.js +2 -0
  225. package/dist/spi/app/view-factory.interface.js.map +1 -0
  226. package/dist/spi/app/view-link.types.d.ts +136 -0
  227. package/dist/spi/app/view-link.types.js +19 -0
  228. package/dist/spi/app/view-link.types.js.map +1 -0
  229. package/dist/spi/app/view-tree.interface.d.ts +254 -0
  230. package/dist/spi/app/view-tree.interface.js +13 -0
  231. package/dist/spi/app/view-tree.interface.js.map +1 -0
  232. package/dist/spi/app/view.interface.d.ts +122 -0
  233. package/dist/spi/app/view.interface.js +15 -0
  234. package/dist/spi/app/view.interface.js.map +1 -0
  235. package/dist/spi/bridge/bridge.interface.d.ts +118 -0
  236. package/dist/spi/bridge/bridge.interface.js +32 -0
  237. package/dist/spi/bridge/bridge.interface.js.map +1 -0
  238. package/dist/spi/bridge/index.d.ts +8 -0
  239. package/dist/spi/bridge/index.js +9 -0
  240. package/dist/spi/bridge/index.js.map +1 -0
  241. package/dist/spi/component-factory.interface.d.ts +123 -0
  242. package/dist/spi/component-factory.interface.js +15 -0
  243. package/dist/spi/component-factory.interface.js.map +1 -0
  244. package/dist/spi/config/define-config.d.ts +31 -0
  245. package/dist/spi/config/define-config.js +72 -0
  246. package/dist/spi/config/define-config.js.map +1 -0
  247. package/dist/spi/config/domains/bridge.config.d.ts +21 -0
  248. package/dist/spi/config/domains/bridge.config.js +10 -0
  249. package/dist/spi/config/domains/bridge.config.js.map +1 -0
  250. package/dist/spi/config/domains/lock.config.d.ts +20 -0
  251. package/dist/spi/config/domains/lock.config.js +10 -0
  252. package/dist/spi/config/domains/lock.config.js.map +1 -0
  253. package/dist/spi/config/domains/logger.config.d.ts +28 -0
  254. package/dist/spi/config/domains/logger.config.js +11 -0
  255. package/dist/spi/config/domains/logger.config.js.map +1 -0
  256. package/dist/spi/config/domains/snapshot.config.d.ts +20 -0
  257. package/dist/spi/config/domains/snapshot.config.js +10 -0
  258. package/dist/spi/config/domains/snapshot.config.js.map +1 -0
  259. package/dist/spi/config/domains/transform.config.d.ts +28 -0
  260. package/dist/spi/config/domains/transform.config.js +11 -0
  261. package/dist/spi/config/domains/transform.config.js.map +1 -0
  262. package/dist/spi/config/domains/worker.config.d.ts +54 -0
  263. package/dist/spi/config/domains/worker.config.js +15 -0
  264. package/dist/spi/config/domains/worker.config.js.map +1 -0
  265. package/dist/spi/config/index.d.ts +16 -0
  266. package/dist/spi/config/index.js +18 -0
  267. package/dist/spi/config/index.js.map +1 -0
  268. package/dist/spi/config/types.d.ts +38 -0
  269. package/dist/spi/config/types.js +7 -0
  270. package/dist/spi/config/types.js.map +1 -0
  271. package/dist/spi/config/validate.d.ts +12 -0
  272. package/dist/spi/config/validate.js +90 -0
  273. package/dist/spi/config/validate.js.map +1 -0
  274. package/dist/spi/core/errors.d.ts +117 -0
  275. package/dist/spi/core/errors.js +233 -0
  276. package/dist/spi/core/errors.js.map +1 -0
  277. package/dist/spi/core/id-factory.d.ts +85 -0
  278. package/dist/spi/core/id-factory.js +119 -0
  279. package/dist/spi/core/id-factory.js.map +1 -0
  280. package/dist/spi/core/index.d.ts +21 -0
  281. package/dist/spi/core/index.js +25 -0
  282. package/dist/spi/core/index.js.map +1 -0
  283. package/dist/spi/core/llm-output.d.ts +74 -0
  284. package/dist/spi/core/llm-output.js +12 -0
  285. package/dist/spi/core/llm-output.js.map +1 -0
  286. package/dist/spi/core/operation-log.d.ts +133 -0
  287. package/dist/spi/core/operation-log.js +13 -0
  288. package/dist/spi/core/operation-log.js.map +1 -0
  289. package/dist/spi/core/operations.d.ts +198 -0
  290. package/dist/spi/core/operations.js +13 -0
  291. package/dist/spi/core/operations.js.map +1 -0
  292. package/dist/spi/core/signals.d.ts +16 -0
  293. package/dist/spi/core/signals.js +7 -0
  294. package/dist/spi/core/signals.js.map +1 -0
  295. package/dist/spi/core/snapshot.d.ts +77 -0
  296. package/dist/spi/core/snapshot.js +18 -0
  297. package/dist/spi/core/snapshot.js.map +1 -0
  298. package/dist/spi/core/tool-call.d.ts +60 -0
  299. package/dist/spi/core/tool-call.js +10 -0
  300. package/dist/spi/core/tool-call.js.map +1 -0
  301. package/dist/spi/core/types.d.ts +68 -0
  302. package/dist/spi/core/types.js +8 -0
  303. package/dist/spi/core/types.js.map +1 -0
  304. package/dist/spi/index.d.ts +31 -0
  305. package/dist/spi/index.js +57 -0
  306. package/dist/spi/index.js.map +1 -0
  307. package/dist/spi/runtime/app-host.interface.d.ts +142 -0
  308. package/dist/spi/runtime/app-host.interface.js +10 -0
  309. package/dist/spi/runtime/app-host.interface.js.map +1 -0
  310. package/dist/spi/runtime/app-installer.interface.d.ts +33 -0
  311. package/dist/spi/runtime/app-installer.interface.js +2 -0
  312. package/dist/spi/runtime/app-installer.interface.js.map +1 -0
  313. package/dist/spi/runtime/context.interface.d.ts +10 -0
  314. package/dist/spi/runtime/context.interface.js +2 -0
  315. package/dist/spi/runtime/context.interface.js.map +1 -0
  316. package/dist/spi/runtime/desktop-context.interface.d.ts +45 -0
  317. package/dist/spi/runtime/desktop-context.interface.js +10 -0
  318. package/dist/spi/runtime/desktop-context.interface.js.map +1 -0
  319. package/dist/spi/runtime/desktop-dom.interface.d.ts +48 -0
  320. package/dist/spi/runtime/desktop-dom.interface.js +13 -0
  321. package/dist/spi/runtime/desktop-dom.interface.js.map +1 -0
  322. package/dist/spi/runtime/desktop-lifecycle.interface.d.ts +23 -0
  323. package/dist/spi/runtime/desktop-lifecycle.interface.js +2 -0
  324. package/dist/spi/runtime/desktop-lifecycle.interface.js.map +1 -0
  325. package/dist/spi/runtime/desktop-lock.interface.d.ts +50 -0
  326. package/dist/spi/runtime/desktop-lock.interface.js +2 -0
  327. package/dist/spi/runtime/desktop-lock.interface.js.map +1 -0
  328. package/dist/spi/runtime/desktop-manager.interface.d.ts +22 -0
  329. package/dist/spi/runtime/desktop-manager.interface.js +13 -0
  330. package/dist/spi/runtime/desktop-manager.interface.js.map +1 -0
  331. package/dist/spi/runtime/desktop-repository.interface.d.ts +8 -0
  332. package/dist/spi/runtime/desktop-repository.interface.js +2 -0
  333. package/dist/spi/runtime/desktop-repository.interface.js.map +1 -0
  334. package/dist/spi/runtime/desktop-state-accessor.interface.d.ts +22 -0
  335. package/dist/spi/runtime/desktop-state-accessor.interface.js +2 -0
  336. package/dist/spi/runtime/desktop-state-accessor.interface.js.map +1 -0
  337. package/dist/spi/runtime/dispatcher.interface.d.ts +34 -0
  338. package/dist/spi/runtime/dispatcher.interface.js +10 -0
  339. package/dist/spi/runtime/dispatcher.interface.js.map +1 -0
  340. package/dist/spi/runtime/index.d.ts +28 -0
  341. package/dist/spi/runtime/index.js +11 -0
  342. package/dist/spi/runtime/index.js.map +1 -0
  343. package/dist/spi/runtime/kernel.interface.d.ts +221 -0
  344. package/dist/spi/runtime/kernel.interface.js +7 -0
  345. package/dist/spi/runtime/kernel.interface.js.map +1 -0
  346. package/dist/spi/runtime/llm-output-channel.interface.d.ts +81 -0
  347. package/dist/spi/runtime/llm-output-channel.interface.js +12 -0
  348. package/dist/spi/runtime/llm-output-channel.interface.js.map +1 -0
  349. package/dist/spi/runtime/signal.interface.d.ts +80 -0
  350. package/dist/spi/runtime/signal.interface.js +9 -0
  351. package/dist/spi/runtime/signal.interface.js.map +1 -0
  352. package/dist/spi/runtime/snapshot.interface.d.ts +126 -0
  353. package/dist/spi/runtime/snapshot.interface.js +14 -0
  354. package/dist/spi/runtime/snapshot.interface.js.map +1 -0
  355. package/dist/spi/runtime/transformer.interface.d.ts +47 -0
  356. package/dist/spi/runtime/transformer.interface.js +10 -0
  357. package/dist/spi/runtime/transformer.interface.js.map +1 -0
  358. package/dist/spi/runtime/worker-message.interface.d.ts +80 -0
  359. package/dist/spi/runtime/worker-message.interface.js +49 -0
  360. package/dist/spi/runtime/worker-message.interface.js.map +1 -0
  361. package/dist/spi/runtime/worker-runtime.interface.d.ts +177 -0
  362. package/dist/spi/runtime/worker-runtime.interface.js +14 -0
  363. package/dist/spi/runtime/worker-runtime.interface.js.map +1 -0
  364. package/dist/spi/worker-protocol/index.d.ts +26 -0
  365. package/dist/spi/worker-protocol/index.js +29 -0
  366. package/dist/spi/worker-protocol/index.js.map +1 -0
  367. package/dist/spi/worker-protocol/messages.d.ts +257 -0
  368. package/dist/spi/worker-protocol/messages.js +42 -0
  369. package/dist/spi/worker-protocol/messages.js.map +1 -0
  370. package/dist/spi/worker-protocol/types.d.ts +12 -0
  371. package/dist/spi/worker-protocol/types.js +16 -0
  372. package/dist/spi/worker-protocol/types.js.map +1 -0
  373. package/dist/worker-runtime/app-kernel/AppKernel.d.ts +178 -0
  374. package/dist/worker-runtime/app-kernel/AppKernel.js +622 -0
  375. package/dist/worker-runtime/app-kernel/AppKernel.js.map +1 -0
  376. package/dist/worker-runtime/app-kernel/index.d.ts +23 -0
  377. package/dist/worker-runtime/app-kernel/index.js +23 -0
  378. package/dist/worker-runtime/app-kernel/index.js.map +1 -0
  379. package/dist/worker-runtime/app-kernel/view-registry.d.ts +85 -0
  380. package/dist/worker-runtime/app-kernel/view-registry.js +119 -0
  381. package/dist/worker-runtime/app-kernel/view-registry.js.map +1 -0
  382. package/dist/worker-runtime/app-kernel/view-tree.d.ts +222 -0
  383. package/dist/worker-runtime/app-kernel/view-tree.js +682 -0
  384. package/dist/worker-runtime/app-kernel/view-tree.js.map +1 -0
  385. package/dist/worker-runtime/index.d.ts +16 -0
  386. package/dist/worker-runtime/index.js +731 -0
  387. package/dist/worker-runtime/index.js.map +1 -0
  388. package/package.json +67 -0
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Operation Log Formatter
3
+ *
4
+ * Generates semantic, human-readable log messages from operation entries.
5
+ * Follows the WHO/WHEN/WHERE/WHAT pattern for clarity.
6
+ *
7
+ * [RFC-008] Operation Execution Optimization
8
+ *
9
+ * @module @aotui/runtime/engine/core
10
+ */
11
+ // ============================================================================
12
+ // Log ID Generator
13
+ // ============================================================================
14
+ let globalLogIdCounter = 0;
15
+ /**
16
+ * Generate a unique log entry ID
17
+ */
18
+ export function generateLogId() {
19
+ return `oplog_${Date.now()}_${++globalLogIdCounter}`;
20
+ }
21
+ // ============================================================================
22
+ // Semantic Description Generator
23
+ // ============================================================================
24
+ /**
25
+ * Format an operation log entry into a semantic, human-readable string
26
+ *
27
+ * Format: `HH:MM:SS ✅/❌ [Actor] [Location] [Action] (Duration)`
28
+ *
29
+ * @param entry - The log entry to format
30
+ * @returns Formatted log string
31
+ *
32
+ * @example
33
+ * ```typescript
34
+ * const formatted = formatOperationLog(entry);
35
+ * // "15:32:45 ✅ Gemini in System-Chat/ChatView sent message "Hello..." (12ms)"
36
+ * ```
37
+ */
38
+ export function formatOperationLog(entry) {
39
+ const time = new Date(entry.timestamp).toISOString().slice(11, 19); // HH:MM:SS
40
+ const status = entry.success ? '✅' : '❌';
41
+ const duration = `${entry.durationMs}ms`;
42
+ // Build location string
43
+ let location = '';
44
+ if (entry.appName && entry.viewName) {
45
+ location = `in ${entry.appName}/${entry.viewName}`;
46
+ }
47
+ else if (entry.appName) {
48
+ location = `on ${entry.appName}`;
49
+ }
50
+ else {
51
+ location = 'at Desktop level';
52
+ }
53
+ // Generate semantic description based on operation type
54
+ const opName = entry.operationName;
55
+ switch (opName) {
56
+ case 'dismount_view': {
57
+ const targetView = entry.keyArgs.viewId || entry.keyArgs.view_id || 'view';
58
+ const location = entry.appName ? `in ${entry.appName}` : 'at Desktop level';
59
+ return `${time} ${status} ${entry.actor} ${location} dismounted ${targetView} (${duration})`;
60
+ }
61
+ case 'open_app': {
62
+ const appId = entry.keyArgs.appId || 'app';
63
+ if (entry.success) {
64
+ return `${time} ${status} ${entry.actor} opened app ${appId} (${duration})`;
65
+ }
66
+ else {
67
+ return `${time} ${status} ${entry.actor} failed to open app ${appId}: ${entry.errorMessage} (${duration})`;
68
+ }
69
+ }
70
+ case 'close_app': {
71
+ const appId = entry.keyArgs.appId || 'app';
72
+ return `${time} ${status} ${entry.actor} closed app ${appId} (${duration})`;
73
+ }
74
+ case 'send_message': {
75
+ const content = entry.keyArgs.content || entry.keyArgs.message || '';
76
+ const preview = content
77
+ ? (content.length > 20 ? `${content.slice(0, 20)}...` : content)
78
+ : '';
79
+ if (entry.success) {
80
+ return `${time} ${status} ${entry.actor} ${location} sent message "${preview}" (${duration})`;
81
+ }
82
+ return `${time} ${status} ${entry.actor} ${location} failed to send message "${preview}": ${entry.errorMessage} (${duration})`;
83
+ }
84
+ default: {
85
+ // Generic format for unknown operations
86
+ const args = Object.entries(entry.keyArgs)
87
+ .slice(0, 3) // Limit to 3 args
88
+ .map(([k, v]) => `${k}=${v}`)
89
+ .join(', ');
90
+ const argsStr = args ? `(${args})` : '';
91
+ if (entry.success) {
92
+ return `${time} ${status} ${entry.actor} ${location} executed ${opName}${argsStr} (${duration})`;
93
+ }
94
+ else {
95
+ return `${time} ${status} ${entry.actor} ${location} failed ${opName}${argsStr}: ${entry.errorMessage} (${duration})`;
96
+ }
97
+ }
98
+ }
99
+ }
100
+ // ============================================================================
101
+ // Log Entry Builder
102
+ // ============================================================================
103
+ /**
104
+ * Sanitize operation arguments for logging
105
+ *
106
+ * Removes sensitive data and converts values to strings.
107
+ * Only keeps first 50 chars of string values.
108
+ */
109
+ function sanitizeArgs(args) {
110
+ const sanitized = {};
111
+ for (const [key, value] of Object.entries(args)) {
112
+ // Skip sensitive-looking keys
113
+ if (key.toLowerCase().includes('password') ||
114
+ key.toLowerCase().includes('token') ||
115
+ key.toLowerCase().includes('secret')) {
116
+ continue;
117
+ }
118
+ if (typeof value === 'string') {
119
+ sanitized[key] = value.length > 50 ? value.slice(0, 50) + '...' : value;
120
+ }
121
+ else if (typeof value === 'number' || typeof value === 'boolean') {
122
+ sanitized[key] = String(value);
123
+ }
124
+ else if (value === null || value === undefined) {
125
+ // Skip null/undefined
126
+ }
127
+ else {
128
+ // For objects/arrays, just note the type
129
+ sanitized[key] = `[${typeof value}]`;
130
+ }
131
+ }
132
+ return sanitized;
133
+ }
134
+ /**
135
+ * Build a complete OperationLogEntry from execution parameters
136
+ *
137
+ * @param params - Operation execution parameters
138
+ * @returns Complete log entry with semantic description
139
+ */
140
+ export function buildOperationLogEntry(params) {
141
+ const keyArgs = sanitizeArgs(params.args);
142
+ const entry = {
143
+ id: generateLogId(),
144
+ actor: params.actor,
145
+ timestamp: Date.now(),
146
+ durationMs: params.durationMs,
147
+ desktopId: params.desktopId,
148
+ appId: params.appId,
149
+ appName: params.appName,
150
+ viewId: params.viewId,
151
+ viewName: params.viewName,
152
+ scope: params.scope,
153
+ operationName: params.operationName,
154
+ keyArgs,
155
+ success: params.success,
156
+ errorMessage: params.errorMessage,
157
+ semanticDescription: '' // Will be set below
158
+ };
159
+ // Generate semantic description
160
+ entry.semanticDescription = formatOperationLog(entry);
161
+ return entry;
162
+ }
163
+ // ============================================================================
164
+ // Markdown Formatter for Snapshot
165
+ // ============================================================================
166
+ /**
167
+ * Format operation logs as Markdown list for snapshot inclusion
168
+ *
169
+ * @param logs - Array of log entries
170
+ * @returns Markdown formatted string
171
+ */
172
+ export function formatLogsAsMarkdown(logs) {
173
+ if (logs.length === 0) {
174
+ return '';
175
+ }
176
+ return logs
177
+ .map(log => `- ${log.semanticDescription}`)
178
+ .join('\n');
179
+ }
180
+ //# sourceMappingURL=operation-log-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation-log-formatter.js","sourceRoot":"","sources":["../../../src/engine/core/operation-log-formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { IDesktopLockService, LockInfo, DesktopID } from '../../../spi/index.js';
2
+ /**
3
+ * 内存锁服务实现
4
+ *
5
+ * 职责: 管理 Desktop 互斥锁。
6
+ *
7
+ * 特性:
8
+ * - 纯内存存储 (Map)
9
+ * - 支持重入
10
+ * - 自动过期检查
11
+ * - 允许过期接管
12
+ *
13
+ * 可替换为分布式锁实现 (如 RedisLockService)
14
+ */
15
+ export declare class InMemoryLockService implements IDesktopLockService {
16
+ private desktopExists;
17
+ private locks;
18
+ private readonly ttlMs;
19
+ constructor(desktopExists: (id: DesktopID) => boolean, options?: {
20
+ ttlMs?: number;
21
+ });
22
+ acquireLock(desktopId: DesktopID, ownerId: string): void;
23
+ releaseLock(desktopId: DesktopID, ownerId: string): void;
24
+ verifyLock(desktopId: DesktopID, ownerId: string): boolean;
25
+ refreshLock(desktopId: DesktopID, ownerId: string): void;
26
+ getLockInfo(desktopId: DesktopID): LockInfo | undefined;
27
+ /**
28
+ * [Internal] 清理指定 Desktop 的锁
29
+ * 当 Desktop 被销毁时调用
30
+ */
31
+ clearLock(desktopId: DesktopID): void;
32
+ private isLockValid;
33
+ }
@@ -0,0 +1,99 @@
1
+ import { AOTUIError } from '../../../spi/core/errors.js';
2
+ import { LOCK_DEFAULTS } from '../../../spi/config/index.js';
3
+ /**
4
+ * 内存锁服务实现
5
+ *
6
+ * 职责: 管理 Desktop 互斥锁。
7
+ *
8
+ * 特性:
9
+ * - 纯内存存储 (Map)
10
+ * - 支持重入
11
+ * - 自动过期检查
12
+ * - 允许过期接管
13
+ *
14
+ * 可替换为分布式锁实现 (如 RedisLockService)
15
+ */
16
+ export class InMemoryLockService {
17
+ desktopExists;
18
+ locks = new Map();
19
+ ttlMs;
20
+ constructor(
21
+ // 依赖注入: 检查 Desktop 是否存在
22
+ desktopExists, options) {
23
+ this.desktopExists = desktopExists;
24
+ this.ttlMs = options?.ttlMs ?? LOCK_DEFAULTS.ttlMs;
25
+ }
26
+ acquireLock(desktopId, ownerId) {
27
+ if (!this.desktopExists(desktopId)) {
28
+ throw new AOTUIError('DESKTOP_NOT_FOUND', { desktopId });
29
+ }
30
+ const lock = this.locks.get(desktopId);
31
+ if (lock) {
32
+ // 1. 检查是否过期
33
+ if (!this.isLockValid(lock)) {
34
+ // Lock expired, allowing takeover
35
+ // [Strategy] Silent takeover (Last Writer Wins)
36
+ this.locks.set(desktopId, { ownerId, timestamp: Date.now() });
37
+ return;
38
+ }
39
+ // 2. 检查所有者
40
+ if (lock.ownerId !== ownerId) {
41
+ // 有效锁被他人持有 -> 拒绝
42
+ throw new AOTUIError('DESKTOP_LOCKED', {
43
+ desktopId,
44
+ ownerId: lock.ownerId,
45
+ claimant: ownerId,
46
+ });
47
+ }
48
+ // 3. 重入: 刷新时间戳
49
+ lock.timestamp = Date.now();
50
+ }
51
+ else {
52
+ // 4. 新锁
53
+ this.locks.set(desktopId, { ownerId, timestamp: Date.now() });
54
+ }
55
+ }
56
+ releaseLock(desktopId, ownerId) {
57
+ const lock = this.locks.get(desktopId);
58
+ // 仅 Owner 可释放
59
+ if (lock && lock.ownerId === ownerId) {
60
+ this.locks.delete(desktopId);
61
+ }
62
+ }
63
+ verifyLock(desktopId, ownerId) {
64
+ const lock = this.locks.get(desktopId);
65
+ if (!lock)
66
+ return false;
67
+ if (!this.isLockValid(lock))
68
+ return false;
69
+ return lock.ownerId === ownerId;
70
+ }
71
+ refreshLock(desktopId, ownerId) {
72
+ const lock = this.locks.get(desktopId);
73
+ // 仅 Owner 可刷新
74
+ if (lock && lock.ownerId === ownerId) {
75
+ lock.timestamp = Date.now();
76
+ }
77
+ }
78
+ getLockInfo(desktopId) {
79
+ const lock = this.locks.get(desktopId);
80
+ if (!lock)
81
+ return undefined;
82
+ return {
83
+ ownerId: lock.ownerId,
84
+ acquiredAt: lock.timestamp,
85
+ valid: this.isLockValid(lock)
86
+ };
87
+ }
88
+ /**
89
+ * [Internal] 清理指定 Desktop 的锁
90
+ * 当 Desktop 被销毁时调用
91
+ */
92
+ clearLock(desktopId) {
93
+ this.locks.delete(desktopId);
94
+ }
95
+ isLockValid(lock) {
96
+ return Date.now() - lock.timestamp < this.ttlMs;
97
+ }
98
+ }
99
+ //# sourceMappingURL=lock.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock.service.js","sourceRoot":"","sources":["../../../../src/engine/core/services/lock.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * SignalBus - Desktop 信号发布订阅
3
+ *
4
+ * [H1 拆分] 从 Desktop 提取的信号管理模块。
5
+ *
6
+ * 职责:
7
+ * - 管理 UpdateSignal 订阅者
8
+ * - 发布信号到订阅者
9
+ * - 管理 MutationObserver 并触发 dom_mutation 信号
10
+ */
11
+ import type { DesktopID, UpdateSignal } from '../../spi/index.js';
12
+ export type SignalListener = (signal: UpdateSignal) => void;
13
+ /**
14
+ * SignalBus 配置
15
+ */
16
+ export interface SignalBusOptions {
17
+ /** 是否在 emit 时 catch 异常,默认 true */
18
+ catchErrors?: boolean;
19
+ }
20
+ /**
21
+ * SignalBus - 统一管理所有 Desktop 的信号发布订阅
22
+ */
23
+ export declare class SignalBus {
24
+ private states;
25
+ private options;
26
+ constructor(options?: SignalBusOptions);
27
+ /**
28
+ * 订阅指定 Desktop 的信号
29
+ *
30
+ * @param desktopId Desktop ID
31
+ * @param listener 信号处理函数
32
+ * @returns 取消订阅的函数
33
+ */
34
+ subscribe(desktopId: DesktopID, listener: SignalListener): () => void;
35
+ /**
36
+ * 取消订阅
37
+ */
38
+ unsubscribe(desktopId: DesktopID, listener: SignalListener): void;
39
+ /**
40
+ * 发布信号到指定 Desktop 的所有订阅者
41
+ */
42
+ emit(desktopId: DesktopID, signal: UpdateSignal): void;
43
+ /**
44
+ * 便捷方法:发布带原因的信号
45
+ */
46
+ emitSignal(desktopId: DesktopID, reason: UpdateSignal['reason']): void;
47
+ /**
48
+ * 绑定 MutationObserver 到 Document
49
+ *
50
+ * 当 DOM 变化时自动发布 'dom_mutation' 信号
51
+ *
52
+ * @param desktopId Desktop ID
53
+ * @param window linkedom window 对象
54
+ */
55
+ observeDOM(desktopId: DesktopID, window: any): void;
56
+ /**
57
+ * 停止观察 DOM
58
+ */
59
+ stopObserving(desktopId: DesktopID): void;
60
+ /**
61
+ * 清理指定 Desktop 的所有状态
62
+ */
63
+ cleanup(desktopId: DesktopID): void;
64
+ /**
65
+ * 获取订阅者数量(用于调试)
66
+ */
67
+ getListenerCount(desktopId: DesktopID): number;
68
+ private getOrCreateState;
69
+ }
70
+ /**
71
+ * SignalOutputStream 兼容接口
72
+ *
73
+ * 用于保持 Desktop.output 的 API 兼容
74
+ */
75
+ export interface SignalOutputStream {
76
+ subscribe(listener: SignalListener): void;
77
+ unsubscribe(listener: SignalListener): void;
78
+ }
79
+ /**
80
+ * 创建 SignalOutputStream 适配器
81
+ *
82
+ * 将 SignalBus 的 per-desktop subscribe 适配为原有 API
83
+ */
84
+ export declare function createSignalOutputStream(bus: SignalBus, desktopId: DesktopID): SignalOutputStream;
@@ -0,0 +1,160 @@
1
+ /**
2
+ * SignalBus - Desktop 信号发布订阅
3
+ *
4
+ * [H1 拆分] 从 Desktop 提取的信号管理模块。
5
+ *
6
+ * 职责:
7
+ * - 管理 UpdateSignal 订阅者
8
+ * - 发布信号到订阅者
9
+ * - 管理 MutationObserver 并触发 dom_mutation 信号
10
+ */
11
+ /**
12
+ * SignalBus - 统一管理所有 Desktop 的信号发布订阅
13
+ */
14
+ export class SignalBus {
15
+ states = new Map();
16
+ options;
17
+ constructor(options) {
18
+ this.options = {
19
+ catchErrors: options?.catchErrors ?? true
20
+ };
21
+ }
22
+ /**
23
+ * 订阅指定 Desktop 的信号
24
+ *
25
+ * @param desktopId Desktop ID
26
+ * @param listener 信号处理函数
27
+ * @returns 取消订阅的函数
28
+ */
29
+ subscribe(desktopId, listener) {
30
+ const state = this.getOrCreateState(desktopId);
31
+ state.listeners.add(listener);
32
+ return () => {
33
+ state.listeners.delete(listener);
34
+ };
35
+ }
36
+ /**
37
+ * 取消订阅
38
+ */
39
+ unsubscribe(desktopId, listener) {
40
+ const state = this.states.get(desktopId);
41
+ if (state) {
42
+ state.listeners.delete(listener);
43
+ }
44
+ }
45
+ /**
46
+ * 发布信号到指定 Desktop 的所有订阅者
47
+ */
48
+ emit(desktopId, signal) {
49
+ const state = this.states.get(desktopId);
50
+ if (!state)
51
+ return;
52
+ state.listeners.forEach(listener => {
53
+ if (this.options.catchErrors) {
54
+ try {
55
+ listener(signal);
56
+ }
57
+ catch (e) {
58
+ console.error('[SignalBus] Error in signal listener:', e);
59
+ }
60
+ }
61
+ else {
62
+ listener(signal);
63
+ }
64
+ });
65
+ }
66
+ /**
67
+ * 便捷方法:发布带原因的信号
68
+ */
69
+ emitSignal(desktopId, reason) {
70
+ this.emit(desktopId, {
71
+ desktopId,
72
+ timestamp: Date.now(),
73
+ reason
74
+ });
75
+ }
76
+ /**
77
+ * 绑定 MutationObserver 到 Document
78
+ *
79
+ * 当 DOM 变化时自动发布 'dom_mutation' 信号
80
+ *
81
+ * @param desktopId Desktop ID
82
+ * @param window linkedom window 对象
83
+ */
84
+ observeDOM(desktopId, window) {
85
+ const state = this.getOrCreateState(desktopId);
86
+ // 如果已有 observer,先停止
87
+ if (state.observer) {
88
+ state.observer.disconnect();
89
+ }
90
+ // [Worker-Only Fix] LinkedOM 可能没有 MutationObserver,跳过
91
+ const MutationObserver = window?.MutationObserver;
92
+ if (!MutationObserver) {
93
+ console.log(`[SignalBus] MutationObserver not available for desktop ${desktopId}, skipping DOM observation`);
94
+ return;
95
+ }
96
+ // 创建新的 MutationObserver
97
+ const observer = new MutationObserver(() => {
98
+ this.emit(desktopId, {
99
+ desktopId,
100
+ timestamp: Date.now(),
101
+ reason: 'dom_mutation'
102
+ });
103
+ });
104
+ state.observer = observer;
105
+ // 开始观察
106
+ observer.observe(window.document.body, {
107
+ childList: true,
108
+ subtree: true,
109
+ attributes: true,
110
+ characterData: true
111
+ });
112
+ }
113
+ /**
114
+ * 停止观察 DOM
115
+ */
116
+ stopObserving(desktopId) {
117
+ const state = this.states.get(desktopId);
118
+ if (state?.observer) {
119
+ state.observer.disconnect();
120
+ state.observer = null;
121
+ }
122
+ }
123
+ /**
124
+ * 清理指定 Desktop 的所有状态
125
+ */
126
+ cleanup(desktopId) {
127
+ this.stopObserving(desktopId);
128
+ this.states.delete(desktopId);
129
+ }
130
+ /**
131
+ * 获取订阅者数量(用于调试)
132
+ */
133
+ getListenerCount(desktopId) {
134
+ return this.states.get(desktopId)?.listeners.size ?? 0;
135
+ }
136
+ // ---- 私有方法 ----
137
+ getOrCreateState(desktopId) {
138
+ let state = this.states.get(desktopId);
139
+ if (!state) {
140
+ state = {
141
+ listeners: new Set(),
142
+ observer: null
143
+ };
144
+ this.states.set(desktopId, state);
145
+ }
146
+ return state;
147
+ }
148
+ }
149
+ /**
150
+ * 创建 SignalOutputStream 适配器
151
+ *
152
+ * 将 SignalBus 的 per-desktop subscribe 适配为原有 API
153
+ */
154
+ export function createSignalOutputStream(bus, desktopId) {
155
+ return {
156
+ subscribe: (listener) => { bus.subscribe(desktopId, listener); },
157
+ unsubscribe: (listener) => { bus.unsubscribe(desktopId, listener); }
158
+ };
159
+ }
160
+ //# sourceMappingURL=signal-bus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal-bus.js","sourceRoot":"","sources":["../../../src/engine/core/signal-bus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Engine Layer - Signal Bus Adapter
3
+ *
4
+ * [Option B] ISignalService 的实现。
5
+ *
6
+ * 将现有 SignalBus 适配为 ISignalService 接口,
7
+ * 实现 Desktop 解耦。
8
+ *
9
+ * @module @aotui/runtime/engine/core
10
+ */
11
+ import type { ISignalService, SignalListener, DesktopID } from '../../spi/index.js';
12
+ import { SignalBus } from './signal-bus.js';
13
+ /**
14
+ * Signal Service 实现
15
+ *
16
+ * 基于现有 SignalBus 实现 ISignalService 接口。
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * const signalService = new SignalServiceImpl();
21
+ *
22
+ * const unsubscribe = signalService.subscribe(desktopId, (signal) => {
23
+ * console.log('Signal:', signal.reason);
24
+ * });
25
+ *
26
+ * signalService.emit(desktopId, 'dom_mutation');
27
+ * ```
28
+ */
29
+ export declare class SignalServiceImpl implements ISignalService {
30
+ /** 内部 SignalBus 实例 */
31
+ private bus;
32
+ constructor(bus?: SignalBus);
33
+ subscribe(desktopId: DesktopID, listener: SignalListener): () => void;
34
+ emit(desktopId: DesktopID, reason: string): void;
35
+ cleanup(desktopId: DesktopID): void;
36
+ /**
37
+ * 获取底层 SignalBus
38
+ *
39
+ * 用于需要直接访问 SignalBus 的场景 (如 Desktop.output)
40
+ */
41
+ getBus(): SignalBus;
42
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Engine Layer - Signal Bus Adapter
3
+ *
4
+ * [Option B] ISignalService 的实现。
5
+ *
6
+ * 将现有 SignalBus 适配为 ISignalService 接口,
7
+ * 实现 Desktop 解耦。
8
+ *
9
+ * @module @aotui/runtime/engine/core
10
+ */
11
+ import { SignalBus } from './signal-bus.js';
12
+ // ============================================================================
13
+ // Signal Service Implementation
14
+ // ============================================================================
15
+ /**
16
+ * Signal Service 实现
17
+ *
18
+ * 基于现有 SignalBus 实现 ISignalService 接口。
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const signalService = new SignalServiceImpl();
23
+ *
24
+ * const unsubscribe = signalService.subscribe(desktopId, (signal) => {
25
+ * console.log('Signal:', signal.reason);
26
+ * });
27
+ *
28
+ * signalService.emit(desktopId, 'dom_mutation');
29
+ * ```
30
+ */
31
+ export class SignalServiceImpl {
32
+ /** 内部 SignalBus 实例 */
33
+ bus;
34
+ constructor(bus) {
35
+ this.bus = bus ?? new SignalBus();
36
+ }
37
+ subscribe(desktopId, listener) {
38
+ return this.bus.subscribe(desktopId, listener);
39
+ }
40
+ emit(desktopId, reason) {
41
+ this.bus.emitSignal(desktopId, reason);
42
+ }
43
+ cleanup(desktopId) {
44
+ this.bus.cleanup(desktopId);
45
+ }
46
+ // ─────────────────────────────────────────────────────────────
47
+ // Additional Methods (for compatibility)
48
+ // ─────────────────────────────────────────────────────────────
49
+ /**
50
+ * 获取底层 SignalBus
51
+ *
52
+ * 用于需要直接访问 SignalBus 的场景 (如 Desktop.output)
53
+ */
54
+ getBus() {
55
+ return this.bus;
56
+ }
57
+ }
58
+ //# sourceMappingURL=signal-service.js.map