@zhin.js/workroom 0.0.5 → 0.0.6

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 (610) hide show
  1. package/lib/data-governance/canonical-value.d.ts +0 -1
  2. package/lib/data-governance/canonical-value.js.map +1 -1
  3. package/lib/data-governance/data-governance.d.ts +0 -1
  4. package/lib/data-governance/data-governance.js.map +1 -1
  5. package/lib/data-governance/database-payload-lifecycle-repository.d.ts +0 -1
  6. package/lib/data-governance/database-payload-lifecycle-repository.js.map +1 -1
  7. package/lib/data-governance/disclosure-authority.d.ts +0 -1
  8. package/lib/data-governance/disclosure-authority.js.map +1 -1
  9. package/lib/data-governance/disclosure-manifest.d.ts +0 -1
  10. package/lib/data-governance/disclosure-manifest.js.map +1 -1
  11. package/lib/data-governance/durable-file-store.d.ts +0 -1
  12. package/lib/data-governance/durable-file-store.js.map +1 -1
  13. package/lib/data-governance/encrypted-database-payload-vault.d.ts +0 -1
  14. package/lib/data-governance/encrypted-database-payload-vault.js.map +1 -1
  15. package/lib/data-governance/encrypted-file-payload-vault.d.ts +0 -1
  16. package/lib/data-governance/encrypted-file-payload-vault.js.map +1 -1
  17. package/lib/data-governance/file-payload-lifecycle-repository.d.ts +0 -1
  18. package/lib/data-governance/file-payload-lifecycle-repository.js.map +1 -1
  19. package/lib/data-governance/governance-authority-repository.d.ts +0 -1
  20. package/lib/data-governance/governance-authority-repository.js.map +1 -1
  21. package/lib/data-governance/governed-payload-write-saga.d.ts +0 -1
  22. package/lib/data-governance/governed-payload-write-saga.js.map +1 -1
  23. package/lib/data-governance/payload-hold-overdue-projection.d.ts +0 -1
  24. package/lib/data-governance/payload-hold-overdue-projection.js.map +1 -1
  25. package/lib/data-governance/payload-lifecycle.d.ts +0 -1
  26. package/lib/data-governance/payload-lifecycle.js.map +1 -1
  27. package/lib/data-governance/payload-vault-storage-handoff.d.ts +0 -1
  28. package/lib/data-governance/payload-vault-storage-handoff.js.map +1 -1
  29. package/lib/data-governance.d.ts +0 -1
  30. package/lib/data-governance.js.map +1 -1
  31. package/lib/index.d.ts +0 -1
  32. package/lib/index.js.map +1 -1
  33. package/lib/portfolio/capacity-control-outbox.d.ts +0 -1
  34. package/lib/portfolio/capacity-control-outbox.js.map +1 -1
  35. package/lib/portfolio/database-capacity-control-outbox.d.ts +0 -1
  36. package/lib/portfolio/database-capacity-control-outbox.js.map +1 -1
  37. package/lib/portfolio/file-capacity-control-outbox.d.ts +0 -1
  38. package/lib/portfolio/file-capacity-control-outbox.js.map +1 -1
  39. package/lib/portfolio/file-portfolio-journal.d.ts +0 -1
  40. package/lib/portfolio/file-portfolio-journal.js.map +1 -1
  41. package/lib/portfolio/portfolio-admission.d.ts +0 -1
  42. package/lib/portfolio/portfolio-admission.js.map +1 -1
  43. package/lib/portfolio/portfolio-journal.d.ts +0 -1
  44. package/lib/portfolio/portfolio-journal.js.map +1 -1
  45. package/lib/portfolio/resource-bundle.d.ts +0 -1
  46. package/lib/portfolio/resource-bundle.js.map +1 -1
  47. package/lib/portfolio/sponsor-projection.d.ts +0 -1
  48. package/lib/portfolio/sponsor-projection.js.map +1 -1
  49. package/lib/portfolio.d.ts +0 -1
  50. package/lib/portfolio.js.map +1 -1
  51. package/lib/remote.d.ts +0 -1
  52. package/lib/remote.js.map +1 -1
  53. package/lib/room/database-room-task-journal.d.ts +0 -1
  54. package/lib/room/database-room-task-journal.js.map +1 -1
  55. package/lib/room/index.d.ts +0 -1
  56. package/lib/room/index.js.map +1 -1
  57. package/lib/room/room-bus.d.ts +0 -1
  58. package/lib/room/room-bus.js.map +1 -1
  59. package/lib/room/room-definition.d.ts +0 -1
  60. package/lib/room/room-definition.js.map +1 -1
  61. package/lib/room/room-event-sequencer.d.ts +0 -1
  62. package/lib/room/room-event-sequencer.js.map +1 -1
  63. package/lib/room/room-guards.d.ts +0 -1
  64. package/lib/room/room-guards.js.map +1 -1
  65. package/lib/room/room-membership.d.ts +0 -1
  66. package/lib/room/room-membership.js.map +1 -1
  67. package/lib/room/room-registry.d.ts +0 -1
  68. package/lib/room/room-registry.js.map +1 -1
  69. package/lib/room/room-router.d.ts +0 -1
  70. package/lib/room/room-router.js.map +1 -1
  71. package/lib/room/room-send-limiter.d.ts +0 -1
  72. package/lib/room/room-send-limiter.js.map +1 -1
  73. package/lib/room/room-task-authorizer.d.ts +0 -1
  74. package/lib/room/room-task-authorizer.js.map +1 -1
  75. package/lib/room/room-task-journal.d.ts +0 -1
  76. package/lib/room/room-task-journal.js.map +1 -1
  77. package/lib/room/room-task-service.d.ts +0 -1
  78. package/lib/room/room-task-service.js.map +1 -1
  79. package/lib/room/room-task.d.ts +0 -1
  80. package/lib/room/room-task.js.map +1 -1
  81. package/lib/room/validate-room.d.ts +0 -1
  82. package/lib/room/validate-room.js.map +1 -1
  83. package/lib/scheduler.d.ts +0 -1
  84. package/lib/scheduler.js.map +1 -1
  85. package/lib/workroom/acceptance-control.d.ts +0 -1
  86. package/lib/workroom/acceptance-control.js.map +1 -1
  87. package/lib/workroom/acceptance-policy.d.ts +0 -1
  88. package/lib/workroom/acceptance-policy.js.map +1 -1
  89. package/lib/workroom/accepted-source-memory-application.d.ts +0 -1
  90. package/lib/workroom/accepted-source-memory-application.js.map +1 -1
  91. package/lib/workroom/accepted-source-projector.d.ts +0 -1
  92. package/lib/workroom/accepted-source-projector.js.map +1 -1
  93. package/lib/workroom/assignment-authority-grant-application.d.ts +0 -1
  94. package/lib/workroom/assignment-authority-grant-application.js.map +1 -1
  95. package/lib/workroom/assignment-authority-grant-repository.d.ts +0 -1
  96. package/lib/workroom/assignment-authority-grant-repository.js.map +1 -1
  97. package/lib/workroom/assignment-authority.d.ts +0 -1
  98. package/lib/workroom/assignment-authority.js.map +1 -1
  99. package/lib/workroom/assignment-executor.d.ts +0 -1
  100. package/lib/workroom/assignment-executor.js.map +1 -1
  101. package/lib/workroom/assignment-observation-ingress.d.ts +0 -1
  102. package/lib/workroom/assignment-observation-ingress.js.map +1 -1
  103. package/lib/workroom/canonical-value.d.ts +0 -1
  104. package/lib/workroom/canonical-value.js.map +1 -1
  105. package/lib/workroom/catalog-definition.d.ts +0 -1
  106. package/lib/workroom/catalog-definition.js.map +1 -1
  107. package/lib/workroom/catalog.d.ts +0 -1
  108. package/lib/workroom/catalog.js.map +1 -1
  109. package/lib/workroom/coding-assignment-executor.d.ts +0 -1
  110. package/lib/workroom/coding-assignment-executor.js.map +1 -1
  111. package/lib/workroom/coding-git-objects.d.ts +0 -1
  112. package/lib/workroom/coding-git-objects.js.map +1 -1
  113. package/lib/workroom/database-project-knowledge-journal.d.ts +0 -1
  114. package/lib/workroom/database-project-knowledge-journal.js.map +1 -1
  115. package/lib/workroom/durable-file-store.d.ts +0 -1
  116. package/lib/workroom/durable-file-store.js.map +1 -1
  117. package/lib/workroom/dynamic-workflow-planner.d.ts +0 -1
  118. package/lib/workroom/dynamic-workflow-planner.js.map +1 -1
  119. package/lib/workroom/effect-blocker-repository.d.ts +0 -1
  120. package/lib/workroom/effect-blocker-repository.js.map +1 -1
  121. package/lib/workroom/effect-ledger.d.ts +0 -1
  122. package/lib/workroom/effect-ledger.js.map +1 -1
  123. package/lib/workroom/file-accepted-source-memory-repository.d.ts +0 -1
  124. package/lib/workroom/file-accepted-source-memory-repository.js.map +1 -1
  125. package/lib/workroom/file-coding-execution-store.d.ts +0 -1
  126. package/lib/workroom/file-coding-execution-store.js.map +1 -1
  127. package/lib/workroom/file-effect-ledger.d.ts +0 -1
  128. package/lib/workroom/file-effect-ledger.js.map +1 -1
  129. package/lib/workroom/file-human-ingress-application.d.ts +0 -1
  130. package/lib/workroom/file-human-ingress-application.js.map +1 -1
  131. package/lib/workroom/file-human-ingress.d.ts +0 -1
  132. package/lib/workroom/file-human-ingress.js.map +1 -1
  133. package/lib/workroom/file-interaction-space-binding-repository.d.ts +0 -1
  134. package/lib/workroom/file-interaction-space-binding-repository.js.map +1 -1
  135. package/lib/workroom/file-profile-journal.d.ts +0 -1
  136. package/lib/workroom/file-profile-journal.js.map +1 -1
  137. package/lib/workroom/git-workspace-gateway.d.ts +0 -1
  138. package/lib/workroom/git-workspace-gateway.js.map +1 -1
  139. package/lib/workroom/github-workspace-transport.d.ts +0 -1
  140. package/lib/workroom/github-workspace-transport.js.map +1 -1
  141. package/lib/workroom/governed-dispatch-reasons.d.ts +0 -1
  142. package/lib/workroom/governed-dispatch-reasons.js.map +1 -1
  143. package/lib/workroom/human-ingress-application.d.ts +0 -1
  144. package/lib/workroom/human-ingress-application.js.map +1 -1
  145. package/lib/workroom/human-ingress-orchestrator.d.ts +0 -1
  146. package/lib/workroom/human-ingress-orchestrator.js.map +1 -1
  147. package/lib/workroom/human-ingress-source-reader.d.ts +0 -1
  148. package/lib/workroom/human-ingress-source-reader.js.map +1 -1
  149. package/lib/workroom/human-ingress.d.ts +0 -1
  150. package/lib/workroom/human-ingress.js.map +1 -1
  151. package/lib/workroom/interaction-space-binding-service.d.ts +0 -1
  152. package/lib/workroom/interaction-space-binding-service.js.map +1 -1
  153. package/lib/workroom/interaction-space-router.d.ts +0 -1
  154. package/lib/workroom/interaction-space-router.js.map +1 -1
  155. package/lib/workroom/journal/activatable-journal.d.ts +0 -1
  156. package/lib/workroom/journal/activatable-journal.js.map +1 -1
  157. package/lib/workroom/journal/contracts.d.ts +0 -1
  158. package/lib/workroom/journal/contracts.js.map +1 -1
  159. package/lib/workroom/journal/database-journal.d.ts +0 -1
  160. package/lib/workroom/journal/database-journal.js.map +1 -1
  161. package/lib/workroom/journal/event-codec.d.ts +0 -1
  162. package/lib/workroom/journal/event-codec.js.map +1 -1
  163. package/lib/workroom/journal/event-validation.d.ts +0 -1
  164. package/lib/workroom/journal/event-validation.js.map +1 -1
  165. package/lib/workroom/journal/file-journal.d.ts +0 -1
  166. package/lib/workroom/journal/file-journal.js.map +1 -1
  167. package/lib/workroom/journal/index.d.ts +0 -1
  168. package/lib/workroom/journal/index.js.map +1 -1
  169. package/lib/workroom/journal/legacy-payload-guard.d.ts +0 -1
  170. package/lib/workroom/journal/legacy-payload-guard.js.map +1 -1
  171. package/lib/workroom/journal/memory-journal.d.ts +0 -1
  172. package/lib/workroom/journal/memory-journal.js.map +1 -1
  173. package/lib/workroom/journal/payload-governance.d.ts +0 -1
  174. package/lib/workroom/journal/payload-governance.js.map +1 -1
  175. package/lib/workroom/journal/payload-reference.d.ts +0 -1
  176. package/lib/workroom/journal/payload-reference.js.map +1 -1
  177. package/lib/workroom/journal/stored-event-projection.d.ts +0 -1
  178. package/lib/workroom/journal/stored-event-projection.js.map +1 -1
  179. package/lib/workroom/journal-model.d.ts +0 -1
  180. package/lib/workroom/journal-model.js.map +1 -1
  181. package/lib/workroom/kernel-contracts.d.ts +0 -1
  182. package/lib/workroom/kernel-contracts.js.map +1 -1
  183. package/lib/workroom/kernel-state.d.ts +0 -1
  184. package/lib/workroom/kernel-state.js.map +1 -1
  185. package/lib/workroom/local-assignment-issuance.d.ts +0 -1
  186. package/lib/workroom/local-assignment-issuance.js.map +1 -1
  187. package/lib/workroom/plan-approval-control.d.ts +0 -1
  188. package/lib/workroom/plan-approval-control.js.map +1 -1
  189. package/lib/workroom/plan-revision.d.ts +0 -1
  190. package/lib/workroom/plan-revision.js.map +1 -1
  191. package/lib/workroom/profile-compiler.d.ts +0 -1
  192. package/lib/workroom/profile-compiler.js.map +1 -1
  193. package/lib/workroom/profile-registry.d.ts +0 -1
  194. package/lib/workroom/profile-registry.js.map +1 -1
  195. package/lib/workroom/project-knowledge-registry.d.ts +0 -1
  196. package/lib/workroom/project-knowledge-registry.js.map +1 -1
  197. package/lib/workroom/projection-outbox/contracts.d.ts +0 -1
  198. package/lib/workroom/projection-outbox/contracts.js.map +1 -1
  199. package/lib/workroom/projection-outbox/delivery-worker.d.ts +0 -1
  200. package/lib/workroom/projection-outbox/delivery-worker.js.map +1 -1
  201. package/lib/workroom/projection-outbox/file-repository.d.ts +0 -1
  202. package/lib/workroom/projection-outbox/file-repository.js.map +1 -1
  203. package/lib/workroom/projection-outbox/index.d.ts +0 -1
  204. package/lib/workroom/projection-outbox/index.js.map +1 -1
  205. package/lib/workroom/projection-outbox/memory-repository.d.ts +0 -1
  206. package/lib/workroom/projection-outbox/memory-repository.js.map +1 -1
  207. package/lib/workroom/projection-outbox/projector.d.ts +0 -1
  208. package/lib/workroom/projection-outbox/projector.js.map +1 -1
  209. package/lib/workroom/projection-outbox/repository-state.d.ts +0 -1
  210. package/lib/workroom/projection-outbox/repository-state.js.map +1 -1
  211. package/lib/workroom/projection-outbox/tracer.d.ts +0 -1
  212. package/lib/workroom/projection-outbox/tracer.js.map +1 -1
  213. package/lib/workroom/remote-assignment-dispatch-command.d.ts +0 -1
  214. package/lib/workroom/remote-assignment-dispatch-command.js.map +1 -1
  215. package/lib/workroom/remote-assignment-issuance.d.ts +0 -1
  216. package/lib/workroom/remote-assignment-issuance.js.map +1 -1
  217. package/lib/workroom/remote-callback-application.d.ts +0 -1
  218. package/lib/workroom/remote-callback-application.js.map +1 -1
  219. package/lib/workroom/remote-callback-gateway.d.ts +0 -1
  220. package/lib/workroom/remote-callback-gateway.js.map +1 -1
  221. package/lib/workroom/remote-callback-inbox.d.ts +0 -1
  222. package/lib/workroom/remote-callback-inbox.js.map +1 -1
  223. package/lib/workroom/remote-callback-reconciliation-worker.d.ts +0 -1
  224. package/lib/workroom/remote-callback-reconciliation-worker.js.map +1 -1
  225. package/lib/workroom/remote-dispatch-admission.d.ts +0 -1
  226. package/lib/workroom/remote-dispatch-admission.js.map +1 -1
  227. package/lib/workroom/remote-dispatch-outbox.d.ts +0 -1
  228. package/lib/workroom/remote-dispatch-outbox.js.map +1 -1
  229. package/lib/workroom/remote-dispatch-scheduler.d.ts +0 -1
  230. package/lib/workroom/remote-dispatch-scheduler.js.map +1 -1
  231. package/lib/workroom/remote-dispatch-worker.d.ts +0 -1
  232. package/lib/workroom/remote-dispatch-worker.js.map +1 -1
  233. package/lib/workroom/remote-dispatch.d.ts +0 -1
  234. package/lib/workroom/remote-dispatch.js.map +1 -1
  235. package/lib/workroom/remote-executor.d.ts +0 -1
  236. package/lib/workroom/remote-executor.js.map +1 -1
  237. package/lib/workroom/role-capability-snapshot.d.ts +0 -1
  238. package/lib/workroom/role-capability-snapshot.js.map +1 -1
  239. package/lib/workroom/runtime.d.ts +0 -1
  240. package/lib/workroom/runtime.js.map +1 -1
  241. package/lib/workroom/scheduler-priority-control.d.ts +0 -1
  242. package/lib/workroom/scheduler-priority-control.js.map +1 -1
  243. package/lib/workroom/software-delivery-plan.d.ts +0 -1
  244. package/lib/workroom/software-delivery-plan.js.map +1 -1
  245. package/lib/workroom/validate-catalog.d.ts +0 -1
  246. package/lib/workroom/validate-catalog.js.map +1 -1
  247. package/lib/workroom/workflow-plan-builder.d.ts +0 -1
  248. package/lib/workroom/workflow-plan-builder.js.map +1 -1
  249. package/lib/workroom/workroom-assignment-knowledge-context.d.ts +0 -1
  250. package/lib/workroom/workroom-assignment-knowledge-context.js.map +1 -1
  251. package/lib/workroom/workroom-kernel.d.ts +0 -1
  252. package/lib/workroom/workroom-kernel.js.map +1 -1
  253. package/lib/workroom/workroom-preemption.d.ts +0 -1
  254. package/lib/workroom/workroom-preemption.js.map +1 -1
  255. package/lib/workroom/workroom-run-control.d.ts +0 -1
  256. package/lib/workroom/workroom-run-control.js.map +1 -1
  257. package/lib/workroom/workroom-scheduler-application.d.ts +0 -1
  258. package/lib/workroom/workroom-scheduler-application.js.map +1 -1
  259. package/lib/workroom/workroom-scheduler.d.ts +0 -1
  260. package/lib/workroom/workroom-scheduler.js.map +1 -1
  261. package/lib/workroom/workroom-task-report-store.d.ts +0 -1
  262. package/lib/workroom/workroom-task-report-store.js.map +1 -1
  263. package/lib/workroom-runtime/database-overlay-pack-promotion-repository.d.ts +0 -1
  264. package/lib/workroom-runtime/database-overlay-pack-promotion-repository.js.map +1 -1
  265. package/lib/workroom-runtime/github-actions-delivery-provider.d.ts +0 -1
  266. package/lib/workroom-runtime/github-actions-delivery-provider.js.map +1 -1
  267. package/lib/workroom-runtime/github-exact-merge-gateway.d.ts +0 -1
  268. package/lib/workroom-runtime/github-exact-merge-gateway.js.map +1 -1
  269. package/lib/workroom-runtime/github-workroom-capability.d.ts +0 -1
  270. package/lib/workroom-runtime/github-workroom-capability.js.map +1 -1
  271. package/lib/workroom-runtime/self-delivery-project-composition.d.ts +0 -1
  272. package/lib/workroom-runtime/self-delivery-project-composition.js.map +1 -1
  273. package/lib/workroom-runtime/self-delivery-project.d.ts +0 -1
  274. package/lib/workroom-runtime/self-delivery-project.js.map +1 -1
  275. package/lib/workroom-runtime/workroom-acceptance-authority.d.ts +0 -1
  276. package/lib/workroom-runtime/workroom-acceptance-authority.js.map +1 -1
  277. package/lib/workroom-runtime/workroom-acceptance-fact-providers.d.ts +0 -1
  278. package/lib/workroom-runtime/workroom-acceptance-fact-providers.js.map +1 -1
  279. package/lib/workroom-runtime/workroom-acceptance-internal-providers.d.ts +0 -1
  280. package/lib/workroom-runtime/workroom-acceptance-internal-providers.js.map +1 -1
  281. package/lib/workroom-runtime/workroom-acceptance-policy.d.ts +0 -1
  282. package/lib/workroom-runtime/workroom-acceptance-policy.js.map +1 -1
  283. package/lib/workroom-runtime/workroom-acceptance-production-composition.d.ts +0 -1
  284. package/lib/workroom-runtime/workroom-acceptance-production-composition.js.map +1 -1
  285. package/lib/workroom-runtime/workroom-acceptance-provider-composition.d.ts +0 -1
  286. package/lib/workroom-runtime/workroom-acceptance-provider-composition.js.map +1 -1
  287. package/lib/workroom-runtime/workroom-accepted-source-runtime.d.ts +0 -1
  288. package/lib/workroom-runtime/workroom-accepted-source-runtime.js.map +1 -1
  289. package/lib/workroom-runtime/workroom-assignment-authority-grant-runtime.d.ts +0 -1
  290. package/lib/workroom-runtime/workroom-assignment-authority-grant-runtime.js.map +1 -1
  291. package/lib/workroom-runtime/workroom-assignment-authority-provider.d.ts +0 -1
  292. package/lib/workroom-runtime/workroom-assignment-authority-provider.js.map +1 -1
  293. package/lib/workroom-runtime/workroom-assignment-knowledge-composition.d.ts +0 -1
  294. package/lib/workroom-runtime/workroom-assignment-knowledge-composition.js.map +1 -1
  295. package/lib/workroom-runtime/workroom-bot-identity.d.ts +0 -1
  296. package/lib/workroom-runtime/workroom-bot-identity.js.map +1 -1
  297. package/lib/workroom-runtime/workroom-capability-realization.d.ts +0 -1
  298. package/lib/workroom-runtime/workroom-capability-realization.js.map +1 -1
  299. package/lib/workroom-runtime/workroom-data-governance-authority-writer.d.ts +0 -1
  300. package/lib/workroom-runtime/workroom-data-governance-authority-writer.js.map +1 -1
  301. package/lib/workroom-runtime/workroom-data-governance-bootstrap.d.ts +0 -1
  302. package/lib/workroom-runtime/workroom-data-governance-bootstrap.js.map +1 -1
  303. package/lib/workroom-runtime/workroom-data-governance-composition.d.ts +0 -1
  304. package/lib/workroom-runtime/workroom-data-governance-composition.js.map +1 -1
  305. package/lib/workroom-runtime/workroom-data-governance-root-provider.d.ts +0 -1
  306. package/lib/workroom-runtime/workroom-data-governance-root-provider.js.map +1 -1
  307. package/lib/workroom-runtime/workroom-data-governance-runtime.d.ts +0 -1
  308. package/lib/workroom-runtime/workroom-data-governance-runtime.js.map +1 -1
  309. package/lib/workroom-runtime/workroom-data-governance-storage.d.ts +0 -1
  310. package/lib/workroom-runtime/workroom-data-governance-storage.js.map +1 -1
  311. package/lib/workroom-runtime/workroom-data-lifecycle-composition.d.ts +0 -1
  312. package/lib/workroom-runtime/workroom-data-lifecycle-composition.js.map +1 -1
  313. package/lib/workroom-runtime/workroom-data-lifecycle-console.d.ts +0 -1
  314. package/lib/workroom-runtime/workroom-data-lifecycle-console.js.map +1 -1
  315. package/lib/workroom-runtime/workroom-data-lifecycle-human-ingress.d.ts +0 -1
  316. package/lib/workroom-runtime/workroom-data-lifecycle-human-ingress.js.map +1 -1
  317. package/lib/workroom-runtime/workroom-database-models.d.ts +0 -1
  318. package/lib/workroom-runtime/workroom-database-models.js.map +1 -1
  319. package/lib/workroom-runtime/workroom-database-storage.d.ts +0 -1
  320. package/lib/workroom-runtime/workroom-database-storage.js.map +1 -1
  321. package/lib/workroom-runtime/workroom-delivery-gateway.d.ts +0 -1
  322. package/lib/workroom-runtime/workroom-delivery-gateway.js.map +1 -1
  323. package/lib/workroom-runtime/workroom-dynamic-planning-provider.d.ts +0 -1
  324. package/lib/workroom-runtime/workroom-dynamic-planning-provider.js.map +1 -1
  325. package/lib/workroom-runtime/workroom-dynamic-planning.d.ts +0 -1
  326. package/lib/workroom-runtime/workroom-dynamic-planning.js.map +1 -1
  327. package/lib/workroom-runtime/workroom-effect-composition.d.ts +0 -1
  328. package/lib/workroom-runtime/workroom-effect-composition.js.map +1 -1
  329. package/lib/workroom-runtime/workroom-effect-production.d.ts +0 -1
  330. package/lib/workroom-runtime/workroom-effect-production.js.map +1 -1
  331. package/lib/workroom-runtime/workroom-effect-runtime.d.ts +0 -1
  332. package/lib/workroom-runtime/workroom-effect-runtime.js.map +1 -1
  333. package/lib/workroom-runtime/workroom-governed-dispatch-composition.d.ts +0 -1
  334. package/lib/workroom-runtime/workroom-governed-dispatch-composition.js.map +1 -1
  335. package/lib/workroom-runtime/workroom-host-port.d.ts +0 -1
  336. package/lib/workroom-runtime/workroom-host-port.js.map +1 -1
  337. package/lib/workroom-runtime/workroom-journal-payload-composition.d.ts +0 -1
  338. package/lib/workroom-runtime/workroom-journal-payload-composition.js.map +1 -1
  339. package/lib/workroom-runtime/workroom-local-agent-core-adapter.d.ts +0 -1
  340. package/lib/workroom-runtime/workroom-local-agent-core-adapter.js.map +1 -1
  341. package/lib/workroom-runtime/workroom-local-agent-loop.d.ts +0 -1
  342. package/lib/workroom-runtime/workroom-local-agent-loop.js.map +1 -1
  343. package/lib/workroom-runtime/workroom-local-assignment-authority.d.ts +0 -1
  344. package/lib/workroom-runtime/workroom-local-assignment-authority.js.map +1 -1
  345. package/lib/workroom-runtime/workroom-local-assignment-executor.d.ts +0 -1
  346. package/lib/workroom-runtime/workroom-local-assignment-executor.js.map +1 -1
  347. package/lib/workroom-runtime/workroom-local-assignment-runtime.d.ts +0 -1
  348. package/lib/workroom-runtime/workroom-local-assignment-runtime.js.map +1 -1
  349. package/lib/workroom-runtime/workroom-local-assignment-supply.d.ts +0 -1
  350. package/lib/workroom-runtime/workroom-local-assignment-supply.js.map +1 -1
  351. package/lib/workroom-runtime/workroom-overlay-pack-promotion.d.ts +0 -1
  352. package/lib/workroom-runtime/workroom-overlay-pack-promotion.js.map +1 -1
  353. package/lib/workroom-runtime/workroom-payload-processor-recall.d.ts +0 -1
  354. package/lib/workroom-runtime/workroom-payload-processor-recall.js.map +1 -1
  355. package/lib/workroom-runtime/workroom-plan-gate-authority.d.ts +0 -1
  356. package/lib/workroom-runtime/workroom-plan-gate-authority.js.map +1 -1
  357. package/lib/workroom-runtime/workroom-portfolio-capacity.d.ts +0 -1
  358. package/lib/workroom-runtime/workroom-portfolio-capacity.js.map +1 -1
  359. package/lib/workroom-runtime/workroom-portfolio-checkpoint-ack.d.ts +0 -1
  360. package/lib/workroom-runtime/workroom-portfolio-checkpoint-ack.js.map +1 -1
  361. package/lib/workroom-runtime/workroom-portfolio-control-composition.d.ts +0 -1
  362. package/lib/workroom-runtime/workroom-portfolio-control-composition.js.map +1 -1
  363. package/lib/workroom-runtime/workroom-portfolio-control-runtime.d.ts +0 -1
  364. package/lib/workroom-runtime/workroom-portfolio-control-runtime.js.map +1 -1
  365. package/lib/workroom-runtime/workroom-portfolio-grant-assignment.d.ts +0 -1
  366. package/lib/workroom-runtime/workroom-portfolio-grant-assignment.js.map +1 -1
  367. package/lib/workroom-runtime/workroom-portfolio-kernel-authority.d.ts +0 -1
  368. package/lib/workroom-runtime/workroom-portfolio-kernel-authority.js.map +1 -1
  369. package/lib/workroom-runtime/workroom-portfolio-sponsor.d.ts +0 -1
  370. package/lib/workroom-runtime/workroom-portfolio-sponsor.js.map +1 -1
  371. package/lib/workroom-runtime/workroom-preemption-runtime.d.ts +0 -1
  372. package/lib/workroom-runtime/workroom-preemption-runtime.js.map +1 -1
  373. package/lib/workroom-runtime/workroom-priority-authority.d.ts +0 -1
  374. package/lib/workroom-runtime/workroom-priority-authority.js.map +1 -1
  375. package/lib/workroom-runtime/workroom-profile-authority-composition.d.ts +0 -1
  376. package/lib/workroom-runtime/workroom-profile-authority-composition.js.map +1 -1
  377. package/lib/workroom-runtime/workroom-profile-authority-runtime.d.ts +0 -1
  378. package/lib/workroom-runtime/workroom-profile-authority-runtime.js.map +1 -1
  379. package/lib/workroom-runtime/workroom-projection-outbound.d.ts +0 -1
  380. package/lib/workroom-runtime/workroom-projection-outbound.js.map +1 -1
  381. package/lib/workroom-runtime/workroom-projection-runtime.d.ts +0 -1
  382. package/lib/workroom-runtime/workroom-projection-runtime.js.map +1 -1
  383. package/lib/workroom-runtime/workroom-remote-assignment-authority.d.ts +0 -1
  384. package/lib/workroom-runtime/workroom-remote-assignment-authority.js.map +1 -1
  385. package/lib/workroom-runtime/workroom-remote-callback-runtime.d.ts +0 -1
  386. package/lib/workroom-runtime/workroom-remote-callback-runtime.js.map +1 -1
  387. package/lib/workroom-runtime/workroom-remote-executor.d.ts +0 -1
  388. package/lib/workroom-runtime/workroom-remote-executor.js.map +1 -1
  389. package/lib/workroom-runtime/workroom-reviewer-authority-runtime.d.ts +0 -1
  390. package/lib/workroom-runtime/workroom-reviewer-authority-runtime.js.map +1 -1
  391. package/lib/workroom-runtime/workroom-risk-acceptance-runtime.d.ts +0 -1
  392. package/lib/workroom-runtime/workroom-risk-acceptance-runtime.js.map +1 -1
  393. package/lib/workroom-runtime/workroom-run-profile-pin-authority.d.ts +0 -1
  394. package/lib/workroom-runtime/workroom-run-profile-pin-authority.js.map +1 -1
  395. package/lib/workroom-runtime/workroom-scheduler-portfolio-composition.d.ts +0 -1
  396. package/lib/workroom-runtime/workroom-scheduler-portfolio-composition.js.map +1 -1
  397. package/lib/workroom-runtime/workroom-scheduler-portfolio-contract.d.ts +0 -1
  398. package/lib/workroom-runtime/workroom-scheduler-portfolio-contract.js.map +1 -1
  399. package/lib/workroom-runtime/workroom-scheduler-portfolio-request-authority.d.ts +0 -1
  400. package/lib/workroom-runtime/workroom-scheduler-portfolio-request-authority.js.map +1 -1
  401. package/lib/workroom-runtime/workroom-scheduler-portfolio-supply.d.ts +0 -1
  402. package/lib/workroom-runtime/workroom-scheduler-portfolio-supply.js.map +1 -1
  403. package/lib/workroom-runtime/workroom-scheduler-route-registry.d.ts +0 -1
  404. package/lib/workroom-runtime/workroom-scheduler-route-registry.js.map +1 -1
  405. package/lib/workroom-runtime/workroom-scheduler-runtime.d.ts +0 -1
  406. package/lib/workroom-runtime/workroom-scheduler-runtime.js.map +1 -1
  407. package/package.json +7 -7
  408. package/lib/data-governance/canonical-value.d.ts.map +0 -1
  409. package/lib/data-governance/data-governance.d.ts.map +0 -1
  410. package/lib/data-governance/database-payload-lifecycle-repository.d.ts.map +0 -1
  411. package/lib/data-governance/disclosure-authority.d.ts.map +0 -1
  412. package/lib/data-governance/disclosure-manifest.d.ts.map +0 -1
  413. package/lib/data-governance/durable-file-store.d.ts.map +0 -1
  414. package/lib/data-governance/encrypted-database-payload-vault.d.ts.map +0 -1
  415. package/lib/data-governance/encrypted-file-payload-vault.d.ts.map +0 -1
  416. package/lib/data-governance/file-payload-lifecycle-repository.d.ts.map +0 -1
  417. package/lib/data-governance/governance-authority-repository.d.ts.map +0 -1
  418. package/lib/data-governance/governed-payload-write-saga.d.ts.map +0 -1
  419. package/lib/data-governance/payload-hold-overdue-projection.d.ts.map +0 -1
  420. package/lib/data-governance/payload-lifecycle.d.ts.map +0 -1
  421. package/lib/data-governance/payload-vault-storage-handoff.d.ts.map +0 -1
  422. package/lib/data-governance.d.ts.map +0 -1
  423. package/lib/index.d.ts.map +0 -1
  424. package/lib/portfolio/capacity-control-outbox.d.ts.map +0 -1
  425. package/lib/portfolio/database-capacity-control-outbox.d.ts.map +0 -1
  426. package/lib/portfolio/file-capacity-control-outbox.d.ts.map +0 -1
  427. package/lib/portfolio/file-portfolio-journal.d.ts.map +0 -1
  428. package/lib/portfolio/portfolio-admission.d.ts.map +0 -1
  429. package/lib/portfolio/portfolio-journal.d.ts.map +0 -1
  430. package/lib/portfolio/resource-bundle.d.ts.map +0 -1
  431. package/lib/portfolio/sponsor-projection.d.ts.map +0 -1
  432. package/lib/portfolio.d.ts.map +0 -1
  433. package/lib/remote.d.ts.map +0 -1
  434. package/lib/room/database-room-task-journal.d.ts.map +0 -1
  435. package/lib/room/index.d.ts.map +0 -1
  436. package/lib/room/room-bus.d.ts.map +0 -1
  437. package/lib/room/room-definition.d.ts.map +0 -1
  438. package/lib/room/room-event-sequencer.d.ts.map +0 -1
  439. package/lib/room/room-guards.d.ts.map +0 -1
  440. package/lib/room/room-membership.d.ts.map +0 -1
  441. package/lib/room/room-registry.d.ts.map +0 -1
  442. package/lib/room/room-router.d.ts.map +0 -1
  443. package/lib/room/room-send-limiter.d.ts.map +0 -1
  444. package/lib/room/room-task-authorizer.d.ts.map +0 -1
  445. package/lib/room/room-task-journal.d.ts.map +0 -1
  446. package/lib/room/room-task-service.d.ts.map +0 -1
  447. package/lib/room/room-task.d.ts.map +0 -1
  448. package/lib/room/validate-room.d.ts.map +0 -1
  449. package/lib/scheduler.d.ts.map +0 -1
  450. package/lib/workroom/acceptance-control.d.ts.map +0 -1
  451. package/lib/workroom/acceptance-policy.d.ts.map +0 -1
  452. package/lib/workroom/accepted-source-memory-application.d.ts.map +0 -1
  453. package/lib/workroom/accepted-source-projector.d.ts.map +0 -1
  454. package/lib/workroom/assignment-authority-grant-application.d.ts.map +0 -1
  455. package/lib/workroom/assignment-authority-grant-repository.d.ts.map +0 -1
  456. package/lib/workroom/assignment-authority.d.ts.map +0 -1
  457. package/lib/workroom/assignment-executor.d.ts.map +0 -1
  458. package/lib/workroom/assignment-observation-ingress.d.ts.map +0 -1
  459. package/lib/workroom/canonical-value.d.ts.map +0 -1
  460. package/lib/workroom/catalog-definition.d.ts.map +0 -1
  461. package/lib/workroom/catalog.d.ts.map +0 -1
  462. package/lib/workroom/coding-assignment-executor.d.ts.map +0 -1
  463. package/lib/workroom/coding-git-objects.d.ts.map +0 -1
  464. package/lib/workroom/database-project-knowledge-journal.d.ts.map +0 -1
  465. package/lib/workroom/durable-file-store.d.ts.map +0 -1
  466. package/lib/workroom/dynamic-workflow-planner.d.ts.map +0 -1
  467. package/lib/workroom/effect-blocker-repository.d.ts.map +0 -1
  468. package/lib/workroom/effect-ledger.d.ts.map +0 -1
  469. package/lib/workroom/file-accepted-source-memory-repository.d.ts.map +0 -1
  470. package/lib/workroom/file-coding-execution-store.d.ts.map +0 -1
  471. package/lib/workroom/file-effect-ledger.d.ts.map +0 -1
  472. package/lib/workroom/file-human-ingress-application.d.ts.map +0 -1
  473. package/lib/workroom/file-human-ingress.d.ts.map +0 -1
  474. package/lib/workroom/file-interaction-space-binding-repository.d.ts.map +0 -1
  475. package/lib/workroom/file-profile-journal.d.ts.map +0 -1
  476. package/lib/workroom/git-workspace-gateway.d.ts.map +0 -1
  477. package/lib/workroom/github-workspace-transport.d.ts.map +0 -1
  478. package/lib/workroom/governed-dispatch-reasons.d.ts.map +0 -1
  479. package/lib/workroom/human-ingress-application.d.ts.map +0 -1
  480. package/lib/workroom/human-ingress-orchestrator.d.ts.map +0 -1
  481. package/lib/workroom/human-ingress-source-reader.d.ts.map +0 -1
  482. package/lib/workroom/human-ingress.d.ts.map +0 -1
  483. package/lib/workroom/interaction-space-binding-service.d.ts.map +0 -1
  484. package/lib/workroom/interaction-space-router.d.ts.map +0 -1
  485. package/lib/workroom/journal/activatable-journal.d.ts.map +0 -1
  486. package/lib/workroom/journal/contracts.d.ts.map +0 -1
  487. package/lib/workroom/journal/database-journal.d.ts.map +0 -1
  488. package/lib/workroom/journal/event-codec.d.ts.map +0 -1
  489. package/lib/workroom/journal/event-validation.d.ts.map +0 -1
  490. package/lib/workroom/journal/file-journal.d.ts.map +0 -1
  491. package/lib/workroom/journal/index.d.ts.map +0 -1
  492. package/lib/workroom/journal/legacy-payload-guard.d.ts.map +0 -1
  493. package/lib/workroom/journal/memory-journal.d.ts.map +0 -1
  494. package/lib/workroom/journal/payload-governance.d.ts.map +0 -1
  495. package/lib/workroom/journal/payload-reference.d.ts.map +0 -1
  496. package/lib/workroom/journal/stored-event-projection.d.ts.map +0 -1
  497. package/lib/workroom/journal-model.d.ts.map +0 -1
  498. package/lib/workroom/kernel-contracts.d.ts.map +0 -1
  499. package/lib/workroom/kernel-state.d.ts.map +0 -1
  500. package/lib/workroom/local-assignment-issuance.d.ts.map +0 -1
  501. package/lib/workroom/plan-approval-control.d.ts.map +0 -1
  502. package/lib/workroom/plan-revision.d.ts.map +0 -1
  503. package/lib/workroom/profile-compiler.d.ts.map +0 -1
  504. package/lib/workroom/profile-registry.d.ts.map +0 -1
  505. package/lib/workroom/project-knowledge-registry.d.ts.map +0 -1
  506. package/lib/workroom/projection-outbox/contracts.d.ts.map +0 -1
  507. package/lib/workroom/projection-outbox/delivery-worker.d.ts.map +0 -1
  508. package/lib/workroom/projection-outbox/file-repository.d.ts.map +0 -1
  509. package/lib/workroom/projection-outbox/index.d.ts.map +0 -1
  510. package/lib/workroom/projection-outbox/memory-repository.d.ts.map +0 -1
  511. package/lib/workroom/projection-outbox/projector.d.ts.map +0 -1
  512. package/lib/workroom/projection-outbox/repository-state.d.ts.map +0 -1
  513. package/lib/workroom/projection-outbox/tracer.d.ts.map +0 -1
  514. package/lib/workroom/remote-assignment-dispatch-command.d.ts.map +0 -1
  515. package/lib/workroom/remote-assignment-issuance.d.ts.map +0 -1
  516. package/lib/workroom/remote-callback-application.d.ts.map +0 -1
  517. package/lib/workroom/remote-callback-gateway.d.ts.map +0 -1
  518. package/lib/workroom/remote-callback-inbox.d.ts.map +0 -1
  519. package/lib/workroom/remote-callback-reconciliation-worker.d.ts.map +0 -1
  520. package/lib/workroom/remote-dispatch-admission.d.ts.map +0 -1
  521. package/lib/workroom/remote-dispatch-outbox.d.ts.map +0 -1
  522. package/lib/workroom/remote-dispatch-scheduler.d.ts.map +0 -1
  523. package/lib/workroom/remote-dispatch-worker.d.ts.map +0 -1
  524. package/lib/workroom/remote-dispatch.d.ts.map +0 -1
  525. package/lib/workroom/remote-executor.d.ts.map +0 -1
  526. package/lib/workroom/role-capability-snapshot.d.ts.map +0 -1
  527. package/lib/workroom/runtime.d.ts.map +0 -1
  528. package/lib/workroom/scheduler-priority-control.d.ts.map +0 -1
  529. package/lib/workroom/software-delivery-plan.d.ts.map +0 -1
  530. package/lib/workroom/validate-catalog.d.ts.map +0 -1
  531. package/lib/workroom/workflow-plan-builder.d.ts.map +0 -1
  532. package/lib/workroom/workroom-assignment-knowledge-context.d.ts.map +0 -1
  533. package/lib/workroom/workroom-kernel.d.ts.map +0 -1
  534. package/lib/workroom/workroom-preemption.d.ts.map +0 -1
  535. package/lib/workroom/workroom-run-control.d.ts.map +0 -1
  536. package/lib/workroom/workroom-scheduler-application.d.ts.map +0 -1
  537. package/lib/workroom/workroom-scheduler.d.ts.map +0 -1
  538. package/lib/workroom/workroom-task-report-store.d.ts.map +0 -1
  539. package/lib/workroom-runtime/database-overlay-pack-promotion-repository.d.ts.map +0 -1
  540. package/lib/workroom-runtime/github-actions-delivery-provider.d.ts.map +0 -1
  541. package/lib/workroom-runtime/github-exact-merge-gateway.d.ts.map +0 -1
  542. package/lib/workroom-runtime/github-workroom-capability.d.ts.map +0 -1
  543. package/lib/workroom-runtime/self-delivery-project-composition.d.ts.map +0 -1
  544. package/lib/workroom-runtime/self-delivery-project.d.ts.map +0 -1
  545. package/lib/workroom-runtime/workroom-acceptance-authority.d.ts.map +0 -1
  546. package/lib/workroom-runtime/workroom-acceptance-fact-providers.d.ts.map +0 -1
  547. package/lib/workroom-runtime/workroom-acceptance-internal-providers.d.ts.map +0 -1
  548. package/lib/workroom-runtime/workroom-acceptance-policy.d.ts.map +0 -1
  549. package/lib/workroom-runtime/workroom-acceptance-production-composition.d.ts.map +0 -1
  550. package/lib/workroom-runtime/workroom-acceptance-provider-composition.d.ts.map +0 -1
  551. package/lib/workroom-runtime/workroom-accepted-source-runtime.d.ts.map +0 -1
  552. package/lib/workroom-runtime/workroom-assignment-authority-grant-runtime.d.ts.map +0 -1
  553. package/lib/workroom-runtime/workroom-assignment-authority-provider.d.ts.map +0 -1
  554. package/lib/workroom-runtime/workroom-assignment-knowledge-composition.d.ts.map +0 -1
  555. package/lib/workroom-runtime/workroom-bot-identity.d.ts.map +0 -1
  556. package/lib/workroom-runtime/workroom-capability-realization.d.ts.map +0 -1
  557. package/lib/workroom-runtime/workroom-data-governance-authority-writer.d.ts.map +0 -1
  558. package/lib/workroom-runtime/workroom-data-governance-bootstrap.d.ts.map +0 -1
  559. package/lib/workroom-runtime/workroom-data-governance-composition.d.ts.map +0 -1
  560. package/lib/workroom-runtime/workroom-data-governance-root-provider.d.ts.map +0 -1
  561. package/lib/workroom-runtime/workroom-data-governance-runtime.d.ts.map +0 -1
  562. package/lib/workroom-runtime/workroom-data-governance-storage.d.ts.map +0 -1
  563. package/lib/workroom-runtime/workroom-data-lifecycle-composition.d.ts.map +0 -1
  564. package/lib/workroom-runtime/workroom-data-lifecycle-console.d.ts.map +0 -1
  565. package/lib/workroom-runtime/workroom-data-lifecycle-human-ingress.d.ts.map +0 -1
  566. package/lib/workroom-runtime/workroom-database-models.d.ts.map +0 -1
  567. package/lib/workroom-runtime/workroom-database-storage.d.ts.map +0 -1
  568. package/lib/workroom-runtime/workroom-delivery-gateway.d.ts.map +0 -1
  569. package/lib/workroom-runtime/workroom-dynamic-planning-provider.d.ts.map +0 -1
  570. package/lib/workroom-runtime/workroom-dynamic-planning.d.ts.map +0 -1
  571. package/lib/workroom-runtime/workroom-effect-composition.d.ts.map +0 -1
  572. package/lib/workroom-runtime/workroom-effect-production.d.ts.map +0 -1
  573. package/lib/workroom-runtime/workroom-effect-runtime.d.ts.map +0 -1
  574. package/lib/workroom-runtime/workroom-governed-dispatch-composition.d.ts.map +0 -1
  575. package/lib/workroom-runtime/workroom-host-port.d.ts.map +0 -1
  576. package/lib/workroom-runtime/workroom-journal-payload-composition.d.ts.map +0 -1
  577. package/lib/workroom-runtime/workroom-local-agent-core-adapter.d.ts.map +0 -1
  578. package/lib/workroom-runtime/workroom-local-agent-loop.d.ts.map +0 -1
  579. package/lib/workroom-runtime/workroom-local-assignment-authority.d.ts.map +0 -1
  580. package/lib/workroom-runtime/workroom-local-assignment-executor.d.ts.map +0 -1
  581. package/lib/workroom-runtime/workroom-local-assignment-runtime.d.ts.map +0 -1
  582. package/lib/workroom-runtime/workroom-local-assignment-supply.d.ts.map +0 -1
  583. package/lib/workroom-runtime/workroom-overlay-pack-promotion.d.ts.map +0 -1
  584. package/lib/workroom-runtime/workroom-payload-processor-recall.d.ts.map +0 -1
  585. package/lib/workroom-runtime/workroom-plan-gate-authority.d.ts.map +0 -1
  586. package/lib/workroom-runtime/workroom-portfolio-capacity.d.ts.map +0 -1
  587. package/lib/workroom-runtime/workroom-portfolio-checkpoint-ack.d.ts.map +0 -1
  588. package/lib/workroom-runtime/workroom-portfolio-control-composition.d.ts.map +0 -1
  589. package/lib/workroom-runtime/workroom-portfolio-control-runtime.d.ts.map +0 -1
  590. package/lib/workroom-runtime/workroom-portfolio-grant-assignment.d.ts.map +0 -1
  591. package/lib/workroom-runtime/workroom-portfolio-kernel-authority.d.ts.map +0 -1
  592. package/lib/workroom-runtime/workroom-portfolio-sponsor.d.ts.map +0 -1
  593. package/lib/workroom-runtime/workroom-preemption-runtime.d.ts.map +0 -1
  594. package/lib/workroom-runtime/workroom-priority-authority.d.ts.map +0 -1
  595. package/lib/workroom-runtime/workroom-profile-authority-composition.d.ts.map +0 -1
  596. package/lib/workroom-runtime/workroom-profile-authority-runtime.d.ts.map +0 -1
  597. package/lib/workroom-runtime/workroom-projection-outbound.d.ts.map +0 -1
  598. package/lib/workroom-runtime/workroom-projection-runtime.d.ts.map +0 -1
  599. package/lib/workroom-runtime/workroom-remote-assignment-authority.d.ts.map +0 -1
  600. package/lib/workroom-runtime/workroom-remote-callback-runtime.d.ts.map +0 -1
  601. package/lib/workroom-runtime/workroom-remote-executor.d.ts.map +0 -1
  602. package/lib/workroom-runtime/workroom-reviewer-authority-runtime.d.ts.map +0 -1
  603. package/lib/workroom-runtime/workroom-risk-acceptance-runtime.d.ts.map +0 -1
  604. package/lib/workroom-runtime/workroom-run-profile-pin-authority.d.ts.map +0 -1
  605. package/lib/workroom-runtime/workroom-scheduler-portfolio-composition.d.ts.map +0 -1
  606. package/lib/workroom-runtime/workroom-scheduler-portfolio-contract.d.ts.map +0 -1
  607. package/lib/workroom-runtime/workroom-scheduler-portfolio-request-authority.d.ts.map +0 -1
  608. package/lib/workroom-runtime/workroom-scheduler-portfolio-supply.d.ts.map +0 -1
  609. package/lib/workroom-runtime/workroom-scheduler-route-registry.d.ts.map +0 -1
  610. package/lib/workroom-runtime/workroom-scheduler-runtime.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"database-room-task-journal.js","sourceRoot":"","sources":["../../src/room/database-room-task-journal.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"database-room-task-journal.js","sourceRoot":"","sources":["../../src/room/database-room-task-journal.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto';\nimport { canonicalWorkroomJson, digestCanonicalWorkroomValue, deepFreezeWorkroomValue } from '../workroom/canonical-value.js';\nimport { replayRoomTasks, type RoomTaskEvent } from './room-task.js';\nimport {\n RoomTaskJournalCorruptionError,\n RoomTaskSequenceConflictError,\n assertRoomTaskAppend,\n type RoomTaskJournal,\n} from './room-task-journal.js';\n\nexport const ROOM_TASK_EVENTS_TABLE = 'room_task_events';\n\nexport interface RoomTaskDatabaseModel {\n select(...fields: string[]): { where(query: Record<string, unknown>): Promise<Record<string, unknown>[]> };\n}\n\nexport interface RoomTaskDatabaseTransaction {\n select(table: string): { where(query: Record<string, unknown>): Promise<Record<string, unknown>[]> };\n insertMany(table: string, rows: Record<string, unknown>[]): Promise<unknown>;\n}\n\nexport interface RoomTaskDatabase {\n transaction<T>(\n operation: (transaction: RoomTaskDatabaseTransaction) => Promise<T>,\n options: { isolationLevel: 'SERIALIZABLE' },\n ): Promise<T>;\n}\n\nexport const ROOM_TASK_EVENT_MODEL = {\n id: { type: 'text' as const, primary: true, nullable: false },\n room_id: { type: 'text' as const, nullable: false },\n sequence: { type: 'integer' as const, nullable: false },\n event_id: { type: 'text' as const, nullable: false },\n type: { type: 'text' as const, nullable: false },\n event_digest: { type: 'text' as const, nullable: false },\n event_json: { type: 'text' as const, nullable: false },\n row_binding_digest: { type: 'text' as const, nullable: false },\n};\n\n/** Registers the table schema. Not wired into defineWorkroomDatabaseModels yet (runtime wiring is C1). */\nexport function defineRoomTaskDatabaseModel(\n database: Readonly<{ define(name: string, definition: unknown): void }>,\n): void {\n database.define(ROOM_TASK_EVENTS_TABLE, ROOM_TASK_EVENT_MODEL);\n}\n\nconst COLUMNS = Object.keys(ROOM_TASK_EVENT_MODEL);\n\nexport class DatabaseRoomTaskJournal implements RoomTaskJournal {\n constructor(\n readonly database: RoomTaskDatabase,\n readonly model: RoomTaskDatabaseModel,\n ) {}\n\n async read(roomId: string): Promise<readonly RoomTaskEvent[]> {\n const id = requiredRoom(roomId);\n return parseRows(id, await this.model.select().where({ room_id: id }));\n }\n\n async append(\n roomId: string,\n expectedSequence: number,\n events: readonly RoomTaskEvent[],\n ): Promise<readonly RoomTaskEvent[]> {\n const id = requiredRoom(roomId);\n if (!Number.isSafeInteger(expectedSequence) || expectedSequence < -1) throw new Error('expectedSequence is invalid');\n if (events.length === 0) {\n assertRoomTaskAppend(id, await this.read(id), expectedSequence, []);\n return Object.freeze([]);\n }\n const batch = events.map(event => JSON.parse(JSON.stringify(event)) as RoomTaskEvent);\n try {\n return await this.database.transaction(async transaction => {\n const current = parseRows(id, await transaction.select(ROOM_TASK_EVENTS_TABLE).where({ room_id: id }));\n assertRoomTaskAppend(id, current, expectedSequence, batch);\n await transaction.insertMany(ROOM_TASK_EVENTS_TABLE, batch.map(toRow));\n return deepFreezeWorkroomValue(batch);\n }, { isolationLevel: 'SERIALIZABLE' });\n } catch (error) {\n if (error instanceof RoomTaskJournalCorruptionError) throw error;\n // Lost a race, retried an already-written batch, or committed before failing: reread and classify.\n const winner = await this.read(id);\n const written = winner.slice(expectedSequence + 1, expectedSequence + 1 + batch.length);\n if (written.length === batch.length\n && written.every((event, index) => canonicalWorkroomJson(event) === canonicalWorkroomJson(batch[index]))) {\n return written;\n }\n const actual = winner.length - 1;\n if (actual !== expectedSequence) throw new RoomTaskSequenceConflictError(id, expectedSequence, actual);\n throw error;\n }\n }\n}\n\nfunction requiredRoom(value: unknown): string {\n if (typeof value !== 'string' || !value.trim() || value !== value.trim()) throw new Error('roomId is invalid');\n return value;\n}\n\nfunction rowId(roomId: string, sequence: number): string {\n return `${createHash('sha256').update(roomId).digest('hex')}:${sequence}`;\n}\n\nfunction bindingDigest(row: { id: string; room_id: string; sequence: number; event_id: string; type: string; event_digest: string }): string {\n return digestCanonicalWorkroomValue({\n id: row.id,\n room_id: row.room_id,\n sequence: row.sequence,\n event_id: row.event_id,\n type: row.type,\n event_digest: row.event_digest,\n });\n}\n\nfunction toRow(event: RoomTaskEvent): Record<string, unknown> {\n const base = {\n id: rowId(event.roomId, event.sequence),\n room_id: event.roomId,\n sequence: event.sequence,\n event_id: event.eventId,\n type: event.type,\n event_digest: digestCanonicalWorkroomValue(event),\n };\n return {\n ...base,\n event_json: canonicalWorkroomJson(event),\n row_binding_digest: bindingDigest(base),\n };\n}\n\nfunction corrupt(message: string): never {\n throw new RoomTaskJournalCorruptionError(message);\n}\n\nfunction parseRows(roomId: string, rows: readonly Record<string, unknown>[]): readonly RoomTaskEvent[] {\n for (const row of rows) {\n const keys = Object.keys(row);\n if (keys.length !== COLUMNS.length || COLUMNS.some(key => !Object.hasOwn(row, key))) corrupt('row column set drift');\n if (!Number.isSafeInteger(row.sequence) || Number(row.sequence) < 0) corrupt('row sequence is invalid');\n }\n const sorted = [...rows].sort((left, right) => Number(left.sequence) - Number(right.sequence));\n const events = sorted.map((row, index) => {\n if (row.room_id !== roomId) corrupt('row room_id drift');\n if (Number(row.sequence) !== index) corrupt(`sequence gap or duplicate at ${index}`);\n if (row.id !== rowId(roomId, index)) corrupt(`row id drift at ${index}`);\n if (typeof row.event_json !== 'string') corrupt('event_json is not text');\n let event: RoomTaskEvent;\n try {\n event = JSON.parse(row.event_json as string) as RoomTaskEvent;\n } catch {\n return corrupt(`event_json is not valid JSON at ${index}`);\n }\n if (canonicalWorkroomJson(event) !== row.event_json) corrupt(`event_json is not canonical at ${index}`);\n if (digestCanonicalWorkroomValue(event) !== row.event_digest) corrupt(`event_digest mismatch at ${index}`);\n if (event.sequence !== index || event.roomId !== roomId || event.eventId !== row.event_id || event.type !== row.type) {\n corrupt(`row/event binding drift at ${index}`);\n }\n const expected = bindingDigest({\n id: row.id as string,\n room_id: row.room_id as string,\n sequence: index,\n event_id: row.event_id as string,\n type: row.type as string,\n event_digest: row.event_digest as string,\n });\n if (row.row_binding_digest !== expected) corrupt(`row_binding_digest mismatch at ${index}`);\n return event;\n });\n try {\n replayRoomTasks(roomId, events);\n } catch (error) {\n corrupt(error instanceof Error ? error.message : String(error));\n }\n return deepFreezeWorkroomValue(Object.freeze(events));\n}\n"]}
@@ -12,4 +12,3 @@ export * from './room-guards.js';
12
12
  export * from './room-task-authorizer.js';
13
13
  export * from './room-send-limiter.js';
14
14
  export * from './room-event-sequencer.js';
15
- //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/room/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/room/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC","sourcesContent":["export * from './room-definition.js';\nexport * from './validate-room.js';\nexport * from './room-registry.js';\nexport * from './room-router.js';\nexport * from './room-membership.js';\nexport * from './room-bus.js';\nexport * from './room-task.js';\nexport * from './room-task-journal.js';\nexport * from './database-room-task-journal.js';\nexport * from './room-task-service.js';\nexport * from './room-guards.js';\nexport * from './room-task-authorizer.js';\nexport * from './room-send-limiter.js';\nexport * from './room-event-sequencer.js';\n"]}
@@ -42,4 +42,3 @@ export interface RoomBusOptions {
42
42
  };
43
43
  }
