sealbridge 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/README.ja.md +492 -30
  2. package/README.md +522 -109
  3. package/dist/cli/dist/accept.d.ts +13 -0
  4. package/dist/cli/dist/accept.js +115 -0
  5. package/dist/cli/dist/accept.js.map +1 -0
  6. package/dist/cli/dist/approval-summary.d.ts +1 -1
  7. package/dist/cli/dist/board.d.ts +10 -9
  8. package/dist/cli/dist/board.js +62 -31
  9. package/dist/cli/dist/board.js.map +1 -1
  10. package/dist/cli/dist/command-identity.d.ts +6 -0
  11. package/dist/cli/dist/command-identity.js +13 -0
  12. package/dist/cli/dist/command-identity.js.map +1 -0
  13. package/dist/cli/dist/config.d.ts +3 -0
  14. package/dist/cli/dist/config.js +29 -0
  15. package/dist/cli/dist/config.js.map +1 -0
  16. package/dist/cli/dist/connections.d.ts +15 -0
  17. package/dist/cli/dist/connections.js +191 -0
  18. package/dist/cli/dist/connections.js.map +1 -0
  19. package/dist/cli/dist/contacts.d.ts +4 -3
  20. package/dist/cli/dist/contacts.js +39 -28
  21. package/dist/cli/dist/contacts.js.map +1 -1
  22. package/dist/cli/dist/doctor.d.ts +9 -0
  23. package/dist/cli/dist/doctor.js +46 -5
  24. package/dist/cli/dist/doctor.js.map +1 -1
  25. package/dist/cli/dist/error-messages.js +22 -0
  26. package/dist/cli/dist/error-messages.js.map +1 -1
  27. package/dist/cli/dist/index.js +44 -6
  28. package/dist/cli/dist/index.js.map +1 -1
  29. package/dist/cli/dist/invite-output.d.ts +14 -0
  30. package/dist/cli/dist/invite-output.js +66 -0
  31. package/dist/cli/dist/invite-output.js.map +1 -0
  32. package/dist/cli/dist/invite-share.d.ts +6 -3
  33. package/dist/cli/dist/invite-share.js +40 -15
  34. package/dist/cli/dist/invite-share.js.map +1 -1
  35. package/dist/cli/dist/invites-migrate.d.ts +3 -0
  36. package/dist/cli/dist/invites-migrate.js +33 -0
  37. package/dist/cli/dist/invites-migrate.js.map +1 -0
  38. package/dist/cli/dist/mcp.d.ts +7 -5
  39. package/dist/cli/dist/mcp.js +23 -18
  40. package/dist/cli/dist/mcp.js.map +1 -1
  41. package/dist/cli/dist/network.d.ts +11 -1
  42. package/dist/cli/dist/network.js +150 -87
  43. package/dist/cli/dist/network.js.map +1 -1
  44. package/dist/cli/dist/pending.d.ts +8 -0
  45. package/dist/cli/dist/pending.js +50 -0
  46. package/dist/cli/dist/pending.js.map +1 -0
  47. package/dist/cli/dist/public-settings.d.ts +5 -4
  48. package/dist/cli/dist/public-settings.js +13 -15
  49. package/dist/cli/dist/public-settings.js.map +1 -1
  50. package/dist/cli/dist/receipt.d.ts +1 -1
  51. package/dist/cli/dist/relay-auth.d.ts +3 -0
  52. package/dist/cli/dist/relay-auth.js +23 -0
  53. package/dist/cli/dist/relay-auth.js.map +1 -0
  54. package/dist/cli/dist/requests.d.ts +10 -0
  55. package/dist/cli/dist/requests.js +91 -0
  56. package/dist/cli/dist/requests.js.map +1 -0
  57. package/dist/cli/dist/sdk.d.ts +10 -0
  58. package/dist/cli/dist/sdk.js +7 -0
  59. package/dist/cli/dist/sdk.js.map +1 -0
  60. package/dist/cli/dist/setup-files.d.ts +24 -0
  61. package/dist/cli/dist/setup-files.js +190 -0
  62. package/dist/cli/dist/setup-files.js.map +1 -0
  63. package/dist/cli/dist/setup-hosts.d.ts +29 -0
  64. package/dist/cli/dist/setup-hosts.js +75 -0
  65. package/dist/cli/dist/setup-hosts.js.map +1 -0
  66. package/dist/cli/dist/setup.d.ts +61 -0
  67. package/dist/cli/dist/setup.js +243 -0
  68. package/dist/cli/dist/setup.js.map +1 -0
  69. package/dist/cli/dist/task-input.d.ts +1 -1
  70. package/dist/cli/dist/wake-hook.d.ts +1 -1
  71. package/dist/cli/dist/worker-json.d.ts +4 -0
  72. package/dist/cli/dist/worker-json.js +87 -0
  73. package/dist/cli/dist/worker-json.js.map +1 -0
  74. package/dist/examples/two-owner-demo/dist/run-demo.d.ts +13 -13
  75. package/dist/package.json +1 -1
  76. package/dist/packages/adapters/dist/command.d.ts +2 -2
  77. package/dist/packages/adapters/dist/credential-proxy.d.ts +2 -2
  78. package/dist/packages/adapters/dist/index.d.ts +1 -1
  79. package/dist/packages/adapters/dist/mcp.d.ts +2 -2
  80. package/dist/packages/adapters/dist/openai.d.ts +2 -2
  81. package/dist/packages/adapters/dist/sandbox.d.ts +2 -2
  82. package/dist/packages/core/dist/connection.d.ts +58 -0
  83. package/dist/packages/core/dist/connection.js +132 -0
  84. package/dist/packages/core/dist/connection.js.map +1 -0
  85. package/dist/packages/core/dist/delivery-status.d.ts +22 -0
  86. package/dist/packages/core/dist/delivery-status.js +53 -0
  87. package/dist/packages/core/dist/delivery-status.js.map +1 -0
  88. package/dist/packages/core/dist/discovery.d.ts +7 -6
  89. package/dist/packages/core/dist/discovery.js +19 -20
  90. package/dist/packages/core/dist/discovery.js.map +1 -1
  91. package/dist/packages/core/dist/edge.d.ts +1 -0
  92. package/dist/packages/core/dist/edge.js +1 -0
  93. package/dist/packages/core/dist/edge.js.map +1 -1
  94. package/dist/packages/core/dist/index.d.ts +3 -0
  95. package/dist/packages/core/dist/index.js +3 -0
  96. package/dist/packages/core/dist/index.js.map +1 -1
  97. package/dist/packages/core/dist/protocol.d.ts +24 -0
  98. package/dist/packages/core/dist/protocol.js +54 -0
  99. package/dist/packages/core/dist/protocol.js.map +1 -0
  100. package/dist/packages/core/dist/receipts.d.ts +1 -0
  101. package/dist/packages/core/dist/receipts.js +1 -1
  102. package/dist/packages/core/dist/receipts.js.map +1 -1
  103. package/dist/packages/core/dist/schema.d.ts +1 -0
  104. package/dist/packages/core/dist/schema.js +13 -2
  105. package/dist/packages/core/dist/schema.js.map +1 -1
  106. package/dist/packages/ledger/dist/index.d.ts +1 -1
  107. package/dist/packages/relay/dist/admission.d.ts +14 -0
  108. package/dist/packages/relay/dist/admission.js +70 -0
  109. package/dist/packages/relay/dist/admission.js.map +1 -0
  110. package/dist/packages/relay/dist/fetch.d.ts +8 -2
  111. package/dist/packages/relay/dist/fetch.js +41 -12
  112. package/dist/packages/relay/dist/fetch.js.map +1 -1
  113. package/dist/packages/relay/dist/index.d.ts +23 -12
  114. package/dist/packages/relay/dist/index.js +130 -78
  115. package/dist/packages/relay/dist/index.js.map +1 -1
  116. package/dist/packages/relay/dist/journal.d.ts +1 -1
  117. package/dist/packages/relay/dist/notifications.d.ts +1 -1
  118. package/dist/packages/relay/dist/retry.d.ts +23 -0
  119. package/dist/packages/relay/dist/retry.js +43 -1
  120. package/dist/packages/relay/dist/retry.js.map +1 -1
  121. package/dist/packages/relay/dist/ssrf.d.ts +3 -2
  122. package/dist/packages/relay/dist/ssrf.js.map +1 -1
  123. package/dist/packages/relay/dist/worker.js +1 -1
  124. package/dist/packages/relay/dist/worker.js.map +1 -1
  125. package/dist/packages/runtime/dist/a2a.d.ts +1 -1
  126. package/dist/packages/runtime/dist/a2a.js +1 -1
  127. package/dist/packages/runtime/dist/adapter.d.ts +2 -2
  128. package/dist/packages/runtime/dist/application-config.d.ts +20 -0
  129. package/dist/packages/runtime/dist/application-config.js +222 -0
  130. package/dist/packages/runtime/dist/application-config.js.map +1 -0
  131. package/dist/packages/runtime/dist/approval-providers.d.ts +24 -3
  132. package/dist/packages/runtime/dist/approval-providers.js +79 -3
  133. package/dist/packages/runtime/dist/approval-providers.js.map +1 -1
  134. package/dist/packages/runtime/dist/connection-admission-review.d.ts +39 -0
  135. package/dist/packages/runtime/dist/connection-admission-review.js +86 -0
  136. package/dist/packages/runtime/dist/connection-admission-review.js.map +1 -0
  137. package/dist/packages/runtime/dist/connection-persistence.d.ts +35 -0
  138. package/dist/packages/runtime/dist/connection-persistence.js +181 -0
  139. package/dist/packages/runtime/dist/connection-persistence.js.map +1 -0
  140. package/dist/packages/runtime/dist/connection-records.d.ts +167 -0
  141. package/dist/packages/runtime/dist/connection-records.js +132 -0
  142. package/dist/packages/runtime/dist/connection-records.js.map +1 -0
  143. package/dist/packages/runtime/dist/connection-router.d.ts +45 -0
  144. package/dist/packages/runtime/dist/connection-router.js +130 -0
  145. package/dist/packages/runtime/dist/connection-router.js.map +1 -0
  146. package/dist/packages/runtime/dist/connection-service.d.ts +159 -0
  147. package/dist/packages/runtime/dist/connection-service.js +239 -0
  148. package/dist/packages/runtime/dist/connection-service.js.map +1 -0
  149. package/dist/packages/runtime/dist/connection-transport.d.ts +14 -0
  150. package/dist/packages/runtime/dist/connection-transport.js +89 -0
  151. package/dist/packages/runtime/dist/connection-transport.js.map +1 -0
  152. package/dist/packages/runtime/dist/delivery-records.d.ts +180 -0
  153. package/dist/packages/runtime/dist/delivery-records.js +205 -0
  154. package/dist/packages/runtime/dist/delivery-records.js.map +1 -0
  155. package/dist/packages/runtime/dist/delivery-status-router.d.ts +27 -0
  156. package/dist/packages/runtime/dist/delivery-status-router.js +150 -0
  157. package/dist/packages/runtime/dist/delivery-status-router.js.map +1 -0
  158. package/dist/packages/runtime/dist/delivery-status.d.ts +43 -0
  159. package/dist/packages/runtime/dist/delivery-status.js +193 -0
  160. package/dist/packages/runtime/dist/delivery-status.js.map +1 -0
  161. package/dist/packages/runtime/dist/delivery-store.d.ts +125 -0
  162. package/dist/packages/runtime/dist/delivery-store.js +1047 -0
  163. package/dist/packages/runtime/dist/delivery-store.js.map +1 -0
  164. package/dist/packages/runtime/dist/gateway.d.ts +4 -3
  165. package/dist/packages/runtime/dist/gateway.js.map +1 -1
  166. package/dist/packages/runtime/dist/held-request-review.d.ts +49 -0
  167. package/dist/packages/runtime/dist/held-request-review.js +122 -0
  168. package/dist/packages/runtime/dist/held-request-review.js.map +1 -0
  169. package/dist/packages/runtime/dist/held-request-store.d.ts +112 -0
  170. package/dist/packages/runtime/dist/held-request-store.js +290 -0
  171. package/dist/packages/runtime/dist/held-request-store.js.map +1 -0
  172. package/dist/packages/runtime/dist/idempotency-store.d.ts +53 -0
  173. package/dist/packages/runtime/dist/idempotency-store.js +331 -0
  174. package/dist/packages/runtime/dist/idempotency-store.js.map +1 -0
  175. package/dist/packages/runtime/dist/inbox.d.ts +1 -1
  176. package/dist/packages/runtime/dist/index.d.ts +27 -1
  177. package/dist/packages/runtime/dist/index.js +26 -0
  178. package/dist/packages/runtime/dist/index.js.map +1 -1
  179. package/dist/packages/runtime/dist/invite-store.d.ts +76 -0
  180. package/dist/packages/runtime/dist/invite-store.js +337 -0
  181. package/dist/packages/runtime/dist/invite-store.js.map +1 -0
  182. package/dist/packages/runtime/dist/key-store.d.ts +77 -0
  183. package/dist/packages/runtime/dist/key-store.js +226 -0
  184. package/dist/packages/runtime/dist/key-store.js.map +1 -0
  185. package/dist/packages/runtime/dist/local-identity.d.ts +33 -0
  186. package/dist/packages/runtime/dist/local-identity.js +278 -0
  187. package/dist/packages/runtime/dist/local-identity.js.map +1 -0
  188. package/dist/packages/runtime/dist/mcp-rpc.d.ts +19 -0
  189. package/dist/packages/runtime/dist/mcp-rpc.js +175 -0
  190. package/dist/packages/runtime/dist/mcp-rpc.js.map +1 -0
  191. package/dist/packages/runtime/dist/mcp-server.d.ts +46 -19
  192. package/dist/packages/runtime/dist/mcp-server.js +427 -184
  193. package/dist/packages/runtime/dist/mcp-server.js.map +1 -1
  194. package/dist/packages/runtime/dist/mcp-tool-catalog.d.ts +1 -1
  195. package/dist/packages/runtime/dist/mcp-tool-catalog.js +172 -13
  196. package/dist/packages/runtime/dist/mcp-tool-catalog.js.map +1 -1
  197. package/dist/packages/runtime/dist/mcp.d.ts +2 -2
  198. package/dist/packages/runtime/dist/message-status.d.ts +32 -0
  199. package/dist/packages/runtime/dist/message-status.js +29 -0
  200. package/dist/packages/runtime/dist/message-status.js.map +1 -0
  201. package/dist/packages/runtime/dist/outbox.d.ts +91 -0
  202. package/dist/packages/runtime/dist/outbox.js +462 -0
  203. package/dist/packages/runtime/dist/outbox.js.map +1 -0
  204. package/dist/packages/runtime/dist/policy.d.ts +1 -1
  205. package/dist/packages/runtime/dist/protocol-peer-store.d.ts +40 -0
  206. package/dist/packages/runtime/dist/protocol-peer-store.js +176 -0
  207. package/dist/packages/runtime/dist/protocol-peer-store.js.map +1 -0
  208. package/dist/packages/runtime/dist/protocol-release.d.ts +26 -0
  209. package/dist/packages/runtime/dist/protocol-release.js +76 -0
  210. package/dist/packages/runtime/dist/protocol-release.js.map +1 -0
  211. package/dist/packages/runtime/dist/quota.d.ts +1 -1
  212. package/dist/packages/runtime/dist/relay-selection.d.ts +20 -0
  213. package/dist/packages/runtime/dist/relay-selection.js +34 -0
  214. package/dist/packages/runtime/dist/relay-selection.js.map +1 -0
  215. package/dist/packages/runtime/dist/requester-pending-store.d.ts +59 -0
  216. package/dist/packages/runtime/dist/requester-pending-store.js +266 -0
  217. package/dist/packages/runtime/dist/requester-pending-store.js.map +1 -0
  218. package/dist/packages/runtime/dist/secret-store.d.ts +19 -0
  219. package/dist/packages/runtime/dist/secret-store.js +51 -0
  220. package/dist/packages/runtime/dist/secret-store.js.map +1 -0
  221. package/dist/packages/runtime/dist/session-audit.d.ts +29 -7
  222. package/dist/packages/runtime/dist/session-audit.js +149 -29
  223. package/dist/packages/runtime/dist/session-audit.js.map +1 -1
  224. package/dist/packages/runtime/dist/session.d.ts +101 -9
  225. package/dist/packages/runtime/dist/session.js +696 -96
  226. package/dist/packages/runtime/dist/session.js.map +1 -1
  227. package/dist/packages/runtime/dist/task-journal.d.ts +18 -3
  228. package/dist/packages/runtime/dist/task-journal.js +271 -18
  229. package/dist/packages/runtime/dist/task-journal.js.map +1 -1
  230. package/dist/packages/runtime/dist/verifier.d.ts +3 -2
  231. package/dist/packages/runtime/dist/verifier.js +1 -0
  232. package/dist/packages/runtime/dist/verifier.js.map +1 -1
  233. package/dist/packages/runtime/dist/worker-trust-store.d.ts +111 -0
  234. package/dist/packages/runtime/dist/worker-trust-store.js +592 -0
  235. package/dist/packages/runtime/dist/worker-trust-store.js.map +1 -0
  236. package/dist/packages/sandbox/dist/container.d.ts +1 -1
  237. package/dist/packages/sandbox/dist/index.d.ts +1 -1
  238. package/dist/spec/README.ja.md +21 -1
  239. package/dist/spec/README.md +20 -1
  240. package/dist/spec/agent-card.schema.json +11 -1
  241. package/dist/spec/delivery-status.schema.json +106 -0
  242. package/dist/spec/examples/protocol-versions/sample-agent-card.json +35 -0
  243. package/dist/spec/examples/sample-delivery-status.json +21 -0
  244. package/dist/spec/examples/sample-task-manifest.0.1.0.json +173 -0
  245. package/dist/spec/examples/sample-task-manifest.0.2.0.json +173 -0
  246. package/dist/spec/task-manifest.0.1.0.schema.json +422 -0
  247. package/dist/spec/task-manifest.0.2.0.schema.json +422 -0
  248. package/dist/spec/task-manifest.schema.json +9 -418
  249. package/docs/sdk.ja.md +133 -0
  250. package/docs/sdk.md +138 -0
  251. package/package.json +15 -3
