@microsoft/teams.a2a 2.0.0-preview.3

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 (44) hide show
  1. package/README.md +180 -0
  2. package/dist/chat-prompt/plugin.d.ts +24 -0
  3. package/dist/chat-prompt/plugin.js +153 -0
  4. package/dist/chat-prompt/types.d.ts +60 -0
  5. package/dist/chat-prompt/types.js +3 -0
  6. package/dist/client/agent-client.d.ts +58 -0
  7. package/dist/client/agent-client.js +177 -0
  8. package/dist/client/agent-manager.d.ts +57 -0
  9. package/dist/client/agent-manager.js +136 -0
  10. package/dist/client/agent-task-store.d.ts +25 -0
  11. package/dist/client/agent-task-store.js +47 -0
  12. package/dist/common/schema.d.ts +728 -0
  13. package/dist/common/schema.js +26 -0
  14. package/dist/common/type-utils.d.ts +11 -0
  15. package/dist/common/type-utils.js +3 -0
  16. package/dist/common/uuid.d.ts +1 -0
  17. package/dist/common/uuid.js +12 -0
  18. package/dist/index.d.ts +10 -0
  19. package/dist/index.js +50 -0
  20. package/dist/server/middleware/isTaskRequest.d.ts +2 -0
  21. package/dist/server/middleware/isTaskRequest.js +32 -0
  22. package/dist/server/plugin.d.ts +49 -0
  23. package/dist/server/plugin.js +130 -0
  24. package/dist/server/plugin.on-get-request.d.ts +3 -0
  25. package/dist/server/plugin.on-get-request.js +17 -0
  26. package/dist/server/plugin.on-send-request.d.ts +9 -0
  27. package/dist/server/plugin.on-send-request.js +107 -0
  28. package/dist/server/serverUtils.d.ts +13 -0
  29. package/dist/server/serverUtils.js +65 -0
  30. package/dist/server/tasks/task-manager.d.ts +22 -0
  31. package/dist/server/tasks/task-manager.js +205 -0
  32. package/dist/server/tasks/task-store.d.ts +8 -0
  33. package/dist/server/tasks/task-store.js +18 -0
  34. package/dist/server/tasks/task-utilities.d.ts +27 -0
  35. package/dist/server/tasks/task-utilities.js +139 -0
  36. package/dist/server/tasks/task-utils.d.ts +22 -0
  37. package/dist/server/tasks/task-utils.js +38 -0
  38. package/dist/server/types/a2a-error.d.ts +23 -0
  39. package/dist/server/types/a2a-error.js +95 -0
  40. package/dist/server/types/a2a-types.d.ts +56 -0
  41. package/dist/server/types/a2a-types.js +3 -0
  42. package/dist/server/types/event-types.d.ts +24 -0
  43. package/dist/server/types/event-types.js +3 -0
  44. package/package.json +45 -0
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ // From https://github.com/google/A2A/blob/main/samples/js/src/schema.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.ErrorCodeUnsupportedOperation = exports.ErrorCodePushNotificationNotSupported = exports.ErrorCodeTaskNotCancelable = exports.ErrorCodeTaskNotFound = exports.ErrorCodeInternalError = exports.ErrorCodeInvalidParams = exports.ErrorCodeMethodNotFound = exports.ErrorCodeInvalidRequest = exports.ErrorCodeParseError = void 0;
5
+ // === Error Types (Standard and A2A)
6
+ /** Error code for JSON Parse Error (-32700). Invalid JSON was received by the server. */
7
+ exports.ErrorCodeParseError = -32700;
8
+ /** Error code for Invalid Request (-32600). The JSON sent is not a valid Request object. */
9
+ exports.ErrorCodeInvalidRequest = -32600;
10
+ /** Error code for Method Not Found (-32601). The method does not exist / is not available. */
11
+ exports.ErrorCodeMethodNotFound = -32601;
12
+ /** Error code for Invalid Params (-32602). Invalid method parameter(s). */
13
+ exports.ErrorCodeInvalidParams = -32602;
14
+ /** Error code for Internal Error (-32603). Internal JSON-RPC error. */
15
+ exports.ErrorCodeInternalError = -32603;
16
+ /** Error code for Task Not Found (-32001). The specified task was not found. */
17
+ exports.ErrorCodeTaskNotFound = -32001;
18
+ /** Error code for Task Not Cancelable (-32002). The specified task cannot be canceled. */
19
+ exports.ErrorCodeTaskNotCancelable = -32002;
20
+ /** Error code for Push Notification Not Supported (-32003). Push Notifications are not supported for this operation or agent. */
21
+ exports.ErrorCodePushNotificationNotSupported = -32003;
22
+ /** Error code for Unsupported Operation (-32004). The requested operation is not supported by the agent. */
23
+ exports.ErrorCodeUnsupportedOperation = -32004;
24
+ // Subscription responses are typically event streams (TaskUpdateEvent) sent over the transport,
25
+ // not direct JSON-RPC responses to the subscribe request itself.
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1vbi9zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdFQUF3RTs7O0FBa2pCeEUscUNBQXFDO0FBRXJDLHlGQUF5RjtBQUM1RSxRQUFBLG1CQUFtQixHQUFHLENBQUMsS0FBSyxDQUFDO0FBRTFDLDRGQUE0RjtBQUMvRSxRQUFBLHVCQUF1QixHQUFHLENBQUMsS0FBSyxDQUFDO0FBRTlDLDhGQUE4RjtBQUNqRixRQUFBLHVCQUF1QixHQUFHLENBQUMsS0FBSyxDQUFDO0FBRTlDLDJFQUEyRTtBQUM5RCxRQUFBLHNCQUFzQixHQUFHLENBQUMsS0FBSyxDQUFDO0FBRTdDLHVFQUF1RTtBQUMxRCxRQUFBLHNCQUFzQixHQUFHLENBQUMsS0FBSyxDQUFDO0FBRzdDLGdGQUFnRjtBQUNuRSxRQUFBLHFCQUFxQixHQUFHLENBQUMsS0FBSyxDQUFDO0FBRTVDLDBGQUEwRjtBQUM3RSxRQUFBLDBCQUEwQixHQUFHLENBQUMsS0FBSyxDQUFDO0FBRWpELGlJQUFpSTtBQUNwSCxRQUFBLHFDQUFxQyxHQUFHLENBQUMsS0FBSyxDQUFDO0FBRzVELDRHQUE0RztBQUMvRixRQUFBLDZCQUE2QixHQUFHLENBQUMsS0FBSyxDQUFDO0FBaVVwRCxnR0FBZ0c7QUFDaEcsaUVBQWlFIn0=
@@ -0,0 +1,11 @@
1
+ export type Success<T> = {
2
+ success: true;
3
+ data: T;
4
+ };
5
+ export type Failure = {
6
+ success: false;
7
+ error: Error;
8
+ };
9
+ export type Result<T> = Success<T> | Failure;
10
+ export type PromiseOrValue<T> = T | Promise<T>;
11
+ export type ValueOrFactory<T> = T | (() => PromiseOrValue<T>);
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tb24vdHlwZS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -0,0 +1 @@
1
+ export declare function generateRequestId(): string | number;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateRequestId = generateRequestId;
4
+ function generateRequestId() {
5
+ if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
6
+ return crypto.randomUUID();
7
+ }
8
+ else {
9
+ return Date.now();
10
+ }
11
+ }
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXVpZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tb24vdXVpZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDhDQU1DO0FBTkQsU0FBZ0IsaUJBQWlCO0lBQzdCLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLE9BQU8sTUFBTSxDQUFDLFVBQVUsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUMzRSxPQUFPLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUMvQixDQUFDO1NBQU0sQ0FBQztRQUNKLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLENBQUM7QUFDTCxDQUFDIn0=
@@ -0,0 +1,10 @@
1
+ export * from './chat-prompt/plugin';
2
+ export * from './chat-prompt/types';
3
+ export * from './client/agent-client';
4
+ export * from './client/agent-manager';
5
+ export * from './client/agent-task-store';
6
+ export * from './common/schema';
7
+ export * as schema from './common/schema';
8
+ export * from './server/plugin';
9
+ export * from './server/types/a2a-types';
10
+ export * from './server/types/event-types';
package/dist/index.js ADDED
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
19
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
20
+ };
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.schema = void 0;
40
+ __exportStar(require("./chat-prompt/plugin"), exports);
41
+ __exportStar(require("./chat-prompt/types"), exports);
42
+ __exportStar(require("./client/agent-client"), exports);
43
+ __exportStar(require("./client/agent-manager"), exports);
44
+ __exportStar(require("./client/agent-task-store"), exports);
45
+ __exportStar(require("./common/schema"), exports);
46
+ exports.schema = __importStar(require("./common/schema"));
47
+ __exportStar(require("./server/plugin"), exports);
48
+ __exportStar(require("./server/types/a2a-types"), exports);
49
+ __exportStar(require("./server/types/event-types"), exports);
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdURBQXFDO0FBQ3JDLHNEQUFvQztBQUNwQyx3REFBc0M7QUFDdEMseURBQXVDO0FBQ3ZDLDREQUEwQztBQUMxQyxrREFBZ0M7QUFDaEMsMERBQTBDO0FBQzFDLGtEQUFnQztBQUNoQywyREFBeUM7QUFDekMsNkRBQTJDIn0=
@@ -0,0 +1,2 @@
1
+ import express from 'express';
2
+ export declare function isTaskRequest(): (req: express.Request, res: express.Response, next: express.NextFunction) => void;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isTaskRequest = isTaskRequest;
4
+ const a2a_error_1 = require("../types/a2a-error");
5
+ function isTaskRequest() {
6
+ return (req, res, next) => {
7
+ const valid = typeof req.body === 'object' &&
8
+ req.body !== null &&
9
+ req.body.jsonrpc === '2.0' &&
10
+ typeof req.body.method === 'string' &&
11
+ (req.body.id === null ||
12
+ typeof req.body.id === 'string' ||
13
+ typeof req.body.id === 'number') && // ID is required for requests needing response
14
+ (req.body.params === undefined ||
15
+ typeof req.body.params === 'object' || // Allows null, array, or object
16
+ Array.isArray(req.body.params));
17
+ if (!valid) {
18
+ res
19
+ .status(400)
20
+ .send(a2a_error_1.A2AError.invalidRequest('Invalid JSON-RPC request structure').toJSONRPCError());
21
+ return;
22
+ }
23
+ const request = req.body;
24
+ if (request.method === 'tasks/send') {
25
+ if (!request.params?.id) {
26
+ res.status(400).send(a2a_error_1.A2AError.invalidParams('Invalid or missing task ID').toJSONRPCError());
27
+ }
28
+ }
29
+ next();
30
+ };
31
+ }
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNUYXNrUmVxdWVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2ZXIvbWlkZGxld2FyZS9pc1Rhc2tSZXF1ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBS0Esc0NBK0JDO0FBakNELGtEQUE4QztBQUU5QyxTQUFnQixhQUFhO0lBQzNCLE9BQU8sQ0FBQyxHQUFvQixFQUFFLEdBQXFCLEVBQUUsSUFBMEIsRUFBRSxFQUFFO1FBQ2pGLE1BQU0sS0FBSyxHQUNULE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRO1lBQzVCLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSTtZQUNqQixHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxLQUFLO1lBQzFCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssUUFBUTtZQUNuQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLElBQUk7Z0JBQ25CLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssUUFBUTtnQkFDL0IsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxRQUFRLENBQUMsSUFBSSwrQ0FBK0M7WUFDckYsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTO2dCQUM1QixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLFFBQVEsSUFBSSxnQ0FBZ0M7Z0JBQ3ZFLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRXBDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLEdBQUc7aUJBQ0EsTUFBTSxDQUFDLEdBQUcsQ0FBQztpQkFDWCxJQUFJLENBQUMsb0JBQVEsQ0FBQyxjQUFjLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1lBQ3hGLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQXNCLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFFNUMsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLFlBQVksRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDO2dCQUN4QixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBUSxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7WUFDOUYsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLEVBQUUsQ0FBQztJQUNULENBQUMsQ0FBQztBQUNKLENBQUMifQ==
@@ -0,0 +1,49 @@
1
+ import { EmitPluginEvent, HttpPlugin, IPlugin } from '@microsoft/teams.apps';
2
+ import { ILogger, IStorage } from '@microsoft/teams.common';
3
+ import { AgentManager, AgentManagerOptions } from '../client/agent-manager';
4
+ import * as schema from '../common/schema';
5
+ import { TaskManager } from './tasks/task-manager';
6
+ import { TaskStore } from './tasks/task-store';
7
+ import { A2AEvents } from './types/event-types';
8
+ interface IA2APluginOptions {
9
+ /**
10
+ * The agent card to be used for the A2A plugin.
11
+ */
12
+ agentCard: schema.AgentCard;
13
+ /**
14
+ * Path to the A2A server
15
+ * @default '/a2a'
16
+ */
17
+ path?: `/${string}`;
18
+ /**
19
+ * taskStore which stores the tasks that are sent to the agent
20
+ * or that the agent sends. If not provided, the App's storage will be used.
21
+ */
22
+ taskStore?: TaskStore;
23
+ /**
24
+ * The agent manager options that can be used to configure the agent manager.
25
+ * @default {}
26
+ */
27
+ managerOptions?: AgentManagerOptions;
28
+ }
29
+ export declare class A2APlugin implements IPlugin {
30
+ protected readonly emit: EmitPluginEvent<A2AEvents>;
31
+ protected readonly _httpPlugin: HttpPlugin;
32
+ protected readonly _storage: IStorage;
33
+ protected readonly _logger: ILogger;
34
+ __eventType: A2AEvents;
35
+ protected _card: schema.AgentCard;
36
+ protected _path: string;
37
+ protected _taskManager: TaskManager;
38
+ protected _taskStore: TaskStore;
39
+ protected _clientManager: AgentManager;
40
+ get clientManager(): AgentManager;
41
+ constructor(options: IA2APluginOptions);
42
+ onInit(): void;
43
+ private onTaskRequest;
44
+ private onSendRequest;
45
+ private onGetTaskRequest;
46
+ private onTaskGetRequest;
47
+ private onTaskSendRequest;
48
+ }
49
+ export {};
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.A2APlugin = void 0;
16
+ const express_1 = __importDefault(require("express"));
17
+ const teams_apps_1 = require("@microsoft/teams.apps");
18
+ const agent_manager_1 = require("../client/agent-manager");
19
+ const isTaskRequest_1 = require("./middleware/isTaskRequest");
20
+ const plugin_on_get_request_1 = require("./plugin.on-get-request");
21
+ const plugin_on_send_request_1 = require("./plugin.on-send-request");
22
+ const task_manager_1 = require("./tasks/task-manager");
23
+ const task_store_1 = require("./tasks/task-store");
24
+ const a2a_error_1 = require("./types/a2a-error");
25
+ let A2APlugin = class A2APlugin {
26
+ emit;
27
+ _httpPlugin;
28
+ _storage;
29
+ _logger;
30
+ __eventType;
31
+ _card;
32
+ _path;
33
+ _taskManager;
34
+ _taskStore;
35
+ _clientManager;
36
+ get clientManager() {
37
+ return this._clientManager;
38
+ }
39
+ constructor(options) {
40
+ this._card = options.agentCard;
41
+ if (this._card.capabilities.streaming) {
42
+ this._logger.warn('A2APlugin does not support streaming yet, but the agent card indicates it does');
43
+ }
44
+ this._path = options.path || '/a2a';
45
+ this._clientManager = new agent_manager_1.AgentManager(options.managerOptions);
46
+ if (options.taskStore) {
47
+ this._taskStore = options.taskStore;
48
+ }
49
+ }
50
+ onInit() {
51
+ this._taskStore = this._taskStore ?? new task_store_1.TaskStore(this._storage);
52
+ this._taskManager = new task_manager_1.TaskManager(this._taskStore, this._logger);
53
+ this._logger.info('A2APlugin agent card available at /.well-known/agent.json');
54
+ this._httpPlugin.get('/.well-known/agent.json', (_req, res) => {
55
+ res.json(this._card);
56
+ });
57
+ this._logger.info(`A2APlugin listening on ${this._path}`);
58
+ this._httpPlugin.post(this._path, express_1.default.json(), (0, isTaskRequest_1.isTaskRequest)(), this.onTaskRequest.bind(this));
59
+ }
60
+ async onTaskRequest(req, res, next) {
61
+ const request = req.body;
62
+ try {
63
+ switch (request.method) {
64
+ case 'tasks/send':
65
+ return this.onTaskSendRequest(request, res, next);
66
+ case 'tasks/sendSubscribe':
67
+ throw new Error('sendSubscribe not implemented yet');
68
+ case 'tasks/get':
69
+ return this.onTaskGetRequest(request, res, next);
70
+ case 'tasks/cancel':
71
+ throw new Error('cancel not implemented yet');
72
+ default:
73
+ throw a2a_error_1.A2AError.methodNotFound(request.method);
74
+ }
75
+ }
76
+ catch (err) {
77
+ if (err instanceof a2a_error_1.A2AError) {
78
+ err.taskId = request.id || undefined;
79
+ }
80
+ else {
81
+ throw a2a_error_1.A2AError.internalError('internal error', err);
82
+ }
83
+ next(err);
84
+ }
85
+ }
86
+ onSendRequest = plugin_on_send_request_1.onSendRequest; // eslint-disable-line @typescript-eslint/member-ordering
87
+ onGetTaskRequest = plugin_on_get_request_1.onGetTaskRequest; // eslint-disable-line @typescript-eslint/member-ordering
88
+ async onTaskGetRequest(req, res, next) {
89
+ await this.onGetTaskRequest(req, (result) => {
90
+ res.json(result);
91
+ if (result?.error) {
92
+ next(result.error);
93
+ }
94
+ });
95
+ }
96
+ async onTaskSendRequest(req, res, next) {
97
+ await this.onSendRequest(req, (result) => {
98
+ res.json(result);
99
+ if (result?.error) {
100
+ next(result.error);
101
+ }
102
+ });
103
+ }
104
+ };
105
+ exports.A2APlugin = A2APlugin;
106
+ __decorate([
107
+ (0, teams_apps_1.Event)('custom'),
108
+ __metadata("design:type", Function)
109
+ ], A2APlugin.prototype, "emit", void 0);
110
+ __decorate([
111
+ (0, teams_apps_1.Dependency)(),
112
+ __metadata("design:type", teams_apps_1.HttpPlugin)
113
+ ], A2APlugin.prototype, "_httpPlugin", void 0);
114
+ __decorate([
115
+ (0, teams_apps_1.Storage)(),
116
+ __metadata("design:type", Object)
117
+ ], A2APlugin.prototype, "_storage", void 0);
118
+ __decorate([
119
+ (0, teams_apps_1.Logger)(),
120
+ __metadata("design:type", Object)
121
+ ], A2APlugin.prototype, "_logger", void 0);
122
+ exports.A2APlugin = A2APlugin = __decorate([
123
+ (0, teams_apps_1.Plugin)({
124
+ name: 'a2a',
125
+ description: 'A2A Plugin',
126
+ version: '1.0.0',
127
+ }),
128
+ __metadata("design:paramtypes", [Object])
129
+ ], A2APlugin);
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci9wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0RBQThCO0FBRTlCLHNEQUF5SDtBQUd6SCwyREFBNEU7QUFHNUUsOERBQTJEO0FBQzNELG1FQUEyRDtBQUMzRCxxRUFBeUQ7QUFDekQsdURBQW1EO0FBQ25ELG1EQUErQztBQUMvQyxpREFBNkM7QUFpQ3RDLElBQU0sU0FBUyxHQUFmLE1BQU0sU0FBUztJQUVDLElBQUksQ0FBOEI7SUFHbEMsV0FBVyxDQUFjO0lBR3pCLFFBQVEsQ0FBWTtJQUdwQixPQUFPLENBQVc7SUFFckMsV0FBVyxDQUFhO0lBQ2QsS0FBSyxDQUFtQjtJQUN4QixLQUFLLENBQVM7SUFDZCxZQUFZLENBQWU7SUFDM0IsVUFBVSxDQUFhO0lBQ3ZCLGNBQWMsQ0FBZ0I7SUFDeEMsSUFBVyxhQUFhO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUMvQixDQUFDO0lBRUQsWUFBWSxPQUEwQjtRQUNsQyxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDL0IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnRkFBZ0YsQ0FBQyxDQUFDO1FBQ3hHLENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSw0QkFBWSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMvRCxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDeEMsQ0FBQztJQUNMLENBQUM7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
@@ -0,0 +1,3 @@
1
+ import * as schema from '../common/schema';
2
+ import { A2APlugin } from './plugin';
3
+ export declare function onGetTaskRequest(this: A2APlugin, req: schema.GetTaskRequest, cb: (result?: schema.GetTaskResponse) => void): Promise<void>;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.onGetTaskRequest = onGetTaskRequest;
4
+ const serverUtils_1 = require("./serverUtils");
5
+ const a2a_error_1 = require("./types/a2a-error");
6
+ async function onGetTaskRequest(req, cb) {
7
+ const { id: taskId } = req.params;
8
+ // Load both task and history
9
+ const data = await this._taskStore.load(taskId);
10
+ if (!data) {
11
+ cb((0, serverUtils_1.normalizeError)(a2a_error_1.A2AError.taskNotFound(taskId), taskId));
12
+ return;
13
+ }
14
+ // Return only the task object as per spec
15
+ cb((0, serverUtils_1.createSuccessResponse)(taskId, data.task));
16
+ }
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLm9uLWdldC1yZXF1ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci9wbHVnaW4ub24tZ2V0LXJlcXVlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFPQSw0Q0FjQztBQWxCRCwrQ0FBc0U7QUFDdEUsaURBQTZDO0FBR3RDLEtBQUssVUFBVSxnQkFBZ0IsQ0FFbEMsR0FBMEIsRUFDMUIsRUFBNkM7SUFFN0MsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO0lBQ2xDLDZCQUE2QjtJQUM3QixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNSLEVBQUUsQ0FBQyxJQUFBLDRCQUFjLEVBQUMsb0JBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMxRCxPQUFPO0lBQ1gsQ0FBQztJQUNELDBDQUEwQztJQUMxQyxFQUFFLENBQUMsSUFBQSxtQ0FBcUIsRUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDakQsQ0FBQyJ9
@@ -0,0 +1,9 @@
1
+ import * as schema from '../common/schema';
2
+ import { A2APlugin } from './plugin';
3
+ /**
4
+ * Handles the tasks/send request by processing the user message and setting up event handlers
5
+ *
6
+ * @param req - The request containing the task parameters
7
+ * @param cb - The callback to call with the response
8
+ */
9
+ export declare function onSendRequest(this: A2APlugin, req: schema.SendTaskRequest, cb: (result?: schema.SendTaskResponse) => void): Promise<void>;
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.onSendRequest = onSendRequest;
4
+ const serverUtils_1 = require("./serverUtils");
5
+ /**
6
+ * Handles the tasks/send request by processing the user message and setting up event handlers
7
+ *
8
+ * @param req - The request containing the task parameters
9
+ * @param cb - The callback to call with the response
10
+ */
11
+ async function onSendRequest(req, cb) {
12
+ const { id: taskId, message, sessionId, metadata } = req.params;
13
+ // Load or create task AND history
14
+ const currentData = await this._taskManager.loadOrCreateTaskAndHistory(taskId, message, sessionId, metadata);
15
+ const taskContext = this._taskManager.createTaskContext(currentData.task, message, currentData.history);
16
+ // Create operation context with references that can be updated
17
+ const operationContext = {
18
+ taskManager: this._taskManager,
19
+ taskStore: this._taskStore,
20
+ logger: this._logger,
21
+ taskId,
22
+ reqId: req.id || null,
23
+ contextRef: { current: taskContext },
24
+ dataRef: { current: currentData },
25
+ };
26
+ // Create the helper functions with operation context
27
+ const respond = createRespondFunction(operationContext, cb);
28
+ const accumulateArtifacts = createArtifactsFunction(operationContext, cb);
29
+ // Emit the event to process the task
30
+ this.emit('a2a:message', {
31
+ taskContext,
32
+ respond,
33
+ accumulateArtifacts,
34
+ });
35
+ }
36
+ async function updateTask(ctx, update) {
37
+ try {
38
+ // Apply the update to the task
39
+ const updatedData = await ctx.taskManager.applyUpdateToTaskAndHistory(ctx.dataRef.current, update);
40
+ // Save the updated task
41
+ await ctx.taskStore.save(updatedData);
42
+ // Update the task context reference
43
+ ctx.contextRef.current.task = updatedData.task;
44
+ // Return success result
45
+ return {
46
+ success: true,
47
+ data: updatedData,
48
+ };
49
+ }
50
+ catch (error) {
51
+ return handleUpdateError(ctx, error, ctx.dataRef.current);
52
+ }
53
+ }
54
+ async function handleUpdateError(ctx, error, currentData) {
55
+ // Convert error to failure state
56
+ const failedUpdate = ctx.taskManager.createFailedTaskState(`Handler failed: ${error instanceof Error ? error.message : String(error)}`);
57
+ // Apply failure state to task
58
+ const failedData = await ctx.taskManager.applyUpdateToTaskAndHistory(currentData, failedUpdate);
59
+ // Try to save the failed state
60
+ try {
61
+ await ctx.taskStore.save(failedData);
62
+ }
63
+ catch (saveError) {
64
+ ctx.logger.error(`Failed to save task ${ctx.taskId} after handler error:`, saveError);
65
+ }
66
+ // Return failure result with original error
67
+ return {
68
+ success: false,
69
+ error: new Error(`Handler failed: ${error instanceof Error ? error.message : String(error)}`),
70
+ };
71
+ }
72
+ function createRespondFunction(ctx, callback) {
73
+ return async (update) => {
74
+ ctx.logger.debug(`Responding to task ${ctx.taskId}`);
75
+ let responseValue;
76
+ if (typeof update === 'string') {
77
+ responseValue = ctx.taskManager.createCompletedTaskState(update);
78
+ }
79
+ else {
80
+ responseValue = update;
81
+ }
82
+ const result = await updateTask(ctx, responseValue);
83
+ // Update the current data reference with the latest version
84
+ if (result.success) {
85
+ ctx.dataRef.current = result.data;
86
+ }
87
+ if (!result.success) {
88
+ ctx.logger.error(`Failed to save task during response: ${result.error}`);
89
+ callback((0, serverUtils_1.normalizeError)(result.error, ctx.reqId, ctx.taskId));
90
+ return;
91
+ }
92
+ callback((0, serverUtils_1.createSuccessResponse)(ctx.taskId, ctx.dataRef.current.task));
93
+ };
94
+ }
95
+ function createArtifactsFunction(ctx, callback) {
96
+ return async (artifact) => {
97
+ const result = await updateTask(ctx, artifact);
98
+ if (result.success) {
99
+ ctx.dataRef.current = result.data;
100
+ }
101
+ else {
102
+ ctx.logger.error(`Failed to accumulate artifacts: ${result.error}`);
103
+ callback((0, serverUtils_1.normalizeError)(result.error, ctx.reqId, ctx.taskId));
104
+ }
105
+ };
106
+ }
107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLm9uLXNlbmQtcmVxdWVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2ZXIvcGx1Z2luLm9uLXNlbmQtcmVxdWVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWlDQSxzQ0EwQ0M7QUFwRUQsK0NBQXNFO0FBb0J0RTs7Ozs7R0FLRztBQUNJLEtBQUssVUFBVSxhQUFhLENBRWpDLEdBQTJCLEVBQzNCLEVBQThDO0lBRTlDLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUVoRSxrQ0FBa0M7SUFDbEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLDBCQUEwQixDQUNwRSxNQUFNLEVBQ04sT0FBTyxFQUNQLFNBQVMsRUFDVCxRQUFRLENBQ1QsQ0FBQztJQUVGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQ3JELFdBQVcsQ0FBQyxJQUFJLEVBQ2hCLE9BQU8sRUFDUCxXQUFXLENBQUMsT0FBTyxDQUNwQixDQUFDO0lBRUYsK0RBQStEO0lBQy9ELE1BQU0sZ0JBQWdCLEdBQTBCO1FBQzlDLFdBQVcsRUFBRSxJQUFJLENBQUMsWUFBWTtRQUM5QixTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVU7UUFDMUIsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPO1FBQ3BCLE1BQU07UUFDTixLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxJQUFJO1FBQ3JCLFVBQVUsRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUU7UUFDcEMsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRTtLQUNsQyxDQUFDO0lBRUYscURBQXFEO0lBQ3JELE1BQU0sT0FBTyxHQUFHLHFCQUFxQixDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzVE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
@@ -0,0 +1,13 @@
1
+ import { Response } from 'express';
2
+ import * as schema from '../common/schema';
3
+ /**
4
+ * Validates if the reqest is of the expected type.
5
+ * If not, it sends a 400 response with an error message.
6
+ */
7
+ export declare const validateRequest: <T extends schema.A2ARequest["method"]>(type: T, req: schema.A2ARequest, res: Response) => req is Extract<schema.A2ARequest, {
8
+ method: T;
9
+ }>;
10
+ export declare const createSuccessResponse: <T>(taskId: number | string | null, result: T) => schema.JSONRPCResponse<T, schema.A2AError>;
11
+ export declare const createErrorResponse: (id: number | string | null | undefined, error: schema.JSONRPCError<unknown>) => schema.JSONRPCResponse<null, schema.A2AError>;
12
+ /** Normalizes various error types into a JSONRPCResponse containing an error */
13
+ export declare const normalizeError: (error: any, reqId: number | string | null | undefined, taskId?: string) => schema.JSONRPCResponse<null, schema.A2AError>;
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeError = exports.createErrorResponse = exports.createSuccessResponse = exports.validateRequest = void 0;
4
+ const a2a_error_1 = require("./types/a2a-error");
5
+ const isType = (type) => (req) => {
6
+ return req.method === type;
7
+ };
8
+ /**
9
+ * Validates if the reqest is of the expected type.
10
+ * If not, it sends a 400 response with an error message.
11
+ */
12
+ const validateRequest = (type, req, res) => {
13
+ if (isType(type)(req)) {
14
+ return true;
15
+ }
16
+ res
17
+ .status(400)
18
+ .send(a2a_error_1.A2AError.invalidRequest('Invalid JSON-RPC request structure').toJSONRPCError());
19
+ return false;
20
+ };
21
+ exports.validateRequest = validateRequest;
22
+ const createSuccessResponse = (taskId, result) => {
23
+ if (taskId === null) {
24
+ // This shouldn't happen for methods that expect a response, but safeguard
25
+ throw a2a_error_1.A2AError.internalError('Cannot create success response for null ID.');
26
+ }
27
+ return {
28
+ jsonrpc: '2.0',
29
+ id: taskId,
30
+ result: result,
31
+ };
32
+ };
33
+ exports.createSuccessResponse = createSuccessResponse;
34
+ const createErrorResponse = (id, error) => {
35
+ // For errors, ID should be the same as request ID, or null if that couldn't be determined
36
+ return {
37
+ jsonrpc: '2.0',
38
+ id: id, // Can be null if request ID was invalid/missing
39
+ error: error,
40
+ };
41
+ };
42
+ exports.createErrorResponse = createErrorResponse;
43
+ /** Normalizes various error types into a JSONRPCResponse containing an error */
44
+ const normalizeError = (error, reqId, taskId) => {
45
+ let a2aError;
46
+ if (error instanceof a2a_error_1.A2AError) {
47
+ a2aError = error;
48
+ }
49
+ else if (error instanceof Error) {
50
+ // Generic JS error
51
+ a2aError = a2a_error_1.A2AError.internalError(error.message, { stack: error.stack });
52
+ }
53
+ else {
54
+ // Unknown error type
55
+ a2aError = a2a_error_1.A2AError.internalError('An unknown error occurred.', error);
56
+ }
57
+ // Ensure Task ID context is present if possible
58
+ if (taskId && !a2aError.taskId) {
59
+ a2aError.taskId = taskId;
60
+ }
61
+ console.error(`Error processing request (Task: ${a2aError.taskId ?? 'N/A'}, ReqID: ${reqId ?? 'N/A'}):`, a2aError);
62
+ return (0, exports.createErrorResponse)(reqId, a2aError.toJSONRPCError());
63
+ };
64
+ exports.normalizeError = normalizeError;
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyVXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmVyL3NlcnZlclV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLGlEQUE2QztBQUU3QyxNQUFNLE1BQU0sR0FDVixDQUF3QyxJQUFPLEVBQUUsRUFBRSxDQUNqRCxDQUNFLEdBQXNCLEVBQzRCLEVBQUU7SUFDcEQsT0FBTyxHQUFHLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQztBQUM3QixDQUFDLENBQUM7QUFFTjs7O0dBR0c7QUFDSSxNQUFNLGVBQWUsR0FBRyxDQUM3QixJQUFPLEVBQ1AsR0FBc0IsRUFDdEIsR0FBYSxFQUNxQyxFQUFFO0lBQ3BELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsR0FBRztTQUNBLE1BQU0sQ0FBQyxHQUFHLENBQUM7U0FDWCxJQUFJLENBQ0gsb0JBQVEsQ0FBQyxjQUFjLENBQ3JCLG9DQUFvQyxDQUNyQyxDQUFDLGNBQWMsRUFBRSxDQUNuQixDQUFDO0lBQ0osT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDLENBQUM7QUFqQlcsUUFBQSxlQUFlLG1CQWlCMUI7QUFFSyxNQUFNLHFCQUFxQixHQUFHLENBQ25DLE1BQThCLEVBQzlCLE1BQVMsRUFDbUMsRUFBRTtJQUM5QyxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNwQiwwRUFBMEU7UUFDMUUsTUFBTSxvQkFBUSxDQUFDLGFBQWEsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFDRCxPQUFPO1FBQ0wsT0FBTyxFQUFFLEtBQUs7UUFDZCxFQUFFLEVBQUUsTUFBTTtRQUNWLE1BQU0sRUFBRSxNQUFNO0tBQ2YsQ0FBQztBQUNKLENBQUMsQ0FBQztBQWJXLFFBQUEscUJBQXFCLHlCQWFoQztBQUVLLE1BQU0sbUJBQW1CLEdBQUcsQ0FDakMsRUFBc0MsRUFDdEMsS0FBbUMsRUFDWSxFQUFFO0lBQ2pELDBGQUEwRjtJQUMxRixPQUFPO1FBQ0wsT0FBTyxFQUFFLEtBQUs7UUFDZCxFQUFFLEVBQUUsRUFBRSxFQUFFLGdEQUFnRDtRQUN4RCxLQUFLLEVBQUUsS0FBSztLQUNiLENBQUM7QUFDSixDQUFDLENBQUM7QUFWVyxRQUFBLG1CQUFtQix1QkFVOUI7QUFFRixnRkFBZ0Y7QUFDekUsTUFBTSxjQUFjLEdBQUcsQ0FDNUIsS0FBVSxFQUNWLEtBQXlDLEVBQ3pDLE1BQWUsRUFDZ0MsRUFBRTtJQUNqRCxJQUFJLFFBQWtCLENBQUM7SUFDdkIsSUFBSSxLQUFLLFlBQVksb0JBQVEsRUFBRSxDQUFDO1FBQzlCLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDbkIsQ0FBQztTQUFNLElBQUksS0FBSyxZQUFZLEtBQUssRUFBRSxDQUFDO1FBQ2xDLG1CQUFtQjtRQUNuQixRQUFRLEdBQUcsb0JBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUMzRSxDQUFDO1NBQU0sQ0FBQztRQUNOLHFCQUFxQjtRQUNyQixRQUFRLEdBQUcsb0JBQVEsQ0FBQyxhQUFhLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELGdEQUFnRDtJQUNoRCxJQUFJLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMvQixRQUFRLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUMzQixDQUFDO0lBRUQsT0FBTyxDQUFDLEtBQUssQ0FDWCxtQ0FBbUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxLQUFLLFlBQVksS0FBSyxJQUFJLEtBQ2hGLElBQUksRUFDSixRQUFRLENBQ1QsQ0FBQztJQUVGLE9BQU8sSUFBQSwyQkFBbUIsRUFBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7QUFDL0QsQ0FBQyxDQUFDO0FBNUJXLFFBQUEsY0FBYyxrQkE0QnpCIn0=
@@ -0,0 +1,22 @@
1
+ import { ILogger } from '@microsoft/teams.common';
2
+ import * as schema from '../../common/schema';
3
+ import { ITaskStore, TaskAndHistory, TaskContext, TaskUpdate } from '../types/a2a-types';
4
+ export declare const finalStates: schema.TaskState[];
5
+ export declare class TaskManager {
6
+ private taskStore;
7
+ private logger;
8
+ constructor(taskStore: ITaskStore, logger: ILogger);
9
+ applyUpdateToTaskAndHistory(current: TaskAndHistory, update: TaskUpdate): TaskAndHistory;
10
+ stateChangeOnNewRequest(currentState: schema.TaskState): schema.TaskState | null;
11
+ loadOrCreateTaskAndHistory(taskId: string, initialMessage: schema.Message, sessionId?: string | null, // Allow null
12
+ metadata?: Record<string, unknown> | null): Promise<TaskAndHistory>;
13
+ createTaskContext(task: schema.Task, userMessage: schema.Message, history: schema.Message[]): TaskContext;
14
+ isFinalState(current: TaskAndHistory): boolean;
15
+ createFailedTaskState(failureText: string): TaskUpdate;
16
+ createCompletedTaskState(text?: string): TaskUpdate;
17
+ createTaskStatusEvent(taskId: string, status: schema.TaskStatus, final: boolean): schema.TaskStatusUpdateEvent;
18
+ createTaskArtifactEvent(taskId: string, artifact: schema.Artifact, final: boolean): schema.TaskArtifactUpdateEvent;
19
+ private findArtifactIndex;
20
+ private appendToArtifact;
21
+ private sortArtifacts;
22
+ }