@microsoft/teams.a2a 2.0.0-preview.10
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 +180 -0
- package/dist/chat-prompt/plugin.d.ts +24 -0
- package/dist/chat-prompt/plugin.js +156 -0
- package/dist/chat-prompt/types.d.ts +60 -0
- package/dist/chat-prompt/types.js +3 -0
- package/dist/client/agent-client.d.ts +58 -0
- package/dist/client/agent-client.js +177 -0
- package/dist/client/agent-manager.d.ts +57 -0
- package/dist/client/agent-manager.js +136 -0
- package/dist/client/agent-task-store.d.ts +25 -0
- package/dist/client/agent-task-store.js +47 -0
- package/dist/common/schema.d.ts +728 -0
- package/dist/common/schema.js +26 -0
- package/dist/common/type-utils.d.ts +11 -0
- package/dist/common/type-utils.js +3 -0
- package/dist/common/uuid.d.ts +1 -0
- package/dist/common/uuid.js +12 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +50 -0
- package/dist/server/middleware/isTaskRequest.d.ts +2 -0
- package/dist/server/middleware/isTaskRequest.js +32 -0
- package/dist/server/plugin.d.ts +49 -0
- package/dist/server/plugin.js +130 -0
- package/dist/server/plugin.on-get-request.d.ts +3 -0
- package/dist/server/plugin.on-get-request.js +17 -0
- package/dist/server/plugin.on-send-request.d.ts +9 -0
- package/dist/server/plugin.on-send-request.js +107 -0
- package/dist/server/serverUtils.d.ts +13 -0
- package/dist/server/serverUtils.js +65 -0
- package/dist/server/tasks/task-manager.d.ts +22 -0
- package/dist/server/tasks/task-manager.js +205 -0
- package/dist/server/tasks/task-store.d.ts +8 -0
- package/dist/server/tasks/task-store.js +18 -0
- package/dist/server/tasks/task-utilities.d.ts +27 -0
- package/dist/server/tasks/task-utilities.js +139 -0
- package/dist/server/tasks/task-utils.d.ts +22 -0
- package/dist/server/tasks/task-utils.js +38 -0
- package/dist/server/types/a2a-error.d.ts +23 -0
- package/dist/server/types/a2a-error.js +95 -0
- package/dist/server/types/a2a-types.d.ts +56 -0
- package/dist/server/types/a2a-types.js +3 -0
- package/dist/server/types/event-types.d.ts +24 -0
- package/dist/server/types/event-types.js +3 -0
- package/package.json +49 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AgentClient = exports.AgentCardNotFoundError = void 0;
|
|
4
|
+
const teams_common_1 = require("@microsoft/teams.common");
|
|
5
|
+
const schema_1 = require("../common/schema");
|
|
6
|
+
const uuid_1 = require("../common/uuid");
|
|
7
|
+
/**
|
|
8
|
+
* Error class for JSON-RPC errors, matching the old-client-impl behavior.
|
|
9
|
+
*/
|
|
10
|
+
class RpcError extends Error {
|
|
11
|
+
code;
|
|
12
|
+
data;
|
|
13
|
+
constructor(code, message, data) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.name = 'RpcError';
|
|
16
|
+
this.code = code;
|
|
17
|
+
this.data = data;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
class AgentCardNotFoundError extends Error {
|
|
21
|
+
constructor(message) {
|
|
22
|
+
super(message);
|
|
23
|
+
this.name = 'AgentCardNotFoundError';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.AgentCardNotFoundError = AgentCardNotFoundError;
|
|
27
|
+
/**
|
|
28
|
+
* A2AAgentClient can be constructed with either a baseUrl (to fetch the agent card) or a direct AgentCard object.
|
|
29
|
+
* Optionally, a custom fetch implementation can be provided.
|
|
30
|
+
*/
|
|
31
|
+
class AgentClient {
|
|
32
|
+
_agentCard;
|
|
33
|
+
_baseUrl;
|
|
34
|
+
get baseUrl() {
|
|
35
|
+
return this._baseUrl;
|
|
36
|
+
}
|
|
37
|
+
_a2aUrl;
|
|
38
|
+
get a2aUrl() {
|
|
39
|
+
return this._a2aUrl;
|
|
40
|
+
}
|
|
41
|
+
_fetchImpl;
|
|
42
|
+
_logger;
|
|
43
|
+
constructor(options) {
|
|
44
|
+
this._baseUrl = options.baseUrl;
|
|
45
|
+
this._agentCard = options.agentCard ?? null;
|
|
46
|
+
this._fetchImpl = options.fetchImpl ?? fetch;
|
|
47
|
+
this._a2aUrl = this._agentCard?.url ?? null;
|
|
48
|
+
this._logger = options.logger?.child('A2AAgentClient') ?? new teams_common_1.ConsoleLogger('A2AAgentClient');
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Returns the agent card, fetching it if necessary.
|
|
52
|
+
*/
|
|
53
|
+
async agentCard() {
|
|
54
|
+
if (this._agentCard) {
|
|
55
|
+
return this._agentCard;
|
|
56
|
+
}
|
|
57
|
+
// Fetch from /.well-known/agent.json at the same origin as baseUrl
|
|
58
|
+
const base = new URL(this._baseUrl).origin;
|
|
59
|
+
const cardUrl = `${base}/.well-known/agent.json`;
|
|
60
|
+
this._logger.debug(`Fetching agent card from ${cardUrl}`);
|
|
61
|
+
try {
|
|
62
|
+
const response = await this._fetchImpl(cardUrl, { method: 'GET', headers: { Accept: 'application/json' } });
|
|
63
|
+
if (!response.ok) {
|
|
64
|
+
this._logger.error(`Failed to fetch agent card: ${response.status} ${response.statusText}`);
|
|
65
|
+
throw new AgentCardNotFoundError(`Failed to fetch agent card: ${response.status} ${response.statusText}`);
|
|
66
|
+
}
|
|
67
|
+
// TODO: validate using something like zod?
|
|
68
|
+
const card = (await response.json());
|
|
69
|
+
this._logger.debug(`Agent card fetched successfully from ${cardUrl}`, card);
|
|
70
|
+
this._agentCard = card;
|
|
71
|
+
this._a2aUrl = card.url;
|
|
72
|
+
return card;
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
this._logger.error(`Failed to fetch agent card: ${error}`);
|
|
76
|
+
throw new AgentCardNotFoundError(`Failed to fetch agent card: ${error}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Sends a task request to the agent (non-streaming).
|
|
81
|
+
* @param params The parameters for the tasks/send method.
|
|
82
|
+
* @returns A promise resolving to the Task object or null.
|
|
83
|
+
*/
|
|
84
|
+
async sendTask(params) {
|
|
85
|
+
const httpResponse = await this._makeHttpRequest('tasks/send', params);
|
|
86
|
+
return this._handleJsonResponse(httpResponse, 'tasks/send');
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Internal helper to make JSON-RPC HTTP requests.
|
|
90
|
+
*/
|
|
91
|
+
async _makeHttpRequest(method, params, acceptHeader = 'application/json') {
|
|
92
|
+
if (!this._a2aUrl) {
|
|
93
|
+
throw new Error('Agent URL is not set. Please call agentCard() to fetch the agent card.');
|
|
94
|
+
}
|
|
95
|
+
const requestId = (0, uuid_1.generateRequestId)();
|
|
96
|
+
const requestBody = {
|
|
97
|
+
jsonrpc: '2.0',
|
|
98
|
+
id: requestId,
|
|
99
|
+
method,
|
|
100
|
+
params,
|
|
101
|
+
};
|
|
102
|
+
try {
|
|
103
|
+
this._logger.debug(`Making JSON-RPC request to ${this._a2aUrl}:`, requestBody);
|
|
104
|
+
const response = await this._fetchImpl(this._a2aUrl, {
|
|
105
|
+
method: 'POST',
|
|
106
|
+
headers: {
|
|
107
|
+
'Content-Type': 'application/json',
|
|
108
|
+
Accept: acceptHeader,
|
|
109
|
+
},
|
|
110
|
+
body: JSON.stringify(requestBody),
|
|
111
|
+
});
|
|
112
|
+
return response;
|
|
113
|
+
}
|
|
114
|
+
catch (networkError) {
|
|
115
|
+
this._logger.error('Network error while making JSON-RPC request:', networkError);
|
|
116
|
+
throw new RpcError(schema_1.ErrorCodeInternalError, `Network error: ${networkError instanceof Error ? networkError.message : String(networkError)}`, networkError);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Handles standard JSON-RPC responses (non-streaming).
|
|
121
|
+
*/
|
|
122
|
+
async _handleJsonResponse(response, expectedMethod) {
|
|
123
|
+
// Return type is now the 'result' property of Res
|
|
124
|
+
let responseBody = null;
|
|
125
|
+
try {
|
|
126
|
+
if (!response.ok) {
|
|
127
|
+
this._logger.error(`HTTP error ${response.status}: ${response.statusText}`);
|
|
128
|
+
// Attempt to read body even for non-ok responses for potential JSON errors
|
|
129
|
+
responseBody = await response.text();
|
|
130
|
+
let errorData = null;
|
|
131
|
+
try {
|
|
132
|
+
// Try parsing as JSON RPC Error response
|
|
133
|
+
const parsedError = JSON.parse(responseBody);
|
|
134
|
+
if (parsedError.error) {
|
|
135
|
+
errorData = parsedError.error;
|
|
136
|
+
throw new RpcError(errorData.code, errorData.message, errorData.data);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch (parseError) {
|
|
140
|
+
// Ignore parsing error, fall through to generic HTTP error
|
|
141
|
+
}
|
|
142
|
+
// If not a JSON RPC error, throw generic HTTP error
|
|
143
|
+
throw new Error(`HTTP error ${response.status}: ${response.statusText}${responseBody ? ` - ${responseBody}` : ''}`);
|
|
144
|
+
}
|
|
145
|
+
// Read and parse the successful JSON response
|
|
146
|
+
responseBody = await response.text();
|
|
147
|
+
// Parse as the specific JSONRPCResponse type Res
|
|
148
|
+
const jsonResponse = JSON.parse(responseBody);
|
|
149
|
+
// Basic validation of the JSON-RPC response structure
|
|
150
|
+
if (typeof jsonResponse !== 'object' ||
|
|
151
|
+
jsonResponse === null ||
|
|
152
|
+
jsonResponse.jsonrpc !== '2.0') {
|
|
153
|
+
throw new RpcError(schema_1.ErrorCodeInternalError, 'Invalid JSON-RPC response structure received from server.');
|
|
154
|
+
}
|
|
155
|
+
// Check for application-level errors within the JSON-RPC response
|
|
156
|
+
if (jsonResponse.error) {
|
|
157
|
+
throw new RpcError(jsonResponse.error.code, jsonResponse.error.message, jsonResponse.error.data);
|
|
158
|
+
}
|
|
159
|
+
// Optional: Validate response ID matches request ID if needed (requires passing request ID down)
|
|
160
|
+
// Extract and return only the result payload
|
|
161
|
+
return jsonResponse.result;
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
this._logger.error(`Error processing RPC response for method ${expectedMethod || 'unknown'}:`, error, responseBody ? `\nResponse Body: ${responseBody}` : '');
|
|
165
|
+
// Re-throw RpcError instances directly, wrap others
|
|
166
|
+
if (error instanceof RpcError) {
|
|
167
|
+
throw error;
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
throw new RpcError(schema_1.ErrorCodeInternalError, // Use literal value for ErrorCodeInternalError
|
|
171
|
+
`Failed to process response: ${error instanceof Error ? error.message : String(error)}`, error);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
exports.AgentClient = AgentClient;
|
|
177
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaWVudC9hZ2VudC1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMERBQWlFO0FBRWpFLDZDQUF5TjtBQUN6Tix5Q0FBbUQ7QUF3Qm5EOztHQUVHO0FBQ0gsTUFBTSxRQUFTLFNBQVEsS0FBSztJQUN4QixJQUFJLENBQVM7SUFDYixJQUFJLENBQVc7SUFDZixZQUFZLElBQVksRUFBRSxPQUFlLEVBQUUsSUFBYztRQUNyRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDO0NBQ0o7QUFFRCxNQUFhLHNCQUF1QixTQUFRLEtBQUs7SUFDN0MsWUFBWSxPQUFlO1FBQ3ZCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsd0JBQXdCLENBQUM7SUFDekMsQ0FBQztDQUNKO0FBTEQsd0RBS0M7QUFFRDs7O0dBR0c7QUFDSCxNQUFhLFdBQVc7SUFDWixVQUFVLENBQW1CO0lBRTdCLFFBQVEsQ0FBUztJQUN6QixJQUFXLE9BQU87UUFDZCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDekIsQ0FBQztJQUVPLE9BQU8sQ0FBZ0I7SUFDL0IsSUFBVyxNQUFNO1FBQ2IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7SUFFTyxVQUFVLENBQWU7SUFDekIsT0FBTyxDQUFVO0lBRXpCLFlBQVksT0FBOEI7UUFDdEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUM7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
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { A2AAgentClientOptions } from './agent-client';
|
|
2
|
+
import { IAgentTaskStoreFactory } from './agent-task-store';
|
|
3
|
+
import type { AgentCard, Task, TaskSendParams } from '../common/schema';
|
|
4
|
+
import type { TaskAndHistory } from '../server/types/a2a-types';
|
|
5
|
+
export type AgentCardWithDetails = {
|
|
6
|
+
key: string;
|
|
7
|
+
url: string;
|
|
8
|
+
card: AgentCard;
|
|
9
|
+
};
|
|
10
|
+
export type AgentManagerOptions = Pick<A2AAgentClientOptions, 'fetchImpl' | 'logger'> & {
|
|
11
|
+
/**
|
|
12
|
+
* Optional map of agent keys to their details.
|
|
13
|
+
*/
|
|
14
|
+
agentCards?: Map<string, AgentCardWithDetails>;
|
|
15
|
+
/**
|
|
16
|
+
* Optional task store factory.
|
|
17
|
+
*/
|
|
18
|
+
taskStoreFactory?: IAgentTaskStoreFactory;
|
|
19
|
+
};
|
|
20
|
+
export declare class AgentManager {
|
|
21
|
+
private _clients;
|
|
22
|
+
private _defaultOptions;
|
|
23
|
+
private _logger;
|
|
24
|
+
private _taskStoreFactory;
|
|
25
|
+
constructor(options?: AgentManagerOptions);
|
|
26
|
+
/**
|
|
27
|
+
* Register a new agent with the manager.
|
|
28
|
+
* @param key The unique key for the agent
|
|
29
|
+
* @param baseUrl The base URL of the agent
|
|
30
|
+
* @param agentCard Optional agent card. If not provided, it will be fetched when needed
|
|
31
|
+
* @returns The client instance for this agent
|
|
32
|
+
*/
|
|
33
|
+
use(key: string, baseUrl: string, agentCard?: AgentCard): AgentManager;
|
|
34
|
+
/**
|
|
35
|
+
* Send a task to an agent.
|
|
36
|
+
* @param key The key of the agent
|
|
37
|
+
* @param params The parameters for the task
|
|
38
|
+
* @returns The task after it has been sent and received from the agent
|
|
39
|
+
*/
|
|
40
|
+
sendTask(key: string, params: TaskSendParams): Promise<Task | null>;
|
|
41
|
+
/**
|
|
42
|
+
* Get the agent card for a given agent key, fetching it if necessary.
|
|
43
|
+
* @param key The key of the agent
|
|
44
|
+
* @param throwIfNotFound If true, throw an error if the agent card is not found
|
|
45
|
+
* @returns The agent card
|
|
46
|
+
*/
|
|
47
|
+
getAgentCard(key: string, throwIfNotFound?: boolean): Promise<AgentCard | null>;
|
|
48
|
+
/**
|
|
49
|
+
* Get all registered agent cards.
|
|
50
|
+
* @param throwIfNotFound If true, throw an error if the agent card is not found. defaults to false.
|
|
51
|
+
* @returns Array of AgentCardWithUrl
|
|
52
|
+
*/
|
|
53
|
+
getAgentCards(throwIfNotFound?: boolean): Promise<(AgentCardWithDetails | null)[]>;
|
|
54
|
+
getLatestTask(key: string): Promise<TaskAndHistory | null>;
|
|
55
|
+
private getOrCreateClient;
|
|
56
|
+
private saveTask;
|
|
57
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AgentManager = void 0;
|
|
4
|
+
const teams_common_1 = require("@microsoft/teams.common");
|
|
5
|
+
const agent_client_1 = require("./agent-client");
|
|
6
|
+
const agent_task_store_1 = require("./agent-task-store");
|
|
7
|
+
class AgentManager {
|
|
8
|
+
_clients = new Map();
|
|
9
|
+
_defaultOptions;
|
|
10
|
+
_logger;
|
|
11
|
+
_taskStoreFactory;
|
|
12
|
+
constructor(options = {}) {
|
|
13
|
+
const { agentCards, taskStoreFactory, ...sharedOptions } = options;
|
|
14
|
+
this._logger = sharedOptions.logger?.child('A2AAgentManager') ?? new teams_common_1.ConsoleLogger('A2AAgentManager');
|
|
15
|
+
this._defaultOptions = sharedOptions;
|
|
16
|
+
this._taskStoreFactory = taskStoreFactory ?? new agent_task_store_1.InMemoryTaskStoreFactory();
|
|
17
|
+
if (agentCards) {
|
|
18
|
+
for (const [key, { url, card }] of agentCards) {
|
|
19
|
+
this.use(key, url, card);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Register a new agent with the manager.
|
|
25
|
+
* @param key The unique key for the agent
|
|
26
|
+
* @param baseUrl The base URL of the agent
|
|
27
|
+
* @param agentCard Optional agent card. If not provided, it will be fetched when needed
|
|
28
|
+
* @returns The client instance for this agent
|
|
29
|
+
*/
|
|
30
|
+
use(key, baseUrl, agentCard) {
|
|
31
|
+
this.getOrCreateClient(key, baseUrl, true, { agentCard });
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Send a task to an agent.
|
|
36
|
+
* @param key The key of the agent
|
|
37
|
+
* @param params The parameters for the task
|
|
38
|
+
* @returns The task after it has been sent and received from the agent
|
|
39
|
+
*/
|
|
40
|
+
async sendTask(key, params) {
|
|
41
|
+
const { client } = this.getOrCreateClient(key);
|
|
42
|
+
// Save before sending
|
|
43
|
+
if (params.id) {
|
|
44
|
+
await this.saveTask(key, { task: { ...params, status: { state: 'submitted', timestamp: new Date().toISOString(), message: params.message }, artifacts: [], metadata: params.metadata }, history: [params.message] });
|
|
45
|
+
}
|
|
46
|
+
const result = await client.sendTask(params);
|
|
47
|
+
// Save after sending (with updated task)
|
|
48
|
+
if (result) {
|
|
49
|
+
await this.saveTask(key, { task: result, history: [params.message] });
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
this._logger.warn(`A null result was returned from agent ${key}`);
|
|
53
|
+
}
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get the agent card for a given agent key, fetching it if necessary.
|
|
58
|
+
* @param key The key of the agent
|
|
59
|
+
* @param throwIfNotFound If true, throw an error if the agent card is not found
|
|
60
|
+
* @returns The agent card
|
|
61
|
+
*/
|
|
62
|
+
async getAgentCard(key, throwIfNotFound = false) {
|
|
63
|
+
const { client } = this.getOrCreateClient(key);
|
|
64
|
+
try {
|
|
65
|
+
const card = await client.agentCard();
|
|
66
|
+
return card;
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
if (error instanceof agent_client_1.AgentCardNotFoundError) {
|
|
70
|
+
if (throwIfNotFound) {
|
|
71
|
+
this._logger.warn(`Agent card not found for key ${key}`);
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get all registered agent cards.
|
|
81
|
+
* @param throwIfNotFound If true, throw an error if the agent card is not found. defaults to false.
|
|
82
|
+
* @returns Array of AgentCardWithUrl
|
|
83
|
+
*/
|
|
84
|
+
async getAgentCards(throwIfNotFound = false) {
|
|
85
|
+
const result = [];
|
|
86
|
+
for (const [key, { url, client }] of this._clients.entries()) {
|
|
87
|
+
try {
|
|
88
|
+
const card = await client.agentCard();
|
|
89
|
+
result.push({ key, url, card });
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
if (error instanceof agent_client_1.AgentCardNotFoundError) {
|
|
93
|
+
if (throwIfNotFound) {
|
|
94
|
+
this._logger.warn(`Agent card not found for key ${key}`);
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
result.push(null);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
throw error;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return result;
|
|
105
|
+
}
|
|
106
|
+
async getLatestTask(key) {
|
|
107
|
+
const store = this._taskStoreFactory.getStore(key);
|
|
108
|
+
const last = await store.lastTasks(1);
|
|
109
|
+
return last.length > 0 ? last[0] : null;
|
|
110
|
+
}
|
|
111
|
+
getOrCreateClient(key, baseUrl, override, options) {
|
|
112
|
+
let entry = this._clients.get(key);
|
|
113
|
+
if (!entry || override) {
|
|
114
|
+
if (entry) {
|
|
115
|
+
this._logger.warn(`Overriding existing client for key ${key}`);
|
|
116
|
+
}
|
|
117
|
+
if (!baseUrl) {
|
|
118
|
+
throw new Error(`Base URL must be provided when registering a new agent with key ${key}`);
|
|
119
|
+
}
|
|
120
|
+
const client = new agent_client_1.AgentClient({
|
|
121
|
+
baseUrl,
|
|
122
|
+
...this._defaultOptions,
|
|
123
|
+
...options,
|
|
124
|
+
});
|
|
125
|
+
entry = { url: baseUrl, client };
|
|
126
|
+
this._clients.set(key, entry);
|
|
127
|
+
}
|
|
128
|
+
return entry;
|
|
129
|
+
}
|
|
130
|
+
async saveTask(key, data) {
|
|
131
|
+
const store = this._taskStoreFactory.getStore(key);
|
|
132
|
+
await store.save(data);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
exports.AgentManager = AgentManager;
|
|
136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGllbnQvYWdlbnQtbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwwREFBaUU7QUFFakUsaURBQTRGO0FBRTVGLHlEQUFzRjtBQWlCdEYsTUFBYSxZQUFZO0lBQ2IsUUFBUSxHQUFHLElBQUksR0FBRyxFQUFnRCxDQUFDO0lBQ25FLGVBQWUsQ0FBb0Q7SUFDbkUsT0FBTyxDQUFVO0lBQ2pCLGlCQUFpQixDQUF5QjtJQUVsRCxZQUFZLFVBQStCLEVBQUU7UUFDekMsTUFBTSxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLGFBQWEsRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUNuRSxJQUFJLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksSUFBSSw0QkFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDdEcsSUFBSSxDQUFDLGVBQWUsR0FBRyxhQUFhLENBQUM7UUFDckMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGdCQUFnQixJQUFJLElBQUksMkNBQXdCLEVBQUUsQ0FBQztRQUM1RSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2IsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM3QixDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxHQUFHLENBQUMsR0FBVyxFQUFFLE9BQWUsRUFBRSxTQUFxQjtRQUNuRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxD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
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { IListStorage } from '@microsoft/teams.common';
|
|
2
|
+
import { ITaskStore, TaskAndHistory } from '../server/types/a2a-types';
|
|
3
|
+
export interface IAgentTaskStore extends ITaskStore {
|
|
4
|
+
lastTasks(n: number): Promise<TaskAndHistory[]>;
|
|
5
|
+
}
|
|
6
|
+
export interface IAgentTaskStoreFactory {
|
|
7
|
+
getStore(agentKey: string): IAgentTaskStore;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Implmenets a task store for a given agent using a list storage.
|
|
11
|
+
*/
|
|
12
|
+
export declare class AgentTaskStore implements IAgentTaskStore {
|
|
13
|
+
private store;
|
|
14
|
+
constructor(store: IListStorage<TaskAndHistory>);
|
|
15
|
+
save(data: TaskAndHistory): Promise<void>;
|
|
16
|
+
load(taskId: string): Promise<TaskAndHistory | null>;
|
|
17
|
+
lastTasks(n: number): Promise<TaskAndHistory[]>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* In-memory task store factory.
|
|
21
|
+
*/
|
|
22
|
+
export declare class InMemoryTaskStoreFactory implements IAgentTaskStoreFactory {
|
|
23
|
+
private stores;
|
|
24
|
+
getStore(agentKey: string): IAgentTaskStore;
|
|
25
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InMemoryTaskStoreFactory = exports.AgentTaskStore = void 0;
|
|
4
|
+
const teams_common_1 = require("@microsoft/teams.common");
|
|
5
|
+
/**
|
|
6
|
+
* Implmenets a task store for a given agent using a list storage.
|
|
7
|
+
*/
|
|
8
|
+
class AgentTaskStore {
|
|
9
|
+
store;
|
|
10
|
+
constructor(store) {
|
|
11
|
+
this.store = store;
|
|
12
|
+
}
|
|
13
|
+
async save(data) {
|
|
14
|
+
const all = await this.store.values();
|
|
15
|
+
const idx = all.findIndex(t => t.task.id === data.task.id);
|
|
16
|
+
if (idx !== -1) {
|
|
17
|
+
await this.store.set(idx, data);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
await this.store.push(data);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
async load(taskId) {
|
|
24
|
+
const all = await this.store.values();
|
|
25
|
+
const found = all.find(t => t.task.id === taskId);
|
|
26
|
+
return found ?? null;
|
|
27
|
+
}
|
|
28
|
+
async lastTasks(n) {
|
|
29
|
+
const all = await this.store.values();
|
|
30
|
+
return all.slice(-n);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.AgentTaskStore = AgentTaskStore;
|
|
34
|
+
/**
|
|
35
|
+
* In-memory task store factory.
|
|
36
|
+
*/
|
|
37
|
+
class InMemoryTaskStoreFactory {
|
|
38
|
+
stores = new Map();
|
|
39
|
+
getStore(agentKey) {
|
|
40
|
+
if (!this.stores.has(agentKey)) {
|
|
41
|
+
this.stores.set(agentKey, new AgentTaskStore(new teams_common_1.ListLocalStorage()));
|
|
42
|
+
}
|
|
43
|
+
return this.stores.get(agentKey);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.InMemoryTaskStoreFactory = InMemoryTaskStoreFactory;
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtdGFzay1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGllbnQvYWdlbnQtdGFzay1zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwwREFBeUU7QUFZekU7O0dBRUc7QUFDSCxNQUFhLGNBQWM7SUFDSDtJQUFwQixZQUFvQixLQUFtQztRQUFuQyxVQUFLLEdBQUwsS0FBSyxDQUE4QjtJQUFJLENBQUM7SUFFNUQsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFvQjtRQUMzQixNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdEMsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0QsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BDLENBQUM7YUFBTSxDQUFDO1lBQ0osTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxDQUFDO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBYztRQUNyQixNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdEMsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQztJQUN6QixDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFTO1FBQ3JCLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN0QyxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QixDQUFDO0NBQ0o7QUF2QkQsd0NBdUJDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLHdCQUF3QjtJQUN6QixNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQTJCLENBQUM7SUFFcEQsUUFBUSxDQUFDLFFBQWdCO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLGNBQWMsQ0FBQyxJQUFJLCtCQUFnQixFQUFrQixDQUFDLENBQUMsQ0FBQztRQUMxRixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUUsQ0FBQztJQUN0QyxDQUFDO0NBQ0o7QUFURCw0REFTQyJ9
|