@spine-event-engine/server 2.0.0-snapshot.23 → 2.0.0-snapshot.25

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 (300) hide show
  1. package/README.md +38 -11
  2. package/REFERENCE.md +278 -141
  3. package/dist/agent/agent-acceptance-receipts.d.ts +69 -0
  4. package/dist/agent/agent-acceptance-receipts.d.ts.map +1 -0
  5. package/dist/agent/agent-acceptance-receipts.js +198 -0
  6. package/dist/agent/agent-acceptance-receipts.js.map +1 -0
  7. package/dist/agent/agent-execution-capacity.d.ts +37 -9
  8. package/dist/agent/agent-execution-capacity.d.ts.map +1 -1
  9. package/dist/agent/agent-execution-capacity.js +73 -15
  10. package/dist/agent/agent-execution-capacity.js.map +1 -1
  11. package/dist/agent/agent-history.d.ts +15 -10
  12. package/dist/agent/agent-history.d.ts.map +1 -1
  13. package/dist/agent/agent-history.js +26 -14
  14. package/dist/agent/agent-history.js.map +1 -1
  15. package/dist/agent/agent-live-ai-audit.d.ts +95 -0
  16. package/dist/agent/agent-live-ai-audit.d.ts.map +1 -0
  17. package/dist/agent/agent-live-ai-audit.js +290 -0
  18. package/dist/agent/agent-live-ai-audit.js.map +1 -0
  19. package/dist/agent/agent-live-ai-runtime.d.ts +300 -0
  20. package/dist/agent/agent-live-ai-runtime.d.ts.map +1 -0
  21. package/dist/agent/agent-live-ai-runtime.js +611 -0
  22. package/dist/agent/agent-live-ai-runtime.js.map +1 -0
  23. package/dist/agent/agent-live-audit.d.ts +67 -0
  24. package/dist/agent/agent-live-audit.d.ts.map +1 -0
  25. package/dist/agent/agent-live-audit.js +121 -0
  26. package/dist/agent/agent-live-audit.js.map +1 -0
  27. package/dist/agent/agent-live-budget.d.ts +84 -0
  28. package/dist/agent/agent-live-budget.d.ts.map +1 -0
  29. package/dist/agent/agent-live-budget.js +161 -0
  30. package/dist/agent/agent-live-budget.js.map +1 -0
  31. package/dist/agent/agent-live-fault.d.ts +18 -0
  32. package/dist/agent/agent-live-fault.d.ts.map +1 -0
  33. package/dist/agent/{agent-execution-fault.js → agent-live-fault.js} +7 -7
  34. package/dist/agent/agent-live-fault.js.map +1 -0
  35. package/dist/agent/agent-live-inputs.d.ts +74 -0
  36. package/dist/agent/agent-live-inputs.d.ts.map +1 -0
  37. package/dist/agent/agent-live-inputs.js +15 -0
  38. package/dist/agent/agent-live-inputs.js.map +1 -0
  39. package/dist/agent/agent-live-interaction-events.d.ts +46 -0
  40. package/dist/agent/agent-live-interaction-events.d.ts.map +1 -0
  41. package/dist/agent/agent-live-interaction-events.js +104 -0
  42. package/dist/agent/agent-live-interaction-events.js.map +1 -0
  43. package/dist/agent/agent-live-mcp-controls.d.ts +129 -0
  44. package/dist/agent/agent-live-mcp-controls.d.ts.map +1 -0
  45. package/dist/agent/agent-live-mcp-controls.js +228 -0
  46. package/dist/agent/agent-live-mcp-controls.js.map +1 -0
  47. package/dist/agent/agent-live-mcp-host.d.ts +88 -0
  48. package/dist/agent/agent-live-mcp-host.d.ts.map +1 -0
  49. package/dist/agent/{agent-mcp-host.js → agent-live-mcp-host.js} +1 -1
  50. package/dist/agent/agent-live-mcp-host.js.map +1 -0
  51. package/dist/agent/{agent-mcp-runtime.d.ts → agent-live-mcp-runtime.d.ts} +6 -6
  52. package/dist/agent/agent-live-mcp-runtime.d.ts.map +1 -0
  53. package/dist/agent/{agent-mcp-runtime.js → agent-live-mcp-runtime.js} +13 -42
  54. package/dist/agent/agent-live-mcp-runtime.js.map +1 -0
  55. package/dist/agent/agent-live-read-runtime.d.ts +61 -0
  56. package/dist/agent/agent-live-read-runtime.d.ts.map +1 -0
  57. package/dist/agent/agent-live-read-runtime.js +121 -0
  58. package/dist/agent/agent-live-read-runtime.js.map +1 -0
  59. package/dist/agent/agent-model-selection.d.ts +21 -34
  60. package/dist/agent/agent-model-selection.d.ts.map +1 -1
  61. package/dist/agent/agent-model-selection.js +61 -78
  62. package/dist/agent/agent-model-selection.js.map +1 -1
  63. package/dist/bus/command-bus.d.ts +14 -18
  64. package/dist/bus/command-bus.d.ts.map +1 -1
  65. package/dist/bus/command-bus.js +31 -48
  66. package/dist/bus/command-bus.js.map +1 -1
  67. package/dist/bus/event-bus.d.ts +82 -104
  68. package/dist/bus/event-bus.d.ts.map +1 -1
  69. package/dist/bus/event-bus.js +87 -127
  70. package/dist/bus/event-bus.js.map +1 -1
  71. package/dist/context/bounded-context.d.ts +143 -91
  72. package/dist/context/bounded-context.d.ts.map +1 -1
  73. package/dist/context/bounded-context.js +753 -359
  74. package/dist/context/bounded-context.js.map +1 -1
  75. package/dist/context/entity-inbox.d.ts +7 -2
  76. package/dist/context/entity-inbox.d.ts.map +1 -1
  77. package/dist/context/entity-inbox.js +43 -20
  78. package/dist/context/entity-inbox.js.map +1 -1
  79. package/dist/context/local-inbox-handoff.d.ts +35 -34
  80. package/dist/context/local-inbox-handoff.d.ts.map +1 -1
  81. package/dist/context/local-inbox-handoff.js +123 -135
  82. package/dist/context/local-inbox-handoff.js.map +1 -1
  83. package/dist/context/projection-handoff.d.ts +2 -2
  84. package/dist/context/projection-handoff.d.ts.map +1 -1
  85. package/dist/context/projection-handoff.js +12 -8
  86. package/dist/context/projection-handoff.js.map +1 -1
  87. package/dist/context/tenant-index.d.ts +36 -31
  88. package/dist/context/tenant-index.d.ts.map +1 -1
  89. package/dist/context/tenant-index.js +123 -125
  90. package/dist/context/tenant-index.js.map +1 -1
  91. package/dist/context/tenant-unknown-error.d.ts +33 -0
  92. package/dist/context/tenant-unknown-error.d.ts.map +1 -0
  93. package/dist/context/tenant-unknown-error.js +75 -0
  94. package/dist/context/tenant-unknown-error.js.map +1 -0
  95. package/dist/delivery/agent-delivery-scope.d.ts +66 -0
  96. package/dist/delivery/agent-delivery-scope.d.ts.map +1 -0
  97. package/dist/delivery/agent-delivery-scope.js +44 -0
  98. package/dist/delivery/agent-delivery-scope.js.map +1 -0
  99. package/dist/delivery/delivery-builder.d.ts +25 -1
  100. package/dist/delivery/delivery-builder.d.ts.map +1 -1
  101. package/dist/delivery/delivery-builder.js +89 -0
  102. package/dist/delivery/delivery-builder.js.map +1 -1
  103. package/dist/delivery/delivery-monitor.d.ts +12 -9
  104. package/dist/delivery/delivery-monitor.d.ts.map +1 -1
  105. package/dist/delivery/delivery-monitor.js +15 -9
  106. package/dist/delivery/delivery-monitor.js.map +1 -1
  107. package/dist/delivery/delivery-ports.d.ts +6 -13
  108. package/dist/delivery/delivery-ports.d.ts.map +1 -1
  109. package/dist/delivery/delivery-run-control.d.ts +21 -0
  110. package/dist/delivery/delivery-run-control.d.ts.map +1 -1
  111. package/dist/delivery/delivery-run-control.js +10 -0
  112. package/dist/delivery/delivery-run-control.js.map +1 -1
  113. package/dist/delivery/delivery-supervisor.d.ts +33 -5
  114. package/dist/delivery/delivery-supervisor.d.ts.map +1 -1
  115. package/dist/delivery/delivery-supervisor.js +178 -26
  116. package/dist/delivery/delivery-supervisor.js.map +1 -1
  117. package/dist/delivery/delivery-tenant.d.ts +17 -0
  118. package/dist/delivery/delivery-tenant.d.ts.map +1 -0
  119. package/dist/delivery/delivery-tenant.js +50 -0
  120. package/dist/delivery/delivery-tenant.js.map +1 -0
  121. package/dist/delivery/delivery.d.ts +96 -2
  122. package/dist/delivery/delivery.d.ts.map +1 -1
  123. package/dist/delivery/delivery.js +803 -89
  124. package/dist/delivery/delivery.js.map +1 -1
  125. package/dist/delivery/inbox-records.d.ts.map +1 -1
  126. package/dist/delivery/inbox-records.js +9 -16
  127. package/dist/delivery/inbox-records.js.map +1 -1
  128. package/dist/delivery/inbox-storage.d.ts +14 -11
  129. package/dist/delivery/inbox-storage.d.ts.map +1 -1
  130. package/dist/delivery/inbox-storage.js +72 -78
  131. package/dist/delivery/inbox-storage.js.map +1 -1
  132. package/dist/delivery/inbox.d.ts +9 -12
  133. package/dist/delivery/inbox.d.ts.map +1 -1
  134. package/dist/delivery/inbox.js +13 -15
  135. package/dist/delivery/inbox.js.map +1 -1
  136. package/dist/delivery/reception-observation.d.ts +64 -0
  137. package/dist/delivery/reception-observation.d.ts.map +1 -0
  138. package/dist/delivery/reception-observation.js +78 -0
  139. package/dist/delivery/reception-observation.js.map +1 -0
  140. package/dist/delivery/sharded-work-registry.d.ts +6 -0
  141. package/dist/delivery/sharded-work-registry.d.ts.map +1 -1
  142. package/dist/delivery/sharded-work-registry.js +41 -4
  143. package/dist/delivery/sharded-work-registry.js.map +1 -1
  144. package/dist/entity/entity-storage-descriptor.d.ts.map +1 -1
  145. package/dist/entity/entity-storage-descriptor.js +7 -4
  146. package/dist/entity/entity-storage-descriptor.js.map +1 -1
  147. package/dist/index.d.ts +4 -2
  148. package/dist/index.d.ts.map +1 -1
  149. package/dist/index.js +2 -1
  150. package/dist/index.js.map +1 -1
  151. package/dist/integration/external-messages.d.ts.map +1 -1
  152. package/dist/integration/external-messages.js +9 -15
  153. package/dist/integration/external-messages.js.map +1 -1
  154. package/dist/integration/integration-broker.d.ts.map +1 -1
  155. package/dist/integration/integration-broker.js +112 -6
  156. package/dist/integration/integration-broker.js.map +1 -1
  157. package/dist/integration/third-party-context.d.ts.map +1 -1
  158. package/dist/integration/third-party-context.js +7 -10
  159. package/dist/integration/third-party-context.js.map +1 -1
  160. package/dist/repository/primitive-id.js +26 -11
  161. package/dist/repository/primitive-id.js.map +1 -1
  162. package/dist/repository/repository.d.ts +33 -62
  163. package/dist/repository/repository.d.ts.map +1 -1
  164. package/dist/repository/repository.js +1475 -1827
  165. package/dist/repository/repository.js.map +1 -1
  166. package/dist/runtime/runtime.d.ts +24 -0
  167. package/dist/runtime/runtime.d.ts.map +1 -1
  168. package/dist/runtime/runtime.js +31 -0
  169. package/dist/runtime/runtime.js.map +1 -1
  170. package/dist/runtime/signal-metadata.d.ts.map +1 -1
  171. package/dist/runtime/signal-metadata.js +8 -15
  172. package/dist/runtime/signal-metadata.js.map +1 -1
  173. package/dist/runtime/signal-publisher.d.ts +8 -36
  174. package/dist/runtime/signal-publisher.d.ts.map +1 -1
  175. package/dist/runtime/signal-publisher.js +68 -61
  176. package/dist/runtime/signal-publisher.js.map +1 -1
  177. package/dist/runtime/standalone-handler-runtime.d.ts +0 -7
  178. package/dist/runtime/standalone-handler-runtime.d.ts.map +1 -1
  179. package/dist/runtime/standalone-handler-runtime.js +14 -130
  180. package/dist/runtime/standalone-handler-runtime.js.map +1 -1
  181. package/dist/server/managed-delivery-gate.d.ts +34 -0
  182. package/dist/server/managed-delivery-gate.d.ts.map +1 -0
  183. package/dist/server/managed-delivery-gate.js +70 -0
  184. package/dist/server/managed-delivery-gate.js.map +1 -0
  185. package/dist/server/managed-server-application.d.ts +2 -2
  186. package/dist/server/managed-server-application.d.ts.map +1 -1
  187. package/dist/server/managed-server-application.js +471 -178
  188. package/dist/server/managed-server-application.js.map +1 -1
  189. package/dist/server/node-coordinator.d.ts +14 -0
  190. package/dist/server/node-coordinator.d.ts.map +1 -1
  191. package/dist/server/node-coordinator.js +266 -45
  192. package/dist/server/node-coordinator.js.map +1 -1
  193. package/dist/server/server-environment.d.ts +203 -25
  194. package/dist/server/server-environment.d.ts.map +1 -1
  195. package/dist/server/server-environment.js +661 -133
  196. package/dist/server/server-environment.js.map +1 -1
  197. package/dist/server/server-log.d.ts +7 -0
  198. package/dist/server/server-log.d.ts.map +1 -1
  199. package/dist/server/server-log.js +18 -1
  200. package/dist/server/server-log.js.map +1 -1
  201. package/dist/server/server.d.ts +18 -32
  202. package/dist/server/server.d.ts.map +1 -1
  203. package/dist/server/server.js +62 -203
  204. package/dist/server/server.js.map +1 -1
  205. package/dist/services/spine-services.d.ts +1 -1
  206. package/dist/services/spine-services.d.ts.map +1 -1
  207. package/dist/services/spine-services.js +399 -370
  208. package/dist/services/spine-services.js.map +1 -1
  209. package/dist/stand/event-origin-filter.d.ts +16 -0
  210. package/dist/stand/event-origin-filter.d.ts.map +1 -0
  211. package/dist/stand/event-origin-filter.js +124 -0
  212. package/dist/stand/event-origin-filter.js.map +1 -0
  213. package/dist/stand/stand.d.ts +14 -0
  214. package/dist/stand/stand.d.ts.map +1 -1
  215. package/dist/stand/stand.js +53 -9
  216. package/dist/stand/stand.js.map +1 -1
  217. package/dist/stand/subscription-observer.d.ts.map +1 -1
  218. package/dist/stand/subscription-observer.js +61 -40
  219. package/dist/stand/subscription-observer.js.map +1 -1
  220. package/dist/stand/subscription-registry.d.ts +6 -2
  221. package/dist/stand/subscription-registry.d.ts.map +1 -1
  222. package/dist/stand/subscription-registry.js +15 -11
  223. package/dist/stand/subscription-registry.js.map +1 -1
  224. package/dist/stand/subscription-runtime.d.ts +23 -4
  225. package/dist/stand/subscription-runtime.d.ts.map +1 -1
  226. package/dist/stand/subscription-runtime.js +84 -13
  227. package/dist/stand/subscription-runtime.js.map +1 -1
  228. package/dist/testing/index.d.ts.map +1 -1
  229. package/dist/testing/index.js +3 -2
  230. package/dist/testing/index.js.map +1 -1
  231. package/dist/tsconfig.tsbuildinfo +1 -1
  232. package/package.json +15 -15
  233. package/dist/agent/agent-admission.d.ts +0 -80
  234. package/dist/agent/agent-admission.d.ts.map +0 -1
  235. package/dist/agent/agent-admission.js +0 -127
  236. package/dist/agent/agent-admission.js.map +0 -1
  237. package/dist/agent/agent-ai-runtime.d.ts +0 -76
  238. package/dist/agent/agent-ai-runtime.d.ts.map +0 -1
  239. package/dist/agent/agent-ai-runtime.js +0 -1269
  240. package/dist/agent/agent-ai-runtime.js.map +0 -1
  241. package/dist/agent/agent-execution-fault.d.ts +0 -18
  242. package/dist/agent/agent-execution-fault.d.ts.map +0 -1
  243. package/dist/agent/agent-execution-fault.js.map +0 -1
  244. package/dist/agent/agent-execution-session.d.ts +0 -103
  245. package/dist/agent/agent-execution-session.d.ts.map +0 -1
  246. package/dist/agent/agent-execution-session.js +0 -238
  247. package/dist/agent/agent-execution-session.js.map +0 -1
  248. package/dist/agent/agent-interaction-audit.d.ts +0 -58
  249. package/dist/agent/agent-interaction-audit.d.ts.map +0 -1
  250. package/dist/agent/agent-interaction-audit.js +0 -114
  251. package/dist/agent/agent-interaction-audit.js.map +0 -1
  252. package/dist/agent/agent-interaction-events.d.ts +0 -40
  253. package/dist/agent/agent-interaction-events.d.ts.map +0 -1
  254. package/dist/agent/agent-interaction-events.js +0 -129
  255. package/dist/agent/agent-interaction-events.js.map +0 -1
  256. package/dist/agent/agent-mcp-budget.d.ts +0 -125
  257. package/dist/agent/agent-mcp-budget.d.ts.map +0 -1
  258. package/dist/agent/agent-mcp-budget.js +0 -566
  259. package/dist/agent/agent-mcp-budget.js.map +0 -1
  260. package/dist/agent/agent-mcp-host.d.ts +0 -125
  261. package/dist/agent/agent-mcp-host.d.ts.map +0 -1
  262. package/dist/agent/agent-mcp-host.js.map +0 -1
  263. package/dist/agent/agent-mcp-runtime.d.ts.map +0 -1
  264. package/dist/agent/agent-mcp-runtime.js.map +0 -1
  265. package/dist/agent/agent-read-runtime.d.ts +0 -70
  266. package/dist/agent/agent-read-runtime.d.ts.map +0 -1
  267. package/dist/agent/agent-read-runtime.js +0 -320
  268. package/dist/agent/agent-read-runtime.js.map +0 -1
  269. package/dist/agent/agent-revisions.d.ts +0 -35
  270. package/dist/agent/agent-revisions.d.ts.map +0 -1
  271. package/dist/agent/agent-revisions.js +0 -133
  272. package/dist/agent/agent-revisions.js.map +0 -1
  273. package/dist/agent/agent-scheduler.d.ts +0 -99
  274. package/dist/agent/agent-scheduler.d.ts.map +0 -1
  275. package/dist/agent/agent-scheduler.js +0 -398
  276. package/dist/agent/agent-scheduler.js.map +0 -1
  277. package/dist/bus/saved-dispatcher-binding.d.ts +0 -96
  278. package/dist/bus/saved-dispatcher-binding.d.ts.map +0 -1
  279. package/dist/bus/saved-dispatcher-binding.js +0 -35
  280. package/dist/bus/saved-dispatcher-binding.js.map +0 -1
  281. package/dist/delivery/delivery-run-coordinator.d.ts +0 -218
  282. package/dist/delivery/delivery-run-coordinator.d.ts.map +0 -1
  283. package/dist/delivery/delivery-run-coordinator.js +0 -609
  284. package/dist/delivery/delivery-run-coordinator.js.map +0 -1
  285. package/dist/delivery/parked-delivery-obligations.d.ts +0 -182
  286. package/dist/delivery/parked-delivery-obligations.d.ts.map +0 -1
  287. package/dist/delivery/parked-delivery-obligations.js +0 -390
  288. package/dist/delivery/parked-delivery-obligations.js.map +0 -1
  289. package/dist/server/environment-attachment.d.ts +0 -356
  290. package/dist/server/environment-attachment.d.ts.map +0 -1
  291. package/dist/server/environment-attachment.js +0 -2062
  292. package/dist/server/environment-attachment.js.map +0 -1
  293. package/dist/server/environment-delivery-records.d.ts +0 -77
  294. package/dist/server/environment-delivery-records.d.ts.map +0 -1
  295. package/dist/server/environment-delivery-records.js +0 -282
  296. package/dist/server/environment-delivery-records.js.map +0 -1
  297. package/dist/server/environment-delivery-worker.d.ts +0 -161
  298. package/dist/server/environment-delivery-worker.d.ts.map +0 -1
  299. package/dist/server/environment-delivery-worker.js +0 -673
  300. package/dist/server/environment-delivery-worker.js.map +0 -1
