agent-embassy 3.0.0 → 4.0.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 (115) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/CONTRIBUTING.md +92 -200
  3. package/README.md +159 -138
  4. package/SECURITY.md +191 -335
  5. package/dist/src/gateway/broker-check.d.ts +26 -0
  6. package/dist/src/gateway/broker-check.js +89 -0
  7. package/dist/src/gateway/broker-check.js.map +1 -0
  8. package/dist/src/gateway/broker-control.d.ts +72 -0
  9. package/dist/src/gateway/broker-control.js +164 -0
  10. package/dist/src/gateway/broker-control.js.map +1 -0
  11. package/dist/src/gateway/broker.d.ts +117 -0
  12. package/dist/src/gateway/broker.js +186 -0
  13. package/dist/src/gateway/broker.js.map +1 -0
  14. package/dist/src/gateway/claude-peer.d.ts +1 -124
  15. package/dist/src/gateway/claude-peer.js +62 -1053
  16. package/dist/src/gateway/claude-peer.js.map +1 -1
  17. package/dist/src/gateway/codex-stateless-transport.d.ts +0 -12
  18. package/dist/src/gateway/codex-stateless-transport.js +8 -142
  19. package/dist/src/gateway/codex-stateless-transport.js.map +1 -1
  20. package/dist/src/gateway/config.d.ts +2 -6
  21. package/dist/src/gateway/config.js +17 -27
  22. package/dist/src/gateway/config.js.map +1 -1
  23. package/dist/src/gateway/coordinator.d.ts +57 -0
  24. package/dist/src/gateway/coordinator.js +217 -0
  25. package/dist/src/gateway/coordinator.js.map +1 -0
  26. package/dist/src/gateway/core-cli.d.ts +15 -0
  27. package/dist/src/gateway/core-cli.js +282 -0
  28. package/dist/src/gateway/core-cli.js.map +1 -0
  29. package/dist/src/gateway/core-service-command.d.ts +16 -0
  30. package/dist/src/gateway/core-service-command.js +71 -0
  31. package/dist/src/gateway/core-service-command.js.map +1 -0
  32. package/dist/src/gateway/endpoint-directory.d.ts +33 -0
  33. package/dist/src/gateway/endpoint-directory.js +223 -0
  34. package/dist/src/gateway/endpoint-directory.js.map +1 -0
  35. package/dist/src/gateway/federation.d.ts +89 -0
  36. package/dist/src/gateway/federation.js +632 -0
  37. package/dist/src/gateway/federation.js.map +1 -0
  38. package/dist/src/gateway/ledger-codec.d.ts +3 -0
  39. package/dist/src/gateway/ledger-codec.js +159 -0
  40. package/dist/src/gateway/ledger-codec.js.map +1 -0
  41. package/dist/src/gateway/ledger.d.ts +138 -0
  42. package/dist/src/gateway/ledger.js +319 -0
  43. package/dist/src/gateway/ledger.js.map +1 -0
  44. package/dist/src/gateway/local-control.d.ts +23 -0
  45. package/dist/src/gateway/local-control.js +489 -0
  46. package/dist/src/gateway/local-control.js.map +1 -0
  47. package/dist/src/gateway/native-destinations.d.ts +34 -0
  48. package/dist/src/gateway/native-destinations.js +272 -0
  49. package/dist/src/gateway/native-destinations.js.map +1 -0
  50. package/dist/src/gateway/owned-state.d.ts +57 -0
  51. package/dist/src/gateway/owned-state.js +398 -0
  52. package/dist/src/gateway/owned-state.js.map +1 -0
  53. package/dist/src/gateway/provenance-envelope.d.ts +3 -3
  54. package/dist/src/gateway/provenance-envelope.js +3 -23
  55. package/dist/src/gateway/provenance-envelope.js.map +1 -1
  56. package/dist/src/gateway/runtime.d.ts +41 -0
  57. package/dist/src/gateway/runtime.js +175 -0
  58. package/dist/src/gateway/runtime.js.map +1 -0
  59. package/docs/CONFIGURATION.md +178 -266
  60. package/docs/DELIVERY.md +133 -82
  61. package/docs/GATEWAY-ARCHITECTURE.md +276 -943
  62. package/package.json +5 -5
  63. package/skills/embassy-peer/SKILL.md +38 -194
  64. package/skills/embassy-peer/agents/openai.yaml +2 -2
  65. package/dist/src/gateway/claude-helper-client.d.ts +0 -2
  66. package/dist/src/gateway/claude-helper-client.js +0 -2
  67. package/dist/src/gateway/claude-helper-client.js.map +0 -1
  68. package/dist/src/gateway/claude-helper-protocol.d.ts +0 -117
  69. package/dist/src/gateway/claude-helper-protocol.js +0 -122
  70. package/dist/src/gateway/claude-helper-protocol.js.map +0 -1
  71. package/dist/src/gateway/claude-helper-supervisor.d.ts +0 -87
  72. package/dist/src/gateway/claude-helper-supervisor.js +0 -347
  73. package/dist/src/gateway/claude-helper-supervisor.js.map +0 -1
  74. package/dist/src/gateway/claude-helper.d.ts +0 -1
  75. package/dist/src/gateway/claude-helper.js +0 -252
  76. package/dist/src/gateway/claude-helper.js.map +0 -1
  77. package/dist/src/gateway/cli.d.ts +0 -57
  78. package/dist/src/gateway/cli.js +0 -1503
  79. package/dist/src/gateway/cli.js.map +0 -1
  80. package/dist/src/gateway/codex-socket-holder.d.ts +0 -26
  81. package/dist/src/gateway/codex-socket-holder.js +0 -76
  82. package/dist/src/gateway/codex-socket-holder.js.map +0 -1
  83. package/dist/src/gateway/control.d.ts +0 -261
  84. package/dist/src/gateway/control.js +0 -903
  85. package/dist/src/gateway/control.js.map +0 -1
  86. package/dist/src/gateway/peer-client.d.ts +0 -58
  87. package/dist/src/gateway/peer-client.js +0 -217
  88. package/dist/src/gateway/peer-client.js.map +0 -1
  89. package/dist/src/gateway/peer-mailbox.d.ts +0 -78
  90. package/dist/src/gateway/peer-mailbox.js +0 -168
  91. package/dist/src/gateway/peer-mailbox.js.map +0 -1
  92. package/dist/src/gateway/peer-protocol.d.ts +0 -105
  93. package/dist/src/gateway/peer-protocol.js +0 -70
  94. package/dist/src/gateway/peer-protocol.js.map +0 -1
  95. package/dist/src/gateway/peer-stdio.d.ts +0 -23
  96. package/dist/src/gateway/peer-stdio.js +0 -100
  97. package/dist/src/gateway/peer-stdio.js.map +0 -1
  98. package/dist/src/gateway/providers.d.ts +0 -163
  99. package/dist/src/gateway/providers.js +0 -972
  100. package/dist/src/gateway/providers.js.map +0 -1
  101. package/dist/src/gateway/server.d.ts +0 -47
  102. package/dist/src/gateway/server.js +0 -219
  103. package/dist/src/gateway/server.js.map +0 -1
  104. package/dist/src/gateway/service.d.ts +0 -373
  105. package/dist/src/gateway/service.js +0 -2274
  106. package/dist/src/gateway/service.js.map +0 -1
  107. package/dist/src/gateway/status-view.d.ts +0 -167
  108. package/dist/src/gateway/status-view.js +0 -488
  109. package/dist/src/gateway/status-view.js.map +0 -1
  110. package/dist/src/gateway/store.d.ts +0 -185
  111. package/dist/src/gateway/store.js +0 -2359
  112. package/dist/src/gateway/store.js.map +0 -1
  113. package/dist/src/gateway/types.d.ts +0 -528
  114. package/dist/src/gateway/types.js +0 -341
  115. package/dist/src/gateway/types.js.map +0 -1
