@artinet/sdk 0.2.0 → 0.3.0
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/CHANGELOG.md +35 -4
- package/LICENSE +201 -21
- package/README.md +281 -413
- package/bin/artinet-metadata-validator-0.0.1.tgz +0 -0
- package/dist/client/a2a-client.d.ts +3 -4
- package/dist/client/a2a-client.d.ts.map +1 -1
- package/dist/client/a2a-client.js +9 -9
- package/dist/client/a2a-client.js.map +1 -1
- package/dist/client/interfaces/client.d.ts +95 -0
- package/dist/client/interfaces/client.d.ts.map +1 -1
- package/dist/server/a2a-server.d.ts +7 -0
- package/dist/server/a2a-server.d.ts.map +1 -1
- package/dist/server/a2a-server.js +34 -4
- package/dist/server/a2a-server.js.map +1 -1
- package/dist/server/interfaces/params.d.ts +46 -9
- package/dist/server/interfaces/params.d.ts.map +1 -1
- package/dist/server/interfaces/params.js.map +1 -1
- package/dist/server/interfaces/server.d.ts +1 -0
- package/dist/server/interfaces/server.d.ts.map +1 -1
- package/dist/server/lib/express-server.d.ts.map +1 -1
- package/dist/server/lib/express-server.js +2 -2
- package/dist/server/lib/express-server.js.map +1 -1
- package/dist/server/lib/json-middleware.d.ts +2 -18
- package/dist/server/lib/json-middleware.d.ts.map +1 -1
- package/dist/server/lib/json-middleware.js +2 -179
- package/dist/server/lib/json-middleware.js.map +1 -1
- package/dist/server/lib/middleware/a2a-methods.d.ts +7 -0
- package/dist/server/lib/middleware/a2a-methods.d.ts.map +1 -0
- package/dist/server/lib/middleware/a2a-methods.js +103 -0
- package/dist/server/lib/middleware/a2a-methods.js.map +1 -0
- package/dist/server/lib/middleware/factory.d.ts +12 -0
- package/dist/server/lib/middleware/factory.d.ts.map +1 -0
- package/dist/server/lib/middleware/factory.js +59 -0
- package/dist/server/lib/middleware/factory.js.map +1 -0
- package/dist/server/lib/storage/file.js +1 -0
- package/dist/server/lib/storage/file.js.map +1 -1
- package/dist/server/lib/storage/memory.js +1 -3
- package/dist/server/lib/storage/memory.js.map +1 -1
- package/dist/transport/streaming/event-stream.d.ts.map +1 -1
- package/dist/transport/streaming/event-stream.js +31 -14
- package/dist/transport/streaming/event-stream.js.map +1 -1
- package/dist/types/extended-schema.d.ts +2 -1
- package/dist/types/extended-schema.d.ts.map +1 -1
- package/dist/types/extended-schema.js.map +1 -1
- package/dist/utils/api/register.d.ts +25 -0
- package/dist/utils/api/register.d.ts.map +1 -0
- package/dist/utils/api/register.js +96 -0
- package/dist/utils/api/register.js.map +1 -0
- package/dist/utils/common/errors.d.ts +13 -13
- package/dist/utils/common/errors.d.ts.map +1 -1
- package/dist/utils/common/errors.js +10 -2
- package/dist/utils/common/errors.js.map +1 -1
- package/dist/utils/common/utils.d.ts +1 -0
- package/dist/utils/common/utils.d.ts.map +1 -1
- package/dist/utils/common/utils.js +9 -0
- package/dist/utils/common/utils.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/logging/logger.d.ts +2 -2
- package/dist/utils/logging/logger.d.ts.map +1 -1
- package/dist/utils/logging/logger.js +1 -1
- package/dist/utils/logging/logger.js.map +1 -1
- package/package.json +13 -11
|
@@ -1,180 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import { loadState, updateState } from "../lib/state.js";
|
|
4
|
-
import { INTERNAL_ERROR, INVALID_PARAMS, METHOD_NOT_FOUND, PUSH_NOTIFICATION_NOT_SUPPORTED, TASK_NOT_CANCELABLE, TASK_NOT_FOUND, FAILED_UPDATE, } from "../../utils/common/errors.js";
|
|
5
|
-
import { JSONRPCServer, } from "../interfaces/params.js";
|
|
6
|
-
function toJaysonError(error) {
|
|
7
|
-
return {
|
|
8
|
-
code: error.code,
|
|
9
|
-
message: error.message,
|
|
10
|
-
data: error.data,
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Default implementation of createJSONRPCServer
|
|
15
|
-
* This implementation is used by the Artinet API server
|
|
16
|
-
* It provides a basic JSON-RPC server with methods for task creation, retrieval, and cancellation
|
|
17
|
-
* Creates and initializes a Jayson server with A2A methods
|
|
18
|
-
* @param params Object containing all required parameters for server initialization
|
|
19
|
-
* @returns A configured Jayson server instance
|
|
20
|
-
*/
|
|
21
|
-
/**
|
|
22
|
-
* Default implementation of createJSONRPCServer
|
|
23
|
-
* This implementation is used by the Artinet API server
|
|
24
|
-
* It provides a basic JSON-RPC server with methods for task creation, retrieval, and cancellation
|
|
25
|
-
* Creates and initializes a Jayson server with A2A methods
|
|
26
|
-
* @param params Object containing all required parameters for server initialization
|
|
27
|
-
* @returns A configured Jayson server instance
|
|
28
|
-
*/
|
|
29
|
-
export function defaultCreateJSONRPCServer(params) {
|
|
30
|
-
const { taskStore, card, taskHandler, activeCancellations, createTaskContext, closeStreamsForTask, } = params;
|
|
31
|
-
return new JSONRPCServer({
|
|
32
|
-
"tasks/send": async (params, callback) => {
|
|
33
|
-
try {
|
|
34
|
-
// Validate params
|
|
35
|
-
if (!params || !params.id || !params.message) {
|
|
36
|
-
return callback(toJaysonError(INVALID_PARAMS()));
|
|
37
|
-
}
|
|
38
|
-
const { id: taskId, message, sessionId, metadata } = params;
|
|
39
|
-
// Load or create task
|
|
40
|
-
let currentData = await loadState(taskStore, taskId, message, sessionId, metadata);
|
|
41
|
-
// Create task context
|
|
42
|
-
const context = createTaskContext(currentData.task, message, currentData.history);
|
|
43
|
-
const generator = taskHandler(context);
|
|
44
|
-
try {
|
|
45
|
-
for await (const update of generator) {
|
|
46
|
-
currentData = await updateState(taskStore, currentData, update);
|
|
47
|
-
}
|
|
48
|
-
return callback(null, currentData.task);
|
|
49
|
-
}
|
|
50
|
-
catch (error) {
|
|
51
|
-
const failedUpdate = FAILED_UPDATE(`Task processing failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
52
|
-
currentData = await updateState(taskStore, currentData, failedUpdate);
|
|
53
|
-
return callback(toJaysonError(INTERNAL_ERROR(error)));
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
catch (error) {
|
|
57
|
-
logError("tasks/send", "Error in tasks/send", error);
|
|
58
|
-
return callback(toJaysonError(INTERNAL_ERROR(error)));
|
|
59
|
-
}
|
|
60
|
-
},
|
|
61
|
-
"tasks/get": async (params, callback) => {
|
|
62
|
-
try {
|
|
63
|
-
const { id: taskId } = params;
|
|
64
|
-
if (!taskId) {
|
|
65
|
-
return callback(toJaysonError(INVALID_PARAMS()));
|
|
66
|
-
}
|
|
67
|
-
// Load the task
|
|
68
|
-
const data = await taskStore.load(taskId);
|
|
69
|
-
if (!data) {
|
|
70
|
-
return callback(toJaysonError(TASK_NOT_FOUND()));
|
|
71
|
-
}
|
|
72
|
-
return callback(null, data.task);
|
|
73
|
-
}
|
|
74
|
-
catch (error) {
|
|
75
|
-
logError("tasks/get", "Error in tasks/get", error);
|
|
76
|
-
return callback(toJaysonError(INTERNAL_ERROR(error)));
|
|
77
|
-
}
|
|
78
|
-
},
|
|
79
|
-
"tasks/cancel": async (params, callback) => {
|
|
80
|
-
try {
|
|
81
|
-
const { id: taskId } = params;
|
|
82
|
-
if (!taskId) {
|
|
83
|
-
return callback(toJaysonError(INVALID_PARAMS()));
|
|
84
|
-
}
|
|
85
|
-
// Load the task
|
|
86
|
-
const data = await taskStore.load(taskId);
|
|
87
|
-
if (!data) {
|
|
88
|
-
return callback(toJaysonError(TASK_NOT_FOUND()));
|
|
89
|
-
}
|
|
90
|
-
// Check if task is already in a final state
|
|
91
|
-
const finalStates = ["completed", "failed", "canceled"];
|
|
92
|
-
if (finalStates.includes(data.task.status.state)) {
|
|
93
|
-
return callback(toJaysonError(TASK_NOT_CANCELABLE()));
|
|
94
|
-
}
|
|
95
|
-
// Mark as cancelled
|
|
96
|
-
activeCancellations.add(taskId);
|
|
97
|
-
// Create updated task with canceled status
|
|
98
|
-
const canceledTask = {
|
|
99
|
-
...data.task,
|
|
100
|
-
status: {
|
|
101
|
-
state: "canceled",
|
|
102
|
-
timestamp: getCurrentTimestamp(),
|
|
103
|
-
message: {
|
|
104
|
-
role: "agent",
|
|
105
|
-
parts: [{ type: "text", text: "Task was canceled." }],
|
|
106
|
-
},
|
|
107
|
-
},
|
|
108
|
-
};
|
|
109
|
-
const updatedData = {
|
|
110
|
-
task: canceledTask,
|
|
111
|
-
history: data.history,
|
|
112
|
-
};
|
|
113
|
-
await taskStore.save(updatedData);
|
|
114
|
-
closeStreamsForTask(taskId);
|
|
115
|
-
return callback(null, canceledTask);
|
|
116
|
-
}
|
|
117
|
-
catch (error) {
|
|
118
|
-
logError("tasks/cancel", "Error in tasks/cancel", error);
|
|
119
|
-
callback(toJaysonError(INTERNAL_ERROR(error)));
|
|
120
|
-
}
|
|
121
|
-
},
|
|
122
|
-
"tasks/pushNotification/set": async (params, callback) => {
|
|
123
|
-
try {
|
|
124
|
-
logWarn("tasks/pushNotification/set", "Push notifications are not fully implemented.");
|
|
125
|
-
if (!card.capabilities?.pushNotifications) {
|
|
126
|
-
return callback(toJaysonError(METHOD_NOT_FOUND()));
|
|
127
|
-
}
|
|
128
|
-
const config = params;
|
|
129
|
-
// Basic validation
|
|
130
|
-
if (!config.id) {
|
|
131
|
-
return callback(toJaysonError(INVALID_PARAMS()));
|
|
132
|
-
}
|
|
133
|
-
if (!config.pushNotificationConfig?.url) {
|
|
134
|
-
return callback(toJaysonError(INVALID_PARAMS()));
|
|
135
|
-
}
|
|
136
|
-
// Verify the task exists
|
|
137
|
-
const data = await taskStore.load(config.id);
|
|
138
|
-
if (!data) {
|
|
139
|
-
return callback(toJaysonError(TASK_NOT_FOUND()));
|
|
140
|
-
}
|
|
141
|
-
// In a real implementation, we'd store this config
|
|
142
|
-
// For now, we'll just return it
|
|
143
|
-
return callback(null, config);
|
|
144
|
-
}
|
|
145
|
-
catch (error) {
|
|
146
|
-
logError("tasks/pushNotification/set", "Error in tasks/pushNotification/set", error);
|
|
147
|
-
return callback(toJaysonError(INTERNAL_ERROR(error)));
|
|
148
|
-
}
|
|
149
|
-
},
|
|
150
|
-
"tasks/pushNotification/get": async (params, callback) => {
|
|
151
|
-
try {
|
|
152
|
-
logWarn("tasks/pushNotification/get", "Push notifications are not fully implemented.");
|
|
153
|
-
if (!card.capabilities?.pushNotifications) {
|
|
154
|
-
return callback(toJaysonError(PUSH_NOTIFICATION_NOT_SUPPORTED()));
|
|
155
|
-
}
|
|
156
|
-
const { id: taskId } = params;
|
|
157
|
-
if (!taskId) {
|
|
158
|
-
return callback(toJaysonError(INVALID_PARAMS()));
|
|
159
|
-
}
|
|
160
|
-
// Verify the task exists
|
|
161
|
-
const data = await taskStore.load(taskId);
|
|
162
|
-
if (!data) {
|
|
163
|
-
return callback(toJaysonError(TASK_NOT_FOUND()));
|
|
164
|
-
}
|
|
165
|
-
// In a real implementation, we'd retrieve a stored config
|
|
166
|
-
// For now, return null (no push notification config)
|
|
167
|
-
return callback(null, null);
|
|
168
|
-
}
|
|
169
|
-
catch (error) {
|
|
170
|
-
logError("tasks/pushNotification/get", "Error in tasks/pushNotification/get", error);
|
|
171
|
-
return callback(toJaysonError(INTERNAL_ERROR(error)));
|
|
172
|
-
}
|
|
173
|
-
},
|
|
174
|
-
}, {
|
|
175
|
-
//server options
|
|
176
|
-
reviver: undefined,
|
|
177
|
-
replacer: undefined,
|
|
178
|
-
});
|
|
179
|
-
}
|
|
1
|
+
export * from "./middleware/factory.js";
|
|
2
|
+
export * from "./middleware/a2a-methods.js";
|
|
180
3
|
//# sourceMappingURL=json-middleware.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-middleware.js","sourceRoot":"","sources":["../../../src/server/lib/json-middleware.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"json-middleware.js","sourceRoot":"","sources":["../../../src/server/lib/json-middleware.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { SendTaskMethod, GetTaskMethod, CancelTaskMethod, SetTaskPushNotificationMethod, GetTaskPushNotificationMethod } from "../../interfaces/params.js";
|
|
2
|
+
export declare const defaultSendTaskMethod: SendTaskMethod;
|
|
3
|
+
export declare const defaultGetTaskMethod: GetTaskMethod;
|
|
4
|
+
export declare const defaultCancelTaskMethod: CancelTaskMethod;
|
|
5
|
+
export declare const defaultSetTaskPushNotificationMethod: SetTaskPushNotificationMethod;
|
|
6
|
+
export declare const defaultGetTaskPushNotificationMethod: GetTaskPushNotificationMethod;
|
|
7
|
+
//# sourceMappingURL=a2a-methods.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a2a-methods.d.ts","sourceRoot":"","sources":["../../../../src/server/lib/middleware/a2a-methods.ts"],"names":[],"mappings":"AAcA,OAAO,EACL,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,6BAA6B,EAC7B,6BAA6B,EAC9B,MAAM,4BAA4B,CAAC;AAGpC,eAAO,MAAM,qBAAqB,EAAE,cAuCnC,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,aAclC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,gBA8BrC,CAAC;AAEF,eAAO,MAAM,oCAAoC,EAAE,6BAoBhD,CAAC;AAEJ,eAAO,MAAM,oCAAoC,EAAE,6BAmBhD,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { extractTaskId, getCurrentTimestamp } from "../../../utils/index.js";
|
|
2
|
+
import { logError, logWarn } from "../../../utils/index.js";
|
|
3
|
+
import { loadState, updateState } from "../state.js";
|
|
4
|
+
import { INTERNAL_ERROR, INVALID_PARAMS, METHOD_NOT_FOUND, PUSH_NOTIFICATION_NOT_SUPPORTED, TASK_NOT_CANCELABLE, TASK_NOT_FOUND, FAILED_UPDATE, SystemError, } from "../../../utils/index.js";
|
|
5
|
+
import { FINAL_STATES } from "../../../utils/index.js";
|
|
6
|
+
export const defaultSendTaskMethod = async (deps, requestParams, callback) => {
|
|
7
|
+
const { taskStore, taskHandler, createTaskContext } = deps;
|
|
8
|
+
const taskId = extractTaskId(requestParams.id);
|
|
9
|
+
const { message, sessionId, metadata } = requestParams;
|
|
10
|
+
let currentData = await loadState(taskStore, taskId, message, sessionId, metadata);
|
|
11
|
+
const context = createTaskContext(currentData.task, message, currentData.history);
|
|
12
|
+
const generator = taskHandler(context);
|
|
13
|
+
try {
|
|
14
|
+
for await (const update of generator) {
|
|
15
|
+
currentData = await updateState(taskStore, currentData, update);
|
|
16
|
+
}
|
|
17
|
+
return callback(null, currentData.task); // Success
|
|
18
|
+
}
|
|
19
|
+
catch (innerError) {
|
|
20
|
+
const failedUpdate = FAILED_UPDATE(`Task processing failed: ${innerError instanceof Error ? innerError.message : String(innerError)}`);
|
|
21
|
+
// Ensure state is saved before calling callback with error
|
|
22
|
+
await updateState(taskStore, currentData, failedUpdate);
|
|
23
|
+
// Throwing here would be caught by createMethod's catch block
|
|
24
|
+
if (innerError instanceof SystemError) {
|
|
25
|
+
throw innerError;
|
|
26
|
+
}
|
|
27
|
+
throw INTERNAL_ERROR(innerError);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
export const defaultGetTaskMethod = async (deps, requestParams, callback) => {
|
|
31
|
+
const { taskStore } = deps;
|
|
32
|
+
const taskId = extractTaskId(requestParams.id);
|
|
33
|
+
if (!taskId)
|
|
34
|
+
throw INVALID_PARAMS("Missing task ID");
|
|
35
|
+
const data = await taskStore.load(taskId);
|
|
36
|
+
if (!data) {
|
|
37
|
+
logError("taskGetLogic", "Task not found", { taskId });
|
|
38
|
+
throw TASK_NOT_FOUND("Task Id: " + taskId);
|
|
39
|
+
}
|
|
40
|
+
callback(null, data.task); // Success
|
|
41
|
+
};
|
|
42
|
+
export const defaultCancelTaskMethod = async (deps, requestParams, callback) => {
|
|
43
|
+
const { taskStore, activeCancellations, closeStreamsForTask } = deps;
|
|
44
|
+
const taskId = extractTaskId(requestParams.id);
|
|
45
|
+
if (!taskId)
|
|
46
|
+
throw INVALID_PARAMS("Missing task ID");
|
|
47
|
+
const data = await taskStore.load(taskId);
|
|
48
|
+
if (!data)
|
|
49
|
+
throw TASK_NOT_FOUND("Task Id: " + taskId);
|
|
50
|
+
if (FINAL_STATES.includes(data.task.status.state)) {
|
|
51
|
+
throw TASK_NOT_CANCELABLE();
|
|
52
|
+
}
|
|
53
|
+
activeCancellations.add(taskId);
|
|
54
|
+
const canceledTask = {
|
|
55
|
+
...data.task,
|
|
56
|
+
status: {
|
|
57
|
+
state: "canceled",
|
|
58
|
+
timestamp: getCurrentTimestamp(),
|
|
59
|
+
message: {
|
|
60
|
+
role: "agent",
|
|
61
|
+
parts: [{ type: "text", text: "Task was canceled." }],
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
const updatedData = { task: canceledTask, history: data.history };
|
|
66
|
+
await taskStore.save(updatedData);
|
|
67
|
+
closeStreamsForTask(taskId);
|
|
68
|
+
return callback(null, canceledTask);
|
|
69
|
+
};
|
|
70
|
+
export const defaultSetTaskPushNotificationMethod = async (deps, requestParams, callback) => {
|
|
71
|
+
const { taskStore, card } = deps;
|
|
72
|
+
logWarn("tasks/pushNotification/set", "Push notifications not fully implemented.");
|
|
73
|
+
if (!card.capabilities?.pushNotifications) {
|
|
74
|
+
throw METHOD_NOT_FOUND();
|
|
75
|
+
}
|
|
76
|
+
const config = requestParams;
|
|
77
|
+
const taskId = extractTaskId(config.id);
|
|
78
|
+
if (!taskId || !config.pushNotificationConfig?.url) {
|
|
79
|
+
throw INVALID_PARAMS();
|
|
80
|
+
}
|
|
81
|
+
const data = await taskStore.load(taskId);
|
|
82
|
+
if (!data) {
|
|
83
|
+
throw TASK_NOT_FOUND();
|
|
84
|
+
}
|
|
85
|
+
return callback(null, config);
|
|
86
|
+
};
|
|
87
|
+
export const defaultGetTaskPushNotificationMethod = async (deps, requestParams, callback) => {
|
|
88
|
+
const { taskStore, card } = deps;
|
|
89
|
+
logWarn("tasks/pushNotification/get", "Push notifications not fully implemented.");
|
|
90
|
+
if (!card.capabilities?.pushNotifications) {
|
|
91
|
+
throw PUSH_NOTIFICATION_NOT_SUPPORTED();
|
|
92
|
+
}
|
|
93
|
+
const taskId = extractTaskId(requestParams.id);
|
|
94
|
+
if (!taskId) {
|
|
95
|
+
throw INVALID_PARAMS();
|
|
96
|
+
}
|
|
97
|
+
const data = await taskStore.load(taskId);
|
|
98
|
+
if (!data) {
|
|
99
|
+
throw TASK_NOT_FOUND();
|
|
100
|
+
}
|
|
101
|
+
return callback(null, null);
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=a2a-methods.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a2a-methods.js","sourceRoot":"","sources":["../../../../src/server/lib/middleware/a2a-methods.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { CreateJSONRPCServerParams, JSONRPCMethodHandler, A2AMethodHandler, CreateJSONRPCServer } from "../../interfaces/params.js";
|
|
2
|
+
import { A2AResponse, RequestParams } from "../../../types/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Creates a JSON-RPC method handler from a function
|
|
5
|
+
* @param deps Dependencies for the method
|
|
6
|
+
* @param funct The function to be used as the method handler
|
|
7
|
+
* @param methodName The name of the method
|
|
8
|
+
* @returns A JSON-RPC method handler
|
|
9
|
+
*/
|
|
10
|
+
export declare function createJSONRPCMethod<Params extends RequestParams, Result extends A2AResponse | null>(deps: CreateJSONRPCServerParams, funct: A2AMethodHandler<Params, Result>, methodName: string): JSONRPCMethodHandler<Params, Result>;
|
|
11
|
+
export declare const defaultCreateJSONRPCServer: CreateJSONRPCServer;
|
|
12
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../../src/server/lib/middleware/factory.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,yBAAyB,EAEzB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,4BAA4B,CAAC;AASpC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAErE;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,SAAS,aAAa,EAC5B,MAAM,SAAS,WAAW,GAAG,IAAI,EAEjC,IAAI,EAAE,yBAAyB,EAC/B,KAAK,EAAE,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,EACvC,UAAU,EAAE,MAAM,GACjB,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CA4BtC;AAED,eAAO,MAAM,0BAA0B,EAAE,mBAsCxC,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { logError } from "../../../utils/logging/log.js";
|
|
2
|
+
import { INTERNAL_ERROR, INVALID_PARAMS, SystemError, } from "../../../utils/common/errors.js";
|
|
3
|
+
import { JSONRPCServer, } from "../../interfaces/params.js";
|
|
4
|
+
import { defaultSendTaskMethod, defaultGetTaskMethod, defaultCancelTaskMethod, defaultSetTaskPushNotificationMethod, defaultGetTaskPushNotificationMethod, } from "./a2a-methods.js";
|
|
5
|
+
/**
|
|
6
|
+
* Creates a JSON-RPC method handler from a function
|
|
7
|
+
* @param deps Dependencies for the method
|
|
8
|
+
* @param funct The function to be used as the method handler
|
|
9
|
+
* @param methodName The name of the method
|
|
10
|
+
* @returns A JSON-RPC method handler
|
|
11
|
+
*/
|
|
12
|
+
export function createJSONRPCMethod(deps, funct, methodName // Pass method name for logging
|
|
13
|
+
) {
|
|
14
|
+
return async (requestParams, callback) => {
|
|
15
|
+
try {
|
|
16
|
+
if (!requestParams) {
|
|
17
|
+
throw INVALID_PARAMS("Missing request parameters");
|
|
18
|
+
}
|
|
19
|
+
// Execute the specific logic
|
|
20
|
+
await funct(deps, requestParams, callback);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
// Centralized error handling ONLY for exceptions thrown by logic
|
|
24
|
+
logError("createJSONRPCMethod", `Exception executing method`, error);
|
|
25
|
+
if (error instanceof SystemError) {
|
|
26
|
+
return callback({
|
|
27
|
+
message: error.message,
|
|
28
|
+
code: error.code,
|
|
29
|
+
data: error.data,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
logError(methodName, `Failed to process Inner Error`, error);
|
|
34
|
+
const internalError = INTERNAL_ERROR(error);
|
|
35
|
+
return callback({
|
|
36
|
+
message: internalError.message,
|
|
37
|
+
code: internalError.code,
|
|
38
|
+
data: internalError.data,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export const defaultCreateJSONRPCServer = (params) => {
|
|
45
|
+
// Create handlers using the generic factory and specific logic
|
|
46
|
+
const taskSendMethod = createJSONRPCMethod(params, defaultSendTaskMethod, "tasks/send");
|
|
47
|
+
const taskGetMethod = createJSONRPCMethod(params, defaultGetTaskMethod, "tasks/get");
|
|
48
|
+
const taskCancelMethod = createJSONRPCMethod(params, defaultCancelTaskMethod, "tasks/cancel");
|
|
49
|
+
const taskPushNotificationSetMethod = createJSONRPCMethod(params, defaultSetTaskPushNotificationMethod, "tasks/pushNotification/set");
|
|
50
|
+
const taskPushNotificationGetMethod = createJSONRPCMethod(params, defaultGetTaskPushNotificationMethod, "tasks/pushNotification/get");
|
|
51
|
+
return new JSONRPCServer({
|
|
52
|
+
"tasks/send": taskSendMethod,
|
|
53
|
+
"tasks/get": taskGetMethod,
|
|
54
|
+
"tasks/cancel": taskCancelMethod,
|
|
55
|
+
"tasks/pushNotification/set": taskPushNotificationSetMethod,
|
|
56
|
+
"tasks/pushNotification/get": taskPushNotificationGetMethod,
|
|
57
|
+
}, { reviver: undefined, replacer: undefined });
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../../src/server/lib/middleware/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EACL,cAAc,EACd,cAAc,EACd,WAAW,GACZ,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAEL,aAAa,GAId,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,oCAAoC,EACpC,oCAAoC,GACrC,MAAM,kBAAkB,CAAC;AAG1B;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAIjC,IAA+B,EAC/B,KAAuC,EACvC,UAAkB,CAAC,+BAA+B;;IAElD,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE;QACvC,IAAI,CAAC;YACH,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,cAAc,CAAC,4BAA4B,CAAC,CAAC;YACrD,CAAC;YACD,6BAA6B;YAC7B,MAAM,KAAK,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,iEAAiE;YACjE,QAAQ,CAAC,qBAAqB,EAAE,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACrE,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;gBACjC,OAAO,QAAQ,CAAC;oBACd,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;iBACjB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,UAAU,EAAE,+BAA+B,EAAE,KAAK,CAAC,CAAC;gBAC7D,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;gBAC5C,OAAO,QAAQ,CAAC;oBACd,OAAO,EAAE,aAAa,CAAC,OAAO;oBAC9B,IAAI,EAAE,aAAa,CAAC,IAAI;oBACxB,IAAI,EAAE,aAAa,CAAC,IAAI;iBACzB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAwB,CAAC,MAAM,EAAE,EAAE;IACxE,+DAA+D;IAC/D,MAAM,cAAc,GAAG,mBAAmB,CACxC,MAAM,EACN,qBAAqB,EACrB,YAAY,CACb,CAAC;IACF,MAAM,aAAa,GAAG,mBAAmB,CACvC,MAAM,EACN,oBAAoB,EACpB,WAAW,CACZ,CAAC;IACF,MAAM,gBAAgB,GAAG,mBAAmB,CAC1C,MAAM,EACN,uBAAuB,EACvB,cAAc,CACf,CAAC;IACF,MAAM,6BAA6B,GAAG,mBAAmB,CACvD,MAAM,EACN,oCAAoC,EACpC,4BAA4B,CAC7B,CAAC;IACF,MAAM,6BAA6B,GAAG,mBAAmB,CACvD,MAAM,EACN,oCAAoC,EACpC,4BAA4B,CAC7B,CAAC;IAEF,OAAO,IAAI,aAAa,CACtB;QACE,YAAY,EAAE,cAAc;QAC5B,WAAW,EAAE,aAAa;QAC1B,cAAc,EAAE,gBAAgB;QAChC,4BAA4B,EAAE,6BAA6B;QAC3D,4BAA4B,EAAE,6BAA6B;KAC5D,EACD,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,CAC5C,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file.js","sourceRoot":"","sources":["../../../../src/server/lib/storage/file.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;GAGG;AACH,MAAM,OAAO,SAAS;
|
|
1
|
+
{"version":3,"file":"file.js","sourceRoot":"","sources":["../../../../src/server/lib/storage/file.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,9 +4,7 @@ import { logDebug } from "../../../utils/logging/log.js";
|
|
|
4
4
|
* Stores tasks and their history in memory. Not persisted between server restarts.
|
|
5
5
|
*/
|
|
6
6
|
export class InMemoryTaskStore {
|
|
7
|
-
|
|
8
|
-
this.store = new Map();
|
|
9
|
-
}
|
|
7
|
+
store = new Map();
|
|
10
8
|
/**
|
|
11
9
|
* Loads a task and its history by task ID.
|
|
12
10
|
* @param taskId The ID of the task to load.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../../src/server/lib/storage/memory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAEzD;;;GAGG;AACH,MAAM,OAAO,iBAAiB;
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../../src/server/lib/storage/memory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAEzD;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IACpB,KAAK,GAAgC,IAAI,GAAG,EAAE,CAAC;IAEvD;;;;OAIG;IACH,KAAK,CAAC,IAAI,CAAC,MAAc;QACvB,QAAQ,CAAC,mBAAmB,EAAE,iBAAiB,MAAM,EAAE,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAErC,6CAA6C;QAC7C,OAAO,KAAK;YACV,CAAC,CAAC;gBACE,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE;gBACvB,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;aAC5B;YACH,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAI,CAAC,IAAoB;QAC7B,QAAQ,CAAC,mBAAmB,EAAE,gBAAgB,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAE9D,qEAAqE;QACrE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;YAC3B,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE;YACtB,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-stream.d.ts","sourceRoot":"","sources":["../../../src/transport/streaming/event-stream.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"event-stream.d.ts","sourceRoot":"","sources":["../../../src/transport/streaming/event-stream.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACX,MAAM,gCAAgC,CAAC;AAIxC;;;;;;GAMG;AACH,wBAAuB,iBAAiB,CAAC,SAAS,SAAS,eAAe,EACxE,QAAQ,EAAE,QAAQ,GACjB,cAAc,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAyElD;AAED;;;;;;;;;;GAUG;AACH,wBAAuB,mBAAmB,CACxC,GAAG,SAAS,UAAU,EACtB,SAAS,SAAS,eAAe,EAEjC,OAAO,EAAE,GAAG,EACZ,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,EACrB,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,EACrB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,aAAa,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAgBjD"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Event stream utilities for handling Server-Sent Events (SSE).
|
|
3
3
|
*/
|
|
4
4
|
import { parseResponse } from "../rpc/parser.js";
|
|
5
|
-
import { createParser } from "eventsource-parser";
|
|
5
|
+
import { createParser, } from "eventsource-parser";
|
|
6
6
|
import { sendJsonRpcRequest } from "../rpc/rpc-client.js";
|
|
7
7
|
import { logError, logWarn, logDebug } from "../../utils/logging/log.js";
|
|
8
8
|
/**
|
|
@@ -26,22 +26,38 @@ export async function* handleEventStream(response) {
|
|
|
26
26
|
const reader = response.body.getReader();
|
|
27
27
|
const decoder = new TextDecoder();
|
|
28
28
|
const events = [];
|
|
29
|
-
const parser = createParser(
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
events.push(eventResult);
|
|
29
|
+
const parser = createParser({
|
|
30
|
+
onEvent: (event) => {
|
|
31
|
+
if (event.data) {
|
|
32
|
+
if (event.event === "close") {
|
|
33
|
+
logDebug("handleEventStream", "Stream closed");
|
|
34
|
+
return;
|
|
36
35
|
}
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
try {
|
|
37
|
+
const parsedData = parseResponse(event.data);
|
|
38
|
+
const eventResult = parsedData.result;
|
|
39
|
+
if (eventResult) {
|
|
40
|
+
events.push(eventResult);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
logWarn("handleEventStream", "Failed to parse SSE data", parsedData);
|
|
44
|
+
}
|
|
45
|
+
// if (parsedData.final && parsedData.final === true) {
|
|
46
|
+
// logDebug("handleEventStream", "Stream completed");
|
|
47
|
+
// return;
|
|
48
|
+
// }
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
logWarn("handleEventStream", "Failed to parse SSE data", e);
|
|
39
52
|
}
|
|
40
53
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
54
|
+
},
|
|
55
|
+
onError: (error) => {
|
|
56
|
+
logError("handleEventStream", "Error parsing SSE data", error);
|
|
57
|
+
},
|
|
58
|
+
onRetry: (retry) => {
|
|
59
|
+
logWarn("handleEventStream", "Retrying SSE connection", retry);
|
|
60
|
+
},
|
|
45
61
|
});
|
|
46
62
|
try {
|
|
47
63
|
while (true) {
|
|
@@ -74,6 +90,7 @@ export async function* executeStreamEvents(baseUrl, method, params, customHeader
|
|
|
74
90
|
logDebug("executeStreamEvents", `Sending streaming request to: ${baseUrl.toString()}, method: ${method}`);
|
|
75
91
|
const responsePromise = sendJsonRpcRequest(baseUrl, method, params, customHeaders, "text/event-stream");
|
|
76
92
|
const response = await responsePromise;
|
|
93
|
+
logDebug("executeStreamEvents", "Response", response);
|
|
77
94
|
yield* handleEventStream(response);
|
|
78
95
|
}
|
|
79
96
|
//# sourceMappingURL=event-stream.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-stream.js","sourceRoot":"","sources":["../../../src/transport/streaming/event-stream.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,
|
|
1
|
+
{"version":3,"file":"event-stream.js","sourceRoot":"","sources":["../../../src/transport/streaming/event-stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* These are extensions to the standard A2A protocol defined by Google:
|
|
4
4
|
* @see https://github.com/google/A2A/blob/main/samples/js/src/schema.ts
|
|
5
5
|
*/
|
|
6
|
-
import type { JSONRPCMessage, JSONRPCError, TaskStatusUpdateEvent, TaskArtifactUpdateEvent, TaskStatus, Artifact } from "./schema.js";
|
|
6
|
+
import type { JSONRPCMessage, JSONRPCError, TaskStatusUpdateEvent, TaskArtifactUpdateEvent, TaskStatus, Artifact, A2ARequest } from "./schema.js";
|
|
7
7
|
/**
|
|
8
8
|
* Improved JSON-RPC Response types using discriminated unions
|
|
9
9
|
* These provide better type safety than the standard optional field approach
|
|
@@ -47,6 +47,7 @@ export type TaskEvent = TaskStatusUpdateEvent | TaskArtifactUpdateEvent;
|
|
|
47
47
|
*/
|
|
48
48
|
export type TaskYieldUpdate = Omit<TaskStatus, "timestamp"> | Artifact;
|
|
49
49
|
export type ExtendedTaskStatusUpdate = Omit<TaskStatus, "timestamp">;
|
|
50
|
+
export type RequestParams = Required<Pick<A2ARequest, "params">>["params"];
|
|
50
51
|
export * from "./schema.js";
|
|
51
52
|
export type { A2AError as A2AErrorType } from "./schema.js";
|
|
52
53
|
//# sourceMappingURL=extended-schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extended-schema.d.ts","sourceRoot":"","sources":["../../src/types/extended-schema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACZ,qBAAqB,EACrB,uBAAuB,EACvB,UAAU,EACV,QAAQ,
|
|
1
|
+
{"version":3,"file":"extended-schema.d.ts","sourceRoot":"","sources":["../../src/types/extended-schema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACZ,qBAAqB,EACrB,uBAAuB,EACvB,UAAU,EACV,QAAQ,EACR,UAAU,EACX,MAAM,aAAa,CAAC;AAErB;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,sBAAsB,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,cAAc;IACrE;;OAEG;IACH,MAAM,EAAE,CAAC,CAAC;IAEV;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,cAAc;IACnE;;OAEG;IACH,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAEvB;;OAEG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,MAAM,uBAAuB,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAChD,sBAAsB,CAAC,CAAC,CAAC,GACzB,oBAAoB,CAAC,CAAC,CAAC,CAAC;AAE5B,MAAM,MAAM,SAAS,GAAG,qBAAqB,GAAG,uBAAuB,CAAC;AACxE;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC;AAEvE,MAAM,MAAM,wBAAwB,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AACrE,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAE3E,cAAc,aAAa,CAAC;AAC5B,YAAY,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extended-schema.js","sourceRoot":"","sources":["../../src/types/extended-schema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"extended-schema.js","sourceRoot":"","sources":["../../src/types/extended-schema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkEH,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { IRegistration } from "@artinet/metadata-validator";
|
|
2
|
+
import { AgentCard } from "../../types/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Registers an agent with the A2A registry.
|
|
5
|
+
* @param metadata The metadata to register.
|
|
6
|
+
* @returns A promise that resolves to the registration ID.
|
|
7
|
+
*/
|
|
8
|
+
export declare function apiRegister(metadata: string): Promise<{
|
|
9
|
+
success: boolean;
|
|
10
|
+
registrationId?: string;
|
|
11
|
+
error?: string;
|
|
12
|
+
}>;
|
|
13
|
+
/**
|
|
14
|
+
* Converts an AgentCard object into a RegistrationSchema object.
|
|
15
|
+
* @param card The AgentCard to convert.
|
|
16
|
+
* @returns A RegistrationSchema object.
|
|
17
|
+
*/
|
|
18
|
+
export declare function convert(card: AgentCard): IRegistration;
|
|
19
|
+
/**
|
|
20
|
+
* Registers an agent with the A2A registry.
|
|
21
|
+
* @param card The AgentCard to register.
|
|
22
|
+
* @returns A promise that resolves to the registration ID.
|
|
23
|
+
*/
|
|
24
|
+
export declare function register(card: AgentCard): Promise<string>;
|
|
25
|
+
//# sourceMappingURL=register.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../src/utils/api/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAqB,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAc,MAAM,sBAAsB,CAAC;AAG7D;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBxE;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,aAAa,CAkCtD;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAkC/D"}
|