@@ -1,66 +1,71 @@
1
1
  import type { TenantId } from "@spine-event-engine/proto";
2
- import { type StorageFactory } from "@spine-event-engine/storage";
3
- import type { TenantCatalogCursor, TenantCatalogRead } from "@spine-event-engine/storage/provider";
4
- type TenantMode = "single-tenant" | "multitenant";
2
+ import type { StorageFactory } from "@spine-event-engine/storage";
3
+ import { type TenantCatalogCursor, type TenantCatalogRead, type TenantCatalogSignal } from "@spine-event-engine/storage/provider";
5
4
  /**
6
- * Tracks tenants admitted through one factory-owned provider catalog.
5
+ * Finite read request for a live tenant index.
6
+ */
7
+ export type TenantIndexRead = TenantCatalogRead;
8
+ /**
9
+ * Cancellation port for tenant-index traversal.
10
+ */
11
+ export type TenantIndexSignal = TenantCatalogSignal;
12
+ /**
13
+ * Opaque continuation returned by the same index instance.
14
+ */
15
+ export type TenantIndexCursor = TenantCatalogCursor;
16
+ /**
17
+ * Live application membership independent of storage destination resolution.
7
18
  */
8
19
  export interface TenantIndex {
9
20
  /**
10
- * Identifies whether the owning context accepts tenant IDs.
21
+ * Checks current membership without registration or storage preparation.
22
+ *
23
+ * @param tenantId Complete tenant identity to inspect.
24
+ * @returns Whether this index currently includes the tenant.
11
25
  */
12
- readonly tenantMode: TenantMode;
26
+ contains(tenantId: TenantId): Promise<boolean>;
13
27
  /**
14
- * Lists complete tenants discovered by the provider.
28
+ * Lists complete currently registered tenant identities.
15
29
  *
16
- * @returns The provider-owned tenant IDs.
30
+ * @returns Complete currently registered tenant identities.
17
31
  */
18
32
  all(): Promise<readonly TenantId[]>;
19
33
  /**
20
- * Reads a finite page for Agent recovery without enumerating the catalog.
34
+ * Reads a finite page from this index.
21
35
  *
22
- * @param request Bounded provider page and cancellation.
23
- * @returns Complete tenant IDs and an opaque continuation.
36
+ * @param request Bounded page and cancellation.
37
+ * @returns Tenant identities and an opaque continuation.
24
38
  */
25
- page(request: TenantCatalogRead): Promise<TenantIndexPage>;
39
+ page(request: TenantIndexRead): Promise<TenantIndexPage>;
26
40
  /**
27
- * Records one complete tenant through provider-native catalog state.
41
+ * Registers a tenant and returns after membership becomes visible.
28
42
  *
29
- * @param tenantId The complete generated tenant ID.
30
- * @returns Completion of provider catalog admission.
43
+ * @param tenantId Complete tenant identity to register.
44
+ * @returns Completion or rejection from this index.
31
45
  */
32
46
  keep(tenantId: TenantId): Promise<void>;
33
- /**
34
- * Closes this context view without closing the factory-owned catalog.
35
- */
36
- close(): void;
37
47
  }
