@hanphone/dsh-a2a 0.2.0 → 0.3.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 (78) hide show
  1. package/README.md +106 -106
  2. package/README.zh.md +50 -74
  3. package/cordis.patch.yml +4 -7
  4. package/lib/client.js +186 -73
  5. package/lib/index.js +1275 -868
  6. package/lib/types/api.d.ts +30 -23
  7. package/lib/types/api.d.ts.map +1 -1
  8. package/lib/types/api.js +56 -23
  9. package/lib/types/api.js.map +1 -1
  10. package/lib/types/client/index.d.ts +50 -19
  11. package/lib/types/client/index.d.ts.map +1 -1
  12. package/lib/types/commands.d.ts +4 -2
  13. package/lib/types/commands.d.ts.map +1 -1
  14. package/lib/types/commands.js +59 -46
  15. package/lib/types/commands.js.map +1 -1
  16. package/lib/types/events.d.ts +32 -9
  17. package/lib/types/events.d.ts.map +1 -1
  18. package/lib/types/index.d.ts +21 -32
  19. package/lib/types/index.d.ts.map +1 -1
  20. package/lib/types/index.js +177 -272
  21. package/lib/types/index.js.map +1 -1
  22. package/lib/types/outbound/calls.d.ts.map +1 -1
  23. package/lib/types/outbound/calls.js +8 -6
  24. package/lib/types/outbound/calls.js.map +1 -1
  25. package/lib/types/protocol.d.ts +174 -109
  26. package/lib/types/protocol.d.ts.map +1 -1
  27. package/lib/types/protocol.js +58 -34
  28. package/lib/types/protocol.js.map +1 -1
  29. package/lib/types/server/a2a-server.d.ts +4 -0
  30. package/lib/types/server/a2a-server.d.ts.map +1 -1
  31. package/lib/types/server/a2a-server.js +6 -2
  32. package/lib/types/server/a2a-server.js.map +1 -1
  33. package/lib/types/server/card.d.ts +6 -30
  34. package/lib/types/server/card.d.ts.map +1 -1
  35. package/lib/types/server/card.js +13 -49
  36. package/lib/types/server/card.js.map +1 -1
  37. package/lib/types/server/exec/agent-runtime.d.ts +20 -0
  38. package/lib/types/server/exec/agent-runtime.d.ts.map +1 -1
  39. package/lib/types/server/exec/agent-runtime.js +2 -1
  40. package/lib/types/server/exec/agent-runtime.js.map +1 -1
  41. package/lib/types/server/routes.d.ts +5 -1
  42. package/lib/types/server/routes.d.ts.map +1 -1
  43. package/lib/types/server/routes.js +9 -5
  44. package/lib/types/server/routes.js.map +1 -1
  45. package/lib/types/server/store.d.ts +32 -0
  46. package/lib/types/server/store.d.ts.map +1 -1
  47. package/lib/types/server/store.js +10 -0
  48. package/lib/types/server/store.js.map +1 -1
  49. package/lib/types/servers/inbound-manager.d.ts +154 -0
  50. package/lib/types/servers/inbound-manager.d.ts.map +1 -0
  51. package/lib/types/servers/inbound-manager.js +335 -0
  52. package/lib/types/servers/inbound-manager.js.map +1 -0
  53. package/lib/types/servers/outbound-manager.d.ts +129 -0
  54. package/lib/types/servers/outbound-manager.d.ts.map +1 -0
  55. package/lib/types/servers/outbound-manager.js +238 -0
  56. package/lib/types/servers/outbound-manager.js.map +1 -0
  57. package/lib/types/service.d.ts +104 -40
  58. package/lib/types/service.d.ts.map +1 -1
  59. package/lib/types/service.js +36 -27
  60. package/lib/types/service.js.map +1 -1
  61. package/package.json +2 -2
  62. package/src/api.ts +65 -53
  63. package/src/client/index.ts +272 -148
  64. package/src/commands.ts +59 -43
  65. package/src/events.ts +14 -7
  66. package/src/index.ts +203 -310
  67. package/src/outbound/calls.ts +8 -6
  68. package/src/protocol.ts +204 -95
  69. package/src/server/a2a-server.ts +9 -2
  70. package/src/server/card.ts +13 -62
  71. package/src/server/exec/agent-runtime.ts +20 -2
  72. package/src/server/routes.ts +6 -4
  73. package/src/server/store.ts +42 -3
  74. package/src/servers/inbound-manager.ts +416 -0
  75. package/src/servers/outbound-manager.ts +289 -0
  76. package/src/service.ts +125 -40
  77. package/lib/tsconfig.client.tsbuildinfo +0 -1
  78. package/lib/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,335 @@