44
44
  export declare function createRoomBus(options: RoomBusOptions): RoomBus;
45
- //# sourceMappingURL=room-bus.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"room-bus.js","sourceRoot":"","sources":["../../src/room/room-bus.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"room-bus.js","sourceRoot":"","sources":["../../src/room/room-bus.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PluginId } from '@zhin.js/plugin-runtime';\nimport type { OutboundMessageService } from '@zhin.js/core/runtime';\nimport type { RoomRegistry } from './room-registry.js';\n\n/**\n * Minimal handoff event. Task state (accepted / done / ...) belongs to the Task state machine\n * (B3) and is intentionally absent here.\n */\nexport interface RoomHandoffEvent {\n readonly id: string;\n readonly room: string;\n /** Agent name of the handing-off member. */\n readonly from: string;\n /** Agent name of the receiving member. */\n readonly to: string;\n readonly text: string;\n readonly taskRef?: string;\n /** Epoch milliseconds. */\n readonly at: number;\n}\n\nexport interface RoomHandoffResult {\n /** At least one subscriber accepted the event. */\n readonly delivered: boolean;\n /** The group-visible projection was sent through the normal send chain. */\n readonly projected: boolean;\n readonly projectionError?: string;\n /** Set when validation refused the handoff; nothing was projected or delivered. */\n readonly rejection?: string;\n}\n\nexport interface RoomBus {\n handoff(event: RoomHandoffEvent): Promise<RoomHandoffResult>;\n subscribe(listener: (event: RoomHandoffEvent) => void | Promise<void>): () => void;\n}\n\nexport interface RoomBusOptions {\n readonly registry: RoomRegistry;\n /** The only way the Bus talks to the group: the normal outbound chain. */\n readonly outbound: Pick<OutboundMessageService, 'send'>;\n readonly requester: PluginId;\n /** Bot account (user id) of a runtime Endpoint, e.g. PeerRegistry.selfOf. */\n readonly accountOf: (endpointId: string) => string | undefined;\n readonly logger?: { warn(message: string): void };\n}\n\nexport function createRoomBus(options: RoomBusOptions): RoomBus {\n const { registry, outbound, requester, accountOf, logger } = options;\n const listeners = new Set<(event: RoomHandoffEvent) => void | Promise<void>>();\n\n const reject = (rejection: string): RoomHandoffResult => ({ delivered: false, projected: false, rejection });\n\n return Object.freeze({\n subscribe(listener: (event: RoomHandoffEvent) => void | Promise<void>) {\n listeners.add(listener);\n return () => { listeners.delete(listener); };\n },\n\n async handoff(event: RoomHandoffEvent): Promise<RoomHandoffResult> {\n if (typeof event.id !== 'string' || event.id === '') return reject('handoff id must not be empty');\n const room = registry.room(event.room);\n if (!room) return reject(`unknown room \"${event.room}\"`);\n const from = room.memberByAgent(event.from);\n if (!from) return reject(`\"${event.from}\" is not a member of room ${room.id}`);\n const to = room.memberByAgent(event.to);\n if (!to) return reject(`\"${event.to}\" is not a member of room ${room.id}`);\n if (from === to) return reject('a member cannot hand off to itself');\n if (!from.role.handoffTo?.includes(to.roleName)) {\n return reject(`role \"${from.roleName}\" may not hand off to role \"${to.roleName}\"`);\n }\n\n // Group-visible projection first, through the normal send chain only\n // (OutboundMessageService.send -> OutboundRenderer -> outbound middleware -> Endpoint).\n let projected = false;\n let projectionError: string | undefined;\n try {\n const { adapter, kind, id } = room.definition.conversation;\n const account = accountOf(to.endpointId);\n const receipt = await outbound.send({\n conversation: { endpoint: { id: from.endpointId, adapter }, kind, id },\n requester,\n content: account !== undefined\n ? [\n { type: 'mention', data: { target: account, name: to.agent } },\n { type: 'text', data: { text: ` ${event.text}` } },\n ]\n : `@${to.agent} ${event.text}`,\n });\n projected = receipt.status === 'sent';\n if (!projected) projectionError = receipt.failure?.code ?? receipt.status;\n } catch (error) {\n projectionError = error instanceof Error ? error.message : String(error);\n }\n if (projectionError !== undefined) {\n // Never swallow the event: the caller learns the projection failed and subscribers still wake.\n logger?.warn(`room ${room.id} handoff ${event.id} projection failed: ${projectionError}`);\n }\n\n let accepted = 0;\n const results = await Promise.allSettled([...listeners].map(async (listener) => listener(event)));\n for (const result of results) {\n if (result.status === 'fulfilled') accepted++;\n else logger?.warn(`room ${room.id} handoff ${event.id} subscriber failed: ${\n result.reason instanceof Error ? result.reason.message : String(result.reason)}`);\n }\n\n return {\n delivered: accepted > 0,\n projected,\n ...(projectionError !== undefined ? { projectionError } : {}),\n };\n },\n });\n}\n"]}
@@ -72,4 +72,3 @@ export interface RoomDefinition {
72
72
  /** Optional; must be the agent name of a member. */
73
73
  coordinator?: string;
74
74
  }
