@mquan/portal 0.0.1

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 (116) hide show
  1. package/README.md +168 -0
  2. package/dist/src/api.d.ts +5 -0
  3. package/dist/src/api.js +357 -0
  4. package/dist/src/api.js.map +1 -0
  5. package/dist/src/cli.d.ts +17 -0
  6. package/dist/src/cli.js +618 -0
  7. package/dist/src/cli.js.map +1 -0
  8. package/dist/src/daemon-lifecycle.d.ts +24 -0
  9. package/dist/src/daemon-lifecycle.js +107 -0
  10. package/dist/src/daemon-lifecycle.js.map +1 -0
  11. package/dist/src/daemon.d.ts +17 -0
  12. package/dist/src/daemon.js +90 -0
  13. package/dist/src/daemon.js.map +1 -0
  14. package/dist/src/doctor.d.ts +14 -0
  15. package/dist/src/doctor.js +51 -0
  16. package/dist/src/doctor.js.map +1 -0
  17. package/dist/src/entrypoint.d.ts +2 -0
  18. package/dist/src/entrypoint.js +14 -0
  19. package/dist/src/entrypoint.js.map +1 -0
  20. package/dist/src/index.d.ts +5 -0
  21. package/dist/src/index.js +5 -0
  22. package/dist/src/index.js.map +1 -0
  23. package/dist/src/launch.d.ts +41 -0
  24. package/dist/src/launch.js +186 -0
  25. package/dist/src/launch.js.map +1 -0
  26. package/dist/src/mcp.d.ts +9 -0
  27. package/dist/src/mcp.js +132 -0
  28. package/dist/src/mcp.js.map +1 -0
  29. package/dist/src/network/client.d.ts +67 -0
  30. package/dist/src/network/client.js +540 -0
  31. package/dist/src/network/client.js.map +1 -0
  32. package/dist/src/network/coordinator.d.ts +83 -0
  33. package/dist/src/network/coordinator.js +225 -0
  34. package/dist/src/network/coordinator.js.map +1 -0
  35. package/dist/src/network/protocol.d.ts +1352 -0
  36. package/dist/src/network/protocol.js +360 -0
  37. package/dist/src/network/protocol.js.map +1 -0
  38. package/dist/src/network/server.d.ts +28 -0
  39. package/dist/src/network/server.js +474 -0
  40. package/dist/src/network/server.js.map +1 -0
  41. package/dist/src/network/tasks.d.ts +65 -0
  42. package/dist/src/network/tasks.js +276 -0
  43. package/dist/src/network/tasks.js.map +1 -0
  44. package/dist/src/portal-index.d.ts +21 -0
  45. package/dist/src/portal-index.js +140 -0
  46. package/dist/src/portal-index.js.map +1 -0
  47. package/dist/src/provider/claude-managed.d.ts +34 -0
  48. package/dist/src/provider/claude-managed.js +125 -0
  49. package/dist/src/provider/claude-managed.js.map +1 -0
  50. package/dist/src/provider/claude.d.ts +24 -0
  51. package/dist/src/provider/claude.js +114 -0
  52. package/dist/src/provider/claude.js.map +1 -0
  53. package/dist/src/provider/codex/app-server-client.d.ts +43 -0
  54. package/dist/src/provider/codex/app-server-client.js +143 -0
  55. package/dist/src/provider/codex/app-server-client.js.map +1 -0
  56. package/dist/src/provider/codex/index.d.ts +3 -0
  57. package/dist/src/provider/codex/index.js +4 -0
  58. package/dist/src/provider/codex/index.js.map +1 -0
  59. package/dist/src/provider/codex/managed-runner.d.ts +12 -0
  60. package/dist/src/provider/codex/managed-runner.js +162 -0
  61. package/dist/src/provider/codex/managed-runner.js.map +1 -0
  62. package/dist/src/provider/codex/probe.d.ts +2 -0
  63. package/dist/src/provider/codex/probe.js +33 -0
  64. package/dist/src/provider/codex/probe.js.map +1 -0
  65. package/dist/src/provider/codex/protocol.d.ts +193 -0
  66. package/dist/src/provider/codex/protocol.js +10 -0
  67. package/dist/src/provider/codex/protocol.js.map +1 -0
  68. package/dist/src/provider/codex/provider.d.ts +35 -0
  69. package/dist/src/provider/codex/provider.js +289 -0
  70. package/dist/src/provider/codex/provider.js.map +1 -0
  71. package/dist/src/provider/codex/remote-app-server.d.ts +16 -0
  72. package/dist/src/provider/codex/remote-app-server.js +80 -0
  73. package/dist/src/provider/codex/remote-app-server.js.map +1 -0
  74. package/dist/src/provider/codex/websocket-client.d.ts +40 -0
  75. package/dist/src/provider/codex/websocket-client.js +174 -0
  76. package/dist/src/provider/codex/websocket-client.js.map +1 -0
  77. package/dist/src/provider/types.d.ts +35 -0
  78. package/dist/src/provider/types.js +2 -0
  79. package/dist/src/provider/types.js.map +1 -0
  80. package/dist/src/recall/embedding.d.ts +28 -0
  81. package/dist/src/recall/embedding.js +142 -0
  82. package/dist/src/recall/embedding.js.map +1 -0
  83. package/dist/src/recall/types.d.ts +35 -0
  84. package/dist/src/recall/types.js +2 -0
  85. package/dist/src/recall/types.js.map +1 -0
  86. package/dist/src/rpc/client.d.ts +6 -0
  87. package/dist/src/rpc/client.js +58 -0
  88. package/dist/src/rpc/client.js.map +1 -0
  89. package/dist/src/rpc/protocol.d.ts +21 -0
  90. package/dist/src/rpc/protocol.js +11 -0
  91. package/dist/src/rpc/protocol.js.map +1 -0
  92. package/dist/src/rpc/server.d.ts +12 -0
  93. package/dist/src/rpc/server.js +154 -0
  94. package/dist/src/rpc/server.js.map +1 -0
  95. package/dist/src/runtime/paths.d.ts +8 -0
  96. package/dist/src/runtime/paths.js +18 -0
  97. package/dist/src/runtime/paths.js.map +1 -0
  98. package/dist/src/service.d.ts +127 -0
  99. package/dist/src/service.js +637 -0
  100. package/dist/src/service.js.map +1 -0
  101. package/dist/src/session-profile.d.ts +39 -0
  102. package/dist/src/session-profile.js +186 -0
  103. package/dist/src/session-profile.js.map +1 -0
  104. package/dist/src/storage/database.d.ts +9 -0
  105. package/dist/src/storage/database.js +354 -0
  106. package/dist/src/storage/database.js.map +1 -0
  107. package/dist/src/storage/repository.d.ts +275 -0
  108. package/dist/src/storage/repository.js +1291 -0
  109. package/dist/src/storage/repository.js.map +1 -0
  110. package/dist/src/version.d.ts +1 -0
  111. package/dist/src/version.js +2 -0
  112. package/dist/src/version.js.map +1 -0
  113. package/docs/architecture-plan.md +191 -0
  114. package/docs/mvp-plan.md +111 -0
  115. package/docs/remote-demo.md +346 -0
  116. package/package.json +47 -0