@@ -0,0 +1,223 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { BridgeError } from "../errors.js";
3
+ import { Ledger, nativeKey, sameEndpoint } from "./ledger.js";
4
+ const ALIAS = /^[a-z][a-z0-9_-]{0,31}@[a-z0-9](?:[a-z0-9.-]{0,61}[a-z0-9])?$/;
5
+ const HOST = /^[a-z0-9](?:[a-z0-9.-]{0,61}[a-z0-9])?$/;
6
+ const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
7
+ const REGISTRATION = /^reg_[A-Za-z0-9_-]{1,252}$/;
8
+ const allowedClaude = (peer) => peer.kind === "interactive" || peer.kind === "bg";
9
+ const reference = ({ id, host, provider }) => ({ id, host, provider });
10
+ export class EndpointDirectory {
11
+ options;
12
+ #createRegistrationId;
13
+ #collidingAliases = new Set();
14
+ #observedClaudeAliases = new Set();
15
+ #completeRefreshObserved = false;
16
+ #proofOverflow = false;
17
+ constructor(options) {
18
+ this.options = options;
19
+ if (!HOST.test(options.host))
20
+ throw new BridgeError("INVALID_GATEWAY_CONFIGURATION", "The endpoint host is invalid.");
21
+ this.#createRegistrationId = options.createRegistrationId ?? (() => `reg_${randomUUID()}`);
22
+ }
23
+ async registerCodex(handle, alias, succeeds) {
24
+ this.#assertAlias(alias, true);
25
+ if (succeeds !== undefined)
26
+ this.#assertAlias(succeeds, true);
27
+ if (!UUID.test(handle)) {
28
+ throw new BridgeError("INVALID_GATEWAY_CONFIGURATION", "The Codex registration is invalid.");
29
+ }
30
+ return await this.options.store.transact((state, now) => {
31
+ const ledger = new Ledger(state, this.options.host, this.options.limits, now.getTime());
32
+ const normalizedHandle = handle.toLowerCase();
33
+ const existing = state.endpoints.find((row) => row.provider === "codex" && row.handle === normalizedHandle);
34
+ if (succeeds !== undefined) {
35
+ const predecessor = ledger.resolve(succeeds);
36
+ if (predecessor === undefined || predecessor.provider !== "codex") {
37
+ throw new BridgeError("ROUTE_UNREGISTERED", "The predecessor route is absent.");
38
+ }
39
+ if (predecessor.handle !== normalizedHandle)
40
+ ledger.retire(reference(predecessor));
41
+ }
42
+ const endpoint = {
43
+ id: existing?.id ?? this.#id("codex", normalizedHandle), host: this.options.host, provider: "codex",
44
+ alias, handle: normalizedHandle,
45
+ };
46
+ if (state.endpoints.some((row) => row.alias === alias && !sameEndpoint(row, endpoint))) {
47
+ throw new BridgeError("PEER_ALIAS_COLLISION", "The requested Codex alias is already in use.");
48
+ }
49
+ ledger.register(endpoint);
50
+ return endpoint;
51
+ });
52
+ }
53
+ async caller(input) {
54
+ if (input.kind === "codex") {
55
+ if (!UUID.test(input.handle))
56
+ throw new BridgeError("ROUTE_UNREGISTERED", "The Codex caller is invalid.");
57
+ const matches = (await this.options.store.snapshot()).endpoints.filter((row) => row.provider === "codex" && row.handle === input.handle.toLowerCase());
58
+ if (matches.length !== 1)
59
+ throw new BridgeError("ROUTE_UNREGISTERED", "The Codex caller is not registered.");
60
+ return matches[0];
61
+ }
62
+ const peer = await this.options.claude.resolveReplyAddress(input.address);
63
+ if (!allowedClaude(peer))
64
+ throw new BridgeError("CLAUDE_REPLY_ROUTE_MISMATCH", "The caller is not an interactive Claude session.");
65
+ return await this.#recordClaude(peer);
66
+ }
67
+ async named(selector) {
68
+ if (UUID.test(selector)) {
69
+ const peer = (await this.options.claude.discover()).peers.find((row) => row.targetId.toLowerCase() === selector.toLowerCase() && allowedClaude(row));
70
+ if (peer === undefined)
71
+ return undefined;
72
+ const endpoint = await this.#recordClaude(peer);
73
+ await this.options.claude.assertTargetWorkspaceDisjoint(peer.targetId, this.options.store.rootDir);
74
+ return endpoint;
75
+ }
76
+ if (!ALIAS.test(selector))
77
+ return undefined;
78
+ const at = selector.lastIndexOf("@");
79
+ if (selector.slice(at + 1) !== this.options.host)
80
+ return await this.#remoteNamed(selector);
81
+ const before = await this.options.store.snapshot();
82
+ const known = before.endpoints.filter((row) => row.alias === selector);
83
+ const codex = known.filter((row) => row.provider === "codex");
84
+ let live;
85
+ try {
86
+ live = await this.refresh();
87
+ }
88
+ catch (error) {
89
+ if (this.#proofOverflow || this.#collidingAliases.has(selector) || !this.#completeRefreshObserved && known.length > 1) {
90
+ throw new BridgeError("PEER_ALIAS_COLLISION", "The endpoint name is ambiguous.");
91
+ }
92
+ if (codex.length === 1 && (known.length === 1 ||
93
+ this.#completeRefreshObserved && !this.#observedClaudeAliases.has(selector)))
94
+ return codex[0];
95
+ throw error;
96
+ }
97
+ if (this.#proofOverflow || this.#collidingAliases.has(selector)) {
98
+ throw new BridgeError("PEER_ALIAS_COLLISION", "A complete discovery is required to clear this name's collision.");
99
+ }
100
+ const matches = live.filter((row) => row.alias === selector);
101
+ if (matches.length > 1)
102
+ throw new BridgeError("PEER_ALIAS_COLLISION", "The endpoint name is ambiguous.");
103
+ const endpoint = matches[0];
104
+ if (endpoint === undefined && before.retirements.some((row) => row.alias === selector)) {
105
+ throw new BridgeError("ROUTE_UNREGISTERED", "The endpoint name belongs to a retired identity.");
106
+ }
107
+ if (endpoint?.provider === "claude") {
108
+ await this.options.claude.assertTargetWorkspaceDisjoint(endpoint.handle, this.options.store.rootDir);
109
+ }
110
+ return endpoint;
111
+ }
112
+ async exact(identity) {
113
+ if (identity.host !== this.options.host) {
114
+ const endpoint = await this.options.remote?.exact(identity);
115
+ if (endpoint === undefined)
116
+ return undefined;
117
+ if (!this.#validRemote(endpoint) || !sameEndpoint(endpoint, identity)) {
118
+ throw new BridgeError("INVALID_PEER_CATALOG", "The remote endpoint identity is invalid.");
119
+ }
120
+ return endpoint;
121
+ }
122
+ const endpoint = (await this.options.store.snapshot()).endpoints.find((row) => sameEndpoint(row, identity));
123
+ if (endpoint === undefined || endpoint.provider === "codex")
124
+ return endpoint;
125
+ const peer = (await this.options.claude.discover()).peers.find((row) => row.targetId.toLowerCase() === endpoint.handle && allowedClaude(row));
126
+ if (peer === undefined)
127
+ return undefined;
128
+ const current = await this.#recordClaude(peer);
129
+ if (!sameEndpoint(current, identity))
130
+ return undefined;
131
+ await this.options.claude.assertTargetWorkspaceDisjoint(peer.targetId, this.options.store.rootDir);
132
+ return current;
133
+ }
134
+ async refresh() {
135
+ const discovery = await this.options.claude.discover();
136
+ const peers = discovery.peers.filter(allowedClaude);
137
+ const refreshed = await this.options.store.transact((state, now) => {
138
+ const ledger = new Ledger(state, this.options.host, this.options.limits, now.getTime());
139
+ const current = peers.flatMap((peer) => {
140
+ const endpoint = this.#upsertClaude(ledger, state, peer, true);
141
+ return endpoint === undefined ? [] : [endpoint];
142
+ });
143
+ if (!discovery.truncated)
144
+ return { listed: current, observed: current };
145
+ const seen = new Set(current.map((row) => row.id));
146
+ return { observed: current, listed: [...current,
147
+ ...state.endpoints.filter((row) => row.provider === "claude" && !seen.has(row.id))] };
148
+ });
149
+ const observed = refreshed.observed.map((row) => row.alias);
150
+ const codex = (await this.options.store.snapshot()).endpoints.filter((row) => row.provider === "codex");
151
+ const collisions = new Set(observed.filter((alias, index) => observed.indexOf(alias) !== index || codex.some((row) => row.alias === alias)));
152
+ if (!discovery.truncated) {
153
+ this.#completeRefreshObserved = true;
154
+ this.#observedClaudeAliases.clear();
155
+ this.#collidingAliases.clear();
156
+ this.#proofOverflow = false;
157
+ }
158
+ for (const [set, aliases] of [[this.#observedClaudeAliases, observed], [this.#collidingAliases, collisions]]) {
159
+ for (const alias of aliases) {
160
+ if (set.has(alias))
161
+ continue;
162
+ if (set.size < this.options.limits.endpoints)
163
+ set.add(alias);
164
+ else
165
+ this.#proofOverflow = true;
166
+ }
167
+ }
168
+ return [...codex, ...refreshed.listed];
169
+ }
170
+ #upsertClaude(ledger, state, peer, skipRetired = false) {
171
+ if (!UUID.test(peer.targetId) || !allowedClaude(peer)) {
172
+ throw new BridgeError("CLAUDE_ROUTE_MISMATCH", "The discovered Claude identity is invalid.");
173
+ }
174
+ const alias = `${peer.alias}@${this.options.host}`;
175
+ this.#assertAlias(alias, false);
176
+ const handle = peer.targetId.toLowerCase();
177
+ const existing = state.endpoints.find((row) => row.provider === "claude" && row.handle === handle);
178
+ const endpoint = { id: existing?.id ?? this.#id("claude", handle), host: this.options.host,
179
+ provider: "claude", alias, handle };
180
+ if (state.retirements.some((row) => sameEndpoint(row.endpoint, endpoint) || row.nativeKey === nativeKey(endpoint))) {
181
+ if (skipRetired)
182
+ return undefined;
183
+ throw new BridgeError("ROUTE_UNREGISTERED", "The Claude endpoint was retired.");
184
+ }
185
+ ledger.register(endpoint);
186
+ return endpoint;
187
+ }
188
+ async #recordClaude(peer) {
189
+ return await this.options.store.transact((state, now) => {
190
+ const endpoint = this.#upsertClaude(new Ledger(state, this.options.host, this.options.limits, now.getTime()), state, peer);
191
+ if (endpoint === undefined)
192
+ throw new RangeError("CLAUDE_ENDPOINT_MISSING");
193
+ return endpoint;
194
+ });
195
+ }
196
+ async #remoteNamed(alias) {
197
+ const matches = await this.options.remote?.named(alias) ?? [];
198
+ if (matches.some((row) => !this.#validRemote(row) || row.alias !== alias)) {
199
+ throw new BridgeError("INVALID_PEER_CATALOG", "The remote endpoint projection is invalid.");
200
+ }
201
+ if (matches.length > 1)
202
+ throw new BridgeError("PEER_ALIAS_COLLISION", "The endpoint name is ambiguous.");
203
+ return matches[0];
204
+ }
205
+ #validRemote(endpoint) {
206
+ return endpoint.host !== this.options.host && HOST.test(endpoint.host) && REGISTRATION.test(endpoint.id) &&
207
+ (endpoint.provider === "claude" || endpoint.provider === "codex") && ALIAS.test(endpoint.alias) &&
208
+ endpoint.alias.endsWith(`@${endpoint.host}`) && endpoint.handle.length > 0 && endpoint.handle.length <= 256 &&
209
+ !endpoint.handle.includes("\0");
210
+ }
211
+ #assertAlias(alias, codex) {
212
+ if (!ALIAS.test(alias) || !alias.endsWith(`@${this.options.host}`) || codex && !alias.startsWith("codex-")) {
213
+ throw new BridgeError("INVALID_GATEWAY_CONFIGURATION", "The endpoint alias is invalid.");
214
+ }
215
+ }
216
+ #id(provider, handle) {
217
+ const id = this.#createRegistrationId(provider, handle);
218
+ if (!REGISTRATION.test(id))
219
+ throw new RangeError("INVALID_REGISTRATION_ID");
220
+ return id;
221
+ }
222
+ }
223
+ //# sourceMappingURL=endpoint-directory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint-directory.js","sourceRoot":"","sources":["../../../src/gateway/endpoint-directory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { type ChildProcessWithoutNullStreams, type SpawnOptionsWithoutStdio } from "node:child_process";
2
+ import type { Readable, Writable } from "node:stream";
3
+ import type { Destination, WakeInput, WakeResult } from "./coordinator.js";
4
+ import type { RemoteEndpointResolver } from "./endpoint-directory.js";
5
+ import type { Endpoint, EndpointRef } from "./ledger.js";
6
+ export declare const FEDERATION_PROTOCOL_VERSION = 3;
7
+ export type PublicEndpoint = Readonly<{
8
+ id: string;
9
+ host: string;
10
+ provider: "claude" | "codex";
11
+ alias: string;
12
+ }>;
13
+ export type FederationObservation = Readonly<{
14
+ host: string;
15
+ observedAt?: string;
16
+ safeErrorCode?: "PEER_TUNNEL_UNAVAILABLE";
17
+ routes: readonly PublicEndpoint[];
18
+ }>;
19
+ export type FederationSnapshot = Readonly<{
20
+ nodes: readonly FederationObservation[];
21
+ truncated: boolean;
22
+ }>;
23
+ export type FederatedHandoff = Readonly<{
24
+ target: PublicEndpoint;
25
+ messages: readonly Readonly<{
26
+ id: string;
27
+ reply: string;
28
+ source: PublicEndpoint;
29
+ body: string;
30
+ deadline: number;
31
+ steer: boolean;
32
+ }>[];
33
+ }>;
34
+ type FederationResult = Readonly<{
35
+ accepted: true;
36
+ } | {
37
+ accepted: false;
38
+ code: string;
39
+ }>;
40
+ type Child = Pick<ChildProcessWithoutNullStreams, "kill" | "once" | "stderr" | "stdin" | "stdout">;
41
+ export type FederationSpawn = (command: string, args: readonly string[], options: SpawnOptionsWithoutStdio) => Child;
42
+ export declare function isFederatedHandoff(value: unknown): value is FederatedHandoff;
43
+ export declare class Federation implements Destination, RemoteEndpointResolver {
44
+ private readonly options;
45
+ private readonly nodes;
46
+ private readonly connections;
47
+ private readonly catalogs;
48
+ private readonly catalogCounts;
49
+ private readonly observedAt;
50
+ private readonly failed;
51
+ private readonly now;
52
+ private catalogTruncated;
53
+ private closing;
54
+ constructor(options: Readonly<{
55
+ host: string;
56
+ nodes: readonly string[];
57
+ spawn?: FederationSpawn;
58
+ now?: () => number;
59
+ }>);
60
+ named(name: string): Promise<readonly Endpoint[]>;
61
+ exact(identity: EndpointRef): Promise<Endpoint | undefined>;
62
+ catalog(): Promise<PublicEndpoint[]>;
63
+ /** Last bounded display observation only. Reading it performs no network I/O;
64
+ * exact and named routing continue to use the authenticated owner RPC. */
65
+ snapshot(): FederationSnapshot;
66
+ deliver(input: WakeInput): Promise<WakeResult>;
67
+ close(): Promise<void>;
68
+ private resolveAt;
69
+ private connection;
70
+ private drop;
71
+ private compactCatalogs;
72
+ }
73
+ export type FederationHandlers = Readonly<{
74
+ resolve: (peerHost: string, selector: string | EndpointRef) => PublicEndpoint | null | Promise<PublicEndpoint | null>;
75
+ catalog: (peerHost: string) => readonly PublicEndpoint[] | Promise<readonly PublicEndpoint[]>;
76
+ handoff: (peerHost: string, input: FederatedHandoff) => FederationResult | Promise<FederationResult>;
77
+ }>;
78
+ export type FederationStdioSession = Readonly<{
79
+ done: Promise<void>;
80
+ close: () => void;
81
+ }>;
82
+ export declare function runFederationStdio(options: Readonly<{
83
+ host: string;
84
+ nodes: readonly string[];
85
+ handlers: FederationHandlers;
86
+ input?: Readable;
87
+ output?: Writable;
88
+ }>): FederationStdioSession;
89
+ export {};