38
48
  /**
39
- * One finite provider tenant page for Agent discovery.
49
+ * One finite page of complete tenant identities.
40
50
  */
41
51
  export interface TenantIndexPage {
42
52
  /**
43
- * Complete generated tenant identities from this provider page.
53
+ * Complete generated tenant identities.
44
54
  */
45
55
  readonly ids: readonly TenantId[];
46
56
  /**
47
- * Opaque continuation when another provider page remains.
57
+ * Opaque continuation when another page remains.
48
58
  */
49
- readonly after?: TenantCatalogCursor;
59
+ readonly after?: TenantIndexCursor;
50
60
  /**
51
- * Whether the finite catalog traversal has another page.
61
+ * Whether another page belongs to this traversal.
52
62
  */
53
63
  readonly hasMore: boolean;
54
64
  }
55
65
  /**
56
- * Creates context views over factory-owned tenant catalogs.
66
+ * Creates an environment default from a provider catalog or transient memory.
57
67
  */
58
68
  export declare const TenantIndexes: Readonly<{
59
- create(input: {
60
- readonly contextName: string;
61
- readonly tenantMode: TenantMode;
62
- readonly storageFactory: StorageFactory;
63
- }): TenantIndex;
69
+ fromFactory(factory: StorageFactory): TenantIndex;
64
70
  }>;
