@fps-games/editor 0.2.1-beta.3 → 0.2.1-beta.4

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 (514) hide show
  1. package/dist/build-info.json +44 -44
  2. package/dist/editor-commands/capabilities/assets.d.ts +8 -0
  3. package/dist/editor-commands/capabilities/assets.d.ts.map +1 -0
  4. package/dist/{agent-bridge → editor-commands}/capabilities/assets.js +41 -41
  5. package/dist/editor-commands/capabilities/assets.js.map +1 -0
  6. package/dist/editor-commands/capabilities/editor-state.d.ts +5 -0
  7. package/dist/editor-commands/capabilities/editor-state.d.ts.map +1 -0
  8. package/dist/{agent-bridge → editor-commands}/capabilities/editor-state.js +22 -22
  9. package/dist/editor-commands/capabilities/editor-state.js.map +1 -0
  10. package/dist/editor-commands/capabilities/hierarchy.d.ts +4 -0
  11. package/dist/editor-commands/capabilities/hierarchy.d.ts.map +1 -0
  12. package/dist/{agent-bridge → editor-commands}/capabilities/hierarchy.js +5 -5
  13. package/dist/editor-commands/capabilities/hierarchy.js.map +1 -0
  14. package/dist/editor-commands/capabilities/host-lifecycle.d.ts +11 -0
  15. package/dist/editor-commands/capabilities/host-lifecycle.d.ts.map +1 -0
  16. package/dist/editor-commands/capabilities/host-lifecycle.js +149 -0
  17. package/dist/editor-commands/capabilities/host-lifecycle.js.map +1 -0
  18. package/dist/editor-commands/capabilities/prefabs.d.ts +5 -0
  19. package/dist/editor-commands/capabilities/prefabs.d.ts.map +1 -0
  20. package/dist/{agent-bridge → editor-commands}/capabilities/prefabs.js +93 -93
  21. package/dist/editor-commands/capabilities/prefabs.js.map +1 -0
  22. package/dist/editor-commands/capabilities/scene-objects.d.ts +8 -0
  23. package/dist/editor-commands/capabilities/scene-objects.d.ts.map +1 -0
  24. package/dist/editor-commands/capabilities/scene-objects.js +480 -0
  25. package/dist/editor-commands/capabilities/scene-objects.js.map +1 -0
  26. package/dist/editor-commands/capabilities/selection.d.ts +5 -0
  27. package/dist/editor-commands/capabilities/selection.d.ts.map +1 -0
  28. package/dist/editor-commands/capabilities/selection.js +60 -0
  29. package/dist/editor-commands/capabilities/selection.js.map +1 -0
  30. package/dist/editor-commands/capabilities/shadows.d.ts +5 -0
  31. package/dist/editor-commands/capabilities/shadows.d.ts.map +1 -0
  32. package/dist/{agent-bridge → editor-commands}/capabilities/shadows.js +74 -74
  33. package/dist/editor-commands/capabilities/shadows.js.map +1 -0
  34. package/dist/editor-commands/capabilities/transform.d.ts +5 -0
  35. package/dist/editor-commands/capabilities/transform.d.ts.map +1 -0
  36. package/dist/editor-commands/capabilities/transform.js +164 -0
  37. package/dist/editor-commands/capabilities/transform.js.map +1 -0
  38. package/dist/editor-commands/capabilities/ui-regions.d.ts +4 -0
  39. package/dist/editor-commands/capabilities/ui-regions.d.ts.map +1 -0
  40. package/dist/{agent-bridge → editor-commands}/capabilities/ui-regions.js +55 -57
  41. package/dist/editor-commands/capabilities/ui-regions.js.map +1 -0
  42. package/dist/editor-commands/capabilities/viewport.d.ts +5 -0
  43. package/dist/editor-commands/capabilities/viewport.d.ts.map +1 -0
  44. package/dist/{agent-bridge → editor-commands}/capabilities/viewport.js +100 -100
  45. package/dist/editor-commands/capabilities/viewport.js.map +1 -0
  46. package/dist/editor-commands/command-sources.d.ts +7 -0
  47. package/dist/editor-commands/command-sources.d.ts.map +1 -0
  48. package/dist/editor-commands/command-sources.js +34 -0
  49. package/dist/editor-commands/command-sources.js.map +1 -0
  50. package/dist/editor-commands/diagnostics.d.ts +12 -0
  51. package/dist/editor-commands/diagnostics.d.ts.map +1 -0
  52. package/dist/{agent-bridge → editor-commands}/diagnostics.js +4 -4
  53. package/dist/editor-commands/diagnostics.js.map +1 -0
  54. package/dist/{agent-bridge → editor-commands}/index.d.ts +1 -1
  55. package/dist/editor-commands/index.d.ts.map +1 -0
  56. package/dist/{agent-bridge → editor-commands}/index.js +1 -1
  57. package/dist/editor-commands/index.js.map +1 -0
  58. package/dist/editor-commands/register.d.ts +4 -0
  59. package/dist/editor-commands/register.d.ts.map +1 -0
  60. package/dist/{agent-bridge → editor-commands}/register.js +323 -286
  61. package/dist/editor-commands/register.js.map +1 -0
  62. package/dist/{agent-bridge → editor-commands}/shared.d.ts +80 -80
  63. package/dist/editor-commands/shared.d.ts.map +1 -0
  64. package/dist/{agent-bridge → editor-commands}/shared.js +29 -29
  65. package/dist/editor-commands/shared.js.map +1 -0
  66. package/dist/editor-commands/source-types.d.ts +110 -0
  67. package/dist/editor-commands/source-types.d.ts.map +1 -0
  68. package/dist/editor-commands/source-types.js.map +1 -0
  69. package/dist/editor-plugin-commands.d.ts +4 -0
  70. package/dist/editor-plugin-commands.d.ts.map +1 -0
  71. package/dist/editor-plugin-commands.js +18 -0
  72. package/dist/editor-plugin-commands.js.map +1 -0
  73. package/dist/index.d.ts +2 -2
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +1 -1
  76. package/dist/index.js.map +1 -1
  77. package/dist/local-editor-commands.d.ts +2 -0
  78. package/dist/local-editor-commands.d.ts.map +1 -0
  79. package/dist/local-editor-commands.js +2 -0
  80. package/dist/local-editor-commands.js.map +1 -0
  81. package/dist/local-editor-harness.d.ts +35 -21
  82. package/dist/local-editor-harness.d.ts.map +1 -1
  83. package/dist/local-editor-harness.js +1721 -367
  84. package/dist/local-editor-harness.js.map +1 -1
  85. package/dist/local-editor-prefab-stage-transaction.d.ts +2 -1
  86. package/dist/local-editor-prefab-stage-transaction.d.ts.map +1 -1
  87. package/dist/local-editor-prefab-stage-transaction.js +6 -5
  88. package/dist/local-editor-prefab-stage-transaction.js.map +1 -1
  89. package/dist/local-editor-scene-view-interaction-runtime.d.ts.map +1 -1
  90. package/dist/local-editor-scene-view-interaction-runtime.js +2 -5
  91. package/dist/local-editor-scene-view-interaction-runtime.js.map +1 -1
  92. package/dist/playable-local-editor-entry.d.ts +10 -0
  93. package/dist/playable-local-editor-entry.d.ts.map +1 -1
  94. package/dist/playable-local-editor-entry.js +10 -2
  95. package/dist/playable-local-editor-entry.js.map +1 -1
  96. package/dist/playable-local-editor-host.d.ts +3 -32
  97. package/dist/playable-local-editor-host.d.ts.map +1 -1
  98. package/dist/playable-local-editor-host.js +6 -70
  99. package/dist/playable-local-editor-host.js.map +1 -1
  100. package/dist/playable-product-local-editor.d.ts +1 -2
  101. package/dist/playable-product-local-editor.d.ts.map +1 -1
  102. package/dist/playable-product-local-editor.js +0 -1
  103. package/dist/playable-product-local-editor.js.map +1 -1
  104. package/dist/playable-product-projection-preview.d.ts.map +1 -1
  105. package/dist/playable-product-projection-preview.js +1 -1
  106. package/dist/playable-product-projection-preview.js.map +1 -1
  107. package/dist/playable-product-scene-capabilities.d.ts +0 -2
  108. package/dist/playable-product-scene-capabilities.d.ts.map +1 -1
  109. package/dist/playable-product-scene-capabilities.js +33 -6
  110. package/dist/playable-product-scene-capabilities.js.map +1 -1
  111. package/dist/playable-runtime-babylon.d.ts +4 -0
  112. package/dist/playable-runtime-babylon.d.ts.map +1 -1
  113. package/dist/playable-runtime-babylon.js +4 -0
  114. package/dist/playable-runtime-babylon.js.map +1 -1
  115. package/dist/playable-sdk.d.ts +1 -1
  116. package/dist/playable-sdk.d.ts.map +1 -1
  117. package/dist/playable-sdk.js.map +1 -1
  118. package/dist/playable-standard-project.d.ts +0 -2
  119. package/dist/playable-standard-project.d.ts.map +1 -1
  120. package/dist/playable-standard-project.js +1 -2
  121. package/dist/playable-standard-project.js.map +1 -1
  122. package/dist/project-service-projection.d.ts +16 -0
  123. package/dist/project-service-projection.d.ts.map +1 -0
  124. package/dist/project-service-projection.js +67 -0
  125. package/dist/project-service-projection.js.map +1 -0
  126. package/node_modules/@fps-games/babylon-renderer/dist/post-process/babylon-default-pipeline.d.ts +18 -0
  127. package/node_modules/@fps-games/babylon-renderer/dist/post-process/babylon-default-pipeline.d.ts.map +1 -1
  128. package/node_modules/@fps-games/babylon-renderer/dist/post-process/babylon-default-pipeline.js +54 -18
  129. package/node_modules/@fps-games/babylon-renderer/dist/post-process/babylon-default-pipeline.js.map +1 -1
  130. package/node_modules/@fps-games/babylon-renderer/package.json +9 -9
  131. package/node_modules/@fps-games/editor-babylon/dist/projection.d.ts +1 -0
  132. package/node_modules/@fps-games/editor-babylon/dist/projection.d.ts.map +1 -1
  133. package/node_modules/@fps-games/editor-babylon/dist/projection.js +1 -1
  134. package/node_modules/@fps-games/editor-babylon/dist/projection.js.map +1 -1
  135. package/node_modules/@fps-games/editor-babylon/dist/selection-presentation-controller.d.ts.map +1 -1
  136. package/node_modules/@fps-games/editor-babylon/dist/selection-presentation-controller.js +127 -13
  137. package/node_modules/@fps-games/editor-babylon/dist/selection-presentation-controller.js.map +1 -1
  138. package/node_modules/@fps-games/editor-babylon/dist/transform-gizmo-controller.d.ts.map +1 -1
  139. package/node_modules/@fps-games/editor-babylon/dist/transform-gizmo-controller.js +66 -1
  140. package/node_modules/@fps-games/editor-babylon/dist/transform-gizmo-controller.js.map +1 -1
  141. package/node_modules/@fps-games/editor-babylon/package.json +6 -6
  142. package/node_modules/@fps-games/editor-browser/dist/editor-command-service-client.d.ts +32 -0
  143. package/node_modules/@fps-games/editor-browser/dist/editor-command-service-client.d.ts.map +1 -0
  144. package/node_modules/@fps-games/editor-browser/dist/editor-command-service-client.js +254 -0
  145. package/node_modules/@fps-games/editor-browser/dist/editor-command-service-client.js.map +1 -0
  146. package/node_modules/@fps-games/editor-browser/dist/index.d.ts +3 -1
  147. package/node_modules/@fps-games/editor-browser/dist/index.d.ts.map +1 -1
  148. package/node_modules/@fps-games/editor-browser/dist/index.js +2 -0
  149. package/node_modules/@fps-games/editor-browser/dist/index.js.map +1 -1
  150. package/node_modules/@fps-games/editor-browser/dist/local-editor-command-center.d.ts +68 -0
  151. package/node_modules/@fps-games/editor-browser/dist/local-editor-command-center.d.ts.map +1 -0
  152. package/node_modules/@fps-games/editor-browser/dist/local-editor-command-center.js +650 -0
  153. package/node_modules/@fps-games/editor-browser/dist/local-editor-command-center.js.map +1 -0
  154. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-formal-surface-visibility.d.ts +1 -0
  155. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-formal-surface-visibility.d.ts.map +1 -1
  156. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-formal-surface-visibility.js +22 -0
  157. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-formal-surface-visibility.js.map +1 -1
  158. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-controller.d.ts +8 -0
  159. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-controller.d.ts.map +1 -1
  160. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-controller.js +117 -6
  161. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-controller.js.map +1 -1
  162. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-view.d.ts +14 -1
  163. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-view.d.ts.map +1 -1
  164. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-view.js +100 -1
  165. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-view.js.map +1 -1
  166. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-panels.d.ts +8 -1
  167. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-panels.d.ts.map +1 -1
  168. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-panels.js +75 -2
  169. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-panels.js.map +1 -1
  170. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-types.d.ts +37 -12
  171. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-types.d.ts.map +1 -1
  172. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-types.js.map +1 -1
  173. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.d.ts +25 -2
  174. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.d.ts.map +1 -1
  175. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.js +332 -107
  176. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.js.map +1 -1
  177. package/node_modules/@fps-games/editor-browser/package.json +7 -7
  178. package/node_modules/@fps-games/editor-core/dist/editor-authoring-host.d.ts +107 -0
  179. package/node_modules/@fps-games/editor-core/dist/editor-authoring-host.d.ts.map +1 -0
  180. package/node_modules/@fps-games/editor-core/dist/editor-authoring-host.js +1211 -0
  181. package/node_modules/@fps-games/editor-core/dist/editor-authoring-host.js.map +1 -0
  182. package/node_modules/@fps-games/editor-core/dist/editor-command-capability-adapter.d.ts +34 -0
  183. package/node_modules/@fps-games/editor-core/dist/editor-command-capability-adapter.d.ts.map +1 -0
  184. package/node_modules/@fps-games/editor-core/dist/editor-command-capability-adapter.js +260 -0
  185. package/node_modules/@fps-games/editor-core/dist/editor-command-capability-adapter.js.map +1 -0
  186. package/node_modules/@fps-games/editor-core/dist/editor-command-composed-authority.d.ts +9 -0
  187. package/node_modules/@fps-games/editor-core/dist/editor-command-composed-authority.d.ts.map +1 -0
  188. package/node_modules/@fps-games/editor-core/dist/editor-command-composed-authority.js +14 -0
  189. package/node_modules/@fps-games/editor-core/dist/editor-command-composed-authority.js.map +1 -0
  190. package/node_modules/@fps-games/editor-core/dist/editor-command-observability.d.ts +18 -0
  191. package/node_modules/@fps-games/editor-core/dist/editor-command-observability.d.ts.map +1 -0
  192. package/node_modules/@fps-games/editor-core/dist/editor-command-observability.js +113 -0
  193. package/node_modules/@fps-games/editor-core/dist/editor-command-observability.js.map +1 -0
  194. package/node_modules/@fps-games/editor-core/dist/editor-command-system.d.ts +82 -0
  195. package/node_modules/@fps-games/editor-core/dist/editor-command-system.d.ts.map +1 -0
  196. package/node_modules/@fps-games/editor-core/dist/editor-command-system.js +1098 -0
  197. package/node_modules/@fps-games/editor-core/dist/editor-command-system.js.map +1 -0
  198. package/node_modules/@fps-games/editor-core/dist/editor-plugin-host.d.ts +6 -7
  199. package/node_modules/@fps-games/editor-core/dist/editor-plugin-host.d.ts.map +1 -1
  200. package/node_modules/@fps-games/editor-core/dist/editor-plugin-host.js +62 -103
  201. package/node_modules/@fps-games/editor-core/dist/editor-plugin-host.js.map +1 -1
  202. package/node_modules/@fps-games/editor-core/dist/editor-service-gateway.d.ts +30 -0
  203. package/node_modules/@fps-games/editor-core/dist/editor-service-gateway.d.ts.map +1 -0
  204. package/node_modules/@fps-games/editor-core/dist/editor-service-gateway.js +540 -0
  205. package/node_modules/@fps-games/editor-core/dist/editor-service-gateway.js.map +1 -0
  206. package/node_modules/@fps-games/editor-core/dist/editor-session-authority.d.ts +9 -0
  207. package/node_modules/@fps-games/editor-core/dist/editor-session-authority.d.ts.map +1 -0
  208. package/node_modules/@fps-games/editor-core/dist/editor-session-authority.js +61 -0
  209. package/node_modules/@fps-games/editor-core/dist/editor-session-authority.js.map +1 -0
  210. package/node_modules/@fps-games/editor-core/dist/editor-session.d.ts +55 -0
  211. package/node_modules/@fps-games/editor-core/dist/editor-session.d.ts.map +1 -1
  212. package/node_modules/@fps-games/editor-core/dist/editor-session.js +247 -6
  213. package/node_modules/@fps-games/editor-core/dist/editor-session.js.map +1 -1
  214. package/node_modules/@fps-games/editor-core/dist/index.d.ts +6 -2
  215. package/node_modules/@fps-games/editor-core/dist/index.d.ts.map +1 -1
  216. package/node_modules/@fps-games/editor-core/dist/index.js +6 -2
  217. package/node_modules/@fps-games/editor-core/dist/index.js.map +1 -1
  218. package/node_modules/@fps-games/editor-core/package.json +6 -6
  219. package/node_modules/@fps-games/editor-forge-play/dist/index.d.ts +0 -1
  220. package/node_modules/@fps-games/editor-forge-play/dist/index.d.ts.map +1 -1
  221. package/node_modules/@fps-games/editor-forge-play/dist/index.js +0 -1
  222. package/node_modules/@fps-games/editor-forge-play/dist/index.js.map +1 -1
  223. package/node_modules/@fps-games/editor-forge-play/package.json +2 -2
  224. package/node_modules/@fps-games/editor-playable-sdk/dist/bridge-command/protocol.d.ts +2 -0
  225. package/node_modules/@fps-games/editor-playable-sdk/dist/bridge-command/protocol.d.ts.map +1 -1
  226. package/node_modules/@fps-games/editor-playable-sdk/dist/document/helpers.d.ts.map +1 -1
  227. package/node_modules/@fps-games/editor-playable-sdk/dist/document/helpers.js +41 -1
  228. package/node_modules/@fps-games/editor-playable-sdk/dist/document/helpers.js.map +1 -1
  229. package/node_modules/@fps-games/editor-playable-sdk/dist/local-harness/forge-play-types.d.ts +27 -1
  230. package/node_modules/@fps-games/editor-playable-sdk/dist/local-harness/forge-play-types.d.ts.map +1 -1
  231. package/node_modules/@fps-games/editor-playable-sdk/dist/local-harness/forge-play-types.js.map +1 -1
  232. package/node_modules/@fps-games/editor-playable-sdk/dist/local-harness/forge-play.d.ts +2 -0
  233. package/node_modules/@fps-games/editor-playable-sdk/dist/local-harness/forge-play.d.ts.map +1 -1
  234. package/node_modules/@fps-games/editor-playable-sdk/dist/local-harness/forge-play.js +214 -7
  235. package/node_modules/@fps-games/editor-playable-sdk/dist/local-harness/forge-play.js.map +1 -1
  236. package/node_modules/@fps-games/editor-playable-sdk/dist/local-harness/host-controller.d.ts +1 -0
  237. package/node_modules/@fps-games/editor-playable-sdk/dist/local-harness/host-controller.d.ts.map +1 -1
  238. package/node_modules/@fps-games/editor-playable-sdk/dist/local-harness/host-controller.js +11 -3
  239. package/node_modules/@fps-games/editor-playable-sdk/dist/local-harness/host-controller.js.map +1 -1
  240. package/node_modules/@fps-games/editor-playable-sdk/dist/local-harness/index.d.ts +2 -4
  241. package/node_modules/@fps-games/editor-playable-sdk/dist/local-harness/index.d.ts.map +1 -1
  242. package/node_modules/@fps-games/editor-playable-sdk/dist/local-harness/index.js +0 -1
  243. package/node_modules/@fps-games/editor-playable-sdk/dist/local-harness/index.js.map +1 -1
  244. package/node_modules/@fps-games/editor-playable-sdk/dist/local-harness/lifecycle.d.ts.map +1 -1
  245. package/node_modules/@fps-games/editor-playable-sdk/dist/local-harness/lifecycle.js +77 -31
  246. package/node_modules/@fps-games/editor-playable-sdk/dist/local-harness/lifecycle.js.map +1 -1
  247. package/node_modules/@fps-games/editor-playable-sdk/dist/local-harness/types.d.ts +8 -1
  248. package/node_modules/@fps-games/editor-playable-sdk/dist/local-harness/types.d.ts.map +1 -1
  249. package/node_modules/@fps-games/editor-playable-sdk/dist/local-harness/types.js.map +1 -1
  250. package/node_modules/@fps-games/editor-playable-sdk/dist/material-binding/asset-fields.d.ts +21 -1
  251. package/node_modules/@fps-games/editor-playable-sdk/dist/material-binding/asset-fields.d.ts.map +1 -1
  252. package/node_modules/@fps-games/editor-playable-sdk/dist/material-binding/asset-fields.js +90 -4
  253. package/node_modules/@fps-games/editor-playable-sdk/dist/material-binding/asset-fields.js.map +1 -1
  254. package/node_modules/@fps-games/editor-playable-sdk/dist/material-binding/binding.d.ts +27 -1
  255. package/node_modules/@fps-games/editor-playable-sdk/dist/material-binding/binding.d.ts.map +1 -1
  256. package/node_modules/@fps-games/editor-playable-sdk/dist/material-binding/binding.js +161 -1
  257. package/node_modules/@fps-games/editor-playable-sdk/dist/material-binding/binding.js.map +1 -1
  258. package/node_modules/@fps-games/editor-playable-sdk/dist/material-binding/inspector.d.ts +2 -2
  259. package/node_modules/@fps-games/editor-playable-sdk/dist/material-binding/inspector.d.ts.map +1 -1
  260. package/node_modules/@fps-games/editor-playable-sdk/dist/material-binding/inspector.js +5 -92
  261. package/node_modules/@fps-games/editor-playable-sdk/dist/material-binding/inspector.js.map +1 -1
  262. package/node_modules/@fps-games/editor-playable-sdk/dist/material-binding/scene-inspector.d.ts +7 -0
  263. package/node_modules/@fps-games/editor-playable-sdk/dist/material-binding/scene-inspector.d.ts.map +1 -1
  264. package/node_modules/@fps-games/editor-playable-sdk/dist/material-binding/scene-inspector.js +26 -9
  265. package/node_modules/@fps-games/editor-playable-sdk/dist/material-binding/scene-inspector.js.map +1 -1
  266. package/node_modules/@fps-games/editor-playable-sdk/dist/material-binding/slot-inspector.d.ts +9 -0
  267. package/node_modules/@fps-games/editor-playable-sdk/dist/material-binding/slot-inspector.d.ts.map +1 -1
  268. package/node_modules/@fps-games/editor-playable-sdk/dist/material-binding/slot-inspector.js +19 -8
  269. package/node_modules/@fps-games/editor-playable-sdk/dist/material-binding/slot-inspector.js.map +1 -1
  270. package/node_modules/@fps-games/editor-playable-sdk/dist/prefab-stage/material-override-inspector.d.ts +5 -0
  271. package/node_modules/@fps-games/editor-playable-sdk/dist/prefab-stage/material-override-inspector.d.ts.map +1 -1
  272. package/node_modules/@fps-games/editor-playable-sdk/dist/prefab-stage/material-override-inspector.js +16 -4
  273. package/node_modules/@fps-games/editor-playable-sdk/dist/prefab-stage/material-override-inspector.js.map +1 -1
  274. package/node_modules/@fps-games/editor-playable-sdk/dist/prefab-stage/stage-inspector.d.ts +9 -0
  275. package/node_modules/@fps-games/editor-playable-sdk/dist/prefab-stage/stage-inspector.d.ts.map +1 -1
  276. package/node_modules/@fps-games/editor-playable-sdk/dist/prefab-stage/stage-inspector.js +12 -2
  277. package/node_modules/@fps-games/editor-playable-sdk/dist/prefab-stage/stage-inspector.js.map +1 -1
  278. package/node_modules/@fps-games/editor-playable-sdk/dist/product/ground-decal.d.ts +2 -1
  279. package/node_modules/@fps-games/editor-playable-sdk/dist/product/ground-decal.d.ts.map +1 -1
  280. package/node_modules/@fps-games/editor-playable-sdk/dist/product/ground-decal.js +10 -5
  281. package/node_modules/@fps-games/editor-playable-sdk/dist/product/ground-decal.js.map +1 -1
  282. package/node_modules/@fps-games/editor-playable-sdk/dist/product/index.d.ts +1 -0
  283. package/node_modules/@fps-games/editor-playable-sdk/dist/product/index.d.ts.map +1 -1
  284. package/node_modules/@fps-games/editor-playable-sdk/dist/product/index.js +1 -0
  285. package/node_modules/@fps-games/editor-playable-sdk/dist/product/index.js.map +1 -1
  286. package/node_modules/@fps-games/editor-playable-sdk/dist/product/project-host-services.d.ts +17 -82
  287. package/node_modules/@fps-games/editor-playable-sdk/dist/product/project-host-services.d.ts.map +1 -1
  288. package/node_modules/@fps-games/editor-playable-sdk/dist/product/project-host-services.js +53 -57
  289. package/node_modules/@fps-games/editor-playable-sdk/dist/product/project-host-services.js.map +1 -1
  290. package/node_modules/@fps-games/editor-playable-sdk/dist/product/scene-session.d.ts.map +1 -1
  291. package/node_modules/@fps-games/editor-playable-sdk/dist/product/scene-session.js +3 -2
  292. package/node_modules/@fps-games/editor-playable-sdk/dist/product/scene-session.js.map +1 -1
  293. package/node_modules/@fps-games/editor-playable-sdk/dist/product/standard-authoring-commands.d.ts +10 -0
  294. package/node_modules/@fps-games/editor-playable-sdk/dist/product/standard-authoring-commands.d.ts.map +1 -0
  295. package/node_modules/@fps-games/editor-playable-sdk/dist/product/standard-authoring-commands.js +256 -0
  296. package/node_modules/@fps-games/editor-playable-sdk/dist/product/standard-authoring-commands.js.map +1 -0
  297. package/node_modules/@fps-games/editor-playable-sdk/dist/product/standard-scene-assembly.d.ts.map +1 -1
  298. package/node_modules/@fps-games/editor-playable-sdk/dist/product/standard-scene-assembly.js +7 -5
  299. package/node_modules/@fps-games/editor-playable-sdk/dist/product/standard-scene-assembly.js.map +1 -1
  300. package/node_modules/@fps-games/editor-playable-sdk/dist/scene-source/client.d.ts.map +1 -1
  301. package/node_modules/@fps-games/editor-playable-sdk/dist/scene-source/client.js +8 -0
  302. package/node_modules/@fps-games/editor-playable-sdk/dist/scene-source/client.js.map +1 -1
  303. package/node_modules/@fps-games/editor-playable-sdk/dist/scene-source/types.d.ts +1 -0
  304. package/node_modules/@fps-games/editor-playable-sdk/dist/scene-source/types.d.ts.map +1 -1
  305. package/node_modules/@fps-games/editor-playable-sdk/dist/scene-source/types.js.map +1 -1
  306. package/node_modules/@fps-games/editor-playable-sdk/dist/upgrade-doctor/inspectors.js +134 -12
  307. package/node_modules/@fps-games/editor-playable-sdk/dist/upgrade-doctor/inspectors.js.map +1 -1
  308. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/editor-scene-workflow.d.ts.map +1 -1
  309. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/editor-scene-workflow.js +47 -0
  310. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/editor-scene-workflow.js.map +1 -1
  311. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/editor-service-vite.d.ts +27 -0
  312. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/editor-service-vite.d.ts.map +1 -0
  313. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/editor-service-vite.js +592 -0
  314. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/editor-service-vite.js.map +1 -0
  315. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/index.d.ts +3 -1
  316. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/index.d.ts.map +1 -1
  317. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/index.js +2 -1
  318. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/index.js.map +1 -1
  319. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/plugin.d.ts.map +1 -1
  320. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/plugin.js +61 -6
  321. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/plugin.js.map +1 -1
  322. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/product-adapter.d.ts +0 -2
  323. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/product-adapter.d.ts.map +1 -1
  324. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/product-adapter.js +1 -10
  325. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/product-adapter.js.map +1 -1
  326. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/product-authoring-api.d.ts.map +1 -1
  327. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/product-authoring-api.js +21 -0
  328. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/product-authoring-api.js.map +1 -1
  329. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/project-authoring-backend.d.ts +13 -0
  330. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/project-authoring-backend.d.ts.map +1 -0
  331. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/project-authoring-backend.js +18 -0
  332. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/project-authoring-backend.js.map +1 -0
  333. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/project-editor-service.d.ts +28 -0
  334. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/project-editor-service.d.ts.map +1 -0
  335. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/project-editor-service.js +863 -0
  336. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/project-editor-service.js.map +1 -0
  337. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/types.d.ts +2 -0
  338. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/types.d.ts.map +1 -1
  339. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/types.js.map +1 -1
  340. package/node_modules/@fps-games/editor-playable-sdk/package.json +6 -6
  341. package/node_modules/@fps-games/editor-protocol/dist/editor-command-capabilities.d.ts +1626 -0
  342. package/node_modules/@fps-games/editor-protocol/dist/editor-command-capabilities.d.ts.map +1 -0
  343. package/node_modules/@fps-games/editor-protocol/dist/{agent-bridge.js → editor-command-capabilities.js} +766 -620
  344. package/node_modules/@fps-games/editor-protocol/dist/editor-command-capabilities.js.map +1 -0
  345. package/node_modules/@fps-games/editor-protocol/dist/editor-command-trace.d.ts +69 -0
  346. package/node_modules/@fps-games/editor-protocol/dist/editor-command-trace.d.ts.map +1 -0
  347. package/node_modules/@fps-games/editor-protocol/dist/editor-command-trace.js +22 -0
  348. package/node_modules/@fps-games/editor-protocol/dist/editor-command-trace.js.map +1 -0
  349. package/node_modules/@fps-games/editor-protocol/dist/editor-command.d.ts +136 -0
  350. package/node_modules/@fps-games/editor-protocol/dist/editor-command.d.ts.map +1 -0
  351. package/node_modules/@fps-games/editor-protocol/dist/editor-command.js +2 -0
  352. package/node_modules/@fps-games/editor-protocol/dist/editor-command.js.map +1 -0
  353. package/node_modules/@fps-games/editor-protocol/dist/editor-service.d.ts +225 -0
  354. package/node_modules/@fps-games/editor-protocol/dist/editor-service.d.ts.map +1 -0
  355. package/node_modules/@fps-games/editor-protocol/dist/editor-service.js +4 -0
  356. package/node_modules/@fps-games/editor-protocol/dist/editor-service.js.map +1 -0
  357. package/node_modules/@fps-games/editor-protocol/dist/index.d.ts +6 -3
  358. package/node_modules/@fps-games/editor-protocol/dist/index.d.ts.map +1 -1
  359. package/node_modules/@fps-games/editor-protocol/dist/index.js +6 -3
  360. package/node_modules/@fps-games/editor-protocol/dist/index.js.map +1 -1
  361. package/node_modules/@fps-games/editor-protocol/package.json +2 -2
  362. package/node_modules/@fps-games/editor-tooling/package.json +3 -3
  363. package/node_modules/@fps-games/editor-ui/package.json +1 -1
  364. package/node_modules/@fps-games/playable-assets/package.json +1 -1
  365. package/node_modules/@fps-games/playable-contracts/package.json +1 -1
  366. package/node_modules/@fps-games/playable-rendering/package.json +2 -2
  367. package/node_modules/@fps-games/playable-runtime/package.json +12 -12
  368. package/node_modules/@fps-games/playable-runtime-data/package.json +4 -4
  369. package/node_modules/@fps-games/playable-scene/package.json +2 -2
  370. package/node_modules/@fps-games/plugin-api/package.json +1 -1
  371. package/node_modules/@fps-games/plugin-assets/dist/version.d.ts +1 -1
  372. package/node_modules/@fps-games/plugin-assets/dist/version.js +1 -1
  373. package/node_modules/@fps-games/plugin-assets/dist/version.js.map +1 -1
  374. package/node_modules/@fps-games/plugin-assets/package.json +6 -6
  375. package/node_modules/@fps-games/plugin-hierarchy/dist/kernel.d.ts +1 -0
  376. package/node_modules/@fps-games/plugin-hierarchy/dist/kernel.d.ts.map +1 -1
  377. package/node_modules/@fps-games/plugin-hierarchy/dist/kernel.js +78 -4
  378. package/node_modules/@fps-games/plugin-hierarchy/dist/kernel.js.map +1 -1
  379. package/node_modules/@fps-games/plugin-hierarchy/dist/version.d.ts +1 -1
  380. package/node_modules/@fps-games/plugin-hierarchy/dist/version.js +1 -1
  381. package/node_modules/@fps-games/plugin-hierarchy/dist/version.js.map +1 -1
  382. package/node_modules/@fps-games/plugin-hierarchy/package.json +5 -5
  383. package/node_modules/@fps-games/plugin-host/package.json +2 -2
  384. package/node_modules/@fps-games/plugin-markers/dist/version.d.ts +1 -1
  385. package/node_modules/@fps-games/plugin-markers/dist/version.js +1 -1
  386. package/node_modules/@fps-games/plugin-markers/dist/version.js.map +1 -1
  387. package/node_modules/@fps-games/plugin-markers/package.json +5 -5
  388. package/node_modules/@fps-games/plugin-materials/dist/version.d.ts +1 -1
  389. package/node_modules/@fps-games/plugin-materials/dist/version.js +1 -1
  390. package/node_modules/@fps-games/plugin-materials/dist/version.js.map +1 -1
  391. package/node_modules/@fps-games/plugin-materials/package.json +5 -5
  392. package/node_modules/@fps-games/plugin-rendering/dist/version.d.ts +1 -1
  393. package/node_modules/@fps-games/plugin-rendering/dist/version.js +1 -1
  394. package/node_modules/@fps-games/plugin-rendering/dist/version.js.map +1 -1
  395. package/node_modules/@fps-games/plugin-rendering/package.json +5 -5
  396. package/node_modules/@fps-games/plugin-scene/dist/version.d.ts +1 -1
  397. package/node_modules/@fps-games/plugin-scene/dist/version.js +1 -1
  398. package/node_modules/@fps-games/plugin-scene/dist/version.js.map +1 -1
  399. package/node_modules/@fps-games/plugin-scene/package.json +5 -5
  400. package/node_modules/@fps-games/plugin-shadow-map-experiment/dist/version.d.ts +1 -1
  401. package/node_modules/@fps-games/plugin-shadow-map-experiment/dist/version.js +1 -1
  402. package/node_modules/@fps-games/plugin-shadow-map-experiment/dist/version.js.map +1 -1
  403. package/node_modules/@fps-games/plugin-shadow-map-experiment/package.json +5 -5
  404. package/node_modules/@fps-games/plugin-shadows/dist/version.d.ts +1 -1
  405. package/node_modules/@fps-games/plugin-shadows/dist/version.js +1 -1
  406. package/node_modules/@fps-games/plugin-shadows/dist/version.js.map +1 -1
  407. package/node_modules/@fps-games/plugin-shadows/package.json +7 -7
  408. package/package.json +23 -23
  409. package/dist/agent-bridge/capabilities/assets.d.ts +0 -8
  410. package/dist/agent-bridge/capabilities/assets.d.ts.map +0 -1
  411. package/dist/agent-bridge/capabilities/assets.js.map +0 -1
  412. package/dist/agent-bridge/capabilities/editor-state.d.ts +0 -5
  413. package/dist/agent-bridge/capabilities/editor-state.d.ts.map +0 -1
  414. package/dist/agent-bridge/capabilities/editor-state.js.map +0 -1
  415. package/dist/agent-bridge/capabilities/hierarchy.d.ts +0 -4
  416. package/dist/agent-bridge/capabilities/hierarchy.d.ts.map +0 -1
  417. package/dist/agent-bridge/capabilities/hierarchy.js.map +0 -1
  418. package/dist/agent-bridge/capabilities/host-lifecycle.d.ts +0 -11
  419. package/dist/agent-bridge/capabilities/host-lifecycle.d.ts.map +0 -1
  420. package/dist/agent-bridge/capabilities/host-lifecycle.js +0 -149
  421. package/dist/agent-bridge/capabilities/host-lifecycle.js.map +0 -1
  422. package/dist/agent-bridge/capabilities/prefabs.d.ts +0 -5
  423. package/dist/agent-bridge/capabilities/prefabs.d.ts.map +0 -1
  424. package/dist/agent-bridge/capabilities/prefabs.js.map +0 -1
  425. package/dist/agent-bridge/capabilities/scene-objects.d.ts +0 -8
  426. package/dist/agent-bridge/capabilities/scene-objects.d.ts.map +0 -1
  427. package/dist/agent-bridge/capabilities/scene-objects.js +0 -480
  428. package/dist/agent-bridge/capabilities/scene-objects.js.map +0 -1
  429. package/dist/agent-bridge/capabilities/selection.d.ts +0 -5
  430. package/dist/agent-bridge/capabilities/selection.d.ts.map +0 -1
  431. package/dist/agent-bridge/capabilities/selection.js +0 -60
  432. package/dist/agent-bridge/capabilities/selection.js.map +0 -1
  433. package/dist/agent-bridge/capabilities/shadows.d.ts +0 -5
  434. package/dist/agent-bridge/capabilities/shadows.d.ts.map +0 -1
  435. package/dist/agent-bridge/capabilities/shadows.js.map +0 -1
  436. package/dist/agent-bridge/capabilities/transform.d.ts +0 -5
  437. package/dist/agent-bridge/capabilities/transform.d.ts.map +0 -1
  438. package/dist/agent-bridge/capabilities/transform.js +0 -164
  439. package/dist/agent-bridge/capabilities/transform.js.map +0 -1
  440. package/dist/agent-bridge/capabilities/ui-regions.d.ts +0 -4
  441. package/dist/agent-bridge/capabilities/ui-regions.d.ts.map +0 -1
  442. package/dist/agent-bridge/capabilities/ui-regions.js.map +0 -1
  443. package/dist/agent-bridge/capabilities/viewport.d.ts +0 -5
  444. package/dist/agent-bridge/capabilities/viewport.d.ts.map +0 -1
  445. package/dist/agent-bridge/capabilities/viewport.js.map +0 -1
  446. package/dist/agent-bridge/capability-sources.d.ts +0 -7
  447. package/dist/agent-bridge/capability-sources.d.ts.map +0 -1
  448. package/dist/agent-bridge/capability-sources.js +0 -34
  449. package/dist/agent-bridge/capability-sources.js.map +0 -1
  450. package/dist/agent-bridge/diagnostics.d.ts +0 -12
  451. package/dist/agent-bridge/diagnostics.d.ts.map +0 -1
  452. package/dist/agent-bridge/diagnostics.js.map +0 -1
  453. package/dist/agent-bridge/index.d.ts.map +0 -1
  454. package/dist/agent-bridge/index.js.map +0 -1
  455. package/dist/agent-bridge/register.d.ts +0 -4
  456. package/dist/agent-bridge/register.d.ts.map +0 -1
  457. package/dist/agent-bridge/register.js.map +0 -1
  458. package/dist/agent-bridge/shared.d.ts.map +0 -1
  459. package/dist/agent-bridge/shared.js.map +0 -1
  460. package/dist/agent-bridge/source-types.d.ts +0 -110
  461. package/dist/agent-bridge/source-types.d.ts.map +0 -1
  462. package/dist/agent-bridge/source-types.js.map +0 -1
  463. package/dist/editor-plugin-agent-capabilities.d.ts +0 -4
  464. package/dist/editor-plugin-agent-capabilities.d.ts.map +0 -1
  465. package/dist/editor-plugin-agent-capabilities.js +0 -64
  466. package/dist/editor-plugin-agent-capabilities.js.map +0 -1
  467. package/dist/local-editor-agent-actions.d.ts +0 -43
  468. package/dist/local-editor-agent-actions.d.ts.map +0 -1
  469. package/dist/local-editor-agent-actions.js +0 -321
  470. package/dist/local-editor-agent-actions.js.map +0 -1
  471. package/dist/local-editor-agent-bridge-transport.d.ts +0 -129
  472. package/dist/local-editor-agent-bridge-transport.d.ts.map +0 -1
  473. package/dist/local-editor-agent-bridge-transport.js +0 -403
  474. package/dist/local-editor-agent-bridge-transport.js.map +0 -1
  475. package/dist/local-editor-agent-bridge.d.ts +0 -2
  476. package/dist/local-editor-agent-bridge.d.ts.map +0 -1
  477. package/dist/local-editor-agent-bridge.js +0 -2
  478. package/dist/local-editor-agent-bridge.js.map +0 -1
  479. package/dist/local-editor-agent-context.d.ts +0 -68
  480. package/dist/local-editor-agent-context.d.ts.map +0 -1
  481. package/dist/local-editor-agent-context.js +0 -716
  482. package/dist/local-editor-agent-context.js.map +0 -1
  483. package/node_modules/@fps-games/editor-core/dist/agent-bridge.d.ts +0 -22
  484. package/node_modules/@fps-games/editor-core/dist/agent-bridge.d.ts.map +0 -1
  485. package/node_modules/@fps-games/editor-core/dist/agent-bridge.js +0 -106
  486. package/node_modules/@fps-games/editor-core/dist/agent-bridge.js.map +0 -1
  487. package/node_modules/@fps-games/editor-core/dist/agent-interaction.d.ts +0 -17
  488. package/node_modules/@fps-games/editor-core/dist/agent-interaction.d.ts.map +0 -1
  489. package/node_modules/@fps-games/editor-core/dist/agent-interaction.js +0 -14
  490. package/node_modules/@fps-games/editor-core/dist/agent-interaction.js.map +0 -1
  491. package/node_modules/@fps-games/editor-forge-play/dist/agent-transport.d.ts +0 -23
  492. package/node_modules/@fps-games/editor-forge-play/dist/agent-transport.d.ts.map +0 -1
  493. package/node_modules/@fps-games/editor-forge-play/dist/agent-transport.js +0 -47
  494. package/node_modules/@fps-games/editor-forge-play/dist/agent-transport.js.map +0 -1
  495. package/node_modules/@fps-games/editor-playable-sdk/dist/local-harness/agent-descriptions.d.ts +0 -112
  496. package/node_modules/@fps-games/editor-playable-sdk/dist/local-harness/agent-descriptions.d.ts.map +0 -1
  497. package/node_modules/@fps-games/editor-playable-sdk/dist/local-harness/agent-descriptions.js +0 -159
  498. package/node_modules/@fps-games/editor-playable-sdk/dist/local-harness/agent-descriptions.js.map +0 -1
  499. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/session-metadata.d.ts +0 -15
  500. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/session-metadata.d.ts.map +0 -1
  501. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/session-metadata.js +0 -76
  502. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/session-metadata.js.map +0 -1
  503. package/node_modules/@fps-games/editor-protocol/dist/agent-bridge.d.ts +0 -1622
  504. package/node_modules/@fps-games/editor-protocol/dist/agent-bridge.d.ts.map +0 -1
  505. package/node_modules/@fps-games/editor-protocol/dist/agent-bridge.js.map +0 -1
  506. package/node_modules/@fps-games/editor-protocol/dist/agent-trace.d.ts +0 -68
  507. package/node_modules/@fps-games/editor-protocol/dist/agent-trace.d.ts.map +0 -1
  508. package/node_modules/@fps-games/editor-protocol/dist/agent-trace.js +0 -23
  509. package/node_modules/@fps-games/editor-protocol/dist/agent-trace.js.map +0 -1
  510. package/node_modules/@fps-games/editor-protocol/dist/agent.d.ts +0 -187
  511. package/node_modules/@fps-games/editor-protocol/dist/agent.d.ts.map +0 -1
  512. package/node_modules/@fps-games/editor-protocol/dist/agent.js +0 -5
  513. package/node_modules/@fps-games/editor-protocol/dist/agent.js.map +0 -1
  514. /package/dist/{agent-bridge → editor-commands}/source-types.js +0 -0