1
+ /**
2
+ * Inbound server manager: owns every inbound A2A server instance. Each
3
+ * instance binds one concrete agent preset (its session pool is composed from
4
+ * that preset) and serves its own endpoint and AgentCard route. Instances are
5
+ * persisted in the `inbound_servers` domain table and assembled on boot; the
6
+ * manager owns route registration and the full lifecycle
7
+ * (add/enable/disable/update/remove) driven from the GUI and facade, and
8
+ * disposes every instance's environment on teardown.
9
+ *
10
+ * Skill declaration is DERIVED, never typed: "the preset decides its skills;
11
+ * everything is a plugin." An instance's AgentCard skills are the
12
+ * model-invocable entries of its preset's skill directory — the preset's
13
+ * standing scope key (`agentPresets.standingKeyFor`) plus
14
+ * `ctx.skills.list({ scope })` — resolved automatically at add/update/boot
15
+ * and cached on the live instance; the creator types no skill text. A missing
16
+ * skills service or standing mount falls back to a built-in `chat` skill so
17
+ * minimal compositions stay exercisable.
18
+ * @module dsh-a2a/servers/inbound-manager
19
+ */
20
+ import { buildCard } from "../server/card.js";
21
+ import { A2AServer } from "../server/a2a-server.js";
22
+ import { A2aRoutes } from "../server/routes.js";
23
+ import { ContextSessionPool } from "../server/exec/agent-runtime.js";
24
+ import { createSessionExecutor } from "../server/exec/session.js";
25
+ import { createSubagentExecutor } from "../server/exec/subagent.js";
26
+ import { ExecutorSet } from "../server/executor.js";
27
+ import { LiveInboundRegistry } from "../server/inbound-registry.js";
28
+ function refuseExecutor(reason) {
29
+ return {
30
+ name: 'refuse',
31
+ async execute() {
32
+ throw new Error(`a2a: ${reason}; refusing inbound task`);
33
+ },
34
+ };
35
+ }
36
+ /** Built-in fallback skill when no skills service / standing mount exists. */
37
+ export function chatFallbackSkills() {
38
+ return [{ id: 'chat', name: 'chat', description: 'Conversational assistance over a DSH agent session.', tags: ['chat'] }];
39
+ }
40
+ /**
41
+ * Derive an instance's AgentCard skills from its preset's skill directory.
42
+ *
43
+ * `agentPresets.standingKeyFor(preset)` yields the preset's standing scope
44
+ * key (no agent required); `ctx.skills.list({ scope })` returns the catalogue
45
+ * that preset agent actually sees (its layer + the deployment global). Only
46
+ * model-invocable entries are advertised, mapped to `AgentSkill` (id = name,
47
+ * name = name). Any missing service, failed mount, or empty catalogue falls
48
+ * back to the built-in `chat` skill.
49
+ *
50
+ * @param agentPresets - the preset roster, or undefined.
51
+ * @param skills - the skill registry, or undefined.
52
+ * @param preset - the instance's preset id; undefined = deployment default.
53
+ */
54
+ export async function derivePresetSkills(agentPresets, skills, preset) {
55
+ if (agentPresets?.standingKeyFor === undefined || skills === undefined)
56
+ return chatFallbackSkills();
57
+ try {
58
+ const scope = await agentPresets.standingKeyFor(preset);
59
+ const rows = await skills.list({ scope });
60
+ const advertised = rows
61
+ .filter((row) => row.invocation?.modelInvocable !== false)
62
+ .map((row) => ({
63
+ id: row.name,
64
+ name: row.name,
65
+ ...(row.description !== undefined && row.description.length > 0 ? { description: row.description } : {}),
66
+ }));
67
+ return advertised.length > 0 ? advertised : chatFallbackSkills();
68
+ }
69
+ catch {
70
+ return chatFallbackSkills();
71
+ }
72
+ }
73
+ /** Assemble one live instance (skills already derived from the preset). */
74
+ function assemble(record, skills, host) {
75
+ const endpointPath = record.endpointPath;
76
+ const cardPath = `${endpointPath.replace(/\/$/, '')}/agent-card.json`;
77
+ const preset = record.preset ?? host.defaultPresetId;
78
+ const card = buildCard({
79
+ baseUrl: host.defaultBaseUrl,
80
+ endpointPath,
81
+ name: record.name,
82
+ description: record.description,
83
+ version: record.version,
84
+ skills,
85
+ ...(record.authTokenEnv !== undefined && process.env[record.authTokenEnv] !== undefined
86
+ ? { authToken: process.env[record.authTokenEnv] }
87
+ : {}),
88
+ });
89
+ // One preset-bound session pool per instance.
90
+ const sessionPool = host.agents
91
+ ? new ContextSessionPool(host.agents, {
92
+ cwd: host.sessionCwd,
93
+ ...(host.agentPresets !== undefined ? { agentPresets: host.agentPresets } : {}),
94
+ ...(preset !== undefined ? { presetId: () => preset } : {}),
95
+ // `?.()` yields `{ provider?, model? } | undefined`, matching the
96
+ // AgentRuntimeOptions.resolveAgentOptions signature under
97
+ // exactOptionalPropertyTypes.
98
+ resolveAgentOptions: () => host.resolveDefaultModel?.(),
99
+ })
100
+ : undefined;
101
+ const sessionExecutor = sessionPool ? createSessionExecutor(sessionPool) : refuseExecutor('no agent loop mounted');
102
+ const subagentExecutor = sessionPool !== undefined && host.subagents !== undefined
103
+ ? createSubagentExecutor({ pool: sessionPool, subagents: host.subagents, provider: host.subagentProvider })
104
+ : undefined;
105
+ const executors = new ExecutorSet({ chat: 'session' }, sessionExecutor, subagentExecutor);
106
+ const inbound = new LiveInboundRegistry();
107
+ const skillIds = new Set(skills.map((s) => s.id));
108
+ const gate = async (input) => {
109
+ if (!skillIds.has(input.skill)) {
110
+ return { ok: false, reason: `unknown skill "${input.skill}"` };
111
+ }
112
+ const decision = {
113
+ contextId: input.contextId,
114
+ skill: input.skill,
115
+ parts: input.parts,
116
+ remotePeerId: input.remotePeerId,
117
+ };
118
+ const decided = await host.ctx.waterfall('a2a/inbound-task', decision, async (d) => d);
119
+ host.logger.info(`[a2a:${record.id}] inbound skill=${decided.skill} rejected=${decided.rejected?.reason ?? 'no'}`);
120
+ if (decided.rejected !== undefined)
121
+ return { ok: false, reason: decided.rejected.reason };
122
+ return { ok: true };
123
+ };
124
+ const server = new A2AServer({
125
+ card,
126
+ store: host.tasks,
127
+ executors,
128
+ ...(card.securitySchemes !== undefined ? { authToken: 'configured' } : {}),
129
+ cardPath,
130
+ gate,
131
+ onInbound: (facts) => inbound.note({
132
+ method: facts.method,
133
+ ...(facts.source !== undefined ? { source: facts.source } : {}),
134
+ taskIds: facts.taskIds,
135
+ streaming: facts.streaming,
136
+ }),
137
+ onTaskSettled: (taskId) => {
138
+ host.logger.info(`[a2a:${record.id}] task settled ${taskId}`);
139
+ inbound.settle(taskId);
140
+ },
141
+ });
142
+ const routes = new A2aRoutes(host.webServer, server, cardPath);
143
+ return {
144
+ id: record.id,
145
+ record,
146
+ preset,
147
+ skills,
148
+ card,
149
+ server,
150
+ routes,
151
+ inbound,
152
+ executors,
153
+ endpointPath,
154
+ cardPath,
155
+ dispose: () => {
156
+ routes.dispose();
157
+ void executors.disposeAll().catch(() => { });
158
+ },
159
+ };
160
+ }
161
+ /** Persisted-instance store over the inbound_servers table. */
162
+ export class DomainInboundStore {
163
+ table;
164
+ static KEY(id) {
165
+ return `in:${id}`;
166
+ }
167
+ constructor(table) {
168
+ this.table = table;
169
+ }
170
+ list() {
171
+ const out = [];
172
+ const entries = this.table.entries;
173
+ if (entries === undefined)
174
+ return out;
175
+ // Call through the table (method `this` stays bound); the real KvTable's
176
+ // `entries()` reads instance state.
177
+ for (const [key, raw] of entries.call(this.table)) {
178
+ if (!key.startsWith('in:'))
179
+ continue;
180
+ const parsed = safeParse(raw);
181
+ if (parsed !== undefined)
182
+ out.push(parsed);
183
+ }
184
+ return out;
185
+ }
186
+ get(id) {
187
+ const raw = this.table.get(DomainInboundStore.KEY(id));
188
+ return raw === undefined ? undefined : safeParse(raw);
189
+ }
190
+ async save(record) {
191
+ await this.table.put(DomainInboundStore.KEY(record.id), JSON.stringify(record));
192
+ }
193
+ async remove(id) {
194
+ await this.table.put(DomainInboundStore.KEY(id), '');
195
+ }
196
+ }
197
+ function safeParse(raw) {
198
+ try {
199
+ const parsed = JSON.parse(raw);
200
+ if (typeof parsed.id !== 'string' || typeof parsed.name !== 'string')
201
+ return undefined;
202
+ return parsed;
203
+ }
204
+ catch {
205
+ return undefined;
206
+ }
207
+ }
208
+ /** Manages the live set of inbound server instances. */
209
+ export class InboundServerManager {
210
+ host;
211
+ store;
212
+ live = new Map();
213
+ constructor(host, store) {
214
+ this.host = host;
215
+ this.store = store;
216
+ }
217
+ /** Assemble every persisted instance (skills derived per preset). */
218
+ async boot() {
219
+ for (const record of this.store.list()) {
220
+ try {
221
+ const skills = await derivePresetSkills(this.host.agentPresets, this.host.skills, record.preset ?? this.host.defaultPresetId);
222
+ const live = assemble(record, skills, this.host);
223
+ this.live.set(record.id, live);
224
+ if (record.enabled)
225
+ live.routes.enable();
226
+ }
227
+ catch (err) {
228
+ this.host.logger.error(`[a2a:${record.id}] failed to assemble: ${String(err.message)}`);
229
+ }
230
+ }
231
+ }
232
+ list() {
233
+ return [...this.live.values()];
234
+ }
235
+ get(id) {
236
+ return this.live.get(id);
237
+ }
238
+ /** Create, persist, and assemble a new inbound instance. */
239
+ async add(input) {
240
+ const id = this.newId(input.name);
241
+ if (this.live.has(id))
242
+ return { ok: false, message: `inbound server ${id} already exists` };
243
+ const preset = input.preset ?? this.host.defaultPresetId;
244
+ const record = {
245
+ id,
246
+ name: input.name,
247
+ description: input.description,
248
+ version: input.version,
249
+ endpointPath: input.endpointPath ?? `/a2a/${id}`,
250
+ ...(preset !== undefined ? { preset } : {}),
251
+ ...(input.authTokenEnv !== undefined ? { authTokenEnv: input.authTokenEnv } : {}),
252
+ enabled: input.enabled ?? true,
253
+ };
254
+ try {
255
+ const skills = await derivePresetSkills(this.host.agentPresets, this.host.skills, preset);
256
+ const live = assemble(record, skills, this.host);
257
+ await this.store.save(record);
258
+ this.live.set(id, live);
259
+ if (record.enabled)
260
+ live.routes.enable();
261
+ return { ok: true, message: `inbound server "${record.name}" created`, id };
262
+ }
263
+ catch (err) {
264
+ return { ok: false, message: `failed to create inbound server: ${String(err.message)}` };
265
+ }
266
+ }
267
+ /** Persist, rebuild (re-deriving skills), and apply a patch onto a live instance. */
268
+ async update(id, patch) {
269
+ const live = this.live.get(id);
270
+ const stored = this.store.get(id);
271
+ if (live === undefined || stored === undefined)
272
+ return { ok: false, message: `inbound server ${id} not found` };
273
+ const next = {
274
+ ...stored,
275
+ name: patch.name ?? stored.name,
276
+ description: patch.description ?? stored.description,
277
+ version: patch.version ?? stored.version,
278
+ endpointPath: patch.endpointPath ?? stored.endpointPath,
279
+ ...(patch.preset !== undefined ? { preset: patch.preset } : {}),
280
+ ...(patch.authTokenEnv !== undefined ? { authTokenEnv: patch.authTokenEnv } : {}),
281
+ enabled: stored.enabled,
282
+ };
283
+ try {
284
+ await this.store.save(next);
285
+ const skills = await derivePresetSkills(this.host.agentPresets, this.host.skills, next.preset ?? this.host.defaultPresetId);
286
+ const replaced = assemble(next, skills, this.host);
287
+ // Preserve the route registration state while swapping runtime halves.
288
+ const wasEnabled = live.routes.active;
289
+ live.dispose();
290
+ this.live.set(id, replaced);
291
+ if (wasEnabled || next.enabled)
292
+ replaced.routes.enable();
293
+ return { ok: true, message: `inbound server ${id} updated` };
294
+ }
295
+ catch (err) {
296
+ return { ok: false, message: `failed to update inbound server: ${String(err.message)}` };
297
+ }
298
+ }
299
+ /** Enable/disable an instance's routes. */
300
+ setEnabled(id, enabled) {
301
+ const live = this.live.get(id);
302
+ if (live === undefined)
303
+ return { ok: false, message: `inbound server ${id} not found` };
304
+ if (enabled)
305
+ live.routes.enable();
306
+ else
307
+ live.routes.disable();
308
+ const stored = this.store.get(id);
309
+ if (stored !== undefined) {
310
+ void this.store.save({ ...stored, enabled }).catch(() => { });
311
+ }
312
+ return { ok: true, message: `inbound server ${id} ${enabled ? 'enabled' : 'disabled'}` };
313
+ }
314
+ /** Remove, dispose, and unpersist an instance. */
315
+ async remove(id) {
316
+ const live = this.live.get(id);
317
+ if (live === undefined)
318
+ return { ok: false, message: `inbound server ${id} not found` };
319
+ live.dispose();
320
+ this.live.delete(id);
321
+ await this.store.remove(id);
322
+ return { ok: true, message: `inbound server ${id} removed` };
323
+ }
324
+ /** Dispose every instance. */
325
+ disposeAll() {
326
+ for (const live of this.live.values())
327
+ live.dispose();
328
+ this.live.clear();
329
+ }
330
+ newId(seed) {
331
+ const slug = seed.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '') || 'server';
332
+ return `${slug}-${this.host.newId()}`;
333
+ }
334
+ }
335
+ //# sourceMappingURL=inbound-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbound-manager.js","sourceRoot":"","sources":["../../../src/servers/inbound-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Outbound server manager: owns every outbound A2A connection instance. Each
3
+ * instance is one connected remote — its own AgentCard URL, auth env, timeout,
4
+ * creator-declared name, and an optional agent-preset binding. Each live
5
+ * instance is one `OutboundAgentRegistry` with an isolated per-instance agent
6
+ * store; enabled instances map their remote skills to `a2a__<name>__<skill>`
7
+ * model tools. The manager owns the full lifecycle (add/enable/disable/remove/
8
+ * refresh) driven from the GUI and facade, persists each instance in the
9
+ * `outbound_servers` domain table, and disposes every connection on teardown.
10
+ *
11
+ * The `preset` field names the agent preset this DSH would compose its local
12
+ * hand-off session with when driving that remote. P0 connects skills to tools
13
+ * and manages the connection; the hand-off session composition behind `preset`
14
+ * is a documented extension point (the outbound tools currently call the
15
+ * remote directly) and the value is persisted metadata surfaced to the GUI.
16
+ * @module dsh-a2a/servers/outbound-manager
17
+ */
18
+ import { OutboundAgentRegistry, type AgentStore } from '../outbound/registry.ts';
19
+ import type { OutboundAgentRecord, OutboundServerRecord } from '../server/store.ts';
20
+ /** Tool-registrar slice (structural `ctx.tools.register`). */
21
+ export interface ToolRegistrar {
22
+ register(def: unknown): (() => void) | void;
23
+ }
24
+ /** Host slices one manager needs. */
25
+ export interface OutboundManagerHost {
26
+ readonly registrar: ToolRegistrar;
27
+ readonly tokenOf: (env: string | undefined) => string | undefined;
28
+ readonly onError: (message: string) => void;
29
+ readonly defaultTimeoutMs: number;
30
+ }
31
+ export interface OpResult {
32
+ readonly ok: boolean;
33
+ readonly message: string;
34
+ }
35
+ /** One outbound instance as the GUI/facade reads it. */
36
+ export interface OutboundServerView {
37
+ readonly id: string;
38
+ readonly name: string;
39
+ readonly agentCardUrl: string;
40
+ readonly preset?: string;
41
+ readonly enabled: boolean;
42
+ readonly timeoutMs: number;
43
+ readonly state: 'connected' | 'disconnected' | 'failed';
44
+ readonly skillCount: number;
45
+ readonly toolCount: number;
46
+ readonly lastError?: string;
47
+ }
48
+ /** An `AgentStore` bound to one outbound server instance's agents-table key. */
49
+ export declare class ServerAgentStore implements AgentStore {
50
+ private readonly table;
51
+ private readonly key;
52
+ constructor(table: {
53
+ get(key: string): string | undefined;
54
+ put(key: string, value: string): Promise<void>;
55
+ }, key: string);
56
+ list(): OutboundAgentRecord[];
57
+ save(records: readonly OutboundAgentRecord[]): Promise<void>;
58
+ }
59
+ /** Persisted-instance store over the outbound_servers table. */
60
+ export declare class DomainOutboundStore {
61
+ private readonly table;
62
+ private static KEY;
63
+ constructor(table: {
64
+ get(key: string): string | undefined;
65
+ put(key: string, value: string): Promise<void>;
66
+ entries?(): IterableIterator<[string, string]>;
67
+ });
68
+ list(): OutboundServerRecord[];
69
+ get(id: string): OutboundServerRecord | undefined;
70
+ save(record: OutboundServerRecord): Promise<void>;
71
+ remove(id: string): Promise<void>;
72
+ }
73
+ /** Creator input for a new outbound instance (id optional; manager allocates). */
74
+ export interface OutboundCreateInput {
75
+ readonly id?: string;
76
+ readonly name: string;
77
+ readonly agentCardUrl: string;
78
+ readonly bearerTokenEnv?: string;
79
+ readonly preset?: string;
80
+ readonly enabled?: boolean;
81
+ readonly timeoutMs?: number;
82
+ }
83
+ /** Manages the live set of outbound connection instances. */
84
+ export declare class OutboundServerManager {
85
+ private readonly host;
86
+ /** Persistence sink for each instance's agent records (the `agents` table). */
87
+ private readonly agentSink;
88
+ /** Persisted OutboundServerRecord store (the `outbound_servers` table). */
89
+ private readonly records;
90
+ /** Allocate a fresh stable instance id. */
91
+ private readonly newId;
92
+ private readonly registries;
93
+ constructor(host: OutboundManagerHost,
94
+ /** Persistence sink for each instance's agent records (the `agents` table). */
95
+ agentSink: {
96
+ get(key: string): string | undefined;
97
+ put(key: string, value: string): Promise<void>;
98
+ },
99
+ /** Persisted OutboundServerRecord store (the `outbound_servers` table). */
100
+ records: DomainOutboundStore,
101
+ /** Allocate a fresh stable instance id. */
102
+ newId: () => string);
103
+ /** The host default connection timeout (what a minimal record falls back to). */
104
+ get defaultTimeoutMs(): number;
105
+ private agentKeyFor;
106
+ private makeRegistry;
107
+ /** Record → registry spec for connecting one instance. */
108
+ private toSpec;
109
+ /** Boot every persisted enabled instance as a connected registry. */
110
+ boot(): void;
111
+ /** One view per live instance (enriched from its registry / record). */
112
+ list(): readonly OutboundServerView[];
113
+ get(id: string): OutboundServerRegistryHandle | undefined;
114
+ private viewFor;
115
+ /** Create, persist, and connect a new outbound instance. */
116
+ add(input: OutboundCreateInput): Promise<OpResult & {
117
+ readonly id?: string;
118
+ }>;
119
+ setEnabled(id: string, enabled: boolean): Promise<OpResult>;
120
+ remove(id: string): Promise<OpResult>;
121
+ refresh(id: string): Promise<OpResult>;
122
+ disposeAll(): Promise<void>;
123
+ }
124
+ /** Handle to one live outbound connection (registry + derived view). */
125
+ export interface OutboundServerRegistryHandle {
126
+ readonly id: string;
127
+ readonly registry: OutboundAgentRegistry;
128
+ }
129
+ //# sourceMappingURL=outbound-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbound-manager.d.ts","sourceRoot":"","sources":["../../../src/servers/outbound-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,qBAAqB,EAAE,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAChF,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAEnF,8DAA8D;AAC9D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAA;CAC5C;AAED,qCAAqC;AACrC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAA;IACjC,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,GAAG,SAAS,CAAA;IACjE,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;CAClC;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,wDAAwD;AACxD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,cAAc,GAAG,QAAQ,CAAA;IACvD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,gFAAgF;AAChF,qBAAa,gBAAiB,YAAW,UAAU;IAE/C,OAAO,CAAC,QAAQ,CAAC,KAAK;IAItB,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAJH,KAAK,EAAE;QACtB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;QACpC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;KAC/C,EACgB,GAAG,EAAE,MAAM;IAG9B,IAAI,IAAI,mBAAmB,EAAE;IAWvB,IAAI,CAAC,OAAO,EAAE,SAAS,mBAAmB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAGnE;AAED,gEAAgE;AAChE,qBAAa,mBAAmB;IAKlB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJlC,OAAO,CAAC,MAAM,CAAC,GAAG;gBAIW,KAAK,EAAE;QAClC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;QACpC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QAC9C,OAAO,CAAC,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;KAC/C;IAED,IAAI,IAAI,oBAAoB,EAAE;IAc9B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS;IAK3C,IAAI,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGxC;AAYD,kFAAkF;AAClF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,6DAA6D;AAC7D,qBAAa,qBAAqB;IAI9B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,+EAA+E;IAC/E,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,2EAA2E;IAC3E,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,2CAA2C;IAC3C,OAAO,CAAC,QAAQ,CAAC,KAAK;IATxB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA2C;gBAGnD,IAAI,EAAE,mBAAmB;IAC1C,+EAA+E;IAC9D,SAAS,EAAE;QAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;QAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE;IACpH,2EAA2E;IAC1D,OAAO,EAAE,mBAAmB;IAC7C,2CAA2C;IAC1B,KAAK,EAAE,MAAM,MAAM;IAGtC,iFAAiF;IACjF,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,YAAY;IAWpB,0DAA0D;IAC1D,OAAO,CAAC,MAAM;IAUd,qEAAqE;IACrE,IAAI,IAAI,IAAI;IAYZ,wEAAwE;IACxE,IAAI,IAAI,SAAS,kBAAkB,EAAE;IAIrC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,4BAA4B,GAAG,SAAS;IAKzD,OAAO,CAAC,OAAO;IAmBf,4DAA4D;IACtD,GAAG,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,GAAG;QAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAqB7E,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IAU3D,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAWrC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAQtC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAIlC;AAED,wEAAwE;AACxE,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAA;CACzC"}