75
- //# sourceMappingURL=room-definition.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"room-definition.js","sourceRoot":"","sources":["../../src/room/room-definition.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,iDAAiD;AACjD,MAAM,CAAC,MAAM,eAAe,GAAG,4BAA4B,CAAC;AAC5D,yBAAyB;AACzB,MAAM,CAAC,MAAM,sBAAsB,GAAG,yBAAyB,CAAC;AAChE,kDAAkD;AAClD,MAAM,CAAC,MAAM,kBAAkB,GAAG,4BAA4B,CAAC;AAC/D,6CAA6C;AAC7C,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AACnC;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,SAAS,CAAU,CAAC,CAAC;AACpF,gGAAgG;AAChG,MAAM,CAAC,MAAM,mBAAmB,GAAsB,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"room-definition.js","sourceRoot":"","sources":["../../src/room/room-definition.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,iDAAiD;AACjD,MAAM,CAAC,MAAM,eAAe,GAAG,4BAA4B,CAAC;AAC5D,yBAAyB;AACzB,MAAM,CAAC,MAAM,sBAAsB,GAAG,yBAAyB,CAAC;AAChE,kDAAkD;AAClD,MAAM,CAAC,MAAM,kBAAkB,GAAG,4BAA4B,CAAC;AAC/D,6CAA6C;AAC7C,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AACnC;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,SAAS,CAAU,CAAC,CAAC;AACpF,gGAAgG;AAChG,MAAM,CAAC,MAAM,mBAAmB,GAAsB,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC","sourcesContent":["/**\n * Room / Member / Role definition types (pure data, no runtime dependencies).\n *\n * A Room binds one IM conversation to a small team of Agents. Each member speaks through its own\n * Bot account. A coordinator is optional; without one, work is matched by Role.\n */\n\n/** Room id pattern (key of the rooms record). */\nexport const ROOM_ID_PATTERN = /^[a-z0-9][a-z0-9_-]{0,63}$/;\n/** Role name pattern. */\nexport const ROOM_ROLE_NAME_PATTERN = /^[a-z][a-z0-9_-]{0,31}$/;\n/** Member alias pattern (used for @ matching). */\nexport const ROOM_ALIAS_PATTERN = /^[a-z0-9][a-z0-9_-]{0,31}$/;\n/** Maximum number of members in one Room. */\nexport const ROOM_MAX_MEMBERS = 16;\n/**\n * Allowed conversation kinds (frozen). Conversation ownership is global per `adapter:kind:id`;\n * the endpoint is NOT part of that key.\n */\nexport const ROOM_CONVERSATION_KINDS = Object.freeze(['group', 'channel'] as const);\n/** Names that can never be used as room id or role name (prototype pollution guard; frozen). */\nexport const ROOM_RESERVED_NAMES: readonly string[] = Object.freeze(['__proto__', 'constructor', 'prototype']);\n\nexport type RoomConversationKind = (typeof ROOM_CONVERSATION_KINDS)[number];\n\n/**\n * Conversation binding. Ownership is keyed by `adapter:kind:id` (endpoint excluded), so two enabled\n * Rooms cannot claim the same group through different Bots. `endpoint` is the Bot the Room uses.\n */\nexport interface RoomConversationBinding {\n adapter: string;\n endpoint: string;\n kind: RoomConversationKind;\n id: string;\n}\n\nexport interface RoomRoleDefinition {\n description?: string;\n /** Instruction prompt for members holding this role. */\n prompt: string;\n /**\n * Upper bound of tools this role may use. When omitted, nothing extra is granted; the existing\n * security policy alone decides.\n */\n tools?: readonly string[];\n /** Task categories this role accepts. When omitted, any category is accepted. */\n accepts?: readonly string[];\n /**\n * Role names this role may hand off to. When omitted, handoff is NOT allowed\n * (least privilege, fail-closed). Must not reference the role itself.\n */\n handoffTo?: readonly string[];\n}\n\nexport interface RoomMemberBotEndpoint {\n adapter: string;\n endpoint: string;\n}\n\nexport interface RoomMemberDefinition {\n /** Agent name; one member is exactly one Agent. */\n agent: string;\n /** Key of `roles`. */\n role: string;\n /** Dedicated Bot account this member speaks with; not shared within a Room; adapter must equal the Room conversation adapter. */\n botEndpoint: RoomMemberBotEndpoint;\n /** Optional @ aliases; unique within the Room (case-insensitive, including agent names). Agent names are also unique case-insensitively. */\n aliases?: readonly string[];\n}\n\nexport interface RoomDefinition {\n name: string;\n description?: string;\n /** Defaults to enabled; `false` keeps structural validation but skips cross-room conflicts. */\n enabled?: boolean;\n conversation: RoomConversationBinding;\n roles: Record<string, RoomRoleDefinition>;\n members: readonly RoomMemberDefinition[];\n /** Optional; must be the agent name of a member. */\n coordinator?: string;\n}\n"]}
@@ -26,4 +26,3 @@ export declare function createRoomEventSequencer<T extends {
26
26
  roomId: string;
27
27
  sequence: number;
28
28
  }>(options?: RoomEventSequencerOptions): RoomEventSequencer<T>;