@@ -0,0 +1,225 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { RemoteNetworkClient, normalizeRemoteServerUrl } from "./client.js";
3
+ /** Multiplexes explicitly advertised local sessions over one client per relay URL. */
4
+ export class RemoteCoordinator {
5
+ installationId;
6
+ clientId;
7
+ leaseSeconds;
8
+ #clientFactory;
9
+ #onEnvelope;
10
+ #onError;
11
+ #envelopeHandlers = new Set();
12
+ #connections = new Map();
13
+ #sessionServers = new Map();
14
+ #closed = false;
15
+ constructor(options = {}) {
16
+ this.installationId = options.installationId ?? `install_${randomUUID()}`;
17
+ this.clientId = options.clientId ?? `portald_${randomUUID()}`;
18
+ this.leaseSeconds = options.leaseSeconds ?? 30;
19
+ this.#clientFactory = options.clientFactory ?? ((url, identity) => RemoteNetworkClient.connect(url, identity));
20
+ this.#onEnvelope = options.onEnvelope;
21
+ this.#onError = options.onError;
22
+ }
23
+ async advertise(input) {
24
+ this.#assertOpen();
25
+ const serverUrl = normalizeRemoteServerUrl(input.serverUrl);
26
+ const currentServer = this.#sessionServers.get(input.sessionId);
27
+ if (currentServer !== undefined)
28
+ throw new Error(`session is already advertised on ${currentServer}: ${input.sessionId}`);
29
+ // Reserve before any await so concurrent calls cannot register the same session twice.
30
+ this.#sessionServers.set(input.sessionId, serverUrl);
31
+ const registrationInput = {
32
+ sessionId: input.sessionId,
33
+ agentName: input.agentName,
34
+ provider: input.provider,
35
+ description: input.description,
36
+ capabilities: input.capabilities ?? ["message", "task"],
37
+ state: input.state ?? "available",
38
+ };
39
+ let connection;
40
+ let presence;
41
+ try {
42
+ connection = await this.#connection(serverUrl);
43
+ presence = await connection.client.register({
44
+ ...registrationInput,
45
+ leaseSeconds: this.leaseSeconds,
46
+ });
47
+ }
48
+ catch (error) {
49
+ if (this.#sessionServers.get(input.sessionId) === serverUrl)
50
+ this.#sessionServers.delete(input.sessionId);
51
+ throw error;
52
+ }
53
+ const renewTimer = setInterval(() => {
54
+ void this.#renew(connection, input.sessionId);
55
+ }, Math.max(1_000, Math.floor(this.leaseSeconds * 500)));
56
+ renewTimer.unref();
57
+ connection.registrations.set(input.sessionId, { input: registrationInput, presence, renewTimer });
58
+ return toRemotePeer(serverUrl, presence);
59
+ }
60
+ async unadvertise(serverUrl, sessionId) {
61
+ const normalized = normalizeRemoteServerUrl(serverUrl);
62
+ const pending = this.#connections.get(normalized);
63
+ if (pending === undefined)
64
+ return;
65
+ const connection = await pending;
66
+ const registration = connection.registrations.get(sessionId);
67
+ if (registration === undefined)
68
+ return;
69
+ connection.registrations.delete(sessionId);
70
+ this.#sessionServers.delete(sessionId);
71
+ clearInterval(registration.renewTimer);
72
+ await connection.client.unregister(registration.presence.routeId);
73
+ }
74
+ async discover(serverUrl, input = {}, excludeSessionId) {
75
+ this.#assertOpen();
76
+ const normalized = normalizeRemoteServerUrl(serverUrl);
77
+ const connection = await this.#connection(normalized);
78
+ const agents = await connection.client.discover(input);
79
+ return agents
80
+ .filter(({ sessionId }) => sessionId !== excludeSessionId)
81
+ .map((presence) => toRemotePeer(normalized, presence));
82
+ }
83
+ serverForSession(sessionId) {
84
+ return this.#sessionServers.get(sessionId) ?? null;
85
+ }
86
+ async discoverForSession(sessionId, input = {}) {
87
+ const serverUrl = this.serverForSession(sessionId);
88
+ if (serverUrl === null)
89
+ throw new Error("calling session is not connected to a remote Portal server");
90
+ return this.discover(serverUrl, input, sessionId);
91
+ }
92
+ async sendEnvelope(serverUrl, envelope) {
93
+ this.#assertOpen();
94
+ return (await this.#connection(normalizeRemoteServerUrl(serverUrl))).client.sendEnvelope(envelope);
95
+ }
96
+ onEnvelope(handler) {
97
+ this.#envelopeHandlers.add(handler);
98
+ return () => this.#envelopeHandlers.delete(handler);
99
+ }
100
+ localRoute(serverUrl, sessionId) {
101
+ const pending = this.#connections.get(normalizeRemoteServerUrl(serverUrl));
102
+ return pending === undefined
103
+ ? Promise.resolve(null)
104
+ : pending.then((connection) => connection.registrations.get(sessionId)?.presence ?? null);
105
+ }
106
+ async localSessionForRoute(serverUrl, routeId) {
107
+ const pending = this.#connections.get(normalizeRemoteServerUrl(serverUrl));
108
+ if (pending === undefined)
109
+ return null;
110
+ const connection = await pending;
111
+ for (const [sessionId, registration] of connection.registrations) {
112
+ if (registration.presence.routeId === routeId)
113
+ return sessionId;
114
+ }
115
+ return null;
116
+ }
117
+ async peerByRoute(serverUrl, routeId) {
118
+ const peers = await this.discover(serverUrl, { limit: 100 });
119
+ return peers.find((peer) => peer.routeId === routeId) ?? null;
120
+ }
121
+ async acknowledge(serverUrl, input) {
122
+ this.#assertOpen();
123
+ await (await this.#connection(normalizeRemoteServerUrl(serverUrl))).client.acknowledge(input);
124
+ }
125
+ async close() {
126
+ if (this.#closed)
127
+ return;
128
+ this.#closed = true;
129
+ this.#sessionServers.clear();
130
+ const connections = await Promise.allSettled(this.#connections.values());
131
+ this.#connections.clear();
132
+ await Promise.all(connections.flatMap((result) => {
133
+ if (result.status === "rejected")
134
+ return [];
135
+ for (const registration of result.value.registrations.values())
136
+ clearInterval(registration.renewTimer);
137
+ for (const unsubscribe of result.value.unsubscribers)
138
+ unsubscribe();
139
+ return [result.value.client.close()];
140
+ }));
141
+ }
142
+ async #connection(url) {
143
+ const existing = this.#connections.get(url);
144
+ if (existing !== undefined)
145
+ return existing;
146
+ const pending = this.#openConnection(url);
147
+ this.#connections.set(url, pending);
148
+ try {
149
+ return await pending;
150
+ }
151
+ catch (error) {
152
+ if (this.#connections.get(url) === pending)
153
+ this.#connections.delete(url);
154
+ throw error;
155
+ }
156
+ }
157
+ async #openConnection(url) {
158
+ const client = await this.#clientFactory(url, {
159
+ clientId: this.clientId,
160
+ installationId: this.installationId,
161
+ });
162
+ const connection = {
163
+ url,
164
+ client,
165
+ registrations: new Map(),
166
+ unsubscribers: [],
167
+ deliveryQueue: Promise.resolve(),
168
+ };
169
+ connection.unsubscribers.push(client.onEnvelope((envelope) => {
170
+ // Keep task events ordered without blocking transport responses needed by acknowledgements.
171
+ connection.deliveryQueue = connection.deliveryQueue.then(async () => {
172
+ await this.#onEnvelope?.(url, envelope);
173
+ for (const handler of [...this.#envelopeHandlers])
174
+ await handler(url, envelope);
175
+ }).catch((error) => this.#onError?.(url, asError(error)));
176
+ }), client.onError((error) => this.#onError?.(url, error)), client.onStateChange((state) => {
177
+ if (state === "connected")
178
+ void this.#restoreRegistrations(connection);
179
+ }));
180
+ return connection;
181
+ }
182
+ async #renew(connection, sessionId) {
183
+ const registration = connection.registrations.get(sessionId);
184
+ if (registration === undefined || connection.client.state !== "connected")
185
+ return;
186
+ try {
187
+ registration.presence = await connection.client.renew({
188
+ routeId: registration.presence.routeId,
189
+ state: registration.input.state,
190
+ leaseSeconds: this.leaseSeconds,
191
+ });
192
+ }
193
+ catch (error) {
194
+ this.#onError?.(connection.url, asError(error));
195
+ }
196
+ }
197
+ async #restoreRegistrations(connection) {
198
+ for (const [sessionId, registration] of connection.registrations) {
199
+ try {
200
+ registration.presence = await connection.client.register({
201
+ ...registration.input,
202
+ leaseSeconds: this.leaseSeconds,
203
+ });
204
+ }
205
+ catch (error) {
206
+ this.#onError?.(connection.url, asError(error));
207
+ if (connection.client.state !== "connected")
208
+ return;
209
+ }
210
+ if (!connection.registrations.has(sessionId))
211
+ return;
212
+ }
213
+ }
214
+ #assertOpen() {
215
+ if (this.#closed)
216
+ throw new Error("remote coordinator is closed");
217
+ }
218
+ }
219
+ function toRemotePeer(serverUrl, presence) {
220
+ return { ...presence, serverUrl, authenticated: false };
221
+ }
222
+ function asError(value) {
223
+ return value instanceof Error ? value : new Error(String(value));
224
+ }
225
+ //# sourceMappingURL=coordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../../src/network/coordinator.ts"],"names":[],"mappings":"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"}