@microsoft/teams.a2a 2.0.0-preview.9 → 2.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 (42) hide show
  1. package/dist/chat-prompt/plugin.d.ts +26 -14
  2. package/dist/chat-prompt/plugin.js +182 -115
  3. package/dist/chat-prompt/types.d.ts +43 -35
  4. package/dist/index.d.ts +0 -7
  5. package/dist/index.js +1 -31
  6. package/dist/server/plugin.d.ts +27 -24
  7. package/dist/server/plugin.js +70 -86
  8. package/package.json +8 -6
  9. package/dist/client/agent-client.d.ts +0 -58
  10. package/dist/client/agent-client.js +0 -177
  11. package/dist/client/agent-manager.d.ts +0 -57
  12. package/dist/client/agent-manager.js +0 -136
  13. package/dist/client/agent-task-store.d.ts +0 -25
  14. package/dist/client/agent-task-store.js +0 -47
  15. package/dist/common/schema.d.ts +0 -728
  16. package/dist/common/schema.js +0 -26
  17. package/dist/common/type-utils.d.ts +0 -11
  18. package/dist/common/type-utils.js +0 -3
  19. package/dist/common/uuid.d.ts +0 -1
  20. package/dist/common/uuid.js +0 -12
  21. package/dist/server/middleware/isTaskRequest.d.ts +0 -2
  22. package/dist/server/middleware/isTaskRequest.js +0 -32
  23. package/dist/server/plugin.on-get-request.d.ts +0 -3
  24. package/dist/server/plugin.on-get-request.js +0 -17
  25. package/dist/server/plugin.on-send-request.d.ts +0 -9
  26. package/dist/server/plugin.on-send-request.js +0 -107
  27. package/dist/server/serverUtils.d.ts +0 -13
  28. package/dist/server/serverUtils.js +0 -65
  29. package/dist/server/tasks/task-manager.d.ts +0 -22
  30. package/dist/server/tasks/task-manager.js +0 -205
  31. package/dist/server/tasks/task-store.d.ts +0 -8
  32. package/dist/server/tasks/task-store.js +0 -18
  33. package/dist/server/tasks/task-utilities.d.ts +0 -27
  34. package/dist/server/tasks/task-utilities.js +0 -139
  35. package/dist/server/tasks/task-utils.d.ts +0 -22
  36. package/dist/server/tasks/task-utils.js +0 -38
  37. package/dist/server/types/a2a-error.d.ts +0 -23
  38. package/dist/server/types/a2a-error.js +0 -95
  39. package/dist/server/types/a2a-types.d.ts +0 -56
  40. package/dist/server/types/a2a-types.js +0 -3
  41. package/dist/server/types/event-types.d.ts +0 -24
  42. package/dist/server/types/event-types.js +0 -3
@@ -1,136 +0,0 @@
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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
@@ -1,25 +0,0 @@
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
- }
@@ -1,47 +0,0 @@
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