29
- //# sourceMappingURL=room-event-sequencer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"room-event-sequencer.js","sourceRoot":"","sources":["../../src/room/room-event-sequencer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"room-event-sequencer.js","sourceRoot":"","sources":["../../src/room/room-event-sequencer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Per-Room ordering / de-duplication of sequenced events (pure, no IO).\n *\n * RoomTaskService dispatches subscribers outside the Room serial section, so events of one Room may arrive\n * interleaved or out of order. `accept` releases events strictly in `sequence` order: a duplicate or stale\n * event is dropped, a future one is buffered until the gap is filled.\n */\n\nexport interface RoomEventSequencerOptions {\n /** First expected sequence per Room (default 0: journal sequences are contiguous from 0). */\n readonly startAt?: number;\n /** Maximum buffered (out-of-order) events per Room; exceeding it throws RangeError (fail-closed). Default 1024. */\n readonly maxBuffered?: number;\n}\n\nexport interface RoomEventSequencer<T extends { roomId: string; sequence: number }> {\n /** Events now releasable in order: [] for a duplicate / stale / buffered event. */\n accept(event: T): T[];\n /** Next expected sequence of the Room. */\n watermark(roomId: string): number;\n /** Forgets one Room (or all); buffered events are discarded. */\n reset(roomId?: string): void;\n}\n\ninterface RoomCursor<T> {\n next: number;\n readonly buffer: Map<number, T>;\n}\n\nexport function createRoomEventSequencer<T extends { roomId: string; sequence: number }>(\n options: RoomEventSequencerOptions = {},\n): RoomEventSequencer<T> {\n const startAt = options.startAt ?? 0;\n const maxBuffered = options.maxBuffered ?? 1024;\n if (!Number.isSafeInteger(startAt) || startAt < 0) throw new RangeError('startAt must be a non-negative integer');\n if (!Number.isSafeInteger(maxBuffered) || maxBuffered < 0) throw new RangeError('maxBuffered must be a non-negative integer');\n const cursors = new Map<string, RoomCursor<T>>();\n const cursorOf = (roomId: string): RoomCursor<T> => {\n let cursor = cursors.get(roomId);\n if (!cursor) {\n cursor = { next: startAt, buffer: new Map() };\n cursors.set(roomId, cursor);\n }\n return cursor;\n };\n\n return {\n accept(event) {\n if (!Number.isSafeInteger(event.sequence) || event.sequence < 0) {\n throw new TypeError(`event sequence must be a non-negative integer, got ${String(event.sequence)}`);\n }\n const cursor = cursorOf(event.roomId);\n if (event.sequence < cursor.next || cursor.buffer.has(event.sequence)) return [];\n if (event.sequence > cursor.next) {\n if (cursor.buffer.size >= maxBuffered) {\n throw new RangeError(`room ${event.roomId} has more than ${maxBuffered} out-of-order events buffered`);\n }\n cursor.buffer.set(event.sequence, event);\n return [];\n }\n const released: T[] = [event];\n cursor.next += 1;\n for (let held = cursor.buffer.get(cursor.next); held !== undefined; held = cursor.buffer.get(cursor.next)) {\n cursor.buffer.delete(cursor.next);\n released.push(held);\n cursor.next += 1;\n }\n return released;\n },\n watermark: (roomId) => cursors.get(roomId)?.next ?? startAt,\n reset(roomId) {\n if (roomId === undefined) cursors.clear();\n else cursors.delete(roomId);\n },\n };\n}\n"]}
@@ -102,4 +102,3 @@ export interface RoomGuards {
102
102
  */
103
103
  export declare function countPairHandoffs(events: readonly RoomTaskEvent[], taskId: string, a: string, b: string): number;
104
104
  export declare function createRoomGuards(options?: RoomGuardOptions): RoomGuards;
105
- //# sourceMappingURL=room-guards.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"room-guards.js","sourceRoot":"","sources":["../../src/room/room-guards.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"room-guards.js","sourceRoot":"","sources":["../../src/room/room-guards.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,MAAM,SAAS,GAAG,MAAM,CAAC;AACzB,MAAM,eAAe,GAAG,IAAI,CAAC;AAY7B,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAEpC;IAEA;IAHX,YACW,IAA4B,EACrC,OAAe,EACN,YAAqB;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAC;QAJN,SAAI,GAAJ,IAAI,CAAwB;QAE5B,iBAAY,GAAZ,YAAY,CAAS;QAG9B,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAyFD;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAgC,EAAE,MAAc,EAAE,CAAS,EAAE,CAAS;IACtG,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;YAAE,SAAS;QACvE,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;YAAE,KAAK,IAAI,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,KAAyB,EAAE,QAAgB;IACzE,MAAM,QAAQ,GAAG,KAAK,IAAI,QAAQ,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,UAAU,CAAC,qBAAqB,IAAI,oCAAoC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACxG,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAcD,MAAM,UAAU,gBAAgB,CAAC,UAA4B,EAAE;IAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9C,MAAM,eAAe,GAAG,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;IAChF,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACpE,MAAM,iBAAiB,GAAG,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IACvF,MAAM,cAAc,GAAG,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IAC7E,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3B,IAAI,OAAO,CAAC,iBAAiB,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACzF,MAAM,IAAI,SAAS,CAAC,qEAAqE,CAAC,CAAC;IAC7F,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,iBAAiB,IAAI,EAAE,EAAE,CAAC;QACtD,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,MAAM,IAAI,SAAS,CAAC,+DAA+D,CAAC,CAAC;QACtH,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,OAAO,KAAK,EAAE;YAAE,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAgB,CAAC;IAEtC,MAAM,KAAK,GAAG,CAAC,MAAgB,EAAE,EAAU,EAAQ,EAAE;QACnD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,SAAS;YAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IAC1E,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,EAAU,EAAQ,EAAE;QACxC,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACrC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAClB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,KAAc,EAAU,EAAE,CAC5C,gBAAgB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAE3E,MAAM,SAAS,GAAG,CAAC,MAAc,EAAqB,EAAE;QACtD,IAAI,CAAC;YACH,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,EAAE;gBAAE,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;YAC1G,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAAE,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;YACnF,IAAI,OAAO,CAAC,IAAI,IAAI,eAAe;gBAAE,YAAY,CAAC,EAAE,CAAC,CAAC;YACtD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACzC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAClB,IAAI,MAAM,CAAC,MAAM,IAAI,iBAAiB,EAAE,CAAC;gBACvC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC5B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC;YACtG,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC5B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,EAAE,IAAI,CAAC,sCAAsC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACxE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;QACxE,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,KAA6B,EAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IAE3F,MAAM,kBAAkB,GAAG,CAAC,EAA0B,EAAE,KAA6B,EAAsB,EAAE;QAC3G,IAAI,CAAC;YACH,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;gBAAE,OAAO,GAAG,EAAE,yBAAyB,CAAC;YAChE,MAAM,OAAO,GAAG,OAAO,KAAK,EAAE,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnF,IAAI,OAAO,KAAK,EAAE;gBAAE,OAAO,GAAG,EAAE,iCAAiC,CAAC;YAClE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC;gBAAE,OAAO,GAAG,EAAE,kCAAkC,CAAC;YAC5E,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,YAAY,CAAC,KAA4B;YACvC,IAAI,CAAC;gBACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;gBAClE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;oBAC9E,MAAM,IAAI,SAAS,CAAC,uDAAuD,CAAC,CAAC;gBAC/E,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;oBAC5D,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAC;gBACrE,CAAC;gBACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;oBAAE,MAAM,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAC;gBACxE,IAAI,YAAY,IAAI,eAAe,EAAE,CAAC;oBACpC,OAAO;wBACL,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,EAAE,IAAI;wBAC5D,MAAM,EAAE,QAAQ,MAAM,qCAAqC,eAAe,GAAG;qBAC9E,CAAC;gBACJ,CAAC;gBACD,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC1D,IAAI,IAAI,IAAI,WAAW,EAAE,CAAC;oBACxB,OAAO;wBACL,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,IAAI;wBACxD,MAAM,EAAE,QAAQ,MAAM,YAAY,IAAI,kBAAkB,IAAI,QAAQ,EAAE,WAAW,WAAW,GAAG;qBAChG,CAAC;gBACJ,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,EAAE,IAAI,CAAC,qCAAqC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACvE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACnG,CAAC;QACH,CAAC;QAED,YAAY,CAAI,MAAc,EAAE,IAAyC;YACvE,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;gBAChD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,sBAAsB,CAAC,aAAa,EAAE,mCAAmC,CAAC,CAAC,CAAC;YACxG,CAAC;YACD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACnC,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,cAAc,EAAE,CAAC;gBACvD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,sBAAsB,CAAC,YAAY,EAAE,QAAQ,MAAM,gBAAgB,QAAQ,CAAC,MAAM,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC;YACrI,CAAC;YACD,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;YACpC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBACvB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,sBAAsB,CAC9C,WAAW,EAAE,QAAQ,MAAM,aAAa,iBAAiB,mBAAmB,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC;YAC3G,CAAC;YAED,MAAM,IAAI,GAAS,QAAQ,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;YAC9E,IAAI,CAAC,QAAQ;gBAAE,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAEvC,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACxC,MAAM,IAAI,GAAe;oBACvB,SAAS,EAAE,KAAK;oBAChB,UAAU,EAAE,IAAI,eAAe,EAAE;oBACjC,eAAe,EAAE,MAAM;iBACxB,CAAC;gBACF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAEtB,MAAM,KAAK,GAAG,KAAK,IAAgB,EAAE;oBACnC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBACzB,IAAI,IAAI,CAAC,SAAS;wBAAE,MAAM,IAAI,sBAAsB,CAAC,WAAW,EAAE,QAAQ,MAAM,uCAAuC,CAAC,CAAC;oBACzH,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;oBACpB,IAAI,CAAC;wBACH,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;oBAC5C,CAAC;4BAAS,CAAC;wBACT,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;oBAC3B,CAAC;gBACH,CAAC,CAAC;gBAEF,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACzC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC1B,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBACxC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;gBACjB,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;oBAClB,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI;wBAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC7E,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QAED,UAAU,CAAC,MAAc,EAAE,KAAiB;YAC1C,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,sBAAsB,CAAC,WAAW,EAAE,qCAAqC,CAAC,CAAC;YACvF,CAAC;YACD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC/B,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC;YAClE,IAAI,gBAAgB,GAAG,KAAK,CAAC;YAC7B,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC5D,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,sBAAsB,CAAC,WAAW,EAAE,QAAQ,MAAM,gCAAgC,CAAC,CAAC,CAAC;gBACvH,gBAAgB,GAAG,IAAI,CAAC;YAC1B,CAAC;YACD,IAAI,eAAe,GAAG,CAAC,CAAC;YACxB,MAAM,YAAY,GAAG,kBAAkB,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;YACpE,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gBAC/B,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC;oBAAE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC;gBACzE,MAAM,EAAE,IAAI,CAAC,QAAQ,MAAM,uBAAuB,YAAY,EAAE,CAAC,CAAC;gBAClE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;YACnE,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC/B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACxB,IAAI,CAAC,eAAe,CAAC,IAAI,sBAAsB,CAAC,WAAW,EAAE,QAAQ,MAAM,gCAAgC,CAAC,CAAC,CAAC;gBAC9G,eAAe,IAAI,CAAC,CAAC;YACvB,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC;QAC/C,CAAC;QAED,kBAAkB;QAElB,KAAK;YACH,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QAC1D,CAAC;KACF,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { RoomTaskEvent } from './room-task.js';\n\n/**\n * Room guard components (B4). Pure, independently testable and fail-closed: any internal error, bad\n * configuration or missing data rejects instead of allowing. Nothing here sends messages or touches the\n * Bus; C1 wires the decisions into RoomBus / tools / ingress and projects the \"@ human\" escalation.\n */\n\nconst WINDOW_MS = 60_000;\nconst SWEEP_THRESHOLD = 1024;\n\n/** Declared structurally; mirrors core's inbound-origin `MessageOrigin` (`self | member | peer_bot | human`). */\nexport type GuardOrigin = 'self' | 'member' | 'peer_bot' | 'human';\n\nexport interface GuardActor {\n readonly origin: GuardOrigin;\n readonly accountId?: string;\n}\n\nexport type RoomGuardRejectionCode = 'turn_rate' | 'queue_full' | 'cancelled' | 'forbidden' | 'guard_error';\n\nexport class RoomGuardRejectedError extends Error {\n constructor(\n readonly code: RoomGuardRejectionCode,\n message: string,\n readonly retryAfterMs?: number,\n ) {\n super(message);\n this.name = 'RoomGuardRejectedError';\n }\n}\n\nexport type RoomSensitiveOperation = 'task.cancel' | 'role.change' | 'room.cancel_queue';\n\nexport interface RoomGuardOptions {\n readonly now?: () => number;\n /** Max `handoffCount` of one Task. Default 8. */\n readonly maxHandoffDepth?: number;\n /** Max back-and-forth handoffs of one Task between the same pair of members. Default 3. */\n readonly maxPingPong?: number;\n /** Max admitted turns per Room in a sliding 60 s window. Default 12. */\n readonly maxTurnsPerMinute?: number;\n /** Max turns waiting behind the running one in one Room. Default 8. */\n readonly maxQueuedTurns?: number;\n /** Human accounts allowed to run sensitive operations. Missing or empty denies everything. */\n readonly sensitiveAccounts?: readonly string[];\n readonly logger?: { warn(message: string): void };\n}\n\nexport interface RoomHandoffCheckInput {\n readonly roomId: string;\n readonly taskId: string;\n readonly from: string;\n readonly to: string;\n /** `handoffCount` of the RoomTaskView, before this handoff. */\n readonly handoffCount: number;\n /**\n * Room Task journal history. Required: without it the ping-pong limit cannot be checked, so a call that\n * omits it is refused (guard_error + escalateToHuman) instead of silently checking depth only. Pass `[]`\n * for a Task without history.\n */\n readonly history: readonly RoomTaskEvent[];\n}\n\nexport type RoomHandoffCheck =\n | { readonly allowed: true }\n | {\n readonly allowed: false;\n readonly code: 'handoff_depth' | 'ping_pong' | 'guard_error';\n readonly reason: string;\n /** The caller should stop the chain and ask a human (C1 projects the \"@ human\" message). */\n readonly escalateToHuman: true;\n };\n\nexport type RoomTurnAdmission =\n | { readonly allowed: true }\n | { readonly allowed: false; readonly code: 'turn_rate'; readonly retryAfterMs: number };\n\nexport interface RoomCancelResult {\n /** Any human may interrupt the running turn. */\n readonly cancelledRunning: boolean;\n /** Always 0 unless the actor passes `authorizeSensitive('room.cancel_queue')`. */\n readonly cancelledQueued: number;\n /**\n * True when queued turns existed but the actor lacks `room.cancel_queue`, so the queue was left intact.\n * Omitted otherwise.\n */\n readonly queueRefused?: boolean;\n}\n\nexport interface RoomGuardStats {\n /** Rooms with a running or queued turn. */\n readonly lanes: number;\n /** Rooms with a rate window entry. */\n readonly rateWindows: number;\n}\n\nexport interface RoomGuards {\n checkHandoff(input: RoomHandoffCheckInput): RoomHandoffCheck;\n /**\n * Runs `work` as the next turn of the Room: admitted by the rate window (this is the only admission path;\n * the window is internal, so one turn consumes exactly one slot), FIFO-serialized per Room\n * (a failed turn does not affect the next one) and abortable via `cancelRoom`.\n *\n * Do NOT re-enter: calling runExclusive for the same Room from inside `work` and awaiting it deadlocks.\n * Schedule follow-up turns after `work` has returned.\n */\n runExclusive<T>(roomId: string, work: (signal: AbortSignal) => Promise<T>): Promise<T>;\n /**\n * Human interrupt. Any human aborts the RUNNING turn; rejecting and clearing the queued turns additionally\n * requires `authorizeSensitive('room.cancel_queue', actor) === undefined` (a configured sensitive account).\n * Non-humans are refused (throws).\n */\n cancelRoom(roomId: string, actor: GuardActor): RoomCancelResult;\n /** Returns undefined when allowed, otherwise the refusal reason (RoomTaskServiceOptions.authorize style). */\n authorizeSensitive(op: RoomSensitiveOperation, actor: GuardActor | undefined): string | undefined;\n stats(): RoomGuardStats;\n}\n\n/**\n * Counts `task.handoff` events of `taskId` between members `a` and `b` in either direction.\n * Pure over the journal history, so the result survives restarts and is reproducible.\n */\nexport function countPairHandoffs(events: readonly RoomTaskEvent[], taskId: string, a: string, b: string): number {\n let count = 0;\n for (const event of events) {\n if (event.type !== 'task.handoff' || event.taskId !== taskId) continue;\n if ((event.from === a && event.to === b) || (event.from === b && event.to === a)) count += 1;\n }\n return count;\n}\n\nfunction positive(name: string, value: number | undefined, fallback: number): number {\n const resolved = value ?? fallback;\n if (!Number.isSafeInteger(resolved) || resolved <= 0) {\n throw new RangeError(`Room guard option ${name} must be a positive integer, got ${String(resolved)}`);\n }\n return resolved;\n}\n\ninterface QueuedTurn {\n cancelled: boolean;\n readonly controller: AbortController;\n rejectCancelled(error: RoomGuardRejectedError): void;\n}\n\ninterface Lane {\n tail: Promise<unknown>;\n running?: QueuedTurn;\n readonly queued: Set<QueuedTurn>;\n}\n\nexport function createRoomGuards(options: RoomGuardOptions = {}): RoomGuards {\n const now = options.now ?? (() => Date.now());\n const maxHandoffDepth = positive('maxHandoffDepth', options.maxHandoffDepth, 8);\n const maxPingPong = positive('maxPingPong', options.maxPingPong, 3);\n const maxTurnsPerMinute = positive('maxTurnsPerMinute', options.maxTurnsPerMinute, 12);\n const maxQueuedTurns = positive('maxQueuedTurns', options.maxQueuedTurns, 8);\n const { logger } = options;\n if (options.sensitiveAccounts !== undefined && !Array.isArray(options.sensitiveAccounts)) {\n throw new TypeError('Room guard option sensitiveAccounts must be an array of account ids');\n }\n const sensitive = new Set<string>();\n for (const account of options.sensitiveAccounts ?? []) {\n if (typeof account !== 'string') throw new TypeError('Room guard option sensitiveAccounts must contain strings only');\n const trimmed = account.trim();\n if (trimmed !== '') sensitive.add(trimmed);\n }\n\n const windows = new Map<string, number[]>();\n const lanes = new Map<string, Lane>();\n\n const prune = (stamps: number[], at: number): void => {\n while (stamps.length > 0 && stamps[0] <= at - WINDOW_MS) stamps.shift();\n };\n\n const sweepWindows = (at: number): void => {\n for (const [room, stamps] of windows) {\n prune(stamps, at);\n if (stamps.length === 0) windows.delete(room);\n }\n };\n\n const guardError = (error: unknown): string =>\n `guard error: ${error instanceof Error ? error.message : String(error)}`;\n\n const admitTurn = (roomId: string): RoomTurnAdmission => {\n try {\n if (typeof roomId !== 'string' || roomId === '') throw new TypeError('roomId must be a non-empty string');\n const at = now();\n if (!Number.isFinite(at)) throw new TypeError('clock returned a non-finite value');\n if (windows.size >= SWEEP_THRESHOLD) sweepWindows(at);\n const stamps = windows.get(roomId) ?? [];\n prune(stamps, at);\n if (stamps.length >= maxTurnsPerMinute) {\n windows.set(roomId, stamps);\n return { allowed: false, code: 'turn_rate', retryAfterMs: Math.max(1, stamps[0] + WINDOW_MS - at) };\n }\n stamps.push(at);\n windows.set(roomId, stamps);\n return { allowed: true };\n } catch (error) {\n logger?.warn(`room turn admission failed closed: ${guardError(error)}`);\n return { allowed: false, code: 'turn_rate', retryAfterMs: WINDOW_MS };\n }\n };\n\n const requireHuman = (actor: GuardActor | undefined): boolean => actor?.origin === 'human';\n\n const authorizeSensitive = (op: RoomSensitiveOperation, actor: GuardActor | undefined): string | undefined => {\n try {\n if (!requireHuman(actor)) return `${op} requires a human actor`;\n const account = typeof actor?.accountId === 'string' ? actor.accountId.trim() : '';\n if (account === '') return `${op} requires an identified account`;\n if (!sensitive.has(account)) return `${op} is not allowed for this account`;\n return undefined;\n } catch (error) {\n return guardError(error);\n }\n };\n\n return Object.freeze({\n checkHandoff(input: RoomHandoffCheckInput): RoomHandoffCheck {\n try {\n const { roomId, taskId, from, to, handoffCount, history } = input;\n if ([roomId, taskId, from, to].some((v) => typeof v !== 'string' || v === '')) {\n throw new TypeError('roomId, taskId, from and to must be non-empty strings');\n }\n if (!Number.isSafeInteger(handoffCount) || handoffCount < 0) {\n throw new TypeError('handoffCount must be a non-negative integer');\n }\n if (!Array.isArray(history)) throw new TypeError('history is required');\n if (handoffCount >= maxHandoffDepth) {\n return {\n allowed: false, code: 'handoff_depth', escalateToHuman: true,\n reason: `task ${taskId} reached the handoff depth limit (${maxHandoffDepth})`,\n };\n }\n const pair = countPairHandoffs(history, taskId, from, to);\n if (pair >= maxPingPong) {\n return {\n allowed: false, code: 'ping_pong', escalateToHuman: true,\n reason: `task ${taskId} bounced ${pair} times between ${from} and ${to} (limit ${maxPingPong})`,\n };\n }\n return { allowed: true };\n } catch (error) {\n logger?.warn(`room handoff check failed closed: ${guardError(error)}`);\n return { allowed: false, code: 'guard_error', escalateToHuman: true, reason: guardError(error) };\n }\n },\n\n runExclusive<T>(roomId: string, work: (signal: AbortSignal) => Promise<T>): Promise<T> {\n if (typeof roomId !== 'string' || roomId === '') {\n return Promise.reject(new RoomGuardRejectedError('guard_error', 'roomId must be a non-empty string'));\n }\n const existing = lanes.get(roomId);\n if (existing && existing.queued.size >= maxQueuedTurns) {\n return Promise.reject(new RoomGuardRejectedError('queue_full', `room ${roomId} already has ${existing.queued.size} queued turns`));\n }\n const admission = admitTurn(roomId);\n if (!admission.allowed) {\n return Promise.reject(new RoomGuardRejectedError(\n 'turn_rate', `room ${roomId} exceeded ${maxTurnsPerMinute} turns per minute`, admission.retryAfterMs));\n }\n\n const lane: Lane = existing ?? { tail: Promise.resolve(), queued: new Set() };\n if (!existing) lanes.set(roomId, lane);\n\n return new Promise<T>((resolve, reject) => {\n const turn: QueuedTurn = {\n cancelled: false,\n controller: new AbortController(),\n rejectCancelled: reject,\n };\n lane.queued.add(turn);\n\n const start = async (): Promise<T> => {\n lane.queued.delete(turn);\n if (turn.cancelled) throw new RoomGuardRejectedError('cancelled', `room ${roomId} turn was cancelled before it started`);\n lane.running = turn;\n try {\n return await work(turn.controller.signal);\n } finally {\n lane.running = undefined;\n }\n };\n\n const run = lane.tail.then(start, start);\n run.then(resolve, reject);\n const tail = run.catch(() => undefined);\n lane.tail = tail;\n void tail.then(() => {\n if (lane.tail === tail && lanes.get(roomId) === lane) lanes.delete(roomId);\n });\n });\n },\n\n cancelRoom(roomId: string, actor: GuardActor): RoomCancelResult {\n if (!requireHuman(actor)) {\n throw new RoomGuardRejectedError('forbidden', 'only a human may cancel a room turn');\n }\n const lane = lanes.get(roomId);\n if (!lane) return { cancelledRunning: false, cancelledQueued: 0 };\n let cancelledRunning = false;\n if (lane.running && !lane.running.controller.signal.aborted) {\n lane.running.controller.abort(new RoomGuardRejectedError('cancelled', `room ${roomId} turn was cancelled by a human`));\n cancelledRunning = true;\n }\n let cancelledQueued = 0;\n const queueRefusal = authorizeSensitive('room.cancel_queue', actor);\n if (queueRefusal !== undefined) {\n if (lane.queued.size === 0) return { cancelledRunning, cancelledQueued };\n logger?.warn(`room ${roomId} queue left intact: ${queueRefusal}`);\n return { cancelledRunning, cancelledQueued, queueRefused: true };\n }\n for (const turn of lane.queued) {\n turn.cancelled = true;\n turn.controller.abort();\n turn.rejectCancelled(new RoomGuardRejectedError('cancelled', `room ${roomId} turn was cancelled by a human`));\n cancelledQueued += 1;\n }\n lane.queued.clear();\n return { cancelledRunning, cancelledQueued };\n },\n\n authorizeSensitive,\n\n stats(): RoomGuardStats {\n return { lanes: lanes.size, rateWindows: windows.size };\n },\n });\n}\n"]}
@@ -12,4 +12,3 @@ import type { RoomRegistry } from './room-registry.js';
12
12
  * arbitrate / forced mention). `route` applies the same membership check as a second guard.
