dsh-a2a-server 0.2.0 → 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/CHANGELOG.md +39 -0
- package/CHANGELOG.zh-CN.md +39 -0
- package/README.md +122 -29
- package/README.zh-CN.md +91 -28
- package/cordis.patch.yml +10 -6
- package/docker/Dockerfile +5 -0
- package/docs/visitor-isolation.en.md +51 -0
- package/docs/visitor-isolation.md +75 -0
- package/lib/briefing.d.ts +39 -0
- package/lib/briefing.d.ts.map +1 -0
- package/lib/briefing.js +108 -0
- package/lib/briefing.js.map +1 -0
- package/lib/config.d.ts +58 -15
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +74 -5
- package/lib/config.js.map +1 -1
- package/lib/contexts.d.ts +9 -4
- package/lib/contexts.d.ts.map +1 -1
- package/lib/contexts.js +7 -13
- package/lib/contexts.js.map +1 -1
- package/lib/docker-executor.d.ts +11 -0
- package/lib/docker-executor.d.ts.map +1 -0
- package/lib/docker-executor.js +115 -0
- package/lib/docker-executor.js.map +1 -0
- package/lib/index.d.ts +1 -31
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +462 -440
- package/lib/index.js.map +1 -1
- package/lib/isolation.d.ts +21 -0
- package/lib/isolation.d.ts.map +1 -0
- package/lib/isolation.js +108 -0
- package/lib/isolation.js.map +1 -0
- package/lib/management.d.ts +5 -0
- package/lib/management.d.ts.map +1 -0
- package/lib/management.js +75 -0
- package/lib/management.js.map +1 -0
- package/lib/microsandbox-executor.d.ts +39 -0
- package/lib/microsandbox-executor.d.ts.map +1 -0
- package/lib/microsandbox-executor.js +316 -0
- package/lib/microsandbox-executor.js.map +1 -0
- package/lib/microsandbox-runtime.d.ts +28 -0
- package/lib/microsandbox-runtime.d.ts.map +1 -0
- package/lib/microsandbox-runtime.js +164 -0
- package/lib/microsandbox-runtime.js.map +1 -0
- package/lib/projection.d.ts +46 -3
- package/lib/projection.d.ts.map +1 -1
- package/lib/projection.js +19 -8
- package/lib/projection.js.map +1 -1
- package/lib/router.d.ts +47 -0
- package/lib/router.d.ts.map +1 -1
- package/lib/router.js +218 -65
- package/lib/router.js.map +1 -1
- package/lib/sandbox-files.d.ts +16 -0
- package/lib/sandbox-files.d.ts.map +1 -0
- package/lib/sandbox-files.js +168 -0
- package/lib/sandbox-files.js.map +1 -0
- package/lib/sandbox-lifecycle.d.ts +48 -0
- package/lib/sandbox-lifecycle.d.ts.map +1 -0
- package/lib/sandbox-lifecycle.js +125 -0
- package/lib/sandbox-lifecycle.js.map +1 -0
- package/lib/security.d.ts +4 -2
- package/lib/security.d.ts.map +1 -1
- package/lib/security.js +4 -2
- package/lib/security.js.map +1 -1
- package/lib/state.d.ts +37 -0
- package/lib/state.d.ts.map +1 -0
- package/lib/state.js +146 -0
- package/lib/state.js.map +1 -0
- package/lib/tasks.d.ts +4 -0
- package/lib/tasks.d.ts.map +1 -1
- package/lib/tasks.js +18 -0
- package/lib/tasks.js.map +1 -1
- package/lib/types.d.ts +9 -0
- package/lib/types.d.ts.map +1 -1
- package/lib/types.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/visitor-read.d.ts +4 -0
- package/lib/visitor-read.d.ts.map +1 -0
- package/lib/visitor-read.js +20 -0
- package/lib/visitor-read.js.map +1 -0
- package/lib/visitor-worker.d.ts +2 -0
- package/lib/visitor-worker.d.ts.map +1 -0
- package/lib/visitor-worker.js +18 -0
- package/lib/visitor-worker.js.map +1 -0
- package/lib/visitor-worker.mjs +14686 -0
- package/lib/visitor-worker.py +78 -0
- package/lib/workspace-read.d.ts +9 -0
- package/lib/workspace-read.d.ts.map +1 -0
- package/lib/workspace-read.js +152 -0
- package/lib/workspace-read.js.map +1 -0
- package/package.json +48 -31
package/lib/contexts.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contexts.d.ts","sourceRoot":"","sources":["../src/contexts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE1C,8BAA8B;AAC9B,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAA;IAChC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;IAC5B,kFAAkF;IAClF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,mEAAmE;IACnE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB
|
|
1
|
+
{"version":3,"file":"contexts.d.ts","sourceRoot":"","sources":["../src/contexts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE1C,8BAA8B;AAC9B,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAA;IAChC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;IAC5B,kFAAkF;IAClF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,mEAAmE;IACnE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IACxC;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,mEAAmE;IACnE,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,0DAA0D;AAC1D,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,WAAW,CAAA;AAEnD,8DAA8D;AAC9D,qBAAa,eAAe;IASxB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG;IAVtB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;IAElE;;;;OAIG;gBAEgB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,MAAM,MAAiB;IAG/C,qDAAqD;IACrD,MAAM,IAAI,UAAU,EAAE;IAItB,gDAAgD;IAChD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;;;;;;OASG;IACH,MAAM,CAAC,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,aAAa;IAQzE;;;OAGG;IACH,GAAG,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAMjC;;;;OAIG;IACH,MAAM,CAAC,SAAS,EAAE,YAAY,GAAG,UAAU,GAAG,SAAS;IAMvD,yEAAyE;IACzE,KAAK,IAAI,UAAU,EAAE;IAMrB;;;;;;;OAOG;IACH,SAAS,IAAI,UAAU,EAAE;CAI1B"}
|
package/lib/contexts.js
CHANGED
|
@@ -59,6 +59,10 @@ export class ContextRegistry {
|
|
|
59
59
|
* @param activation - the Activation to hold.
|
|
60
60
|
*/
|
|
61
61
|
add(activation) {
|
|
62
|
+
if (this.activations.has(activation.contextId))
|
|
63
|
+
throw new Error('context is already resident');
|
|
64
|
+
if (this.activations.size >= this.maxResident)
|
|
65
|
+
throw new Error('resident context capacity reached');
|
|
62
66
|
this.activations.set(activation.contextId, activation);
|
|
63
67
|
}
|
|
64
68
|
/**
|
|
@@ -81,23 +85,13 @@ export class ContextRegistry {
|
|
|
81
85
|
* Select Activations that may be evicted right now.
|
|
82
86
|
*
|
|
83
87
|
* An Activation is evictable only when nothing is owed: no in-flight task and
|
|
84
|
-
* no recent touch.
|
|
85
|
-
*
|
|
86
|
-
* dropping work a peer is waiting on is worse than exceeding a soft ceiling.
|
|
88
|
+
* no recent touch. Admission separately evicts the oldest quiet activation
|
|
89
|
+
* BEFORE creating a new agent. A busy context is never evicted for capacity.
|
|
87
90
|
* @returns Activations the caller should dispose and remove.
|
|
88
91
|
*/
|
|
89
92
|
evictable() {
|
|
90
93
|
const cutoff = this.now() - this.idleTtlMs;
|
|
91
|
-
|
|
92
|
-
const expired = quiet.filter(a => a.lastTouchedAt <= cutoff);
|
|
93
|
-
if (this.activations.size <= this.maxResident)
|
|
94
|
-
return expired;
|
|
95
|
-
const overflow = this.activations.size - this.maxResident;
|
|
96
|
-
const byOldest = quiet
|
|
97
|
-
.filter(a => !expired.includes(a))
|
|
98
|
-
.sort((a, b) => a.lastTouchedAt - b.lastTouchedAt)
|
|
99
|
-
.slice(0, Math.max(0, overflow - expired.length));
|
|
100
|
-
return [...expired, ...byOldest];
|
|
94
|
+
return this.values().filter(a => a.slots.size === 0 && a.lastTouchedAt <= cutoff);
|
|
101
95
|
}
|
|
102
96
|
}
|
|
103
97
|
//# sourceMappingURL=contexts.js.map
|
package/lib/contexts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contexts.js","sourceRoot":"","sources":["../src/contexts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"contexts.js","sourceRoot":"","sources":["../src/contexts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA8BH,8DAA8D;AAC9D,MAAM,OAAO,eAAe;IASP;IACA;IACA;IAVF,WAAW,GAAG,IAAI,GAAG,EAA4B,CAAA;IAElE;;;;OAIG;IACH,YACmB,WAAmB,EACnB,SAAiB,EACjB,MAAoB,IAAI,CAAC,GAAG;QAF5B,gBAAW,GAAX,WAAW,CAAQ;QACnB,cAAS,GAAT,SAAS,CAAQ;QACjB,QAAG,GAAH,GAAG,CAAyB;IAC5C,CAAC;IAEJ,qDAAqD;IACrD,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAA;IACvC,CAAC;IAED,gDAAgD;IAChD,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAA;IAC9B,CAAC;IAED;;;;;;;;;OASG;IACH,MAAM,CAAC,SAAuB,EAAE,IAAY;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAClD,IAAI,UAAU,KAAK,SAAS;YAAE,OAAO,SAAS,CAAA;QAC9C,IAAI,UAAU,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,WAAW,CAAA;QAChD,UAAU,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACrC,OAAO,UAAU,CAAA;IACnB,CAAC;IAED;;;OAGG;IACH,GAAG,CAAC,UAAsB;QACxB,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;QAC9F,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;QACnG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;IACxD,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,SAAuB;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAClD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QAClC,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,yEAAyE;IACzE,KAAK;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;QACzB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAA;QACxB,OAAO,GAAG,CAAA;IACZ,CAAC;IAED;;;;;;;OAOG;IACH,SAAS;QACP,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAA;QAC1C,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,aAAa,IAAI,MAAM,CAAC,CAAA;IACnF,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ToolDefinition } from '@deepseek-ai/dsh-tools';
|
|
2
|
+
export declare const VISITOR_IMAGE = "talk2myagent/visitor-runtime:0.1.0";
|
|
3
|
+
export declare const MAX_VISITOR_CONTAINERS = 4;
|
|
4
|
+
/** Per backend process, shared by all its visitor contexts. No unbounded queue. */
|
|
5
|
+
export declare function reserveContainer(): () => void;
|
|
6
|
+
export declare function docker(args: string[], input?: string, signal?: AbortSignal, timeoutMs?: number): Promise<string>;
|
|
7
|
+
export declare function requireDocker(): Promise<void>;
|
|
8
|
+
export declare function containerArgs(name: string, dataRoot: string, workRoot: string, worker: string): Promise<string[]>;
|
|
9
|
+
/** The model supplies only read arguments; never Docker flags, mounts or commands. */
|
|
10
|
+
export declare function dockerReadTool(definition: ToolDefinition, dataRoot: string, workRoot: string, verify: () => Promise<void>): ToolDefinition;
|
|
11
|
+
//# sourceMappingURL=docker-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-executor.d.ts","sourceRoot":"","sources":["../src/docker-executor.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAG5D,eAAO,MAAM,aAAa,uCAAuC,CAAA;AACjE,eAAO,MAAM,sBAAsB,IAAI,CAAA;AAGvC,mFAAmF;AACnF,wBAAgB,gBAAgB,IAAI,MAAM,IAAI,CAK7C;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,SAAK,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,SAAS,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBlH;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAUnD;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAYvH;AAED,sFAAsF;AACtF,wBAAgB,cAAc,CAAC,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,cAAc,CAuB1I"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { realpath } from 'node:fs/promises';
|
|
5
|
+
import { existsSync } from 'node:fs';
|
|
6
|
+
import { contains } from "./isolation.js";
|
|
7
|
+
export const VISITOR_IMAGE = 'talk2myagent/visitor-runtime:0.1.0';
|
|
8
|
+
export const MAX_VISITOR_CONTAINERS = 4;
|
|
9
|
+
let activeContainers = 0;
|
|
10
|
+
/** Per backend process, shared by all its visitor contexts. No unbounded queue. */
|
|
11
|
+
export function reserveContainer() {
|
|
12
|
+
if (activeContainers >= MAX_VISITOR_CONTAINERS)
|
|
13
|
+
throw new Error('Visitor tools are busy; try again later');
|
|
14
|
+
activeContainers++;
|
|
15
|
+
let released = false;
|
|
16
|
+
return () => { if (!released) {
|
|
17
|
+
released = true;
|
|
18
|
+
activeContainers--;
|
|
19
|
+
} };
|
|
20
|
+
}
|
|
21
|
+
export async function docker(args, input = '', signal, timeoutMs = 30_000) {
|
|
22
|
+
return await new Promise((resolve, reject) => {
|
|
23
|
+
const child = spawn('docker', args, { windowsHide: true, stdio: ['pipe', 'pipe', 'pipe'] });
|
|
24
|
+
let output = '', errors = '', failed = false;
|
|
25
|
+
const fail = (error) => { if (!failed) {
|
|
26
|
+
failed = true;
|
|
27
|
+
child.kill();
|
|
28
|
+
reject(error);
|
|
29
|
+
} };
|
|
30
|
+
const abort = () => fail(new Error('Container operation canceled'));
|
|
31
|
+
const timer = setTimeout(() => fail(new Error('Container operation timed out')), timeoutMs);
|
|
32
|
+
signal?.addEventListener('abort', abort, { once: true });
|
|
33
|
+
if (signal?.aborted)
|
|
34
|
+
abort();
|
|
35
|
+
child.on('error', error => fail(new Error(`Docker unavailable: ${error.message}`)));
|
|
36
|
+
child.stdin.on('error', () => { });
|
|
37
|
+
child.stdout.on('data', bytes => { output += String(bytes); if (output.length > 256_000)
|
|
38
|
+
fail(new Error('Container output exceeded limit')); });
|
|
39
|
+
child.stderr.on('data', bytes => { errors = (errors + String(bytes)).slice(-4000); });
|
|
40
|
+
child.on('close', code => {
|
|
41
|
+
clearTimeout(timer);
|
|
42
|
+
signal?.removeEventListener('abort', abort);
|
|
43
|
+
if (failed)
|
|
44
|
+
return;
|
|
45
|
+
if (code === 0)
|
|
46
|
+
resolve(output);
|
|
47
|
+
else
|
|
48
|
+
reject(new Error(`Container failed (${code}): ${errors || output.slice(0, 4000)}`));
|
|
49
|
+
});
|
|
50
|
+
child.stdin.end(input);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
export async function requireDocker() {
|
|
54
|
+
if (process.platform === 'linux' && process.getuid?.() === 0)
|
|
55
|
+
throw new Error('Run the A2A backend as a non-root user so private workspace permissions match the container user');
|
|
56
|
+
// Bind sources must refer to this computer, never an unrelated remote daemon.
|
|
57
|
+
if (process.env['DOCKER_HOST'] && !/^(npipe:|unix:)/.test(process.env['DOCKER_HOST']))
|
|
58
|
+
throw new Error('A local Docker engine is required');
|
|
59
|
+
const context = JSON.parse(await docker(['context', 'inspect']));
|
|
60
|
+
if (!/^(npipe:|unix:)/.test(context[0]?.Endpoints?.docker?.Host ?? ''))
|
|
61
|
+
throw new Error('A local Docker context is required');
|
|
62
|
+
const info = JSON.parse(await docker(['info', '--format', '{{json .}}']));
|
|
63
|
+
if (info.OSType !== 'linux')
|
|
64
|
+
throw new Error('Linux containers are required');
|
|
65
|
+
try {
|
|
66
|
+
await docker(['image', 'inspect', VISITOR_IMAGE]);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
throw new Error(`Missing ${VISITOR_IMAGE}. Build the runtime with: docker build -t ${VISITOR_IMAGE} <dsh-a2a>/docker`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export async function containerArgs(name, dataRoot, workRoot, worker) {
|
|
73
|
+
const [data, work, script] = await Promise.all([realpath(dataRoot), realpath(workRoot), realpath(worker)]);
|
|
74
|
+
if (contains(data, work) || contains(work, data))
|
|
75
|
+
throw new Error('Public data and private workspace must be disjoint');
|
|
76
|
+
if ([data, work, script].some(path => /[,\r\n]/.test(path)))
|
|
77
|
+
throw new Error('Docker mount paths cannot contain commas or newlines');
|
|
78
|
+
return ['run', '--rm', '--pull=never', '--name', name, '--label', 'talk2myagent.role=visitor-tool',
|
|
79
|
+
'--network=none', '--read-only', `--user=${process.platform === 'linux' ? `${process.getuid?.() || 1000}:${process.getgid?.() || 1000}` : '1000:1000'}`, '--cap-drop=ALL', '--security-opt=no-new-privileges',
|
|
80
|
+
'--pids-limit=64', '--memory=256m', '--cpus=1', '--workdir=/work',
|
|
81
|
+
'--tmpfs=/tmp:rw,nosuid,nodev,noexec,size=67108864,mode=1777',
|
|
82
|
+
'--mount', `type=bind,src=${data},dst=/source,readonly,bind-recursive=disabled`,
|
|
83
|
+
'--mount', `type=bind,src=${work},dst=/work,bind-recursive=disabled`,
|
|
84
|
+
'--mount', `type=bind,src=${script},dst=/opt/visitor-worker.mjs,readonly`,
|
|
85
|
+
'-i', VISITOR_IMAGE];
|
|
86
|
+
}
|
|
87
|
+
/** The model supplies only read arguments; never Docker flags, mounts or commands. */
|
|
88
|
+
export function dockerReadTool(definition, dataRoot, workRoot, verify) {
|
|
89
|
+
return { ...definition, execute: async (raw, { signal }) => {
|
|
90
|
+
signal.throwIfAborted();
|
|
91
|
+
const release = reserveContainer();
|
|
92
|
+
const name = `a2a-read-${randomUUID()}`;
|
|
93
|
+
let started = false;
|
|
94
|
+
try {
|
|
95
|
+
await verify();
|
|
96
|
+
signal.throwIfAborted();
|
|
97
|
+
const compiled = fileURLToPath(new URL('./visitor-worker.mjs', import.meta.url));
|
|
98
|
+
const worker = existsSync(compiled) ? compiled : fileURLToPath(new URL('../lib/visitor-worker.mjs', import.meta.url));
|
|
99
|
+
const args = await containerArgs(name, dataRoot, workRoot, worker);
|
|
100
|
+
started = true;
|
|
101
|
+
const output = await docker([...args, 'node', '/opt/visitor-worker.mjs'], JSON.stringify(raw), signal);
|
|
102
|
+
const response = JSON.parse(output);
|
|
103
|
+
if (response.error || response.result === undefined)
|
|
104
|
+
throw new Error(response.error ?? 'Invalid worker response');
|
|
105
|
+
return response.result;
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
// Killing the Docker CLI alone does not terminate its container.
|
|
109
|
+
if (started)
|
|
110
|
+
await docker(['rm', '-f', name], '', undefined, 10_000).catch(() => { });
|
|
111
|
+
release();
|
|
112
|
+
}
|
|
113
|
+
} };
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=docker-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-executor.js","sourceRoot":"","sources":["../src/docker-executor.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
CHANGED
|
@@ -1,38 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Inbound A2A protocol server for DeepSeek Harness.
|
|
3
|
-
*
|
|
4
|
-
* Publishes an Agent Card at a well-known URI and serves the A2A v1.0 JSON-RPC
|
|
5
|
-
* binding, so any compliant peer that knows this deployment's URL can discover
|
|
6
|
-
* it and submit tasks to a harness agent. There is no outbound client: this
|
|
7
|
-
* plugin never connects to another agent.
|
|
8
|
-
*
|
|
9
|
-
* v1.0 is the ONLY protocol version served. The v0.3 method names, `kind`
|
|
10
|
-
* discriminators, and lowercase enums are gone rather than aliased: a reply
|
|
11
|
-
* this server produces is v1.0 JSON, and a v0.3 client could not read it, so
|
|
12
|
-
* answering a v0.3 request would fail further from its cause than refusing it.
|
|
13
|
-
*
|
|
14
|
-
* It is a TRANSPORT ADAPTER, not a capability seam — the same self-limitation
|
|
15
|
-
* `dsh-acp` states. It exposes no editor navigation, transcript replay,
|
|
16
|
-
* commands, modes, or tool presentation.
|
|
17
|
-
*
|
|
18
|
-
* @module dsh-a2a-server
|
|
19
|
-
*/
|
|
20
1
|
import type { Context } from '@deepseek-ai/cordis';
|
|
21
2
|
import { Config, type A2AServerConfig } from './config.ts';
|
|
22
3
|
export { Config };
|
|
23
4
|
export type { A2AServerConfig };
|
|
24
5
|
export declare const name = "a2a-server";
|
|
25
|
-
/**
|
|
26
|
-
* The server creates and owns agents, needs an HTTP carrier for its routes, and
|
|
27
|
-
* cannot authenticate a single request without the credential seam. Everything
|
|
28
|
-
* else it uses is probed with `ctx.get()` so a composition missing an optional
|
|
29
|
-
* capability still boots with A2A serving.
|
|
30
|
-
*/
|
|
31
6
|
export declare const inject: string[];
|
|
32
|
-
|
|
33
|
-
* Mount the inbound A2A server.
|
|
34
|
-
* @param ctx - the Cordis context carrying the agent factory, HTTP carrier, and credentials.
|
|
35
|
-
* @param config - the validated plugin configuration.
|
|
36
|
-
*/
|
|
37
|
-
export declare function apply(ctx: Context, config: A2AServerConfig): void;
|
|
7
|
+
export declare function apply(ctx: Context, config: A2AServerConfig): Promise<void>;
|
|
38
8
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AASlD,OAAO,EAAwB,MAAM,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAA;AAuBhF,OAAO,EAAE,MAAM,EAAE,CAAA;AACjB,YAAY,EAAE,eAAe,EAAE,CAAA;AAC/B,eAAO,MAAM,IAAI,eAAe,CAAA;AAGhC,eAAO,MAAM,MAAM,UAAkE,CAAA;AAKrF,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAgbhF"}
|