@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,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