13
13
  */
14
14
  export declare function createRoomMembershipPort(registry: RoomRegistry): RoomMembershipPort;
15
- //# sourceMappingURL=room-membership.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"room-membership.js","sourceRoot":"","sources":["../../src/room/room-membership.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAsB;IAC7D,MAAM,IAAI,GAAuB;QAC/B,QAAQ,CAAC,IAAI,EAAE,YAAY;YACzB,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC3C,IAAI,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YACxB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QACxG,CAAC;QACD,OAAO,CAAC,YAAY;YAClB,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC3C,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;QACrG,CAAC;QACD,KAAK,CAAC,KAAK;YACT,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACjD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YAC3G,OAAO,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;KACF,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"room-membership.js","sourceRoot":"","sources":["../../src/room/room-membership.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAsB;IAC7D,MAAM,IAAI,GAAuB;QAC/B,QAAQ,CAAC,IAAI,EAAE,YAAY;YACzB,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC3C,IAAI,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YACxB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QACxG,CAAC;QACD,OAAO,CAAC,YAAY;YAClB,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC3C,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;QACrG,CAAC;QACD,KAAK,CAAC,KAAK;YACT,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACjD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YAC3G,OAAO,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;KACF,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC","sourcesContent":["import type { RoomMembershipPort } from '@zhin.js/core/runtime';\nimport type { RoomRegistry } from './room-registry.js';\nimport { routeRoomMessage } from './room-router.js';\n\n/**\n * The single factory for core's `RoomMembershipPort`. `hasRoom` and `route` are always provided\n * together: core only dedups Room conversations when `hasRoom` is true, and without `route` the\n * Endpoint that loses the dedup would never get its @ / reply / pending interaction resolved.\n * Do not expose `hasRoom` on its own.\n *\n * `hasRoom` is decided per (conversation, receiving Endpoint): it is true only when the Endpoint\n * that received the copy is a member of the Room bound to the conversation. A non-member Bot in\n * the same group is treated as being in an ordinary group (it handles its own copy, no claim /\n * arbitrate / forced mention). `route` applies the same membership check as a second guard.\n */\nexport function createRoomMembershipPort(registry: RoomRegistry): RoomMembershipPort {\n const port: RoomMembershipPort = {\n isMember(peer, conversation) {\n const room = registry.roomOf(conversation);\n if (!room) return false;\n return peer.endpointIds.some((endpointId) => room.memberByEndpoint(String(endpointId)) !== undefined);\n },\n hasRoom(conversation) {\n const room = registry.roomOf(conversation);\n return room !== undefined && room.memberByEndpoint(String(conversation.endpoint.id)) !== undefined;\n },\n route(input) {\n const room = registry.roomOf(input.conversation);\n if (!room || room.memberByEndpoint(String(input.conversation.endpoint.id)) === undefined) return undefined;\n return routeRoomMessage(room, input);\n },\n };\n return Object.freeze(port);\n}\n"]}
@@ -56,4 +56,3 @@ export declare function createRoomRegistry(rooms: Readonly<Record<string, RoomDe
56
56
  adapter: string;
57
57
  endpoint: string;
58
58
  }) => string): RoomRegistry;
