@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,205 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TaskManager = exports.finalStates = void 0;
4
+ const task_utils_1 = require("./task-utils");
5
+ // Handle state transitions for existing tasks
6
+ exports.finalStates = [
7
+ 'completed',
8
+ 'failed',
9
+ 'canceled',
10
+ ];
11
+ class TaskManager {
12
+ taskStore;
13
+ logger;
14
+ constructor(taskStore, logger) {
15
+ this.taskStore = taskStore;
16
+ this.logger = logger;
17
+ }
18
+ applyUpdateToTaskAndHistory(current, update) {
19
+ const newTask = { ...current.task }; // Shallow copy task
20
+ const newHistory = [...current.history]; // Shallow copy history
21
+ if ((0, task_utils_1.isTaskStatusUpdate)(update)) {
22
+ // Merge status update
23
+ newTask.status = {
24
+ ...newTask.status, // Keep existing properties if not overwritten
25
+ ...update, // Apply updates
26
+ timestamp: (0, task_utils_1.getCurrentTimestamp)(), // Always update timestamp
27
+ };
28
+ // If the update includes an agent message, add it to history
29
+ if (update.message?.role === 'agent') {
30
+ newHistory.push(update.message);
31
+ }
32
+ }
33
+ else if ((0, task_utils_1.isArtifactUpdate)(update) ||
34
+ (Array.isArray(update) && update.every(task_utils_1.isArtifactUpdate))) {
35
+ // Handle artifact update
36
+ if (!newTask.artifacts) {
37
+ newTask.artifacts = [];
38
+ }
39
+ else {
40
+ // Ensure we're working with a copy of the artifacts array
41
+ newTask.artifacts = [...newTask.artifacts];
42
+ }
43
+ const updates = Array.isArray(update) ? update : [update];
44
+ for (const artifact of updates) {
45
+ const existingIndex = this.findArtifactIndex(newTask.artifacts, artifact);
46
+ if (existingIndex >= 0) {
47
+ newTask.artifacts[existingIndex] = artifact.append
48
+ ? this.appendToArtifact(newTask.artifacts[existingIndex], artifact)
49
+ : { ...artifact };
50
+ }
51
+ else {
52
+ newTask.artifacts.push({ ...artifact });
53
+ this.sortArtifacts(newTask.artifacts);
54
+ }
55
+ }
56
+ }
57
+ return { task: newTask, history: newHistory };
58
+ }
59
+ stateChangeOnNewRequest(currentState) {
60
+ switch (currentState) {
61
+ case 'completed':
62
+ case 'failed':
63
+ case 'canceled':
64
+ // Reset to submitted when receiving message in final state
65
+ return 'submitted';
66
+ case 'input-required':
67
+ // If the previous state was "input-required", transition to working
68
+ return 'working';
69
+ case 'working':
70
+ case 'submitted':
71
+ case 'unknown':
72
+ // No state change needed
73
+ return null;
74
+ }
75
+ }
76
+ async loadOrCreateTaskAndHistory(taskId, initialMessage, sessionId, // Allow null
77
+ metadata // Allow null
78
+ ) {
79
+ let data = await this.taskStore.load(taskId);
80
+ let needsSave = false;
81
+ if (!data) {
82
+ // Create new task and history
83
+ const initialTask = {
84
+ id: taskId,
85
+ sessionId: sessionId ?? undefined, // Store undefined if null
86
+ status: {
87
+ state: 'submitted', // Start as submitted
88
+ timestamp: (0, task_utils_1.getCurrentTimestamp)(),
89
+ message: null, // Initial user message goes only to history for now
90
+ },
91
+ artifacts: [],
92
+ metadata: metadata ?? undefined, // Store undefined if null
93
+ };
94
+ const initialHistory = [initialMessage]; // History starts with user message
95
+ data = { task: initialTask, history: initialHistory };
96
+ needsSave = true; // Mark for saving
97
+ this.logger.debug(`[Task ${taskId}] Created new task and history.`);
98
+ }
99
+ else {
100
+ this.logger.debug(`[Task ${taskId}] Loaded existing task and history.`);
101
+ // Add current user message to history
102
+ // Make a copy before potentially modifying
103
+ data = { task: data.task, history: [...data.history, initialMessage] };
104
+ needsSave = true; // History updated, mark for saving
105
+ // Use the state transition helper
106
+ const newState = this.stateChangeOnNewRequest(data.task.status.state);
107
+ if (newState) {
108
+ const stateUpdate = {
109
+ state: newState,
110
+ message: newState === 'submitted' ? null : data.task.status.message,
111
+ };
112
+ data = this.applyUpdateToTaskAndHistory(data, stateUpdate);
113
+ this.logger.debug(`[Task ${taskId}] Transitioned state to ${newState}.`);
114
+ }
115
+ }
116
+ // Save if created or modified before returning
117
+ if (needsSave) {
118
+ await this.taskStore.save(data);
119
+ }
120
+ // Return copies to prevent mutation by caller before handler runs
121
+ return { task: { ...data.task }, history: [...data.history] };
122
+ }
123
+ createTaskContext(task, userMessage, history) {
124
+ return {
125
+ task: { ...task }, // Pass a copy
126
+ userMessage: userMessage,
127
+ history: [...history], // Pass a copy of the history
128
+ isCancelled: () => false, // TODO: support this when cancellations are implemented
129
+ };
130
+ }
131
+ isFinalState(current) {
132
+ return exports.finalStates.includes(current.task.status.state);
133
+ }
134
+ createFailedTaskState(failureText) {
135
+ return {
136
+ state: 'failed',
137
+ message: {
138
+ role: 'agent',
139
+ parts: [
140
+ {
141
+ type: 'text',
142
+ text: failureText,
143
+ },
144
+ ],
145
+ },
146
+ };
147
+ }
148
+ createCompletedTaskState(text) {
149
+ return {
150
+ state: 'completed',
151
+ message: {
152
+ role: 'agent',
153
+ parts: [
154
+ {
155
+ type: 'text',
156
+ text: text ?? 'task completed',
157
+ },
158
+ ],
159
+ },
160
+ };
161
+ }
162
+ createTaskStatusEvent(taskId, status, final) {
163
+ return {
164
+ id: taskId,
165
+ status: status,
166
+ final: final,
167
+ };
168
+ }
169
+ createTaskArtifactEvent(taskId, artifact, final) {
170
+ return {
171
+ id: taskId,
172
+ artifact: artifact,
173
+ final: final,
174
+ };
175
+ }
176
+ // Private helper methods
177
+ findArtifactIndex(artifacts, update) {
178
+ if (update.index !== undefined) {
179
+ return update.index < artifacts.length ? update.index : -1;
180
+ }
181
+ return update.name
182
+ ? artifacts.findIndex((a) => a.name === update.name)
183
+ : -1;
184
+ }
185
+ appendToArtifact(existing, update) {
186
+ // Create a deep copy for modification to avoid mutating original
187
+ const artifact = JSON.parse(JSON.stringify(existing));
188
+ artifact.parts.push(...update.parts);
189
+ if (update.metadata) {
190
+ artifact.metadata = { ...(artifact.metadata || {}), ...update.metadata };
191
+ }
192
+ if (update.lastChunk !== undefined)
193
+ artifact.lastChunk = update.lastChunk;
194
+ if (update.description)
195
+ artifact.description = update.description;
196
+ return artifact;
197
+ }
198
+ sortArtifacts(artifacts) {
199
+ if (artifacts.some((a) => a.index !== undefined)) {
200
+ artifacts.sort((a, b) => (a.index ?? 0) - (b.index ?? 0));
201
+ }
202
+ }
203
+ }
204
+ exports.TaskManager = TaskManager;
205
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZlci90YXNrcy90YXNrLW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBVUEsNkNBSXNCO0FBRXRCLDhDQUE4QztBQUNqQyxRQUFBLFdBQVcsR0FBdUI7SUFDN0MsV0FBVztJQUNYLFFBQVE7SUFDUixVQUFVO0NBQ1gsQ0FBQztBQUVGLE1BQWEsV0FBVztJQUNGO0lBQStCO0lBQW5ELFlBQW9CLFNBQXFCLEVBQVUsTUFBZTtRQUE5QyxjQUFTLEdBQVQsU0FBUyxDQUFZO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBUztJQUFJLENBQUM7SUFFdkUsMkJBQTJCLENBQ3pCLE9BQXVCLEVBQ3ZCLE1BQWtCO1FBRWxCLE1BQU0sT0FBTyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxvQkFBb0I7UUFDekQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLHVCQUF1QjtRQUVoRSxJQUFJLElBQUEsK0JBQWtCLEVBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMvQixzQkFBc0I7WUFDdEIsT0FBTyxDQUFDLE1BQU0sR0FBRztnQkFDZixHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsOENBQThDO2dCQUNqRSxHQUFHLE1BQU0sRUFBRSxnQkFBZ0I7Z0JBQzNCLFNBQVMsRUFBRSxJQUFBLGdDQUFtQixHQUFFLEVBQUUsMEJBQTBCO2FBQzdELENBQUM7WUFDRiw2REFBNkQ7WUFDN0QsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDckMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbEMsQ0FBQztRQUNILENBQUM7YUFBTSxJQUNMLElBQUEsNkJBQWdCLEVBQUMsTUFBTSxDQUFD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
@@ -0,0 +1,8 @@
1
+ import { IStorage } from '@microsoft/teams.common';
2
+ import { ITaskStore, TaskAndHistory } from '../types/a2a-types';
3
+ export declare class TaskStore implements ITaskStore {
4
+ private storage;
5
+ constructor(storage: IStorage<string, TaskAndHistory>);
6
+ save(data: TaskAndHistory): Promise<void>;
7
+ load(taskId: string): Promise<TaskAndHistory | null>;
8
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TaskStore = void 0;
4
+ class TaskStore {
5
+ storage;
6
+ constructor(storage) {
7
+ this.storage = storage;
8
+ }
9
+ async save(data) {
10
+ return this.storage.set(data.task.id, data);
11
+ }
12
+ async load(taskId) {
13
+ const result = await this.storage.get(taskId);
14
+ return result ?? null;
15
+ }
16
+ }
17
+ exports.TaskStore = TaskStore;
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2ZXIvdGFza3MvdGFzay1zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSxNQUFhLFNBQVM7SUFDRTtJQUFwQixZQUFvQixPQUF5QztRQUF6QyxZQUFPLEdBQVAsT0FBTyxDQUFrQztJQUFJLENBQUM7SUFFbEUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFvQjtRQUMzQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQWM7UUFDckIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxPQUFPLE1BQU0sSUFBSSxJQUFJLENBQUM7SUFDMUIsQ0FBQztDQUNKO0FBWEQsOEJBV0MifQ==
@@ -0,0 +1,27 @@
1
+ import * as schema from '../../common/schema';
2
+ import { TaskAndHistory, TaskContext, TaskUpdate } from '../types/a2a-types';
3
+ /**
4
+ * Handles task-specific operations like state transitions and updates
5
+ */
6
+ export declare class TaskUtilities {
7
+ private activeCancellations;
8
+ constructor(activeCancellations: Set<string>);
9
+ createContext(task: schema.Task, userMessage: schema.Message, history: schema.Message[]): TaskContext;
10
+ withAppliedUpdate(current: TaskAndHistory, update: TaskUpdate): TaskAndHistory;
11
+ stateChangeOnNewRequest(currentState: schema.TaskState): schema.TaskState | null;
12
+ createStateUpdate(state: schema.TaskState): TaskUpdate;
13
+ /**
14
+ * Creates a status update event object
15
+ */
16
+ createTaskStatusEvent(taskId: string, status: schema.TaskStatus, final: boolean): schema.TaskStatusUpdateEvent;
17
+ /**
18
+ * Creates an artifact update event object
19
+ */
20
+ createTaskArtifactEvent(taskId: string, artifact: schema.Artifact, final: boolean): schema.TaskArtifactUpdateEvent;
21
+ private applyStatusUpdate;
22
+ private applyArtifactUpdate;
23
+ private findArtifactIndex;
24
+ private appendToArtifact;
25
+ private sortArtifacts;
26
+ private isTaskStatusUpdate;
27
+ }
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TaskUtilities = void 0;
4
+ const task_utils_1 = require("./task-utils");
5
+ /**
6
+ * Handles task-specific operations like state transitions and updates
7
+ */
8
+ class TaskUtilities {
9
+ activeCancellations;
10
+ constructor(activeCancellations) {
11
+ this.activeCancellations = activeCancellations;
12
+ }
13
+ createContext(task, userMessage, history) {
14
+ return {
15
+ task: { ...task },
16
+ userMessage,
17
+ history: [...history],
18
+ isCancelled: () => this.activeCancellations.has(task.id),
19
+ };
20
+ }
21
+ withAppliedUpdate(current, update) {
22
+ return this.isTaskStatusUpdate(update)
23
+ ? this.applyStatusUpdate(current, update)
24
+ : this.applyArtifactUpdate(current, update);
25
+ }
26
+ stateChangeOnNewRequest(currentState) {
27
+ switch (currentState) {
28
+ case 'completed':
29
+ case 'failed':
30
+ case 'canceled':
31
+ // In the original sample, they chose to restart the task.
32
+ // A stricter approach could be to throw an error here.
33
+ // Might make sense to make this behavior configurable.
34
+ throw new Error(`Cannot transition from final state: ${currentState}`);
35
+ case 'input-required':
36
+ // If the previous state was "input-required", we can assume the task is still in progress.
37
+ return 'working';
38
+ case 'working':
39
+ return null;
40
+ case 'submitted':
41
+ // The orgiinal sample considered this odd, but didn't care
42
+ return null;
43
+ case 'unknown':
44
+ // Let the caller handle this case
45
+ return null;
46
+ }
47
+ }
48
+ createStateUpdate(state) {
49
+ if (state === 'submitted') {
50
+ // If this is a new task, we reset the message
51
+ return { state, message: null };
52
+ }
53
+ return { state };
54
+ }
55
+ /**
56
+ * Creates a status update event object
57
+ */
58
+ createTaskStatusEvent(taskId, status, final) {
59
+ return {
60
+ id: taskId,
61
+ status: status,
62
+ final: final,
63
+ };
64
+ }
65
+ /**
66
+ * Creates an artifact update event object
67
+ */
68
+ createTaskArtifactEvent(taskId, artifact, final) {
69
+ return {
70
+ id: taskId,
71
+ artifact: artifact,
72
+ final: final,
73
+ };
74
+ }
75
+ applyStatusUpdate(current, update) {
76
+ const newTask = { ...current.task };
77
+ const newHistory = [...current.history];
78
+ // Merge status update
79
+ newTask.status = {
80
+ ...newTask.status, // Keep existing properties if not overwritten
81
+ ...update, // Apply updates
82
+ timestamp: (0, task_utils_1.getCurrentTimestamp)(), // Always update timestamp
83
+ };
84
+ // If the update includes an agent message, add it to history
85
+ if (update.message?.role === 'agent') {
86
+ newHistory.push(update.message);
87
+ }
88
+ return { task: newTask, history: newHistory };
89
+ }
90
+ applyArtifactUpdate(current, update) {
91
+ const newTask = { ...current.task };
92
+ newTask.artifacts = newTask.artifacts ? [...newTask.artifacts] : [];
93
+ const updates = Array.isArray(update) ? update : [update];
94
+ for (const update of updates) {
95
+ const existingIndex = this.findArtifactIndex(newTask.artifacts, update);
96
+ if (existingIndex >= 0) {
97
+ newTask.artifacts[existingIndex] = update.append
98
+ ? this.appendToArtifact(newTask.artifacts[existingIndex], update)
99
+ : { ...update };
100
+ }
101
+ else {
102
+ newTask.artifacts.push({ ...update });
103
+ this.sortArtifacts(newTask.artifacts);
104
+ }
105
+ }
106
+ return { task: newTask, history: current.history };
107
+ }
108
+ findArtifactIndex(artifacts, update) {
109
+ if (update.index !== undefined) {
110
+ return update.index < artifacts.length ? update.index : -1;
111
+ }
112
+ return update.name
113
+ ? artifacts.findIndex((a) => a.name === update.name)
114
+ : -1;
115
+ }
116
+ appendToArtifact(existing, update) {
117
+ // Create a deep copy for modification to avoid mutating original
118
+ const artifact = JSON.parse(JSON.stringify(existing));
119
+ artifact.parts.push(...update.parts);
120
+ if (update.metadata) {
121
+ artifact.metadata = { ...(artifact.metadata || {}), ...update.metadata };
122
+ }
123
+ if (update.lastChunk !== undefined)
124
+ artifact.lastChunk = update.lastChunk;
125
+ if (update.description)
126
+ artifact.description = update.description;
127
+ return artifact;
128
+ }
129
+ sortArtifacts(artifacts) {
130
+ if (artifacts.some((a) => a.index !== undefined)) {
131
+ artifacts.sort((a, b) => (a.index ?? 0) - (b.index ?? 0));
132
+ }
133
+ }
134
+ isTaskStatusUpdate(update) {
135
+ return 'state' in update;
136
+ }
137
+ }
138
+ exports.TaskUtilities = TaskUtilities;
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay11dGlsaXRpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmVyL3Rhc2tzL3Rhc2stdXRpbGl0aWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdBLDZDQUFtRDtBQUVuRDs7R0FFRztBQUNILE1BQWEsYUFBYTtJQUNoQixtQkFBbUIsQ0FBYztJQUV6QyxZQUFZLG1CQUFnQztRQUMxQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUM7SUFDakQsQ0FBQztJQUVELGFBQWEsQ0FDWCxJQUFpQixFQUNqQixXQUEyQixFQUMzQixPQUF5QjtRQUV6QixPQUFPO1lBQ0wsSUFBSSxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUU7WUFDakIsV0FBVztZQUNYLE9BQU8sRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDO1lBQ3JCLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7U0FDekQsQ0FBQztJQUNKLENBQUM7SUFFRCxpQkFBaUIsQ0FDZixPQUF1QixFQUN2QixNQUFrQjtRQUVsQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7WUFDcEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDO1lBQ3pDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCx1QkFBdUIsQ0FDckIsWUFBOEI7UUFFOUIsUUFBUSxZQUFZLEVBQUUsQ0FBQztZQUNyQixLQUFLLFdBQVcsQ0FBQztZQUNqQixLQUFLLFFBQVEsQ0FBQztZQUNkLEtBQUssVUFBVTtnQkFDYiwwREFBMEQ7Z0JBQzFELHVEQUF1RDtnQkFDdkQsdURBQXVEO2dCQUN2RCxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxZ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
@@ -0,0 +1,22 @@
1
+ import * as schema from '../../common/schema';
2
+ /**
3
+ * Generates a timestamp in ISO 8601 format.
4
+ * @returns The current timestamp as a string.
5
+ */
6
+ export declare function getCurrentTimestamp(): string;
7
+ /**
8
+ * Checks if a value is a plain object (excluding arrays and null).
9
+ * @param value The value to check.
10
+ * @returns True if the value is a plain object, false otherwise.
11
+ */
12
+ export declare function isObject(value: unknown): value is Record<string, any>;
13
+ /**
14
+ * Type guard to check if an object is a TaskStatus update (lacks 'parts').
15
+ * Used to differentiate yielded updates from the handler.
16
+ */
17
+ export declare function isTaskStatusUpdate(update: any): update is Omit<schema.TaskStatus, 'timestamp'>;
18
+ /**
19
+ * Type guard to check if an object is an Artifact update (has 'parts').
20
+ * Used to differentiate yielded updates from the handler.
21
+ */
22
+ export declare function isArtifactUpdate(update: any): update is schema.Artifact;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getCurrentTimestamp = getCurrentTimestamp;
4
+ exports.isObject = isObject;
5
+ exports.isTaskStatusUpdate = isTaskStatusUpdate;
6
+ exports.isArtifactUpdate = isArtifactUpdate;
7
+ /**
8
+ * Generates a timestamp in ISO 8601 format.
9
+ * @returns The current timestamp as a string.
10
+ */
11
+ function getCurrentTimestamp() {
12
+ return new Date().toISOString();
13
+ }
14
+ /**
15
+ * Checks if a value is a plain object (excluding arrays and null).
16
+ * @param value The value to check.
17
+ * @returns True if the value is a plain object, false otherwise.
18
+ */
19
+ function isObject(value) {
20
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
21
+ }
22
+ /**
23
+ * Type guard to check if an object is a TaskStatus update (lacks 'parts').
24
+ * Used to differentiate yielded updates from the handler.
25
+ */
26
+ function isTaskStatusUpdate(update) {
27
+ // Check if it has 'state' and NOT 'parts' (which Artifacts have)
28
+ return isObject(update) && 'state' in update && !('parts' in update);
29
+ }
30
+ /**
31
+ * Type guard to check if an object is an Artifact update (has 'parts').
32
+ * Used to differentiate yielded updates from the handler.
33
+ */
34
+ function isArtifactUpdate(update) {
35
+ // Check if it has 'parts'
36
+ return isObject(update) && 'parts' in update;
37
+ }
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2ZXIvdGFza3MvdGFzay11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQU1BLGtEQUVDO0FBT0QsNEJBRUM7QUFNRCxnREFLQztBQU1ELDRDQUtDO0FBckNEOzs7R0FHRztBQUNILFNBQWdCLG1CQUFtQjtJQUMvQixPQUFPLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDcEMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixRQUFRLENBQUMsS0FBYztJQUNuQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoRixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQzlCLE1BQVc7SUFFWCxpRUFBaUU7SUFDakUsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksT0FBTyxJQUFJLE1BQU0sSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixnQkFBZ0IsQ0FDNUIsTUFBVztJQUVYLDBCQUEwQjtJQUMxQixPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxPQUFPLElBQUksTUFBTSxDQUFDO0FBQ2pELENBQUMifQ==
@@ -0,0 +1,23 @@
1
+ import * as schema from '../../common/schema';
2
+ /**
3
+ * Custom error class for A2A server operations, incorporating JSON-RPC error codes.
4
+ */
5
+ export declare class A2AError extends Error implements schema.A2AError {
6
+ code: schema.KnownErrorCode | number;
7
+ data?: unknown;
8
+ taskId?: string | number;
9
+ constructor(code: schema.KnownErrorCode | number, message: string, data?: unknown, taskId?: string | number);
10
+ static parseError(message: string, data?: unknown): A2AError;
11
+ static invalidRequest(message: string, data?: unknown): A2AError;
12
+ static methodNotFound(method: string): A2AError;
13
+ static invalidParams(message: string, data?: unknown): A2AError;
14
+ static internalError(message: string, data?: unknown): A2AError;
15
+ static taskNotFound(taskId: string): A2AError;
16
+ static taskNotCancelable(taskId: string): A2AError;
17
+ static pushNotificationNotSupported(): A2AError;
18
+ static unsupportedOperation(operation: string): A2AError;
19
+ /**
20
+ * Formats the error into a standard JSON-RPC error object structure.
21
+ */
22
+ toJSONRPCError(): schema.JSONRPCError<unknown>;
23
+ }
@@ -0,0 +1,95 @@
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 __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.A2AError = void 0;
37
+ const schema = __importStar(require("../../common/schema"));
38
+ /**
39
+ * Custom error class for A2A server operations, incorporating JSON-RPC error codes.
40
+ */
41
+ class A2AError extends Error {
42
+ code;
43
+ data;
44
+ taskId; // Optional task ID context
45
+ constructor(code, message, data, taskId) {
46
+ super(message);
47
+ this.name = 'A2AError';
48
+ this.code = code;
49
+ this.data = data;
50
+ this.taskId = taskId; // Store associated task ID if provided
51
+ }
52
+ // Static factory methods for common errors
53
+ static parseError(message, data) {
54
+ return new A2AError(schema.ErrorCodeParseError, message, data);
55
+ }
56
+ static invalidRequest(message, data) {
57
+ return new A2AError(schema.ErrorCodeInvalidRequest, message, data);
58
+ }
59
+ static methodNotFound(method) {
60
+ return new A2AError(schema.ErrorCodeMethodNotFound, `Method not found: ${method}`);
61
+ }
62
+ static invalidParams(message, data) {
63
+ return new A2AError(schema.ErrorCodeInvalidParams, message, data);
64
+ }
65
+ static internalError(message, data) {
66
+ return new A2AError(schema.ErrorCodeInternalError, message, data);
67
+ }
68
+ static taskNotFound(taskId) {
69
+ return new A2AError(schema.ErrorCodeTaskNotFound, `Task not found: ${taskId}`, undefined, taskId);
70
+ }
71
+ static taskNotCancelable(taskId) {
72
+ return new A2AError(schema.ErrorCodeTaskNotCancelable, `Task not cancelable: ${taskId}`, undefined, taskId);
73
+ }
74
+ static pushNotificationNotSupported() {
75
+ return new A2AError(schema.ErrorCodePushNotificationNotSupported, 'Push Notification is not supported');
76
+ }
77
+ static unsupportedOperation(operation) {
78
+ return new A2AError(schema.ErrorCodeUnsupportedOperation, `Unsupported operation: ${operation}`);
79
+ }
80
+ /**
81
+ * Formats the error into a standard JSON-RPC error object structure.
82
+ */
83
+ toJSONRPCError() {
84
+ const errorObject = {
85
+ code: this.code,
86
+ message: this.message,
87
+ };
88
+ if (this.data !== undefined) {
89
+ errorObject.data = this.data;
90
+ }
91
+ return errorObject;
92
+ }
93
+ }
94
+ exports.A2AError = A2AError;
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYTJhLWVycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZlci90eXBlcy9hMmEtZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNERBQThDO0FBRTlDOztHQUVHO0FBQ0gsTUFBYSxRQUFTLFNBQVEsS0FBSztJQUMxQixJQUFJLENBQWlDO0lBQ3JDLElBQUksQ0FBVztJQUNmLE1BQU0sQ0FBbUIsQ0FBQywyQkFBMkI7SUFFNUQsWUFDRSxJQUFvQyxFQUNwQyxPQUFlLEVBQ2YsSUFBYyxFQUNkLE1BQXdCO1FBRXhCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsdUNBQXVDO0lBQy9ELENBQUM7SUFFRCwyQ0FBMkM7SUFDM0MsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFlLEVBQUUsSUFBYztRQUMvQyxPQUFPLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBZSxFQUFFLElBQWM7UUFDbkQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsdUJBQXVCLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQWM7UUFDbEMsT0FBTyxJQUFJLFFBQVEsQ0FDakIsTUFBTSxDQUFDLHVCQUF1QixFQUM5QixxQkFBcUIsTUFBTSxFQUFFLENBQzlCLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFlLEVBQUUsSUFBYztRQUNsRCxPQUFPLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVELE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBZSxFQUFFLElBQWM7UUFDbEQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQWM7UUFDaEMsT0FBTyxJQUFJLFFBQVEsQ0FDakIsTUFBTSxDQUFDLHFCQUFxQixFQUM1QixtQkFBbUIsTUFBTSxFQUFFLEVBQzNCLFNBQVMsRUFDVCxNQUFNLENBQ1AsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQUMsaUJBQWlCLENBQUMsTUFBYztRQUNyQyxPQUFPLElBQUksUUFBUSxDQUNqQixNQUFNLENBQUMsMEJBQTBCLEVBQ2pDLHdCQUF3QixNQUFNLEVBQUUsRUFDaEMsU0FBUyxFQUNULE1BQU0sQ0FDUCxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sQ0FBQyw0QkFBNEI7UUFDakMsT0FBTyxJQUFJLFFBQVEsQ0FDakIsTUFBTSxDQUFDLHFDQUFxQyxFQUM1QyxvQ0FBb0MsQ0FDckMsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQUMsb0JBQW9CLENBQUMsU0FBaUI7UUFDM0MsT0FBTyxJQUFJLFFBQVEsQ0FDakIsTUFBTSxDQUFDLDZCQUE2QixFQUNwQywwQkFBMEIsU0FBUyxFQUFFLENBQ3RDLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjO1FBQ1osTUFBTSxXQUFXLEdBQWlDO1lBQ2hELElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztTQUN0QixDQUFDO1FBQ0YsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVCLFdBQVcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUMvQixDQUFDO1FBQ0QsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztDQUNGO0FBdkZELDRCQXVGQyJ9
@@ -0,0 +1,56 @@
1
+ import * as schema from '../../common/schema';
2
+ export type TaskAndHistory = {
3
+ task: schema.Task;
4
+ history: schema.Message[];
5
+ };
6
+ /**
7
+ * Simplified interface for task storage providers.
8
+ * Stores and retrieves both the task and its full message history together.
9
+ */
10
+ export interface ITaskStore {
11
+ /**
12
+ * Saves a task and its associated message history.
13
+ * Overwrites existing data if the task ID exists.
14
+ * @param data An object containing the task and its history.
15
+ * @returns A promise resolving when the save operation is complete.
16
+ */
17
+ save(data: TaskAndHistory): Promise<void>;
18
+ /**
19
+ * Loads a task and its history by task ID.
20
+ * @param taskId The ID of the task to load.
21
+ * @returns A promise resolving to an object containing the Task and its history, or null if not found.
22
+ */
23
+ load(taskId: string): Promise<TaskAndHistory | null>;
24
+ }
25
+ /**
26
+ * Context object provided to the TaskHandler.
27
+ */
28
+ export type TaskContext = {
29
+ /**
30
+ * The current state of the task when the handler is invoked or resumed.
31
+ * Note: This is a snapshot. For the absolute latest state during async operations,
32
+ * the handler might need to reload the task via the store.
33
+ */
34
+ task: schema.Task;
35
+ /**
36
+ * The specific user message that triggered this handler invocation or resumption.
37
+ */
38
+ userMessage: schema.Message;
39
+ /**
40
+ * Function to check if cancellation has been requested for this task.
41
+ * Handlers should ideally check this periodically during long-running operations.
42
+ * @returns {boolean} True if cancellation has been requested, false otherwise.
43
+ */
44
+ isCancelled(): boolean;
45
+ /**
46
+ * The message history associated with the task up to the point the handler is invoked.
47
+ * Optional, as history might not always be available or relevant.
48
+ */
49
+ history?: schema.Message[];
50
+ };
51
+ /**
52
+ * Represents the possible types of updates a TaskHandler can yield.
53
+ * It's either a partial TaskStatus (without the server-managed timestamp)
54
+ * or a complete Artifact object.
55
+ */
56
+ export type TaskUpdate = Omit<schema.TaskStatus, 'timestamp'> | schema.Artifact | schema.Artifact[];