@cogitator-ai/a2a 0.3.10 → 0.4.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/LICENSE +21 -0
- package/README.md +64 -7
- package/dist/adapters/express.d.ts.map +1 -1
- package/dist/adapters/express.js +22 -22
- package/dist/adapters/express.js.map +1 -1
- package/dist/adapters/fastify.d.ts.map +1 -1
- package/dist/adapters/fastify.js +23 -24
- package/dist/adapters/fastify.js.map +1 -1
- package/dist/adapters/hono.d.ts.map +1 -1
- package/dist/adapters/hono.js +25 -8
- package/dist/adapters/hono.js.map +1 -1
- package/dist/adapters/koa.d.ts.map +1 -1
- package/dist/adapters/koa.js +16 -23
- package/dist/adapters/koa.js.map +1 -1
- package/dist/adapters/next.d.ts.map +1 -1
- package/dist/adapters/next.js +22 -19
- package/dist/adapters/next.js.map +1 -1
- package/dist/adapters/shared.d.ts +18 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/adapters/shared.js +52 -0
- package/dist/adapters/shared.js.map +1 -0
- package/dist/adapters/sse-error-event.d.ts +3 -0
- package/dist/adapters/sse-error-event.d.ts.map +1 -0
- package/dist/adapters/sse-error-event.js +11 -0
- package/dist/adapters/sse-error-event.js.map +1 -0
- package/dist/agent-card.d.ts.map +1 -1
- package/dist/agent-card.js +15 -2
- package/dist/agent-card.js.map +1 -1
- package/dist/client.d.ts +24 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +163 -83
- package/dist/client.js.map +1 -1
- package/dist/errors.d.ts +1 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +3 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/json-rpc.d.ts +2 -2
- package/dist/json-rpc.d.ts.map +1 -1
- package/dist/json-rpc.js +11 -7
- package/dist/json-rpc.js.map +1 -1
- package/dist/push-notifications.d.ts +8 -1
- package/dist/push-notifications.d.ts.map +1 -1
- package/dist/push-notifications.js +178 -25
- package/dist/push-notifications.js.map +1 -1
- package/dist/redis-task-store.d.ts +1 -0
- package/dist/redis-task-store.d.ts.map +1 -1
- package/dist/redis-task-store.js +44 -4
- package/dist/redis-task-store.js.map +1 -1
- package/dist/server.d.ts +19 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +287 -135
- package/dist/server.js.map +1 -1
- package/dist/task-manager.d.ts +27 -2
- package/dist/task-manager.d.ts.map +1 -1
- package/dist/task-manager.js +126 -36
- package/dist/task-manager.js.map +1 -1
- package/dist/task-store.d.ts +10 -0
- package/dist/task-store.d.ts.map +1 -1
- package/dist/task-store.js +28 -0
- package/dist/task-store.js.map +1 -1
- package/dist/types.d.ts +17 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -1
- package/package.json +14 -14
package/dist/redis-task-store.js
CHANGED
|
@@ -1,3 +1,37 @@
|
|
|
1
|
+
const ATOMIC_UPDATE_SCRIPT = `
|
|
2
|
+
local key = KEYS[1]
|
|
3
|
+
local existing = redis.call('GET', key)
|
|
4
|
+
if not existing then return 0 end
|
|
5
|
+
local task = cjson.decode(existing)
|
|
6
|
+
local update = cjson.decode(ARGV[1])
|
|
7
|
+
for k, v in pairs(update) do task[k] = v end
|
|
8
|
+
local result = cjson.encode(task)
|
|
9
|
+
local ttl = tonumber(ARGV[2])
|
|
10
|
+
if ttl and ttl > 0 then
|
|
11
|
+
redis.call('SETEX', key, ttl, result)
|
|
12
|
+
else
|
|
13
|
+
redis.call('SET', key, result)
|
|
14
|
+
end
|
|
15
|
+
return 1
|
|
16
|
+
`;
|
|
17
|
+
const ARRAY_FIELDS = new Set(['history', 'artifacts', 'parts', 'referenceTaskIds']);
|
|
18
|
+
/**
|
|
19
|
+
* Redis' Lua cjson encodes empty tables as `{}`, so an atomic update turns
|
|
20
|
+
* empty arrays (e.g. `artifacts: []`) into objects. Known array fields are
|
|
21
|
+
* restored while parsing.
|
|
22
|
+
*/
|
|
23
|
+
function parseTask(data) {
|
|
24
|
+
return JSON.parse(data, (key, value) => {
|
|
25
|
+
if (ARRAY_FIELDS.has(key) &&
|
|
26
|
+
value !== null &&
|
|
27
|
+
typeof value === 'object' &&
|
|
28
|
+
!Array.isArray(value) &&
|
|
29
|
+
Object.keys(value).length === 0) {
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
return value;
|
|
33
|
+
});
|
|
34
|
+
}
|
|
1
35
|
export class RedisTaskStore {
|
|
2
36
|
client;
|
|
3
37
|
prefix;
|
|
@@ -24,14 +58,20 @@ export class RedisTaskStore {
|
|
|
24
58
|
const data = await this.client.get(this.prefix + taskId);
|
|
25
59
|
if (!data)
|
|
26
60
|
return null;
|
|
27
|
-
return
|
|
61
|
+
return parseTask(data);
|
|
28
62
|
}
|
|
29
63
|
async update(taskId, update) {
|
|
64
|
+
const key = this.prefix + taskId;
|
|
65
|
+
const updateJson = JSON.stringify(update);
|
|
66
|
+
const ttlArg = String(this.ttl ?? 0);
|
|
67
|
+
if (this.client.eval) {
|
|
68
|
+
await this.client.eval(ATOMIC_UPDATE_SCRIPT, 1, key, updateJson, ttlArg);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
30
71
|
const existing = await this.get(taskId);
|
|
31
72
|
if (!existing)
|
|
32
73
|
return;
|
|
33
74
|
const updated = { ...existing, ...update };
|
|
34
|
-
const key = this.prefix + taskId;
|
|
35
75
|
const json = JSON.stringify(updated);
|
|
36
76
|
if (this.ttl && this.client.setex) {
|
|
37
77
|
await this.client.setex(key, this.ttl, json);
|
|
@@ -49,14 +89,14 @@ export class RedisTaskStore {
|
|
|
49
89
|
const values = await this.client.mget(...keys);
|
|
50
90
|
for (const data of values) {
|
|
51
91
|
if (data)
|
|
52
|
-
tasks.push(
|
|
92
|
+
tasks.push(parseTask(data));
|
|
53
93
|
}
|
|
54
94
|
}
|
|
55
95
|
else {
|
|
56
96
|
const results = await Promise.all(keys.map((key) => this.client.get(key)));
|
|
57
97
|
for (const data of results) {
|
|
58
98
|
if (data)
|
|
59
|
-
tasks.push(
|
|
99
|
+
tasks.push(parseTask(data));
|
|
60
100
|
}
|
|
61
101
|
}
|
|
62
102
|
let filtered = tasks;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis-task-store.js","sourceRoot":"","sources":["../src/redis-task-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"redis-task-store.js","sourceRoot":"","sources":["../src/redis-task-store.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { A2AServerConfig, AgentCard, A2AStreamEvent } from './types.js';
|
|
2
2
|
import type { JsonRpcResponse } from './json-rpc.js';
|
|
3
|
+
type HeaderGetter = (name: string) => string | null | undefined;
|
|
3
4
|
export declare class A2AServer {
|
|
4
5
|
private agents;
|
|
5
6
|
private cogitator;
|
|
@@ -12,13 +13,28 @@ export declare class A2AServer {
|
|
|
12
13
|
private cardSigning?;
|
|
13
14
|
private extendedCardGenerator?;
|
|
14
15
|
private allowPrivateUrls;
|
|
16
|
+
private auth?;
|
|
15
17
|
constructor(config: A2AServerConfig);
|
|
18
|
+
/**
|
|
19
|
+
* Extract the credential configured by `auth` from request headers:
|
|
20
|
+
* the token of an `Authorization: Bearer` header, or the API key header.
|
|
21
|
+
* Framework adapters call this and pass the result to handleJsonRpc / handleJsonRpcStream.
|
|
22
|
+
*/
|
|
23
|
+
getAuthToken(getHeader: HeaderGetter): string | undefined;
|
|
16
24
|
getAgentCard(agentName?: string): AgentCard;
|
|
17
25
|
getAgentCards(): AgentCard[];
|
|
18
|
-
handleJsonRpc(body: unknown): Promise<JsonRpcResponse>;
|
|
19
|
-
handleJsonRpcStream(body: unknown): AsyncGenerator<A2AStreamEvent>;
|
|
26
|
+
handleJsonRpc(body: unknown, authToken?: string): Promise<JsonRpcResponse | null>;
|
|
27
|
+
handleJsonRpcStream(body: unknown, authToken?: string, signal?: AbortSignal): AsyncGenerator<A2AStreamEvent>;
|
|
28
|
+
private validateAuth;
|
|
20
29
|
private routeMethod;
|
|
21
30
|
private handleSendMessage;
|
|
31
|
+
private validateInitialPushConfig;
|
|
32
|
+
private registerInitialPushConfig;
|
|
33
|
+
private assertWebhookAllowed;
|
|
34
|
+
/**
|
|
35
|
+
* Apply historyLength / acceptedOutputModes from the request configuration
|
|
36
|
+
*/
|
|
37
|
+
private shapeTask;
|
|
22
38
|
private handleGetTask;
|
|
23
39
|
private handleCancelTask;
|
|
24
40
|
private handleListTasks;
|
|
@@ -28,4 +44,5 @@ export declare class A2AServer {
|
|
|
28
44
|
private handleDeletePushNotification;
|
|
29
45
|
private handleExtendedCard;
|
|
30
46
|
}
|
|
47
|
+
export {};
|
|
31
48
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,SAAS,EAIT,cAAc,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,SAAS,EAIT,cAAc,EAQf,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAkB,eAAe,EAAE,MAAM,eAAe,CAAC;AAoBrE,KAAK,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;AAsChE,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,qBAAqB,CAAwB;IACrD,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,WAAW,CAAC,CAA0B;IAC9C,OAAO,CAAC,qBAAqB,CAAC,CAA2C;IACzE,OAAO,CAAC,gBAAgB,CAAU;IAClC,OAAO,CAAC,IAAI,CAAC,CAAgB;gBAEjB,MAAM,EAAE,eAAe;IA4DnC;;;;OAIG;IACH,YAAY,CAAC,SAAS,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS;IAWzD,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS;IAe3C,aAAa,IAAI,SAAS,EAAE;IAQtB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IA4ChF,mBAAmB,CACxB,IAAI,EAAE,OAAO,EACb,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,cAAc,CAAC,cAAc,CAAC;YAiKnB,YAAY;YAWZ,WAAW;YA2BX,iBAAiB;IAqC/B,OAAO,CAAC,yBAAyB;YASnB,yBAAyB;IAiBvC,OAAO,CAAC,oBAAoB;IAS5B;;OAEG;IACH,OAAO,CAAC,SAAS;YAsBH,aAAa;YAOb,gBAAgB;YAMhB,eAAe;YAcf,4BAA4B;YAa5B,yBAAyB;YAQzB,2BAA2B;YAM3B,4BAA4B;YAS5B,kBAAkB;CASjC"}
|