@@ -0,0 +1,540 @@
1
+ import { EDITOR_SERVICE_PROTOCOL_VERSION, } from '@fps-games/editor-protocol';
2
+ const DEFAULT_CATALOG_PAGE_SIZE = 100;
3
+ const DEFAULT_TRACE_PAGE_SIZE = 100;
4
+ const DEFAULT_MAX_BROWSER_ATTACHMENTS = 32;
5
+ const MAX_LONG_POLL_MS = 30000;
6
+ export function createEditorServiceGateway(options) {
7
+ const host = options.host;
8
+ const now = options.now ?? Date.now;
9
+ const maxCatalogPageSize = normalizePositiveInteger(options.maxCatalogPageSize, DEFAULT_CATALOG_PAGE_SIZE);
10
+ const maxTracePageSize = normalizePositiveInteger(options.maxTracePageSize, DEFAULT_TRACE_PAGE_SIZE);
11
+ const maxBrowserAttachments = normalizePositiveInteger(options.maxBrowserAttachments, DEFAULT_MAX_BROWSER_ATTACHMENTS);
12
+ const browserAttachmentLeaseMs = normalizePositiveInteger(options.browserAttachmentLeaseMs, 40000);
13
+ const browserOperationTimeoutMs = normalizePositiveInteger(options.browserOperationTimeoutMs, 30000);
14
+ const attachments = new Map();
15
+ const forwardedCommands = new Map();
16
+ let disposed = false;
17
+ const leaseTimer = setInterval(expireStaleAttachments, Math.min(1000, Math.max(25, Math.floor(browserAttachmentLeaseMs / 2))));
18
+ leaseTimer.unref?.();
19
+ return Object.freeze({
20
+ serviceInstanceId: host.serviceInstanceId,
21
+ async handle(request, tokenScopes = ['read', 'write']) {
22
+ if (disposed)
23
+ return failure('service.disposed', 'Editor Service Gateway is disposed.');
24
+ expireStaleAttachments();
25
+ if (!request || typeof request !== 'object' || typeof request.kind !== 'string') {
26
+ return failure('request.invalid', 'Editor Service Gateway request is invalid.');
27
+ }
28
+ try {
29
+ switch (request.kind) {
30
+ case 'status':
31
+ return { ok: true, kind: 'status', status: createStatus() };
32
+ case 'commands.list':
33
+ return { ok: true, kind: 'commands', page: await readCatalogPage('', request.cursor, request.limit) };
34
+ case 'commands.search':
35
+ return { ok: true, kind: 'commands', page: await readCatalogPage(request.query, request.cursor, request.limit) };
36
+ case 'commands.describe':
37
+ return { ok: true, kind: 'command', command: await describeGatewayCommand(request.commandId) };
38
+ case 'command.invoke':
39
+ return invokeCommand(request.invocation, request.timeoutMs, tokenScopes);
40
+ case 'operation.get':
41
+ return { ok: true, kind: 'operation', operation: host.commandSystem.getOperation(request.operationId) };
42
+ case 'operation.cancel':
43
+ if (forwardedCommands.get(request.operationId)?.dispatched) {
44
+ return {
45
+ ok: true,
46
+ kind: 'cancel',
47
+ cancelled: false,
48
+ operation: host.commandSystem.getOperation(request.operationId),
49
+ };
50
+ }
51
+ return {
52
+ ok: true,
53
+ kind: 'cancel',
54
+ cancelled: host.commandSystem.cancelOperation(request.operationId),
55
+ operation: host.commandSystem.getOperation(request.operationId),
56
+ };
57
+ case 'trace.get': {
58
+ const limit = normalizeLimit(request.limit, maxTracePageSize);
59
+ const page = options.readTraces
60
+ ? await options.readTraces({ traceId: request.traceId, cursor: request.cursor, limit })
61
+ : { traces: [] };
62
+ return { ok: true, kind: 'traces', page };
63
+ }
64
+ case 'authoring.snapshot':
65
+ return {
66
+ ok: true,
67
+ kind: 'authoring.snapshot',
68
+ result: (request.afterEventCursor === undefined
69
+ ? { kind: 'snapshot-required', reason: 'cursor.invalid', snapshot: host.getSnapshot() }
70
+ : host.readEvents(request.afterEventCursor, request.serviceInstanceId)),
71
+ };
72
+ case 'document.export.get':
73
+ return {
74
+ ok: true,
75
+ kind: 'document.export',
76
+ artifact: options.readDocumentExport
77
+ ? await options.readDocumentExport(normalizeId(request.transactionId, 'transactionId'))
78
+ : null,
79
+ };
80
+ case 'attachment.register':
81
+ return registerAttachment(request.attachment);
82
+ case 'attachment.poll':
83
+ return pollAttachment(request.attachmentId, request.timeoutMs);
84
+ case 'attachment.result':
85
+ return acceptAttachmentResult(request.attachmentId, request.result);
86
+ case 'attachment.unregister':
87
+ return unregisterAttachment(request.attachmentId);
88
+ default:
89
+ return failure('request.unknown', 'Editor Service Gateway request kind is unknown.');
90
+ }
91
+ }
92
+ catch (error) {
93
+ return failure('request.failed', error instanceof Error ? error.message : String(error));
94
+ }
95
+ },
96
+ forwardBrowserCommand,
97
+ dispose() {
98
+ if (disposed)
99
+ return;
100
+ disposed = true;
101
+ clearInterval(leaseTimer);
102
+ for (const attachment of attachments.values())
103
+ disconnectAttachment(attachment, 'attachment.disconnected');
104
+ attachments.clear();
105
+ for (const command of forwardedCommands.values()) {
106
+ settleForwardedCommand(command, {
107
+ ok: false,
108
+ diagnostics: [diagnostic('service.disposed', 'Editor Service Gateway is disposed.')],
109
+ });
110
+ }
111
+ forwardedCommands.clear();
112
+ },
113
+ });
114
+ function createStatus() {
115
+ const snapshot = host.getSnapshot();
116
+ return {
117
+ ok: true,
118
+ protocolVersion: EDITOR_SERVICE_PROTOCOL_VERSION,
119
+ serviceInstanceId: host.serviceInstanceId,
120
+ canonicalProjectRoot: options.canonicalProjectRoot,
121
+ packageVersion: options.packageVersion,
122
+ buildKey: options.buildKey,
123
+ startedAt: options.startedAt,
124
+ documentRevision: snapshot.documentRevision,
125
+ catalogRevision: host.commandSystem.catalogRevision,
126
+ dirty: snapshot.dirty,
127
+ browserAttachmentCount: attachments.size,
128
+ browserAttachments: [...attachments.values()]
129
+ .filter(attachment => attachment.connected)
130
+ .map(attachment => ({
131
+ attachmentId: attachment.registration.attachmentId,
132
+ ...(attachment.registration.label ? { label: attachment.registration.label } : {}),
133
+ targets: attachment.registration.targets,
134
+ commandCount: attachment.registration.commandIds.length,
135
+ }))
136
+ .sort((left, right) => left.attachmentId.localeCompare(right.attachmentId)),
137
+ recovery: {
138
+ draftJournal: false,
139
+ unsavedWorkingStateRecovered: false,
140
+ message: 'Service restart loads the last saved checkpoint; unsaved working state is not recoverable.',
141
+ },
142
+ };
143
+ }
144
+ async function readCatalogPage(query, cursor, requestedLimit) {
145
+ const normalizedQuery = typeof query === 'string' ? query.trim().toLocaleLowerCase() : '';
146
+ const catalogRevision = host.commandSystem.catalogRevision;
147
+ const offset = decodeCatalogCursor(cursor, catalogRevision, normalizedQuery);
148
+ const limit = normalizeLimit(requestedLimit, maxCatalogPageSize);
149
+ const manifests = host.commandSystem.listManifests()
150
+ .filter(manifest => matchesManifest(manifest, normalizedQuery))
151
+ .sort((left, right) => left.id.localeCompare(right.id));
152
+ const pageManifests = manifests.slice(offset, offset + limit);
153
+ const commands = (await Promise.all(pageManifests.map(manifest => (describeGatewayCommand(manifest.id))))).filter((entry) => entry !== null);
154
+ const nextOffset = offset + pageManifests.length;
155
+ return {
156
+ catalogRevision,
157
+ commands,
158
+ ...(nextOffset < manifests.length
159
+ ? { nextCursor: encodeCatalogCursor(catalogRevision, normalizedQuery, nextOffset) }
160
+ : {}),
161
+ };
162
+ }
163
+ async function describeGatewayCommand(commandId) {
164
+ const entry = await host.commandSystem.describeCommand(commandId);
165
+ if (!entry || (entry.manifest.target !== 'view' && entry.manifest.target !== 'renderer'))
166
+ return entry;
167
+ const target = entry.manifest.target;
168
+ const attached = [...attachments.values()].some(candidate => candidate.connected
169
+ && candidate.registration.targets.includes(target)
170
+ && candidate.registration.commandIds.includes(entry.manifest.id));
171
+ if (attached)
172
+ return entry;
173
+ return {
174
+ manifest: entry.manifest,
175
+ availability: {
176
+ available: false,
177
+ reasons: [diagnostic(`${target}.sessionUnavailable`, `No Browser attachment is available for ${entry.manifest.id}.`)],
178
+ },
179
+ };
180
+ }
181
+ async function invokeCommand(invocation, timeoutMs, tokenScopes) {
182
+ const capturedInvocation = cloneJson(invocation);
183
+ const expectedServiceInstanceId = capturedInvocation.expectedRevision?.serviceInstanceId;
184
+ if (expectedServiceInstanceId !== undefined && expectedServiceInstanceId !== host.serviceInstanceId) {
185
+ return failure('service.instanceConflict', `Editor Service instance changed: expected ${expectedServiceInstanceId}, current ${host.serviceInstanceId}.`);
186
+ }
187
+ const command = await host.commandSystem.describeCommand(capturedInvocation.commandId);
188
+ if (!command)
189
+ return failure('command.unknown', `Editor command is not registered: ${capturedInvocation.commandId}`);
190
+ if (command.manifest.access === 'write' && !tokenScopes.includes('write')) {
191
+ return failure('auth.writeScopeRequired', `Write scope is required: ${capturedInvocation.commandId}`);
192
+ }
193
+ const attachmentRequirement = validateInvocationAttachment(command.manifest, capturedInvocation.clientId);
194
+ if (attachmentRequirement)
195
+ return failure(attachmentRequirement.code, attachmentRequirement.message);
196
+ const handle = host.invoke(capturedInvocation);
197
+ const waitMs = normalizeTimeout(timeoutMs);
198
+ if (waitMs === 0) {
199
+ return { ok: true, kind: 'operation', operation: host.commandSystem.getOperation(handle.operationId) };
200
+ }
201
+ await waitForOperation(handle.completion, waitMs);
202
+ return { ok: true, kind: 'operation', operation: host.commandSystem.getOperation(handle.operationId) };
203
+ }
204
+ function validateInvocationAttachment(manifest, clientId) {
205
+ for (const target of ['view', 'renderer']) {
206
+ const required = target === 'view'
207
+ ? manifest.requires?.viewAttached === true
208
+ : manifest.requires?.rendererAttached === true;
209
+ if (!required)
210
+ continue;
211
+ const attachment = clientId ? attachments.get(clientId) : undefined;
212
+ const commandMatches = manifest.target !== target
213
+ || attachment?.registration.commandIds.includes(manifest.id) === true;
214
+ if (attachment?.connected
215
+ && attachment.registration.targets.includes(target)
216
+ && commandMatches)
217
+ continue;
218
+ return {
219
+ code: `${target}.sessionUnavailable`,
220
+ message: `The requested Browser attachment is unavailable for ${manifest.id}${clientId ? `: ${clientId}` : '.'}`,
221
+ };
222
+ }
223
+ return null;
224
+ }
225
+ function forwardBrowserCommand(context, target) {
226
+ const attachment = context.clientId ? attachments.get(context.clientId) : undefined;
227
+ if (!attachment) {
228
+ return Promise.resolve({
229
+ ok: false,
230
+ diagnostics: [diagnostic(`${target}.sessionUnavailable`, `No Browser attachment is available for ${context.commandId}.`)],
231
+ });
232
+ }
233
+ if (!attachment.connected
234
+ || !attachment.registration.targets.includes(target)
235
+ || !attachment.registration.commandIds.includes(context.commandId)) {
236
+ return Promise.resolve({
237
+ ok: false,
238
+ diagnostics: [diagnostic(`${target}.sessionUnavailable`, `The requested Browser attachment is unavailable for ${context.commandId}: ${context.clientId}.`)],
239
+ });
240
+ }
241
+ if (forwardedCommands.has(context.operationId)) {
242
+ return Promise.resolve({
243
+ ok: false,
244
+ diagnostics: [diagnostic('attachment.operationConflict', `Browser command is already forwarded: ${context.operationId}`)],
245
+ });
246
+ }
247
+ const request = {
248
+ requestId: context.requestId,
249
+ operationId: context.operationId,
250
+ invocation: snapshotHandlerInvocation(context),
251
+ };
252
+ return new Promise(resolve => {
253
+ const command = {
254
+ attachmentId: attachment.registration.attachmentId,
255
+ request,
256
+ resolve,
257
+ signal: context.signal,
258
+ onAbort: () => {
259
+ settleForwardedCommand(command, {
260
+ ok: false,
261
+ diagnostics: [diagnostic('command.cancelled', `Browser command was cancelled: ${context.commandId}`)],
262
+ });
263
+ },
264
+ dispatched: false,
265
+ settled: false,
266
+ };
267
+ forwardedCommands.set(context.operationId, command);
268
+ context.signal.addEventListener('abort', command.onAbort, { once: true });
269
+ command.timeout = setTimeout(() => {
270
+ settleForwardedCommand(command, {
271
+ ok: false,
272
+ diagnostics: [diagnostic('command.timeout', `Browser command timed out: ${context.commandId}`)],
273
+ });
274
+ }, browserOperationTimeoutMs);
275
+ command.timeout.unref?.();
276
+ attachment.operations.add(context.operationId);
277
+ const waiter = attachment.waiters.values().next().value;
278
+ if (waiter) {
279
+ attachment.waiters.delete(waiter);
280
+ command.dispatched = true;
281
+ waiter(cloneJson(request));
282
+ }
283
+ else {
284
+ attachment.queued.push(request);
285
+ }
286
+ });
287
+ }
288
+ function registerAttachment(registration) {
289
+ const normalized = normalizeAttachment(registration);
290
+ if (attachments.has(normalized.attachmentId)) {
291
+ return failure('attachment.conflict', `Browser attachment is already registered: ${normalized.attachmentId}`);
292
+ }
293
+ if (attachments.size >= maxBrowserAttachments) {
294
+ return failure('attachment.limitExceeded', `Browser attachment limit reached: ${maxBrowserAttachments}.`);
295
+ }
296
+ const manifests = new Map(host.commandSystem.listManifests().map(manifest => [manifest.id, manifest]));
297
+ for (const commandId of normalized.commandIds) {
298
+ const manifest = manifests.get(commandId);
299
+ if (!manifest || (manifest.target !== 'view' && manifest.target !== 'renderer')
300
+ || !normalized.targets.includes(manifest.target)) {
301
+ return failure('attachment.commandMismatch', `Browser attachment command does not match its registered target: ${commandId}`);
302
+ }
303
+ }
304
+ attachments.set(normalized.attachmentId, {
305
+ registration: normalized,
306
+ queued: [],
307
+ waiters: new Set(),
308
+ operations: new Set(),
309
+ connected: true,
310
+ lastSeenAt: readNow(),
311
+ });
312
+ return { ok: true, kind: 'attachment', attachmentId: normalized.attachmentId };
313
+ }
314
+ async function pollAttachment(attachmentId, timeoutMs) {
315
+ const attachment = attachments.get(normalizeId(attachmentId, 'attachmentId'));
316
+ if (!attachment?.connected)
317
+ return failure('attachment.notFound', `Browser attachment was not found: ${attachmentId}`);
318
+ attachment.lastSeenAt = readNow();
319
+ const queued = attachment.queued.shift();
320
+ if (queued) {
321
+ const command = forwardedCommands.get(queued.operationId);
322
+ if (command)
323
+ command.dispatched = true;
324
+ return { ok: true, kind: 'attachment.poll', request: cloneJson(queued) };
325
+ }
326
+ const waitMs = Math.min(normalizeTimeout(timeoutMs), MAX_LONG_POLL_MS);
327
+ if (waitMs === 0)
328
+ return { ok: true, kind: 'attachment.poll', request: null };
329
+ const request = await new Promise((resolve) => {
330
+ let settled = false;
331
+ const settle = (value) => {
332
+ if (settled)
333
+ return;
334
+ settled = true;
335
+ clearTimeout(timer);
336
+ attachment.waiters.delete(settle);
337
+ resolve(value);
338
+ };
339
+ const timer = setTimeout(() => settle(null), waitMs);
340
+ attachment.waiters.add(settle);
341
+ });
342
+ return { ok: true, kind: 'attachment.poll', request };
343
+ }
344
+ function acceptAttachmentResult(attachmentId, result) {
345
+ const attachment = attachments.get(normalizeId(attachmentId, 'attachmentId'));
346
+ const command = forwardedCommands.get(normalizeId(result?.operationId, 'operationId'));
347
+ if (!attachment || !command || command.attachmentId !== attachmentId
348
+ || command.request.requestId !== result.requestId || !command.dispatched
349
+ || command.settled) {
350
+ return { ok: true, kind: 'attachment.result', accepted: false };
351
+ }
352
+ attachment.lastSeenAt = readNow();
353
+ settleForwardedCommand(command, result.ok
354
+ ? {
355
+ ok: true,
356
+ output: normalizeJsonValue(result.output),
357
+ ...(result.diagnostics?.length ? { diagnostics: cloneJson(result.diagnostics) } : {}),
358
+ }
359
+ : {
360
+ ok: false,
361
+ diagnostics: result.diagnostics?.length
362
+ ? cloneJson(result.diagnostics)
363
+ : [diagnostic('command.executionFailed', `Browser command failed: ${command.request.invocation.commandId}`)],
364
+ });
365
+ return { ok: true, kind: 'attachment.result', accepted: true };
366
+ }
367
+ function unregisterAttachment(attachmentId) {
368
+ const normalizedId = normalizeId(attachmentId, 'attachmentId');
369
+ const attachment = attachments.get(normalizedId);
370
+ if (!attachment)
371
+ return { ok: true, kind: 'attachment.unregister', removed: false };
372
+ disconnectAttachment(attachment, 'attachment.disconnected');
373
+ attachments.delete(normalizedId);
374
+ return { ok: true, kind: 'attachment.unregister', removed: true };
375
+ }
376
+ function disconnectAttachment(attachment, code) {
377
+ attachment.connected = false;
378
+ for (const waiter of attachment.waiters)
379
+ waiter(null);
380
+ attachment.waiters.clear();
381
+ attachment.queued.splice(0);
382
+ for (const operationId of attachment.operations) {
383
+ const command = forwardedCommands.get(operationId);
384
+ if (!command || command.settled)
385
+ continue;
386
+ settleForwardedCommand(command, {
387
+ ok: false,
388
+ diagnostics: [diagnostic(code, `Browser attachment disconnected: ${attachment.registration.attachmentId}`)],
389
+ });
390
+ }
391
+ attachment.operations.clear();
392
+ }
393
+ function settleForwardedCommand(command, outcome) {
394
+ if (command.settled)
395
+ return;
396
+ command.settled = true;
397
+ const attachment = attachments.get(command.attachmentId);
398
+ if (attachment) {
399
+ const index = attachment.queued.findIndex(candidate => candidate.operationId === command.request.operationId);
400
+ if (index >= 0)
401
+ attachment.queued.splice(index, 1);
402
+ attachment.operations.delete(command.request.operationId);
403
+ }
404
+ forwardedCommands.delete(command.request.operationId);
405
+ command.signal.removeEventListener('abort', command.onAbort);
406
+ if (command.timeout)
407
+ clearTimeout(command.timeout);
408
+ command.timeout = undefined;
409
+ command.resolve(outcome);
410
+ }
411
+ function expireStaleAttachments() {
412
+ if (disposed)
413
+ return;
414
+ const current = readNow();
415
+ for (const [attachmentId, attachment] of attachments) {
416
+ if (current - attachment.lastSeenAt <= browserAttachmentLeaseMs)
417
+ continue;
418
+ disconnectAttachment(attachment, 'attachment.leaseExpired');
419
+ attachments.delete(attachmentId);
420
+ }
421
+ }
422
+ function readNow() {
423
+ const value = now();
424
+ return Number.isFinite(value) ? value : Date.now();
425
+ }
426
+ }
427
+ function normalizeAttachment(input) {
428
+ const attachmentId = normalizeId(input?.attachmentId, 'attachmentId');
429
+ const targets = [...new Set(input?.targets ?? [])];
430
+ if (targets.length === 0 || targets.some(target => target !== 'view' && target !== 'renderer')) {
431
+ throw new Error('Browser attachment targets must contain view or renderer.');
432
+ }
433
+ const commandIds = [...new Set((input?.commandIds ?? []).map(id => normalizeId(id, 'commandId')))];
434
+ return Object.freeze({
435
+ attachmentId,
436
+ targets: Object.freeze(targets),
437
+ commandIds: Object.freeze(commandIds),
438
+ ...(input.label?.trim() ? { label: input.label.trim() } : {}),
439
+ ...(input.connectedAt?.trim() ? { connectedAt: input.connectedAt.trim() } : {}),
440
+ });
441
+ }
442
+ function normalizeId(value, label) {
443
+ if (typeof value !== 'string' || !value.trim())
444
+ throw new Error(`${label} must be a non-empty string.`);
445
+ return value.trim();
446
+ }
447
+ function normalizePositiveInteger(value, fallback) {
448
+ return Number.isSafeInteger(value) && value > 0 ? value : fallback;
449
+ }
450
+ function normalizeLimit(value, maximum) {
451
+ if (value === undefined)
452
+ return Math.min(DEFAULT_CATALOG_PAGE_SIZE, maximum);
453
+ if (!Number.isSafeInteger(value) || value <= 0)
454
+ throw new Error('Pagination limit must be a positive safe integer.');
455
+ return Math.min(value, maximum);
456
+ }
457
+ function normalizeTimeout(value) {
458
+ if (value === undefined)
459
+ return 10000;
460
+ if (!Number.isSafeInteger(value) || value < 0)
461
+ throw new Error('timeoutMs must be a non-negative safe integer.');
462
+ return Math.min(value, MAX_LONG_POLL_MS);
463
+ }
464
+ function encodeCatalogCursor(revision, query, offset) {
465
+ return `${revision}.${offset}.${hashString(query)}`;
466
+ }
467
+ function decodeCatalogCursor(cursor, revision, query) {
468
+ if (cursor === undefined)
469
+ return 0;
470
+ const match = /^(\d+)\.(\d+)\.([0-9a-f]+)$/.exec(cursor);
471
+ if (!match || Number(match[1]) !== revision || match[3] !== hashString(query)) {
472
+ throw new Error('Command catalog cursor is invalid or stale.');
473
+ }
474
+ const offset = Number(match[2]);
475
+ if (!Number.isSafeInteger(offset) || offset < 0)
476
+ throw new Error('Command catalog cursor offset is invalid.');
477
+ return offset;
478
+ }
479
+ function hashString(value) {
480
+ let hash = 2166136261;
481
+ for (let index = 0; index < value.length; index += 1) {
482
+ hash ^= value.charCodeAt(index);
483
+ hash = Math.imul(hash, 16777619);
484
+ }
485
+ return (hash >>> 0).toString(16);
486
+ }
487
+ function matchesManifest(manifest, query) {
488
+ if (!query)
489
+ return true;
490
+ return [manifest.id, manifest.title, manifest.description ?? '', ...(manifest.presentation?.aliases ?? []), ...(manifest.presentation?.keywords ?? [])]
491
+ .some(value => value.toLocaleLowerCase().includes(query));
492
+ }
493
+ function failure(code, message) {
494
+ return { ok: false, diagnostics: [diagnostic(code, message)] };
495
+ }
496
+ function diagnostic(code, message) {
497
+ return { severity: 'error', source: 'transport', code, message };
498
+ }
499
+ function snapshotHandlerInvocation(context) {
500
+ return cloneJson({
501
+ commandId: context.commandId,
502
+ ...(context.intentCommandId ? { intentCommandId: context.intentCommandId } : {}),
503
+ ...(context.input !== undefined ? { input: context.input } : {}),
504
+ requestId: context.requestId,
505
+ ...(context.idempotencyKey ? { idempotencyKey: context.idempotencyKey } : {}),
506
+ ...(context.expectedRevision ? { expectedRevision: context.expectedRevision } : {}),
507
+ principal: context.principal,
508
+ source: context.source,
509
+ ...(context.traceId ? { traceId: context.traceId } : {}),
510
+ ...(context.traceStepId ? { traceStepId: context.traceStepId } : {}),
511
+ ...(context.transactionId ? { transactionId: context.transactionId } : {}),
512
+ ...(context.clientId ? { clientId: context.clientId } : {}),
513
+ });
514
+ }
515
+ function waitForOperation(completion, timeoutMs) {
516
+ return new Promise(resolve => {
517
+ let settled = false;
518
+ const settle = () => {
519
+ if (settled)
520
+ return;
521
+ settled = true;
522
+ clearTimeout(timer);
523
+ resolve();
524
+ };
525
+ const timer = setTimeout(settle, timeoutMs);
526
+ completion.then(settle, settle);
527
+ });
528
+ }
529
+ function cloneJson(value) {
530
+ if (typeof structuredClone === 'function')
531
+ return structuredClone(value);
532
+ return JSON.parse(JSON.stringify(value));
533
+ }
534
+ function normalizeJsonValue(value) {
535
+ const serialized = JSON.stringify(value ?? null);
536
+ if (serialized === undefined)
537
+ return null;
538
+ return JSON.parse(serialized);
539
+ }
540
+ //# sourceMappingURL=editor-service-gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor-service-gateway.js","sourceRoot":"","sources":["../src/editor-service-gateway.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type EditorBrowserAttachmentCommandRequest,\n type EditorBrowserAttachmentCommandResult,\n type EditorBrowserAttachmentRegistration,\n type EditorAuthoringEventReadResult,\n type EditorCommandCatalogEntry,\n type EditorCommandDiagnostic,\n type EditorCommandInvocation,\n type EditorCommandJsonValue,\n type EditorCommandManifest,\n EDITOR_SERVICE_PROTOCOL_VERSION,\n type EditorServiceGatewayRequest,\n type EditorServiceGatewayResponse,\n type EditorServiceStatus,\n type EditorServiceTokenScope,\n type EditorServiceDocumentExportArtifact,\n type EditorServiceTracePage,\n} from '@fps-games/editor-protocol';\nimport type { EditorAuthoringHost } from './editor-authoring-host.js';\nimport type {\n EditorCommandHandlerContext,\n EditorCommandHandlerOutcome,\n} from './editor-command-system.js';\n\nexport interface EditorServiceGatewayOptions<TDocument, TPatch> {\n readonly canonicalProjectRoot: string;\n readonly packageVersion: string;\n readonly buildKey: string;\n readonly startedAt: string;\n readonly host: EditorAuthoringHost<TDocument, TPatch>;\n readonly now?: () => number;\n readonly maxCatalogPageSize?: number;\n readonly maxTracePageSize?: number;\n readonly maxBrowserAttachments?: number;\n readonly browserAttachmentLeaseMs?: number;\n readonly browserOperationTimeoutMs?: number;\n readonly readTraces?: (input: {\n traceId?: string;\n cursor?: string;\n limit: number;\n }) => EditorServiceTracePage | Promise<EditorServiceTracePage>;\n readonly readDocumentExport?: (\n transactionId: string,\n ) => EditorServiceDocumentExportArtifact | null | Promise<EditorServiceDocumentExportArtifact | null>;\n}\n\nexport interface EditorServiceGateway {\n readonly serviceInstanceId: string;\n handle(\n request: EditorServiceGatewayRequest,\n tokenScopes?: readonly EditorServiceTokenScope[],\n ): Promise<EditorServiceGatewayResponse>;\n forwardBrowserCommand(\n context: EditorCommandHandlerContext,\n target: 'view' | 'renderer',\n ): Promise<EditorCommandHandlerOutcome<unknown>>;\n dispose(): void;\n}\n\ninterface AttachmentState {\n readonly registration: EditorBrowserAttachmentRegistration;\n readonly queued: EditorBrowserAttachmentCommandRequest[];\n readonly waiters: Set<(request: EditorBrowserAttachmentCommandRequest | null) => void>;\n readonly operations: Set<string>;\n connected: boolean;\n lastSeenAt: number;\n}\n\ninterface ForwardedCommand {\n readonly attachmentId: string;\n readonly request: EditorBrowserAttachmentCommandRequest;\n readonly resolve: (outcome: EditorCommandHandlerOutcome<unknown>) => void;\n readonly signal: AbortSignal;\n readonly onAbort: () => void;\n dispatched: boolean;\n settled: boolean;\n timeout?: ReturnType<typeof setTimeout>;\n}\n\nconst DEFAULT_CATALOG_PAGE_SIZE = 100;\nconst DEFAULT_TRACE_PAGE_SIZE = 100;\nconst DEFAULT_MAX_BROWSER_ATTACHMENTS = 32;\nconst MAX_LONG_POLL_MS = 30_000;\n\nexport function createEditorServiceGateway<TDocument, TPatch>(\n options: EditorServiceGatewayOptions<TDocument, TPatch>,\n): EditorServiceGateway {\n const host = options.host;\n const now = options.now ?? Date.now;\n const maxCatalogPageSize = normalizePositiveInteger(options.maxCatalogPageSize, DEFAULT_CATALOG_PAGE_SIZE);\n const maxTracePageSize = normalizePositiveInteger(options.maxTracePageSize, DEFAULT_TRACE_PAGE_SIZE);\n const maxBrowserAttachments = normalizePositiveInteger(\n options.maxBrowserAttachments,\n DEFAULT_MAX_BROWSER_ATTACHMENTS,\n );\n const browserAttachmentLeaseMs = normalizePositiveInteger(options.browserAttachmentLeaseMs, 40_000);\n const browserOperationTimeoutMs = normalizePositiveInteger(options.browserOperationTimeoutMs, 30_000);\n const attachments = new Map<string, AttachmentState>();\n const forwardedCommands = new Map<string, ForwardedCommand>();\n let disposed = false;\n const leaseTimer = setInterval(expireStaleAttachments, Math.min(1_000, Math.max(25, Math.floor(browserAttachmentLeaseMs / 2))));\n (leaseTimer as unknown as { unref?: () => void }).unref?.();\n\n return Object.freeze({\n serviceInstanceId: host.serviceInstanceId,\n async handle(\n request: EditorServiceGatewayRequest,\n tokenScopes: readonly EditorServiceTokenScope[] = ['read', 'write'],\n ): Promise<EditorServiceGatewayResponse> {\n if (disposed) return failure('service.disposed', 'Editor Service Gateway is disposed.');\n expireStaleAttachments();\n if (!request || typeof request !== 'object' || typeof request.kind !== 'string') {\n return failure('request.invalid', 'Editor Service Gateway request is invalid.');\n }\n try {\n switch (request.kind) {\n case 'status':\n return { ok: true, kind: 'status', status: createStatus() };\n case 'commands.list':\n return { ok: true, kind: 'commands', page: await readCatalogPage('', request.cursor, request.limit) };\n case 'commands.search':\n return { ok: true, kind: 'commands', page: await readCatalogPage(request.query, request.cursor, request.limit) };\n case 'commands.describe':\n return { ok: true, kind: 'command', command: await describeGatewayCommand(request.commandId) };\n case 'command.invoke':\n return invokeCommand(request.invocation, request.timeoutMs, tokenScopes);\n case 'operation.get':\n return { ok: true, kind: 'operation', operation: host.commandSystem.getOperation(request.operationId) };\n case 'operation.cancel':\n if (forwardedCommands.get(request.operationId)?.dispatched) {\n return {\n ok: true,\n kind: 'cancel',\n cancelled: false,\n operation: host.commandSystem.getOperation(request.operationId),\n };\n }\n return {\n ok: true,\n kind: 'cancel',\n cancelled: host.commandSystem.cancelOperation(request.operationId),\n operation: host.commandSystem.getOperation(request.operationId),\n };\n case 'trace.get': {\n const limit = normalizeLimit(request.limit, maxTracePageSize);\n const page = options.readTraces\n ? await options.readTraces({ traceId: request.traceId, cursor: request.cursor, limit })\n : { traces: [] };\n return { ok: true, kind: 'traces', page };\n }\n case 'authoring.snapshot':\n return {\n ok: true,\n kind: 'authoring.snapshot',\n result: (request.afterEventCursor === undefined\n ? { kind: 'snapshot-required', reason: 'cursor.invalid', snapshot: host.getSnapshot() }\n : host.readEvents(request.afterEventCursor, request.serviceInstanceId)) as unknown as EditorAuthoringEventReadResult,\n };\n case 'document.export.get':\n return {\n ok: true,\n kind: 'document.export',\n artifact: options.readDocumentExport\n ? await options.readDocumentExport(normalizeId(request.transactionId, 'transactionId'))\n : null,\n };\n case 'attachment.register':\n return registerAttachment(request.attachment);\n case 'attachment.poll':\n return pollAttachment(request.attachmentId, request.timeoutMs);\n case 'attachment.result':\n return acceptAttachmentResult(request.attachmentId, request.result);\n case 'attachment.unregister':\n return unregisterAttachment(request.attachmentId);\n default:\n return failure('request.unknown', 'Editor Service Gateway request kind is unknown.');\n }\n } catch (error) {\n return failure(\n 'request.failed',\n error instanceof Error ? error.message : String(error),\n );\n }\n },\n forwardBrowserCommand,\n dispose() {\n if (disposed) return;\n disposed = true;\n clearInterval(leaseTimer);\n for (const attachment of attachments.values()) disconnectAttachment(attachment, 'attachment.disconnected');\n attachments.clear();\n for (const command of forwardedCommands.values()) {\n settleForwardedCommand(command, {\n ok: false,\n diagnostics: [diagnostic('service.disposed', 'Editor Service Gateway is disposed.')],\n });\n }\n forwardedCommands.clear();\n },\n });\n\n function createStatus(): EditorServiceStatus {\n const snapshot = host.getSnapshot();\n return {\n ok: true,\n protocolVersion: EDITOR_SERVICE_PROTOCOL_VERSION,\n serviceInstanceId: host.serviceInstanceId,\n canonicalProjectRoot: options.canonicalProjectRoot,\n packageVersion: options.packageVersion,\n buildKey: options.buildKey,\n startedAt: options.startedAt,\n documentRevision: snapshot.documentRevision,\n catalogRevision: host.commandSystem.catalogRevision,\n dirty: snapshot.dirty,\n browserAttachmentCount: attachments.size,\n browserAttachments: [...attachments.values()]\n .filter(attachment => attachment.connected)\n .map(attachment => ({\n attachmentId: attachment.registration.attachmentId,\n ...(attachment.registration.label ? { label: attachment.registration.label } : {}),\n targets: attachment.registration.targets,\n commandCount: attachment.registration.commandIds.length,\n }))\n .sort((left, right) => left.attachmentId.localeCompare(right.attachmentId)),\n recovery: {\n draftJournal: false,\n unsavedWorkingStateRecovered: false,\n message: 'Service restart loads the last saved checkpoint; unsaved working state is not recoverable.',\n },\n };\n }\n\n async function readCatalogPage(query: string, cursor: string | undefined, requestedLimit: number | undefined) {\n const normalizedQuery = typeof query === 'string' ? query.trim().toLocaleLowerCase() : '';\n const catalogRevision = host.commandSystem.catalogRevision;\n const offset = decodeCatalogCursor(cursor, catalogRevision, normalizedQuery);\n const limit = normalizeLimit(requestedLimit, maxCatalogPageSize);\n const manifests = host.commandSystem.listManifests()\n .filter(manifest => matchesManifest(manifest, normalizedQuery))\n .sort((left, right) => left.id.localeCompare(right.id));\n const pageManifests = manifests.slice(offset, offset + limit);\n const commands = (await Promise.all(pageManifests.map(manifest => (\n describeGatewayCommand(manifest.id)\n )))).filter((entry): entry is EditorCommandCatalogEntry => entry !== null);\n const nextOffset = offset + pageManifests.length;\n return {\n catalogRevision,\n commands,\n ...(nextOffset < manifests.length\n ? { nextCursor: encodeCatalogCursor(catalogRevision, normalizedQuery, nextOffset) }\n : {}),\n };\n }\n\n async function describeGatewayCommand(commandId: string): Promise<EditorCommandCatalogEntry | null> {\n const entry = await host.commandSystem.describeCommand(commandId);\n if (!entry || (entry.manifest.target !== 'view' && entry.manifest.target !== 'renderer')) return entry;\n const target = entry.manifest.target;\n const attached = [...attachments.values()].some(candidate => candidate.connected\n && candidate.registration.targets.includes(target)\n && candidate.registration.commandIds.includes(entry.manifest.id));\n if (attached) return entry;\n return {\n manifest: entry.manifest,\n availability: {\n available: false,\n reasons: [diagnostic(`${target}.sessionUnavailable`, `No Browser attachment is available for ${entry.manifest.id}.`)],\n },\n };\n }\n\n async function invokeCommand(\n invocation: EditorCommandInvocation,\n timeoutMs: number | undefined,\n tokenScopes: readonly EditorServiceTokenScope[],\n ): Promise<EditorServiceGatewayResponse> {\n const capturedInvocation = cloneJson(invocation);\n const expectedServiceInstanceId = capturedInvocation.expectedRevision?.serviceInstanceId;\n if (expectedServiceInstanceId !== undefined && expectedServiceInstanceId !== host.serviceInstanceId) {\n return failure(\n 'service.instanceConflict',\n `Editor Service instance changed: expected ${expectedServiceInstanceId}, current ${host.serviceInstanceId}.`,\n );\n }\n const command = await host.commandSystem.describeCommand(capturedInvocation.commandId);\n if (!command) return failure('command.unknown', `Editor command is not registered: ${capturedInvocation.commandId}`);\n if (command.manifest.access === 'write' && !tokenScopes.includes('write')) {\n return failure('auth.writeScopeRequired', `Write scope is required: ${capturedInvocation.commandId}`);\n }\n const attachmentRequirement = validateInvocationAttachment(command.manifest, capturedInvocation.clientId);\n if (attachmentRequirement) return failure(attachmentRequirement.code, attachmentRequirement.message);\n const handle = host.invoke(capturedInvocation);\n const waitMs = normalizeTimeout(timeoutMs);\n if (waitMs === 0) {\n return { ok: true, kind: 'operation', operation: host.commandSystem.getOperation(handle.operationId) };\n }\n await waitForOperation(handle.completion, waitMs);\n return { ok: true, kind: 'operation', operation: host.commandSystem.getOperation(handle.operationId) };\n }\n\n function validateInvocationAttachment(\n manifest: EditorCommandManifest,\n clientId: string | undefined,\n ): { code: string; message: string } | null {\n for (const target of ['view', 'renderer'] as const) {\n const required = target === 'view'\n ? manifest.requires?.viewAttached === true\n : manifest.requires?.rendererAttached === true;\n if (!required) continue;\n const attachment = clientId ? attachments.get(clientId) : undefined;\n const commandMatches = manifest.target !== target\n || attachment?.registration.commandIds.includes(manifest.id) === true;\n if (attachment?.connected\n && attachment.registration.targets.includes(target)\n && commandMatches) continue;\n return {\n code: `${target}.sessionUnavailable`,\n message: `The requested Browser attachment is unavailable for ${manifest.id}${clientId ? `: ${clientId}` : '.'}`,\n };\n }\n return null;\n }\n\n function forwardBrowserCommand(\n context: EditorCommandHandlerContext,\n target: 'view' | 'renderer',\n ): Promise<EditorCommandHandlerOutcome<unknown>> {\n const attachment = context.clientId ? attachments.get(context.clientId) : undefined;\n if (!attachment) {\n return Promise.resolve({\n ok: false,\n diagnostics: [diagnostic(\n `${target}.sessionUnavailable`,\n `No Browser attachment is available for ${context.commandId}.`,\n )],\n });\n }\n if (!attachment.connected\n || !attachment.registration.targets.includes(target)\n || !attachment.registration.commandIds.includes(context.commandId)) {\n return Promise.resolve({\n ok: false,\n diagnostics: [diagnostic(\n `${target}.sessionUnavailable`,\n `The requested Browser attachment is unavailable for ${context.commandId}: ${context.clientId}.`,\n )],\n });\n }\n if (forwardedCommands.has(context.operationId)) {\n return Promise.resolve({\n ok: false,\n diagnostics: [diagnostic(\n 'attachment.operationConflict',\n `Browser command is already forwarded: ${context.operationId}`,\n )],\n });\n }\n const request: EditorBrowserAttachmentCommandRequest = {\n requestId: context.requestId,\n operationId: context.operationId,\n invocation: snapshotHandlerInvocation(context),\n };\n return new Promise(resolve => {\n const command: ForwardedCommand = {\n attachmentId: attachment.registration.attachmentId,\n request,\n resolve,\n signal: context.signal,\n onAbort: () => {\n settleForwardedCommand(command, {\n ok: false,\n diagnostics: [diagnostic('command.cancelled', `Browser command was cancelled: ${context.commandId}`)],\n });\n },\n dispatched: false,\n settled: false,\n };\n forwardedCommands.set(context.operationId, command);\n context.signal.addEventListener('abort', command.onAbort, { once: true });\n command.timeout = setTimeout(() => {\n settleForwardedCommand(command, {\n ok: false,\n diagnostics: [diagnostic('command.timeout', `Browser command timed out: ${context.commandId}`)],\n });\n }, browserOperationTimeoutMs);\n (command.timeout as unknown as { unref?: () => void }).unref?.();\n attachment.operations.add(context.operationId);\n const waiter = attachment.waiters.values().next().value as ((value: EditorBrowserAttachmentCommandRequest | null) => void) | undefined;\n if (waiter) {\n attachment.waiters.delete(waiter);\n command.dispatched = true;\n waiter(cloneJson(request));\n } else {\n attachment.queued.push(request);\n }\n });\n }\n\n function registerAttachment(registration: EditorBrowserAttachmentRegistration): EditorServiceGatewayResponse {\n const normalized = normalizeAttachment(registration);\n if (attachments.has(normalized.attachmentId)) {\n return failure('attachment.conflict', `Browser attachment is already registered: ${normalized.attachmentId}`);\n }\n if (attachments.size >= maxBrowserAttachments) {\n return failure(\n 'attachment.limitExceeded',\n `Browser attachment limit reached: ${maxBrowserAttachments}.`,\n );\n }\n const manifests = new Map(host.commandSystem.listManifests().map(manifest => [manifest.id, manifest]));\n for (const commandId of normalized.commandIds) {\n const manifest = manifests.get(commandId);\n if (!manifest || (manifest.target !== 'view' && manifest.target !== 'renderer')\n || !normalized.targets.includes(manifest.target)) {\n return failure('attachment.commandMismatch', `Browser attachment command does not match its registered target: ${commandId}`);\n }\n }\n attachments.set(normalized.attachmentId, {\n registration: normalized,\n queued: [],\n waiters: new Set(),\n operations: new Set(),\n connected: true,\n lastSeenAt: readNow(),\n });\n return { ok: true, kind: 'attachment', attachmentId: normalized.attachmentId };\n }\n\n async function pollAttachment(\n attachmentId: string,\n timeoutMs: number | undefined,\n ): Promise<EditorServiceGatewayResponse> {\n const attachment = attachments.get(normalizeId(attachmentId, 'attachmentId'));\n if (!attachment?.connected) return failure('attachment.notFound', `Browser attachment was not found: ${attachmentId}`);\n attachment.lastSeenAt = readNow();\n const queued = attachment.queued.shift();\n if (queued) {\n const command = forwardedCommands.get(queued.operationId);\n if (command) command.dispatched = true;\n return { ok: true, kind: 'attachment.poll', request: cloneJson(queued) };\n }\n const waitMs = Math.min(normalizeTimeout(timeoutMs), MAX_LONG_POLL_MS);\n if (waitMs === 0) return { ok: true, kind: 'attachment.poll', request: null };\n const request = await new Promise<EditorBrowserAttachmentCommandRequest | null>((resolve) => {\n let settled = false;\n const settle = (value: EditorBrowserAttachmentCommandRequest | null): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n attachment.waiters.delete(settle);\n resolve(value);\n };\n const timer = setTimeout(() => settle(null), waitMs);\n attachment.waiters.add(settle);\n });\n return { ok: true, kind: 'attachment.poll', request };\n }\n\n function acceptAttachmentResult(\n attachmentId: string,\n result: EditorBrowserAttachmentCommandResult,\n ): EditorServiceGatewayResponse {\n const attachment = attachments.get(normalizeId(attachmentId, 'attachmentId'));\n const command = forwardedCommands.get(normalizeId(result?.operationId, 'operationId'));\n if (!attachment || !command || command.attachmentId !== attachmentId\n || command.request.requestId !== result.requestId || !command.dispatched\n || command.settled) {\n return { ok: true, kind: 'attachment.result', accepted: false };\n }\n attachment.lastSeenAt = readNow();\n settleForwardedCommand(command, result.ok\n ? {\n ok: true,\n output: normalizeJsonValue(result.output),\n ...(result.diagnostics?.length ? { diagnostics: cloneJson(result.diagnostics) } : {}),\n }\n : {\n ok: false,\n diagnostics: result.diagnostics?.length\n ? cloneJson(result.diagnostics)\n : [diagnostic('command.executionFailed', `Browser command failed: ${command.request.invocation.commandId}`)],\n });\n return { ok: true, kind: 'attachment.result', accepted: true };\n }\n\n function unregisterAttachment(attachmentId: string): EditorServiceGatewayResponse {\n const normalizedId = normalizeId(attachmentId, 'attachmentId');\n const attachment = attachments.get(normalizedId);\n if (!attachment) return { ok: true, kind: 'attachment.unregister', removed: false };\n disconnectAttachment(attachment, 'attachment.disconnected');\n attachments.delete(normalizedId);\n return { ok: true, kind: 'attachment.unregister', removed: true };\n }\n\n function disconnectAttachment(attachment: AttachmentState, code: string): void {\n attachment.connected = false;\n for (const waiter of attachment.waiters) waiter(null);\n attachment.waiters.clear();\n attachment.queued.splice(0);\n for (const operationId of attachment.operations) {\n const command = forwardedCommands.get(operationId);\n if (!command || command.settled) continue;\n settleForwardedCommand(command, {\n ok: false,\n diagnostics: [diagnostic(code, `Browser attachment disconnected: ${attachment.registration.attachmentId}`)],\n });\n }\n attachment.operations.clear();\n }\n\n function settleForwardedCommand(\n command: ForwardedCommand,\n outcome: EditorCommandHandlerOutcome<unknown>,\n ): void {\n if (command.settled) return;\n command.settled = true;\n const attachment = attachments.get(command.attachmentId);\n if (attachment) {\n const index = attachment.queued.findIndex(candidate => candidate.operationId === command.request.operationId);\n if (index >= 0) attachment.queued.splice(index, 1);\n attachment.operations.delete(command.request.operationId);\n }\n forwardedCommands.delete(command.request.operationId);\n command.signal.removeEventListener('abort', command.onAbort);\n if (command.timeout) clearTimeout(command.timeout);\n command.timeout = undefined;\n command.resolve(outcome);\n }\n\n function expireStaleAttachments(): void {\n if (disposed) return;\n const current = readNow();\n for (const [attachmentId, attachment] of attachments) {\n if (current - attachment.lastSeenAt <= browserAttachmentLeaseMs) continue;\n disconnectAttachment(attachment, 'attachment.leaseExpired');\n attachments.delete(attachmentId);\n }\n }\n\n function readNow(): number {\n const value = now();\n return Number.isFinite(value) ? value : Date.now();\n }\n}\n\nfunction normalizeAttachment(input: EditorBrowserAttachmentRegistration): EditorBrowserAttachmentRegistration {\n const attachmentId = normalizeId(input?.attachmentId, 'attachmentId');\n const targets = [...new Set(input?.targets ?? [])];\n if (targets.length === 0 || targets.some(target => target !== 'view' && target !== 'renderer')) {\n throw new Error('Browser attachment targets must contain view or renderer.');\n }\n const commandIds = [...new Set((input?.commandIds ?? []).map(id => normalizeId(id, 'commandId')))];\n return Object.freeze({\n attachmentId,\n targets: Object.freeze(targets),\n commandIds: Object.freeze(commandIds),\n ...(input.label?.trim() ? { label: input.label.trim() } : {}),\n ...(input.connectedAt?.trim() ? { connectedAt: input.connectedAt.trim() } : {}),\n });\n}\n\nfunction normalizeId(value: unknown, label: string): string {\n if (typeof value !== 'string' || !value.trim()) throw new Error(`${label} must be a non-empty string.`);\n return value.trim();\n}\n\nfunction normalizePositiveInteger(value: number | undefined, fallback: number): number {\n return Number.isSafeInteger(value) && value! > 0 ? value! : fallback;\n}\n\nfunction normalizeLimit(value: number | undefined, maximum: number): number {\n if (value === undefined) return Math.min(DEFAULT_CATALOG_PAGE_SIZE, maximum);\n if (!Number.isSafeInteger(value) || value <= 0) throw new Error('Pagination limit must be a positive safe integer.');\n return Math.min(value, maximum);\n}\n\nfunction normalizeTimeout(value: number | undefined): number {\n if (value === undefined) return 10_000;\n if (!Number.isSafeInteger(value) || value < 0) throw new Error('timeoutMs must be a non-negative safe integer.');\n return Math.min(value, MAX_LONG_POLL_MS);\n}\n\nfunction encodeCatalogCursor(revision: number, query: string, offset: number): string {\n return `${revision}.${offset}.${hashString(query)}`;\n}\n\nfunction decodeCatalogCursor(cursor: string | undefined, revision: number, query: string): number {\n if (cursor === undefined) return 0;\n const match = /^(\\d+)\\.(\\d+)\\.([0-9a-f]+)$/.exec(cursor);\n if (!match || Number(match[1]) !== revision || match[3] !== hashString(query)) {\n throw new Error('Command catalog cursor is invalid or stale.');\n }\n const offset = Number(match[2]);\n if (!Number.isSafeInteger(offset) || offset < 0) throw new Error('Command catalog cursor offset is invalid.');\n return offset;\n}\n\nfunction hashString(value: string): string {\n let hash = 2166136261;\n for (let index = 0; index < value.length; index += 1) {\n hash ^= value.charCodeAt(index);\n hash = Math.imul(hash, 16777619);\n }\n return (hash >>> 0).toString(16);\n}\n\nfunction matchesManifest(manifest: { id: string; title: string; description?: string; presentation?: { aliases?: readonly string[]; keywords?: readonly string[] } }, query: string): boolean {\n if (!query) return true;\n return [manifest.id, manifest.title, manifest.description ?? '', ...(manifest.presentation?.aliases ?? []), ...(manifest.presentation?.keywords ?? [])]\n .some(value => value.toLocaleLowerCase().includes(query));\n}\n\nfunction failure(code: string, message: string): EditorServiceGatewayResponse {\n return { ok: false, diagnostics: [diagnostic(code, message)] };\n}\n\nfunction diagnostic(code: string, message: string): EditorCommandDiagnostic {\n return { severity: 'error', source: 'transport', code, message };\n}\n\nfunction snapshotHandlerInvocation(context: EditorCommandHandlerContext): EditorCommandInvocation {\n return cloneJson({\n commandId: context.commandId,\n ...(context.intentCommandId ? { intentCommandId: context.intentCommandId } : {}),\n ...(context.input !== undefined ? { input: context.input } : {}),\n requestId: context.requestId,\n ...(context.idempotencyKey ? { idempotencyKey: context.idempotencyKey } : {}),\n ...(context.expectedRevision ? { expectedRevision: context.expectedRevision } : {}),\n principal: context.principal,\n source: context.source,\n ...(context.traceId ? { traceId: context.traceId } : {}),\n ...(context.traceStepId ? { traceStepId: context.traceStepId } : {}),\n ...(context.transactionId ? { transactionId: context.transactionId } : {}),\n ...(context.clientId ? { clientId: context.clientId } : {}),\n });\n}\n\nfunction waitForOperation(completion: Promise<unknown>, timeoutMs: number): Promise<void> {\n return new Promise(resolve => {\n let settled = false;\n const settle = (): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve();\n };\n const timer = setTimeout(settle, timeoutMs);\n completion.then(settle, settle);\n });\n}\n\nfunction cloneJson<T>(value: T): T {\n if (typeof structuredClone === 'function') return structuredClone(value);\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction normalizeJsonValue(value: unknown): EditorCommandJsonValue {\n const serialized = JSON.stringify(value ?? null);\n if (serialized === undefined) return null;\n return JSON.parse(serialized) as EditorCommandJsonValue;\n}\n"]}