@plurnk/plurnk-a2a 1.9.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/.env.defaults +30 -0
- package/README.md +69 -0
- package/SPEC.md +199 -0
- package/dist/A2a.d.ts +12 -0
- package/dist/A2a.d.ts.map +1 -0
- package/dist/A2a.js +397 -0
- package/dist/A2a.js.map +1 -0
- package/dist/A2aMessage.d.ts +10 -0
- package/dist/A2aMessage.d.ts.map +1 -0
- package/dist/A2aMessage.js +28 -0
- package/dist/A2aMessage.js.map +1 -0
- package/dist/A2aProjection.d.ts +25 -0
- package/dist/A2aProjection.d.ts.map +1 -0
- package/dist/A2aProjection.js +183 -0
- package/dist/A2aProjection.js.map +1 -0
- package/dist/Functionality.d.ts +77 -0
- package/dist/Functionality.d.ts.map +1 -0
- package/dist/Functionality.js +247 -0
- package/dist/Functionality.js.map +1 -0
- package/dist/HttpJsonClient.d.ts +21 -0
- package/dist/HttpJsonClient.d.ts.map +1 -0
- package/dist/HttpJsonClient.js +41 -0
- package/dist/HttpJsonClient.js.map +1 -0
- package/dist/Module.d.ts +32 -0
- package/dist/Module.d.ts.map +1 -0
- package/dist/Module.js +91 -0
- package/dist/Module.js.map +1 -0
- package/dist/OutboundModule.d.ts +14 -0
- package/dist/OutboundModule.d.ts.map +1 -0
- package/dist/OutboundModule.js +24 -0
- package/dist/OutboundModule.js.map +1 -0
- package/dist/PlurnkAgentExecutor.d.ts +11 -0
- package/dist/PlurnkAgentExecutor.d.ts.map +1 -0
- package/dist/PlurnkAgentExecutor.js +282 -0
- package/dist/PlurnkAgentExecutor.js.map +1 -0
- package/dist/PlurnkTaskStore.d.ts +19 -0
- package/dist/PlurnkTaskStore.d.ts.map +1 -0
- package/dist/PlurnkTaskStore.js +271 -0
- package/dist/PlurnkTaskStore.js.map +1 -0
- package/dist/WorkspaceBinding.d.ts +13 -0
- package/dist/WorkspaceBinding.d.ts.map +1 -0
- package/dist/WorkspaceBinding.js +40 -0
- package/dist/WorkspaceBinding.js.map +1 -0
- package/dist/config.d.ts +22 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +332 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/docs/a2a.md +23 -0
- package/package.json +66 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Module.d.ts","sourceRoot":"","sources":["../src/Module.ts"],"names":[],"mappings":"AACA,OAAO,EAGH,KAAK,SAAS,EACjB,MAAM,aAAa,CAAC;AAOrB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAIhE,OAAyB,EAAE,KAAK,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAEzF,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,SAAS,EAAE,yBAAyB,CAAC;IAC9C,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,kFAAkF;IAClF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,qBAAqB;IAClC,KAAK,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACjD;AAgBD,MAAM,CAAC,OAAO,OAAO,MAAM;;IAQvB,OAAO,eAoCN;IAED,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,GAAG,qBAAqB,CAQ5D;IAEK,MAAM,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAMxE;IAED,OAAO,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAIxC;IAED,SAAS,IAAI,SAAS,CAErB;IAED,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAErB;CACJ"}
|
package/dist/Module.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { createServer } from "node:http";
|
|
2
|
+
import { A2A_PROTOCOL_VERSION, AGENT_CARD_PATH, } from "@a2a-js/sdk";
|
|
3
|
+
import { DefaultRequestHandler } from "@a2a-js/sdk/server";
|
|
4
|
+
import { UserBuilder, agentCardHandler, restHandler, } from "@a2a-js/sdk/server/express";
|
|
5
|
+
import express from "express";
|
|
6
|
+
import PlurnkAgentExecutor from "./PlurnkAgentExecutor.js";
|
|
7
|
+
import PlurnkTaskStore from "./PlurnkTaskStore.js";
|
|
8
|
+
import WorkspaceBinding, {} from "./WorkspaceBinding.js";
|
|
9
|
+
const listen = (server, port, host) => new Promise((resolve, reject) => {
|
|
10
|
+
server.once("error", reject);
|
|
11
|
+
server.listen(port, host, () => {
|
|
12
|
+
server.off("error", reject);
|
|
13
|
+
resolve();
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
const close = (server) => new Promise((resolve, reject) => {
|
|
17
|
+
server.close((error) => error === undefined ? resolve() : reject(error));
|
|
18
|
+
});
|
|
19
|
+
export default class Module {
|
|
20
|
+
#server;
|
|
21
|
+
#host;
|
|
22
|
+
#card;
|
|
23
|
+
#endpointPath;
|
|
24
|
+
#endpointUrl;
|
|
25
|
+
#port;
|
|
26
|
+
constructor(application, options) {
|
|
27
|
+
this.#host = options.host ?? "127.0.0.1";
|
|
28
|
+
this.#port = options.port ?? 0;
|
|
29
|
+
this.#endpointPath = options.endpointPath ?? "/a2a";
|
|
30
|
+
this.#endpointUrl = options.endpointUrl;
|
|
31
|
+
if (!this.#endpointPath.startsWith("/") || this.#endpointPath.includes("?") || this.#endpointPath.includes("#")) {
|
|
32
|
+
throw new TypeError("A2A endpointPath must be an absolute URL pathname without query or fragment.");
|
|
33
|
+
}
|
|
34
|
+
if (options.card.securityRequirements.length > 0 || Object.keys(options.card.securitySchemes).length > 0) {
|
|
35
|
+
throw new TypeError("An unauthenticated A2A listener cannot advertise security requirements or schemes.");
|
|
36
|
+
}
|
|
37
|
+
this.#card = structuredClone(options.card);
|
|
38
|
+
this.#card.capabilities = {
|
|
39
|
+
streaming: true,
|
|
40
|
+
pushNotifications: false,
|
|
41
|
+
extensions: options.card.capabilities?.extensions ?? [],
|
|
42
|
+
extendedAgentCard: false,
|
|
43
|
+
};
|
|
44
|
+
this.#card.supportedInterfaces = [{
|
|
45
|
+
url: options.endpointUrl ?? "",
|
|
46
|
+
protocolBinding: "HTTP+JSON",
|
|
47
|
+
protocolVersion: A2A_PROTOCOL_VERSION,
|
|
48
|
+
tenant: "",
|
|
49
|
+
}];
|
|
50
|
+
const workspace = new WorkspaceBinding(application, options.workspace);
|
|
51
|
+
const store = new PlurnkTaskStore(application, workspace);
|
|
52
|
+
const executor = new PlurnkAgentExecutor(application, workspace, store);
|
|
53
|
+
const handler = new DefaultRequestHandler(this.#card, store, executor);
|
|
54
|
+
const app = express();
|
|
55
|
+
app.use(`/${AGENT_CARD_PATH}`, agentCardHandler({ agentCardProvider: handler }));
|
|
56
|
+
app.use(this.#endpointPath, restHandler({
|
|
57
|
+
requestHandler: handler,
|
|
58
|
+
userBuilder: UserBuilder.noAuthentication,
|
|
59
|
+
}));
|
|
60
|
+
this.#server = createServer(app);
|
|
61
|
+
}
|
|
62
|
+
static init(options) {
|
|
63
|
+
return {
|
|
64
|
+
start: async (application) => {
|
|
65
|
+
const module = new Module(application, options);
|
|
66
|
+
await module.listen();
|
|
67
|
+
return module;
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
async listen() {
|
|
72
|
+
await listen(this.#server, this.#port, this.#host);
|
|
73
|
+
const address = this.address();
|
|
74
|
+
const endpoint = this.#endpointUrl ?? `http://${address.host}:${address.port}${this.#endpointPath}`;
|
|
75
|
+
this.#card.supportedInterfaces[0].url = endpoint;
|
|
76
|
+
return { ...address, endpoint };
|
|
77
|
+
}
|
|
78
|
+
address() {
|
|
79
|
+
const address = this.#server.address();
|
|
80
|
+
if (address === null || typeof address === "string")
|
|
81
|
+
throw new Error("plurnk-a2a: listener is not active");
|
|
82
|
+
return { host: this.#host, port: address.port };
|
|
83
|
+
}
|
|
84
|
+
agentCard() {
|
|
85
|
+
return structuredClone(this.#card);
|
|
86
|
+
}
|
|
87
|
+
close() {
|
|
88
|
+
return close(this.#server);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=Module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Module.js","sourceRoot":"","sources":["../src/Module.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import A2aFunctionality, { type FunctionalityFamilyHandle } from "./Functionality.ts";
|
|
2
|
+
interface SetupSeam {
|
|
3
|
+
registerScheme(name: string, handler: object): Promise<void>;
|
|
4
|
+
registerFunctionalityAdapter(adapter: A2aFunctionality): FunctionalityFamilyHandle;
|
|
5
|
+
}
|
|
6
|
+
export default class OutboundModule {
|
|
7
|
+
#private;
|
|
8
|
+
static init(env?: NodeJS.ProcessEnv): OutboundModule;
|
|
9
|
+
private constructor();
|
|
10
|
+
get functionality(): A2aFunctionality;
|
|
11
|
+
setup(seam: SetupSeam): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=OutboundModule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OutboundModule.d.ts","sourceRoot":"","sources":["../src/OutboundModule.ts"],"names":[],"mappings":"AAMA,OAAO,gBAAgB,EAAE,EAAE,KAAK,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAEtF,UAAU,SAAS;IACf,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,4BAA4B,CAAC,OAAO,EAAE,gBAAgB,GAAG,yBAAyB,CAAC;CACtF;AAED,MAAM,CAAC,OAAO,OAAO,cAAc;;IAG/B,MAAM,CAAC,IAAI,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,cAAc,CAEhE;IAED,OAAO,eAEN;IAED,IAAI,aAAa,IAAI,gBAAgB,CAEpC;IAEK,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1C;CACJ"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// {§a2a-agents-functionality} — the outbound half of the A2A package as a
|
|
2
|
+
// daemon module: it registers the `a2a` resource scheme bound to the Worker's
|
|
3
|
+
// `agents` Functionality and the family adapter beneath the shared coordinator.
|
|
4
|
+
// The hosted inbound listener ({§a2a-inbound-exposure}) remains the separate,
|
|
5
|
+
// optional `Module`.
|
|
6
|
+
import A2a from "./A2a.js";
|
|
7
|
+
import A2aFunctionality, {} from "./Functionality.js";
|
|
8
|
+
export default class OutboundModule {
|
|
9
|
+
#functionality;
|
|
10
|
+
static init(env = process.env) {
|
|
11
|
+
return new OutboundModule(env);
|
|
12
|
+
}
|
|
13
|
+
constructor(env) {
|
|
14
|
+
this.#functionality = new A2aFunctionality(env);
|
|
15
|
+
}
|
|
16
|
+
get functionality() {
|
|
17
|
+
return this.#functionality;
|
|
18
|
+
}
|
|
19
|
+
async setup(seam) {
|
|
20
|
+
await seam.registerScheme("a2a", new A2a((authority, ctx) => this.#functionality.resolve(authority, ctx.functionalityWorkerId)));
|
|
21
|
+
this.#functionality.attach(seam.registerFunctionalityAdapter(this.#functionality));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=OutboundModule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OutboundModule.js","sourceRoot":"","sources":["../src/OutboundModule.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,8EAA8E;AAC9E,gFAAgF;AAChF,8EAA8E;AAC9E,qBAAqB;AACrB,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,gBAAgB,EAAE,EAAkC,MAAM,oBAAoB,CAAC;AAOtF,MAAM,CAAC,OAAO,OAAO,cAAc;IACtB,cAAc,CAAmB;IAE1C,MAAM,CAAC,IAAI,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG;QAC5C,OAAO,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,YAAoB,GAAsB;QACtC,IAAI,CAAC,cAAc,GAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,aAAa;QACb,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAe;QACvB,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACjI,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IACvF,CAAC;CACJ"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type AgentExecutor, type ExecutionEventBus, type RequestContext } from "@a2a-js/sdk/server";
|
|
2
|
+
import { type ApplicationPort } from "@plurnk/plurnk-contracts";
|
|
3
|
+
import PlurnkTaskStore from "./PlurnkTaskStore.ts";
|
|
4
|
+
import type WorkspaceBinding from "./WorkspaceBinding.ts";
|
|
5
|
+
export default class PlurnkAgentExecutor implements AgentExecutor {
|
|
6
|
+
#private;
|
|
7
|
+
constructor(port: ApplicationPort, workspace: WorkspaceBinding, store: PlurnkTaskStore);
|
|
8
|
+
execute(request: RequestContext, events: ExecutionEventBus): Promise<void>;
|
|
9
|
+
cancelTask(taskId: string, events: ExecutionEventBus): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=PlurnkAgentExecutor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlurnkAgentExecutor.d.ts","sourceRoot":"","sources":["../src/PlurnkAgentExecutor.ts"],"names":[],"mappings":"AAKA,OAAO,EAGH,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACtB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EAGH,KAAK,eAAe,EAIvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,eAA2C,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAC;AAyC1D,MAAM,CAAC,OAAO,OAAO,mBAAoB,YAAW,aAAa;;IAQ7D,YAAY,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,eAAe,EAIrF;IAEK,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8D/E;IAEK,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBzE;CAqKJ"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { TaskState, } from "@a2a-js/sdk";
|
|
2
|
+
import { AgentEvent, ServerCallContext, } from "@a2a-js/sdk/server";
|
|
3
|
+
import { ContentTypeNotSupportedError, RequestMalformedError, } from "@a2a-js/sdk/errors";
|
|
4
|
+
import { Validator, WORKER_NAME, } from "@plurnk/plurnk-contracts";
|
|
5
|
+
import PlurnkTaskStore, {} from "./PlurnkTaskStore.js";
|
|
6
|
+
const taskSnapshot = (request) => ({
|
|
7
|
+
id: request.taskId,
|
|
8
|
+
contextId: request.contextId,
|
|
9
|
+
status: {
|
|
10
|
+
state: TaskState.TASK_STATE_SUBMITTED,
|
|
11
|
+
message: undefined,
|
|
12
|
+
timestamp: undefined,
|
|
13
|
+
},
|
|
14
|
+
artifacts: [],
|
|
15
|
+
history: request.task?.history ?? [request.userMessage],
|
|
16
|
+
metadata: {},
|
|
17
|
+
});
|
|
18
|
+
const statusEvent = (task) => ({
|
|
19
|
+
taskId: task.id,
|
|
20
|
+
contextId: task.contextId,
|
|
21
|
+
status: task.status,
|
|
22
|
+
metadata: {},
|
|
23
|
+
});
|
|
24
|
+
const textOf = (message) => {
|
|
25
|
+
const unsupported = message.parts.find(({ content }) => content?.$case !== "text");
|
|
26
|
+
if (unsupported !== undefined) {
|
|
27
|
+
throw new ContentTypeNotSupportedError("This Plurnk A2A exposure currently accepts text Message parts only.");
|
|
28
|
+
}
|
|
29
|
+
const text = message.parts
|
|
30
|
+
.flatMap((part) => part.content?.$case === "text" ? [part.content.value] : [])
|
|
31
|
+
.join("\n")
|
|
32
|
+
.trim();
|
|
33
|
+
if (text.length === 0)
|
|
34
|
+
throw new RequestMalformedError("The A2A Message has no non-empty text content.");
|
|
35
|
+
return text;
|
|
36
|
+
};
|
|
37
|
+
export default class PlurnkAgentExecutor {
|
|
38
|
+
#port;
|
|
39
|
+
#workspace;
|
|
40
|
+
#store;
|
|
41
|
+
#contextLocks = new Map();
|
|
42
|
+
#ownedContexts = new Set();
|
|
43
|
+
#activeTasks = new Set();
|
|
44
|
+
constructor(port, workspace, store) {
|
|
45
|
+
this.#port = port;
|
|
46
|
+
this.#workspace = workspace;
|
|
47
|
+
this.#store = store;
|
|
48
|
+
}
|
|
49
|
+
async execute(request, events) {
|
|
50
|
+
this.#activeTasks.add(request.taskId);
|
|
51
|
+
try {
|
|
52
|
+
const workspaceId = await this.#workspace.id();
|
|
53
|
+
const binding = await this.#ensureBinding(request);
|
|
54
|
+
const snapshot = request.task ?? taskSnapshot(request);
|
|
55
|
+
const pending = (await this.#port.pendingClientInteractions(workspaceId))
|
|
56
|
+
.find((interaction) => interaction.workerId === binding.task.id) ?? null;
|
|
57
|
+
const outcome = await this.#observe(binding.task.id, async () => {
|
|
58
|
+
if (pending !== null) {
|
|
59
|
+
await this.#port.resolveClientInteraction(pending.interactionId, { status: "resolved", payload: this.#interactionPayload(request.userMessage, pending) });
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
await this.#port.runLoop({
|
|
63
|
+
workspaceId,
|
|
64
|
+
workerId: binding.task.id,
|
|
65
|
+
prompt: textOf(request.userMessage),
|
|
66
|
+
source: PlurnkAgentExecutor.#source(request),
|
|
67
|
+
flags: { noProposals: true },
|
|
68
|
+
});
|
|
69
|
+
}, workspaceId, () => {
|
|
70
|
+
events.publish(AgentEvent.task(snapshot));
|
|
71
|
+
const working = {
|
|
72
|
+
...snapshot,
|
|
73
|
+
status: {
|
|
74
|
+
state: TaskState.TASK_STATE_WORKING,
|
|
75
|
+
message: undefined,
|
|
76
|
+
timestamp: undefined,
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
events.publish(AgentEvent.statusUpdate(statusEvent(working)));
|
|
80
|
+
});
|
|
81
|
+
const projected = await this.#store.load(request.taskId, request.context);
|
|
82
|
+
if (projected === undefined) {
|
|
83
|
+
throw new Error(`A2A Task '${request.taskId}' disappeared after Plurnk execution.`);
|
|
84
|
+
}
|
|
85
|
+
if (outcome.kind === "interaction") {
|
|
86
|
+
if (projected.status?.state !== TaskState.TASK_STATE_INPUT_REQUIRED) {
|
|
87
|
+
throw new Error(`A2A Task '${request.taskId}' did not project its pending interaction.`);
|
|
88
|
+
}
|
|
89
|
+
events.publish(AgentEvent.statusUpdate(statusEvent(projected)));
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
for (const artifact of projected.artifacts) {
|
|
93
|
+
events.publish(AgentEvent.artifactUpdate({
|
|
94
|
+
taskId: projected.id,
|
|
95
|
+
contextId: projected.contextId,
|
|
96
|
+
artifact,
|
|
97
|
+
append: false,
|
|
98
|
+
lastChunk: true,
|
|
99
|
+
metadata: {},
|
|
100
|
+
}));
|
|
101
|
+
}
|
|
102
|
+
events.publish(AgentEvent.statusUpdate(statusEvent(projected)));
|
|
103
|
+
}
|
|
104
|
+
finally {
|
|
105
|
+
this.#activeTasks.delete(request.taskId);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async cancelTask(taskId, events) {
|
|
109
|
+
const workspaceId = await this.#workspace.id();
|
|
110
|
+
const binding = await this.#store.binding(taskId);
|
|
111
|
+
if (binding === null)
|
|
112
|
+
throw new Error(`A2A Task '${taskId}' has no Plurnk worker.`);
|
|
113
|
+
const activeExecutorWillPublish = this.#activeTasks.has(taskId);
|
|
114
|
+
const outcome = await this.#observe(binding.task.id, async () => {
|
|
115
|
+
await this.#port.cancelWorker({
|
|
116
|
+
workspaceId,
|
|
117
|
+
workerId: binding.task.id,
|
|
118
|
+
reason: "A2A caller cancelled the Task",
|
|
119
|
+
});
|
|
120
|
+
}, workspaceId, () => { });
|
|
121
|
+
if (outcome.kind !== "terminated" || outcome.result.status !== 499) {
|
|
122
|
+
throw new Error(`A2A Task '${taskId}' did not terminate as cancelled.`);
|
|
123
|
+
}
|
|
124
|
+
const projected = await this.#store.load(taskId, new ServerCallContext());
|
|
125
|
+
if (projected === undefined || projected.status?.state !== TaskState.TASK_STATE_CANCELED) {
|
|
126
|
+
throw new Error(`A2A Task '${taskId}' did not enter the cancelled state.`);
|
|
127
|
+
}
|
|
128
|
+
if (!activeExecutorWillPublish) {
|
|
129
|
+
events.publish(AgentEvent.statusUpdate(statusEvent(projected)));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
async #ensureBinding(request) {
|
|
133
|
+
const workspaceId = await this.#workspace.id();
|
|
134
|
+
for (const [label, value] of [["Context", request.contextId], ["Task", request.taskId]]) {
|
|
135
|
+
if (!WORKER_NAME.test(value)) {
|
|
136
|
+
throw new RequestMalformedError(`${label} identity '${value}' cannot name a Plurnk worker.`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
let resolved = null;
|
|
140
|
+
await this.#serialize(request.contextId, async () => {
|
|
141
|
+
const existingTask = await this.#store.binding(request.taskId);
|
|
142
|
+
if (existingTask !== null) {
|
|
143
|
+
if (existingTask.context.name !== request.contextId) {
|
|
144
|
+
throw new RequestMalformedError(`A2A Task '${request.taskId}' does not belong to Context '${request.contextId}'.`);
|
|
145
|
+
}
|
|
146
|
+
this.#ownedContexts.add(request.contextId);
|
|
147
|
+
resolved = existingTask;
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
if (request.task !== undefined) {
|
|
151
|
+
throw new RequestMalformedError(`A2A Task '${request.taskId}' has no Plurnk binding.`);
|
|
152
|
+
}
|
|
153
|
+
const existingContext = await this.#port.readWorker({
|
|
154
|
+
workspaceId,
|
|
155
|
+
identity: { name: request.contextId },
|
|
156
|
+
});
|
|
157
|
+
let context;
|
|
158
|
+
if (existingContext === null) {
|
|
159
|
+
if (request.task !== undefined) {
|
|
160
|
+
throw new RequestMalformedError(`A2A Context '${request.contextId}' does not exist.`);
|
|
161
|
+
}
|
|
162
|
+
const created = await this.#port.createConversationWorker({
|
|
163
|
+
workspaceId,
|
|
164
|
+
name: request.contextId,
|
|
165
|
+
});
|
|
166
|
+
context = {
|
|
167
|
+
id: created.workerId,
|
|
168
|
+
name: created.workerName,
|
|
169
|
+
created_at: "",
|
|
170
|
+
origin: "model",
|
|
171
|
+
parentWorkerId: null,
|
|
172
|
+
};
|
|
173
|
+
this.#ownedContexts.add(request.contextId);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
if (existingContext.origin !== "model" || existingContext.parentWorkerId !== null) {
|
|
177
|
+
throw new RequestMalformedError(`A2A Context '${request.contextId}' is not a root model Worker.`);
|
|
178
|
+
}
|
|
179
|
+
if (!this.#ownedContexts.has(request.contextId)
|
|
180
|
+
&& !await this.#store.ownsContext(existingContext)) {
|
|
181
|
+
throw new RequestMalformedError(`A2A Context '${request.contextId}' is not owned by this exposure.`);
|
|
182
|
+
}
|
|
183
|
+
this.#ownedContexts.add(request.contextId);
|
|
184
|
+
context = existingContext;
|
|
185
|
+
}
|
|
186
|
+
const created = await this.#port.forkWorker({
|
|
187
|
+
workspaceId,
|
|
188
|
+
workerId: context.id,
|
|
189
|
+
name: request.taskId,
|
|
190
|
+
});
|
|
191
|
+
const task = await this.#port.readWorker({
|
|
192
|
+
workspaceId,
|
|
193
|
+
identity: { id: created.workerId },
|
|
194
|
+
});
|
|
195
|
+
if (task === null)
|
|
196
|
+
throw new Error(`A2A Task '${request.taskId}' was not visible after creation.`);
|
|
197
|
+
await this.#port.setWorkerSettings({
|
|
198
|
+
workspaceId,
|
|
199
|
+
workerId: task.id,
|
|
200
|
+
settings: { requestUserInput: true },
|
|
201
|
+
});
|
|
202
|
+
resolved = { context, task, loop: null };
|
|
203
|
+
});
|
|
204
|
+
if (resolved === null)
|
|
205
|
+
throw new Error(`A2A Task '${request.taskId}' has no Plurnk binding.`);
|
|
206
|
+
return resolved;
|
|
207
|
+
}
|
|
208
|
+
async #observe(workerId, action, boundWorkspaceId, started) {
|
|
209
|
+
const settled = Promise.withResolvers();
|
|
210
|
+
const unsubscribe = this.#port.subscribeToEvents((workspaceId, method, params) => {
|
|
211
|
+
if (workspaceId !== boundWorkspaceId || typeof params !== "object" || params === null)
|
|
212
|
+
return;
|
|
213
|
+
const candidate = params;
|
|
214
|
+
if (candidate.workerId !== workerId)
|
|
215
|
+
return;
|
|
216
|
+
if (method === "loop/terminated") {
|
|
217
|
+
settled.resolve({
|
|
218
|
+
kind: "terminated",
|
|
219
|
+
result: Validator.assertOperationResult(candidate.result),
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
else if (method === "loop/interaction") {
|
|
223
|
+
settled.resolve({
|
|
224
|
+
kind: "interaction",
|
|
225
|
+
interaction: candidate,
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
try {
|
|
230
|
+
await action();
|
|
231
|
+
started();
|
|
232
|
+
return await settled.promise;
|
|
233
|
+
}
|
|
234
|
+
finally {
|
|
235
|
+
unsubscribe();
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
#interactionPayload(message, interaction) {
|
|
239
|
+
const data = message.parts.filter(({ content }) => content?.$case === "data");
|
|
240
|
+
let candidate = data.length === 1 && message.parts.length === 1
|
|
241
|
+
? data[0].content?.value
|
|
242
|
+
: textOf(message);
|
|
243
|
+
let admitted = Validator.validateJsonSchemaInstance(interaction.request.responseSchema, candidate);
|
|
244
|
+
if (!admitted.valid) {
|
|
245
|
+
const schema = interaction.request.responseSchema;
|
|
246
|
+
const properties = schema.properties;
|
|
247
|
+
const required = schema.required;
|
|
248
|
+
if (schema.type === "object"
|
|
249
|
+
&& typeof properties === "object"
|
|
250
|
+
&& properties !== null
|
|
251
|
+
&& !Array.isArray(properties)
|
|
252
|
+
&& Array.isArray(required)
|
|
253
|
+
&& required.length === 1
|
|
254
|
+
&& typeof required[0] === "string") {
|
|
255
|
+
candidate = { [required[0]]: candidate };
|
|
256
|
+
admitted = Validator.validateJsonSchemaInstance(interaction.request.responseSchema, candidate);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
if (!admitted.valid) {
|
|
260
|
+
throw new RequestMalformedError(`The A2A Message does not satisfy the pending '${interaction.request.toolName}' response schema.`);
|
|
261
|
+
}
|
|
262
|
+
return candidate;
|
|
263
|
+
}
|
|
264
|
+
async #serialize(key, action) {
|
|
265
|
+
const prior = this.#contextLocks.get(key) ?? Promise.resolve();
|
|
266
|
+
const current = prior.catch(() => { }).then(action);
|
|
267
|
+
this.#contextLocks.set(key, current);
|
|
268
|
+
try {
|
|
269
|
+
await current;
|
|
270
|
+
}
|
|
271
|
+
finally {
|
|
272
|
+
if (this.#contextLocks.get(key) === current)
|
|
273
|
+
this.#contextLocks.delete(key);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
static #source(request) {
|
|
277
|
+
return `a2a://anonymous/contexts/${encodeURIComponent(request.contextId)}`
|
|
278
|
+
+ `/tasks/${encodeURIComponent(request.taskId)}`
|
|
279
|
+
+ `/messages/${encodeURIComponent(request.userMessage.messageId)}`;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=PlurnkAgentExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlurnkAgentExecutor.js","sourceRoot":"","sources":["../src/PlurnkAgentExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type Task } from "@a2a-js/sdk";
|
|
2
|
+
import { type ServerCallContext, type TaskStore } from "@a2a-js/sdk/server";
|
|
3
|
+
import type { ApplicationLoopProjection, ApplicationPort, ApplicationWorkerProjection } from "@plurnk/plurnk-contracts";
|
|
4
|
+
import type WorkspaceBinding from "./WorkspaceBinding.ts";
|
|
5
|
+
export interface PlurnkTaskBinding {
|
|
6
|
+
readonly context: ApplicationWorkerProjection;
|
|
7
|
+
readonly task: ApplicationWorkerProjection;
|
|
8
|
+
readonly loop: ApplicationLoopProjection | null;
|
|
9
|
+
}
|
|
10
|
+
export default class PlurnkTaskStore implements TaskStore {
|
|
11
|
+
#private;
|
|
12
|
+
constructor(port: ApplicationPort, workspace: WorkspaceBinding);
|
|
13
|
+
binding(taskId: string): Promise<PlurnkTaskBinding | null>;
|
|
14
|
+
ownsContext(context: ApplicationWorkerProjection): Promise<boolean>;
|
|
15
|
+
load(taskId: string, context: ServerCallContext): Promise<Task | undefined>;
|
|
16
|
+
save(task: Task, context: ServerCallContext): Promise<void>;
|
|
17
|
+
list(params: import("@a2a-js/sdk").ListTasksRequest, context: ServerCallContext): Promise<import("@a2a-js/sdk").ListTasksResponse>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=PlurnkTaskStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlurnkTaskStore.d.ts","sourceRoot":"","sources":["../src/PlurnkTaskStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,KAAK,IAAI,EACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACjB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EACR,yBAAyB,EACzB,eAAe,EACf,2BAA2B,EAI9B,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAC;AAE1D,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,CAAC,OAAO,EAAE,2BAA2B,CAAC;IAC9C,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE,yBAAyB,GAAG,IAAI,CAAC;CACnD;AAoED,MAAM,CAAC,OAAO,OAAO,eAAgB,YAAW,SAAS;;IAIrD,YAAY,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,gBAAgB,EAG7D;IAEK,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CA2B/D;IAEK,WAAW,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,OAAO,CAAC,CAUxE;IAEK,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAIhF;IAEK,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBhE;IAEK,IAAI,CACN,MAAM,EAAE,OAAO,aAAa,EAAE,gBAAgB,EAC9C,OAAO,EAAE,iBAAiB,GAC3B,OAAO,CAAC,OAAO,aAAa,EAAE,iBAAiB,CAAC,CAgDlD;CAmHJ"}
|