@@ -0,0 +1,167 @@
1
+ import type { Invite, Json, Signed } from '../../core/dist/index.js';
2
+ export declare const CONNECTION_DAY_MS = 86400000;
3
+ export declare const CONNECTION_OFFER_TTL_MS: number;
4
+ export declare const CONNECTION_REFUSAL_TTL_MS: number;
5
+ export declare const CONNECTION_CAPACITY: {
6
+ readonly connections: 1000;
7
+ readonly inviteBindings: 1000;
8
+ readonly outbox: 100;
9
+ readonly priorApprovedPeers: 1000;
10
+ readonly refusals: 1000;
11
+ };
12
+ export type ConnectionState = 'none' | 'pending' | 'connected' | 'blocked';
13
+ /** Owner-local observation of the current connection or latest retained offer. */
14
+ export interface ConnectionStatus {
15
+ peerOwnerDid: string;
16
+ /** Informational name retained in local connection or offer metadata, when known. */
17
+ peerDisplayName?: string;
18
+ state: ConnectionState;
19
+ status: 'none' | 'pending_peer' | 'pending_owner' | 'connected' | 'inactive' | 'expired' | 'blocked';
20
+ requestId?: string;
21
+ direction?: 'incoming' | 'outgoing';
22
+ createdAt?: number;
23
+ expiresAt?: number;
24
+ connectionId?: string;
25
+ connectedAt?: number;
26
+ /** Outgoing: ACK awaits sending. Incoming: acceptance awaits the peer ACK. */
27
+ acknowledgementPending?: boolean;
28
+ }
29
+ export type ConnectionTrust = 'unknown' | 'limited' | 'denied';
30
+ export interface ConnectionIncomingOffer {
31
+ requestId: string;
32
+ requestDigest: string;
33
+ receivedAt: number;
34
+ expiresAt: number;
35
+ }
36
+ export interface ConnectionOutgoingOffer {
37
+ requestId: string;
38
+ requestDigest: string;
39
+ createdAt: number;
40
+ expiresAt: number;
41
+ ownerConsentDigest: string;
42
+ }
43
+ export interface ConnectionRecord {
44
+ peerOwnerDid: string;
45
+ peerAgentDid?: string;
46
+ peerDisplayName?: string;
47
+ relayUrl: string;
48
+ state: 'pending' | 'connected';
49
+ incoming?: ConnectionIncomingOffer;
50
+ outgoing?: ConnectionOutgoingOffer;
51
+ connectionId?: string;
52
+ connectedAt?: number;
53
+ source?: 'request' | 'invite' | 'prior-approval';
54
+ localConsentDigest?: string;
55
+ remoteAcceptanceDigest?: string;
56
+ }
57
+ export interface InviteBindingRecord {
58
+ inviteDigest: string;
59
+ requesterOwnerDid: string;
60
+ boundAt: number;
61
+ tokenExpiresAt: number;
62
+ connectionId: string;
63
+ }
64
+ export interface PriorApprovedPeer {
65
+ peerOwnerDid: string;
66
+ peerDisplayName?: string;
67
+ lastApprovedAt?: number;
68
+ sourceRequestIds: string[];
69
+ legacyTrust: 'limited' | 'trusted';
70
+ }
71
+ /** Callers supply owner-signed control data and omit invitation tokens and task input. */
72
+ export interface ConnectionOutboxRecord {
73
+ eventId: string;
74
+ peerOwnerDid: string;
75
+ relayUrl: string;
76
+ signedEvent: Signed<Json>;
77
+ deliveryDeadline: number;
78
+ state: 'pending' | 'delivered';
79
+ }
80
+ export interface ConnectionData {
81
+ connections: ConnectionRecord[];
82
+ inviteBindings: InviteBindingRecord[];
83
+ refusals: Array<{
84
+ peerOwnerDid: string;
85
+ refuseUntil: number;
86
+ }>;
87
+ priorApprovedPeers: PriorApprovedPeer[];
88
+ outbox: ConnectionOutboxRecord[];
89
+ }
90
+ /** Peer names are informational; owner and agent DIDs determine identity. */
91
+ export interface ConnectionPeer {
92
+ peerOwnerDid: string;
93
+ peerAgentDid?: string;
94
+ peerDisplayName?: string;
95
+ relayUrl: string;
96
+ }
97
+ export interface ConnectionSummary {
98
+ peerOwnerDid: string;
99
+ peerAgentDid?: string;
100
+ peerDisplayName?: string;
101
+ relayUrl?: string;
102
+ state: Exclude<ConnectionState, 'none'>;
103
+ }
104
+ export interface RecordOutgoingConnection extends ConnectionPeer {
105
+ outgoing: ConnectionOutgoingOffer;
106
+ }
107
+ export interface RecordIncomingConnection extends ConnectionPeer {
108
+ incoming: ConnectionIncomingOffer;
109
+ }
110
+ export interface ApproveConnectionInput {
111
+ peerOwnerDid: string;
112
+ requestId: string;
113
+ requestDigest: string;
114
+ connectionId: string;
115
+ localConsentDigest: string;
116
+ outbox: ConnectionOutboxRecord;
117
+ source?: 'request' | 'prior-approval';
118
+ }
119
+ /** The exchange layer verifies remote signature and identities before calling this port. */
120
+ export interface ApplyConnectionAcceptedInput {
121
+ peerOwnerDid: string;
122
+ requestId: string;
123
+ requestDigest: string;
124
+ connectionId: string;
125
+ remoteAcceptanceDigest: string;
126
+ }
127
+ /** Pass a parsed, verified, unrevoked issuer invitation and an authenticated requester owner DID. */
128
+ export interface BindInviteFirstUseInput extends ConnectionPeer {
129
+ invite: Invite;
130
+ connectionId: string;
131
+ localConsentDigest: string;
132
+ outbox: ConnectionOutboxRecord;
133
+ }
134
+ /** Structural port for owner-local persistence; it has no transport or review policy. */
135
+ export interface ConnectionPersistence {
136
+ connectionState(peerOwnerDid: string): ConnectionState;
137
+ connectionLevel(peerOwnerDid: string): ConnectionTrust;
138
+ listConnections(): ConnectionSummary[];
139
+ listPriorApprovedPeers(): PriorApprovedPeer[];
140
+ recordOutgoing(input: RecordOutgoingConnection): void;
141
+ recordIncoming(input: RecordIncomingConnection): void;
142
+ approveConnection(input: ApproveConnectionInput): void;
143
+ applyAccepted(input: ApplyConnectionAcceptedInput): void;
144
+ rejectConnection(peerOwnerDid: string): void;
145
+ disconnect(peerOwnerDid: string): void;
146
+ block(peerOwnerDid: string): void;
147
+ unblock(peerOwnerDid: string): void;
148
+ bindInviteFirstUse(input: BindInviteFirstUseInput): 'first' | 'same' | 'other';
149
+ listConnectionOutbox(): ConnectionOutboxRecord[];
150
+ markConnectionEventDelivered(eventId: string): void;
151
+ }
152
+ /** Explicit adapter with no store-specific fields exposed to consumers. */
153
+ export declare function connectionPersistencePort(store: ConnectionPersistence): ConnectionPersistence;
154
+ export declare function emptyConnectionData(): ConnectionData;
155
+ export declare function projectConnectionState(data: ConnectionData, denials: string[], peer: string, now: number): ConnectionState;
156
+ export declare function projectConnectionTrust(state: ConnectionState): ConnectionTrust;
157
+ export declare function pruneConnectionData(data: ConnectionData, now: number): void;
158
+ export declare function assertConnectionCapacity(data: ConnectionData): void;
159
+ export declare function validConnectionPeer(p: ConnectionPeer): boolean;
160
+ export declare function assertConnectionOwnerDid(peerOwnerDid: string): void;
161
+ export declare function validConnectionOffer(o: ConnectionIncomingOffer | ConnectionOutgoingOffer, outgoing: boolean): boolean;
162
+ export declare function validConnectionOutbox(e: ConnectionOutboxRecord, owner: string): boolean;
163
+ export declare function assertConnectionCommit(connectionId: string, consentDigest: string): void;
164
+ /** Validate the persisted lifecycle, including uniqueness and explicit connected consent. */
165
+ export declare function validConnectionData(d: ConnectionData, owner: string): boolean;
166
+ /** Canonical parsed invitations have the same digest for each supported URI encoding. */
167
+ export declare function connectionInviteDigest(invite: Invite): string;
@@ -0,0 +1,132 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ import { digest, verifySigned } from '../../core/dist/index.js';
3
+ export const CONNECTION_DAY_MS = 86_400_000;
4
+ export const CONNECTION_OFFER_TTL_MS = 14 * CONNECTION_DAY_MS;
5
+ export const CONNECTION_REFUSAL_TTL_MS = 7 * CONNECTION_DAY_MS;
6
+ export const CONNECTION_CAPACITY = { connections: 1000, inviteBindings: 1000, outbox: 100,
7
+ priorApprovedPeers: 1000, refusals: 1000 };
8
+ /** Explicit adapter with no store-specific fields exposed to consumers. */
9
+ export function connectionPersistencePort(store) {
10
+ return {
11
+ connectionState: did => store.connectionState(did), connectionLevel: did => store.connectionLevel(did),
12
+ listConnections: () => store.listConnections(), listPriorApprovedPeers: () => store.listPriorApprovedPeers(),
13
+ recordOutgoing: input => store.recordOutgoing(input), recordIncoming: input => store.recordIncoming(input),
14
+ approveConnection: input => store.approveConnection(input), applyAccepted: input => store.applyAccepted(input),
15
+ rejectConnection: did => store.rejectConnection(did), disconnect: did => store.disconnect(did),
16
+ block: did => store.block(did), unblock: did => store.unblock(did),
17
+ bindInviteFirstUse: input => store.bindInviteFirstUse(input),
18
+ listConnectionOutbox: () => store.listConnectionOutbox(),
19
+ markConnectionEventDelivered: id => store.markConnectionEventDelivered(id),
20
+ };
21
+ }
22
+ export function emptyConnectionData() {
23
+ return { connections: [], inviteBindings: [], refusals: [], priorApprovedPeers: [], outbox: [] };
24
+ }
25
+ export function projectConnectionState(data, denials, peer, now) {
26
+ if (denials.includes(peer))
27
+ return 'blocked';
28
+ const r = data.connections.find(c => c.peerOwnerDid === peer);
29
+ return r?.state === 'connected' ? 'connected' : r &&
30
+ ((r.incoming?.expiresAt ?? 0) > now || (r.outgoing?.expiresAt ?? 0) > now) ? 'pending' : 'none';
31
+ }
32
+ export function projectConnectionTrust(state) {
33
+ return state === 'blocked' ? 'denied' : state === 'connected' ? 'limited' : 'unknown';
34
+ }
35
+ export function pruneConnectionData(data, now) {
36
+ data.connections = data.connections.filter(c => {
37
+ if (c.state === 'connected')
38
+ return true;
39
+ if (c.incoming && c.incoming.expiresAt <= now)
40
+ delete c.incoming;
41
+ if (c.outgoing && c.outgoing.expiresAt <= now)
42
+ delete c.outgoing;
43
+ return !!(c.incoming || c.outgoing);
44
+ });
45
+ data.inviteBindings = data.inviteBindings.filter(b => b.tokenExpiresAt > now);
46
+ data.refusals = data.refusals.filter(r => r.refuseUntil > now);
47
+ data.outbox = data.outbox.filter(e => e.deliveryDeadline > now);
48
+ }
49
+ export function assertConnectionCapacity(data) {
50
+ for (const key of Object.keys(CONNECTION_CAPACITY))
51
+ if (data[key].length > CONNECTION_CAPACITY[key])
52
+ throw new Error('CONNECTION_STORE_FULL');
53
+ }
54
+ const text = (v, max = 512) => typeof v === 'string' && v.length > 0 && v.length <= max && !/[\p{Cc}\p{Cf}]/u.test(v);
55
+ const did = (v) => text(v) && v.startsWith('did:');
56
+ const hash = (v) => typeof v === 'string' && /^sha256:[a-f0-9]{64}$/.test(v);
57
+ const time = (v) => typeof v === 'number' && Number.isSafeInteger(v) && v >= 0 && v <= 8_640_000_000_000_000;
58
+ const object = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
59
+ function keys(v, allowed) { return Object.keys(v).every(k => allowed.includes(k)); }
60
+ function relay(v) {
61
+ if (!text(v, 2048))
62
+ return false;
63
+ try {
64
+ const u = new URL(v);
65
+ return ['http:', 'https:'].includes(u.protocol) && !u.username && !u.password && !u.search && !u.hash;
66
+ }
67
+ catch {
68
+ return false;
69
+ }
70
+ }
71
+ export function validConnectionPeer(p) {
72
+ return object(p) && did(p.peerOwnerDid) && (p.peerAgentDid === undefined || did(p.peerAgentDid)) &&
73
+ (p.peerDisplayName === undefined || typeof p.peerDisplayName === 'string' && p.peerDisplayName.length > 0) && relay(p.relayUrl);
74
+ }
75
+ export function assertConnectionOwnerDid(peerOwnerDid) {
76
+ if (!did(peerOwnerDid))
77
+ throw new Error('INTAKE_STORE_INVALID');
78
+ }
79
+ export function validConnectionOffer(o, outgoing) {
80
+ if (!object(o) || !text(o.requestId, 128) || !hash(o.requestDigest) || !time(o.expiresAt))
81
+ return false;
82
+ const start = outgoing ? o.createdAt : o.receivedAt;
83
+ return time(start) && o.expiresAt > start && o.expiresAt - start <= CONNECTION_OFFER_TTL_MS &&
84
+ (outgoing ? hash(o.ownerConsentDigest) &&
85
+ keys(o, ['requestId', 'requestDigest', 'createdAt', 'expiresAt', 'ownerConsentDigest']) :
86
+ keys(o, ['requestId', 'requestDigest', 'receivedAt', 'expiresAt']));
87
+ }
88
+ export function validConnectionOutbox(e, owner) {
89
+ return object(e) && keys(e, ['eventId', 'peerOwnerDid', 'relayUrl', 'signedEvent', 'deliveryDeadline', 'state']) &&
90
+ text(e.eventId, 128) && did(e.peerOwnerDid) && relay(e.relayUrl) && time(e.deliveryDeadline) &&
91
+ ['pending', 'delivered'].includes(e.state) && object(e.signedEvent) && verifySigned(e.signedEvent, owner) &&
92
+ Buffer.byteLength(JSON.stringify(e)) <= 8192;
93
+ }
94
+ export function assertConnectionCommit(connectionId, consentDigest) {
95
+ if (!text(connectionId, 128) || !hash(consentDigest))
96
+ throw new Error('INTAKE_STORE_INVALID');
97
+ }
98
+ /** Validate the persisted lifecycle, including uniqueness and explicit connected consent. */
99
+ export function validConnectionData(d, owner) {
100
+ if (!object(d) || !Object.keys(CONNECTION_CAPACITY)
101
+ .every(k => Array.isArray(d[k]) && d[k].length <= CONNECTION_CAPACITY[k]))
102
+ return false;
103
+ const unique = (rows, key) => new Set(rows.map(key)).size === rows.length;
104
+ if (d.connections.some(c => !validConnectionPeer(c) ||
105
+ !keys(c, ['peerOwnerDid', 'peerAgentDid', 'peerDisplayName', 'relayUrl', 'state', 'incoming', 'outgoing', 'connectionId', 'connectedAt', 'source', 'localConsentDigest', 'remoteAcceptanceDigest']) ||
106
+ (c.incoming !== undefined && !validConnectionOffer(c.incoming, false)) ||
107
+ (c.outgoing !== undefined && !validConnectionOffer(c.outgoing, true)) ||
108
+ (c.state === 'pending' ? !(c.incoming || c.outgoing) ||
109
+ ['connectionId', 'connectedAt', 'source', 'localConsentDigest', 'remoteAcceptanceDigest'].some(k => Object.hasOwn(c, k)) :
110
+ c.state !== 'connected' || !text(c.connectionId, 128) || !time(c.connectedAt) ||
111
+ !['request', 'invite', 'prior-approval'].includes(c.source) || !hash(c.localConsentDigest) ||
112
+ (c.source !== 'invite' && !(c.incoming || c.outgoing)) ||
113
+ (!c.incoming && c.source !== 'invite' && !hash(c.remoteAcceptanceDigest)) ||
114
+ (c.remoteAcceptanceDigest !== undefined && !hash(c.remoteAcceptanceDigest)))))
115
+ return false;
116
+ if (d.inviteBindings.some(b => !object(b) || !keys(b, ['inviteDigest', 'requesterOwnerDid', 'boundAt', 'tokenExpiresAt', 'connectionId']) ||
117
+ !hash(b.inviteDigest) || !did(b.requesterOwnerDid) || !time(b.boundAt) || !time(b.tokenExpiresAt) ||
118
+ b.tokenExpiresAt <= b.boundAt || !text(b.connectionId, 128)) ||
119
+ d.refusals.some(r => !object(r) || !keys(r, ['peerOwnerDid', 'refuseUntil']) || !did(r.peerOwnerDid) || !time(r.refuseUntil)) ||
120
+ d.priorApprovedPeers.some(p => !object(p) || !keys(p, ['peerOwnerDid', 'peerDisplayName', 'lastApprovedAt', 'sourceRequestIds', 'legacyTrust']) ||
121
+ !did(p.peerOwnerDid) || (p.peerDisplayName !== undefined && (typeof p.peerDisplayName !== 'string' || !p.peerDisplayName)) ||
122
+ (p.lastApprovedAt !== undefined && !time(p.lastApprovedAt)) ||
123
+ !['limited', 'trusted'].includes(p.legacyTrust) || !Array.isArray(p.sourceRequestIds) || p.sourceRequestIds.length > 200 ||
124
+ p.sourceRequestIds.some(id => !text(id, 128)) || new Set(p.sourceRequestIds).size !== p.sourceRequestIds.length) ||
125
+ d.outbox.some(e => !validConnectionOutbox(e, owner)))
126
+ return false;
127
+ return unique(d.connections, c => c.peerOwnerDid) && unique(d.inviteBindings, b => b.inviteDigest) &&
128
+ unique(d.refusals, r => r.peerOwnerDid) && unique(d.priorApprovedPeers, p => p.peerOwnerDid) && unique(d.outbox, e => e.eventId);
129
+ }
130
+ /** Canonical parsed invitations have the same digest for each supported URI encoding. */
131
+ export function connectionInviteDigest(invite) { return digest(invite); }
132
+ //# sourceMappingURL=connection-records.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-records.js","sourceRoot":"","sources":["../src/connection-records.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { KeyPair, SignedAgentCard, SignedEnvelope, RevocationList } from '../../core/dist/index.js';
2
+ import type { RelayTransport } from '../../relay/dist/index.js';
3
+ import { ConnectionService } from './connection-service.js';
4
+ import type { ConnectionHumanReviewProvider } from './connection-service.js';
5
+ import { HeldRequestReview } from './held-request-review.js';
6
+ import type { WorkerTrustStore } from './worker-trust-store.js';
7
+ import type { ConnectionRecord } from './connection-records.js';
8
+ export interface ConnectedEvent {
9
+ event: 'connected';
10
+ peerOwnerDid: string;
11
+ peerAgentDid?: string;
12
+ connectionId: string;
13
+ source: ConnectionRecord['source'];
14
+ connectedAt: number;
15
+ }
16
+ export interface ConnectionRouterOptions {
17
+ owner: KeyPair;
18
+ agentCard: SignedAgentCard;
19
+ relayUrl: string;
20
+ relay: RelayTransport;
21
+ store: WorkerTrustStore;
22
+ review: HeldRequestReview;
23
+ now?: () => number;
24
+ humanReview?: ConnectionHumanReviewProvider;
25
+ revocations?: RevocationList;
26
+ allowPrivateRelay?: boolean;
27
+ assertPeer?: (did: string) => void;
28
+ onConnectionEvent?: (event: ConnectedEvent) => void;
29
+ }
30
+ /** Control events are consumed by the existing role reader before task mailbox routing. */
31
+ export declare class ConnectionRouter {
32
+ readonly options: ConnectionRouterOptions;
33
+ readonly service: ConnectionService;
34
+ constructor(options: ConnectionRouterOptions);
35
+ private notify;
36
+ consume(envelope: SignedEnvelope): Promise<boolean>;
37
+ /** Hosts discard terminal control decisions locally and keep their task reader running. */
38
+ route(envelope: SignedEnvelope): Promise<boolean>;
39
+ approve(envelope: SignedEnvelope): Promise<import("./connection-service.js").ConnectionServiceResult>;
40
+ }
41
+ /** Explicit control-only sync. A task at the queue head is left for the task listener. */
42
+ export declare function syncConnections(router: ConnectionRouter, options?: {
43
+ once?: boolean;
44
+ signal?: AbortSignal;
45
+ }): Promise<void>;
@@ -0,0 +1,130 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ import { digest, isConnectionEvent, openEnvelope } from '../../core/dist/index.js';
3
+ import { waitForRelayRetry } from '../../relay/dist/index.js';
4
+ import { acknowledgeRelay } from './session-audit.js';
5
+ import { ConnectionService } from './connection-service.js';
6
+ import { StoredConnectionExchange } from './connection-persistence.js';
7
+ import { openConnectionFrame } from './connection-transport.js';
8
+ import { heldContentDigest } from './held-request-review.js';
9
+ /** Control events are consumed by the existing role reader before task mailbox routing. */
10
+ export class ConnectionRouter {
11
+ options;
12
+ service;
13
+ constructor(options) {
14
+ this.options = options;
15
+ const { review, owner } = options;
16
+ const find = (contentDigest) => review.list().find(r => r.kind === 'connection' &&
17
+ digest(openConnectionFrame(review.store.read(r.id).envelope, owner).event) === contentDigest);
18
+ const inspection = {
19
+ async hold(envelope, context) {
20
+ const frame = openConnectionFrame(envelope, owner);
21
+ options.store.consumeAdmission(frame.event.payload.fromOwnerDid, frame.requestId);
22
+ const previous = find(context.contentDigest);
23
+ if (previous)
24
+ return;
25
+ review.hold({ kind: 'connection', senderOwnerDid: frame.event.payload.fromOwnerDid,
26
+ requestId: frame.requestId, contentDigest: heldContentDigest('connection', openEnvelope(envelope, owner)),
27
+ deadline: Date.parse(context.expiresAt), envelope });
28
+ },
29
+ async inspect(contentDigest) {
30
+ const held = find(contentDigest);
31
+ if (!held)
32
+ return { contentDigest, status: 'unavailable' };
33
+ const result = await review.inspect(held.id);
34
+ return { contentDigest, status: result.inspectionStatus === 'complete' ? 'complete' :
35
+ result.inspectionStatus === 'error' ? 'error' : 'unavailable' };
36
+ },
37
+ async discard(contentDigest) { const held = find(contentDigest); if (held)
38
+ review.discard(held.id); },
39
+ };
40
+ this.service = new ConnectionService({ ...options, persistence: new StoredConnectionExchange(options.store),
41
+ inspection, transport: { send: async (url, envelope) => {
42
+ if (url !== options.relayUrl)
43
+ throw new Error('CONNECTION_RELAY_MISMATCH');
44
+ options.assertPeer?.(envelope.payload.recipientDid);
45
+ await options.relay.send(envelope);
46
+ } } });
47
+ }
48
+ notify(before) {
49
+ for (const c of this.options.store.listConnections())
50
+ if ('connectionId' in c && c.state === 'connected' &&
51
+ !before.some(b => 'connectionId' in b && b.connectionId === c.connectionId && b.state === 'connected'))
52
+ this.options.onConnectionEvent?.({ event: 'connected', peerOwnerDid: c.peerOwnerDid,
53
+ ...(c.peerAgentDid ? { peerAgentDid: c.peerAgentDid } : {}), connectionId: c.connectionId,
54
+ source: c.source, connectedAt: c.connectedAt });
55
+ }
56
+ async consume(envelope) {
57
+ if (!isConnectionEvent(envelope.payload.eventType))
58
+ return false;
59
+ // Block is silent and creates no held-content entry.
60
+ try {
61
+ this.options.assertPeer?.(envelope.payload.senderDid);
62
+ }
63
+ catch {
64
+ await acknowledgeRelay(this.options.relay, envelope);
65
+ return true;
66
+ }
67
+ if (this.options.store.connectionState(envelope.payload.senderDid) === 'blocked') {
68
+ await acknowledgeRelay(this.options.relay, envelope);
69
+ return true;
70
+ }
71
+ const before = this.options.store.listConnections();
72
+ await this.service.receive(envelope);
73
+ this.notify(before);
74
+ await acknowledgeRelay(this.options.relay, envelope);
75
+ return true;
76
+ }
77
+ /** Hosts discard terminal control decisions locally and keep their task reader running. */
78
+ async route(envelope) {
79
+ try {
80
+ return await this.consume(envelope);
81
+ }
82
+ catch (error) {
83
+ const code = error instanceof Error ? error.message.split(':')[0] : '';
84
+ if (!/^(?:INVALID_CONNECTION_|INVALID_AGENT_CARD$|CONNECTION_NOT_PENDING$|CONNECTION_REQUEST_EXPIRED$|CONNECTION_ALREADY_DECIDED$|CONNECTION_REQUEST_COOLDOWN$|INVITE_EXPIRED$|INVITE_WORKER_MISMATCH$|TOKEN_REVOKED$|INTAKE_RATE_LIMITED$)/.test(code))
85
+ throw error;
86
+ await acknowledgeRelay(this.options.relay, envelope);
87
+ return true;
88
+ }
89
+ }
90
+ async approve(envelope) {
91
+ const before = this.options.store.listConnections();
92
+ const result = await this.service.approve(envelope);
93
+ this.notify(before);
94
+ return result;
95
+ }
96
+ }
97
+ /** Explicit control-only sync. A task at the queue head is left for the task listener. */
98
+ export async function syncConnections(router, options = {}) {
99
+ await router.service.flushOutbox();
100
+ try {
101
+ do {
102
+ if (options.signal?.aborted)
103
+ return;
104
+ const relay = router.options.relay, ownerDid = router.options.owner.did;
105
+ // Known offers can receive late acceptance even when a task is at the queue head.
106
+ const taskIds = router.options.store.controlSnapshot().filter(r => r.active &&
107
+ Date.parse(r.offer.expiresAt) > (router.options.now ?? Date.now)()).map(r => 'conn_' + r.offer.requestId);
108
+ const known = taskIds.length ? await relay.receive(ownerDid, 0, options.signal, { taskId: taskIds, lease: true }) : undefined;
109
+ if (known) {
110
+ await router.route(known);
111
+ if (options.once)
112
+ return;
113
+ continue;
114
+ }
115
+ const next = await relay.receive(ownerDid, options.once ? 0 : 1000, options.signal, { role: 'worker', peek: true });
116
+ if (next && isConnectionEvent(next.payload.eventType)) {
117
+ const envelope = await relay.receive(ownerDid, 0, options.signal, { taskId: next.payload.taskId, lease: true });
118
+ if (envelope)
119
+ await router.route(envelope);
120
+ }
121
+ else if (!options.once)
122
+ await waitForRelayRetry(100, options.signal);
123
+ } while (!options.once);
124
+ }
125
+ catch (error) {
126
+ if (!options.signal?.aborted)
127
+ throw error;
128
+ }
129
+ }
130
+ //# sourceMappingURL=connection-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-router.js","sourceRoot":"","sources":["../src/connection-router.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAqB,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAehF,2FAA2F;AAC3F,MAAM,OAAO,gBAAgB;IAEN;IADZ,OAAO,CAAoB;IACpC,YAAqB,OAAgC;QAAhC,YAAO,GAAP,OAAO,CAAyB;QACnD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;QAClC,MAAM,IAAI,GAAG,CAAC,aAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY;YACrF,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,aAAa,CAAC,CAAC;QACjG,MAAM,UAAU,GAA6B;YAC3C,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO;gBAC1B,MAAM,KAAK,GAAG,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBACnD,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;gBAClF,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;gBAC7C,IAAI,QAAQ;oBAAE,OAAO;gBACrB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY;oBAChF,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,aAAa,EAAE,iBAAiB,CAAC,YAAY,EAAE,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;oBACzG,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;YACzD,CAAC;YACD,KAAK,CAAC,OAAO,CAAC,aAAa;gBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;gBACjC,IAAI,CAAC,IAAI;oBAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;gBAC3D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,gBAAgB,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;wBACnF,MAAM,CAAC,gBAAgB,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;YACpE,CAAC;YACD,KAAK,CAAC,OAAO,CAAC,aAAa,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI;gBAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SACtG,CAAC;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAiB,CAAC,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE,IAAI,wBAAwB,CAAC,OAAO,CAAC,KAAK,CAAC;YACzG,UAAU,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;oBACrD,IAAI,GAAG,KAAK,OAAO,CAAC,QAAQ;wBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;oBAC3E,OAAO,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;oBAAC,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC1F,CAAC,EAAE,EAAE,CAAC,CAAC;IACX,CAAC;IACO,MAAM,CAAC,MAAuD;QACpE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE;YAAE,IAAI,cAAc,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,WAAW;gBACtG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,KAAK,KAAK,WAAW,CAAC;gBACtG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY;oBACjF,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,YAAa;oBAC1F,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,WAAY,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,QAAwB;QACpC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC;YAAE,OAAO,KAAK,CAAC;QACjE,qDAAqD;QACrD,IAAI,CAAC;YAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAAC,CAAC;QAC9D,MAAM,CAAC;YAAC,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;QAC5E,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE,CAAC;YACjF,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAAC,OAAO,IAAI,CAAC;QACpE,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;QACpD,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpB,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,2FAA2F;IAC3F,KAAK,CAAC,KAAK,CAAC,QAAwB;QAClC,IAAI,CAAC;YAAC,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAC;QAC5C,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,IAAI,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,IAAI,CAAC,uOAAuO,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,MAAM,KAAK,CAAC;YACrQ,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAAC,OAAO,IAAI,CAAC;QACpE,CAAC;IACH,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,QAAwB;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAAC,OAAO,MAAM,CAAC;IAC1F,CAAC;CACF;AAED,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAwB,EAAE,UAAoD,EAAE;IACpH,MAAM,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IACnC,IAAI,CAAC;QACH,GAAG,CAAC;YACF,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;gBAAE,OAAO;YACpC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;YACxE,kFAAkF;YAClF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM;gBACzE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC5G,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC9H,IAAI,KAAK,EAAE,CAAC;gBAAC,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAAC,IAAI,OAAO,CAAC,IAAI;oBAAE,OAAO;gBAAC,SAAS;YAAC,CAAC;YAC7E,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACpH,IAAI,IAAI,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBACtD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChH,IAAI,QAAQ;oBAAE,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC7C,CAAC;iBAAM,IAAI,CAAC,OAAO,CAAC,IAAI;gBAAE,MAAM,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACzE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO;YAAE,MAAM,KAAK,CAAC;IAAC,CAAC;AAChE,CAAC"}