@mcpmesh/sdk 1.4.1 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/a2a/a2a-bearer.spec.d.ts +2 -0
- package/dist/__tests__/a2a/a2a-bearer.spec.d.ts.map +1 -0
- package/dist/__tests__/a2a/a2a-bearer.spec.js +58 -0
- package/dist/__tests__/a2a/a2a-bearer.spec.js.map +1 -0
- package/dist/__tests__/a2a/a2a-client.spec.d.ts +2 -0
- package/dist/__tests__/a2a/a2a-client.spec.d.ts.map +1 -0
- package/dist/__tests__/a2a/a2a-client.spec.js +334 -0
- package/dist/__tests__/a2a/a2a-client.spec.js.map +1 -0
- package/dist/__tests__/a2a/a2a-job.spec.d.ts +2 -0
- package/dist/__tests__/a2a/a2a-job.spec.d.ts.map +1 -0
- package/dist/__tests__/a2a/a2a-job.spec.js +255 -0
- package/dist/__tests__/a2a/a2a-job.spec.js.map +1 -0
- package/dist/__tests__/a2a/a2a-stream.spec.d.ts +2 -0
- package/dist/__tests__/a2a/a2a-stream.spec.d.ts.map +1 -0
- package/dist/__tests__/a2a/a2a-stream.spec.js +278 -0
- package/dist/__tests__/a2a/a2a-stream.spec.js.map +1 -0
- package/dist/__tests__/a2a/agent-a2a-config.spec.d.ts +2 -0
- package/dist/__tests__/a2a/agent-a2a-config.spec.d.ts.map +1 -0
- package/dist/__tests__/a2a/agent-a2a-config.spec.js +262 -0
- package/dist/__tests__/a2a/agent-a2a-config.spec.js.map +1 -0
- package/dist/__tests__/a2a/producer/auth-filter.spec.d.ts +2 -0
- package/dist/__tests__/a2a/producer/auth-filter.spec.d.ts.map +1 -0
- package/dist/__tests__/a2a/producer/auth-filter.spec.js +127 -0
- package/dist/__tests__/a2a/producer/auth-filter.spec.js.map +1 -0
- package/dist/__tests__/a2a/producer/card-builder.spec.d.ts +2 -0
- package/dist/__tests__/a2a/producer/card-builder.spec.d.ts.map +1 -0
- package/dist/__tests__/a2a/producer/card-builder.spec.js +113 -0
- package/dist/__tests__/a2a/producer/card-builder.spec.js.map +1 -0
- package/dist/__tests__/a2a/producer/dispatcher.spec.d.ts +2 -0
- package/dist/__tests__/a2a/producer/dispatcher.spec.d.ts.map +1 -0
- package/dist/__tests__/a2a/producer/dispatcher.spec.js +850 -0
- package/dist/__tests__/a2a/producer/dispatcher.spec.js.map +1 -0
- package/dist/__tests__/a2a/producer/mount-surface-push.spec.d.ts +2 -0
- package/dist/__tests__/a2a/producer/mount-surface-push.spec.d.ts.map +1 -0
- package/dist/__tests__/a2a/producer/mount-surface-push.spec.js +164 -0
- package/dist/__tests__/a2a/producer/mount-surface-push.spec.js.map +1 -0
- package/dist/__tests__/a2a/producer/mount.spec.d.ts +2 -0
- package/dist/__tests__/a2a/producer/mount.spec.d.ts.map +1 -0
- package/dist/__tests__/a2a/producer/mount.spec.js +433 -0
- package/dist/__tests__/a2a/producer/mount.spec.js.map +1 -0
- package/dist/__tests__/a2a/producer/public-url-cache.spec.d.ts +2 -0
- package/dist/__tests__/a2a/producer/public-url-cache.spec.d.ts.map +1 -0
- package/dist/__tests__/a2a/producer/public-url-cache.spec.js +116 -0
- package/dist/__tests__/a2a/producer/public-url-cache.spec.js.map +1 -0
- package/dist/__tests__/a2a/producer/sse-emitter.spec.d.ts +2 -0
- package/dist/__tests__/a2a/producer/sse-emitter.spec.d.ts.map +1 -0
- package/dist/__tests__/a2a/producer/sse-emitter.spec.js +754 -0
- package/dist/__tests__/a2a/producer/sse-emitter.spec.js.map +1 -0
- package/dist/__tests__/a2a/producer/state-translator.spec.d.ts +2 -0
- package/dist/__tests__/a2a/producer/state-translator.spec.d.ts.map +1 -0
- package/dist/__tests__/a2a/producer/state-translator.spec.js +124 -0
- package/dist/__tests__/a2a/producer/state-translator.spec.js.map +1 -0
- package/dist/__tests__/a2a/producer/task-store.spec.d.ts +2 -0
- package/dist/__tests__/a2a/producer/task-store.spec.d.ts.map +1 -0
- package/dist/__tests__/a2a/producer/task-store.spec.js +180 -0
- package/dist/__tests__/a2a/producer/task-store.spec.js.map +1 -0
- package/dist/__tests__/agent-add-tool.spec.d.ts +2 -0
- package/dist/__tests__/agent-add-tool.spec.d.ts.map +1 -0
- package/dist/__tests__/agent-add-tool.spec.js +483 -0
- package/dist/__tests__/agent-add-tool.spec.js.map +1 -0
- package/dist/__tests__/api-runtime-race.spec.d.ts +2 -0
- package/dist/__tests__/api-runtime-race.spec.d.ts.map +1 -0
- package/dist/__tests__/api-runtime-race.spec.js +193 -0
- package/dist/__tests__/api-runtime-race.spec.js.map +1 -0
- package/dist/__tests__/claim-dispatcher.spec.d.ts +2 -0
- package/dist/__tests__/claim-dispatcher.spec.d.ts.map +1 -0
- package/dist/__tests__/claim-dispatcher.spec.js +408 -0
- package/dist/__tests__/claim-dispatcher.spec.js.map +1 -0
- package/dist/__tests__/inbound-job-dispatch.spec.d.ts +2 -0
- package/dist/__tests__/inbound-job-dispatch.spec.d.ts.map +1 -0
- package/dist/__tests__/inbound-job-dispatch.spec.js +185 -0
- package/dist/__tests__/inbound-job-dispatch.spec.js.map +1 -0
- package/dist/__tests__/job-controller-progress.spec.d.ts +2 -0
- package/dist/__tests__/job-controller-progress.spec.d.ts.map +1 -0
- package/dist/__tests__/job-controller-progress.spec.js +85 -0
- package/dist/__tests__/job-controller-progress.spec.js.map +1 -0
- package/dist/__tests__/jobs-cancel-route.spec.d.ts +2 -0
- package/dist/__tests__/jobs-cancel-route.spec.d.ts.map +1 -0
- package/dist/__tests__/jobs-cancel-route.spec.js +88 -0
- package/dist/__tests__/jobs-cancel-route.spec.js.map +1 -0
- package/dist/__tests__/llm-agent-stream.test.d.ts +14 -0
- package/dist/__tests__/llm-agent-stream.test.d.ts.map +1 -0
- package/dist/__tests__/llm-agent-stream.test.js +341 -0
- package/dist/__tests__/llm-agent-stream.test.js.map +1 -0
- package/dist/__tests__/mesh-job-submitter.spec.d.ts +2 -0
- package/dist/__tests__/mesh-job-submitter.spec.d.ts.map +1 -0
- package/dist/__tests__/mesh-job-submitter.spec.js +110 -0
- package/dist/__tests__/mesh-job-submitter.spec.js.map +1 -0
- package/dist/__tests__/proxy-stream.test.d.ts +9 -0
- package/dist/__tests__/proxy-stream.test.d.ts.map +1 -0
- package/dist/__tests__/proxy-stream.test.js +347 -0
- package/dist/__tests__/proxy-stream.test.js.map +1 -0
- package/dist/__tests__/resolver-meshjob.spec.d.ts +26 -0
- package/dist/__tests__/resolver-meshjob.spec.d.ts.map +1 -0
- package/dist/__tests__/resolver-meshjob.spec.js +201 -0
- package/dist/__tests__/resolver-meshjob.spec.js.map +1 -0
- package/dist/__tests__/schema-verdict-policy.test.d.ts +6 -0
- package/dist/__tests__/schema-verdict-policy.test.d.ts.map +1 -0
- package/dist/__tests__/schema-verdict-policy.test.js +126 -0
- package/dist/__tests__/schema-verdict-policy.test.js.map +1 -0
- package/dist/__tests__/sse-stream.test.d.ts +12 -0
- package/dist/__tests__/sse-stream.test.d.ts.map +1 -0
- package/dist/__tests__/sse-stream.test.js +170 -0
- package/dist/__tests__/sse-stream.test.js.map +1 -0
- package/dist/a2a/a2a-bearer.d.ts +27 -0
- package/dist/a2a/a2a-bearer.d.ts.map +1 -0
- package/dist/a2a/a2a-bearer.js +63 -0
- package/dist/a2a/a2a-bearer.js.map +1 -0
- package/dist/a2a/a2a-client.d.ts +114 -0
- package/dist/a2a/a2a-client.d.ts.map +1 -0
- package/dist/a2a/a2a-client.js +405 -0
- package/dist/a2a/a2a-client.js.map +1 -0
- package/dist/a2a/a2a-event.d.ts +25 -0
- package/dist/a2a/a2a-event.d.ts.map +1 -0
- package/dist/a2a/a2a-event.js +9 -0
- package/dist/a2a/a2a-event.js.map +1 -0
- package/dist/a2a/a2a-job.d.ts +58 -0
- package/dist/a2a/a2a-job.d.ts.map +1 -0
- package/dist/a2a/a2a-job.js +264 -0
- package/dist/a2a/a2a-job.js.map +1 -0
- package/dist/a2a/a2a-stream.d.ts +39 -0
- package/dist/a2a/a2a-stream.d.ts.map +1 -0
- package/dist/a2a/a2a-stream.js +290 -0
- package/dist/a2a/a2a-stream.js.map +1 -0
- package/dist/a2a/errors.d.ts +29 -0
- package/dist/a2a/errors.d.ts.map +1 -0
- package/dist/a2a/errors.js +48 -0
- package/dist/a2a/errors.js.map +1 -0
- package/dist/a2a/index.d.ts +12 -0
- package/dist/a2a/index.d.ts.map +1 -0
- package/dist/a2a/index.js +11 -0
- package/dist/a2a/index.js.map +1 -0
- package/dist/a2a/producer/auth-filter.d.ts +34 -0
- package/dist/a2a/producer/auth-filter.d.ts.map +1 -0
- package/dist/a2a/producer/auth-filter.js +39 -0
- package/dist/a2a/producer/auth-filter.js.map +1 -0
- package/dist/a2a/producer/card-builder.d.ts +59 -0
- package/dist/a2a/producer/card-builder.d.ts.map +1 -0
- package/dist/a2a/producer/card-builder.js +59 -0
- package/dist/a2a/producer/card-builder.js.map +1 -0
- package/dist/a2a/producer/dispatcher.d.ts +276 -0
- package/dist/a2a/producer/dispatcher.d.ts.map +1 -0
- package/dist/a2a/producer/dispatcher.js +896 -0
- package/dist/a2a/producer/dispatcher.js.map +1 -0
- package/dist/a2a/producer/index.d.ts +26 -0
- package/dist/a2a/producer/index.d.ts.map +1 -0
- package/dist/a2a/producer/index.js +23 -0
- package/dist/a2a/producer/index.js.map +1 -0
- package/dist/a2a/producer/mount.d.ts +75 -0
- package/dist/a2a/producer/mount.d.ts.map +1 -0
- package/dist/a2a/producer/mount.js +422 -0
- package/dist/a2a/producer/mount.js.map +1 -0
- package/dist/a2a/producer/public-url-cache.d.ts +73 -0
- package/dist/a2a/producer/public-url-cache.d.ts.map +1 -0
- package/dist/a2a/producer/public-url-cache.js +0 -0
- package/dist/a2a/producer/public-url-cache.js.map +1 -0
- package/dist/a2a/producer/registry.d.ts +138 -0
- package/dist/a2a/producer/registry.d.ts.map +1 -0
- package/dist/a2a/producer/registry.js +117 -0
- package/dist/a2a/producer/registry.js.map +1 -0
- package/dist/a2a/producer/sse-emitter.d.ts +85 -0
- package/dist/a2a/producer/sse-emitter.d.ts.map +1 -0
- package/dist/a2a/producer/sse-emitter.js +405 -0
- package/dist/a2a/producer/sse-emitter.js.map +1 -0
- package/dist/a2a/producer/state-translator.d.ts +63 -0
- package/dist/a2a/producer/state-translator.d.ts.map +1 -0
- package/dist/a2a/producer/state-translator.js +108 -0
- package/dist/a2a/producer/state-translator.js.map +1 -0
- package/dist/a2a/producer/task-store.d.ts +128 -0
- package/dist/a2a/producer/task-store.d.ts.map +1 -0
- package/dist/a2a/producer/task-store.js +128 -0
- package/dist/a2a/producer/task-store.js.map +1 -0
- package/dist/agent.d.ts +72 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +618 -13
- package/dist/agent.js.map +1 -1
- package/dist/api-runtime.d.ts +25 -0
- package/dist/api-runtime.d.ts.map +1 -1
- package/dist/api-runtime.js +75 -2
- package/dist/api-runtime.js.map +1 -1
- package/dist/claim-dispatcher.d.ts +126 -0
- package/dist/claim-dispatcher.d.ts.map +1 -0
- package/dist/claim-dispatcher.js +478 -0
- package/dist/claim-dispatcher.js.map +1 -0
- package/dist/express.d.ts.map +1 -1
- package/dist/express.js +33 -6
- package/dist/express.js.map +1 -1
- package/dist/inbound-job-dispatch.d.ts +105 -0
- package/dist/inbound-job-dispatch.d.ts.map +1 -0
- package/dist/inbound-job-dispatch.js +335 -0
- package/dist/inbound-job-dispatch.js.map +1 -0
- package/dist/index.d.ts +37 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -3
- package/dist/index.js.map +1 -1
- package/dist/job-context.d.ts +107 -0
- package/dist/job-context.d.ts.map +1 -0
- package/dist/job-context.js +95 -0
- package/dist/job-context.js.map +1 -0
- package/dist/jobs-cancel-route.d.ts +36 -0
- package/dist/jobs-cancel-route.d.ts.map +1 -0
- package/dist/jobs-cancel-route.js +60 -0
- package/dist/jobs-cancel-route.js.map +1 -0
- package/dist/jobs-helper-tools.d.ts +48 -0
- package/dist/jobs-helper-tools.d.ts.map +1 -0
- package/dist/jobs-helper-tools.js +133 -0
- package/dist/jobs-helper-tools.js.map +1 -0
- package/dist/llm-agent.d.ts +62 -53
- package/dist/llm-agent.d.ts.map +1 -1
- package/dist/llm-agent.js +211 -292
- package/dist/llm-agent.js.map +1 -1
- package/dist/llm-provider.d.ts +4 -4
- package/dist/llm.d.ts +4 -1
- package/dist/llm.d.ts.map +1 -1
- package/dist/llm.js +7 -17
- package/dist/llm.js.map +1 -1
- package/dist/mesh-job-submitter.d.ts +83 -0
- package/dist/mesh-job-submitter.d.ts.map +1 -0
- package/dist/mesh-job-submitter.js +143 -0
- package/dist/mesh-job-submitter.js.map +1 -0
- package/dist/proxy.d.ts +30 -0
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +351 -1
- package/dist/proxy.js.map +1 -1
- package/dist/resolver-meshjob.d.ts +170 -0
- package/dist/resolver-meshjob.d.ts.map +1 -0
- package/dist/resolver-meshjob.js +159 -0
- package/dist/resolver-meshjob.js.map +1 -0
- package/dist/route.d.ts +4 -0
- package/dist/route.d.ts.map +1 -1
- package/dist/route.js.map +1 -1
- package/dist/schema-normalize.d.ts +62 -0
- package/dist/schema-normalize.d.ts.map +1 -0
- package/dist/schema-normalize.js +128 -0
- package/dist/schema-normalize.js.map +1 -0
- package/dist/sse-stream.d.ts +44 -0
- package/dist/sse-stream.d.ts.map +1 -0
- package/dist/sse-stream.js +173 -0
- package/dist/sse-stream.js.map +1 -0
- package/dist/types.d.ts +351 -9
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin A2A v1.0 client — sync `tasks/send` + non-blocking `submit` +
|
|
3
|
+
* SSE `subscribe` (issue #917).
|
|
4
|
+
*
|
|
5
|
+
* One instance per (url, skillId, auth, timeout) tuple — the framework
|
|
6
|
+
* caches and re-uses clients across tool invocations so the underlying
|
|
7
|
+
* undici connection pool is amortised. Mirrors
|
|
8
|
+
* `mesh._a2a_consumer.A2AClient` (Python) and
|
|
9
|
+
* `io.mcpmesh.a2a.A2AClient` (Java) — same JSON-RPC envelope shape +
|
|
10
|
+
* polling backoff + auth header semantics.
|
|
11
|
+
*/
|
|
12
|
+
import { randomUUID } from "node:crypto";
|
|
13
|
+
import { getDispatcher } from "../http-pool.js";
|
|
14
|
+
import { resolveBearer, } from "./a2a-bearer.js";
|
|
15
|
+
import { A2AAuthError, A2AError, A2ATimeoutError, } from "./errors.js";
|
|
16
|
+
import { A2AJob } from "./a2a-job.js";
|
|
17
|
+
import { A2AStream } from "./a2a-stream.js";
|
|
18
|
+
/** Default per-call deadline for `send`. */
|
|
19
|
+
export const DEFAULT_TIMEOUT_MS = 30_000;
|
|
20
|
+
/** Initial poll interval for `tasks/get` (ms). */
|
|
21
|
+
export const DEFAULT_POLL_INTERVAL_MS = 500;
|
|
22
|
+
/** Capped poll interval for `tasks/get` (ms). */
|
|
23
|
+
export const DEFAULT_POLL_INTERVAL_MAX_MS = 2_000;
|
|
24
|
+
/** Multiplier applied between consecutive polls. */
|
|
25
|
+
export const POLL_BACKOFF_FACTOR = 1.5;
|
|
26
|
+
const _TERMINAL_STATES = new Set([
|
|
27
|
+
"completed",
|
|
28
|
+
"failed",
|
|
29
|
+
"canceled",
|
|
30
|
+
// A2A v1.0 uses US "canceled"; mesh JobController uses UK "cancelled".
|
|
31
|
+
// Accept both so a heterogeneous deployment doesn't get stuck polling.
|
|
32
|
+
"cancelled",
|
|
33
|
+
]);
|
|
34
|
+
export function isTerminalState(state) {
|
|
35
|
+
return state != null && _TERMINAL_STATES.has(state.toLowerCase());
|
|
36
|
+
}
|
|
37
|
+
export class A2AClient {
|
|
38
|
+
url;
|
|
39
|
+
skillId;
|
|
40
|
+
auth;
|
|
41
|
+
timeoutMs;
|
|
42
|
+
pollIntervalMs;
|
|
43
|
+
pollIntervalMaxMs;
|
|
44
|
+
closed = false;
|
|
45
|
+
// JSON-RPC requires a unique id per request — a per-instance monotonic
|
|
46
|
+
// counter is the spec-conforming choice. Some servers/middleware
|
|
47
|
+
// enforce this, so don't reuse `2` across every tasks/get poll.
|
|
48
|
+
nextRpcId = 1;
|
|
49
|
+
constructor(config) {
|
|
50
|
+
if (!config.url || config.url.trim() === "") {
|
|
51
|
+
throw new A2AError("A2AClient: url must be non-empty");
|
|
52
|
+
}
|
|
53
|
+
if (config.timeoutMs !== undefined && config.timeoutMs <= 0) {
|
|
54
|
+
throw new A2AError("A2AClient: timeoutMs must be > 0");
|
|
55
|
+
}
|
|
56
|
+
// Trim trailing slashes to match Python's url.rstrip("/") and Java's
|
|
57
|
+
// trim loop — keeps the on-the-wire URL stable regardless of how
|
|
58
|
+
// the user wrote the constructor argument.
|
|
59
|
+
let trimmed = config.url;
|
|
60
|
+
while (trimmed.endsWith("/")) {
|
|
61
|
+
trimmed = trimmed.slice(0, -1);
|
|
62
|
+
}
|
|
63
|
+
this.url = trimmed;
|
|
64
|
+
this.skillId = config.skillId;
|
|
65
|
+
this.auth = resolveBearer(config.auth);
|
|
66
|
+
this.timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
67
|
+
this.pollIntervalMs = config.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
|
|
68
|
+
this.pollIntervalMaxMs =
|
|
69
|
+
config.pollIntervalMaxMs ?? DEFAULT_POLL_INTERVAL_MAX_MS;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* POST `tasks/send` and poll `tasks/get` until terminal.
|
|
73
|
+
*
|
|
74
|
+
* `message` is the A2A v1.0 request message dict — typically
|
|
75
|
+
* `{ role: "user", parts: [{ type: "text", text: "..." }] }`.
|
|
76
|
+
* Returns an `A2AResponse` whose `artifactText` carries the
|
|
77
|
+
* producer-side handler's return value (JSON-stringified for
|
|
78
|
+
* non-string returns; consumers `JSON.parse` when the upstream
|
|
79
|
+
* returns a dict).
|
|
80
|
+
*/
|
|
81
|
+
async send(message, options) {
|
|
82
|
+
this._ensureOpen();
|
|
83
|
+
if (message == null) {
|
|
84
|
+
throw new A2AError("A2AClient.send: message must be non-null");
|
|
85
|
+
}
|
|
86
|
+
const timeoutMs = options?.timeoutMs ?? this.timeoutMs;
|
|
87
|
+
if (timeoutMs <= 0) {
|
|
88
|
+
throw new A2AError("A2AClient.send: timeoutMs must be > 0");
|
|
89
|
+
}
|
|
90
|
+
const taskId = options?.taskId ?? this._newTaskId();
|
|
91
|
+
const deadline = Date.now() + timeoutMs;
|
|
92
|
+
let result = await this._postJsonRpc("tasks/send", { id: taskId, message }, Math.max(1, deadline - Date.now()));
|
|
93
|
+
let state = readState(result);
|
|
94
|
+
if (isTerminalState(state)) {
|
|
95
|
+
return this._buildResponse(taskId, result);
|
|
96
|
+
}
|
|
97
|
+
let intervalMs = this.pollIntervalMs;
|
|
98
|
+
while (Date.now() < deadline) {
|
|
99
|
+
await sleep(Math.min(intervalMs, Math.max(1, deadline - Date.now())));
|
|
100
|
+
const remaining = deadline - Date.now();
|
|
101
|
+
if (remaining <= 0)
|
|
102
|
+
break;
|
|
103
|
+
result = await this._postJsonRpc("tasks/get", { id: taskId }, remaining);
|
|
104
|
+
state = readState(result);
|
|
105
|
+
if (isTerminalState(state)) {
|
|
106
|
+
return this._buildResponse(taskId, result);
|
|
107
|
+
}
|
|
108
|
+
intervalMs = Math.min(this.pollIntervalMaxMs, Math.floor(intervalMs * POLL_BACKOFF_FACTOR));
|
|
109
|
+
}
|
|
110
|
+
throw new A2ATimeoutError(`A2A task '${taskId}' on ${this.url} did not reach terminal state ` +
|
|
111
|
+
`within ${timeoutMs}ms (last state='${state}')`);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* POST `tasks/send` and return an `A2AJob` handle WITHOUT polling.
|
|
115
|
+
*
|
|
116
|
+
* Use this when the surrounding `addTool({ task: true, ... })` body
|
|
117
|
+
* wants explicit control over when to poll — typically via
|
|
118
|
+
* `A2AJob.bridge(jobController)` which mirrors progress into the
|
|
119
|
+
* framework-injected `JobController`.
|
|
120
|
+
*/
|
|
121
|
+
async submit(message, options) {
|
|
122
|
+
this._ensureOpen();
|
|
123
|
+
if (message == null) {
|
|
124
|
+
throw new A2AError("A2AClient.submit: message must be non-null");
|
|
125
|
+
}
|
|
126
|
+
const taskId = options?.taskId ?? this._newTaskId();
|
|
127
|
+
const result = await this._postJsonRpc("tasks/send", { id: taskId, message }, this.timeoutMs);
|
|
128
|
+
const state = readState(result);
|
|
129
|
+
return new A2AJob(this, taskId, state, result);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* POST `tasks/sendSubscribe` and return an `A2AStream` of parsed events.
|
|
133
|
+
*
|
|
134
|
+
* The returned stream MUST be either iterated to completion (the
|
|
135
|
+
* terminal `final=true` frame closes it) OR explicitly closed via
|
|
136
|
+
* `await using` / `await stream.aclose()` to release the underlying
|
|
137
|
+
* connection.
|
|
138
|
+
*/
|
|
139
|
+
async subscribe(message, options) {
|
|
140
|
+
this._ensureOpen();
|
|
141
|
+
if (message == null) {
|
|
142
|
+
throw new A2AError("A2AClient.subscribe: message must be non-null");
|
|
143
|
+
}
|
|
144
|
+
const taskId = options?.taskId ?? this._newTaskId();
|
|
145
|
+
const envelope = {
|
|
146
|
+
jsonrpc: "2.0",
|
|
147
|
+
id: this.nextRpcId++,
|
|
148
|
+
method: "tasks/sendSubscribe",
|
|
149
|
+
params: { id: taskId, message },
|
|
150
|
+
};
|
|
151
|
+
const headers = {
|
|
152
|
+
"Content-Type": "application/json",
|
|
153
|
+
Accept: "text/event-stream",
|
|
154
|
+
};
|
|
155
|
+
if (this.auth) {
|
|
156
|
+
headers["Authorization"] = this.auth.authorizationHeader();
|
|
157
|
+
}
|
|
158
|
+
let response;
|
|
159
|
+
try {
|
|
160
|
+
// No request timeout on the SSE call — the stream lifetime is
|
|
161
|
+
// dictated by the producer, not a per-request deadline. The
|
|
162
|
+
// dispatcher's keep-alive still applies to the initial handshake.
|
|
163
|
+
response = await fetch(this.url, {
|
|
164
|
+
method: "POST",
|
|
165
|
+
headers,
|
|
166
|
+
body: JSON.stringify(envelope),
|
|
167
|
+
// undici extension: dispatcher is honoured for connection pooling.
|
|
168
|
+
dispatcher: getDispatcher(this.url),
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
throw new A2AError(`A2A tasks/sendSubscribe ${this.url} transport failure: ` +
|
|
173
|
+
`${err?.message ?? String(err)}`, err);
|
|
174
|
+
}
|
|
175
|
+
if (!response.ok) {
|
|
176
|
+
const body = await response.text().catch(() => "");
|
|
177
|
+
throw new A2AError(`A2A tasks/sendSubscribe ${this.url} HTTP ${response.status}: ` +
|
|
178
|
+
truncate(body, 256));
|
|
179
|
+
}
|
|
180
|
+
if (!response.body) {
|
|
181
|
+
throw new A2AError(`A2A tasks/sendSubscribe ${this.url} returned no response body`);
|
|
182
|
+
}
|
|
183
|
+
return new A2AStream(response, taskId);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Lifecycle marker (forward-compat).
|
|
187
|
+
*
|
|
188
|
+
* The undici Agent pool is shared process-wide via `closeHttpPool()`
|
|
189
|
+
* — there's no per-client connection state to tear down. We mark
|
|
190
|
+
* `closed = true` so subsequent `send`/`submit`/`subscribe` raise
|
|
191
|
+
* cleanly (matches Python's `_closed` flag behaviour).
|
|
192
|
+
*/
|
|
193
|
+
async close() {
|
|
194
|
+
this.closed = true;
|
|
195
|
+
}
|
|
196
|
+
// --- internal API used by A2AJob / A2AStream -----------------------------
|
|
197
|
+
/** Internal: POST `tasks/get` for the supplied task ID. */
|
|
198
|
+
async tasksGet(taskId) {
|
|
199
|
+
this._ensureOpen();
|
|
200
|
+
return this._postJsonRpc("tasks/get", { id: taskId }, this.timeoutMs);
|
|
201
|
+
}
|
|
202
|
+
/** Internal: POST `tasks/cancel`. Best-effort; transport errors swallowed by caller. */
|
|
203
|
+
async tasksCancel(taskId, reason) {
|
|
204
|
+
this._ensureOpen();
|
|
205
|
+
const params = { id: taskId };
|
|
206
|
+
if (reason !== undefined)
|
|
207
|
+
params.reason = reason;
|
|
208
|
+
// A2A spec-conforming producers may return `{jsonrpc:"2.0",id:N}` for
|
|
209
|
+
// tasks/cancel (no result, no error) — accept that envelope shape so
|
|
210
|
+
// we don't false-fail the cancel on producers that don't echo a Task
|
|
211
|
+
// body back.
|
|
212
|
+
await this._postJsonRpc("tasks/cancel", params, this.timeoutMs, "result-or-error");
|
|
213
|
+
}
|
|
214
|
+
/** Internal: build an `A2AResponse` from a Task envelope. */
|
|
215
|
+
buildResponse(taskId, result) {
|
|
216
|
+
return this._buildResponse(taskId, result);
|
|
217
|
+
}
|
|
218
|
+
// --- helpers -------------------------------------------------------------
|
|
219
|
+
_newTaskId() {
|
|
220
|
+
return `c-${randomUUID().replace(/-/g, "")}`;
|
|
221
|
+
}
|
|
222
|
+
_ensureOpen() {
|
|
223
|
+
if (this.closed) {
|
|
224
|
+
throw new A2AError(`A2AClient(url=${this.url}) is closed; create a new instance instead.`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
async _postJsonRpc(method, params, timeoutMs, accept = "result-required") {
|
|
228
|
+
const envelope = {
|
|
229
|
+
jsonrpc: "2.0",
|
|
230
|
+
id: this.nextRpcId++,
|
|
231
|
+
method,
|
|
232
|
+
params,
|
|
233
|
+
};
|
|
234
|
+
const headers = {
|
|
235
|
+
"Content-Type": "application/json",
|
|
236
|
+
Accept: "application/json",
|
|
237
|
+
};
|
|
238
|
+
if (this.auth) {
|
|
239
|
+
try {
|
|
240
|
+
headers["Authorization"] = this.auth.authorizationHeader();
|
|
241
|
+
}
|
|
242
|
+
catch (err) {
|
|
243
|
+
if (err instanceof A2AAuthError)
|
|
244
|
+
throw err;
|
|
245
|
+
throw new A2AAuthError(`A2A ${method} ${this.url}: failed to resolve bearer header: ` +
|
|
246
|
+
`${err?.message ?? String(err)}`, err);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
const controller = new AbortController();
|
|
250
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
251
|
+
let response;
|
|
252
|
+
try {
|
|
253
|
+
response = await fetch(this.url, {
|
|
254
|
+
method: "POST",
|
|
255
|
+
headers,
|
|
256
|
+
body: JSON.stringify(envelope),
|
|
257
|
+
signal: controller.signal,
|
|
258
|
+
// undici extension: dispatcher is honoured for connection pooling.
|
|
259
|
+
dispatcher: getDispatcher(this.url),
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
if (err?.name === "AbortError") {
|
|
264
|
+
throw new A2ATimeoutError(`A2A ${method} ${this.url} timed out after ${timeoutMs}ms`, err);
|
|
265
|
+
}
|
|
266
|
+
throw new A2AError(`A2A ${method} ${this.url} transport failure: ` +
|
|
267
|
+
`${err?.message ?? String(err)}`, err);
|
|
268
|
+
}
|
|
269
|
+
finally {
|
|
270
|
+
clearTimeout(timer);
|
|
271
|
+
}
|
|
272
|
+
const body = await response.text();
|
|
273
|
+
if (!response.ok) {
|
|
274
|
+
throw new A2AError(`A2A ${method} ${this.url} HTTP ${response.status}: ` +
|
|
275
|
+
truncate(body, 256));
|
|
276
|
+
}
|
|
277
|
+
let parsed;
|
|
278
|
+
try {
|
|
279
|
+
parsed = JSON.parse(body);
|
|
280
|
+
}
|
|
281
|
+
catch (err) {
|
|
282
|
+
throw new A2AError(`A2A ${method} ${this.url} returned malformed JSON: ` +
|
|
283
|
+
truncate(body, 256), err);
|
|
284
|
+
}
|
|
285
|
+
if (parsed == null || typeof parsed !== "object") {
|
|
286
|
+
throw new A2AError(`A2A ${method} ${this.url} returned empty body`);
|
|
287
|
+
}
|
|
288
|
+
const obj = parsed;
|
|
289
|
+
if (obj.error != null) {
|
|
290
|
+
const err = obj.error;
|
|
291
|
+
const code = err.code !== undefined ? String(err.code) : "?";
|
|
292
|
+
const msg = err.message !== undefined ? String(err.message) : "<no message>";
|
|
293
|
+
throw new A2AError(`A2A error from ${this.url}: ${code} ${msg}`);
|
|
294
|
+
}
|
|
295
|
+
if (obj.result === undefined || obj.result === null) {
|
|
296
|
+
if (accept === "result-or-error") {
|
|
297
|
+
return {};
|
|
298
|
+
}
|
|
299
|
+
// A producer that returns {"jsonrpc":"2.0","id":1} (no result and
|
|
300
|
+
// no error) is malformed JSON-RPC. Coercing this to an empty
|
|
301
|
+
// object would make `readState()` return "unknown" and the
|
|
302
|
+
// polling loop spin until the user-supplied deadline. Fail fast
|
|
303
|
+
// with a clear message instead — matches Java parity.
|
|
304
|
+
throw new A2AError(`A2A ${method} ${this.url} response has neither 'result' nor 'error' ` +
|
|
305
|
+
`field — malformed JSON-RPC envelope: ${truncate(body, 256)}`);
|
|
306
|
+
}
|
|
307
|
+
return obj.result;
|
|
308
|
+
}
|
|
309
|
+
_buildResponse(taskId, result) {
|
|
310
|
+
return {
|
|
311
|
+
artifactText: extractArtifactText(result),
|
|
312
|
+
state: readState(result),
|
|
313
|
+
taskId,
|
|
314
|
+
rawTask: result,
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
// --- exported helpers (used by A2AJob + A2AStream) ----------------------------
|
|
319
|
+
export function readState(result) {
|
|
320
|
+
if (!result || typeof result !== "object")
|
|
321
|
+
return "unknown";
|
|
322
|
+
const status = result.status;
|
|
323
|
+
if (!status || typeof status !== "object")
|
|
324
|
+
return "unknown";
|
|
325
|
+
const state = status.state;
|
|
326
|
+
if (typeof state !== "string")
|
|
327
|
+
return "unknown";
|
|
328
|
+
return state;
|
|
329
|
+
}
|
|
330
|
+
export function extractArtifactText(result) {
|
|
331
|
+
const artifacts = result.artifacts;
|
|
332
|
+
if (!Array.isArray(artifacts) || artifacts.length === 0)
|
|
333
|
+
return "";
|
|
334
|
+
const first = artifacts[0];
|
|
335
|
+
if (!first || typeof first !== "object")
|
|
336
|
+
return "";
|
|
337
|
+
const parts = first.parts;
|
|
338
|
+
if (!Array.isArray(parts) || parts.length === 0)
|
|
339
|
+
return "";
|
|
340
|
+
const firstPart = parts[0];
|
|
341
|
+
if (!firstPart || typeof firstPart !== "object")
|
|
342
|
+
return "";
|
|
343
|
+
const text = firstPart.text;
|
|
344
|
+
return typeof text === "string" ? text : "";
|
|
345
|
+
}
|
|
346
|
+
export function readStatusMessage(result) {
|
|
347
|
+
const status = result.status;
|
|
348
|
+
if (!status || typeof status !== "object")
|
|
349
|
+
return undefined;
|
|
350
|
+
const msg = status.message;
|
|
351
|
+
if (!msg || typeof msg !== "object")
|
|
352
|
+
return undefined;
|
|
353
|
+
const parts = msg.parts;
|
|
354
|
+
if (!Array.isArray(parts) || parts.length === 0)
|
|
355
|
+
return undefined;
|
|
356
|
+
const firstPart = parts[0];
|
|
357
|
+
if (!firstPart || typeof firstPart !== "object")
|
|
358
|
+
return undefined;
|
|
359
|
+
const text = firstPart.text;
|
|
360
|
+
return typeof text === "string" ? text : undefined;
|
|
361
|
+
}
|
|
362
|
+
export function readProgress(result) {
|
|
363
|
+
const metadata = result.metadata;
|
|
364
|
+
if (!metadata || typeof metadata !== "object")
|
|
365
|
+
return undefined;
|
|
366
|
+
const progress = metadata.progress;
|
|
367
|
+
if (progress === undefined || progress === null)
|
|
368
|
+
return undefined;
|
|
369
|
+
if (typeof progress === "number" && Number.isFinite(progress)) {
|
|
370
|
+
return progress;
|
|
371
|
+
}
|
|
372
|
+
// Tolerate stringified numerics — some producers JSON-encode metadata
|
|
373
|
+
// fields as strings.
|
|
374
|
+
if (typeof progress === "string") {
|
|
375
|
+
const n = Number.parseFloat(progress);
|
|
376
|
+
if (Number.isFinite(n))
|
|
377
|
+
return n;
|
|
378
|
+
}
|
|
379
|
+
return undefined;
|
|
380
|
+
}
|
|
381
|
+
export function maybeJsonParse(text) {
|
|
382
|
+
if (!text)
|
|
383
|
+
return text;
|
|
384
|
+
try {
|
|
385
|
+
return JSON.parse(text);
|
|
386
|
+
}
|
|
387
|
+
catch {
|
|
388
|
+
return text;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
export function isCanceledState(state) {
|
|
392
|
+
if (!state)
|
|
393
|
+
return false;
|
|
394
|
+
const s = state.toLowerCase();
|
|
395
|
+
return s === "canceled" || s === "cancelled";
|
|
396
|
+
}
|
|
397
|
+
function truncate(s, max) {
|
|
398
|
+
if (s == null)
|
|
399
|
+
return "";
|
|
400
|
+
return s.length <= max ? s : s.slice(0, max) + "...";
|
|
401
|
+
}
|
|
402
|
+
function sleep(ms) {
|
|
403
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
404
|
+
}
|
|
405
|
+
//# sourceMappingURL=a2a-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a2a-client.js","sourceRoot":"","sources":["../../src/a2a/a2a-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAGL,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,4CAA4C;AAC5C,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AACzC,kDAAkD;AAClD,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAC5C,iDAAiD;AACjD,MAAM,CAAC,MAAM,4BAA4B,GAAG,KAAK,CAAC;AAClD,oDAAoD;AACpD,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEvC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,WAAW;IACX,QAAQ;IACR,UAAU;IACV,uEAAuE;IACvE,uEAAuE;IACvE,WAAW;CACZ,CAAC,CAAC;AAEH,MAAM,UAAU,eAAe,CAAC,KAAgC;IAC9D,OAAO,KAAK,IAAI,IAAI,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;AACpE,CAAC;AA6CD,MAAM,OAAO,SAAS;IACX,GAAG,CAAS;IACZ,OAAO,CAAS;IAChB,IAAI,CAAa;IACjB,SAAS,CAAS;IAClB,cAAc,CAAS;IACvB,iBAAiB,CAAS;IAC3B,MAAM,GAAG,KAAK,CAAC;IACvB,uEAAuE;IACvE,iEAAiE;IACjE,gEAAgE;IACxD,SAAS,GAAG,CAAC,CAAC;IAEtB,YAAY,MAAuB;QACjC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC5C,MAAM,IAAI,QAAQ,CAAC,kCAAkC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,QAAQ,CAAC,kCAAkC,CAAC,CAAC;QACzD,CAAC;QACD,qEAAqE;QACrE,iEAAiE;QACjE,2CAA2C;QAC3C,IAAI,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC;QACzB,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,kBAAkB,CAAC;QACxD,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,wBAAwB,CAAC;QACxE,IAAI,CAAC,iBAAiB;YACpB,MAAM,CAAC,iBAAiB,IAAI,4BAA4B,CAAC;IAC7D,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,IAAI,CACR,OAAmB,EACnB,OAAiD;QAEjD,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YACpB,MAAM,IAAI,QAAQ,CAAC,0CAA0C,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC;QACvD,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACnB,MAAM,IAAI,QAAQ,CAAC,uCAAuC,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAExC,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAClC,YAAY,EACZ,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EACvB,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CACnC,CAAC;QACF,IAAI,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAC9B,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC;QACrC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC7B,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YACtE,MAAM,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACxC,IAAI,SAAS,IAAI,CAAC;gBAAE,MAAM;YAC1B,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAC9B,WAAW,EACX,EAAE,EAAE,EAAE,MAAM,EAAE,EACd,SAAS,CACV,CAAC;YACF,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;YAC1B,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC7C,CAAC;YACD,UAAU,GAAG,IAAI,CAAC,GAAG,CACnB,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,mBAAmB,CAAC,CAC7C,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,eAAe,CACvB,aAAa,MAAM,QAAQ,IAAI,CAAC,GAAG,gCAAgC;YACjE,UAAU,SAAS,mBAAmB,KAAK,IAAI,CAClD,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,MAAM,CACV,OAAmB,EACnB,OAA6B;QAE7B,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YACpB,MAAM,IAAI,QAAQ,CAAC,4CAA4C,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CACpC,YAAY,EACZ,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EACvB,IAAI,CAAC,SAAS,CACf,CAAC;QACF,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAChC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,SAAS,CACb,OAAmB,EACnB,OAA6B;QAE7B,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YACpB,MAAM,IAAI,QAAQ,CAAC,+CAA+C,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAoB;YAChC,OAAO,EAAE,KAAK;YACd,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE;YACpB,MAAM,EAAE,qBAAqB;YAC7B,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;SAChC,CAAC;QAEF,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,mBAAmB;SAC5B,CAAC;QACF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC7D,CAAC;QAED,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,8DAA8D;YAC9D,4DAA4D;YAC5D,kEAAkE;YAClE,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC/B,MAAM,EAAE,MAAM;gBACd,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;gBAC9B,mEAAmE;gBACnE,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;aACpC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,QAAQ,CAChB,2BAA2B,IAAI,CAAC,GAAG,sBAAsB;gBACvD,GAAI,GAAa,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,EAC7C,GAAG,CACJ,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACnD,MAAM,IAAI,QAAQ,CAChB,2BAA2B,IAAI,CAAC,GAAG,SAAS,QAAQ,CAAC,MAAM,IAAI;gBAC7D,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CACtB,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,QAAQ,CAChB,2BAA2B,IAAI,CAAC,GAAG,4BAA4B,CAChE,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,4EAA4E;IAE5E,2DAA2D;IAC3D,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC3B,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACxE,CAAC;IAED,wFAAwF;IACxF,KAAK,CAAC,WAAW,CAAC,MAAc,EAAE,MAAe;QAC/C,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,MAAM,MAAM,GAA4B,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;QACvD,IAAI,MAAM,KAAK,SAAS;YAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;QACjD,sEAAsE;QACtE,qEAAqE;QACrE,qEAAqE;QACrE,aAAa;QACb,MAAM,IAAI,CAAC,YAAY,CACrB,cAAc,EACd,MAAM,EACN,IAAI,CAAC,SAAS,EACd,iBAAiB,CAClB,CAAC;IACJ,CAAC;IAED,6DAA6D;IAC7D,aAAa,CAAC,MAAc,EAAE,MAAuB;QACnD,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,4EAA4E;IAEpE,UAAU;QAChB,OAAO,KAAK,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;IAC/C,CAAC;IAEO,WAAW;QACjB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,QAAQ,CAChB,iBAAiB,IAAI,CAAC,GAAG,6CAA6C,CACvE,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,MAAc,EACd,MAA+B,EAC/B,SAAiB,EACjB,SAA6B,iBAAiB;QAE9C,MAAM,QAAQ,GAAoB;YAChC,OAAO,EAAE,KAAK;YACd,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE;YACpB,MAAM;YACN,MAAM;SACP,CAAC;QACF,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,kBAAkB;SAC3B,CAAC;QACF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC;gBACH,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7D,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,YAAY;oBAAE,MAAM,GAAG,CAAC;gBAC3C,MAAM,IAAI,YAAY,CACpB,OAAO,MAAM,IAAI,IAAI,CAAC,GAAG,qCAAqC;oBAC5D,GAAI,GAAa,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,EAC7C,GAAG,CACJ,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;QAC9D,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC/B,MAAM,EAAE,MAAM;gBACd,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;gBAC9B,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,mEAAmE;gBACnE,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;aACpC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAAyB,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;gBACtD,MAAM,IAAI,eAAe,CACvB,OAAO,MAAM,IAAI,IAAI,CAAC,GAAG,oBAAoB,SAAS,IAAI,EAC1D,GAAG,CACJ,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,QAAQ,CAChB,OAAO,MAAM,IAAI,IAAI,CAAC,GAAG,sBAAsB;gBAC7C,GAAI,GAAa,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,EAC7C,GAAG,CACJ,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,QAAQ,CAChB,OAAO,MAAM,IAAI,IAAI,CAAC,GAAG,SAAS,QAAQ,CAAC,MAAM,IAAI;gBACnD,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CACtB,CAAC;QACJ,CAAC;QACD,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,QAAQ,CAChB,OAAO,MAAM,IAAI,IAAI,CAAC,GAAG,4BAA4B;gBACnD,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,EACrB,GAAG,CACJ,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YACjD,MAAM,IAAI,QAAQ,CAAC,OAAO,MAAM,IAAI,IAAI,CAAC,GAAG,sBAAsB,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,GAAG,GAAG,MAAiC,CAAC;QAC9C,IAAI,GAAG,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,CAAC,KAAgC,CAAC;YACjD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC7D,MAAM,GAAG,GACP,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;YACnE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACpD,IAAI,MAAM,KAAK,iBAAiB,EAAE,CAAC;gBACjC,OAAO,EAAqB,CAAC;YAC/B,CAAC;YACD,kEAAkE;YAClE,6DAA6D;YAC7D,2DAA2D;YAC3D,gEAAgE;YAChE,sDAAsD;YACtD,MAAM,IAAI,QAAQ,CAChB,OAAO,MAAM,IAAI,IAAI,CAAC,GAAG,6CAA6C;gBACpE,wCAAwC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAChE,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC,MAAyB,CAAC;IACvC,CAAC;IAEO,cAAc,CACpB,MAAc,EACd,MAAuB;QAEvB,OAAO;YACL,YAAY,EAAE,mBAAmB,CAAC,MAAM,CAAC;YACzC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC;YACxB,MAAM;YACN,OAAO,EAAE,MAAM;SAChB,CAAC;IACJ,CAAC;CACF;AAED,iFAAiF;AAEjF,MAAM,UAAU,SAAS,CAAC,MAA0C;IAClE,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC5D,MAAM,MAAM,GAAI,MAAkC,CAAC,MAEtC,CAAC;IACd,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAuB;IACzD,MAAM,SAAS,GAAI,MAAkC,CAAC,SAAS,CAAC;IAChE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnE,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACnD,MAAM,KAAK,GAAI,KAAiC,CAAC,KAAK,CAAC;IACvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3D,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAC3D,MAAM,IAAI,GAAI,SAAqC,CAAC,IAAI,CAAC;IACzD,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAuB;IACvD,MAAM,MAAM,GAAI,MAAkC,CAAC,MAEtC,CAAC;IACd,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC;IAC3B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACtD,MAAM,KAAK,GAAI,GAA+B,CAAC,KAAK,CAAC;IACrD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAClE,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAClE,MAAM,IAAI,GAAI,SAAqC,CAAC,IAAI,CAAC;IACzD,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAuB;IAClD,MAAM,QAAQ,GAAI,MAAkC,CAAC,QAExC,CAAC;IACd,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChE,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACnC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAClE,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9D,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,sEAAsE;IACtE,qBAAqB;IACrB,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAgC;IAC9D,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAC9B,OAAO,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,WAAW,CAAC;AAC/C,CAAC;AAED,SAAS,QAAQ,CAAC,CAA4B,EAAE,GAAW;IACzD,IAAI,CAAC,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IACzB,OAAO,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;AACvD,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parsed A2A v1.0 SSE event surface (issue #917).
|
|
3
|
+
*
|
|
4
|
+
* One event per `tasks/sendSubscribe` SSE frame after the JSON-RPC
|
|
5
|
+
* envelope is decoded. Mirrors `mesh._a2a_consumer.A2AEvent` (Python)
|
|
6
|
+
* and `io.mcpmesh.a2a.A2AEvent` (Java).
|
|
7
|
+
*/
|
|
8
|
+
export type A2AEventKind = "status" | "artifact";
|
|
9
|
+
export interface A2AEvent {
|
|
10
|
+
/** "status" for TaskStatusUpdateEvent frames; "artifact" for TaskArtifactUpdateEvent frames. */
|
|
11
|
+
kind: A2AEventKind;
|
|
12
|
+
/** Lifecycle state (status frames only). */
|
|
13
|
+
state?: string;
|
|
14
|
+
/** Normalized progress in [0, 1] (status frames only, when present). */
|
|
15
|
+
progress?: number;
|
|
16
|
+
/** Status message text (status frames only, when present). */
|
|
17
|
+
message?: string;
|
|
18
|
+
/** Artifact text (artifact frames only). */
|
|
19
|
+
artifactText?: string;
|
|
20
|
+
/** True on the terminal status frame. */
|
|
21
|
+
final: boolean;
|
|
22
|
+
/** Full JSON-RPC envelope for advanced consumers. */
|
|
23
|
+
raw: unknown;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=a2a-event.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a2a-event.d.ts","sourceRoot":"","sources":["../../src/a2a/a2a-event.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEjD,MAAM,WAAW,QAAQ;IACvB,gGAAgG;IAChG,IAAI,EAAE,YAAY,CAAC;IACnB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,KAAK,EAAE,OAAO,CAAC;IACf,qDAAqD;IACrD,GAAG,EAAE,OAAO,CAAC;CACd"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parsed A2A v1.0 SSE event surface (issue #917).
|
|
3
|
+
*
|
|
4
|
+
* One event per `tasks/sendSubscribe` SSE frame after the JSON-RPC
|
|
5
|
+
* envelope is decoded. Mirrors `mesh._a2a_consumer.A2AEvent` (Python)
|
|
6
|
+
* and `io.mcpmesh.a2a.A2AEvent` (Java).
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=a2a-event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a2a-event.js","sourceRoot":"","sources":["../../src/a2a/a2a-event.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handle to a long-running A2A task — returned by `A2AClient.submit`
|
|
3
|
+
* (issue #917).
|
|
4
|
+
*
|
|
5
|
+
* Provides direct task lifecycle methods (`status`, `wait`, `cancel`)
|
|
6
|
+
* AND a convenience `bridge(jobController)` that mirrors A2A polling
|
|
7
|
+
* state into a mesh `JobController` for the typical
|
|
8
|
+
* `addTool({ task: true, a2aConfig: { ... } })` consumer pattern.
|
|
9
|
+
*
|
|
10
|
+
* Mirrors `mesh._a2a_consumer.A2AJob` (Python) and
|
|
11
|
+
* `io.mcpmesh.a2a.A2AJob` (Java).
|
|
12
|
+
*/
|
|
13
|
+
import { JobController } from "@mcpmesh/core";
|
|
14
|
+
import { A2AClient, type A2AResponse, type A2ATaskEnvelope } from "./a2a-client.js";
|
|
15
|
+
export declare class A2AJob {
|
|
16
|
+
private readonly client;
|
|
17
|
+
readonly taskId: string;
|
|
18
|
+
readonly initialState: string;
|
|
19
|
+
private readonly initialResult;
|
|
20
|
+
constructor(client: A2AClient, taskId: string, initialState: string, initialResult: A2ATaskEnvelope);
|
|
21
|
+
/** POST `tasks/get` once and return the raw `result` envelope. */
|
|
22
|
+
status(): Promise<A2ATaskEnvelope>;
|
|
23
|
+
/**
|
|
24
|
+
* POST `tasks/cancel`. Idempotent — already-terminal tasks should
|
|
25
|
+
* return cleanly per A2A v1.0; transport-level errors are logged
|
|
26
|
+
* and swallowed so callers can still raise `A2AJobCanceledError`
|
|
27
|
+
* or similar.
|
|
28
|
+
*/
|
|
29
|
+
cancel(reason?: string): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Poll `tasks/get` until terminal; return `A2AResponse` on completed.
|
|
32
|
+
*
|
|
33
|
+
* Throws `A2AJobFailedError` on `state=failed`,
|
|
34
|
+
* `A2AJobCanceledError` on `state=canceled`, `A2ATimeoutError` if
|
|
35
|
+
* the deadline elapses.
|
|
36
|
+
*/
|
|
37
|
+
wait(timeoutMs?: number): Promise<A2AResponse>;
|
|
38
|
+
/**
|
|
39
|
+
* Mirror A2A polling into the supplied `JobController` until terminal.
|
|
40
|
+
* Returns the final artifact value: parsed JSON when the artifact
|
|
41
|
+
* text is valid JSON, otherwise the raw text. Empty artifacts return
|
|
42
|
+
* an empty string.
|
|
43
|
+
*
|
|
44
|
+
* Cancel handling: races each iteration's sleep against
|
|
45
|
+
* `awaitJobCancel(jobId)` so a mesh-side cancel arriving DURING a
|
|
46
|
+
* sleep wakes us immediately instead of waiting for the next poll
|
|
47
|
+
* boundary. On detection POSTs `tasks/cancel` upstream so the
|
|
48
|
+
* producer stops billing for the work, then throws
|
|
49
|
+
* `A2AJobCanceledError` so the framework's `task: true` wrapper
|
|
50
|
+
* records a canceled outcome.
|
|
51
|
+
*/
|
|
52
|
+
bridge(controller: JobController): Promise<unknown>;
|
|
53
|
+
private _mirrorProgress;
|
|
54
|
+
private _propagateCancelUpstream;
|
|
55
|
+
private _terminalToResponseOrThrow;
|
|
56
|
+
private _terminalToArtifactOrThrow;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=a2a-job.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a2a-job.d.ts","sourceRoot":"","sources":["../../src/a2a/a2a-job.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,aAAa,EAAkB,MAAM,eAAe,CAAC;AAC9D,OAAO,EACL,SAAS,EACT,KAAK,WAAW,EAChB,KAAK,eAAe,EASrB,MAAM,iBAAiB,CAAC;AAOzB,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkB;gBAG9C,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,eAAe;IAQhC,kEAAkE;IAC5D,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC;IAIxC;;;;;OAKG;IACG,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe5C;;;;;;OAMG;IACG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAgCpD;;;;;;;;;;;;;OAaG;IACG,MAAM,CAAC,UAAU,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;YAwF3C,eAAe;YAyCf,wBAAwB;IAWtC,OAAO,CAAC,0BAA0B;IAalC,OAAO,CAAC,0BAA0B;CAcnC"}
|