@valon-technologies/gestalt 0.0.1-alpha.12 → 0.0.1-alpha.14
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.
- package/README.md +1 -1
- package/gen/google/rpc/status_pb.ts +76 -0
- package/gen/v1/agent_pb.ts +2412 -0
- package/gen/v1/authentication_pb.ts +1 -1
- package/gen/v1/authorization_pb.ts +28 -28
- package/gen/v1/cache_pb.ts +4 -4
- package/gen/v1/datastore_pb.ts +467 -12
- package/gen/v1/external_credential_pb.ts +274 -0
- package/gen/v1/plugin_pb.ts +64 -42
- package/gen/v1/pluginruntime_pb.ts +632 -0
- package/gen/v1/runtime_pb.ts +46 -3
- package/gen/v1/s3_pb.ts +120 -20
- package/gen/v1/secrets_pb.ts +1 -1
- package/gen/v1/workflow_pb.ts +849 -97
- package/package.json +5 -3
- package/src/agent-manager.ts +247 -0
- package/src/agent.ts +645 -0
- package/src/api.ts +4 -1
- package/src/authorization.ts +88 -18
- package/src/index.ts +134 -16
- package/src/indexeddb.ts +481 -1
- package/src/invoker.ts +3 -0
- package/src/plugin.ts +81 -181
- package/src/pluginruntime.ts +220 -0
- package/src/provider-kind.ts +12 -0
- package/src/provider.ts +28 -1
- package/src/runtime-log-host.ts +244 -0
- package/src/runtime.ts +194 -67
- package/src/s3.ts +170 -38
- package/src/telemetry.ts +429 -0
- package/src/workflow-manager.ts +78 -9
- package/src/manifest-metadata.ts +0 -106
package/src/agent.ts
ADDED
|
@@ -0,0 +1,645 @@
|
|
|
1
|
+
import {
|
|
2
|
+
create,
|
|
3
|
+
fromJson,
|
|
4
|
+
isMessage,
|
|
5
|
+
type JsonValue,
|
|
6
|
+
type MessageInitShape,
|
|
7
|
+
} from "@bufbuild/protobuf";
|
|
8
|
+
import { ValueSchema, type Value } from "@bufbuild/protobuf/wkt";
|
|
9
|
+
import {
|
|
10
|
+
Code,
|
|
11
|
+
ConnectError,
|
|
12
|
+
createClient,
|
|
13
|
+
type Client,
|
|
14
|
+
type Interceptor,
|
|
15
|
+
type ServiceImpl,
|
|
16
|
+
} from "@connectrpc/connect";
|
|
17
|
+
import { createGrpcTransport } from "@connectrpc/connect-node";
|
|
18
|
+
|
|
19
|
+
import {
|
|
20
|
+
AgentExecutionStatus,
|
|
21
|
+
AgentHost as AgentHostService,
|
|
22
|
+
AgentInteractionSchema,
|
|
23
|
+
AgentInteractionState,
|
|
24
|
+
AgentInteractionType,
|
|
25
|
+
AgentMessagePartType,
|
|
26
|
+
AgentProvider as AgentProviderService,
|
|
27
|
+
AgentProviderCapabilitiesSchema,
|
|
28
|
+
AgentSessionSchema,
|
|
29
|
+
AgentSessionState,
|
|
30
|
+
AgentToolSourceMode,
|
|
31
|
+
AgentTurnDisplaySchema,
|
|
32
|
+
AgentTurnEventSchema,
|
|
33
|
+
AgentTurnSchema,
|
|
34
|
+
GetAgentProviderCapabilitiesRequestSchema,
|
|
35
|
+
ListAgentProviderInteractionsResponseSchema,
|
|
36
|
+
ListAgentProviderSessionsResponseSchema,
|
|
37
|
+
ListAgentProviderTurnEventsResponseSchema,
|
|
38
|
+
ListAgentProviderTurnsResponseSchema,
|
|
39
|
+
type AgentActor,
|
|
40
|
+
type AgentInteraction,
|
|
41
|
+
type AgentMessage,
|
|
42
|
+
type AgentMessagePart,
|
|
43
|
+
type AgentMessagePartImageRef,
|
|
44
|
+
type AgentMessagePartToolCall,
|
|
45
|
+
type AgentMessagePartToolResult,
|
|
46
|
+
type AgentProviderCapabilities,
|
|
47
|
+
type AgentSession,
|
|
48
|
+
type AgentToolRef,
|
|
49
|
+
type AgentTurn,
|
|
50
|
+
type AgentTurnDisplay,
|
|
51
|
+
type AgentTurnEvent,
|
|
52
|
+
type CancelAgentProviderTurnRequest,
|
|
53
|
+
type CreateAgentProviderSessionRequest,
|
|
54
|
+
type CreateAgentProviderTurnRequest,
|
|
55
|
+
type ExecuteAgentToolRequest,
|
|
56
|
+
type ExecuteAgentToolResponse,
|
|
57
|
+
type GetAgentProviderCapabilitiesRequest,
|
|
58
|
+
type GetAgentProviderInteractionRequest,
|
|
59
|
+
type GetAgentProviderSessionRequest,
|
|
60
|
+
type GetAgentProviderTurnRequest,
|
|
61
|
+
type ListAgentToolsRequest,
|
|
62
|
+
type ListAgentToolsResponse,
|
|
63
|
+
type ListAgentProviderInteractionsRequest,
|
|
64
|
+
type ListAgentProviderSessionsRequest,
|
|
65
|
+
type ListAgentProviderTurnEventsRequest,
|
|
66
|
+
type ListAgentProviderTurnsRequest,
|
|
67
|
+
type ListedAgentTool,
|
|
68
|
+
type ResolveAgentProviderInteractionRequest,
|
|
69
|
+
type ResolvedAgentTool,
|
|
70
|
+
type SearchAgentToolsRequest,
|
|
71
|
+
type SearchAgentToolsResponse,
|
|
72
|
+
type UpdateAgentProviderSessionRequest,
|
|
73
|
+
} from "../gen/v1/agent_pb.ts";
|
|
74
|
+
import { errorMessage, type MaybePromise } from "./api.ts";
|
|
75
|
+
import { RuntimeProvider, type RuntimeProviderOptions } from "./provider.ts";
|
|
76
|
+
|
|
77
|
+
export const ENV_AGENT_HOST_SOCKET = "GESTALT_AGENT_HOST_SOCKET";
|
|
78
|
+
export const ENV_AGENT_HOST_SOCKET_TOKEN = `${ENV_AGENT_HOST_SOCKET}_TOKEN`;
|
|
79
|
+
const AGENT_HOST_RELAY_TOKEN_HEADER = "x-gestalt-host-service-relay-token";
|
|
80
|
+
|
|
81
|
+
export type {
|
|
82
|
+
AgentActor,
|
|
83
|
+
AgentInteraction,
|
|
84
|
+
AgentMessage,
|
|
85
|
+
AgentMessagePart,
|
|
86
|
+
AgentMessagePartImageRef,
|
|
87
|
+
AgentMessagePartToolCall,
|
|
88
|
+
AgentMessagePartToolResult,
|
|
89
|
+
AgentProviderCapabilities,
|
|
90
|
+
AgentSession,
|
|
91
|
+
AgentToolRef,
|
|
92
|
+
AgentTurn,
|
|
93
|
+
AgentTurnDisplay,
|
|
94
|
+
AgentTurnEvent,
|
|
95
|
+
CancelAgentProviderTurnRequest,
|
|
96
|
+
CreateAgentProviderSessionRequest,
|
|
97
|
+
CreateAgentProviderTurnRequest,
|
|
98
|
+
ExecuteAgentToolRequest,
|
|
99
|
+
ExecuteAgentToolResponse,
|
|
100
|
+
GetAgentProviderCapabilitiesRequest,
|
|
101
|
+
GetAgentProviderInteractionRequest,
|
|
102
|
+
GetAgentProviderSessionRequest,
|
|
103
|
+
GetAgentProviderTurnRequest,
|
|
104
|
+
ListAgentToolsRequest,
|
|
105
|
+
ListAgentToolsResponse,
|
|
106
|
+
ListAgentProviderInteractionsRequest,
|
|
107
|
+
ListAgentProviderSessionsRequest,
|
|
108
|
+
ListAgentProviderTurnEventsRequest,
|
|
109
|
+
ListAgentProviderTurnsRequest,
|
|
110
|
+
ListedAgentTool,
|
|
111
|
+
ResolveAgentProviderInteractionRequest,
|
|
112
|
+
ResolvedAgentTool,
|
|
113
|
+
SearchAgentToolsRequest,
|
|
114
|
+
SearchAgentToolsResponse,
|
|
115
|
+
UpdateAgentProviderSessionRequest,
|
|
116
|
+
};
|
|
117
|
+
export {
|
|
118
|
+
AgentExecutionStatus,
|
|
119
|
+
AgentInteractionState,
|
|
120
|
+
AgentInteractionType,
|
|
121
|
+
AgentMessagePartType,
|
|
122
|
+
AgentSessionState,
|
|
123
|
+
AgentToolSourceMode,
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
export type AgentTurnDisplayValue =
|
|
127
|
+
| JsonValue
|
|
128
|
+
| Value
|
|
129
|
+
| MessageInitShape<typeof ValueSchema>;
|
|
130
|
+
|
|
131
|
+
export type AgentTurnDisplayInit = Omit<
|
|
132
|
+
MessageInitShape<typeof AgentTurnDisplaySchema>,
|
|
133
|
+
"$typeName" | "input" | "output" | "error"
|
|
134
|
+
> & {
|
|
135
|
+
input?: AgentTurnDisplayValue | undefined;
|
|
136
|
+
output?: AgentTurnDisplayValue | undefined;
|
|
137
|
+
error?: AgentTurnDisplayValue | undefined;
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
export type AgentTurnEventInit = Omit<
|
|
141
|
+
MessageInitShape<typeof AgentTurnEventSchema>,
|
|
142
|
+
"$typeName" | "display"
|
|
143
|
+
> & {
|
|
144
|
+
display?: AgentTurnDisplayInit | undefined;
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
export interface AgentProviderOptions extends RuntimeProviderOptions {
|
|
148
|
+
createSession?: (
|
|
149
|
+
request: CreateAgentProviderSessionRequest,
|
|
150
|
+
) => MaybePromise<MessageInitShape<typeof AgentSessionSchema>>;
|
|
151
|
+
getSession?: (
|
|
152
|
+
request: GetAgentProviderSessionRequest,
|
|
153
|
+
) => MaybePromise<MessageInitShape<typeof AgentSessionSchema>>;
|
|
154
|
+
listSessions?: (
|
|
155
|
+
request: ListAgentProviderSessionsRequest,
|
|
156
|
+
) => MaybePromise<MessageInitShape<typeof AgentSessionSchema>[]>;
|
|
157
|
+
updateSession?: (
|
|
158
|
+
request: UpdateAgentProviderSessionRequest,
|
|
159
|
+
) => MaybePromise<MessageInitShape<typeof AgentSessionSchema>>;
|
|
160
|
+
createTurn?: (
|
|
161
|
+
request: CreateAgentProviderTurnRequest,
|
|
162
|
+
) => MaybePromise<MessageInitShape<typeof AgentTurnSchema>>;
|
|
163
|
+
getTurn?: (
|
|
164
|
+
request: GetAgentProviderTurnRequest,
|
|
165
|
+
) => MaybePromise<MessageInitShape<typeof AgentTurnSchema>>;
|
|
166
|
+
listTurns?: (
|
|
167
|
+
request: ListAgentProviderTurnsRequest,
|
|
168
|
+
) => MaybePromise<MessageInitShape<typeof AgentTurnSchema>[]>;
|
|
169
|
+
cancelTurn?: (
|
|
170
|
+
request: CancelAgentProviderTurnRequest,
|
|
171
|
+
) => MaybePromise<MessageInitShape<typeof AgentTurnSchema>>;
|
|
172
|
+
listTurnEvents?: (
|
|
173
|
+
request: ListAgentProviderTurnEventsRequest,
|
|
174
|
+
) => MaybePromise<AgentTurnEventInit[]>;
|
|
175
|
+
getInteraction?: (
|
|
176
|
+
request: GetAgentProviderInteractionRequest,
|
|
177
|
+
) => MaybePromise<MessageInitShape<typeof AgentInteractionSchema>>;
|
|
178
|
+
listInteractions?: (
|
|
179
|
+
request: ListAgentProviderInteractionsRequest,
|
|
180
|
+
) => MaybePromise<MessageInitShape<typeof AgentInteractionSchema>[]>;
|
|
181
|
+
resolveInteraction?: (
|
|
182
|
+
request: ResolveAgentProviderInteractionRequest,
|
|
183
|
+
) => MaybePromise<MessageInitShape<typeof AgentInteractionSchema>>;
|
|
184
|
+
getCapabilities?: (
|
|
185
|
+
request: GetAgentProviderCapabilitiesRequest,
|
|
186
|
+
) => MaybePromise<MessageInitShape<typeof AgentProviderCapabilitiesSchema>>;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export class AgentProvider extends RuntimeProvider {
|
|
190
|
+
readonly kind = "agent" as const;
|
|
191
|
+
|
|
192
|
+
private readonly createSessionHandler: AgentProviderOptions["createSession"];
|
|
193
|
+
private readonly getSessionHandler: AgentProviderOptions["getSession"];
|
|
194
|
+
private readonly listSessionsHandler: AgentProviderOptions["listSessions"];
|
|
195
|
+
private readonly updateSessionHandler: AgentProviderOptions["updateSession"];
|
|
196
|
+
private readonly createTurnHandler: AgentProviderOptions["createTurn"];
|
|
197
|
+
private readonly getTurnHandler: AgentProviderOptions["getTurn"];
|
|
198
|
+
private readonly listTurnsHandler: AgentProviderOptions["listTurns"];
|
|
199
|
+
private readonly cancelTurnHandler: AgentProviderOptions["cancelTurn"];
|
|
200
|
+
private readonly listTurnEventsHandler: AgentProviderOptions["listTurnEvents"];
|
|
201
|
+
private readonly getInteractionHandler: AgentProviderOptions["getInteraction"];
|
|
202
|
+
private readonly listInteractionsHandler: AgentProviderOptions["listInteractions"];
|
|
203
|
+
private readonly resolveInteractionHandler: AgentProviderOptions["resolveInteraction"];
|
|
204
|
+
private readonly getCapabilitiesHandler: AgentProviderOptions["getCapabilities"];
|
|
205
|
+
|
|
206
|
+
constructor(options: AgentProviderOptions) {
|
|
207
|
+
super(options);
|
|
208
|
+
this.createSessionHandler = options.createSession;
|
|
209
|
+
this.getSessionHandler = options.getSession;
|
|
210
|
+
this.listSessionsHandler = options.listSessions;
|
|
211
|
+
this.updateSessionHandler = options.updateSession;
|
|
212
|
+
this.createTurnHandler = options.createTurn;
|
|
213
|
+
this.getTurnHandler = options.getTurn;
|
|
214
|
+
this.listTurnsHandler = options.listTurns;
|
|
215
|
+
this.cancelTurnHandler = options.cancelTurn;
|
|
216
|
+
this.listTurnEventsHandler = options.listTurnEvents;
|
|
217
|
+
this.getInteractionHandler = options.getInteraction;
|
|
218
|
+
this.listInteractionsHandler = options.listInteractions;
|
|
219
|
+
this.resolveInteractionHandler = options.resolveInteraction;
|
|
220
|
+
this.getCapabilitiesHandler = options.getCapabilities;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
async createSession(
|
|
224
|
+
request: CreateAgentProviderSessionRequest,
|
|
225
|
+
): Promise<MessageInitShape<typeof AgentSessionSchema>> {
|
|
226
|
+
return await requireAgentProviderHandler(
|
|
227
|
+
"create session",
|
|
228
|
+
this.createSessionHandler,
|
|
229
|
+
request,
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
async getSession(
|
|
234
|
+
request: GetAgentProviderSessionRequest,
|
|
235
|
+
): Promise<MessageInitShape<typeof AgentSessionSchema>> {
|
|
236
|
+
return await requireAgentProviderHandler(
|
|
237
|
+
"get session",
|
|
238
|
+
this.getSessionHandler,
|
|
239
|
+
request,
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
async listSessions(
|
|
244
|
+
request: ListAgentProviderSessionsRequest,
|
|
245
|
+
): Promise<MessageInitShape<typeof AgentSessionSchema>[]> {
|
|
246
|
+
return await requireAgentProviderHandler(
|
|
247
|
+
"list sessions",
|
|
248
|
+
this.listSessionsHandler,
|
|
249
|
+
request,
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
async updateSession(
|
|
254
|
+
request: UpdateAgentProviderSessionRequest,
|
|
255
|
+
): Promise<MessageInitShape<typeof AgentSessionSchema>> {
|
|
256
|
+
return await requireAgentProviderHandler(
|
|
257
|
+
"update session",
|
|
258
|
+
this.updateSessionHandler,
|
|
259
|
+
request,
|
|
260
|
+
);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
async createTurn(
|
|
264
|
+
request: CreateAgentProviderTurnRequest,
|
|
265
|
+
): Promise<MessageInitShape<typeof AgentTurnSchema>> {
|
|
266
|
+
return await requireAgentProviderHandler(
|
|
267
|
+
"create turn",
|
|
268
|
+
this.createTurnHandler,
|
|
269
|
+
request,
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
async getTurn(
|
|
274
|
+
request: GetAgentProviderTurnRequest,
|
|
275
|
+
): Promise<MessageInitShape<typeof AgentTurnSchema>> {
|
|
276
|
+
return await requireAgentProviderHandler(
|
|
277
|
+
"get turn",
|
|
278
|
+
this.getTurnHandler,
|
|
279
|
+
request,
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
async listTurns(
|
|
284
|
+
request: ListAgentProviderTurnsRequest,
|
|
285
|
+
): Promise<MessageInitShape<typeof AgentTurnSchema>[]> {
|
|
286
|
+
return await requireAgentProviderHandler(
|
|
287
|
+
"list turns",
|
|
288
|
+
this.listTurnsHandler,
|
|
289
|
+
request,
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
async cancelTurn(
|
|
294
|
+
request: CancelAgentProviderTurnRequest,
|
|
295
|
+
): Promise<MessageInitShape<typeof AgentTurnSchema>> {
|
|
296
|
+
return await requireAgentProviderHandler(
|
|
297
|
+
"cancel turn",
|
|
298
|
+
this.cancelTurnHandler,
|
|
299
|
+
request,
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
async listTurnEvents(
|
|
304
|
+
request: ListAgentProviderTurnEventsRequest,
|
|
305
|
+
): Promise<AgentTurnEventInit[]> {
|
|
306
|
+
return await requireAgentProviderHandler(
|
|
307
|
+
"list turn events",
|
|
308
|
+
this.listTurnEventsHandler,
|
|
309
|
+
request,
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
async getInteraction(
|
|
314
|
+
request: GetAgentProviderInteractionRequest,
|
|
315
|
+
): Promise<MessageInitShape<typeof AgentInteractionSchema>> {
|
|
316
|
+
return await requireAgentProviderHandler(
|
|
317
|
+
"get interaction",
|
|
318
|
+
this.getInteractionHandler,
|
|
319
|
+
request,
|
|
320
|
+
);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
async listInteractions(
|
|
324
|
+
request: ListAgentProviderInteractionsRequest,
|
|
325
|
+
): Promise<MessageInitShape<typeof AgentInteractionSchema>[]> {
|
|
326
|
+
return await requireAgentProviderHandler(
|
|
327
|
+
"list interactions",
|
|
328
|
+
this.listInteractionsHandler,
|
|
329
|
+
request,
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
async resolveInteraction(
|
|
334
|
+
request: ResolveAgentProviderInteractionRequest,
|
|
335
|
+
): Promise<MessageInitShape<typeof AgentInteractionSchema>> {
|
|
336
|
+
return await requireAgentProviderHandler(
|
|
337
|
+
"resolve interaction",
|
|
338
|
+
this.resolveInteractionHandler,
|
|
339
|
+
request,
|
|
340
|
+
);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
async getCapabilities(
|
|
344
|
+
request: GetAgentProviderCapabilitiesRequest = create(
|
|
345
|
+
GetAgentProviderCapabilitiesRequestSchema,
|
|
346
|
+
{},
|
|
347
|
+
),
|
|
348
|
+
): Promise<MessageInitShape<typeof AgentProviderCapabilitiesSchema>> {
|
|
349
|
+
return await requireAgentProviderHandler(
|
|
350
|
+
"get capabilities",
|
|
351
|
+
this.getCapabilitiesHandler,
|
|
352
|
+
request,
|
|
353
|
+
);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
export function defineAgentProvider(options: AgentProviderOptions): AgentProvider {
|
|
358
|
+
return new AgentProvider(options);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
function normalizeAgentTurnEvents(
|
|
362
|
+
events: AgentTurnEventInit[],
|
|
363
|
+
): MessageInitShape<typeof AgentTurnEventSchema>[] {
|
|
364
|
+
return events.map((event) => normalizeAgentTurnEvent(event));
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
function normalizeAgentTurnEvent(
|
|
368
|
+
event: AgentTurnEventInit,
|
|
369
|
+
): MessageInitShape<typeof AgentTurnEventSchema> {
|
|
370
|
+
const display = event.display;
|
|
371
|
+
if (!display) {
|
|
372
|
+
return event as MessageInitShape<typeof AgentTurnEventSchema>;
|
|
373
|
+
}
|
|
374
|
+
return {
|
|
375
|
+
...event,
|
|
376
|
+
display: {
|
|
377
|
+
...display,
|
|
378
|
+
input: normalizeAgentTurnDisplayValue(display.input),
|
|
379
|
+
output: normalizeAgentTurnDisplayValue(display.output),
|
|
380
|
+
error: normalizeAgentTurnDisplayValue(display.error),
|
|
381
|
+
},
|
|
382
|
+
} as MessageInitShape<typeof AgentTurnEventSchema>;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
function normalizeAgentTurnDisplayValue(value: unknown): Value | undefined {
|
|
386
|
+
if (value === undefined) {
|
|
387
|
+
return undefined;
|
|
388
|
+
}
|
|
389
|
+
if (isMessage(value, ValueSchema)) {
|
|
390
|
+
return value;
|
|
391
|
+
}
|
|
392
|
+
if (isValueInit(value)) {
|
|
393
|
+
return create(ValueSchema, value);
|
|
394
|
+
}
|
|
395
|
+
return fromJson(ValueSchema, value as JsonValue);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
function isValueInit(value: unknown): value is MessageInitShape<typeof ValueSchema> {
|
|
399
|
+
if (value === null || typeof value !== "object") {
|
|
400
|
+
return false;
|
|
401
|
+
}
|
|
402
|
+
const kind = (value as { kind?: unknown }).kind;
|
|
403
|
+
return (
|
|
404
|
+
kind !== null &&
|
|
405
|
+
typeof kind === "object" &&
|
|
406
|
+
typeof (kind as { case?: unknown }).case === "string" &&
|
|
407
|
+
"value" in kind
|
|
408
|
+
);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
export function isAgentProvider(value: unknown): value is AgentProvider {
|
|
412
|
+
return (
|
|
413
|
+
value instanceof AgentProvider ||
|
|
414
|
+
(typeof value === "object" &&
|
|
415
|
+
value !== null &&
|
|
416
|
+
"kind" in value &&
|
|
417
|
+
(value as { kind?: unknown }).kind === "agent" &&
|
|
418
|
+
"createSession" in value &&
|
|
419
|
+
"createTurn" in value)
|
|
420
|
+
);
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
export class AgentHost {
|
|
424
|
+
private readonly client: Client<typeof AgentHostService>;
|
|
425
|
+
|
|
426
|
+
constructor() {
|
|
427
|
+
const target = process.env[ENV_AGENT_HOST_SOCKET];
|
|
428
|
+
if (!target) {
|
|
429
|
+
throw new Error(`agent host: ${ENV_AGENT_HOST_SOCKET} is not set`);
|
|
430
|
+
}
|
|
431
|
+
const relayToken = process.env[ENV_AGENT_HOST_SOCKET_TOKEN]?.trim() ?? "";
|
|
432
|
+
const transport = createGrpcTransport({
|
|
433
|
+
...agentHostTransportOptions(target),
|
|
434
|
+
interceptors: relayToken ? [agentHostRelayTokenInterceptor(relayToken)] : [],
|
|
435
|
+
});
|
|
436
|
+
this.client = createClient(AgentHostService, transport);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
async executeTool(
|
|
440
|
+
request: ExecuteAgentToolRequest,
|
|
441
|
+
): Promise<ExecuteAgentToolResponse> {
|
|
442
|
+
return await this.client.executeTool(request);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
async searchTools(
|
|
446
|
+
request: SearchAgentToolsRequest,
|
|
447
|
+
): Promise<SearchAgentToolsResponse> {
|
|
448
|
+
return await this.client.searchTools(request);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
async listTools(
|
|
452
|
+
request: ListAgentToolsRequest,
|
|
453
|
+
): Promise<ListAgentToolsResponse> {
|
|
454
|
+
return await this.client.listTools(request);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
function agentHostTransportOptions(rawTarget: string): {
|
|
459
|
+
baseUrl: string;
|
|
460
|
+
nodeOptions?: { path: string };
|
|
461
|
+
} {
|
|
462
|
+
const target = rawTarget.trim();
|
|
463
|
+
if (!target) {
|
|
464
|
+
throw new Error("agent host: transport target is required");
|
|
465
|
+
}
|
|
466
|
+
if (target.startsWith("tcp://")) {
|
|
467
|
+
const address = target.slice("tcp://".length).trim();
|
|
468
|
+
if (!address) {
|
|
469
|
+
throw new Error(
|
|
470
|
+
`agent host: tcp target ${JSON.stringify(rawTarget)} is missing host:port`,
|
|
471
|
+
);
|
|
472
|
+
}
|
|
473
|
+
return { baseUrl: `http://${address}` };
|
|
474
|
+
}
|
|
475
|
+
if (target.startsWith("tls://")) {
|
|
476
|
+
const address = target.slice("tls://".length).trim();
|
|
477
|
+
if (!address) {
|
|
478
|
+
throw new Error(
|
|
479
|
+
`agent host: tls target ${JSON.stringify(rawTarget)} is missing host:port`,
|
|
480
|
+
);
|
|
481
|
+
}
|
|
482
|
+
return { baseUrl: `https://${address}` };
|
|
483
|
+
}
|
|
484
|
+
if (target.startsWith("unix://")) {
|
|
485
|
+
const socketPath = target.slice("unix://".length).trim();
|
|
486
|
+
if (!socketPath) {
|
|
487
|
+
throw new Error(
|
|
488
|
+
`agent host: unix target ${JSON.stringify(rawTarget)} is missing a socket path`,
|
|
489
|
+
);
|
|
490
|
+
}
|
|
491
|
+
return { baseUrl: "http://localhost", nodeOptions: { path: socketPath } };
|
|
492
|
+
}
|
|
493
|
+
if (target.includes("://")) {
|
|
494
|
+
const parsed = new URL(target);
|
|
495
|
+
throw new Error(
|
|
496
|
+
`agent host: unsupported target scheme ${JSON.stringify(parsed.protocol.replace(/:$/, ""))}`,
|
|
497
|
+
);
|
|
498
|
+
}
|
|
499
|
+
return { baseUrl: "http://localhost", nodeOptions: { path: target } };
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
function agentHostRelayTokenInterceptor(token: string): Interceptor {
|
|
503
|
+
return (next) => async (req) => {
|
|
504
|
+
req.header.set(AGENT_HOST_RELAY_TOKEN_HEADER, token);
|
|
505
|
+
return next(req);
|
|
506
|
+
};
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
export function createAgentProviderService(
|
|
510
|
+
provider: AgentProvider,
|
|
511
|
+
): Partial<ServiceImpl<typeof AgentProviderService>> {
|
|
512
|
+
return {
|
|
513
|
+
async createSession(request) {
|
|
514
|
+
return create(
|
|
515
|
+
AgentSessionSchema,
|
|
516
|
+
await invokeAgentProvider("create session", () =>
|
|
517
|
+
provider.createSession(request),
|
|
518
|
+
),
|
|
519
|
+
);
|
|
520
|
+
},
|
|
521
|
+
async getSession(request) {
|
|
522
|
+
return create(
|
|
523
|
+
AgentSessionSchema,
|
|
524
|
+
await invokeAgentProvider("get session", () =>
|
|
525
|
+
provider.getSession(request),
|
|
526
|
+
),
|
|
527
|
+
);
|
|
528
|
+
},
|
|
529
|
+
async listSessions(request) {
|
|
530
|
+
return create(ListAgentProviderSessionsResponseSchema, {
|
|
531
|
+
sessions: await invokeAgentProvider("list sessions", () =>
|
|
532
|
+
provider.listSessions(request),
|
|
533
|
+
),
|
|
534
|
+
});
|
|
535
|
+
},
|
|
536
|
+
async updateSession(request) {
|
|
537
|
+
return create(
|
|
538
|
+
AgentSessionSchema,
|
|
539
|
+
await invokeAgentProvider("update session", () =>
|
|
540
|
+
provider.updateSession(request),
|
|
541
|
+
),
|
|
542
|
+
);
|
|
543
|
+
},
|
|
544
|
+
async createTurn(request) {
|
|
545
|
+
return create(
|
|
546
|
+
AgentTurnSchema,
|
|
547
|
+
await invokeAgentProvider("create turn", () =>
|
|
548
|
+
provider.createTurn(request),
|
|
549
|
+
),
|
|
550
|
+
);
|
|
551
|
+
},
|
|
552
|
+
async getTurn(request) {
|
|
553
|
+
return create(
|
|
554
|
+
AgentTurnSchema,
|
|
555
|
+
await invokeAgentProvider("get turn", () => provider.getTurn(request)),
|
|
556
|
+
);
|
|
557
|
+
},
|
|
558
|
+
async listTurns(request) {
|
|
559
|
+
return create(ListAgentProviderTurnsResponseSchema, {
|
|
560
|
+
turns: await invokeAgentProvider("list turns", () =>
|
|
561
|
+
provider.listTurns(request),
|
|
562
|
+
),
|
|
563
|
+
});
|
|
564
|
+
},
|
|
565
|
+
async cancelTurn(request) {
|
|
566
|
+
return create(
|
|
567
|
+
AgentTurnSchema,
|
|
568
|
+
await invokeAgentProvider("cancel turn", () =>
|
|
569
|
+
provider.cancelTurn(request),
|
|
570
|
+
),
|
|
571
|
+
);
|
|
572
|
+
},
|
|
573
|
+
async listTurnEvents(request) {
|
|
574
|
+
return create(ListAgentProviderTurnEventsResponseSchema, {
|
|
575
|
+
events: normalizeAgentTurnEvents(
|
|
576
|
+
await invokeAgentProvider("list turn events", () =>
|
|
577
|
+
provider.listTurnEvents(request),
|
|
578
|
+
),
|
|
579
|
+
),
|
|
580
|
+
});
|
|
581
|
+
},
|
|
582
|
+
async getInteraction(request) {
|
|
583
|
+
return create(
|
|
584
|
+
AgentInteractionSchema,
|
|
585
|
+
await invokeAgentProvider("get interaction", () =>
|
|
586
|
+
provider.getInteraction(request),
|
|
587
|
+
),
|
|
588
|
+
);
|
|
589
|
+
},
|
|
590
|
+
async listInteractions(request) {
|
|
591
|
+
return create(ListAgentProviderInteractionsResponseSchema, {
|
|
592
|
+
interactions: await invokeAgentProvider("list interactions", () =>
|
|
593
|
+
provider.listInteractions(request),
|
|
594
|
+
),
|
|
595
|
+
});
|
|
596
|
+
},
|
|
597
|
+
async resolveInteraction(request) {
|
|
598
|
+
return create(
|
|
599
|
+
AgentInteractionSchema,
|
|
600
|
+
await invokeAgentProvider("resolve interaction", () =>
|
|
601
|
+
provider.resolveInteraction(request),
|
|
602
|
+
),
|
|
603
|
+
);
|
|
604
|
+
},
|
|
605
|
+
async getCapabilities(request) {
|
|
606
|
+
return create(
|
|
607
|
+
AgentProviderCapabilitiesSchema,
|
|
608
|
+
await invokeAgentProvider("get capabilities", () =>
|
|
609
|
+
provider.getCapabilities(request),
|
|
610
|
+
),
|
|
611
|
+
);
|
|
612
|
+
},
|
|
613
|
+
};
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
async function requireAgentProviderHandler<Request, Response>(
|
|
617
|
+
action: string,
|
|
618
|
+
fn: ((request: Request) => MaybePromise<Response>) | undefined,
|
|
619
|
+
request: Request,
|
|
620
|
+
): Promise<Response> {
|
|
621
|
+
if (!fn) {
|
|
622
|
+
throw new ConnectError(
|
|
623
|
+
`agent provider ${action} is not implemented`,
|
|
624
|
+
Code.Unimplemented,
|
|
625
|
+
);
|
|
626
|
+
}
|
|
627
|
+
return await fn(request);
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
async function invokeAgentProvider<T>(
|
|
631
|
+
action: string,
|
|
632
|
+
fn: () => Promise<T>,
|
|
633
|
+
): Promise<T> {
|
|
634
|
+
try {
|
|
635
|
+
return await fn();
|
|
636
|
+
} catch (error) {
|
|
637
|
+
if (error instanceof ConnectError) {
|
|
638
|
+
throw error;
|
|
639
|
+
}
|
|
640
|
+
throw new ConnectError(
|
|
641
|
+
`agent provider ${action}: ${errorMessage(error)}`,
|
|
642
|
+
Code.Unknown,
|
|
643
|
+
);
|
|
644
|
+
}
|
|
645
|
+
}
|
package/src/api.ts
CHANGED
|
@@ -35,8 +35,9 @@ export interface Request {
|
|
|
35
35
|
subject: Subject;
|
|
36
36
|
credential: Credential;
|
|
37
37
|
access: Access;
|
|
38
|
+
idempotencyKey: string;
|
|
38
39
|
// Workflow callback metadata uses a JSON-style lowerCamelCase object such as
|
|
39
|
-
// runId, target.pluginName, trigger.scheduleId, and trigger.event.specVersion.
|
|
40
|
+
// runId, target.plugin.pluginName, trigger.scheduleId, and trigger.event.specVersion.
|
|
40
41
|
workflow: Record<string, unknown>;
|
|
41
42
|
invocationToken: string;
|
|
42
43
|
}
|
|
@@ -104,6 +105,7 @@ export function request(
|
|
|
104
105
|
access: Partial<Access> = {},
|
|
105
106
|
workflow: Record<string, unknown> = {},
|
|
106
107
|
invocationToken = "",
|
|
108
|
+
idempotencyKey = "",
|
|
107
109
|
): Request {
|
|
108
110
|
return {
|
|
109
111
|
token,
|
|
@@ -130,6 +132,7 @@ export function request(
|
|
|
130
132
|
...workflow,
|
|
131
133
|
},
|
|
132
134
|
invocationToken,
|
|
135
|
+
idempotencyKey: idempotencyKey.trim(),
|
|
133
136
|
};
|
|
134
137
|
}
|
|
135
138
|
|