@powerhousedao/reactor-api 6.0.2-staging.2 → 6.0.2-staging.3

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 (351) hide show
  1. package/README.md +6 -0
  2. package/dist/index.d.mts +2943 -0
  3. package/dist/index.d.mts.map +1 -0
  4. package/dist/index.mjs +6375 -0
  5. package/dist/index.mjs.map +1 -0
  6. package/dist/src/packages/https-hooks.d.mts +23 -7
  7. package/dist/src/packages/https-hooks.d.mts.map +1 -1
  8. package/dist/src/packages/https-hooks.mjs +73 -53
  9. package/dist/src/packages/https-hooks.mjs.map +1 -1
  10. package/dist/src/packages/vite-loader.d.mts +29 -0
  11. package/dist/src/packages/vite-loader.d.mts.map +1 -0
  12. package/dist/src/packages/vite-loader.mjs +142 -0
  13. package/dist/src/packages/vite-loader.mjs.map +1 -0
  14. package/dist/types-Do4QTfT3.d.mts +37 -0
  15. package/dist/types-Do4QTfT3.d.mts.map +1 -0
  16. package/dist/utils-DEEhP99G.mjs +286 -0
  17. package/dist/utils-DEEhP99G.mjs.map +1 -0
  18. package/package.json +45 -32
  19. package/dist/codegen.d.ts +0 -4
  20. package/dist/codegen.d.ts.map +0 -1
  21. package/dist/codegen.js +0 -38
  22. package/dist/codegen.js.map +0 -1
  23. package/dist/index.d.ts +0 -16
  24. package/dist/index.d.ts.map +0 -1
  25. package/dist/index.js +0 -16
  26. package/dist/index.js.map +0 -1
  27. package/dist/src/config.d.ts +0 -6
  28. package/dist/src/config.d.ts.map +0 -1
  29. package/dist/src/config.js +0 -6
  30. package/dist/src/config.js.map +0 -1
  31. package/dist/src/dev.d.ts +0 -2
  32. package/dist/src/dev.d.ts.map +0 -1
  33. package/dist/src/dev.js +0 -51
  34. package/dist/src/dev.js.map +0 -1
  35. package/dist/src/graphql/analytics-subgraph.d.ts +0 -14
  36. package/dist/src/graphql/analytics-subgraph.d.ts.map +0 -1
  37. package/dist/src/graphql/analytics-subgraph.js +0 -26
  38. package/dist/src/graphql/analytics-subgraph.js.map +0 -1
  39. package/dist/src/graphql/auth/index.d.ts +0 -2
  40. package/dist/src/graphql/auth/index.d.ts.map +0 -1
  41. package/dist/src/graphql/auth/index.js +0 -2
  42. package/dist/src/graphql/auth/index.js.map +0 -1
  43. package/dist/src/graphql/auth/resolvers.d.ts +0 -166
  44. package/dist/src/graphql/auth/resolvers.d.ts.map +0 -1
  45. package/dist/src/graphql/auth/resolvers.js +0 -227
  46. package/dist/src/graphql/auth/resolvers.js.map +0 -1
  47. package/dist/src/graphql/auth/schema.graphql +0 -195
  48. package/dist/src/graphql/auth/subgraph.d.ts +0 -202
  49. package/dist/src/graphql/auth/subgraph.d.ts.map +0 -1
  50. package/dist/src/graphql/auth/subgraph.js +0 -384
  51. package/dist/src/graphql/auth/subgraph.js.map +0 -1
  52. package/dist/src/graphql/base-subgraph.d.ts +0 -28
  53. package/dist/src/graphql/base-subgraph.d.ts.map +0 -1
  54. package/dist/src/graphql/base-subgraph.js +0 -126
  55. package/dist/src/graphql/base-subgraph.js.map +0 -1
  56. package/dist/src/graphql/document-model-subgraph.d.ts +0 -105
  57. package/dist/src/graphql/document-model-subgraph.d.ts.map +0 -1
  58. package/dist/src/graphql/document-model-subgraph.js +0 -312
  59. package/dist/src/graphql/document-model-subgraph.js.map +0 -1
  60. package/dist/src/graphql/graphql-manager.d.ts +0 -68
  61. package/dist/src/graphql/graphql-manager.d.ts.map +0 -1
  62. package/dist/src/graphql/graphql-manager.js +0 -589
  63. package/dist/src/graphql/graphql-manager.js.map +0 -1
  64. package/dist/src/graphql/index.d.ts +0 -10
  65. package/dist/src/graphql/index.d.ts.map +0 -1
  66. package/dist/src/graphql/index.js +0 -10
  67. package/dist/src/graphql/index.js.map +0 -1
  68. package/dist/src/graphql/packages/index.d.ts +0 -2
  69. package/dist/src/graphql/packages/index.d.ts.map +0 -1
  70. package/dist/src/graphql/packages/index.js +0 -2
  71. package/dist/src/graphql/packages/index.js.map +0 -1
  72. package/dist/src/graphql/packages/resolvers.d.ts +0 -31
  73. package/dist/src/graphql/packages/resolvers.d.ts.map +0 -1
  74. package/dist/src/graphql/packages/resolvers.js +0 -37
  75. package/dist/src/graphql/packages/resolvers.js.map +0 -1
  76. package/dist/src/graphql/packages/schema.graphql +0 -50
  77. package/dist/src/graphql/packages/subgraph.d.ts +0 -55
  78. package/dist/src/graphql/packages/subgraph.d.ts.map +0 -1
  79. package/dist/src/graphql/packages/subgraph.js +0 -73
  80. package/dist/src/graphql/packages/subgraph.js.map +0 -1
  81. package/dist/src/graphql/playground.d.ts +0 -2
  82. package/dist/src/graphql/playground.d.ts.map +0 -1
  83. package/dist/src/graphql/playground.js +0 -81
  84. package/dist/src/graphql/playground.js.map +0 -1
  85. package/dist/src/graphql/reactor/adapters.d.ts +0 -62
  86. package/dist/src/graphql/reactor/adapters.d.ts.map +0 -1
  87. package/dist/src/graphql/reactor/adapters.js +0 -271
  88. package/dist/src/graphql/reactor/adapters.js.map +0 -1
  89. package/dist/src/graphql/reactor/factory.d.ts +0 -105
  90. package/dist/src/graphql/reactor/factory.d.ts.map +0 -1
  91. package/dist/src/graphql/reactor/factory.js +0 -7
  92. package/dist/src/graphql/reactor/factory.js.map +0 -1
  93. package/dist/src/graphql/reactor/gen/graphql.d.ts +0 -1489
  94. package/dist/src/graphql/reactor/gen/graphql.d.ts.map +0 -1
  95. package/dist/src/graphql/reactor/gen/graphql.js +0 -731
  96. package/dist/src/graphql/reactor/gen/graphql.js.map +0 -1
  97. package/dist/src/graphql/reactor/index.d.ts +0 -4
  98. package/dist/src/graphql/reactor/index.d.ts.map +0 -1
  99. package/dist/src/graphql/reactor/index.js +0 -4
  100. package/dist/src/graphql/reactor/index.js.map +0 -1
  101. package/dist/src/graphql/reactor/operations.graphql +0 -443
  102. package/dist/src/graphql/reactor/pubsub.d.ts +0 -27
  103. package/dist/src/graphql/reactor/pubsub.d.ts.map +0 -1
  104. package/dist/src/graphql/reactor/pubsub.js +0 -93
  105. package/dist/src/graphql/reactor/pubsub.js.map +0 -1
  106. package/dist/src/graphql/reactor/requester.d.ts +0 -4
  107. package/dist/src/graphql/reactor/requester.d.ts.map +0 -1
  108. package/dist/src/graphql/reactor/requester.js +0 -22
  109. package/dist/src/graphql/reactor/requester.js.map +0 -1
  110. package/dist/src/graphql/reactor/requester.with-zod.d.ts +0 -4
  111. package/dist/src/graphql/reactor/requester.with-zod.d.ts.map +0 -1
  112. package/dist/src/graphql/reactor/requester.with-zod.js +0 -129
  113. package/dist/src/graphql/reactor/requester.with-zod.js.map +0 -1
  114. package/dist/src/graphql/reactor/resolvers.d.ts +0 -223
  115. package/dist/src/graphql/reactor/resolvers.d.ts.map +0 -1
  116. package/dist/src/graphql/reactor/resolvers.js +0 -682
  117. package/dist/src/graphql/reactor/resolvers.js.map +0 -1
  118. package/dist/src/graphql/reactor/schema.graphql +0 -475
  119. package/dist/src/graphql/reactor/subgraph.d.ts +0 -18
  120. package/dist/src/graphql/reactor/subgraph.d.ts.map +0 -1
  121. package/dist/src/graphql/reactor/subgraph.js +0 -457
  122. package/dist/src/graphql/reactor/subgraph.js.map +0 -1
  123. package/dist/src/graphql/reactor/validation.d.ts +0 -348
  124. package/dist/src/graphql/reactor/validation.d.ts.map +0 -1
  125. package/dist/src/graphql/reactor/validation.js +0 -167
  126. package/dist/src/graphql/reactor/validation.js.map +0 -1
  127. package/dist/src/graphql/sse.d.ts +0 -42
  128. package/dist/src/graphql/sse.d.ts.map +0 -1
  129. package/dist/src/graphql/sse.js +0 -33
  130. package/dist/src/graphql/sse.js.map +0 -1
  131. package/dist/src/graphql/system/env/getters.d.ts +0 -2
  132. package/dist/src/graphql/system/env/getters.d.ts.map +0 -1
  133. package/dist/src/graphql/system/env/getters.js +0 -4
  134. package/dist/src/graphql/system/env/getters.js.map +0 -1
  135. package/dist/src/graphql/system/env/index.d.ts +0 -2
  136. package/dist/src/graphql/system/env/index.d.ts.map +0 -1
  137. package/dist/src/graphql/system/env/index.js +0 -5
  138. package/dist/src/graphql/system/env/index.js.map +0 -1
  139. package/dist/src/graphql/system/index.d.ts +0 -2
  140. package/dist/src/graphql/system/index.d.ts.map +0 -1
  141. package/dist/src/graphql/system/index.js +0 -2
  142. package/dist/src/graphql/system/index.js.map +0 -1
  143. package/dist/src/graphql/system/types.d.ts +0 -2
  144. package/dist/src/graphql/system/types.d.ts.map +0 -1
  145. package/dist/src/graphql/system/types.js +0 -2
  146. package/dist/src/graphql/system/types.js.map +0 -1
  147. package/dist/src/graphql/temp-hack-rwa-type-defs.d.ts +0 -57
  148. package/dist/src/graphql/temp-hack-rwa-type-defs.d.ts.map +0 -1
  149. package/dist/src/graphql/temp-hack-rwa-type-defs.js +0 -2
  150. package/dist/src/graphql/temp-hack-rwa-type-defs.js.map +0 -1
  151. package/dist/src/graphql/types.d.ts +0 -102
  152. package/dist/src/graphql/types.d.ts.map +0 -1
  153. package/dist/src/graphql/types.js +0 -2
  154. package/dist/src/graphql/types.js.map +0 -1
  155. package/dist/src/graphql/utils.d.ts +0 -9
  156. package/dist/src/graphql/utils.d.ts.map +0 -1
  157. package/dist/src/graphql/utils.js +0 -72
  158. package/dist/src/graphql/utils.js.map +0 -1
  159. package/dist/src/graphql/websocket.d.ts +0 -3
  160. package/dist/src/graphql/websocket.d.ts.map +0 -1
  161. package/dist/src/graphql/websocket.js +0 -15
  162. package/dist/src/graphql/websocket.js.map +0 -1
  163. package/dist/src/migrations/001_create_document_permissions.d.ts +0 -4
  164. package/dist/src/migrations/001_create_document_permissions.d.ts.map +0 -1
  165. package/dist/src/migrations/001_create_document_permissions.js +0 -91
  166. package/dist/src/migrations/001_create_document_permissions.js.map +0 -1
  167. package/dist/src/migrations/002_add_document_protection.d.ts +0 -4
  168. package/dist/src/migrations/002_add_document_protection.d.ts.map +0 -1
  169. package/dist/src/migrations/002_add_document_protection.js +0 -18
  170. package/dist/src/migrations/002_add_document_protection.js.map +0 -1
  171. package/dist/src/migrations/index.d.ts +0 -10
  172. package/dist/src/migrations/index.d.ts.map +0 -1
  173. package/dist/src/migrations/index.js +0 -58
  174. package/dist/src/migrations/index.js.map +0 -1
  175. package/dist/src/packages/http-loader.d.ts +0 -68
  176. package/dist/src/packages/http-loader.d.ts.map +0 -1
  177. package/dist/src/packages/http-loader.js +0 -176
  178. package/dist/src/packages/http-loader.js.map +0 -1
  179. package/dist/src/packages/import-loader.d.ts +0 -14
  180. package/dist/src/packages/import-loader.d.ts.map +0 -1
  181. package/dist/src/packages/import-loader.js +0 -46
  182. package/dist/src/packages/import-loader.js.map +0 -1
  183. package/dist/src/packages/import-resolver.d.ts +0 -5
  184. package/dist/src/packages/import-resolver.d.ts.map +0 -1
  185. package/dist/src/packages/import-resolver.js +0 -127
  186. package/dist/src/packages/import-resolver.js.map +0 -1
  187. package/dist/src/packages/package-manager.d.ts +0 -34
  188. package/dist/src/packages/package-manager.d.ts.map +0 -1
  189. package/dist/src/packages/package-manager.js +0 -213
  190. package/dist/src/packages/package-manager.js.map +0 -1
  191. package/dist/src/packages/types.d.ts +0 -38
  192. package/dist/src/packages/types.d.ts.map +0 -1
  193. package/dist/src/packages/types.js +0 -2
  194. package/dist/src/packages/types.js.map +0 -1
  195. package/dist/src/packages/util.d.ts +0 -27
  196. package/dist/src/packages/util.d.ts.map +0 -1
  197. package/dist/src/packages/util.js +0 -97
  198. package/dist/src/packages/util.js.map +0 -1
  199. package/dist/src/packages/vite-loader.d.ts +0 -24
  200. package/dist/src/packages/vite-loader.d.ts.map +0 -1
  201. package/dist/src/packages/vite-loader.js +0 -169
  202. package/dist/src/packages/vite-loader.js.map +0 -1
  203. package/dist/src/server.d.ts +0 -56
  204. package/dist/src/server.d.ts.map +0 -1
  205. package/dist/src/server.js +0 -365
  206. package/dist/src/server.js.map +0 -1
  207. package/dist/src/services/auth.service.d.ts +0 -56
  208. package/dist/src/services/auth.service.d.ts.map +0 -1
  209. package/dist/src/services/auth.service.js +0 -172
  210. package/dist/src/services/auth.service.js.map +0 -1
  211. package/dist/src/services/authorization.service.d.ts +0 -70
  212. package/dist/src/services/authorization.service.d.ts.map +0 -1
  213. package/dist/src/services/authorization.service.js +0 -155
  214. package/dist/src/services/authorization.service.js.map +0 -1
  215. package/dist/src/services/document-permission.service.d.ts +0 -241
  216. package/dist/src/services/document-permission.service.d.ts.map +0 -1
  217. package/dist/src/services/document-permission.service.js +0 -791
  218. package/dist/src/services/document-permission.service.js.map +0 -1
  219. package/dist/src/services/package-management.service.d.ts +0 -32
  220. package/dist/src/services/package-management.service.d.ts.map +0 -1
  221. package/dist/src/services/package-management.service.js +0 -95
  222. package/dist/src/services/package-management.service.js.map +0 -1
  223. package/dist/src/services/package-storage.d.ts +0 -23
  224. package/dist/src/services/package-storage.d.ts.map +0 -1
  225. package/dist/src/services/package-storage.js +0 -19
  226. package/dist/src/services/package-storage.js.map +0 -1
  227. package/dist/src/tracing.d.ts +0 -4
  228. package/dist/src/tracing.d.ts.map +0 -1
  229. package/dist/src/tracing.js +0 -140
  230. package/dist/src/tracing.js.map +0 -1
  231. package/dist/src/types.d.ts +0 -17
  232. package/dist/src/types.d.ts.map +0 -1
  233. package/dist/src/types.js +0 -2
  234. package/dist/src/types.js.map +0 -1
  235. package/dist/src/utils/auth.d.ts +0 -3
  236. package/dist/src/utils/auth.d.ts.map +0 -1
  237. package/dist/src/utils/auth.js +0 -12
  238. package/dist/src/utils/auth.js.map +0 -1
  239. package/dist/src/utils/create-schema.d.ts +0 -36
  240. package/dist/src/utils/create-schema.d.ts.map +0 -1
  241. package/dist/src/utils/create-schema.js +0 -725
  242. package/dist/src/utils/create-schema.js.map +0 -1
  243. package/dist/src/utils/db.d.ts +0 -82
  244. package/dist/src/utils/db.d.ts.map +0 -1
  245. package/dist/src/utils/db.js +0 -101
  246. package/dist/src/utils/db.js.map +0 -1
  247. package/dist/src/utils/drive-url.d.ts +0 -2
  248. package/dist/src/utils/drive-url.d.ts.map +0 -1
  249. package/dist/src/utils/drive-url.js +0 -3
  250. package/dist/src/utils/drive-url.js.map +0 -1
  251. package/dist/src/utils/index.d.ts +0 -4
  252. package/dist/src/utils/index.d.ts.map +0 -1
  253. package/dist/src/utils/index.js +0 -4
  254. package/dist/src/utils/index.js.map +0 -1
  255. package/dist/test/authorization.service.test.d.ts +0 -2
  256. package/dist/test/authorization.service.test.d.ts.map +0 -1
  257. package/dist/test/authorization.service.test.js +0 -252
  258. package/dist/test/authorization.service.test.js.map +0 -1
  259. package/dist/test/benchmarks/load.bench.d.ts +0 -2
  260. package/dist/test/benchmarks/load.bench.d.ts.map +0 -1
  261. package/dist/test/benchmarks/load.bench.js +0 -73
  262. package/dist/test/benchmarks/load.bench.js.map +0 -1
  263. package/dist/test/benchmarks/sync.bench.d.ts +0 -2
  264. package/dist/test/benchmarks/sync.bench.d.ts.map +0 -1
  265. package/dist/test/benchmarks/sync.bench.js +0 -119
  266. package/dist/test/benchmarks/sync.bench.js.map +0 -1
  267. package/dist/test/connect-switchboard-reshuffle-convergence.test.d.ts +0 -2
  268. package/dist/test/connect-switchboard-reshuffle-convergence.test.d.ts.map +0 -1
  269. package/dist/test/connect-switchboard-reshuffle-convergence.test.js +0 -203
  270. package/dist/test/connect-switchboard-reshuffle-convergence.test.js.map +0 -1
  271. package/dist/test/connect-switchboard-sync.test.d.ts +0 -2
  272. package/dist/test/connect-switchboard-sync.test.d.ts.map +0 -1
  273. package/dist/test/connect-switchboard-sync.test.js +0 -632
  274. package/dist/test/connect-switchboard-sync.test.js.map +0 -1
  275. package/dist/test/document-drive-subgraph.test.d.ts +0 -2
  276. package/dist/test/document-drive-subgraph.test.d.ts.map +0 -1
  277. package/dist/test/document-drive-subgraph.test.js +0 -249
  278. package/dist/test/document-drive-subgraph.test.js.map +0 -1
  279. package/dist/test/document-model-subgraph-permissions.test.d.ts +0 -2
  280. package/dist/test/document-model-subgraph-permissions.test.d.ts.map +0 -1
  281. package/dist/test/document-model-subgraph-permissions.test.js +0 -587
  282. package/dist/test/document-model-subgraph-permissions.test.js.map +0 -1
  283. package/dist/test/document-permission.service.test.d.ts +0 -2
  284. package/dist/test/document-permission.service.test.d.ts.map +0 -1
  285. package/dist/test/document-permission.service.test.js +0 -480
  286. package/dist/test/document-permission.service.test.js.map +0 -1
  287. package/dist/test/drive-info-endpoint.test.d.ts +0 -2
  288. package/dist/test/drive-info-endpoint.test.d.ts.map +0 -1
  289. package/dist/test/drive-info-endpoint.test.js +0 -123
  290. package/dist/test/drive-info-endpoint.test.js.map +0 -1
  291. package/dist/test/fault-injection-sync.test.d.ts +0 -2
  292. package/dist/test/fault-injection-sync.test.d.ts.map +0 -1
  293. package/dist/test/fault-injection-sync.test.js +0 -196
  294. package/dist/test/fault-injection-sync.test.js.map +0 -1
  295. package/dist/test/identity-integration.test.d.ts +0 -2
  296. package/dist/test/identity-integration.test.d.ts.map +0 -1
  297. package/dist/test/identity-integration.test.js +0 -349
  298. package/dist/test/identity-integration.test.js.map +0 -1
  299. package/dist/test/index.d.ts +0 -2
  300. package/dist/test/index.d.ts.map +0 -1
  301. package/dist/test/index.js +0 -2
  302. package/dist/test/index.js.map +0 -1
  303. package/dist/test/permissions-integration.test.d.ts +0 -2
  304. package/dist/test/permissions-integration.test.d.ts.map +0 -1
  305. package/dist/test/permissions-integration.test.js +0 -407
  306. package/dist/test/permissions-integration.test.js.map +0 -1
  307. package/dist/test/push-backfill.test.d.ts +0 -2
  308. package/dist/test/push-backfill.test.d.ts.map +0 -1
  309. package/dist/test/push-backfill.test.js +0 -298
  310. package/dist/test/push-backfill.test.js.map +0 -1
  311. package/dist/test/reactor-adapters.test.d.ts +0 -2
  312. package/dist/test/reactor-adapters.test.d.ts.map +0 -1
  313. package/dist/test/reactor-adapters.test.js +0 -379
  314. package/dist/test/reactor-adapters.test.js.map +0 -1
  315. package/dist/test/reactor-client.test.d.ts +0 -2
  316. package/dist/test/reactor-client.test.d.ts.map +0 -1
  317. package/dist/test/reactor-client.test.js +0 -371
  318. package/dist/test/reactor-client.test.js.map +0 -1
  319. package/dist/test/reactor-resolvers.test.d.ts +0 -2
  320. package/dist/test/reactor-resolvers.test.d.ts.map +0 -1
  321. package/dist/test/reactor-resolvers.test.js +0 -258
  322. package/dist/test/reactor-resolvers.test.js.map +0 -1
  323. package/dist/test/reactor-subgraph-permissions.test.d.ts +0 -2
  324. package/dist/test/reactor-subgraph-permissions.test.d.ts.map +0 -1
  325. package/dist/test/reactor-subgraph-permissions.test.js +0 -371
  326. package/dist/test/reactor-subgraph-permissions.test.js.map +0 -1
  327. package/dist/test/router.test.d.ts +0 -2
  328. package/dist/test/router.test.d.ts.map +0 -1
  329. package/dist/test/router.test.js +0 -38
  330. package/dist/test/router.test.js.map +0 -1
  331. package/dist/test/subscriptions-sse.test.d.ts +0 -2
  332. package/dist/test/subscriptions-sse.test.d.ts.map +0 -1
  333. package/dist/test/subscriptions-sse.test.js +0 -264
  334. package/dist/test/subscriptions-sse.test.js.map +0 -1
  335. package/dist/test/subscriptions.test.d.ts +0 -2
  336. package/dist/test/subscriptions.test.d.ts.map +0 -1
  337. package/dist/test/subscriptions.test.js +0 -248
  338. package/dist/test/subscriptions.test.js.map +0 -1
  339. package/dist/test/utils/gql-resolver-bridge.d.ts +0 -15
  340. package/dist/test/utils/gql-resolver-bridge.d.ts.map +0 -1
  341. package/dist/test/utils/gql-resolver-bridge.js +0 -89
  342. package/dist/test/utils/gql-resolver-bridge.js.map +0 -1
  343. package/dist/test/utils.d.ts +0 -10
  344. package/dist/test/utils.d.ts.map +0 -1
  345. package/dist/test/utils.js +0 -23
  346. package/dist/test/utils.js.map +0 -1
  347. package/dist/tsconfig.tsbuildinfo +0 -1
  348. package/dist/vitest.config.d.ts +0 -3
  349. package/dist/vitest.config.d.ts.map +0 -1
  350. package/dist/vitest.config.js +0 -38
  351. package/dist/vitest.config.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["schemaSource","resolvers.documentAccess","resolvers.userDocumentPermissions","resolvers.groups","resolvers.group","resolvers.userGroups","resolvers.operationPermissions","resolvers.canExecuteOperation","resolvers.documentProtection","resolvers.setDocumentProtection","resolvers.transferDocumentOwnership","resolvers.grantDocumentPermission","resolvers.revokeDocumentPermission","resolvers.createGroup","resolvers.deleteGroup","resolvers.addUserToGroup","resolvers.removeUserFromGroup","resolvers.grantGroupPermission","resolvers.revokeGroupPermission","resolvers.grantOperationPermission","resolvers.revokeOperationPermission","resolvers.grantGroupOperationPermission","resolvers.revokeGroupOperationPermission","resolvers.getGroupMembers","#logger","#servers","#supergraphServer","#getSubgraphs","#gatewayOptions","#buildSupergraphSdl","#logger","#subgraphApps","#supergraphApp","#getSubgraphs","#supergraphContextFactory","#app","#router","#handlers","#serveFetchHandler","#fetchRoutes","#getRoutes","#nodeRoutes","#setupOps","#instance","nodePath","#dispatch","#serveGetEntry","scalarsTypeDefs","typeDefs","z","GqlPropagationMode","PropagationMode","documentResolver","findDocumentsResolver","documentChildrenResolver","documentParentsResolver","createDocumentWithInitialStateResolver","createEmptyDocumentResolver","#authMiddleware","#setupCoreSubgraphs","#setupDocumentModelSubgraphs","#createSupergraphGateway","#setupSubgraphs","#addSubgraphInstance","#setupSupergraphSSE","#createWebSocketContext","#getSubgraphPath","#makeContextFactory","#makeWsContextFactory","#setupSSEHandler","#getAllSubgraphs","#buildSubgraphSchemaModule","#getSubgraphDefinitions","schemaSource","resolvers.installedPackages","resolvers.installedPackage","resolvers.installPackage","resolvers.uninstallPackage","schemaSource","resolvers.documentOperations","resolvers.documentModels","resolvers.document","resolvers.documentChildren","resolvers.documentParents","resolvers.findDocuments","resolvers.jobStatus","resolvers.pollSyncEnvelopes","resolvers.createDocument","resolvers.createEmptyDocument","resolvers.mutateDocument","resolvers.mutateDocumentAsync","resolvers.renameDocument","resolvers.addChildren","resolvers.removeChildren","resolvers.moveChildren","resolvers.deleteDocument","resolvers.deleteDocuments","resolvers.touchChannel","resolvers.pushSyncEnvelopes","loadDocumentModelsUtil","loadSubgraphsUtil","loadProcessorsUtil","up","down","migration001","migration002"],"sources":["../src/graphql/analytics-subgraph.ts","../src/graphql/auth/schema.graphql","../src/graphql/auth/resolvers.ts","../src/graphql/auth/subgraph.ts","../src/graphql/gateway/auth-middleware.ts","../src/graphql/websocket.ts","../src/graphql/gateway/adapter-gateway-apollo.ts","../src/graphql/gateway/adapter-gateway-mercurius.ts","../src/graphql/gateway/adapter-http-express.ts","../src/graphql/gateway/adapter-http-fastify.ts","../src/graphql/gateway/factory.ts","../src/services/auth.service.ts","../src/utils/create-schema.ts","../src/graphql/reactor/gen/graphql.ts","../src/graphql/reactor/adapters.ts","../src/graphql/reactor/resolvers.ts","../src/graphql/document-model-subgraph.ts","../src/graphql/sse.ts","../src/graphql/graphql-manager.ts","../src/graphql/packages/resolvers.ts","../src/graphql/packages/schema.graphql","../src/graphql/packages/subgraph.ts","../src/graphql/playground.ts","../src/graphql/reactor/requester.ts","../src/graphql/reactor/validation.ts","../src/graphql/reactor/requester.with-zod.ts","../src/graphql/reactor/factory.ts","../src/graphql/reactor/schema.graphql","../src/graphql/reactor/pubsub.ts","../src/graphql/reactor/subgraph.ts","../src/graphql/system/env/getters.ts","../src/graphql/system/env/index.ts","../src/packages/http-loader.ts","../src/packages/import-loader.ts","../src/packages/package-manager.ts","../src/config.ts","../src/migrations/001_create_document_permissions.ts","../src/migrations/002_add_document_protection.ts","../src/migrations/index.ts","../src/services/authorization.service.ts","../src/services/document-permission.service.ts","../src/tracing.ts","../src/utils/db.ts","../src/server.ts","../src/services/package-storage.ts","../src/services/package-management.service.ts"],"sourcesContent":["import type { GraphQLResolverMap } from \"@apollo/subgraph/dist/schema-helper/resolverMap.js\";\nimport type { IAnalyticsStore } from \"@powerhousedao/analytics-engine-core\";\nimport { AnalyticsQueryEngine } from \"@powerhousedao/analytics-engine-core\";\nimport {\n AnalyticsModel,\n AnalyticsResolvers,\n typedefs,\n} from \"@powerhousedao/analytics-engine-graphql\";\nimport type { Context, SubgraphArgs } from \"@powerhousedao/reactor-api\";\nimport { gql } from \"graphql-tag\";\nimport { BaseSubgraph } from \"./base-subgraph.js\";\n\nexport class AnalyticsSubgraph extends BaseSubgraph {\n analyticsStore: IAnalyticsStore;\n analyticsModel: AnalyticsModel;\n\n name = \"analytics\";\n typeDefs = gql`\n ${typedefs}\n `;\n\n resolvers = AnalyticsResolvers as GraphQLResolverMap<Context>;\n\n constructor(args: SubgraphArgs) {\n super(args);\n this.analyticsStore = args.analyticsStore;\n\n this.analyticsModel = new AnalyticsModel(\n new AnalyticsQueryEngine(this.analyticsStore),\n );\n\n args.graphqlManager.setAdditionalContextFields({\n dataSources: {\n db: {\n Analytics: this.analyticsModel,\n },\n },\n });\n }\n}\n","\"# Auth Subgraph Schema\\n# Contains all document permission and authorization related types\\n\\nscalar DateTime\\n\\n# Permission levels for documents\\nenum DocumentPermissionLevel {\\n # Can fetch and read the document\\n READ\\n # Can push updates and modify the document\\n WRITE\\n # Can manage document permissions and settings\\n ADMIN\\n}\\n\\n# Document permission entry\\ntype DocumentPermissionEntry {\\n documentId: String!\\n userAddress: String!\\n permission: DocumentPermissionLevel!\\n grantedBy: String!\\n createdAt: DateTime!\\n updatedAt: DateTime!\\n}\\n\\n# Group type\\ntype Group {\\n id: Int!\\n name: String!\\n description: String\\n createdAt: DateTime!\\n updatedAt: DateTime!\\n members: [String!]!\\n}\\n\\n# Document group permission entry\\ntype DocumentGroupPermission {\\n documentId: String!\\n groupId: Int!\\n group: Group!\\n permission: DocumentPermissionLevel!\\n grantedBy: String!\\n createdAt: DateTime!\\n updatedAt: DateTime!\\n}\\n\\n# Operation user permission entry\\ntype OperationUserPermission {\\n documentId: String!\\n operationType: String!\\n userAddress: String!\\n grantedBy: String!\\n createdAt: DateTime!\\n}\\n\\n# Operation group permission entry\\ntype OperationGroupPermission {\\n documentId: String!\\n operationType: String!\\n groupId: Int!\\n group: Group!\\n grantedBy: String!\\n createdAt: DateTime!\\n}\\n\\n# Combined document access info\\ntype DocumentAccessInfo {\\n documentId: String!\\n permissions: [DocumentPermissionEntry!]!\\n groupPermissions: [DocumentGroupPermission!]!\\n}\\n\\n# Operation permissions info\\ntype OperationPermissionsInfo {\\n documentId: String!\\n operationType: String!\\n userPermissions: [OperationUserPermission!]!\\n groupPermissions: [OperationGroupPermission!]!\\n}\\n\\n# Document protection info\\ntype DocumentProtectionInfo {\\n documentId: String!\\n protected: Boolean!\\n ownerAddress: String\\n}\\n\\ntype Query {\\n # Get permissions for a document\\n documentAccess(documentId: String!): DocumentAccessInfo!\\n\\n # Get protection status for a document\\n documentProtection(documentId: String!): DocumentProtectionInfo!\\n\\n # Get all documents the current user has explicit access to\\n userDocumentPermissions: [DocumentPermissionEntry!]!\\n\\n # Get all groups\\n groups: [Group!]!\\n\\n # Get a specific group by ID\\n group(id: Int!): Group\\n\\n # Get all groups a user belongs to\\n userGroups(userAddress: String!): [Group!]!\\n\\n # Get operation permissions for a document and operation type\\n operationPermissions(\\n documentId: String!\\n operationType: String!\\n ): OperationPermissionsInfo!\\n\\n # Check if the current user can execute a specific operation on a document\\n canExecuteOperation(documentId: String!, operationType: String!): Boolean!\\n}\\n\\ntype Mutation {\\n # Set document protection status (requires ADMIN permission or global admin)\\n setDocumentProtection(\\n documentId: String!\\n protected: Boolean!\\n ): DocumentProtectionInfo!\\n\\n # Transfer document ownership (requires ADMIN permission or global admin)\\n transferDocumentOwnership(\\n documentId: String!\\n newOwnerAddress: String!\\n ): DocumentProtectionInfo!\\n\\n # Grant a user permission on a document (requires ADMIN permission or global admin)\\n grantDocumentPermission(\\n documentId: String!\\n userAddress: String!\\n permission: DocumentPermissionLevel!\\n ): DocumentPermissionEntry!\\n\\n # Revoke a user's permission on a document (requires ADMIN permission or global admin)\\n revokeDocumentPermission(documentId: String!, userAddress: String!): Boolean!\\n\\n # --- Group Management ---\\n\\n # Create a new group\\n createGroup(name: String!, description: String): Group!\\n\\n # Delete a group and all its associations\\n deleteGroup(id: Int!): Boolean!\\n\\n # Add a user to a group\\n addUserToGroup(userAddress: String!, groupId: Int!): Boolean!\\n\\n # Remove a user from a group\\n removeUserFromGroup(userAddress: String!, groupId: Int!): Boolean!\\n\\n # --- Group Document Permissions ---\\n\\n # Grant a group permission on a document\\n grantGroupPermission(\\n documentId: String!\\n groupId: Int!\\n permission: DocumentPermissionLevel!\\n ): DocumentGroupPermission!\\n\\n # Revoke a group's permission on a document\\n revokeGroupPermission(documentId: String!, groupId: Int!): Boolean!\\n\\n # --- Operation Permissions ---\\n\\n # Grant a user permission to execute an operation on a document\\n grantOperationPermission(\\n documentId: String!\\n operationType: String!\\n userAddress: String!\\n ): OperationUserPermission!\\n\\n # Revoke a user's permission to execute an operation\\n revokeOperationPermission(\\n documentId: String!\\n operationType: String!\\n userAddress: String!\\n ): Boolean!\\n\\n # Grant a group permission to execute an operation on a document\\n grantGroupOperationPermission(\\n documentId: String!\\n operationType: String!\\n groupId: Int!\\n ): OperationGroupPermission!\\n\\n # Revoke a group's permission to execute an operation\\n revokeGroupOperationPermission(\\n documentId: String!\\n operationType: String!\\n groupId: Int!\\n ): Boolean!\\n}\\n\"","import { GraphQLError } from \"graphql\";\nimport type { AuthorizationService } from \"../../services/authorization.service.js\";\nimport type {\n DocumentPermissionService,\n GetParentIdsFn,\n} from \"../../services/document-permission.service.js\";\nimport type { DocumentPermissionLevel } from \"../../utils/db.js\";\nimport type { IReactorClient } from \"@powerhousedao/reactor\";\n\n// ============================================\n// Document Permission Resolvers\n// ============================================\n\nexport type DocumentAccessInfo = {\n documentId: string;\n permissions: Array<{\n documentId: string;\n userAddress: string;\n permission: DocumentPermissionLevel;\n grantedBy: string;\n createdAt: Date;\n updatedAt: Date;\n }>;\n groupPermissions: Array<{\n documentId: string;\n groupId: number;\n permission: DocumentPermissionLevel;\n grantedBy: string;\n createdAt: Date;\n updatedAt: Date;\n }>;\n};\n\nexport async function documentAccess(\n service: DocumentPermissionService,\n args: { documentId: string },\n): Promise<DocumentAccessInfo> {\n const permissions = await service.getDocumentPermissions(args.documentId);\n const groupPermissions = await service.getDocumentGroupPermissions(\n args.documentId,\n );\n\n return {\n documentId: args.documentId,\n permissions,\n groupPermissions,\n };\n}\n\nexport async function userDocumentPermissions(\n service: DocumentPermissionService,\n userAddress: string,\n): Promise<\n Array<{\n documentId: string;\n userAddress: string;\n permission: DocumentPermissionLevel;\n grantedBy: string;\n createdAt: Date;\n updatedAt: Date;\n }>\n> {\n return service.getUserDocuments(userAddress);\n}\n\nexport async function grantDocumentPermission(\n service: DocumentPermissionService,\n args: {\n documentId: string;\n userAddress: string;\n permission: DocumentPermissionLevel;\n },\n grantedByAddress: string | undefined,\n isGlobalAdmin: boolean,\n): Promise<{\n documentId: string;\n userAddress: string;\n permission: DocumentPermissionLevel;\n grantedBy: string;\n createdAt: Date;\n updatedAt: Date;\n}> {\n // Check authorization: must be global admin or document admin\n if (!grantedByAddress) {\n throw new GraphQLError(\"Authentication required\");\n }\n\n if (!isGlobalAdmin) {\n const canManage = await service.canManageDocument(\n args.documentId,\n grantedByAddress,\n );\n if (!canManage) {\n throw new GraphQLError(\n \"Forbidden: You must be an admin of this document to grant permissions\",\n );\n }\n }\n\n return service.grantPermission(\n args.documentId,\n args.userAddress,\n args.permission,\n grantedByAddress,\n );\n}\n\nexport async function revokeDocumentPermission(\n service: DocumentPermissionService,\n args: { documentId: string; userAddress: string },\n revokedByAddress: string | undefined,\n isGlobalAdmin: boolean,\n): Promise<boolean> {\n // Check authorization: must be global admin or document admin\n if (!revokedByAddress) {\n throw new GraphQLError(\"Authentication required\");\n }\n\n if (!isGlobalAdmin) {\n const canManage = await service.canManageDocument(\n args.documentId,\n revokedByAddress,\n );\n if (!canManage) {\n throw new GraphQLError(\n \"Forbidden: You must be an admin of this document to revoke permissions\",\n );\n }\n }\n\n await service.revokePermission(args.documentId, args.userAddress);\n return true;\n}\n\n/**\n * Create a getParentIds function using the reactor client\n */\nexport function createGetParentIdsFn(\n reactorClient: IReactorClient,\n): GetParentIdsFn {\n return async (documentId: string): Promise<string[]> => {\n try {\n const result = await reactorClient.getParents(documentId);\n return result.results.map((doc) => doc.header.id);\n } catch {\n // If document has no parents or error, return empty array\n return [];\n }\n };\n}\n\n// ============================================\n// Group Resolvers\n// ============================================\n\nexport type Group = {\n id: number;\n name: string;\n description: string | null;\n createdAt: Date;\n updatedAt: Date;\n};\n\nexport async function groups(\n service: DocumentPermissionService,\n): Promise<Group[]> {\n return service.listGroups();\n}\n\nexport async function group(\n service: DocumentPermissionService,\n args: { id: number },\n): Promise<Group | null> {\n return service.getGroup(args.id);\n}\n\nexport async function userGroups(\n service: DocumentPermissionService,\n args: { userAddress: string },\n): Promise<Group[]> {\n return service.getUserGroups(args.userAddress);\n}\n\nexport async function createGroup(\n service: DocumentPermissionService,\n args: { name: string; description?: string | null },\n): Promise<Group> {\n return service.createGroup(args.name, args.description ?? undefined);\n}\n\nexport async function deleteGroup(\n service: DocumentPermissionService,\n args: { id: number },\n): Promise<boolean> {\n await service.deleteGroup(args.id);\n return true;\n}\n\nexport async function addUserToGroup(\n service: DocumentPermissionService,\n args: { userAddress: string; groupId: number },\n): Promise<boolean> {\n await service.addUserToGroup(args.userAddress, args.groupId);\n return true;\n}\n\nexport async function removeUserFromGroup(\n service: DocumentPermissionService,\n args: { userAddress: string; groupId: number },\n): Promise<boolean> {\n await service.removeUserFromGroup(args.userAddress, args.groupId);\n return true;\n}\n\nexport async function getGroupMembers(\n service: DocumentPermissionService,\n groupId: number,\n): Promise<string[]> {\n return service.getGroupMembers(groupId);\n}\n\n// ============================================\n// Group Document Permission Resolvers\n// ============================================\n\nexport type DocumentGroupPermission = {\n documentId: string;\n groupId: number;\n permission: DocumentPermissionLevel;\n grantedBy: string;\n createdAt: Date;\n updatedAt: Date;\n};\n\nexport async function grantGroupPermission(\n service: DocumentPermissionService,\n args: {\n documentId: string;\n groupId: number;\n permission: DocumentPermissionLevel;\n },\n grantedByAddress: string | undefined,\n isGlobalAdmin: boolean,\n): Promise<DocumentGroupPermission> {\n // Check authorization: must be global admin or document admin\n if (!grantedByAddress) {\n throw new GraphQLError(\"Authentication required\");\n }\n\n if (!isGlobalAdmin) {\n const canManage = await service.canManageDocument(\n args.documentId,\n grantedByAddress,\n );\n if (!canManage) {\n throw new GraphQLError(\n \"Forbidden: You must be an admin of this document to grant permissions\",\n );\n }\n }\n\n return service.grantGroupPermission(\n args.documentId,\n args.groupId,\n args.permission,\n grantedByAddress,\n );\n}\n\nexport async function revokeGroupPermission(\n service: DocumentPermissionService,\n args: { documentId: string; groupId: number },\n revokedByAddress: string | undefined,\n isGlobalAdmin: boolean,\n): Promise<boolean> {\n // Check authorization: must be global admin or document admin\n if (!revokedByAddress) {\n throw new GraphQLError(\"Authentication required\");\n }\n\n if (!isGlobalAdmin) {\n const canManage = await service.canManageDocument(\n args.documentId,\n revokedByAddress,\n );\n if (!canManage) {\n throw new GraphQLError(\n \"Forbidden: You must be an admin of this document to revoke permissions\",\n );\n }\n }\n\n await service.revokeGroupPermission(args.documentId, args.groupId);\n return true;\n}\n\n// ============================================\n// Operation Permission Resolvers\n// ============================================\n\nexport type OperationUserPermission = {\n documentId: string;\n operationType: string;\n userAddress: string;\n grantedBy: string;\n createdAt: Date;\n};\n\nexport type OperationGroupPermission = {\n documentId: string;\n operationType: string;\n groupId: number;\n grantedBy: string;\n createdAt: Date;\n};\n\nexport type OperationPermissionsInfo = {\n documentId: string;\n operationType: string;\n userPermissions: OperationUserPermission[];\n groupPermissions: OperationGroupPermission[];\n};\n\nexport async function operationPermissions(\n service: DocumentPermissionService,\n args: { documentId: string; operationType: string },\n): Promise<OperationPermissionsInfo> {\n const userPermissions = await service.getOperationUserPermissions(\n args.documentId,\n args.operationType,\n );\n const groupPermissions = await service.getOperationGroupPermissions(\n args.documentId,\n args.operationType,\n );\n\n return {\n documentId: args.documentId,\n operationType: args.operationType,\n userPermissions,\n groupPermissions,\n };\n}\n\nexport async function canExecuteOperation(\n service: DocumentPermissionService,\n args: { documentId: string; operationType: string },\n userAddress: string | undefined,\n): Promise<boolean> {\n return service.canExecuteOperation(\n args.documentId,\n args.operationType,\n userAddress,\n );\n}\n\nexport async function grantOperationPermission(\n service: DocumentPermissionService,\n args: { documentId: string; operationType: string; userAddress: string },\n grantedByAddress: string | undefined,\n isGlobalAdmin: boolean,\n): Promise<OperationUserPermission> {\n if (!grantedByAddress) {\n throw new GraphQLError(\"Authentication required\");\n }\n\n if (!isGlobalAdmin) {\n const canManage = await service.canManageDocument(\n args.documentId,\n grantedByAddress,\n );\n if (!canManage) {\n throw new GraphQLError(\n \"Forbidden: You must be an admin of this document to grant operation permissions\",\n );\n }\n }\n\n return service.grantOperationPermission(\n args.documentId,\n args.operationType,\n args.userAddress,\n grantedByAddress,\n );\n}\n\nexport async function revokeOperationPermission(\n service: DocumentPermissionService,\n args: { documentId: string; operationType: string; userAddress: string },\n revokedByAddress: string | undefined,\n isGlobalAdmin: boolean,\n): Promise<boolean> {\n if (!revokedByAddress) {\n throw new GraphQLError(\"Authentication required\");\n }\n\n if (!isGlobalAdmin) {\n const canManage = await service.canManageDocument(\n args.documentId,\n revokedByAddress,\n );\n if (!canManage) {\n throw new GraphQLError(\n \"Forbidden: You must be an admin of this document to revoke operation permissions\",\n );\n }\n }\n\n await service.revokeOperationPermission(\n args.documentId,\n args.operationType,\n args.userAddress,\n );\n return true;\n}\n\nexport async function grantGroupOperationPermission(\n service: DocumentPermissionService,\n args: { documentId: string; operationType: string; groupId: number },\n grantedByAddress: string | undefined,\n isGlobalAdmin: boolean,\n): Promise<OperationGroupPermission> {\n if (!grantedByAddress) {\n throw new GraphQLError(\"Authentication required\");\n }\n\n if (!isGlobalAdmin) {\n const canManage = await service.canManageDocument(\n args.documentId,\n grantedByAddress,\n );\n if (!canManage) {\n throw new GraphQLError(\n \"Forbidden: You must be an admin of this document to grant operation permissions\",\n );\n }\n }\n\n return service.grantGroupOperationPermission(\n args.documentId,\n args.operationType,\n args.groupId,\n grantedByAddress,\n );\n}\n\nexport async function revokeGroupOperationPermission(\n service: DocumentPermissionService,\n args: { documentId: string; operationType: string; groupId: number },\n revokedByAddress: string | undefined,\n isGlobalAdmin: boolean,\n): Promise<boolean> {\n if (!revokedByAddress) {\n throw new GraphQLError(\"Authentication required\");\n }\n\n if (!isGlobalAdmin) {\n const canManage = await service.canManageDocument(\n args.documentId,\n revokedByAddress,\n );\n if (!canManage) {\n throw new GraphQLError(\n \"Forbidden: You must be an admin of this document to revoke operation permissions\",\n );\n }\n }\n\n await service.revokeGroupOperationPermission(\n args.documentId,\n args.operationType,\n args.groupId,\n );\n return true;\n}\n\n// ============================================\n// Document Protection Resolvers\n// ============================================\n\nexport type DocumentProtectionInfo = {\n documentId: string;\n protected: boolean;\n ownerAddress: string | null;\n};\n\nexport async function documentProtection(\n service: DocumentPermissionService,\n args: { documentId: string },\n): Promise<DocumentProtectionInfo> {\n return service.getDocumentProtection(args.documentId);\n}\n\nexport async function setDocumentProtection(\n service: DocumentPermissionService,\n authorizationService: AuthorizationService | undefined,\n args: { documentId: string; protected: boolean },\n userAddress: string | undefined,\n isGlobalAdmin: boolean,\n): Promise<DocumentProtectionInfo> {\n if (!userAddress) {\n throw new GraphQLError(\"Authentication required\");\n }\n\n // Check manage permission\n if (!isGlobalAdmin) {\n if (authorizationService) {\n const canManage = await authorizationService.canManage(\n args.documentId,\n userAddress,\n );\n if (!canManage) {\n throw new GraphQLError(\n \"Forbidden: You must be an admin of this document to change protection\",\n );\n }\n } else {\n const canManage = await service.canManageDocument(\n args.documentId,\n userAddress,\n );\n if (!canManage) {\n throw new GraphQLError(\n \"Forbidden: You must be an admin of this document to change protection\",\n );\n }\n }\n }\n\n await service.setDocumentProtection(args.documentId, args.protected);\n return service.getDocumentProtection(args.documentId);\n}\n\nexport async function transferDocumentOwnership(\n service: DocumentPermissionService,\n authorizationService: AuthorizationService | undefined,\n args: { documentId: string; newOwnerAddress: string },\n userAddress: string | undefined,\n isGlobalAdmin: boolean,\n): Promise<DocumentProtectionInfo> {\n if (!userAddress) {\n throw new GraphQLError(\"Authentication required\");\n }\n\n // Check manage permission\n if (!isGlobalAdmin) {\n if (authorizationService) {\n const canManage = await authorizationService.canManage(\n args.documentId,\n userAddress,\n );\n if (!canManage) {\n throw new GraphQLError(\n \"Forbidden: You must be an admin of this document to transfer ownership\",\n );\n }\n } else {\n const canManage = await service.canManageDocument(\n args.documentId,\n userAddress,\n );\n if (!canManage) {\n throw new GraphQLError(\n \"Forbidden: You must be an admin of this document to transfer ownership\",\n );\n }\n }\n }\n\n // Revoke old owner's explicit ADMIN grant before transferring\n const previousOwner = await service.getDocumentOwner(args.documentId);\n if (previousOwner) {\n await service.revokePermission(args.documentId, previousOwner);\n }\n\n await service.setDocumentOwner(args.documentId, args.newOwnerAddress);\n\n // Grant ADMIN to new owner\n await service.grantPermission(\n args.documentId,\n args.newOwnerAddress,\n \"ADMIN\",\n userAddress,\n );\n\n return service.getDocumentProtection(args.documentId);\n}\n","import { ConsoleLogger } from \"document-model\";\nimport { GraphQLError } from \"graphql\";\nimport { gql } from \"graphql-tag\";\nimport schemaSource from \"./schema.graphql\";\nimport { BaseSubgraph } from \"../base-subgraph.js\";\nimport type { SubgraphArgs } from \"../types.js\";\nimport * as resolvers from \"./resolvers.js\";\n\n/**\n * Auth Subgraph - handles all document permission and authorization operations\n *\n * This subgraph is conditionally registered based on the DOCUMENT_PERMISSIONS_ENABLED\n * feature flag. When enabled, it provides GraphQL operations for:\n * - Document permissions (grant/revoke user access)\n * - Group management (create/delete groups, manage membership)\n * - Group document permissions (grant/revoke group access)\n * - Operation-level permissions (fine-grained operation control)\n */\nexport class AuthSubgraph extends BaseSubgraph {\n private logger = new ConsoleLogger([\"AuthSubgraph\"]);\n\n constructor(args: SubgraphArgs) {\n super(args);\n this.logger.verbose(`constructor()`);\n }\n\n name = \"auth\";\n hasSubscriptions = false;\n\n typeDefs = gql(schemaSource);\n\n resolvers = {\n Query: {\n documentAccess: async (\n _parent: unknown,\n args: { documentId: string },\n ) => {\n this.logger.debug(\"documentAccess\", args);\n if (!this.documentPermissionService) {\n throw new GraphQLError(\"DocumentPermissionService not available\");\n }\n try {\n return await resolvers.documentAccess(\n this.documentPermissionService,\n args,\n );\n } catch (error) {\n this.logger.error(\"Error in documentAccess:\", error);\n throw error;\n }\n },\n\n userDocumentPermissions: async (\n _parent: unknown,\n _args: unknown,\n ctx: {\n user?: { address: string };\n },\n ) => {\n this.logger.debug(\"userDocumentPermissions\");\n if (!this.documentPermissionService) {\n throw new GraphQLError(\"DocumentPermissionService not available\");\n }\n if (!ctx.user?.address) {\n return [];\n }\n try {\n return await resolvers.userDocumentPermissions(\n this.documentPermissionService,\n ctx.user.address,\n );\n } catch (error) {\n this.logger.error(\"Error in userDocumentPermissions:\", error);\n throw error;\n }\n },\n\n groups: async () => {\n this.logger.debug(\"groups\");\n if (!this.documentPermissionService) {\n throw new GraphQLError(\"DocumentPermissionService not available\");\n }\n try {\n return await resolvers.groups(this.documentPermissionService);\n } catch (error) {\n this.logger.error(\"Error in groups:\", error);\n throw error;\n }\n },\n\n group: async (_parent: unknown, args: { id: number }) => {\n this.logger.debug(\"group\", args);\n if (!this.documentPermissionService) {\n throw new GraphQLError(\"DocumentPermissionService not available\");\n }\n try {\n return await resolvers.group(this.documentPermissionService, args);\n } catch (error) {\n this.logger.error(\"Error in group:\", error);\n throw error;\n }\n },\n\n userGroups: async (_parent: unknown, args: { userAddress: string }) => {\n this.logger.debug(\"userGroups\", args);\n if (!this.documentPermissionService) {\n throw new GraphQLError(\"DocumentPermissionService not available\");\n }\n try {\n return await resolvers.userGroups(\n this.documentPermissionService,\n args,\n );\n } catch (error) {\n this.logger.error(\"Error in userGroups:\", error);\n throw error;\n }\n },\n\n operationPermissions: async (\n _parent: unknown,\n args: { documentId: string; operationType: string },\n ) => {\n this.logger.debug(\"operationPermissions\", args);\n if (!this.documentPermissionService) {\n throw new GraphQLError(\"DocumentPermissionService not available\");\n }\n try {\n return await resolvers.operationPermissions(\n this.documentPermissionService,\n args,\n );\n } catch (error) {\n this.logger.error(\"Error in operationPermissions:\", error);\n throw error;\n }\n },\n\n canExecuteOperation: async (\n _parent: unknown,\n args: { documentId: string; operationType: string },\n ctx: { user?: { address: string } },\n ) => {\n this.logger.debug(\"canExecuteOperation\", args);\n if (!this.documentPermissionService) {\n throw new GraphQLError(\"DocumentPermissionService not available\");\n }\n try {\n return await resolvers.canExecuteOperation(\n this.documentPermissionService,\n args,\n ctx.user?.address,\n );\n } catch (error) {\n this.logger.error(\"Error in canExecuteOperation:\", error);\n throw error;\n }\n },\n\n documentProtection: async (\n _parent: unknown,\n args: { documentId: string },\n ctx: {\n user?: { address: string };\n },\n ) => {\n this.logger.debug(\"documentProtection\", args);\n if (!this.documentPermissionService) {\n throw new GraphQLError(\"DocumentPermissionService not available\");\n }\n if (!ctx.user?.address) {\n throw new GraphQLError(\n \"Authentication required to view document protection info\",\n );\n }\n try {\n return await resolvers.documentProtection(\n this.documentPermissionService,\n args,\n );\n } catch (error) {\n this.logger.error(\"Error in documentProtection:\", error);\n throw error;\n }\n },\n },\n\n Mutation: {\n setDocumentProtection: async (\n _parent: unknown,\n args: { documentId: string; protected: boolean },\n ctx: {\n user?: { address: string };\n isAdmin?: (address: string) => boolean;\n },\n ) => {\n this.logger.debug(\"setDocumentProtection\", args);\n if (!this.documentPermissionService) {\n throw new GraphQLError(\"DocumentPermissionService not available\");\n }\n try {\n const isGlobalAdmin = ctx.isAdmin?.(ctx.user?.address ?? \"\") ?? false;\n return await resolvers.setDocumentProtection(\n this.documentPermissionService,\n this.authorizationService,\n args,\n ctx.user?.address,\n isGlobalAdmin,\n );\n } catch (error) {\n this.logger.error(\"Error in setDocumentProtection:\", error);\n throw error;\n }\n },\n\n transferDocumentOwnership: async (\n _parent: unknown,\n args: { documentId: string; newOwnerAddress: string },\n ctx: {\n user?: { address: string };\n isAdmin?: (address: string) => boolean;\n },\n ) => {\n this.logger.debug(\"transferDocumentOwnership\", args);\n if (!this.documentPermissionService) {\n throw new GraphQLError(\"DocumentPermissionService not available\");\n }\n try {\n const isGlobalAdmin = ctx.isAdmin?.(ctx.user?.address ?? \"\") ?? false;\n return await resolvers.transferDocumentOwnership(\n this.documentPermissionService,\n this.authorizationService,\n args,\n ctx.user?.address,\n isGlobalAdmin,\n );\n } catch (error) {\n this.logger.error(\"Error in transferDocumentOwnership:\", error);\n throw error;\n }\n },\n\n grantDocumentPermission: async (\n _parent: unknown,\n args: { documentId: string; userAddress: string; permission: string },\n ctx: {\n user?: { address: string };\n isAdmin?: (address: string) => boolean;\n },\n ) => {\n this.logger.debug(\"grantDocumentPermission\", args);\n if (!this.documentPermissionService) {\n throw new GraphQLError(\"DocumentPermissionService not available\");\n }\n try {\n const isGlobalAdmin = ctx.isAdmin?.(ctx.user?.address ?? \"\") ?? false;\n return await resolvers.grantDocumentPermission(\n this.documentPermissionService,\n args as {\n documentId: string;\n userAddress: string;\n permission: \"READ\" | \"WRITE\" | \"ADMIN\";\n },\n ctx.user?.address,\n isGlobalAdmin,\n );\n } catch (error) {\n this.logger.error(\"Error in grantDocumentPermission:\", error);\n throw error;\n }\n },\n\n revokeDocumentPermission: async (\n _parent: unknown,\n args: { documentId: string; userAddress: string },\n ctx: {\n user?: { address: string };\n isAdmin?: (address: string) => boolean;\n },\n ) => {\n this.logger.debug(\"revokeDocumentPermission\", args);\n if (!this.documentPermissionService) {\n throw new GraphQLError(\"DocumentPermissionService not available\");\n }\n try {\n const isGlobalAdmin = ctx.isAdmin?.(ctx.user?.address ?? \"\") ?? false;\n return await resolvers.revokeDocumentPermission(\n this.documentPermissionService,\n args,\n ctx.user?.address,\n isGlobalAdmin,\n );\n } catch (error) {\n this.logger.error(\"Error in revokeDocumentPermission:\", error);\n throw error;\n }\n },\n\n // Group Management Mutations\n createGroup: async (\n _parent: unknown,\n args: { name: string; description?: string | null },\n ) => {\n this.logger.debug(\"createGroup\", args);\n if (!this.documentPermissionService) {\n throw new GraphQLError(\"DocumentPermissionService not available\");\n }\n try {\n return await resolvers.createGroup(\n this.documentPermissionService,\n args,\n );\n } catch (error) {\n this.logger.error(\"Error in createGroup:\", error);\n throw error;\n }\n },\n\n deleteGroup: async (_parent: unknown, args: { id: number }) => {\n this.logger.debug(\"deleteGroup\", args);\n if (!this.documentPermissionService) {\n throw new GraphQLError(\"DocumentPermissionService not available\");\n }\n try {\n return await resolvers.deleteGroup(\n this.documentPermissionService,\n args,\n );\n } catch (error) {\n this.logger.error(\"Error in deleteGroup:\", error);\n throw error;\n }\n },\n\n addUserToGroup: async (\n _parent: unknown,\n args: { userAddress: string; groupId: number },\n ) => {\n this.logger.debug(\"addUserToGroup\", args);\n if (!this.documentPermissionService) {\n throw new GraphQLError(\"DocumentPermissionService not available\");\n }\n try {\n return await resolvers.addUserToGroup(\n this.documentPermissionService,\n args,\n );\n } catch (error) {\n this.logger.error(\"Error in addUserToGroup:\", error);\n throw error;\n }\n },\n\n removeUserFromGroup: async (\n _parent: unknown,\n args: { userAddress: string; groupId: number },\n ) => {\n this.logger.debug(\"removeUserFromGroup\", args);\n if (!this.documentPermissionService) {\n throw new GraphQLError(\"DocumentPermissionService not available\");\n }\n try {\n return await resolvers.removeUserFromGroup(\n this.documentPermissionService,\n args,\n );\n } catch (error) {\n this.logger.error(\"Error in removeUserFromGroup:\", error);\n throw error;\n }\n },\n\n // Group Document Permission Mutations\n grantGroupPermission: async (\n _parent: unknown,\n args: { documentId: string; groupId: number; permission: string },\n ctx: {\n user?: { address: string };\n isAdmin?: (address: string) => boolean;\n },\n ) => {\n this.logger.debug(\"grantGroupPermission\", args);\n if (!this.documentPermissionService) {\n throw new GraphQLError(\"DocumentPermissionService not available\");\n }\n try {\n const isGlobalAdmin = ctx.isAdmin?.(ctx.user?.address ?? \"\") ?? false;\n return await resolvers.grantGroupPermission(\n this.documentPermissionService,\n args as {\n documentId: string;\n groupId: number;\n permission: \"READ\" | \"WRITE\" | \"ADMIN\";\n },\n ctx.user?.address,\n isGlobalAdmin,\n );\n } catch (error) {\n this.logger.error(\"Error in grantGroupPermission:\", error);\n throw error;\n }\n },\n\n revokeGroupPermission: async (\n _parent: unknown,\n args: { documentId: string; groupId: number },\n ctx: {\n user?: { address: string };\n isAdmin?: (address: string) => boolean;\n },\n ) => {\n this.logger.debug(\"revokeGroupPermission\", args);\n if (!this.documentPermissionService) {\n throw new GraphQLError(\"DocumentPermissionService not available\");\n }\n try {\n const isGlobalAdmin = ctx.isAdmin?.(ctx.user?.address ?? \"\") ?? false;\n return await resolvers.revokeGroupPermission(\n this.documentPermissionService,\n args,\n ctx.user?.address,\n isGlobalAdmin,\n );\n } catch (error) {\n this.logger.error(\"Error in revokeGroupPermission:\", error);\n throw error;\n }\n },\n\n // Operation Permission Mutations\n grantOperationPermission: async (\n _parent: unknown,\n args: {\n documentId: string;\n operationType: string;\n userAddress: string;\n },\n ctx: {\n user?: { address: string };\n isAdmin?: (address: string) => boolean;\n },\n ) => {\n this.logger.debug(\"grantOperationPermission\", args);\n if (!this.documentPermissionService) {\n throw new GraphQLError(\"DocumentPermissionService not available\");\n }\n try {\n const isGlobalAdmin = ctx.isAdmin?.(ctx.user?.address ?? \"\") ?? false;\n return await resolvers.grantOperationPermission(\n this.documentPermissionService,\n args,\n ctx.user?.address,\n isGlobalAdmin,\n );\n } catch (error) {\n this.logger.error(\"Error in grantOperationPermission:\", error);\n throw error;\n }\n },\n\n revokeOperationPermission: async (\n _parent: unknown,\n args: {\n documentId: string;\n operationType: string;\n userAddress: string;\n },\n ctx: {\n user?: { address: string };\n isAdmin?: (address: string) => boolean;\n },\n ) => {\n this.logger.debug(\"revokeOperationPermission\", args);\n if (!this.documentPermissionService) {\n throw new GraphQLError(\"DocumentPermissionService not available\");\n }\n try {\n const isGlobalAdmin = ctx.isAdmin?.(ctx.user?.address ?? \"\") ?? false;\n return await resolvers.revokeOperationPermission(\n this.documentPermissionService,\n args,\n ctx.user?.address,\n isGlobalAdmin,\n );\n } catch (error) {\n this.logger.error(\"Error in revokeOperationPermission:\", error);\n throw error;\n }\n },\n\n grantGroupOperationPermission: async (\n _parent: unknown,\n args: { documentId: string; operationType: string; groupId: number },\n ctx: {\n user?: { address: string };\n isAdmin?: (address: string) => boolean;\n },\n ) => {\n this.logger.debug(\"grantGroupOperationPermission\", args);\n if (!this.documentPermissionService) {\n throw new GraphQLError(\"DocumentPermissionService not available\");\n }\n try {\n const isGlobalAdmin = ctx.isAdmin?.(ctx.user?.address ?? \"\") ?? false;\n return await resolvers.grantGroupOperationPermission(\n this.documentPermissionService,\n args,\n ctx.user?.address,\n isGlobalAdmin,\n );\n } catch (error) {\n this.logger.error(\"Error in grantGroupOperationPermission:\", error);\n throw error;\n }\n },\n\n revokeGroupOperationPermission: async (\n _parent: unknown,\n args: { documentId: string; operationType: string; groupId: number },\n ctx: {\n user?: { address: string };\n isAdmin?: (address: string) => boolean;\n },\n ) => {\n this.logger.debug(\"revokeGroupOperationPermission\", args);\n if (!this.documentPermissionService) {\n throw new GraphQLError(\"DocumentPermissionService not available\");\n }\n try {\n const isGlobalAdmin = ctx.isAdmin?.(ctx.user?.address ?? \"\") ?? false;\n return await resolvers.revokeGroupOperationPermission(\n this.documentPermissionService,\n args,\n ctx.user?.address,\n isGlobalAdmin,\n );\n } catch (error) {\n this.logger.error(\"Error in revokeGroupOperationPermission:\", error);\n throw error;\n }\n },\n },\n\n // Field Resolvers for nested types\n Group: {\n members: async (parent: { id: number }) => {\n if (!this.documentPermissionService) {\n throw new GraphQLError(\"DocumentPermissionService not available\");\n }\n return resolvers.getGroupMembers(\n this.documentPermissionService,\n parent.id,\n );\n },\n },\n\n DocumentGroupPermission: {\n group: async (parent: { groupId: number }) => {\n if (!this.documentPermissionService) {\n throw new GraphQLError(\"DocumentPermissionService not available\");\n }\n const grp = await resolvers.group(this.documentPermissionService, {\n id: parent.groupId,\n });\n if (!grp) {\n throw new GraphQLError(`Group not found: ${parent.groupId}`);\n }\n return grp;\n },\n },\n\n OperationGroupPermission: {\n group: async (parent: { groupId: number }) => {\n if (!this.documentPermissionService) {\n throw new GraphQLError(\"DocumentPermissionService not available\");\n }\n const grp = await resolvers.group(this.documentPermissionService, {\n id: parent.groupId,\n });\n if (!grp) {\n throw new GraphQLError(`Group not found: ${parent.groupId}`);\n }\n return grp;\n },\n },\n };\n\n onSetup(): Promise<void> {\n this.logger.debug(\"Setting up AuthSubgraph\");\n return Promise.resolve();\n }\n}\n","import type { AuthContext, AuthService } from \"../../services/auth.service.js\";\nimport type { FetchHandler } from \"./types.js\";\n\nexport type AuthFetchMiddleware = (handler: FetchHandler) => FetchHandler;\n\nconst authContextMap = new WeakMap<globalThis.Request, AuthContext>();\n\n/** Internal — only `graphql-manager.ts` should call this. */\nexport function getAuthContext(\n request: globalThis.Request,\n): AuthContext | undefined {\n return authContextMap.get(request);\n}\n\nexport function createAuthFetchMiddleware(\n authService: AuthService,\n): AuthFetchMiddleware {\n return (next: FetchHandler): FetchHandler =>\n async (request: globalThis.Request): Promise<globalThis.Response> => {\n const result = await authService.authenticateRequest(request);\n if (result instanceof globalThis.Response) return result;\n authContextMap.set(request, result);\n return next(request);\n };\n}\n","import type { useServer as wsUseServer } from \"graphql-ws/use/ws\";\n\nlet useServerImpl: typeof wsUseServer | null = null;\n\nif (process.env.VITEST !== \"true\" && process.env.NODE_ENV !== \"test\") {\n try {\n const { useServer } = await import(\"graphql-ws/use/ws\");\n useServerImpl = useServer;\n } catch (error) {\n console.warn(\n \"Failed to load graphql-ws WebSocket server. Subscriptions will not work.\",\n error,\n );\n }\n}\n\nexport const useServer =\n useServerImpl ||\n (() => {\n throw new Error(\n \"WebSocket server not available in test mode. Set NODE_ENV=production to enable.\",\n );\n });\n","import type {\n GetDataSourceFunction,\n GraphQLDataSourceProcessOptions,\n ServiceDefinition,\n SubgraphHealthCheckFunction,\n SupergraphSdlUpdateFunction,\n} from \"@apollo/gateway\";\nimport {\n ApolloGateway,\n LocalCompose,\n RemoteGraphQLDataSource,\n} from \"@apollo/gateway\";\nimport { ApolloServer, HeaderMap } from \"@apollo/server\";\nimport { ApolloServerPluginInlineTraceDisabled } from \"@apollo/server/plugin/disabled\";\nimport { ApolloServerPluginDrainHttpServer } from \"@apollo/server/plugin/drainHttpServer\";\nimport { ApolloServerPluginLandingPageLocalDefault } from \"@apollo/server/plugin/landingPage/default\";\nimport type { ILogger } from \"document-model\";\nimport type { GraphQLSchema } from \"graphql\";\nimport type http from \"node:http\";\nimport type { WebSocketServer } from \"ws\";\nimport type { Context } from \"../types.js\";\nimport { useServer } from \"../websocket.js\";\nimport type {\n FetchHandler,\n GatewayContextFactory,\n IGatewayAdapter,\n SubgraphDefinition,\n WsContextFactory,\n WsDisposer,\n} from \"./types.js\";\n\n// Forwards the incoming authorization header to federated subgraph requests.\nclass AuthenticatedDataSource extends RemoteGraphQLDataSource {\n willSendRequest(options: GraphQLDataSourceProcessOptions) {\n const { authorization } = options.context.headers as {\n authorization: string;\n };\n if (authorization && options?.request.http) {\n options.request.http.headers.set(\"authorization\", authorization);\n }\n }\n}\n\nexport class ApolloGatewayAdapter implements IGatewayAdapter<Context> {\n readonly #logger: ILogger;\n readonly #servers: ApolloServer<Context>[] = [];\n\n #supergraphServer: ApolloServer<Context> | null = null;\n #gatewayOptions: {\n update: SupergraphSdlUpdateFunction;\n healthCheck: SubgraphHealthCheckFunction;\n getDataSource: GetDataSourceFunction;\n } | null = null;\n #getSubgraphs: (() => SubgraphDefinition[]) | null = null;\n\n constructor(logger: ILogger) {\n this.#logger = logger;\n }\n\n async start(_httpServer: http.Server): Promise<void> {\n // Per-subgraph Apollo servers start lazily in createHandler.\n // Nothing to do here.\n }\n\n async createHandler(\n schema: GraphQLSchema,\n contextFactory: GatewayContextFactory<Context>,\n ): Promise<FetchHandler> {\n const server = new ApolloServer<Context>({\n schema,\n logger: this.#logger,\n introspection: true,\n plugins: [\n ApolloServerPluginInlineTraceDisabled(),\n ApolloServerPluginLandingPageLocalDefault(),\n ],\n });\n await server.start();\n this.#servers.push(server);\n return createApolloFetchHandler(server, contextFactory);\n }\n\n async createSupergraphHandler(\n getSubgraphs: () => SubgraphDefinition[],\n httpServer: http.Server,\n contextFactory: GatewayContextFactory<Context>,\n ): Promise<FetchHandler> {\n if (this.#supergraphServer) {\n throw new Error(\"Supergraph server is already running\");\n }\n\n this.#getSubgraphs = getSubgraphs;\n\n const gateway = new ApolloGateway({\n supergraphSdl: async (options) => {\n this.#gatewayOptions = options;\n return await this.#buildSupergraphSdl();\n },\n buildService: (serviceConfig) =>\n new AuthenticatedDataSource(serviceConfig),\n });\n\n this.#supergraphServer = new ApolloServer<Context>({\n gateway,\n logger: this.#logger,\n introspection: true,\n plugins: [\n ApolloServerPluginDrainHttpServer({ httpServer }),\n ApolloServerPluginInlineTraceDisabled(),\n ApolloServerPluginLandingPageLocalDefault(),\n ],\n });\n\n await this.#supergraphServer.start();\n return createApolloFetchHandler(this.#supergraphServer, contextFactory);\n }\n\n async updateSupergraph(): Promise<void> {\n if (!this.#gatewayOptions || !this.#getSubgraphs) {\n // Not yet initialized - no-op.\n return;\n }\n const { supergraphSdl } = await this.#buildSupergraphSdl();\n this.#gatewayOptions.update(supergraphSdl);\n }\n\n async #buildSupergraphSdl() {\n if (!this.#gatewayOptions || !this.#getSubgraphs) {\n throw new Error(\"Gateway is not ready\");\n }\n const serviceList: ServiceDefinition[] = this.#getSubgraphs().map((s) => ({\n name: s.name,\n typeDefs: s.typeDefs,\n url: s.url,\n }));\n const localCompose = new LocalCompose({ localServiceList: serviceList });\n return localCompose.initialize(this.#gatewayOptions);\n }\n\n attachWebSocket(\n wsServer: WebSocketServer,\n schema: GraphQLSchema,\n contextFactory: WsContextFactory<Context>,\n ): WsDisposer {\n return useServer(\n {\n schema,\n context: async (ctx: {\n connectionParams?: Record<string, unknown>;\n }) => {\n const connectionParams = (ctx.connectionParams ?? {}) as Record<\n string,\n unknown\n >;\n return contextFactory(connectionParams);\n },\n },\n wsServer,\n );\n }\n\n async stop(): Promise<void> {\n await Promise.all(this.#servers.map((s) => s.stop()));\n this.#servers.length = 0;\n\n if (this.#supergraphServer) {\n await this.#supergraphServer.stop();\n this.#supergraphServer = null;\n }\n this.#gatewayOptions = null;\n this.#getSubgraphs = null;\n }\n}\n\n/**\n * Wrap an existing ApolloServer as a Fetch API handler.\n * Does not manage server lifecycle; caller is responsible for start/stop.\n */\nexport function createApolloFetchHandler(\n server: ApolloServer<Context>,\n contextFactory: GatewayContextFactory<Context>,\n): FetchHandler {\n return async (request: Request): Promise<Response> => {\n const url = new URL(request.url);\n const headers = new HeaderMap();\n request.headers.forEach((value, key) => headers.set(key, value));\n\n let body: unknown = undefined;\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n try {\n body = (await request.json()) as unknown;\n } catch {\n // body may be empty for some requests\n }\n }\n\n const result = await server.executeHTTPGraphQLRequest({\n httpGraphQLRequest: {\n method: request.method.toUpperCase(),\n headers,\n search: url.search,\n body,\n },\n context: () => contextFactory(request),\n });\n\n const responseHeaders = new Headers();\n for (const [key, value] of result.headers) {\n responseHeaders.set(key, value);\n }\n\n let responseBody: string;\n if (result.body.kind === \"complete\") {\n responseBody = result.body.string;\n } else {\n const chunks: string[] = [];\n for await (const chunk of result.body.asyncIterator) {\n chunks.push(chunk);\n }\n responseBody = chunks.join(\"\");\n }\n\n return new Response(responseBody, {\n status: result.status ?? 200,\n headers: responseHeaders,\n });\n };\n}\n","import type { MercuriusGatewayOptions } from \"@mercuriusjs/gateway\";\nimport mercuriusGateway from \"@mercuriusjs/gateway\";\nimport Fastify from \"fastify\";\nimport type {\n FastifyInstance,\n FastifyPluginCallback,\n FastifyReply,\n FastifyRequest,\n} from \"fastify\";\nimport mercurius from \"mercurius\";\nimport type { MercuriusOptions } from \"mercurius\";\nimport type { ILogger } from \"document-model\";\nimport type { GraphQLSchema } from \"graphql\";\nimport type http from \"node:http\";\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { WebSocketServer } from \"ws\";\nimport type { Context } from \"../types.js\";\nimport { useServer } from \"../websocket.js\";\nimport type {\n FetchHandler,\n GatewayContextFactory,\n IGatewayAdapter,\n SubgraphDefinition,\n WsContextFactory,\n WsDisposer,\n} from \"./types.js\";\n\n/**\n * Threads the original Fetch API Request through Mercurius's internal\n * fastify.inject() call so that contextFactory (which uses the auth WeakMap\n * from auth-middleware.ts) receives the same Request object that auth\n * middleware populated before calling the handler.\n */\nconst requestAls = new AsyncLocalStorage<Request>();\n\n// @mercuriusjs/gateway exports a plain `(instance, opts) => void` rather than\n// a typed FastifyPluginCallback — cast once here.\n// The gateway plugin's accepted options are the intersection of the base\n// MercuriusOptions and MercuriusGatewayOptions (mirroring the unexported\n// MercuriusFederationOptions type in the package).\ntype GatewayPluginOptions = MercuriusOptions & MercuriusGatewayOptions;\nconst mercuriusGatewayPlugin =\n mercuriusGateway as unknown as FastifyPluginCallback<GatewayPluginOptions>;\n\nexport class MercuriusGatewayAdapter implements IGatewayAdapter<Context> {\n readonly #logger: ILogger;\n readonly #subgraphApps: FastifyInstance[] = [];\n\n #supergraphApp: FastifyInstance | null = null;\n #getSubgraphs: (() => SubgraphDefinition[]) | null = null;\n #supergraphContextFactory: GatewayContextFactory<Context> | null = null;\n\n constructor(logger: ILogger) {\n this.#logger = logger;\n }\n\n async start(_httpServer: http.Server): Promise<void> {\n // Mercurius instances are started lazily in createHandler /\n // createSupergraphHandler — nothing to do here.\n }\n\n async createHandler(\n schema: GraphQLSchema,\n contextFactory: GatewayContextFactory<Context>,\n ): Promise<FetchHandler> {\n const app = await buildMercuriusApp(schema, contextFactory, this.#logger);\n this.#subgraphApps.push(app);\n return buildFetchHandler(app);\n }\n\n async createSupergraphHandler(\n getSubgraphs: () => SubgraphDefinition[],\n _httpServer: http.Server,\n contextFactory: GatewayContextFactory<Context>,\n ): Promise<FetchHandler> {\n if (this.#supergraphApp) {\n throw new Error(\"Supergraph is already running\");\n }\n this.#getSubgraphs = getSubgraphs;\n this.#supergraphContextFactory = contextFactory;\n this.#supergraphApp = await buildGatewayApp(\n getSubgraphs(),\n contextFactory,\n this.#logger,\n );\n\n // Capture `this` so the returned handler always delegates to the *current*\n // #supergraphApp, allowing updateSupergraph() to swap it atomically.\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const adapter = this;\n return (request: Request): Promise<Response> => {\n if (!adapter.#supergraphApp) {\n return Promise.resolve(\n new Response(\"Gateway not ready\", { status: 503 }),\n );\n }\n return requestAls.run(request, () =>\n injectRequest(adapter.#supergraphApp!, request),\n );\n };\n }\n\n async updateSupergraph(): Promise<void> {\n if (!this.#getSubgraphs || !this.#supergraphContextFactory) return;\n const newApp = await buildGatewayApp(\n this.#getSubgraphs(),\n this.#supergraphContextFactory,\n this.#logger,\n );\n const oldApp = this.#supergraphApp;\n // Swap atomically — in-flight requests on the old app finish normally.\n this.#supergraphApp = newApp;\n if (oldApp) await oldApp.close();\n }\n\n attachWebSocket(\n wsServer: WebSocketServer,\n schema: GraphQLSchema,\n contextFactory: WsContextFactory<Context>,\n ): WsDisposer {\n // Use graphql-ws directly; Mercurius's own subscription transport is\n // Fastify-specific and not applicable here.\n return useServer(\n {\n schema,\n context: async (ctx: { connectionParams?: Record<string, unknown> }) =>\n contextFactory(ctx.connectionParams ?? {}),\n },\n wsServer,\n );\n }\n\n async stop(): Promise<void> {\n await Promise.all(this.#subgraphApps.map((app) => app.close()));\n this.#subgraphApps.length = 0;\n if (this.#supergraphApp) {\n await this.#supergraphApp.close();\n this.#supergraphApp = null;\n }\n this.#getSubgraphs = null;\n this.#supergraphContextFactory = null;\n }\n}\n\n// ── Fastify instance factories ────────────────────────────────────────────────\n\nfunction makeContextFn(\n contextFactory: GatewayContextFactory<Context>,\n logger: ILogger,\n) {\n return (_req: FastifyRequest, _reply: FastifyReply) => {\n const request = requestAls.getStore();\n if (!request) {\n logger.error(\"[mercurius] No Fetch Request in AsyncLocalStorage\");\n throw new Error(\"No Fetch Request in AsyncLocalStorage\");\n }\n return contextFactory(request);\n };\n}\n\nasync function buildMercuriusApp(\n schema: GraphQLSchema,\n contextFactory: GatewayContextFactory<Context>,\n logger: ILogger,\n): Promise<FastifyInstance> {\n const app = Fastify({ logger: false });\n\n await app.register(mercurius, {\n schema,\n graphiql: false,\n context: makeContextFn(contextFactory, logger),\n // Override _Service.sdl to rewrite \"type Query/Mutation/Subscription {\"\n // as \"extend type … {\" so that @mercuriusjs/gateway v5 (which follows the\n // Federation v1 convention of using extensionTypeMap) correctly maps root\n // operation fields to this service during query planning.\n resolvers: {\n _Service: {\n sdl: (parent: { sdl?: string }) =>\n (parent.sdl ?? \"\").replace(\n /\\btype\\s+(Query|Mutation|Subscription)\\s*\\{/g,\n \"extend type $1 {\",\n ),\n },\n },\n } satisfies MercuriusOptions);\n\n await app.ready();\n return app;\n}\n\n/**\n * Builds a Mercurius federation gateway that composes the given subgraph\n * services. Each service URL must be reachable so that the gateway can fetch\n * its SDL via `_service { sdl }` (Apollo Federation protocol).\n */\nasync function buildGatewayApp(\n subgraphs: SubgraphDefinition[],\n contextFactory: GatewayContextFactory<Context>,\n logger: ILogger,\n): Promise<FastifyInstance> {\n const app = Fastify({ logger: false });\n\n await app.register(mercuriusGatewayPlugin, {\n gateway: {\n services: subgraphs.map((s) => ({ name: s.name, url: s.url })),\n },\n graphiql: false,\n context: makeContextFn(contextFactory, logger),\n });\n\n await app.ready();\n return app;\n}\n\n// ── Fetch API bridge ──────────────────────────────────────────────────────────\n\nfunction buildFetchHandler(app: FastifyInstance): FetchHandler {\n return (request: Request): Promise<Response> =>\n requestAls.run(request, () => injectRequest(app, request));\n}\n\nasync function injectRequest(\n app: FastifyInstance,\n request: Request,\n): Promise<Response> {\n const body =\n request.method !== \"GET\" && request.method !== \"HEAD\"\n ? await request.text()\n : undefined;\n\n const headers: Record<string, string> = {};\n request.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n const response = await app.inject({\n method: request.method as\n | \"DELETE\"\n | \"GET\"\n | \"HEAD\"\n | \"OPTIONS\"\n | \"PATCH\"\n | \"POST\"\n | \"PUT\",\n url: \"/graphql\",\n headers,\n payload: body,\n });\n\n const responseHeaders: Record<string, string> = {};\n for (const [key, value] of Object.entries(response.headers)) {\n if (value !== undefined) responseHeaders[key] = String(value);\n }\n\n return new Response(response.payload, {\n status: response.statusCode,\n headers: responseHeaders,\n });\n}\n","import bodyParser from \"body-parser\";\nimport cors from \"cors\";\nimport type { CorsOptions } from \"cors\";\nimport devcert from \"devcert\";\nimport type express from \"express\";\nimport type { Express } from \"express\";\nimport { Router } from \"express\";\nimport expressLib from \"express\";\nimport type { IRouter } from \"express\";\nimport fs from \"node:fs\";\nimport http from \"node:http\";\nimport https from \"node:https\";\nimport path from \"node:path\";\nimport { match, type MatchFunction, type ParamData } from \"path-to-regexp\";\nimport type { FetchHandler, IHttpAdapter, TlsOptions } from \"./types.js\";\n\nexport class ExpressHttpAdapter implements IHttpAdapter {\n readonly #app: Express;\n readonly #router: IRouter;\n readonly #handlers = new Map<\n string,\n { handler: FetchHandler; matcher: MatchFunction<ParamData> }\n >();\n\n constructor(existingApp?: Express) {\n this.#app = existingApp ?? expressLib();\n this.#router = Router();\n this.#app.use(this.#router);\n }\n\n setupSentryErrorHandler(sentry: object): void {\n const s = sentry as {\n setupExpressErrorHandler(app: Express): void;\n };\n s.setupExpressErrorHandler(this.#app);\n }\n\n get handle(): unknown {\n return this.#app;\n }\n\n mountRawMiddleware(middleware: unknown): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.#app.use(middleware as any);\n }\n\n mountNodeRoute(\n method: \"DELETE\" | \"GET\" | \"POST\",\n path: string,\n handler: (\n req: http.IncomingMessage,\n res: http.ServerResponse,\n body?: unknown,\n ) => void,\n ): void {\n const m = method.toLowerCase() as \"delete\" | \"get\" | \"post\";\n this.#app[m](path, (req: express.Request, res: express.Response) =>\n handler(req, res, req.body as unknown),\n );\n }\n\n setupMiddleware({\n corsOptions,\n bodyLimit = \"50mb\",\n }: {\n corsOptions?: CorsOptions;\n bodyLimit?: string;\n }): void {\n this.#router.use(cors(corsOptions));\n this.#router.use(bodyParser.json({ limit: bodyLimit }));\n this.#router.use(\n bodyParser.urlencoded({ extended: true, limit: bodyLimit }),\n );\n\n // Dispatcher registered AFTER bodyParser so req.body is populated when it fires.\n this.#router.use((req, res, next) => {\n for (const { handler, matcher } of this.#handlers.values()) {\n if (matcher(req.path)) {\n this.#serveFetchHandler(handler, req, res, next);\n return;\n }\n }\n next();\n });\n }\n\n mount(\n path: string,\n handler: FetchHandler,\n { exact = false }: { exact?: boolean } = {},\n ): void {\n if (exact) {\n this.#router.use(path, (req, res, next) =>\n this.#serveFetchHandler(handler, req, res, next),\n );\n } else {\n // Exact match - stored in the internal dispatch map\n this.#handlers.set(path, {\n handler,\n matcher: match(path),\n });\n }\n }\n\n getRoute(\n routePath: string,\n handler: (request: Request) => Response | Promise<Response>,\n ): void {\n this.#app.get(routePath, (req, res) => {\n const protocol = req.protocol;\n const host = req.get(\"host\") ?? \"localhost\";\n const url = `${protocol}://${host}${req.originalUrl}`;\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (typeof value === \"string\") {\n headers.set(key, value);\n } else if (Array.isArray(value)) {\n headers.set(key, value.join(\", \"));\n }\n }\n const fetchRequest = new Request(url, { method: \"GET\", headers });\n Promise.resolve(handler(fetchRequest))\n .then(async (response) => {\n res.status(response.status);\n response.headers.forEach((value, key) => {\n res.setHeader(key, value);\n });\n res.send(await response.text());\n })\n .catch((err: unknown) => {\n res.status(500).send(String(err));\n });\n });\n }\n\n async listen(port: number, tls?: TlsOptions): Promise<http.Server> {\n let server: http.Server;\n\n if (tls === true) {\n const { cert, key } = (await devcert.certificateFor(\"localhost\")) as {\n cert: Buffer;\n key: Buffer;\n };\n if (!cert || !key) {\n throw new Error(\"Invalid certificate generated\");\n }\n server = https.createServer({ cert, key }, this.#app);\n } else if (tls && \"keyPath\" in tls) {\n const currentDir = process.cwd();\n server = https.createServer(\n {\n key: fs.readFileSync(path.join(currentDir, tls.keyPath)),\n cert: fs.readFileSync(path.join(currentDir, tls.certPath)),\n },\n this.#app,\n );\n } else if (tls && \"cert\" in tls) {\n server = https.createServer({ cert: tls.cert, key: tls.key }, this.#app);\n } else {\n server = http.createServer(this.#app);\n }\n\n return new Promise<http.Server>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(port, () => {\n server.off(\"error\", reject);\n resolve(server);\n });\n });\n }\n\n #serveFetchHandler(\n handler: FetchHandler,\n req: express.Request,\n res: express.Response,\n next: express.NextFunction,\n ): void {\n // Build the full URL for the Fetch Request\n const protocol = req.protocol;\n const host = req.get(\"host\") ?? \"localhost\";\n const url = `${protocol}://${host}${req.originalUrl}`;\n\n // Convert Node.js incoming headers to Fetch Headers\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (typeof value === \"string\") {\n headers.set(key, value);\n } else if (Array.isArray(value)) {\n headers.set(key, value.join(\", \"));\n }\n }\n\n // bodyParser has already run, so req.body is a parsed JS value.\n // Re-serialize it so the Fetch Request body stream is readable.\n let body: string | undefined;\n if (\n req.method !== \"GET\" &&\n req.method !== \"HEAD\" &&\n req.body !== undefined\n ) {\n body = JSON.stringify(req.body);\n }\n\n const fetchRequest = new Request(url, {\n method: req.method,\n headers,\n body,\n });\n\n Promise.resolve(handler(fetchRequest))\n .then(async (response) => {\n res.status(response.status);\n response.headers.forEach((value, key) => {\n res.setHeader(key, value);\n });\n const responseBody = await response.text();\n res.send(responseBody);\n })\n .catch(next);\n }\n}\n\nexport function createExpressHttpAdapter(existingApp?: Express): {\n adapter: IHttpAdapter;\n} {\n return { adapter: new ExpressHttpAdapter(existingApp) };\n}\n","import fastifyCors from \"@fastify/cors\";\nimport fastifyFormbody from \"@fastify/formbody\";\nimport fastifyMiddie from \"@fastify/middie\";\nimport devcert from \"devcert\";\nimport Fastify from \"fastify\";\nimport type { FastifyInstance, FastifyReply, FastifyRequest } from \"fastify\";\nimport type { CorsOptions } from \"cors\";\nimport fs from \"node:fs\";\nimport http from \"node:http\";\nimport https from \"node:https\";\nimport nodePath from \"node:path\";\nimport { match, type MatchFunction, type ParamData } from \"path-to-regexp\";\nimport type { FetchHandler, IHttpAdapter, TlsOptions } from \"./types.js\";\n\n/**\n * Normalises a route path for path-to-regexp v8:\n * - Collapses duplicate slashes (e.g. \"//explorer\" → \"/explorer\")\n * - Converts legacy optional-param syntax \":param?\" → \"{/:param}?\"\n */\nfunction normalizePath(path: string): string {\n return path.replace(/\\/+/g, \"/\").replace(/:(\\w+)\\?/g, \"{/:$1}\");\n}\n\n/** Parses body-limit strings like \"50mb\" to bytes. */\nfunction parseBodyLimit(limit: string): number {\n const m = /^(\\d+(?:\\.\\d+)?)\\s*(b|kb|mb|gb)?$/i.exec(limit.trim());\n if (!m) return 52_428_800; // 50 MB fallback\n const n = parseFloat(m[1]);\n const units: Record<string, number> = {\n b: 1,\n kb: 1_024,\n mb: 1_048_576,\n gb: 1_073_741_824,\n };\n return Math.round(n * (units[(m[2] ?? \"b\").toLowerCase()] ?? 1));\n}\n\ntype FetchEntry = {\n handler: FetchHandler;\n matcher: MatchFunction<ParamData>;\n prefix: boolean;\n};\n\ntype GetEntry = {\n handler: (r: Request) => Response | Promise<Response>;\n matcher: MatchFunction<ParamData>;\n};\n\ntype NodeEntry = {\n method: \"DELETE\" | \"GET\" | \"POST\";\n handler: (\n req: http.IncomingMessage,\n res: http.ServerResponse,\n body?: unknown,\n ) => void;\n};\n\n// Pre-listen configuration ops (need the Fastify instance to apply).\ntype SetupOp =\n | { kind: \"cors\"; options?: CorsOptions; bodyLimit: number }\n | { kind: \"middie\"; middleware: unknown };\n\nexport class FastifyHttpAdapter implements IHttpAdapter {\n // Dispatch maps — populated at any time (before or after listen).\n readonly #fetchRoutes: FetchEntry[] = [];\n readonly #getRoutes: Map<string, GetEntry> = new Map();\n // path → method → handler\n readonly #nodeRoutes: Map<string, Map<string, NodeEntry[\"handler\"]>> =\n new Map();\n\n // Ops that need the Fastify instance (CORS config, Connect middleware).\n readonly #setupOps: SetupOp[] = [];\n\n #instance: FastifyInstance | undefined;\n\n get handle(): unknown {\n return this.#instance;\n }\n\n setupMiddleware({\n corsOptions,\n bodyLimit = \"50mb\",\n }: {\n corsOptions?: CorsOptions;\n bodyLimit?: string;\n }): void {\n this.#setupOps.push({\n kind: \"cors\",\n options: corsOptions,\n bodyLimit: parseBodyLimit(bodyLimit),\n });\n }\n\n mount(\n path: string,\n handler: FetchHandler,\n { exact = false }: { exact?: boolean } = {},\n ): void {\n this.#fetchRoutes.push({\n handler,\n // exact=false → exact path match; exact=true → prefix match.\n matcher: match(normalizePath(path), { end: !exact }),\n prefix: exact,\n });\n }\n\n getRoute(\n path: string,\n handler: (request: Request) => Response | Promise<Response>,\n ): void {\n this.#getRoutes.set(path, { handler, matcher: match(normalizePath(path)) });\n }\n\n mountNodeRoute(\n method: \"DELETE\" | \"GET\" | \"POST\",\n path: string,\n handler: (\n req: http.IncomingMessage,\n res: http.ServerResponse,\n body?: unknown,\n ) => void,\n ): void {\n if (!this.#nodeRoutes.has(path)) {\n this.#nodeRoutes.set(path, new Map());\n }\n this.#nodeRoutes.get(path)!.set(method, handler);\n }\n\n mountRawMiddleware(middleware: unknown): void {\n if (this.#instance) {\n // @fastify/middie is always registered, so .use() is available post-listen.\n (\n this.#instance as FastifyInstance & {\n use(middleware: unknown): FastifyInstance;\n }\n ).use(middleware);\n } else {\n this.#setupOps.push({ kind: \"middie\", middleware });\n }\n }\n\n setupSentryErrorHandler(sentry: object): void {\n if (!this.#instance) return;\n const s = sentry as {\n setupFastifyErrorHandler(app: FastifyInstance): void;\n };\n s.setupFastifyErrorHandler(this.#instance);\n }\n\n async listen(port: number, tls?: TlsOptions): Promise<http.Server> {\n let httpServer: http.Server;\n\n if (tls === true) {\n const { cert, key } = (await devcert.certificateFor(\"localhost\")) as {\n cert: Buffer;\n key: Buffer;\n };\n if (!cert || !key) throw new Error(\"Invalid certificate generated\");\n httpServer = https.createServer({ cert, key });\n } else if (tls && \"keyPath\" in tls) {\n const cwd = process.cwd();\n httpServer = https.createServer({\n key: fs.readFileSync(nodePath.join(cwd, tls.keyPath)),\n cert: fs.readFileSync(nodePath.join(cwd, tls.certPath)),\n });\n } else if (tls && \"cert\" in tls) {\n httpServer = https.createServer({ cert: tls.cert, key: tls.key });\n } else {\n httpServer = http.createServer();\n }\n\n const corsOp = this.#setupOps.find(\n (op): op is Extract<SetupOp, { kind: \"cors\" }> => op.kind === \"cors\",\n );\n const bodyLimit = corsOp?.bodyLimit ?? 52_428_800;\n\n const instance = Fastify({\n serverFactory: (handler) => {\n httpServer.on(\"request\", handler);\n return httpServer;\n },\n bodyLimit,\n logger: false,\n });\n\n this.#instance = instance;\n\n // Always register middie first so .use() is available post-listen.\n await instance.register(fastifyMiddie);\n await instance.register(fastifyFormbody);\n\n for (const op of this.#setupOps) {\n if (op.kind === \"cors\") {\n await instance.register(\n fastifyCors,\n op.options as Parameters<typeof fastifyCors>[1],\n );\n } else {\n (\n instance as FastifyInstance & {\n use(middleware: unknown): FastifyInstance;\n }\n ).use(op.middleware);\n }\n }\n\n // Single catch-all route — all dispatching is done via the Maps above so\n // that routes registered after listen() are picked up automatically.\n // OPTIONS is excluded because @fastify/cors registers its own OPTIONS /*\n // handler for preflight; including it here would cause a duplicate-route\n // conflict at startup.\n instance.route({\n method: [\"DELETE\", \"GET\", \"HEAD\", \"PATCH\", \"POST\", \"PUT\"],\n url: \"/*\",\n handler: (req, reply) => this.#dispatch(req, reply),\n });\n\n await instance.ready();\n\n return new Promise<http.Server>((resolve, reject) => {\n httpServer.once(\"error\", reject);\n httpServer.listen(port, () => {\n httpServer.off(\"error\", reject);\n resolve(httpServer);\n });\n });\n }\n\n #dispatch(req: FastifyRequest, reply: FastifyReply): void | Promise<void> {\n const pathname = new URL(req.url, \"http://localhost\").pathname;\n const method = req.method.toUpperCase() as \"DELETE\" | \"GET\" | \"POST\";\n\n // 1. Node routes — exact path + method, handler manages raw response.\n const nodeHandlers = this.#nodeRoutes.get(pathname);\n if (nodeHandlers) {\n const handler = nodeHandlers.get(method);\n if (handler) {\n reply.hijack();\n handler(req.raw, reply.raw, req.body);\n return;\n }\n }\n\n // 2. GET-specific routes (health, explorer, etc.).\n if (method === \"GET\") {\n for (const entry of this.#getRoutes.values()) {\n if (entry.matcher(pathname)) {\n return this.#serveGetEntry(entry, req, reply);\n }\n }\n }\n\n // 3. Fetch routes (GraphQL handlers, SSE, etc.).\n // Iterate in reverse so that the last-mounted handler wins when the same\n // path is mounted more than once (e.g. supergraph remount after reload).\n for (let i = this.#fetchRoutes.length - 1; i >= 0; i--) {\n const entry = this.#fetchRoutes[i]!;\n if (entry.matcher(pathname)) {\n return serveFetchHandler(entry.handler, req, reply);\n }\n }\n\n void reply.status(404).send({\n message: `Route ${req.method}:${pathname} not found`,\n error: \"Not Found\",\n statusCode: 404,\n });\n }\n\n async #serveGetEntry(\n entry: GetEntry,\n req: FastifyRequest,\n reply: FastifyReply,\n ): Promise<void> {\n const url = buildUrl(req);\n const headers = buildHeaders(req);\n const fetchReq = new Request(url, { method: \"GET\", headers });\n const response = await entry.handler(fetchReq);\n writeResponse(reply, response);\n return reply.send(await response.text());\n }\n}\n\nasync function serveFetchHandler(\n handler: FetchHandler,\n req: FastifyRequest,\n reply: FastifyReply,\n): Promise<void> {\n const url = buildUrl(req);\n const headers = buildHeaders(req);\n\n let body: string | undefined;\n if (req.method !== \"GET\" && req.method !== \"HEAD\" && req.body !== undefined) {\n body = JSON.stringify(req.body);\n }\n\n const fetchRequest = new Request(url, { method: req.method, headers, body });\n const response = await handler(fetchRequest);\n writeResponse(reply, response);\n return reply.send(await response.text());\n}\n\nfunction buildUrl(req: FastifyRequest): string {\n const host = req.headers.host ?? \"localhost\";\n return `${req.protocol}://${host}${req.url}`;\n}\n\nfunction buildHeaders(req: FastifyRequest): Headers {\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (typeof value === \"string\") {\n headers.set(key, value);\n } else if (Array.isArray(value)) {\n headers.set(key, value.join(\", \"));\n }\n }\n return headers;\n}\n\nfunction writeResponse(reply: FastifyReply, response: Response): void {\n void reply.status(response.status);\n response.headers.forEach((value, key) => {\n void reply.header(key, value);\n });\n}\n\nexport function createFastifyHttpAdapter(): { adapter: IHttpAdapter } {\n return { adapter: new FastifyHttpAdapter() };\n}\n","import type { ILogger } from \"document-model\";\nimport type { Context } from \"../types.js\";\nimport { ApolloGatewayAdapter } from \"./adapter-gateway-apollo.js\";\nimport { MercuriusGatewayAdapter } from \"./adapter-gateway-mercurius.js\";\nimport { createExpressHttpAdapter } from \"./adapter-http-express.js\";\nimport { createFastifyHttpAdapter } from \"./adapter-http-fastify.js\";\nimport type { IGatewayAdapter, IHttpAdapter } from \"./types.js\";\n\nexport type GatewayAdapterType = \"apollo\" | \"mercurius\";\nexport type HttpAdapterType = \"express\" | \"fastify\";\n\nexport function createGatewayAdapter(\n type: GatewayAdapterType,\n logger: ILogger,\n): IGatewayAdapter<Context> {\n switch (type) {\n case \"apollo\":\n return new ApolloGatewayAdapter(logger);\n case \"mercurius\":\n return new MercuriusGatewayAdapter(logger);\n }\n}\n\nexport type HttpAdapterSetup = {\n adapter: IHttpAdapter;\n};\n\nexport function createHttpAdapter(type: HttpAdapterType): HttpAdapterSetup {\n switch (type) {\n case \"express\":\n return createExpressHttpAdapter();\n case \"fastify\":\n return createFastifyHttpAdapter();\n }\n}\n","import {\n verifyAuthBearerToken,\n type PowerhouseVerifiableCredential,\n} from \"@renown/sdk\";\n\ntype VerifiedCredential =\n Awaited<ReturnType<typeof verifyAuthBearerToken>> extends false | infer T\n ? T\n : never;\nexport interface AuthConfig {\n enabled: boolean;\n admins: string[];\n cacheTtl?: number; // Cache TTL in milliseconds, defaults to 10 seconds\n skipCredentialVerification?: boolean; // Skip Renown API credential verification (useful for testing)\n}\n\nexport interface User {\n address: string;\n chainId: number;\n networkId: string;\n}\n\nexport interface AuthContext {\n user?: User;\n admins: string[];\n auth_enabled: boolean;\n}\n\nexport class AuthService {\n private readonly config: AuthConfig;\n\n constructor(config: AuthConfig) {\n this.config = config;\n }\n\n async authenticateRequest(\n request: globalThis.Request,\n ): Promise<AuthContext | globalThis.Response> {\n if (!this.config.enabled) {\n return { user: undefined, admins: [], auth_enabled: false };\n }\n const method = request.method;\n if (method === \"OPTIONS\" || method === \"GET\") {\n return {\n user: undefined,\n admins: this.config.admins,\n auth_enabled: true,\n };\n }\n const token = request.headers.get(\"authorization\")?.split(\" \")[1];\n if (!token) {\n return {\n user: undefined,\n admins: this.config.admins,\n auth_enabled: true,\n };\n }\n try {\n const verified = await this.verifyToken(token);\n if (!verified) {\n return new Response(JSON.stringify({ error: \"Verification failed\" }), {\n status: 401,\n });\n }\n const user = this.extractUserFromVerification(verified);\n if (!user) {\n return new Response(JSON.stringify({ error: \"Missing credentials\" }), {\n status: 401,\n });\n }\n if (!this.config.skipCredentialVerification) {\n const credentialExists = await this.verifyCredentialExists(\n user.address,\n user.chainId,\n verified.issuer,\n );\n if (!credentialExists) {\n return new Response(\n JSON.stringify({ error: \"Credentials no longer valid\" }),\n { status: 401 },\n );\n }\n }\n return { user, admins: this.config.admins, auth_enabled: true };\n } catch {\n return new Response(JSON.stringify({ error: \"Authentication failed\" }), {\n status: 401,\n });\n }\n }\n\n async authenticateWebSocketConnection(\n connectionParams: Record<string, unknown>,\n ): Promise<User | null> {\n if (!this.config.enabled) {\n return null;\n }\n\n const authHeader = connectionParams.authorization as string | undefined;\n if (!authHeader) {\n throw new Error(\"Missing authorization in connection parameters\");\n }\n\n const token = authHeader.split(\" \")[1];\n if (!token) {\n throw new Error(\"Invalid authorization format\");\n }\n\n const verified = await this.verifyToken(token);\n if (!verified) {\n throw new Error(\"Token verification failed\");\n }\n\n const user = this.extractUserFromVerification(verified);\n if (!user) {\n throw new Error(\"Invalid credentials\");\n }\n\n // Verify that the credentials still exist on the Renown API\n // This can be skipped via config (useful for testing or when Renown API is unavailable)\n if (!this.config.skipCredentialVerification) {\n const credentialExists = await this.verifyCredentialExists(\n user.address,\n user.chainId,\n verified.issuer,\n );\n if (!credentialExists) {\n throw new Error(\"Credentials no longer valid\");\n }\n }\n\n // Note: We no longer block based on global allowed lists.\n // Authorization is handled at the resolver level based on document permissions.\n\n return user;\n }\n\n /**\n * Verify the auth bearer token\n */\n private async verifyToken(token: string) {\n return await verifyAuthBearerToken(token);\n }\n\n /**\n * Extract user information from verification result\n */\n private extractUserFromVerification(\n verified: VerifiedCredential,\n ): User | null {\n try {\n const { address, chainId, networkId } =\n verified.verifiableCredential.credentialSubject;\n\n if (!address || !chainId || !networkId) {\n return null;\n }\n\n return {\n address,\n chainId,\n networkId,\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Get additional context fields for GraphQL\n */\n getAdditionalContextFields() {\n if (!this.config.enabled) {\n return {\n isAdmin: () => true,\n };\n }\n\n return {\n isAdmin: (address: string) =>\n this.config.enabled &&\n this.config.admins?.includes(address.toLowerCase()),\n };\n }\n\n /**\n * Get user context for GraphQL\n */\n getUserContext(user?: User) {\n if (!user) return {};\n\n return {\n user: {\n address: user.address.toLowerCase(),\n chainId: user.chainId,\n networkId: user.networkId,\n },\n };\n }\n\n /**\n * Verify that the credential still exists on the Renown API\n */\n private async verifyCredentialExists(\n address: string,\n chainId: number,\n appId: string,\n ): Promise<boolean> {\n const url = `https://www.renown.id/api/auth/credential?address=${address}&chainId=${chainId}&connectId=${appId}&appId=${appId}`;\n try {\n const response = await fetch(url, {\n method: \"GET\",\n });\n const body = (await response.json()) as {\n credential: PowerhouseVerifiableCredential;\n };\n const credential = body.credential;\n\n const appIdVerfied = credential.credentialSubject.id;\n const addressVerfied = credential.issuer.id.split(\":\")[4];\n const chainIdVerfied = credential.issuer.id.split(\":\")[3];\n\n if (response.status !== 200) {\n return false;\n }\n\n return (\n appIdVerfied === appId &&\n addressVerfied.toLocaleLowerCase() === address.toLocaleLowerCase() &&\n chainIdVerfied === chainId.toString()\n );\n } catch {\n return false;\n }\n }\n}\n","import { buildSubgraphSchema } from \"@apollo/subgraph\";\nimport type {\n GraphQLResolverMap,\n GraphQLSchemaModule,\n} from \"@apollo/subgraph/dist/schema-helper/resolverMap.js\";\nimport { typeDefs as scalarsTypeDefs } from \"@powerhousedao/document-engineering/graphql\";\nimport type { Context } from \"@powerhousedao/reactor-api\";\nimport type {\n DocumentModelGlobalState,\n DocumentModelModule,\n} from \"@powerhousedao/shared/document-model\";\nimport { camelCase, pascalCase } from \"change-case\";\nimport { childLogger } from \"document-model\";\nimport { type DocumentNode, Kind, parse, print } from \"graphql\";\nimport { gql } from \"graphql-tag\";\nimport { GraphQLJSONObject } from \"graphql-type-json\";\n\nconst logger = childLogger([\"reactor-api\", \"create-schema\"]);\n\n/**\n * Revision type - matches the definition in reactor/schema.graphql.\n * Used by PHDocument and document mutation results.\n */\nconst RevisionType = `\n type Revision {\n scope: String!\n revision: Int!\n }\n`;\n\n/**\n * Strip scalar definitions from a DocumentNode to avoid duplicates\n * when combining with other schemas that define the same scalars.\n */\nconst stripScalarDefinitions = (doc: DocumentNode): string => {\n const filteredDefinitions = doc.definitions.filter(\n (def) => def.kind !== Kind.SCALAR_TYPE_DEFINITION,\n );\n return print({ kind: Kind.DOCUMENT, definitions: filteredDefinitions });\n};\n\nexport const buildSubgraphSchemaModule = (\n documentModels: DocumentModelModule[],\n resolvers: GraphQLResolverMap<Context>,\n typeDefs: DocumentNode,\n): GraphQLSchemaModule => {\n const newResolvers = {\n ...resolvers,\n JSONObject: GraphQLJSONObject,\n };\n\n return {\n typeDefs: getDocumentModelTypeDefs(documentModels, typeDefs),\n resolvers: newResolvers,\n };\n};\nexport const createSchema = (\n documentModels: DocumentModelModule[],\n resolvers: GraphQLResolverMap<Context>,\n typeDefs: DocumentNode,\n) => {\n return buildSubgraphSchema(\n buildSubgraphSchemaModule(documentModels, resolvers, typeDefs),\n );\n};\n\n/**\n * Create a merged GraphQL schema from multiple subgraph modules.\n * Uses buildSubgraphSchema's array overload to combine type definitions\n * and resolvers from multiple subgraphs into a single executable schema.\n */\nexport const createMergedSchema = (modules: GraphQLSchemaModule[]) => {\n return buildSubgraphSchema(modules);\n};\n\nexport function getDocumentModelSchemaName(\n documentModel: DocumentModelGlobalState,\n) {\n return pascalCase(documentModel.name.replaceAll(\"/\", \" \"));\n}\n\nexport const getDocumentModelTypeDefs = (\n documentModels: DocumentModelModule[],\n typeDefs: DocumentNode,\n) => {\n let dmSchema = \"\";\n\n const addedDocumentModels = new Set<string>();\n documentModels.forEach(({ documentModel }) => {\n const dmSchemaName = getDocumentModelSchemaName(documentModel.global);\n if (addedDocumentModels.has(dmSchemaName)) {\n logger.debug(\n `Skipping document model with duplicate name: ${dmSchemaName}`,\n );\n return;\n }\n addedDocumentModels.add(dmSchemaName);\n // Use only the latest specification to avoid duplicate type definitions\n // when a document model has multiple versions (e.g. v1, v2).\n const latestSpec = documentModel.global.specifications.at(-1);\n const globalSchema = latestSpec?.state.global.schema ?? \"\";\n const localSchema = latestSpec?.state.local.schema ?? \"\";\n let tmpDmSchema = `\n ${globalSchema\n .replaceAll(\"scalar DateTime\", \"\")\n .replaceAll(/input (.*?) {[\\s\\S]*?}/g, \"\")};\n\n ${localSchema\n .replaceAll(\"scalar DateTime\", \"\")\n .replaceAll(/input (.*?) {[\\s\\S]*?}/g, \"\")\n .replaceAll(\"type AccountSnapshotLocalState\", \"\")\n .replaceAll(\"type BudgetStatementLocalState\", \"\")\n .replaceAll(\"type ScopeFrameworkLocalState\", \"\")};\n\n \\n`;\n\n const found = tmpDmSchema.match(\n /(type|enum|union|interface)\\s+(\\w+)[\\s{]/g,\n );\n const trimmedFound = found?.map((f) =>\n f\n .replaceAll(\"type \", \"\")\n .replaceAll(\"enum \", \"\")\n .replaceAll(\"union \", \"\")\n .replaceAll(\"interface \", \"\")\n .replaceAll(\"{\", \"\")\n .trim(),\n );\n trimmedFound?.forEach((f) => {\n // Create a regex that matches the type name with proper boundaries\n const typeRegex = new RegExp(\n // Match type references in various GraphQL contexts\n `(?<![_A-Za-z0-9])(${f})(?![_A-Za-z0-9])|` + // Basic type references\n `\\\\[(${f})\\\\]|` + // Array types without nullability\n `\\\\[(${f})!\\\\]|` + // Array of non-null types\n `\\\\[(${f})\\\\]!|` + // Non-null array of types\n `\\\\[(${f})!\\\\]!`, // Non-null array of non-null types\n \"g\",\n );\n\n tmpDmSchema = tmpDmSchema.replace(\n typeRegex,\n (\n match: string,\n p1: string,\n p2: string,\n p3: string,\n p4: string,\n p5: string,\n ) => {\n // If it's an array type, preserve the brackets and ! while replacing the type name\n if (match.startsWith(\"[\")) {\n return match.replace(\n p2 || p3 || p4 || p5,\n `${dmSchemaName}_${p2 || p3 || p4 || p5}`,\n );\n }\n // Basic type reference\n return `${dmSchemaName}_${p1}`;\n },\n );\n });\n dmSchema += tmpDmSchema;\n dmSchema += `\n type ${dmSchemaName} implements IDocument {\n id: String!\n name: String!\n documentType: String!\n operations(skip: Int, first: Int): [Operation!]!\n revision: Int!\n createdAtUtcIso: DateTime!\n lastModifiedAtUtcIso: DateTime!\n ${dmSchemaName !== \"DocumentModel\" ? `initialState: ${dmSchemaName}_${dmSchemaName}State!` : \"\"}\n ${dmSchemaName !== \"DocumentModel\" ? `state: ${dmSchemaName}_${dmSchemaName}State!` : \"\"}\n stateJSON: JSONObject\n }\\n`;\n });\n\n // add the mutation and query types\n const schema = gql`\n scalar JSONObject\n ${scalarsTypeDefs.join(\"\\n\").replaceAll(\";\", \"\")}\n\n type PHOperationContext {\n signer: Signer\n }\n\n type Signer {\n user: SignerUser\n app: SignerApp\n signatures: [String!]!\n }\n\n type SignerUser {\n address: String!\n networkId: String!\n chainId: Int!\n }\n\n type SignerApp {\n name: String!\n key: String!\n }\n\n type Operation {\n id: String!\n type: String!\n index: Int!\n timestampUtcMs: DateTime!\n hash: String!\n skip: Int\n inputText: String\n error: String\n context: PHOperationContext\n }\n\n interface IDocument {\n id: String!\n name: String!\n documentType: String!\n revision: Int!\n createdAtUtcIso: DateTime!\n lastModifiedAtUtcIso: DateTime!\n operations(first: Int, skip: Int): [Operation!]!\n stateJSON: JSONObject\n }\n ${dmSchema.replaceAll(\";\", \"\")}\n\n type GqlDocument implements IDocument {\n id: String!\n name: String!\n documentType: String!\n revision: Int!\n createdAtUtcIso: DateTime!\n lastModifiedAtUtcIso: DateTime!\n operations(first: Int, skip: Int): [Operation!]!\n stateJSON: JSONObject\n }\n\n type DriveDocument implements IDocument {\n id: String!\n name: String!\n documentType: String!\n revision: Int!\n createdAtUtcIso: DateTime!\n lastModifiedAtUtcIso: DateTime!\n operations(first: Int, skip: Int): [Operation!]!\n stateJSON: JSONObject\n }\n\n ${stripScalarDefinitions(typeDefs)}\n `;\n\n return schema;\n};\n\n/**\n * Extract type names from a GraphQL schema.\n * @param {string} schema - GraphQL schema string\n * @returns {string[]} Array of type names\n */\nfunction extractTypeNames(schema: string) {\n const found = schema.match(/(type|enum|union|interface|input)\\s+(\\w+)[\\s{]/g);\n if (!found) return [];\n return found.map((f) =>\n f\n .replaceAll(\"type \", \"\")\n .replaceAll(\"enum \", \"\")\n .replaceAll(\"union \", \"\")\n .replaceAll(\"interface \", \"\")\n .replaceAll(\"input \", \"\")\n .replaceAll(\"{\", \"\")\n .trim(),\n );\n}\n\n/**\n * Extract input type definitions from a GraphQL schema.\n * @param {string} schema - GraphQL schema string\n * @param {Set<string>} excludeTypeNames - Type names to exclude from extraction\n * @returns {string} All input type definitions as a string\n */\nfunction extractInputTypeDefinitions(\n schema: string,\n excludeTypeNames: Set<string> = new Set(),\n): string {\n // Match input type blocks: input TypeName { ... }\n const inputTypeRegex = /input\\s+(\\w+)\\s*\\{[^}]*\\}/g;\n const matches: string[] = [];\n let match;\n while ((match = inputTypeRegex.exec(schema)) !== null) {\n const typeName = match[1];\n // Skip if this type name is in the exclusion set\n if (!excludeTypeNames.has(typeName)) {\n matches.push(match[0]);\n }\n }\n if (matches.length === 0) return \"\";\n return matches.join(\"\\n\\n\");\n}\n\n/**\n * AST type node shape for recursive type conversion.\n */\ntype GraphQLTypeNode = {\n kind: Kind;\n name?: { value: string };\n type?: GraphQLTypeNode;\n};\n\n/**\n * Extract the root state type name from a scope's GraphQL schema.\n * Uses the naming convention: {DocumentName}State for global,\n * {DocumentName}{PascalScope}State for other scopes (e.g., DocumentDriveLocalState).\n * Falls back to the last ObjectTypeDefinition (root types are conventionally last).\n */\nfunction extractRootTypeName(\n schema: string,\n documentName: string,\n scopeName: string,\n): string | null {\n try {\n const ast = parse(schema);\n\n // Try conventions:\n // 1. {DocumentName}State for global, {DocumentName}{Scope}State otherwise\n // 2. {DocumentName}GlobalState (DocumentModel uses this variant)\n const scopeSuffix = scopeName === \"global\" ? \"\" : pascalCase(scopeName);\n const candidates = [\n `${documentName}${scopeSuffix}State`,\n `${documentName}${pascalCase(scopeName)}State`,\n ];\n\n let lastObjectType: string | null = null;\n for (const def of ast.definitions) {\n if (def.kind === Kind.OBJECT_TYPE_DEFINITION) {\n if (candidates.includes(def.name.value)) {\n return def.name.value;\n }\n lastObjectType = def.name.value;\n }\n }\n\n // Fallback: last object type (root state types are defined last by convention)\n return lastObjectType;\n } catch {\n // ignore parse errors\n }\n return null;\n}\n\n/**\n * Convert a GraphQL output type AST node to an optional input type string.\n * Strips non-null markers and converts object type references to Input suffix.\n */\nfunction convertTypeNodeToInput(\n typeNode: GraphQLTypeNode,\n objectNames: Set<string>,\n unionNames: Set<string>,\n interfaceNames: Set<string>,\n): string {\n if (typeNode.kind === Kind.NON_NULL_TYPE && typeNode.type) {\n return convertTypeNodeToInput(\n typeNode.type,\n objectNames,\n unionNames,\n interfaceNames,\n );\n }\n if (typeNode.kind === Kind.LIST_TYPE && typeNode.type) {\n const inner = convertTypeNodeToInput(\n typeNode.type,\n objectNames,\n unionNames,\n interfaceNames,\n );\n return `[${inner}]`;\n }\n if (typeNode.kind === Kind.NAMED_TYPE && typeNode.name) {\n const name = typeNode.name.value;\n if (objectNames.has(name)) return `${name}Input`;\n if (unionNames.has(name) || interfaceNames.has(name)) return \"JSONObject\";\n return name;\n }\n return \"JSONObject\";\n}\n\n/**\n * Generate GraphQL input type definitions from a state schema string.\n * Converts output type definitions to input types with all fields optional.\n * - Object type references get Input suffix\n * - Union/interface references become JSONObject\n * - Enums and scalars remain unchanged\n */\nfunction generateStateInputTypes(\n stateSchema: string,\n excludeTypeNames?: Set<string>,\n): string {\n if (!stateSchema || !stateSchema.trim()) return \"\";\n\n let ast;\n try {\n ast = parse(stateSchema);\n } catch {\n return \"\";\n }\n\n const enumNames = new Set<string>();\n const unionNames = new Set<string>();\n const interfaceNames = new Set<string>();\n const objectNames = new Set<string>();\n const existingInputNames = new Set<string>();\n\n for (const def of ast.definitions) {\n switch (def.kind) {\n case Kind.ENUM_TYPE_DEFINITION:\n enumNames.add(def.name.value);\n break;\n case Kind.UNION_TYPE_DEFINITION:\n unionNames.add(def.name.value);\n break;\n case Kind.INTERFACE_TYPE_DEFINITION:\n interfaceNames.add(def.name.value);\n break;\n case Kind.OBJECT_TYPE_DEFINITION:\n objectNames.add(def.name.value);\n break;\n case Kind.INPUT_OBJECT_TYPE_DEFINITION:\n existingInputNames.add(def.name.value);\n break;\n }\n }\n\n const inputTypes: string[] = [];\n\n for (const def of ast.definitions) {\n if (def.kind !== Kind.OBJECT_TYPE_DEFINITION) continue;\n // Skip if an input type with the same name already exists in the schema\n // or in operation schemas (to avoid duplicates with moduleSchemas)\n const inputName = `${def.name.value}Input`;\n if (existingInputNames.has(inputName)) continue;\n if (excludeTypeNames?.has(inputName)) continue;\n const fields = def.fields ?? [];\n if (fields.length === 0) continue;\n\n const inputFields = fields.map((field) => {\n const fieldName = field.name.value;\n const fieldType = convertTypeNodeToInput(\n field.type as GraphQLTypeNode,\n objectNames,\n unionNames,\n interfaceNames,\n );\n return ` ${fieldName}: ${fieldType}`;\n });\n\n inputTypes.push(\n `input ${def.name.value}Input {\\n${inputFields.join(\"\\n\")}\\n}`,\n );\n }\n\n return inputTypes.join(\"\\n\\n\");\n}\n\n/**\n * Apply type prefixes to GraphQL schema to namespace types and avoid collisions.\n * Inlined from @powerhousedao/common/utils to avoid ES module import issues.\n * @param {string} schema - GraphQL schema string\n * @param {string} prefix - Prefix to apply to type names\n * @param {string[]} externalTypeNames - Type names from other schemas to also prefix\n * @returns {string} Schema with prefixed types\n */\nfunction applyGraphQLTypePrefixes(\n schema: string,\n prefix: string,\n externalTypeNames: string[] = [],\n): string {\n if (!schema || !schema.trim()) {\n return schema;\n }\n\n let processedSchema = schema;\n\n // Find types defined in this schema\n const localTypeNames = extractTypeNames(schema);\n\n // Combine with external type names (remove duplicates)\n const allTypeNames = [...new Set([...localTypeNames, ...externalTypeNames])];\n\n if (allTypeNames.length === 0) {\n return schema;\n }\n\n allTypeNames.forEach((typeName) => {\n const typeRegex = new RegExp(\n // Match type references in various GraphQL contexts\n `(?<![_A-Za-z0-9])(${typeName})(?![_A-Za-z0-9])|` +\n `\\\\[(${typeName})\\\\]|` +\n `\\\\[(${typeName})!\\\\]|` +\n `\\\\[(${typeName})\\\\]!|` +\n `\\\\[(${typeName})!\\\\]!`,\n \"g\",\n );\n\n processedSchema = processedSchema.replace(\n typeRegex,\n (match, p1, p2, p3, p4, p5) => {\n if (match.startsWith(\"[\")) {\n return match.replace(\n (p2 || p3 || p4 || p5) as string,\n `${prefix}_${p2 || p3 || p4 || p5}`,\n );\n }\n // Basic type reference\n return `${prefix}_${p1}`;\n },\n );\n });\n\n return processedSchema;\n}\n\n/**\n * Options for generating document model GraphQL schemas.\n */\nexport interface DocumentModelSchemaOptions {\n /**\n * When true, generates new API patterns:\n * - Mutations return full document objects (MutationResult type)\n * - Adds createEmptyDocument mutation\n * - Makes docId and input parameters required\n * @default false\n */\n useNewApi?: boolean;\n}\n\n/**\n * Generate a GraphQL schema for a document model.\n *\n * @param documentModel - The document model global state\n * @param options - Schema generation options\n * @returns GraphQL DocumentNode\n */\nexport function generateDocumentModelSchema(\n documentModel: DocumentModelGlobalState,\n options: DocumentModelSchemaOptions = {},\n): DocumentNode {\n const { useNewApi = false } = options;\n\n const specification = documentModel.specifications.at(-1);\n const documentName = getDocumentModelSchemaName(documentModel);\n const globalStateSchema = specification?.state.global.schema;\n const localStateSchema = specification?.state.local.schema;\n const globalStateTypeNames = extractTypeNames(globalStateSchema ?? \"\");\n const localStateTypeNames = extractTypeNames(localStateSchema ?? \"\");\n const stateTypeNames = [...globalStateTypeNames, ...localStateTypeNames];\n\n // Collect ALL type names from all operations' schemas\n const allOperationTypeNames =\n specification?.modules.flatMap((module) =>\n module.operations.flatMap((op) => extractTypeNames(op.schema ?? \"\")),\n ) ?? [];\n\n // Combine state types and all operation types for prefixing\n const allTypeNames = [\n ...new Set([...stateTypeNames, ...allOperationTypeNames]),\n ];\n\n // Extract input type definitions from state schema, excluding operation-specific inputs\n // (those are already defined in op.schema)\n const operationInputTypeNames = new Set(allOperationTypeNames);\n const stateInputTypes = extractInputTypeDefinitions(\n globalStateSchema ?? \"\",\n operationInputTypeNames,\n );\n const prefixedStateInputTypes = applyGraphQLTypePrefixes(\n stateInputTypes,\n documentName,\n allTypeNames,\n );\n\n // Helper to check if schema has actual GraphQL type definitions\n const hasValidSchema = (schema: string | null | undefined): boolean =>\n !!(schema && /\\b(input|type|enum|union|interface)\\s+\\w+/.test(schema));\n\n // Process state schema types (remove input types, clean up, and prefix)\n const stateSchemaTypes = globalStateSchema\n ? applyGraphQLTypePrefixes(\n globalStateSchema\n .replaceAll(\"scalar DateTime\", \"\")\n .replaceAll(/input (.*?) {[\\s\\S]*?}/g, \"\"),\n documentName,\n allTypeNames,\n )\n : \"\";\n\n if (useNewApi) {\n // New API: flat queries, typed state, async mutations\n return generateNewApiSchema(\n documentName,\n specification,\n stateSchemaTypes,\n prefixedStateInputTypes,\n allTypeNames,\n hasValidSchema,\n );\n }\n\n // Legacy API\n return generateLegacyApiSchema(\n documentName,\n specification,\n prefixedStateInputTypes,\n allTypeNames,\n hasValidSchema,\n );\n}\n\n/**\n * Generate legacy API schema with nested queries\n */\nfunction generateLegacyApiSchema(\n documentName: string,\n specification: DocumentModelGlobalState[\"specifications\"][0] | undefined,\n prefixedStateInputTypes: string,\n allTypeNames: string[],\n hasValidSchema: (schema: string | null | undefined) => boolean,\n): DocumentNode {\n const createDocumentMutation = `${documentName}_createDocument(name:String!, driveId:String): String`;\n\n const operationMutations =\n specification?.modules\n .flatMap((module) =>\n module.operations\n .filter((op) => op.name && hasValidSchema(op.schema))\n .map(\n (op) =>\n `${documentName}_${camelCase(op.name!)}(\n driveId: String, docId: PHID, input: ${documentName}_${pascalCase(op.name!)}Input): Int`,\n ),\n )\n .join(\"\\n \") ?? \"\";\n\n const moduleSchemas =\n specification?.modules\n .filter((module) =>\n module.operations.some((op) => hasValidSchema(op.schema)),\n )\n .map(\n (module) =>\n `\"\"\"\n Module: ${pascalCase(module.name)}\n \"\"\"\n ${module.operations\n .filter((op) => hasValidSchema(op.schema))\n .map((op) =>\n applyGraphQLTypePrefixes(\n op.schema ?? \"\",\n documentName,\n allTypeNames,\n ),\n )\n .join(\"\\n \")}`,\n )\n .join(\"\\n\") ?? \"\";\n\n return gql`\n \"\"\"\n Queries: ${documentName} Document\n \"\"\"\n\n type ${documentName}Queries {\n getDocument(docId: PHID!, driveId: PHID): ${documentName}\n getDocuments(driveId: String!): [${documentName}!]\n }\n\n type Query {\n ${documentName}: ${documentName}Queries\n }\n\n \"\"\"\n Mutations: ${documentName}\n \"\"\"\n type Mutation {\n ${createDocumentMutation}\n\n ${operationMutations}\n }\n\n ${\n prefixedStateInputTypes\n ? `\"\"\"\n Input Types from State Schema\n \"\"\"\n ${prefixedStateInputTypes}`\n : \"\"\n }\n\n ${moduleSchemas}`;\n}\n\n/**\n * Generate new API schema with flat queries, typed state, and async mutations.\n * Note: State schema types are NOT included here because they are already defined\n * in getDocumentModelTypeDefs() which is used during schema composition.\n * Including them here would cause duplicate type definitions.\n */\nfunction generateNewApiSchema(\n documentName: string,\n specification: DocumentModelGlobalState[\"specifications\"][0] | undefined,\n _stateSchemaTypes: string,\n prefixedStateInputTypes: string,\n allTypeNames: string[],\n hasValidSchema: (schema: string | null | undefined) => boolean,\n): DocumentNode {\n // Use full state type for all document models\n const stateType = `${documentName}_FullState!`;\n\n // Shared base types for document state structure (same for all document types)\n const sharedBaseTypes = `\n \"\"\"Hash configuration for document state\"\"\"\n type ${documentName}_PHHashConfig {\n algorithm: String!\n encoding: String!\n }\n\n \"\"\"Document scope state (same for all document types)\"\"\"\n type ${documentName}_PHDocumentScopeState {\n version: Int!\n hash: ${documentName}_PHHashConfig!\n isDeleted: Boolean\n deletedAtUtcIso: String\n deletedBy: String\n deletionReason: String\n }\n `;\n\n // Full state type with all scopes (auth, document, global, local)\n // Note: DocumentModel uses different naming convention (GlobalState suffix instead of State)\n // For local state, check if the specification defines a local state type\n const localSchema = specification?.state.local.schema ?? \"\";\n const hasLocalStateType = localSchema.includes(\n `type ${documentName}LocalState`,\n );\n\n const globalStateType =\n documentName === \"DocumentModel\"\n ? `${documentName}_${documentName}GlobalState!`\n : `${documentName}_${documentName}State!`;\n const localStateType = !hasLocalStateType\n ? \"JSONObject!\"\n : `${documentName}_${documentName}LocalState!`;\n\n const fullStateType = `\n \"\"\"Full state with all scopes for ${documentName}\"\"\"\n type ${documentName}_FullState {\n auth: JSONObject!\n document: ${documentName}_PHDocumentScopeState!\n global: ${globalStateType}\n local: ${localStateType}\n }\n `;\n\n // Common input types - use extend to avoid conflicts with other subgraphs\n const commonInputTypes = `\n input ${documentName}_ViewFilterInput {\n branch: String\n scopes: [String!]\n }\n\n input ${documentName}_PagingInput {\n limit: Int\n offset: Int\n cursor: String\n }\n\n input ${documentName}_SearchFilterInput {\n parentId: String\n identifiers: [String!]\n }\n `;\n\n // Revision type - imported from shared-schema.ts for consistency with ReactorSubgraph\n // Must be defined in each subgraph for Apollo Federation\n const revisionType = RevisionType;\n\n // Result types with typed state (or JSONObject for DocumentModel)\n // The state type (${documentName}_${documentName}State) is defined in getDocumentModelTypeDefs()\n // Uses revisionsList with shared Revision type to match ReactorSubgraph pattern\n const resultTypes = `\n \"\"\"\n Mutation result type for ${documentName} operations with typed state.\n Matches ReactorSubgraph PHDocument pattern with revisionsList.\n \"\"\"\n type ${documentName}MutationResult {\n id: String!\n slug: String\n preferredEditor: String\n name: String!\n documentType: String!\n state: ${stateType}\n revisionsList: [Revision!]!\n createdAtUtcIso: DateTime!\n lastModifiedAtUtcIso: DateTime!\n }\n\n \"\"\"\n Document with children for ${documentName}\n \"\"\"\n type ${documentName}_DocumentWithChildren {\n document: ${documentName}MutationResult!\n childIds: [String!]!\n }\n\n \"\"\"\n Paginated result type for ${documentName} documents\n \"\"\"\n type ${documentName}_DocumentResultPage {\n items: [${documentName}MutationResult!]!\n totalCount: Int!\n hasNextPage: Boolean!\n hasPreviousPage: Boolean!\n cursor: String\n }\n `;\n\n // Queries nested under ${documentName} namespace\n const queries = `\n type ${documentName}Queries {\n \"\"\"Get a specific ${documentName} document by identifier\"\"\"\n document(identifier: String!, view: ${documentName}_ViewFilterInput): ${documentName}_DocumentWithChildren\n\n \"\"\"Get all ${documentName} documents (paged)\"\"\"\n documents(paging: ${documentName}_PagingInput): ${documentName}_DocumentResultPage!\n\n \"\"\"Find ${documentName} documents by search criteria\"\"\"\n findDocuments(search: ${documentName}_SearchFilterInput, view: ${documentName}_ViewFilterInput, paging: ${documentName}_PagingInput): ${documentName}_DocumentResultPage!\n\n \"\"\"Get children of a ${documentName} document\"\"\"\n documentChildren(parentIdentifier: String!, view: ${documentName}_ViewFilterInput, paging: ${documentName}_PagingInput): ${documentName}_DocumentResultPage!\n\n \"\"\"Get parents of a ${documentName} document\"\"\"\n documentParents(childIdentifier: String!, view: ${documentName}_ViewFilterInput, paging: ${documentName}_PagingInput): ${documentName}_DocumentResultPage!\n }\n `;\n\n // Generate initial state input types for each scope\n let initialStateInputSchema = \"\";\n if (specification) {\n const scopeFields: string[] = [];\n const generatedInputTypeParts: string[] = [];\n\n for (const [scopeName, scopeState] of Object.entries(specification.state)) {\n const schema = (scopeState as { schema?: string }).schema ?? \"\";\n if (hasValidSchema(schema)) {\n const rootTypeName = extractRootTypeName(\n schema,\n documentName,\n scopeName,\n );\n if (!rootTypeName) {\n scopeFields.push(` ${scopeName}: JSONObject`);\n continue;\n }\n const scopeInputTypes = generateStateInputTypes(\n schema,\n new Set(allTypeNames),\n );\n if (!scopeInputTypes) {\n scopeFields.push(` ${scopeName}: JSONObject`);\n continue;\n }\n const prefixedScopeInputTypes = applyGraphQLTypePrefixes(\n scopeInputTypes,\n documentName,\n allTypeNames,\n );\n scopeFields.push(\n ` ${scopeName}: ${documentName}_${rootTypeName}Input`,\n );\n generatedInputTypeParts.push(prefixedScopeInputTypes);\n } else {\n scopeFields.push(` ${scopeName}: JSONObject`);\n }\n }\n\n if (scopeFields.length > 0) {\n const inputTypeDefs = generatedInputTypeParts.join(\"\\n\\n\");\n const wrapper = `input ${documentName}_InitialStateInput {\\n${scopeFields.join(\"\\n\")}\\n}`;\n initialStateInputSchema = inputTypeDefs\n ? `${inputTypeDefs}\\n\\n${wrapper}`\n : wrapper;\n }\n }\n\n // Mutations nested under ${documentName} namespace\n const createDocumentMutation = initialStateInputSchema\n ? `createDocument(name: String!, parentIdentifier: String, slug: String, preferredEditor: String, initialState: ${documentName}_InitialStateInput): ${documentName}MutationResult!`\n : `createDocument(name: String!, parentIdentifier: String, preferredEditor: String): ${documentName}MutationResult!`;\n const createEmptyDocumentMutation = `createEmptyDocument(parentIdentifier: String): ${documentName}MutationResult!`;\n\n const operationMutations =\n specification?.modules\n .flatMap((module) =>\n module.operations\n .filter((op) => op.name && hasValidSchema(op.schema))\n .flatMap((op) => [\n // Sync mutation\n `${camelCase(op.name!)}(docId: PHID!, input: ${documentName}_${pascalCase(op.name!)}Input!): ${documentName}MutationResult!`,\n // Async mutation\n `${camelCase(op.name!)}Async(docId: PHID!, input: ${documentName}_${pascalCase(op.name!)}Input!): String!`,\n ]),\n )\n .join(\"\\n \") ?? \"\";\n\n const moduleSchemas =\n specification?.modules\n .filter((module) =>\n module.operations.some((op) => hasValidSchema(op.schema)),\n )\n .map(\n (module) =>\n `\"\"\"\n Module: ${pascalCase(module.name)}\n \"\"\"\n ${module.operations\n .filter((op) => hasValidSchema(op.schema))\n .map((op) =>\n applyGraphQLTypePrefixes(\n op.schema ?? \"\",\n documentName,\n allTypeNames,\n ),\n )\n .join(\"\\n \")}`,\n )\n .join(\"\\n\") ?? \"\";\n\n return gql`\n scalar DateTime\n scalar JSONObject\n\n ${revisionType}\n\n ${sharedBaseTypes}\n\n ${fullStateType}\n\n ${commonInputTypes}\n\n ${resultTypes}\n\n \"\"\"\n Queries: ${documentName} Document\n \"\"\"\n ${queries}\n\n \"\"\"\n Mutations: ${documentName}\n \"\"\"\n type ${documentName}Mutations {\n ${createDocumentMutation}\n ${createEmptyDocumentMutation}\n\n ${operationMutations}\n }\n\n type Query {\n ${documentName}: ${documentName}Queries!\n }\n\n type Mutation {\n ${documentName}: ${documentName}Mutations!\n }\n\n ${\n prefixedStateInputTypes\n ? `\"\"\"\n Input Types from State Schema\n \"\"\"\n ${prefixedStateInputTypes}`\n : \"\"\n }\n\n ${\n initialStateInputSchema\n ? `\"\"\"\n Input Types for Initial State\n \"\"\"\n ${initialStateInputSchema}`\n : \"\"\n }\n\n ${moduleSchemas}`;\n}\n","import type {\n GraphQLResolveInfo,\n GraphQLScalarType,\n GraphQLScalarTypeConfig,\n} from \"graphql\";\nimport type { Context } from \"../../types.js\";\nimport * as z from \"zod\";\nimport type { DocumentNode } from \"graphql\";\nimport { gql } from \"graphql-tag\";\nexport type Maybe<T> = T | null | undefined;\nexport type InputMaybe<T> = T | null | undefined;\nexport type Exact<T extends { [key: string]: unknown }> = {\n [K in keyof T]: T[K];\n};\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & {\n [SubKey in K]?: Maybe<T[SubKey]>;\n};\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & {\n [SubKey in K]: Maybe<T[SubKey]>;\n};\nexport type MakeEmpty<\n T extends { [key: string]: unknown },\n K extends keyof T,\n> = { [_ in K]?: never };\nexport type Incremental<T> =\n | T\n | {\n [P in keyof T]?: P extends \" $fragmentName\" | \"__typename\" ? T[P] : never;\n };\nexport type RequireFields<T, K extends keyof T> = Omit<T, K> & {\n [P in K]-?: NonNullable<T[P]>;\n};\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n ID: { input: string; output: string };\n String: { input: string; output: string };\n Boolean: { input: boolean; output: boolean };\n Int: { input: number; output: number };\n Float: { input: number; output: number };\n DateTime: { input: string | Date; output: string | Date };\n JSONObject: { input: NonNullable<unknown>; output: NonNullable<unknown> };\n};\n\nexport type Action = {\n readonly attachments?: Maybe<ReadonlyArray<Attachment>>;\n readonly context?: Maybe<ActionContext>;\n readonly id: Scalars[\"String\"][\"output\"];\n readonly input: Scalars[\"JSONObject\"][\"output\"];\n readonly scope: Scalars[\"String\"][\"output\"];\n readonly timestampUtcMs: Scalars[\"String\"][\"output\"];\n readonly type: Scalars[\"String\"][\"output\"];\n};\n\nexport type ActionContext = {\n readonly signer?: Maybe<ReactorSigner>;\n};\n\nexport type ActionContextInput = {\n readonly signer?: InputMaybe<ReactorSignerInput>;\n};\n\nexport type ActionInput = {\n readonly attachments?: InputMaybe<ReadonlyArray<AttachmentInput>>;\n readonly context?: InputMaybe<ActionContextInput>;\n readonly id: Scalars[\"String\"][\"input\"];\n readonly input: Scalars[\"JSONObject\"][\"input\"];\n readonly scope: Scalars[\"String\"][\"input\"];\n readonly timestampUtcMs: Scalars[\"String\"][\"input\"];\n readonly type: Scalars[\"String\"][\"input\"];\n};\n\nexport type Attachment = {\n readonly data: Scalars[\"String\"][\"output\"];\n readonly extension?: Maybe<Scalars[\"String\"][\"output\"]>;\n readonly fileName?: Maybe<Scalars[\"String\"][\"output\"]>;\n readonly hash: Scalars[\"String\"][\"output\"];\n readonly mimeType: Scalars[\"String\"][\"output\"];\n};\n\nexport type AttachmentInput = {\n readonly data: Scalars[\"String\"][\"input\"];\n readonly extension?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n readonly fileName?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n readonly hash: Scalars[\"String\"][\"input\"];\n readonly mimeType: Scalars[\"String\"][\"input\"];\n};\n\nexport type ChannelMeta = {\n readonly id: Scalars[\"String\"][\"output\"];\n};\n\nexport type ChannelMetaInput = {\n readonly id: Scalars[\"String\"][\"input\"];\n};\n\nexport type DeadLetterInfo = {\n readonly branch: Scalars[\"String\"][\"output\"];\n readonly documentId: Scalars[\"String\"][\"output\"];\n readonly error: Scalars[\"String\"][\"output\"];\n readonly jobId: Scalars[\"String\"][\"output\"];\n readonly operationCount: Scalars[\"Int\"][\"output\"];\n readonly scopes: ReadonlyArray<Scalars[\"String\"][\"output\"]>;\n};\n\nexport type DocumentChangeContext = {\n readonly childId?: Maybe<Scalars[\"String\"][\"output\"]>;\n readonly parentId?: Maybe<Scalars[\"String\"][\"output\"]>;\n};\n\nexport type DocumentChangeEvent = {\n readonly context?: Maybe<DocumentChangeContext>;\n readonly documents: ReadonlyArray<PhDocument>;\n readonly type: DocumentChangeType;\n};\n\nexport enum DocumentChangeType {\n ChildAdded = \"CHILD_ADDED\",\n ChildRemoved = \"CHILD_REMOVED\",\n Created = \"CREATED\",\n Deleted = \"DELETED\",\n ParentAdded = \"PARENT_ADDED\",\n ParentRemoved = \"PARENT_REMOVED\",\n Updated = \"UPDATED\",\n}\n\nexport type DocumentModelGlobalState = {\n readonly id: Scalars[\"String\"][\"output\"];\n readonly name: Scalars[\"String\"][\"output\"];\n readonly namespace?: Maybe<Scalars[\"String\"][\"output\"]>;\n readonly specification: Scalars[\"JSONObject\"][\"output\"];\n readonly version?: Maybe<Scalars[\"String\"][\"output\"]>;\n};\n\nexport type DocumentModelResultPage = {\n readonly cursor?: Maybe<Scalars[\"String\"][\"output\"]>;\n readonly hasNextPage: Scalars[\"Boolean\"][\"output\"];\n readonly hasPreviousPage: Scalars[\"Boolean\"][\"output\"];\n readonly items: ReadonlyArray<DocumentModelGlobalState>;\n readonly totalCount: Scalars[\"Int\"][\"output\"];\n};\n\nexport type DocumentOperationsFilterInput = {\n readonly actionTypes?: InputMaybe<ReadonlyArray<Scalars[\"String\"][\"input\"]>>;\n readonly branch?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n readonly scopes?: InputMaybe<ReadonlyArray<Scalars[\"String\"][\"input\"]>>;\n readonly sinceRevision?: InputMaybe<Scalars[\"Int\"][\"input\"]>;\n readonly timestampFrom?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n readonly timestampTo?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n};\n\nexport type DocumentWithChildren = {\n readonly childIds: ReadonlyArray<Scalars[\"String\"][\"output\"]>;\n readonly document: PhDocument;\n};\n\nexport type JobChangeEvent = {\n readonly error?: Maybe<Scalars[\"String\"][\"output\"]>;\n readonly jobId: Scalars[\"String\"][\"output\"];\n readonly result: Scalars[\"JSONObject\"][\"output\"];\n readonly status: Scalars[\"String\"][\"output\"];\n};\n\nexport type JobInfo = {\n readonly completedAt?: Maybe<Scalars[\"DateTime\"][\"output\"]>;\n readonly createdAt: Scalars[\"DateTime\"][\"output\"];\n readonly error?: Maybe<Scalars[\"String\"][\"output\"]>;\n readonly id: Scalars[\"String\"][\"output\"];\n readonly result: Scalars[\"JSONObject\"][\"output\"];\n readonly status: Scalars[\"String\"][\"output\"];\n};\n\nexport type MoveChildrenResult = {\n readonly source: PhDocument;\n readonly target: PhDocument;\n};\n\nexport type Mutation = {\n readonly addChildren: PhDocument;\n readonly createDocument: PhDocument;\n readonly createEmptyDocument: PhDocument;\n readonly deleteDocument: Scalars[\"Boolean\"][\"output\"];\n readonly deleteDocuments: Scalars[\"Boolean\"][\"output\"];\n readonly moveChildren: MoveChildrenResult;\n readonly mutateDocument: PhDocument;\n readonly mutateDocumentAsync: Scalars[\"String\"][\"output\"];\n readonly pushSyncEnvelopes: Scalars[\"Boolean\"][\"output\"];\n readonly removeChildren: PhDocument;\n readonly renameDocument: PhDocument;\n readonly touchChannel: TouchChannelResult;\n};\n\nexport type MutationAddChildrenArgs = {\n branch?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n documentIdentifiers: ReadonlyArray<Scalars[\"String\"][\"input\"]>;\n parentIdentifier: Scalars[\"String\"][\"input\"];\n};\n\nexport type MutationCreateDocumentArgs = {\n document: Scalars[\"JSONObject\"][\"input\"];\n parentIdentifier?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n};\n\nexport type MutationCreateEmptyDocumentArgs = {\n documentType: Scalars[\"String\"][\"input\"];\n parentIdentifier?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n};\n\nexport type MutationDeleteDocumentArgs = {\n identifier: Scalars[\"String\"][\"input\"];\n propagate?: InputMaybe<PropagationMode>;\n};\n\nexport type MutationDeleteDocumentsArgs = {\n identifiers: ReadonlyArray<Scalars[\"String\"][\"input\"]>;\n propagate?: InputMaybe<PropagationMode>;\n};\n\nexport type MutationMoveChildrenArgs = {\n branch?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n documentIdentifiers: ReadonlyArray<Scalars[\"String\"][\"input\"]>;\n sourceParentIdentifier: Scalars[\"String\"][\"input\"];\n targetParentIdentifier: Scalars[\"String\"][\"input\"];\n};\n\nexport type MutationMutateDocumentArgs = {\n actions: ReadonlyArray<Scalars[\"JSONObject\"][\"input\"]>;\n documentIdentifier: Scalars[\"String\"][\"input\"];\n view?: InputMaybe<ViewFilterInput>;\n};\n\nexport type MutationMutateDocumentAsyncArgs = {\n actions: ReadonlyArray<Scalars[\"JSONObject\"][\"input\"]>;\n documentIdentifier: Scalars[\"String\"][\"input\"];\n view?: InputMaybe<ViewFilterInput>;\n};\n\nexport type MutationPushSyncEnvelopesArgs = {\n envelopes: ReadonlyArray<SyncEnvelopeInput>;\n};\n\nexport type MutationRemoveChildrenArgs = {\n branch?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n documentIdentifiers: ReadonlyArray<Scalars[\"String\"][\"input\"]>;\n parentIdentifier: Scalars[\"String\"][\"input\"];\n};\n\nexport type MutationRenameDocumentArgs = {\n branch?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n documentIdentifier: Scalars[\"String\"][\"input\"];\n name: Scalars[\"String\"][\"input\"];\n};\n\nexport type MutationTouchChannelArgs = {\n input: TouchChannelInput;\n};\n\nexport type OperationContext = {\n readonly branch: Scalars[\"String\"][\"output\"];\n readonly documentId: Scalars[\"String\"][\"output\"];\n readonly documentType: Scalars[\"String\"][\"output\"];\n readonly ordinal: Scalars[\"Int\"][\"output\"];\n readonly scope: Scalars[\"String\"][\"output\"];\n};\n\nexport type OperationContextInput = {\n readonly branch: Scalars[\"String\"][\"input\"];\n readonly documentId: Scalars[\"String\"][\"input\"];\n readonly documentType: Scalars[\"String\"][\"input\"];\n readonly ordinal: Scalars[\"Int\"][\"input\"];\n readonly scope: Scalars[\"String\"][\"input\"];\n};\n\nexport type OperationInput = {\n readonly action: ActionInput;\n readonly error?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n readonly hash: Scalars[\"String\"][\"input\"];\n readonly id?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n readonly index: Scalars[\"Int\"][\"input\"];\n readonly skip: Scalars[\"Int\"][\"input\"];\n readonly timestampUtcMs: Scalars[\"String\"][\"input\"];\n};\n\nexport type OperationWithContext = {\n readonly context: OperationContext;\n readonly operation: ReactorOperation;\n};\n\nexport type OperationWithContextInput = {\n readonly context: OperationContextInput;\n readonly operation: OperationInput;\n};\n\nexport type OperationsFilterInput = {\n readonly actionTypes?: InputMaybe<ReadonlyArray<Scalars[\"String\"][\"input\"]>>;\n readonly branch?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n readonly documentId: Scalars[\"String\"][\"input\"];\n readonly scopes?: InputMaybe<ReadonlyArray<Scalars[\"String\"][\"input\"]>>;\n readonly sinceRevision?: InputMaybe<Scalars[\"Int\"][\"input\"]>;\n readonly timestampFrom?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n readonly timestampTo?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n};\n\nexport type PhDocument = {\n readonly createdAtUtcIso: Scalars[\"DateTime\"][\"output\"];\n readonly documentType: Scalars[\"String\"][\"output\"];\n readonly id: Scalars[\"String\"][\"output\"];\n readonly lastModifiedAtUtcIso: Scalars[\"DateTime\"][\"output\"];\n readonly name: Scalars[\"String\"][\"output\"];\n readonly operations?: Maybe<ReactorOperationResultPage>;\n readonly preferredEditor?: Maybe<Scalars[\"String\"][\"output\"]>;\n readonly revisionsList: ReadonlyArray<Revision>;\n readonly slug?: Maybe<Scalars[\"String\"][\"output\"]>;\n readonly state: Scalars[\"JSONObject\"][\"output\"];\n};\n\nexport type PhDocumentOperationsArgs = {\n filter?: InputMaybe<DocumentOperationsFilterInput>;\n paging?: InputMaybe<PagingInput>;\n};\n\nexport type PhDocumentResultPage = {\n readonly cursor?: Maybe<Scalars[\"String\"][\"output\"]>;\n readonly hasNextPage: Scalars[\"Boolean\"][\"output\"];\n readonly hasPreviousPage: Scalars[\"Boolean\"][\"output\"];\n readonly items: ReadonlyArray<PhDocument>;\n readonly totalCount: Scalars[\"Int\"][\"output\"];\n};\n\nexport type PagingInput = {\n readonly cursor?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n readonly limit?: InputMaybe<Scalars[\"Int\"][\"input\"]>;\n readonly offset?: InputMaybe<Scalars[\"Int\"][\"input\"]>;\n};\n\nexport type PollSyncEnvelopesResult = {\n readonly ackOrdinal: Scalars[\"Int\"][\"output\"];\n readonly deadLetters: ReadonlyArray<DeadLetterInfo>;\n readonly envelopes: ReadonlyArray<SyncEnvelope>;\n readonly hasMore: Scalars[\"Boolean\"][\"output\"];\n};\n\nexport enum PropagationMode {\n Cascade = \"CASCADE\",\n Orphan = \"ORPHAN\",\n}\n\nexport type Query = {\n readonly document?: Maybe<DocumentWithChildren>;\n readonly documentChildren: PhDocumentResultPage;\n readonly documentModels: DocumentModelResultPage;\n readonly documentOperations: ReactorOperationResultPage;\n readonly documentParents: PhDocumentResultPage;\n readonly findDocuments: PhDocumentResultPage;\n readonly jobStatus?: Maybe<JobInfo>;\n readonly pollSyncEnvelopes: PollSyncEnvelopesResult;\n};\n\nexport type QueryDocumentArgs = {\n identifier: Scalars[\"String\"][\"input\"];\n view?: InputMaybe<ViewFilterInput>;\n};\n\nexport type QueryDocumentChildrenArgs = {\n paging?: InputMaybe<PagingInput>;\n parentIdentifier: Scalars[\"String\"][\"input\"];\n view?: InputMaybe<ViewFilterInput>;\n};\n\nexport type QueryDocumentModelsArgs = {\n namespace?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n paging?: InputMaybe<PagingInput>;\n};\n\nexport type QueryDocumentOperationsArgs = {\n filter: OperationsFilterInput;\n paging?: InputMaybe<PagingInput>;\n};\n\nexport type QueryDocumentParentsArgs = {\n childIdentifier: Scalars[\"String\"][\"input\"];\n paging?: InputMaybe<PagingInput>;\n view?: InputMaybe<ViewFilterInput>;\n};\n\nexport type QueryFindDocumentsArgs = {\n paging?: InputMaybe<PagingInput>;\n search?: InputMaybe<SearchFilterInput>;\n view?: InputMaybe<ViewFilterInput>;\n};\n\nexport type QueryJobStatusArgs = {\n jobId: Scalars[\"String\"][\"input\"];\n};\n\nexport type QueryPollSyncEnvelopesArgs = {\n channelId: Scalars[\"String\"][\"input\"];\n outboxAck: Scalars[\"Int\"][\"input\"];\n outboxLatest: Scalars[\"Int\"][\"input\"];\n};\n\nexport type ReactorOperation = {\n readonly action: Action;\n readonly error?: Maybe<Scalars[\"String\"][\"output\"]>;\n readonly hash: Scalars[\"String\"][\"output\"];\n readonly id?: Maybe<Scalars[\"String\"][\"output\"]>;\n readonly index: Scalars[\"Int\"][\"output\"];\n readonly skip: Scalars[\"Int\"][\"output\"];\n readonly timestampUtcMs: Scalars[\"String\"][\"output\"];\n};\n\nexport type ReactorOperationResultPage = {\n readonly cursor?: Maybe<Scalars[\"String\"][\"output\"]>;\n readonly hasNextPage: Scalars[\"Boolean\"][\"output\"];\n readonly hasPreviousPage: Scalars[\"Boolean\"][\"output\"];\n readonly items: ReadonlyArray<ReactorOperation>;\n readonly totalCount: Scalars[\"Int\"][\"output\"];\n};\n\nexport type ReactorSigner = {\n readonly app?: Maybe<ReactorSignerApp>;\n readonly signatures: ReadonlyArray<Scalars[\"String\"][\"output\"]>;\n readonly user?: Maybe<ReactorSignerUser>;\n};\n\nexport type ReactorSignerApp = {\n readonly key: Scalars[\"String\"][\"output\"];\n readonly name: Scalars[\"String\"][\"output\"];\n};\n\nexport type ReactorSignerAppInput = {\n readonly key: Scalars[\"String\"][\"input\"];\n readonly name: Scalars[\"String\"][\"input\"];\n};\n\nexport type ReactorSignerInput = {\n readonly app?: InputMaybe<ReactorSignerAppInput>;\n readonly signatures: ReadonlyArray<Scalars[\"String\"][\"input\"]>;\n readonly user?: InputMaybe<ReactorSignerUserInput>;\n};\n\nexport type ReactorSignerUser = {\n readonly address: Scalars[\"String\"][\"output\"];\n readonly chainId: Scalars[\"Int\"][\"output\"];\n readonly networkId: Scalars[\"String\"][\"output\"];\n};\n\nexport type ReactorSignerUserInput = {\n readonly address: Scalars[\"String\"][\"input\"];\n readonly chainId: Scalars[\"Int\"][\"input\"];\n readonly networkId: Scalars[\"String\"][\"input\"];\n};\n\nexport type RemoteCursor = {\n readonly cursorOrdinal: Scalars[\"Int\"][\"output\"];\n readonly lastSyncedAtUtcMs?: Maybe<Scalars[\"String\"][\"output\"]>;\n readonly remoteName: Scalars[\"String\"][\"output\"];\n};\n\nexport type RemoteCursorInput = {\n readonly cursorOrdinal: Scalars[\"Int\"][\"input\"];\n readonly lastSyncedAtUtcMs?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n readonly remoteName: Scalars[\"String\"][\"input\"];\n};\n\nexport type RemoteFilterInput = {\n readonly branch: Scalars[\"String\"][\"input\"];\n readonly documentId: ReadonlyArray<Scalars[\"String\"][\"input\"]>;\n readonly scope: ReadonlyArray<Scalars[\"String\"][\"input\"]>;\n};\n\nexport type Revision = {\n readonly revision: Scalars[\"Int\"][\"output\"];\n readonly scope: Scalars[\"String\"][\"output\"];\n};\n\nexport type SearchFilterInput = {\n readonly identifiers?: InputMaybe<ReadonlyArray<Scalars[\"String\"][\"input\"]>>;\n readonly parentId?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n readonly type?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n};\n\nexport type Subscription = {\n readonly documentChanges: DocumentChangeEvent;\n readonly jobChanges: JobChangeEvent;\n};\n\nexport type SubscriptionDocumentChangesArgs = {\n search?: InputMaybe<SearchFilterInput>;\n view?: InputMaybe<ViewFilterInput>;\n};\n\nexport type SubscriptionJobChangesArgs = {\n jobId: Scalars[\"String\"][\"input\"];\n};\n\nexport type SyncEnvelope = {\n readonly channelMeta: ChannelMeta;\n readonly cursor?: Maybe<RemoteCursor>;\n readonly dependsOn?: Maybe<ReadonlyArray<Scalars[\"String\"][\"output\"]>>;\n readonly key?: Maybe<Scalars[\"String\"][\"output\"]>;\n readonly operations?: Maybe<ReadonlyArray<OperationWithContext>>;\n readonly type: SyncEnvelopeType;\n};\n\nexport type SyncEnvelopeInput = {\n readonly channelMeta: ChannelMetaInput;\n readonly cursor?: InputMaybe<RemoteCursorInput>;\n readonly dependsOn?: InputMaybe<ReadonlyArray<Scalars[\"String\"][\"input\"]>>;\n readonly key?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n readonly operations?: InputMaybe<ReadonlyArray<OperationWithContextInput>>;\n readonly type: SyncEnvelopeType;\n};\n\nexport enum SyncEnvelopeType {\n Ack = \"ACK\",\n Operations = \"OPERATIONS\",\n}\n\nexport type TouchChannelInput = {\n readonly collectionId: Scalars[\"String\"][\"input\"];\n readonly filter: RemoteFilterInput;\n readonly id: Scalars[\"String\"][\"input\"];\n readonly name: Scalars[\"String\"][\"input\"];\n readonly sinceTimestampUtcMs: Scalars[\"String\"][\"input\"];\n};\n\nexport type TouchChannelResult = {\n readonly ackOrdinal: Scalars[\"Int\"][\"output\"];\n readonly success: Scalars[\"Boolean\"][\"output\"];\n};\n\nexport type ViewFilterInput = {\n readonly branch?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n readonly scopes?: InputMaybe<ReadonlyArray<Scalars[\"String\"][\"input\"]>>;\n};\n\nexport type PhDocumentFieldsFragment = {\n readonly id: string;\n readonly slug?: string | null | undefined;\n readonly name: string;\n readonly documentType: string;\n readonly state: NonNullable<unknown>;\n readonly createdAtUtcIso: string | Date;\n readonly lastModifiedAtUtcIso: string | Date;\n readonly revisionsList: ReadonlyArray<{\n readonly scope: string;\n readonly revision: number;\n }>;\n};\n\nexport type GetDocumentModelsQueryVariables = Exact<{\n namespace?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n paging?: InputMaybe<PagingInput>;\n}>;\n\nexport type GetDocumentModelsQuery = {\n readonly documentModels: {\n readonly totalCount: number;\n readonly hasNextPage: boolean;\n readonly hasPreviousPage: boolean;\n readonly cursor?: string | null | undefined;\n readonly items: ReadonlyArray<{\n readonly id: string;\n readonly name: string;\n readonly namespace?: string | null | undefined;\n readonly version?: string | null | undefined;\n readonly specification: NonNullable<unknown>;\n }>;\n };\n};\n\nexport type GetDocumentQueryVariables = Exact<{\n identifier: Scalars[\"String\"][\"input\"];\n view?: InputMaybe<ViewFilterInput>;\n}>;\n\nexport type GetDocumentQuery = {\n readonly document?:\n | {\n readonly childIds: ReadonlyArray<string>;\n readonly document: {\n readonly id: string;\n readonly slug?: string | null | undefined;\n readonly name: string;\n readonly documentType: string;\n readonly state: NonNullable<unknown>;\n readonly createdAtUtcIso: string | Date;\n readonly lastModifiedAtUtcIso: string | Date;\n readonly revisionsList: ReadonlyArray<{\n readonly scope: string;\n readonly revision: number;\n }>;\n };\n }\n | null\n | undefined;\n};\n\nexport type GetDocumentWithOperationsQueryVariables = Exact<{\n identifier: Scalars[\"String\"][\"input\"];\n view?: InputMaybe<ViewFilterInput>;\n operationsFilter?: InputMaybe<DocumentOperationsFilterInput>;\n operationsPaging?: InputMaybe<PagingInput>;\n}>;\n\nexport type GetDocumentWithOperationsQuery = {\n readonly document?:\n | {\n readonly childIds: ReadonlyArray<string>;\n readonly document: {\n readonly id: string;\n readonly slug?: string | null | undefined;\n readonly name: string;\n readonly documentType: string;\n readonly state: NonNullable<unknown>;\n readonly createdAtUtcIso: string | Date;\n readonly lastModifiedAtUtcIso: string | Date;\n readonly operations?:\n | {\n readonly totalCount: number;\n readonly hasNextPage: boolean;\n readonly hasPreviousPage: boolean;\n readonly cursor?: string | null | undefined;\n readonly items: ReadonlyArray<{\n readonly index: number;\n readonly timestampUtcMs: string;\n readonly hash: string;\n readonly skip: number;\n readonly error?: string | null | undefined;\n readonly id?: string | null | undefined;\n readonly action: {\n readonly id: string;\n readonly type: string;\n readonly timestampUtcMs: string;\n readonly input: NonNullable<unknown>;\n readonly scope: string;\n readonly attachments?:\n | ReadonlyArray<{\n readonly data: string;\n readonly mimeType: string;\n readonly hash: string;\n readonly extension?: string | null | undefined;\n readonly fileName?: string | null | undefined;\n }>\n | null\n | undefined;\n readonly context?:\n | {\n readonly signer?:\n | {\n readonly signatures: ReadonlyArray<string>;\n readonly user?:\n | {\n readonly address: string;\n readonly networkId: string;\n readonly chainId: number;\n }\n | null\n | undefined;\n readonly app?:\n | {\n readonly name: string;\n readonly key: string;\n }\n | null\n | undefined;\n }\n | null\n | undefined;\n }\n | null\n | undefined;\n };\n }>;\n }\n | null\n | undefined;\n readonly revisionsList: ReadonlyArray<{\n readonly scope: string;\n readonly revision: number;\n }>;\n };\n }\n | null\n | undefined;\n};\n\nexport type GetDocumentChildrenQueryVariables = Exact<{\n parentIdentifier: Scalars[\"String\"][\"input\"];\n view?: InputMaybe<ViewFilterInput>;\n paging?: InputMaybe<PagingInput>;\n}>;\n\nexport type GetDocumentChildrenQuery = {\n readonly documentChildren: {\n readonly totalCount: number;\n readonly hasNextPage: boolean;\n readonly hasPreviousPage: boolean;\n readonly cursor?: string | null | undefined;\n readonly items: ReadonlyArray<{\n readonly id: string;\n readonly slug?: string | null | undefined;\n readonly name: string;\n readonly documentType: string;\n readonly state: NonNullable<unknown>;\n readonly createdAtUtcIso: string | Date;\n readonly lastModifiedAtUtcIso: string | Date;\n readonly revisionsList: ReadonlyArray<{\n readonly scope: string;\n readonly revision: number;\n }>;\n }>;\n };\n};\n\nexport type GetDocumentParentsQueryVariables = Exact<{\n childIdentifier: Scalars[\"String\"][\"input\"];\n view?: InputMaybe<ViewFilterInput>;\n paging?: InputMaybe<PagingInput>;\n}>;\n\nexport type GetDocumentParentsQuery = {\n readonly documentParents: {\n readonly totalCount: number;\n readonly hasNextPage: boolean;\n readonly hasPreviousPage: boolean;\n readonly cursor?: string | null | undefined;\n readonly items: ReadonlyArray<{\n readonly id: string;\n readonly slug?: string | null | undefined;\n readonly name: string;\n readonly documentType: string;\n readonly state: NonNullable<unknown>;\n readonly createdAtUtcIso: string | Date;\n readonly lastModifiedAtUtcIso: string | Date;\n readonly revisionsList: ReadonlyArray<{\n readonly scope: string;\n readonly revision: number;\n }>;\n }>;\n };\n};\n\nexport type FindDocumentsQueryVariables = Exact<{\n search?: InputMaybe<SearchFilterInput>;\n view?: InputMaybe<ViewFilterInput>;\n paging?: InputMaybe<PagingInput>;\n}>;\n\nexport type FindDocumentsQuery = {\n readonly findDocuments: {\n readonly totalCount: number;\n readonly hasNextPage: boolean;\n readonly hasPreviousPage: boolean;\n readonly cursor?: string | null | undefined;\n readonly items: ReadonlyArray<{\n readonly id: string;\n readonly slug?: string | null | undefined;\n readonly name: string;\n readonly documentType: string;\n readonly state: NonNullable<unknown>;\n readonly createdAtUtcIso: string | Date;\n readonly lastModifiedAtUtcIso: string | Date;\n readonly revisionsList: ReadonlyArray<{\n readonly scope: string;\n readonly revision: number;\n }>;\n }>;\n };\n};\n\nexport type GetDocumentOperationsQueryVariables = Exact<{\n filter: OperationsFilterInput;\n paging?: InputMaybe<PagingInput>;\n}>;\n\nexport type GetDocumentOperationsQuery = {\n readonly documentOperations: {\n readonly totalCount: number;\n readonly hasNextPage: boolean;\n readonly hasPreviousPage: boolean;\n readonly cursor?: string | null | undefined;\n readonly items: ReadonlyArray<{\n readonly index: number;\n readonly timestampUtcMs: string;\n readonly hash: string;\n readonly skip: number;\n readonly error?: string | null | undefined;\n readonly id?: string | null | undefined;\n readonly action: {\n readonly id: string;\n readonly type: string;\n readonly timestampUtcMs: string;\n readonly input: NonNullable<unknown>;\n readonly scope: string;\n readonly attachments?:\n | ReadonlyArray<{\n readonly data: string;\n readonly mimeType: string;\n readonly hash: string;\n readonly extension?: string | null | undefined;\n readonly fileName?: string | null | undefined;\n }>\n | null\n | undefined;\n readonly context?:\n | {\n readonly signer?:\n | {\n readonly signatures: ReadonlyArray<string>;\n readonly user?:\n | {\n readonly address: string;\n readonly networkId: string;\n readonly chainId: number;\n }\n | null\n | undefined;\n readonly app?:\n | { readonly name: string; readonly key: string }\n | null\n | undefined;\n }\n | null\n | undefined;\n }\n | null\n | undefined;\n };\n }>;\n };\n};\n\nexport type GetJobStatusQueryVariables = Exact<{\n jobId: Scalars[\"String\"][\"input\"];\n}>;\n\nexport type GetJobStatusQuery = {\n readonly jobStatus?:\n | {\n readonly id: string;\n readonly status: string;\n readonly result: NonNullable<unknown>;\n readonly error?: string | null | undefined;\n readonly createdAt: string | Date;\n readonly completedAt?: string | Date | null | undefined;\n }\n | null\n | undefined;\n};\n\nexport type CreateDocumentMutationVariables = Exact<{\n document: Scalars[\"JSONObject\"][\"input\"];\n parentIdentifier?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n}>;\n\nexport type CreateDocumentMutation = {\n readonly createDocument: {\n readonly id: string;\n readonly slug?: string | null | undefined;\n readonly name: string;\n readonly documentType: string;\n readonly state: NonNullable<unknown>;\n readonly createdAtUtcIso: string | Date;\n readonly lastModifiedAtUtcIso: string | Date;\n readonly revisionsList: ReadonlyArray<{\n readonly scope: string;\n readonly revision: number;\n }>;\n };\n};\n\nexport type CreateEmptyDocumentMutationVariables = Exact<{\n documentType: Scalars[\"String\"][\"input\"];\n parentIdentifier?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n}>;\n\nexport type CreateEmptyDocumentMutation = {\n readonly createEmptyDocument: {\n readonly id: string;\n readonly slug?: string | null | undefined;\n readonly name: string;\n readonly documentType: string;\n readonly state: NonNullable<unknown>;\n readonly createdAtUtcIso: string | Date;\n readonly lastModifiedAtUtcIso: string | Date;\n readonly revisionsList: ReadonlyArray<{\n readonly scope: string;\n readonly revision: number;\n }>;\n };\n};\n\nexport type MutateDocumentMutationVariables = Exact<{\n documentIdentifier: Scalars[\"String\"][\"input\"];\n actions: ReadonlyArray<Scalars[\"JSONObject\"][\"input\"]>;\n view?: InputMaybe<ViewFilterInput>;\n}>;\n\nexport type MutateDocumentMutation = {\n readonly mutateDocument: {\n readonly id: string;\n readonly slug?: string | null | undefined;\n readonly name: string;\n readonly documentType: string;\n readonly state: NonNullable<unknown>;\n readonly createdAtUtcIso: string | Date;\n readonly lastModifiedAtUtcIso: string | Date;\n readonly revisionsList: ReadonlyArray<{\n readonly scope: string;\n readonly revision: number;\n }>;\n };\n};\n\nexport type MutateDocumentAsyncMutationVariables = Exact<{\n documentIdentifier: Scalars[\"String\"][\"input\"];\n actions: ReadonlyArray<Scalars[\"JSONObject\"][\"input\"]>;\n view?: InputMaybe<ViewFilterInput>;\n}>;\n\nexport type MutateDocumentAsyncMutation = {\n readonly mutateDocumentAsync: string;\n};\n\nexport type RenameDocumentMutationVariables = Exact<{\n documentIdentifier: Scalars[\"String\"][\"input\"];\n name: Scalars[\"String\"][\"input\"];\n branch?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n}>;\n\nexport type RenameDocumentMutation = {\n readonly renameDocument: {\n readonly id: string;\n readonly slug?: string | null | undefined;\n readonly name: string;\n readonly documentType: string;\n readonly state: NonNullable<unknown>;\n readonly createdAtUtcIso: string | Date;\n readonly lastModifiedAtUtcIso: string | Date;\n readonly revisionsList: ReadonlyArray<{\n readonly scope: string;\n readonly revision: number;\n }>;\n };\n};\n\nexport type AddChildrenMutationVariables = Exact<{\n parentIdentifier: Scalars[\"String\"][\"input\"];\n documentIdentifiers: ReadonlyArray<Scalars[\"String\"][\"input\"]>;\n branch?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n}>;\n\nexport type AddChildrenMutation = {\n readonly addChildren: {\n readonly id: string;\n readonly slug?: string | null | undefined;\n readonly name: string;\n readonly documentType: string;\n readonly state: NonNullable<unknown>;\n readonly createdAtUtcIso: string | Date;\n readonly lastModifiedAtUtcIso: string | Date;\n readonly revisionsList: ReadonlyArray<{\n readonly scope: string;\n readonly revision: number;\n }>;\n };\n};\n\nexport type RemoveChildrenMutationVariables = Exact<{\n parentIdentifier: Scalars[\"String\"][\"input\"];\n documentIdentifiers: ReadonlyArray<Scalars[\"String\"][\"input\"]>;\n branch?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n}>;\n\nexport type RemoveChildrenMutation = {\n readonly removeChildren: {\n readonly id: string;\n readonly slug?: string | null | undefined;\n readonly name: string;\n readonly documentType: string;\n readonly state: NonNullable<unknown>;\n readonly createdAtUtcIso: string | Date;\n readonly lastModifiedAtUtcIso: string | Date;\n readonly revisionsList: ReadonlyArray<{\n readonly scope: string;\n readonly revision: number;\n }>;\n };\n};\n\nexport type MoveChildrenMutationVariables = Exact<{\n sourceParentIdentifier: Scalars[\"String\"][\"input\"];\n targetParentIdentifier: Scalars[\"String\"][\"input\"];\n documentIdentifiers: ReadonlyArray<Scalars[\"String\"][\"input\"]>;\n branch?: InputMaybe<Scalars[\"String\"][\"input\"]>;\n}>;\n\nexport type MoveChildrenMutation = {\n readonly moveChildren: {\n readonly source: {\n readonly id: string;\n readonly slug?: string | null | undefined;\n readonly name: string;\n readonly documentType: string;\n readonly state: NonNullable<unknown>;\n readonly createdAtUtcIso: string | Date;\n readonly lastModifiedAtUtcIso: string | Date;\n readonly revisionsList: ReadonlyArray<{\n readonly scope: string;\n readonly revision: number;\n }>;\n };\n readonly target: {\n readonly id: string;\n readonly slug?: string | null | undefined;\n readonly name: string;\n readonly documentType: string;\n readonly state: NonNullable<unknown>;\n readonly createdAtUtcIso: string | Date;\n readonly lastModifiedAtUtcIso: string | Date;\n readonly revisionsList: ReadonlyArray<{\n readonly scope: string;\n readonly revision: number;\n }>;\n };\n };\n};\n\nexport type DeleteDocumentMutationVariables = Exact<{\n identifier: Scalars[\"String\"][\"input\"];\n propagate?: InputMaybe<PropagationMode>;\n}>;\n\nexport type DeleteDocumentMutation = { readonly deleteDocument: boolean };\n\nexport type DeleteDocumentsMutationVariables = Exact<{\n identifiers: ReadonlyArray<Scalars[\"String\"][\"input\"]>;\n propagate?: InputMaybe<PropagationMode>;\n}>;\n\nexport type DeleteDocumentsMutation = { readonly deleteDocuments: boolean };\n\nexport type DocumentChangesSubscriptionVariables = Exact<{\n search?: InputMaybe<SearchFilterInput>;\n view?: InputMaybe<ViewFilterInput>;\n}>;\n\nexport type DocumentChangesSubscription = {\n readonly documentChanges: {\n readonly type: DocumentChangeType;\n readonly documents: ReadonlyArray<{\n readonly id: string;\n readonly slug?: string | null | undefined;\n readonly name: string;\n readonly documentType: string;\n readonly state: NonNullable<unknown>;\n readonly createdAtUtcIso: string | Date;\n readonly lastModifiedAtUtcIso: string | Date;\n readonly revisionsList: ReadonlyArray<{\n readonly scope: string;\n readonly revision: number;\n }>;\n }>;\n readonly context?:\n | {\n readonly parentId?: string | null | undefined;\n readonly childId?: string | null | undefined;\n }\n | null\n | undefined;\n };\n};\n\nexport type JobChangesSubscriptionVariables = Exact<{\n jobId: Scalars[\"String\"][\"input\"];\n}>;\n\nexport type JobChangesSubscription = {\n readonly jobChanges: {\n readonly jobId: string;\n readonly status: string;\n readonly result: NonNullable<unknown>;\n readonly error?: string | null | undefined;\n };\n};\n\nexport type PollSyncEnvelopesQueryVariables = Exact<{\n channelId: Scalars[\"String\"][\"input\"];\n outboxAck: Scalars[\"Int\"][\"input\"];\n outboxLatest: Scalars[\"Int\"][\"input\"];\n}>;\n\nexport type PollSyncEnvelopesQuery = {\n readonly pollSyncEnvelopes: {\n readonly ackOrdinal: number;\n readonly hasMore: boolean;\n readonly envelopes: ReadonlyArray<{\n readonly type: SyncEnvelopeType;\n readonly key?: string | null | undefined;\n readonly dependsOn?: ReadonlyArray<string> | null | undefined;\n readonly channelMeta: { readonly id: string };\n readonly operations?:\n | ReadonlyArray<{\n readonly operation: {\n readonly index: number;\n readonly timestampUtcMs: string;\n readonly hash: string;\n readonly skip: number;\n readonly error?: string | null | undefined;\n readonly id?: string | null | undefined;\n readonly action: {\n readonly id: string;\n readonly type: string;\n readonly timestampUtcMs: string;\n readonly input: NonNullable<unknown>;\n readonly scope: string;\n readonly attachments?:\n | ReadonlyArray<{\n readonly data: string;\n readonly mimeType: string;\n readonly hash: string;\n readonly extension?: string | null | undefined;\n readonly fileName?: string | null | undefined;\n }>\n | null\n | undefined;\n readonly context?:\n | {\n readonly signer?:\n | {\n readonly signatures: ReadonlyArray<string>;\n readonly user?:\n | {\n readonly address: string;\n readonly networkId: string;\n readonly chainId: number;\n }\n | null\n | undefined;\n readonly app?:\n | { readonly name: string; readonly key: string }\n | null\n | undefined;\n }\n | null\n | undefined;\n }\n | null\n | undefined;\n };\n };\n readonly context: {\n readonly documentId: string;\n readonly documentType: string;\n readonly scope: string;\n readonly branch: string;\n };\n }>\n | null\n | undefined;\n readonly cursor?:\n | {\n readonly remoteName: string;\n readonly cursorOrdinal: number;\n readonly lastSyncedAtUtcMs?: string | null | undefined;\n }\n | null\n | undefined;\n }>;\n readonly deadLetters: ReadonlyArray<{\n readonly documentId: string;\n readonly error: string;\n }>;\n };\n};\n\nexport type TouchChannelMutationVariables = Exact<{\n input: TouchChannelInput;\n}>;\n\nexport type TouchChannelMutation = {\n readonly touchChannel: {\n readonly success: boolean;\n readonly ackOrdinal: number;\n };\n};\n\nexport type PushSyncEnvelopesMutationVariables = Exact<{\n envelopes: ReadonlyArray<SyncEnvelopeInput>;\n}>;\n\nexport type PushSyncEnvelopesMutation = { readonly pushSyncEnvelopes: boolean };\n\nexport type WithIndex<TObject> = TObject & Record<string, any>;\nexport type ResolversObject<TObject> = WithIndex<TObject>;\n\nexport type ResolverTypeWrapper<T> = Promise<T> | T;\n\nexport type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {\n resolve: ResolverFn<TResult, TParent, TContext, TArgs>;\n};\nexport type Resolver<\n TResult,\n TParent = Record<PropertyKey, never>,\n TContext = Record<PropertyKey, never>,\n TArgs = Record<PropertyKey, never>,\n> =\n | ResolverFn<TResult, TParent, TContext, TArgs>\n | ResolverWithResolve<TResult, TParent, TContext, TArgs>;\n\nexport type ResolverFn<TResult, TParent, TContext, TArgs> = (\n parent: TParent,\n args: TArgs,\n context: TContext,\n info: GraphQLResolveInfo,\n) => Promise<TResult> | TResult;\n\nexport type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (\n parent: TParent,\n args: TArgs,\n context: TContext,\n info: GraphQLResolveInfo,\n) => AsyncIterable<TResult> | Promise<AsyncIterable<TResult>>;\n\nexport type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (\n parent: TParent,\n args: TArgs,\n context: TContext,\n info: GraphQLResolveInfo,\n) => TResult | Promise<TResult>;\n\nexport interface SubscriptionSubscriberObject<\n TResult,\n TKey extends string,\n TParent,\n TContext,\n TArgs,\n> {\n subscribe: SubscriptionSubscribeFn<\n { [key in TKey]: TResult },\n TParent,\n TContext,\n TArgs\n >;\n resolve?: SubscriptionResolveFn<\n TResult,\n { [key in TKey]: TResult },\n TContext,\n TArgs\n >;\n}\n\nexport interface SubscriptionResolverObject<TResult, TParent, TContext, TArgs> {\n subscribe: SubscriptionSubscribeFn<any, TParent, TContext, TArgs>;\n resolve: SubscriptionResolveFn<TResult, any, TContext, TArgs>;\n}\n\nexport type SubscriptionObject<\n TResult,\n TKey extends string,\n TParent,\n TContext,\n TArgs,\n> =\n | SubscriptionSubscriberObject<TResult, TKey, TParent, TContext, TArgs>\n | SubscriptionResolverObject<TResult, TParent, TContext, TArgs>;\n\nexport type SubscriptionResolver<\n TResult,\n TKey extends string,\n TParent = Record<PropertyKey, never>,\n TContext = Record<PropertyKey, never>,\n TArgs = Record<PropertyKey, never>,\n> =\n | ((\n ...args: any[]\n ) => SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>)\n | SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>;\n\nexport type TypeResolveFn<\n TTypes,\n TParent = Record<PropertyKey, never>,\n TContext = Record<PropertyKey, never>,\n> = (\n parent: TParent,\n context: TContext,\n info: GraphQLResolveInfo,\n) => Maybe<TTypes> | Promise<Maybe<TTypes>>;\n\nexport type IsTypeOfResolverFn<\n T = Record<PropertyKey, never>,\n TContext = Record<PropertyKey, never>,\n> = (\n obj: T,\n context: TContext,\n info: GraphQLResolveInfo,\n) => boolean | Promise<boolean>;\n\nexport type NextResolverFn<T> = () => Promise<T>;\n\nexport type DirectiveResolverFn<\n TResult = Record<PropertyKey, never>,\n TParent = Record<PropertyKey, never>,\n TContext = Record<PropertyKey, never>,\n TArgs = Record<PropertyKey, never>,\n> = (\n next: NextResolverFn<TResult>,\n parent: TParent,\n args: TArgs,\n context: TContext,\n info: GraphQLResolveInfo,\n) => TResult | Promise<TResult>;\n\n/** Mapping between all available schema types and the resolvers types */\nexport type ResolversTypes = ResolversObject<{\n Action: ResolverTypeWrapper<Action>;\n ActionContext: ResolverTypeWrapper<ActionContext>;\n ActionContextInput: ActionContextInput;\n ActionInput: ActionInput;\n Attachment: ResolverTypeWrapper<Attachment>;\n AttachmentInput: AttachmentInput;\n Boolean: ResolverTypeWrapper<Scalars[\"Boolean\"][\"output\"]>;\n ChannelMeta: ResolverTypeWrapper<ChannelMeta>;\n ChannelMetaInput: ChannelMetaInput;\n DateTime: ResolverTypeWrapper<Scalars[\"DateTime\"][\"output\"]>;\n DeadLetterInfo: ResolverTypeWrapper<DeadLetterInfo>;\n DocumentChangeContext: ResolverTypeWrapper<DocumentChangeContext>;\n DocumentChangeEvent: ResolverTypeWrapper<DocumentChangeEvent>;\n DocumentChangeType: DocumentChangeType;\n DocumentModelGlobalState: ResolverTypeWrapper<DocumentModelGlobalState>;\n DocumentModelResultPage: ResolverTypeWrapper<DocumentModelResultPage>;\n DocumentOperationsFilterInput: DocumentOperationsFilterInput;\n DocumentWithChildren: ResolverTypeWrapper<DocumentWithChildren>;\n Int: ResolverTypeWrapper<Scalars[\"Int\"][\"output\"]>;\n JSONObject: ResolverTypeWrapper<Scalars[\"JSONObject\"][\"output\"]>;\n JobChangeEvent: ResolverTypeWrapper<JobChangeEvent>;\n JobInfo: ResolverTypeWrapper<JobInfo>;\n MoveChildrenResult: ResolverTypeWrapper<MoveChildrenResult>;\n Mutation: ResolverTypeWrapper<Record<PropertyKey, never>>;\n OperationContext: ResolverTypeWrapper<OperationContext>;\n OperationContextInput: OperationContextInput;\n OperationInput: OperationInput;\n OperationWithContext: ResolverTypeWrapper<OperationWithContext>;\n OperationWithContextInput: OperationWithContextInput;\n OperationsFilterInput: OperationsFilterInput;\n PHDocument: ResolverTypeWrapper<PhDocument>;\n PHDocumentResultPage: ResolverTypeWrapper<PhDocumentResultPage>;\n PagingInput: PagingInput;\n PollSyncEnvelopesResult: ResolverTypeWrapper<PollSyncEnvelopesResult>;\n PropagationMode: PropagationMode;\n Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n ReactorOperation: ResolverTypeWrapper<ReactorOperation>;\n ReactorOperationResultPage: ResolverTypeWrapper<ReactorOperationResultPage>;\n ReactorSigner: ResolverTypeWrapper<ReactorSigner>;\n ReactorSignerApp: ResolverTypeWrapper<ReactorSignerApp>;\n ReactorSignerAppInput: ReactorSignerAppInput;\n ReactorSignerInput: ReactorSignerInput;\n ReactorSignerUser: ResolverTypeWrapper<ReactorSignerUser>;\n ReactorSignerUserInput: ReactorSignerUserInput;\n RemoteCursor: ResolverTypeWrapper<RemoteCursor>;\n RemoteCursorInput: RemoteCursorInput;\n RemoteFilterInput: RemoteFilterInput;\n Revision: ResolverTypeWrapper<Revision>;\n SearchFilterInput: SearchFilterInput;\n String: ResolverTypeWrapper<Scalars[\"String\"][\"output\"]>;\n Subscription: ResolverTypeWrapper<Record<PropertyKey, never>>;\n SyncEnvelope: ResolverTypeWrapper<SyncEnvelope>;\n SyncEnvelopeInput: SyncEnvelopeInput;\n SyncEnvelopeType: SyncEnvelopeType;\n TouchChannelInput: TouchChannelInput;\n TouchChannelResult: ResolverTypeWrapper<TouchChannelResult>;\n ViewFilterInput: ViewFilterInput;\n}>;\n\n/** Mapping between all available schema types and the resolvers parents */\nexport type ResolversParentTypes = ResolversObject<{\n Action: Action;\n ActionContext: ActionContext;\n ActionContextInput: ActionContextInput;\n ActionInput: ActionInput;\n Attachment: Attachment;\n AttachmentInput: AttachmentInput;\n Boolean: Scalars[\"Boolean\"][\"output\"];\n ChannelMeta: ChannelMeta;\n ChannelMetaInput: ChannelMetaInput;\n DateTime: Scalars[\"DateTime\"][\"output\"];\n DeadLetterInfo: DeadLetterInfo;\n DocumentChangeContext: DocumentChangeContext;\n DocumentChangeEvent: DocumentChangeEvent;\n DocumentModelGlobalState: DocumentModelGlobalState;\n DocumentModelResultPage: DocumentModelResultPage;\n DocumentOperationsFilterInput: DocumentOperationsFilterInput;\n DocumentWithChildren: DocumentWithChildren;\n Int: Scalars[\"Int\"][\"output\"];\n JSONObject: Scalars[\"JSONObject\"][\"output\"];\n JobChangeEvent: JobChangeEvent;\n JobInfo: JobInfo;\n MoveChildrenResult: MoveChildrenResult;\n Mutation: Record<PropertyKey, never>;\n OperationContext: OperationContext;\n OperationContextInput: OperationContextInput;\n OperationInput: OperationInput;\n OperationWithContext: OperationWithContext;\n OperationWithContextInput: OperationWithContextInput;\n OperationsFilterInput: OperationsFilterInput;\n PHDocument: PhDocument;\n PHDocumentResultPage: PhDocumentResultPage;\n PagingInput: PagingInput;\n PollSyncEnvelopesResult: PollSyncEnvelopesResult;\n Query: Record<PropertyKey, never>;\n ReactorOperation: ReactorOperation;\n ReactorOperationResultPage: ReactorOperationResultPage;\n ReactorSigner: ReactorSigner;\n ReactorSignerApp: ReactorSignerApp;\n ReactorSignerAppInput: ReactorSignerAppInput;\n ReactorSignerInput: ReactorSignerInput;\n ReactorSignerUser: ReactorSignerUser;\n ReactorSignerUserInput: ReactorSignerUserInput;\n RemoteCursor: RemoteCursor;\n RemoteCursorInput: RemoteCursorInput;\n RemoteFilterInput: RemoteFilterInput;\n Revision: Revision;\n SearchFilterInput: SearchFilterInput;\n String: Scalars[\"String\"][\"output\"];\n Subscription: Record<PropertyKey, never>;\n SyncEnvelope: SyncEnvelope;\n SyncEnvelopeInput: SyncEnvelopeInput;\n TouchChannelInput: TouchChannelInput;\n TouchChannelResult: TouchChannelResult;\n ViewFilterInput: ViewFilterInput;\n}>;\n\nexport type ActionResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"Action\"] =\n ResolversParentTypes[\"Action\"],\n> = ResolversObject<{\n attachments?: Resolver<\n Maybe<ReadonlyArray<ResolversTypes[\"Attachment\"]>>,\n ParentType,\n ContextType\n >;\n context?: Resolver<\n Maybe<ResolversTypes[\"ActionContext\"]>,\n ParentType,\n ContextType\n >;\n id?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n input?: Resolver<ResolversTypes[\"JSONObject\"], ParentType, ContextType>;\n scope?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n timestampUtcMs?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n type?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n}>;\n\nexport type ActionContextResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"ActionContext\"] =\n ResolversParentTypes[\"ActionContext\"],\n> = ResolversObject<{\n signer?: Resolver<\n Maybe<ResolversTypes[\"ReactorSigner\"]>,\n ParentType,\n ContextType\n >;\n}>;\n\nexport type AttachmentResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"Attachment\"] =\n ResolversParentTypes[\"Attachment\"],\n> = ResolversObject<{\n data?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n extension?: Resolver<\n Maybe<ResolversTypes[\"String\"]>,\n ParentType,\n ContextType\n >;\n fileName?: Resolver<Maybe<ResolversTypes[\"String\"]>, ParentType, ContextType>;\n hash?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n mimeType?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n}>;\n\nexport type ChannelMetaResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"ChannelMeta\"] =\n ResolversParentTypes[\"ChannelMeta\"],\n> = ResolversObject<{\n id?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n}>;\n\nexport interface DateTimeScalarConfig extends GraphQLScalarTypeConfig<\n ResolversTypes[\"DateTime\"],\n any\n> {\n name: \"DateTime\";\n}\n\nexport type DeadLetterInfoResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"DeadLetterInfo\"] =\n ResolversParentTypes[\"DeadLetterInfo\"],\n> = ResolversObject<{\n branch?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n documentId?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n error?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n jobId?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n operationCount?: Resolver<ResolversTypes[\"Int\"], ParentType, ContextType>;\n scopes?: Resolver<\n ReadonlyArray<ResolversTypes[\"String\"]>,\n ParentType,\n ContextType\n >;\n}>;\n\nexport type DocumentChangeContextResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"DocumentChangeContext\"] =\n ResolversParentTypes[\"DocumentChangeContext\"],\n> = ResolversObject<{\n childId?: Resolver<Maybe<ResolversTypes[\"String\"]>, ParentType, ContextType>;\n parentId?: Resolver<Maybe<ResolversTypes[\"String\"]>, ParentType, ContextType>;\n}>;\n\nexport type DocumentChangeEventResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"DocumentChangeEvent\"] =\n ResolversParentTypes[\"DocumentChangeEvent\"],\n> = ResolversObject<{\n context?: Resolver<\n Maybe<ResolversTypes[\"DocumentChangeContext\"]>,\n ParentType,\n ContextType\n >;\n documents?: Resolver<\n ReadonlyArray<ResolversTypes[\"PHDocument\"]>,\n ParentType,\n ContextType\n >;\n type?: Resolver<\n ResolversTypes[\"DocumentChangeType\"],\n ParentType,\n ContextType\n >;\n}>;\n\nexport type DocumentModelGlobalStateResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"DocumentModelGlobalState\"] =\n ResolversParentTypes[\"DocumentModelGlobalState\"],\n> = ResolversObject<{\n id?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n name?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n namespace?: Resolver<\n Maybe<ResolversTypes[\"String\"]>,\n ParentType,\n ContextType\n >;\n specification?: Resolver<\n ResolversTypes[\"JSONObject\"],\n ParentType,\n ContextType\n >;\n version?: Resolver<Maybe<ResolversTypes[\"String\"]>, ParentType, ContextType>;\n}>;\n\nexport type DocumentModelResultPageResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"DocumentModelResultPage\"] =\n ResolversParentTypes[\"DocumentModelResultPage\"],\n> = ResolversObject<{\n cursor?: Resolver<Maybe<ResolversTypes[\"String\"]>, ParentType, ContextType>;\n hasNextPage?: Resolver<ResolversTypes[\"Boolean\"], ParentType, ContextType>;\n hasPreviousPage?: Resolver<\n ResolversTypes[\"Boolean\"],\n ParentType,\n ContextType\n >;\n items?: Resolver<\n ReadonlyArray<ResolversTypes[\"DocumentModelGlobalState\"]>,\n ParentType,\n ContextType\n >;\n totalCount?: Resolver<ResolversTypes[\"Int\"], ParentType, ContextType>;\n}>;\n\nexport type DocumentWithChildrenResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"DocumentWithChildren\"] =\n ResolversParentTypes[\"DocumentWithChildren\"],\n> = ResolversObject<{\n childIds?: Resolver<\n ReadonlyArray<ResolversTypes[\"String\"]>,\n ParentType,\n ContextType\n >;\n document?: Resolver<ResolversTypes[\"PHDocument\"], ParentType, ContextType>;\n}>;\n\nexport interface JsonObjectScalarConfig extends GraphQLScalarTypeConfig<\n ResolversTypes[\"JSONObject\"],\n any\n> {\n name: \"JSONObject\";\n}\n\nexport type JobChangeEventResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"JobChangeEvent\"] =\n ResolversParentTypes[\"JobChangeEvent\"],\n> = ResolversObject<{\n error?: Resolver<Maybe<ResolversTypes[\"String\"]>, ParentType, ContextType>;\n jobId?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n result?: Resolver<ResolversTypes[\"JSONObject\"], ParentType, ContextType>;\n status?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n}>;\n\nexport type JobInfoResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"JobInfo\"] =\n ResolversParentTypes[\"JobInfo\"],\n> = ResolversObject<{\n completedAt?: Resolver<\n Maybe<ResolversTypes[\"DateTime\"]>,\n ParentType,\n ContextType\n >;\n createdAt?: Resolver<ResolversTypes[\"DateTime\"], ParentType, ContextType>;\n error?: Resolver<Maybe<ResolversTypes[\"String\"]>, ParentType, ContextType>;\n id?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n result?: Resolver<ResolversTypes[\"JSONObject\"], ParentType, ContextType>;\n status?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n}>;\n\nexport type MoveChildrenResultResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"MoveChildrenResult\"] =\n ResolversParentTypes[\"MoveChildrenResult\"],\n> = ResolversObject<{\n source?: Resolver<ResolversTypes[\"PHDocument\"], ParentType, ContextType>;\n target?: Resolver<ResolversTypes[\"PHDocument\"], ParentType, ContextType>;\n}>;\n\nexport type MutationResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"Mutation\"] =\n ResolversParentTypes[\"Mutation\"],\n> = ResolversObject<{\n addChildren?: Resolver<\n ResolversTypes[\"PHDocument\"],\n ParentType,\n ContextType,\n RequireFields<\n MutationAddChildrenArgs,\n \"documentIdentifiers\" | \"parentIdentifier\"\n >\n >;\n createDocument?: Resolver<\n ResolversTypes[\"PHDocument\"],\n ParentType,\n ContextType,\n RequireFields<MutationCreateDocumentArgs, \"document\">\n >;\n createEmptyDocument?: Resolver<\n ResolversTypes[\"PHDocument\"],\n ParentType,\n ContextType,\n RequireFields<MutationCreateEmptyDocumentArgs, \"documentType\">\n >;\n deleteDocument?: Resolver<\n ResolversTypes[\"Boolean\"],\n ParentType,\n ContextType,\n RequireFields<MutationDeleteDocumentArgs, \"identifier\">\n >;\n deleteDocuments?: Resolver<\n ResolversTypes[\"Boolean\"],\n ParentType,\n ContextType,\n RequireFields<MutationDeleteDocumentsArgs, \"identifiers\">\n >;\n moveChildren?: Resolver<\n ResolversTypes[\"MoveChildrenResult\"],\n ParentType,\n ContextType,\n RequireFields<\n MutationMoveChildrenArgs,\n | \"documentIdentifiers\"\n | \"sourceParentIdentifier\"\n | \"targetParentIdentifier\"\n >\n >;\n mutateDocument?: Resolver<\n ResolversTypes[\"PHDocument\"],\n ParentType,\n ContextType,\n RequireFields<MutationMutateDocumentArgs, \"actions\" | \"documentIdentifier\">\n >;\n mutateDocumentAsync?: Resolver<\n ResolversTypes[\"String\"],\n ParentType,\n ContextType,\n RequireFields<\n MutationMutateDocumentAsyncArgs,\n \"actions\" | \"documentIdentifier\"\n >\n >;\n pushSyncEnvelopes?: Resolver<\n ResolversTypes[\"Boolean\"],\n ParentType,\n ContextType,\n RequireFields<MutationPushSyncEnvelopesArgs, \"envelopes\">\n >;\n removeChildren?: Resolver<\n ResolversTypes[\"PHDocument\"],\n ParentType,\n ContextType,\n RequireFields<\n MutationRemoveChildrenArgs,\n \"documentIdentifiers\" | \"parentIdentifier\"\n >\n >;\n renameDocument?: Resolver<\n ResolversTypes[\"PHDocument\"],\n ParentType,\n ContextType,\n RequireFields<MutationRenameDocumentArgs, \"documentIdentifier\" | \"name\">\n >;\n touchChannel?: Resolver<\n ResolversTypes[\"TouchChannelResult\"],\n ParentType,\n ContextType,\n RequireFields<MutationTouchChannelArgs, \"input\">\n >;\n}>;\n\nexport type OperationContextResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"OperationContext\"] =\n ResolversParentTypes[\"OperationContext\"],\n> = ResolversObject<{\n branch?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n documentId?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n documentType?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n ordinal?: Resolver<ResolversTypes[\"Int\"], ParentType, ContextType>;\n scope?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n}>;\n\nexport type OperationWithContextResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"OperationWithContext\"] =\n ResolversParentTypes[\"OperationWithContext\"],\n> = ResolversObject<{\n context?: Resolver<\n ResolversTypes[\"OperationContext\"],\n ParentType,\n ContextType\n >;\n operation?: Resolver<\n ResolversTypes[\"ReactorOperation\"],\n ParentType,\n ContextType\n >;\n}>;\n\nexport type PhDocumentResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"PHDocument\"] =\n ResolversParentTypes[\"PHDocument\"],\n> = ResolversObject<{\n createdAtUtcIso?: Resolver<\n ResolversTypes[\"DateTime\"],\n ParentType,\n ContextType\n >;\n documentType?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n id?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n lastModifiedAtUtcIso?: Resolver<\n ResolversTypes[\"DateTime\"],\n ParentType,\n ContextType\n >;\n name?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n operations?: Resolver<\n Maybe<ResolversTypes[\"ReactorOperationResultPage\"]>,\n ParentType,\n ContextType,\n Partial<PhDocumentOperationsArgs>\n >;\n preferredEditor?: Resolver<\n Maybe<ResolversTypes[\"String\"]>,\n ParentType,\n ContextType\n >;\n revisionsList?: Resolver<\n ReadonlyArray<ResolversTypes[\"Revision\"]>,\n ParentType,\n ContextType\n >;\n slug?: Resolver<Maybe<ResolversTypes[\"String\"]>, ParentType, ContextType>;\n state?: Resolver<ResolversTypes[\"JSONObject\"], ParentType, ContextType>;\n}>;\n\nexport type PhDocumentResultPageResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"PHDocumentResultPage\"] =\n ResolversParentTypes[\"PHDocumentResultPage\"],\n> = ResolversObject<{\n cursor?: Resolver<Maybe<ResolversTypes[\"String\"]>, ParentType, ContextType>;\n hasNextPage?: Resolver<ResolversTypes[\"Boolean\"], ParentType, ContextType>;\n hasPreviousPage?: Resolver<\n ResolversTypes[\"Boolean\"],\n ParentType,\n ContextType\n >;\n items?: Resolver<\n ReadonlyArray<ResolversTypes[\"PHDocument\"]>,\n ParentType,\n ContextType\n >;\n totalCount?: Resolver<ResolversTypes[\"Int\"], ParentType, ContextType>;\n}>;\n\nexport type PollSyncEnvelopesResultResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"PollSyncEnvelopesResult\"] =\n ResolversParentTypes[\"PollSyncEnvelopesResult\"],\n> = ResolversObject<{\n ackOrdinal?: Resolver<ResolversTypes[\"Int\"], ParentType, ContextType>;\n deadLetters?: Resolver<\n ReadonlyArray<ResolversTypes[\"DeadLetterInfo\"]>,\n ParentType,\n ContextType\n >;\n envelopes?: Resolver<\n ReadonlyArray<ResolversTypes[\"SyncEnvelope\"]>,\n ParentType,\n ContextType\n >;\n hasMore?: Resolver<ResolversTypes[\"Boolean\"], ParentType, ContextType>;\n}>;\n\nexport type QueryResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"Query\"] =\n ResolversParentTypes[\"Query\"],\n> = ResolversObject<{\n document?: Resolver<\n Maybe<ResolversTypes[\"DocumentWithChildren\"]>,\n ParentType,\n ContextType,\n RequireFields<QueryDocumentArgs, \"identifier\">\n >;\n documentChildren?: Resolver<\n ResolversTypes[\"PHDocumentResultPage\"],\n ParentType,\n ContextType,\n RequireFields<QueryDocumentChildrenArgs, \"parentIdentifier\">\n >;\n documentModels?: Resolver<\n ResolversTypes[\"DocumentModelResultPage\"],\n ParentType,\n ContextType,\n Partial<QueryDocumentModelsArgs>\n >;\n documentOperations?: Resolver<\n ResolversTypes[\"ReactorOperationResultPage\"],\n ParentType,\n ContextType,\n RequireFields<QueryDocumentOperationsArgs, \"filter\">\n >;\n documentParents?: Resolver<\n ResolversTypes[\"PHDocumentResultPage\"],\n ParentType,\n ContextType,\n RequireFields<QueryDocumentParentsArgs, \"childIdentifier\">\n >;\n findDocuments?: Resolver<\n ResolversTypes[\"PHDocumentResultPage\"],\n ParentType,\n ContextType,\n Partial<QueryFindDocumentsArgs>\n >;\n jobStatus?: Resolver<\n Maybe<ResolversTypes[\"JobInfo\"]>,\n ParentType,\n ContextType,\n RequireFields<QueryJobStatusArgs, \"jobId\">\n >;\n pollSyncEnvelopes?: Resolver<\n ResolversTypes[\"PollSyncEnvelopesResult\"],\n ParentType,\n ContextType,\n RequireFields<\n QueryPollSyncEnvelopesArgs,\n \"channelId\" | \"outboxAck\" | \"outboxLatest\"\n >\n >;\n}>;\n\nexport type ReactorOperationResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"ReactorOperation\"] =\n ResolversParentTypes[\"ReactorOperation\"],\n> = ResolversObject<{\n action?: Resolver<ResolversTypes[\"Action\"], ParentType, ContextType>;\n error?: Resolver<Maybe<ResolversTypes[\"String\"]>, ParentType, ContextType>;\n hash?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n id?: Resolver<Maybe<ResolversTypes[\"String\"]>, ParentType, ContextType>;\n index?: Resolver<ResolversTypes[\"Int\"], ParentType, ContextType>;\n skip?: Resolver<ResolversTypes[\"Int\"], ParentType, ContextType>;\n timestampUtcMs?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n}>;\n\nexport type ReactorOperationResultPageResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"ReactorOperationResultPage\"] =\n ResolversParentTypes[\"ReactorOperationResultPage\"],\n> = ResolversObject<{\n cursor?: Resolver<Maybe<ResolversTypes[\"String\"]>, ParentType, ContextType>;\n hasNextPage?: Resolver<ResolversTypes[\"Boolean\"], ParentType, ContextType>;\n hasPreviousPage?: Resolver<\n ResolversTypes[\"Boolean\"],\n ParentType,\n ContextType\n >;\n items?: Resolver<\n ReadonlyArray<ResolversTypes[\"ReactorOperation\"]>,\n ParentType,\n ContextType\n >;\n totalCount?: Resolver<ResolversTypes[\"Int\"], ParentType, ContextType>;\n}>;\n\nexport type ReactorSignerResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"ReactorSigner\"] =\n ResolversParentTypes[\"ReactorSigner\"],\n> = ResolversObject<{\n app?: Resolver<\n Maybe<ResolversTypes[\"ReactorSignerApp\"]>,\n ParentType,\n ContextType\n >;\n signatures?: Resolver<\n ReadonlyArray<ResolversTypes[\"String\"]>,\n ParentType,\n ContextType\n >;\n user?: Resolver<\n Maybe<ResolversTypes[\"ReactorSignerUser\"]>,\n ParentType,\n ContextType\n >;\n}>;\n\nexport type ReactorSignerAppResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"ReactorSignerApp\"] =\n ResolversParentTypes[\"ReactorSignerApp\"],\n> = ResolversObject<{\n key?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n name?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n}>;\n\nexport type ReactorSignerUserResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"ReactorSignerUser\"] =\n ResolversParentTypes[\"ReactorSignerUser\"],\n> = ResolversObject<{\n address?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n chainId?: Resolver<ResolversTypes[\"Int\"], ParentType, ContextType>;\n networkId?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n}>;\n\nexport type RemoteCursorResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"RemoteCursor\"] =\n ResolversParentTypes[\"RemoteCursor\"],\n> = ResolversObject<{\n cursorOrdinal?: Resolver<ResolversTypes[\"Int\"], ParentType, ContextType>;\n lastSyncedAtUtcMs?: Resolver<\n Maybe<ResolversTypes[\"String\"]>,\n ParentType,\n ContextType\n >;\n remoteName?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n}>;\n\nexport type RevisionResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"Revision\"] =\n ResolversParentTypes[\"Revision\"],\n> = ResolversObject<{\n revision?: Resolver<ResolversTypes[\"Int\"], ParentType, ContextType>;\n scope?: Resolver<ResolversTypes[\"String\"], ParentType, ContextType>;\n}>;\n\nexport type SubscriptionResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"Subscription\"] =\n ResolversParentTypes[\"Subscription\"],\n> = ResolversObject<{\n documentChanges?: SubscriptionResolver<\n ResolversTypes[\"DocumentChangeEvent\"],\n \"documentChanges\",\n ParentType,\n ContextType,\n Partial<SubscriptionDocumentChangesArgs>\n >;\n jobChanges?: SubscriptionResolver<\n ResolversTypes[\"JobChangeEvent\"],\n \"jobChanges\",\n ParentType,\n ContextType,\n RequireFields<SubscriptionJobChangesArgs, \"jobId\">\n >;\n}>;\n\nexport type SyncEnvelopeResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"SyncEnvelope\"] =\n ResolversParentTypes[\"SyncEnvelope\"],\n> = ResolversObject<{\n channelMeta?: Resolver<\n ResolversTypes[\"ChannelMeta\"],\n ParentType,\n ContextType\n >;\n cursor?: Resolver<\n Maybe<ResolversTypes[\"RemoteCursor\"]>,\n ParentType,\n ContextType\n >;\n dependsOn?: Resolver<\n Maybe<ReadonlyArray<ResolversTypes[\"String\"]>>,\n ParentType,\n ContextType\n >;\n key?: Resolver<Maybe<ResolversTypes[\"String\"]>, ParentType, ContextType>;\n operations?: Resolver<\n Maybe<ReadonlyArray<ResolversTypes[\"OperationWithContext\"]>>,\n ParentType,\n ContextType\n >;\n type?: Resolver<ResolversTypes[\"SyncEnvelopeType\"], ParentType, ContextType>;\n}>;\n\nexport type TouchChannelResultResolvers<\n ContextType = Context,\n ParentType extends ResolversParentTypes[\"TouchChannelResult\"] =\n ResolversParentTypes[\"TouchChannelResult\"],\n> = ResolversObject<{\n ackOrdinal?: Resolver<ResolversTypes[\"Int\"], ParentType, ContextType>;\n success?: Resolver<ResolversTypes[\"Boolean\"], ParentType, ContextType>;\n}>;\n\nexport type Resolvers<ContextType = Context> = ResolversObject<{\n Action?: ActionResolvers<ContextType>;\n ActionContext?: ActionContextResolvers<ContextType>;\n Attachment?: AttachmentResolvers<ContextType>;\n ChannelMeta?: ChannelMetaResolvers<ContextType>;\n DateTime?: GraphQLScalarType;\n DeadLetterInfo?: DeadLetterInfoResolvers<ContextType>;\n DocumentChangeContext?: DocumentChangeContextResolvers<ContextType>;\n DocumentChangeEvent?: DocumentChangeEventResolvers<ContextType>;\n DocumentModelGlobalState?: DocumentModelGlobalStateResolvers<ContextType>;\n DocumentModelResultPage?: DocumentModelResultPageResolvers<ContextType>;\n DocumentWithChildren?: DocumentWithChildrenResolvers<ContextType>;\n JSONObject?: GraphQLScalarType;\n JobChangeEvent?: JobChangeEventResolvers<ContextType>;\n JobInfo?: JobInfoResolvers<ContextType>;\n MoveChildrenResult?: MoveChildrenResultResolvers<ContextType>;\n Mutation?: MutationResolvers<ContextType>;\n OperationContext?: OperationContextResolvers<ContextType>;\n OperationWithContext?: OperationWithContextResolvers<ContextType>;\n PHDocument?: PhDocumentResolvers<ContextType>;\n PHDocumentResultPage?: PhDocumentResultPageResolvers<ContextType>;\n PollSyncEnvelopesResult?: PollSyncEnvelopesResultResolvers<ContextType>;\n Query?: QueryResolvers<ContextType>;\n ReactorOperation?: ReactorOperationResolvers<ContextType>;\n ReactorOperationResultPage?: ReactorOperationResultPageResolvers<ContextType>;\n ReactorSigner?: ReactorSignerResolvers<ContextType>;\n ReactorSignerApp?: ReactorSignerAppResolvers<ContextType>;\n ReactorSignerUser?: ReactorSignerUserResolvers<ContextType>;\n RemoteCursor?: RemoteCursorResolvers<ContextType>;\n Revision?: RevisionResolvers<ContextType>;\n Subscription?: SubscriptionResolvers<ContextType>;\n SyncEnvelope?: SyncEnvelopeResolvers<ContextType>;\n TouchChannelResult?: TouchChannelResultResolvers<ContextType>;\n}>;\n\ntype Properties<T> = Required<{\n [K in keyof T]: z.ZodType<T[K]>;\n}>;\n\ntype definedNonNullAny = {};\n\nexport const isDefinedNonNullAny = (v: any): v is definedNonNullAny =>\n v !== undefined && v !== null;\n\nexport const definedNonNullAnySchema = z\n .any()\n .refine((v) => isDefinedNonNullAny(v));\n\nexport const DocumentChangeTypeSchema = z.enum(DocumentChangeType);\n\nexport const PropagationModeSchema = z.enum(PropagationMode);\n\nexport const SyncEnvelopeTypeSchema = z.enum(SyncEnvelopeType);\n\nexport function ActionContextInputSchema(): z.ZodObject<\n Properties<ActionContextInput>\n> {\n return z.object({\n signer: z.lazy(() => ReactorSignerInputSchema().nullish()),\n });\n}\n\nexport function ActionInputSchema(): z.ZodObject<Properties<ActionInput>> {\n return z.object({\n attachments: z.array(z.lazy(() => AttachmentInputSchema())).nullish(),\n context: z.lazy(() => ActionContextInputSchema().nullish()),\n id: z.string(),\n input: z.custom<NonNullable<unknown>>((v) => v != null),\n scope: z.string(),\n timestampUtcMs: z.string(),\n type: z.string(),\n });\n}\n\nexport function AttachmentInputSchema(): z.ZodObject<\n Properties<AttachmentInput>\n> {\n return z.object({\n data: z.string(),\n extension: z.string().nullish(),\n fileName: z.string().nullish(),\n hash: z.string(),\n mimeType: z.string(),\n });\n}\n\nexport function ChannelMetaInputSchema(): z.ZodObject<\n Properties<ChannelMetaInput>\n> {\n return z.object({\n id: z.string(),\n });\n}\n\nexport function DocumentOperationsFilterInputSchema(): z.ZodObject<\n Properties<DocumentOperationsFilterInput>\n> {\n return z.object({\n actionTypes: z.array(z.string()).nullish(),\n branch: z.string().nullish(),\n scopes: z.array(z.string()).nullish(),\n sinceRevision: z.number().nullish(),\n timestampFrom: z.string().nullish(),\n timestampTo: z.string().nullish(),\n });\n}\n\nexport function OperationContextInputSchema(): z.ZodObject<\n Properties<OperationContextInput>\n> {\n return z.object({\n branch: z.string(),\n documentId: z.string(),\n documentType: z.string(),\n ordinal: z.number(),\n scope: z.string(),\n });\n}\n\nexport function OperationInputSchema(): z.ZodObject<\n Properties<OperationInput>\n> {\n return z.object({\n action: z.lazy(() => ActionInputSchema()),\n error: z.string().nullish(),\n hash: z.string(),\n id: z.string().nullish(),\n index: z.number(),\n skip: z.number(),\n timestampUtcMs: z.string(),\n });\n}\n\nexport function OperationWithContextInputSchema(): z.ZodObject<\n Properties<OperationWithContextInput>\n> {\n return z.object({\n context: z.lazy(() => OperationContextInputSchema()),\n operation: z.lazy(() => OperationInputSchema()),\n });\n}\n\nexport function OperationsFilterInputSchema(): z.ZodObject<\n Properties<OperationsFilterInput>\n> {\n return z.object({\n actionTypes: z.array(z.string()).nullish(),\n branch: z.string().nullish(),\n documentId: z.string(),\n scopes: z.array(z.string()).nullish(),\n sinceRevision: z.number().nullish(),\n timestampFrom: z.string().nullish(),\n timestampTo: z.string().nullish(),\n });\n}\n\nexport function PagingInputSchema(): z.ZodObject<Properties<PagingInput>> {\n return z.object({\n cursor: z.string().nullish(),\n limit: z.number().nullish(),\n offset: z.number().nullish(),\n });\n}\n\nexport function ReactorSignerAppInputSchema(): z.ZodObject<\n Properties<ReactorSignerAppInput>\n> {\n return z.object({\n key: z.string(),\n name: z.string(),\n });\n}\n\nexport function ReactorSignerInputSchema(): z.ZodObject<\n Properties<ReactorSignerInput>\n> {\n return z.object({\n app: z.lazy(() => ReactorSignerAppInputSchema().nullish()),\n signatures: z.array(z.string()),\n user: z.lazy(() => ReactorSignerUserInputSchema().nullish()),\n });\n}\n\nexport function ReactorSignerUserInputSchema(): z.ZodObject<\n Properties<ReactorSignerUserInput>\n> {\n return z.object({\n address: z.string(),\n chainId: z.number(),\n networkId: z.string(),\n });\n}\n\nexport function RemoteCursorInputSchema(): z.ZodObject<\n Properties<RemoteCursorInput>\n> {\n return z.object({\n cursorOrdinal: z.number(),\n lastSyncedAtUtcMs: z.string().nullish(),\n remoteName: z.string(),\n });\n}\n\nexport function RemoteFilterInputSchema(): z.ZodObject<\n Properties<RemoteFilterInput>\n> {\n return z.object({\n branch: z.string(),\n documentId: z.array(z.string()),\n scope: z.array(z.string()),\n });\n}\n\nexport function SearchFilterInputSchema(): z.ZodObject<\n Properties<SearchFilterInput>\n> {\n return z.object({\n identifiers: z.array(z.string()).nullish(),\n parentId: z.string().nullish(),\n type: z.string().nullish(),\n });\n}\n\nexport function SyncEnvelopeInputSchema(): z.ZodObject<\n Properties<SyncEnvelopeInput>\n> {\n return z.object({\n channelMeta: z.lazy(() => ChannelMetaInputSchema()),\n cursor: z.lazy(() => RemoteCursorInputSchema().nullish()),\n dependsOn: z.array(z.string()).nullish(),\n key: z.string().nullish(),\n operations: z\n .array(z.lazy(() => OperationWithContextInputSchema()))\n .nullish(),\n type: SyncEnvelopeTypeSchema,\n });\n}\n\nexport function TouchChannelInputSchema(): z.ZodObject<\n Properties<TouchChannelInput>\n> {\n return z.object({\n collectionId: z.string(),\n filter: z.lazy(() => RemoteFilterInputSchema()),\n id: z.string(),\n name: z.string(),\n sinceTimestampUtcMs: z.string(),\n });\n}\n\nexport function ViewFilterInputSchema(): z.ZodObject<\n Properties<ViewFilterInput>\n> {\n return z.object({\n branch: z.string().nullish(),\n scopes: z.array(z.string()).nullish(),\n });\n}\n\nexport const PhDocumentFieldsFragmentDoc = gql`\n fragment PHDocumentFields on PHDocument {\n id\n slug\n name\n documentType\n state\n revisionsList {\n scope\n revision\n }\n createdAtUtcIso\n lastModifiedAtUtcIso\n }\n`;\nexport const GetDocumentModelsDocument = gql`\n query GetDocumentModels($namespace: String, $paging: PagingInput) {\n documentModels(namespace: $namespace, paging: $paging) {\n items {\n id\n name\n namespace\n version\n specification\n }\n totalCount\n hasNextPage\n hasPreviousPage\n cursor\n }\n }\n`;\nexport const GetDocumentDocument = gql`\n query GetDocument($identifier: String!, $view: ViewFilterInput) {\n document(identifier: $identifier, view: $view) {\n document {\n ...PHDocumentFields\n }\n childIds\n }\n }\n ${PhDocumentFieldsFragmentDoc}\n`;\nexport const GetDocumentWithOperationsDocument = gql`\n query GetDocumentWithOperations(\n $identifier: String!\n $view: ViewFilterInput\n $operationsFilter: DocumentOperationsFilterInput\n $operationsPaging: PagingInput\n ) {\n document(identifier: $identifier, view: $view) {\n document {\n ...PHDocumentFields\n operations(filter: $operationsFilter, paging: $operationsPaging) {\n items {\n index\n timestampUtcMs\n hash\n skip\n error\n id\n action {\n id\n type\n timestampUtcMs\n input\n scope\n attachments {\n data\n mimeType\n hash\n extension\n fileName\n }\n context {\n signer {\n user {\n address\n networkId\n chainId\n }\n app {\n name\n key\n }\n signatures\n }\n }\n }\n }\n totalCount\n hasNextPage\n hasPreviousPage\n cursor\n }\n }\n childIds\n }\n }\n ${PhDocumentFieldsFragmentDoc}\n`;\nexport const GetDocumentChildrenDocument = gql`\n query GetDocumentChildren(\n $parentIdentifier: String!\n $view: ViewFilterInput\n $paging: PagingInput\n ) {\n documentChildren(\n parentIdentifier: $parentIdentifier\n view: $view\n paging: $paging\n ) {\n items {\n ...PHDocumentFields\n }\n totalCount\n hasNextPage\n hasPreviousPage\n cursor\n }\n }\n ${PhDocumentFieldsFragmentDoc}\n`;\nexport const GetDocumentParentsDocument = gql`\n query GetDocumentParents(\n $childIdentifier: String!\n $view: ViewFilterInput\n $paging: PagingInput\n ) {\n documentParents(\n childIdentifier: $childIdentifier\n view: $view\n paging: $paging\n ) {\n items {\n ...PHDocumentFields\n }\n totalCount\n hasNextPage\n hasPreviousPage\n cursor\n }\n }\n ${PhDocumentFieldsFragmentDoc}\n`;\nexport const FindDocumentsDocument = gql`\n query FindDocuments(\n $search: SearchFilterInput\n $view: ViewFilterInput\n $paging: PagingInput\n ) {\n findDocuments(search: $search, view: $view, paging: $paging) {\n items {\n ...PHDocumentFields\n }\n totalCount\n hasNextPage\n hasPreviousPage\n cursor\n }\n }\n ${PhDocumentFieldsFragmentDoc}\n`;\nexport const GetDocumentOperationsDocument = gql`\n query GetDocumentOperations(\n $filter: OperationsFilterInput!\n $paging: PagingInput\n ) {\n documentOperations(filter: $filter, paging: $paging) {\n items {\n index\n timestampUtcMs\n hash\n skip\n error\n id\n action {\n id\n type\n timestampUtcMs\n input\n scope\n attachments {\n data\n mimeType\n hash\n extension\n fileName\n }\n context {\n signer {\n user {\n address\n networkId\n chainId\n }\n app {\n name\n key\n }\n signatures\n }\n }\n }\n }\n totalCount\n hasNextPage\n hasPreviousPage\n cursor\n }\n }\n`;\nexport const GetJobStatusDocument = gql`\n query GetJobStatus($jobId: String!) {\n jobStatus(jobId: $jobId) {\n id\n status\n result\n error\n createdAt\n completedAt\n }\n }\n`;\nexport const CreateDocumentDocument = gql`\n mutation CreateDocument($document: JSONObject!, $parentIdentifier: String) {\n createDocument(document: $document, parentIdentifier: $parentIdentifier) {\n ...PHDocumentFields\n }\n }\n ${PhDocumentFieldsFragmentDoc}\n`;\nexport const CreateEmptyDocumentDocument = gql`\n mutation CreateEmptyDocument(\n $documentType: String!\n $parentIdentifier: String\n ) {\n createEmptyDocument(\n documentType: $documentType\n parentIdentifier: $parentIdentifier\n ) {\n ...PHDocumentFields\n }\n }\n ${PhDocumentFieldsFragmentDoc}\n`;\nexport const MutateDocumentDocument = gql`\n mutation MutateDocument(\n $documentIdentifier: String!\n $actions: [JSONObject!]!\n $view: ViewFilterInput\n ) {\n mutateDocument(\n documentIdentifier: $documentIdentifier\n actions: $actions\n view: $view\n ) {\n ...PHDocumentFields\n }\n }\n ${PhDocumentFieldsFragmentDoc}\n`;\nexport const MutateDocumentAsyncDocument = gql`\n mutation MutateDocumentAsync(\n $documentIdentifier: String!\n $actions: [JSONObject!]!\n $view: ViewFilterInput\n ) {\n mutateDocumentAsync(\n documentIdentifier: $documentIdentifier\n actions: $actions\n view: $view\n )\n }\n`;\nexport const RenameDocumentDocument = gql`\n mutation RenameDocument(\n $documentIdentifier: String!\n $name: String!\n $branch: String\n ) {\n renameDocument(\n documentIdentifier: $documentIdentifier\n name: $name\n branch: $branch\n ) {\n ...PHDocumentFields\n }\n }\n ${PhDocumentFieldsFragmentDoc}\n`;\nexport const AddChildrenDocument = gql`\n mutation AddChildren(\n $parentIdentifier: String!\n $documentIdentifiers: [String!]!\n $branch: String\n ) {\n addChildren(\n parentIdentifier: $parentIdentifier\n documentIdentifiers: $documentIdentifiers\n branch: $branch\n ) {\n ...PHDocumentFields\n }\n }\n ${PhDocumentFieldsFragmentDoc}\n`;\nexport const RemoveChildrenDocument = gql`\n mutation RemoveChildren(\n $parentIdentifier: String!\n $documentIdentifiers: [String!]!\n $branch: String\n ) {\n removeChildren(\n parentIdentifier: $parentIdentifier\n documentIdentifiers: $documentIdentifiers\n branch: $branch\n ) {\n ...PHDocumentFields\n }\n }\n ${PhDocumentFieldsFragmentDoc}\n`;\nexport const MoveChildrenDocument = gql`\n mutation MoveChildren(\n $sourceParentIdentifier: String!\n $targetParentIdentifier: String!\n $documentIdentifiers: [String!]!\n $branch: String\n ) {\n moveChildren(\n sourceParentIdentifier: $sourceParentIdentifier\n targetParentIdentifier: $targetParentIdentifier\n documentIdentifiers: $documentIdentifiers\n branch: $branch\n ) {\n source {\n ...PHDocumentFields\n }\n target {\n ...PHDocumentFields\n }\n }\n }\n ${PhDocumentFieldsFragmentDoc}\n`;\nexport const DeleteDocumentDocument = gql`\n mutation DeleteDocument($identifier: String!, $propagate: PropagationMode) {\n deleteDocument(identifier: $identifier, propagate: $propagate)\n }\n`;\nexport const DeleteDocumentsDocument = gql`\n mutation DeleteDocuments(\n $identifiers: [String!]!\n $propagate: PropagationMode\n ) {\n deleteDocuments(identifiers: $identifiers, propagate: $propagate)\n }\n`;\nexport const DocumentChangesDocument = gql`\n subscription DocumentChanges(\n $search: SearchFilterInput\n $view: ViewFilterInput\n ) {\n documentChanges(search: $search, view: $view) {\n type\n documents {\n ...PHDocumentFields\n }\n context {\n parentId\n childId\n }\n }\n }\n ${PhDocumentFieldsFragmentDoc}\n`;\nexport const JobChangesDocument = gql`\n subscription JobChanges($jobId: String!) {\n jobChanges(jobId: $jobId) {\n jobId\n status\n result\n error\n }\n }\n`;\nexport const PollSyncEnvelopesDocument = gql`\n query PollSyncEnvelopes(\n $channelId: String!\n $outboxAck: Int!\n $outboxLatest: Int!\n ) {\n pollSyncEnvelopes(\n channelId: $channelId\n outboxAck: $outboxAck\n outboxLatest: $outboxLatest\n ) {\n envelopes {\n type\n channelMeta {\n id\n }\n operations {\n operation {\n index\n timestampUtcMs\n hash\n skip\n error\n id\n action {\n id\n type\n timestampUtcMs\n input\n scope\n attachments {\n data\n mimeType\n hash\n extension\n fileName\n }\n context {\n signer {\n user {\n address\n networkId\n chainId\n }\n app {\n name\n key\n }\n signatures\n }\n }\n }\n }\n context {\n documentId\n documentType\n scope\n branch\n }\n }\n cursor {\n remoteName\n cursorOrdinal\n lastSyncedAtUtcMs\n }\n key\n dependsOn\n }\n ackOrdinal\n deadLetters {\n documentId\n error\n }\n hasMore\n }\n }\n`;\nexport const TouchChannelDocument = gql`\n mutation TouchChannel($input: TouchChannelInput!) {\n touchChannel(input: $input) {\n success\n ackOrdinal\n }\n }\n`;\nexport const PushSyncEnvelopesDocument = gql`\n mutation PushSyncEnvelopes($envelopes: [SyncEnvelopeInput!]!) {\n pushSyncEnvelopes(envelopes: $envelopes)\n }\n`;\nexport type Requester<C = {}> = <R, V>(\n doc: DocumentNode,\n vars?: V,\n options?: C,\n) => Promise<R> | AsyncIterable<R>;\nexport function getSdk<C>(requester: Requester<C>) {\n return {\n GetDocumentModels(\n variables?: GetDocumentModelsQueryVariables,\n options?: C,\n ): Promise<GetDocumentModelsQuery> {\n return requester<GetDocumentModelsQuery, GetDocumentModelsQueryVariables>(\n GetDocumentModelsDocument,\n variables,\n options,\n ) as Promise<GetDocumentModelsQuery>;\n },\n GetDocument(\n variables: GetDocumentQueryVariables,\n options?: C,\n ): Promise<GetDocumentQuery> {\n return requester<GetDocumentQuery, GetDocumentQueryVariables>(\n GetDocumentDocument,\n variables,\n options,\n ) as Promise<GetDocumentQuery>;\n },\n GetDocumentWithOperations(\n variables: GetDocumentWithOperationsQueryVariables,\n options?: C,\n ): Promise<GetDocumentWithOperationsQuery> {\n return requester<\n GetDocumentWithOperationsQuery,\n GetDocumentWithOperationsQueryVariables\n >(\n GetDocumentWithOperationsDocument,\n variables,\n options,\n ) as Promise<GetDocumentWithOperationsQuery>;\n },\n GetDocumentChildren(\n variables: GetDocumentChildrenQueryVariables,\n options?: C,\n ): Promise<GetDocumentChildrenQuery> {\n return requester<\n GetDocumentChildrenQuery,\n GetDocumentChildrenQueryVariables\n >(\n GetDocumentChildrenDocument,\n variables,\n options,\n ) as Promise<GetDocumentChildrenQuery>;\n },\n GetDocumentParents(\n variables: GetDocumentParentsQueryVariables,\n options?: C,\n ): Promise<GetDocumentParentsQuery> {\n return requester<\n GetDocumentParentsQuery,\n GetDocumentParentsQueryVariables\n >(\n GetDocumentParentsDocument,\n variables,\n options,\n ) as Promise<GetDocumentParentsQuery>;\n },\n FindDocuments(\n variables?: FindDocumentsQueryVariables,\n options?: C,\n ): Promise<FindDocumentsQuery> {\n return requester<FindDocumentsQuery, FindDocumentsQueryVariables>(\n FindDocumentsDocument,\n variables,\n options,\n ) as Promise<FindDocumentsQuery>;\n },\n GetDocumentOperations(\n variables: GetDocumentOperationsQueryVariables,\n options?: C,\n ): Promise<GetDocumentOperationsQuery> {\n return requester<\n GetDocumentOperationsQuery,\n GetDocumentOperationsQueryVariables\n >(\n GetDocumentOperationsDocument,\n variables,\n options,\n ) as Promise<GetDocumentOperationsQuery>;\n },\n GetJobStatus(\n variables: GetJobStatusQueryVariables,\n options?: C,\n ): Promise<GetJobStatusQuery> {\n return requester<GetJobStatusQuery, GetJobStatusQueryVariables>(\n GetJobStatusDocument,\n variables,\n options,\n ) as Promise<GetJobStatusQuery>;\n },\n CreateDocument(\n variables: CreateDocumentMutationVariables,\n options?: C,\n ): Promise<CreateDocumentMutation> {\n return requester<CreateDocumentMutation, CreateDocumentMutationVariables>(\n CreateDocumentDocument,\n variables,\n options,\n ) as Promise<CreateDocumentMutation>;\n },\n CreateEmptyDocument(\n variables: CreateEmptyDocumentMutationVariables,\n options?: C,\n ): Promise<CreateEmptyDocumentMutation> {\n return requester<\n CreateEmptyDocumentMutation,\n CreateEmptyDocumentMutationVariables\n >(\n CreateEmptyDocumentDocument,\n variables,\n options,\n ) as Promise<CreateEmptyDocumentMutation>;\n },\n MutateDocument(\n variables: MutateDocumentMutationVariables,\n options?: C,\n ): Promise<MutateDocumentMutation> {\n return requester<MutateDocumentMutation, MutateDocumentMutationVariables>(\n MutateDocumentDocument,\n variables,\n options,\n ) as Promise<MutateDocumentMutation>;\n },\n MutateDocumentAsync(\n variables: MutateDocumentAsyncMutationVariables,\n options?: C,\n ): Promise<MutateDocumentAsyncMutation> {\n return requester<\n MutateDocumentAsyncMutation,\n MutateDocumentAsyncMutationVariables\n >(\n MutateDocumentAsyncDocument,\n variables,\n options,\n ) as Promise<MutateDocumentAsyncMutation>;\n },\n RenameDocument(\n variables: RenameDocumentMutationVariables,\n options?: C,\n ): Promise<RenameDocumentMutation> {\n return requester<RenameDocumentMutation, RenameDocumentMutationVariables>(\n RenameDocumentDocument,\n variables,\n options,\n ) as Promise<RenameDocumentMutation>;\n },\n AddChildren(\n variables: AddChildrenMutationVariables,\n options?: C,\n ): Promise<AddChildrenMutation> {\n return requester<AddChildrenMutation, AddChildrenMutationVariables>(\n AddChildrenDocument,\n variables,\n options,\n ) as Promise<AddChildrenMutation>;\n },\n RemoveChildren(\n variables: RemoveChildrenMutationVariables,\n options?: C,\n ): Promise<RemoveChildrenMutation> {\n return requester<RemoveChildrenMutation, RemoveChildrenMutationVariables>(\n RemoveChildrenDocument,\n variables,\n options,\n ) as Promise<RemoveChildrenMutation>;\n },\n MoveChildren(\n variables: MoveChildrenMutationVariables,\n options?: C,\n ): Promise<MoveChildrenMutation> {\n return requester<MoveChildrenMutation, MoveChildrenMutationVariables>(\n MoveChildrenDocument,\n variables,\n options,\n ) as Promise<MoveChildrenMutation>;\n },\n DeleteDocument(\n variables: DeleteDocumentMutationVariables,\n options?: C,\n ): Promise<DeleteDocumentMutation> {\n return requester<DeleteDocumentMutation, DeleteDocumentMutationVariables>(\n DeleteDocumentDocument,\n variables,\n options,\n ) as Promise<DeleteDocumentMutation>;\n },\n DeleteDocuments(\n variables: DeleteDocumentsMutationVariables,\n options?: C,\n ): Promise<DeleteDocumentsMutation> {\n return requester<\n DeleteDocumentsMutation,\n DeleteDocumentsMutationVariables\n >(\n DeleteDocumentsDocument,\n variables,\n options,\n ) as Promise<DeleteDocumentsMutation>;\n },\n DocumentChanges(\n variables?: DocumentChangesSubscriptionVariables,\n options?: C,\n ): AsyncIterable<DocumentChangesSubscription> {\n return requester<\n DocumentChangesSubscription,\n DocumentChangesSubscriptionVariables\n >(\n DocumentChangesDocument,\n variables,\n options,\n ) as AsyncIterable<DocumentChangesSubscription>;\n },\n JobChanges(\n variables: JobChangesSubscriptionVariables,\n options?: C,\n ): AsyncIterable<JobChangesSubscription> {\n return requester<JobChangesSubscription, JobChangesSubscriptionVariables>(\n JobChangesDocument,\n variables,\n options,\n ) as AsyncIterable<JobChangesSubscription>;\n },\n PollSyncEnvelopes(\n variables: PollSyncEnvelopesQueryVariables,\n options?: C,\n ): Promise<PollSyncEnvelopesQuery> {\n return requester<PollSyncEnvelopesQuery, PollSyncEnvelopesQueryVariables>(\n PollSyncEnvelopesDocument,\n variables,\n options,\n ) as Promise<PollSyncEnvelopesQuery>;\n },\n TouchChannel(\n variables: TouchChannelMutationVariables,\n options?: C,\n ): Promise<TouchChannelMutation> {\n return requester<TouchChannelMutation, TouchChannelMutationVariables>(\n TouchChannelDocument,\n variables,\n options,\n ) as Promise<TouchChannelMutation>;\n },\n PushSyncEnvelopes(\n variables: PushSyncEnvelopesMutationVariables,\n options?: C,\n ): Promise<PushSyncEnvelopesMutation> {\n return requester<\n PushSyncEnvelopesMutation,\n PushSyncEnvelopesMutationVariables\n >(\n PushSyncEnvelopesDocument,\n variables,\n options,\n ) as Promise<PushSyncEnvelopesMutation>;\n },\n };\n}\nexport type Sdk = ReturnType<typeof getSdk>;\n","import {\n type JobInfo as ClientJobInfo,\n type DocumentChangeEvent,\n type IReactorClient,\n type PagedResults,\n PropagationMode,\n} from \"@powerhousedao/reactor\";\nimport { camelCase } from \"change-case\";\nimport type {\n Action,\n DocumentModelModule,\n DocumentModelPHState,\n Operation,\n PHDocument,\n} from \"@powerhousedao/shared/document-model\";\nimport { GraphQLError } from \"graphql\";\nimport {\n type DocumentModelResultPage,\n type DocumentChangeEvent as GqlDocumentChangeEvent,\n type DocumentModelGlobalState as GqlDocumentModelGlobalState,\n type JobInfo as GqlJobInfo,\n type PhDocument,\n type PhDocumentResultPage,\n PropagationMode as GqlPropagationMode,\n type ReactorOperation,\n type ReactorOperationResultPage,\n} from \"./gen/graphql.js\";\n\n/**\n * Converts a PagedResults from ReactorClient to the GraphQL DocumentModelResultPage format\n */\nexport function toDocumentModelResultPage(\n result: PagedResults<DocumentModelModule>,\n): DocumentModelResultPage {\n const models = result.results.map((module) => module.documentModel);\n return {\n cursor: result.nextCursor ?? null,\n hasNextPage: !!result.nextCursor,\n hasPreviousPage: !!result.options.cursor,\n items: models.map(toGqlDocumentModelState),\n totalCount: result.results.length,\n };\n}\n\n/**\n * Gets the namespace from a DocumentModelGlobalState\n */\nfunction getNamespace(model: DocumentModelPHState): string {\n return model.global.name.split(\"/\")[0];\n}\n\n/**\n * Converts a DocumentModelGlobalState from ReactorClient to GraphQL format\n */\nfunction toGqlDocumentModelState(\n model: DocumentModelPHState,\n): GqlDocumentModelGlobalState {\n const global = model.global;\n const specification =\n global.specifications.length > 0 ? global.specifications[0] : {};\n const namespace = getNamespace(model);\n\n return {\n id: global.id,\n name: global.name,\n namespace,\n specification,\n version: null,\n };\n}\n\n/**\n * Converts a PagedResults of PHDocument to GraphQL PhDocumentResultPage format\n */\nexport function toPhDocumentResultPage(\n result: PagedResults<PHDocument>,\n): PhDocumentResultPage {\n return {\n cursor: result.nextCursor ?? null,\n hasNextPage: !!result.nextCursor,\n hasPreviousPage: !!result.options.cursor,\n items: result.results.map(toGqlPhDocument),\n totalCount: result.totalCount ?? result.results.length,\n };\n}\n\n/**\n * Converts a PHDocument from ReactorClient to GraphQL PhDocument format\n */\nexport function toGqlPhDocument(doc: PHDocument): PhDocument {\n const revisionsList = Object.entries(doc.header.revision).map(\n ([scope, revision]) => ({\n scope,\n revision,\n }),\n );\n\n return {\n id: doc.header.id,\n name: doc.header.name,\n documentType: doc.header.documentType,\n slug: doc.header.slug,\n preferredEditor: doc.header.meta?.preferredEditor ?? null,\n createdAtUtcIso: doc.header.createdAtUtcIso,\n lastModifiedAtUtcIso: doc.header.lastModifiedAtUtcIso,\n revisionsList,\n state: doc.state,\n };\n}\n\n/**\n * Converts JobInfo from ReactorClient to GraphQL format\n */\nexport function toGqlJobInfo(job: ClientJobInfo): GqlJobInfo {\n return {\n id: job.id,\n status: job.status,\n createdAt: job.createdAtUtcIso,\n completedAt: job.completedAtUtcIso ?? null,\n error: job.error?.message ?? null,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n result: job.result ?? null,\n };\n}\n\n/**\n * Handles nullable/undefined conversion for GraphQL InputMaybe types\n */\nexport function fromInputMaybe<T>(value: T | null | undefined): T | undefined {\n return value === null ? undefined : value;\n}\n\n/**\n * Maps GraphQL PropagationMode enum to reactor PropagationMode enum.\n * The GQL enum uses uppercase values (\"CASCADE\") while the reactor\n * enum uses lowercase values (\"cascade\").\n */\nexport function toReactorPropagationMode(\n gqlMode: GqlPropagationMode | null | undefined,\n): PropagationMode | undefined {\n if (gqlMode == null) {\n return undefined;\n }\n switch (gqlMode) {\n case GqlPropagationMode.Cascade:\n return PropagationMode.Cascade;\n case GqlPropagationMode.Orphan:\n return PropagationMode.None;\n }\n}\n\n/**\n * Converts readonly arrays to mutable arrays for ReactorClient\n */\nexport function toMutableArray<T>(\n arr: readonly T[] | undefined,\n): T[] | undefined {\n return arr ? [...arr] : undefined;\n}\n\n/**\n * Validates that a JSONObject represents a valid Action structure\n */\nfunction validateActionStructure(obj: unknown): obj is Action {\n if (!obj || typeof obj !== \"object\") {\n return false;\n }\n\n const action = obj as Record<string, unknown>;\n\n // Required fields\n if (typeof action.type !== \"string\" || !action.type) {\n return false;\n }\n\n if (typeof action.scope !== \"string\" || !action.scope) {\n return false;\n }\n\n // input can be anything (unknown)\n if (!(\"input\" in action)) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Converts a JSONObject to an Action, validating basic structure\n */\nexport function jsonObjectToAction(obj: unknown): Action {\n if (!validateActionStructure(obj)) {\n throw new GraphQLError(\n \"Invalid action structure. Actions must have: type (string), scope (string), and input (any)\",\n );\n }\n\n return obj as Action;\n}\n\n/**\n * Validates an action against its document model\n * Based on validateDocumentModelAction from reactor-mcp\n */\nexport function validateDocumentModelAction(\n documentModelModule: DocumentModelModule,\n action: Action,\n): { isValid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n const globalState = documentModelModule.documentModel.global;\n\n // Get the latest specification\n if (!globalState.specifications || globalState.specifications.length === 0) {\n errors.push(\"Document model has no specifications\");\n return { isValid: false, errors };\n }\n\n const latestSpec =\n globalState.specifications[globalState.specifications.length - 1];\n\n // Search through modules to find the operation that matches the action type (in SCREAMING_SNAKE_CASE)\n let operation: (Operation & { scope: string }) | null = null;\n\n for (const module of latestSpec.modules) {\n const unsafeOperationOrActionOrSomething = module.operations.find(\n (op) => op.name === action.type,\n ) as unknown as Operation & { scope: string };\n if (unsafeOperationOrActionOrSomething) {\n operation = unsafeOperationOrActionOrSomething;\n break;\n }\n }\n\n if (!operation) {\n errors.push(\n `Operation \"${action.type}\" is not defined in any module of the document model`,\n );\n return { isValid: false, errors };\n }\n\n // Convert action type from SCREAMING_SNAKE_CASE to camelCase to match action creators\n const camelCaseActionType = camelCase(action.type);\n\n // Check if action creator exists in documentModelModule.actions\n const actionCreator = documentModelModule.actions[camelCaseActionType];\n\n if (!actionCreator) {\n errors.push(\n `Action creator \"${camelCaseActionType}\" for action type \"${action.type}\" is not defined in document model module actions`,\n );\n return { isValid: false, errors };\n }\n\n // Validate the operation using the action creator\n let inputError: Error | null = null;\n try {\n actionCreator(action.input);\n } catch (e) {\n inputError = e instanceof Error ? e : new Error(JSON.stringify(e));\n }\n\n if (inputError) {\n errors.push(`Input validation error: ${inputError.message}`);\n }\n\n // Validate scope if operation defines one\n if (operation.scope && action.scope !== operation.scope) {\n errors.push(\n `Action scope \"${action.scope}\" does not match operation scope \"${operation.scope}\"`,\n );\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * Validates a list of actions by converting them from JSON and checking structure\n */\nexport function validateActions(actions: readonly unknown[]): Action[] {\n const convertedActions: Action[] = [];\n for (let i = 0; i < actions.length; i++) {\n try {\n convertedActions.push(jsonObjectToAction(actions[i]));\n } catch (error) {\n throw new GraphQLError(\n `Action at index ${i}: ${error instanceof Error ? error.message : \"Invalid action structure\"}`,\n );\n }\n }\n return convertedActions;\n}\n\n/**\n * Transforms an operation to serialize signatures from tuples to strings for GraphQL compatibility.\n */\nexport function serializeOperationForGraphQL(\n operation: Operation,\n): ReactorOperation {\n const signer = operation.action.context?.signer;\n if (!signer?.signatures) {\n return operation as unknown as ReactorOperation;\n }\n\n return {\n ...operation,\n action: {\n ...operation.action,\n context: {\n ...operation.action.context,\n signer: {\n ...signer,\n signatures: signer.signatures.map((sig) =>\n Array.isArray(sig) ? sig.join(\", \") : sig,\n ),\n },\n },\n },\n } as unknown as ReactorOperation;\n}\n\n/**\n * Converts a PagedResults of Operation to GraphQL ReactorOperationResultPage format\n */\nexport function toOperationResultPage(\n result: PagedResults<Operation>,\n): ReactorOperationResultPage {\n return {\n cursor: result.nextCursor ?? null,\n hasNextPage: !!result.nextCursor,\n hasPreviousPage: !!result.options.cursor && result.options.cursor !== \"0\",\n items: result.results.map(serializeOperationForGraphQL),\n totalCount: result.results.length,\n };\n}\n\nexport function toGqlDocumentChangeEvent(\n event: DocumentChangeEvent,\n): GqlDocumentChangeEvent {\n const typeMap: Record<string, string> = {\n created: \"CREATED\",\n deleted: \"DELETED\",\n updated: \"UPDATED\",\n parent_added: \"PARENT_ADDED\",\n parent_removed: \"PARENT_REMOVED\",\n child_added: \"CHILD_ADDED\",\n child_removed: \"CHILD_REMOVED\",\n };\n\n const mappedType = typeMap[event.type];\n if (!mappedType) {\n throw new GraphQLError(`Unknown document change type: ${event.type}`);\n }\n\n return {\n type: mappedType as GqlDocumentChangeEvent[\"type\"],\n documents: event.documents.map(toGqlPhDocument),\n context: event.context\n ? {\n parentId: event.context.parentId ?? null,\n childId: event.context.childId ?? null,\n }\n : null,\n };\n}\n\nexport function matchesSearchFilter(\n event: DocumentChangeEvent,\n search: { type?: string | null; parentId?: string | null },\n): boolean {\n if (search.type) {\n const matchesType = event.documents.some(\n (doc) => doc.header.documentType === search.type,\n );\n if (!matchesType) {\n return false;\n }\n }\n\n if (search.parentId) {\n if (\n !event.context?.parentId ||\n event.context.parentId !== search.parentId\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function matchesJobFilter(\n payload: { jobId: string },\n args: { jobId: string },\n): boolean {\n return payload.jobId === args.jobId;\n}\n","import {\n consolidateSyncOperations,\n envelopesToSyncOperations,\n sortEnvelopesByFirstOperationTimestamp,\n trimMailboxFromAckOrdinal,\n type IReactorClient,\n type ISyncManager,\n type JobInfo,\n type OperationFilter,\n type PagedResults,\n type PagingOptions,\n type RemoteFilter,\n type SearchFilter,\n type SyncOperation,\n type ViewFilter,\n} from \"@powerhousedao/reactor\";\nimport type {\n DocumentModelModule,\n Operation,\n PHDocument,\n} from \"@powerhousedao/shared/document-model\";\nimport { GraphQLError } from \"graphql\";\n\nconst DRIVE_DOCUMENT_TYPE = \"powerhouse/document-drive\";\nconst POLL_SYNC_ENVELOPES_MAX_LIMIT = 100;\nimport type { GetParentIdsFn } from \"../../services/document-permission.service.js\";\nimport {\n fromInputMaybe,\n serializeOperationForGraphQL,\n toDocumentModelResultPage,\n toGqlJobInfo,\n toGqlPhDocument,\n toMutableArray,\n toOperationResultPage,\n toPhDocumentResultPage,\n toReactorPropagationMode,\n validateActions,\n} from \"./adapters.js\";\nimport type {\n DocumentModelResultPage,\n JobInfo as GqlJobInfo,\n PropagationMode as GqlPropagationMode,\n PhDocumentResultPage,\n ReactorOperationResultPage,\n} from \"./gen/graphql.js\";\n\nexport async function documentModels(\n reactorClient: IReactorClient,\n args: {\n namespace?: string | null;\n paging?: {\n cursor?: string | null;\n limit?: number | null;\n } | null;\n },\n): Promise<DocumentModelResultPage> {\n const namespace = fromInputMaybe(args.namespace);\n\n let paging: PagingOptions | undefined;\n if (args.paging) {\n const cursor = fromInputMaybe(args.paging.cursor);\n const limit = fromInputMaybe(args.paging.limit);\n if (cursor || limit) {\n paging = {\n cursor: cursor || \"\",\n limit: limit || 10,\n };\n }\n }\n\n let result: PagedResults<DocumentModelModule>;\n try {\n result = await reactorClient.getDocumentModelModules(namespace, paging);\n } catch (error) {\n throw new GraphQLError(\n `Failed to fetch document models: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n try {\n return toDocumentModelResultPage(result);\n } catch (error) {\n throw new GraphQLError(\n `Failed to convert document models to GraphQL: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\nexport async function document(\n reactorClient: IReactorClient,\n args: {\n identifier: string;\n view?: {\n branch?: string | null;\n scopes?: readonly string[] | null;\n } | null;\n },\n): Promise<{\n document: ReturnType<typeof toGqlPhDocument>;\n childIds: string[];\n}> {\n let view: ViewFilter | undefined;\n if (args.view) {\n view = {\n branch: fromInputMaybe(args.view.branch),\n scopes: toMutableArray(fromInputMaybe(args.view.scopes)),\n };\n }\n\n let result: PHDocument;\n try {\n result = await reactorClient.get(args.identifier, view);\n } catch (error) {\n throw new GraphQLError(\n `Failed to fetch document: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n let children: PagedResults<PHDocument>;\n try {\n children = await reactorClient.getChildren(args.identifier, view);\n } catch (error) {\n throw new GraphQLError(\n `Failed to fetch children: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n try {\n return {\n document: toGqlPhDocument(result),\n childIds: children.results.map((child) => child.header.id),\n };\n } catch (error) {\n throw new GraphQLError(\n `Failed to convert document to GraphQL: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\nexport async function documentChildren(\n reactorClient: IReactorClient,\n args: {\n parentIdentifier: string;\n view?: {\n branch?: string | null;\n scopes?: readonly string[] | null;\n } | null;\n paging?: {\n cursor?: string | null;\n limit?: number | null;\n } | null;\n },\n): Promise<PhDocumentResultPage> {\n let view: ViewFilter | undefined;\n if (args.view) {\n view = {\n branch: fromInputMaybe(args.view.branch),\n scopes: toMutableArray(fromInputMaybe(args.view.scopes)),\n };\n }\n\n let paging: PagingOptions | undefined;\n if (args.paging) {\n const cursor = fromInputMaybe(args.paging.cursor);\n const limit = fromInputMaybe(args.paging.limit);\n if (cursor || limit) {\n paging = {\n cursor: cursor || \"\",\n limit: limit || 10,\n };\n }\n }\n\n let result: PagedResults<PHDocument>;\n try {\n result = await reactorClient.getChildren(\n args.parentIdentifier,\n view,\n paging,\n );\n } catch (error) {\n throw new GraphQLError(\n `Failed to fetch document children: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n try {\n return toPhDocumentResultPage(result);\n } catch (error) {\n throw new GraphQLError(\n `Failed to convert document children to GraphQL: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\nexport async function documentParents(\n reactorClient: IReactorClient,\n args: {\n childIdentifier: string;\n view?: {\n branch?: string | null;\n scopes?: readonly string[] | null;\n } | null;\n paging?: {\n cursor?: string | null;\n limit?: number | null;\n } | null;\n },\n): Promise<PhDocumentResultPage> {\n let view: ViewFilter | undefined;\n if (args.view) {\n view = {\n branch: fromInputMaybe(args.view.branch),\n scopes: toMutableArray(fromInputMaybe(args.view.scopes)),\n };\n }\n\n let paging: PagingOptions | undefined;\n if (args.paging) {\n const cursor = fromInputMaybe(args.paging.cursor);\n const limit = fromInputMaybe(args.paging.limit);\n if (cursor || limit) {\n paging = {\n cursor: cursor || \"\",\n limit: limit || 10,\n };\n }\n }\n\n let result: PagedResults<PHDocument>;\n try {\n result = await reactorClient.getParents(args.childIdentifier, view, paging);\n } catch (error) {\n throw new GraphQLError(\n `Failed to fetch document parents: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n try {\n return toPhDocumentResultPage(result);\n } catch (error) {\n throw new GraphQLError(\n `Failed to convert document parents to GraphQL: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\nexport async function findDocuments(\n reactorClient: IReactorClient,\n args: {\n search: {\n type?: string | null;\n parentId?: string | null;\n };\n view?: {\n branch?: string | null;\n scopes?: readonly string[] | null;\n } | null;\n paging?: {\n cursor?: string | null;\n limit?: number | null;\n } | null;\n },\n): Promise<PhDocumentResultPage> {\n let view: ViewFilter | undefined;\n if (args.view) {\n view = {\n branch: fromInputMaybe(args.view.branch),\n scopes: toMutableArray(fromInputMaybe(args.view.scopes)),\n };\n }\n\n let paging: PagingOptions | undefined;\n if (args.paging) {\n const cursor = fromInputMaybe(args.paging.cursor);\n const limit = fromInputMaybe(args.paging.limit);\n if (cursor || limit) {\n paging = {\n cursor: cursor || \"\",\n limit: limit || 10,\n };\n }\n }\n\n const search: SearchFilter = {\n type: fromInputMaybe(args.search.type),\n parentId: fromInputMaybe(args.search.parentId),\n };\n\n let result: PagedResults<PHDocument>;\n try {\n result = await reactorClient.find(search, view, paging);\n } catch (error) {\n throw new GraphQLError(\n `Failed to find documents: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n try {\n return toPhDocumentResultPage(result);\n } catch (error) {\n throw new GraphQLError(\n `Failed to convert documents to GraphQL: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\nexport async function jobStatus(\n reactorClient: IReactorClient,\n args: {\n jobId: string;\n },\n): Promise<GqlJobInfo> {\n let result: JobInfo;\n try {\n result = await reactorClient.getJobStatus(args.jobId);\n } catch (error) {\n throw new GraphQLError(\n `Failed to fetch job status: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n try {\n return toGqlJobInfo(result);\n } catch (error) {\n throw new GraphQLError(\n `Failed to convert job status to GraphQL: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\nexport async function documentOperations(\n reactorClient: IReactorClient,\n args: {\n filter: {\n documentId: string;\n branch?: string | null;\n scopes?: readonly string[] | null;\n actionTypes?: readonly string[] | null;\n sinceRevision?: number | null;\n timestampFrom?: string | null;\n timestampTo?: string | null;\n };\n paging?: {\n cursor?: string | null;\n limit?: number | null;\n } | null;\n },\n): Promise<ReactorOperationResultPage> {\n let view: ViewFilter | undefined;\n const branch = fromInputMaybe(args.filter.branch);\n const scopes = toMutableArray(fromInputMaybe(args.filter.scopes));\n if (branch || scopes) {\n view = { branch, scopes };\n }\n\n const actionTypes = toMutableArray(fromInputMaybe(args.filter.actionTypes));\n const sinceRevision = fromInputMaybe(args.filter.sinceRevision);\n const timestampFrom = fromInputMaybe(args.filter.timestampFrom);\n const timestampTo = fromInputMaybe(args.filter.timestampTo);\n\n let operationFilter: OperationFilter | undefined;\n if (\n (actionTypes && actionTypes.length > 0) ||\n sinceRevision !== undefined ||\n timestampFrom ||\n timestampTo\n ) {\n operationFilter = {\n actionTypes:\n actionTypes && actionTypes.length > 0 ? actionTypes : undefined,\n sinceRevision,\n timestampFrom: timestampFrom || undefined,\n timestampTo: timestampTo || undefined,\n };\n }\n\n let paging: PagingOptions | undefined;\n if (args.paging) {\n const cursor = fromInputMaybe(args.paging.cursor);\n const limit = fromInputMaybe(args.paging.limit);\n if (cursor || limit) {\n paging = {\n cursor: cursor || \"\",\n limit: limit || 100,\n };\n }\n }\n\n let result: PagedResults<Operation>;\n try {\n result = await reactorClient.getOperations(\n args.filter.documentId,\n view,\n operationFilter,\n paging,\n );\n } catch (error) {\n throw new GraphQLError(\n `Failed to fetch document operations: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n try {\n return toOperationResultPage(result);\n } catch (error) {\n throw new GraphQLError(\n `Failed to convert operations to GraphQL: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\nexport async function createDocument(\n reactorClient: IReactorClient,\n args: {\n document: unknown;\n parentIdentifier?: string | null;\n },\n): Promise<ReturnType<typeof toGqlPhDocument>> {\n // Validate that document is a PHDocument\n if (!args.document || typeof args.document !== \"object\") {\n throw new GraphQLError(\"Invalid document: must be an object\");\n }\n\n const document = args.document as PHDocument;\n\n // Validate required fields\n if (!document.header || typeof document.header !== \"object\") {\n throw new GraphQLError(\"Invalid document: missing or invalid header\");\n }\n\n const parentIdentifier = fromInputMaybe(args.parentIdentifier);\n\n let result: PHDocument;\n try {\n if (parentIdentifier) {\n const parent = await reactorClient.get(parentIdentifier);\n if (parent.header.documentType === DRIVE_DOCUMENT_TYPE) {\n result = await reactorClient.createDocumentInDrive(\n parentIdentifier,\n document,\n );\n } else {\n result = await reactorClient.create(document, parentIdentifier);\n }\n } else {\n result = await reactorClient.create(document);\n }\n } catch (error) {\n throw new GraphQLError(\n `Failed to create document: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n try {\n return toGqlPhDocument(result);\n } catch (error) {\n throw new GraphQLError(\n `Failed to convert created document to GraphQL: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\nexport async function createEmptyDocument(\n reactorClient: IReactorClient,\n args: {\n documentType: string;\n parentIdentifier?: string | null;\n name?: string | null;\n },\n): Promise<ReturnType<typeof toGqlPhDocument>> {\n const parentIdentifier = fromInputMaybe(args.parentIdentifier);\n const name = fromInputMaybe(args.name);\n\n let result: PHDocument;\n try {\n if (parentIdentifier) {\n const parent = await reactorClient.get(parentIdentifier);\n if (parent.header.documentType === DRIVE_DOCUMENT_TYPE) {\n const module = await reactorClient.getDocumentModelModule(\n args.documentType,\n );\n const document = module.utils.createDocument();\n if (name) {\n document.header.name = name;\n }\n result = await reactorClient.createDocumentInDrive(\n parentIdentifier,\n document,\n );\n } else {\n result = await reactorClient.createEmpty(args.documentType, {\n parentIdentifier,\n });\n }\n } else {\n result = await reactorClient.createEmpty(args.documentType, {});\n }\n } catch (error) {\n throw new GraphQLError(\n `Failed to create empty document: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n try {\n return toGqlPhDocument(result);\n } catch (error) {\n throw new GraphQLError(\n `Failed to convert created document to GraphQL: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\nexport async function createDocumentWithInitialState(\n reactorClient: IReactorClient,\n args: {\n documentType: string;\n parentIdentifier?: string | null;\n name?: string | null;\n slug?: string | null;\n preferredEditor?: string | null;\n initialState: Record<string, Record<string, unknown>>;\n },\n): Promise<ReturnType<typeof toGqlPhDocument>> {\n const parentIdentifier = fromInputMaybe(args.parentIdentifier);\n const name = fromInputMaybe(args.name);\n const slug = fromInputMaybe(args.slug);\n const preferredEditor = fromInputMaybe(args.preferredEditor);\n\n let module: DocumentModelModule;\n try {\n module = await reactorClient.getDocumentModelModule(args.documentType);\n } catch (error) {\n throw new GraphQLError(\n `Document model not found for type ${args.documentType}: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n const document = module.utils.createDocument();\n\n // Only merge specification-defined scopes (e.g., global, local).\n // Protected scopes like \"auth\" and \"document\" are excluded.\n const allowedScopes = new Set(\n Object.keys(module.documentModel.global.specifications.at(-1)?.state ?? {}),\n );\n const state = document.state as Record<string, Record<string, unknown>>;\n for (const [scope, scopeState] of Object.entries(args.initialState)) {\n if (allowedScopes.has(scope) && scope in state) {\n state[scope] = { ...state[scope], ...scopeState };\n }\n }\n\n if (name) {\n document.header.name = name;\n }\n if (slug) {\n document.header.slug = slug;\n }\n if (preferredEditor) {\n document.header.meta = { ...document.header.meta, preferredEditor };\n }\n\n let result: PHDocument;\n if (parentIdentifier) {\n let parent: PHDocument;\n try {\n parent = await reactorClient.get(parentIdentifier);\n } catch (error) {\n throw new GraphQLError(\n `Parent document not found: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n if (parent.header.documentType === DRIVE_DOCUMENT_TYPE) {\n try {\n result = await reactorClient.createDocumentInDrive(\n parentIdentifier,\n document,\n );\n } catch (error) {\n throw new GraphQLError(\n `Failed to create document in drive: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n } else {\n try {\n result = await reactorClient.create(document, parentIdentifier);\n } catch (error) {\n throw new GraphQLError(\n `Failed to create document with parent: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n } else {\n try {\n result = await reactorClient.create(document);\n } catch (error) {\n throw new GraphQLError(\n `Failed to create document: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n try {\n return toGqlPhDocument(result);\n } catch (error) {\n throw new GraphQLError(\n `Failed to convert created document to GraphQL: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\nexport async function mutateDocument(\n reactorClient: IReactorClient,\n args: {\n documentIdentifier: string;\n actions: readonly unknown[];\n view?: {\n branch?: string | null;\n scopes?: readonly string[] | null;\n } | null;\n },\n): Promise<ReturnType<typeof toGqlPhDocument>> {\n // Validate actions\n let validatedActions;\n try {\n validatedActions = validateActions(args.actions);\n } catch (error) {\n if (error instanceof GraphQLError) {\n throw error;\n }\n throw new GraphQLError(\n `Action validation failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n // Extract branch from view filter (default to \"main\")\n const branch = args.view?.branch ?? \"main\";\n\n let result: PHDocument;\n try {\n result = await reactorClient.execute(\n args.documentIdentifier,\n branch,\n validatedActions,\n );\n } catch (error) {\n throw new GraphQLError(\n `Failed to mutate document: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n try {\n return toGqlPhDocument(result);\n } catch (error) {\n throw new GraphQLError(\n `Failed to convert mutated document to GraphQL: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\nexport async function mutateDocumentAsync(\n reactorClient: IReactorClient,\n args: {\n documentIdentifier: string;\n actions: readonly unknown[];\n view?: {\n branch?: string | null;\n scopes?: readonly string[] | null;\n } | null;\n },\n): Promise<string> {\n // Validate actions\n let validatedActions;\n try {\n validatedActions = validateActions(args.actions);\n } catch (error) {\n if (error instanceof GraphQLError) {\n throw error;\n }\n throw new GraphQLError(\n `Action validation failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n // Extract branch from view filter (default to \"main\")\n const branch = args.view?.branch ?? \"main\";\n\n let result: JobInfo;\n try {\n result = await reactorClient.executeAsync(\n args.documentIdentifier,\n branch,\n validatedActions,\n );\n } catch (error) {\n throw new GraphQLError(\n `Failed to submit document mutation: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n return result.id;\n}\n\nexport async function renameDocument(\n reactorClient: IReactorClient,\n args: {\n documentIdentifier: string;\n name: string;\n branch?: string | null;\n },\n signal?: AbortSignal,\n): Promise<ReturnType<typeof toGqlPhDocument>> {\n const branch = fromInputMaybe(args.branch);\n\n let result: PHDocument;\n try {\n result = await reactorClient.rename(\n args.documentIdentifier,\n args.name,\n branch,\n signal,\n );\n } catch (error) {\n throw new GraphQLError(\n `Failed to rename document: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n try {\n return toGqlPhDocument(result);\n } catch (error) {\n throw new GraphQLError(\n `Failed to convert renamed document to GraphQL: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\nexport async function addChildren(\n reactorClient: IReactorClient,\n args: {\n parentIdentifier: string;\n documentIdentifiers: readonly string[];\n branch?: string | null;\n },\n): Promise<ReturnType<typeof toGqlPhDocument>> {\n const branch = fromInputMaybe(args.branch);\n const documentIdentifiers = [...args.documentIdentifiers];\n\n let result: PHDocument;\n try {\n result = await reactorClient.addChildren(\n args.parentIdentifier,\n documentIdentifiers,\n branch,\n );\n } catch (error) {\n throw new GraphQLError(\n `Failed to add children: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n try {\n return toGqlPhDocument(result);\n } catch (error) {\n throw new GraphQLError(\n `Failed to convert document to GraphQL: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\nexport async function removeChildren(\n reactorClient: IReactorClient,\n args: {\n parentIdentifier: string;\n documentIdentifiers: readonly string[];\n branch?: string | null;\n },\n): Promise<ReturnType<typeof toGqlPhDocument>> {\n const branch = fromInputMaybe(args.branch);\n const documentIdentifiers = [...args.documentIdentifiers];\n\n let result: PHDocument;\n try {\n result = await reactorClient.removeChildren(\n args.parentIdentifier,\n documentIdentifiers,\n branch,\n );\n } catch (error) {\n throw new GraphQLError(\n `Failed to remove children: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n try {\n return toGqlPhDocument(result);\n } catch (error) {\n throw new GraphQLError(\n `Failed to convert document to GraphQL: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\nexport async function moveChildren(\n reactorClient: IReactorClient,\n args: {\n sourceParentIdentifier: string;\n targetParentIdentifier: string;\n documentIdentifiers: readonly string[];\n branch?: string | null;\n },\n): Promise<{\n source: ReturnType<typeof toGqlPhDocument>;\n target: ReturnType<typeof toGqlPhDocument>;\n}> {\n const branch = fromInputMaybe(args.branch);\n const documentIdentifiers = [...args.documentIdentifiers];\n\n let result: { source: PHDocument; target: PHDocument };\n try {\n result = await reactorClient.moveChildren(\n args.sourceParentIdentifier,\n args.targetParentIdentifier,\n documentIdentifiers,\n branch,\n );\n } catch (error) {\n throw new GraphQLError(\n `Failed to move children: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n try {\n return {\n source: toGqlPhDocument(result.source),\n target: toGqlPhDocument(result.target),\n };\n } catch (error) {\n throw new GraphQLError(\n `Failed to convert documents to GraphQL: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\nexport async function deleteDocument(\n reactorClient: IReactorClient,\n args: {\n identifier: string;\n propagate?: GqlPropagationMode | null;\n },\n): Promise<boolean> {\n const propagate = toReactorPropagationMode(args.propagate);\n\n try {\n await reactorClient.deleteDocument(args.identifier, propagate);\n return true;\n } catch (error) {\n throw new GraphQLError(\n `Failed to delete document: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\nexport async function deleteDocuments(\n reactorClient: IReactorClient,\n args: {\n identifiers: readonly string[];\n propagate?: GqlPropagationMode | null;\n },\n): Promise<boolean> {\n const propagate = toReactorPropagationMode(args.propagate);\n const identifiers = [...args.identifiers];\n\n try {\n await reactorClient.deleteDocuments(identifiers, propagate);\n return true;\n } catch (error) {\n throw new GraphQLError(\n `Failed to delete documents: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\nexport async function touchChannel(\n syncManager: ISyncManager,\n args: {\n input: {\n id: string;\n name: string;\n collectionId: string;\n filter: {\n documentId: readonly string[];\n scope: readonly string[];\n branch: string;\n };\n sinceTimestampUtcMs: string;\n };\n },\n): Promise<{ success: boolean; ackOrdinal: number }> {\n try {\n const remote = syncManager.getById(args.input.id);\n\n return {\n success: true,\n ackOrdinal: remote.channel.inbox.ackOrdinal,\n };\n } catch {\n // getById will throw if the remote does not exist\n }\n\n const filter: RemoteFilter = {\n documentId: [...args.input.filter.documentId],\n scope: [...args.input.filter.scope],\n branch: args.input.filter.branch,\n };\n\n const options = {\n sinceTimestampUtcMs: args.input.sinceTimestampUtcMs,\n };\n\n try {\n await syncManager.add(\n args.input.name,\n args.input.collectionId,\n {\n type: \"polling\",\n parameters: {},\n },\n filter,\n options,\n args.input.id,\n );\n } catch (error) {\n throw new GraphQLError(\n `Failed to create channel: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n return { success: true, ackOrdinal: 0 };\n}\n\n/**\n * Polls the switchboard for new sync envelopes and acknowledges previously\n * received operations.\n *\n * Ordinal frames of reference:\n * - `outboxAck` / `outboxLatest`: switchboard's ordinals (used to trim/filter\n * the switchboard's outbox)\n * - `ackOrdinal` in the response: the pushing client's ordinals (highest\n * client ordinal the switchboard has successfully applied, so the client\n * can trim its own outbox)\n */\nexport function pollSyncEnvelopes(\n syncManager: ISyncManager,\n args: {\n channelId: string;\n outboxAck: number;\n outboxLatest: number;\n },\n): {\n envelopes: any[];\n ackOrdinal: number;\n deadLetters: Array<{\n documentId: string;\n error: string;\n jobId: string;\n branch: string;\n scopes: string[];\n operationCount: number;\n }>;\n hasMore: boolean;\n} {\n let remote;\n try {\n remote = syncManager.getById(args.channelId);\n } catch (error) {\n throw new GraphQLError(\n `Channel not found: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n const deadLetters = remote.channel.deadLetter.items.map((syncOp) => ({\n documentId: syncOp.documentId,\n error: syncOp.error?.message ?? \"Unknown error\",\n jobId: syncOp.jobId,\n branch: syncOp.branch,\n scopes: syncOp.scopes,\n operationCount: syncOp.operations.length,\n }));\n\n // trim outbox\n if (args.outboxAck > 0) {\n trimMailboxFromAckOrdinal(remote.channel.outbox, args.outboxAck);\n }\n\n let operations = remote.channel.outbox.items;\n\n // filter remaining outbox operations by outboxLatest\n operations = operations.filter((syncOp) => {\n let maxOrdinal = 0;\n for (const op of syncOp.operations) {\n maxOrdinal = Math.max(maxOrdinal, op.context.ordinal);\n }\n\n if (maxOrdinal > args.outboxLatest) {\n return true;\n }\n\n return false;\n });\n\n if (operations.length === 0) {\n return {\n envelopes: [],\n ackOrdinal: remote.channel.inbox.ackOrdinal,\n deadLetters,\n hasMore: false,\n };\n }\n\n // Sort by first operation ordinal ascending. Dependencies always point\n // backward in ordinal order, so a plain ordinal slice never delivers an\n // operation before its dependency.\n const sorted = [...operations].sort((a, b) => {\n const aOrdinal = a.operations[0]?.context.ordinal ?? 0;\n const bOrdinal = b.operations[0]?.context.ordinal ?? 0;\n return aOrdinal - bOrdinal;\n });\n\n const hasMore = sorted.length > POLL_SYNC_ENVELOPES_MAX_LIMIT;\n const pageOperations = sorted.slice(0, POLL_SYNC_ENVELOPES_MAX_LIMIT);\n\n let maxOrdinal = args.outboxLatest;\n for (const syncOp of pageOperations) {\n for (const op of syncOp.operations) {\n const opOrdinal = op.context.ordinal;\n if (opOrdinal > maxOrdinal) {\n maxOrdinal = opOrdinal;\n }\n }\n }\n\n const envelopes = pageOperations.map((syncOp: SyncOperation) => ({\n type: \"OPERATIONS\",\n channelMeta: {\n id: args.channelId,\n },\n operations: syncOp.operations.map((op) => ({\n operation: serializeOperationForGraphQL(op.operation),\n context: op.context,\n })),\n cursor: {\n remoteName: remote.name,\n cursorOrdinal: maxOrdinal,\n lastSyncedAtUtcMs: Date.now().toString(),\n },\n key: syncOp.jobId || undefined,\n dependsOn:\n syncOp.jobDependencies.filter(Boolean).length > 0\n ? syncOp.jobDependencies.filter(Boolean)\n : undefined,\n }));\n\n return {\n envelopes: sortEnvelopesByFirstOperationTimestamp(envelopes),\n ackOrdinal: remote.channel.inbox.ackOrdinal,\n deadLetters,\n hasMore,\n };\n}\n\ntype SyncEnvelopeArg = {\n type: string;\n channelMeta: { id: string };\n operations?: Array<{\n operation: any;\n context: {\n documentId: string;\n documentType: string;\n scope: string;\n branch: string;\n ordinal: number;\n };\n }> | null;\n cursor?: {\n remoteName: string;\n cursorOrdinal: number;\n lastSyncedAtUtcMs?: string | null;\n } | null;\n key?: string;\n dependsOn?: string[];\n};\n\n/**\n * Receives sync envelopes pushed by a client and adds them to the\n * appropriate channel inboxes.\n *\n * The `ordinal` in each operation's context is the client's local ordinal.\n * It must be preserved because the inbox mailbox tracks applied ordinals\n * and returns the highest one as `ackOrdinal` in pollSyncEnvelopes.\n */\nexport function pushSyncEnvelopes(\n syncManager: ISyncManager,\n args: {\n envelopes: SyncEnvelopeArg[];\n },\n): Promise<boolean> {\n const sortedEnvelopes = sortEnvelopesByFirstOperationTimestamp(\n args.envelopes,\n );\n\n type RemoteRef = ReturnType<ISyncManager[\"getById\"]>;\n const remoteSyncOps = new Map<RemoteRef, SyncOperation[]>();\n\n for (const envelope of sortedEnvelopes) {\n let remote: RemoteRef;\n try {\n remote = syncManager.getById(envelope.channelMeta.id);\n } catch (error) {\n throw new GraphQLError(\n `Channel not found: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n if (!envelope.operations || envelope.operations.length === 0) {\n continue;\n }\n\n const syncOps = envelopesToSyncOperations(\n envelope as Parameters<typeof envelopesToSyncOperations>[0],\n remote.name,\n );\n\n if (!remoteSyncOps.has(remote)) {\n remoteSyncOps.set(remote, []);\n }\n remoteSyncOps.get(remote)!.push(...syncOps);\n }\n\n for (const [remote, syncOps] of remoteSyncOps) {\n const consolidated = consolidateSyncOperations(syncOps);\n\n const validKeys = new Set(\n consolidated.map((op) => op.jobId).filter(Boolean),\n );\n for (const syncOp of consolidated) {\n syncOp.jobDependencies = syncOp.jobDependencies.filter((dep) =>\n validKeys.has(dep),\n );\n }\n\n remote.channel.inbox.add(...consolidated);\n }\n\n return Promise.resolve(true);\n}\n\n/**\n * Create a getParentIds function using the reactor client\n */\nexport function createGetParentIdsFn(\n reactorClient: IReactorClient,\n): GetParentIdsFn {\n return async (documentId: string): Promise<string[]> => {\n try {\n const result = await reactorClient.getParents(documentId);\n return result.results.map((doc) => doc.header.id);\n } catch {\n // If document has no parents or error, return empty array\n return [];\n }\n };\n}\n","import { camelCase, kebabCase } from \"change-case\";\nimport {\n setName,\n type DocumentModelModule,\n} from \"@powerhousedao/shared/document-model\";\nimport { GraphQLError, Kind, parse } from \"graphql\";\nimport {\n generateDocumentModelSchema,\n getDocumentModelSchemaName,\n} from \"../utils/create-schema.js\";\nimport { BaseSubgraph } from \"./base-subgraph.js\";\nimport { toGqlPhDocument } from \"./reactor/adapters.js\";\nimport type {\n PhDocument,\n PhDocumentResultPage,\n} from \"./reactor/gen/graphql.js\";\nimport {\n createDocumentWithInitialState as createDocumentWithInitialStateResolver,\n createEmptyDocument as createEmptyDocumentResolver,\n documentChildren as documentChildrenResolver,\n documentParents as documentParentsResolver,\n document as documentResolver,\n findDocuments as findDocumentsResolver,\n} from \"./reactor/resolvers.js\";\nimport type { Context, SubgraphArgs } from \"./types.js\";\n\n/** A resolver function that lives inside a document-model subgraph. */\n\nexport type DocumentModelResolverFn = (...args: any[]) => unknown;\n\n/**\n * A resolver map for a single GraphQL type in a document-model subgraph.\n * Each key is a field name (or `__resolveType` for unions) and each value\n * is a resolver function.\n */\nexport type DocumentModelResolverMap = Record<string, DocumentModelResolverFn>;\n\n/** View filter shared across query resolvers. */\ntype ViewArg = { branch?: string; scopes?: string[] };\n\n/** Paging argument shared across query resolvers. */\ntype PagingArg = { limit?: number; offset?: number; cursor?: string };\n\n/**\n * Known query resolvers generated for every document model.\n * `TDocument` is the GQL representation of the document (defaults to `PhDocument`).\n */\nexport interface DocumentModelQueryResolvers<\n TDocument extends PhDocument = PhDocument,\n> {\n document: (\n parent: unknown,\n args: { identifier: string; view?: ViewArg },\n ctx: Context,\n ) => Promise<{ document: TDocument; childIds: string[] }>;\n documents: (\n parent: unknown,\n args: { paging?: PagingArg },\n ctx: Context,\n ) => Promise<{ items: TDocument[] }>;\n findDocuments: (\n parent: unknown,\n args: {\n search?: { parentId?: string; identifiers?: string[] } | null;\n view?: ViewArg;\n paging?: PagingArg;\n },\n ctx: Context,\n ) => Promise<PhDocumentResultPage>;\n documentChildren: (\n parent: unknown,\n args: { parentIdentifier: string; view?: ViewArg; paging?: PagingArg },\n ctx: Context,\n ) => Promise<PhDocumentResultPage>;\n documentParents: (\n parent: unknown,\n args: { childIdentifier: string; view?: ViewArg; paging?: PagingArg },\n ctx: Context,\n ) => Promise<PhDocumentResultPage>;\n}\n\n/**\n * Known mutation resolvers generated for every document model.\n * `TDocument` is the GQL representation of the document (defaults to `PhDocument`).\n * Operations specific to each model are captured by the index signature.\n */\nexport interface DocumentModelMutationResolvers<\n TDocument extends PhDocument = PhDocument,\n> {\n createDocument: (\n parent: unknown,\n args: {\n name: string;\n parentIdentifier?: string;\n slug?: string;\n preferredEditor?: string;\n initialState?: Record<string, Record<string, unknown>>;\n },\n ctx: Context,\n ) => Promise<TDocument>;\n createEmptyDocument: (\n parent: unknown,\n args: { parentIdentifier?: string },\n ctx: Context,\n ) => Promise<TDocument>;\n /** Dynamic operation resolvers (sync and async variants). */\n [operationName: string]: DocumentModelResolverFn;\n}\n\n/** The resolvers that a `DocumentModelSubgraph` exposes. */\nexport interface DocumentModelSubgraphResolvers<\n TDocument extends PhDocument = PhDocument,\n> {\n Query: DocumentModelResolverMap;\n Mutation: DocumentModelResolverMap;\n [namespaceKey: string]:\n | DocumentModelResolverMap\n | DocumentModelQueryResolvers<TDocument>\n | DocumentModelMutationResolvers<TDocument>;\n}\n\n/**\n * New document model subgraph that uses reactorClient instead of legacy reactor.\n * This class auto-generates GraphQL queries and mutations for a document model.\n */\nexport class DocumentModelSubgraph extends BaseSubgraph {\n declare resolvers: DocumentModelSubgraphResolvers;\n private documentModel: DocumentModelModule;\n\n constructor(documentModel: DocumentModelModule, args: SubgraphArgs) {\n super(args);\n this.documentModel = documentModel;\n this.name = kebabCase(documentModel.documentModel.global.name);\n this.typeDefs = generateDocumentModelSchema(\n this.documentModel.documentModel.global,\n { useNewApi: true },\n );\n this.resolvers = this.generateResolvers();\n }\n\n /** Returns the typed query resolvers for this document model. */\n get queryResolvers(): DocumentModelQueryResolvers {\n const documentName = getDocumentModelSchemaName(\n this.documentModel.documentModel.global,\n );\n return this.resolvers[\n `${documentName}Queries`\n ] as DocumentModelQueryResolvers;\n }\n\n /** Returns the typed mutation resolvers for this document model. */\n get mutationResolvers(): DocumentModelMutationResolvers {\n const documentName = getDocumentModelSchemaName(\n this.documentModel.documentModel.global,\n );\n return this.resolvers[\n `${documentName}Mutations`\n ] as DocumentModelMutationResolvers;\n }\n\n /**\n * Generate __resolveType functions for union types found in the document model schema.\n * Parses the state schema to find union definitions and their member types,\n * then uses unique field presence to discriminate between member types at runtime.\n */\n private generateUnionResolvers(): Record<string, DocumentModelResolverMap> {\n const documentName = getDocumentModelSchemaName(\n this.documentModel.documentModel.global,\n );\n const specification =\n this.documentModel.documentModel.global.specifications.at(-1);\n if (!specification) return {};\n\n const globalSchema = specification.state.global.schema ?? \"\";\n const localSchema = specification.state.local.schema ?? \"\";\n const fullSchema = `${globalSchema}\\n${localSchema}`;\n\n if (!fullSchema.trim()) return {};\n\n let ast;\n try {\n ast = parse(fullSchema);\n } catch {\n return {};\n }\n\n // Build map: object type name -> field names\n const objectFieldsMap = new Map<string, string[]>();\n for (const def of ast.definitions) {\n if (def.kind === Kind.OBJECT_TYPE_DEFINITION) {\n objectFieldsMap.set(\n def.name.value,\n def.fields?.map((f) => f.name.value) ?? [],\n );\n }\n }\n\n const resolvers: Record<string, DocumentModelResolverMap> = {};\n\n for (const def of ast.definitions) {\n if (def.kind !== Kind.UNION_TYPE_DEFINITION) continue;\n\n const unionName = def.name.value;\n const memberTypes = def.types?.map((t) => t.name.value) ?? [];\n if (memberTypes.length === 0) continue;\n\n // Compute unique fields per member type\n const uniqueFields: Record<string, string[]> = {};\n for (const memberType of memberTypes) {\n const ownFields = objectFieldsMap.get(memberType) ?? [];\n const otherFields = new Set(\n memberTypes\n .filter((t) => t !== memberType)\n .flatMap((t) => objectFieldsMap.get(t) ?? []),\n );\n uniqueFields[memberType] = ownFields.filter((f) => !otherFields.has(f));\n }\n\n const prefixedUnionName = `${documentName}_${unionName}`;\n\n resolvers[prefixedUnionName] = {\n __resolveType: (obj: Record<string, unknown>) => {\n for (const memberType of memberTypes) {\n const fields = uniqueFields[memberType] ?? [];\n if (fields.length > 0 && fields.some((f) => f in obj)) {\n return `${documentName}_${memberType}`;\n }\n }\n return `${documentName}_${memberTypes[0]}`;\n },\n };\n }\n\n return resolvers;\n }\n\n /**\n * Generate resolvers for this document model using reactorClient\n * Uses flat queries (not nested) consistent with ReactorSubgraph patterns\n */\n private generateResolvers(): DocumentModelSubgraphResolvers {\n const documentType = this.documentModel.documentModel.global.id;\n const documentName = getDocumentModelSchemaName(\n this.documentModel.documentModel.global,\n );\n const operations =\n this.documentModel.documentModel.global.specifications\n .at(-1)\n ?.modules.flatMap((module) =>\n module.operations.filter((op) => op.name),\n ) ?? [];\n\n return {\n ...this.generateUnionResolvers(),\n Query: {\n // Namespace resolver: returns empty object so nested field resolvers can run\n [documentName]: () => ({}),\n },\n [`${documentName}Queries`]: {\n // Get a specific document by identifier\n document: async (\n _: unknown,\n args: {\n identifier: string;\n view?: { branch?: string; scopes?: string[] };\n },\n ctx: Context,\n ) => {\n const { identifier, view } = args;\n\n if (!identifier) {\n throw new GraphQLError(\"Document identifier is required\");\n }\n\n const result = await documentResolver(this.reactorClient, {\n identifier,\n view,\n });\n\n if (result.document.documentType !== documentType) {\n throw new GraphQLError(\n `Document with id ${identifier} is not of type ${documentType}`,\n );\n }\n\n await this.assertCanRead(result.document.id, ctx);\n\n return result;\n },\n // Flat query: Get all documents of this type (paged)\n documents: async (\n _: unknown,\n args: {\n paging?: { limit?: number; offset?: number; cursor?: string };\n },\n ctx: Context,\n ) => {\n const { paging } = args;\n\n const result = await findDocumentsResolver(this.reactorClient, {\n search: { type: documentType },\n paging,\n });\n\n // Filter by permission if needed\n if (\n !this.hasGlobalAdminAccess(ctx) &&\n this.documentPermissionService\n ) {\n const filteredItems = [];\n for (const item of result.items) {\n const canRead = await this.canReadDocument(item.id, ctx);\n if (canRead) {\n filteredItems.push(item);\n }\n }\n return {\n ...result,\n items: filteredItems,\n totalCount: filteredItems.length,\n };\n }\n\n return result;\n },\n // Flat query: Find documents by search criteria (type is built-in)\n // Uses shared findDocumentsResolver from reactor/resolvers.ts\n findDocuments: async (\n _: unknown,\n args: {\n search?: { parentId?: string; identifiers?: string[] } | null;\n view?: { branch?: string; scopes?: string[] };\n paging?: { limit?: number; offset?: number; cursor?: string };\n },\n ctx: Context,\n ) => {\n const { search, view, paging } = args;\n\n const result = await findDocumentsResolver(this.reactorClient, {\n search: {\n type: documentType,\n parentId: search?.parentId,\n },\n view,\n paging,\n });\n\n if (\n !this.hasGlobalAdminAccess(ctx) &&\n this.documentPermissionService\n ) {\n const filteredItems = [];\n for (const item of result.items) {\n const canRead = await this.canReadDocument(item.id, ctx);\n if (canRead) {\n filteredItems.push(item);\n }\n }\n return {\n ...result,\n items: filteredItems,\n totalCount: filteredItems.length,\n };\n }\n\n return result;\n },\n\n // Get children of a document (filtered by this document type)\n documentChildren: async (\n _: unknown,\n args: {\n parentIdentifier: string;\n view?: { branch?: string; scopes?: string[] };\n paging?: { limit?: number; offset?: number; cursor?: string };\n },\n ctx: Context,\n ) => {\n const { parentIdentifier, view, paging } = args;\n\n await this.assertCanRead(parentIdentifier, ctx);\n\n const result = await documentChildrenResolver(this.reactorClient, {\n parentIdentifier,\n view,\n paging,\n });\n\n const filteredItems = result.items.filter(\n (item) => item.documentType === documentType,\n );\n\n return {\n ...result,\n items: filteredItems,\n totalCount: filteredItems.length,\n };\n },\n\n // Get parents of a document\n documentParents: async (\n _: unknown,\n args: {\n childIdentifier: string;\n view?: { branch?: string; scopes?: string[] };\n paging?: { limit?: number; offset?: number; cursor?: string };\n },\n ctx: Context,\n ) => {\n const { childIdentifier, view, paging } = args;\n\n await this.assertCanRead(childIdentifier, ctx);\n\n return documentParentsResolver(this.reactorClient, {\n childIdentifier,\n view,\n paging,\n });\n },\n },\n Mutation: {\n // Namespace resolver: returns empty object so nested field resolvers can run\n [documentName]: () => ({}),\n },\n [`${documentName}Mutations`]: {\n createDocument: async (\n _: unknown,\n args: {\n name: string;\n parentIdentifier?: string;\n slug?: string;\n preferredEditor?: string;\n initialState?: Record<string, Record<string, unknown>>;\n },\n ctx: Context,\n ) => {\n const {\n parentIdentifier,\n name,\n slug,\n preferredEditor,\n initialState,\n } = args;\n\n if (parentIdentifier) {\n await this.assertCanWrite(parentIdentifier, ctx);\n } else if (this.authorizationService) {\n if (!ctx.user?.address) {\n throw new GraphQLError(\n \"Forbidden: authentication required to create documents\",\n );\n }\n } else if (!this.hasGlobalAdminAccess(ctx)) {\n throw new GraphQLError(\n \"Forbidden: insufficient permissions to create documents\",\n );\n }\n\n let createdDoc;\n if (initialState || preferredEditor) {\n createdDoc = await createDocumentWithInitialStateResolver(\n this.reactorClient,\n {\n documentType,\n parentIdentifier,\n name,\n slug,\n preferredEditor,\n initialState: initialState ?? {},\n },\n );\n } else {\n createdDoc = await createEmptyDocumentResolver(this.reactorClient, {\n documentType,\n parentIdentifier,\n name,\n });\n }\n\n // Auto-ownership: set creator as document owner\n if (\n this.authorizationService &&\n ctx.user?.address &&\n createdDoc?.id\n ) {\n await this.documentPermissionService?.initializeDocumentProtection(\n createdDoc.id,\n ctx.user.address,\n this.authorizationService.config.defaultProtection,\n );\n }\n\n // Name fallback via SET_NAME (only for non-initialState path,\n // since initialState path sets name on header before creation)\n if (\n !initialState &&\n !preferredEditor &&\n name &&\n createdDoc.name !== name\n ) {\n const updatedDoc = await this.reactorClient.execute(\n createdDoc.id,\n \"main\",\n [setName(name)],\n );\n return toGqlPhDocument(updatedDoc);\n }\n\n return createdDoc;\n },\n createEmptyDocument: async (\n _: unknown,\n args: { parentIdentifier?: string },\n ctx: Context,\n ) => {\n const { parentIdentifier } = args;\n\n if (parentIdentifier) {\n await this.assertCanWrite(parentIdentifier, ctx);\n } else if (this.authorizationService) {\n if (!ctx.user?.address) {\n throw new GraphQLError(\n \"Forbidden: authentication required to create documents\",\n );\n }\n } else if (!this.hasGlobalAdminAccess(ctx)) {\n throw new GraphQLError(\n \"Forbidden: insufficient permissions to create documents\",\n );\n }\n\n const result = await createEmptyDocumentResolver(this.reactorClient, {\n documentType,\n parentIdentifier,\n });\n\n // Auto-ownership: set creator as document owner\n if (this.authorizationService && ctx.user?.address && result?.id) {\n await this.documentPermissionService?.initializeDocumentProtection(\n result.id,\n ctx.user.address,\n this.authorizationService.config.defaultProtection,\n );\n }\n\n return result;\n },\n // Generate sync and async mutations for each operation\n ...operations.reduce((mutations, op) => {\n // Sync mutation\n mutations[camelCase(op.name!)] = async (\n _: unknown,\n args: { docId: string; input: unknown },\n ctx: Context,\n ) => {\n const { docId, input } = args;\n\n if (!this.authorizationService) {\n await this.assertCanWrite(docId, ctx);\n }\n await this.assertCanExecuteOperation(docId, op.name!, ctx);\n\n const doc = await this.reactorClient.get(docId);\n if (doc.header.documentType !== documentType) {\n throw new GraphQLError(\n `Document with id ${docId} is not of type ${documentType}`,\n );\n }\n\n const action = this.documentModel.actions[camelCase(op.name!)];\n if (!action) {\n throw new GraphQLError(`Action ${op.name} not found`);\n }\n\n try {\n const updatedDoc = await this.reactorClient.execute(\n docId,\n \"main\",\n [action(input)],\n );\n return toGqlPhDocument(updatedDoc);\n } catch (error) {\n throw new GraphQLError(\n error instanceof Error ? error.message : `Failed to ${op.name}`,\n );\n }\n };\n\n // Async mutation - returns job ID\n mutations[`${camelCase(op.name!)}Async`] = async (\n _: unknown,\n args: { docId: string; input: unknown },\n ctx: Context,\n ) => {\n const { docId, input } = args;\n\n if (!this.authorizationService) {\n await this.assertCanWrite(docId, ctx);\n }\n await this.assertCanExecuteOperation(docId, op.name!, ctx);\n\n const doc = await this.reactorClient.get(docId);\n if (doc.header.documentType !== documentType) {\n throw new GraphQLError(\n `Document with id ${docId} is not of type ${documentType}`,\n );\n }\n\n const action = this.documentModel.actions[camelCase(op.name!)];\n if (!action) {\n throw new GraphQLError(`Action ${op.name} not found`);\n }\n\n try {\n const jobInfo = await this.reactorClient.executeAsync(\n docId,\n \"main\",\n [action(input)],\n );\n return jobInfo.id;\n } catch (error) {\n throw new GraphQLError(\n error instanceof Error ? error.message : `Failed to ${op.name}`,\n );\n }\n };\n\n return mutations;\n }, {} as DocumentModelResolverMap),\n },\n };\n }\n}\n","import type { GraphQLSchema } from \"graphql\";\nimport type { Request as SSERequest } from \"graphql-sse\";\nimport { createHandler } from \"graphql-sse/lib/use/fetch\";\nimport type { Context } from \"./types.js\";\n\n/**\n * Options for creating the GraphQL-over-SSE handler.\n */\nexport interface SSEHandlerOptions {\n schema: GraphQLSchema;\n /**\n * Build a GraphQL context from the incoming Fetch API Request.\n * Called once per subscription (not per event).\n *\n * The request has already passed through auth middleware by the time\n * this is invoked, so getAuthContext(request) will return the populated\n * AuthContext from the WeakMap.\n */\n contextFactory: (req: Request) => Promise<Context> | Context;\n}\n\n/**\n * Create a Fetch-API-compatible SSE handler for GraphQL subscriptions\n * using the graphql-sse library (graphql-sse protocol).\n *\n * This runs alongside the existing WebSocket (graphql-ws) transport\n * so clients can choose either protocol.\n *\n * The returned handler is a standard FetchHandler: (req: Request) => Promise<Response>.\n * It can be mounted via httpAdapter.mount() like any other handler, and auth\n * flows through the WeakMap pattern (authFetchMiddleware populates the context\n * before this handler is called).\n *\n * Clients connect via \"distinct connections mode\" (POST with\n * `Accept: text/event-stream`). Single-connection mode is disabled\n * because it adds token-management complexity with no benefit here.\n */\nexport function createGraphQLSSEHandler(\n options: SSEHandlerOptions,\n): (req: Request) => Promise<Response> {\n const { schema, contextFactory } = options;\n\n return createHandler<Context>({\n schema,\n // Returning null disables single-connection mode. All clients use\n // \"distinct connections mode\" (one POST per subscription).\n // Auth is handled upstream by authFetchMiddleware.\n authenticate: () => null,\n context: (req: SSERequest<Request>) => contextFactory(req.raw),\n });\n}\n","import type { IAnalyticsStore } from \"@powerhousedao/analytics-engine-core\";\nimport type {\n IReactorClient,\n IRelationalDb,\n ISyncManager,\n} from \"@powerhousedao/reactor\";\nimport type {\n Context,\n ISubgraph,\n SubgraphClass,\n} from \"@powerhousedao/reactor-api\";\nimport type { DocumentDriveDocument } from \"@powerhousedao/shared/document-drive\";\nimport type { DocumentModelModule } from \"@powerhousedao/shared/document-model\";\nimport type { ILogger } from \"document-model\";\nimport type { GraphQLSchema } from \"graphql\";\nimport type { IncomingHttpHeaders } from \"http\";\nimport type http from \"node:http\";\nimport path from \"node:path\";\nimport { match } from \"path-to-regexp\";\nimport type { WebSocketServer } from \"ws\";\nimport { debounce } from \"../packages/util.js\";\nimport type { AuthConfig } from \"../services/auth.service.js\";\nimport { AuthService } from \"../services/auth.service.js\";\nimport {\n getAuthContext,\n type AuthFetchMiddleware,\n} from \"./gateway/auth-middleware.js\";\nimport type { AuthorizationService } from \"../services/authorization.service.js\";\nimport type { DocumentPermissionService } from \"../services/document-permission.service.js\";\nimport {\n buildSubgraphSchemaModule,\n createMergedSchema,\n createSchema,\n} from \"../utils/create-schema.js\";\nimport { DocumentModelSubgraph } from \"./document-model-subgraph.js\";\nimport { createGraphQLSSEHandler } from \"./sse.js\";\nimport { useServer } from \"./websocket.js\";\nimport type {\n FetchHandler,\n GatewayContextFactory,\n IGatewayAdapter,\n IHttpAdapter,\n SubgraphDefinition,\n WsDisposer,\n} from \"./gateway/types.js\";\n\nconst DOCUMENT_MODELS_TO_EXCLUDE: string[] = [];\n\n/**\n * Check if a document model has any operations with valid schemas.\n * Document models without valid operation schemas cannot generate valid subgraph schemas.\n */\nfunction hasOperationSchemas(documentModel: DocumentModelModule): boolean {\n const specification =\n documentModel.documentModel.global.specifications.at(-1);\n if (!specification) return false;\n const hasValidSchema = (schema: string | null | undefined) =>\n schema && /\\b(input|type|enum|union|interface)\\s+\\w+/.test(schema);\n return specification.modules.some((module) =>\n module.operations.some((op) => hasValidSchema(op.schema)),\n );\n}\n\n/**\n * Filter document models to keep only the latest version of each unique document model.\n */\nfunction filterLatestDocumentModelVersions(\n documentModels: DocumentModelModule[],\n): DocumentModelModule[] {\n const latestByName = new Map<string, DocumentModelModule>();\n\n for (const documentModel of documentModels) {\n const name = documentModel.documentModel.global.name;\n const existing = latestByName.get(name);\n\n if (!existing) {\n latestByName.set(name, documentModel);\n continue;\n }\n\n const currentVersion =\n documentModel.documentModel.global.specifications.at(-1)?.version ?? 0;\n const existingVersion =\n existing.documentModel.global.specifications.at(-1)?.version ?? 0;\n\n if (currentVersion > existingVersion) {\n latestByName.set(name, documentModel);\n }\n }\n\n return Array.from(latestByName.values());\n}\n\nconst DefaultFeatureFlags = {\n enableDocumentModelSubgraphs: true,\n};\n\nexport type GraphqlManagerFeatureFlags = {\n enableDocumentModelSubgraphs?: boolean;\n};\n\nexport class GraphQLManager {\n private initialized = false;\n private coreSubgraphsMap = new Map<string, ISubgraph[]>();\n private contextFields: Record<string, any> = {};\n private readonly subgraphs = new Map<string, ISubgraph[]>();\n private authService: AuthService | null = null;\n\n private readonly subgraphWsDisposers = new Map<string, WsDisposer>();\n #authMiddleware: AuthFetchMiddleware | undefined;\n\n /** Cached document models for schema generation - updated on init and regenerate */\n private cachedDocumentModels: DocumentModelModule[] = [];\n\n private readonly subgraphHandlerCache = new Map<string, FetchHandler>();\n\n constructor(\n private readonly path: string,\n private readonly httpServer: http.Server,\n private readonly wsServer: WebSocketServer,\n private readonly reactorClient: IReactorClient,\n private readonly relationalDb: IRelationalDb,\n private readonly analyticsStore: IAnalyticsStore,\n private readonly syncManager: ISyncManager,\n private readonly logger: ILogger,\n private readonly httpAdapter: IHttpAdapter,\n private readonly gatewayAdapter: IGatewayAdapter<Context>,\n private readonly authConfig?: AuthConfig,\n private readonly documentPermissionService?: DocumentPermissionService,\n private readonly featureFlags: GraphqlManagerFeatureFlags = DefaultFeatureFlags,\n private readonly port: number = 4001,\n private readonly authorizationService?: AuthorizationService,\n ) {\n if (this.authConfig) {\n this.authService = new AuthService(this.authConfig);\n }\n\n // Each subscription-enabled subgraph adds listeners to the shared wsServer\n // via graphql-ws's useServer(). The handler cache bounds the count, so\n // unlimited is safe here.\n this.wsServer.setMaxListeners(0);\n }\n\n async init(\n coreSubgraphs: SubgraphClass[],\n authMiddleware?: AuthFetchMiddleware,\n ) {\n this.#authMiddleware = authMiddleware;\n this.logger.debug(`Initializing Subgraph Manager...`);\n\n // check if Document Drive model is available\n const modulesResult = await this.reactorClient.getDocumentModelModules();\n const models = modulesResult.results;\n\n // Cache models for schema generation\n this.cachedDocumentModels = models;\n\n const driveModel = models.find(\n (it: DocumentModelModule) =>\n it.documentModel.global.name === \"DocumentDrive\",\n );\n if (!driveModel) {\n throw new Error(\"DocumentDrive model required\");\n }\n\n await this.gatewayAdapter.start(this.httpServer);\n\n this.httpAdapter.setupMiddleware({ bodyLimit: \"50mb\" });\n\n // Register REST endpoint for drive info as a framework-agnostic FetchHandler.\n const driveRoutePath = path.join(this.path, \"d/:drive\");\n const driveMatcher = match<{ drive: string }>(driveRoutePath);\n this.httpAdapter.mount(driveRoutePath, async (request: Request) => {\n const url = new URL(request.url);\n const matched = driveMatcher(url.pathname);\n const driveIdOrSlug = matched ? matched.params.drive : undefined;\n\n if (!driveIdOrSlug) {\n return Response.json(\n { error: \"Drive ID or slug is required\" },\n { status: 400 },\n );\n }\n\n try {\n const driveDoc =\n await this.reactorClient.get<DocumentDriveDocument>(driveIdOrSlug);\n\n const forwardedProto = request.headers.get(\"x-forwarded-proto\");\n const protocol =\n (forwardedProto ?? url.protocol.replace(\":\", \"\")) + \":\";\n const host = request.headers.get(\"host\") ?? \"\";\n const basePath = this.path === \"/\" ? \"\" : this.path;\n const graphqlEndpoint = `${protocol}//${host}${basePath}/graphql/r`;\n\n return Response.json({\n id: driveDoc.header.id,\n slug: driveDoc.header.slug,\n meta: driveDoc.header.meta,\n name: driveDoc.state.global.name,\n icon: driveDoc.state.global.icon ?? undefined,\n ...(graphqlEndpoint && { graphqlEndpoint }),\n });\n } catch (error: unknown) {\n this.logger.debug(`Drive not found: ${driveIdOrSlug}`, error);\n return Response.json({ error: \"Drive not found\" }, { status: 404 });\n }\n });\n\n this.logger.info(`Registered REST endpoint: GET ${driveRoutePath}`);\n\n await this.#setupCoreSubgraphs(\"graphql\", coreSubgraphs);\n\n if (this.featureFlags.enableDocumentModelSubgraphs) {\n await this.#setupDocumentModelSubgraphs(\"graphql\", models);\n }\n\n await this.#createSupergraphGateway();\n\n return this.updateRouter();\n }\n\n /**\n * Regenerate document model subgraphs when models are dynamically loaded.\n * Fetches current modules from reactor client (source of truth).\n */\n async regenerateDocumentModelSubgraphs(): Promise<void> {\n if (!this.featureFlags.enableDocumentModelSubgraphs) {\n return;\n }\n\n try {\n const modulesResult = await this.reactorClient.getDocumentModelModules();\n const models = modulesResult.results;\n\n // Update cached models for schema generation\n this.cachedDocumentModels = models;\n\n await this.#setupDocumentModelSubgraphs(\"graphql\", models);\n await this.updateRouter();\n this.logger.info(\n \"Regenerated document model subgraphs with @count models\",\n models.length,\n );\n } catch (error) {\n this.logger.error(\"Failed to regenerate document model subgraphs\", error);\n throw error;\n }\n }\n\n async #setupCoreSubgraphs(\n supergraph: string,\n coreSubgraphs: SubgraphClass[],\n ) {\n for (const subgraph of coreSubgraphs) {\n try {\n await this.registerSubgraph(subgraph, supergraph, true);\n } catch (error) {\n this.logger.error(\n `Failed to setup core subgraph ${subgraph.name}`,\n error,\n );\n }\n }\n\n return this.#setupSubgraphs(this.coreSubgraphsMap);\n }\n\n async #setupDocumentModelSubgraphs(\n supergraph: string,\n documentModels: DocumentModelModule[],\n ) {\n const latestDocumentModels =\n filterLatestDocumentModelVersions(documentModels);\n\n for (const documentModel of latestDocumentModels) {\n if (\n DOCUMENT_MODELS_TO_EXCLUDE.includes(\n documentModel.documentModel.global.id,\n )\n ) {\n continue;\n }\n if (!hasOperationSchemas(documentModel)) {\n continue;\n }\n try {\n const subgraphInstance = new DocumentModelSubgraph(documentModel, {\n relationalDb: this.relationalDb,\n analyticsStore: this.analyticsStore,\n reactorClient: this.reactorClient,\n graphqlManager: this,\n syncManager: this.syncManager,\n path: this.path,\n documentPermissionService: this.documentPermissionService,\n authorizationService: this.authorizationService,\n });\n\n await this.#addSubgraphInstance(subgraphInstance, supergraph, false);\n } catch (error) {\n this.logger.error(\n `Failed to setup document model subgraph for ${documentModel.documentModel.global.id}`,\n error instanceof Error ? error.message : error,\n );\n this.logger.debug(\"@error\", error);\n }\n }\n\n // Document model subgraph instances are added to this.subgraphs above.\n // Their handlers are wired in _updateRouter() → #setupSubgraphs(this.subgraphs),\n // which is called at the end of init() via updateRouter(). We intentionally do\n // NOT call #setupSubgraphs(this.coreSubgraphsMap) here - doing so would\n // create duplicate Apollo servers for the same core-subgraph schemas, which\n // in the new IGatewayAdapter architecture hangs #waitForServer and blocks init().\n }\n\n async #addSubgraphInstance(\n subgraphInstance: ISubgraph,\n supergraph = \"\",\n core = false,\n ) {\n const subgraphsMap = core ? this.coreSubgraphsMap : this.subgraphs;\n const subgraphs = subgraphsMap.get(supergraph) ?? [];\n\n const existingSubgraph = subgraphs.find(\n (it) => it.name === subgraphInstance.name,\n );\n\n if (existingSubgraph) {\n this.logger.debug(\n `Skipping duplicate subgraph: ${subgraphInstance.name}`,\n );\n return existingSubgraph;\n }\n\n await subgraphInstance.onSetup?.();\n subgraphs.push(subgraphInstance);\n subgraphsMap.set(supergraph, subgraphs);\n\n if (supergraph !== \"\" && supergraph !== \"graphql\") {\n subgraphsMap.get(\"graphql\")?.push(subgraphInstance);\n }\n\n this.logger.info(\n `Registered ${this.path.endsWith(\"/\") ? this.path : this.path + \"/\"}${supergraph ? supergraph + \"/\" : \"\"}${subgraphInstance.name} subgraph.`,\n );\n return subgraphInstance;\n }\n\n /**\n * Register a pre-constructed subgraph instance.\n * Use this when you need to pass custom dependencies to a subgraph.\n */\n async registerSubgraphInstance(\n subgraphInstance: ISubgraph,\n supergraph = \"\",\n core = false,\n ) {\n return this.#addSubgraphInstance(subgraphInstance, supergraph, core);\n }\n\n /**\n * Get the base path used for subgraph registration.\n */\n getBasePath(): string {\n return this.path;\n }\n\n async registerSubgraph(\n subgraph: SubgraphClass,\n supergraph = \"\",\n core = false,\n ) {\n const subgraphInstance = new subgraph({\n relationalDb: this.relationalDb,\n analyticsStore: this.analyticsStore,\n reactorClient: this.reactorClient,\n graphqlManager: this,\n syncManager: this.syncManager,\n path: this.path,\n documentPermissionService: this.documentPermissionService,\n authorizationService: this.authorizationService,\n });\n\n return this.#addSubgraphInstance(subgraphInstance, supergraph, core);\n }\n\n updateRouter = debounce(this._updateRouter.bind(this), 1000);\n\n private async _updateRouter() {\n this.logger.debug(\"Updating router\");\n\n await this.#setupSubgraphs(this.subgraphs);\n\n try {\n await this.gatewayAdapter.updateSupergraph();\n this.logger.debug(\"Updated Apollo Gateway supergraph\");\n } catch (error) {\n this.logger.error(\"Failed to update Apollo Gateway supergraph\", error);\n }\n\n // Refresh the supergraph-level SSE handler so it picks up\n // any newly registered subscription-enabled subgraphs.\n const superGraphPath = path.join(this.path, \"graphql\");\n this.#setupSupergraphSSE(superGraphPath);\n }\n\n getAdditionalContextFields = () => {\n return this.contextFields;\n };\n\n setAdditionalContextFields(fields: Record<string, any>) {\n this.contextFields = { ...this.contextFields, ...fields };\n }\n\n async #createWebSocketContext(\n connectionParams: Record<string, unknown>,\n ): Promise<Context> {\n let user = null;\n\n if (this.authService) {\n user =\n await this.authService.authenticateWebSocketConnection(\n connectionParams,\n );\n }\n\n const context: Context = {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n headers: connectionParams as any,\n db: this.relationalDb,\n ...this.getAdditionalContextFields(),\n };\n\n if (user) {\n context.user = user;\n }\n\n return context;\n }\n\n #makeContextFactory(): GatewayContextFactory<Context> {\n return (request: Request): Promise<Context> => {\n const authCtx = getAuthContext(request);\n const headers: IncomingHttpHeaders = {};\n request.headers.forEach((v, k) => {\n headers[k] = v;\n });\n return Promise.resolve<Context>({\n headers,\n db: this.relationalDb,\n ...this.getAdditionalContextFields(),\n user: authCtx?.user,\n isAdmin: authCtx\n ? (addr) =>\n !authCtx.auth_enabled\n ? true\n : authCtx.admins.includes(addr.toLowerCase())\n : () => true,\n });\n };\n }\n\n #makeWsContextFactory() {\n return (connectionParams: Record<string, unknown>): Promise<Context> =>\n this.#createWebSocketContext(connectionParams);\n }\n\n setSupergraph(supergraph: string, subgraphs: ISubgraph[]) {\n this.subgraphs.set(supergraph, subgraphs);\n const globalSubgraphs = this.subgraphs.get(\"graphql\");\n if (globalSubgraphs) {\n this.subgraphs.set(\"graphql\", [...globalSubgraphs, ...subgraphs]);\n } else {\n this.subgraphs.set(\"graphql\", subgraphs);\n }\n return this.updateRouter();\n }\n\n async shutdown(): Promise<void> {\n this.logger.info(\"Shutting down GraphQL Manager\");\n\n // Dispose per-subgraph WebSocket handlers before closing the WS server.\n for (const disposer of this.subgraphWsDisposers.values()) {\n await disposer.dispose();\n }\n this.subgraphWsDisposers.clear();\n\n // Stop all Apollo servers (per-subgraph + federation gateway) via the adapter.\n await this.gatewayAdapter.stop();\n\n return new Promise((resolve) => {\n this.wsServer.close(() => {\n this.logger.info(\"WebSocket server closed\");\n resolve();\n });\n });\n }\n\n #getSubgraphPath(subgraph: ISubgraph, supergraph: string) {\n return path.join(subgraph.path ?? \"\", supergraph, subgraph.name);\n }\n\n async #setupSubgraphs(subgraphsMap: Map<string, ISubgraph[]>) {\n for (const [supergraph, subgraphs] of subgraphsMap.entries()) {\n for (const subgraph of subgraphs) {\n this.logger.debug(`Setting up subgraph ${subgraph.name}`);\n const subgraphPath = this.#getSubgraphPath(subgraph, supergraph);\n try {\n // Skip if handler already cached - subgraphs are deduplicated by name\n // in #addSubgraphInstance, so a cached path means the schema is unchanged.\n // This prevents unbounded schema/server creation across repeated\n // _updateRouter() calls. The handler was already mounted on first setup,\n // so no re-mount is needed.\n if (this.subgraphHandlerCache.has(subgraphPath)) {\n continue;\n }\n\n const schema = createSchema(\n this.cachedDocumentModels,\n subgraph.resolvers,\n subgraph.typeDefs,\n );\n\n const rawHandler = await this.gatewayAdapter.createHandler(\n schema,\n this.#makeContextFactory(),\n );\n const fetchHandler = this.#authMiddleware\n ? this.#authMiddleware(rawHandler)\n : rawHandler;\n this.subgraphHandlerCache.set(subgraphPath, fetchHandler);\n this.httpAdapter.mount(subgraphPath, fetchHandler);\n\n if (subgraph.hasSubscriptions) {\n try {\n const existingDisposer =\n this.subgraphWsDisposers.get(subgraphPath);\n if (existingDisposer) {\n this.logger.warn(\n \"Overwriting existing WebSocket disposer for subgraph at path @path\",\n subgraphPath,\n );\n }\n const wsDisposer = this.gatewayAdapter.attachWebSocket(\n this.wsServer,\n schema,\n this.#makeWsContextFactory(),\n );\n this.subgraphWsDisposers.set(subgraphPath, wsDisposer);\n this.logger.debug(\n `WebSocket subscriptions enabled for ${subgraph.name}`,\n );\n } catch (error) {\n this.logger.error(\n \"Failed to setup websocket for subgraph @name at path @path: @error\",\n subgraph.name,\n subgraphPath,\n error,\n );\n }\n\n // Set up SSE (Server-Sent Events) transport alongside WebSocket.\n // Clients can use SSE by sending POST requests with\n // Accept: text/event-stream to the /stream sub-path.\n try {\n this.#setupSSEHandler(schema, subgraphPath);\n this.logger.debug(\n `SSE subscriptions enabled for ${subgraph.name}`,\n );\n } catch (error) {\n this.logger.error(\n \"Failed to setup SSE for subgraph @name at path @path: @error\",\n subgraph.name,\n subgraphPath,\n error,\n );\n }\n }\n } catch (error) {\n this.logger.error(\n \"Failed to setup subgraph @name at path @path: @error\",\n subgraph.name,\n subgraphPath,\n error,\n );\n }\n }\n }\n }\n\n #getAllSubgraphs() {\n const subgraphsMap = new Map<string, ISubgraph>();\n for (const [supergraph, subgraphs] of [\n ...this.coreSubgraphsMap.entries(),\n ...this.subgraphs.entries(),\n ]) {\n if (supergraph === \"\") {\n continue;\n }\n\n for (const subgraph of subgraphs) {\n const subgraphPath = this.#getSubgraphPath(subgraph, supergraph);\n subgraphsMap.set(subgraphPath, subgraph);\n }\n }\n return subgraphsMap;\n }\n\n #buildSubgraphSchemaModule(subgraph: ISubgraph) {\n return buildSubgraphSchemaModule(\n this.cachedDocumentModels,\n subgraph.resolvers,\n subgraph.typeDefs,\n );\n }\n\n #getSubgraphDefinitions(): SubgraphDefinition[] {\n const subgraphs = this.#getAllSubgraphs();\n\n const herokuOrLocal = process.env.HEROKU_APP_DEFAULT_DOMAIN_NAME\n ? `https://${process.env.HEROKU_APP_DEFAULT_DOMAIN_NAME}`\n : `http://localhost:${this.port}`;\n\n return Array.from(subgraphs.entries()).map(([subgraphPath, subgraph]) => ({\n name: subgraphPath.replace(\"/\", \":\"),\n typeDefs: this.#buildSubgraphSchemaModule(subgraph).typeDefs,\n url: `${herokuOrLocal}${subgraphPath}`,\n }));\n }\n\n async #createSupergraphGateway() {\n const superGraphPath = path.join(this.path, \"graphql\");\n const rawHandler: FetchHandler =\n await this.gatewayAdapter.createSupergraphHandler(\n () => this.#getSubgraphDefinitions(),\n this.httpServer,\n this.#makeContextFactory(),\n );\n const fetchHandler = this.#authMiddleware\n ? this.#authMiddleware(rawHandler)\n : rawHandler;\n this.httpAdapter.mount(superGraphPath, fetchHandler);\n\n // Set up SSE subscriptions at the supergraph level (/graphql/stream).\n // Build a subscription schema from all subgraphs that define subscriptions.\n this.#setupSupergraphSSE(superGraphPath);\n\n if (!this.initialized) {\n this.logger.info(`Registered ${superGraphPath} supergraph `);\n this.initialized = true;\n }\n return;\n }\n\n /**\n * Set up an SSE subscription endpoint at the supergraph level.\n * Merges the schemas of all subscription-enabled subgraphs so that\n * clients can subscribe at /graphql/stream without knowing individual\n * subgraph paths.\n */\n #setupSupergraphSSE(superGraphPath: string) {\n const allSubgraphs = this.#getAllSubgraphs();\n\n const modules = Array.from(allSubgraphs.values())\n .filter((subgraph) => subgraph.hasSubscriptions)\n .map((subgraph) => this.#buildSubgraphSchemaModule(subgraph));\n\n if (modules.length === 0) {\n return;\n }\n\n try {\n const mergedSchema = createMergedSchema(modules);\n this.#setupSSEHandler(mergedSchema, superGraphPath);\n this.logger.debug(\n `SSE subscriptions enabled at supergraph level (merged from ${modules.length} subgraph(s))`,\n );\n } catch (error) {\n this.logger.error(\"Failed to setup supergraph SSE: @error\", error);\n }\n }\n\n /**\n * Set up a GraphQL-over-SSE handler at `<basePath>/stream`.\n *\n * Clients subscribe by sending a POST with `Accept: text/event-stream`\n * to the `/stream` sub-path. Authentication is handled by the normal\n * Express middleware (Authorization header), unlike WebSocket which\n * needs its own connectionParams-based auth.\n */\n #setupSSEHandler(schema: GraphQLSchema, basePath: string) {\n const ssePath = basePath + \"/stream\";\n const rawHandler = createGraphQLSSEHandler({\n schema,\n contextFactory: this.#makeContextFactory(),\n });\n const handler = this.#authMiddleware\n ? this.#authMiddleware(rawHandler)\n : rawHandler;\n this.httpAdapter.mount(ssePath, handler, { exact: true });\n }\n}\n","import { GraphQLError } from \"graphql\";\nimport type { PackageManagementService } from \"../../services/package-management.service.js\";\nimport type { InstalledPackageInfo } from \"../../services/package-storage.js\";\nimport type { Context } from \"../types.js\";\n\nfunction requireAdmin(ctx: Context): void {\n const isAdmin = ctx.isAdmin?.(ctx.user?.address ?? \"\") ?? false;\n if (!isAdmin) {\n throw new GraphQLError(\"Admin access required\");\n }\n}\n\nfunction formatPackageInfo(info: InstalledPackageInfo) {\n return {\n name: info.name,\n version: info.version ?? null,\n registryUrl: info.registryUrl,\n installedAt: info.installedAt.toISOString(),\n documentTypes: info.documentTypes,\n };\n}\n\nexport async function installedPackages(\n service: PackageManagementService,\n): Promise<ReturnType<typeof formatPackageInfo>[]> {\n const packages = await service.getInstalledPackages();\n return packages.map(formatPackageInfo);\n}\n\nexport async function installedPackage(\n service: PackageManagementService,\n args: { name: string },\n): Promise<ReturnType<typeof formatPackageInfo> | null> {\n const pkg = await service.getInstalledPackage(args.name);\n return pkg ? formatPackageInfo(pkg) : null;\n}\n\nexport async function installPackage(\n service: PackageManagementService,\n args: { name: string; registryUrl?: string | null },\n ctx: Context,\n): Promise<{\n package: ReturnType<typeof formatPackageInfo>;\n documentModelsLoaded: number;\n}> {\n requireAdmin(ctx);\n\n const result = await service.installPackage(\n args.name,\n args.registryUrl ?? undefined,\n );\n\n return {\n package: formatPackageInfo(result.package),\n documentModelsLoaded: result.documentModelsLoaded,\n };\n}\n\nexport async function uninstallPackage(\n service: PackageManagementService,\n args: { name: string },\n ctx: Context,\n): Promise<boolean> {\n requireAdmin(ctx);\n\n return service.uninstallPackage(args.name);\n}\n","\"# Packages Subgraph Schema\\n# Provides operations for runtime package management\\n\\nscalar DateTime\\n\\n# Information about an installed package\\ntype InstalledPackage {\\n # Package name (e.g., \\\"@powerhousedao/vetra\\\")\\n name: String!\\n # Package version if known\\n version: String\\n # Registry URL where the package was installed from\\n registryUrl: String!\\n # Timestamp when the package was installed\\n installedAt: DateTime!\\n # Document type IDs provided by this package\\n documentTypes: [String!]!\\n}\\n\\n# Result returned after installing a package\\ntype InstallPackageResult {\\n # The installed package information\\n package: InstalledPackage!\\n # Number of document models loaded from the package\\n documentModelsLoaded: Int!\\n}\\n\\ntype PackagesQueries {\\n # Get all installed packages\\n installedPackages: [InstalledPackage!]!\\n\\n # Get information about a specific installed package\\n installedPackage(name: String!): InstalledPackage\\n}\\n\\ntype PackagesMutations {\\n # Install a package from the registry (requires admin access)\\n installPackage(\\n # Package name (e.g., \\\"@powerhousedao/vetra\\\")\\n name: String!\\n # Registry URL (uses default if not provided)\\n registryUrl: String\\n ): InstallPackageResult!\\n\\n # Uninstall a package (requires admin access)\\n uninstallPackage(\\n # Package name to uninstall\\n name: String!\\n ): Boolean!\\n}\\n\\ntype Query {\\n Packages: PackagesQueries!\\n}\\n\\ntype Mutation {\\n Packages: PackagesMutations!\\n}\\n\"","import { ConsoleLogger } from \"document-model\";\nimport { gql } from \"graphql-tag\";\nimport type { PackageManagementService } from \"../../services/package-management.service.js\";\nimport { BaseSubgraph } from \"../base-subgraph.js\";\nimport type { Context, SubgraphArgs } from \"../types.js\";\nimport * as resolvers from \"./resolvers.js\";\nimport schemaSource from \"./schema.graphql\";\n\nexport interface PackagesSubgraphArgs extends SubgraphArgs {\n packageManagementService: PackageManagementService;\n}\n\nexport class PackagesSubgraph extends BaseSubgraph {\n private logger = new ConsoleLogger([\"PackagesSubgraph\"]);\n private packageManagementService: PackageManagementService;\n\n constructor(args: PackagesSubgraphArgs) {\n super(args);\n this.packageManagementService = args.packageManagementService;\n this.logger.verbose(`constructor()`);\n }\n\n name = \"packages\";\n hasSubscriptions = false;\n\n typeDefs = gql(schemaSource);\n\n resolvers = {\n Query: {\n Packages: () => ({}),\n },\n PackagesQueries: {\n installedPackages: async () => {\n this.logger.debug(\"installedPackages\");\n try {\n return await resolvers.installedPackages(\n this.packageManagementService,\n );\n } catch (error) {\n this.logger.error(\"Error in installedPackages:\", error);\n throw error;\n }\n },\n\n installedPackage: async (_parent: unknown, args: { name: string }) => {\n this.logger.debug(\"installedPackage\", args);\n try {\n return await resolvers.installedPackage(\n this.packageManagementService,\n args,\n );\n } catch (error) {\n this.logger.error(\"Error in installedPackage:\", error);\n throw error;\n }\n },\n },\n\n Mutation: {\n Packages: () => ({}),\n },\n\n PackagesMutations: {\n installPackage: async (\n _parent: unknown,\n args: { name: string; registryUrl?: string | null },\n ctx: Context,\n ) => {\n this.logger.debug(\"installPackage\", args);\n try {\n return await resolvers.installPackage(\n this.packageManagementService,\n args,\n ctx,\n );\n } catch (error) {\n this.logger.error(\"Error in installPackage:\", error);\n throw error;\n }\n },\n\n uninstallPackage: async (\n _parent: unknown,\n args: { name: string },\n ctx: Context,\n ) => {\n this.logger.debug(\"uninstallPackage\", args);\n try {\n return await resolvers.uninstallPackage(\n this.packageManagementService,\n args,\n ctx,\n );\n } catch (error) {\n this.logger.error(\"Error in uninstallPackage:\", error);\n throw error;\n }\n },\n },\n };\n\n onSetup(): Promise<void> {\n this.logger.debug(\"Setting up PackagesSubgraph\");\n return Promise.resolve();\n }\n}\n","/**\n * Pinned CDN versions for GraphiQL playground dependencies.\n * Using pinned versions avoids unpkg.com redirect issues that can\n * trigger CORS errors in the browser.\n */\nconst CDN_VERSIONS = {\n react: \"18.3.1\",\n reactDom: \"18.3.1\",\n graphiql: \"3.8.3\",\n pluginExplorer: \"4.0.0\",\n};\n\nexport function renderGraphqlPlayground(\n url: string,\n query?: string,\n headers: Record<string, string> = {},\n): string {\n return `<!doctype html>\n <html lang=\"en\">\n <head>\n <title>GraphiQL</title>\n <style>\n body {\n height: 100%;\n margin: 0;\n width: 100%;\n overflow: hidden;\n }\n\n #graphiql {\n height: 100vh;\n }\n </style>\n <script\n src=\"https://unpkg.com/react@${CDN_VERSIONS.react}/umd/react.production.min.js\"\n ></script>\n <script\n src=\"https://unpkg.com/react-dom@${CDN_VERSIONS.reactDom}/umd/react-dom.production.min.js\"\n ></script>\n <script\n src=\"https://unpkg.com/graphiql@${CDN_VERSIONS.graphiql}/graphiql.min.js\"\n ></script>\n <link rel=\"stylesheet\" href=\"https://unpkg.com/graphiql@${CDN_VERSIONS.graphiql}/graphiql.min.css\" />\n <script\n src=\"https://unpkg.com/@graphiql/plugin-explorer@${CDN_VERSIONS.pluginExplorer}/dist/index.umd.js\"\n ></script>\n <link\n rel=\"stylesheet\"\n href=\"https://unpkg.com/@graphiql/plugin-explorer@${CDN_VERSIONS.pluginExplorer}/dist/style.css\"\n />\n </head>\n\n <body>\n <div id=\"graphiql\">Loading...</div>\n <script>\n var fetcher = GraphiQL.createFetcher({\n url: '${url}',\n headers: ${JSON.stringify(headers)}\n });\n var defaultQuery = ${query ? `\\`${query}\\`` : undefined};\n\n if (defaultQuery) {\n var sessionQuery = localStorage.getItem(\"graphiql:query\");\n if (sessionQuery) {\n localStorage.setItem(\"graphiql:query\", defaultQuery);\n }\n }\n\n var explorerPlugin = GraphiQLPluginExplorer.explorerPlugin();\n\n function GraphiQLWithExplorer() {\n return React.createElement(GraphiQL, {\n fetcher: fetcher,\n defaultEditorToolsVisibility: true,\n plugins: [explorerPlugin],\n defaultQuery\n });\n }\n\n const root = ReactDOM.createRoot(document.getElementById('graphiql'));\n root.render(React.createElement(GraphiQLWithExplorer));\n </script>\n </body>\n </html>`;\n}\n","import type { DocumentNode } from \"graphql\";\nimport { print } from \"graphql\";\nimport type { Requester } from \"./gen/graphql.js\";\n\nexport type FetchLike = (\n input: URL | string,\n init: RequestInit,\n) => Promise<Response>;\n\ninterface GraphQLResponse<T = unknown> {\n data?: T;\n errors?: Array<{ message: string; locations?: unknown; path?: unknown }>;\n}\n\nexport function createFetchRequester(\n url: string,\n fetchImpl: FetchLike,\n baseHeaders: Record<string, string> = {},\n): Requester {\n return async <R, V>(document: DocumentNode, variables?: V) => {\n const res = await fetchImpl(url, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...baseHeaders,\n },\n body: JSON.stringify({ query: print(document), variables }),\n });\n\n if (!res.ok) {\n throw new Error(`GraphQL HTTP ${res.status}`);\n }\n\n const json = (await res.json()) as GraphQLResponse<R>;\n if (json.errors) {\n throw new Error(JSON.stringify(json.errors));\n }\n\n return json.data as R;\n };\n}\n","import { z } from \"zod\";\n\n// Scalar DTOs\nexport const JSONObjectDTO = z.unknown();\nexport const DateTimeDTO = z.union([z.string(), z.date()]);\n\nexport const DocumentModelStateDTO = z\n .object({\n id: z.string(),\n name: z.string(),\n namespace: z.string().nullable().optional(),\n version: z.string().nullable().optional(),\n specification: JSONObjectDTO.nullable().optional(),\n })\n .strip();\n\nexport const DocumentModelResultPageDTO = z\n .object({\n items: z.array(DocumentModelStateDTO),\n totalCount: z.number().int(),\n hasNextPage: z.boolean(),\n hasPreviousPage: z.boolean(),\n cursor: z.string().nullable().optional(),\n })\n .strip();\n\nexport const RevisionEntryDTO = z\n .object({\n scope: z.string(),\n revision: z.number().int(),\n })\n .strip();\n\nexport const PHDocumentDTO = z\n .object({\n id: z.string(),\n slug: z.string().nullable().optional(),\n name: z.string(),\n documentType: z.string(),\n state: JSONObjectDTO,\n revisionsList: z.array(RevisionEntryDTO),\n createdAtUtcIso: DateTimeDTO,\n lastModifiedAtUtcIso: DateTimeDTO,\n })\n .strip();\n\nexport const PHDocumentResultPageDTO = z\n .object({\n items: z.array(PHDocumentDTO),\n totalCount: z.number().int(),\n hasNextPage: z.boolean(),\n hasPreviousPage: z.boolean(),\n cursor: z.string().nullable().optional(),\n })\n .strip();\n\nexport const DocumentWithChildrenDTO = z\n .object({\n document: PHDocumentDTO,\n childIds: z.array(z.string()),\n })\n .strip();\n\nexport const MoveChildrenResultDTO = z\n .object({\n source: PHDocumentDTO,\n target: PHDocumentDTO,\n })\n .strip();\n\nexport const JobInfoDTO = z\n .object({\n id: z.string(),\n status: z.string(),\n result: JSONObjectDTO.nullable().optional(),\n error: z.string().nullable().optional(),\n createdAt: DateTimeDTO,\n completedAt: DateTimeDTO.nullable().optional(),\n })\n .strip();\n\n// Operation DTOs for GetDocumentOperations\nexport const ActionSignerUserDTO = z\n .object({\n address: z.string(),\n networkId: z.string(),\n chainId: z.number().int(),\n })\n .strip();\n\nexport const ActionSignerAppDTO = z\n .object({\n name: z.string(),\n key: z.string(),\n })\n .strip();\n\nexport const ActionSignerDTO = z\n .object({\n signatures: z.array(z.string()),\n user: ActionSignerUserDTO.nullable().optional(),\n app: ActionSignerAppDTO.nullable().optional(),\n })\n .strip();\n\nexport const ActionContextDTO = z\n .object({\n signer: ActionSignerDTO.nullable().optional(),\n })\n .strip();\n\nexport const AttachmentDTO = z\n .object({\n data: z.string(),\n mimeType: z.string(),\n hash: z.string(),\n extension: z.string().nullable().optional(),\n fileName: z.string().nullable().optional(),\n })\n .strip();\n\nexport const OperationActionDTO = z\n .object({\n id: z.string(),\n type: z.string(),\n timestampUtcMs: z.string(),\n input: z.unknown(),\n scope: z.string(),\n attachments: z.array(AttachmentDTO).nullable().optional(),\n context: ActionContextDTO.nullable().optional(),\n })\n .strip();\n\nexport const OperationDTO = z\n .object({\n index: z.number().int(),\n timestampUtcMs: z.string(),\n hash: z.string(),\n skip: z.number().int(),\n error: z.string().nullable().optional(),\n id: z.string().nullable().optional(),\n action: OperationActionDTO,\n })\n .strip();\n\nexport const OperationResultPageDTO = z\n .object({\n items: z.array(OperationDTO),\n totalCount: z.number().int(),\n hasNextPage: z.boolean(),\n hasPreviousPage: z.boolean(),\n cursor: z.string().nullable().optional(),\n })\n .strip();\n\nexport const DocumentWithChildrenAndOperationsDTO = z\n .object({\n document: PHDocumentDTO.extend({\n operations: OperationResultPageDTO.optional(),\n }),\n childIds: z.array(z.string()),\n })\n .strip();\n\nexport const DocumentChangeContextDTO = z\n .object({\n parentId: z.string().nullable().optional(),\n childId: z.string().nullable().optional(),\n })\n .strip();\n\nexport const DocumentChangeEventDTO = z\n .object({\n type: z.string(),\n documents: z.array(PHDocumentDTO),\n context: DocumentChangeContextDTO.nullable().optional(),\n })\n .strip();\n\nexport const JobChangeEventDTO = z\n .object({\n jobId: z.string(),\n status: z.string(),\n result: JSONObjectDTO.nullable().optional(),\n error: z.string().nullable().optional(),\n })\n .strip();\n","import type { DocumentNode, OperationDefinitionNode } from \"graphql\";\nimport { Kind } from \"graphql\";\nimport type {\n DocumentModelResultPage,\n JobInfo,\n PhDocumentResultPage,\n Requester,\n Sdk,\n} from \"./gen/graphql.js\";\nimport type { FetchLike } from \"./requester.js\";\nimport { createFetchRequester } from \"./requester.js\";\nimport {\n DocumentChangeEventDTO,\n DocumentModelResultPageDTO,\n DocumentWithChildrenAndOperationsDTO,\n DocumentWithChildrenDTO,\n JobChangeEventDTO,\n JobInfoDTO,\n MoveChildrenResultDTO,\n OperationResultPageDTO,\n PHDocumentDTO,\n PHDocumentResultPageDTO,\n} from \"./validation.js\";\n\ntype OperationName = keyof Sdk;\ntype OperationHandler = (data: Record<string, unknown>) => void;\n\n// This type enforces that ALL operations from Sdk must have a handler\n// TypeScript will error if any operation is missing\ntype OperationValidators = { [K in OperationName]: OperationHandler };\n\n// Validation handlers for each operation\n// TypeScript will error if any operation from Sdk is missing\nconst operationValidators: OperationValidators = {\n GetDocument: (data) => {\n if (data.document) {\n DocumentWithChildrenDTO.parse(data.document);\n }\n },\n GetDocumentWithOperations: (data) => {\n if (data.document) {\n DocumentWithChildrenAndOperationsDTO.parse(data.document);\n }\n },\n GetDocumentModels: (data) => {\n if (data.documentModels) {\n DocumentModelResultPageDTO.parse(\n data.documentModels as DocumentModelResultPage,\n );\n }\n },\n GetDocumentChildren: (data) => {\n if (data.documentChildren) {\n PHDocumentResultPageDTO.parse(\n data.documentChildren as PhDocumentResultPage,\n );\n }\n },\n GetDocumentParents: (data) => {\n if (data.documentParents) {\n PHDocumentResultPageDTO.parse(\n data.documentParents as PhDocumentResultPage,\n );\n }\n },\n FindDocuments: (data) => {\n if (data.findDocuments) {\n PHDocumentResultPageDTO.parse(data.findDocuments as PhDocumentResultPage);\n }\n },\n GetDocumentOperations: (data) => {\n if (data.documentOperations) {\n OperationResultPageDTO.parse(data.documentOperations);\n }\n },\n GetJobStatus: (data) => {\n if (data.jobStatus) {\n JobInfoDTO.parse(data.jobStatus as JobInfo);\n }\n },\n // Mutations\n CreateDocument: (data) => {\n if (data.createDocument) {\n PHDocumentDTO.parse(data.createDocument);\n }\n },\n CreateEmptyDocument: (data) => {\n if (data.createEmptyDocument) {\n PHDocumentDTO.parse(data.createEmptyDocument);\n }\n },\n MutateDocument: (data) => {\n if (data.mutateDocument) {\n PHDocumentDTO.parse(data.mutateDocument);\n }\n },\n MutateDocumentAsync: (data) => {\n if (data.mutateDocumentAsync) {\n // Returns a job ID string\n }\n },\n RenameDocument: (data) => {\n if (data.renameDocument) {\n PHDocumentDTO.parse(data.renameDocument);\n }\n },\n AddChildren: (data) => {\n if (data.addChildren) {\n PHDocumentDTO.parse(data.addChildren);\n }\n },\n RemoveChildren: (data) => {\n if (data.removeChildren) {\n PHDocumentDTO.parse(data.removeChildren);\n }\n },\n MoveChildren: (data) => {\n if (data.moveChildren) {\n MoveChildrenResultDTO.parse(data.moveChildren);\n }\n },\n DeleteDocument: (data) => {\n if (data.deleteDocument !== undefined) {\n // Returns a boolean\n }\n },\n DeleteDocuments: (data) => {\n if (data.deleteDocuments !== undefined) {\n // Returns a boolean\n }\n },\n // Subscriptions\n DocumentChanges: (data) => {\n if (data.documentChanges) {\n DocumentChangeEventDTO.parse(data.documentChanges);\n }\n },\n JobChanges: (data) => {\n if (data.jobChanges) {\n JobChangeEventDTO.parse(data.jobChanges);\n }\n },\n // Sync operations (used inline by reactor/gql-req-channel.ts, not through this SDK)\n PollSyncEnvelopes: () => {},\n TouchChannel: () => {},\n PushSyncEnvelopes: () => {},\n};\n\nexport function createValidatingRequester(\n url: string,\n fetchImpl: FetchLike,\n headers?: Record<string, string>,\n): Requester {\n const base = createFetchRequester(url, fetchImpl, headers);\n return async <R, V>(\n document: DocumentNode,\n variables?: V,\n options?: RequestInit,\n ): Promise<R> => {\n const data = (await base(document, variables, options)) as R;\n\n // Extract operation name from the document\n const operationDef = document.definitions.find(\n (d): d is OperationDefinitionNode =>\n d.kind === Kind.OPERATION_DEFINITION && !!d.name,\n );\n const operationName = operationDef?.name?.value;\n\n // Validate based on operation name\n if (data && operationName && operationName in operationValidators) {\n const validator = operationValidators[operationName as OperationName];\n validator(data as Record<string, unknown>);\n }\n\n return data;\n };\n}\n","import { getSdk } from \"./gen/graphql.js\";\nimport type { FetchLike } from \"./requester.js\";\nimport { createValidatingRequester } from \"./requester.with-zod.js\";\n\nexport function createReactorGraphQLClient(\n url: string,\n fetchImpl: FetchLike = fetch,\n headers?: Record<string, string>,\n) {\n const requester = createValidatingRequester(url, fetchImpl, headers);\n return getSdk(requester);\n}\n","\"# Scalar types (for codegen - also defined in create-schema.ts)\\nscalar JSONObject\\nscalar DateTime\\n\\n# Input types\\ninput PagingInput {\\n limit: Int\\n offset: Int\\n cursor: String\\n}\\n\\ninput ViewFilterInput {\\n branch: String\\n scopes: [String!]\\n}\\n\\ninput SearchFilterInput {\\n type: String\\n parentId: String\\n identifiers: [String!]\\n}\\n\\ninput OperationsFilterInput {\\n documentId: String!\\n branch: String\\n scopes: [String!]\\n actionTypes: [String!]\\n sinceRevision: Int\\n timestampFrom: String\\n timestampTo: String\\n}\\n\\ninput DocumentOperationsFilterInput {\\n branch: String\\n scopes: [String!]\\n actionTypes: [String!]\\n sinceRevision: Int\\n timestampFrom: String\\n timestampTo: String\\n}\\n\\n# Enums\\nenum PropagationMode {\\n CASCADE\\n ORPHAN\\n}\\n\\nenum DocumentChangeType {\\n CREATED\\n DELETED\\n UPDATED\\n PARENT_ADDED\\n PARENT_REMOVED\\n CHILD_ADDED\\n CHILD_REMOVED\\n}\\n\\n# Object types\\ntype DocumentModelGlobalState {\\n id: String!\\n name: String!\\n namespace: String\\n version: String\\n specification: JSONObject!\\n}\\n\\ntype DocumentModelResultPage {\\n items: [DocumentModelGlobalState!]!\\n totalCount: Int!\\n hasNextPage: Boolean!\\n hasPreviousPage: Boolean!\\n cursor: String\\n}\\n\\ntype Revision {\\n scope: String!\\n revision: Int!\\n}\\n\\ntype PHDocument {\\n id: String!\\n slug: String\\n preferredEditor: String\\n name: String!\\n documentType: String!\\n state: JSONObject!\\n revisionsList: [Revision!]!\\n createdAtUtcIso: DateTime!\\n lastModifiedAtUtcIso: DateTime!\\n operations(\\n filter: DocumentOperationsFilterInput\\n paging: PagingInput\\n ): ReactorOperationResultPage\\n}\\n\\ntype PHDocumentResultPage {\\n items: [PHDocument!]!\\n totalCount: Int!\\n hasNextPage: Boolean!\\n hasPreviousPage: Boolean!\\n cursor: String\\n}\\n\\ntype ReactorOperationResultPage {\\n items: [ReactorOperation!]!\\n totalCount: Int!\\n hasNextPage: Boolean!\\n hasPreviousPage: Boolean!\\n cursor: String\\n}\\n\\ntype DeadLetterInfo {\\n documentId: String!\\n error: String!\\n jobId: String!\\n branch: String!\\n scopes: [String!]!\\n operationCount: Int!\\n}\\n\\ntype PollSyncEnvelopesResult {\\n envelopes: [SyncEnvelope!]!\\n ackOrdinal: Int!\\n deadLetters: [DeadLetterInfo!]!\\n hasMore: Boolean!\\n}\\n\\ntype DocumentWithChildren {\\n document: PHDocument!\\n childIds: [String!]!\\n}\\n\\ntype MoveChildrenResult {\\n source: PHDocument!\\n target: PHDocument!\\n}\\n\\ntype JobInfo {\\n id: String!\\n status: String!\\n result: JSONObject!\\n error: String\\n createdAt: DateTime!\\n completedAt: DateTime\\n}\\n\\ntype DocumentChangeEvent {\\n type: DocumentChangeType!\\n documents: [PHDocument!]!\\n context: DocumentChangeContext\\n}\\n\\ntype DocumentChangeContext {\\n parentId: String\\n childId: String\\n}\\n\\ntype JobChangeEvent {\\n jobId: String!\\n status: String!\\n result: JSONObject!\\n error: String\\n}\\n\\ntype ReactorSignerUser {\\n address: String!\\n networkId: String!\\n chainId: Int!\\n}\\n\\ntype ReactorSignerApp {\\n name: String!\\n key: String!\\n}\\n\\ntype ReactorSigner {\\n user: ReactorSignerUser\\n app: ReactorSignerApp\\n signatures: [String!]!\\n}\\n\\ntype ActionContext {\\n signer: ReactorSigner\\n}\\n\\ntype Action {\\n id: String!\\n type: String!\\n timestampUtcMs: String!\\n input: JSONObject!\\n scope: String!\\n attachments: [Attachment!]\\n context: ActionContext\\n}\\n\\ntype Attachment {\\n data: String!\\n mimeType: String!\\n hash: String!\\n extension: String\\n fileName: String\\n}\\n\\n# Input types for sync operations\\ninput ActionContextInput {\\n signer: ReactorSignerInput\\n}\\n\\ninput ReactorSignerInput {\\n user: ReactorSignerUserInput\\n app: ReactorSignerAppInput\\n signatures: [String!]!\\n}\\n\\ninput ReactorSignerUserInput {\\n address: String!\\n networkId: String!\\n chainId: Int!\\n}\\n\\ninput ReactorSignerAppInput {\\n name: String!\\n key: String!\\n}\\n\\ninput ActionInput {\\n id: String!\\n type: String!\\n timestampUtcMs: String!\\n input: JSONObject!\\n scope: String!\\n attachments: [AttachmentInput!]\\n context: ActionContextInput\\n}\\n\\ninput AttachmentInput {\\n data: String!\\n mimeType: String!\\n hash: String!\\n extension: String\\n fileName: String\\n}\\n\\n# Synchronization types\\ntype ReactorOperation {\\n index: Int!\\n timestampUtcMs: String!\\n hash: String!\\n skip: Int!\\n error: String\\n id: String\\n action: Action!\\n}\\n\\ninput OperationInput {\\n index: Int!\\n timestampUtcMs: String!\\n hash: String!\\n skip: Int!\\n error: String\\n id: String\\n action: ActionInput!\\n}\\n\\ntype OperationContext {\\n documentId: String!\\n documentType: String!\\n scope: String!\\n branch: String!\\n ordinal: Int!\\n}\\n\\ninput OperationContextInput {\\n documentId: String!\\n documentType: String!\\n scope: String!\\n branch: String!\\n ordinal: Int!\\n}\\n\\ntype OperationWithContext {\\n operation: ReactorOperation!\\n context: OperationContext!\\n}\\n\\ninput OperationWithContextInput {\\n operation: OperationInput!\\n context: OperationContextInput!\\n}\\n\\ntype ChannelMeta {\\n id: String!\\n}\\n\\ninput ChannelMetaInput {\\n id: String!\\n}\\n\\ntype RemoteCursor {\\n remoteName: String!\\n cursorOrdinal: Int!\\n lastSyncedAtUtcMs: String\\n}\\n\\ninput RemoteCursorInput {\\n remoteName: String!\\n cursorOrdinal: Int!\\n lastSyncedAtUtcMs: String\\n}\\n\\nenum SyncEnvelopeType {\\n OPERATIONS\\n ACK\\n}\\n\\ntype SyncEnvelope {\\n type: SyncEnvelopeType!\\n channelMeta: ChannelMeta!\\n operations: [OperationWithContext!]\\n cursor: RemoteCursor\\n key: String\\n dependsOn: [String!]\\n}\\n\\ninput SyncEnvelopeInput {\\n type: SyncEnvelopeType!\\n channelMeta: ChannelMetaInput!\\n operations: [OperationWithContextInput!]\\n cursor: RemoteCursorInput\\n key: String\\n dependsOn: [String!]\\n}\\n\\ninput RemoteFilterInput {\\n documentId: [String!]!\\n scope: [String!]!\\n branch: String!\\n}\\n\\ninput TouchChannelInput {\\n id: String!\\n name: String!\\n collectionId: String!\\n filter: RemoteFilterInput!\\n sinceTimestampUtcMs: String!\\n}\\n\\ntype TouchChannelResult {\\n success: Boolean!\\n ackOrdinal: Int!\\n}\\n\\ntype Query {\\n # Get document models for a namespace\\n documentModels(\\n namespace: String\\n paging: PagingInput\\n ): DocumentModelResultPage!\\n\\n # Get a specific document by ID or slug\\n document(identifier: String!, view: ViewFilterInput): DocumentWithChildren\\n\\n # Get children of a document\\n documentChildren(\\n parentIdentifier: String!\\n view: ViewFilterInput\\n paging: PagingInput\\n ): PHDocumentResultPage!\\n\\n # Get parents of a document\\n documentParents(\\n childIdentifier: String!\\n view: ViewFilterInput\\n paging: PagingInput\\n ): PHDocumentResultPage!\\n\\n # Find documents by search criteria\\n findDocuments(\\n search: SearchFilterInput\\n view: ViewFilterInput\\n paging: PagingInput\\n ): PHDocumentResultPage!\\n\\n # Get job status\\n jobStatus(jobId: String!): JobInfo\\n\\n # Get operations for a document with filtering and pagination\\n documentOperations(\\n filter: OperationsFilterInput!\\n paging: PagingInput\\n ): ReactorOperationResultPage!\\n\\n # Poll for sync envelopes from a channel\\n pollSyncEnvelopes(\\n channelId: String!\\n outboxAck: Int!\\n outboxLatest: Int!\\n ): PollSyncEnvelopesResult!\\n}\\n\\ntype Mutation {\\n # Create a new document\\n createDocument(document: JSONObject!, parentIdentifier: String): PHDocument!\\n\\n # Create an empty document of specified type\\n createEmptyDocument(\\n documentType: String!\\n parentIdentifier: String\\n ): PHDocument!\\n\\n # Apply actions to a document (synchronous)\\n mutateDocument(\\n documentIdentifier: String!\\n actions: [JSONObject!]!\\n view: ViewFilterInput\\n ): PHDocument!\\n\\n # Submit actions to a document (asynchronous)\\n mutateDocumentAsync(\\n documentIdentifier: String!\\n actions: [JSONObject!]!\\n view: ViewFilterInput\\n ): String!\\n\\n # Rename a document\\n renameDocument(\\n documentIdentifier: String!\\n name: String!\\n branch: String\\n ): PHDocument!\\n\\n # Add children to a document\\n addChildren(\\n parentIdentifier: String!\\n documentIdentifiers: [String!]!\\n branch: String\\n ): PHDocument!\\n\\n # Remove children from a document\\n removeChildren(\\n parentIdentifier: String!\\n documentIdentifiers: [String!]!\\n branch: String\\n ): PHDocument!\\n\\n # Move children between documents\\n moveChildren(\\n sourceParentIdentifier: String!\\n targetParentIdentifier: String!\\n documentIdentifiers: [String!]!\\n branch: String\\n ): MoveChildrenResult!\\n\\n # Delete a single document\\n deleteDocument(identifier: String!, propagate: PropagationMode): Boolean!\\n\\n # Delete multiple documents\\n deleteDocuments(identifiers: [String!]!, propagate: PropagationMode): Boolean!\\n\\n # Touch (create or update) a channel for sync\\n touchChannel(input: TouchChannelInput!): TouchChannelResult!\\n\\n # Push sync envelopes to a channel\\n pushSyncEnvelopes(envelopes: [SyncEnvelopeInput!]!): Boolean!\\n}\\n\\ntype Subscription {\\n # Subscribe to document changes\\n documentChanges(\\n search: SearchFilterInput\\n view: ViewFilterInput\\n ): DocumentChangeEvent!\\n\\n # Subscribe to job changes\\n jobChanges(jobId: String!): JobChangeEvent!\\n}\\n\"","import type {\n DocumentChangeEvent,\n IReactorClient,\n SearchFilter,\n ViewFilter,\n} from \"@powerhousedao/reactor\";\nimport { PubSub } from \"graphql-subscriptions\";\n\nconst pubSub = new PubSub();\n\nexport function getPubSub(): PubSub {\n return pubSub;\n}\n\nexport type SubscriptionTriggers = {\n DOCUMENT_CHANGES: string;\n JOB_CHANGES: string;\n};\n\nexport const SUBSCRIPTION_TRIGGERS: SubscriptionTriggers = {\n DOCUMENT_CHANGES: \"DOCUMENT_CHANGES\",\n JOB_CHANGES: \"JOB_CHANGES\",\n};\n\nexport interface DocumentChangesPayload {\n documentChanges: DocumentChangeEvent;\n search: SearchFilter;\n view?: ViewFilter;\n}\n\nexport interface JobChangesPayload {\n jobChanges: {\n jobId: string;\n status: string;\n createdAt: string;\n completedAt: string | null;\n error: string | null;\n result: NonNullable<unknown>;\n };\n jobId: string;\n}\n\nlet globalDocumentUnsubscribe: (() => void) | null = null;\nlet documentSubscriberCount = 0;\n\nexport function ensureGlobalDocumentSubscription(\n reactorClient: IReactorClient,\n): () => void {\n if (documentSubscriberCount === 0) {\n globalDocumentUnsubscribe = reactorClient.subscribe(\n {},\n (event: DocumentChangeEvent) => {\n const payload: DocumentChangesPayload = {\n documentChanges: event,\n search: {},\n view: undefined,\n };\n void pubSub.publish(SUBSCRIPTION_TRIGGERS.DOCUMENT_CHANGES, payload);\n },\n );\n }\n\n documentSubscriberCount++;\n\n return () => {\n documentSubscriberCount--;\n if (documentSubscriberCount === 0 && globalDocumentUnsubscribe) {\n globalDocumentUnsubscribe();\n globalDocumentUnsubscribe = null;\n }\n };\n}\n\nconst activeJobSubscriptions = new Map<\n string,\n {\n cancel: () => void;\n refCount: number;\n }\n>();\n\nexport function ensureJobSubscription(\n reactorClient: IReactorClient,\n jobId: string,\n): () => void {\n let subscription = activeJobSubscriptions.get(jobId);\n\n if (!subscription) {\n let isCancelled = false;\n let timeoutId: NodeJS.Timeout | undefined;\n\n const poll = async () => {\n if (isCancelled) {\n return;\n }\n\n const jobInfo = await reactorClient.getJobStatus(jobId);\n const payload: JobChangesPayload = {\n jobChanges: {\n jobId: jobInfo.id,\n status: jobInfo.status,\n createdAt: jobInfo.createdAtUtcIso,\n completedAt: jobInfo.completedAtUtcIso ?? null,\n error: jobInfo.error?.message ?? null,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n result: jobInfo.result ?? {},\n },\n jobId,\n };\n\n void pubSub.publish(SUBSCRIPTION_TRIGGERS.JOB_CHANGES, payload);\n\n const isTerminal =\n String(jobInfo.status) === \"FAILED\" ||\n String(jobInfo.status) === \"READ_MODELS_READY\" ||\n jobInfo.completedAtUtcIso !== undefined;\n\n if (!isTerminal && !isCancelled) {\n timeoutId = setTimeout(() => {\n void poll().catch((error) => {\n console.error(\"Error polling job status:\", error);\n });\n }, 1000);\n } else if (isTerminal) {\n activeJobSubscriptions.delete(jobId);\n }\n };\n\n void poll().catch((error) => {\n console.error(\"Error starting job polling:\", error);\n });\n\n const cancel = () => {\n isCancelled = true;\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n };\n\n subscription = { cancel, refCount: 0 };\n activeJobSubscriptions.set(jobId, subscription);\n }\n\n subscription.refCount++;\n\n return () => {\n if (subscription) {\n subscription.refCount--;\n if (subscription.refCount === 0) {\n subscription.cancel();\n activeJobSubscriptions.delete(jobId);\n }\n }\n };\n}\n","import { ConsoleLogger } from \"document-model\";\nimport { GraphQLError } from \"graphql\";\nimport { withFilter } from \"graphql-subscriptions\";\nimport { gql } from \"graphql-tag\";\nimport schemaSource from \"./schema.graphql\";\nimport { BaseSubgraph } from \"../base-subgraph.js\";\nimport type { Context, SubgraphArgs } from \"../types.js\";\nimport {\n matchesJobFilter,\n matchesSearchFilter,\n toGqlDocumentChangeEvent,\n} from \"./adapters.js\";\nimport type { Resolvers } from \"./gen/graphql.js\";\nimport {\n ensureGlobalDocumentSubscription,\n ensureJobSubscription,\n getPubSub,\n SUBSCRIPTION_TRIGGERS,\n type DocumentChangesPayload,\n type JobChangesPayload,\n} from \"./pubsub.js\";\nimport * as resolvers from \"./resolvers.js\";\n\nexport class ReactorSubgraph extends BaseSubgraph {\n // temp\n private logger = new ConsoleLogger([\"ReactorSubgraph\"]);\n\n constructor(args: SubgraphArgs) {\n super(args);\n this.logger.verbose(`constructor()`);\n }\n\n name = \"r\";\n hasSubscriptions = true;\n\n /**\n * Check operation-level permissions for an array of actions.\n * Delegates to base assertCanExecuteOperation for each action.\n */\n private async assertCanExecuteOperations(\n documentId: string,\n actions: readonly unknown[],\n ctx: Context,\n ): Promise<void> {\n for (const action of actions) {\n if (!action || typeof action !== \"object\") continue;\n const actionObj = action as Record<string, unknown>;\n const operationType = actionObj.type;\n if (typeof operationType !== \"string\") continue;\n\n await this.assertCanExecuteOperation(documentId, operationType, ctx);\n }\n }\n\n typeDefs = gql(schemaSource);\n\n resolvers: Resolvers = {\n // Field resolver for PHDocument.operations - fetches operations on demand\n PHDocument: {\n operations: async (parent, args, ctx: Context) => {\n this.logger.debug(\n \"PHDocument.operations(@parent.id, @args)\",\n parent.id,\n args,\n );\n\n await this.assertCanRead(parent.id, ctx);\n\n try {\n // Build the filter using the document's id\n const filter = {\n documentId: parent.id,\n branch: args.filter?.branch,\n scopes: args.filter?.scopes,\n actionTypes: args.filter?.actionTypes,\n sinceRevision: args.filter?.sinceRevision,\n timestampFrom: args.filter?.timestampFrom,\n timestampTo: args.filter?.timestampTo,\n };\n\n return await resolvers.documentOperations(this.reactorClient, {\n filter,\n paging: args.paging,\n });\n } catch (error) {\n this.logger.error(\"Error in PHDocument.operations: @Error\", error);\n throw error;\n }\n },\n },\n\n Query: {\n documentModels: async (_parent, args) => {\n this.logger.debug(\"documentModels(@args)\", args);\n try {\n return await resolvers.documentModels(this.reactorClient, args);\n } catch (error) {\n this.logger.error(\"Error in documentModels: @Error\", error);\n throw error;\n }\n },\n\n document: async (_parent, args, ctx: Context) => {\n this.logger.debug(\"document(@args)\", args);\n try {\n await this.assertCanRead(args.identifier, ctx);\n return await resolvers.document(this.reactorClient, args);\n } catch (error) {\n this.logger.error(\"Error in document: @Error\", error);\n throw error;\n }\n },\n\n documentChildren: async (_parent, args, ctx: Context) => {\n this.logger.debug(\"documentChildren(@args)\", args);\n try {\n await this.assertCanRead(args.parentIdentifier, ctx);\n return await resolvers.documentChildren(this.reactorClient, args);\n } catch (error) {\n this.logger.error(\"Error in documentChildren: @Error\", error);\n throw error;\n }\n },\n\n documentParents: async (_parent, args, ctx: Context) => {\n this.logger.debug(\"documentParents(@args)\", args);\n try {\n await this.assertCanRead(args.childIdentifier, ctx);\n const result = await resolvers.documentParents(\n this.reactorClient,\n args,\n );\n // Filter results to only include documents the user can read\n if (\n !this.hasGlobalAdminAccess(ctx) &&\n this.documentPermissionService\n ) {\n const filteredItems = [];\n for (const item of result.items) {\n const canRead = await this.canReadDocument(item.id, ctx);\n if (canRead) {\n filteredItems.push(item);\n }\n }\n return {\n ...result,\n items: filteredItems,\n };\n }\n\n return result;\n } catch (error) {\n this.logger.error(\"Error in documentParents: @Error\", error);\n throw error;\n }\n },\n\n findDocuments: async (_parent, args, ctx: Context) => {\n this.logger.debug(\"findDocuments(@args)\", args);\n try {\n const result = await resolvers.findDocuments(this.reactorClient, {\n ...args,\n search: args.search ?? {},\n });\n\n // Filter results to only include documents the user can read\n if (\n !this.hasGlobalAdminAccess(ctx) &&\n this.documentPermissionService\n ) {\n const filteredItems = [];\n for (const item of result.items) {\n const canRead = await this.canReadDocument(item.id, ctx);\n if (canRead) {\n filteredItems.push(item);\n }\n }\n return {\n ...result,\n items: filteredItems,\n };\n }\n\n return result;\n } catch (error) {\n this.logger.error(\"Error in findDocuments: @Error\", error);\n throw error;\n }\n },\n\n jobStatus: async (_parent, args) => {\n this.logger.debug(\"jobStatus(@args)\", args);\n try {\n return await resolvers.jobStatus(this.reactorClient, args);\n } catch (error) {\n this.logger.error(\"Error in jobStatus: @Error\", error);\n throw error;\n }\n },\n\n documentOperations: async (_parent, args, ctx: Context) => {\n this.logger.debug(\"documentOperations(@args)\", args);\n try {\n await this.assertCanRead(args.filter.documentId, ctx);\n return await resolvers.documentOperations(this.reactorClient, args);\n } catch (error) {\n this.logger.error(\"Error in documentOperations: @Error\", error);\n throw error;\n }\n },\n\n pollSyncEnvelopes: (\n _parent: unknown,\n args: { channelId: string; outboxAck: number; outboxLatest: number },\n ) => {\n this.logger.debug(\"pollSyncEnvelopes(@args)\", args);\n\n try {\n const { envelopes, ackOrdinal, deadLetters, hasMore } =\n resolvers.pollSyncEnvelopes(this.syncManager, args);\n return {\n envelopes,\n ackOrdinal,\n deadLetters,\n hasMore,\n };\n } catch (error) {\n this.logger.error(\"Error in pollSyncEnvelopes(@args): @Error\", error);\n throw error;\n }\n },\n },\n\n Mutation: {\n createDocument: async (_parent, args, ctx: Context) => {\n this.logger.debug(\"createDocument(@args)\", args);\n try {\n // If creating under a parent, check write permission on parent\n if (args.parentIdentifier) {\n const parent = await resolvers.document(this.reactorClient, {\n identifier: args.parentIdentifier,\n });\n\n await this.assertCanWrite(parent.document.id, ctx);\n } else if (this.authorizationService) {\n if (!ctx.user?.address) {\n throw new GraphQLError(\n \"Forbidden: authentication required to create documents\",\n );\n }\n } else if (!this.hasGlobalAdminAccess(ctx)) {\n throw new GraphQLError(\n \"Forbidden: insufficient permissions to create documents\",\n );\n }\n const result = await resolvers.createDocument(\n this.reactorClient,\n args,\n );\n\n // Auto-ownership: set creator as document owner\n if (this.authorizationService && ctx.user?.address && result?.id) {\n await this.documentPermissionService?.initializeDocumentProtection(\n result.id,\n ctx.user.address,\n this.authorizationService.config.defaultProtection,\n );\n }\n\n return result;\n } catch (error) {\n this.logger.error(\"Error in createDocument(@args): @Error\", error);\n throw error;\n }\n },\n\n createEmptyDocument: async (_parent, args, ctx: Context) => {\n this.logger.debug(\"createEmptyDocument(@args)\", args);\n try {\n // If creating under a parent, check write permission on parent\n if (args.parentIdentifier) {\n const parent = await resolvers.document(this.reactorClient, {\n identifier: args.parentIdentifier,\n });\n\n await this.assertCanWrite(parent.document.id, ctx);\n } else if (this.authorizationService) {\n if (!ctx.user?.address) {\n throw new GraphQLError(\n \"Forbidden: authentication required to create documents\",\n );\n }\n } else if (!this.hasGlobalAdminAccess(ctx)) {\n throw new GraphQLError(\n \"Forbidden: insufficient permissions to create documents\",\n );\n }\n const result = await resolvers.createEmptyDocument(\n this.reactorClient,\n args,\n );\n\n // Auto-ownership: set creator as document owner\n if (this.authorizationService && ctx.user?.address && result?.id) {\n await this.documentPermissionService?.initializeDocumentProtection(\n result.id,\n ctx.user.address,\n this.authorizationService.config.defaultProtection,\n );\n }\n\n return result;\n } catch (error) {\n this.logger.error(\n \"Error in createEmptyDocument(@args): @Error\",\n error,\n );\n throw error;\n }\n },\n\n mutateDocument: async (_parent, args, ctx: Context) => {\n this.logger.debug(\"mutateDocument(@args)\", args);\n try {\n // assertCanExecuteOperations uses canMutate (which combines write + operation checks)\n // when authorizationService is available. For legacy fallback, assertCanWrite is needed.\n if (!this.authorizationService) {\n await this.assertCanWrite(args.documentIdentifier, ctx);\n }\n\n // Check operation-level permissions for each action\n await this.assertCanExecuteOperations(\n args.documentIdentifier,\n args.actions,\n ctx,\n );\n\n return await resolvers.mutateDocument(this.reactorClient, args);\n } catch (error) {\n this.logger.error(\"Error in mutateDocument(@args): @Error\", error);\n throw error;\n }\n },\n\n mutateDocumentAsync: async (_parent, args, ctx: Context) => {\n this.logger.debug(\"mutateDocumentAsync(@args)\", args);\n try {\n if (!this.authorizationService) {\n await this.assertCanWrite(args.documentIdentifier, ctx);\n }\n\n // Check operation-level permissions for each action\n await this.assertCanExecuteOperations(\n args.documentIdentifier,\n args.actions,\n ctx,\n );\n\n return await resolvers.mutateDocumentAsync(this.reactorClient, args);\n } catch (error) {\n this.logger.error(\n \"Error in mutateDocumentAsync(@args): @Error\",\n error,\n );\n throw error;\n }\n },\n\n renameDocument: async (_parent, args, ctx: Context) => {\n this.logger.debug(\"renameDocument(@args)\", args);\n try {\n await this.assertCanWrite(args.documentIdentifier, ctx);\n\n return await resolvers.renameDocument(this.reactorClient, args);\n } catch (error) {\n this.logger.error(\"Error in renameDocument(@args): @Error\", error);\n throw error;\n }\n },\n\n addChildren: async (_parent, args, ctx: Context) => {\n this.logger.debug(\"addChildren(@args)\", args);\n try {\n await this.assertCanWrite(args.parentIdentifier, ctx);\n\n return await resolvers.addChildren(this.reactorClient, args);\n } catch (error) {\n this.logger.error(\"Error in addChildren(@args): @Error\", error);\n throw error;\n }\n },\n\n removeChildren: async (_parent, args, ctx: Context) => {\n this.logger.debug(\"removeChildren(@args)\", args);\n try {\n await this.assertCanWrite(args.parentIdentifier, ctx);\n\n return await resolvers.removeChildren(this.reactorClient, args);\n } catch (error) {\n this.logger.error(\"Error in removeChildren(@args): @Error\", error);\n throw error;\n }\n },\n\n moveChildren: async (_parent, args, ctx: Context) => {\n this.logger.debug(\"moveChildren(@args)\", args);\n try {\n await this.assertCanWrite(args.sourceParentIdentifier, ctx);\n await this.assertCanWrite(args.targetParentIdentifier, ctx);\n\n return await resolvers.moveChildren(this.reactorClient, args);\n } catch (error) {\n this.logger.error(\n \"Error in moveChildren(@args): @Error @args\",\n error,\n args,\n );\n throw error;\n }\n },\n\n deleteDocument: async (_parent, args, ctx: Context) => {\n this.logger.debug(\"deleteDocument(@args)\", args);\n try {\n await this.assertCanWrite(args.identifier, ctx);\n\n return await resolvers.deleteDocument(this.reactorClient, args);\n } catch (error) {\n this.logger.error(\"Error in deleteDocument(@args): @Error\", error);\n throw error;\n }\n },\n\n deleteDocuments: async (_parent, args, ctx: Context) => {\n this.logger.debug(\"deleteDocuments(@args)\", args);\n try {\n // Check write permission on each document\n for (const identifier of args.identifiers) {\n await this.assertCanWrite(identifier, ctx);\n }\n return await resolvers.deleteDocuments(this.reactorClient, args);\n } catch (error) {\n this.logger.error(\"Error in deleteDocuments(@args): @Error\", error);\n throw error;\n }\n },\n\n touchChannel: async (\n _parent: unknown,\n args: {\n input: {\n id: string;\n name: string;\n collectionId: string;\n filter: {\n documentId: readonly string[];\n scope: readonly string[];\n branch: string;\n };\n sinceTimestampUtcMs: string;\n };\n },\n ) => {\n this.logger.debug(\"touchChannel(@args)\", args);\n\n try {\n return await resolvers.touchChannel(this.syncManager, args);\n } catch (error) {\n this.logger.error(\"Error in touchChannel(@args): @Error\", error);\n throw error;\n }\n },\n\n pushSyncEnvelopes: async (_parent, args) => {\n this.logger.debug(\"pushSyncEnvelopes(@args)\", args);\n\n try {\n // Convert readonly arrays to mutable arrays for the resolver\n const mutableArgs = {\n envelopes: args.envelopes.map((envelope) => ({\n type: envelope.type,\n channelMeta: { id: envelope.channelMeta.id },\n operations: envelope.operations\n ? envelope.operations.map((op) => ({\n operation: op.operation,\n context: {\n documentId: op.context.documentId,\n documentType: op.context.documentType,\n scope: op.context.scope,\n branch: op.context.branch,\n ordinal: op.context.ordinal,\n },\n }))\n : null,\n cursor: envelope.cursor\n ? {\n remoteName: envelope.cursor.remoteName,\n cursorOrdinal: envelope.cursor.cursorOrdinal,\n lastSyncedAtUtcMs: envelope.cursor.lastSyncedAtUtcMs,\n }\n : null,\n key: envelope.key ?? undefined,\n dependsOn: envelope.dependsOn\n ? [...envelope.dependsOn]\n : undefined,\n })),\n };\n\n return await resolvers.pushSyncEnvelopes(\n this.syncManager,\n mutableArgs,\n );\n } catch (error) {\n this.logger.error(\"Error in pushSyncEnvelopes(@args): @Error\", error);\n throw error;\n }\n },\n },\n\n Subscription: {\n documentChanges: {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n subscribe: withFilter(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n (() => {\n this.logger.debug(\"documentChanges(@args) subscription started\");\n ensureGlobalDocumentSubscription(this.reactorClient);\n\n return getPubSub().asyncIterableIterator<DocumentChangesPayload>(\n SUBSCRIPTION_TRIGGERS.DOCUMENT_CHANGES,\n );\n }) as any,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n ((\n payload: DocumentChangesPayload | undefined,\n args: {\n search?: {\n type?: string | null;\n parentId?: string | null;\n } | null;\n },\n ) => {\n if (!payload) {\n return false;\n }\n\n const search = {\n type: args.search?.type ?? undefined,\n parentId: args.search?.parentId ?? undefined,\n };\n\n return matchesSearchFilter(payload.documentChanges, search);\n }) as any,\n ) as any,\n resolve: (payload: DocumentChangesPayload) => {\n return toGqlDocumentChangeEvent(payload.documentChanges);\n },\n },\n\n jobChanges: {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n subscribe: withFilter(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n ((_parent: unknown, args: { jobId: string }) => {\n this.logger.debug(\"jobChanges(@args) subscription started\", args);\n ensureJobSubscription(this.reactorClient, args.jobId);\n\n return getPubSub().asyncIterableIterator<JobChangesPayload>(\n SUBSCRIPTION_TRIGGERS.JOB_CHANGES,\n );\n }) as any,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n ((\n payload: JobChangesPayload | undefined,\n args: { jobId: string },\n ) => {\n if (!payload) {\n return false;\n }\n\n return matchesJobFilter(payload, args);\n }) as any,\n ) as any,\n resolve: (payload: JobChangesPayload) => {\n return payload.jobChanges;\n },\n },\n },\n };\n\n onSetup(): Promise<void> {\n this.logger.debug(\"Setting up ReactorSubgraph\");\n\n return Promise.resolve();\n }\n}\n","export const getAdminUsers = (): string[] => {\n return (\n process.env.ADMIN_USERS?.split(\",\").map((user) =>\n user.trim().toLocaleLowerCase(),\n ) || []\n );\n};\n","import dotenv from \"dotenv\";\nimport { getAdminUsers } from \"./getters.js\";\n\ndotenv.config();\n\nexport const ADMIN_USERS = getAdminUsers();\n","import type { IDocumentModelLoader } from \"@powerhousedao/reactor\";\nimport type { SubgraphClass } from \"@powerhousedao/reactor-api\";\nimport type { DocumentModelModule } from \"@powerhousedao/shared/document-model\";\nimport { childLogger } from \"document-model\";\nimport type { IPackageLoader, ProcessorFactoryBuilder } from \"../types.js\";\n\nexport interface HttpPackageLoaderOptions {\n registryUrl: string;\n}\n\nexport interface HttpPackageLoaderLogger {\n info: (msg: string) => void;\n error: (msg: string, err: unknown) => void;\n}\n\n// Expected shape of the document-models bundle export\ntype DocumentModelsExport = Record<string, DocumentModelModule>;\n\n// Expected shape of the subgraphs bundle export\ntype SubgraphsExport = Record<string, SubgraphClass>;\n\n// Expected shape of the processors bundle export\ntype ProcessorsExport = {\n processorFactory?: ProcessorFactoryBuilder;\n};\n\n/**\n * Loads document models, subgraphs, and processors from an HTTP registry.\n * Uses Node.js module loader hooks to import directly from HTTP URLs.\n *\n * IMPORTANT: Requires https-hooks to be registered before use:\n * import { register } from \"node:module\";\n * register(\"@powerhousedao/reactor-api/https-hooks\", import.meta.url);\n */\nexport class HttpPackageLoader implements IPackageLoader {\n private readonly registryUrl: string;\n private readonly logger = childLogger([\"reactor-api\", \"http-loader\"]);\n\n readonly name = \"HttpPackageLoader\";\n\n readonly documentModelLoader: HttpDocumentModelLoader;\n\n constructor(options: HttpPackageLoaderOptions) {\n this.registryUrl = options.registryUrl.endsWith(\"/\")\n ? options.registryUrl\n : `${options.registryUrl}/`;\n this.documentModelLoader = new HttpDocumentModelLoader(this);\n }\n\n /**\n * Load document models from a package in the HTTP registry.\n * Imports directly from HTTP URL using Node.js loader hooks.\n */\n /**\n * Parse a package specifier like \"@scope/pkg@tag\" into name and optional tag.\n */\n private parsePackageSpec(spec: string): {\n name: string;\n tag: string | undefined;\n } {\n if (spec.startsWith(\"@\")) {\n const lastAt = spec.lastIndexOf(\"@\");\n if (lastAt > 0 && lastAt !== spec.indexOf(\"@\")) {\n return { name: spec.slice(0, lastAt), tag: spec.slice(lastAt + 1) };\n }\n return { name: spec, tag: undefined };\n }\n const atIndex = spec.indexOf(\"@\");\n if (atIndex > 0) {\n return { name: spec.slice(0, atIndex), tag: spec.slice(atIndex + 1) };\n }\n return { name: spec, tag: undefined };\n }\n\n async loadDocumentModels(\n packageSpec: string,\n ): Promise<DocumentModelModule[]> {\n const { name: packageName } = this.parsePackageSpec(packageSpec);\n if (!this.isValidPackageName(packageName)) {\n throw new Error(`Invalid package name: ${packageName}`);\n }\n\n // Pass the full spec (with tag) to the CDN — the registry resolves it\n const url = `${this.registryUrl}-/cdn/${packageSpec}/node/document-models/index.mjs`;\n\n this.logger.verbose(`Importing document-models from: ${url}`);\n\n // Direct import from HTTP URL - hooks handle the fetch\n const module = (await import(url)) as DocumentModelsExport;\n\n const models = Object.values(module).filter(\n (m: unknown): m is DocumentModelModule =>\n m !== null &&\n typeof m === \"object\" &&\n \"documentModel\" in m &&\n m.documentModel !== null,\n );\n\n this.logger.verbose(\n `Loaded ${models.length} document models from ${packageName}`,\n );\n return models;\n }\n\n async loadSubgraphs(packageSpec: string): Promise<SubgraphClass[]> {\n const { name: packageName } = this.parsePackageSpec(packageSpec);\n if (!this.isValidPackageName(packageName)) {\n throw new Error(`Invalid package name: ${packageName}`);\n }\n\n const url = `${this.registryUrl}-/cdn/${packageSpec}/node/subgraphs/index.mjs`;\n\n this.logger.verbose(`Importing subgraphs from: ${url}`);\n const module = (await import(url)) as Record<string, SubgraphsExport>;\n const subgraphs = new Array<SubgraphClass>();\n for (const [key, value] of Object.entries(module)) {\n const subgraph = value[key];\n if (subgraph && typeof subgraph === \"function\") {\n subgraphs.push(subgraph);\n }\n }\n\n this.logger.verbose(\n `Loaded ${subgraphs.length} subgraphs from ${packageName}`,\n );\n return subgraphs;\n }\n\n async loadProcessors(\n packageSpec: string,\n ): Promise<ProcessorFactoryBuilder | null> {\n const { name: packageName } = this.parsePackageSpec(packageSpec);\n if (!this.isValidPackageName(packageName)) {\n throw new Error(`Invalid package name: ${packageName}`);\n }\n\n const url = `${this.registryUrl}-/cdn/${packageSpec}/node/processors/index.mjs`;\n\n this.logger.verbose(`Importing processors from: ${url}`);\n const module = (await import(url)) as ProcessorsExport;\n\n const factory = module.processorFactory;\n if (factory && typeof factory === \"function\") {\n this.logger.verbose(`Loaded processor factory from ${packageName}`);\n return factory;\n }\n\n this.logger.verbose(`No processor factory found in ${packageName}`);\n return null;\n }\n\n /**\n * Load document models from multiple packages.\n * Continues loading even if some packages fail.\n */\n async loadPackages(\n packageNames: string[],\n logger?: HttpPackageLoaderLogger,\n ): Promise<DocumentModelModule[]> {\n const allModels: DocumentModelModule[] = [];\n\n for (const pkgName of packageNames) {\n const trimmedName = pkgName.trim();\n if (!trimmedName) continue;\n\n try {\n const models = await this.loadDocumentModels(trimmedName);\n allModels.push(...models);\n const logMsg = `Loaded ${models.length} document models from ${trimmedName}`;\n logger?.info(logMsg);\n this.logger.info(logMsg);\n } catch (error) {\n const errMsg = `Failed to load package ${trimmedName}`;\n logger?.error(errMsg, error);\n this.logger.error(errMsg, error);\n // Continue with other packages - don't fail startup\n }\n }\n\n return allModels;\n }\n\n private isValidPackageName(name: string): boolean {\n // npm package name pattern: optional scope + package name\n const pattern = /^(@[a-z0-9][-a-z0-9._]*\\/)?[a-z0-9][-a-z0-9._]*$/i;\n return pattern.test(name) && !name.includes(\"..\") && name.length <= 214;\n }\n}\n\nexport class HttpDocumentModelLoader implements IDocumentModelLoader {\n private readonly loader: HttpPackageLoader;\n private readonly logger = childLogger([\n \"reactor-api\",\n \"http-document-model-loader\",\n ]);\n\n // Cache: documentType -> packageName\n private readonly documentTypeCache = new Map<string, string>();\n\n // Cache: packageName -> DocumentModelModule[]\n private readonly packageModulesCache = new Map<\n string,\n DocumentModelModule[]\n >();\n\n private onModelLoaded?: (model: DocumentModelModule) => void;\n\n constructor(loader: HttpPackageLoader) {\n this.loader = loader;\n }\n\n setOnModelLoaded(callback: (model: DocumentModelModule) => void): void {\n this.onModelLoaded = callback;\n }\n\n clearCache(): void {\n this.documentTypeCache.clear();\n this.packageModulesCache.clear();\n }\n\n async load(documentType: string): Promise<DocumentModelModule> {\n const packageName = await this.findPackageByDocumentType(documentType);\n\n let models: DocumentModelModule[];\n\n const cachedModels = this.packageModulesCache.get(packageName);\n if (cachedModels) {\n models = cachedModels;\n } else {\n models = await this.loader.loadDocumentModels(packageName);\n this.packageModulesCache.set(packageName, models);\n }\n\n const model = models.find(\n (m) => m.documentModel.global.id === documentType,\n );\n\n if (!model) {\n const availableTypes = models.map((m) => m.documentModel.global.id);\n throw new Error(\n `Document model ${documentType} not found in package ${packageName}. ` +\n `Available types: ${availableTypes.join(\", \")}`,\n );\n }\n\n this.logger.info(\n `Loaded document model \"${documentType}\" from package \"${packageName}\"`,\n );\n\n if (this.onModelLoaded) {\n this.onModelLoaded(model);\n }\n\n return model;\n }\n\n private async findPackageByDocumentType(\n documentType: string,\n ): Promise<string> {\n const cached = this.documentTypeCache.get(documentType);\n if (cached) {\n return cached;\n }\n\n const encodedType = encodeURIComponent(documentType);\n const url = `${this.loader[\"registryUrl\"]}packages/by-document-type?type=${encodedType}`;\n\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(\n `Registry query failed for document type ${documentType}: ${response.status} ${response.statusText}`,\n );\n }\n\n const packageNames = (await response.json()) as string[];\n\n if (packageNames.length === 0) {\n throw new Error(\n `No package found containing document type: ${documentType}`,\n );\n }\n\n const packageName = packageNames.sort((a, b) => a.localeCompare(b))[0];\n this.documentTypeCache.set(documentType, packageName);\n\n return packageName;\n }\n\n getLoadedPackages(): string[] {\n return Array.from(this.packageModulesCache.keys());\n }\n\n getPackageModules(packageName: string): DocumentModelModule[] | undefined {\n return this.packageModulesCache.get(packageName);\n }\n\n removeFromCache(packageName: string): void {\n this.packageModulesCache.delete(packageName);\n for (const [docType, pkg] of this.documentTypeCache) {\n if (pkg === packageName) {\n this.documentTypeCache.delete(docType);\n }\n }\n }\n}\n","import type { SubgraphClass } from \"@powerhousedao/reactor-api\";\nimport type { DocumentModelModule } from \"@powerhousedao/shared/document-model\";\nimport { childLogger } from \"document-model\";\nimport type { IPackageLoader, ProcessorFactoryBuilder } from \"../types.js\";\nimport {\n loadDocumentModels as loadDocumentModelsUtil,\n loadProcessors as loadProcessorsUtil,\n loadSubgraphs as loadSubgraphsUtil,\n} from \"./util.js\";\n\n/**\n * This class is used to load packages using the import keyword.\n */\nexport class ImportPackageLoader implements IPackageLoader {\n private readonly logger = childLogger([\"reactor-api\", \"import-loader\"]);\n\n readonly name = \"ImportPackageLoader\";\n\n async loadDocumentModels(identifier: string): Promise<DocumentModelModule[]> {\n this.logger.verbose(`Loading document models from package: ${identifier}`);\n\n const pkgModule = await loadDocumentModelsUtil(identifier);\n\n if (pkgModule) {\n const models = Object.values(pkgModule);\n this.logger.verbose(\n ` ➜ Loaded ${models.length} Document Models from: ${identifier}`,\n );\n return models;\n } else {\n this.logger.verbose(` ➜ No Document Models found: ${identifier}`);\n return [];\n }\n }\n\n async loadSubgraphs(identifier: string): Promise<SubgraphClass[]> {\n this.logger.verbose(`Loading subgraphs from package: ${identifier}`);\n\n const pkgModule = await loadSubgraphsUtil(identifier);\n\n if (!pkgModule) {\n this.logger.verbose(` ➜ No Subgraphs found: ${identifier}`);\n\n return [];\n }\n\n const subgraphs = Object.values(pkgModule).map((subgraph) => {\n return Object.values(subgraph);\n });\n\n this.logger.verbose(` ➜ Loaded Subgraphs from: ${identifier}`);\n\n return subgraphs.flat();\n }\n\n async loadProcessors(\n identifier: string,\n ): Promise<ProcessorFactoryBuilder | null> {\n this.logger.verbose(`Loading processors from package: ${identifier}`);\n\n const pkgModule = await loadProcessorsUtil(identifier);\n\n const factory = pkgModule?.processorFactory;\n\n if (factory && typeof factory === \"function\") {\n this.logger.verbose(` ➜ Loaded Processor Factory from: ${identifier}`);\n return factory;\n }\n\n this.logger.verbose(` ➜ No Processor Factory found: ${identifier}`);\n return null;\n }\n}\n","import { getConfig } from \"@powerhousedao/config/node\";\nimport type {\n Processor,\n ProcessorFactoryBuilder,\n SubgraphClass,\n} from \"@powerhousedao/reactor-api\";\nimport { driveDocumentModelModule } from \"@powerhousedao/shared/document-drive\";\nimport type { DocumentModelModule } from \"@powerhousedao/shared/document-model\";\nimport { childLogger, documentModelDocumentModelModule } from \"document-model\";\nimport EventEmitter from \"node:events\";\nimport type { StatWatcher } from \"node:fs\";\nimport { watchFile } from \"node:fs\";\nimport type {\n IPackageLoader,\n IPackageManager,\n IPackageManagerOptions,\n ISubscribablePackageLoader,\n PackageManagerResult,\n} from \"./types.js\";\nimport { debounce } from \"./util.js\";\n\nexport function getUniqueDocumentModels(\n ...documentModels: DocumentModelModule<any>[][]\n): DocumentModelModule[] {\n const uniqueModels = new Map<string, DocumentModelModule>();\n\n for (const models of documentModels) {\n for (const model of models) {\n uniqueModels.set(model.documentModel.global.id, model);\n }\n }\n\n return Array.from(uniqueModels.values());\n}\n\nexport class PackageManager implements IPackageManager {\n private readonly logger = childLogger([\"reactor-api\", \"package-manager\"]);\n private loaders: ISubscribablePackageLoader[];\n\n private docModelsMap = new Map<string, DocumentModelModule[]>();\n private subgraphsMap = new Map<string, SubgraphClass[]>();\n private processorMap = new Map<string, Processor>();\n private configWatcher: StatWatcher | undefined;\n private debouncedUpdateCallbacks = new Map<string, () => void>();\n private eventEmitter = new EventEmitter<{\n documentModelsChange: [Record<string, DocumentModelModule[]>];\n subgraphsChange: [Map<string, SubgraphClass[]>];\n processorsChange: [Map<string, Processor>];\n }>();\n\n constructor(\n loaders: IPackageLoader[],\n protected options: IPackageManagerOptions,\n ) {\n this.loaders = loaders;\n this.eventEmitter.setMaxListeners(0);\n }\n\n public async init(): Promise<PackageManagerResult> {\n if (this.options.configFile) {\n this.initConfigFileWatcher(this.options.configFile);\n }\n\n return await this.loadPackages(this.getAllPackageNames());\n }\n\n private async loadPackages(\n packages: string[],\n ): Promise<PackageManagerResult> {\n this.logger.info(\"Loading packages: @packages\", packages.join(\", \"));\n\n const documentModelsMap = await this.loadDocumentModels(packages);\n const subgraphsMap = await this.loadSubgraphs(packages);\n const processorsMap = await this.loadProcessors(packages);\n\n this.updatePackagesMap(documentModelsMap);\n this.updateSubgraphsMap(subgraphsMap);\n this.updateProcessorsMap(processorsMap);\n\n try {\n this.subscribePackages(packages);\n } catch (error) {\n this.logger.error(\"Failed to subscribe to packages\", error);\n }\n\n return {\n documentModels: getUniqueDocumentModels(\n ...Array.from(documentModelsMap.values()),\n ),\n subgraphs: subgraphsMap,\n processors: processorsMap,\n };\n }\n\n private async loadDocumentModels(\n packages: string[],\n ): Promise<Map<string, DocumentModelModule[]>> {\n this.logger.debug(\n `Loading document models from packages: ${packages.join(\", \")}`,\n );\n\n const documentModelModuleMap = new Map<string, DocumentModelModule[]>();\n\n // static prereqs\n documentModelModuleMap.set(\"document-drive\", [\n driveDocumentModelModule as unknown as DocumentModelModule,\n ]);\n\n documentModelModuleMap.set(\"document-model\", [\n documentModelDocumentModelModule as unknown as DocumentModelModule,\n ]);\n\n for (const pkg of packages) {\n const allDocumentModels: DocumentModelModule[] = [];\n\n for (const loader of this.loaders) {\n try {\n const documentModels = await loader.loadDocumentModels(pkg);\n\n allDocumentModels.push(...documentModels);\n this.logger.info(\n `[${loader.name}] Loaded document models from package @pkg: @documentModels`,\n pkg,\n documentModels.map((dm) => dm.documentModel.global.id),\n );\n break;\n } catch (error) {\n this.logger.debug(\n `[${loader.name}] Failed to load document models from package @pkg: @error`,\n pkg,\n error,\n );\n }\n }\n\n documentModelModuleMap.set(pkg, allDocumentModels);\n }\n\n return documentModelModuleMap;\n }\n\n private async loadSubgraphs(\n packages: string[],\n ): Promise<Map<string, SubgraphClass[]>> {\n this.logger.debug(\n `Loading subgraphs from packages: ${packages.join(\", \")}`,\n );\n\n const subgraphsMap = new Map<string, SubgraphClass[]>();\n\n for (const pkg of packages) {\n const allSubgraphs: SubgraphClass[] = [];\n\n for (const loader of this.loaders) {\n try {\n const subgraphs = await loader.loadSubgraphs(pkg);\n\n allSubgraphs.push(...subgraphs);\n break;\n } catch (error) {\n this.logger.debug(\n `[${loader.name}] Failed to load subgraphs from package ${pkg}`,\n error,\n );\n }\n }\n\n subgraphsMap.set(pkg, allSubgraphs);\n }\n\n return subgraphsMap;\n }\n\n private async loadProcessors(\n packages: string[],\n ): Promise<Map<string, Processor>> {\n this.logger.debug(\n `Loading processors from packages: ${packages.join(\", \")}`,\n );\n\n const processorsMap = new Map<string, Processor>();\n\n for (const pkg of packages) {\n const allProcessors: ProcessorFactoryBuilder[] = [];\n\n for (const loader of this.loaders) {\n try {\n const processors = await loader.loadProcessors(pkg);\n\n if (processors) {\n allProcessors.push(processors);\n }\n break;\n } catch (error) {\n this.logger.debug(\n `[${loader.name}] Failed to load processors from package ${pkg}`,\n error,\n );\n }\n }\n\n processorsMap.set(pkg, allProcessors);\n }\n this.updateProcessorsMap(processorsMap);\n\n return processorsMap;\n }\n\n private async updateDocumentModelsForPackage(pkg: string): Promise<void> {\n this.logger.debug(`Updating document models for package: ${pkg}`);\n const documentModels = await this.loadDocumentModels([pkg]);\n const documentModelsMap = new Map(this.docModelsMap);\n documentModelsMap.set(pkg, documentModels.get(pkg) ?? []);\n this.updatePackagesMap(documentModelsMap);\n }\n\n private subscribePackages(packages: string[]) {\n const unsubs: (() => void)[] = [];\n for (const pkg of packages) {\n if (!this.debouncedUpdateCallbacks.has(pkg)) {\n this.debouncedUpdateCallbacks.set(\n pkg,\n debounce(() => this.updateDocumentModelsForPackage(pkg), 1000),\n );\n }\n const debouncedCallback = this.debouncedUpdateCallbacks.get(pkg)!;\n\n for (const loader of this.loaders) {\n if (loader.onDocumentModelsChange) {\n const unsub = loader.onDocumentModelsChange(pkg, debouncedCallback);\n unsubs.push(unsub);\n }\n }\n }\n\n return () => {\n for (const unsub of unsubs) {\n unsub();\n }\n };\n }\n\n private getAllPackageNames(): string[] {\n const packageNames = this.options.packages ?? [];\n if (this.options.configFile) {\n packageNames.push(\n ...this.getPackageNamesFromConfigFile(this.options.configFile),\n );\n }\n return packageNames;\n }\n\n private getPackageNamesFromConfigFile(configFile: string) {\n const loadedConfig = getConfig(configFile);\n return loadedConfig.packages?.map((pkg) => pkg.packageName) ?? [];\n }\n\n private initConfigFileWatcher(configFile: string) {\n if (!this.configWatcher) {\n this.configWatcher = watchFile(\n configFile,\n { interval: 100 },\n (curr, prev) => {\n if (curr.mtime === prev.mtime) {\n return;\n }\n\n void this.loadPackages(this.getAllPackageNames());\n },\n );\n }\n }\n\n private updatePackagesMap(packagesMap: Map<string, DocumentModelModule[]>) {\n const oldPackages = Array.from(this.docModelsMap.keys());\n const newPackages = Array.from(packagesMap.keys());\n oldPackages\n .filter((pkg) => !newPackages.includes(pkg))\n .forEach((pkg) => {\n this.logger.info(`Removed package: ${pkg}`);\n });\n this.docModelsMap = packagesMap;\n this.eventEmitter.emit(\n \"documentModelsChange\",\n Object.fromEntries(packagesMap),\n );\n }\n\n private updateSubgraphsMap(subgraphsMap: Map<string, SubgraphClass[]>) {\n const oldPackages = Array.from(this.subgraphsMap.keys());\n const newPackages = Array.from(subgraphsMap.keys());\n oldPackages\n .filter((pkg) => !newPackages.includes(pkg))\n .forEach((pkg) => {\n this.logger.info(`Removed Subgraphs from: ${pkg}`);\n });\n this.subgraphsMap = subgraphsMap;\n this.eventEmitter.emit(\"subgraphsChange\", subgraphsMap);\n }\n\n private updateProcessorsMap(processorsMap: Map<string, Processor>) {\n const oldPackages = Array.from(this.processorMap.keys());\n const newPackages = Array.from(processorsMap.keys());\n oldPackages\n .filter((pkg) => !newPackages.includes(pkg))\n .forEach((pkg) => {\n this.logger.info(`Removed Processor Factories from: ${pkg}`);\n });\n\n this.processorMap = processorsMap;\n this.eventEmitter.emit(\"processorsChange\", processorsMap);\n }\n\n onDocumentModelsChange(\n handler: (documentModels: Record<string, DocumentModelModule[]>) => void,\n ): void {\n this.eventEmitter.on(\"documentModelsChange\", handler);\n }\n\n onSubgraphsChange(\n handler: (subgraphs: Map<string, SubgraphClass[]>) => void,\n ): void {\n this.eventEmitter.on(\"subgraphsChange\", handler);\n }\n\n onProcessorsChange(\n handler: (processors: Map<string, Processor>) => void,\n ): void {\n this.eventEmitter.on(\"processorsChange\", handler);\n }\n}\n","import { AnalyticsSubgraph } from \"./graphql/analytics-subgraph.js\";\n\nexport const config = {\n basePath: process.env.BASE_PATH || \"/\",\n};\n\nexport const DefaultCoreSubgraphs = [AnalyticsSubgraph] as const;\n","import type { Kysely } from \"kysely\";\nimport { sql } from \"kysely\";\n\nexport async function up(db: Kysely<unknown>): Promise<void> {\n // Create DocumentPermission table\n await sql`\n CREATE TABLE IF NOT EXISTS \"DocumentPermission\" (\n \"id\" SERIAL PRIMARY KEY,\n \"documentId\" VARCHAR(255) NOT NULL,\n \"userAddress\" VARCHAR(255) NOT NULL,\n \"permission\" VARCHAR(20) NOT NULL CHECK (\"permission\" IN ('READ', 'WRITE', 'ADMIN')),\n \"grantedBy\" VARCHAR(255) NOT NULL,\n \"createdAt\" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n \"updatedAt\" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n UNIQUE (\"documentId\", \"userAddress\")\n )\n `.execute(db);\n\n // Create indexes for DocumentPermission\n await sql`CREATE INDEX IF NOT EXISTS \"documentpermission_documentid_index\" ON \"DocumentPermission\" (\"documentId\")`.execute(\n db,\n );\n await sql`CREATE INDEX IF NOT EXISTS \"documentpermission_useraddress_index\" ON \"DocumentPermission\" (\"userAddress\")`.execute(\n db,\n );\n\n // Create Group table\n await sql`\n CREATE TABLE IF NOT EXISTS \"Group\" (\n \"id\" SERIAL PRIMARY KEY,\n \"name\" VARCHAR(255) NOT NULL UNIQUE,\n \"description\" TEXT,\n \"createdAt\" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n \"updatedAt\" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP\n )\n `.execute(db);\n\n // Create UserGroup table (user-group membership)\n await sql`\n CREATE TABLE IF NOT EXISTS \"UserGroup\" (\n \"userAddress\" VARCHAR(255) NOT NULL,\n \"groupId\" INTEGER NOT NULL,\n \"createdAt\" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n PRIMARY KEY (\"userAddress\", \"groupId\")\n )\n `.execute(db);\n\n await sql`CREATE INDEX IF NOT EXISTS \"usergroup_groupid_index\" ON \"UserGroup\" (\"groupId\")`.execute(\n db,\n );\n\n // Create DocumentGroupPermission table\n await sql`\n CREATE TABLE IF NOT EXISTS \"DocumentGroupPermission\" (\n \"id\" SERIAL PRIMARY KEY,\n \"documentId\" VARCHAR(255) NOT NULL,\n \"groupId\" INTEGER NOT NULL,\n \"permission\" VARCHAR(20) NOT NULL CHECK (\"permission\" IN ('READ', 'WRITE', 'ADMIN')),\n \"grantedBy\" VARCHAR(255) NOT NULL,\n \"createdAt\" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n \"updatedAt\" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n UNIQUE (\"documentId\", \"groupId\")\n )\n `.execute(db);\n\n await sql`CREATE INDEX IF NOT EXISTS \"documentgrouppermission_documentid_index\" ON \"DocumentGroupPermission\" (\"documentId\")`.execute(\n db,\n );\n await sql`CREATE INDEX IF NOT EXISTS \"documentgrouppermission_groupid_index\" ON \"DocumentGroupPermission\" (\"groupId\")`.execute(\n db,\n );\n\n // Create OperationUserPermission table\n await sql`\n CREATE TABLE IF NOT EXISTS \"OperationUserPermission\" (\n \"id\" SERIAL PRIMARY KEY,\n \"documentId\" VARCHAR(255) NOT NULL,\n \"operationType\" VARCHAR(255) NOT NULL,\n \"userAddress\" VARCHAR(255) NOT NULL,\n \"grantedBy\" VARCHAR(255) NOT NULL,\n \"createdAt\" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n UNIQUE (\"documentId\", \"operationType\", \"userAddress\")\n )\n `.execute(db);\n\n await sql`CREATE INDEX IF NOT EXISTS \"operationuserpermission_documentid_index\" ON \"OperationUserPermission\" (\"documentId\")`.execute(\n db,\n );\n await sql`CREATE INDEX IF NOT EXISTS \"operationuserpermission_useraddress_index\" ON \"OperationUserPermission\" (\"userAddress\")`.execute(\n db,\n );\n\n // Create OperationGroupPermission table\n await sql`\n CREATE TABLE IF NOT EXISTS \"OperationGroupPermission\" (\n \"id\" SERIAL PRIMARY KEY,\n \"documentId\" VARCHAR(255) NOT NULL,\n \"operationType\" VARCHAR(255) NOT NULL,\n \"groupId\" INTEGER NOT NULL,\n \"grantedBy\" VARCHAR(255) NOT NULL,\n \"createdAt\" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n UNIQUE (\"documentId\", \"operationType\", \"groupId\")\n )\n `.execute(db);\n\n await sql`CREATE INDEX IF NOT EXISTS \"operationgrouppermission_documentid_index\" ON \"OperationGroupPermission\" (\"documentId\")`.execute(\n db,\n );\n await sql`CREATE INDEX IF NOT EXISTS \"operationgrouppermission_groupid_index\" ON \"OperationGroupPermission\" (\"groupId\")`.execute(\n db,\n );\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await sql`DROP TABLE IF EXISTS \"OperationGroupPermission\"`.execute(db);\n await sql`DROP TABLE IF EXISTS \"OperationUserPermission\"`.execute(db);\n await sql`DROP TABLE IF EXISTS \"DocumentGroupPermission\"`.execute(db);\n await sql`DROP TABLE IF EXISTS \"UserGroup\"`.execute(db);\n await sql`DROP TABLE IF EXISTS \"Group\"`.execute(db);\n await sql`DROP TABLE IF EXISTS \"DocumentPermission\"`.execute(db);\n}\n","import type { Kysely } from \"kysely\";\nimport { sql } from \"kysely\";\n\nexport async function up(db: Kysely<unknown>): Promise<void> {\n await sql`\n CREATE TABLE IF NOT EXISTS \"DocumentProtection\" (\n \"documentId\" VARCHAR(255) PRIMARY KEY,\n \"protected\" BOOLEAN NOT NULL DEFAULT false,\n \"ownerAddress\" VARCHAR(255),\n \"createdAt\" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n \"updatedAt\" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP\n )\n `.execute(db);\n\n await sql`CREATE INDEX IF NOT EXISTS \"documentprotection_owneraddress_index\" ON \"DocumentProtection\" (\"ownerAddress\")`.execute(\n db,\n );\n await sql`CREATE INDEX IF NOT EXISTS \"documentprotection_protected_index\" ON \"DocumentProtection\" (\"protected\")`.execute(\n db,\n );\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await sql`DROP TABLE IF EXISTS \"DocumentProtection\"`.execute(db);\n}\n","import {\n Migrator,\n type Kysely,\n type Migration,\n type MigrationProvider,\n} from \"kysely\";\nimport * as migration001 from \"./001_create_document_permissions.js\";\nimport * as migration002 from \"./002_add_document_protection.js\";\n\n/**\n * Custom migration provider that loads migrations from imported modules\n */\nclass StaticMigrationProvider implements MigrationProvider {\n async getMigrations(): Promise<Record<string, Migration>> {\n return {\n \"001_create_document_permissions\": migration001,\n \"002_add_document_protection\": migration002,\n };\n }\n}\n\n/**\n * Run all pending migrations\n */\nexport async function runMigrations(db: Kysely<unknown>): Promise<void> {\n const migrator = new Migrator({\n db,\n provider: new StaticMigrationProvider(),\n });\n\n const { error, results } = await migrator.migrateToLatest();\n\n results?.forEach((result) => {\n if (result.status === \"Error\") {\n console.error(`Failed to execute migration \"${result.migrationName}\"`);\n }\n });\n\n if (error) {\n console.error(\"Failed to run migrations:\", error);\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n throw new Error(`Migration failed: ${errorMessage}`);\n }\n}\n\n/**\n * Rollback the last migration\n */\nexport async function rollbackMigration(db: Kysely<unknown>): Promise<void> {\n const migrator = new Migrator({\n db,\n provider: new StaticMigrationProvider(),\n });\n\n const { error, results } = await migrator.migrateDown();\n\n results?.forEach((result) => {\n if (result.status === \"Success\") {\n console.log(\n `Migration \"${result.migrationName}\" was rolled back successfully`,\n );\n } else if (result.status === \"Error\") {\n console.error(`Failed to rollback migration \"${result.migrationName}\"`);\n }\n });\n\n if (error) {\n console.error(\"Failed to rollback migration:\", error);\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n throw new Error(`Rollback failed: ${errorMessage}`);\n }\n}\n","import type {\n DocumentPermissionService,\n GetParentIdsFn,\n} from \"./document-permission.service.js\";\n\nexport interface AuthorizationConfig {\n admins: string[];\n defaultProtection: boolean;\n}\n\n/**\n * Central authorization service — single source of truth for all permission checks.\n *\n * Authorization model:\n * 1. Supreme admin (ADMINS env) → ALLOW ALL\n * 2. Is document protected?\n * a. NOT protected:\n * - READ: anyone (even anonymous) → ALLOW\n * - WRITE: authenticated user → ALLOW\n * b. PROTECTED:\n * - READ: requires explicit READ/WRITE/ADMIN grant (direct or via group/parent)\n * - WRITE: requires explicit WRITE/ADMIN grant (direct or via group/parent)\n * 3. Operation restricted? → Check OperationUserPermission\n * 4. Document owner = implicit ADMIN\n * 5. Drive protected = all children effectively protected\n */\nexport class AuthorizationService {\n readonly config: AuthorizationConfig;\n\n constructor(\n private readonly documentPermissionService: DocumentPermissionService,\n config: AuthorizationConfig,\n ) {\n this.config = config;\n }\n\n /**\n * Check if a user is a supreme admin (from ADMINS env var).\n */\n isSupremeAdmin(userAddress?: string): boolean {\n if (!userAddress) return false;\n return this.config.admins.includes(userAddress.toLowerCase());\n }\n\n /**\n * Check if a user can read a document.\n *\n * - Supreme admin → yes\n * - Not protected → anyone can read (even anonymous)\n * - Protected → requires READ/WRITE/ADMIN grant (direct, group, or parent inheritance)\n * - Owner → yes (implicit ADMIN)\n */\n async canRead(\n documentId: string,\n userAddress?: string,\n getParentIds?: GetParentIdsFn,\n ): Promise<boolean> {\n // Supreme admin bypasses all\n if (this.isSupremeAdmin(userAddress)) return true;\n\n // Check protection status (walks parent chain if getParentIds provided)\n const isProtected = getParentIds\n ? await this.documentPermissionService.isProtectedWithAncestors(\n documentId,\n getParentIds,\n )\n : await this.documentPermissionService.isDocumentProtected(documentId);\n\n // Unprotected documents are readable by anyone\n if (!isProtected) return true;\n\n // Protected document — requires authentication\n if (!userAddress) return false;\n\n // Owner has implicit ADMIN\n const owner =\n await this.documentPermissionService.getDocumentOwner(documentId);\n if (owner && owner === userAddress.toLowerCase()) return true;\n\n // Check grant (READ/WRITE/ADMIN all allow reading)\n if (getParentIds) {\n return this.documentPermissionService.canRead(\n documentId,\n userAddress,\n getParentIds,\n );\n }\n return this.documentPermissionService.canReadDocument(\n documentId,\n userAddress,\n );\n }\n\n /**\n * Check if a user can write to a document.\n *\n * - Supreme admin → yes\n * - Not protected → anyone can write (even anonymous)\n * - Protected → requires authentication + WRITE/ADMIN grant\n * - Owner → yes (implicit ADMIN)\n */\n async canWrite(\n documentId: string,\n userAddress?: string,\n getParentIds?: GetParentIdsFn,\n ): Promise<boolean> {\n // Supreme admin bypasses all\n if (this.isSupremeAdmin(userAddress)) return true;\n\n // Check protection status\n const isProtected = getParentIds\n ? await this.documentPermissionService.isProtectedWithAncestors(\n documentId,\n getParentIds,\n )\n : await this.documentPermissionService.isDocumentProtected(documentId);\n\n // Unprotected documents are writable by anyone (even anonymous)\n if (!isProtected) return true;\n\n // Protected document — requires authentication\n if (!userAddress) return false;\n\n // Owner has implicit ADMIN\n const owner =\n await this.documentPermissionService.getDocumentOwner(documentId);\n if (owner && owner === userAddress.toLowerCase()) return true;\n\n // Check grant (WRITE/ADMIN allow writing)\n if (getParentIds) {\n return this.documentPermissionService.canWrite(\n documentId,\n userAddress,\n getParentIds,\n );\n }\n return this.documentPermissionService.canWriteDocument(\n documentId,\n userAddress,\n );\n }\n\n /**\n * Check if a user can manage a document (change permissions, protection, transfer ownership).\n *\n * - Supreme admin → yes\n * - Owner → yes\n * - Has ADMIN grant → yes\n */\n async canManage(\n documentId: string,\n userAddress?: string,\n getParentIds?: GetParentIdsFn,\n ): Promise<boolean> {\n // Supreme admin bypasses all\n if (this.isSupremeAdmin(userAddress)) return true;\n\n if (!userAddress) return false;\n\n // Owner has implicit ADMIN\n const owner =\n await this.documentPermissionService.getDocumentOwner(documentId);\n if (owner && owner === userAddress.toLowerCase()) return true;\n\n // Check ADMIN grant\n return this.documentPermissionService.canManageDocument(\n documentId,\n userAddress,\n );\n }\n\n /**\n * Check if a user can execute a specific operation.\n * If the operation is not restricted, falls through to the standard write check.\n * If the operation is restricted, requires an explicit OperationUserPermission grant.\n */\n async canExecuteOperation(\n documentId: string,\n operationType: string,\n userAddress?: string,\n getParentIds?: GetParentIdsFn,\n ): Promise<boolean> {\n // Supreme admin bypasses all\n if (this.isSupremeAdmin(userAddress)) return true;\n\n // Check if operation is restricted\n const isRestricted =\n await this.documentPermissionService.isOperationRestricted(\n documentId,\n operationType,\n );\n\n if (!isRestricted) {\n // Operation not restricted — standard write check applies\n return this.canWrite(documentId, userAddress, getParentIds);\n }\n\n // Operation is restricted — user needs explicit operation grant\n return this.documentPermissionService.canExecuteOperation(\n documentId,\n operationType,\n userAddress?.toLowerCase(),\n );\n }\n\n /**\n * Combined check for mutations: can the user write + execute the operation?\n * This enables READ-only users with operation grants to execute specific operations.\n * For restricted operations, only the operation grant is checked (bypasses write check),\n * allowing READ-only users with an explicit operation grant to execute that operation.\n */\n async canMutate(\n documentId: string,\n operationType: string,\n userAddress?: string,\n getParentIds?: GetParentIdsFn,\n ): Promise<boolean> {\n // Supreme admin bypasses all\n if (this.isSupremeAdmin(userAddress)) return true;\n\n // Check if the operation is restricted\n const isRestricted =\n await this.documentPermissionService.isOperationRestricted(\n documentId,\n operationType,\n );\n\n if (isRestricted) {\n // For restricted operations, only the operation grant matters\n // This allows READ-only users with operation grants to execute\n return this.documentPermissionService.canExecuteOperation(\n documentId,\n operationType,\n userAddress?.toLowerCase(),\n );\n }\n\n // For unrestricted operations, standard write check applies\n return this.canWrite(documentId, userAddress, getParentIds);\n }\n}\n","import type { Kysely } from \"kysely\";\nimport { sql } from \"kysely\";\nimport type {\n DocumentPermissionDatabase,\n DocumentPermissionLevel,\n} from \"../utils/db.js\";\n\nexport interface DocumentPermissionEntry {\n documentId: string;\n userAddress: string;\n permission: DocumentPermissionLevel;\n grantedBy: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface Group {\n id: number;\n name: string;\n description: string | null;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface DocumentGroupPermissionEntry {\n documentId: string;\n groupId: number;\n permission: DocumentPermissionLevel;\n grantedBy: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface OperationUserPermissionEntry {\n documentId: string;\n operationType: string;\n userAddress: string;\n grantedBy: string;\n createdAt: Date;\n}\n\nexport interface OperationGroupPermissionEntry {\n documentId: string;\n operationType: string;\n groupId: number;\n grantedBy: string;\n createdAt: Date;\n}\n\n/**\n * Function type for getting parent document IDs\n * This is injected to avoid circular dependencies with the reactor client\n */\nexport type GetParentIdsFn = (documentId: string) => Promise<string[]>;\n\n/**\n * Configuration for the DocumentPermissionService\n */\nexport interface DocumentPermissionConfig {\n defaultProtection: boolean;\n}\n\n/**\n * Service for managing document-level permissions.\n *\n * Permission levels for documents:\n * - READ: Can fetch and read the document\n * - WRITE: Can push updates and modify the document\n * - ADMIN: Can manage document permissions and settings\n *\n * Operation permissions:\n * - Users and groups can be granted permission to execute specific operations\n */\nexport class DocumentPermissionService {\n readonly config: DocumentPermissionConfig;\n\n constructor(\n private readonly db: Kysely<DocumentPermissionDatabase>,\n config: DocumentPermissionConfig = { defaultProtection: false },\n ) {\n this.config = config;\n }\n\n // ============================================\n // User Permission Operations\n // ============================================\n\n /**\n * Get the permission level for a user on a specific document.\n * Returns null if no permission is set.\n */\n async getUserPermission(\n documentId: string,\n userAddress: string,\n ): Promise<DocumentPermissionLevel | null> {\n const result = await this.db\n .selectFrom(\"DocumentPermission\")\n .select(\"permission\")\n .where(\"documentId\", \"=\", documentId)\n .where(\"userAddress\", \"=\", userAddress.toLowerCase())\n .executeTakeFirst();\n\n return result?.permission ?? null;\n }\n\n /**\n * Get all permissions for a document\n */\n async getDocumentPermissions(\n documentId: string,\n ): Promise<DocumentPermissionEntry[]> {\n const results = await this.db\n .selectFrom(\"DocumentPermission\")\n .select([\n \"documentId\",\n \"userAddress\",\n \"permission\",\n \"grantedBy\",\n \"createdAt\",\n \"updatedAt\",\n ])\n .where(\"documentId\", \"=\", documentId)\n .execute();\n\n return results;\n }\n\n /**\n * Get all documents a user has explicit access to\n */\n async getUserDocuments(\n userAddress: string,\n ): Promise<DocumentPermissionEntry[]> {\n const results = await this.db\n .selectFrom(\"DocumentPermission\")\n .select([\n \"documentId\",\n \"userAddress\",\n \"permission\",\n \"grantedBy\",\n \"createdAt\",\n \"updatedAt\",\n ])\n .where(\"userAddress\", \"=\", userAddress.toLowerCase())\n .execute();\n\n return results;\n }\n\n /**\n * Grant or update a user's permission on a document.\n */\n async grantPermission(\n documentId: string,\n userAddress: string,\n permission: DocumentPermissionLevel,\n grantedBy: string,\n ): Promise<DocumentPermissionEntry> {\n const now = new Date();\n const normalizedAddress = userAddress.toLowerCase();\n\n await this.db\n .insertInto(\"DocumentPermission\")\n .values({\n documentId,\n userAddress: normalizedAddress,\n permission,\n grantedBy: grantedBy.toLowerCase(),\n createdAt: now,\n updatedAt: now,\n })\n .onConflict((oc) =>\n oc.columns([\"documentId\", \"userAddress\"]).doUpdateSet({\n permission,\n grantedBy: grantedBy.toLowerCase(),\n updatedAt: now,\n }),\n )\n .execute();\n\n const result = await this.db\n .selectFrom(\"DocumentPermission\")\n .select([\n \"documentId\",\n \"userAddress\",\n \"permission\",\n \"grantedBy\",\n \"createdAt\",\n \"updatedAt\",\n ])\n .where(\"documentId\", \"=\", documentId)\n .where(\"userAddress\", \"=\", normalizedAddress)\n .executeTakeFirstOrThrow();\n\n return result;\n }\n\n /**\n * Revoke a user's permission on a document\n */\n async revokePermission(\n documentId: string,\n userAddress: string,\n ): Promise<void> {\n await this.db\n .deleteFrom(\"DocumentPermission\")\n .where(\"documentId\", \"=\", documentId)\n .where(\"userAddress\", \"=\", userAddress.toLowerCase())\n .execute();\n }\n\n /**\n * Delete all permissions for a document (used when deleting a document)\n */\n async deleteAllDocumentPermissions(documentId: string): Promise<void> {\n await this.db\n .deleteFrom(\"DocumentPermission\")\n .where(\"documentId\", \"=\", documentId)\n .execute();\n\n await this.db\n .deleteFrom(\"DocumentGroupPermission\")\n .where(\"documentId\", \"=\", documentId)\n .execute();\n\n await this.db\n .deleteFrom(\"OperationUserPermission\")\n .where(\"documentId\", \"=\", documentId)\n .execute();\n\n await this.db\n .deleteFrom(\"OperationGroupPermission\")\n .where(\"documentId\", \"=\", documentId)\n .execute();\n }\n\n // ============================================\n // Access Control Checks\n // ============================================\n\n /**\n * Check if a user can read a document.\n * Returns true if user has READ, WRITE, or ADMIN permission (direct or via group)\n */\n async canReadDocument(\n documentId: string,\n userAddress: string | undefined,\n ): Promise<boolean> {\n if (!userAddress) {\n return false;\n }\n\n // Check direct user permission\n const directPermission = await this.getUserPermission(\n documentId,\n userAddress,\n );\n if (directPermission !== null) {\n return true;\n }\n\n // Check group permission\n const groupPermission = await this.getUserGroupPermission(\n documentId,\n userAddress,\n );\n return groupPermission !== null;\n }\n\n /**\n * Check if a user can write to a document.\n * Returns true if user has WRITE or ADMIN permission (direct or via group)\n */\n async canWriteDocument(\n documentId: string,\n userAddress: string | undefined,\n ): Promise<boolean> {\n if (!userAddress) {\n return false;\n }\n\n // Check direct user permission\n const directPermission = await this.getUserPermission(\n documentId,\n userAddress,\n );\n if (directPermission === \"WRITE\" || directPermission === \"ADMIN\") {\n return true;\n }\n\n // Check group permission\n const groupPermission = await this.getUserGroupPermission(\n documentId,\n userAddress,\n );\n return groupPermission === \"WRITE\" || groupPermission === \"ADMIN\";\n }\n\n /**\n * Check if a user can manage a document (change permissions, settings).\n * Returns true if user has ADMIN permission (direct or via group)\n */\n async canManageDocument(\n documentId: string,\n userAddress: string | undefined,\n ): Promise<boolean> {\n if (!userAddress) {\n return false;\n }\n\n // Check direct user permission\n const directPermission = await this.getUserPermission(\n documentId,\n userAddress,\n );\n if (directPermission === \"ADMIN\") {\n return true;\n }\n\n // Check group permission\n const groupPermission = await this.getUserGroupPermission(\n documentId,\n userAddress,\n );\n return groupPermission === \"ADMIN\";\n }\n\n // ============================================\n // Access Control Checks (With Parent Hierarchy)\n // ============================================\n\n /**\n * Check if a user can read a document, including parent permission inheritance.\n * Returns true if user has permission on the document OR any parent in the hierarchy.\n */\n async canRead(\n documentId: string,\n userAddress: string | undefined,\n getParentIds: GetParentIdsFn,\n ): Promise<boolean> {\n // Check if user has direct permission on this document\n const canReadThis = await this.canReadDocument(documentId, userAddress);\n if (canReadThis) {\n return true;\n }\n\n // Check if user has permission on any parent (inheritance)\n const parentIds = await getParentIds(documentId);\n for (const parentId of parentIds) {\n const canReadParent = await this.canRead(\n parentId,\n userAddress,\n getParentIds,\n );\n if (canReadParent) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Check if a user can write to a document, including parent permission inheritance.\n * Returns true if user has write permission on the document OR any parent in the hierarchy.\n */\n async canWrite(\n documentId: string,\n userAddress: string | undefined,\n getParentIds: GetParentIdsFn,\n ): Promise<boolean> {\n // Check if user has direct write permission on this document\n const canWriteThis = await this.canWriteDocument(documentId, userAddress);\n if (canWriteThis) {\n return true;\n }\n\n // Check if user has write permission on any parent (inheritance)\n const parentIds = await getParentIds(documentId);\n for (const parentId of parentIds) {\n const canWriteParent = await this.canWrite(\n parentId,\n userAddress,\n getParentIds,\n );\n if (canWriteParent) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Filter a list of document IDs to only include those the user can read.\n */\n async filterReadableDocuments(\n documentIds: string[],\n userAddress: string | undefined,\n getParentIds: GetParentIdsFn,\n ): Promise<string[]> {\n const results: string[] = [];\n\n for (const docId of documentIds) {\n const canReadDoc = await this.canRead(docId, userAddress, getParentIds);\n if (canReadDoc) {\n results.push(docId);\n }\n }\n\n return results;\n }\n\n // ============================================\n // Group Management\n // ============================================\n\n /**\n * Create a new group\n */\n async createGroup(name: string, description?: string): Promise<Group> {\n const now = new Date();\n\n await this.db\n .insertInto(\"Group\")\n .values({\n name,\n description: description ?? null,\n createdAt: now,\n updatedAt: now,\n })\n .execute();\n\n const result = await this.db\n .selectFrom(\"Group\")\n .select([\"id\", \"name\", \"description\", \"createdAt\", \"updatedAt\"])\n .where(\"name\", \"=\", name)\n .executeTakeFirstOrThrow();\n\n return result;\n }\n\n /**\n * Delete a group and all its associations\n */\n async deleteGroup(groupId: number): Promise<void> {\n // Delete group permissions on operations\n await this.db\n .deleteFrom(\"OperationGroupPermission\")\n .where(\"groupId\", \"=\", groupId)\n .execute();\n\n // Delete group document permissions\n await this.db\n .deleteFrom(\"DocumentGroupPermission\")\n .where(\"groupId\", \"=\", groupId)\n .execute();\n\n // Delete user-group memberships\n await this.db\n .deleteFrom(\"UserGroup\")\n .where(\"groupId\", \"=\", groupId)\n .execute();\n\n // Delete the group\n await this.db.deleteFrom(\"Group\").where(\"id\", \"=\", groupId).execute();\n }\n\n /**\n * Get a group by ID\n */\n async getGroup(groupId: number): Promise<Group | null> {\n const result = await this.db\n .selectFrom(\"Group\")\n .select([\"id\", \"name\", \"description\", \"createdAt\", \"updatedAt\"])\n .where(\"id\", \"=\", groupId)\n .executeTakeFirst();\n\n return result ?? null;\n }\n\n /**\n * List all groups\n */\n async listGroups(): Promise<Group[]> {\n return this.db\n .selectFrom(\"Group\")\n .select([\"id\", \"name\", \"description\", \"createdAt\", \"updatedAt\"])\n .execute();\n }\n\n /**\n * Add a user to a group\n */\n async addUserToGroup(userAddress: string, groupId: number): Promise<void> {\n const now = new Date();\n const normalizedAddress = userAddress.toLowerCase();\n\n await this.db\n .insertInto(\"UserGroup\")\n .values({\n userAddress: normalizedAddress,\n groupId,\n createdAt: now,\n })\n .onConflict((oc) => oc.columns([\"userAddress\", \"groupId\"]).doNothing())\n .execute();\n }\n\n /**\n * Remove a user from a group\n */\n async removeUserFromGroup(\n userAddress: string,\n groupId: number,\n ): Promise<void> {\n await this.db\n .deleteFrom(\"UserGroup\")\n .where(\"userAddress\", \"=\", userAddress.toLowerCase())\n .where(\"groupId\", \"=\", groupId)\n .execute();\n }\n\n /**\n * Get all groups a user belongs to\n */\n async getUserGroups(userAddress: string): Promise<Group[]> {\n return this.db\n .selectFrom(\"UserGroup\")\n .innerJoin(\"Group\", \"Group.id\", \"UserGroup.groupId\")\n .select([\n \"Group.id\",\n \"Group.name\",\n \"Group.description\",\n \"Group.createdAt\",\n \"Group.updatedAt\",\n ])\n .where(\"UserGroup.userAddress\", \"=\", userAddress.toLowerCase())\n .execute();\n }\n\n /**\n * Get all members of a group\n */\n async getGroupMembers(groupId: number): Promise<string[]> {\n const results = await this.db\n .selectFrom(\"UserGroup\")\n .select(\"userAddress\")\n .where(\"groupId\", \"=\", groupId)\n .execute();\n\n return results.map((r) => r.userAddress);\n }\n\n // ============================================\n // Group Document Permissions\n // ============================================\n\n /**\n * Grant a group permission on a document\n */\n async grantGroupPermission(\n documentId: string,\n groupId: number,\n permission: DocumentPermissionLevel,\n grantedBy: string,\n ): Promise<DocumentGroupPermissionEntry> {\n const now = new Date();\n\n await this.db\n .insertInto(\"DocumentGroupPermission\")\n .values({\n documentId,\n groupId,\n permission,\n grantedBy: grantedBy.toLowerCase(),\n createdAt: now,\n updatedAt: now,\n })\n .onConflict((oc) =>\n oc.columns([\"documentId\", \"groupId\"]).doUpdateSet({\n permission,\n grantedBy: grantedBy.toLowerCase(),\n updatedAt: now,\n }),\n )\n .execute();\n\n const result = await this.db\n .selectFrom(\"DocumentGroupPermission\")\n .select([\n \"documentId\",\n \"groupId\",\n \"permission\",\n \"grantedBy\",\n \"createdAt\",\n \"updatedAt\",\n ])\n .where(\"documentId\", \"=\", documentId)\n .where(\"groupId\", \"=\", groupId)\n .executeTakeFirstOrThrow();\n\n return result;\n }\n\n /**\n * Revoke a group's permission on a document\n */\n async revokeGroupPermission(\n documentId: string,\n groupId: number,\n ): Promise<void> {\n await this.db\n .deleteFrom(\"DocumentGroupPermission\")\n .where(\"documentId\", \"=\", documentId)\n .where(\"groupId\", \"=\", groupId)\n .execute();\n }\n\n /**\n * Get all group permissions for a document\n */\n async getDocumentGroupPermissions(\n documentId: string,\n ): Promise<DocumentGroupPermissionEntry[]> {\n return this.db\n .selectFrom(\"DocumentGroupPermission\")\n .select([\n \"documentId\",\n \"groupId\",\n \"permission\",\n \"grantedBy\",\n \"createdAt\",\n \"updatedAt\",\n ])\n .where(\"documentId\", \"=\", documentId)\n .execute();\n }\n\n /**\n * Get best permission level a user has on a document via groups\n */\n async getUserGroupPermission(\n documentId: string,\n userAddress: string,\n ): Promise<DocumentPermissionLevel | null> {\n const result = await this.db\n .selectFrom(\"DocumentGroupPermission\")\n .innerJoin(\n \"UserGroup\",\n \"UserGroup.groupId\",\n \"DocumentGroupPermission.groupId\",\n )\n .select(\"DocumentGroupPermission.permission\")\n .where(\"DocumentGroupPermission.documentId\", \"=\", documentId)\n .where(\"UserGroup.userAddress\", \"=\", userAddress.toLowerCase())\n .execute();\n\n if (result.length === 0) {\n return null;\n }\n\n // Return highest permission level\n if (result.some((r) => r.permission === \"ADMIN\")) return \"ADMIN\";\n if (result.some((r) => r.permission === \"WRITE\")) return \"WRITE\";\n return \"READ\";\n }\n\n // ============================================\n // Operation Permissions\n // ============================================\n\n /**\n * Grant a user permission to execute an operation on a document\n */\n async grantOperationPermission(\n documentId: string,\n operationType: string,\n userAddress: string,\n grantedBy: string,\n ): Promise<OperationUserPermissionEntry> {\n const now = new Date();\n const normalizedAddress = userAddress.toLowerCase();\n\n await this.db\n .insertInto(\"OperationUserPermission\")\n .values({\n documentId,\n operationType,\n userAddress: normalizedAddress,\n grantedBy: grantedBy.toLowerCase(),\n createdAt: now,\n })\n .onConflict((oc) =>\n oc.columns([\"documentId\", \"operationType\", \"userAddress\"]).doNothing(),\n )\n .execute();\n\n const result = await this.db\n .selectFrom(\"OperationUserPermission\")\n .select([\n \"documentId\",\n \"operationType\",\n \"userAddress\",\n \"grantedBy\",\n \"createdAt\",\n ])\n .where(\"documentId\", \"=\", documentId)\n .where(\"operationType\", \"=\", operationType)\n .where(\"userAddress\", \"=\", normalizedAddress)\n .executeTakeFirstOrThrow();\n\n return result;\n }\n\n /**\n * Revoke a user's permission to execute an operation\n */\n async revokeOperationPermission(\n documentId: string,\n operationType: string,\n userAddress: string,\n ): Promise<void> {\n await this.db\n .deleteFrom(\"OperationUserPermission\")\n .where(\"documentId\", \"=\", documentId)\n .where(\"operationType\", \"=\", operationType)\n .where(\"userAddress\", \"=\", userAddress.toLowerCase())\n .execute();\n }\n\n /**\n * Grant a group permission to execute an operation on a document\n */\n async grantGroupOperationPermission(\n documentId: string,\n operationType: string,\n groupId: number,\n grantedBy: string,\n ): Promise<OperationGroupPermissionEntry> {\n const now = new Date();\n\n await this.db\n .insertInto(\"OperationGroupPermission\")\n .values({\n documentId,\n operationType,\n groupId,\n grantedBy: grantedBy.toLowerCase(),\n createdAt: now,\n })\n .onConflict((oc) =>\n oc.columns([\"documentId\", \"operationType\", \"groupId\"]).doNothing(),\n )\n .execute();\n\n const result = await this.db\n .selectFrom(\"OperationGroupPermission\")\n .select([\n \"documentId\",\n \"operationType\",\n \"groupId\",\n \"grantedBy\",\n \"createdAt\",\n ])\n .where(\"documentId\", \"=\", documentId)\n .where(\"operationType\", \"=\", operationType)\n .where(\"groupId\", \"=\", groupId)\n .executeTakeFirstOrThrow();\n\n return result;\n }\n\n /**\n * Revoke a group's permission to execute an operation\n */\n async revokeGroupOperationPermission(\n documentId: string,\n operationType: string,\n groupId: number,\n ): Promise<void> {\n await this.db\n .deleteFrom(\"OperationGroupPermission\")\n .where(\"documentId\", \"=\", documentId)\n .where(\"operationType\", \"=\", operationType)\n .where(\"groupId\", \"=\", groupId)\n .execute();\n }\n\n /**\n * Get all users with permission to execute an operation\n */\n async getOperationUserPermissions(\n documentId: string,\n operationType: string,\n ): Promise<OperationUserPermissionEntry[]> {\n return this.db\n .selectFrom(\"OperationUserPermission\")\n .select([\n \"documentId\",\n \"operationType\",\n \"userAddress\",\n \"grantedBy\",\n \"createdAt\",\n ])\n .where(\"documentId\", \"=\", documentId)\n .where(\"operationType\", \"=\", operationType)\n .execute();\n }\n\n /**\n * Get all groups with permission to execute an operation\n */\n async getOperationGroupPermissions(\n documentId: string,\n operationType: string,\n ): Promise<OperationGroupPermissionEntry[]> {\n return this.db\n .selectFrom(\"OperationGroupPermission\")\n .select([\n \"documentId\",\n \"operationType\",\n \"groupId\",\n \"grantedBy\",\n \"createdAt\",\n ])\n .where(\"documentId\", \"=\", documentId)\n .where(\"operationType\", \"=\", operationType)\n .execute();\n }\n\n /**\n * Check if a user can execute a specific operation on a document.\n * Returns true if user has direct permission or is in a group with permission.\n */\n async canExecuteOperation(\n documentId: string,\n operationType: string,\n userAddress: string | undefined,\n ): Promise<boolean> {\n if (!userAddress) {\n return false;\n }\n\n const normalizedAddress = userAddress.toLowerCase();\n\n // Check direct user permission\n const userPermission = await this.db\n .selectFrom(\"OperationUserPermission\")\n .select(\"userAddress\")\n .where(\"documentId\", \"=\", documentId)\n .where(\"operationType\", \"=\", operationType)\n .where(\"userAddress\", \"=\", normalizedAddress)\n .executeTakeFirst();\n\n if (userPermission) {\n return true;\n }\n\n // Check group permission\n const groupPermission = await this.db\n .selectFrom(\"OperationGroupPermission\")\n .innerJoin(\n \"UserGroup\",\n \"UserGroup.groupId\",\n \"OperationGroupPermission.groupId\",\n )\n .select(\"OperationGroupPermission.groupId\")\n .where(\"OperationGroupPermission.documentId\", \"=\", documentId)\n .where(\"OperationGroupPermission.operationType\", \"=\", operationType)\n .where(\"UserGroup.userAddress\", \"=\", normalizedAddress)\n .executeTakeFirst();\n\n return !!groupPermission;\n }\n\n /**\n * Check if an operation has any permissions set (is restricted)\n */\n async isOperationRestricted(\n documentId: string,\n operationType: string,\n ): Promise<boolean> {\n const userPermCount = await this.db\n .selectFrom(\"OperationUserPermission\")\n .select(sql<number>`count(*)`.as(\"count\"))\n .where(\"documentId\", \"=\", documentId)\n .where(\"operationType\", \"=\", operationType)\n .executeTakeFirst();\n\n if (userPermCount && Number(userPermCount.count) > 0) {\n return true;\n }\n\n const groupPermCount = await this.db\n .selectFrom(\"OperationGroupPermission\")\n .select(sql<number>`count(*)`.as(\"count\"))\n .where(\"documentId\", \"=\", documentId)\n .where(\"operationType\", \"=\", operationType)\n .executeTakeFirst();\n\n return groupPermCount !== undefined && Number(groupPermCount.count) > 0;\n }\n\n // ============================================\n // Document Protection\n // ============================================\n\n /**\n * Check if a specific document has a protection row set to true.\n * Falls back to `config.defaultProtection` if no row exists.\n */\n async isDocumentProtected(documentId: string): Promise<boolean> {\n const row = await this.db\n .selectFrom(\"DocumentProtection\")\n .select(\"protected\")\n .where(\"documentId\", \"=\", documentId)\n .executeTakeFirst();\n\n if (row === undefined) {\n return this.config.defaultProtection;\n }\n\n return row.protected;\n }\n\n /**\n * Walk the parent chain: if the document itself or any ancestor is protected, return true.\n * Collects all ancestor IDs first (with cycle detection), then batch-checks protection.\n */\n async isProtectedWithAncestors(\n documentId: string,\n getParentIds: GetParentIdsFn,\n ): Promise<boolean> {\n // Collect all IDs in the hierarchy (document + all ancestors)\n const allIds = await this.collectAncestorIds(documentId, getParentIds);\n\n // Batch-check protection for all IDs at once\n if (allIds.length === 0) {\n return this.config.defaultProtection;\n }\n\n const rows = await this.db\n .selectFrom(\"DocumentProtection\")\n .select([\"documentId\", \"protected\"])\n .where(\"documentId\", \"in\", allIds)\n .execute();\n\n const protectionMap = new Map(rows.map((r) => [r.documentId, r.protected]));\n\n for (const id of allIds) {\n const isProtected = protectionMap.get(id);\n // If no row exists, fall back to defaultProtection\n if (isProtected ?? this.config.defaultProtection) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Collect all ancestor IDs (including the document itself) with cycle detection.\n */\n private async collectAncestorIds(\n documentId: string,\n getParentIds: GetParentIdsFn,\n ): Promise<string[]> {\n const visited = new Set<string>();\n const queue = [documentId];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n if (visited.has(current)) continue;\n visited.add(current);\n\n const parentIds = await getParentIds(current);\n for (const parentId of parentIds) {\n if (!visited.has(parentId)) {\n queue.push(parentId);\n }\n }\n }\n\n return Array.from(visited);\n }\n\n /**\n * Upsert protection status for a document.\n */\n async setDocumentProtection(\n documentId: string,\n isProtected: boolean,\n ): Promise<void> {\n const now = new Date();\n\n await this.db\n .insertInto(\"DocumentProtection\")\n .values({\n documentId,\n protected: isProtected,\n ownerAddress: null,\n createdAt: now,\n updatedAt: now,\n })\n .onConflict((oc) =>\n oc.column(\"documentId\").doUpdateSet({\n protected: isProtected,\n updatedAt: now,\n }),\n )\n .execute();\n }\n\n /**\n * Get the owner address for a document, or null if not set.\n */\n async getDocumentOwner(documentId: string): Promise<string | null> {\n const row = await this.db\n .selectFrom(\"DocumentProtection\")\n .select(\"ownerAddress\")\n .where(\"documentId\", \"=\", documentId)\n .executeTakeFirst();\n\n return row?.ownerAddress ?? null;\n }\n\n /**\n * Upsert owner address for a document.\n */\n async setDocumentOwner(\n documentId: string,\n ownerAddress: string,\n ): Promise<void> {\n const now = new Date();\n const normalizedAddress = ownerAddress.toLowerCase();\n\n await this.db\n .insertInto(\"DocumentProtection\")\n .values({\n documentId,\n protected: this.config.defaultProtection,\n ownerAddress: normalizedAddress,\n createdAt: now,\n updatedAt: now,\n })\n .onConflict((oc) =>\n oc.column(\"documentId\").doUpdateSet({\n ownerAddress: normalizedAddress,\n updatedAt: now,\n }),\n )\n .execute();\n }\n\n /**\n * Initialize protection for a newly created document.\n * Sets protection status and grants ADMIN to the owner.\n */\n async initializeDocumentProtection(\n documentId: string,\n ownerAddress: string,\n defaultProtection?: boolean,\n ): Promise<void> {\n const now = new Date();\n const normalizedAddress = ownerAddress.toLowerCase();\n const isProtected = defaultProtection ?? this.config.defaultProtection;\n\n await this.db\n .insertInto(\"DocumentProtection\")\n .values({\n documentId,\n protected: isProtected,\n ownerAddress: normalizedAddress,\n createdAt: now,\n updatedAt: now,\n })\n .onConflict((oc) =>\n oc.column(\"documentId\").doUpdateSet({\n ownerAddress: normalizedAddress,\n updatedAt: now,\n }),\n )\n .execute();\n\n // Grant ADMIN permission to the owner\n await this.grantPermission(\n documentId,\n normalizedAddress,\n \"ADMIN\",\n normalizedAddress,\n );\n }\n\n /**\n * Get the full protection info for a document.\n */\n async getDocumentProtection(documentId: string): Promise<{\n documentId: string;\n protected: boolean;\n ownerAddress: string | null;\n }> {\n const row = await this.db\n .selectFrom(\"DocumentProtection\")\n .select([\"documentId\", \"protected\", \"ownerAddress\"])\n .where(\"documentId\", \"=\", documentId)\n .executeTakeFirst();\n\n if (!row) {\n return {\n documentId,\n protected: this.config.defaultProtection,\n ownerAddress: null,\n };\n }\n\n return row;\n }\n}\n","// OpenTelemetry Tracing Configuration for Reactor API\n// This file must be loaded before the application starts\n\nimport { getNodeAutoInstrumentations } from \"@opentelemetry/auto-instrumentations-node\";\nimport { OTLPMetricExporter } from \"@opentelemetry/exporter-metrics-otlp-http\";\nimport { PrometheusExporter } from \"@opentelemetry/exporter-prometheus\";\nimport { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-http\";\nimport { Resource } from \"@opentelemetry/resources\";\nimport { PeriodicExportingMetricReader } from \"@opentelemetry/sdk-metrics\";\nimport { NodeSDK } from \"@opentelemetry/sdk-node\";\nimport { BatchSpanProcessor } from \"@opentelemetry/sdk-trace-base\";\nimport {\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n} from \"@opentelemetry/semantic-conventions\";\nimport type { IncomingMessage } from \"http\";\n\n// Get configuration from environment\nconst TEMPO_ENDPOINT =\n process.env.TEMPO_ENDPOINT ||\n \"http://tempo.monitoring.svc.cluster.local:4318/v1/traces\";\nconst SERVICE_NAME = process.env.OTEL_SERVICE_NAME || \"reactor-api\";\nconst SERVICE_VERSION = process.env.npm_package_version || \"unknown\";\nconst TENANT_ID = process.env.TENANT_ID || \"default\";\nconst METRICS_ENDPOINT = process.env.METRICS_ENDPOINT;\nconst METRICS_EXPORT_INTERVAL_MS = parseInt(\n process.env.METRICS_EXPORT_INTERVAL_MS || \"30000\",\n 10,\n);\n\n// Only enable tracing if explicitly enabled or in production\nconst TRACING_ENABLED =\n process.env.ENABLE_TRACING === \"true\" ||\n process.env.NODE_ENV === \"production\";\n\nif (TRACING_ENABLED) {\n console.log(`Initializing OpenTelemetry tracing for ${SERVICE_NAME}...`);\n console.log(` Tempo endpoint: ${TEMPO_ENDPOINT}`);\n console.log(` Service: ${SERVICE_NAME}`);\n console.log(` Tenant: ${TENANT_ID}`);\n\n // Create OTLP trace exporter\n const traceExporter = new OTLPTraceExporter({\n url: TEMPO_ENDPOINT,\n headers: {},\n });\n\n // Configure resource with service information\n const resource = new Resource({\n [ATTR_SERVICE_NAME]: SERVICE_NAME,\n [ATTR_SERVICE_VERSION]: SERVICE_VERSION,\n \"tenant.id\": TENANT_ID,\n \"deployment.environment\": process.env.NODE_ENV || \"development\",\n });\n\n // Prometheus pull exporter (opt-in: serves /metrics for Prometheus to scrape)\n const PROMETHEUS_METRICS_PORT = process.env.PROMETHEUS_METRICS_PORT;\n let metricReader:\n | PrometheusExporter\n | PeriodicExportingMetricReader\n | undefined;\n\n if (PROMETHEUS_METRICS_PORT) {\n const port = parseInt(PROMETHEUS_METRICS_PORT, 10);\n metricReader = new PrometheusExporter({ port, preventServerStart: false });\n console.log(` Prometheus /metrics on port ${port}`);\n } else if (METRICS_ENDPOINT) {\n metricReader = new PeriodicExportingMetricReader({\n exporter: new OTLPMetricExporter({ url: METRICS_ENDPOINT }),\n exportIntervalMillis: METRICS_EXPORT_INTERVAL_MS,\n });\n console.log(` Metrics OTLP endpoint: ${METRICS_ENDPOINT}`);\n console.log(` Metrics interval: ${METRICS_EXPORT_INTERVAL_MS}ms`);\n }\n\n // Initialize OpenTelemetry SDK\n const sdk = new NodeSDK({\n resource,\n spanProcessors: [new BatchSpanProcessor(traceExporter)],\n metricReader,\n instrumentations: [\n getNodeAutoInstrumentations({\n // Automatically instrument common libraries\n \"@opentelemetry/instrumentation-http\": {\n enabled: true,\n ignoreIncomingRequestHook: (req) => {\n // Don't trace health check endpoints\n return req.url === \"/health\" || req.url === \"/ready\";\n },\n // Enable peer service name detection for service graphs\n requireParentforIncomingSpans: false,\n requireParentforOutgoingSpans: false,\n // Add http.target to spans for better observability\n requestHook: (span, request) => {\n // Add custom attributes for service graph\n span.setAttribute(\n \"http.route\",\n (request as IncomingMessage).url || \"\",\n );\n },\n responseHook: (span, response) => {\n // Add response attributes\n if (response.statusCode) {\n span.setAttribute(\"http.status_code\", response.statusCode);\n }\n },\n },\n \"@opentelemetry/instrumentation-express\": {\n enabled: true,\n // Add route information to spans\n requestHook: (span, info) => {\n if (info.route) {\n span.setAttribute(\"http.route\", info.route);\n }\n },\n },\n \"@opentelemetry/instrumentation-graphql\": {\n enabled: true,\n // Add GraphQL operation details for service graphs\n mergeItems: true,\n allowValues: true,\n },\n \"@opentelemetry/instrumentation-pg\": {\n enabled: true,\n // Add database peer service for service graphs\n enhancedDatabaseReporting: true,\n },\n \"@opentelemetry/instrumentation-redis-4\": {\n enabled: true,\n // Add Redis peer service for service graphs\n dbStatementSerializer: (cmdName, cmdArgs) => {\n return cmdName;\n },\n },\n }),\n ],\n });\n\n // Start the SDK\n sdk.start();\n\n console.log(\"✓ OpenTelemetry tracing initialized\");\n\n // Gracefully shutdown on exit\n process.on(\"SIGTERM\", () => {\n sdk\n .shutdown()\n .then(() => console.log(\"Tracing terminated\"))\n .catch((error) => console.log(\"Error terminating tracing\", error))\n .finally(() => process.exit(0));\n });\n} else {\n // console.debug(\n // \"OpenTelemetry tracing disabled (set ENABLE_TRACING=true to enable)\",\n // );\n}\n\n// Stub exports for backwards compatibility during migration\n// With OpenTelemetry auto-instrumentation, these are no longer needed\nexport async function initTracing() {\n // Tracing is initialized automatically when this module is imported\n return;\n}\n\nexport function isTracingEnabled(): boolean {\n return TRACING_ENABLED;\n}\n\n// Simplified trace function - OpenTelemetry auto-instruments everything\n// This is just a pass-through for backwards compatibility\nexport async function trace<T>(\n _name: string,\n _options: any,\n fn: () => Promise<T>,\n): Promise<T> {\n return fn();\n}\n","import { PGlite } from \"@electric-sql/pglite\";\nimport type { Knex } from \"knex\";\nimport knex from \"knex\";\nimport ClientPgLite from \"knex-pglite\";\nimport { type Generated, Kysely } from \"kysely\";\nimport { KyselyKnexDialect, PGColdDialect } from \"kysely-knex\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\n/**\n * Permission levels for documents:\n * - READ: Can fetch and read the document\n * - WRITE: Can push updates and modify the document\n * - ADMIN: Can manage document permissions and settings\n */\nexport type DocumentPermissionLevel = \"READ\" | \"WRITE\" | \"ADMIN\";\n\n/**\n * Database schema for document permissions\n */\nexport interface DocumentProtectionTable {\n documentId: string;\n protected: boolean;\n ownerAddress: string | null;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface DocumentPermissionDatabase {\n DocumentPermission: DocumentPermissionTable;\n Group: GroupTable;\n UserGroup: UserGroupTable;\n DocumentGroupPermission: DocumentGroupPermissionTable;\n OperationUserPermission: OperationUserPermissionTable;\n OperationGroupPermission: OperationGroupPermissionTable;\n DocumentProtection: DocumentProtectionTable;\n}\n\nexport interface DocumentPermissionTable {\n id: Generated<number>;\n documentId: string;\n userAddress: string;\n permission: DocumentPermissionLevel;\n grantedBy: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\n// Group management tables\nexport interface GroupTable {\n id: Generated<number>;\n name: string;\n description: string | null;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface UserGroupTable {\n userAddress: string;\n groupId: number;\n createdAt: Date;\n}\n\nexport interface DocumentGroupPermissionTable {\n id: Generated<number>;\n documentId: string;\n groupId: number;\n permission: DocumentPermissionLevel;\n grantedBy: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\n// Operation permission tables\nexport interface OperationUserPermissionTable {\n id: Generated<number>;\n documentId: string;\n operationType: string;\n userAddress: string;\n grantedBy: string;\n createdAt: Date;\n}\n\nexport interface OperationGroupPermissionTable {\n id: Generated<number>;\n documentId: string;\n operationType: string;\n groupId: number;\n grantedBy: string;\n createdAt: Date;\n}\n\ntype Db = Kysely<any>;\n\nfunction isPG(connectionString: string) {\n if (\n connectionString.startsWith(\"postgresql://\") ||\n connectionString.startsWith(\"postgres://\")\n ) {\n return true;\n }\n return false;\n}\n\nexport function getDbClient(connectionString: string | undefined = undefined): {\n db: Db;\n knex: Knex;\n} {\n const isPg = connectionString && isPG(connectionString);\n const client = isPg ? \"pg\" : (ClientPgLite as typeof knex.Client);\n const connection = isPg\n ? { connectionString }\n : { pglite: new PGlite(connectionString) };\n\n // If path is not postgres then it is a filesystem path.\n // Ensures parent directory is created.\n if (connectionString && !isPg) {\n const dirPath = path.resolve(connectionString, \"..\");\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n }\n }\n\n const knexInstance = knex({\n client,\n connection,\n });\n\n const kyselyInstance = new Kysely({\n dialect: new KyselyKnexDialect({\n knex: knexInstance,\n kyselySubDialect: new PGColdDialect(),\n }),\n });\n\n return { db: kyselyInstance, knex: knexInstance };\n}\n\nexport const initAnalyticsStoreSql = [\n `create table if not exists \"AnalyticsSeries\"\n (\n id serial primary key,\n source varchar(255) not null,\n start timestamp not null,\n \"end\" timestamp,\n metric varchar(255) not null,\n value real not null,\n unit varchar(255),\n fn varchar(255) not null,\n params json\n );`,\n `create unique index if not exists \"AnalyticsSeries_pkey\"\n on \"AnalyticsSeries\" (id);`,\n `create index if not exists analyticsseries_end_index\n on \"AnalyticsSeries\" (\"end\");`,\n `create index if not exists analyticsseries_fn_index\n on \"AnalyticsSeries\" (fn);`,\n `create index if not exists analyticsseries_metric_index\n on \"AnalyticsSeries\" (metric);`,\n `create index if not exists analyticsseries_source_index\n on \"AnalyticsSeries\" (source);`,\n `create index if not exists analyticsseries_start_index\n on \"AnalyticsSeries\" (start);`,\n `create index if not exists analyticsseries_unit_index\n on \"AnalyticsSeries\" (unit);`,\n `create index if not exists analyticsseries_value_index\n on \"AnalyticsSeries\" (value);`,\n `create table if not exists \"AnalyticsDimension\"\n (\n id serial primary key,\n dimension varchar(255) not null,\n path varchar(255) not null,\n label varchar(255),\n icon varchar(1000),\n description text\n );`,\n `create unique index if not exists \"AnalyticsDimension_pkey\"\n on \"AnalyticsDimension\" (id);`,\n `create index if not exists analyticsdimension_dimension_index\n on \"AnalyticsDimension\" (dimension);`,\n `create index if not exists analyticsdimension_path_index\n on \"AnalyticsDimension\" (path);`,\n `create table if not exists \"AnalyticsSeries_AnalyticsDimension\"\n (\n \"seriesId\" integer not null\n constraint analyticsseries_analyticsdimension_seriesid_foreign\n references \"AnalyticsSeries\"\n on delete cascade,\n \"dimensionId\" integer not null\n constraint analyticsseries_analyticsdimension_dimensionid_foreign\n references \"AnalyticsDimension\"\n on delete cascade\n );`,\n `create index if not exists analyticsseries_analyticsdimension_dimensionid_index\n on \"AnalyticsSeries_AnalyticsDimension\" (\"dimensionId\");`,\n `create index if not exists analyticsseries_analyticsdimension_seriesid_index\n on \"AnalyticsSeries_AnalyticsDimension\" (\"seriesId\");`,\n];\n","import type { PGlite } from \"@electric-sql/pglite\";\nimport type { IAnalyticsStore } from \"@powerhousedao/analytics-engine-core\";\nimport { PostgresAnalyticsStore } from \"@powerhousedao/analytics-engine-pg\";\nimport { getConfig } from \"@powerhousedao/config/node\";\nimport type {\n IDocumentModelRegistry,\n IReadModel,\n IReactorClient,\n IProcessorManager as IReactorProcessorManager,\n ISyncManager,\n ReactorClientModule,\n ProcessorRecord as ReactorProcessorRecord,\n} from \"@powerhousedao/reactor\";\nimport { setupMcpServer } from \"@powerhousedao/reactor-mcp\";\nimport type { DocumentModelModule } from \"@powerhousedao/shared/document-model\";\nimport type { Kysely } from \"kysely\";\nimport type http from \"node:http\";\nimport type { Pool } from \"pg\";\nimport { WebSocketServer } from \"ws\";\n// Import tracing - initializes OpenTelemetry and provides stub functions for backwards compatibility\nimport {\n createRelationalDb,\n type IProcessorHostModule,\n type IRelationalDb,\n type ProcessorApp,\n} from \"@powerhousedao/shared/processors\";\nimport { childLogger, type ILogger } from \"document-model\";\nimport { config, DefaultCoreSubgraphs } from \"./config.js\";\nimport { AuthSubgraph } from \"./graphql/auth/subgraph.js\";\nimport {\n createAuthFetchMiddleware,\n type AuthFetchMiddleware,\n} from \"./graphql/gateway/auth-middleware.js\";\nimport {\n createGatewayAdapter,\n createHttpAdapter,\n} from \"./graphql/gateway/factory.js\";\nimport type { IHttpAdapter, TlsOptions } from \"./graphql/gateway/types.js\";\nimport { GraphQLManager } from \"./graphql/graphql-manager.js\";\nimport { renderGraphqlPlayground } from \"./graphql/playground.js\";\nimport { ReactorSubgraph } from \"./graphql/reactor/subgraph.js\";\nimport type { SubgraphClass } from \"./graphql/types.js\";\nimport { runMigrations } from \"./migrations/index.js\";\nimport { ImportPackageLoader } from \"./packages/import-loader.js\";\nimport { PackageManager } from \"./packages/package-manager.js\";\nimport { AuthService } from \"./services/auth.service.js\";\nimport { AuthorizationService } from \"./services/authorization.service.js\";\nimport { DocumentPermissionService } from \"./services/document-permission.service.js\";\nimport { initTracing, isTracingEnabled, trace } from \"./tracing.js\";\nimport type {\n API,\n IPackageLoader,\n Processor,\n ProcessorDriveFactory,\n ProcessorFactoryBuilder,\n} from \"./types.js\";\nimport {\n getDbClient,\n initAnalyticsStoreSql,\n type DocumentPermissionDatabase,\n} from \"./utils/db.js\";\n\nconst defaultLogger = childLogger([\"reactor-api\", \"server\"]);\n\ntype Options = {\n port?: number;\n dbPath: string | undefined;\n client?: PGlite | typeof Pool | undefined;\n configFile?: string;\n packages?: string[];\n auth?: {\n enabled: boolean;\n admins: string[];\n };\n https?:\n | {\n keyPath: string;\n certPath: string;\n }\n | boolean\n | undefined;\n packageLoaders?: IPackageLoader[];\n processors?: Record<string, ProcessorInitializer[]>;\n mcp?: boolean;\n processorConfig?: Map<string, unknown>;\n /**\n * Document permission service instance.\n * When provided, the Auth subgraph is registered and document permission\n * checks are enforced on document operations.\n * If not provided, can be auto-created by setting DOCUMENT_PERMISSIONS_ENABLED=true\n * environment variable.\n */\n documentPermissionService?: DocumentPermissionService;\n enableDocumentModelSubgraphs?: boolean;\n logger?: ILogger;\n};\n\ntype ProcessorInitializer = ProcessorFactoryBuilder;\n\nconst DEFAULT_PORT = 4000;\n\n/**\n * Initializes the database and analytics store\n */\nasync function initializeDatabaseAndAnalytics(\n dbPath: string | undefined,\n): Promise<{\n relationalDb: IRelationalDb;\n analyticsStore: IAnalyticsStore;\n}> {\n const { db, knex } = getDbClient(dbPath);\n const relationalDb = createRelationalDb<unknown>(db);\n const analyticsStore = new PostgresAnalyticsStore({\n knex,\n });\n\n for (const sql of initAnalyticsStoreSql) {\n await knex.raw(sql);\n }\n\n return { relationalDb, analyticsStore };\n}\n\n/**\n * Sets up the subgraph manager and registers subgraphs\n */\nasync function setupGraphQLManager(\n httpAdapter: IHttpAdapter,\n authFetchMiddleware: AuthFetchMiddleware | undefined,\n httpServer: http.Server,\n wsServer: WebSocketServer,\n client: IReactorClient,\n relationalDb: IRelationalDb,\n analyticsStore: IAnalyticsStore,\n syncManager: ISyncManager,\n subgraphs: {\n extended: Map<string, SubgraphClass[]>;\n core: SubgraphClass[];\n },\n logger: ILogger,\n auth?: {\n enabled: boolean;\n admins: string[];\n },\n documentPermissionService?: DocumentPermissionService,\n enableDocumentModelSubgraphs?: boolean,\n port?: number,\n authorizationService?: AuthorizationService,\n): Promise<GraphQLManager> {\n const graphqlManager = new GraphQLManager(\n config.basePath,\n httpServer,\n wsServer,\n client,\n relationalDb,\n analyticsStore,\n syncManager,\n logger,\n httpAdapter,\n createGatewayAdapter(\"apollo\", logger),\n {\n enabled: auth?.enabled ?? false,\n admins: auth?.admins ?? [],\n },\n documentPermissionService,\n {\n enableDocumentModelSubgraphs,\n },\n port,\n authorizationService,\n );\n\n await graphqlManager.init(subgraphs.core, authFetchMiddleware);\n\n for (const [, collection] of subgraphs.extended.entries()) {\n for (const subgraph of collection) {\n await graphqlManager.registerSubgraph(subgraph, \"graphql\");\n }\n }\n\n await graphqlManager.updateRouter();\n\n return graphqlManager;\n}\n\n/**\n * Sets up event listeners for package manager changes\n */\nfunction setupEventListeners(\n pkgManager: PackageManager,\n graphqlManager: GraphQLManager,\n reactorProcessorManager: IReactorProcessorManager,\n module: IProcessorHostModule,\n documentModelRegistry?: IDocumentModelRegistry,\n): void {\n pkgManager.onDocumentModelsChange((packagedModels) => {\n if (documentModelRegistry) {\n const newModules = Object.values(packagedModels).flat();\n const registeredModules = documentModelRegistry.getAllModules();\n const registeredTypes = new Set(\n registeredModules.map((m) => m.documentModel.global.id),\n );\n\n const modulesToRegister = newModules.filter(\n (mod) => !registeredTypes.has(mod.documentModel.global.id),\n );\n if (modulesToRegister.length > 0) {\n const results = documentModelRegistry.registerModules(\n ...modulesToRegister,\n );\n for (const result of results) {\n if (result.status === \"success\") {\n defaultLogger.info(\n `Registered new document model: ${result.item.documentModel.global.id}`,\n );\n } else {\n defaultLogger.error(\n `Failed to register document model: ${result.error.message}`,\n );\n }\n }\n }\n }\n void graphqlManager.regenerateDocumentModelSubgraphs();\n });\n\n pkgManager.onSubgraphsChange(async (packagedSubgraphs) => {\n for (const [, subgraphs] of packagedSubgraphs) {\n for (const subgraph of subgraphs) {\n await graphqlManager.registerSubgraph(subgraph, \"graphql\");\n }\n }\n await graphqlManager.updateRouter();\n });\n\n pkgManager.onProcessorsChange(async (processors) => {\n for (const [packageName, fns] of processors) {\n await reactorProcessorManager.unregisterFactory(packageName);\n\n const factories = fns.map((fn) => fn(module));\n\n const validBuilders = factories.filter(\n (factory): factory is ProcessorDriveFactory =>\n factory !== null && typeof factory === \"function\",\n );\n\n if (!validBuilders.length) {\n continue;\n }\n\n await reactorProcessorManager.registerFactory(\n packageName,\n async (driveHeader) =>\n (\n await Promise.all(\n validBuilders.map(async (driveFactory) => {\n try {\n const result = await driveFactory(driveHeader);\n return result as unknown as ReactorProcessorRecord[];\n } catch (e) {\n const logger = defaultLogger;\n logger.error(\n `Error creating processor for drive ${driveHeader.id}:`,\n e,\n );\n return [];\n }\n }),\n )\n ).flat(),\n );\n }\n });\n}\n\n/**\n * Starts the server (HTTP or HTTPS) and attaches WebSocket server\n */\nasync function startServer(\n httpAdapter: IHttpAdapter,\n port: number,\n httpsOptions: Options[\"https\"],\n logger: ILogger,\n): Promise<{ httpServer: http.Server; wsServer: WebSocketServer }> {\n const tls: TlsOptions | undefined =\n httpsOptions === true\n ? true\n : typeof httpsOptions === \"object\"\n ? { keyPath: httpsOptions.keyPath, certPath: httpsOptions.certPath }\n : undefined;\n\n const httpServer = await httpAdapter.listen(port, tls);\n\n const wsServer = new WebSocketServer({\n server: httpServer,\n path: \"/graphql/subscriptions\",\n });\n\n logger.info(\"WebSocket server available at /graphql/subscriptions\");\n\n return { httpServer, wsServer };\n}\n\n/**\n * Private helper function that sets up common infrastructure before API initialization.\n * This includes auth configuration, database setup, and package manager initialization.\n */\nasync function _setupCommonInfrastructure(options: Options): Promise<{\n port: number;\n httpAdapter: IHttpAdapter;\n authFetchMiddleware: AuthFetchMiddleware | undefined;\n auth: {\n enabled: boolean;\n admins: string[];\n };\n relationalDb: IRelationalDb;\n analyticsStore: IAnalyticsStore;\n documentPermissionService: DocumentPermissionService | undefined;\n authorizationService: AuthorizationService | undefined;\n packages: PackageManager;\n}> {\n // Initialize OpenTelemetry tracing\n if (isTracingEnabled()) {\n await initTracing();\n }\n\n const port = options.port ?? DEFAULT_PORT;\n const { adapter: httpAdapter } = createHttpAdapter(\"express\");\n\n // Setup auth configuration\n let admins: string[] = [];\n let authEnabled = false;\n if (options.configFile) {\n const config = getConfig(options.configFile);\n admins = config.auth?.admins?.map((a) => a.toLowerCase()) ?? [];\n authEnabled = config.auth?.enabled ?? false;\n } else if (options.auth) {\n admins = options.auth?.admins?.map((a) => a.toLowerCase()) ?? [];\n authEnabled = options.auth?.enabled ?? false;\n }\n const {\n AUTH_ENABLED,\n ADMINS,\n DEFAULT_PROTECTION,\n DOCUMENT_PERMISSIONS_ENABLED,\n SKIP_CREDENTIAL_VERIFICATION,\n } = process.env;\n if (AUTH_ENABLED !== undefined) {\n authEnabled = AUTH_ENABLED === \"true\";\n }\n if (ADMINS !== undefined) {\n admins = ADMINS.split(\",\").map((a) => a.toLowerCase());\n }\n\n let defaultProtection = false;\n if (DEFAULT_PROTECTION !== undefined) {\n defaultProtection = DEFAULT_PROTECTION.toLowerCase() === \"true\";\n }\n\n // Warn about deprecated env vars\n const { USERS, GUESTS, FREE_ENTRY } = process.env;\n if (USERS || GUESTS || FREE_ENTRY) {\n console.warn(\n \"[DEPRECATION WARNING] The USERS, GUESTS, and FREE_ENTRY environment variables are no longer supported. \" +\n \"Access control is now managed per-document via the DocumentProtection system. \" +\n \"Use DEFAULT_PROTECTION=true for strict mode, or manage protection per document via the GraphQL API. \" +\n \"See the auth documentation for migration guidance.\",\n );\n }\n\n let skipCredentialVerification = false;\n if (SKIP_CREDENTIAL_VERIFICATION !== undefined) {\n skipCredentialVerification = SKIP_CREDENTIAL_VERIFICATION === \"true\";\n }\n\n const logger = options.logger ?? defaultLogger;\n\n // Health check endpoint (registered directly on adapter, before auth)\n httpAdapter.getRoute(\"/health\", () => new Response(\"OK\", { status: 200 }));\n\n // Explorer route\n const explorerPrefix = `${config.basePath}/explorer`;\n httpAdapter.getRoute(`${explorerPrefix}/:endpoint?`, (request) => {\n const url = new URL(request.url);\n // Strip the prefix to find the optional :endpoint segment\n const suffix = url.pathname.slice(explorerPrefix.length).replace(/^\\//, \"\");\n const endpoint = suffix ? `/${suffix}` : \"/graphql\";\n const query = url.searchParams.get(\"query\") ?? undefined;\n return new Response(renderGraphqlPlayground(endpoint, query), {\n headers: { \"Content-Type\": \"text/html\" },\n });\n });\n\n // Create auth fetch middleware if auth is enabled\n let authFetchMiddleware: AuthFetchMiddleware | undefined;\n if (authEnabled) {\n logger.info(\"Setting up Auth middleware\");\n const authService = new AuthService({\n enabled: authEnabled,\n admins,\n skipCredentialVerification,\n });\n authFetchMiddleware = createAuthFetchMiddleware(authService);\n }\n\n // Initialize database and analytics store\n const { relationalDb, analyticsStore } = await trace(\n \"reactor-api.init.database\",\n { tags: { \"resource.name\": \"database\" } },\n () => initializeDatabaseAndAnalytics(options.dbPath),\n );\n\n // Use provided document permission service, or create one if env var is set\n let documentPermissionService = options.documentPermissionService;\n if (!documentPermissionService && DOCUMENT_PERMISSIONS_ENABLED === \"true\") {\n const { db } = getDbClient(options.dbPath);\n // Run document permission migrations\n await runMigrations(db as Kysely<unknown>);\n logger.info(\"Document permission migrations completed\");\n documentPermissionService = new DocumentPermissionService(\n db as Kysely<DocumentPermissionDatabase>,\n { defaultProtection },\n );\n logger.info(\"Document permission service initialized\");\n }\n\n // Create AuthorizationService when document permission service is available\n let authorizationService: AuthorizationService | undefined;\n if (documentPermissionService) {\n authorizationService = new AuthorizationService(documentPermissionService, {\n admins,\n defaultProtection,\n });\n logger.info(\"Authorization service initialized\");\n }\n\n // Initialize package manager\n const loaders: IPackageLoader[] = options.packageLoaders ?? [\n new ImportPackageLoader(),\n ];\n\n const packages = new PackageManager(loaders, {\n configFile: options.configFile,\n packages: options.packages ?? [],\n });\n\n return {\n port,\n httpAdapter,\n authFetchMiddleware,\n auth: {\n enabled: authEnabled,\n admins,\n },\n relationalDb,\n analyticsStore,\n documentPermissionService,\n authorizationService,\n packages,\n };\n}\n\n/**\n * Private helper function containing common setup logic for API initialization\n */\nasync function _setupAPI(\n reactorClient: IReactorClient,\n syncManager: ISyncManager,\n reactorProcessorManager: IReactorProcessorManager,\n httpAdapter: IHttpAdapter,\n authFetchMiddleware: AuthFetchMiddleware | undefined,\n port: number,\n packages: PackageManager,\n relationalDb: IRelationalDb,\n analyticsStore: IAnalyticsStore,\n documentPermissionService: DocumentPermissionService | undefined,\n processors: Map<string, Processor>,\n subgraphs: Map<string, SubgraphClass[]>,\n options: Options,\n auth: {\n enabled: boolean;\n admins: string[];\n },\n processorApp: ProcessorApp,\n readModels: IReadModel[],\n authorizationService?: AuthorizationService,\n documentModelRegistry?: IDocumentModelRegistry,\n): Promise<API> {\n const hostModule: IProcessorHostModule = {\n relationalDb,\n analyticsStore,\n processorApp,\n config: options.processorConfig,\n dispatch: {\n async execute(docId, branch, actions, signal) {\n const jobInfo = await reactorClient.executeAsync(\n docId,\n branch,\n actions,\n signal,\n );\n return { id: jobInfo.id, status: jobInfo.status };\n },\n },\n getReadModel<T>(name: string): T {\n const model = readModels.find((m) => m.name === name);\n if (!model) {\n throw new Error(`Read model \"${name}\" not found`);\n }\n return model as unknown as T;\n },\n };\n const mcpServerEnabled = options.mcp ?? true;\n\n const logger = options.logger ?? defaultLogger;\n\n // initialize processors\n const configuredProcessorEntries = Object.entries(\n options.processors ?? {},\n ) as [string, ProcessorInitializer[]][];\n\n const processorEntries = [\n ...processors.entries(),\n ...configuredProcessorEntries,\n ] as [string, ProcessorInitializer[]][];\n\n for (const [packageName, fns] of processorEntries) {\n const factories = await Promise.allSettled(\n fns.map(async (fn) => {\n try {\n return fn(hostModule);\n } catch (e) {\n logger.error(\n `Error initializing processor factory for package ${packageName}:`,\n e,\n );\n\n return null;\n }\n }),\n );\n\n const validFactories = factories.filter(\n (factory): factory is PromiseFulfilledResult<ProcessorDriveFactory> =>\n factory.status === \"fulfilled\" &&\n factory.value !== null &&\n typeof factory.value === \"function\",\n );\n\n if (!validFactories.length) {\n continue;\n }\n\n // Register with the reactor ProcessorManager\n // Cast the results to ReactorProcessorRecord since the loaded factories\n // implement the reactor interface\n await reactorProcessorManager.registerFactory(\n packageName,\n async (driveHeader) =>\n (\n await Promise.all(\n validFactories.map(async ({ value: driveFactory }) => {\n try {\n const result = await driveFactory(driveHeader);\n return result as unknown as ReactorProcessorRecord[];\n } catch (e) {\n logger.error(\n `Error creating processor for drive ${driveHeader.id}:`,\n e,\n );\n\n return [];\n }\n }),\n )\n ).flat(),\n );\n }\n\n // Start the server\n const { httpServer, wsServer } = await startServer(\n httpAdapter,\n port,\n options.https,\n logger,\n );\n\n // set up subgraph manager\n const coreSubgraphs: SubgraphClass[] = DefaultCoreSubgraphs.slice();\n coreSubgraphs.push(ReactorSubgraph);\n\n // Register Auth subgraph when document permission service is available\n if (documentPermissionService) {\n coreSubgraphs.push(AuthSubgraph);\n logger.info(\"Auth subgraph registered (document permissions enabled)\");\n }\n\n const graphqlManager = await setupGraphQLManager(\n httpAdapter,\n authFetchMiddleware,\n httpServer,\n wsServer,\n reactorClient,\n relationalDb,\n analyticsStore,\n syncManager,\n {\n extended: subgraphs,\n core: coreSubgraphs,\n },\n logger.child([\"graphql-manager\"]),\n auth,\n documentPermissionService,\n options.enableDocumentModelSubgraphs,\n port,\n authorizationService,\n );\n\n // Set up event listeners\n setupEventListeners(\n packages,\n graphqlManager,\n reactorProcessorManager,\n hostModule,\n documentModelRegistry,\n );\n\n if (mcpServerEnabled) {\n await setupMcpServer({ client: reactorClient, syncManager }, httpAdapter);\n logger.info(`MCP server available at http://localhost:${port}/mcp`);\n }\n\n return {\n httpAdapter,\n graphqlManager,\n packages,\n };\n}\n\n/**\n * Initializes and starts the API server using an initializer function.\n * This function first loads packages to get document models, then calls the initializer function\n * to create the reactor client module with the appropriate dependencies.\n *\n * @param clientInitializer - Initializer function that creates the reactor client module with document models.\n * @param options - Additional options for server configuration.\n *\n * @returns The API server components along with the created client instances.\n */\nexport async function initializeAndStartAPI(\n clientInitializer: (\n documentModels: DocumentModelModule[],\n ) => Promise<ReactorClientModule>,\n options: Options,\n processorApp: ProcessorApp,\n): Promise<\n API & {\n client: IReactorClient;\n syncManager: ISyncManager;\n documentModelRegistry: IDocumentModelRegistry;\n }\n> {\n const {\n port,\n httpAdapter,\n authFetchMiddleware,\n auth,\n relationalDb,\n analyticsStore,\n documentPermissionService,\n authorizationService,\n packages,\n } = await trace(\n \"reactor-api.setup.infrastructure\",\n { tags: { \"resource.name\": \"infrastructure\" } },\n () => _setupCommonInfrastructure(options),\n );\n\n const { documentModels, processors, subgraphs } = await trace(\n \"reactor-api.packages.init\",\n { tags: { \"resource.name\": \"packages\" } },\n () => packages.init(),\n );\n\n const reactorClientModule = await trace(\n \"reactor-api.reactor-client.init\",\n { tags: { \"resource.name\": \"reactor-client\" } },\n () => clientInitializer(documentModels),\n );\n\n // Extract client and syncManager from the module\n const reactorClient = reactorClientModule.client;\n\n const syncManager =\n reactorClientModule.reactorModule?.syncModule?.syncManager;\n if (!syncManager) {\n throw new Error(\"SyncManager not available from ReactorClientModule\");\n }\n\n const reactorProcessorManager =\n reactorClientModule.reactorModule?.processorManager;\n if (!reactorProcessorManager) {\n throw new Error(\"ProcessorManager not available from ReactorClientModule\");\n }\n\n const documentModelRegistry =\n reactorClientModule.reactorModule?.documentModelRegistry;\n if (!documentModelRegistry) {\n throw new Error(\n \"DocumentModelRegistry not available from ReactorClientModule\",\n );\n }\n\n const readModelCoordinator =\n reactorClientModule.reactorModule?.readModelCoordinator;\n const readModels = readModelCoordinator?.readModels ?? [];\n\n const api = await _setupAPI(\n reactorClient,\n syncManager,\n reactorProcessorManager,\n httpAdapter,\n authFetchMiddleware,\n port,\n packages,\n relationalDb,\n analyticsStore,\n documentPermissionService,\n processors,\n subgraphs,\n options,\n auth,\n processorApp,\n readModels,\n authorizationService,\n documentModelRegistry,\n );\n\n return {\n ...api,\n client: reactorClient,\n syncManager,\n documentModelRegistry,\n };\n}\n","export interface InstalledPackageInfo {\n name: string;\n version?: string;\n registryUrl: string;\n installedAt: Date;\n documentTypes: string[];\n}\n\nexport interface IPackageStorage {\n get(name: string): Promise<InstalledPackageInfo | undefined>;\n getAll(): Promise<InstalledPackageInfo[]>;\n set(name: string, info: InstalledPackageInfo): Promise<void>;\n delete(name: string): Promise<boolean>;\n has(name: string): Promise<boolean>;\n}\n\nexport class InMemoryPackageStorage implements IPackageStorage {\n private packages = new Map<string, InstalledPackageInfo>();\n\n async get(name: string): Promise<InstalledPackageInfo | undefined> {\n return this.packages.get(name);\n }\n\n async getAll(): Promise<InstalledPackageInfo[]> {\n return Array.from(this.packages.values());\n }\n\n async set(name: string, info: InstalledPackageInfo): Promise<void> {\n this.packages.set(name, info);\n }\n\n async delete(name: string): Promise<boolean> {\n return this.packages.delete(name);\n }\n\n async has(name: string): Promise<boolean> {\n return this.packages.has(name);\n }\n}\n","import type { IDocumentModelRegistry } from \"@powerhousedao/reactor\";\nimport type { DocumentModelModule } from \"@powerhousedao/shared/document-model\";\nimport { childLogger } from \"document-model\";\nimport type { HttpPackageLoader } from \"../packages/http-loader.js\";\nimport {\n InMemoryPackageStorage,\n type IPackageStorage,\n type InstalledPackageInfo,\n} from \"./package-storage.js\";\n\nexport interface InstallPackageResult {\n package: InstalledPackageInfo;\n documentModelsLoaded: number;\n}\n\nexport interface PackageManagementServiceOptions {\n storage?: IPackageStorage;\n defaultRegistryUrl?: string;\n httpLoader?: HttpPackageLoader;\n documentModelRegistry?: IDocumentModelRegistry;\n}\n\nexport class PackageManagementService {\n private readonly storage: IPackageStorage;\n private readonly defaultRegistryUrl?: string;\n private readonly httpLoader?: HttpPackageLoader;\n private readonly documentModelRegistry?: IDocumentModelRegistry;\n private readonly logger = childLogger([\n \"reactor-api\",\n \"package-management-service\",\n ]);\n\n private onModelsChanged?: (models: DocumentModelModule[]) => void;\n private loadedModulesCache = new Map<string, DocumentModelModule[]>();\n\n constructor(options: PackageManagementServiceOptions = {}) {\n this.storage = options.storage ?? new InMemoryPackageStorage();\n this.defaultRegistryUrl = options.defaultRegistryUrl;\n this.httpLoader = options.httpLoader;\n this.documentModelRegistry = options.documentModelRegistry;\n }\n\n setOnModelsChanged(callback: (models: DocumentModelModule[]) => void): void {\n this.onModelsChanged = callback;\n }\n\n async installPackage(\n name: string,\n registryUrl?: string,\n ): Promise<InstallPackageResult> {\n const url = registryUrl ?? this.defaultRegistryUrl;\n if (!url) {\n throw new Error(\n \"No registry URL provided and no default registry URL configured\",\n );\n }\n\n if (!this.httpLoader) {\n throw new Error(\"HttpPackageLoader not configured\");\n }\n\n const existing = await this.storage.get(name);\n if (existing) {\n throw new Error(`Package ${name} is already installed`);\n }\n\n this.logger.info(\"Installing package @name from @url\", name, url);\n\n const models = await this.httpLoader.loadDocumentModels(name);\n const documentTypes = models.map((m) => m.documentModel.global.id);\n\n const packageInfo: InstalledPackageInfo = {\n name,\n registryUrl: url,\n installedAt: new Date(),\n documentTypes,\n };\n\n await this.storage.set(name, packageInfo);\n this.loadedModulesCache.set(name, models);\n\n if (this.documentModelRegistry) {\n const results = this.documentModelRegistry.registerModules(...models);\n for (const result of results) {\n if (result.status === \"error\") {\n this.logger.error(\n \"Failed to register document model: @error\",\n result.error.message,\n );\n }\n }\n }\n\n this.logger.info(\n \"Installed package @name with @count document models\",\n name,\n models.length,\n );\n\n this.triggerModelsChanged();\n\n return {\n package: packageInfo,\n documentModelsLoaded: models.length,\n };\n }\n\n async uninstallPackage(name: string): Promise<boolean> {\n const existing = await this.storage.get(name);\n if (!existing) {\n this.logger.warn(\"Package @name is not installed\", name);\n return false;\n }\n\n this.logger.info(\"Uninstalling package @name\", name);\n\n await this.storage.delete(name);\n this.loadedModulesCache.delete(name);\n\n if (this.httpLoader) {\n this.httpLoader.documentModelLoader.removeFromCache(name);\n }\n\n if (this.documentModelRegistry) {\n this.documentModelRegistry.unregisterModules(...existing.documentTypes);\n }\n\n this.triggerModelsChanged();\n\n this.logger.info(\"Uninstalled package @name\", name);\n return true;\n }\n\n async getInstalledPackages(): Promise<InstalledPackageInfo[]> {\n return this.storage.getAll();\n }\n\n async getInstalledPackage(\n name: string,\n ): Promise<InstalledPackageInfo | undefined> {\n return this.storage.get(name);\n }\n\n getAllLoadedModules(): DocumentModelModule[] {\n const allModules: DocumentModelModule[] = [];\n for (const modules of this.loadedModulesCache.values()) {\n allModules.push(...modules);\n }\n return allModules;\n }\n\n private triggerModelsChanged(): void {\n if (this.onModelsChanged) {\n const allModules = this.getAllLoadedModules();\n this.onModelsChanged(allModules);\n }\n }\n}\n"],"mappings":"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"}