65
- export {};
66
71
  //# sourceMappingURL=tenant-index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tenant-index.d.ts","sourceRoot":"","sources":["../../src/context/tenant-index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAEV,mBAAmB,EAEnB,iBAAiB,EAClB,MAAM,sCAAsC,CAAC;AAK9C,KAAK,UAAU,GAAG,eAAe,GAAG,aAAa,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,WAAW;IAG1B;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAEhC;;;;OAIG;IACH,GAAG,IAAI,OAAO,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC;IAEpC;;;;;OAKG;IACH,IAAI,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAE3D;;;;;OAKG;IACH,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExC;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,SAAS,QAAQ,EAAE,CAAC;IAElC;;OAEG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAErC;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC;IACnC,MAAM,CAAC,KAAK,EAAE;QACZ,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;QAChC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;KACzC,GAAG,WAAW,CAAC;CACjB,CAcC,CAAC"}
1
+ {"version":3,"file":"tenant-index.d.ts","sourceRoot":"","sources":["../../src/context/tenant-index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAIL,KAAK,mBAAmB,EAExB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACzB,MAAM,sCAAsC,CAAC;AAE9C;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAEhD;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAEpD;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,WAAW;IAG1B;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE/C;;;;OAIG;IACH,GAAG,IAAI,OAAO,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC;IAEpC;;;;;OAKG;IACH,IAAI,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAEzD;;;;;OAKG;IACH,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,SAAS,QAAQ,EAAE,CAAC;IAElC;;OAEG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAEnC;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC;IAAE,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,WAAW,CAAA;CAAE,CActF,CAAC"}
@@ -11,196 +11,194 @@
11
11
  * or implied. See the License for the specific language governing permissions and limitations under
12
12
  * the License.
13
13
  */
14
- import {} from "@spine-event-engine/storage";
15
- import { TenantBoundary } from "@spine-event-engine/storage/provider";
16
- import { TenantCatalogReads } from "@spine-event-engine/storage/provider";
17
- import { EffectiveTenants } from "./effective-tenant.js";
14
+ import { TenantBoundary, TenantCatalogReads, } from "@spine-event-engine/storage/provider";
18
15
  /**
19
- * Creates context views over factory-owned tenant catalogs.
16
+ * Creates an environment default from a provider catalog or transient memory.
20
17
  */
21
18
  export const TenantIndexes = Object.freeze({
22
- // prettier-ignore
23
19
  /**
24
- * Creates an index view for one context.
20
+ * Selects a provider catalog when available without creating records.
25
21
  *
26
- * @param input Identifies the diagnostic context, tenancy mode, and factory.
27
- * @returns The matching tenant index.
28
- */
29
- create(input) {
30
- return input.tenantMode === "single-tenant"
31
- ? new SingleTenantIndex(input.contextName)
32
- : new StorageTenantIndex(input.contextName, tenantCatalog(input.storageFactory));
22
+ * @param factory Environment storage factory.
23
+ * @returns One live index for the environment lifetime.
24
+ */
25
+ fromFactory(factory) {
26
+ const provider = factory;
27
+ return typeof provider.tenantCatalog === "function"
28
+ ? new StorageTenantIndex(provider.tenantCatalog())
29
+ : new MemoryTenantIndex();
33
30
  },
34
31
  });
35
32
  /**
36
- * Reports the effective identity of one single-tenant context.
33
+ * Adapts a provider catalog to the public live membership contract.
37
34
  */
38
- class SingleTenantIndex {
39
- contextName;
40
- // prettier-ignore
41
- /**
42
- * Identifies the index mode.
43
- */
44
- tenantMode = "single-tenant";
45
- /**
46
- * Whether callers may still use this index.
47
- */
48
- #open = true;
35
+ class StorageTenantIndex {
36
+ catalog;
49
37
  /**
50
- * Captures the context name for closed-index diagnostics.
38
+ * Binds the index to a provider catalog.
51
39
  *
52
- * @param contextName Name reported in diagnostics.
40
+ * @param catalog Provider catalog retained by its storage factory.
53
41
  */
54
- constructor(contextName) {
55
- this.contextName = contextName;
42
+ constructor(catalog) {
43
+ this.catalog = catalog;
56
44
  }
57
45
  /**
58
- * Lists the effective single-tenant identity while open.
46
+ * Checks membership through the catalog.
59
47
  *
60
- * @returns The single effective tenant, or rejection after close.
48
+ * @param tenantId Tenant to inspect.
49
+ * @returns Live catalog membership.
61
50
  */
62
- all() {
63
- const closed = this.closedError();
64
- return closed === undefined
65
- ? Promise.resolve(Object.freeze([EffectiveTenants.current(false, undefined)]))
66
- : Promise.reject(closed);
51
+ async contains(tenantId) {
52
+ return this.catalog.contains(TenantBoundary.from(tenantId));
67
53
  }
68
54
  /**
69
- * Returns the single effective tenant without a provider catalog.
55
+ * Lists complete named tenant identities.
70
56
  *
71
- * @param request Finite page request.
72
- * @returns One terminal tenant page.
57
+ * @returns Complete named tenant identities.
73
58
  */
74
- page(request) {
75
- return Promise.resolve().then(() => {
76
- const closed = this.closedError();
77
- if (closed !== undefined)
78
- throw closed;
79
- TenantCatalogReads.require(request);
80
- if (request.after !== undefined)
81
- throw new TypeError("Single-tenant catalog does not accept a continuation.");
82
- return { ids: [EffectiveTenants.current(false, undefined)], hasMore: false };
83
- });
59
+ async all() {
60
+ return Object.freeze((await this.catalog.all()).map((boundary) => this.named(boundary)));
84
61
  }
85
62
  /**
86
- * Rejects tenant recording because a single-tenant context has a fixed identity.
63
+ * Reads a finite provider page.
87
64
  *
88
- * @returns A rejected promise explaining why recording is unavailable.
65
+ * @param request Finite provider page.
66
+ * @returns Complete tenant page.
89
67
  */
90
- keep() {
91
- const closed = this.closedError();
92
- return Promise.reject(closed ??
93
- new Error(`Single-tenant context "${this.contextName}" does not accept tenant recording.`));
68
+ async page(request) {
69
+ TenantCatalogReads.require(request);
70
+ const page = await this.catalog.page(request);
71
+ request.signal.throwIfAborted();
72
+ return {
73
+ ids: page.boundaries.map((boundary) => this.named(boundary)),
74
+ ...(page.after === undefined ? {} : { after: page.after }),
75
+ hasMore: page.hasMore,
76
+ };
94
77
  }
95
78
  /**
96
- * Stops accepting index operations.
79
+ * Registers a tenant through the provider catalog.
80
+ *
81
+ * @param tenantId Tenant to register.
82
+ * @returns Provider confirmation.
97
83
  */
98
- close() {
99
- this.#open = false;
84
+ async keep(tenantId) {
85
+ return this.catalog.keep(TenantBoundary.from(tenantId));
100
86
  }
101
87
  /**
102
- * Returns a closed-index error while preserving an open index.
88
+ * Validates a named provider boundary.
103
89
  *
104
- * @returns An error only when the index is closed.
90
+ * @param boundary Provider boundary.
91
+ * @returns Its complete named identity.
105
92
  */
106
- closedError() {
107
- return this.#open ? undefined : new Error("TenantIndex is closed.");
93
+ named(boundary) {
94
+ if (boundary.single || boundary.tenantId === undefined)
95
+ throw new Error("Multitenant provider catalog returned a single-tenant boundary.");
96
+ return boundary.tenantId;
108
97
  }
109
98
  }
110
99
  /**
111
- * Reads named tenants from the storage provider's catalog.
100
+ * Retains explicit membership when a custom factory has no catalog.
112
101
  */
113
- class StorageTenantIndex {
114
- contextName;
115
- catalog;
116
- // prettier-ignore
117
- /**
118
- * Identifies the index mode.
119
- */
120
- tenantMode = "multitenant";
102
+ class MemoryTenantIndex {
103
+ #tenants = new Map();
104
+ #order = [];
105
+ #identity = {};
121
106
  /**
122
- * Whether callers may still use this index.
107
+ * Checks explicit memory membership.
108
+ *
109
+ * @param tenantId Tenant to inspect.
110
+ * @returns Explicit membership.
123
111
  */
124
- #open = true;
112
+ contains(tenantId) {
113
+ return Promise.resolve().then(() => this.#tenants.has(String(TenantBoundary.from(tenantId).key)));
114
+ }
125
115
  /**
126
- * Captures the provider catalog used for this context.
116
+ * Lists detached complete tenant identities.
127
117
  *
128
- * @param contextName Name reported in diagnostics.
129
- * @param catalog Provider catalog for named tenants.
118
+ * @returns Detached complete tenant identities.
130
119
  */
131
- constructor(contextName, catalog) {
132
- this.contextName = contextName;
133
- this.catalog = catalog;
120
+ all() {
121
+ return Promise.resolve(Object.freeze(this.#order.map((boundary) => boundary.tenantId)));
134
122
  }
135
123
  /**
136
- * Lists named tenants from the provider catalog.
124
+ * Reads a bounded page without copying the full directory.
137
125
  *
138
- * @returns Named tenant IDs, or rejection for an invalid/closed catalog.
126
+ * @param request Finite page request.
127
+ * @returns Bounded membership page.
139
128
  */
140
- async all() {
141
- this.requireOpen();
142
- return Object.freeze((await this.catalog.all()).map((boundary) => {
143
- if (boundary.single || boundary.tenantId === undefined)
144
- throw new Error("Multitenant provider catalog returned a single-tenant boundary.");
145
- return boundary.tenantId;
146
- }));
129
+ page(request) {
130
+ return Promise.resolve().then(() => this.readPage(request));
147
131
  }
148
132
  /**
149
- * Reads exactly one bounded provider page.
133
+ * Reads one page after promise admission.
150
134
  *
151
135
  * @param request Finite page request.
152
- * @returns Validated complete tenant IDs.
136
+ * @returns Bounded membership page.
153
137
  */
154
- async page(request) {
155
- this.requireOpen();
138
+ readPage(request) {
156
139
  TenantCatalogReads.require(request);
157
- const page = await this.catalog.page(request);
140
+ const cursor = request.after;
141
+ if (cursor !== undefined && !(cursor instanceof MemoryTenantIndexCursor))
142
+ throw new TypeError("TenantIndex continuation is invalid.");
143
+ const state = cursor?.position(this.#identity);
144
+ const start = state?.index ?? 0;
145
+ const length = state?.length ?? this.#order.length;
146
+ const end = Math.min(length, start + request.count);
158
147
  request.signal.throwIfAborted();
159
- this.requireOpen();
160
- const ids = page.boundaries.map((boundary) => {
161
- if (boundary.single || boundary.tenantId === undefined)
162
- throw new Error("Multitenant provider catalog returned a single-tenant boundary.");
163
- return boundary.tenantId;
164
- });
165
148
  return {
166
- ids,
167
- ...(page.after === undefined ? {} : { after: page.after }),
168
- hasMore: page.hasMore,
149
+ ids: this.#order.slice(start, end).map((boundary) => boundary.tenantId),
150
+ ...(end < length ? { after: new MemoryTenantIndexCursor(this.#identity, end, length) } : {}),
151
+ hasMore: end < length,
169
152
  };
170
153
  }
171
154
  /**
172
- * Records a named tenant in the provider catalog.
155
+ * Registers one detached complete tenant identity.
173
156
  *
174
- * @param tenantId Named tenant to record.
175
- * @returns Completion after the catalog records the tenant.
157
+ * @param tenantId Tenant to register.
158
+ * @returns Visible membership completion.
176
159
  */
177
160
  keep(tenantId) {
178
161
  return Promise.resolve().then(() => {
179
- this.requireOpen();
180
- return this.catalog.keep(TenantBoundary.from(tenantId));
162
+ const boundary = TenantBoundary.from(tenantId);
163
+ const key = String(boundary.key);
164
+ if (this.#tenants.has(key))
165
+ return;
166
+ this.#tenants.set(key, boundary);
167
+ this.#order.push(boundary);
181
168
  });
182
169
  }
170
+ }
171
+ /**
172
+ * Instance-bound continuation for a transient in-memory index.
173
+ */
174
+ class MemoryTenantIndexCursor {
175
+ [Symbol.toStringTag] = "TenantCatalogCursor";
176
+ #identity;
177
+ #index;
178
+ #length;
183
179
  /**
184
- * Stops accepting index operations.
185
- */
186
- close() {
187
- this.#open = false;
180
+ * Captures one finite sweep position.
181
+ *
182
+ * @param identity Index identity.
183
+ * @param index Next position.
184
+ * @param length Sweep length.
185
+ */
186
+ constructor(identity, index, length) {
187
+ this.#identity = identity;
188
+ this.#index = index;
189
+ this.#length = length;
190
+ Object.freeze(this);
188
191
  }
189
192
  /**
190
- * Rejects use of a closed index.
193
+ * Verifies the issuing index before returning the sweep position.
194
+ *
195
+ * @param identity Expected index identity.
196
+ * @returns Finite sweep position.
191
197
  */
192
- requireOpen() {
193
- if (!this.#open)
194
- throw new Error(`TenantIndex for "${this.contextName}" is closed.`);
198
+ position(identity) {
199
+ if (this.#identity !== identity)
200
+ throw new TypeError("TenantIndex continuation is invalid.");
201
+ return { index: this.#index, length: this.#length };
195
202
  }
196
203
  }
197
- function tenantCatalog(factory) {
198
- const provider = factory;
199
- if (typeof provider.tenantCatalog !== "function")
200
- throw new Error("Multitenant storage requires a provider-owned tenant catalog.");
201
- const catalog = provider.tenantCatalog();
202
- if (typeof catalog.page !== "function")
203
- throw new Error("Multitenant Agent storage requires a paged provider tenant catalog.");
204
- return catalog;
205
- }
206
204
  //# sourceMappingURL=tenant-index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tenant-index.js","sourceRoot":"","sources":["../../src/context/tenant-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAuB,MAAM,6BAA6B,CAAC;AAOlE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAgEzD;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAMrB,MAAM,CAAC,MAAM,CAAC;IACjB,kBAAkB;IAElB;;;;;OAKG;IACH,MAAM,CAAC,KAAK;QACV,OAAO,KAAK,CAAC,UAAU,KAAK,eAAe;YACzC,CAAC,CAAC,IAAI,iBAAiB,CAAC,KAAK,CAAC,WAAW,CAAC;YAC1C,CAAC,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;IACrF,CAAC;CACF,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,iBAAiB;IAkBQ;IAjB7B,kBAAkB;IAElB;;OAEG;IACM,UAAU,GAAG,eAAe,CAAC;IAEtC;;OAEG;IACH,KAAK,GAAG,IAAI,CAAC;IAEb;;;;OAIG;IACH,YAA6B,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;IAAG,CAAC;IAEpD;;;;OAIG;IACH,GAAG;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAClC,OAAO,MAAM,KAAK,SAAS;YACzB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;YAC9E,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED;;;;;OAKG;IACH,IAAI,CAAC,OAA0B;QAC7B,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAClC,IAAI,MAAM,KAAK,SAAS;gBAAE,MAAM,MAAM,CAAC;YACvC,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;gBAC7B,MAAM,IAAI,SAAS,CAAC,uDAAuD,CAAC,CAAC;YAC/E,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC/E,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,IAAI;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAClC,OAAO,OAAO,CAAC,MAAM,CACnB,MAAM;YACJ,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,WAAW,qCAAqC,CAAC,CAC7F,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACK,WAAW;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACtE,CAAC;CACF;AAED;;GAEG;AACH,MAAM,kBAAkB;IAoBH;IACA;IApBnB,kBAAkB;IAElB;;OAEG;IACM,UAAU,GAAG,aAAa,CAAC;IAEpC;;OAEG;IACH,KAAK,GAAG,IAAI,CAAC;IAEb;;;;;OAKG;IACH,YACmB,WAAmB,EACnB,OAAsB;QADtB,gBAAW,GAAX,WAAW,CAAQ;QACnB,YAAO,GAAP,OAAO,CAAe;IACtC,CAAC;IAEJ;;;;OAIG;IACH,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC1C,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS;gBACpD,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;YACrF,OAAO,QAAQ,CAAC,QAAQ,CAAC;QAC3B,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,IAAI,CAAC,OAA0B;QACnC,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAChC,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC3C,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS;gBACpD,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;YACrF,OAAO,QAAQ,CAAC,QAAQ,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,OAAO;YACL,GAAG;YACH,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;YAC1D,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,IAAI,CAAC,QAAkB;QACrB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YACjC,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,WAAW;QACjB,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,CAAC,WAAW,cAAc,CAAC,CAAC;IACvF,CAAC;CACF;AAED,SAAS,aAAa,CAAC,OAAuB;IAC5C,MAAM,QAAQ,GAAG,OAAyC,CAAC;IAC3D,IAAI,OAAO,QAAQ,CAAC,aAAa,KAAK,UAAU;QAC9C,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACnF,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;IACzC,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,UAAU;QACpC,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACzF,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"tenant-index.js","sourceRoot":"","sources":["../../src/context/tenant-index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { TenantId } from "@spine-event-engine/proto";
2
+ import type { TenantIndex } from "./tenant-index.js";
3
+ /**
4
+ * Identifies a complete tenant absent from a receiving Bounded Context's live index.
5
+ */
6
+ export declare class TenantUnknownError extends Error {
7
+ #private;
8
+ readonly contextName: string;
9
+ /**
10
+ * Stable structured error type for missing live membership.
11
+ */
12
+ readonly type: "TENANT_UNKNOWN";
13
+ /**
14
+ * Captures the rejected tenant without retaining a mutable caller message.
15
+ *
16
+ * @param tenantId Complete unknown tenant identity.
17
+ * @param contextName Receiving Bounded Context name.
18
+ */
19
+ constructor(tenantId: TenantId, contextName: string);
20
+ /**
21
+ * Returns a detached copy of the complete rejected identity.
22
+ *
23
+ * @returns Complete tenant identity.
24
+ */
25
+ get tenantId(): TenantId;
26
+ }
27
+ /**
28
+ * Checks a receiving context's current membership after shape validation.
29
+ */
30
+ export declare const TenantAdmissions: Readonly<{
31
+ require(index: TenantIndex, contextName: string, multitenant: boolean, tenantId?: TenantId): Promise<void>;
32
+ }>;
33
+ //# sourceMappingURL=tenant-unknown-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-unknown-error.d.ts","sourceRoot":"","sources":["../../src/context/tenant-unknown-error.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAE1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;;IAgBzC,QAAQ,CAAC,WAAW,EAAE,MAAM;IAf9B;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAG,gBAAgB,CAAU;IAI1C;;;;;OAKG;gBAED,QAAQ,EAAE,QAAQ,EACT,WAAW,EAAE,MAAM;IAW9B;;;;OAIG;IACH,IAAI,QAAQ,IAAI,QAAQ,CAEvB;CACF;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC;IACtC,OAAO,CACL,KAAK,EAAE,WAAW,EAClB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,OAAO,EACpB,QAAQ,CAAC,EAAE,QAAQ,GAClB,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB,CAsBC,CAAC"}
@@ -0,0 +1,75 @@
1
+ /*
2
+ * Copyright 2026, CodeMatters. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5
+ * in compliance with the License. You may obtain a copy of the License at
6
+ *
7
+ * https://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
10
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ * or implied. See the License for the specific language governing permissions and limitations under
12
+ * the License.
13
+ */
14
+ import { TenantBoundary } from "@spine-event-engine/storage/provider";
15
+ /**
16
+ * Identifies a complete tenant absent from a receiving Bounded Context's live index.
17
+ */
18
+ export class TenantUnknownError extends Error {
19
+ contextName;
20
+ /**
21
+ * Stable structured error type for missing live membership.
22
+ */
23
+ type = "TENANT_UNKNOWN";
24
+ #tenant;
25
+ /**
26
+ * Captures the rejected tenant without retaining a mutable caller message.
27
+ *
28
+ * @param tenantId Complete unknown tenant identity.
29
+ * @param contextName Receiving Bounded Context name.
30
+ */
31
+ constructor(tenantId, contextName) {
32
+ const tenant = TenantBoundary.from(tenantId);
33
+ const kind = tenant.tenantId.kind;
34
+ const label = kind.case === "value" ? kind.value : kind.case === undefined ? "" : kind.value.value;
35
+ super(`Tenant "${label}" is not registered for ${contextName}.`);
36
+ this.contextName = contextName;
37
+ this.name = "TenantUnknownError";
38
+ this.#tenant = tenant;
39
+ }
40
+ /**
41
+ * Returns a detached copy of the complete rejected identity.
42
+ *
43
+ * @returns Complete tenant identity.
44
+ */
45
+ get tenantId() {
46
+ return this.#tenant.tenantId;
47
+ }
48
+ }
49
+ /**
50
+ * Checks a receiving context's current membership after shape validation.
51
+ */
52
+ export const TenantAdmissions = Object.freeze({
53
+ /**
54
+ * Requires live membership before tenant-specific work.
55
+ *
56
+ * @param index Receiving Bounded Context's effective index.
57
+ * @param contextName Diagnostic context name.
58
+ * @param multitenant Whether a tenant identity applies.
59
+ * @param tenantId Complete supplied tenant identity, when applicable.
60
+ * @returns Completion when current membership permits this input.
61
+ */
62
+ async require(index, contextName, multitenant, tenantId) {
63
+ if (!multitenant) {
64
+ if (tenantId !== undefined)
65
+ throw new Error(`Single-tenant storage "${contextName}" does not accept context.tenantId.`);
66
+ return;
67
+ }
68
+ if (tenantId === undefined)
69
+ throw new Error(`Multitenant storage "${contextName}" requires context.tenantId.`);
70
+ const boundary = TenantBoundary.from(tenantId);
71
+ if (!(await index.contains(boundary.tenantId)))
72
+ throw new TenantUnknownError(boundary.tenantId, contextName);
73
+ },
74
+ });
75
+ //# sourceMappingURL=tenant-unknown-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-unknown-error.js","sourceRoot":"","sources":["../../src/context/tenant-unknown-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAGtE;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAgBhC;IAfX;;OAEG;IACM,IAAI,GAAG,gBAAyB,CAAC;IAEjC,OAAO,CAAyC;IAEzD;;;;;OAKG;IACH,YACE,QAAkB,EACT,WAAmB;QAE5B,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAClC,MAAM,KAAK,GACT,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QACvF,KAAK,CAAC,WAAW,KAAK,2BAA2B,WAAW,GAAG,CAAC,CAAC;QANxD,gBAAW,GAAX,WAAW,CAAQ;QAO5B,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC/B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAOxB,MAAM,CAAC,MAAM,CAAC;IACjB;;;;;;;;OAQG;IACH,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ;QACrD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,IAAI,QAAQ,KAAK,SAAS;gBACxB,MAAM,IAAI,KAAK,CAAC,0BAA0B,WAAW,qCAAqC,CAAC,CAAC;YAC9F,OAAO;QACT,CAAC;QACD,IAAI,QAAQ,KAAK,SAAS;YACxB,MAAM,IAAI,KAAK,CAAC,wBAAwB,WAAW,8BAA8B,CAAC,CAAC;QACrF,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC5C,MAAM,IAAI,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACjE,CAAC;CACF,CAAC,CAAC"}