59
- //# sourceMappingURL=room-registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"room-registry.js","sourceRoot":"","sources":["../../src/room/room-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"room-registry.js","sourceRoot":"","sources":["../../src/room/room-registry.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RoomDefinition, RoomMemberDefinition, RoomRoleDefinition } from './room-definition.js';\n\n/** Minimal conversation shape the registry needs (structurally compatible with core's ConversationRef). */\nexport interface RoomConversationLike {\n readonly endpoint: { readonly adapter: string };\n readonly kind: string;\n readonly id: string;\n readonly threadId?: string;\n}\n\nexport interface RoomMemberEntry {\n readonly roomId: string;\n readonly agent: string;\n readonly roleName: string;\n readonly role: RoomRoleDefinition;\n readonly definition: RoomMemberDefinition;\n /** Runtime Endpoint id of the member's dedicated Bot. */\n readonly endpointId: string;\n /** Agent name and aliases, lower-cased. */\n readonly names: readonly string[];\n}\n\nexport interface RoomEntry {\n readonly id: string;\n readonly definition: RoomDefinition;\n /** Declaration order. */\n readonly members: readonly RoomMemberEntry[];\n readonly coordinator?: RoomMemberEntry;\n memberByEndpoint(endpointId: string): RoomMemberEntry | undefined;\n memberByAgent(agent: string): RoomMemberEntry | undefined;\n /** Case-insensitive agent name / alias lookup. */\n memberByAlias(name: string): RoomMemberEntry | undefined;\n /** Member whose Bot account (resolved through `accountOf`) equals `account`. */\n memberByAccount(account: string, accountOf: (endpointId: string) => string | undefined): RoomMemberEntry | undefined;\n}\n\nexport interface RoomRegistry {\n /**\n * Room owning a conversation. Keyed by `adapter:kind:id` (endpoint excluded, same scope as the\n * outbound ledger). A Room binding carries no thread: messages in a thread belong to the Room of\n * the parent conversation.\n */\n roomOf(conversation: RoomConversationLike): RoomEntry | undefined;\n room(roomId: string): RoomEntry | undefined;\n memberByEndpoint(roomId: string, endpointId: string): RoomMemberEntry | undefined;\n memberByAccount(\n roomId: string,\n account: string,\n accountOf: (endpointId: string) => string | undefined,\n ): RoomMemberEntry | undefined;\n rooms(): readonly RoomEntry[];\n}\n\nexport function roomConversationKey(adapter: string, kind: string, id: string): string {\n return `${adapter}:${kind}:${id}`;\n}\n\n/**\n * Builds the in-memory index of enabled Rooms.\n *\n * `resolveEndpointId` maps a member's declared `{adapter, endpoint}` (configuration names) to the\n * runtime Endpoint id (CapabilityId string); the host supplies it because the mapping depends on\n * how Adapter endpoints are published.\n */\nexport function createRoomRegistry(\n rooms: Readonly<Record<string, RoomDefinition>>,\n resolveEndpointId: (bot: { adapter: string; endpoint: string }) => string,\n): RoomRegistry {\n const byConversation = new Map<string, RoomEntry>();\n const byId = new Map<string, RoomEntry>();\n\n for (const [roomId, definition] of Object.entries(rooms)) {\n if (definition.enabled === false) continue;\n const members: RoomMemberEntry[] = definition.members.map((member) => {\n const role = definition.roles[member.role];\n if (!role) throw new Error(`Room ${roomId}: member ${member.agent} references unknown role ${member.role}`);\n return Object.freeze({\n roomId,\n agent: member.agent,\n roleName: member.role,\n role,\n definition: member,\n endpointId: resolveEndpointId(member.botEndpoint),\n names: Object.freeze([member.agent, ...(member.aliases ?? [])].map((name) => name.toLowerCase())),\n });\n });\n const byEndpoint = new Map(members.map((member) => [member.endpointId, member] as const));\n const byAgent = new Map(members.map((member) => [member.agent, member] as const));\n const byName = new Map<string, RoomMemberEntry>();\n for (const member of members) for (const name of member.names) if (!byName.has(name)) byName.set(name, member);\n const coordinator = definition.coordinator !== undefined ? byAgent.get(definition.coordinator) : undefined;\n const entry: RoomEntry = Object.freeze({\n id: roomId,\n definition,\n members: Object.freeze(members),\n ...(coordinator ? { coordinator } : {}),\n memberByEndpoint: (endpointId: string) => byEndpoint.get(endpointId),\n memberByAgent: (agent: string) => byAgent.get(agent),\n memberByAlias: (name: string) => byName.get(name.toLowerCase()),\n memberByAccount: (account: string, accountOf: (endpointId: string) => string | undefined) =>\n members.find((member) => accountOf(member.endpointId) === account),\n });\n byId.set(roomId, entry);\n const { adapter, kind, id } = definition.conversation;\n const key = roomConversationKey(adapter, kind, id);\n // Conversation ownership is validated upstream; first enabled Room wins defensively.\n if (!byConversation.has(key)) byConversation.set(key, entry);\n }\n\n return Object.freeze({\n roomOf: (conversation: RoomConversationLike) =>\n byConversation.get(roomConversationKey(conversation.endpoint.adapter, conversation.kind, conversation.id)),\n room: (roomId: string) => byId.get(roomId),\n memberByEndpoint: (roomId: string, endpointId: string) => byId.get(roomId)?.memberByEndpoint(endpointId),\n memberByAccount: (roomId: string, account: string, accountOf: (endpointId: string) => string | undefined) =>\n byId.get(roomId)?.memberByAccount(account, accountOf),\n rooms: () => Object.freeze([...byId.values()]),\n });\n}\n"]}
@@ -28,4 +28,3 @@ export interface RoomRouteFacts {
28
28
  * outside the Room yields no target (`undefined`), so it is not handed to the coordinator or role.
29
29
  */
30
30
  export declare function routeRoomMessage(room: RoomEntry, facts: RoomRouteFacts): RoomRouteResult | undefined;
31
- //# sourceMappingURL=room-router.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"room-router.js","sourceRoot":"","sources":["../../src/room/room-router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"room-router.js","sourceRoot":"","sources":["../../src/room/room-router.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RoomEntry, RoomMemberEntry } from './room-registry.js';\n\n/** Why the router picked an Endpoint (structurally equal to core's RoomRouteDecision). */\nexport interface RoomRouteResult {\n readonly endpointId: string;\n readonly reason: 'pending' | 'mention' | 'reply' | 'coordinator' | 'role';\n /**\n * Other available members after the target, in takeover priority order\n * (generalist, then chat/general, then declaration order). The target is never included.\n * core lets them take over after a grace period when the target never receives a copy.\n */\n readonly fallbackEndpointIds: readonly string[];\n}\n\n/** Trusted facts about one inbound human message (structurally a subset of core's RoomInboundRouteInput). */\nexport interface RoomRouteFacts {\n readonly content: string;\n readonly mentionTargets: readonly string[];\n readonly replyToEndpointId?: string;\n pending(endpointId: string): boolean;\n accountOf(endpointId: string): string | undefined;\n isAvailable(endpointId: string): boolean;\n}\n\n/** Unicode-aware word characters (plus `-`), so a CJK alias is not matched as a prefix of a longer CJK name. */\nconst WORD = '\\\\p{L}\\\\p{N}_-';\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Position of the first `@name` in text, case-insensitive, name delimited on both sides.\n * A text mention needs a separator after the name: `@研究 你好` and `@研究,` match, but `@研究`\n * does not match `@研究员`, and unspaced CJK like `@研究员帮我` does not match either. The reliable\n * path is the platform mention segment; text `@alias` is a convenience. Multiple mentions: the\n * first one wins (segments before text).\n */\nfunction textMentionIndex(content: string, name: string): number {\n const pattern = new RegExp(`(?<![${WORD}])@${escapeRegExp(name)}(?![${WORD}])`, 'iu');\n const match = pattern.exec(content);\n return match ? match.index : -1;\n}\n\n/**\n * Members mentioned by the message, first mention first. Structured mention targets (platform\n * mention segments, matched on the member's Bot account) come before `@alias` text mentions,\n * because the platform vouches for them; text mentions are ordered by position.\n */\nfunction mentionedMembers(room: RoomEntry, facts: RoomRouteFacts): RoomMemberEntry[] {\n const seen = new Set<RoomMemberEntry>();\n const ordered: RoomMemberEntry[] = [];\n const push = (member: RoomMemberEntry | undefined) => {\n if (member && !seen.has(member)) { seen.add(member); ordered.push(member); }\n };\n for (const target of facts.mentionTargets) push(room.memberByAccount(target, facts.accountOf));\n const textHits: Array<{ index: number; member: RoomMemberEntry }> = [];\n for (const member of room.members) {\n let best = -1;\n for (const name of member.names) {\n const index = textMentionIndex(facts.content, name);\n if (index >= 0 && (best < 0 || index < best)) best = index;\n }\n if (best >= 0) textHits.push({ index: best, member });\n }\n textHits.sort((a, b) => a.index - b.index);\n for (const hit of textHits) push(hit.member);\n return ordered;\n}\n\n/**\n * Pure routing decision for one inbound human message in a Room. Priority is fixed:\n * pending answer > mention > reply > coordinator > role match. Every step skips unavailable\n * Endpoints (falls through to the next priority); if nothing is available returns `undefined`\n * so the caller falls back to first-come dedup. The decision never depends on which Endpoint\n * received the copy or on its `mentioned` flag. A mention segment that points only to accounts\n * outside the Room yields no target (`undefined`), so it is not handed to the coordinator or role.\n */\nexport function routeRoomMessage(room: RoomEntry, facts: RoomRouteFacts): RoomRouteResult | undefined {\n const usable = (member: RoomMemberEntry | undefined): member is RoomMemberEntry =>\n member !== undefined && facts.isAvailable(member.endpointId);\n const available = room.members.filter(usable);\n const isGeneralist = (member: RoomMemberEntry) => member.role.accepts === undefined;\n const isChat = (member: RoomMemberEntry) =>\n member.role.accepts?.some((c) => c === 'chat' || c === 'general') === true;\n const fallbacksFor = (target: RoomMemberEntry): string[] => {\n const others = available.filter((member) => member !== target);\n return [\n ...others.filter(isGeneralist),\n ...others.filter((member) => !isGeneralist(member) && isChat(member)),\n ...others.filter((member) => !isGeneralist(member) && !isChat(member)),\n ].map((member) => member.endpointId);\n };\n const pick = (member: RoomMemberEntry | undefined, reason: RoomRouteResult['reason']): RoomRouteResult | undefined =>\n usable(member)\n ? { endpointId: member.endpointId, reason, fallbackEndpointIds: fallbacksFor(member) }\n : undefined;\n\n const pending = room.members.find((member) => usable(member) && facts.pending(member.endpointId));\n if (pending) return pick(pending, 'pending');\n\n // Only the first mentioned member counts; if it is unavailable, fall to the next priority.\n const mentioned = mentionedMembers(room, facts);\n const mention = pick(mentioned[0], 'mention');\n if (mention) return mention;\n\n if (facts.replyToEndpointId !== undefined) {\n const reply = pick(room.memberByEndpoint(facts.replyToEndpointId), 'reply');\n if (reply) return reply;\n }\n\n // The message is addressed to someone outside the Room: no target, so core falls back to\n // first-come dedup and member copies keep their original `mentioned` semantics.\n if (facts.mentionTargets.length > 0 && mentioned.length === 0) return undefined;\n\n const coordinator = pick(room.coordinator, 'coordinator');\n if (coordinator) return coordinator;\n\n // Role match (no coordinator, or it is unavailable): generalist first, then chat/general, then anyone.\n const generalist = available.find(isGeneralist);\n const chat = available.find(isChat);\n return pick(generalist ?? chat ?? available[0], 'role');\n}\n"]}
@@ -88,4 +88,3 @@ export declare function createRoomSendLimiter(options: RoomSendLimiterOptions):
88
88
  /** Tests / standalone use only. Production (C1) uses the shared `createRoomSendLimiter` instance. */
89
89
  export declare function createRateLimitedOutbound(options: RateLimitedOutboundOptions): Pick<OutboundMessageService, 'send'>;
90
90
  export {};
91
- //# sourceMappingURL=room-send-limiter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"room-send-limiter.js","sourceRoot":"","sources":["../../src/room/room-send-limiter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"room-send-limiter.js","sourceRoot":"","sources":["../../src/room/room-send-limiter.ts"],"names":[],"mappings":"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","sourcesContent":["import type { OutboundMessageService } from '@zhin.js/core/runtime';\n\n/**\n * Per-account send rate limiter for Room output (personal QQ accounts can be risk-controlled by the platform).\n *\n * Two forms over ONE shared instance (`createRoomSendLimiter`), both booking into the same per-account map:\n * - `send(request)`: a decorator over `Pick<OutboundMessageService, 'send'>`; once a slot is granted it still\n * calls the wrapped `send`.\n * - `outboundMiddleware()`: an outbound middleware definition (`{ target: 'outbound', handle(ctx, next) }`);\n * books a slot, sleeps, then `await next()`. Wrap it as `defineMiddleware(limiter.outboundMiddleware())`\n * to get the feature brand. `middleware(envelope, next)` is the low-level form underneath it.\n * Either way the normal outbound chain (OutboundRenderer -> outbound middleware -> Endpoint) is never bypassed:\n * the limiter only delays or refuses before `inner.send` / `next()`.\n *\n * C1 MUST make EVERY outbound of a member Endpoint use this same instance (as an outbound middleware, or by\n * wrapping the shared OutboundMessageService), keyed by account. Wrapping only RoomBus's `outbound` under-counts\n * `$reply` and generation output of the same account, so the account-level risk-control protection would only\n * be partial. It is not installed globally by B4.\n *\n * One outbound path must use exactly ONE form (middleware, OR `send` wrapping the OutboundMessageService).\n * Using both on the same path books the same send twice and double-counts it. Share the instance across\n * DIFFERENT paths of the same account, not across two forms of one path.\n */\n\ntype DeliveryReceipt = Awaited<ReturnType<OutboundMessageService['send']>>;\n\nconst WINDOW_MS = 60_000;\nconst MAX_KEYS = 1024;\n\nexport interface RoomSendLimit {\n readonly maxPerMinute?: number;\n readonly minIntervalMs?: number;\n}\n\nexport interface RoomSendLimiterOptions {\n /** Wrapped service for the `send` form; without it `send` refuses. Not needed for the `middleware` form. */\n readonly inner?: Pick<OutboundMessageService, 'send'>;\n /** Bot account of an endpoint (e.g. PeerRegistry.selfOf). Falls back to the endpoint id when unknown. */\n readonly accountOf?: (endpointId: string) => string | undefined;\n readonly now?: () => number;\n readonly sleep?: (ms: number) => Promise<void>;\n /** Default 20. */\n readonly maxPerMinute?: number;\n /** Minimum gap between two sends of one account. Default 1000. */\n readonly minIntervalMs?: number;\n /** A send that would have to wait longer is rejected instead. Default 5000. */\n readonly maxWaitMs?: number;\n /** Overrides keyed by account (or `endpoint:<id>` for unresolved accounts). */\n readonly perAccount?: Readonly<Record<string, RoomSendLimit>>;\n readonly logger?: { warn(message: string): void };\n}\n\nexport interface RateLimitedOutboundOptions extends RoomSendLimiterOptions {\n readonly inner: Pick<OutboundMessageService, 'send'>;\n}\n\n/** Structural outbound envelope: only what the limiter reads, so no core middleware type is imported. */\nexport interface RoomSendEnvelope {\n readonly conversation: { readonly endpoint: { readonly id: string } };\n}\n\nexport class RoomSendRateLimitedError extends Error {\n constructor(readonly code: string, message: string, readonly retryable: boolean) {\n super(message);\n this.name = 'RoomSendRateLimitedError';\n }\n}\n\n/** Structural subset of the core outbound middleware context: the envelope lives in `input`. */\nexport interface RoomOutboundMiddlewareContext {\n readonly input: RoomSendEnvelope;\n}\n\n/** Structural outbound middleware definition; `phase` / `order` default in `defineMiddleware`. */\nexport interface RoomOutboundMiddlewareDefinition {\n readonly target: 'outbound';\n handle(context: RoomOutboundMiddlewareContext, next: () => Promise<void>): Promise<void>;\n}\n\nexport interface RoomSendLimiter {\n send(request: Parameters<OutboundMessageService['send']>[0]): Promise<DeliveryReceipt>;\n /**\n * Low-level: takes the ENVELOPE, not the core middleware context. Passing the context makes `reserve` fail\n * closed on every send. Use `outboundMiddleware()` in plugins. Adaptation by hand:\n * `handle: (ctx, next) => limiter.middleware(ctx.input, next)`.\n * Throws RoomSendRateLimitedError when refused.\n */\n middleware(envelope: RoomSendEnvelope, next: () => Promise<void>): Promise<void>;\n /**\n * Outbound middleware definition for plugins: `defineMiddleware(limiter.outboundMiddleware())`.\n * Do not combine with `send` on the same outbound path (double counting).\n */\n outboundMiddleware(): RoomOutboundMiddlewareDefinition;\n}\n\ninterface Booking {\n /** Reserved send times, ascending; only the last `maxPerMinute` are kept. */\n slots: number[];\n last: number;\n}\n\nfunction positive(name: string, value: number | undefined, fallback: number, allowZero = false): number {\n const resolved = value ?? fallback;\n if (!Number.isSafeInteger(resolved) || resolved < (allowZero ? 0 : 1)) {\n throw new RangeError(`Room send limiter option ${name} must be a ${allowZero ? 'non-negative' : 'positive'} integer, got ${String(resolved)}`);\n }\n return resolved;\n}\n\nconst rejected = (code: string, message: string, retryable: boolean): DeliveryReceipt =>\n Object.freeze({ status: 'rejected' as const, failure: Object.freeze({ code, message, retryable }) });\n\nexport function createRoomSendLimiter(options: RoomSendLimiterOptions): RoomSendLimiter {\n const { inner, logger } = options;\n const now = options.now ?? (() => Date.now());\n const sleep = options.sleep ?? ((ms: number) => new Promise<void>((resolve) => { setTimeout(resolve, ms); }));\n const maxPerMinute = positive('maxPerMinute', options.maxPerMinute, 20);\n const minIntervalMs = positive('minIntervalMs', options.minIntervalMs, 1000, true);\n const maxWaitMs = positive('maxWaitMs', options.maxWaitMs, 5000, true);\n const overrides = new Map<string, { maxPerMinute: number; minIntervalMs: number }>();\n for (const [key, limit] of Object.entries(options.perAccount ?? {})) {\n overrides.set(key, {\n maxPerMinute: positive(`perAccount.${key}.maxPerMinute`, limit.maxPerMinute, maxPerMinute),\n minIntervalMs: positive(`perAccount.${key}.minIntervalMs`, limit.minIntervalMs, minIntervalMs, true),\n });\n }\n const bookings = new Map<string, Booking>();\n\n const sweep = (at: number): void => {\n for (const [key, booking] of bookings) {\n if (booking.last + WINDOW_MS <= at) bookings.delete(key);\n }\n };\n\n /** Synchronous so that arrival order equals booking order. Returns the wait, or a rejection receipt. */\n const reserve = (request: RoomSendEnvelope): number | DeliveryReceipt => {\n try {\n const endpointId = request.conversation.endpoint.id;\n if (typeof endpointId !== 'string' || endpointId === '') throw new TypeError('request has no endpoint id');\n const key = options.accountOf?.(endpointId) || `endpoint:${endpointId}`;\n const limit = overrides.get(key) ?? { maxPerMinute, minIntervalMs };\n const at = now();\n if (!Number.isFinite(at)) throw new TypeError('clock returned a non-finite value');\n\n let booking = bookings.get(key);\n if (booking && booking.last + WINDOW_MS <= at) {\n bookings.delete(key);\n booking = undefined;\n }\n if (!booking) {\n if (bookings.size >= MAX_KEYS) sweep(at);\n if (bookings.size >= MAX_KEYS) {\n return rejected('room_send_guard_error', `too many tracked send accounts (${MAX_KEYS})`, true);\n }\n }\n const slots = booking?.slots ?? [];\n let slot = Math.max(at, booking ? booking.last + limit.minIntervalMs : at);\n if (slots.length >= limit.maxPerMinute) {\n slot = Math.max(slot, slots[slots.length - limit.maxPerMinute] + WINDOW_MS);\n }\n const wait = slot - at;\n if (wait > maxWaitMs) {\n return rejected('room_send_rate_limited', `account ${key} send rate limit reached; retry in ${wait} ms`, true);\n }\n // Booked before sending: platform risk control counts attempts, so failures count too.\n slots.push(slot);\n while (slots.length > limit.maxPerMinute) slots.shift();\n bookings.set(key, { slots, last: slot });\n return wait;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger?.warn(`room send limiter failed closed: ${message}`);\n return rejected('room_send_guard_error', message, false);\n }\n };\n\n const middleware = async (envelope: RoomSendEnvelope, next: () => Promise<void>): Promise<void> => {\n const wait = reserve(envelope);\n if (typeof wait !== 'number') {\n logger?.warn(`room send refused: ${wait.failure?.code ?? wait.status}`);\n throw new RoomSendRateLimitedError(\n wait.failure?.code ?? 'room_send_guard_error', wait.failure?.message ?? 'send refused', wait.failure?.retryable ?? false);\n }\n if (wait > 0) await sleep(wait);\n await next();\n };\n\n return Object.freeze({\n async send(request: Parameters<OutboundMessageService['send']>[0]): Promise<DeliveryReceipt> {\n if (!inner) return rejected('room_send_guard_error', 'send limiter has no inner service', false);\n const wait = reserve(request);\n if (typeof wait !== 'number') {\n logger?.warn(`room send refused: ${wait.failure?.code ?? wait.status}`);\n return wait;\n }\n if (wait > 0) await sleep(wait);\n return inner.send(request);\n },\n middleware,\n outboundMiddleware(): RoomOutboundMiddlewareDefinition {\n return Object.freeze({\n target: 'outbound' as const,\n handle: (context: RoomOutboundMiddlewareContext, next: () => Promise<void>) => middleware(context.input, next),\n });\n },\n });\n}\n\n/** Tests / standalone use only. Production (C1) uses the shared `createRoomSendLimiter` instance. */\nexport function createRateLimitedOutbound(options: RateLimitedOutboundOptions): Pick<OutboundMessageService, 'send'> {\n const limiter = createRoomSendLimiter(options);\n return Object.freeze({ send: (request: Parameters<OutboundMessageService['send']>[0]) => limiter.send(request) });\n}\n"]}
@@ -51,4 +51,3 @@ export declare function createRoomRoleAuthorizer(options: RoomRoleAuthorizerOpti
51
51
  * rules stay with the state machine. Fail-closed: a throw is a refusal.
52
52
  */
53
53
  export declare function createRoomRoleAssignAuthorizer(options: Pick<RoomRoleAuthorizerOptions, 'room' | 'roomId'>): (roomId: string, command: RoomAssignCommand) => string | undefined;
54
- //# sourceMappingURL=room-task-authorizer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"room-task-authorizer.js","sourceRoot":"","sources":["../../src/room/room-task-authorizer.ts"],"names":[],"mappings":"AAoDA,MAAM,UAAU,wBAAwB,CAAC,OAAkC;IACzE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAC3D,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;QACzB,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAClC,IAAI,CAAC,KAAK;oBAAE,OAAO,0CAA0C,CAAC;gBAC9D,MAAM,OAAO,GAAG,MAAM,CAAC,kBAAkB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;gBAChE,IAAI,OAAO,KAAK,SAAS;oBAAE,OAAO,OAAO,CAAC;YAC5C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,qCAAqC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACvG,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrC,IAAI,CAAC,eAAe;gBAAE,OAAO,yEAAyE,CAAC;YACvG,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBACjD,IAAI,OAAO,KAAK,SAAS;oBAAE,OAAO,OAAO,CAAC;YAC5C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,qCAAqC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACvG,CAAC;QACH,CAAC;QACD,IAAI,CAAC;YACH,OAAO,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAChG,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAuBD,SAAS,SAAS,CAAC,IAAgC;IACjD,MAAM,KAAK,GAAG,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACtD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAE,IAAuB,CAAC;IACvE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,OAAO;QAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAChF,OAAO;QACL,EAAE,EAAE,KAAK,EAAE,EAAE;QACb,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/G,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;YACnB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAChC,OAAO,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QACrH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,SAAS,GAAG,CAAC,EAAU,EAAW,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;AAElG;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAkC;IACzE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC1C,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,MAAM;gBAAE,OAAO,gBAAgB,MAAM,EAAE,CAAC;YAC/E,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,CAAC,EAAE;gBAAE,OAAO,gBAAgB,MAAM,EAAE,CAAC;YAC3G,MAAM,MAAM,GAAG,CAAC,KAAa,EAAW,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC;YAC7E,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;gBACrB,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBACxG,IAAI,CAAC,KAAK;wBAAE,OAAO,yBAAyB,OAAO,CAAC,EAAE,EAAE,CAAC;oBACzD,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;wBAAE,OAAO,WAAW,OAAO,CAAC,QAAQ,kBAAkB,CAAC;oBACtH,OAAO,SAAS,CAAC;gBACnB,CAAC;gBACD,KAAK,OAAO,CAAC;gBACb,KAAK,OAAO,CAAC;gBACb,KAAK,UAAU;oBACb,OAAO,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,4BAA4B,MAAM,EAAE,CAAC;gBAC7G,KAAK,SAAS,CAAC,CAAC,CAAC;oBACf,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBACtC,IAAI,IAAI,KAAK,SAAS;wBAAE,OAAO,YAAY,OAAO,CAAC,EAAE,4BAA4B,MAAM,EAAE,CAAC;oBAC1F,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBACpC,IAAI,EAAE,KAAK,SAAS;wBAAE,OAAO,YAAY,OAAO,CAAC,EAAE,4BAA4B,MAAM,EAAE,CAAC;oBACxF,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC;wBAAE,OAAO,iBAAiB,IAAI,6BAA6B,EAAE,EAAE,CAAC;oBAC9G,OAAO,SAAS,CAAC;gBACnB,CAAC;gBACD,KAAK,QAAQ,CAAC;gBACd,KAAK,QAAQ;oBACX,OAAO,SAAS,CAAC,CAAC,2DAA2D;gBAC/E,OAAO,CAAC,CAAC,CAAC;oBACR,MAAM,OAAO,GAAU,OAAO,CAAC;oBAC/B,OAAO,4BAA4B,MAAM,CAAE,OAA8B,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpF,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAChG,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,8BAA8B,CAC5C,OAA2D;IAE3D,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACjC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,MAAM;gBAAE,OAAO,gBAAgB,MAAM,EAAE,CAAC;YAC/E,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,CAAC,EAAE;gBAAE,OAAO,gBAAgB,MAAM,EAAE,CAAC;YAC3G,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,SAAS;gBAAE,OAAO,WAAW,OAAO,CAAC,EAAE,4BAA4B,MAAM,EAAE,CAAC;YAC7G,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,OAAO,CAAC,EAAE,KAAK,KAAK,CAAC,WAAW;gBAAE,OAAO,yCAAyC,CAAC;YAC1H,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,SAAS;gBAAE,OAAO,WAAW,OAAO,CAAC,QAAQ,kBAAkB,CAAC;YACvG,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAChG,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"room-task-authorizer.js","sourceRoot":"","sources":["../../src/room/room-task-authorizer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RoomTaskCommand } from './room-task.js';\nimport type { GuardActor, RoomGuards } from './room-guards.js';\nimport type { RoomDefinition } from './room-definition.js';\nimport type { RoomEntry } from './room-registry.js';\n\n/*\n * Synchronous `authorize` hook for createRoomTaskService({ authorize }).\n *\n * This is a PARTIAL check, fail-closed for the two commands it covers:\n * - `cancel` is sensitive: the issuer must resolve to a configured human account (via actorOf). An agent\n * member cannot cancel its own Task; it can only block or hand off.\n * - `assign` is refused unless a role check (`authorizeAssign`, lead / coordinator only) is supplied and\n * allows it. `assign` is the only command that skips the handoff depth / ping-pong limits (it checks\n * neither `from` nor handoffCount), so letting anyone re-assign would bypass them. The hook is synchronous\n * and cannot see the Task's state, so without `authorizeAssign` every `assign` is refused; the first\n * assignment goes through `create` with an assignee and is not affected.\n *\n * Every other command is passed on to `next`. `next` should be `createRoomRoleAuthorizer` (role / membership\n * check for create / start / block / complete / handoff, including `handoffTo`), and `authorizeAssign` should be\n * `createRoomRoleAssignAuthorizer`. Without `next`, start / block / handoff are NOT checked by this authorizer\n * (they pass through unchecked), so that is not a safe default. C1 may later give `authorize` a Task view\n * (an overload) to restrict only assigned / blocked Tasks; that is a C1 option, not part of B4.\n *\n * Notes for C1:\n * - A same-person `assign` on a `blocked` Task counts as unblocking it.\n * - Subscribers of RoomTaskService are dispatched after the Room serial section, so concurrent executes on one\n * Room may interleave their dispatches. Subscribers must order by `event.sequence`.\n * - Non-member accounts include other humans in the group: when a human mentions a human, the coordinator\n * stays silent. That is router behavior, not a guard concern.\n */\n\nexport type RoomTaskAuthorizer = (roomId: string, command: RoomTaskCommand) => string | undefined;\n\nexport type RoomAssignCommand = Extract<RoomTaskCommand, { type: 'assign' }>;\n\nexport interface RoomTaskAuthorizerOptions {\n readonly guards: Pick<RoomGuards, 'authorizeSensitive'>;\n /** Resolves the `by` of a command to the actor behind it; undefined means unknown, which is refused. */\n readonly actorOf: (by: string) => GuardActor | undefined;\n /**\n * Role check for `assign` (lead / coordinator only); return a refusal reason or undefined to allow.\n * Optional, but when absent every `assign` is refused (fail-closed).\n */\n readonly authorizeAssign?: (roomId: string, command: RoomAssignCommand) => string | undefined;\n /**\n * Composed after the built-in checks pass. Use `createRoomRoleAuthorizer(...)` to enforce the role /\n * membership checks for create / start / block / complete / handoff (and `handoffTo`); when absent those\n * commands are not checked here (not a safe default).\n */\n readonly next?: RoomTaskAuthorizer;\n}\n\nexport function createRoomTaskAuthorizer(options: RoomTaskAuthorizerOptions): RoomTaskAuthorizer {\n const { guards, actorOf, authorizeAssign, next } = options;\n return (roomId, command) => {\n if (command.type === 'cancel') {\n try {\n const actor = actorOf(command.by);\n if (!actor) return 'task.cancel requires a known human actor';\n const refusal = guards.authorizeSensitive('task.cancel', actor);\n if (refusal !== undefined) return refusal;\n } catch (error) {\n return `task.cancel authorization failed: ${error instanceof Error ? error.message : String(error)}`;\n }\n } else if (command.type === 'assign') {\n if (!authorizeAssign) return 'task.assign requires a role check (authorizeAssign); refused by default';\n try {\n const refusal = authorizeAssign(roomId, command);\n if (refusal !== undefined) return refusal;\n } catch (error) {\n return `task.assign authorization failed: ${error instanceof Error ? error.message : String(error)}`;\n }\n }\n try {\n return next?.(roomId, command);\n } catch (error) {\n return `task authorization failed: ${error instanceof Error ? error.message : String(error)}`;\n }\n };\n}\n\n// ---------------------------------------------------------------- role-based helpers\n\nexport interface RoomRoleAuthorizerOptions {\n /** The Room definition (preferred) or a registry entry; membership is indexed from it. */\n readonly room: RoomDefinition | RoomEntry;\n /** When given, commands for any other room id are refused (`unknown room`). */\n readonly roomId?: string;\n /**\n * Resolves `by` to an actor; used only for `create`, where a human may start a Task. Without it, a `by` with\n * the `human:` prefix counts as a human and every other `by` must be a member.\n */\n readonly actorOf?: (by: string) => GuardActor | undefined;\n}\n\ninterface RoleIndex {\n readonly id: string | undefined;\n readonly coordinator: string | undefined;\n readonly roleOf: (agent: string) => string | undefined;\n readonly handoffTo: (agent: string) => readonly string[] | undefined;\n}\n\nfunction indexRoom(room: RoomDefinition | RoomEntry): RoleIndex {\n const entry = 'definition' in room ? room : undefined;\n const definition = entry ? entry.definition : (room as RoomDefinition);\n const byAgent = new Map<string, string>();\n for (const member of definition.members) byAgent.set(member.agent, member.role);\n return {\n id: entry?.id,\n coordinator: definition.coordinator,\n roleOf: (agent) => (Object.hasOwn(definition.roles, byAgent.get(agent) ?? '') ? byAgent.get(agent) : undefined),\n handoffTo: (agent) => {\n const role = byAgent.get(agent);\n return role !== undefined && Object.hasOwn(definition.roles, role) ? definition.roles[role]?.handoffTo : undefined;\n },\n };\n}\n\nconst isHumanBy = (by: string): boolean => by.startsWith('human:') && by.length > 'human:'.length;\n\n/**\n * Role / membership check to pass as `next` of `createRoomTaskAuthorizer`. Returns a refusal reason or undefined.\n * - create: `assignee` (if any) must be a member; `by` must be a known actor (a member or a human).\n * - start / block / complete: `by` must be a member.\n * - handoff: `by` and `to` are members and the role of `by` lists the role of `to` in `handoffTo`\n * (no `handoffTo` means no handoff allowed).\n * - assign / cancel: not checked here (see `createRoomRoleAssignAuthorizer` and the built-in cancel check).\n * - any other (unknown) command type is refused.\n * Fail-closed: any throw (or a member whose role is missing) is a refusal.\n */\nexport function createRoomRoleAuthorizer(options: RoomRoleAuthorizerOptions): RoomTaskAuthorizer {\n const { room, roomId, actorOf } = options;\n return (target, command) => {\n try {\n const index = indexRoom(room);\n if (roomId !== undefined && target !== roomId) return `unknown room ${target}`;\n if (roomId === undefined && index.id !== undefined && target !== index.id) return `unknown room ${target}`;\n const member = (agent: string): boolean => index.roleOf(agent) !== undefined;\n switch (command.type) {\n case 'create': {\n const known = actorOf ? actorOf(command.by) !== undefined : isHumanBy(command.by) || member(command.by);\n if (!known) return `create: unknown actor ${command.by}`;\n if (command.assignee !== undefined && !member(command.assignee)) return `create: ${command.assignee} is not a member`;\n return undefined;\n }\n case 'start':\n case 'block':\n case 'complete':\n return member(command.by) ? undefined : `${command.type}: ${command.by} is not a member of room ${target}`;\n case 'handoff': {\n const from = index.roleOf(command.by);\n if (from === undefined) return `handoff: ${command.by} is not a member of room ${target}`;\n const to = index.roleOf(command.to);\n if (to === undefined) return `handoff: ${command.to} is not a member of room ${target}`;\n if (!index.handoffTo(command.by)?.includes(to)) return `handoff: role ${from} may not hand off to role ${to}`;\n return undefined;\n }\n case 'assign':\n case 'cancel':\n return undefined; // checked by `authorizeAssign` / the built-in cancel check\n default: {\n const unknown: never = command;\n return `unsupported command type ${String((unknown as { type?: unknown }).type)}`;\n }\n }\n } catch (error) {\n return `task authorization failed: ${error instanceof Error ? error.message : String(error)}`;\n }\n };\n}\n\n/**\n * Role check for `assign`, to pass as `authorizeAssign`: only the coordinator (a Room without one refuses every\n * assign) may assign, and only to a member. The hook is synchronous and cannot see the Task, so status-dependent\n * rules stay with the state machine. Fail-closed: a throw is a refusal.\n */\nexport function createRoomRoleAssignAuthorizer(\n options: Pick<RoomRoleAuthorizerOptions, 'room' | 'roomId'>,\n): (roomId: string, command: RoomAssignCommand) => string | undefined {\n const { room, roomId } = options;\n return (target, command) => {\n try {\n const index = indexRoom(room);\n if (roomId !== undefined && target !== roomId) return `unknown room ${target}`;\n if (roomId === undefined && index.id !== undefined && target !== index.id) return `unknown room ${target}`;\n if (index.roleOf(command.by) === undefined) return `assign: ${command.by} is not a member of room ${target}`;\n if (index.coordinator === undefined || command.by !== index.coordinator) return 'assign: only the coordinator may assign';\n if (index.roleOf(command.assignee) === undefined) return `assign: ${command.assignee} is not a member`;\n return undefined;\n } catch (error) {\n return `task authorization failed: ${error instanceof Error ? error.message : String(error)}`;\n }\n };\n}\n"]}
@@ -24,4 +24,3 @@ export declare class MemoryRoomTaskJournal implements RoomTaskJournal {
24
24
  read(roomId: string): Promise<readonly RoomTaskEvent[]>;
25
25
  append(roomId: string, expectedSequence: number, events: readonly RoomTaskEvent[]): Promise<readonly RoomTaskEvent[]>;
26
26
  }
27
- //# sourceMappingURL=room-task-journal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"room-task-journal.js","sourceRoot":"","sources":["../../src/room/room-task-journal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAsB,MAAM,gBAAgB,CAAC;AAYrE,MAAM,OAAO,6BAA8B,SAAQ,KAAK;IACjC;IAAyB;IAA2B;IAAzE,YAAqB,MAAc,EAAW,QAAgB,EAAW,MAAc;QACrF,KAAK,CAAC,yBAAyB,MAAM,sBAAsB,QAAQ,cAAc,MAAM,EAAE,CAAC,CAAC;QADxE,WAAM,GAAN,MAAM,CAAQ;QAAW,aAAQ,GAAR,QAAQ,CAAQ;QAAW,WAAM,GAAN,MAAM,CAAQ;QAErF,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAC;IAC9C,CAAC;CACF;AAED,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IACvD,YAAY,OAAe;QACzB,KAAK,CAAC,iCAAiC,OAAO,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,GAAG,gCAAgC,CAAC;IAC/C,CAAC;CACF;AAED,wGAAwG;AACxG,MAAM,UAAU,oBAAoB,CAClC,MAAc,EACd,OAAiC,EACjC,gBAAwB,EACxB,MAAgC;IAEhC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,IAAI,MAAM,KAAK,gBAAgB;QAAE,MAAM,IAAI,6BAA6B,CAAC,MAAM,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC3G,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5H,IAAI,KAAK,CAAC,QAAQ,KAAK,gBAAgB,GAAG,CAAC,GAAG,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACtH,CAAC,CAAC,CAAC;IACH,eAAe,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,OAAO,qBAAqB;IACvB,MAAM,GAAG,IAAI,GAAG,EAAoC,CAAC;IAE9D,KAAK,CAAC,IAAI,CAAC,MAAc;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,MAAM,CACV,MAAc,EACd,gBAAwB,EACxB,MAAgC;QAEhC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9C,+EAA+E;QAC/E,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAkB,CAAC,CAAC;QACrF,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAChE,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;CACF"}
1
+ {"version":3,"file":"room-task-journal.js","sourceRoot":"","sources":["../../src/room/room-task-journal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAsB,MAAM,gBAAgB,CAAC;AAYrE,MAAM,OAAO,6BAA8B,SAAQ,KAAK;IACjC;IAAyB;IAA2B;IAAzE,YAAqB,MAAc,EAAW,QAAgB,EAAW,MAAc;QACrF,KAAK,CAAC,yBAAyB,MAAM,sBAAsB,QAAQ,cAAc,MAAM,EAAE,CAAC,CAAC;QADxE,WAAM,GAAN,MAAM,CAAQ;QAAW,aAAQ,GAAR,QAAQ,CAAQ;QAAW,WAAM,GAAN,MAAM,CAAQ;QAErF,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAC;IAC9C,CAAC;CACF;AAED,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IACvD,YAAY,OAAe;QACzB,KAAK,CAAC,iCAAiC,OAAO,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,GAAG,gCAAgC,CAAC;IAC/C,CAAC;CACF;AAED,wGAAwG;AACxG,MAAM,UAAU,oBAAoB,CAClC,MAAc,EACd,OAAiC,EACjC,gBAAwB,EACxB,MAAgC;IAEhC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,IAAI,MAAM,KAAK,gBAAgB;QAAE,MAAM,IAAI,6BAA6B,CAAC,MAAM,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC3G,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5H,IAAI,KAAK,CAAC,QAAQ,KAAK,gBAAgB,GAAG,CAAC,GAAG,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACtH,CAAC,CAAC,CAAC;IACH,eAAe,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,OAAO,qBAAqB;IACvB,MAAM,GAAG,IAAI,GAAG,EAAoC,CAAC;IAE9D,KAAK,CAAC,IAAI,CAAC,MAAc;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,MAAM,CACV,MAAc,EACd,gBAAwB,EACxB,MAAgC;QAEhC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9C,+EAA+E;QAC/E,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAkB,CAAC,CAAC;QACrF,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAChE,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;CACF","sourcesContent":["import { deepFreezeWorkroomValue } from '../workroom/canonical-value.js';\nimport { replayRoomTasks, type RoomTaskEvent } from './room-task.js';\n\n/** One append-only event stream per Room. */\nexport interface RoomTaskJournal {\n read(roomId: string): Promise<readonly RoomTaskEvent[]>;\n /**\n * Compare-and-set append. `expectedSequence` is the sequence of the last stored event (-1 when empty).\n * The batch is written atomically: all events or none.\n */\n append(roomId: string, expectedSequence: number, events: readonly RoomTaskEvent[]): Promise<readonly RoomTaskEvent[]>;\n}\n\nexport class RoomTaskSequenceConflictError extends Error {\n constructor(readonly roomId: string, readonly expected: number, readonly actual: number) {\n super(`Room Task journal for ${roomId} expected sequence ${expected} but found ${actual}`);\n this.name = 'RoomTaskSequenceConflictError';\n }\n}\n\nexport class RoomTaskJournalCorruptionError extends Error {\n constructor(message: string) {\n super(`Room Task journal is corrupt: ${message}`);\n this.name = 'RoomTaskJournalCorruptionError';\n }\n}\n\n/** Shared batch checks: scope, contiguity from expectedSequence + 1 and a full replay of the result. */\nexport function assertRoomTaskAppend(\n roomId: string,\n current: readonly RoomTaskEvent[],\n expectedSequence: number,\n events: readonly RoomTaskEvent[],\n): void {\n const actual = current.length - 1;\n if (actual !== expectedSequence) throw new RoomTaskSequenceConflictError(roomId, expectedSequence, actual);\n events.forEach((event, index) => {\n if (event.roomId !== roomId) throw new Error(`Room Task append scope drift: event belongs to room ${String(event.roomId)}`);\n if (event.sequence !== expectedSequence + 1 + index) throw new Error('Room Task append sequence is not contiguous');\n });\n replayRoomTasks(roomId, [...current, ...events]);\n}\n\nexport class MemoryRoomTaskJournal implements RoomTaskJournal {\n readonly #rooms = new Map<string, readonly RoomTaskEvent[]>();\n\n async read(roomId: string): Promise<readonly RoomTaskEvent[]> {\n return this.#rooms.get(roomId) ?? Object.freeze([]);\n }\n\n async append(\n roomId: string,\n expectedSequence: number,\n events: readonly RoomTaskEvent[],\n ): Promise<readonly RoomTaskEvent[]> {\n const current = this.#rooms.get(roomId) ?? [];\n // Copy first so later mutation of the caller's objects cannot reach the store.\n const copy = events.map(event => JSON.parse(JSON.stringify(event)) as RoomTaskEvent);\n assertRoomTaskAppend(roomId, current, expectedSequence, copy);\n const frozen = copy.map(event => deepFreezeWorkroomValue(event));\n this.#rooms.set(roomId, Object.freeze([...current, ...frozen]));\n return Object.freeze(frozen);\n }\n}\n"]}
@@ -51,4 +51,3 @@ export interface RoomTaskService {
51
51
  }
52
52
  export declare function createRoomTaskService(options: RoomTaskServiceOptions): RoomTaskService;
53
53
  export {};
54
- //# sourceMappingURL=room-task-service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"room-task-service.js","sourceRoot":"","sources":["../../src/room/room-task-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,cAAc,EACd,YAAY,EACZ,eAAe,GAMhB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,6BAA6B,EAAwB,MAAM,wBAAwB,CAAC;AAE7F,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IAC9B;IAArB,YAAqB,MAAc;QACjC,KAAK,CAAC,8BAA8B,MAAM,EAAE,CAAC,CAAC;QAD3B,WAAM,GAAN,MAAM,CAAQ;QAEjC,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF;AAgDD,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAA+B;IACnE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkD,CAAC;IAC5E,MAAM,KAAK,GAAG,IAAI,GAAG,EAA4B,CAAC;IAElD,MAAM,UAAU,GAAG,CAAI,MAAc,EAAE,IAAsB,EAAc,EAAE;QAC3E,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACxD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACxC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACxB,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI;YAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChF,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,KAAK,EAAE,MAAc,EAAwE,EAAE;QAC1G,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAC9D,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAgC,EAAiB,EAAE;QACzE,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC;YACtC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBACH,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACxB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,EAAE,IAAI,CAAC,mCAAmC,KAAK,CAAC,OAAO,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC9H,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,GAAG,GAAG,KAAK,EAAE,MAAc,EAAE,KAA2B,EAAkC,EAAE;QAChG,MAAM,OAAO,GAAG,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,GAAG,EAAE,EAAqB,CAAC;QACvE,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7C,IAAI,OAAO,KAAK,SAAS;YAAE,MAAM,IAAI,0BAA0B,CAAC,OAAO,CAAC,CAAC;QACzE,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,IAAI,CAAC,EAAE,CAAC;YACrC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAClE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;gBACjD,IAAI,CAAC,IAAI;oBAAE,MAAM,IAAI,KAAK,CAAC,aAAa,OAAO,CAAC,MAAM,kCAAkC,CAAC,CAAC;gBAC1F,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAChE,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBACpE,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;gBAC9D,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAiB,CAAC;gBAChE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YACzE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,CAAC,KAAK,YAAY,6BAA6B,CAAC;oBAAE,MAAM,KAAK,CAAC;gBACnE,IAAI,OAAO,IAAI,YAAY,EAAE,CAAC;oBAC5B,MAAM,IAAI,KAAK,CAAC,qBAAqB,OAAO,CAAC,SAAS,SAAS,YAAY,2BAA2B,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;gBACpI,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,OAA6B;YACzD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;YACpE,mGAAmG;YACnG,kGAAkG;YAClG,yFAAyF;YACzF,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAAE,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACpD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,MAAc;YACtC,OAAO,YAAY,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1D,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,MAA2B;YACpD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;YACrC,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAC5D,CAAC,MAAM,EAAE,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC;mBAC5D,CAAC,MAAM,EAAE,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC/E,CAAC;QACD,SAAS,CAAC,QAAwD;YAChE,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"room-task-service.js","sourceRoot":"","sources":["../../src/room/room-task-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport {\n decideRoomTask,\n findRoomTask,\n replayRoomTasks,\n type RoomTaskCommand,\n type RoomTaskEvent,\n type RoomTaskState,\n type RoomTaskStatus,\n type RoomTaskView,\n} from './room-task.js';\nimport { RoomTaskSequenceConflictError, type RoomTaskJournal } from './room-task-journal.js';\n\nexport class RoomTaskAuthorizationError extends Error {\n constructor(readonly reason: string) {\n super(`Room Task command refused: ${reason}`);\n this.name = 'RoomTaskAuthorizationError';\n }\n}\n\nexport interface RoomTaskExecuteResult {\n readonly events: readonly RoomTaskEvent[];\n readonly state: RoomTaskView;\n /** True when the commandId was already applied (idempotent hit); no new events were written. */\n readonly replayed: boolean;\n}\n\nexport interface RoomTaskListFilter {\n readonly status?: RoomTaskStatus;\n readonly assignee?: string;\n}\n\nexport interface RoomTaskServiceOptions {\n readonly journal: RoomTaskJournal;\n readonly newId?: () => string;\n /** Source of command timestamps' default and nothing else; the pure layer never reads a clock. */\n readonly now?: () => number;\n /**\n * Hook for membership / role checks (done by the caller layer, not the state machine).\n * Return a refusal reason to reject the command; return undefined to allow it.\n *\n * authorize MUST restrict who may issue `assign` against an already-assigned or blocked Task: allow only\n * the lead/coordinator role, because `assign` checks neither `from` nor counts handoffCount. A member who\n * wants to give up a Task must use `handoff`. The C1 authorize hook has to enforce this: createRoomTaskAuthorizer\n * is the fail-closed path (it refuses every `assign` unless its `authorizeAssign` role check allows it).\n */\n readonly authorize?: (roomId: string, command: RoomTaskCommand) => string | undefined;\n readonly logger?: { warn(message: string): void };\n}\n\n/** `Omit` must distribute over the command union, or the per-command fields (`result`, `to`, ...) are lost. */\ntype DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;\nexport type RoomTaskExecuteInput = DistributiveOmit<RoomTaskCommand, 'at'> & { readonly at?: number };\n\nexport interface RoomTaskService {\n execute(roomId: string, command: RoomTaskExecuteInput): Promise<RoomTaskExecuteResult>;\n get(roomId: string, taskId: string): Promise<RoomTaskView | undefined>;\n list(roomId: string, filter?: RoomTaskListFilter): Promise<readonly RoomTaskView[]>;\n /**\n * Listeners run after the command is persisted and after the Room serial section has finished, in the\n * order of the caller's own events. Concurrent executes may interleave their dispatches, so subscribers\n * must order by `event.sequence`. Errors are logged, never propagated.\n */\n subscribe(listener: (event: RoomTaskEvent) => void | Promise<void>): () => void;\n}\n\nconst MAX_ATTEMPTS = 3;\n\n/*\n * Subscribers are dispatched after the Room serial section (see execute), so re-entrant execute is safe.\n *\n * Not wired to RoomBus on purpose: the group-visible projection of a handoff stays in room-bus and is\n * composed with this service in C1. Do not project group messages from here in B3.\n */\nexport function createRoomTaskService(options: RoomTaskServiceOptions): RoomTaskService {\n const { journal, authorize, logger } = options;\n const newId = options.newId ?? (() => randomUUID());\n const now = options.now ?? (() => Date.now());\n const listeners = new Set<(event: RoomTaskEvent) => void | Promise<void>>();\n const tails = new Map<string, Promise<unknown>>();\n\n const serialized = <T>(roomId: string, work: () => Promise<T>): Promise<T> => {\n const previous = tails.get(roomId) ?? Promise.resolve();\n const run = previous.then(work, work);\n const tail = run.catch(() => undefined);\n tails.set(roomId, tail);\n void tail.then(() => { if (tails.get(roomId) === tail) tails.delete(roomId); });\n return run;\n };\n\n const load = async (roomId: string): Promise<{ history: readonly RoomTaskEvent[]; state: RoomTaskState }> => {\n const history = await journal.read(roomId);\n return { history, state: replayRoomTasks(roomId, history) };\n };\n\n const dispatch = async (events: readonly RoomTaskEvent[]): Promise<void> => {\n for (const listener of [...listeners]) {\n for (const event of events) {\n try {\n await listener(event);\n } catch (error) {\n logger?.warn(`room task subscriber failed for ${event.eventId}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n };\n\n const run = async (roomId: string, input: RoomTaskExecuteInput): Promise<RoomTaskExecuteResult> => {\n const command = { ...input, at: input.at ?? now() } as RoomTaskCommand;\n const refusal = authorize?.(roomId, command);\n if (refusal !== undefined) throw new RoomTaskAuthorizationError(refusal);\n for (let attempt = 1; ; attempt += 1) {\n const { history, state } = await load(roomId);\n const events = decideRoomTask(state, history, command, { newId });\n if (events.length === 0) {\n const view = findRoomTask(state, command.taskId);\n if (!view) throw new Error(`Room Task ${command.taskId} missing after idempotent replay`);\n return Object.freeze({ events, state: view, replayed: true });\n }\n try {\n const stored = await journal.append(roomId, state.sequence, events);\n const next = replayRoomTasks(roomId, [...history, ...stored]);\n const view = findRoomTask(next, command.taskId) as RoomTaskView;\n return Object.freeze({ events: stored, state: view, replayed: false });\n } catch (error) {\n if (!(error instanceof RoomTaskSequenceConflictError)) throw error;\n if (attempt >= MAX_ATTEMPTS) {\n throw new Error(`Room Task command ${command.commandId} lost ${MAX_ATTEMPTS} sequence races in room ${roomId}`, { cause: error });\n }\n }\n }\n };\n\n return Object.freeze({\n async execute(roomId: string, command: RoomTaskExecuteInput) {\n const result = await serialized(roomId, () => run(roomId, command));\n // Dispatch only after the Room serial section has settled, so a subscriber may call execute on the\n // same Room without deadlocking. The caller still awaits the subscribers (and observes their side\n // effects); a slow subscriber delays its own caller but no longer blocks other commands.\n if (!result.replayed) await dispatch(result.events);\n return result;\n },\n async get(roomId: string, taskId: string) {\n return findRoomTask((await load(roomId)).state, taskId);\n },\n async list(roomId: string, filter?: RoomTaskListFilter) {\n const { state } = await load(roomId);\n return Object.freeze(Object.values(state.tasks).filter(view =>\n (filter?.status === undefined || view.status === filter.status)\n && (filter?.assignee === undefined || view.assignee === filter.assignee)));\n },\n subscribe(listener: (event: RoomTaskEvent) => void | Promise<void>) {\n listeners.add(listener);\n return () => { listeners.delete(listener); };\n },\n });\n}\n"]}
@@ -140,4 +140,3 @@ export interface DecideRoomTaskOptions {
140
140
  */
141
141
  export declare function decideRoomTask(state: RoomTaskState, history: readonly RoomTaskEvent[], command: RoomTaskCommand, options: DecideRoomTaskOptions): readonly RoomTaskEvent[];
142
142
  export {};
143
- //# sourceMappingURL=room-task.d.ts.map